31.07.2013 Views

Denkende Machines -- Computers, rekenen, redeneren - CWI

Denkende Machines -- Computers, rekenen, redeneren - CWI

Denkende Machines -- Computers, rekenen, redeneren - CWI

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

3.3. PROGRAMMEREN 79<br />

Een functie roepen we aan met behulp een toekenning: x := FUNCTIENAAM(x1,. . . ,xn).<br />

Het resultaat van de functie toegepast op de gespecificeerde invoer x1,. . . ,xn wordt toegekend<br />

aan x, ofwel in het x-register wordt de waarde van het resultaat opgeslagen. Dit laatstgenoemde<br />

register verliest daarmee evenwel zijn oude inhoud. Zo staat in de implementatie van COPY<br />

al een toekenning Y := EMPTY(). De variabele Y krijgt de waarde van het resultaat van de<br />

toepassing van de EMPTY-functie, dat wil zeggen: Y wordt geleegd.<br />

De variabelen binnen de functie-implementatie worden bij afspraak met hoofdletters geschreven.<br />

Verder gebruiken we de letter Y steeds voor het resultaat, de uitvoer, van de functie. De<br />

variabelen X1 . . . Xn worden gebruikt als referentie van de opeenvolgende invoerargumenten.<br />

Variabelen die met een andere hoofdletter geschreven worden bij een functie-implementatie zijn<br />

hulpvariabelen. Variabelen buiten de functies schrijven we met een kleine beginletter.<br />

Hieronder tref je een uitbreiding van het kleine programmaatje hierboven aan. We definiëren<br />

optellen met behulp van een functie PLUS om vervolgens af te sluiten met het kwadratenalgoritme<br />

als hoofdonderdeel van het programma.<br />

[PLUS](..) {<br />

Y := COPY(X1);<br />

while (X2?) { X2-; Y+ }<br />

}<br />

z := EMPTY();<br />

while (x?) {<br />

x-;z+<br />

z := PLUS(z,PLUS(x,x))<br />

}<br />

De machine begint zijn berekening bij de eerste regel van het hoofdonderdeel en gebruikt de<br />

functie bij de aanroep. Functies hebben hun eigen gereserveerde registers. Als bijvoorbeeld<br />

PLUS(x,x) wordt aangeroepen, dan wordt eerst de waarde van x naar X1 en X2 gekopieerd en<br />

nadat de functie toegepast is, wordt het resultaat teruggegeven aan de variabele die de waarde<br />

PLUS(x,x) toegekend is. In dit geval veranderen de waarden van X1 en X2 tijdens de uitvoering<br />

van PLUS, maar dat heeft geen effect op de waarde van x, die blijft ongemoeid.<br />

Opdracht 3.20 Schrijf een ImPro+-programma met een functie TIMES voor vermenigvuldiging<br />

en completeer het programma, zodat voor twee registers x en y in een derde register z de waarde<br />

x y wordt berekend.<br />

Functies kunnen we ook gebruiken om de testmogelijkheden van ImPro uit te breiden. Bij het<br />

implementeren van lussen en keuzes willen we vaak meer testen dan het leeg zijn van een register.<br />

Uitgebreide tests worden in ImPro+ eigenlijk identiek aan functies gedefinieerd, alleen nu gaat<br />

het niet om de precieze inhoud van het resultaat in het uitvoerregister Y, maar over de vraag<br />

of dit register wel of niet inhoud heeft. Hieronder is een voorbeeld gegeven van een test waarbij<br />

nagegaan wordt of het eerste argument groter is dan het tweede argument.

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

Saved successfully!

Ooh no, something went wrong!