Články

Tisk článku Tisk článku

Složitější podmínky a rozhodovací struktury

[Zpět na kategorii]

Datum: 26. 4. 2007 21:22       Autor: Tomáš Herceg       Zobrazeno: 24059x

Kategorie: Začínáme

Témata: VB.NET

Seriál: VB.NET od začátku - Díl 5.

V minulém díle jsme si vysvětlili práci s podmínkami a naučili se, jak je používat. Dnes se naučíme používat komponentu ListBox, která se používá pro práci se seznamy. Napíšeme si také program pro anglicky mluvící cizince, kteří jedou na návštěvu k nám do České republiky, tento program jim ukáže základní slovíčka a fráze, které by se jim mohly hodit.


Doufám, že si z minulého dílu pamatujete, jak fungují podmínky. Pokud ne, rozhodně si je připomeňte. Dnes je totiž budeme používat ve trochu rozšířené podobě.

Klíčové slovo ElseIf

Minule jsme si ukázali dva typy podmínek (krátkou a dlouhou). Ukázali jsme si také, že v obou typech můžeme použít klíčové slovo Else, za které napíšeme příkazy, které se spustí, když podmínka neplatí. Ve skutečnosti existuje ještě klíčové slovo ElseIf (psáno dohromady), které funkce podmínky rozšiřuje.

 If a > 50 Then 
    MsgBox("a je větší než 50") 
  ElseIf a > 30 Then 
    MsgBox("a je od 31 do 50") 
  ElseIf a > 10 Then 
    MsgBox("a je 11 do 30") 
 Else 
    MsgBox("a je menší nebo rovno 10") 
 End If

Pokud je a větší než 50, provede se první podmínka a pak se pokračuje až za klíčovým slovem End If. Pokud ale a je menší nebo rovno 50, zkusí se další podmínka. A tak to pokračuje dál a dál, jakmile se najde vyhovující podmínka, splní se její příkazy a pokračuje se až za podmínkou. To znamená, že když a je 55, zobrazí se jen první zpráva (a je větší než 50), ale další už ne. Druhá větev podmínky se vůbec nebude testovat, pokračuje se až dalším příkazem za celou podmínkou. V každém případě se tedy provede první vyhovující část a dál už se netestuje. Část Else je nepovinná, splní se jen v případě, že žádná z podmínek nevyhovuje. Ale být tam vůbec nemusí.

Tento typ podmínky nemá zkrácený zápis, v každé větvi může být samozřejmě více příkazů.

Program pro cizince

Spusťte si Visual Basic a vytvořte si nový projekt (Windows Application). Na formulář přidejte komponentu ListBox a pod ní komponentu Label. Komponentě Label můžete změnit písmo na nějaké trochu větší, ale ne moc velké. Vymažte jí také hodnotu vlastnosti Text, ale pozor, tato komponenta bez text u nebude vidět. Uvidíme ji, až se jí za běhu nastaví nějaký text.

Nyní si vyberte komponentu ListBox a v okně vlastností klikněte do pole pro hodnotu vlastnosti Items. Objeví se malé tlačítko se třemi tečkami, když na něj klikneme, ukáže se nám okno s velkým textovým polem. Sem vložíme řádky, které chceme v komponentě ListBox mít. Na každý řádek vložíme jednu položku seznamu.

Vložte tam tedy tyto řádky:

  
 Good morning 
 Good afternoon 
 Good bye 
 Excuse me 
 Where is ... 
 hotel 
 restaurant 
 railway station 
 telephone 
 supermarket 
 toilet 
  
 

Pokud vás napadnou nějaká další slovíčka, můžete si je přidat. Až tam budete mít vše, zavřete toto okno a dvakrát klikněte na komponentu ListBox. Otevře se nám procedura události ListBox1_SelectedIndexChanged, která se spustí, když uživatel vybere nějakou položku (resp. když se změní výběr položky).

Do této procedury napíšeme naši složenou podmínku:

     Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged 
         'podle toho, která položka je vybraná, nastavit text do komponenty Label1 
         If ListBox1.SelectedIndex = 0 Then 
             Label1.Text = "Dobrý den, Dobré ráno" 
          ElseIf ListBox1.SelectedIndex = 1 Then 
             Label1.Text = "Dobrý den, Dobré odpoledne" 
          ElseIf ListBox1.SelectedIndex = 2 Then 
             Label1.Text = "Nashledanou" 
          ElseIf ListBox1.SelectedIndex = 3 Then 
             Label1.Text = "Promiňte" 
          ElseIf ListBox1.SelectedIndex = 4 Then 
             Label1.Text = "Kde je ..." 
          ElseIf ListBox1.SelectedIndex = 5 Then 
             Label1.Text = "hotel" 
          ElseIf ListBox1.SelectedIndex = 6 Then 
             Label1.Text = "restaurace" 
          ElseIf ListBox1.SelectedIndex = 7 Then 
             Label1.Text = "nádraží" 
          ElseIf ListBox1.SelectedIndex = 8 Then 
             Label1.Text = "telefon" 
          ElseIf ListBox1.SelectedIndex = 9 Then 
             Label1.Text = "supermarket" 
          ElseIf ListBox1.SelectedIndex = 10 Then 
             Label1.Text = "záchod" 
         End If 
     End Sub

Je to standardní větvená podmínka. ListBox má vlastnost SelectedIndex, která obsahuje pořadí vybrané položky (číslované od nuly). Pokud není vybraná žádná položka, má tato vlastnost hodnotu -1.

V naší složené podmínce testujeme, kterému číslu se hodnota této vlastnosti rovná, a podle toho nastavíme text do komponenty Label1.

Program pro cizince

Rozhodovací struktury

Možná vás napadlo, že tento způsob je občas neefektivní, protože pořád opisujeme ListBox1.SelectedIndex. V některých případech se tomu nevyhneme, například pokud budeme v každém kroku porovnávat složitější výrazy. Ale pro tento jednoduchý příklad, kdy porovnáváme jednu hodnotu proti několika různým, použijeme rozhodovací strukturu Select Case.

Její schéma je následující (jedná se pouze o schéma, neopisujte jej do programu).

 Select Case {hodnota} 
     Case 1 
         {příkazy} 
     Case 2 
         {příkazy} 
     Case Is > 2 
         {příkazy} 
     Case Else 
         {příkazy} 
 End Select

Hodnota se porovnává s výrazem za Case. Platí opět pravidlo, že se provede pouze první vyhovující podmínka. Můžeme testovat i nerovnosti, a to přes slovo Is, které je ve třetí větvi. I v tomto případě je část Case Else nepovinná, a spustí se, pokud žádná z výše uvedených podmínek neplatí.

Pokud tedy převedeme naši proceduru na rozhodovací strukturu, rozhodně se nám vše zjednoduší.

     Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged 
         'podle toho, která položka je vybraná, nastavit text do komponenty Label1 
         Select Case ListBox1.SelectedIndex 
             Case 0 
                 Label1.Text = "Dobrý den, Dobré ráno" 
             Case 1 
                 Label1.Text = "Dobrý den, Dobré odpoledne" 
             Case 2 
                 Label1.Text = "Nashledanou" 
             Case 3 
                 Label1.Text = "Promiňte" 
             Case 4 
                 Label1.Text = "Kde je ..." 
             Case 5 
                 Label1.Text = "hotel" 
             Case 6 
                 Label1.Text = "restaurace" 
             Case 7 
                 Label1.Text = "nádraží" 
             Case 8 
                 Label1.Text = "telefon" 
             Case 9 
                 Label1.Text = "supermarket" 
             Case 10 
                 Label1.Text = "záchod" 
         End Select 
     End Sub

Vidíme, že toto schéma je rozhodně jednodušší a stručnější. Navíc pokud bychom se rozhodli, že budeme používat jinou komponentu, stačí zde změnit ListBox1 na cokoliv jiného jen na jednom místě, v předchozím případu bychom to museli měnit desetkrát. Visual Studio sice umí velmi pěkně nahrazovat výskyty jednoho textu nějakým textem jiným, nicméně i tak je to již komplikovanější než to pohodlně změnit na jednom místě.

Pozor na pořadí

Pokud máme nějaké číslo a potřebujeme něco spustit, pokud je číslo v rozsahu od 10 do 20, něco jiného, pokud je číslo v rozsahu od 20 do 30, něco jiného, pokud je od 30 do 40 atd., musíme dát pozor na správné pořadí podmínek.

Struktura

 Select Case vek 
     Case Is < 10 
         MsgBox("Užívej si dětství.") 
     Case Is < 20 
         MsgBox("Užívej si mládí.") 
     Case Is < 30 
         MsgBox("Užívej si začátek produktivního věku.") 
     Case Is < 40 
         MsgBox("Užívej si produktivní věk.") 
     Case Is < 50 
         MsgBox("Užívej si nejlepší léta života.") 
     Case Is < 60 
         MsgBox("Užívej si poslední léta produktivního věku.") 
     Case Else 
         MsgBox("Užívej si důchod.") 
 End Select

je správně a bude fungovat. Stačí si představit, co se stane, pokud bude věk 34 let. První podmínka se nesplní. Druhá taky ne, třetí teky ne, až čtvrtá. A to je správně. Pokud napíšete podobnou strukturu a nebude fungovat, obvykle se vždy splní první podmínka. Musíte si představit nějakou hodnotu a sledovat, co se bude provádět.

To je protentokrát vše. V příštím díle budeme pokračovat a naučíme se cykly, které se používají k opakovanému provádění některých příkazů.


> Na začátek

 

Hodnocení:

Hlasů: 42
Zvolte své hodnocení

Tomáš Herceg

Jsem hlavním softwarovým architektem ve společnosti Riganti. Mám dlouholeté zkušenosti s technologiemi ASP.NET, Silverlight, WPF a XNA. Působím též jako lektor ve společnosti Gopas a již třetím rokem jsem držitelem ocenění Microsoft Most Valuable Professional.

Podpořte vznik dalších článků

Související články

DílNázev článku 
Díl 1. Úvod, vývojové prostředí a základní pojmy 25. 4. 2007
Díl 2. Začínáme programovat 25. 4. 2007
Díl 3. Proměnné a datové typy 25. 4. 2007
Díl 4. Podmínky a operátory 26. 4. 2007
Díl 5. Složitější podmínky a rozhodovací struktury 26. 4. 2007
Díl 6. Cyklus For 5. 5. 2007
Díl 7. Pole 9. 5. 2007
Díl 8. Pole, cykly a práce se soubory 14. 5. 2007
Díl 9. Přidáváme druhý formulář 18. 5. 2007
Díl 10. Funkce a procedury 6. 7. 2007
Díl 11. Kolekce a pole 27. 7. 2007
Díl 12. Práce s textem a řetězci 17. 8. 2007
Díl 13. Úvod do grafiky 27. 8. 2007
Díl 14. Vykreslujeme graf 31. 8. 2007
Díl 15. Práce se soubory, úvod do objektově orientovaného programování 19. 11. 2007
Díl 16. Třídy a funkce .NET frameworku, o kterých je dobré vědět 31. 12. 2007
Díl 17. Objektově orientované programování - základy 30. 6. 2008
Díl 18. Dědičnost 6. 10. 2008

RSS Feed RSS Feed

Diskuse

Label

Datum: 15.11.2007 12:23
Autor: neregistrovaný (85.132.158.238)
Hodnocení autora: není
Příspěvků: 0
Pane Herceg, jak zvetšit text v Label?
Děkuji za članky.
S pozdravem. Igo.
 
           [Odpovědět]
 
Hodnocení: -2 Čekejte, prosím...

Re: Label

Datum: 15.11.2007 15:41
Autor: Tomáš Herceg
Hodnocení autora: 1673
Příspěvků: 3536
Stačí se podívat na vlastnost Font dané komponenty a v tabulce si velikost a typ písma změnit dle libosti.
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

Dotaz

Datum: 17.11.2007 8:34
Autor: neregistrovaný (85.207.123.216)
Hodnocení autora: není
Příspěvků: 0


Jaktože když npíši podobný program jako je ten věk akorát že takto:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Select Case TextBox1.Text
            Case Is < 10
                MsgBox("Mládí")
            Case Is < 10
                MsgBox("Puberta a adolescence")
            Case Is < 30
                MsgBox("Ranná dospělost")
            Case Is < 40
                MsgBox("Dospělost")
            Case Is < 50
                MsgBox("Pozdní dospělost")
            Case Is < 60
                MsgBox("Stáři")
            Case Else
                MsgBox("Dobré, že chodíš na počítač")
        End Select
    End Sub

 
Tak když napíšu :2 tak mi to píše:Puberta a adolescence
:3tak:Ranná dospělost
A takto dál až do 6 a od 6 mi to píše: Dobré, že chodíš na počítač
 
           [Odpovědět]
 
Hodnocení: -3 Čekejte, prosím...

Re: Dotaz

Datum: 17.11.2007 11:38
Autor: Tomáš Herceg
Hodnocení autora: 1673
Příspěvků: 3536
TextBox1.Text je hodnota typu String. Visual Basic sám nepozná, jestli je v textovém poli číslo nebo text, myslí si vždy, že to je text. Proto když ho porovnáváte s číslem, Visual Basic převede číslo taky na text a porovnává podle abecedy.
Pokud chcete porovnávat jako číslo, musíte napsat:

Select Case CInt(TextBox1.Text)
 
Tím se textová hodnota převede na typ Integer, což je číslo. Porovnávání čísel pak bude fungovat bez problémů.
A ještě tam máte asi překlep, pro možnost Puberta a adolescence by to chtělo podmínku Case Is < 20, jestli se nemýlím.
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

Re: Dotaz

Datum: 3.9.2008 20:26
Autor: neregistrovaný (88.101.85.14)
Hodnocení autora: není
Příspěvků: 0
Já ty Case nemam moc rada. Rozumim spis Ifum. Tak sem to s tim vekem napsala pomoci ifu :-)


Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim vek As Integer = CInt(InputBox("Zadejte vas vek"))
        If vek < 10 Then
            MsgBox("Dite")
        ElseIf vek < 20 Then
            MsgBox("Ty pubosi")
        ElseIf vek < 30 Then
            MsgBox("Krasne mladi")
        ElseIf vek < 40 Then
            MsgBox("Dospelost")
        ElseIf vek < 50 Then
            MsgBox("Stari")
        ElseIf vek < 60 Then
            MsgBox("Velke stari")
        ElseIf vek < 70 Then
            MsgBox("Vetche stari")
        ElseIf vek < 80 Then
            MsgBox("Drzis se dobre")
        ElseIf vek < 90 Then
            MsgBox("Obdivuhodne")
        ElseIf vek < 100 Then
            MsgBox("Tak ted uz si mrtvej")
        Else
            MsgBox("Na hlavu?")
        End If
        Close()
    End Sub
End Class
 
 
           [Odpovědět]
 
Hodnocení: -6 Čekejte, prosím...

Re: Dotaz

Datum: 23.9.2009 21:02
Autor: neregistrovaný (83.208.168.231)
Hodnocení autora: není
Příspěvků: 0
To je sice pravda, ale jak již bylo zmíněno, toto je velice jednoduchý program a při tvorbě složitějších programů to už bude chtít ty case. Ušetří se tím místo a je to přehlednější. Takže doporučuji používat Case ;)
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Case a if

Datum: 7.11.2008 12:34
Autor: neregistrovaný (85.207.53.58)
Hodnocení autora: není
Příspěvků: 0
Jaký je rozdíl mezi Select Case... a IF s ELSEIF ?
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

Re: Case a if

Datum: 23.9.2009 21:06
Autor: neregistrovaný (83.208.168.231)
Hodnocení autora: není
Příspěvků: 0
To je různé, jde o to, co máte v Case ukryto. Může tam být ukryta funkce IF a něco k tomu. V podstatě je to to samé ale Case je kratší a přehlednější. Elseif slouží k rozšíření klasického Else (čili pokud IF neplatí). Nemusíte tak tvořit několikrát podmínku IF a EndIf na konci. Větev programu se tak nerozšíří a dle mého názoru je i toto přehlednější.
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

Změna velikosti písma v Label uživatelem

Datum: 5.9.2009 14:23
Autor: neregistrovaný (85.70.176.88)
Hodnocení autora: není
Příspěvků: 0
Ahoj, potřebovat bych menší radu, dělám takový prográmek, ve kterém je podmínka, a chtěl bych pokud je splněná, aby se zvětšila velikost písma v Label. Zkoušel jsem Label.Font.Size = 12 ale píše mi to, že Property 'Size' is 'ReadOnly'. Co mám dělat pro to, aby mi to šlo změnit.
Děkuju za radu a chytré návody.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Potize s Case is podminkou

Datum: 25.3.2011 14:57
Autor: Petr Křivka
Hodnocení autora: 0
Příspěvků: 1
Zdravim,
jsem kompletnim zacatecnikem v programovani. Dekuji za super stranky, jednoduche, prehledne, uzitecne! Chtel jsem pozadat o radu hledne podminky "Case Is". Zadal jsem si nasledujici podminku a listbox1 jsem prejmenoval na "vek". Problem je, ze at kliknu na jakoukoliv hodnotu v seznamu, tak se mi vzdy ukaze hlaska "Mladi".
V pripade, ze si vytvorim textbox a button, kde zadam "Select Case Cint(textbox1.text)" tak vse bezi ok.

Private Sub vek_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles vek.SelectedIndexChanged
Select Case vek.SelectedIndex
Case Is < 10
MsgBox("mladi")
Case Is < 20
MsgBox("puberta")
Case Is < 30
MsgBox("ranna dospelost")
Case Is < 40
MsgBox("pozdni dospelost")
Case Is < 50
MsgBox("stari")
Case Else
MsgBox("vrat se do hrobu")
End Select
End Sub
End Class

Diky za jakoukoliv radu.
Petr
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Potize s Case is podminkou

Datum: 7.4.2011 17:53
Autor: neregistrovaný (88.102.107.211)
Hodnocení autora: není
Příspěvků: 0
Podívej se na příklad programu "Pro cizince", tam je použité to co děláš.

Testuješ totiž hodnotu SelectedIndex a ta u listBoxu má pro první položku(řádek) hodnotu 0, pro druhou hodnotu 1, atd. To co je v položce(na řádku) uloženo netestuješ.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Makro pro tlačítko

Datum: 10.12.2011 22:07
Autor: neregistrovaný (89.24.4.161)
Hodnocení autora: není
Příspěvků: 0
Zdravím,
potřeboval bych poradit. Mám tabulku vyplněnou žáky a ke každému z nich patří průměr. Mám za úkol vytvořit tlačítko, a přidak k němu makro, které mi vyhodí Msg.Box kam zapíšu jméno žáka, pokud ho to najde v tabulce vypíše to jeho průměr a pokud ne, stačí vypsat jen žák neexistuje. S VBA jsem se setkal celkem 3x a absolutně nevím jak na tento úkol. Mohu poprosit o radu ? Díky
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...
 

VBNET.CZ | © 2007 Tomáš Herceg, Tomáš Jecha | Kopírování a přejímání jakéhokoliv obsahu z tohoto webu je bez písemného svolení autorů zakázáno.