Parameteroverdracht en recursieve functies - Vaklokalen
Parameteroverdracht en recursieve functies - Vaklokalen
Parameteroverdracht en recursieve functies - Vaklokalen
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Parameteroverdracht</strong> <strong>en</strong> <strong>recursieve</strong> <strong>functies</strong><br />
Dit practicum is bedoeld voor VWO-leerling<strong>en</strong>.<br />
Tijd<strong>en</strong>s dit practicum gaan we in op twee onderwerp<strong>en</strong>:<br />
Visueel programmer<strong>en</strong> met DELPHI practicum 10<br />
· <strong>Parameteroverdracht</strong>: E<strong>en</strong> procedure/functie geeft e<strong>en</strong> waarde door aan e<strong>en</strong><br />
andere procedure/functie.<br />
· Recursie: E<strong>en</strong> procedure/functie roept zichzelf aan.<br />
Bij parameteroverdracht kun jij bijvoorbeeld d<strong>en</strong>k<strong>en</strong> aan e<strong>en</strong> functie 'Spiegel' die:<br />
· E<strong>en</strong> woord kan ontvang<strong>en</strong> van de procedure 'Puzzel'.<br />
· De letters van het ontvang<strong>en</strong> woord in omgekeerde volgorde kan plaats<strong>en</strong>.<br />
· Het gespiegelde woord kan terugstur<strong>en</strong> naar de procedure 'Puzzel'.<br />
In e<strong>en</strong> plaatje:<br />
Bij recursie kun je bijvoorbeeld d<strong>en</strong>k<strong>en</strong> aan e<strong>en</strong> functie 'Droste' die:<br />
· Op e<strong>en</strong> cacaoblik e<strong>en</strong> tek<strong>en</strong>ing kan mak<strong>en</strong> van e<strong>en</strong> verpleegster met e<strong>en</strong><br />
di<strong>en</strong>blad.<br />
· Deze tek<strong>en</strong>ing vervolg<strong>en</strong>s weer op e<strong>en</strong> cacaoblik<br />
plaatst, <strong>en</strong>z.<br />
In e<strong>en</strong> plaatje ziet dat er zo uit:<br />
- 1 - © Edu’Actief
Voorbeeld 1: De groei van kroos<br />
Visueel programmer<strong>en</strong> met DELPHI practicum 10<br />
In dit voorbeeld wordt recursie <strong>en</strong> parameteroverdracht tuss<strong>en</strong> <strong>functies</strong>/procedures<br />
besprok<strong>en</strong>.<br />
Je kunt de applicatie <strong>en</strong> de sourcecode, die hor<strong>en</strong> bij dit voorbeeld, vind<strong>en</strong> op de cdrom.<br />
Productomschrijving<br />
Bouw e<strong>en</strong> DELPHI-applicatie, waarmee de groei van e<strong>en</strong> hoeveelheid kroos in e<strong>en</strong><br />
sloot kan word<strong>en</strong> berek<strong>en</strong>d.<br />
Neem als uitgangspunt<strong>en</strong>, dat het kroos onbelemmerd kan groei<strong>en</strong>, <strong>en</strong> dat de<br />
hoeveelheid kroos iedere week verdubbelt.<br />
De gebruiker van de applicatie kan:<br />
· De beginhoeveelheid van het kroos invull<strong>en</strong>. (Maximaal 999)<br />
· Het aantal wek<strong>en</strong> invull<strong>en</strong>, waarover de groei van het kroos moet word<strong>en</strong><br />
berek<strong>en</strong>d. (Maximaal 9)<br />
· De ope<strong>en</strong>volg<strong>en</strong>de <strong>recursieve</strong> berek<strong>en</strong>ing<strong>en</strong> van de groei van het kroos<br />
volg<strong>en</strong>.<br />
Gebruikersinterface<br />
Ontwerp e<strong>en</strong> GUI, die opgebouwd is uit:<br />
· Twee tekstveld<strong>en</strong> waarin de gebruiker de beginhoeveelheid <strong>en</strong> het aantal<br />
wek<strong>en</strong> kan invull<strong>en</strong><br />
· E<strong>en</strong> tekstveld waarin de eindhoeveelheid wordt getoond.<br />
- 2 - © Edu’Actief
Visueel programmer<strong>en</strong> met DELPHI practicum 10<br />
· E<strong>en</strong> ListBox waarin de ope<strong>en</strong>volg<strong>en</strong>de <strong>recursieve</strong> berek<strong>en</strong>ing<strong>en</strong> word<strong>en</strong><br />
getoond.<br />
Implem<strong>en</strong>tatie<br />
Eerst moet word<strong>en</strong> beslot<strong>en</strong> welke Forms <strong>en</strong> Units er allemaal nodig zijn:<br />
Unit1 +<br />
Form1:<br />
Het hoofdscherm waarin de gebruiker de beginhoeveelheid <strong>en</strong> het aantal wek<strong>en</strong> kan<br />
invull<strong>en</strong>.<br />
Ook de ope<strong>en</strong>volg<strong>en</strong>de <strong>recursieve</strong> berek<strong>en</strong>ing<strong>en</strong> word<strong>en</strong> op het hoofdscherm getoond.<br />
Unit Kroos: In deze Unit wordt e<strong>en</strong> <strong>recursieve</strong> functie ondergebracht, waarmee de groei van het kroos<br />
kan word<strong>en</strong> berek<strong>en</strong>d.<br />
Verder moet word<strong>en</strong> aangegev<strong>en</strong> welke Units met elkaar communicer<strong>en</strong>:<br />
Unit Hoofdscherm uses Unit Kroos;<br />
Unit Kroos uses Unit Hoofdscherm;<br />
De Unit Kroos:<br />
Het wekelijks verdubbel<strong>en</strong> van de hoeveelheid kroos kan beschrev<strong>en</strong> word<strong>en</strong> m.b.v.<br />
e<strong>en</strong> <strong>recursieve</strong> formule:<br />
a(n) = 2 * a(n-1)<br />
In e<strong>en</strong> plaatje:<br />
E<strong>en</strong> aparte Unit kroos mak<strong>en</strong> in e<strong>en</strong> project gaat via:<br />
File | New | Unit<br />
Het raamwerk van de Unit wordt aangemaakt:<br />
- 3 - © Edu’Actief
De Unit wordt automatisch opg<strong>en</strong>om<strong>en</strong> in de applicatie:<br />
Visueel programmer<strong>en</strong> met DELPHI practicum 10<br />
- 4 - © Edu’Actief
Visueel programmer<strong>en</strong> met DELPHI practicum 10<br />
In de Unit Kroos moet vervolg<strong>en</strong>s e<strong>en</strong> <strong>recursieve</strong> functie 'Verdubbel' word<strong>en</strong> gebouwd:<br />
Standaardbibliothek<strong>en</strong> toevoeg<strong>en</strong>:<br />
Wanneer je e<strong>en</strong> nieuwe Unit toevoegt aan e<strong>en</strong> project, dan moet je zelf de<br />
standaardbibliothek<strong>en</strong> aangev<strong>en</strong>, die door de Unit gebruikt word<strong>en</strong>.<br />
De functie IntToStr is e<strong>en</strong> onderdeel van de standaardbibliotheek SysUtilt, <strong>en</strong> moet<br />
dus in de interface van de Unit 'Kroos' word<strong>en</strong> toegevoegd:<br />
uses SysUtils;<br />
- 5 - © Edu’Actief
De functie 'Verdubbel' declarer<strong>en</strong>:<br />
Visueel programmer<strong>en</strong> met DELPHI practicum 10<br />
Het declarer<strong>en</strong> van procedures <strong>en</strong> <strong>functies</strong>, die binn<strong>en</strong> de Unit 'Kroos' gebruikt gaan<br />
word<strong>en</strong>, vindt plaats in de interface van de Unit.<br />
De functie 'Verdubbel' ontvangt e<strong>en</strong> geheel getal, verm<strong>en</strong>igvuldigt dat getal met 2, <strong>en</strong><br />
stuurt de uitkomst van die verm<strong>en</strong>igvuldiging weer terug.<br />
Verdubbel( 6 ) levert retourwaarde 12.<br />
Het gehele getal, dat door de functie 'Verdubbel' wordt ontvang<strong>en</strong>, noem<strong>en</strong> we e<strong>en</strong><br />
parameter.<br />
In de declaratie van de functie 'Verdubbel' moet word<strong>en</strong> aangegev<strong>en</strong> van welk type<br />
de parameter is:<br />
function Verdubbel(i : Integer) . . . . . ;<br />
De retourwaarde van de functie 'Verdubbel' is ook e<strong>en</strong> parameter van het type<br />
Integer.<br />
In de declaratie van de functie 'Verdubbel' moet word<strong>en</strong> aangegev<strong>en</strong> van welk type<br />
deze retourwaarde is:<br />
function Verdubbel( . . . . . ) : Integer;<br />
De <strong>recursieve</strong> aanroep<strong>en</strong> doorstur<strong>en</strong> naar het Hoofdscherm:<br />
Het aantal ker<strong>en</strong>, dat de functie 'Verdubbel' door zichzelf wordt aangeroep<strong>en</strong>, wordt<br />
bewaard in de variabele k.<br />
Wanneer i gelijk is aan 1, dan moet in ListBox1 de tekst 'Verdubbel( 1 ) = 2'<br />
verschijn<strong>en</strong>:<br />
if i = 1 th<strong>en</strong> Form1.ListBox1.Items.Add('Recursieve aanroep nummer '<br />
+ IntToStr(k)+': Verdubbel(' + IntToStr(i)+') = 2')<br />
Zolang i groter is dan 1, dan moet in ListBox1 de tekst 'Verdubbel( i ) = 2 *<br />
Verdubbel( i - 1 )' verschijn<strong>en</strong>:<br />
else Form1.ListBox1.Items.Add('Recursieve aanroep nummer ' + IntToStr(k) +<br />
': Verdubbel(' + IntToStr(i)+') = 2 * Verdubbel(' + IntToStr(i-1)+')');<br />
Na iedere aanroep van de functie 'Verdubbel' wordt de waarde van de variabele k<br />
met 1 opgehoogd:<br />
k := k + 1;<br />
- 6 - © Edu’Actief
De recursie:<br />
Visueel programmer<strong>en</strong> met DELPHI practicum 10<br />
E<strong>en</strong> <strong>recursieve</strong> functie roept zichzelf aan.<br />
In de implem<strong>en</strong>tatie van e<strong>en</strong> <strong>recursieve</strong> functie moet dus e<strong>en</strong> stopcriterium zijn<br />
opg<strong>en</strong>om<strong>en</strong>:<br />
if i = 1 th<strong>en</strong> result := 2<br />
Zolang i groter is dan 1, roept de functie 'Verdubbel' zichzelf aan:<br />
else result := 2 * Verdubbel( i - 1 );<br />
De retourwaarde van e<strong>en</strong> functie wordt altijd aangegev<strong>en</strong> met de variabele result.<br />
De Unit Hoofdscherm:<br />
Wanneer de gebruiker van de applicatie op de knop 'Berek<strong>en</strong> de eindhoeveelheid'<br />
klikt, dan moet:<br />
· De ListBox word<strong>en</strong> leeggemaakt.<br />
· De beginhoeveelheid <strong>en</strong> het aantal wek<strong>en</strong> word<strong>en</strong> omgezet naar getall<strong>en</strong>.<br />
· Het aantal wek<strong>en</strong> word<strong>en</strong> doorgegev<strong>en</strong> aan de functie 'Verdubbel'.<br />
· De eindhoeveelheid van het kroos word<strong>en</strong> getoond in e<strong>en</strong> Edit.<br />
- 7 - © Edu’Actief
De procedure Button1Click:<br />
Visueel programmer<strong>en</strong> met DELPHI practicum 10<br />
Wanneer de gebruiker op Button1 klikt, dan moet eerst ListBox1 word<strong>en</strong><br />
leeggemaakt:<br />
ListBox1.Clear;<br />
Vervolg<strong>en</strong>s moet de variabele k uit de Unit 'Kroos', waarin het aantal aanroep<strong>en</strong> van<br />
de <strong>recursieve</strong> functie 'Verdubbel' word<strong>en</strong> bewaard, op 1 gezet word<strong>en</strong> (=<br />
initialiser<strong>en</strong>):<br />
Kroos.k := 1;<br />
De tekst, die door de gebruiker is ingetypt in Edit1 <strong>en</strong> Edit2 moet word<strong>en</strong><br />
geconverteerd naar e<strong>en</strong> getal:<br />
Start := StrToFloat(Edit1.Text);<br />
Wek<strong>en</strong> := StrToInt(Edit2.Text);<br />
Indi<strong>en</strong> de gebruiker e<strong>en</strong> ongeldig aantal wek<strong>en</strong> heeft ingevuld, dan verschijnt er e<strong>en</strong><br />
foutmelding:<br />
if ((Wek<strong>en</strong> > 9) or (Wek<strong>en</strong> < 1)) th<strong>en</strong> MessageDlg('Het aantal wek<strong>en</strong> moet minimaal 1 <strong>en</strong><br />
maximaal 9 zijn!',mtWarning,[mbOK],0)<br />
Bij e<strong>en</strong> geldig aantal wek<strong>en</strong> wordt de functie 'Verdubbel' uit de Unit 'Kroos'<br />
aangeroep<strong>en</strong>.<br />
De retourwaarde van de functie 'Verdubbel' wordt bewaard in de variabele 'Eind'.<br />
De inhoud van de variabele 'Eind' wordt geconverteerd naar tekst, <strong>en</strong> getoond in<br />
Edit3:<br />
else<br />
begin<br />
Eind := Kroos.Verdubbel(Wek<strong>en</strong>);<br />
Edit3.Text := FloatToStr(Eind*Start);<br />
<strong>en</strong>d;<br />
- 8 - © Edu’Actief
Voorbeeld 2: Fibonacci getall<strong>en</strong><br />
Visueel programmer<strong>en</strong> met DELPHI practicum 10<br />
In dit voorbeeld wordt recursie <strong>en</strong> parameteroverdracht tuss<strong>en</strong> <strong>functies</strong>/procedures<br />
besprok<strong>en</strong>.<br />
Je kunt de applicatie <strong>en</strong> de sourcecode, die hor<strong>en</strong> bij dit voorbeeld, vind<strong>en</strong> op de cdrom.<br />
Productomschrijving<br />
Bouw e<strong>en</strong> DELPHI-applicatie, waarmee de groei van e<strong>en</strong> kolonie konijn<strong>en</strong> (m.b.v.<br />
Fibonacci getall<strong>en</strong>) kan word<strong>en</strong> berek<strong>en</strong>d.<br />
Neem als uitgangspunt<strong>en</strong> voor de groei van de kolonie konijn<strong>en</strong>:<br />
· De groei wordt niet belemmerd door externe factor<strong>en</strong>.<br />
· Er gaan ge<strong>en</strong> konijn<strong>en</strong> dood.<br />
· De kolonie start met e<strong>en</strong> pasgebor<strong>en</strong> paartje konijn<strong>en</strong>.<br />
· E<strong>en</strong> paartje konijn<strong>en</strong> is na e<strong>en</strong> maand volwass<strong>en</strong>.<br />
· E<strong>en</strong> volwass<strong>en</strong> paartje konijn<strong>en</strong> produceert vervolg<strong>en</strong>s iedere maand e<strong>en</strong><br />
nieuw paartje konijn<strong>en</strong>.<br />
De gebruiker van de applicatie kan:<br />
· Het aantal maand<strong>en</strong> invull<strong>en</strong>, waarover de groei van de kolonie konijn<strong>en</strong> moet<br />
word<strong>en</strong> berek<strong>en</strong>d. (Maximaal 20)<br />
· De ope<strong>en</strong>volg<strong>en</strong>de <strong>recursieve</strong> berek<strong>en</strong>ing<strong>en</strong> van de groei van de kolonie<br />
konijn<strong>en</strong> volg<strong>en</strong>.<br />
- 9 - © Edu’Actief
Gebruikersinterface<br />
Ontwerp e<strong>en</strong> GUI, die opgebouwd is uit:<br />
Visueel programmer<strong>en</strong> met DELPHI practicum 10<br />
· E<strong>en</strong> tekstveld waarin de gebruiker het aantal maand<strong>en</strong> kan invull<strong>en</strong><br />
· E<strong>en</strong> tekstveld waarin het uiteindelijk aantal paarjes konijn<strong>en</strong> wordt getoond.<br />
· E<strong>en</strong> ListBox waarin de ope<strong>en</strong>volg<strong>en</strong>de <strong>recursieve</strong> berek<strong>en</strong>ing<strong>en</strong> word<strong>en</strong><br />
getoond.<br />
Implem<strong>en</strong>tatie<br />
Eerst moet word<strong>en</strong> beslot<strong>en</strong> welke Forms <strong>en</strong> Units er allemaal nodig zijn:<br />
Unit1 +<br />
Form1:<br />
Unit<br />
Fibonacci:<br />
Het hoofdscherm waarin de gebruiker het aantal maand<strong>en</strong> kan invull<strong>en</strong>.<br />
Ook de ope<strong>en</strong>volg<strong>en</strong>de <strong>recursieve</strong> berek<strong>en</strong>ing<strong>en</strong> word<strong>en</strong> op het hoofdscherm getoond.<br />
In deze Unit wordt e<strong>en</strong> <strong>recursieve</strong> functie ondergebracht, waarmee de groei van de kolonie<br />
konijn<strong>en</strong> kan word<strong>en</strong> berek<strong>en</strong>d.<br />
Verder moet word<strong>en</strong> aangegev<strong>en</strong> welke Units met elkaar communicer<strong>en</strong>:<br />
Unit Hoofdscherm uses Unit Fibonacci;<br />
Unit Fibonacci uses Unit Hoofdscherm;<br />
De Unit Fibonacci:<br />
Het maandelijkse groei van het aantal paartjes konijn<strong>en</strong> kan beschrev<strong>en</strong> word<strong>en</strong><br />
m.b.v. e<strong>en</strong> <strong>recursieve</strong> formule:<br />
a(n) = a(n-1) + a(n-2)<br />
In e<strong>en</strong> plaatje:<br />
- 10 - © Edu’Actief
Visueel programmer<strong>en</strong> met DELPHI practicum 10<br />
In de Unit Fibonacci moet vervolg<strong>en</strong>s e<strong>en</strong> <strong>recursieve</strong> functie 'Fibon' word<strong>en</strong> gebouwd:<br />
De Unit Hoofdscherm:<br />
Wanneer de gebruiker van de applicatie op de knop 'Berek<strong>en</strong> de groei' klikt, dan<br />
moet:<br />
· De ListBox word<strong>en</strong> leeggemaakt.<br />
· Het aantal maand<strong>en</strong> word<strong>en</strong> omgezet naar e<strong>en</strong> getal.<br />
· Het aantal maand<strong>en</strong> word<strong>en</strong> doorgegev<strong>en</strong> aan de functie 'Fibon'.<br />
· Het aantal paartjes konijn<strong>en</strong> word<strong>en</strong> getoond in e<strong>en</strong> Edit.<br />
- 11 - © Edu’Actief
Visueel programmer<strong>en</strong> met DELPHI practicum 10<br />
- 12 - © Edu’Actief