Větvení programu
Dosud jsme psali programy, kde program vyhodnocoval vždy stejné instrukce. Co kdybychom chtěli, aby program z minulého semináře
převedl velké písmeno na malé a malé písmeno na velké? Potřebujeme tedy konstrukci která nám umožni vykonat množinu příkazů pokud uživatel zadá
malé písmeno a jiné příkazy pokud uživatel zadá velké písmeno. K tomu nám poslouží kontrukce if
, jejichž syntax je následujícící:
if (podminka) {
// Kód který vykoná pouze pokud je podmínka pravdivá.
}
if (podminka) {
// Kód který vykoná pouze pokud je podmínka pravdivá.
} else {
// Kód který se vykoná pouze pokud je podmínka nepravdivá
}
if (podminka1) {
// Kód
} else if (podminka2) {
// Kód
} else {
// Kód
}
// Vnorene podminky
if (podminka1) {
if (podminka2) {
// Kod
}
}
// Pro lepší přehlednost kódu doporučuji používat složené závorky.
Jak tedy vytvoříme podmínku která bude pravdivá pouze pokud zadaný znak je velké písmeno?
#include <stdio.h>
int main() {
char znak;
scanf("%c", &znak);
if (znak >= 'A' && znak <= 'Z') {
// Kód
}
return 0;
}
V kódu se nachází několik kontrukcí které nám ještě nejsou známy. Jako první v kódu máme porovnání >=
a <=
.
Jedná se oparátory porovnání "větší rovno" a "menší rovno". Další operátory jsou: <
, <=
, >
,
>=
, ==
, !=
, kde význam většiny je jasný až na !=
který značí nerovnost.
Dalším pro nás neznamým operátorem je &&
. Jedná se o logický operátor a (and). Jinak řečeno pokud máme podmínku x && y,
tak podmínka je pravdivá pouze pokud je pravdivé x i y. Dalšími logickými operátory jsou: ||
(nebo), !
(negace).
Uvažujme následující kód:
if(x == 1) {
printf("x je jedna");
} else if (x == 2) {
printf("x je dva");
} else if (x == 3) {
printf("x je tri")
} else {
printf("x neni 1,2 nebo 3");
}
Výše uvedený kód není příliš čitelný. Pro takové případy, kdy chceme vykonat část kódu na základě celočíselné hodnoty, mamá v jazyce C konstrukci switch
.
switch (x){
case 1:
printf("x je jedna");
break; // <- Na konci každého case je nutné vloit příkaz break. Jinak by došlo k vyhodnocení i dalšího case.
case 2:
printf("x je dva");
break;
case 3:
printf("x je tri");
break;
default:
printf("x neni 1,2 nebo 3"); }
Pro jednouchá větvení lze použít tzv. ternární operátor ?:
. Jeho syntaxe je následující:
podminka ? vyraz1 : vyraz2
Pokud je podminka
pravdivá, je výsledkem hodnota, kterou obdržíme vyhodnocením vyraz1
, v opačném případě
je výsledkem hodnota, kterou obdržíme vyhodnocením vyraz2
.
// Nasledujici kodz vedou ke stejne hodnote x
if (a < b) {
x = a;
} else {
x = b;
}
x = (a < b) ? a : b;
Úkoly
Napište program, který mezi 3 čísly najde to nejmenší a vypíše je.
Napište program, který rozhodne, zdali je daný rok přestupný. Rok je přestupný, pokud je dělitelný 4. Pokud je ovšem dělitelný 100, musí být také dělitelný 400.
Napište program, který rozhodne o známce na základě počtu bodů získaných v testu. Známkování je dáno následující tabulkou
Body Známka
90-100 A
80-89 B
76-79 C
71-75 D
60-70 E
0-59 F
Napište v jazyku C program, který pro zadaný znak slovy vypíše, o jaký znak se jedná. Pro malá písmena vypíše program text "male pismeno" a daný znak, pro velká písmena vypíše text "velke pismeno" a daný znak, pro číslice vypíše "cislice" a daný znak. Dále pro znaky "!", "?", "*", "@", "#", "^" vypíše odpovídající text: "vykricnik", "otaznik", "hvezdicka", "zavinac", "krizek", "striska". Pokud se jedná o jiný než výše uvedený znak, vypíše program text "jiny znak".
Příklad výstupu:
Zadejte znak: c
Zadany znak je: male pismeno c
Napište v jazyku C program, který po zadání mzdy vypočítá a na obrazovku vypíše výši odpovídající daně. Pro účel této úlohy uvažujme progresivní zdanění ve výši 10 % pro příjem do 10000, 20 % pro příjem od 10000 do 20000 a 30 % pro příjem nad 20000. Například, pokud máme hrubou mzdu 24000, bude se prvních 10000 danit 10 % (tj. daň z této části mzdy je 1000), dalších 10000 se daní 20 % (daň z této části je 2000) a zbývající 4000 se daní 30 % (daň je 1200). Celkovou výši daně pak vypočítáme jako součet jednotlivých "částečných" daní (tj. celková daň 4200).
Příklad výstupu:
Zadejte mzdu: 12000
Odpovidajici dan je: 1400
Zadejte mzdu: 33353
Odpovidajici dan je: 7005.9