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;wpe28.gif (4039 bytes)
  {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;wpe2A.gif (6020 bytes)
  readln;
  for i:=15 downto 1 do
    LineK(100+i*20,200,100+i*20,300,16-i);
  Readln;
  CloseGraph;wpe2C.gif (8255 bytes)
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;wpe2E.gif (28585 bytes)
  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;wpe30.gif (4069 bytes)
  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;wpe32.gif (18797 bytes)
  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