3.1 Riadiaca zložka

Počítačový program je postupnosť príkazov. Túto postupnosť procesor postupne prechádza a jednotlivé príkazy vykonáva v poradí – najprv prvý, potom druhý atď. Niekedy potrebujeme, aby sa isté príkazy vykonali len ak je splnená určitá podmienka. Ďalšou možnosťou je zopakovanie sledu príkazov. Tieto špecifické štruktúry označujeme aj ako základné riadiace štruktúry. [3]


V algoritmoch sa stretávame s troma základnými konštrukciami, ktoré označujeme:

Sekvencia (Blok)

Je to najjednoduchšia riadiaca štruktúra. Všeobecne sa dá povedať, že ide o postupnosť príkazov. Je tvorená jedným alebo niekoľkými krokmi, ktoré sa vykonajú pravé raz v danom poradí. V Jave uzatvárame postupnosť príkazov do zátvoriek {}.


Príklad sekvencie (bloku):
Príklad postupnosti príkazov v zátvorkách, ktorá sčíta dve čísla a potom vypíše ich súčet:


{
int i = 17;
int j = 25;
int súčet = i + j;
System.out.println("súčet i a j je " + súčet);
}


Výstup:
súčet i a j je 42

Vetvenie

Je taká štruktúra, ktorá v procese vykonávania algoritmu umožňuje vyberať rôzne alternatívy riešenia podľa splnenia, či nesplnenia zadaných podmienok. Ak je podmienka splnená, pokračuje sa vykonávaním vetvy, označenej aj ako „+“, v opačnom prípade sa pokračuje plnením príkazov „-“. [2]


Podmienené spracovanie
Ide o špeciálny prípad vetvenia, kedy ak sa splní podmienka, vykoná sa príkaz (resp. príkazy) a ak podmienka nie je splnená, príkazy sa preskočia.


Syntax príkazov:

  if podmienka
  {
        Príkazy pre platnú podmienku;
  }


Príklad podmieneného spracovania:
Príklad si na vstupe vyžiada dve čísla, ktoré potom vydelí a výsledok vypíše používateľovi na obrazovku. Dá pozor, aby sa nedelilo nulou.


public static void main(String[] args)
{
      int a = (int)načítajCeléČíslo("Zadaj delenec"); // do premennej a načíta používateľom prvé zadané číslo
      int b = (int)načítajCeléČíslo("Zadaj deliteľ");   // do premennej b načíta druhé zadané číslo

      if (b == 0) // podmienka, ktorá zabezpečí výpis chyby v prípade, že druhé zadané číslo (deliteľ) je rovný nule
      {
          System.out.println("Nemôžem deliť nulou!");
          System.exit(-1);
      }

      int c = a / b; // príkaz, ktorý sa vykoná ak sa preskočí podmienka
      System.out.println("Podiel " + a + " delené " + b + " je " + c); // výpis vo "vetve", kedy sa preskočila podmienka
}


Vetvenie pomocou if-else
Na základe vyhodnotenia boolovského výrazu (ide o typ, ktorý nadobúda dve hodnoty: platí alebo neplatí, trua false, 1,0), ktorý vracia hodnotu pravda (true) alebo nepravda (false), rozhoduje, či sa určitý blok programu vykoná alebo nie. Voliteľne je možné ešte v prípade nepravdivého výroku vykonať alternatívny blok príkazov za pomoci pridania „else“ vetvy a podmienky „if“. [10]


Syntax príkazov:

  if podmienka
  {
        Príkazy pre platnú podmienku;
  }
  else
  {
        Príkazy pre neplatnú podmienku;
  }
[10]



Príklad:
V tomto príklade nám program porovná hodnoty dvoch premenných ij. V prvej podmienke overujeme, či je i menšie od j. Ak áno, vypíše túto informáciu a ostatné vetvy preskočí. Ak nie, pokračuje vetvou else, v ktorej hneď testujeme, či sa nerovnajú. Ak áno vypíše o tom správu a preskočí ostatné vetvy. Ak ani táto podmienka nie je splnená, program vykoná poslednú else vetvu, ktorou vypíše, že i je väčšie ako j.



int i = 17;
int j = 25;

if (i < j)
{
    System.out.println("i je menšie ako j."); // vypíše informáciu, ak podmienka nie je splnená, program pokračuje vetvou else, ak je splnená, preskočí ju
}

else if (i == j) // ak neplatí i < j, skúšame, či sa nerovnajú
{
    System.out.println("i = j");
}

else // zostáva už len možnosť, že i je väčšie ako j 
{
    System.out.println("i je väčšie ako j.");
}


Môžete si vyskúšať zmeniť hodnoty premenných, tak, aby ste overili všetky možnosti.


Vetvenie pomocou switch
Ak nestačí jednoduché vetvenie if-else a je potrebné mať na výber z viacerých možných úsekov kódu, je vhodné použiť vetvenie pomocou konštrukcie „switch“. Na základe hodnoty premennej sa vyberie tá časť, ktorá je definovaná pre konkrétnu hodnotu alebo interval obsahujúci túto hodnotu. Každá vetva je ukončená príkazom „break“.
Ak by sme zabudli ukončiť vetu príkazom „break“ program síce nevypíše chybu pri preklade, ale vykoná všetky príkazy, ktoré sa nachádzajú po prvý nájdený príkaz „break“.
Môžeme definovať aj úsek „default“, ktorý sa vykoná ak hodnota premennej nespadá ani do jednej z možností. [10]


Syntax príkazov:

switch (testovaný výraz)
  {
    case hodnota1:
      príkazy vykonané pri hodnote1 testovaného výrazu;
      break;
    case hodnota2:
      príkazy vykonané pri hodnote2 testovaného výrazu;
      break;
    default:
      príkazy vykonané pre všetky iné hodnoty výrazu;
      break;
  }


Príklad:
Nasleduje program, ktorý vypíše hodnotu premennej i slovom. Táto verzia funguje len od čísla nula po číslo päť. Pre ostatné hodnoty vypíše oznámenie.

int i = 3;

switch (i)
{
    case 0:
		System.out.println("nula");
		break;
    case 1:
		System.out.println("jeden");
		break;
    case 2:
		System.out.println("dva");
		break;
    case 3:
		System.out.println("tri");
		break;
    case 4:
		System.out.println("štyri");
		break;
    case 5:
		System.out.println("päť");
		break;
    default:
		System.out.println("hodnotu čísla i neviem spracovať");
}


Výsledok príkladu: tri


(Poznámka: Ak by sme v tomto príklade zabudli napísať príkaz break za vetvy case 3, case 4 a case 5; program by vypísal: tri štyri päť hodnotu čísla i neviem spracovať)

Cyklus

Táto riadiaca štruktúra nám poskytuje možnosť opakovať činnosť alebo činnosti. Musíme vedieť, čo sa má opakovať a dokedy sa to má opakovať. Činnosť, ktorá sa opakuje sa nazýva telo cyklu a podmienka cyklu nám určuje dokedy sa bude telo cyklu opakovať.
Cykly možno rozdeliť podľa vzťahu medzi telom a podmienkou cyklu na tri rôzne cykly:

  • Cyklus so známym (explicitným) počtom opakovaní: for
  • Cyklus s podmienkou na začiatku: while
  • Cyklus s podmienkou na konci: do-while [2]

Cyklus for
Pri použití tohto cyklu sa dá počet opakovaní vyjadriť dopredu (pred odštartovaním cyklu) a na operácie v tele cyklu nemajú žiaden vplyv. [2]
Cyklus for má preto zmysle napríklad pri vykonávaní niekoľkých výpočtov, ktoré spolu súvisia, pri práci s elementmi na obrazovke alebo pri spracovávaní určitej množiny vstupných údajov. [11]


Syntax príkazov:

for (inicializácia; podmienka; iteračný príkaz/y)
  {
    príkazy
  }
[12]



Pod pojmom inicializácia rozumieme deklaráciu a počiatočné hodnoty premenných. Iteráciu chápeme ako jedno vykonanie cyklu a daný príkaz/y sa vykoná (vykonajú) po každej iterácii.


Argumenty príkazov:
Počiatočné hodnoty – Priraďujú riadiacej premennej jej počiatočnú hodnotu. Najčastejšie sa rovná 0 alebo 1.
Podmienka – Testuje hodnotu riadiacej premennej, aby sa zistilo, či cyklus už prebehol pre stanovený počet opakovaní.
Prírastky – Pri každom prebehnutí cyklu sa k riadiacej premennej pripočíta zadaný prírastok, najčastejšie jednotka. Prírastok môže byť i < > 1 (i záporný). Pri použití prírastku i < > od 1 je dôležité skontrolovať správnosť podmienky.
Príkazy – Postupnosť príkazov, ktoré sú opakovane vykonávané podľa zadaného počtu opakovaní. [12]


Príklad použitia cyklu for:
Cyklus for, ktorý zobrazí hodnoty od 1 do 10.

for (int i = 0; i < 10; ++i)
  {
    System.out.println("Hodnota počítadla je : " + i);
  } 
[12]



Cyklus while
Ide o cyklus s podmienkou na začiatku. Podmienka sa stará o ukončenie cyklu, čiže ak je podmienka splnená, vykoná sa telo cyklu a podmienka sa opäť zopakuje. Ak podmienka splnená nie je, telo cyklu sa vynechá a pokračuje sa „-“ vetvou algoritmu. Pokiaľ „vstupná podmienka“ nie je splnená už pri prvom vstupe do cyklu, nemusí sa tento cyklus vykonať vôbec. [2]


Syntax príkazov:

while (podmienka)
  {
    príkazy
  }
[12]



Argumenty príkazov:
Podmienka – Testuje hodnotu, aby sa zistilo, či sa má vykonať telo cyklu (podmienka = true) alebo sa má telo cyklu vynechať (podmienka = false). Podmienka musí byť vyhodnotiteľná ako true alebo false.
Príkazy – Postupnosť príkazov, ktoré tvoria telo cyklu. [12]


Príklad použitia cyklu while:
Program na výpis hodnôt premennej do chvíle, kým je premenná i je väčšia ako 0. Na vstupe je zadaná hodnota premennej i = 3 a hodnota premennej je po každom prebehnutí cyklu zmenšená o jedna.


int i = 3;
while (i > 0)
{
    System.out.println("Hodnota premennej i = " + i);
    i--;
} 


Výsledkom príkladu je nasledujúci výpis:
  Hodnota premennej i = 3
  Hodnota premennej i = 2
  Hodnota premennej i = 1
[12]


Cyklus do-while
V prípade tohto typu cyklu sa najprv vykoná telo cyklu a až potom sa overuje splnenie podmienky. Ak je podmienka cyklu splnená, vykonávanie cyklu sa zopakuje. V opačnom prípade sa cyklus ukončí. Dôsledkom takejto postupnosti je, že telo cyklu vždy prebehne minimálne raz.


Syntaxe príkazov:


do
{
   príkazy
}
while (podmienka); 
[12]



Argumenty príkazov:
Príkazy – Telo cyklu tvorí postupnosť príkazov, ktorá sa vykonaná minimálne raz a maximálne po dobu platnosti podmienky.
Podmienka – Testuje hodnotu, aby sa zistilo, či sa má cyklus opakovať (podmienka = true) alebo nie (podmienka = false). Podmienka musí byť vyhodnotiteľná ako true alebo false. [12]


Príklad cyklu do-while:
Cyklus, ktorý vypíše hodnotu premennej i väčšej ako 10 a premennú po každom prebehnutí programu zmenší o jedna.

int i = 17;
do
{
    System.out.println("Hodnota premennej i = " + i);
    i--;
}
while (i > 10);

Výsledkom príkladu je nasledujúci výpis:
Hodnota premennej i = 17
Hodnota premennej i = 16
Hodnota premennej i = 15
Hodnota premennej i = 14
Hodnota premennej i = 13
Hodnota premennej i = 12
Hodnota premennej i = 11

Cyklus prebehol sedem krát, vypísal hodnoty 17 – 11. Ide však o neopatrný cyklus. Pretože ak by vstupná hodnota premennej bola menšia ako 11vypíše aj túto hodnotu aj keď nespĺňa podmienku. Napríklad: i = 3, cyklus prebehol jeden krát a vypísal hodnotu 3, čo je ale menej ako 10 a teda hodnota nespĺňa podmienku na konci.



Nasledujúce video simuluje činnosť tohto programu:



Continue a Break
Continue a Break sú špecifické príkazy určené na manipuláciu s cyklom. Príkazom „continue“ vo vnútri tela cyklu sa okamžite začne vykonávať telo cyklu od začiatku.
Pri použití „for“ cyklu sa vykoná aktualizácia počítadla a posúdi sa podmienka. V cykle „while“ sa vyhodnotí počiatočná podmienka a pri cykle „do-while“ sa vyhodnotí koncová podmienka.
Príkazom „break“ sa preruší celý aktuálny cyklus a pokračuje sa nasledujúcimi príkazmi. Pri konštrukcii mnohonásobného vetvenia „switch“ príkaz „break“ ukončuje jednotlivé vetvy. [10]

Úlohy na precvičenie:

Definuj premennú:


Môže premenná typu int obsahovať hodnotu true? Svoje tvrdenie zdôvodni:


S akými základnými riadiacimi štruktúrami sa stretávame pri algoritmoch?


Charakterizuj riadiacu štruktúru VETVENIE a definuj pomocou akých slov ho vytvárame: