Lekce 7 - Ošetření uživatelských vstupů ve VB.NET
V předešlém cvičení, Řešené úlohy k 6. lekci VB.NET, jsme si procvičili nabyté zkušenosti z předchozích lekcí.
V dnešním Visual Basic .NET tutoriálu to bude takové oddechové. Dokončíme si totiž naši kalkulačku, dále už ji nebudeme potřebovat a bylo by hezké ji dotáhnout do konce. Asi tušíte, že u ni chybí zabezpečení vstupů od uživatele, tím se bude zabývat dnešní tutoriál.
Připomeňme si kód naší kalkulačky:
Console.WriteLine("Vítejte v kalkulačce") Dim pokracovat As String = "Ano" While pokracovat = "Ano" Console.WriteLine("Zadejte první číslo:") Dim a As Single = Console.ReadLine() Console.WriteLine("Zadejte druhé číslo:") Dim b As Single = Console.ReadLine() Console.WriteLine("Zvolte si operaci:") Console.WriteLine("1 - sčítání") Console.WriteLine("2 - odčítání") Console.WriteLine("3 - násobení") Console.WriteLine("4 - dělení") 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ýsledek: {0}", vysledek) Else Console.WriteLine("Neplatná volba") End If Console.WriteLine("Přejete si zadat další příklad? [ano/ne]") pokracovat = Console.ReadLine() End While Console.WriteLine("Děkuji za použití kalkulačky, aplikaci ukončíte libovolnou klávesou.") Console.ReadKey()
Už jsme si jednou říkali, že bychom měli vstupy od uživatele vždy
ošetřovat. Řeknu vám tajemství úspěšných a oblíbených aplikací, je
velmi jednoduché: Počítají s tím, že je uživatel naprostý
hlupák
Čím
hloupějšího uživatele budete předpokládat, tím větší úspěch budou
vaše aplikace mít. Pokud zde uživatel zadá místo "ano" např.
"ano " (ano mezera) nebo "Ano" (s
velkým písmenem), program stejně skončí. To ještě nemusí být kvůli
hlouposti, ale proto, že se překlepl. Může nám však zadat i něco úplně
nesmyslného, např. "možná".
To není však největší problém našeho programu, když uživatel nezadá číslo, ale nějaký nesmysl, celý program se zastaví a spadne s chybou. Pojďme nyní tyto dva problémy opravit.
K ověření správnosti vstupu při jeho parsování můžeme použít
metodu TryParse(). Metoda vrací
True/False podle toho, jestli se parsování podařilo
či nikoli. Jestli se ptáte, jak z metody tedy dostaneme naparsovanou hodnotu,
tak ta se nám uloží do proměnné předané druhým parametrem. Hodnota
proměnné, kterou jsme takto předali do druhého parametru bude ovlivněna.
Ukážeme si to u prvního čísla, u druhého to bude samozřejmě analogické
a jen to opíšeme. Ideálně bychom si na to měli vytvořit metodu, abychom
nepsali 2x ten samý kód, ale zatím není vhodná doba se tímto zabývat,
metody se naučíme definovat až u objektově orientovaného
programování.
Console.WriteLine("Zadejte první číslo:") Dim a As Single While Not Single.TryParse(Console.ReadLine(), a) Console.WriteLine("Neplatné číslo, zadejte prosím znovu:") End While
Na kódu není nic složitého. Nejprve vyzveme uživatele k zadání čísla
a deklarujeme proměnnou a. Následně přímo do podmínky
While cyklu vložíme TryParse(), podmínku znegujeme
operátorem Not, tedy dokud vrací False, bude se
cyklus stále opakovat a vyzývat k novému zadání. Zadaný text z konzole se
naparsuje do proměnné a je navráceno True, pokud se parsování
nepovede, je vráceno False.
Nyní se ještě podíváme na výběr operace a pokračování. Obě volby
načítáme jako String i když to není úplně vhodné. U čísel
to má opodstatnění, protože mohou mít délku větší než jeden znak a
musí být odenterovány. U volby operací 1-4 ale vůbec nepotřebujeme
načítat text a potvrzovat ho klávesou Enter, stačí načíst
jediný znak z klávesnice a ten nemusíme ničím potvrzovat. K načtení
jediného znaku slouží nám již známá metoda
Console.ReadKey(). Abychom výsledek dostali jako Char
(znak), musíme na této metodě použít vlastnost 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ýsledek: {0}", vysledek) Else Console.WriteLine("Neplatná volba") End If
Do proměnné volba si uložíme stisknutý znak jako
Char. Protože se rozsah znaků nedá už tak jednoduše otestovat
podmínkou, uděláme kontrolu jiným způsobem, než když jsme načítali
volbu jako Integer. Připravíme si proměnnou
platnaVolba typu Boolean, kterou nastavíme na
True (budeme předpokládat, že je volba správná).
Select Case zůstane podobný, jen čísla dáme nyní do uvozovek,
protože se jedná o jednotlivé znaky. Přidáme možnost
Case Else, která v případě jiné hodnoty než jmenovaných
nastaví námi připravenou proměnnou platnaVolba na
False. Potom není nic jednoduššího, než proměnnou otestovat.
Vyzkoušejte si to, program se používá nyní pohodlněji.
Nakonec upravíme ještě výzvu k pokračování, zadávat budeme opět
Char A/N, budeme tolerovat různou velikost písmen a reagovat na
špatné zadání. Opět použijeme Select Case, naši proměnnou
pokracovat změníme na typ Boolean. Kód je asi
zbytečné více popisovat, za zmínku stojí pouze kombo
Console.ReadKey().KeyChar.ToString().ToLower(), které načte znak
z konzole a vrátí ho jako String malými písmeny.
Protože se jedná o větší kus kódu, použijeme tzv. komentáře. Ty s píší pomocí jednoho apostrofu. Jsou to informace pro programátora, kompilátor si jich nevšímá.
Console.WriteLine("Vítejte v kalkulačce") Dim pokracovat As Boolean = True While pokracovat ' načtení čísel Console.WriteLine("Zadejte první číslo:") Dim a As Single While Not Single.TryParse(Console.ReadLine(), a) Console.WriteLine("Neplatné číslo, zadejte prosím znovu:") End While Console.WriteLine("Zadejte druhé číslo:") Dim b As Single While Not Single.TryParse(Console.ReadLine(), b) Console.WriteLine("Neplatné číslo, zadejte prosím znovu:") End While ' volba operace a výpočet Console.WriteLine("Zvolte si operaci:") Console.WriteLine("1 - sčítání") Console.WriteLine("2 - odčítání") Console.WriteLine("3 - násobení") Console.WriteLine("4 - dělení") 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ýsledek: {0}", vysledek) Else Console.WriteLine("Neplatná volba") End If Console.WriteLine("Přejete si zadat další příklad? [a/n]") ' dotaz na pokračování 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á volba, zadejte prosím a/n") End Select End While Console.WriteLine() End While
Konzolová aplikace
Zadejte první číslo:
cislo
Neplatné číslo, zadejte prosím znovu:
13
Zadejte druhé číslo:
22
Zvolte si operaci:
1 - sčítání
2 - odčítání
3 - násobení
4 - dělení
3
Výsledek: 286
Přejete si zadat další příklad? [a/n]
h
Neplatná volba, zadejte prosím a/n
Gratuluji, právě jste vytvořili svůj první blbovzdorný program
Kód se nám trochu zkomplikoval,
snad jste to všechno pochytili. Někdy v budoucnu to třeba napravíme a
rozdělíme ho do přehledných metod, pro tuto sekci však považujme
kalkulačku za hotovou, možná by se do ní jen mohlo přidat více
matematických funkcí, na ty se v seriálu také zaměříme.
V příští lekci, Pole ve VB.NET, se opět ponoříme do nových konstrukcí,
čeká nás pole a pokročilá práce s řetězci. Potom to bude z konstrukcí v
této sekci vše, blížíme se ke konci
.

