- O predmete
- Code week
- Materiály pre prvákov
- Materiály pre druhákov
- Materiály pre tretiakov
- Materiály pre maturantov
- Náhodné hodnoty a premenné
- Cyklus s pevným počtom opakovaní
- Podmienený príkaz
- Procedúry
- Textová informácia
- Bublinkové triedenie
- Súbory na stiahnutie
- ECDL
- Python a korytnačia grafika
- Dotazník
- ŠTART Python
- Podmienky
- Maturita
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á begin a end. 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