Cykly

<< Podmienkový príkaz a logické výrazy | Obsah | Metódy vracajúce hodnoty - funkcie >>

Cyklus (angl. loop) v programovaní slúži na to aby sme nejaké príkazy vykonávali opakovane. V Jave poznáme 3 tri základné cykly for, while a do-while. Líšia sa spôsobom riadenia toho, koľko krát sa má cyklus vykonať.

Cyklus for

Cyklus for sa používa vtedy, keď vieme dopredu počet opakovaní cyklu. Syntax je nasledovná:

for ( inicializácia ; podmienka cyklenia ; zmena riadiacej premennej ) {
  prikazy vykonávané pokiaľ je podmienka cyklenia splnená
}

Inicializácia sa vykonáva iba raz úplne na začiatku. Inicializácia obsahuje obvykle deklaráciu a inicializáciu riadiacej premennej napr. int i = 0 čím sme si deklarovali premennú i typu int a priradili sme jej úvodnú hodnotu nula.

Testovanie podmienky cyklenia sa deje PRED každou iteráciou príkazov cyklu. Prikazy cyklu sa vykonajú, ak je podmienka cyklenia splená, v opačnom prípade cyklus ukončí a pokračuje s vykonávaním príkazov pod blokom tohto for cyklu. Podmienka cyklenia obvykle obsahuje nejaký jednoduchý logický výraz, ktorý porovnáva hodnotu riadiacej premennej s nejakou kritickou hodnotou napr. i<5.

Zmena riadiacej premennej sa vykonáva PO každom iterácii príkazov cyklu. Najčastejšie sa zvyšuje riadiaca premenná o 1 napr. i++.

Ukážme si jednoduchý cyklus, v ktorom korytnačka nakreslí rovnostranný trojuholník - vykoná dokopy 3 takty cyklu, pričom v každom takte cyklu urobí krok dĺžky 100 a otočí sa o 120 stupňov.

1: public void trojuholnik() {
2:  for (int i = 0; i < 3; i++) {
3:    this.step(100);
4:    this.turn(-120);
5:  }
6: }

Poďme si rozanalyzovať, čo sa počas behu tejto metódy deje. Budeme sa pozerať na to, v ktorom riadku je práve výpočet a ako vyzerá kresliace plátno (obrázok pod tabuľkou)

riadokakciahodnota v ipopisstav plátna
1 i neexistujezačína sa metóda(a)
2int i = 00deklarácia a inicializácia riadiacej premennej i(a)
2i < 30nula je menšia ako 3 - ideme spraviť takt cyklu(a)
3turtle.step(100)0korytnačka sa pohne(b)
4turtle.turn(-120)0korytnačka sa otočí(c)
2i++1zvýšime riadiacu premennú o 1(c)
2i < 311 je menšia ako 3 - ideme spraviť takt cyklu(c)
3turtle.step(100)1korytnačka sa pohne(d)
4turtle.turn(-120)1korytnačka sa otočí(e)
2i++2zvýšime riadiacu premennú o 1(e)
2i < 322 je menšie ako 3 - ideme spraviť takt cyklu(e)
3turtle.step(100)2korytnačka sa pohne(f)
4turtle.turn(-120)2korytnačka sa otočí(g)
2i++3zvýšime riadiacu premennú o 1(g)
2i < 333 nie je menšie ako 3 - vyskočíme z cyklu, premenná i zaniká(g)
6 i neexistujekončíme metódu(g)

Povedali sme si, že cyklus for sa používa, keď dopredu vieme, koľko krát budeme tento cyklus opakovať. V predchádzajúcom príklade sa cyklus opakoval 3 krát. Analogicky môžeme cyklus vykonať napríklad 27 krát :

for (int i = 0; i < 27; i++) {
 ...
}

Cyklus while

Tento cyklus použijeme vtedy, ak vieme napísať nejakú podmienku, za splnenia ktorej chceme aby sa cyklus opakoval. Syntax je nasledovná:

while (podmienka cyklenia) {
  prikazy vykonávané pokiaľ je podmienka cyklenia splnená
}

Uveďme si ako príklad novú metódu pre korytnačku, ktorá umožní korytnačke kresliť štvorcovú špirálu.

public void stvorcovaSpirala() {
  double dlzkaKroku = 150;
  while (dlzkaKroku > 5) {
    this.step(dlzkaKroku);
    this.turn(-90);
    dlzkaKroku = dlzkaKroku * 0.90;
  }
}

Tento cyklus teda vykonáva 3 príkazy - posun, otočenie a zmenu dĺžky kroku na 90% predchajúcej dĺžky. Cykus sa skončí, keď dĺžka kroku bude menšia alebo rovná 5. Výsledok tejto metódy je nasledovný:

Možete vidieť, že pri tejto úlohe sa naozaj ťažko odhaduje, koľko bude potrebných taktov cyklu, preto for cyklus nevieme použiť. Počet taktov cyklu je pre nás irelevantný. My sme chceli len to, aby sa korytnačka už netočila, keď už by mala začať kresliť čiaročky menšie ako 5 pixelov.

Príkazy break a continue

Príkazy break a continue sa dajú použiť v ľubovoľnom type cyklu.

Príkaz break slúži na okamžité ukončenie cyklu bez ohľadu na to, či je podmienka cyklenia splnená, alebo nie.

Príkaz continue zabezpečí ukončenie daného taktu cyklu teda preskočenie všetkých zvyšných príkazov v cykle a opätovné overovanie podmienky cyklenia a v prípade jej správnosti normálne pokračovanie v ďalších taktoch cyklu. Ak ide o cyklus for, tak ešte pred overením podmienky sa iteruje riadiaca premenná cyklu.

for (int i = 0; i < 20 ; i++) {
  System.out.println( i );
  if (i % 2 == 0) {  // ak je zvyšok po delení dvojkou rovný 0, tj. ak i je párne číslo
    continue;
  }
  if (i > 5) {
    break;
  }
  System.out.println("ahoj");
}
System.out.println("koniec");

Výpis z tohoto programu je nasledovný:

0
1
ahoj
2
3
ahoj
4
5
ahoj
6
7
koniec

Vidíte, že po každom párnom čísle sa všetko ostatné za continue preskočí, zvýši sa i o 1 a začína ďalší cyklus. V prípade, že i je nepárne, príkaz continue sa nevykoná, ale overí sa či i nie je väčšie ako 5.

Ak i nie je väčšie ako 5 vykoná sa ešte posledný príkaz v cykle, ktorý vypíše ahoj a cyklus normálne pokračuje v svojom ďalšom takte.

Ak i je väčšie ako 5, tak sa vykoná príkaz break, celý cyklus skončí a pokračuje sa vo vykonávaní príkazov za cyklom. V tomto prípade sa už vykoná iba príkaz, ktorý vypíše koniec.

Cyklus do-while

Tento cyklus sa od cyklu while líši tým, že podmienku cyklenia testuje PO vykonaní jedného taktu cyklu. Z toho vyplýva, že prvý takt sa spraví vždy a ďalšie iba ak je podmienka cyklenia splnená. Syntax je nasledovná:

do {
  príkazy
} while (podmienka cyklenia);

<< Podmienkový príkaz a logické výrazy | Obsah | Metódy vracajúce hodnoty - funkcie >>