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#

David sa informačné technológie naučil na