Zpět na seznam článků     Číst komentáře (7)     Verze pro tisk

SooM-D 03) Programovani v jazyce C

Autor: Tecquilka   
2.9.2006

V tomto clanku jsou vysvetleny dalsi zpusoby vetveni programu. Nedostatky, ci nepresnosti prosim okomentujte v poznamkach, jelikoz clanek byl psan v casove tisni :D (myslim ze tam snad zadne nejsou :D)


Po hodne dlouhe odmlce jsem se konecne premluvil a zacal sepisovat pokracovani tohoto serialu. Doufam ze Vas tato odmlka prilis neodradila (uf, uz jsou to dva mesice :-/). Mou omluvou muze byt pouze ma lenost ve spojeni s nedostatkem casu (ze to k sobe moc nejde co?). No ale dost uz na toto tema a ted zpet k samotnemu clanku.

V prvni rade chci vyhlasit viteze o nejzajimavejsi kod z uloh. Jednalo se o kalkulacku od FreeZe, jeho kod byl zajimavy a prehledny. Neni co vic dodat, proste me jeho kod zaujal (subjektivni nazor) ... jinak chci take pochvalit uzivatele Wasekk a Efex.
V Dalsi rade uvedu to, co bych chtel dnes probrat, jedna se o pokrocile vetveni pomoci prikazu "switch" a pomoci ternarniho (nebijte me, ja ten vyraz nevymyslel :D) operatoru "?:". Take si vysvetlime pojem funkce a procedura, uvedu zde i neco malo ke skokum.
Naplanovaneho toho je dost, proto radsi prejdu k samotne latce :D


[Pokrocile vetveni]:
switch:
Jiz podle nazvu lze pochopit k cemu tento "prepinac" asi muze slouzit. Samozrejme ze slouzi k vetveni programu, ale na rozdil od if se hodi k zapisu nekolikanasobneho vetveni. V tomto if trosinku zaostava a to z hlediska prehlednosti (prosim zadny flame na toto tema). Vyhodu demonstruji prave ve srovnani prikazu switch a prikazu if.
If se hodi k jednoduchemu vetveni, radove do tri vetvi behu. Samozrejme je mozne rozepsat i deset ruznych vetvi behu, ale kod pak ztraci citelnost. K takto rozsahlemu vetveni se lepe hodi switch. Zde je jeho syntaxe:
switch(promenna)
{
case 'hodnota1' : telo1;
break;
case 'hodnota2' : telo2;
break;
default : telo_default;
};

Ted samotne vysvetleni, na misto s oznacenim "promenna" dosadite promennou, kterou chcete porovnavat (switch slouzi k porovnani obsahu promenne). Za cast nesouci oznaceni case vlozite na pozici oznacenou "hodnota" Vas znak, ktery chcete porovnavat. Default je obdoba else u if, tzn. kdyz nebude platit ani jedna shoda se znaky uvedenymi za casti case, provede se telo uvedene v casti za default. Tim se dostavam k onomu telu, v pripade ze plati podminka (znak uvedeny za case se shoduje se znakem obsazenym v promenne) se zacne provadet "telo". Muzete pouzivat k ohraniceni zavorky, ale neni to nutne, jelikoz za telo se povazuje cast od jednoho case k druhemu.
#include < stdio.h >
int main()
{
char znak;
printf("Zadej A ci B ci C:");
scanf("%c",&znak);
switch(znak)
{
/* Ukazka se bez zavorek */
case 'A':
printf("A (vypis 1. radek)");
printf("A (vypis 2. radek)");
break;
/* Ukazka se zavorkami */
case 'B':
{
printf("B (vypis 1. radek)");
printf("B (vypis 2. radek)");
break;
}
default:printf("ZADAL JSI JINE CISLO");
};
return 0;
}

Jak vidite, zapis je ciste Vasim rozhodnutim. BTW nezapominejte ze C je case-sensitive, tzn. ze rozlisuje velikosti pismen, takze "A" je jiny znak jako "a".
Urcite Vas zarazi proc uzivam stale break, je to pro to, ze break slouzi k preruseni behu celeho cyklu. Nejlepe bude, kdyz si zkusite zapsat tento program s tim, ze neuzijete break, rozdil uvidite sami (vypisi se vsechny hlasky, bez ohledu na zadany znak).

Zde je onen slibeny rozdil mezi uzitim if-else if-else a switch():
. . .
if(znak == 0)
{
printf("Nula\n");
}
else if(znak == 1)
{
printf("Jedna\n");
}
else if(znak == 2)
{
printf("Dve\n");
}
else
{
printf("Jine cislo\n");
}
. . .

oproti tomuto zapisu:
. . .
switch(znak)
{
case 0 : printf("Nula\n");
break;
case 1 : printf("Jedna\n");
break;
case 2 : printf("Dve\n");
break;
default : printf("Jine\n");
};
. . .

Co se Vam zda elegantnejsi a prehlednejsi, to uz je jen na Vasem rozhodnuti.


podminka?telo1:telo2;
Jedna se o ternarni operator, pomoci ktereho muzete stanovovat jednoduche podminky. Osobne Vam doporucuji neuzivejte k slozitejsimu vetveni, jelikoz kod pak straci na citelnosti (vec nazoru :-D). Tento operator uzivejte pri prirazeni, jelikoz vraci hodnotu dle podminky ("nej = a>b?a:b;"); Nenapada me nic vic, co bych k tomuto mohl dodat, proto uvedu jiz samotnou syntaxi na prikladu:
prom_a > prom_b ? printf("Prom_a je vetsi\n") : printf("Prom_b je vetsi nebo rovna\n");

V prvni casti je uvedena podminka a pokud je splnena provede se leva strana, jinak strana prava (za znakem ? jsou mozne tela/vetve programu).
Vydel jsem i nekolika nasobne vetveni provedene prave timto operatorem, ale v prehlednosti je to des. Chvilinku pak trva nez se clovek zorientuje ... sami posudte:
. . .
int a=5,b=2,c=4;
printf("Nejvetsi cislo je:%d\n" a>b?(a>c?a:c):(b>c?b:c) );
. . .

Hezky zapis co? Usetri mista, ale pro zacatecniky trosku hure citelne ...


[Skoky]:
Trosku zamysleni: "K cemu muze asi skok slouzit?" Nekteri, kteri jiz k programovani "pricichli" urcite slyseli. Muze se Vam stat, ze budete nutne potrebovat preskocit cast programu a reseni pomoci vetveni by bylo neprehledne a slozite. K tomuto slouzi goto. Nevyhody a duvody proc nepouzivat jsou sporem mnoha programatoru, na jedne strane doporucuji uzivat snad vsude, kde je mozne, pak tu jsou lide, kteri razi nazor stridmeho uzivani a na strane opacne jsou lide, kteri uplne skoky odmitaji. Nazor je jen na Vas. Zde je syntaxe:

. . .
if( a>b )
{
goto navesti;
}
printf("Nevytiskne se, v pripade ze je a vetsi jak b, jelikoz je preskocena tato cast\n");
navesti:
printf("Za navestim a dalsi telo programu\n");
. . .



Zaver:
Toto by bylo pro dnesni lekci vse, puvodne jsem mel v planu pripojit jeste praci se soubory, ale to necham na dalsi dil :D, jelikoz myslim ze tento dil je i tak dost obsahly (hlavne kody :P). Tim padem vite o cem bude dalsi dil. A at mate i vy nejake vyziti, zadavam Vam ukol.


[Ukol]:
Vytvorte tri promenne datoveho typu integer, uzivatel at zada hodnoty. Posleze pomoci ternarniho operatoru ?: zjisti nejvetsi z techto cisel a vypis jej. Doufam ze se nudit nebudete (Btw je to proti me rade o nemichani ternarnich operatoru)

Líbil se Vám článek?
Budeme potěšeni, pokud vás zaujme také reklamní nabídka

Social Bookmarking

     





Hodnocení/Hlasovalo: 0/0

1  2  3  4  5    
(známkování jako ve škole)