Visual Basic/Keuze-instructies

Uit Wikibooks

Visual Basic

Inhoudsopgave
  1. Inleiding taalelementen
  2. Variabelen
  3. Operatoren
  4. Typeconversie
  5. Keuze-instructies
  6. Herhalingsinstructies
  7. Random getallen
  8. Opmaak getallen
  9. De klasse Math
  10. Arrays
  11. De structuur van een programma

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 !!!"

Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.