7. díl - Ošetření uživatelských vstupů

Ostatní jazyky Visual Basic .NET Základní konstrukce Ošetření uživatelských vstupů

Minule jsme se zabývali cykly. Dnes 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 enterem, 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.ReadKe­y().KeyChar.ToS­tring().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
Jednoduchá konzolová kalkulačka ve Visual Basic s ošetřením vstupů

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.

Příště 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 :)


 

  Aktivity (2)

Článek pro vás napsal Michal Žůrek (misaz)
Avatar
Autor se věnuje tvorbě aplikací pro počítače, mobilní telefony, mikroprocesory a tvorbě webových stránek a webových aplikací. Nejraději programuje ve Visual Basicu a TypeScript. Ovládá HTML, CSS, JavaScript, TypeScript, C# a Visual Basic.

Jak se ti líbí článek?
Celkem (4 hlasů) :
55555


 


Miniatura
Předchozí článek
Cvičení k 6. lekci VB.NET
Miniatura
Následující článek
Pole ve Visual Basicu

 

 

Komentáře

Avatar
dave_23
Člen
Avatar
dave_23:

Má u toho druhého parametru metody TryParse teda být Out nebo ne? Mě to s ním nefunguje a v další části tutoriálu už ho tam taky nemáš...

 
Odpovědět 21.1.2014 15:40
Avatar
Odpovídá na dave_23
Michal Žůrek (misaz):

aha, ne nemá to tam být, pokud chceš udělat aby ten parametr mohl být ovlivněn i ven, tak se to píše v definici pomocí ByRef.

Díky za upozornění, opravím.

Odpovědět 21.1.2014 16:15
Nesnáším {}, proto se jim vyhýbám.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.