Visual Basic/Keuze-instructies
Inleiding keuze-instructies
[bewerken]Een programma wordt altijd sequentieel doorlopen. Dat betekent dat de uitvoering van het programma begint met de eerste instructie, dan de tweede en vervolgens zo door totdat de laatste instructie is uitgevoerd en het programma wordt afgesloten.
In de praktijk is dit natuurlijk niet werkbaar. Vaak moeten we naar aanleiding van een bepaalde voorwaarde verder gaan op de andere plaats in het programma of een bepaald deel herhalen.
In het gewone leven maken we dagelijks gebruik van keuzes, bijvoorbeeld:
als het regent dan neem paraplu mee
of, uitgebreider
als het regent dan neem paraplu mee anders zet petje op
In de taal van Visual Basic wordt dit (met de sleutelwoorden vet gedrukt):
If het regent Then neem paraplu mee
If het regent Then neem paraplu mee Else zet petje op EndIf
De If-instructie kent nog andere vormen, maar die vormen worden apart behandeld.
Als er een keuze wordt gemaakt tussen veel voorwaarden, kan beter de Case-instructie gebruikt worden. Deze wordt behandeld na de If-instructie.
De If-instructie
[bewerken]De structuur van de If-instructie is:
If voorwaarde [ Then ] [ instructies ] [ ElseIf voorwaarde ] [ Then ] [ instructies ElseIf ] ] [ Else [ instructies Else ] ] End If
De eenvoudigste vorm van de If-instructie is:
If voorwaarde Then instructie1 ... instructieN End If
Voorwaarde is een logische expressie die de waarde True of False oplevert. Als de voorwaarde True is, worden de instructies tussen Then en End If uitgevoerd. Als de voorwaarde False is, wordt verder gegaan met de instructie na End If.
Als er tussen Then en End If slechts één instructie staat, kun je ook de volgende korte versie gebruiken:
If voorwaarde Then instructie
Of, verdeeld over drie regels:
If voorwaarde Then instructie End If
Zoals je ziet mag je, als alles op één regel staat, End If weglaten,maar het wordt aangeraden om de tweede vorm te gebruiken omdat dit duidelijker is. De structuur is zo veel beter zichtbaar. Dus beter is om ook in deze situaties End If te gebruiken m duidelijk aan te geven waar de If-instructie eindigt.
Voorwaarden (logische uitdrukkingen)
[bewerken]Voorwaarden zijn logische expressies die resulteren in een waarde die True of False kan zijn. Voorwaarden kunnen enkelvoudig of samengesteld zijn.
Een voorbeeld van een eenvoudige voorwaarde:
If leeftijd >= 18 Then
Deze voorwaarde is True als de betreffende persoon meerderjarig is.
Om bijvoorbeeld meerderjarige mannen te selecteren kan de volgende (samengestelde) voorwaarde gebruikt worden:
If (leeftijd >= 18) And (geslacht = "M") Then
Een samengestelde voorwaarde bestaat dus uit meerdere enkelvoudige voorwaarden (voor de duidelijkheid liefst tussen haakjes) en de logische operator And, Or of Xor.
Logische expressies
[bewerken]De voorwaarde in een If-instructie heeft de vorm:
operand1 relationele operator operand2
Hierbij kan operand de naam van een variabele zijn, een getal, een string of iets anders dat je wilt vergelijken. Het kan ook de naam van een functie zijn die een bepaalde waarde teruggeeft. Een operand kan ook een voorwaarde zijn (zie hieronder bij samengestelde voorwaarden). Het reultaat van de voorwaarde moet altijd True of False zijn of tot True en False herleidbaar.
Er zijn de volgende operatoren:
Operator | Betekenis |
---|---|
= | is gelijk aan |
<> | is niet gelijk aan |
< | is kleiner dan |
> | is groter dan |
<= | is kleiner dan of gelijk aan |
>= | is groter dan of gelijk aan |
Enkele voorbeelden met a = 3 en b = 5:
Logische uitdrukking | Resultaat |
---|---|
a > b | False |
2 * a > b | True |
"Jan" < "Piet" | True |
Enkelvoudige voorwaarden
[bewerken]Wat hierboven gedemonstreerd is, zijn enkelvoudige voorwaarden. Je vergelijkt een bepaalde waarde met een andere.
Iedere enkelvoudige voorwaarde heeft de vorm:
operand1 relationele operator operand2
Het is soms nodig om meerdere enkelvoudige voorwaarden te combineren. Dit noemen we een samengestelde voorwaarde.
Samengestelde voorwaarden
[bewerken]Een samengestelde voorwaarde bestaat uit meerdere enkelvoudige voorwaarden die gecombineerd worden met logische operatoren. Er zijn drie vormen:
enkelvoudige voorwaarde logische operator enkelvoudige voorwaarde
enkelvoudige voorwaarde logische operator operand
operand logische operator enkelvoudige voorwaarde
Waar enkelvoudige voorwaarde staat mag ook een samengestelde voorwaarde voorkomen, waardoor er ingewikkelde constructies kunnen ontstaan. Daarom is het goed om samengestelde voorwaarden te voorzien van commentaar, waarin precies wordt uitgelegd wat op welke manier wordt vergeleken. Bij het later aanpassen van een programma is zo'n commentaar vaak van onschatbare waarde.
Er zijn de volgende logische operatoren:
Not | De waarde van de voorwaarde wordt omgekeerd |
And | Logische And tussen twee voorwaarden |
Or | Logische Or tussen twee voorwaarden |
Xor | Logische Xor tussen twee voorwaarden |
AndAlso | Logische And, maar de tweede wordt alleen geëvalueerd als de eerste True oplevert |
OrElse | Logische Or, maar de tweede wordt alleen geëvalueerd als de eerste False oplevert |
Voorbeelden van samengestelde voorwaarden:
(leeftijd >= 18) And (geslacht = "V") (nederlands >= 6) And (Engels >= 6) Not subsidieToegekend (inkomen > 20000) Or (subsidieToegekend)
In de laatste twee voorbeelden is subsidieToegekend een boolean variabele die de waarde True of False kan hebben.
Onderstaande tabel verduidelijkt het gebruik van de logische operatoren:
voorwaarde1 | voorwaarde2 | vwd1 And vwd2 | vwd1 Or vwd2 | vwd1 Xor vwd2 |
---|---|---|---|---|
True | True | True | True | False |
True | False | False | True | True |
False | True | False | True | True |
False | False | False | False | False |
De operator Not keert de waarde van de voorwaarde om: True wordt False en False wordt True.
De If-Else-instructie
[bewerken]Vaak is het zo dat er afhankelijk van de keuze twee mogelijkheden zijn, b.v.:
Als het regent dan neem paraplu mee Anders zet pet op
In Visual Basic gebeurt dit als volgt:
If geslacht = "M" Then aanhef = "Dhr." Else aanhef = "Mevr." End If
De algemene vorm is:
If voorwaarde Then instructies voor True Else instructies voor False End If
Een instructie in de Then- of Else-tak kan ook weer bestaan uit een If- of If-Else-instructie. Als je deze constructie gebruikt, moet je er goed op letten dat de IF en End If die bij elkaar horen ook even ver zijn ingesprongen. Dit verhoogt de leesbaarheid van het programma.
Voorbeelden If-instructie
[bewerken]In onderstaand voorbeeld bevat de variabele geslacht de tekst "M" of "V" en de variabele naam de naam van een persoon. Afhankelijk van het geslacht moet de juiste aanspreekvorm gekozen worden.
Dim titel As String = "" If geslacht = "M" Then titel = "De Heer " + naam Else titel = "Mevrouw " + naam End If
Stel dat geslacht ook leeg kan zijn of een andere waarde kan bevatten. In dat geval kan onderstaande geneste IF-instructie gebruikt worden:
Dim titel As String = "" If geslacht = "M" Then titel = "De Heer " + naam Else If geslacht = "V" Then titel = "Mevrouw " + naam Else titel = "Dhr./Mevr. " + naam End If End If
AndAlso en OrElse
[bewerken]Deze logische operatoren komen nauwelijks voor.
Het formaat is:
voorwaarde1 AndAlso voorwaarde2 voorwaarde2 AndAlso voorwaarde2
Bij AndAlso wordt de tweede voorwaarde alleen geëvalueerd als de eerste True is. Bij OrElse wordt de tweede voorwaarde alleen geëvalueerd als de eerste voorwaarde False is.
Er is één situatie waarbij deze constructie gebruikt moet worden: als de tweede voorwaarde een functie is die alleen moet worden uitgevoerd als de eerste voorwaarde True resp. False is. Deze situatie zul je dus heel weinig zien en kan meestal ook op een andere manier worden opgelost, b.v. in het geval van AndAlso:
If voorwaarde1 Then If functieaanroep Then ' beide zijn True End If End If
De Case-instructie
[bewerken]De structuur van de Case-instructie is:
Select [ Case ] testexpressie [ Case expressielijst [ instructies ] [ Case Else [ Else-instructies ] ] End Select
Soms heb je een hele serie If-instructies nodig, b.v. om cijfers om te zetten naar teksten, b.v.:
If cijfer = 1 Then uitvoer = "een" End If If cijfer = "2" Then uitvoer = "twee" Enf If ... If cijfer = "9" Then uitvoer = "negen" EndIf
Voor zo'n reeks instructies kun je ook een Case-instructie gebruiken. Het formaat hiervan is:
Select Case expressie Case expressie-1 instructies-1 Case expressie-2 instructies-2 ... Case expressie-n instructies-n [ Case Else Else-instructies ] End Select
Er wordt van boven naar beneden gewerkt. Zodra het programma een Case tegenkomt waarvan expressie True is, worden de bijbehorende instructies tot aan de volgende Case-instructie uitgevoerd. Vervolgens wordt verder gegaan met de instructies volgend op End Select.
Case Else levert altijd True op. Dat betekent dat de instructies erna worden uitgevoerd als geen enkele expressie True oplevert.
Als Case Else niet gebruikt wordt en alle expressies False opleveren, wordt geen enkele instructie uitgevoerd en wordt verder gegaan met de instructie volgend op End Select.
Bovenstaand voorbeeld met If-instructies kan als volgt omgezet met Select Case:
Select Case cijfer Case 1 uitvoer = "een" Case 2 uitvoer = "twee" ... Case 9 uitvoer = "negen' End Select
Zoals je ziet is dit veel compacter en leesbaarder dan met If-instructies,.
Bij expressie kun je ook een bereik opgeven, bijvoorbeeld:
Case 1 To 4 uitvoer = "een t/m vier"
Ook kun je meerdere waardes opgeven gescheiden door komma's, bijvoorbeeld:
Case 2, 4, 6, 8 uitvoer = "even"
De expressie achter Select Case moet een resultaat leveren van het type Boolean, Byte, Char, Date, Double, Decimal, Integer, Long, Object, SByte, Short, Single, String, UInteger of UShort. Gebroken getallen zoals Float zijn dus niet toegestaan.
Voorbeelden Case-instructie
[bewerken]We gaan een console-toepassing maken dat aan de hand van het nummer van de maand en het jaartal het aantal dagen in die maand geeft.
Start Visual Basic en start een nieuw project. Noem het console03. Je krijgt dan het volgende raamwerk te zien.
Moldule Module1 Sub Main() End Sub End Module
De gebruiker wordt gevraagd naar een maand en een jaar. Daarna berekent het programma het aantal dagen in de opgegeven maand en jaar. Het jaartal is nodig om rekening te houden met schrikkeljaren. Dit voorbeeld is heel eenvoudig gehouden: als het jaartal deelbaar is door 4, is het een schrikkeljaar.
Wijzig het raamwerk zodat het als volgt uitziet:
Module Module1 Sub Main() Dim maandnr, jaarnr As Integer Dim aantalDagen, invoer, uitvoer As String Console.WriteLine("Dit is programma console03") Console.WriteLine("Het programma vraagt om een maandnummer en jaartal") Console.WriteLine("en toont het aantal dagen in de betreffende maand") Console.WriteLine() Console.Write("Wat is het nummer van de maand (1-12): ") invoer = Console.ReadLine() maandnr = CInt(invoer) Console.Write("Wat is het jaartal: ") invoer = Console.ReadLine() jaarnr = CInt(invoer) Select Case maandnr Case 1, 3, 5, 7, 8, 10, 12 aantalDagen = "31" Case 2 If (jaarnr Mod 4) = 0 Then aantalDagen = "29" Else aantalDagen = "28" End If Case 4, 6, 9, 11 aantalDagen = "30" End Select uitvoer = "Het aantal dagen in maand nummer " & maandnr.ToString & " bedraagt " & aantalDagen Console.WriteLine(uitvoer) Console.ReadLine() End Sub End Module
Afhankelijk van het maandnummer wordt het aantal dagen op 30 of 31 gezet, met uitzondering van februari (maand 2). Daar wordt eerst gekeken of het een schrikkeljaar is (jaarnr Mod 4 is dan gelijk aan 0). Afhankelijk van de uitkomst wordt het aantal dagen op 28 of 29 bepaald.
Als je als maandnummer 13 opgeeft, zie je geen aantal dagen. Dat komt omdat geen enkele Case-conditie True is, waardoor geen enkele instructie wordt uitgevoerd en de variabele aantalDagen leeg blijft.
In een "echt" programma moet je natuurlijk eerst testen of het maandnummer numeriek is en in het bereik 1 t/m 12 ligt en dat het jaartal 1 t/m b.v. 2100 is.
Het maandnummer kun je gemakkelijk controleren. Pas het programma zodanig aan dat het gelijk is aan onderstaand programma:
Module Module1 Sub Main() Dim maandnr, jaarnr As Integer Dim aantalDagen, invoer, uitvoer As String Console.WriteLine("Dit is programma console03") Console.WriteLine("Het programma vraagt om een maandnummer en jaartal") Console.WriteLine("en toont het aantal dagen in de betreffende maand") Console.WriteLine() Console.Write("Wat is het nummer van de maand (1-12): ") invoer = Console.ReadLine() maandnr = CInt(invoer) Console.Write("Wat is het jaartal: ") invoer = Console.ReadLine() jaarnr = CInt(invoer) uitvoer = "Het aantal dagen in naamd nummer " & maandnr.ToString & " bedraagt " Select Case maandnr Case 1, 3, 5, 7, 8, 10, 12 uitvoer = uitvoer & "31" Case 2 If (jaarnr Mod 4) = 0 Then uitvoer = uitvoer & "29" Else uitvoer = uitvoer & "28" End If Case 4, 6, 9, 11 uitvoer = uitvoer & "30" Case Else uitvoer = "Fout: het maandnummer klopt niet !!!" End Select Console.WriteLine(uitvoer) Console.ReadLine() End Sub End Module
Nu wordt de variabele uitvoer eerst gevuld met de vaste tekst en in de Case-instructie aangevuld met het juiste aantal dagen. Als het aantal dagen niet klopt, wordt in de End Select de variabele uitvoer overschreven met de tekst "Fout: het maandnummer klopt niet !!!"