Príkazy a Výrazy


Obsah tém. 

  1. Výrazový príkaz
  2. Príkaz IF ... ELSE ...
  3. --Príklady na IF ... ELSE 
  4. Príkaz SWITCH - prepínač 
  5. --Príklady na SWITCh
  6. Príkaz WHILE
  7. Príkaz DO WHILE
  8. Príkaz FOR
  9. Príkazy skoku BREAK , CONTINUE


V C - jazyku príkazom sa stáva výraz ukončený  bodkočiarkou ( ; ). Najčastejší príkaz je priraďovací. Špecialitou C jazyka je, že aj logické výrazy môžu obsahovať v sebe priradenia. Výraz priradenia zapísaný do zátvoriek bez ukončenia znakom bodkočiarky sa môže aplikovať tak, ako by výsledná priraďovaná hodnota bola poskytnutá aj "samotnej zátvorke". Keďže logické výrazy sa vyhodnocujú ako čísla, môže priradená hodnota byť nulová (t.j. aj logická 0) alebo nenulová (t.j. logická 1) a takto sa táto vyhodnotí pri začlenení výrazu v zátvorke do logického výrazu. 

Príklad: Ak chceme prečítať kód klávesnice máme dve možnosti - jednoduchý ASCII kód resp. dvojkód  0 nasledovaná ASCII kódom

      int vstup=0;      // načítaný kód ASCII zodpovedajúci klávese
      int typKodu=0;    // označenie kódu jednoduchý=0 alebo dvojkód=1
      ...
      if ( !( vstup=getch() ) )  // výraz číta klávesu a súčasne test na 0 
      { vstup=getch() ;          // ak bola 0 ide o dvojkód a načítame aj druhý kód
        typKodu=1;
        } 
      else 
      { typKodu=0;
        }
      ...

 Zdrojový text programu obsahuje dve základné formy inštrukcií príkazy v C-čku môžeme rozdeliť do týchto skupín: výrazový príkaz, zložený príkaz, príkaz vetvenia, príkaz cyklu, príkaz skoku. Príkaz  oddeľujeme .

Výrazový príkaz

Výrazový príkaz sa skladá z výrazu a bodkočiarky. Namiesto výrazu je možné dosadiť konštantu, reťazec, identifikátor. To sú takzvané primárne výrazy ( lexikálne jednotky ). Ale môžu to byť aj volania funkcie a operácie. Voláme ich zložené výrazy.


Príklady výrazových príkazov

  • volania funkcií: napr.( getch(); alebo  clrscr(); )
  • príkaz priradenia: napr. ( x=5; alebo x=y; )
  • príkaz inkrementácie: x++ alebo ++x čo znamená x=x+1, prvý po vykonaní výrazu v ktorom sa konštrukcia objaví a druhý pred vykonaním príkazu v ktorom sa konštrukcia objaví
  • príkaz dekrementácie: x-- alebo --x čo znamená x=x-1, prvý po vykonaní výrazu v ktorom sa konštrukcia objaví a druhý pred vykonaním príkazu v ktorom sa konštrukcia objaví

Príkazy vetvenia

Príkaz vetvenia vykonáva určité príkazy, ak je výraz pravdivý, teda má nenulovú hodnotu. Ak je výraz nepravdivý máme dve možnosti buď pokračujeme v programe, potom kľúčové slovo pre tento príkaz je if. Alebo sa vykonávajú príkazy pre nepravdivý výraz, potom kľúčové slovo pre takýto príkaz je if else. Ak sa rozhodujeme medzi viacerými možnosťami potom používame príkaz switch ( prepínač ).  Niekedy je možné nahradiť tento príkaz vnoreným if else.

Príkaz if -  neúplný podmienený príkaz.

 syntax:	if( podmienka )
		   príkaz;

Príkaz sa vykoná ak má výraz nenulovú hodnotu, teda podmienka je splnená. Ak je príkazov viac musia byť ohraničené zloženými zátvorkami { }.

syntax:		if( podmienka )
		{
		   príkaz 1;
		   :
		   príkaz n;
		   }

Príkazy (príkaz 1 až príkaz n) sa vykonajú ak je splnená podmienka

Príklad č.8:

Program čaká na stlačenie 1 znaku, ktorý testuje. Ak to bude ´A´ alebo ´a´ vypíše na obrazovku "Ja som FANTOMAS" ak nie, program sa ukončí.

Príkaz if else -  úplný podmienený príkaz.

Tento príkaz umožňuje rozhodnúť sa medzi dvoma možnosťami. Najskôr sa vyhodnotí výraz v zátvorkách a ak je pravdivý, vykoná sa príkaz1. Ak je výraz nepravdivý vykoná sa príkaz2.
Ak príkaz1 alebo príkaz2 pozostáva z viacerých príkazových riadkov, musia sa uzavrieť zloženými zátvorkami.

syntax:		if ( podmienka )
		   príkaz1;
		else
		   príkaz2;
alebo
syntax:		if ( podmienka )
		{
		   príkaz 1;
		   :
		   príkaz n;
		   }
		else
		{
		   príkaz1;
		   :
		   príkaz m;
		   }

 Príklad č.9:

Program, ktorý čaká na stlačenie 1 znaku. Ak sa stlačí číslica program vypíše na obrazovku: "Stlačil si číslicu ?", ak nie vypíše: Nestlačil si číslicu".

Príkaz zložený z viacerých príkazov if else

Pri vetvení je možné príkazy if else do seba vnárať. Pri vzájomnom vnáraní sa časť else automatický priradí najbližšiemu predchádzajúcemu if.

syntax:		if(výraz1)
		   príkaz1;
		else if(výraz2)
		        príkaz2;
		     else if(výraz3);
		             príkaz3;
		          else ...
		             príkaz;


Jedná sa o viaccestné rozhodovanie (prepínač). Výrazy sa vyhodnocujú v uvedenom poradí, pokiaľ sa nenarazí na pravdivý výraz. Potom sa vykoná k nemu prislúchajúci príkaz. Príkaz za posledným else sa vykoná ak žiaden z predchádzajúcich výrazov nebol pravdivý. Môže to byť napríklad chybové hlásenie.

Príklad č.10:

Program, ktorý vypíše či zadané číslo je rovné 0, kladné alebo záporné.

Príklady na if, if else

Príklad č.11:

Program vypočíta obvod resp. obsah kruhu. Vstupom je polomer kruhu.

Príklad č.12:

Program, ktorý konvertuje malé písmená na veľké.

Príklad č.13:

Program, ktorý vypočíta korene kvadratickej rovnice

 Úlohy:

  1. Vytvorte program, ktorý načíta dve celé čísla a vypíše:" Väčšie číslo je ??". Ak budú čísla rovnaké vypíše: "Zadal si rovnaké čísla ??".
  2. Vytvorte program, ktorý načíta 1 znak ak ten znak bude písmeno (veľké resp. malé) a vypíše: "Zadal si písmeno". Ináč program skončí.
  3. Vytvorte program, ktorý načíta 1 znak ak ten znak bude písmeno (veľké resp. malé) vypíše: "Zadal si písmeno". Ak bude číslica vypíše: "Zadal si číslicu". Ak zadáte iný znak vypíše: "Nezadal si ani číslicu ani písmeno".

 

Príkaz Switch - prepínač

Tento príkaz sa používa na podobný účel ako príkaz zložený z viacerých if else. Avšak umožňuje vetvenie na základe jednej podmienky

syntax:		switch(podmienka)
		{
		   case hodmota1:príkaz1; break;
		   case hodnota2:príkaz2; break;
		   case hodnota3:príkaz3; break;
		   ...		
		   default:príkazn;
		   }

Príkaz switch vyhodnotí znakový vyraz v zátvorkách a jeho hodnotu porovná postupne s hodnotami uvedenými za kľúčovými slovami case. Pri zhode sa vykoná príkaz uvedený pri danej alternatíve Ak by na konci nebol príkaz break, pokračovalo by sa vo vykonávaní ostatných možností až do konca príkazu switch. Možnosť default zahrňuje všetky ostatné hodnoty výrazu uvedeného ako argument kľúčového slova switch. Nie je povinná no kvôli prehľadnosti sa odporúča.

Vlastnosti:

  • podmienka testovaná vo switch musí byť celočíselného typu teda int
  • každá vetva prepínania muší byť ukončená príkazom break inak sa vykoná nasledujúca vetva
  • vetva default sa vykonáva, ak žiadna z vyššie uvedených vetiev nevyhovuje

Príklad č.14:

Program, ktorý vypočíta paralelný alebo sériový odpor na základe možnosti rozhodnúť sa.

Treba si všimnúť si, že v tomto príklade musíme použiť premennú z, ktorá bude slúžiť na ukladanie znaku. Dátový typ premennej musí byť int. Čo znamená, že na načítanie 1 znaku použijeme funkciu getch(). Potom sa hodnota premennej v príkaze switch porovná s možnosťami v  case ak sa nájde zhoda vykoná sa príkaz v príslušnej vetve. Príkaz break na konci vetvy zabezpečí aby sa ďalšie porovnávanie "preskočilo" a tým sa príkaz switch ukončí.
 Inou alternatívou možného riešenia tohto príkladu je použiť príkazy if else (viď.príklad č.11).

Príklady na switch

Príklad č.15:

Program, ktorý testuje načítaný znak zo vstupu. Ak to bude ´a´ alebo ´A´ vypíše slovo: "ANO" ak to bude ´n´ alebo ´N´ vypíše slovo "NIE" inak vypíše: "Nezadal si ani jeden z týchto znakov". Všimnite si že malé písmená sú obslúžené príkazom uvedeným pri veľkých písmenách nakoľko na danom riadku nie je príkaz break.

 

Príklad č.16:

Horoskop - program , ktorý ak zadáme deň a mesiac narodenia a vypíše znamenie.
 

??????

Úlohy na zopakovanie

  1. Napíšte program, ktorý načíta 3 čísla a vypíše najväčšie z nich.
  2. Napíšte program, ktorý po zadaní dvoch čísel zistí či je súčin rovný 0 alebo nie.
  3. Napíšte program, ktorý po zadaný mesiaca vypíše ročné obdobie.
  4. Napíšte program ( kalkulačka). Zadáte dve čísla a znamienko operácie napr. +,-,*,/, a program vám vypíše výsledok.
  5. Napíšte program, ktorý zistí či číslo načítané zo vstupu je párne alebo nepárne.
  6. Napíšte program, ktorý po každom stlačení klávesy vypíše vaše meno. Až kým nebude stlačený kláves ´k´ , potom program skončí.
  7. Napíšte program pre výpočet objemu a obsahu kvádra. Použitím príkazu switch a použitím príkazu if else.

 

    Príkazy cyklu - iteračné príkazy 

Príkazy cyklu slúžia na opakovanie určitej časti programu za splnenia podmienky. Príkazy, ktoré sa majú v cykle opakovať nazývame telo cyklu.

Poznáme cykly
s neurčitým počtom opakovaní: WHILE, DO WHILE sú to cykly u ktorých nevieme koľko krát sa majú príkazy v tele cyklu opakovať s určitým počtom opakovaní: FOR je to cyklus kde vieme koľko krát sa majú príkazy v tele cyklu opakovať

Každý z cyklov sa vykonáva dovtedy, pokiaľ je hodnota výrazu nenulová.
 

Príkaz while

V cykle while sa vyhodnocuje výraz ešte pred vstupom do tela cyklu. To znamená, že príkazy v tele cyklu sa vykonajú iba ak bude mať výraz nenulovú hodnotu.
Pri tomto type príkazu sa môže stať, že cyklus neprebehne ani raz.

syntax:		while(podmienka)  
		   príkaz;

alebo

syntax:		while(podmienka)
		{
		   príkaz1;
		   ...
		   príkazn;
		   }


 Ak je hodnota výrazu nenulová vykonajú sa príkazy alebo príkaz v tele cyklu a znovu sa vyhodnotí výraz. Cyklus sa opakuje dovtedy, pokiaľ výraz nenadobudne nulovú hodnotu.
Potom sa cyklus ukončí a program pokračuje ďalším príkazom.

Príklad č.17:

Program, ktorý po stlačení klávesy vypiše na obrazovku: "Zuzka". Tento proces sa opakuje dovtedy pokiaľ nestlačíme kláves ´k´ potom program skončí.

Na začiatku hodnotu premennej a nastavíme na 0, týmto sme si že premenná a neobsahuje ASCII KOD žiadneho znaku.
Teda ak sa prvý krát vyhodnotí výraz v príkaze while hodnota premennej a ( ktorá je typu int ) sa nerovná ascii kódu 'k' resp. 'K'.
Keďže podmienka cyklu je splnená program začne vykonávať príkazy v tele cyklu. Čaká na stlačenie znaku, ktorý načíta cez funkciu getch() do premennej a. Ak načítaný znak sa nerovná "k" resp. "K" vypíše sa na obrazovku: "Zuzka" ak sa rovná program sa ukončí.

Príklad č.18:

Program, ktorý sčítava celé čísla zadávané zo vstupu. Zadávanie sa ukončí číslom 0 a vytlačí sa súčet čísel.

 V tomto programe sme si zadefinovali dve premenné. Premennú a potrebujeme na ukladanie aktuálne načítaného čísla. Pomocou premennej sucet budeme sčítavať jednotlivé čísla, pričom prvý súčet bude rovný 0 + zadané číslo. Celý proces je založený na postupnom pripočítavaní zadaného čísla k súčtu z predošlého kroku. Ak zadáme 0 cyklus sa ukončí a program pokračuje príkazom printf, ktorý vytlačí hodnotu uloženú v premennej sucet.

Úloha:

Pokúste sa tento program upraviť tak aby sa tlačili jednotlivé medzi súčty.

Príkaz do while

Príkaz do while je podobný príkazu while s tým rozdielom, že teraz sa  podmienka vyhodnocuje až po prvom vykonaní tela cyklu. Príkazy v tele cyklu sa budú vykonávať dovtedy, pokiaľ je podmienka splnená. Pri tomto type príkazu určite cyklus prebehne aspoň raz.
 

  
syntax:		do  
		   príkaz;
		while(výraz);

alebo

syntax:		do
		{ 
		   príkaz1;
		   ...
		   príkazn;
		   } while(výraz);

Najskôr sa vykonajú príkazy resp. príkaz v tele cyklu a potom sa vyhodnotí výraz. Ak je výraz pravdivý t.j. má nenulovú hodnotu, telo cyklu sa opäť vykoná. Ak je pravdivý, cyklus sa skončí.
Cyklus do while je možné použiť všade tam kde treba telo cyklu určite aspoň raz vykonať.


Pozn.: Iste ste si všimli, že za testovaným výrazom je bodkočiarka.

Príklad č.19:

Pokúsime sa príklad č.18 prerobiť použitím príkazov do while 

Príklad č.20:

Program načíta číslo a vypíše ho v desiatkovej, osmičkovej a šestnáctkovej sústave. Zadávanie ďalšieho čísla ukončíme 0.

Ak chceme používať cyklus while ako cyklus so známym počtom opakovaní, musíme si vytvoriť premennú, ktorú budeme používať ako počítadlo. Túto premennú budeme po každom prejdení cyklom zvyšovať resp. znižovať o jednotku a v podmienke cyklu budeme testovať jej veľkosť.

 Príkaz  for

Cyklus for je cyklus so známym počtom opakovaní. Cyklus so známym počtom opakovaní je taký cyklus, pri ktorom vieme koľko krát sa majú príkazy v tele cyklu opakovať.

syntax:		for(výraz1;výraz2;výraz3)
		   príkaz;
		
alebo

syntax:		for(výraz1;výraz2;výraz3)
		{	
		   príkaz1;
		   ...
		   príkazn;
		   }

výraz1: inicializácia riadiacej premennej cyklu  (nastavenie počiatočnej hodnoty premennej napr.(i=0 alebo j=10))
výraz2: je relačný výraz a pokiaľ je jeho hodnota rôzna od nuly, telo cyklu sa bude opakovane vykonávať napr. (i>10 alebo j<0)
výraz3: je výraz v ktorom riadiacu premennú cyklu inkrementujeme alebo dekrementujeme napr.(i++ alebo i--)

napr.:
Zápis cyklu for ak príkazy v tele cyklu sa majú opakovať 10 - krát.

  
   for(i=0;i<10;i++)  // po vykonaní príkazov bloku sa "i" zvýši o 1  postinkrement
   { 
      príkaz1;
      ...
      príkazn;
      }

 

Pred vstupom do cyklu sa premenná i nastaví na hodnotu i=0 (vyraz1). Príkazy v tele cyklu sa opakovane vykonávajú pokiaľ je splnená podmienka i<10 ( výraz2 má nenulovú hodnotu).
Po každom vykonaní cyklu sa vykoná inkrementácia premennej i=i+1 (výraz3).

Príkaz for môžeme použiť aj pre vytvorenie nekonečného cyklu. To dosiahneme vynechaním vyrazu2 v hlavičke.


   for (výraz1; ; výraz3)  { }
   

V tom prípade treba do tela cyklu dať príkaz, ktorý zabezpečí ukončenie cyklu ako break alebo return. Ak nepotrebujeme v hlavičke žiaden výraz, dvojicu ;; musíme ponechať.

Príklad č.21:

Program, ktorý vypíše 20 - krát slovo "SKOLA" v očíslovanom poradí. 

 

  Vzťah medzi while a for

 Ak chceme používať cyklus while ako cyklus so známym počtom opakovaní, musíme si vytvoriť premennú, ktorú budeme používať ako počítadlo. Túto premennú budeme po každom prejdení cyklom zvyšovať resp. znižovať o jednotku a v podmienke cyklu budeme testovať jej veľkosť.

for(výraz1;výraz2;výraz3)		výraz1
{ príkaz1;		                while(výraz2)
  :			                {
  príkazn;			           príkaz1;
  }					   :
                                           príkazn;
                                           výraz3;
                                           }

Príklad č.22:

Program, ktorý vypíše 20 - krát slovo "SKOLA" v očíslovanom poradí. Príklad napísaný pomocou cyklu while. 

 

Príklad č.23:

Program, ktorý n - krát vytlačí slovo načítané zo vstupu v očíslovanom poradí.

 

Príklad č.24:

Príklad, ktorý vypíše na obrazovku všetky malé písmena od ´a´ po ´z´

Príklad č.25:

Naprogramujme hru "Myslím si číslo". Počítač si bude myslieť číslo v rozsahu 0 až 100 a našou úlohou je nájsť to číslo.
Program nám bude napomáhať pri upresnení tohto čísla napr.: "Moje číslo je väčšie." " Moje číslo je menšie."

Úlohy na zopakovanie

  1. Napíšte program, ktorý pre číslo zadané zo vstupu je párne resp. nepárne. Zadávanie čísla ukončíme 0.
  2. Napíšte program, ktorý vypíše všetky čísla od 0 po 10 s krokom 0.1.
  3. Napíšte program, ktorý vypíše desiatkové číslo zadané zo vstupu v osmičkovej a hexadecimálnej sústave. Zadávanie ukončíte 0.
  4. Napíšte program ( kalkulačka). Zadáte dve čísla a znamienko operácie napr. +,-,*,/, a program vám vypíše výsledok. Program sa opakuje pokiaľ nezadáte znak ´x´.
  5. Napíšte program pre výpočet objemu alebo povrchu kvádra. Program sa opakuje pokiaľ nezadáte znak ´x´.
  6. Napíšte program, ktorý vypíše všetky párne čísla od 20 po 0.
  7. Napíšte program, ktorý zistí počet slov vo vete.
  8. Napíšte program, ktorý vynásobí dve celé čísla za podmienky, že nebude použitá inštrukcia násobenia, ale len sčítania.
  9. Naprogramujte hru "myslím si číslo" pre dvoch hráčov. Prvý hráč číslo zadá a druhý ho hľadá. Program mu bude napomáhať pri upresnení hľadaného čísla
    napr.: "Moje číslo je väčšie." "Moje číslo je menšie."
  10. Naprogramujte hru "myslím si číslo". Počítač si bude myslieť číslo v rozsahu 0 až 100 a vašou úlohou je nájsť to číslo.
    Program vám bude napomáhať pri upresnení tohto čísla napr.: "Moje číslo je väčšie." " Moje číslo je menšie."
  11. Horoskop - Napíšte program, ktorý ak zadáte deň a mesiac narodenia vypíše aké ste znamenie. Zadávanie sa môže opakovať až kým nestlačíte klávesu ´k´ alebo ´K.´

    Príkazy skoku

break
S príkazmi cyklov ( for, while, do while) a s príkazom switch úzko súvisí aj príkaz break. Tento príkaz umožní predčastné ukončenie cyklu či viaccestného rozhodovania ( switch).

continue
Ak sa v tele cyklu narazí na príkaz continue, zvyšok tela cyklu sa preskočí. Pokračuje sa testom výrazu pre ukončenie tela cyklu.


while (vyraz1)
{
   prikaz1;
   if (vyraz2)
      continue;
   prikaz3;
   prikaz4;
   }
   

Telo cyklu sa bude vykonávať, kým bude vyraz1 pravdivý. To znamená, že sa vykoná príkaz a test vyrazu2. Ak bude vyraz2 pravdivý, vykoná sa príkaz continue, čo spôsobí preskočenie všetkých ostatných príkazov v tele cyklu. Pokačovať sa bud znovu vyhodnotením vyrazu1..Príkaz continue nie je možné použiť v rozhodujúcej konštrukcii switch.

goto  

Použitie príkazu goto je podobné ako použitie príkazu break. Je užitočný hlavne v situáciách ak potrebujeme vo vnorených cykloch predčasne vyskočiť nielen z najvnútornejšieho, ale z celej konštrukcie. Ak však môžete, radšej na tento príkaz navždy ZABUDNITE!!! Dnešný trend programovania používa iné programové konštrukcie (while, do while, switch, ...)
napr.:


for (...)
{ for (...)
  {
    ...
    if (...)
      goto next;
    }
  }
...
next: ... 

V tomto prípade, ak bude splnená podmienka v príkaze if, preruší sa vykonávanie cyklov a bude sa pokračovať príkazom nasledujúcim za návestím next.