Rösta på artikeln
Iteration
Alla program kan tänkas vara uppbyggda av de tre programelementen
sekvens, selektion och iteration. Detta avsnitt fokuserar vi på iteration, upprepning.
Ett programavsnitt som upprepas ett antal gånger sägs utgöra
en s k loop. Vi skall gå igenom de tre satser som kan användas vid loop-konstruktioner,
nämligen for-satsen samt while och repeat-satserna.
For-satsen
I de flesta programkonstruktioner finns det alltid
ett behov av att upprepa en kodsats ett visst antal gånger. När man vet hur många
gånger en sats skall behöva upprepas kan en s k For-sats vara lämplig.
En konstruktion med For-satsen innebär alltid en antalsstyrd
upprepning, dvs en upprepning ett bestämt antal gånger. För att visa ett exempel kan
du placera ut en listruta och två knappar på ett formulär. Nedanstående procedur kan
du koppla till en knapp som skall räkna upp tal från 1 till 10 och sedan skriva ut
dessa i listrutan på formuläret.
procedure TForm1.Button1Click(Sender : TObject);
var i : integer;
begin
for i := 1 to 10 do
ListBox1.Items.Add(IntToStr(i));
end;
|
Nästa procedur har till uppgift att rensa listrutan och den
kopplar du till den andra knappen.
procedure TForm1.Button2Click(Sender : TObject);
begin
ListBox1.Clear;
end; |
När du sedan kör programmet och klickar på den första knappen
kommer listrutan att räknas upp med talen 1 t o m 10. I exemplet antar styrvariabeln i succesivt
varje värde 1..10. För vart och ett av dessa värde utförs iterationskroppen, dvs satsen
efter do.
Iterationskroppen utgörs här av endast en sats men kan naturligtvis
bestå av flera satser, som då omgärdas med begin-end.
Vi skall också demonstrera en procedur som räknar ned från 10
till 1, alltså omvänd ordning.
procedure TForm1.Button1Click(Sender : TObject);
var i : integer;
begin
for i := 10 downto 1 do
ListBox1.Items.Add(IntToStr(i));
end;
|
While-satsen
Ofta vet man inte hur många gånger en iteration skall
utföras. Är detta fallet måste man använda sig av en iterationsmetod med antingen while-satsen
eller repeat-satsen.
Detta är två loopkonstruktioner som är mera generella men också
långsammare än for-satsen, som är optimerad för snabbhet. Båda konstruktionerna går
att använda där for-satsen kan användas.
Här följer ett exempel för while-satsen.
procedure TForm1.Button1Click(Sender : TObject);
var i : integer;
begin
i := 1;
while i <= 10 do begin
ListBox1.Items.Add(IntToStr(i));
i := i + 1;
end;
end;
|
Orden while och do är reserverade ord.
Skillnaden mot for-satsen är att styrvariabeln ges startvärdet
1 innan loopen påbörjas. För varje varv testas om loopvillkoret, i<=10.
är sant. Om villkoret är sant utförs villkoret efter do. Efter uppräkningen
testas loopvillkoret igen osv. While-loopen avbryts här när styrvariabeln har
uppnått värdet 11.
Lägg märke till att styrvariabeln i en while-sats inte räknas
upp automatiskt som i for-satsen. Om man glömmer att räkna upp styrvariabeln
hamnar man oförtrutet i en s k evighetsloop. Loopen upprepas i all oändlighet och
man blir tvungen att gå "den hårda vägen" (CTRL+ALT+DELETE) för att avbryta
loopen. Hela Delphi stängs då också ned och man förlorar icke sparat arbete. Ta för
vana att alltid spara projektet innan testkörning, speciellt när loopar är inblandade.
Repeat-satsen
Ett alternativ till while-satsen är den s k repeat-satsen.
Här kan du studera ett exempel på denna.
procedure TForm1.Button1Click(Sender : TObject);
var i : integer;
begin
i := 1;
repeat
ListBox1.Items.Add(IntToStr(i));
i := i + 1;
until i > 10;
end;
end;
|
Orden repeat och until är reserverade ord.
Viktiga fakta om repeat-satsen.
-
Iterationskroppen, satserna mellan repeat-until, upprepas tills
att villkoret efter until blir sant.
-
Repeat-satsen är en eftertestad loop, dvs först kommer
iterationskroppen och sedan testen.
-
Repeat-satsen utförs minst en eller flera gånger.
|