7.3 Arrays


7.3.1 Eéndimensionele arrays

In een 'gewone' of enkelvoudige geheugenvariabele kan je één waarde opslaan. Je kan uiteraard de waarde wijzigen doch dan is de originele overschreven. Een groep waarden die met mekaar verband houden kan je echter beter opslaan in een geïndiceerde variabele of matrix of array.

Voorbeeld:

Je wil de middagtemperaturen voor één week noteren en daarna het gemiddelde berekenen. In de sub VoorbeeldArray01 zie je hoe dit gerealiseerd kan worden:

Public Sub VoorbeeldArray01()
Dim asngTemp(7) As Single 'zie bespreking punt 1 + 2
Dim intTeller As Integer,varTeller
Dim sngSom As Single
'Opvullen array - zie bespreking punt 3
For intTeller = 1 To 7
    asngTemp(intTeller) = InputBox("Dag " & Str(intTeller))
Next intTeller
'Afdrukken array + gemiddelde berekenen
sngSom = 0
For Each varTeller In asngTemp 'Bespreking punt 4
    sngSom = sngSom + asngTemp(varTeller)
Debug.Print "Element " & Str(varTeller) & ":" & Str(asngTemp(varTeller))
Next varTeller
'Gemiddelde afdrukken
Debug.Print "Gemiddelde: "; sngSom / 7
'Bewerkingen met elementen uit de array
Debug.Print asngTemp(4) ' zie bespreking punt 5
Debug.Print asngTemp(2) + asngTemp(4)
End Sub
Plaats de voorbeelden en oefeningen uit dit hoofdstuk in de module 'basArrays'

Bespreking:

  1. Een array moet zoals elke variabele gedeclareerd worden. Dit kan op de reeds geziene manieren bijvoorbeeld met de instructie DIM. In dit voorbeeld wordt een array aangemaakt met acht elementen. Deze zijn aan te duiden als asngTemp(0), asngTemp(1), asngTemp(2), ..., asngTemp(7)
    De variabele asngTemp is dus de verzamelnaam van meerdere locaties met één naam en een volgnummer of index. De array zou er zo kunnen uitzien:
    element 0 1 2 3 4 5 6 7
    waarde 0 19.6 20.5 19 16 19 21.6 21.6

    Je merkt dat in de array het element met volgnummer 0 voorkomt en niet zinvol gebruikt wordt. Je kan dit voorkomen door de elementen te laten nummeren vanaf 1. Dit doe je door in het declaratiegedeelte van de module de opdracht 'Option Base 1' te schrijven. Elementen waar je zelf geen waarde in plaatst worden opgevuld met een standaardwaarde: nul voor numerieke arrays (integer, single, double), een lege string voor stringarrays, 0:00:00 voor datumarrays, onwaar voor arrays met elementen van het type Boolean.
    opm:

    1. Je kan ook zelf de benedengrens van de index opgeven:
      DIM astrX(1 TO 20)
    2. De benedengrens kan gelijkwelke waarde zijn:
      DIM adtmZ(100 to 150)
  • Voor de naamgeving van arrays volgen we de gemaakte afspraken. Je gebruikt bvb. de tag 'str' bij een array met stringelementen. Om het verschil met enkelvoudige variabelen te maken, wordt echter het prefix 'a' (van array) geplaatst.
    Een paar voorbeelden:
    DIM aintPunten(10) creëert een array met 10 of 11 elementen van het type Integer.
    DIM astrKlanten(100) creëert een array met 100 of 101 elementen van het type String.
  • Het voordeel van arrays blijkt voornamelijk bij het overlopen van de elementen ervan met een lus. Dit kan het geval zijn bij het opvullen van de array, het afdrukken, het maken van totalen, ...
    Een array volledig overlopen vergt eigenlijk maar 3 programmaregels waarbij de eerste en de laatste de lus vormen (vb. FOR...NEXT). Het uitbreiden van het aantal elementen van een array brengt zodoende geen bijkomend programmeerwerk met zich.

    Wil je de temperaturen voor december bijhouden, dan maak je een array met 31 elementen in plaats van 7. De rest van de tekst blijft onveranderd:

    Dim asngTemp(31) As Single
    ...
    'Opvullen array
    For intTeller = 1 To 31
    asngTemp(intTeller) = InputBox("Dag " & Str(intTeller))
    Next intTeller

    Zonder array zou je dus 31 variabelen nodig hebben, 31 regels om de tabel op te vullen,...

  • In Plaats van de FOR...NEXT-instructie kan je FOR EACH...NEXT gebruiken. Hierbij is het niet nodig de begin- en eindwaarde van de index op te geven. Alle elementen van de array worden zondermeer overlopen.
    Syntax: For Each telvariabele In arraynaam

    De telvariabele moet dan wel van het type Variant zijn.

  • Je hoeft een array natuurlijk niet altijd VOLLEDIG te overlopen. Je kan ook de elementen apart aanspreken.
    Zo is een opdracht als asngTemp(5) = 12 + intX + asngTemp(2) correct.

    Er weze nog op gewezen dat je arrays niet als dusdanig kan gebruiken; je werkt steeds met de elementen ervan! Hierop is één uitzondering: je kunt een volledige array verplaatsen naar een Variant, zodat u één variabele van het type variant krijgt die de volledige array bevat:

    Voorbeeld:

    Dim varMijnArray As Variant

    varMijnArray = asngTemp

    De variabele varMijnArray is dan 'ingericht' als een array. Je verwijst dus met de subscriptnotatie of index zoals voor een 'gewone' array naar de onderdelen van de array in de variant. Bijvoorbeeld:

    varMijnArray(3) = varMijnArray(1) + varMijnArray(5)

    7.3.2 Oefeningen ééndimensionele arrays:

    Bewaar de oefeningen in de module 'basArrays'. Gebruik de namen Array01, Array02, ...
    1. Plaats de voornamen van je 10 personen in een array en druk de alfabetisch eerste nadien af in het venster 'Foutopsporing'.
    2. Tik de voornaam en de punten van een toets van 5 klasgenoten in. Druk daarna voor iedereen het verschil met het klasgemiddelde af in het venster 'Foutopsporing'.
    3. Maak een frequentietabel van de lengte van 1000 leerlingen. De lengte van iedereen wordt ingetikt in cm. Veronderstel dat iedereen tusssen 150 en 200 cm groot is.
    4. Zet 5 woorden in een array en kopieer ze naar een tweede array in omgekeerde volgorde. Druk beide tabellen af in het venster 'Foutopsporing'.
    5. Vul een array op met 10 getallen(10, 20, 30,40,..), druk de array af, verwissel de getallen twee aan twee IN de array en druk de array nogmaals af.
    6. Vul een array op met de eerste 10 getallen uit de rij van Fibonacci. Druk de array af. Schuif nadien elk getal één element naar achter. Het laatste getal komt in het eerste element. Druk de array opnieuw af.

    antwoorden

    7.3.3 Tweedimensionele tabellen

    Een tweedimensionele tabel bevat een aantal rijen en een aantal kolommen.

    Stel je wil de ochtend-, middag- en avondtemperatuur gedurende één week registreren. Je kan de gegevens in een tweedimensionele tabel met 3 kolommmen en 7 rijen opslaan.

    Public Sub VoorbeeldArray02()
    'Declaratie van de variabelen
    Dim asngTemp2(7, 3) As Single
    Dim intRij, intKolom As Integer
    Dim strTekst As String
    'Opvullen van de array rij per rij
    For intRij = 1 To 7
      For intKolom = 1 To 3
        strTekst = "Temperatuur " & Str(intKolom)
        strTekst = strTekst + " van dag " & Str(intRij) & ": "
        asngTemp2(intRij, intKolom) = InputBox(strTekst)
      Next
    Next
    'Afdrukken rij per rij
    For intRij = 1 To 7
      For intKolom = 1 To 3
        strTekst = "Temperatuur " & Str(intRij)
        strTekst = strTekst + " van dag " & Str(intKolom) & ": "
        Debug.Print "Dag " & Str(intRij) & ": "; asngTemp2(intRij, intKolom);
      Next
      Debug.Print 'Nieuwe regel nemen in venster 'Foutopsporing'
    Next
    End Sub

    Bespreking:

    7.3.4 Oefeningen tweedimensionele arrays:

    Bewaar de oefeningen in de module 'basArrays'.Gebruik de namen Array11, Array12, ...
    1. Laat willekurige gehele getallen tussen 10 en 25 in de array asngTemp2 zetten. Bereken de gemiddelde temperatuur per dag.
    2. Idem 1 doch bereken de gemiddelde ochtendtemperatuur .

    antwoorden

    7.3.5 Dynamische arrays

    Je kan een array declareren zonder opgave van het aantal dimensies en het aantal elementen per dimensie. Je kan dit achteraf tijdens de uitvoering van de programmacode doen. Dergelijke array is een dynamische array.
    Je declareert deze op de gewone manier bijvoorbeeld met DIM doch laat de haakjes leeg: Dim sngarray() As Single. Later kunt u in een procedure die binnen het bereik van de array valt, de instructie ReDim gebruiken om het aantal dimensies in te stellen en het aantal elementen plus de onder- en bovengrens voor elke dimensie. Met de instructie ReDim kunt u de dynamische array wijzigen zo vaak u wilt. Voeg je de term 'Preserve' toe aan Redim dan behouden de reeds opgevulde elementen hun actuele waarde.

    Public Sub VoorbeeldArray03()
    Dim aintMijnArray()
    Dim intTeller, intAantal As Integer
    intAantal = InputBox("Hoeveel elementen wil je?")
    ReDim aintMijnArray(intAantal)
    'Opvullen
    For intTeller = 1 To intAantal
      aintMijnArray(intTeller) = intTeller
    Next intTeller
    'Afdrukken
    For intTeller = 1 To intAantal
      Debug.Print aintMijnArray(intTeller)
    Next intTeller
    ReDim aintMijnArray(intAantal * 2)
    'Opvullen
    For intTeller = 1 To intAantal * 2
      aintMijnArray(intTeller) = intTeller * 2
    Next intTeller
    'Afdrukken
    For intTeller = 1 To intAantal * 2
      Debug.Print aintMijnArray(intTeller)
    Next intTeller
    ReDim Preserve aintMijnArray(intAantal * 3)
    'Opvullen
    For intTeller = intAantal * 2 + 1 To intAantal * 3
      aintMijnArray(intTeller) = intTeller * 3
    Next intTeller
    'Afdrukken
    For intTeller = 1 To intAantal * 3
      Debug.Print aintMijnArray(intTeller)
    Next intTeller
    End Sub

    Welke getallen worden afgedrukt indien voor 'intAantal' 2 wordt ingevuld?

    Tip:

    Je vindt alle sleutelwoorden die op een onderwerp betrekking hebben netjes samen wanneer je in het tabblad 'Index' van het helpscherm 'Sleutelwoordenoverzicht' (of een deel ervan) typt. Je kiest dan uit de getoonde lijst bijvoorbeeld 'array' en je ziet alle sleutelwoorden i.v.m. arrays. Je merkt dan ook wel dat in bovenstaande tekst niet alles werd verteld...