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

5. díl - Složitější podmínky a rozhodovací struktury

Tomáš Herceg       26.04.2007       VB.NET       21255 zobrazení

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ů.

 

hodnocení článku

3 bodů / 3 hlasů       Hodnotit mohou jen registrované uživatelé.

 

Všechny díly tohoto seriálu

18. Dědičnost 06.10.2008
17. Objektově orientované programování - základy 30.06.2008
16. Třídy a funkce .NET frameworku, o kterých je dobré vědět 31.12.2007
15. Práce se soubory, úvod do objektově orientovaného programování 19.11.2007
14. Vykreslujeme graf 31.08.2007
13. Úvod do grafiky 27.08.2007
12. Práce s textem a řetězci 17.08.2007
11. Kolekce a pole 27.07.2007
10. Funkce a procedury 01.06.2007
9. Přidáváme druhý formulář 18.05.2007
8. Pole, cykly a práce se soubory 14.05.2007
7. Pole 09.05.2007
6. Cyklus For 05.05.2007
5. Složitější podmínky a rozhodovací struktury 26.04.2007
4. Podmínky a operátory 26.04.2007
3. Proměnné a datové typy 25.04.2007
2. Začínáme programovat 25.04.2007
1. Úvod, vývojové prostředí a základní pojmy 25.04.2007

 

Mohlo by vás také zajímat

Řešené příklady v ASP.NET - díl 3.: Aplikace pro zamlouvání sedadel (část 3)

V této části si ukážeme, jak vygenerovat a naplnit tabulku, a jak napsat komponentu, která má vlastní serverové události. Nakonec si ukážeme, jak aktualizovat jen část stránky pomocí komponenty UpdatePanel.

Windows Presentation Foundation (WPF) - díl 8.: Canvas, StackPanel, WrapPanel

Článek se věnuje dalším široce používaným pozicovacím komponentám WPF. Canvas pro absolutní pozicování, StackPanel pro skládání elementů vedle sebe nebo nad sebe a WrapPanel zalamující jejich tok do řádků nebo sloupců.

Práce s časovými pásmy a letním časem v aplikaci a databázi - díl 2.: DateTime v .NET Frameworku

Práce se strukturou DateTime v .NET Frameworku lze využívat pro práci s lokálním časem i časem v jiných časových pásmech. Tento díl se věnuje základnímu popisu a konverzím mezi lokálním a UTC časovým údajem.

 

 

Nový příspěvek

 

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

Předem chci poděkovat za opravdu perfektně udělané webové stránky. Zkusil jsem si taky napsat program s tím věkem a mám menší problém, že při zadávaní věku, když napíšu první číslo se mi hned odešle jako bych stiskl enter. Takže se nemůžu dostat na dvoucifernou odpověď. Může mi prosím někdo poradit kde dělám v následujícím programu chybu? Děkuji

Public Class Form1

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged

Select Case CInt(TextBox1.Text)

Case Is < 10

MsgBox("Mládí")

Case Is < 20

MsgBox("Puberta")

Case Is < 50

MsgBox("Dospělost")

Case Is < 60

MsgBox("Stáři")

Case Else

MsgBox("Důchod")

End Select

End Sub

End Class

nahlásit spamnahlásit spam 0 odpovědětodpovědět

je to tím "TextBox1_TextChanged" jakmile se změní obsah textboxu, provede se procedura...

V tomto případě bych asi aplikoval použití tlačítka a na něj navázal proceduru vyhodnocení podmínek...

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

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

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

nahlásit spamnahlásit spam 0 odpovědětodpovědět

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

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

nahlásit spamnahlásit spam 0 odpovědětodpovědět

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š.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

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

Jaký je rozdíl mezi Select Case... a IF s ELSEIF ?

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

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ší.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

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

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č

nahlásit spamnahlásit spam -4 / 4 odpovědětodpovědět

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.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

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

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

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 ;)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

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

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.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

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

Pane Herceg, jak zvetšit text v Label?

Děkuji za članky.

S pozdravem. Igo.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Stačí se podívat na vlastnost Font dané komponenty a v tabulce si velikost a typ písma změnit dle libosti.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback