• Cyklus s pevným počtom opakovaní

        •  

          Cyklus je programová konštrukcia, do ktorej vložíme nejaké príkazy a oznámime, koľkokrát sa budú opakovať. Napr.:

          procedure TForm1.Button1Click(Sender: TObject);

          var

            I: Integer;

          begin

            for I := 1 to 30 do

              Image.Canvas.TextOut(Random(300),Random(200),′Lazarus′);

          end;

          Tento zápis hovorí, že TextOut sa bude opakovať 30-krát. Aby sme mohli použiť konštrukciu

          for-cyklu, musíme mať k dispozícii riadiacu premennú cyklu, takzvané počítadlo cyklu. Je to premenná, ktorá bude mať postupne hodnoty od 1 až po 30 a zakaždým sa vykoná príkaz v tele cyklu (teda náš príkaz TextOut).

          Túto konštrukciu môžeme popísať takto:

            for premenná := dolná_hranica to horná_hranica do

              príkaz;

          kde premenná je počítadlo cyklu (riadiaca premenná) a nesmieme ju zabudnúť zadeklarovať. Dolná a horná hranica cyklu sú dve celočíselné hodnoty: definujú interval hodnôt, pre ktorý sa bude postupne (pre každú hodnotu z toho intervalu) vykonávať daný príkaz. To znamená, že najprv sa do počítadla priradí dolná hranica cyklu a vykoná sa príkaz (telo cyklu). Potom sa počítadlo zvýši o jednotku a opäť sa vykoná príkaz. Toto sa opakuje, pokým počítadlo nepresiahne hornú hranicu. Vtedy sa cyklus zastaví a pokračuje sa v nasledujúcich príkazoch za cyklom.

          Ak chceme nakresliť 10 štvorcov náhodnej farby na náhodných pozíciách, môžeme to zapísať napr. takto:

          procedure TForm1.Button1Click(Sender: TObject);

          var

            I, X, Y: Integer;

          begin

            for I := 1 to 30 do

            begin

              X := Random(300);

              Y := Random(200);

              Image1.Canvas.Brush.Color := Random(256*256*256);

              Image1.Canvas.Rectangle(X, Y, X+50, Y+50);

            end;

          end;

          Pri riešení opäť použijeme for-cyklus. Na rozdiel od predchádzajúceho príkladu, teraz potrebujeme opakovať nie jeden príkaz, ale postupnosť štyroch príkazov. Na toto slúži ďalšia programová konštrukcia: zložený príkaz – je to vlastne obyčajná postupnosť príkazov, ktorá je uzavretá medzi slová beginend. Stretávame sa s ňou od začiatku programovania, veď každá procedúra sa skladá z hlavičky procedúry (riadok so slovom procedure) a jedného zloženého príkazu (tela procedúry). Medzi hlavičkou a telom môžu byť ešte deklarácie. Takže for-cyklus môže vyzerať aj takto:

          for premenná := dolná_hranica to horná_hranica do

          begin

            príkaz1;

            príkaz2;

            ...

          end;

          Funguje to úplne rovnako ako cyklus, ktorý má len jeden príkaz – tu sa pri každom prechode cyklom postupne vykonajú všetky príkazy tela cyklu.

           

          Počítadlo v cykle sa správa ako obyčajná premenná, ale nezabudnime, že je to len počítadlo. V tele cyklu nesmieme meniť jeho hodnotu. Tiež si treba uvedomiť, že po skončení cyklu táto premenná prestáva fungovať ako počítadlo, a teda ju môžeme používať ako obyčajnú premennú. Hovoríme, že po skončení cyklu má opäť nedefinovanú hodnotu a ak ju chceme používať, treba do nej niečo priradiť.

          Uvedomme si, že pre cyklus for I := A to B do príkaz; platí:

          •             ak A < B príkaz sa vykoná B-A+1 – krát
          •            ak A = B príkaz sa vykoná len raz
          •            ak A > B príkaz sa nevykoná ani raz

          Ďalší príklad ukáže ešte jednu vlastnosť for-cyklov. Napíšeme program, ktorý nakreslí 10 postupne sa zväčšujúcich rôznofarebných štvorcov. Všetky štvorce majú spoločný vrchol – ľavý horný. Napíšeme prvý pokus:

          procedure TForm1.Button1Click(Sender: TObject);

          var

            I, A: Integer;

          begin

            for I := 1 to 10 do

            begin

              A := 20*I;

              Image1.Canvas.Brush.Color := Random(256*256*256);

              Image1.Canvas.Rectangle(10, 10, 10+A, 10+A);

            end;

          end;

          Úloha je teraz už tak jednoduchá, že nás hádam nemôže ničím prekvapiť. Ale predsa, po spustení vidíme len jeden – najväčší štvorec. Každý väčší štvorec zmazal tie predchádzajúce menšie. Takže zrejme ich budeme kresliť od najväčšieho po najmenší. Jedna z možností je zmeniť priradenie veľkosti do premennej A, napr. takto: A := 220-20*I;

          Elegantnejšie riešenie by bolo, keby for-cyklus nepracoval od 1 do 10, ale naopak by klesal od 10 do 1. Vieme ale, že for I := 10 to 1 do ... nevykoná telo cyklu ani raz, preto použijeme nový variant tohto príkazu:

          for premenná := horná_hranica downto dolná_hranica do

          ...

          Ak vo for-cykle namiesto slova to napíšeme downto, cyklus prebehne s postupne klesajúcim počítadlom. Teraz musí platiť horná_hranica ≥ dolná_hranica, aby prebehol aspoň raz.

          Takže program môžeme prepísať:


          procedure TForm1.Button1Click(Sender: TObject);

          var

            I, A: Integer;

          begin

            for I := 10 downto 1 do

            begin

              A := 20*I;

              Image1.Canvas.Brush.Color := Random(256*256*256);

              Image1.Canvas.Rectangle(10, 10, 10+A, 10+A);

            end;

          end;

          Ďalej sa zameriame na for-cyklus, v tele ktorého bude opäť nejaký ďalší for-cyklus. Hovoríme mu vnorený cyklus. Ukážeme a vysvetlíme to na tomto príklade: predpokladajme, že už vieme pomocou for-cyklu nakresliť terč ako 10 vpísaných kružníc:

          procedure TForm1.Button1Click(Sender: TObject);

          var

            I, X, Y, R: Integer;

          Begin

            X := 50;

            Y := 120

            for I := 1 to 10 do

            begin

              R := 55-5*I;

              Image1.Canvas.Ellipse(X-R, Y-R, X+R, Y+R);

            end;

          end;

          Našou úlohou bude nakresliť vedľa seba 4 takéto terče. To znamená, že to, čo budeme chcieť opakovať, „zabalíme“ do nového for-cyklu. Samozrejme, že tento nový cyklus musí mať svoje vlastné počítadlo – označíme ho J. V tele tohto nového cyklu nakreslíme 1 terč (zložený z 10 kružníc) a posunieme X tak, aby sa nasledujúci terč nakreslil posunutý:

          procedure TForm1.Button1Click(Sender: TObject);

          var

            I, X, Y, R, J: Integer;

          Begin

            X := 50;

            Y := 120

            for J := 1 to 4 do

            begin

              for I := 1 to 10 do

              begin

                R := 55-5*I;

                Image1.Canvas.Ellipse(X-R, Y-R, X+R, Y+R);

              end;

              X := X+100;

            end;

          end;

          Aby bolo v programe lepšie vidieť, kde je vnorený cyklus, odsunuli sme ho trochu vpravo. Treba si uvedomiť, že telo vonkajšieho cyklu, a teda aj vnútorný for-cyklus, sa vykonalo 4-krát. Keďže vnútorný cyklus kreslí 10 kružníc, spolu sa nakreslilo 40 kružníc.

          Zdroj: RNDr. Andrej Blaho: Informatika pre stredné školy Programovanie v Delphi

          Stiahnite si úlohy na precvičenie For_cyklus_DU.docx