Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.
IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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

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í.

Dnes nás čaká oddychová látka, dokončíme si totiž našu kalkulačku. Ďalej už ju nebudeme potrebovať 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 bude zaoberať dnešný C#. NET tutoriál.

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();

Že by sme mali vstupy od používateľa vždy ošetrovať, sme si už raz vysvetľovali. Povieme 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ú. Pokiaľ užívateľ zadá miesto "yes" napr. " yes" (s medzerou) alebo "Yes" (s veľkým písmenom), program aj tak skončí. Takýto výraz ani nemusí spôsobiť užívateľovu hlúposť, môže ísť skrátka 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 parsovaniu podarilo, alebo nie. Ak sa pýtate, ako z metódy teda dostaneme naparsovanú 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ť, iba budeme brať ako fakt, že metóda TryParse() takto 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ľ nie je vhodná doba sa týmto 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 while cyklu 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 z konzoly sa naparsuje do premennej a je vrátené true. Pokiaľ sa parsovanie nepodarí, je vrátené 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é. U čísel má také 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ť jediný znak z klávesnice, ktorý nemusíme ničím potvrdzovať. Na 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. V konštrukcii switch nezabúdajme, že char sa zapisuje 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 znalosťami tak jednoducho ako rozsah čísel, 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 teraz dáme do apostrofov, pretože sa teraz jedná o jednotlivé znaky. Pridáme možnosť default:, ktorá v prípade inej hodnoty ako menovaných nastaví nami pripravenú premennú platnaVolba na false. Potom už nie je nič jednoduchšie ako túto premennú otestovať. Vyskúšajte si to, program sa teraz používa 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 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äčší kus kódu, použijeme v ňom tzv. komentáre. Tie sa píšu pomocou dvojlomítka (dvoch lomítok 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();
}

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. Pre túto sekciu však považujme kalkulačku za hotovú, hoci by sa do nej mohlo pridať viac matematických funkcií. Na tie sa v C# . NET kurzu tiež 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 budúcej lekcii, Poľa 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é 1x (165.5 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štrukcia jazyka C# .NET
Preskočiť článok
(neodporúčame)
Poľa v C# .NET
Č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