IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

7. diel - Ošetrenie užívateľských vstupov

V predchádzajúcom cvičení, Riešené úlohy k 6. lekcii VB.NET, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.

V minulej lekcii, Riešené úlohy k 6. lekcii VB.NET , sme sa zaoberali cykly. V dnešnom Visual Basic .NET tutoriálu to bude také oddychové. Dokončíme si totiž našu kalkulačku, ďalej už ju nebudeme potrebovať a bolo by pekné ju dotiahnuť do konca. Asi tušíte, že u nej chýba zabezpečenia vstupov od užívateľa, tým sa bude zaoberať dnešný tutoriál.

Pripomeňme si kód našej kalkulačky:

Console.WriteLine("Vitajte v kalkulačke")
Dim pokracovat As String = "Áno"
While pokracovat = "Áno"
    Console.WriteLine("Zadajte prvé číslo:")
    Dim a As Single = Console.ReadLine()
    Console.WriteLine("Zadajte druhé číslo:")
    Dim b As Single = Console.ReadLine()
    Console.WriteLine("Zvoľte si operáciu:")
    Console.WriteLine("1 - sčítanie")
    Console.WriteLine("2 - odčítanie")
    Console.WriteLine("3 - násobenie")
    Console.WriteLine("4 - delenie")
    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ýsledok: {0}", vysledek)
    Else
        Console.WriteLine("Neplatná voľba")
    End If
    Console.WriteLine("Prajete si zadať ďalší príklad? [áno/nie]")
    pokracovat = Console.ReadLine()
End While
Console.WriteLine("Ďakujem za použitia kalkulačky, aplikáciu ukončíte ľubovoľnou klávesou.")
Console.ReadKey()

Už sme si raz hovorili, že by sme mali vstupy od užívateľa vždy ošetrovať. Poviem vám tajomstvo úspešných a obľúbených aplikácií, je veľmi jednoduché: Počítajú s tým, že je používateľ úplný hlupák :) Čím hlúpejšieho užívateľa budete predpokladať, tým väčší úspech budú vaše aplikácie mať. Pokiaľ tu používateľ zadá miesto "ano" napr. " " (Áno medzera) alebo "" (s veľkým písmenom), program rovnako skončí. To ešte nemusí byť kvôli hlúposti, ale preto, že sa preklepli. Môže nám však zadať aj niečo úplne nezmyselného, napr. "".

To nie je však najväčší problém nášho programu, keď používateľ nezadá číslo, ale nejaký nezmysel, celý program sa zastaví a spadne s chybou. Poďme teraz tieto dva problémy opraviť.

Na overenie správnosti vstupu pri jeho parsovanie môžeme použiť metódu TryParse(). Metóda vracia True / False podľa toho, či sa parsovanie podarilo alebo nie. Ak sa pýtate, ako z metódy teda dostaneme naparsovanou hodnotu, tak tá sa nám uloží do premennej odovzdanej druhým parametrom. Hodnota premennej, ktorú sme takto odovzdali do druhého parametra bude ovplyvnená. Ukážeme si to u prvého čísla, u druhého to bude samozrejme analogické a len to opíšeme. Ideálne by sme si na to mali vytvoriť metódu, aby sme nepísali 2x ten istý kód, ale zatiaľ nie je vhodná doba sa týmto zaoberať, metódy sa naučíme definovať až u objektovo orientovaného programovania.

Console.WriteLine("Zadajte prvé číslo:")
Dim a As Single
While Not Single.TryParse(Console.ReadLine(), a)
    Console.WriteLine("Neplatné číslo, zadajte prosím znova:")
End While

Na kódu nie je nič zložité. Najprv vyzveme užívateľa na zadanie čísla a deklarujeme premennú a. Následne priamo do podmienky While cyklu vložíme TryParse(), podmienku znegujeme operátorom Not, teda kým vracia False, bude sa cyklus stále opakovať a vyzývať k novému zadaniu. Zadaný text z konzoly sa naparsuje do premennej a vracia sa True, ak sa parsovanie nepodarí, je vrátený False.

Teraz sa ešte pozrieme na výber operácie a pokračovanie. Obe voľby načítame ako String aj keď to nie je úplne vhodné. U čísel to má opodstatnenie, pretože môžu mať dĺžku väčšie ako jeden znak a musí byť odenterovány. U voľby operácií 1-4 ale vôbec nepotrebujeme načítať text a potvrdzovať ho klávesou Enter, stačí načítať jediný znak z klávesnice a ten nemusíme ničím potvrdzovať. K načítanie jediného znaku slúži nám už známa metóda Console.ReadKey(). Aby sme výsledok dostali ako Char (znak), musíme na tejto metóde použiť vlastnosť 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ýsledok: {0}", vysledek)
Else
    Console.WriteLine("Neplatná voľba")
End If

Do premennej volba si uložíme stlačený znak ako Char. Pretože sa rozsah znakov nedá už tak jednoducho otestovať podmienkou, urobíme kontrolu iným spôsobom, ako keď sme načítali voľbu ako Integer. Pripravíme si premennú platnaVolba typu Boolean, ktorú nastavíme na True (budeme predpokladať, že je voľba správna). Select Case zostane podobný, len čísla dáme teraz do úvodzoviek, pretože sa jedná o jednotlivé znaky. Pridáme možnosť Case Else, ktorá v prípade iné hodnoty než menovaných nastaví nami pripravenú premennú platnaVolba na False. Potom nie je nič jednoduchšie, než premennú otestovať. Vyskúšajte si to, program sa používa teraz pohodlnejšie.

Nakoniec upravíme ešte výzvu na pokračovanie, zadávať budeme opäť Char A / N, budeme tolerovať rôznu veľkosť písmen a reagovať na zlé zadanie. Opäť použijeme Select Case, našu premennú pokracovat zmeníme na typ Boolean. Kód je asi zbytočné viac popisovať, za zmienku stojí iba kombo Console.ReadKey().KeyChar.ToString().ToLower(), ktoré načíta znak z konzoly a vráti ho ako String malými písmenami.

Pretože sa jedná o väčší kus kódu, použijeme tzv. Komentáre. Tie s píšu pomocou jedného apostrofu. Sú to informácie pre programátora, kompilátor si ich nevšíma.

Console.WriteLine("Vitajte v kalkulačke")
Dim pokracovat As Boolean = True
While pokracovat
    ' načítanie čísel
    Console.WriteLine("Zadajte prvé číslo:")
    Dim a As Single
    While Not Single.TryParse(Console.ReadLine(), a)
        Console.WriteLine("Neplatné číslo, zadajte prosím znova:")
    End While
    Console.WriteLine("Zadajte druhé číslo:")
    Dim b As Single
    While Not Single.TryParse(Console.ReadLine(), b)
        Console.WriteLine("Neplatné číslo, zadajte prosím znova:")
    End While
    ' voľba operácie a výpočet
    Console.WriteLine("Zvoľte si operáciu:")
    Console.WriteLine("1 - sčítanie")
    Console.WriteLine("2 - odčítanie")
    Console.WriteLine("3 - násobenie")
    Console.WriteLine("4 - delenie")
    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ýsledok: {0}", vysledek)
    Else
        Console.WriteLine("Neplatná voľba")
    End If
    Console.WriteLine("Prajete si zadať ďalší príklad? [a / n]")
    ' dotaz na pokračovanie
    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á voľba, zadajte prosím a / n")
        End Select
    End While
    Console.WriteLine()
End While

Konzolová aplikácia
Zadajte prvé číslo:
cislo
Neplatné číslo, zadajte prosím znova:
13
Zadajte druhé číslo:
22
Zvoľte si operáciu:
1 - sčítanie
2 - odčítanie
3 - násobenie
4 - delenie
3
Výsledok: 286
Prajete si zadať ďalší príklad? [a / n]
h
Neplatná voľba, zadajte prosím a / n

Gratulujem, práve ste vytvorili svoj prvý blbovzdorný program :) Kód sa nám trochu skomplikoval, snáď ste to všetko pochytia. Niekedy v budúcnosti to treba napravíme a rozdelíme ho do prehľadných metód, pre túto sekciu však považujme kalkulačku za hotovú, možno by sa do nej len mohlo pridať viac matematických funkcií, na tie sa v seriáli tiež zameriame.

V budúcej lekcii, Poľa vo Visual Basicu , sa opäť ponoríme do nových konštrukcií, čaká nás polia a pokročilá práca s reťazcami. Potom to bude z konštrukcií v tejto sekcii všetko, blížime sa ku koncu :)


 

Predchádzajúci článok
Riešené úlohy k 6. lekcii VB.NET
Všetky články v sekcii
Základné konštrukcie jazyka Visual Basic (VB .NET)
Preskočiť článok
(neodporúčame)
Poľa vo Visual Basicu
Článok pre vás napísal Michal Žůrek - misaz
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
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