Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

8. diel - Ošetrenie užívateľských vstupov v C# .NET

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

Dnes nás čaká oddychová látka, pretože si dokončíme našu kalkulačku. Ďalej ju už potrebovať nebudeme a bolo by preto pekné ju dotiahnuť do konca. Asi tušíte, že jej chýba zabezpečenie vstupov od užívateľa, čím sa budeme zaoberať v dnešnej C#. NET lekcii.

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

Console.WriteLine("Welcome to our calculator");
string goOn = "yes";
while (goOn == "yes")
{
    Console.WriteLine("Enter the first number:");
    double a = double.Parse(Console.ReadLine());
    Console.WriteLine("Enter the second number:");
    double b = double.Parse(Console.ReadLine());
    Console.WriteLine("Choose one of the following operations:");
    Console.WriteLine("1 - addition");
    Console.WriteLine("2 - subtraction");
    Console.WriteLine("3 - multiplication");
    Console.WriteLine("4 - division");
    int option = int.Parse(Console.ReadLine());
    double result = 0;
    switch (option)
    {
        case 1:
            result = a + b;
        break;
        case 2:
            result = a - b;
        break;
        case 3:
            result = a * b;
        break;
        case 4:
            result = a / b;
        break;
    }
    if ((option > 0) && (option < 5))
        Console.WriteLine("Result: {0}", result);
    else
        Console.WriteLine("Invalid option");
    Console.WriteLine("Would you like to make another calculation? [yes/no]");
    goOn = Console.ReadLine();
}
Console.WriteLine("Thank you for using our calculator. Press any key to end the program.");
Console.ReadKey();

To, že by sme mali vstupy od používateľa vždy ošetrovať, sme si už raz vysvetľovali. Poviem vám tajomstvo úspešných a obľúbených aplikácií. Je veľmi jednoduché: také aplikácie počítajú s tým, že používateľ je úplný hlupák :) Čím hlúpejšieho používateľa budeme predpokladať, tým úspešnejšie naše aplikácie budú. Ak užívateľ zadá namiesto "yes" napr. " yes " (s medzerou) alebo "Yes" (s veľkým písmenom), program aj tak skončí. Taký vstup ani nemusí byť spôsobený používateľovou hlúposťou, môže ísť aj o preklep. Užívateľ však môže zadať aj niečo úplne nezmyselné, napr. "maybe".

To však nie je 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 parsovaní 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 naparsovanú hodnotu, 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ť, iba budeme brať ako fakt, že takto metóda TryParse() pracuje. Hodnota premennej, ktorú sme takto odovzdali do druhého parametra, bude ovplyvnená.

Použitie metódy TryParse() si ukážeme pri prvom čísle, pri druhom to bude samozrejme analogické a len to opíšeme. Ideálne by sme si na parsovanie mali vytvoriť metódu, aby sme nepísali dvakrát ten istý kód, ale zatiaľ sa tým nebudeme zaoberať. Metódy sa naučíme definovať až pri objektovo orientovanom programovaní:

Console.WriteLine("Enter the first number:");
double a;
while (!double.TryParse(Console.ReadLine(), out a))
    Console.WriteLine("Invalid entry, please try again:");

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

Teraz sa ešte pozrieme na výber operácie a pokračovania. Obe voľby načítame ako string, ale to nie je úplne vhodné. Pri číslach má toto načítanie opodstatnenie, pretože môžu mať dĺžku väčšiu ako jeden znak a musia byť odenterované. Avšak pri voľbe operácií 1–4 vôbec nepotrebujeme načítať text a potvrdzovať ho klávesom Enter, stačí načítať jeden znak z klávesnice, ktorý nemusíme ničím potvrdzovať. Na načítanie jedné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. V konštrukcii switch nezabúdajme, že char zapisujeme do apostrofov:

char option = Console.ReadKey().KeyChar;
double result = 0;
bool validOption = true;
switch (option)
{
    case '1':
        result = a + b;
        break;
    case '2':
        result = a - b;
        break;
    case '3':
        result = a * b;
        break;
    case '4':
        result = a / b;
        break;
    default:
        validOption = false;
        break;
}
if (validOption)
    Console.WriteLine("Result: {0}", result);
else
    Console.WriteLine("Invalid option");

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

Nakoniec upravíme ešte výzvu na pokračovanie. Zadávať budeme opäť char Y / N, budeme tolerovať rôznu veľkosť písmen a reagovať na zlé zadanie. Opäť použijeme switch, našu premennú goOn zmeníme na typ bool. Kód je teraz 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äčší kód, použijeme v ňom tzv. komentáre. Tie sa píšu pomocou dvojlomky (dve lomky za sebou). Komentáre sú informácie pre programátora, kompilátor si ich nevšíma:

Console.WriteLine("Welcome to our calculator");
bool goOn = true;
while (goOn)
{
    // reading numbers
    Console.WriteLine("Enter the first number:");
    double a;
    while (!double.TryParse(Console.ReadLine(), out a))
        Console.WriteLine("Invalid entry, please try again:");
    Console.WriteLine("Enter the second number:");
    double b;
    while (!double.TryParse(Console.ReadLine(), out b))
        Console.WriteLine("Invalid entry, please try again:");
    // operation choice and calculation
    Console.WriteLine("Choose one of the following operations:");
    Console.WriteLine("1 - addition");
    Console.WriteLine("2 - subtraction");
    Console.WriteLine("3 - multiplication");
    Console.WriteLine("4 - division");
    char option = Console.ReadKey().KeyChar;
    Console.WriteLine();
    double result = 0;
    bool validOption = true;
    switch (option)
    {
        case '1':
            result = a + b;
            break;
        case '2':
            result = a - b;
            break;
        case '3':
            result = a * b;
            break;
        case '4':
            result = a / b;
            break;
        default:
            validOption = false;
            break;
    }
    if (validOption)
        Console.WriteLine("Result: {0}", result);
    else
        Console.WriteLine("Invalid option");
    Console.WriteLine("Would you like to make another calculation? [y/n]");
    // request to continue
    validOption = false;
    while (!validOption)
    {
        switch (Console.ReadKey().KeyChar.ToString().ToLower())
        {
            case "y":
                goOn = true;
                validOption = true;
            break;
            case "n":
                goOn = false;
                validOption = true;
            break;
            default:
                Console.WriteLine("Invalid option, please enter y/n");
            break;
        }
    }
    Console.WriteLine();
}

Výstup:

Konzolová aplikácia
Welcome to our calculator
Enter the first number:
number
Invalid entry, please try again:
13
Enter the second number:
22
Choose one of the following operations:
1 - addition
2 - subtraction
3 - multiplication
4 - division
3
Result: 286
Would you like to make another calculation? [yes/no]
h
Invalid option, please enter y/n

Gratulujeme, práve ste vytvorili svoj prvý blbuvzdorný program :) Kód sa nám trochu skomplikoval, snáď ste to všetko pochytili. V rámci tejto sekcie považujme kalkulačku za hotovú, hoci by sa do nej mohlo pridať viac matematických funkcií. Na tie sa v kurze C# . NET ešte zameriame.

Čaká nás pole a pokročilá práca s reťazcami. Potom to bude z konštrukcií v tejto sekcii všetko, blížime sa ku koncu :)

V ďalšej lekcii, Pole v C# .NET, sa opäť ponoríme do nových konštrukcií a predstavíme si pole.


 

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é 15x (165.99 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Predchádzajúci článok
Riešené úlohy k 7. lekcii C# .NET
Všetky články v sekcii
Základná konštrukcia jazyka C# .NET
Preskočiť článok
(neodporúčame)
Pole v C# .NET
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
32 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