5. diel - Podmienky (vetvenia) v jazyku C
V minulej lekcii, Typový systém v céčku druhýkrát: Dátové typy , sme si podrobne prebrali dátové typy. Aby sme si niečo naprogramovali, potrebujeme nejako reagovať na rôzne situácie. Môže to byť napríklad hodnota zadaná užívateľom, podľa ktorej budeme chcieť meniť ďalšie beh programu. Hovoríme, že sa program vetví a k vetvenia používame podmienky, tým sa budeme venovať celý dnešný tutoriál. Vytvoríme program na výpočet odmocniny a vylepšíme našu kalkulačku.
Podmienky
Podmienky zapisujeme pomocou kľúčového slova if
, za ktorým
nasleduje logický výraz. Ak je výraz pravdivý, vykoná sa nasledujúci
príkaz. Ak nie, nasledujúci príkaz sa preskočí a pokračuje sa až pod
ním. Vyskúšajme si to:
{C_CONSOLE}
if (5 < 15)
printf("Pravda \n");
printf("Program tu pokracuje dal \n");
{/C_CONSOLE}
Výstup programu:
Konzolová aplikácia
Pravda
Program tu pokracuje dal
Ak podmienka platí (čo tu áno), vykoná sa príkaz Vyhlasujúca do konzoly text "Pravda". V oboch prípadoch program pokračuje ďalej. Súčasťou výrazu samozrejme môže byť aj premenná:
{C_CONSOLE}
int a;
printf("Zadaj nejake cislo \n");
scanf("%d", &a);
if (a > 5)
printf("Zadal si cislo vacsie nez 5! \n");
printf("Dekuji za zadani \n");
{/C_CONSOLE}
Ukážme si teraz relačné operátory, ktoré môžeme vo výrazoch používať:
operátor | C-Like zápis |
---|---|
rovnosť | == |
Je ostro väčšia | > |
Je ostro menšia | < |
Je väčšie alebo rovné | > = |
Je menšie alebo rovné | <= |
nerovnosť | ! = |
Všeobecná negácia | ! |
==
preto, aby sa to neplietlo s bežným
priradením do premennej, ktoré sa robí len jedným =
. Ak chceme
nejaký výraz znegovat, napíšeme ho do zátvorky a pred neho výkričník.
Keď budeme chcieť vykonať viac než len jeden príkaz, musíme príkazy
vložiť do bloku zo zložených zátvoriek:
#include <stdio.h>
#include <stdlib.h>
#include <math.h> // Nesmieme zabudnúť na include hlavičky math.h, obsahuje funkciu pre odmocninu
int main(int argc, char** argv) {
int a;
printf("Zadaj nejake číslo, z ktorého spočítajú odmocninu: \n");
scanf("%d", &a);
if (a > 0)
{
printf("Zadal si číslo väčšie ako 0, to znamena, ze ho môžem odmocniť!\n");
double o = sqrt(a);
printf("Odmocnina z cisla %d je %f \n", a, o);
}
printf("Dekuji za zadani \n");
return (EXIT_SUCCESS);
}
výstup:
Konzolová aplikácia
Zadaj nejake číslo, z ktorého spočítajú odmocninu:
144
Zadal si číslo väčšie ako 0, to znamena, ze ho môžem odmocniť!
Odmocnina z cisla 144 je 12.000000
Dekuji za zadani
Často môžete vidieť použitie bloku aj v prípade, že je pod podmienkou len jeden príkaz, mnohokrát je to totiž prehľadnejšie.
Program načíta od užívateľa číslo a ak je väčšia ako
0
, vypočíta z neho druhú odmocninu. Okrem iného sme použili
funkciu z knižnice math.h
, ktorá v sebe obsahuje rad
užitočných matematických funkcií, niekedy si ju bližšie predstavíme.
sqrt()
vracia hodnotu druhej odmocniny ako double
.
Bolo by pekné, keby nám program vyhubovala v prípade, že zadáme záporné
číslo. S doterajšími znalosťami by sme napísali niečo ako:
#include <stdio.h>
#include <stdlib.h>
#include <math.h> // Nesmieme zabudnúť na include hlavičky math.h, obsahuje funkciu pre odmocninu
int main(int argc, char** argv) {
int a;
printf("Zadaj nejake číslo, z ktorého spočítajú odmocninu: \n");
scanf("%d", &a);
if (a > 0)
{
printf("Zadal si číslo väčšie ako 0, to znamena, ze ho môžem odmocniť!\n");
double o = sqrt(a);
printf("Odmocnina z cisla %d je %f \n", a, o);
}
if (a <= 0)
printf("Odmocnina zo záporného cisla neexistuje \n");
printf("Dekuji za zadani \n");
return (EXIT_SUCCESS);
}
Všimnite si, že musíme pokryť aj prípad, kedy sa a == 0
,
nielen keď je menšia. Kód však môžeme výrazne zjednodušiť pomocou
kľúčového slova else
, ktoré vykoná nasledujúci príkaz alebo
blok príkazov v prípade, že sa podmienka nevykoná:
#include <stdio.h>
#include <stdlib.h>
#include <math.h> // Nesmieme zabudnúť na include hlavičky math.h, obsahuje funkciu pre odmocninu
int main(int argc, char** argv) {
int a;
printf("Zadaj nejake číslo, z ktorého spočítajú odmocninu: \n");
scanf("%d", &a);
if (a > 0)
{
printf("Zadal si číslo väčšie ako 0, to znamena, ze ho môžem odmocniť!\n");
double o = sqrt(a);
printf("Odmocnina z cisla %d je %f \n", a, o);
}
else
printf("Odmocnina zo záporného cisla neexistuje \n");
printf("Dekuji za zadani \n");
return (EXIT_SUCCESS);
}
Kód je oveľa prehľadnejšie a nemusíme vymýšľať opačnú podmienku,
čo by v prípade zloženej podmienky mohlo byť niekedy aj veľmi ťažké. V
prípade viac príkazov by bol za else
opäť blok
{ }
.
Kľúčové slovo else
sa tiež využíva v prípade, keď
potrebujeme v príkaze manipulovať s premennou z podmienky a nemôžeme sa na
ňu teda pýtať znova. Program si sám pamätá, že sa podmienka nesplnila a
prejde do sekcie else
. Ukážme si to na príklade: Majme číslo
a
, kde bude hodnota 0
alebo 1
a po nás
sa bude chcieť, aby sme hodnotu prehodili (ak tam je 0
, dáme tam
1
, ak 1
, dáme tam 0
). Naivne by sme
mohli kód napísať takto:
{C_CONSOLE}
int a = 0; // do a si priradíme na začiatku 0
if (a == 0) // ak je a 0, dáme do neho jedničku
a = 1;
if (a == 1) // ak je a 1, dáme doňho nulu
a = 0;
printf("%d", a);
{/C_CONSOLE}
Nefunguje to, že? Poďme si prejsť, čo bude program robiť. Na začiatku
máme v a
nulu, prvá podmienka sa určite splní a dosadí do
a
jedničku. No ale razom sa splní aj tá druhá. Čo s tým? Keď
podmienky otočíme, budeme mať ten istý problém s jednotkou. Ako z toho von?
Áno, použijeme else
.
{C_CONSOLE}
int a = 0; // do a si priradíme na začiatku 0
if (a == 0) // ak je a 0, dáme do neho jedničku
a = 1;
else // ak je a 1, dáme doňho nulu
a = 0;
printf("%d", a);
{/C_CONSOLE}
Podmienky je možné skladať a to pomocou dvoch základných operátorov:
operátor | C-Like zápis |
---|---|
A zároveň | && |
alebo | || |
{C_CONSOLE}
int a;
printf("Zadaj cislo v rozmedzi 10-20 \n");
scanf("%d", &a);
if ((a >= 10) && (a <= 20))
printf("Zadal si spravne \n");
else
printf("Zadal si spatne \n");
{/C_CONSOLE}
S tým si zatiaľ vystačíme, operátorov sa pomocou zátvoriek samozrejme dajú kombinovať.
{C_CONSOLE}
int a;
printf("Zadaj cislo v rozmedzi 10-20 alebo 30-40 \n");
scanf("%d", &a);
if (((a >= 10) && (a <= 20)) || ((a >=30) && (a <= 40)))
printf("Zadal si spravne \n");
else
printf("Zadal si spatne \n");
{/C_CONSOLE}
switch
Zápis viac podmienok pod sebou (relatívne) zjednodušuje konštrukcie
switch
. Spomeňme si na našu kalkulačku v prvých lekciách,
ktorá načítala 2 čísla a vypočítala všetky 4 operácie. Teraz si ale
budeme chcieť zvoliť, ktorú operáciu chceme. Bez switch
by sme
napísali kód podobný tomuto:
{C_CONSOLE}
double a;
double b;
int volba; // Mohli by sme použiť char, aby sme zbytočne nepoužívali veľa miesta
double vysledek = 0.0;
printf("Vitajte v kalkulačke \n");
printf("Zadajte prvni cislo: \n");
scanf("%lf", &a);
printf("Zadajte druhe cislo: \n");
scanf("%lf", &b);
printf("Zvoľte si operáciu: \n");
printf("1 - sčítanie \n");
printf("2 - odčítanie \n");
printf("3 - násobenie \n");
printf("4 - delenie \n");
scanf("%d", &volba);
if (volba == 1)
vysledek = a + b;
else if (volba == 2)
vysledek = a - b;
else if (volba == 3)
vysledek = a * b;
else if (volba == 4)
vysledek = a / b;
if ((volba > 0) && (volba < 5))
printf("Vysledok: %lf", vysledek);
else
printf("Neplatný voľba \n");
printf("\n");
printf("Dekuji za použitia kalkulačky");
{/C_CONSOLE}
výstup:
Konzolová aplikácia
Vitajte v kalkulačke
Zadajte prvni cislo:
3.14
Zadajte druhe cislo:
2.14
Zvoľte si operáciu:
1 - sčítanie
2 - odčítanie
3 - násobenie
4 - delenie
2
Vysledok: 1.000000
Dekuji za použitia kalkulačky
Všimnite si, že sme premennú vysledek
deklarovali na
začiatku, len tak do nej môžeme potom priraďovať. Keby sme ju deklarovali u
každého priradenie, Céčko by kód nezkompilovalo a vyvolalo by chybu.
Premenná môže byť deklarovaná (založená v pamäti) vždy iba raz.
Ďalšia vychytávka je kontrola správnosti voľby. Program by v tomto prípade
fungoval rovnako aj bez else
, ale načo sa ďalej pýtať, keď už
máme výsledok.
Teraz si skúsime napísať ten istý kód pomocou switch
:
{C_CONSOLE}
double a;
double b;
int volba; // Mohli by sme použiť char, aby sme zbytočne nepoužívali veľa miesta
double vysledek;
printf("Vitajte v kalkulačke \n");
printf("Zadajte prvni cislo: \n");
scanf("%lf", &a);
printf("Zadajte druhe cislo: \n");
scanf("%lf", &b);
printf("Zvoľte si operáciu: \n");
printf("1 - sčítanie \n");
printf("2 - odčítanie \n");
printf("3 - násobenie \n");
printf("4 - delenie \n");
scanf("%d", &volba);
switch(volba)
{
case 1:
vysledek = a + b;
break;
case 2:
vysledek = a - b;
break;
case 3:
vysledek = a * b;
break;
case 4:
vysledek = a / b;
break;
}
if ((volba > 0) && (volba < 5))
printf("Vysledok: %f", vysledek);
else
printf("Neplatný voľba \n");
printf("\n");
printf("Dekuji za použitia kalkulačky");
{/C_CONSOLE}
Vidíme, že kód je trochu prehľadnejšie. Ak by sme potrebovali v nejakej
vetve switch
spustiť viac príkazov, prekvapivo ich nebudeme
písať do bloku, ale rovno pod seba. Blok {}
nám tu nahrádza
príkaz break, ktorý spôsobí vyskočeniu z celého switch
.
Konštrukcia switch
môže namiesto case x:
obsahovať
ešte možnosť default:
, ktorá sa vykoná v prípade, že nebude
platiť žiadny case
. Je len na vás, či budete
switch
používať, všeobecne sa oplatí len pri väčšom
množstve príkazov a vždy ide nahradiť sekvencií if
a
else
. Nezabúdajte na príkazy break
, ak ho
neuvediete, program prepadne do ďalšej vetvy a to aj keď by nebola splnená
podmienka! V minulosti sa takéto prepadávaniu využívalo schválne, dnešný
IDE pred týmto použitím ale skôr už varujú. Keby ste s tým mali
problémy, použite sekvenciu if
- else
.
To by sme mali. V budúcej lekcii, Riešené úlohy k 4.-5. lekciu Céčka , nás čakajú polia a cykly. Tým dovŕšite základné znalosti, máte sa na čo tešiť:)
V nasledujúcom cvičení, Riešené úlohy k 4.-5. lekciu Céčka, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 319x (32.31 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C