2. seminář - Větvení programu

TEACHINGZPC1

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