Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

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ů

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Cykly ve Visual Basicu, jsme se zabývali cykly. 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 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

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 Visual Basicu, 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 :)


 

 

Článek pro vás napsal Michal Žůrek (misaz)
Avatar
Jak se ti líbí článek?
4 hlasů
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.
Miniatura
Předchozí článek
Cykly ve Visual Basicu
Miniatura
Následující článek
Pole ve Visual Basicu
Aktivity (5)

 

 

Komentáře

Avatar
dave_23
Člen
Avatar
dave_23:21.1.2014 15:40

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):21.1.2014 16:15

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.
Avatar
Tomáš Slanina:Včera 9:17

Musím říct že tyhle články mi vážně pomohli.. Napsal jsem si svoují vlastní kalkulačku možná je trošku složitější než tahle ale zase je to moje první aplikace...

Module Module1

Sub Main()

Začátek:
Console.Clear()

Console.Write­Line("(-------------------------Kalkulačka 1.0 by DJ_M1k3-------------------------)")
Console.WriteLine(" Vítejte v kalkulačce ")
Console.WriteLine()
Console.Write­Line("Přejete si vytvořit nový příklad(y/n)")
Console.WriteLine()
Chyba1:
Dim pokracovat As String = Console.ReadLine
pokracovat = pokracovat.ToLower

Select Case pokracovat
Case "y"
Nový: Console.Clear()
Console.Write­Line("(-------------------------Kalkulačka 1.0 by DJ_M1k3-------------------------)")
Console.WriteLine(" Zadávám nový příklad ")
Case "n"
FileClose()
Case Else
Console.WriteLine()
Console.Write­Line("Neplatný uživatelský vstup zadejte prosím hodnotu znovu.")
Console.WriteLine()
GoTo Chyba1
End Select

While pokracovat = "y"
Console.WriteLine()
Console.Write­Line("Zadejte prosím první číslo výpočtu")
Console.WriteLine()

Dim a, b As Single
a = Console.ReadLine

Console.WriteLine()
Console.Write­Line("Zadejte prosím druhé číslo výpočtu")
Console.WriteLine()
b = Console.ReadLine

Console.Clear()
Console.Write­Line("(-------------------------Kalkulačka 1.0 by DJ_M1k3-------------------------)")
Console.WriteLine(" Zadávám nový příklad ")
Console.WriteLine()
Console.Write­Line("Vámi zvolená čísla jsou: " & a & " a " & b)
Console.WriteLine()
Console.Write­Line("Nyní prosím vyberte číselnou operaci kterou chcete s hodnotami " & a & " a " & b & " provést")
Console.WriteLine()
Console.Write­Line("1. sčítání")
Console.Write­Line("2. odčítání")
Console.Write­Line("3. násobení")
Console.Write­Line("4. dělení")
Console.WriteLine()
Chyba2:
Dim operace As Char = Console.ReadKe­y.KeyChar
Dim vysledek As Double

Select Case operace
Case "1"
vysledek = a + b
Case "2"
vysledek = a - b
Case "3"
vysledek = a * b
Case "4"
vysledek = a / b
Case Else
Console.WriteLine()
Console.Write­Line("Neplatný uživatelský vstup zadejte prosím hodnotu znovu.")
Console.WriteLine()
GoTo Chyba2
End Select

Console.Clear()
Console.Write­Line("(-------------------------Kalkulačka 1.0 by DJ_M1k3-------------------------)")
Console.WriteLine(" Výpočet dokončen ")
Console.WriteLine()
Console.Write­Line("Výsledek výpočtu: " & vysledek & " Použili jste následující čísla: " & a & " a " & b)
Console.WriteLine()
Console.Write­Line("Co si přejete provést dále?")
Console.WriteLine()
Console.Write­Line("1. Založit nový příklad")
Console.Write­Line("2. Odejít z aplikace")
Chyba3:
Dim dále As Char = Console.ReadKe­y.KeyChar

Select Case dále
Case "1"
GoTo Nový
Case "2"

Case Else
Console.WriteLine()
Console.Write­Line("Neplatný uživatelský vstup zadejte prosím hodnotu znovu.")
Console.WriteLine()
GoTo Chyba3
End Select

pokracovat = "n"
Console.Clear()
Console.Write­Line("(-------------------------Kalkulačka 1.0 by DJ_M1k3-------------------------)")
Console.WriteLine(" Zavírám aplikaci... ")
Console.WriteLine()
Console.Write­Line("Aplikaci ukončíte libovolnou klávesou.")
Console.ReadKey()

End While

End Sub

End Module

 
Odpovědět Včera 9:17
Avatar
Odpovídá na Tomáš Slanina
Tomáš Slanina:Včera 9:51

ještě teda musím ošetřit uživatelský vstup y/n na začátku teď když jsem zadal místo y y´´ tak mi program hodil chybu..

 
Odpovědět Včera 9:51
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 4 zpráv z 4.