16.09.2013 Views

Parameteroverdracht en recursieve functies - Vaklokalen

Parameteroverdracht en recursieve functies - Vaklokalen

Parameteroverdracht en recursieve functies - Vaklokalen

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!