Michal Čižmár / 02. 03. 2004, 00:00
Veľmi často potrebujeme aby sa určitá časť programu vykonala, až keď sú splnené viaceré podmienky. V článku nájdete aj dva ďaľšie diely seriálu - Ďalšie príkazy vetvenia a Ternárny operátor.
Takže príklad 4 ) z predchádzajúcej časti.
if (a==5)
{
if (b==7) printf(" Nastala zhoda\n");
}
testuje až dve podmienky. Môžeme ho preložiť takto : Vypíš text „nastala zhoda“ ak premenná (a==5) a súčasne (b==7) . V programovacom jazyku C môžeme text „a súčasne“ nahradiť symbolom && . Príklad 4 môžeme teda napísať takto :
Príklad 7)
int a=5, b=7;
if ( (a==5) && ( b==7) ) printf(" Nastala zhoda\n");
Niekedy nám stačí ak je splnená aspoň jedna podmienka( v našom prípade jedna alebo obidve ) . Ide o logický výraz „alebo“ . Vtedy by bol príklad takto:
Príklad 8)
int a=5, b=65;
if ( (a==5) || ( b==7) ) printf(" Bola splnena aspon jedna podmienka \n");
else printf(" Nebola splnena ani jedna podmienka \n");
Symbol vertikálnej čiary( je nakreslená s prerušením v strede) sa nachádza určite na anglickej klávesnici, možno ste o tom doteraz ani nevedeli. :-)
!!! Poznámka !!!
Logické výrazy zo zdvojenými symbolmi & a | sa vyhodnocujú skrátene. To znamená ak máme napríklad výraz:
if ( (a==5) && (b==7) && ( c==8) && (d==9) )
a premenná a sa nerovná číslu 5 , tak vyhodnocovanie hneď skončí a tak sa vyhodnocovanie urýchľuje.
Nasleduje „trochu“ nelogicky príklad, ale účel splní.
Príklad 9.)
#include
#include
int main()
{
int c1=5,c2=0;
if ( ((c1%2)==0) && ((c1/c2)!=2) ) printf("podmienka splnena\n");
else printf("podmienka nie je splnena\n");
getch();
}
V tom to prípade nenastane chyba delenia nulou ( c2=0 ) , v druhej časti výrazu, pretože prvá podmienka nie je splnená a tak sa ďalej nič nevyhodnocuje.
Samozrejme, že sú možné kombinácie operátorov && a || . Vtedy treba dávať pozor na zátvorky pretože tie majú najvyššiu prioritu.
Príklad 10.)
if ( (a==5) || ( (b==8) && (c==10) && (d!=9) ) ) printf(“ Ahoj\n”);
Ide o umelý príklad a slúži len ilustračne, akoby by mohla vyzerať nejaká zložená podmienka.
!!RADA!!
Veľa podmienok za sebou zneprehladňuje čitateľnosť zdrojového textu. Vtedy je vhodné rozumne rozdeliť výraz na viac podmienok.
Programujeme v jazyku C (piaty diel / 3) - Ďalšie príkazy vetvenia
Často potrebujeme vyhodnotiť viacero podmienok za sebou a podľa toho určiť nasledujúcu činnosť programu.
Príklad 11.) – nefunkčný ale názorný
#include
#include
int main()
{
int volba;
char *meno="test.txt";
printf("----Menu---\n");
printf(" Uloz [1]\n");
printf(" Otvor [2]\n");
printf(" Nove [3]\n");
printf(" Koniec [4]\n");
printf(" Zadajte vasu volbu 1..4 : ");
scanf("%d",&volba);
if (volba==1) ulozit_subor(meno);
if (volba==2) otvorit_subor(meno);
if (volba==3) novy_subor();
if (volba==4) ukoncit();
/* tu by sme este osetrili chybu ak by sa nesplnila ani jedna podmienka */
}
A tých podmienok býva často oveľa viacej. Vtedy je prehľadnejšie použiť
PRÍKAZ SWITCH.
Takže IF-y v predchádzajúcom príklade nahradíme takto :
Príklad 12.)
switch(volba)
{
case 1 : ulozit_subor(meno);
case 2 : otvorit_subor(meno);
case 3 : novy_subor();
case 4 : ukoncit();
default : chyba() ;
}
To čo je za default sa vykoná automaticky ak nebola splnená žiadna podmienka alebo ak sme nepoužili PRÍKAZ BREAK.
V predchádzajúcom príklade, ak by premenná voľba bola rovná 1 , tak sa vykoná funkcia ulozit_subor() , ale potom by sa vykonávanie vrátilo do tela switch (ak by sa program neukončoval vo vnútri funkcii ) a testovali by sa všetky ďalšie možnosti, až nakoniec by sa spustila funkcia chyba() za možnosťou default.
Aby sme tomu zabránili , použijeme break .
Príklad 13.)
switch(volba)
{
case 1 : ulozit_subor(meno); break;
case 2 : otvorit_subor(meno); break;
case 3 : novy_subor(); break;
case 4 : ukoncit(); break;
default : chyba() break;
}
POZOR!!! Aj keď za sebou nasledujú dva príkazy : volanie funkcie a break , nemusíme ich v tomto jedinom prípade dávať do zložených zátvoriek, ale ak chceme tak môžeme.
Ak potrebujeme aby sa určitý, jeden príkaz vykonal po splnení viacerých podmienok, príkaz switch bude takýto :
Príklad 14.)
switch(volba)
{
case 1 :
case 2 :
case 3 : vyhodnot_volbu(volba); break ;
case 4 : ukoncit(); break;
default : chyba(); break ;
}
Tu sa funkcia vyhodnot_volbu() vykoná ak volba=1,2 alebo 3 .
Ak ste dobre pochopili príkaz switch , tak teraz určite namietate , že break nie je potrebný za časťou default a máte pravdu. Zvykne sa tam ale dávať kvôli prehľadnosti, ale to je otázka zvyku.
Programujeme v jazyku C (piaty diel / 4) - Ternárny operátor
Je to veľmi zaujímavá konštrukcia a dá sa nahradiť príkazmi if-else , ale v niektorých prípadoch môže sprehľadniť text.
Vysvetľovať veľa netreba, všetko pochopíte hneď na príklade. Ide o kratučký program s jednou funkciou ( teda okrem main() ) .
#include
#include
int max(int c1, int c2)
{
int vysledok;
vysledok = (( c1>c2) ? c1 : c2) ; /* pouzite ternarneho operatora */
return vysledok;
}
int main()
{
int cislo1,cislo2;
printf(" Zadajte prve cislo : ");
scanf("%d",&cislo1);
printf(" Zadajte druhe cislo : ");
scanf("%d",&cislo2);
printf("Hodnota vecsieho cisla je %d",max(cislo1,cislo2) );
getch();
}
Tak ako by sme vysledok = (( c1>c2) ? c1 : c2) ; preložili do slovenčiny ?
Porovnaj čísla c1, c2 a ak je podmienka splnená , teda c1>c2 , tak výsledkom je c1 a jeho hodnota sa uloží do premennej vysledok.
Funkciu max by sme mohli dokonca skrátit len na jeden riadok a skrátiť jej čas vykonávanie tým, že sa nealokuje premenná vysledok takto:
int max(int c1, int c2)
{
return (( c1>c2) ? c1 : c2) ; /* pouzite ternarneho operatora */
}
Ukážeme si ešte jedno použite ternárneho operátora :
#include
#include
void vypis(void)
{
printf(" Vypisujem \n");
/* vypisuje napr. priebezne informacie */
}
/*-------------------------------------------------------------------*/
void koniec(void)
{
printf(" Koniec \n");
}
/*---------------------------------------------------------------------*/
int main()
{
int krokov=5; /* rucne zmente hodnotu aby ste videli
ako funguje ternarny operator */
(krokov==5) ? vypis() : koniec() ;
getch();
return 0;
}
Tento príklad je len ilustračný a určite by bolo lepšie použiť konštrukciu IF-ELSE, takýto spôsob sa skôr používa na vrátenie pointra na funkciu ,ale tým sa nemusíte trápiť. K tomu čo je to pointer na funkciu sa dostaneme oveľa, oveľa neskôr a určite budete môcť bez toho kľudne spávať :-)
Musím sa tu priznať, že ternárny operátor využívam veľmi málo, takmer vôbec . Ak nájdete nejaké jeho vynikajúce použite tak mi určite napíšte.
Ak ste sa dostali až sem, znamená to že písanie tohto seriálu nie je zabitý čas a uvítal by som Vašu konštruktívnu kritiku, aby som mohol stále zvyšovať kvalitu seriálu o zaujímavom programovacom jazyku C.
See You
micitn@orangemail.sk
Copyright © 2002 - 2013 inet.sk, s. r. o. | Všetky práva vyhradené | Neprešlo jazykovou úpravou | ISSN 1336-1899
Využívame kvalitný webhosting za rozumnú cenu od Inet.sk