|
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 ModuleDownload Visual Basic Broncode Bekijk deze Broncode in Visual C#
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 ModuleDownload Visual Basic Broncode Bekijk deze Broncode in Visual C#
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 ModuleDownload Visual Basic Broncode Bekijk deze Broncode in Visual C#
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
... ] *
[ Else
... ]
End IfWat 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))
End If
Console.ReadLine()
End Sub
End ModuleDownload Visual Basic Broncode Bekijk deze Broncode in Visual C#
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 SelectStel 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 ModuleDownload Visual Basic Broncode Bekijk deze Broncode in Visual C#
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 ModuleDownload Visual Basic Broncode Bekijk deze Broncode in Visual C#
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 ModuleDownload Visual Basic Broncode Bekijk deze Broncode in Visual C#
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 ModuleDownload Visual Basic Broncode Bekijk deze Broncode in Visual C#
Visual Basic Output Value ?
11
More than 10. Visual Basic Output Value ?
101
More than 100. Visual Basic Output Value ?
1001
More than 1000. Terug naar boven 2.5.2. OefeningOpgave :
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 ModuleDownload Visual Basic Broncode Bekijk deze Broncode in Visual C#
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
Berichten
|