IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

7. diel - Ošetrenie užívateľských vstupov

V predchádzajúcom cvičení, Riešené úlohy k 6. lekcii C # .NET, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.

V minulej lekcii, Riešené úlohy k 6. lekcii C # .NET , sme sa zaoberali cykly. Dnes to bude také oddychové, dokončíme si totiž našu kalkulačku, ďalej už ju nebudeme potrebovať a bolo by pekné ju dotiahnuť do konca. Asi tušíte, že u nej chýba zabezpečenia vstupov od užívateľa, tým sa bude zaoberať dnešný C # tutoriál.

Pripomeňme si kód našej kalkulačky:

Console.WriteLine("Vitajte v kalkulačke");
string pokracovat = "áno";
while (pokracovat == "áno")
{
    Console.WriteLine("Zadajte prvé číslo:");
    float a = float.Parse(Console.ReadLine());
    Console.WriteLine("Zadajte druhé číslo:");
    float b = float.Parse(Console.ReadLine());
    Console.WriteLine("Zvoľte si operáciu:");
    Console.WriteLine("1 - sčítanie");
    Console.WriteLine("2 - odčítanie");
    Console.WriteLine("3 - násobenie");
    Console.WriteLine("4 - delenie");
    int volba = int.Parse(Console.ReadLine());
    float vysledek = 0;
    switch (volba)
    {
        case 1:
            vysledek = a + b;
        break;
        case 2:
            vysledek = a - b;
        break;
        case 3:
            vysledek = a * b;
        break;
        case 4:
            vysledek = a / b;
        break;
    }
    if ((volba > 0) && (volba < 5))
        Console.WriteLine("Výsledok: {0}", vysledek);
    else
        Console.WriteLine("Neplatná voľba");
    Console.WriteLine("Prajete si zadať ďalší príklad? [áno / nie]");
    pokracovat = Console.ReadLine();
}
Console.WriteLine("Ďakujem za použitia kalkulačky, aplikáciu ukončíte ľubovoľnou klávesou.");
Console.ReadKey();

Už sme si raz hovorili, že by sme mali vstupy od užívateľa vždy ošetrovať. Poviem vám tajomstvo úspešných a obľúbených aplikácií, je veľmi jednoduché: Počítajú s tým, že je používateľ úplný hlupák :) Čím hlúpejšieho užívateľa budete predpokladať, tým väčší úspech budú vaše aplikácie mať. Pokiaľ tu používateľ zadá miesto "áno" napr. "Áno" (áno medzera) alebo "Áno" (s veľkým písmenom), program rovnako skončí. To ešte nemusí byť kvôli hlúposti, ale preto, že sa preklepli. Môže nám však zadať aj niečo úplne nezmyselného, napr. "Možno".

To nie je však najväčší problém nášho programu, keď používateľ nezadá číslo, ale nejaký nezmysel, celý program sa zastaví a spadne s chybou. Poďme teraz tieto dva problémy opraviť.

Na overenie správnosti vstupu pri jeho parsovanie môžeme namiesto metódy Parse() použiť metódu TryParse() . Metóda vracia true / false podľa toho, či sa parsovanie podarilo alebo nie. Ak sa pýtate, ako z metódy teda dostaneme naparsovanou hodnotu, tak tá sa nám uloží do premennej odovzdanej druhým parametrom. Pri parametri musíme uviesť modifikátor out , zatiaľ sa ním nebudeme zaťažovať, budeme brať ako fakt, že to metóda TryParse() takhle má. Hodnota premennej, ktorú sme takto odovzdali do druhého parametra, bude ovplyvnená. Ukážeme si to u prvého čísla, u druhého to bude samozrejme analogické a len to opíšeme. Ideálne by sme si na to mali vytvoriť metódu, aby sme nepísali 2x ten istý kód, ale zatiaľ nie je vhodná doba sa týmto zaoberať, metódy sa naučíme definovať až u objektovo orientovaného programovania .

Console.WriteLine("Zadajte prvé číslo:");
float a;
while (!float.TryParse(Console.ReadLine(), out a))
    Console.WriteLine("Neplatné číslo, zadajte prosím znova:");

Na kódu nie je nič zložité. Najprv vyzveme užívateľa na zadanie čísla a deklarujeme premennú a . Následne priamo do podmienky while cyklu vložíme TryParse() , podmienku znegujeme operátorom ! . Kým teda vracia false , bude sa cyklus stále opakovať a vyzývať k novému zadaniu. Zadaný text z konzoly sa naparsuje do premennej a vracia sa true . Ak sa parsovanie nepodarí, je vrátený false .

Teraz sa ešte pozrieme na výber operácie a pokračovanie. Obe voľby načítame ako string aj keď to nie je úplne vhodné. U čísel to má opodstatnenie, pretože môžu mať dĺžku väčšie ako jeden znak a musí byť odenterovány. U voľby operácií 1-4 ale vôbec nepotrebujeme načítať text a potvrdzovať ho enter em, stačí načítať jediný znak z klávesnice a ten nemusíme ničím potvrdzovať. K načítanie jediného znaku slúži nám už známa metóda Console.ReadKey() . Aby sme výsledok dostali ako char (znak), musíme na tejto metóde použiť vlastnosť KeyChar . Vo switch aj nezabúdajme, že char sa zapisuje do apostrofov.

char volba = Console.ReadKey().KeyChar;
float vysledek = 0;
bool platnaVolba = true;
switch (volba)
{
    case '1':
        vysledek = a + b;
        break;
    case '2':
        vysledek = a - b;
        break;
    case '3':
        vysledek = a * b;
        break;
    case '4':
        vysledek = a / b;
        break;
    default:
        platnaVolba = false;
        break;
}
if (platnaVolba)
    Console.WriteLine("Výsledok: {0}", vysledek);
else
    Console.WriteLine("Neplatná voľba");

Do premennej volba si uložíme stlačený znak ako char . Pretože rozsah znakov neotestujete s doterajšími znalosťami tak jednoducho ako rozsah čísiel, pomôžeme si iným spôsobom. Pripravíme si premennú platnaVolba typu bool , ktorú nastavíme na true (budeme predpokladať, že je voľba správna). Konštrukcia switch zostane podobná, len čísla dáme teraz do apostrofov, pretože sa teraz jedná o jednotlivé znaky. Pridáme možnosť default: , ktorá v prípade iné hodnoty než menovaných nastaví nami pripravenú premennú platnaVolba na false . Potom nie je nič jednoduchšie, než túto premennú otestovať. Vyskúšajte si to, program sa používa teraz pohodlnejšie.

Nakoniec upravíme ešte výzvu na pokračovanie, zadávať budeme opäť char A / N, budeme tolerovať rôznu veľkosť písmen a reagovať na zlé zadanie. Opäť použijeme switch , našu premennú pokracovat zmeníme na typ bool . Kód je asi zbytočné viac popisovať, za zmienku stojí iba kombo Console.ReadKey().KeyChar.ToString().ToLower() , ktoré načíta znak z konzoly a vráti ho ako string malými písmenami.

Pretože sa jedná o väčší kus kódu, použijeme tzv. Komentáre. Tie s píšu pomocou dvoulomítka (dvoch lomítok za sebou). Sú to informácie pre programátora, kompilátor si ich nevšíma.

Console.WriteLine("Vitajte v kalkulačke");
bool pokracovat = true;
while (pokracovat)
{
    // načítanie čísel
    Console.WriteLine("Zadajte prvé číslo:");
    float a;
    while (!float.TryParse(Console.ReadLine(), out a))
        Console.WriteLine("Neplatné číslo, zadajte prosím znova:");
    Console.WriteLine("Zadajte druhé číslo:");
    float b;
    while (!float.TryParse(Console.ReadLine(), out b))
        Console.WriteLine("Neplatné číslo, zadajte prosím znova:");
    // voľba operácie a výpočet
    Console.WriteLine("Zvoľte si operáciu:");
    Console.WriteLine("1 - sčítanie");
    Console.WriteLine("2 - odčítanie");
    Console.WriteLine("3 - násobenie");
    Console.WriteLine("4 - delenie");
    char volba = Console.ReadKey().KeyChar;
    Console.WriteLine();
    float vysledek = 0;
    bool platnaVolba = true;
    switch (volba)
    {
        case '1':
            vysledek = a + b;
            break;
        case '2':
            vysledek = a - b;
            break;
        case '3':
            vysledek = a * b;
            break;
        case '4':
            vysledek = a / b;
            break;
        default:
            platnaVolba = false;
            break;
    }
    if (platnaVolba)
        Console.WriteLine("Výsledok: {0}", vysledek);
    else
        Console.WriteLine("Neplatná voľba");
    Console.WriteLine("Prajete si zadať ďalší príklad? [a / n]");
    // dotaz na pokračovanie
    platnaVolba = false;
    while (!platnaVolba)
    {
        switch (Console.ReadKey().KeyChar.ToString().ToLower())
        {
            case "a":
                pokracovat = true;
                platnaVolba = true;
            break;
            case "n":
                pokracovat = false;
                platnaVolba = true;
            break;
            default:
                Console.WriteLine("Neplatná voľba, zadajte prosím a / n");
            break;
        }
    }
    Console.WriteLine();
}

Konzolová aplikácia
Zadajte prvé číslo:
cislo
Neplatné číslo, zadajte prosím znova:
13
Zadajte druhé číslo:
22
Zvoľte si operáciu:
1 - sčítanie
2 - odčítanie
3 - násobenie
4 - delenie
3
Výsledok: 286
Prajete si zadať ďalší príklad? [a / n]
h
Neplatná voľba, zadajte prosím a / n

Gratulujem, práve ste vytvorili svoj prvý blbovzdorný program :) Kód sa nám trochu skomplikoval, snáď ste to všetko pochytia. Niekedy v budúcnosti to treba napravíme a rozdelíme ho do prehľadných metód, pre túto sekciu však považujme kalkulačku za hotovú, možno by sa do nej len mohlo pridať viac matematických funkcií, na tie sa v C # kurze tiež zameriame.

V budúcej lekcii, Poľa v C # , sa opäť ponoríme do nových konštrukcií. Čaká nás polia a pokročilá práca s reťazcami. Potom to bude z konštrukcií v tejto sekcii všetko, blížime sa ku koncu :)


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 1067x (24.01 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Predchádzajúci článok
Riešené úlohy k 6. lekcii C # .NET
Všetky články v sekcii
Základné konštrukcie jazyka C # .NET
Preskočiť článok
(neodporúčame)
Poľa v C #
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
4 hlasov
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity