IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Mezi 13:00 až cca 16:00 proběhne odstávka sítě z důvodu aktualizace. Web bude po celou dobu nedostupný.

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 :).


 

Předchozí článek
Řešené úlohy k 6. lekci VB.NET
Všechny články v sekci
Základní konstrukce jazyka Visual Basic (VB.NET)
Přeskočit článek
(nedoporučujeme)
Pole ve VB.NET
Článek pro vás napsal Michal Žůrek - misaz
Avatar
Uživatelské hodnocení:
19 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.
Aktivity