INSTRUKCJA POWTÓRZENIA FOR...TO...DO
Bardzo często wykonujemy pewne działania cyklicznie - składające się z prostych, wielokrotnie powtarzanych czynności. Można by wyróżnić dwa rodzaje takich poleceń: zrób coś określoną ilość razy (dzisiejsza lekcja) albo powtarzaj pewne czynności, dopóki nie zostanie spełniony jakiś warunek (lekcja następna). Po albo przed każdym cyklem sprawdzamy, czy zadanie zostało zrealizowane. Jeśli tak - kończymy pracę, jeśli nie - kontynuujemy.
Schemat
instrukcji FOR...TO...DO...
FOR początek TO koniec DO instrukcja
FOR i := 1 TO 10 DO
line(100+i,100,100+i,200);
{10 pionowych odcinków przylegających do siebie}
Zmienna "i", to tzw. zmienna sterująca pętlą. Przyjmuje ona kolejne wartości od 1 do 10 (wartość początkowa i końcowa zmiennej sterującej). Po przekroczeniu wartości końcowej przez zmienną sterującą, pętla kończy działanie.
Za pomocą schematów blokowych pętla FOR może być przedstawiona w następujący sposób: zmienna sterująca przyjmuje wartość początkową (1). Przed wykonaniem instrukcji sprawdzany jest warunek zakończenia pętli. Jeśli zmienna sterująca nie przekroczyła wartości końcowej wykonywane są instrukcje w pętli po czym zwiększana jest zmienna sterująca o jeden i cykl się powtarza.
Jeśli chcemy by wartość zmiennej sterującej zmniejszała się za każdym razem o 1 stosujemy instrukcję ze słowem DOWNTO.
FOR koniec DOWNTO początek DO instrukcja
FOR i := 10 DOWNTO 1 DO
line(100+i,100,100+i,200);
W schemacie blokowym instrukcja FOR...DOWNTO...DO wygląda w następujący sposób. Zmienna sterująca przyjmuje wartość początkową. Przed wykonaniem instrukcji w pętli sprawdzany jest warunek zakończenia pętli. Instrukcje są wykonywane, gdy zmienna sterująca nie jest mniejsza od wartości końcowej. Po wykonaniu instrukcji zmniejszana jest zmienna sterująca o 1 i cykl powtarza się na nowo.
Instrukcja złożona
Jeśli w pętli należy wykonać kilka instrukcji na przykład narysować kilka linii muszą one być "zgrupowane" w jedną instrukcję złożoną.
Poniższy zapis spowoduje że pierwsza linia narysuje się 10 razy i pętla skończy działanie a kolejne dwie instrukcje zostaną wykonane jeden raz.
FOR i := 1 TO 10 DO
line(100+i,100,100+i,200); {tylko to 10 razy, bo tu
jest średnik kończący pętlę}
line(200+i,100,200+i,200); {jeden
raz}
line(300+i,100,300+i,200); {jeden
raz}
Aby te trzy instrukcje wykonały się 10 razu w tej pętli stosujemy instrukcję złożoną. Wszystko to, co znajduje się pomiędzy słowami begin i end wykona się w ramach jednej instrukcji.
FOR i := 1 TO 10 DO
BEGIN
line(100+i,100,100+i,200);
line(200+i,100,200+i,200);
line(300+i,100,300+i,200);
END;
Liczby losowe
Każdy język programowania dysponuje możliwością generowania liczb losowych, Służą one m.in. do szyfrowania danych. W pascalu taką funkcją jest RANDOM(liczba), która losuje liczby z przedziału 0..liczba-1. Dodatkowo na początku programu wywołuje się procedurę RANDOMIZE która ustawia generator, tak aby za każdym razem losowane było inne liczby.
x:=RANDOM(100);
W
zmiennej X za każdym razem gdy instrukcja zostanie wywołana w programie
znajdzie się losowo wybrana liczba całkowita z przedziału 0..99.
x:=RANDOM(5)+1;
losowo
wybrane liczby z przedziały 1..6 .
GRAF08.PAS - kolorowe linie
program grafika08;
uses graph;
var
d,m:integer;
i:byte;
procedure LineK(x1,y1,x2,y2,kolor:integer);
begin
SetColor(kolor);
Line(x1,y1,x2,y2);
end;
begin
d:=detect;
initgraph(d,m,'');
{bez instrukcji złożonej - z procedurą}
for i:=1 to 15 do
LineK(100+i*20,100,100+i*20,200,i);
readln;
{a teraz bez procedury
ale musi być instrukcja złożona}
for i:=1 to 15 do
begin
SetColor(i);
Line(100+i*20,300,100+i*20,400);
end;
readln;
for i:=15 downto 1 do
LineK(100+i*20,200,100+i*20,300,16-i);
Readln;
CloseGraph;
end.
GRAF09.PAS - losowanie współrzędnych linii
program grafika09;
uses graph;
var
d,m:integer;
x1,y1, {początek linii}
x2,y2, {koniec linii}
k, {kolor linii}
i:integer; {numer rysowanej linii}
{rysowanie linii w określonym kolorze}
procedure LineK(x1,y1,x2,y2,kolor:integer);
begin
SetColor(kolor);
Line(x1,y1,x2,y2);
end;
begin
d:=detect;
initgraph(d,m,'');
randomize; {inicjowanie generatora liczb}
for i:=1 to 100 do
begin
x1:=random(640); {liczby z zakresu 0..639}
y1:=random(480); {liczby z zakresu 0..479}
x2:=random(640);
y2:=random(480);
k:=random(15)+1; {liczby z zakresu 0..15 +1 (1..16)}
LineK(x1,y1,x2,y2,k);
end;
Readln;
CloseGraph;
end.
GRAF10.PAS - rysowanie kwadratów po ścianach i losowo
program grafika10;
uses graph;
var
d,m:integer;
x,y, {lewy górny róg}
w,s, {wysokość i szerokość}
k, {kolor linii}
i:integer; {numer rysowanej linii}
procedure ProstokatK(x,y,s,w,k:integer);
begin
SetColor(k);
MoveTo(x,y);
LineRel(0,w);
LineRel(s,0);
LineRel(0,-w);
LineRel(-s,0);
end;
begin
d:=detect;
initgraph(d,m,'');
{ramka z kwadratów}
for i:=0 to 20 do ProstokatK(i*30,0,20,20,10); {góra}
for i:=0 to 20 do ProstokatK(i*30,450,20,20,10); {dół}
for i:=1 to 14 do ProstokatK(0,i*30,20,20,10); {lewy}
for i:=1 to 14 do ProstokatK(600,i*30,20,20,10); {prawy}
readln;
randomize;
for i:=1 to 100 do
begin
x:=random(480)+30;
y:=random(320)+30;
w:=random(100);
s:=random(100);
k:=random(15)+1;
ProstokatK(x,y,w,s,k);
end;
Readln;
CloseGraph;
end.
Ćwiczenia
narysuj za pomocą LINE, LINETO, LINEREL następujące rysunki:
za pomocą procedury PROSTOKATK i instrukcji pętli przygotuj następujące
rysunki:
Za pomocą linii pionowych lub poziomych wypełnij kwadrat dowolnym kolorem