dum | žák

Programování C#

Název školy Vyšší odborná škola obalové techniky a Střední škola, Štětí, příspěvková organizace
Adresa školky Kostelní 134, 411 08 Štětí
46773509
Název operačního programu OP Vzdělávání pro konkurenceschopnost
Registrační číslo CZ.1.07/1.5.00/34.1006
Označení vzdělávacího materiálu VY_32_INOVACE_23_PRG_452
Název tématické oblasti (sady) Programování
Název materiálu Co když
Anotace Text uvádí řídící konstrukci if-else. Na pseudo vývojovém diagramu demonstruje větvení kódu. Zavádí operátory porovnání, které bývají součástí výrazů v podmínkách. Předkládá cvičení na pravdivostní hodnoty true a false. Nakonec předkládá příklady zápisu řídící konstrukce v základní podobě a následně rozšířené o bloky else-if-else.
Autor Ivan Pomykacz Jazyk čeština
Očekávaný výstup Chápe význam hodnot true a false při vyhodnocování výrazů. Sestavuje jednoduché podmínky pro ovlivnění způsobu vykonávání kódu. Ovlivňuje, který kód se dle vyhodnocení výrazu vykoná a který ne.
Klíčová slova podmínka, výraz, větvení kódu
Druh výukového zdroje Výklad Věková skupina žáků 15+
Typ interakce aktivita Ročník 1.
Speciální vzdělávací potřeby žádné
Zhotoveno, (datum/období) 04.10.2013 Celková velikost

pdf icon
Co když

Obsah

Shrnutí

Řídící konstrukce umožňují usměrňovat tok kódu, tj. vykonávání některých příkazů a jiné třeba přeskočit (vynechat). Jsou to právě tyto konstrukce, díky kterým můžeme tvořit různé algoritmy a výsledné programy pak skutečně něco "dělají".

Operátory porovnání

Používají se v podmínkách při testování nějakého stavu, např. je-li něco rovno něčemu jinému a nebo je-li něčeho více, atp.

Patrně je znáte už z matematiky, ale přeci jen pro úplnost toho, jak vypadají v jazyke C#.

  • == .. rovná se

  • != .. je různý od (nerovná se)

  • > .. je větší

  • >= .. je větší nebo rovno

  • < .. je menší

  • <= .. je menší nebo rovno

Pravda nepravda

  • Pokuste se přiřadit hodnotu True nebo False na základě následujících výrazů:

    bool bool1;
    bool bool2;
    bool bool3;
    bool bool4;
    bool bool5;
     
    // 17 < 18/100
    bool1 =
     
    // 100 == 33 * 3 + 1
    bool2 =
     
    // 19 <= Math.Pow(2,4)
    bool3 =
     
    // -22 >= -18
    bool4 =
     
    // 99 != 98 + 1
    bool5 =
     
    Console.WriteLine(bool1);
    Console.WriteLine(bool2);
    Console.WriteLine(bool3);
    Console.WriteLine(bool4);
    Console.WriteLine(bool5);
     
  • Pokuste se zjistit hodnotu True nebo False na základě poněkud složitějších výrazů:

    bool bool1;
    bool bool2;
    bool bool3;
    bool bool4;
    bool bool5;
     
    // 20 + -10 * 2 > 10 / 3 / 2
    bool1 =
     
    // Math.Pow(10 + 17, 2) == Math.Pow(3,6)
    bool2 =
     
    // Math.Pow(1,Math.Pow(2,3)) <= -(-(-1))
    bool3 =
     
    // 40 / 20 * 4 >= Math.Pow(-4,2)
    bool4 =
     
    // Math.Pow(100,0.5) != 6 + 4
    bool5 =
     
    Console.WriteLine(bool1);
    Console.WriteLine(bool2);
    Console.WriteLine(bool3);
    Console.WriteLine(bool4);
    Console.WriteLine(bool5);
     

Příklad

Cvičení výše bylo na pochopení stavů Pravda, Nepravda, a toho, že není nic mezi tím. Pokračujme praktičtějším příkladem.

Od uživatele si necháme z klávesnice zadat číslo. A následně rozhodneme, zda-li toto číslo je kladné nebo záporné, případně rovno 0.

int x;
 
Console.Write("Zadej celé číslo: ");
x = int.Parse(Console.ReadLine());
 
if (x > 0) {
    Console.WriteLine("Číslo je kladné");
}
 
if (x < 0) {
    Console.WriteLine("Číslo je záporné");
}
 
if (x == 0) {
    Console.WriteLine("Číslo je nula");
}
 

Konstrukce if

Konstrukt if začíná právě slovem if () společně s kulatými závorkami, do kterých se zapisuje výraz, jenž se bude vyhodnocovat.

if (vyraz) {
    // příkazy, které se mají provést, je-li výsledek výrazu true (pravda)
}

Ihned za kulatými závorkami následují složené závorky { a }, které ohraničují příkazy, které se vykonají pouze tehdy, je-li výraz v kulatých závorkách vyhodnocen jak true (a je to tedy typ bool).

Výrazem tedy může být téměř cokoli, co vrátí typ bool (tedy true, false):

  • proměnná typu bool;

  • metoda, která vrací typ bool;

  • výraz, jehož součástí je alespoň jeden z operátorů porovnání (viz výše);

  • jeden z booleanovských operátorů (and - &&, or ||);

Konstrukce if-else

Konstrukt lze ještě rozšířit o blok else. Stojí v podstatě v opozici proti tvrzení if.

if (vyraz) {
    Console.Write("Výsledek výrazu je true");
}
else {
    Console.Write("Výsledek výrazu je false");
}

Blok else může být jen jeden a vždy na konci. Proč? No, buď je výraz pravdivý, a pak se vykonají příkazy uvnitř bloku if, a nebo pravdivý není, nic mezi tím není.

Muž a žena

Mějme program, který vyhodnocuje zadané údaje, konkrétně, zda-li uživatel vyplnil správně informaci o tom, zda-li je "muž" nebo "žena".

Pokud souhlasíte, tak existují pouze tyto dva stavy: je-li uživatel muž, nemůže být žena a obráceně, je-li uživatel žena, nemůže být muž.

Potom, mějme proměnnou volba, do které budeme ukládat uživatelovu odpověď, tedy to, co napíše na klávesnici. A podle výše domluveného, platí-li výraz volba == "muž", pak jde o muže. Jelikož další jediná možná odpověď je "žena", můžeme kód zapsat např. takto:

string volba;
 
Console.Write("Jsi muž nebo žena? Odpověz \"muž\" nebo \"žena\": ");
volba = Console.ReadLine();
 
if (volba == "muž") {
    Console.WriteLine("Eviduji muže.");
}
else {
    Console.WriteLine("Eviduji ženu.");
}
 

Všimněte si, že testujeme pouze to, zda-li proměnná obsahuje řetězec "muž". Pokud výraz není pravda, tzn. proměnná obsahuje jiný řetězec, uživatel bude automaticky vyhodnocen jako "žena". Vyzkoušíte-li výše uvedený kód, tak zjistíte, že pokud například napíšete do odpovědi třeba jen "Muž" s velkým počátečním písmenem, dojde ke konstatování "Eviduji ženu".

Jak z toho ven? Mohli bychom blok else vynechat a napsat další if pro detekci řetězce volba == "žena".

if (volba == "muž") {
    Console.WriteLine("Eviduji muže.");
}
 
if (volba == "žena") {
    Console.WriteLine("Eviduji ženu.");
}

A tím jsme ošetřili chybné vyhodnocení muže a ženy.

Ale co se teď stane se všemi chybnými odpověďmi? Tedy s takovými odpověďmi, které obsahují překlepy nebo schválně nesmyslná slova?

Program by měl být schopen tyto vstupy rozpoznat a adekvátně na ně zareagovat, aby se uživatel dozvěděl, zda-li to, co zadal, je OK.

V takových případech se hodí provést tzv. zřetězení bloků if do jednoho mega bloku.

string volba;
 
Console.Write("Jsi muž nebo žena? Odpověz \"muž\" nebo \"žena\": ");
volba = Console.ReadLine();
 
if (volba == "muž") {
    Console.WriteLine("Eviduji muže.");
}
else if (volba == "žena") {
    Console.WriteLine("Eviduji ženu.");
}
else {
    Console.WriteLine("Chyba zadání.");
}
 

Všimněte si, že uvedená konstrukce obsahuje dvakrát slovo else, ale poprvé na else navazuje if.

Jak se to pak celé chová?

  • Jestliže [if] volba == "muž", vypiš "Eviduji muže",

  • jinak jestliže [else if] volba == "žena", vypiš "Eviduji ženu",

  • jinak [else] vypiš "Chyba zadání".