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#