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 .