Informaticasite van het Lauwers College te Buitenpost                 © R.J. van der Beek
 

8.6. Een overhoorprogramma, arrays.

  8.6.1. Een formulier om te kiezen

We willen een programma maken waarbij je woordjes in kunt voeren met hun vertaling in het engels, frans of een andere taal.
Die woordjes worden vastgelegd in een bestand.
En dan kun je jezelf overhoren: er wordt steeds een woordje getoond en dan moet je de vertaling geven.

Als het programma wordt gestart dan wordt er alleen maar een menu getoond, zoals hier rechts. (Je kunt ook een professioneel menu maken, met een menubalk en een werkbalk; daarover later.

Als je dan klikt op "Voer in", dan verschijnt er een nieuw formulier dat er uitziet zoals hieronder.

We beginnen met het eerste formulier. Je zet er 3 "buttons" op, met de tekst zoals hierboven rechts.
Als naam van het formulier voer je in: frmMenu, en als opschrift (Caption): Menu
Verder doe je er nog niets mee.

  8.6.2 Een tweede formulier; woorden invoeren en bewaren op schijf.

Klik in het menu op Invoegen, en dan op Form.
En dan krijg je een tweede (leeg) formulier in beeld.
Standaard wordt dat "form2" genoemd, maar dat kun je veranderen.
Vul in het propertiesvenster voor dit formulier bij Name in : frmVoerin , en bij Caption : Woordjes invoeren
Zet er 2 labels met als opschrift Woord: en Vertaling: en 2 buttons met als opschrift OK en Stop op.
De naam van de OK-button verander je in cmdOK en de naam de stop-button in cmdStop.
Verder zet je er twee tekstvensters op.
De bovenste geef je als naam txtWoord, en die daaronder geef je als naam txtVertaling



Bij Form_Load zet je de programmaregel

Private Sub Form_Load()

Open "woordjes.txt" For Output As #1

End Sub

Dat heeft tot gevolg dat er een bestand met de naam "woordjes.txt" wordt aangemaakt, en daar kunnen dan staks de ingevoerde woorden in worden bewaard.

Voer bij de OK-knop onder Click het volgende in:

Private Sub cmdOK_Click()

' het woord met de vertaling worden opgeslagen
' in het bestand "woordjes.txt"

Print #1, txtWoord.Text
Print #1, txtVertaling.Text
' de tekstvensters worden leeg gemaakt
txtWoord.Text = ""
txtVertaling.Text = ""

End Sub

Voer bij de Stop-knop onder Click het volgende in:

Private Sub cmdStop_Click()

' het bestand wordt afgesloten
Close #1
' Het invoer-formulier wordt verwijderd
Unload frmVoerin
' het beginformulier met het menu verschijnt weer frmMenu.Show

End Sub

Ga dan terug naar het eerste formulier.
Dat kun je in het projectvenster uitkiezen, daar worden alle formulieren genoemd. En dan kun je uitkiezen of je het formulier in beeld wilt hebben of de bijbehorende code (dus de programmaregels).
Zie je het projectvenster niet, klik dan in het menu op View, en daarna op Project : dan verschijnt het wel in beeld.
Klik dan dus op frmMenu, en op View Form.

Dubbelklik in het eerste formulier op de button met "Voer in", dan kun je de bijbehorende programmaregels invoeren.
Voer bij Click de volgende code in:

Private Sub cmdVoerin_Click()

frmVoerin.show

End Sub

Dat heeft tot gevolg dat als je op die button klikt het formulier met de naam "frmVoerin" wordt ingeladen en getoond.
En dat was de bedoeling !

Bij het formulier frmVoerin moet de volgende code worden ingevoerd voor als er op Stop-knop wordt geklikt:

Private Sub cmdStop_Click()

unload frmVoerin
frmMenu.show

End Sub

Dat heeft tot gevolg dat het tweede formulier verdwijnt, en het eerste weer verschijnt.

  8.6.3 Woorden inlezen, arrays

Als je jezelf wilt overhoren dan moet de computer allereerst de woordjes inlezen uit het bestand op de schijf.
En dan moet hij alle woordjes onthouden.
Als er honderd woordjes zijn ingevoerd dan moet hij die alle honderd onthouden, en ook de vertaling er van.
Daar ga je natuurlijk niet 100 aparte variabelen-namen voor bedenken, je doet dat met een array zoals we dat ook in Pascal hebben gezien.
Je declareert een array "woord(....)", zodat in de variabele woord(1) het eerste woord wordt bewaard, in woord(2) het tweede woord, enz.
De opdracht daarvoor is: Dim woord(1 To 100) As String
of Dim woord(100) As String (Dan kun je als index de getallen 0 t/m 100 gebruiken) Verder moeten ook de vertalingen van die woorden worden onthouden, dat doe je met
opdracht : Dim vertaling(100) As String
En dan moet de computer ook nog onthouden welke woorden al wel geweest zijn, en welke niet, want er moet natuurlijk niet twee keer het zelfde woord gevraagd worden.
Daarvoor heb je zogenaamde boolean-variabelen nodig, die alleen maar true of false kunnen zijn. Die variabele kunnen we bijv. geweest(....) noemen.
De opdracht daarvoor is: Dim geweest(100) As Boolean
Dit moeten allemaal globale variabelen zijn (ook die van de woordjes), we declareren ze dus bij General onder Declarations.

We beginnen met het overhoorformulier, dat moet er uitzien als hiernaast.
Klik in het menu op Invoegen, en dan op Form.
Dan krijg je weer een nieuw leeg formulier in beeld.
Vul in het propertiesvenster voor dit formulier bij Name in : frmOverhoor , en bij Caption : Woordjes overhoren
Zet er labels met als opschrift Woord: en Vertaling: en Tot nu toe goed: en één met een 0. Zet er ook twee buttons op met als opschrift OK en Naar menu
De naam van de OK-button verander je in cmdOK en de naam de Naar menu-button in cmdNaarmenu.
En het label waarop een 0 staat geef je als naam lblAantalgoed.
Verder zet je er twee tekstvensters op.
De bovenste geef je als naam txtWoord, en die daaronder geef je als naam txtVertaling

Onder General bij Declarations zet je de volgende regels:

' globale rij-variabelen voor de woorden, vertalingen enz.
' a is het nummer van het woord dat aan de beurt is

Dim woord(100), vertaling(100) As String
Dim geweest(100) As Boolean
Dim aantalgoed, aantalgeweest, a as integer

Bij Form_Load zet je de volgende programmaregels: (in de commentaarregels lees je het hoe en waarom)

Private Sub Form_Load()

dim i as integer
Open "woordjes.txt" For Input As #1
' We gaan er even van uit dat er 5 woordjes zijn ingevoerd
' met de bijbehorende vertalingen om het niet te lang te
' laten duren. Bij de opgaven moet je dat zo veranderen
' dat het aantal ingevoerde woordjes wordt ingelezen
'
' in het begin is nog geen enkel woordje aan de beurt
' geweest, daarom: geweest(i)=false

for i = 1 to 5
      input #1, woord(i)
      input #1, vertaling(i)
      geweest(i) = false
next i
aantalgoed = 0
aantalgeweest = 0
' zorgen voor willekeurige getallen
randomize
' a moet een willekeurig getal tussen 1 en 5 zijn
' als je er van uit gaat dat er 5 woordjes zijn ingelezen

a = Int (Rnd * 5) + 1
' als a dan 3 is dan wordt het derde woordje gevraagd
txtWoord.text = woord(a)
' en het derde woordje wordt dan geregistreerd als
' geweest zijnde, zodat het niet weer wordt gevraagd

geweest(a) = true

End Sub

  8.6.4 Overhoren

Het overhoorformulier heb je in de vorige paragraaf al gemaakt.
En het inlezen van de woorden uit het woordjesbestand is daar al besproken.
We gaan nu bespreken hoe je er voor kunt zorgen dat de woordjes overhoord kunnen worden.
En we willen de woordjes dan niet in de zelfde volgorde overhoren waarin ze zijn ingevoerd, maar in een willekeurige volgorde die vantevoren niet te voorspellen is.

Bij Form_Load zet je de volgende programmaregels: (in de commentaarregels lees je het hoe en waarom)

Private Sub Form_Load()

dim i as integer
Open "woordjes.txt" For Input As #1
' We gaan er even van uit dat er 5 woordjes zijn ingevoerd
' met de bijbehorende vertalingen om het niet te lang te
' laten duren. Bij de opgaven moet je dat zo veranderen
' dat het aantal ingevoerde woordjes wordt ingelezen
'
' in het begin is nog geen enkel woordje aan de beurt
' geweest, daarom: geweest(i)=false

for i = 1 to 5
      input #1, woord(i)
      input #1, vertaling(i)
      geweest(i) = false
next i
aantalgoed = 0
aantalgeweest = 0
' zorgen voor willekeurige getallen
randomize
' a moet een willekeurig getal tussen 1 en 5 zijn
' als je er van uit gaat dat er 5 woordjes zijn ingelezen

a = Int (Rnd * 5) + 1
' als a dan 3 is dan wordt het derde woordje gevraagd
txtWoord.text = woord(a)
' en het derde woordje wordt dan geregistreerd als
' geweest zijnde, zodat het niet weer wordt gevraagd

geweest(a) = true

End Sub

Voer bij de OK-knop onder Click het volgende in:

Private Sub cmdOK_Click()

' als er al 5 geweest zijn komen er niet meer
if aantalgeweest >= 5 then exit sub
if txtVertaling.text = vertaling(a) then
      aantalgoed = aantalgoed +1
      msgbox("Goed zo")
else
      msgbox("Niet goed")
endif
aantalgeweest = aantalgeweest + 1
' de tekstvensters worden leeggemaakt
txtWoord.Text = ""
txtVertaling.Text = ""
' het aantal goede antwoorden wordt getoond
lblAantalgoed.caption = str(aantalgoed)
' Er wordt net zolang om een nummer "gedobbeld" tot er
' één gevonden is die nog niet geweest is

do until geweest(a)=false
      a = Int (Rnd * 5) + 1
loop
' dat nummer wordt dan geregistreerd als
' geweest zijnde, zodat het niet weer wordt gevraagd

geweest(a) = true
' dat woord verschijnt in de tekstbox
txtWoord.Text = woord(a)
' de cursor wordt in het tekstvenster txtVertaling gezet
' zodat er niet eerst in dat venster geklikt hoeft te worden

txtVertaling.setfocus

End Sub

Voer bij de Naarmenu-knop onder Click het volgende in:

Private Sub cmdNaarmenu_Click()

' het bestand wordt afgesloten
Close #1
' Het overhoor-formulier wordt verwijderd
Unload frmOverhoor
' het beginformulier met het menu verschijnt weer
frmMenu.Show

End Sub

Laat het programma nu lopen en kijk of het goed gaat.

  8.6.5 Zelf een procedure (of subroutine) maken.

In het programma van de vorige paragraaf komt twee keer hetzelfde voor.
Als het formulier wordt geladen dan moet er een woordje worden uitgezocht en worden getoond in de tekstbox txtWoord.
En als er op de OK-knop wordt geklikt moet dat ook gebeuren.
Het stukje van het programma dat dat regelt is twee keer ingevoerd.
Dat kun je ook anders doen.
Je kunt daar ook een aparte procedure van maken, en dan twee keer naar die procedure verwijzen.

Als je zelf een procedure wilt maken en invoeren dan moet dat onder General bij Declarations, en dan wel onder de declaraties van de globale variabelen.

Voer onder General bij Declarations (onder de declaratie van de globale variabelen) het volgende in:

sub Nieuwwoord
do until geweest(a)=false
      a = Int (Rnd * 5) + 1
loop
geweest(a) = true
txtWoord.Text = woord(a)
txtVertaling.setfocus
end sub

De procedure hebben we dus Nieuwwoord genoemd.
Denk er om dat je als eerste zin invoert:
Sub ..... (de naam van de procedure)
en als laatste zin : End sub

Als je een procedure bij een event invoert, dus bijv. als er op een button wordt geklikt, dan verschijnen die eerste regel en laatste regel automatisch.
Dat is hier dus niet zo!

Bij Form_Load zet je nu de volgende programmaregels: (de commentaarregels laten we nu maar weg)

Private Sub Form_Load()

dim i as integer
Open "woordjes.txt" For Input As #1
for i = 1 to 5
      input #1, woord(i)
      input #1, vertaling(i)
      geweest(i) = false
next i
aantalgoed = 0
aantalgeweest = 0
randomize
nieuwwoord

End Sub

Voer bij de OK-knop onder Click nu het volgende in:

Private Sub cmdOK_Click()

if aantalgeweest >= 5 then exit sub
if txtVertaling.text = vertaling(a) then
   aantalgoed = aantalgoed +1
   msgbox("Goed zo")
else
   msgbox("Niet goed")
endif
aantalgeweest = aantalgeweest + 1
txtWoord.Text = ""
txtVertaling.Text = ""
lblAantalgoed.caption = str(aantalgoed)
nieuwwoord

End Sub

Als je het nu uitprobeert zul je merken dat het net zo werkt als daar voor.
Maar het programma is korter geworden.

Tenslotte voer je als programmaregels bij de button met "naar menu" het volgende in:

Private Sub cmdNaarmenu_Click()

Unload fBeweeg
frmMenu.Show

End Sub

Laat het programma dan lopen en probeer alles uit.

  8.6.6 Opdrachten.

Opgaven.
Maak nu opgave 6 van de oefenopgaven van hoofdstuk 8