Jazyk C - podmienky: Rozdiel medzi revíziami

Z Kiwiki
Skočit na navigaci Skočit na vyhledávání
 
Riadok 3: Riadok 3:
 
Podmienky nám umožňujú skontrolovať, či je daná podmienka pravdivá (true) alebo nepravdivá (false) a podľa výsledku vykonať určitú časť kódu.<ref>https://www.learn-c.org/en/Conditions</ref>
 
Podmienky nám umožňujú skontrolovať, či je daná podmienka pravdivá (true) alebo nepravdivá (false) a podľa výsledku vykonať určitú časť kódu.<ref>https://www.learn-c.org/en/Conditions</ref>
 
{{Skripta_ZI}}
 
{{Skripta_ZI}}
 
+
__TOC__
 
==Podmienka if-else==
 
==Podmienka if-else==
  

Aktuálna revízia z 15:35, 26. máj 2020

Podmienky nám umožňujú skontrolovať, či je daná podmienka pravdivá (true) alebo nepravdivá (false) a podľa výsledku vykonať určitú časť kódu.[1]

Podmienka if-else

Príkaz if-else sa skladá z dvoch častí: if a else. Kód ktorý je priradený časti if sa vykoná len ak je podmienka pravdivá, zatiaľ čo kód v časti else je vykonaný ak sa podmienka nesplnila. Príkaz else je voliteľný, to znamená, že ak nemáme žiadny kód, ktorý by sa vykonal ak je podmienka nepravdivá, tak ho nepíšeme.

Základný syntax

V jazyku C/C++ sa do oblých zátvoriek () zapisuje vstupný parameter, v tomto prípade podmienka a do zložené zátvorky {} nám vyhradzujú blok kódu. Za príkazom else nenasleduje žiadna podmienka, pretože sa vykonáva len vtedy, ak predošlá podmienka nebola splnená.

if(/*podmienka*/){
  /*kód ktorý sa vykoná ak je podmienka splnená*/
}
else{
  /*kód ktorý sa vykoná ak podmienka nie je splnená*/
}

Základný syntax podmienky if-else

Zjednodušený syntax

Poznáme aj jednoduchší zápis príkazu, ktorý splní iba jeden príkaz:

if(/*podmienka*/)
  /*iba jeden príkaz ktorý sa vykoná ak je podmienka splnená*/;
else
  /*iba jeden príkaz ktorý sa vykoná ak podmienka nie je splnená*/;

Vývojový diagram je rovnaký ako vyššie.

Syntax vetvenia

Niekedy máme viac podmienok a pre každú z nich potrebujeme vlastný kód. Vtedy je vhodná chvíľa použiť vetvenie podmienok. Zapisuje sa podobne ako predchádzajúce dva zápisy, ale za else nasleduje ďalší príkaz if-else.

if(/*prvá podmienka*/){
  /*kód ktorý sa vykoná ak je prvá podmienka splnená*/
}
else if(/*druhá podmienka*/){
  /*kód ktorý sa vykoná ak je druhá podmienka splnená*/
}
else if(/*tretia podmienka*/){
  /*kód ktorý sa vykoná ak je tretia podmienka splnená*/
}
else{
  /*kód ktorý sa vykoná ak žiadna podmienka nie je splnená*/
}

Princíp vetvenia popísaný vývojovým diagramom:

Vetvenie podmienok


Príklad

Nasledujúci príklad zobrazuje, ako používať príkaz if-else so zloženými podmienkami. Ako prvé si načítame hodnoty do premenných a, b, c a následne ich hodnoty porovnávame buď s konštantami, alebo medzi sebou. Ak je jedna z podmienok splnená, tak vypíše, ktorá z podmienok bola splnená. Na príklade si môžete všimnúť, že ak sú splnené dve podmienky, tak sa vykoná kód len pri prvej (od vrchu) z nich.

 1 #include <stdio.h>
 2 
 3 int main (){
 4   int a, b, c;
 5   scanf("%d %d %d", &a, &b, &c); //načítanie vstupných hodnôt
 6 
 7   if(a >= 2 && b < a)
 8     printf("prvá podmienka");
 9   else if(a > b || a > c)
10     printf("druhá podmienka");
11   else if((a > b || a > c) && b < 5)
12     printf("tretia podmienka");
13   else
14     printf("ani jedna podmienka nebola splnená")
15 
16   return 0;
17 }

Poznámka: Väčšina kompilátorov skracuje zložené podmienky. To znamená, že ak pri podmienke typu A && B && C sa zistí, že podmienka A alebo B nevyhovuje, tak preruší overovanie podmienky C. Podobné platí aj pri zloženej podmienke typu A || B || C, ak podmienka A alebo B vyhovuje, tak podmienka C sa už neoveruje. Overovanie podmienok je zľava doprava.

Rozdiel medzi vetvením a sériou príkazov if-else

Hlavný rozdiel pri vetvení a sériou príkazov if-else je ten, že ak sa pri vetvení nesplní jedna z podmienok, nasledujúce podmienky (alebo príkaz else) sa ignorujú. Narozdiel od série príkazov, kde sa nasledujúce podmienky overujú ďalej. To znamená, pri sérii príkazov if-else sa vykoná každý kód, ktorého podmienka bola splnená a pri vetvení sa vykoná len prvý kód, ktorého podmienka bola splnená. Toto sa využíva, ak môže nastať len jeden stav, alebo ak chceme zabezpečiť prioritu určitému kódu, alebo podmienke.

Príklad vetvenia s prioritou

Nasledujúci príklad zobrazuje, ako určíme prioritu pri overovaní 3 premenných:

 1 #include <stdio.h>
 2 
 3 int main (){
 4   int a, b, c;
 5   scanf("%d %d %d", &a, &b, &c); //načítanie vstupných hodnôt
 6 
 7   if(a >= 2)
 8     printf("a je viac alebo rovné ako 2");
 9   else if(b < 5)
10     printf("b je menej ako 5");
11   else if(c == 3)
12     printf("c sa rovná 3");
13   else
14     printf("ani jedna podmienka nebola splnená")
15 
16   return 0;
17 }

Príklad série podmienok if-else

Nasledujúci príklad zobrazuje, ako nezávisle od seba porovnáme 3 premenné

 1 #include <stdio.h>
 2 
 3 int main (){
 4   int a, b, c;
 5   scanf("%d %d %d", &a, &b, &c); //načítanie vstupných hodnôt
 6 
 7   if(a >= 2)
 8     printf("a je viac alebo rovné ako 2");
 9   else
10     printf("a je menej ako 2");
11 
12   if(b < 5)
13     printf("b je menej ako 5");
14   else
15     printf("b je viac alebo rovné ako 5");
16 
17   if(c == 3)
18     printf("c sa rovná 3");
19   else
20     printf("c sa nerovná 3");
21 
22   return 0;
23 }


Príkaz switch-case

Okrem podmienok s konštrukciou if-else poznáme aj switch-case. Tento typ podmienky sa hodí všade tam, kde potrebujeme rýchlo rozhodnuť o hodnote premennej, objektu atď. Táto konštrukcia je síce menej používaná ako podmienka s konštrukciu if-else, ale niekedy je jednoduchšia a ponúka intuitívnejšiu možnosť hlavne vtedy, ak máme nejakú premennú a máme o nej rozhodnúť, akú ma hodnotu. [2]

Syntax

Na rozdiel od if-else sa do okrúhlych zátvoriek () nevkladá podmienka, ale premenná, ktorej možnosti sa budú hľadať a do zložených zátvoriek {} sa nevkladá kód, ale možnosti (case). Každá možnosť je zapísaná v tvare:

case /*možnosť*/: /*kód(príkaz)*/; break;

Príkaz break v tomto prípade preruší vyhľadávanie možností a celý príkaz switch-case sa ukončí. Ak by sme príkaz break nepoužili, tak môžeme spôsobiť až zacyklenie príkazu switch-case, pretože bude stále vyhľadávať možnosti. Ak chceme nastaviť kód, ktorý sa vykoná len ak sa nenašla žiadna možnosť, tak použijeme "možnosť" default:

default: /*kód(príkaz)*/; break;

Jednoduchý príklad

Príklad načíta hodnotu a, potom príkaz switch prehľadáva štyri možnosti a ak nejakú nájde, vykoná kód ktorý je k ním priradený. Ak nenájde žiadnu možnosť, vykoná kód, ktorý je priradený k možnosti default.

 1 #include <stdio.h>
 2 
 3 int main (){
 4   int a;
 5   scanf("%d", &a); //načítanie vstupných hodnôt
 6 
 7   switch(a){
 8     case 0: printf("a je 0"); break;
 9     case 1: printf("a je 1"); break;
10     case 2: printf("a je 2"); break;
11     case 5: printf("a je 5"); break;
12     default: printf("a nie je ani jednou z moznosti"); break;
13   }
14 
15   return 0;
16 }

Príklad s rovnakým kódom pre viac možností

Príklad je podobný ako predchádzajúci, s tým rozdielom, že k prvým trom možnostiam je priradený rovnaký kód.

 1 #include <stdio.h>
 2 
 3 int main (){
 4   int a;
 5   scanf("%d", &a); //načítanie vstupných hodnôt
 6 
 7   switch(a){
 8     case 0:         //preskočí na case 2:
 9     case 1:         //preskočí na case 2:
10     case 2: printf("a je %d", a); break;
11     case 5: printf("a je určite 5"); break;
12     default: printf("a nie je ani jednou z moznosti"); break;
13   }
14 
15   return 0;
16 }

Príklad s viac príkazmi v možnosti

Príklad zobrazuje použitie zložených zátvoriek {} ak máme veľa príkazov v možnosti.

 1 #include <stdio.h>
 2 
 3 int main (){
 4   int a, b;
 5   scanf("%d", &a, &b); //načítanie vstupných hodnôt
 6 
 7   switch(a){
 8     case 0: printf("a je 0"); break;
 9     case 1:{ //možnosť s viacerými príkazmi
10       printf("a je 1");
11       b++;
12       printf("b je %d", b);
13       break;
14     }
15     case 2: printf("a je 2"); break;
16     case 5: printf("a je 5"); break;
17     default: printf("a nie je ani jednou z moznosti"); break;
18   }
19 
20   return 0;
21 }

Ostatné príklady

[Viac príkladov nájdete tu]

Referencie