|
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
2.7.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 2010 Broncode Module SelectCaseEndSelectExample1 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 SubEnd ModuleDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output Value ?
1
One. Console Application Output Value ?
2
Two. Console Application Output Value ?
3
Three. Console Application 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 2010 Broncode Module SelectCaseEndSelectExample2 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 SubEnd ModuleDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output Value ?
1
One. Console Application Output Value ?
3
Two, three or four. Console Application Output Value ?
8
Value from 5 to 10. Console Application 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 2010 Broncode Module SelectCaseEndSelectExample3 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 SubEnd ModuleDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output Value ?
11
More than 10. Console Application Output Value ?
101
More than 10. Console Application 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 2010 Broncode Module SelectCaseEndSelectExample4 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 SubEnd ModuleDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output Value ?
11
More than 10. Console Application Output Value ?
101
More than 100. Console Application Output Value ?
1001
More than 1000. boven
2.7.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. Console Application Output Value ?
11
One or eleven. Console Application Output Value ?
101
More than 100. Console Application Output Value ?
-101
Less than -100. Console Application Output Value ?
51
More than 50. Console Application Output Value ?
0
Zero. Oplossing : Visual Basic 2010 Broncode Module SelectCaseEndSelectExercise 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 SubEnd ModuleDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|