Hoofdstuk 6 - Functies (deel 2)

In het vorige hoofdstuk heb je kennis gemaakt met functies. Een groot voordeel van met functies werken is dat je elk brok los van elkaar kunt bedenken, schrijven en testen. Zo is het makkelijker, als je een fout maakt, erachter te komen waar het zit en te bedenken hoe je het moet oplossen. We hebben in de vorige hoofdstuk gekeken naar functies met parameters (die specifieke informatie moeten krijgen om dingen te doen) en zonder parameters. We gaan nu uitgebreider in op retourwaarden van functies, bereik van variabelen en toevoegen van commentaar.


VIDEOUITLEG: over retourwaarden en bereik van variabelen

H6.1 - Bereik van variabelen

Een variabele die je binnen een functie aanmaakt bestaat alleen binnen die functie. Zo'n variabele heet een lokale variabele. Na het blok worden de lokale variabelen vernietigd. Het bereik van een variabele is het blok code waarin de variabele is gedeclareerd, en alle blokken code die daarbinnen vallen. Het volgende plaatje laat het bereik van variabelen zien:

Figuur: Bereik van variabelen bij blokken code Figuur: Bereik van variabelen bij blokken code
Met parameters en retourwaarden geef je waarden tussen programmaonderdelen door, dus buiten 'zijn blok'.

Retourwaarden met return

Wil je de waarde in het hoofdprogramma gebruiken, dan moet je het met een return opleveren aan het hoofdprogramma.</p>

We bekijken nu het voorbeeld hieronder. Voor regelnummers: Klik op de balk boven de code en dan op L.
Een lokale variabele verdubbelde_punten wordt in de functie op regel 3 gedeclareerd, waar het de waarde 26 krijgt (punten * 2). Na regel 4 houdt het inspringen op, dat is het einde van de functie. Als de functie ophoudt, bestaat verdubbelde_punten niet meer. Om de verdubbelde waarde in het hoofdprogramma te kunnen printen (op regel 8) moet zowel:

  1. De functie de verdubbelde waarde opleveren met een return (regel 4), en
  2. In het hoofdprogramma de opgeleverde waarde opgeslagen worden in een variabele nieuwe_punten(regel 7). Merk op dat je deze variabele een andere naam mag geven.

Parameters

Met parameters kun je vanuit het hoofdprogramma waarden (extra informatie) aan een functie geven. Bekijk het voorbeeld hierboven nogmaals:

Zie het volgende filmpje voor extra uitleg over functies en parameters:

Video uitleg over Functies en parameters

Opgave 6.1.1 Bereik van variabelen

Als je de code hieronder runt krijgt je een foutmelding. Lees de foutmelding en leg aan je buurman of buurvrouw uit wat het probleem is.

Voorbeeld uitwerking

H6.2 - Functies met retourwaarde

Een functie kan informatie opleveren, dat informatie heet de retourwaarde. Dat resultaat moet je in je hoofdprogramma in een variabele opslaan. In je programma kun je later met dat variabele verder werken.

In de code hieronder wordt de functie kiesWillekeurigeCompliment() aangeroepen in de hoofdprogramma. De retourwaarde van kiesWillekeurigeCompliment() is een gekozen_compliment. De retourwaarde wordt teruggeven aan het hoofdprogramma en moet opgeslagen worden in de variabele compliment_van_de_dag. De bijbehorende stroomdiagram zie je onder de code.

Stroomdiagram hoofdprogramma Stroomdiagram kiesWillekeurigCompliment

Opgave 6.2.1 Dobbelen

Schrijf een programma dat voor een Monopoly spel twee dobbelstenen werpt. Het programma bestaat uit twee onderdelen:

  1. Een functie gooiDobbelsteen() dat een willekeurig een getal tussen de 1 en 6 bepaalt en deze retourneert. Het linker stroomdiagram hieronder toont de werking van de functie gooiDobbelsteen().
  2. Het hoofdprogramma waarin je:
    • De functie gooiDobbelsteen aanroept en het resultaat in de variabele eersteDobbelworp opslaat.
    • De functie gooiDobbelsteen een tweede keer aanroept en het resultaat in de variabele tweedeDobbelworp opslaat.
    • De uitkomst van beide worpen uitprint. Het rechter stroomdiagram hieronder toont de algoritme voor het hoofdprogramma.
Stroomdiagram voor functie <code>gooiDobbelsteen()</code>
Stroomdiagram voor hoofdprogramma van <code>dobbelen</code>

Het linker stroomdiagram beschrijft de functie gooiDobbelsteen(), het rechter beschrijft het hoofdprogramma.

Voorbeeld uitwerking

H6.3 - Functies met retourwaarden en parameters

Voor de meeste berekeningen heb je informatie (parameters) nodig en lever je ook een retourwaarde (resultaat) op.

Bekijk de code hieronder. De functie plakWoordenAanElkaar() krijgt twee woorden als parameters binnen, plakt deze aan elkaar en slaat het samengestelde woord op in de variabele resultaat.

We bekijken hoe de code wordt uitgevoerd:</p>

  1. Python leest code van boven naar beneden, maar slaat definities over.
  2. Op regel 7 wordt de functie plakWoordenAanElkaar() aangeroepen met twee strings.
  3. De code springt dan naar regel 2, de definitie van de functie. Hier wordt bepaald dat de eerste string "fiets" in de variabele woord1 wordt opgeslagen, en de tweede string "bel" in variabele woord2.
  4. Op regel 3 worden de twee teksten aan elkaar geplakt en wordt het samengestelde woord opgeslagen in de variabele resultaat
  5. Op regel 4 wordt met een return de waarde van resultaat opgeleverd.
  6. De functie is afgelopen en gaat terug naar regel 7. De variabelen woord1, woord2 en resultaat werden in de functie gemaakt en bestaan alleen in de functie. Na regel 4 bestaan ze niet meer.
  7. Op regel 7 wordt de waarde van resultaat, namelijk "fietsbel" teruggegeven aan het hoofdprogramma. Om "fietsbel" in het hoofdprogramma te onthouden wordt het resultaat opgeslagen in de variabele samenstelling.
  8. Op regel 8 wordt de variabele samenstelling afgedrukt.

Merk op dat:

Opgave 6.3.1 Een berekening retourneren

Lees de code hieronder.

  1. Bedenk een zinvolle naam voor de functie berekenIets(). Pas het ook aan in de code. Run je code op te controleren dat het nog goed werkt.
  2. Geef ook zinvolle namen aan de variabelen a en b. Pas het ook aan in de code. Run je code op te controleren dat het nog goed werkt.
  3. Wat is het levensduur van korting? Dat wil zeggen, op welke regelnummer wordt het aangemaakt? En na welk regelnummer houdt het op met bestaan?

Voorbeeld uitwerking

Opgave 6.3.2 Fietsen en wielen

De functie telAantalWielen() telt, aan de hand van het aantal fietsen, hoeveel wielen er zijn en print deze. Het aantal_wielen is een lokale variabele en bestaat dus alleen binnen de functie.

Maar, op regel 8 willen we het aantal kunnen printen in een volzin. De uitvoer van je programma moet zijn: "Met 10 fietsen heb je 20 wielen."

  1. Haal het commentaar '#' op regel 8 weg. Welke foutmelding krijg je? Leg uit wat het probleem is.
  2. Los het probleem op. Om het aantal_wielen op regel 8 te kunnen gebruiken moeten er 2 dingen gebeuren:
    1. Aan het einde van de functie telAantalWielen(), moet de variabele aantal_wielen worden opgelevert (het wordt nu alleen op regel 4 geprint, maar niet opgeleverd), en
    2. De waarde dat opgeleverd wordt door de functie moet worden opgeslagen op regel 7 (tip: aantal_wielen = ... )
  3. Test je functie. Krijg je de uitvoer dat verwacht wordt?

Voorbeeld uitwerking

Opgave 6.3.3 Toetscijfer berekenen

Je cijfer op een wiskundetoets bestaande uit 60 punten wordt zo berekend:
cijfer = ( aantal_punten*9 ) / 60 + 1
Heb je 40 punten gehaald, dan is je cijfer een 7.


DEEL A: Schrijf een functie berekenCijfer( aantal_punten ) dat, gegeven het aantal behaalde punten, je cijfer uitrekent.

  1. Op regel 3 zet je de functiedefinitie, dus de naam van de functie en tussen haakjes de parameter, en een : aan het einde van de regel
  2. Op regel 4 zet je de berekening van het cijfer
  3. Op regel 5 retourneer je het resultaat

DEEL B: Roep de functie aan en print je eindcijfer.

  1. Roep de functie op regel 9 aan met berekenCijfer( 40 ) en sla het resultaat op in een variabele
  2. Op regel 10 print je het behaalde cijfer.

Voorbeeld uitwerking

Opgave 6.3.4 Volume van een balk

Schrijf een functie die het volume van een balk berekent en oplevert:

Voorbeeld uitwerking

H6.4 - Globale variabelen

Globale variabelen zijn waarden die je voor meerdere functies van je programma nodig hebt. Globale variabelen definieer je bovenaan je programma. Het verschil met lokale variabelen is dat lokale variabelen alleen zichtbaar zijn binnen de functie of blok code waarin ze gedeclareerd worden.

Het is een goede gewoonte om zo min mogelijk globale variabelen te gebruiken. Als je een variabele in een aantal functies gebruikt en de waarde aanpast, wordt het onoverzichtelijk wat er allemaal met die waarde gebeurt. Zo wordt het lastig om te redeneren over wat je code doet, en maakt het opsporen van fouten nog lastiger.

Als je een bepaalde waarde binnen meerdere functies wilt gebruiken kun je dat het beste doen door ze door te geven als parameters en retourwaardes. In het voorbeeld hieronder zie je hoe de prijs (zonder BTW) als parameter aan de functie wordt gegeven, en de prijs inclusief BTW wordt geretourneerd.

Constanten

Constanten zijn waarden die gedurende het programma niet veranderen, maar die je in je programma wel op meerdere plekken gebruikt. De naam van een constante geef je met hoofdletters aan en zet je bovenaan je programma. Om het voorbeeld hieronder zie je dat er voor PERC_BTW een constante wordt gebruikt.

Terwijl het programma draait zul je het percentage van de BTW niet veranderen. In tegenstelling, een score zal gedurende een spelletje wel veranderen. Maar, als de overheid kiest om de BTW aan te passen, dan kan dat heel makkelijk bovenaan de code teruggevonden worden en hoeft het maar op 1 plek aangepast worden.

Opgave 6.4.1 Constanten

Speel met een vriend of vriendin een paar keer steen-papier-schaar. Houd op een blaadje bij hoe vaak ieder gewonnen heeft en hoe vaak er gelijk is gespeeld.

Bekijk je scoreblad en bepaal wat de constanten en wat de variabelen zijn.

Voorbeeld uitwerking


H6 - Functies (deel 2): Afsluitende Opgaven

Met de volgende afsluitende opgaven kun je kijken hoe goed je de stof beheerst. Controleer steeds je eigen oplossing met de voorbeeldoplossing.


Afsluitende opgave 6.1 Vind de fout

Voer de onderstaande code uit. Wat is er fout aan de volgende code? Waar komt "None" vandaan achter "De berekende oppervlakte"? Los het probleem in de functie op!

Voorbeeld uitwerking

Afsluitende opgave 6.2 Munt opgooien

Schrijf een programma dat een munt opgooit. Het linker stroomdiagram hieronder geeft aan hoe het hoofdprogramma eruitziet. Het rechter stroomdiagram toont de functie gooiMunt().

Stroomdiagram van hoofdprogramma voor opdracht Munt opgooien Stroomdiagram van functie gooiMunt

Schrijf hiervoor een functie gooiMunt() die willekeurig een tekst "KOP" of "MUNT" teruggeeft, zoals in het stroomdiagram hieronder wordt weergegeven. Maak gebruik van een willekeurig gekozen getal dat 0 of 1 wordt. Als deze 0 is, dan wordt het "KOP", anders "MUNT". In je hoofdprogramma roep je de functie gooiMunt() aan en druk je het resultaat af.

Voorbeeld uitwerking

Afsluitende opgave 6.3 Geldig emailadres

Schrijf een programma dat de gebruiker om een email adres vraagt en controleert of deze geldig is. Het volgende stroomdiagram geeft het algoritme van het hoofdprogramma weer:

Stroomdiagram van hoofdprogramma voor opdracht Munt opgooien

Om je code overzichtelijk te houden maak je natuurlijk gebruik van functies:

  1. Schrijf een functie vraagInvoer() dat de gebruiker om een invoer vraagt, de gebruiker netjes print wat hij heeft ingevoerd, en deze retourneert. Test je functie.
  2. Schrijf een functie controleEmailadres() dat een emailadres als parameter krijgt en op de eisen controleert. In het geval dat het emailadres niet voldoet geef de feedback over er precies mis mee is en return False. Als het emailadres goed is meldt dat aan de gebruiker en return True.
    • Het moet minstens 5 en maximaal 20 karakters bevatten
    • De volgende vreemde tekens mogen niet voorkomen: "?", "%", "&"
    • Een apenstaartje "@" en een punt "." moeten wel voorkomen
  3. In het hoofdprogramma gebruik je de functies vraagInvoer() en controleEmailadres(). Als het emailadres geldig is, print Toegang verleend en anders Jammer.
  4. Test het programma met verschillende invoeren.

Voorbeeld uitwerking

Afsluitende opgave 6.4 Deelbaar door 7

  1. Schrijf de functie isDeelbaarDoor7() dat een getal als parameter krijgt, het resultaat True retourneert als een gegeven getal deelbaar is door 7, en anders False.
  2. Roep de functie isDeelbaarDoor7() aan vanuit je hoofdprogramma.
  3. Sla het resultaat van de functie op in een variabele.
  4. Druk de waarde van dit variabele af het hoofdprogramma af.
  5. Test je functie met verschillende waarden.
  6. Schrijf commentaar bij je code. Geef aan wat de invoer en uitvoer is, en voor welke waarden je programma werkt.

Tips: Met modulo ( % ) kun je bepalen of iets even is of niet. Bijvoorbeeld:

Voorbeeld uitwerking

Afsluitende opgave 6.5 BMI

De Body Mass Index (BMI) geeft een schatting van het gezondheidsrisico van je lichaamsgewicht in verhouding tot je lichaamslengte. Schrijf een programma dat een gebruiker om zijn gegevens vraagt (deel A), de BMI berekend (deel B) en vervolgens een advies geeft (deel C). Het linker stroomdiagram geeft het algoritme voor het hoofdprogramma weer. Het rechter stroomdiagram laat zien hoe het advies gegeven wordt (deel C).

Stroomdiagram van hoofdprogramma voor opdracht BMI Stroomdiagram voor BMI advies

Deel A. Invoer vragen

  1. In je hoofdprogramma vraag de gebruiker om de lengte (in meters) en gewicht (in kilogram) in te tikken. Bedenk dat het kommagetallen zijn, gebruik dus float in plaats van int.

DEEL B. BMI berekenen
De BMI bereken je door het gewicht in kilo’s te delen door de lengte in meters in het kwadraat. Als je bijvoorbeeld 1,62 meter lang bent en 56 kilo weegt, heb je een BMI van 21,4:
berekening: (56 /(1.62 * 1.62))

  1. Schrijf een functie die de BMI berekend. Deze krijgt lengte en gewicht als parameters mee en geeft als resultaat de BMI terug.
  2. Roep je functie aan in het hoofdprogramma.
  3. Sla het resultaat van je functie (dus de BMI) op in het hoofdprogramma, en print het daarna.

Deel C. Advies geven
Een BMI-score van 18,5 wordt als te licht gezien, tussen de 18,5 en de 25 heb je een gezond gewicht en daarboven heb je overgewicht.

  1. Schrijf een functie die de BMI krijgt en als resultaat advies teruggeeft, zoals in het stroomdiagram hieronder. Het advies luidt:
    • Bij een BMI kleiner of gelijk aan 18,5: Je mag best wel wat aankomen.
    • Bij een BMI groter dan 18.5 en kleiner dan 25: Blijf op dit gewicht.
    • Bij een BMI groter of gelijk aan 25: Je kunt het beste wat afvallen. </ol>
    • Roep je functie aan in het hoofdprogramma.
    • Print het resultaat van je functie, dus het advies aan de gebruiker.

Voorbeeld uitwerking