homeboekenlinksledenabonneer je :Blijf op de hoogte door je te abonneren op de vbvoorbeelden RSS Niews Feed!Blijf op de hoogte door vbvoorbeelden te volgen op Twitter!Blijf op de hoogte door fan te worden van vbvoorbeelden op Facebook!
Visual Basic 2008 en 2010 Voorbeelden en Boeken Microsoft Visual Studio 2010Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

visual basic 2008 voorbeelden en boeken / visual basic 2010 voorbeelden en boeken

2.5. Uitbreiding Beslissingsstructuren

Print Email Deel op FacebookDeel op TwitterDeel op DiggBookmark op Google BookmarksDeel op del.icio.usOverige Sociale Netwerksites...

Dit artikel is gepubliceerd op woensdag 28 april 2010 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

Stel we wensen van een door de gebruiker ingevoerd getal op de console te brengen of het getal "Zero.", "Positive value." of "Negative value." is.
We hebben dus 3 situaties waarin het programma een verschillende actie moet ondernemen, namelijk een verschillende tekst op de console brengen. Zoals we reeds gezien hadden kunnen we aan de hand van een geneste selectie structuur dit gaan oplossen.
Visual Basic Broncode
Module Example1
    Sub Main()
        Console.WriteLine("Value ?")
        Dim value As Integer = Console.ReadLine()
        '
        If value = 0 Then
            Console.WriteLine("Zero.")
        Else
            If value > 0 Then
                Console.WriteLine("Positive value.")
            Else
                Console.WriteLine("Negative value.")
            End If
        End If
        '
        Console.ReadLine()
    End Sub
End Module
Visual Basic Output
Value ?
0
Zero.
Visual Basic Output
Value ?
5
Positive value.
Visual Basic Output
Value ?
-5
Negative value.
We kunnen echter ook 3 selecties in sequentie plaatsen.
Visual Basic Broncode
Module Example2
    Sub Main()
        Console.WriteLine("Value ?")
        Dim value As Integer = Console.ReadLine()
        '
        If value = 0 Then Console.WriteLine("Zero.")
        If value > 0 Then Console.WriteLine("Positive value.")
        If value < 0 Then Console.WriteLine("Negative value.")
        '
        Console.ReadLine()
    End Sub
End Module
Visual Basic Output
Value ?
0
Zero.
Visual Basic Output
Value ?
5
Positive value.
Visual Basic Output
Value ?
-5
Negative value.
We merken dus op dat als er geen Else gedeelte is opgenomen en dat je indien je slechts 1 instructie wil laten uitvoer als de voorwaarde correct is, je de volledige selectie structuur op 1 regel kunt plaatsen. Ook de afsluitende End If kan/moet hierbij dus worden weggelaten.

Deze 2e versie is echter iets minder efficiënt. In de eerste versie moeten in het slechtste geval ( getal is niet 0 ) twee voorwaarden worden geëvalueerd. Omdat in deze 2e versie de 3 If statements in sequentie op elkaar volgen, zullen ze in elke geval ( zowel beste als slechte geval ) alle 3 worden geëvalueerd.

Een ander variatie kan worden opgebouwd aan de hand van ElseIf.
Visual Basic Broncode
Module Example3
    Sub Main()
        Console.WriteLine("Value ?")
        Dim value As Integer = Console.ReadLine()
        '
        If value = 0 Then
            Console.WriteLine("Zero.")
        ElseIf value > 0 Then
            Console.WriteLine("Positive value.")
        Else
            Console.WriteLine("Negative value.")
        End If
        '
        Console.ReadLine()
    End Sub
End Module
Visual Basic Output
Value ?
0
Zero.
Visual Basic Output
Value ?
5
Positive value.
Visual Basic Output
Value ?
-5
Negative value.
Hier zie je het gebruik van het optionele ElseIf gedeelte, hierbij kan je een bijkomende voorwaarde definiëren. Deze bijkomende voorwaarde zal slechts geëvalueerd worden wanneer aan de conditie erboven niet was voldaan. Dus deze versie is even efficiënt als de eerste versie, in het slechtste geval worden dus ook twee voorwaarden geëvalueerd.

Het ElseIf gedeelte is optioneel, maar mag wel meerdere keren voorkomen. De instructies bij het Else gedeelte zullen bij dergelijke variant dus pas worden uitgevoerd wanneer aan geen enkele van de bovenstaande condities is voldaan.

De syntax van het If statement zou je dus als volgt kunnen beschrijven :
  If <condition> Then
     ...
[ ElseIf <other-condition> Then
     ... ] *                    ' optional, can be used more than once
[ Else
    ... ]                       ' optional, can be used once
  End If
Wat in syntax tussen vierkante haakjes wordt aangeduid is steeds optioneel.

Ondanks dat de eerste en derde versie even efficiënt zijn, zou de voorkeur toch kunnen uitgaan naar de eerste versie. Veronderstel bijvoorbeeld dat als het om een positief of negatief getal gaat, we nog eens het dubbele van dat getal wensen af te drukken, dan kunnen we dit oplossen door aan de eerste versie gewoon 1 regel toe te voegen.
Visual Basic Broncode
Module Example4
    Sub Main()
        Console.WriteLine("Value ?")
        Dim value As Integer = Console.ReadLine()
        '
        If value = 0 Then
            Console.WriteLine("Zero.")
        Else
            If value > 0 Then
                Console.WriteLine("Positive value.")
            Else
                Console.WriteLine("Negative value.")
            End If
            Console.WriteLine("Double : " & (value * 2))                 ' added
        End If
        '
        Console.ReadLine()
    End Sub
End Module
Visual Basic Output
Value ?
0
Zero.
Visual Basic Output
Value ?
5
Positive value.
Double : 10
Visual Basic Output
Value ?
-5
Negative value.
Double : -10
In versie 3 hadden we al op 2 plaatsen dergelijke regel moeten toevoegen. Meerdere identieke regels in een algoritme is vaak iets wat beter te vermijden valt, de onderhoudbaarheid van dergelijke code is minder goed. Stel je voor dat je in plaats van het dubbele de helft wenst, dan zou je op 2 plaatsen in de code een wijziging moeten aanbrengen.

2.5.1. Select Case ... End Select

Stel we wensen van een door de gebruiker ingevoerd getal op de console te drukken of het "One.", "Two.", "Three" of "Not one, two or three." is.
We kunnen dit oplossen door 3 If-structuren in mekaar te gaan nesten of door een ElseIf variatie van dergelijke If structuur te gebruiken.
Maar omdat we met zoveel situaties zitten kunnen we ook voor een alternatieve selectie structuur opteren, die meer leesbaarheid in de code garandeert :
Visual Basic Broncode
Module Example5
    Sub Main()
        Console.WriteLine("Value ?")
        Dim value As Integer = Console.ReadLine()
        '
        Select Case value
            Case 1
                Console.WriteLine("One.")
            Case 2
                Console.WriteLine("Two.")
            Case 3
                Console.WriteLine("Three.")
            Case Else
                Console.WriteLine("Not one, two or three.")
        End Select
        '
        Console.ReadLine()
    End Sub
End Module
Visual Basic Output
Value ?
1
One.
Visual Basic Output
Value ?
2
Two.
Visual Basic Output
Value ?
3
Three.
Visual Basic Output
Value ?
4
Not one, two or three.
De Select Case ... End Select structuur bekijkt een bepaalde iets, hier in ons voorbeeld bekijkt het de inhoud van value. Er worden dan 4 gevallen ( cases ) beschouwd, het geval dat value 1 is, het geval dat value 2 is, het geval dat value 3 is en het geval dat value niet 1, 2 of 3 is.

Er wordt in dit voorbeeld maar 1 instructie per geval uitgevoerd, maar men kan uiteraard ook meerdere instructies per geval gaan opgeven.

De structuur is even efficiënt als zijn If variatie. Stel dat het ingevoerde getal niet 1, 2 of 3 is ( worst case scenario ), dan zullen maximaal 3 condities geëvalueerd worden.
Dit zou hetzelfde zijn bij de If variatie, waar ook 3 condities in zouden zijn gedefinieerd.
Stel dat het ingevoerde getal 1 is ( best case scenario ) zou hier ook slechts 1 conditie ( value = 1 ) geëvalueerd worden, en daarna gaat het programma gewoon verder met de instructies na de Select Case ... End Select structuur.

Het Case Else gedeelte staat dus altijd als laatste gedefinieerd en bevat dus de statements die pas zullen worden uitgevoerd wanneer de te beschouwen expressie zich niet in 1 van de bovenvermelde gevallen bevindt.

Stel we wensen van een door de gebruiker ingevoerd getal op de console te drukken of het "One.", "Two, three or four.", "Number from 5 to 10." of "More than 10." is.
Visual Basic Broncode
Module Example6
    Sub Main()
        Console.WriteLine("Value ?")
        Dim value As Integer = Console.ReadLine()
        '
        Select Case value
            Case 1
                Console.WriteLine("One.")
            Case 2, 3, 4
                Console.WriteLine("Two, three or four.")
            Case 5 To 10
                Console.WriteLine("Value from 5 to 10.")
            Case Is > 10
                Console.WriteLine("More than 10.")
        End Select
        '
        Console.ReadLine()
    End Sub
End Module
Visual Basic Output
Value ?
1
One.
Visual Basic Output
Value ?
3
Two, three or four.
Visual Basic Output
Value ?
8
Value from 5 to 10.
Visual Basic Output
Value ?
12
More than 10.
Men kan dus een bereik opgeven door gewoon na Case een lijst van mogelijke waarden op te sommen ( gescheiden door een komma ), bijvoorbeeld Case 2, 3, 4, wat dus neerkomt op het geval dat number = 2 ofwel number = 3 ofwel number = 4.

Men kan ook een numeriek bereik opgeven door het laagste getal en het hoogste getal op te geven, bijvoorbeeld Case 5 To 10, wat dus neerkomt op het geval dat number = 5 ofwel number = 6 ofwel number = 7 ofwel number = 8 ofwel number = 9 ofwel number = 10. Dit kan uiteraard enkel gebruikt worden wanneer men een numerieke expressie beschouwt, wat hier het geval is want number is een Integer variabele en stelt dus een getal voor.

Men kan ook nog eens een meer algemene voorwaarde formuleren, bijvoorbeeld Case Is > 10, wat dus neerkomt op situaties waarin number groter is dan 10. Men plaatst na het keyword Is een vergelijkingsoperator gevolgd door de waarde waarmee men wil vergelijken. Dit geeft dus aan dat we Case 1 ook zouden kunnen vervangen door Case Is = 1.

In dit voorbeeld zien we ook dat we niet alle gevallen moeten behandelen, als hier bijvoorbeeld een negatief getal wordt ingevoerd, dan gebeurt er gewoon niets. Zou men toch alle gevallen willen behandelen dan zou men dit hier bijvoorbeeld weer kunnen doen door een Case Else gedeelte op te nemen.

Stel we wensen van een door de gebruiker ingevoerd getal op de console te drukken of het "More than 10.", "More than 100." of "More than 1000." is. Dan kunnen we dit als volgt kunnen proberen te formuleren :
Visual Basic Broncode
Module Example7
    Sub Main()
        Console.WriteLine("Value ?")
        Dim value As Integer = Console.ReadLine()
        '
        Select Case value
            Case Is > 10
                Console.WriteLine("More than 10.")
            Case Is > 100
                Console.WriteLine("More than 100.")
            Case Is > 1000
                Console.WriteLine("More than 1000.")
        End Select
        '
        Console.ReadLine()
    End Sub
End Module
Visual Basic Output
Value ?
11
More than 10.
Visual Basic Output
Value ?
101
More than 10.
Visual Basic Output
Value ?
1001
More than 10.
Dit programma functioneert correct wanneer we 11 invoeren, waarbij we de melding krijgen dat het "More than 10." is. Als we echter 101 invoeren krijgen we dezelfde melding.
Dit is niet zo vreemd want ook 101 is natuurlijk groter dan 10. Dus hier werd meteen een goed geval gevonden, werden de bijhorende statements uitgevoerd en is men verder gegaan na de Select Case ... End Select structuur. Maar uiteraard hadden we hier liever de melding gekregen "More than 100.".

Conclusie is dus dat je bij overlappende gevallen goed op de volgorde moet letten waarin je de gevallen definieert, we weten immers dat hetgeen dat je beschouwd zich maar maximaal in 1 gedefinieerd geval kan bevinden.

Een beter oplossing is het volgende.
Visual Basic Broncode
Module Example8
    Sub Main()
        Console.WriteLine("Value ?")
        Dim value As Integer = Console.ReadLine()
        '
        Select Case value
            Case Is > 1000
                Console.WriteLine("More than 1000.")
            Case Is > 100
                Console.WriteLine("More than 100.")
            Case Is > 10
                Console.WriteLine("More than 10.")
        End Select
        '
        Console.ReadLine()
    End Sub
End Module
Visual Basic Output
Value ?
11
More than 10.
Visual Basic Output
Value ?
101
More than 100.
Visual Basic Output
Value ?
1001
More than 1000.

2.5.2. Oefening

Opgave :

Maak een programma dat van een door de gebruiker ingevoerd getal op de console brengt of het getal "Less than -100.", "Less than -50.", "Number from -50 to -1.", "Zero.", "One or eleven.", "Number from 1 to 50.", "More than 50." of "More than 100." is.
Weest uiteraard zo precies mogelijk, 101 is bijvoorbeeld zowel "More than 100" als "More than 50.", maar hier zouden we uiteraard liefst "More than 100." als resultaat krijgen.
Visual Basic Output
Value ?
11
One or eleven.
Visual Basic Output
Value ?
101
More than 100.
Visual Basic Output
Value ?
-101
Less than -100.
Visual Basic Output
Value ?
51
More than 50.
Visual Basic Output
Value ?
0
Zero.
Oplossing :
Visual Basic Broncode
Module ExerciseSolution
    Sub Main()
        Console.WriteLine("Value ?")
        Dim value As Integer = Console.ReadLine()
        '
        Dim info As String
        Select Case value
            Case Is > 100
                info = "More than 100."
            Case Is > 50
                info = "More than 50."
            Case 1, 11
                info = "One or eleven."
            Case 2 To 50
                info = "Number from 1 to 50."
            Case 0
                info = "Zero."
            Case -50 To -1
                info = "Number from -50 to -1."
            Case Is < -100
                info = "Less than -100."
            Case Is < -50
                info = "Less than -50."
        End Select
        '
        Console.WriteLine(info)
        '
        Console.ReadLine()
    End Sub
End Module

Dit artikel is gepubliceerd op woensdag 28 april 2010 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

Visual Basic 2008 & 2010 Boeken

Het Groene Visual Basic 2008 & 2010 Voorbeelden Boek Het Blauwe Visual Basic 2008 & 2010 Voorbeelden Boek Het Rode Visual Basic 2008 & 2010 Voorbeelden Boek

Bevalt een artikel je, dan kan je de inhoud van vbvoorbeelden ook reclamevrij in boekvorm verkrijgen.

De inhoud is verdeeld over 3 boeken, Het Groene, Het Blauwe en Het Rode Visual Basic 2008 & 2010 Voorbeelden Boek.

Klik hier voor meer informatie.

Berichten

Fast UML Sequence Diagram Editor