Visual Basic 2012 Voorbeelden
   

visual basic 2012 broncode voorbeelden

Blijf op de hoogte van de recente aanpassingen op vbvoorbeelden!

Microsoft Visual Studio 2012Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

7.1. Inleiding Arrays

Print Email Deel op Twitter Deel op Facebook

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

Veronderstel we wensen in een programma 3 getallen door de gebruiker te laten invoeren.  Als resultaat wensen we de ingevoerde getallen samen met de som op de console te brengen.

Dus bijvoorbeeld als programmaverloop :
Console Application Output
Value  1 ?
10
Value  2 ?
20
Value  3 ?
30
10 + 20 + 30 = 60
Onderstaand voorbeeld zou aan deze vereisten voldoen.
Visual Basic 2012 Broncode - Codevoorbeeld 99
Module Example1
    Sub Main()
        Dim value1, value2, value3 As Integer
        Dim sum As Integer
        '
        Console.WriteLine("Value  1 ?")
        value1 = Console.ReadLine()
        sum += value1
        '
        Console.WriteLine("Value  2 ?")
        value2 = Console.ReadLine()
        sum += value2
        '
        Console.WriteLine("Value  3 ?")
        value3 = Console.ReadLine()
        sum += value3
        '
        Console.Write(value1)
        '
        Console.Write(" + ")
        Console.Write(value2)
        '
        Console.Write(" + ")
        Console.Write(value3)
        '
        Console.Write(" = ")
        Console.Write(sum)
        '
        Console.ReadLine()
    End Sub
End Module
Bovenstaande oplossing functioneert naar de veronderstelde opdracht.

7.1.1. Wat zijn Arrays

Een alternatieve werkwijze voor het bekomen van hetzelfde resultaat als in vorig voorbeeld zou gebruik kunnen maken van een "array" ("tabel").

Een array is een verzameling van elementen van hetzelfde datatype.  Dus bijvoorbeeld een verzameling van Integer elementen.
Visual Basic 2012 Broncode - Codevoorbeeld 100
Module Example2
    Sub Main()
        Dim values(2) As Integer
        Dim sum As Integer
        '
        Console.WriteLine("Value  1 ?")
        values(0) = Console.ReadLine()
        sum += values(0)
        '
        Console.WriteLine("Value  2 ?")
        values(1) = Console.ReadLine()
        sum += values(1)
        '
        Console.WriteLine("Value  3 ?")
        values(2) = Console.ReadLine()
        sum += values(2)
        '
        Console.Write(values(0))
        '
        Console.Write(" + ")
        Console.Write(values(1))
        '
        Console.Write(" + ")
        Console.Write(values(2))
        '
        Console.Write(" = ")
        Console.Write(sum)
        '
        Console.ReadLine()
    End Sub
End Module
Console Application Output
Value  1 ?
10
Value  2 ?
20
Value  2 ?
30
10 + 20 + 30 = 60
Aan elk element van de array is een index gekoppeld.  Alle elementen zijn dus te benaderen via een index.  De indexering van die elementen is steeds "zero-based".  De laagste index, of index van het eerste element is dus altijd 0.  Het tweede element heeft dan als index 1, het derde element als index 2, enzovoort ... .
De laagste index wordt ook wel "lowerbound" genoemd.  De hoogste index (ook wel "upperbound" genoemd) is dus steeds gelijk aan het aantal elementen verminderd met 1.  Bij een array met 10 elementen bijvoorbeeld zal dus de upperbound of hoogste index 9 zijn.

Men kan verwijzen naar een element van een array door na de identifier van de arrayvariabele - tussen de haakjes - de index van het element te vermelden.  values(2) wijst dus bijvoorbeeld naar het derde element.
De index moet geformuleerd worden aan de hand van een Integer expressie.
In bovenstaand voorbeeld zijn dit literals, maar dit kan in eender welke Integer vorm gebeuren, zoals bijvoorbeeld aan de hand van variabelen (zie volgend voorbeeld).

Vooraleer we in bovenstaand voorbeeld de array gebruiken, wordt deze gedeclareerd.  Dit kan als volgt gebeuren :
Dim <identifier>(<upperbound>) <type-specifier>
Bovenstaande array declaratie Dim values(2) As Integer kan ook als Dim values(0 To 2) As Integer geformuleerd worden.  Deze laatste heeft duidelijk aan wat de lower- en upperbound (en dus het indexbereik) is voor deze array.
Nogmaals de lowerbound is hier altijd 0 en kan niet worden aangepast.

De elementen van de array worden in het geheugen naast elkaar bewaard.
Voor een array met 3 Integer elementen zal ruwweg evenveel geheugen vereist zijn als voor, als voor 3 aparte Integer variabelen.

Het gebruik van arrays heeft enkele voordelen ten aanzien van het gebruik van "statisch gedefinieerde" variabelen.

Eén voordeel bestaat erin dat men de elementen op een dynamische wijze kan adresseren.  Dit kan bijvoorbeeld door via een Integer expressie, bijvoorbeeld een Integer variabele - die at runtime kan wijzigen -, naar de index van het element te verwijzen.
Dit kan bijvoorbeeld bruikbaar zijn om in een iteratie een gelijkaardige actie toe te passen op alle (of een aantal) elementen van de array.

Hier wensen we alle elementen op te vullen met de invoer van de gebruiker, en alle elementen waarden bij de som op te tellen.
Visual Basic 2012 Broncode - Codevoorbeeld 101
Module Example3
    Sub Main()
        Dim values(2) As Integer
        Dim sum As Integer
        '
        Dim index As Integer
        For index = 0 To 2
            Console.WriteLine("Value  " & index + 1 & " ?")
            values(index) = Console.ReadLine()
            sum += values(index)
        Next
        '
        Console.Write(values(0))
        For index = 1 To 2
            Console.Write(" + ")
            Console.Write(values(index))
        Next
        Console.Write(" = ")
        Console.Write(sum)
        '
        Console.ReadLine()
    End Sub
End Module
Console Application Output
Value  1 ?
10
Value  2 ?
20
Value  2 ?
30
10 + 20 + 30 = 60
Een For ... Next iteratiestructuur is ideaal om dergelijke elementaire acties op iteratieve wijze op de elementen van een array uit te voeren.
Men beschikt bij die For ... Next immers altijd over een teller variabele die over een bepaald numeriek bereik loopt, en de "body" van de lus zal dan voor elke waarde die die tellervariabele aanneemt worden uitgevoerd.  Als je nu de tellervariabele laat lopen over het index-bereik van die array, dus van de lowerbound (steeds 0) tot de upperbound (steeds aantal elementen - 1) dan kun je zo, door de teller variabele als index waarde te gebruiken, alle elementen van die array benaderen.

Een ander voordeel van het gebruik van arrays bestaat erin dat de grootte ( het aantal elementen) van de array at runtime kan worden ingesteld.

Men kan dit bekomen door een variabele te gebruiken als upperbound in de declaratie van de array.
Visual Basic 2012 Broncode - Codevoorbeeld 102
Module Example4
    Sub Main()
        Console.WriteLine("Count ?")
        Dim count As Integer = Console.ReadLine()
        '
        Dim values(count - 1) As Integer
        Dim sum As Integer
        '
        Dim index As Integer
        For index = 0 To count - 1
            Console.WriteLine("Value  " & index + 1 & " ?")
            values(index) = Console.ReadLine()
            sum += values(index)
        Next
        '
        Console.Write(values(0))
        For index = 1 To count - 1
            Console.Write(" + ")
            Console.Write(values(index))
        Next
        Console.Write(" = ")
        Console.Write(sum)
        '
        Console.ReadLine()
    End Sub
End Module
Console Application Output
Value  1 ?
10
Value  2 ?
20
Value  2 ?
30
10 + 20 + 30 = 60
Bemerk ook hoe de eindwaarde van de tellervariabele in de For ... Next iteratiestructuur verwijst naar het aantal elementen min 1.

Naast het instellen van het aantal elementen at runtime, is het ook mogelijk het aantal elementen te doen toe- of afnemen at runtime (zie volgend topic).

Onderstaand voorbeeld illustreert nog 2 aspecten :
- alle elementen bevatten na het aanmaken van de array steeds de default waarde van het datatype (vermeld in de As clausule van de arraydeclaratie) van de elementen (regel (1) en (2))
- men kan geen element aanspreken op een onbestaande index (regel (3)), doet men dit toch dan wordt een uitvoeringsfout veroorzaakt
Visual Basic 2012 Broncode - Codevoorbeeld 103
Module Example5
    Sub Main()
        Dim values(4) As Integer
        Dim conditions(4) As Boolean
        '
        Dim index As Integer
        For index = 0 To 4
            Console.WriteLine(values(index))                               ' (1)
            Console.WriteLine(conditions(index))                           ' (2)
        Next
        '
        'values(5) = 5                   ' runtime error, no element at index 5
        '
        Console.ReadLine()
    End Sub
End Module
Console Application Output
0
False
0
False
0
False
0
False
0
False
Een uitvoeringsfout (ook wel runtimefout of exception genoemd) wordt niet opgemerkt door de compiler (is dus geen compileerfout), maar komt pas tijdens het uitvoeren naar voren.

7.1.2. Oefeningen

Opgave :

Maak een programma dat een array van 5 elementen opvult met door de gebruiker ingevoerde getallen.

Breng nu de inhoud van de tabel in omgekeerde volgorde op de console.
Console Application Output
Value 1 : 6
Value 2 : 2
Value 3 : 5
Value 4 : 4
Value 5 : 9
Element 5 (at index 4) : 9
Element 4 (at index 3) : 4
Element 3 (at index 2) : 5
Element 2 (at index 1) : 2
Element 1 (at index 0) : 6
Oplossing :
Visual Basic 2012 Broncode - Codevoorbeeld 104
Module Exercise1Solution
    Sub Main()
        Dim count As Integer = 5
        Dim upperbound As Integer = count - 1
        '
        Dim values(upperbound) As Integer
        '
        Dim index As Integer
        For index = 0 To upperbound
            Console.Write("Value " & (index + 1) & " : ")
            values(index) = Console.ReadLine()
        Next
        '
        For index = upperbound To 0 Step -1
            Console.WriteLine("Element " & (index + 1) & _
                              " (at index " & (index) & ") : " & _
                              values(index))
        Next
        '
        Console.ReadLine()
    End Sub
End Module
Opgave :
Maak een programma dat eerst aan de gebruiker vraagt hoeveel getallen hij wenst in te voeren.  Na de invoer van deze getallen brengt het programma de grootst ingevoerde waarde (samen met zijn positie in de tabel) op de console.

Let op : indien alle ingevoerde getallen negatief zouden zijn, mag niet op het scherm komen dat 0 de grootst ingevoerde waarde is.
Console Application Output
Count : 3
Value  1 : -8
Value  2 : -2
Value  3 : -3
Highest Value  : -2 (element 2 at index 1)
Oplossing :
Visual Basic 2012 Broncode - Codevoorbeeld 105
Module Exercise2Solution
    Sub Main()
        Console.Write("Count : ")
        Dim count As Integer = Console.ReadLine()
        Dim upperbound As Integer = count - 1
        '
        Dim values(upperbound) As Integer
        Dim index, highestValueIndex As Integer
        '
        For index = 0 To upperbound
            Console.Write("Value  " & (index + 1) & " : ")
            values(index) = Console.ReadLine()
            If values(highestValueIndex) < values(index) Then
                highestValueIndex = index
            End If
        Next
        '
        Console.WriteLine("Highest Value  : " & values(highestValueIndex) & _
                          " (element " & (highestValueIndex + 1) & _
                          " at index " & highestValueIndex & ")")
        '
        Console.ReadLine()
    End Sub
End Module
Opgave :
Maak een programma dat een array van 10 elementen opvult met de waarden 10 tot en met 1 :
index     0   1   2   3   4   5   6   7   8   9
value     10  9   8   7   6   5   4   3   2   1
Doe dit door naast de arrayvariabele slechts 1 overige variabele te declareren.

Breng ter controle de elementen 1 voor 1 op de console.
Console Application Output
element 1 (index 0) : 10
element 2 (index 1) : 9
element 3 (index 2) : 8
element 4 (index 3) : 7
element 5 (index 4) : 6
element 6 (index 5) : 5
element 7 (index 6) : 4
element 8 (index 7) : 3
element 9 (index 8) : 2
element 10 (index 9) : 1
Oplossing :
Visual Basic 2012 Broncode - Codevoorbeeld 106
Module Exercise3Solution
    Sub Main()
        Dim values(9) As Integer
        '
        Dim index As Integer
        For index = 0 To 9
            values(index) = 10 - index
            Console.WriteLine("element " & (index + 1) & _
                              " (index " & index & ") : " & _
                              values(index))
        Next
        '
        Console.ReadLine()
    End Sub
End Module
Opgave :
Maak een programma dat een array van 10 elementen opvult met de waarden 1 tot en met 10 :
index     0   1   2   3   4   5   6   7   8   9
value     1   2   3   4   5   6   7   8   9   10
Breng deze getallen 1 voor 1 op de console.

VERWISSEL nu de inhoud van de elementen naar onderstaand schema :
( let op : verwisselen en dus niet opnieuw genereren)
index     0   1   2   3   4   5   6   7   8   9
value     10  9   8   7   6   5   4   3   2   1
Breng nu ter controle ook deze elementen 1 voor 1 op de console.
Console Application Output
element 1 (index 0) : 1
element 2 (index 1) : 2
element 3 (index 2) : 3
element 4 (index 3) : 4
element 5 (index 4) : 5
element 6 (index 5) : 6
element 7 (index 6) : 7
element 8 (index 7) : 8
element 9 (index 8) : 9
element 10 (index 9) : 10

element 1 (index 0) : 10
element 2 (index 1) : 9
element 3 (index 2) : 8
element 4 (index 3) : 7
element 5 (index 4) : 6
element 6 (index 5) : 5
element 7 (index 6) : 4
element 8 (index 7) : 3
element 9 (index 8) : 2
element 10 (index 9) : 1
Oplossing :
Visual Basic 2012 Broncode - Codevoorbeeld 107
Module Exercise4Solution
    Sub Main()
        Dim count As Integer = 10
        Dim upperbound As Integer = count - 1
        Dim values(upperbound) As Integer
        Dim index As Integer
        '
        For index = 0 To upperbound
            values(index) = index + 1
        Next
        '
        For index = 0 To upperbound
            Console.WriteLine("element " & (index + 1) & _
                              " (index " & index & ") : " & _
                              values(index))
        Next
        Console.WriteLine()
        '
        Dim backup As Integer
        For index = 0 To (count \ 2) - 1
            backup = values(index)
            values(index) = values(upperbound - index)
            values(upperbound - index) = backup
        Next
        '
        For index = 0 To upperbound
            Console.WriteLine("element " & (index + 1) & _
                              " (index " & index & ") : " & _
                              values(index))
        Next
        '
        Console.ReadLine()
    End Sub
End Module
Opgave :
Maak een programma dat een array van 10 elementen opvult met de waarden 1 tot en met 10 :
index     0   1   2   3   4   5   6   7   8   9
value     1   2   3   4   5   6   7   8   9   10
Breng deze getallen 1 voor 1 op de console.

VERSCHUIF nu de inhoud van de elementen naar onderstaand schema :
( let op : verschuiven en dus niet opnieuw genereren)
index     0   1   2   3   4   5   6   7   8   9
value     2   3   4   5   6   7   8   9   10  1
Breng nu ter controle ook deze elementen 1 voor 1 op de console.
Console Application Output
element 1 (index 0) : 1
element 2 (index 1) : 2
element 3 (index 2) : 3
element 4 (index 3) : 4
element 5 (index 4) : 5
element 6 (index 5) : 6
element 7 (index 6) : 7
element 8 (index 7) : 8
element 9 (index 8) : 9
element 10 (index 9) : 10

element 1 (index 0) : 2
element 2 (index 1) : 3
element 3 (index 2) : 4
element 4 (index 3) : 5
element 5 (index 4) : 6
element 6 (index 5) : 7
element 7 (index 6) : 8
element 8 (index 7) : 9
element 9 (index 8) : 10
element 10 (index 9) : 1
Oplossing :
Visual Basic 2012 Broncode - Codevoorbeeld 108
Module Exercise5Solution
    Sub Main()
        Dim count As Integer = 10
        Dim upperbound As Integer = count - 1
        Dim values(upperbound) As Integer
        Dim index As Integer
        '
        For index = 0 To upperbound
            values(index) = index + 1
        Next
        '
        For index = 0 To upperbound
            Console.WriteLine("element " & (index + 1) & _
                              " (index " & index & ") : " & _
                              values(index))
        Next
        Console.WriteLine()
        '
        Dim backup As Integer = values(0)
        For index = 0 To (upperbound - 1)
            values(index) = values(index + 1)
        Next
        values(upperbound) = backup
        '
        For index = 0 To upperbound
            Console.WriteLine("element " & (index + 1) & _
                              " (index " & index & ") : " & _
                              values(index))
        Next
        '
        Console.ReadLine()
    End Sub
End Module
Opgave :
Maak een programma dat een array van 10 elementen opvult met de waarden 1 tot en met 10 :
array 1 :
index     0   1   2   3   4   5   6   7   8   9
value     1   2   3   4   5   6   7   8   9   10
Breng deze getallen 1 voor 1 op de console.

Maak een 2e array met de waarden 10 tot en met 1 :
array 2 :
index     0   1   2   3   4   5   6   7   8   9
value     10  9   8   7   6   5   4   3   2   1
Breng ook deze getallen 1 voor 1 op de console.

Breng nu ten slotte de grootste waarde (van de elementen op de zelfde index van de eerste arrays) over naar een derde array van dus ook 10 elementen :
array 3 :
index     0   1   2   3   4   5   6   7   8   9
value     10  9   8   7   6   6   7   8   9   10
Breng nu ter controle ook deze elementen 1 voor 1 op de console.
Console Application Output
Array 1 :
element 1 (index 0) : 1
element 2 (index 1) : 2
element 3 (index 2) : 3
element 4 (index 3) : 4
element 5 (index 4) : 5
element 6 (index 5) : 6
element 7 (index 6) : 7
element 8 (index 7) : 8
element 9 (index 8) : 9
element 10 (index 9) : 10

Array 2 :
element 1 (index 0) : 10
element 2 (index 1) : 9
element 3 (index 2) : 8
element 4 (index 3) : 7
element 5 (index 4) : 6
element 6 (index 5) : 5
element 7 (index 6) : 4
element 8 (index 7) : 3
element 9 (index 8) : 2
element 10 (index 9) : 1

Array 3 :
element 1 (index 0) : 10
element 2 (index 1) : 9
element 3 (index 2) : 8
element 4 (index 3) : 7
element 5 (index 4) : 6
element 6 (index 5) : 6
element 7 (index 6) : 7
element 8 (index 7) : 8
element 9 (index 8) : 9
element 10 (index 9) : 10
Oplossing :
Visual Basic 2012 Broncode - Codevoorbeeld 109
Module Exercise6Solution
    Sub Main()
        Dim count As Integer = 10
        Dim upperbound As Integer = count - 1
        Dim values1(upperbound) As Integer
        Dim values2(upperbound) As Integer
        Dim values3(upperbound) As Integer
        Dim index As Integer
        '
        For index = 0 To upperbound
            values1(index) = index + 1
        Next
        '
        Console.WriteLine("Array 1 :")
        For index = 0 To upperbound
            Console.WriteLine("element " & (index + 1) & _
                              " (index " & index & ") : " & _
                              values1(index))
        Next
        Console.WriteLine()
        '
        For index = 0 To upperbound
            values2(index) = count - index
        Next
        '
        Console.WriteLine("Array 2 :")
        For index = 0 To upperbound
            Console.WriteLine("element " & (index + 1) & _
                              " (index " & index & ") : " & _
                              values2(index))
        Next
        Console.WriteLine()
        '
        For index = 0 To upperbound
            If values1(index) >= values2(index) Then
                values3(index) = values1(index)
            Else
                values3(index) = values2(index)
            End If
        Next
        '
        Console.WriteLine("Array 3 :")
        For index = 0 To upperbound
            Console.WriteLine("element " & (index + 1) & _
                              " (index " & index & ") : " & _
                              values3(index))
        Next
        Console.WriteLine()
        '
        Console.ReadLine()
    End Sub
End Module
Opgave :
Maak een programma dat aan de gebruiker vraag hoeveel fibonaccigetallen deze wenst te zien.

De fibonaccireeks : 1 1 2 3 5 8 13 21 34 55 89 ...
De eerste 2 getallen zijn 1, alle volgende getallen zijn de som van de vorige 2 getallen.

Los dit op aan de hand van een array, vul een array op met het gevraagde aantal getallen, en breng de inhoud van deze array op de console.
Console Application Output
Count : 1
1
Console Application Output
Count : 2
1  1
Console Application Output
Count : 3
1  1  2
Console Application Output
Count : 11
1  1  2  3  5  8  13  21  34  55  89
Oplossing :
Visual Basic 2012 Broncode - Codevoorbeeld 110
Module Exercise7Solution
    Sub Main()
        Console.Write("Count : ")
        Dim count As Integer = Console.ReadLine()
        '
        If count <= 0 Then
            Console.WriteLine("Error : Minimum count 1.")
        Else
            Dim upperbound As Integer = count - 1
            Dim fibonacci(upperbound) As Integer
            Dim index As Integer
            '
            fibonacci(0) = 1
            If count > 1 Then
                fibonacci(1) = 1
                For index = 2 To upperbound
                    fibonacci(index) = fibonacci(index - 1) + fibonacci(index - 2)
                Next
            End If
            '
            For index = 0 To upperbound
                Console.Write(fibonacci(index) & "  ")
            Next
        End If
        '
        Console.ReadLine()
    End Sub
End Module

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.