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ý 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 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ú 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 teraz 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 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äčší 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(); }
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. 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é 3x (165.5 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#