7. diel - Ošetrenie užívateľských vstupov
V predchádzajúcom cvičení, Riešené úlohy k 6. lekcii VB.NET, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
V minulej lekcii, Riešené úlohy k 6. lekcii VB.NET , sme sa zaoberali cykly. V dnešnom Visual Basic .NET tutoriálu 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ý tutoriál.
Pripomeňme si kód našej kalkulačky:
Console.WriteLine("Vitajte v kalkulačke") Dim pokracovat As String = "Áno" While pokracovat = "Áno" Console.WriteLine("Zadajte prvé číslo:") Dim a As Single = Console.ReadLine() Console.WriteLine("Zadajte druhé číslo:") Dim b As Single = 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") Dim volba As Integer = Console.ReadLine() Dim vysledek As Single = 0 Select Case volba Case 1 vysledek = a + b Case 2 vysledek = a - b Case 3 vysledek = a * b Case 4 vysledek = a / b End Select If volba > 0 And volba < 5 Then Console.WriteLine("Výsledok: {0}", vysledek) Else Console.WriteLine("Neplatná voľba") End If Console.WriteLine("Prajete si zadať ďalší príklad? [áno/nie]") pokracovat = Console.ReadLine() End While 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 "ano"
napr. " "
(Áno medzera) alebo ""
(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. ""
.
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 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. 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:") Dim a As Single While Not Single.TryParse(Console.ReadLine(), a) Console.WriteLine("Neplatné číslo, zadajte prosím znova:") End While
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 Not
, teda kým 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 klávesou Enter, 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
.
Dim volba As Char = Console.ReadKey().KeyChar Dim vysledek As Single = 0 Dim platnaVolba As Boolean = True Select Case volba Case "1" vysledek = a + b Case "2" vysledek = a - b Case "3" vysledek = a * b Case "4" vysledek = a / b Case Else platnaVolba = False End Select If platnaVolba Then Console.WriteLine("Výsledok: {0}", vysledek) Else Console.WriteLine("Neplatná voľba") End If
Do premennej volba
si uložíme stlačený znak ako
Char
. Pretože sa rozsah znakov nedá už tak jednoducho otestovať
podmienkou, urobíme kontrolu iným spôsobom, ako keď sme načítali voľbu
ako Integer
. Pripravíme si premennú platnaVolba
typu
Boolean
, ktorú nastavíme na True
(budeme
predpokladať, že je voľba správna). Select Case
zostane
podobný, len čísla dáme teraz do úvodzoviek, pretože sa jedná o
jednotlivé znaky. Pridáme možnosť Case Else
, ktorá v prípade
iné hodnoty než menovaných nastaví nami pripravenú premennú
platnaVolba
na False
. Potom nie je nič jednoduchšie,
než 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 Select Case
, našu premennú
pokracovat
zmeníme na typ Boolean
. 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 jedného apostrofu. Sú to informácie pre programátora, kompilátor si ich nevšíma.
Console.WriteLine("Vitajte v kalkulačke") Dim pokracovat As Boolean = True While pokracovat ' načítanie čísel Console.WriteLine("Zadajte prvé číslo:") Dim a As Single While Not Single.TryParse(Console.ReadLine(), a) Console.WriteLine("Neplatné číslo, zadajte prosím znova:") End While Console.WriteLine("Zadajte druhé číslo:") Dim b As Single While Not Single.TryParse(Console.ReadLine(), b) Console.WriteLine("Neplatné číslo, zadajte prosím znova:") End While ' 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") Dim volba As Char = Console.ReadKey().KeyChar Console.WriteLine() Dim vysledek As Single = 0 Dim platnaVolba As Boolean = True Select Case volba Case "1" vysledek = a + b Case "2" vysledek = a - b Case "3" vysledek = a * b Case "4" vysledek = a / b Case Else platnaVolba = False End Select If platnaVolba Console.WriteLine("Výsledok: {0}", vysledek) Else Console.WriteLine("Neplatná voľba") End If Console.WriteLine("Prajete si zadať ďalší príklad? [a / n]") ' dotaz na pokračovanie platnaVolba = false While Not platnaVolba Select Case Console.ReadKey().KeyChar.ToString().ToLower() Case "a" pokracovat = True platnaVolba = True Case "n" pokracovat = False platnaVolba = True Case Else Console.WriteLine("Neplatná voľba, zadajte prosím a / n") End Select End While Console.WriteLine() End While
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 seriáli tiež zameriame.
V budúcej lekcii, Poľa vo Visual Basicu , 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