homeboekenlinksledenabonneer je :Blijf op de hoogte door je te abonneren op de vbvoorbeelden RSS Niews Feed!Blijf op de hoogte door vbvoorbeelden te volgen op Twitter!Blijf op de hoogte door fan te worden van vbvoorbeelden op Facebook!
Visual Basic 2008 en 2010 Voorbeelden en Boeken Microsoft Visual Studio 2010Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

visual basic 2008 voorbeelden en boeken / visual basic 2010 voorbeelden en boeken

7.1. Inleiding Arrays

Print Email Deel op FacebookDeel op TwitterDeel op DiggBookmark op Google BookmarksDeel op del.icio.usOverige Sociale Netwerksites...

Dit artikel is gepubliceerd op woensdag 24 februari 2010 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 programma-verloop :

Value  1 ?
10
Value  2 ?
20
Value  3 ?
30
10 + 20 + 30 = 60

Onderstaand voorbeeld zou aan deze vereisten voldoen.

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.

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
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 gestockeerd.
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.

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
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.

Module Example4
    Sub Main()
        Console.WriteLine("Count ?")
        Dim count As Integer = Console.ReadLine()
        '
        Dim values(count) 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
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

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
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.

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 :

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.

Count : 3
Value  1 : -8
Value  2 : -2
Value  3 : -3
Highest Value  : -2 ( element 2 at index 1 )

Oplossing :

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.

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 :

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.

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 :

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.

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 :

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.

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 :

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.

Count : 1
1
Count : 2
1  1
Count : 3
1  1  2
Count : 11
1  1  2  3  5  8  13  21  34  55  89

Oplossing :

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 woensdag 24 februari 2010 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

Visual Basic 2008 & 2010 Boeken

Het Groene Visual Basic 2008 & 2010 Voorbeelden Boek Het Blauwe Visual Basic 2008 & 2010 Voorbeelden Boek Het Rode Visual Basic 2008 & 2010 Voorbeelden Boek

Bevalt een artikel je, dan kan je de inhoud van vbvoorbeelden ook reclamevrij in boekvorm verkrijgen.

De inhoud is verdeeld over 3 boeken, Het Groene, Het Blauwe en Het Rode Visual Basic 2008 & 2010 Voorbeelden Boek.

Klik hier voor meer informatie.

Berichten

Fast UML Sequence Diagram Editor Het evenement voor de actieve video- en fotograaf.