csharp.aspone.cz csharp.aspone.cz

Cyklus while

Cyklus tvoříme takto:

while (podmínka) 
{ 
    příkazy; 
}

cyklus while - program nejprve vyhodnotí podmínku - zjistí, zda je splněna. Pokud není podmínka splněna, cyklus while skončí. To znamená, že příkazy, uzavřené mezi složenými závorkami (nazývané tělo cyklu) se přeskočí a program bude pokračovat příkazem, který je za nimi.

Je-li podmínka splněna, provedou se příkazy uzavřené mezi složenými závorkami. Pak se znovu vyhodnotí podmínka, a není-li splněna, příkaz while skončí. Podmínka v jazyku C# představuje hodnotu bool, který slouží k ukládání logických hodnot. Hodnota pravda se vyjadřuje slovem true a hodnota nepravde slovem false.

Výpočet faktoriálu, cyklus while

V tomto příkladě počítáme faktoríál, ale hodnotu výpočtu faktoriálu musíme měnit ručně v kódu. Takže jsme vytvořili statickou metodu f, která vrací hodnotu int a vstupem je také int.
Dále je zde pomocná proměnná s inicializovaná na 1. Dálej jsme použili cyklus while, který se bude opakovat, dokavaď bude proměnná n větší než 1. A dál vždy po provedení se zmenší proměnná n o číslo 1 až do té doby dokud nebude nebo rovno 1. Ještě jsem sem přidal výpis proměnné s, abych viděl jak se bude podmínka opakovat. Metoda f vrací hodnotu s. V metodě Main již vypíšem daný faktoriál voláním metody f() se vstupní hodnotou 5.

using System;

class vypocetFaktorialu
{
    static int f(int n)
    {
        // pomocná proměnná obsahuje výsledek
        int s = 1; 
 
        while (n > 1)
        {
            // dá se přepsat i takto s *= n--; použijeme postfixovou inkrementaci a tím to zmenšíme o jedničku
            s *= n;
            n -= 1; 
            Console.WriteLine(s);
        }
    return s;
    }
    
    static void Main()
    {
      Console.WriteLine("Výpočet je: {0}", f(5));
    }
}

Výpočet faktoriálu, cyklus while a podmínka if

Tento příklad je podobný tomu předchozímu. Rozdíl je v tom, že si můžem sami zadat v konzoli hodnotu, kterou chceme vypočítat. Takže první metoda volamKlavesnici nám načte řetězec a uložího do string. V další metodě prevadimNaLong převedu řetězec na typ long. Další metodou je vypocet, zde proběhne výpočet podobně jako v předchozím příkladě. Rozdíl je v metodě Main, zde jsme přiřadili k proměnné k návratovou hodnotu z metody prevadimNaLong. Dále jsme použili podmínky if a else. Když bude hodnota větší nebo rovna nule, vypíše se hodnota na terminál voláním metody vypocet. Pokud bude hodnota jiná, záporná vypíše program podmínku else, respektive, že jsme zadali zápornou hodnotu.

using System;

class vypocetFaktorialu2
{
    static long vypocet(long n)
    {
        // pomocná proměnná obsahuje výsledek
        long s = 1; 

        while (n > 1)
        {
            s *= n;
            n -= 1;
        }
        return s;
    }
 
    static void Main()
    {
        Console.WriteLine("Zadete celé nezáporné číslo: ");

        long k = long.Parse(Console.ReadLine());

        if (k >= 0)
        {
            Console.WriteLine("Hodnota faktorialu cisla {0} je: {1}", k, vypocet(k));
        }
        else
        {
            Console.WriteLine("Zadali jste zápornou hodnotu {0} a pro tu není faktoriál definován.", k);
        }
    }
}

I když takto upravený program funguje a v případě zadání záporného čísla vypíše místo výsledku upozornění, není použitý postup dobrý.
Pokud bychom totiž chtěli metodu vypocet používat v programu na více místech, museli bychom mít na paměti, že pro záporná čísla nefunguje program správně. Je rozumné upravit metodu tak, aby nevracela nesmyslné hodnoty.

Šlo by tedy upravit program tak, že by program vracel hodnotu, která signalizuje chybu. Můžeme upravit program takto:

V dalším příkladě jsme tedy zamezili tomu, aby nám program při záporných hodnotách v metodě vypocteno ukazoval výpočet záporných číslic, to by bylo katastrofální, takovej zápornej faktoriál rostoucí geometrickou řadou kdo si to jen dokáže představit? No prostě se stalo a dali jsme přímo před cyklus podmínku, jestliže je splněna (zde podmiňuju zápornou hodnotu), je vrácena nula.
Pořád to není to pravý ořechový. Co s tím no prostě nula a co jako? No ještě že nás C# může zachránit.

using System;

class vypocetFaktorialu3
{
    static long vypocteno(long n)
    {
        long s = 1;
        if (n < 0) return 0;
        
        while (n > 1)
        {
            s *= n;
            n -= 1;
        }
        return s;
    }

    static void Main()
    {
        Console.WriteLine("Zadejte celé nezáporné číslo, pro nějž chcete spočítat faktoriál: ");
        long k = long.Parse(Console.ReadLine());

        Console.WriteLine("Hodnota je : {0}", vypocteno(k));
    }
}

Výpočet faktoriálu s použitím výjimky

V předchozím příkladě nám program vracel nulu. Ale to budeme muset zase kontrolovat, zda program nevrátil nulu. Tento problém se však dá vyřešit ji jiným způsobem a to za použití výjimky ??What the hell??.
Výjimkou je chyba, kterou nedokáže daná metoda zvládnout. Může být špatně zadaná hodnota, či cokoliv jiného. Vyvolá se tedy výjimka, to znamená, že se vytvoří speciální objekt, který ponese informace o této chybě, a pak způsobí, že program přestane provádět příkazy v této metodě a bude hledat kód, který výjimku ošetří - tzv. handler. Pokud jej nenajde, program vypíše chybové hlášení a předčasně skončí. Je to jako u lékaře, když budete mít tuberu(tj. výjimka nežádoucí stav) a lékař(program) bude hledat handler (vakcínu). Když ji nenajde, tak člověk předčasně skončí. K vyvolání výjimky slouží příkaz throw. ve tvaru throw new System.Exception(zpráva); System.Exception je třída objektu, který ponese informace o výjimce. To znamená, že identifikátor System můžeme vynechat, použijeme-li předtím příkaz using System;

V tomto případě je špatně zadaná záporná hodnota ošetřena výjimkou a program bude ukončen. Pro zviditělnění zprávy jsem použil párek smajlíků a zvukouvou výstrahu.

using System;

class vypocetFaktorialuUzAniNevimPoKolikate
{
    static long pocitadlo(long n)
    {
        if (n < 0)
        {
            throw new Exception("Záporná hodnota faktoriálu a ten pak nelze vypočítat.");
        }
        
        long p = 1;

        while (n > 1)
        {
            p *= n;
            n--;
        }
        return p;
    }

    static void Main()
    {
        Console.WriteLine("Zadejte celé nezáporné číslo, pro kvýpočet faktoriálu:");
        long k = long.Parse(Console.ReadLine());
        Console.WriteLine("Hodnota faktoriálu čísla {0} je {1}", k, pocitadlo(k));
    }
}