3.6. Oefenopgaven#

3.6.1. Functies#

Een nieuwe wortelfunctie

De functie math.sqrt geeft een foutmelding op het moment dat je als input een negatief getal invoert. Mogelijk ben je dit al eens tegengekomen.

We zouden dit graag op willen lossen door een nieuwe wortelfunctie te schrijven die, wanneer de input negatief is, een complex antwoord teruggeeft. Bij een input 9 geeft deze dus, net als de reguliere wortelfunctie, als output 3, maar bij een input -9 krijgen we nu geen foutmelding maar 3j.

Schrijf een functie genaamt my_sqrt met deze functionaliteit.

ABC-formule

Probeer het nu zelf eens door een functie te schrijven die de abc-formule uitvoert. Je kunt daarvoor de volgende stappen zetten.

  • Open een nieuw venster met een leeg script, sla dit op onder een geschikte naam.

  • Noem je functie abc_formule en geef deze drie input-argumenten: a, b en c.

  • Bereken in de functie eerst de discriminant D als tussenvariabele,

  • Bereken daarna de twee mogelijke oplossingen: x1 en x2.

  • Geef ten slotte deze twee mogelijke oplossingen terug als output.

  • Vergeet niet de functie aan te roepen met een losse regel code, bijvoorbeeld: oplossing_1, oplossing_2 = abc_formule(1, -6, 9).

  • Test als laatste je functie voor andere input-waarden. Test ook of de functie een foutmelding geeft als je bijvoorbeeld a = 0 als invoer geeft.

3.6.2. Aandachtspunten bij het schrijven van functies#

3.6.3. Functies zonder in- of output#

Een functie zonder in- of output

Probeer dit nu zelf eens uit door de twee functies uit Functies zonder in- of output te combineren in één functie zonder input of output die de huidige tijd print.

Dobbelstenen

Het getal dat je gooit met een dobbelsteen kan je zien als een functie zonder input maar met een output, namelijk het getal dat je werpt. Om dit in code te doen moeten we een willekeurig getal genereren. Daarvoor kan je de functie random.randint() gebruiken uit de module random. Om deze te kunnen gebruiken moet je deze eerst importeren met

import random
  • Schrijf twee functies: één voor een 20-zijdige dobbelsteen (d20) en één voor een 6-zijdige dobbelsteen (d6). Je mag zoals hierboven een hulpfunctie schrijven die een n-zijdige dobbelsteen simuleert.

  • Schrijf vervolgens een derde functie genaamd fireball, die voor een bordspelletje uitrekent hoeveel schade een aanval aanbrengt bij een tegenstander. Deze functie heeft de volgende functionaliteit:

  1. Definieer een variabele met waarde 0 om de maximaal aangerichte schade in bij te houden;

  2. Rol 8 keer met een 6-zijdige dobbelsteen (er moet dus een for-loop in je functie komen), de som van deze dobbelstenen is de maximale schade;

  3. Dan gooien we met een 20-zijdige dobbelsteen om te kijken of de aanval effectief aankomt, of maar slapjes. De waarde van de worp sla je op in een variabele;

  4. Als (if?) het resultaat van de 20-zijdige dobbelsteen lager dan 15 is, is het resultaat gelijk aan maximale schade;

  5. Anders is het resultaat gelijk aan de helft van de maximale schade.

  6. Geef de aangerichte schade terug als output.

  7. Roep de functie fireball een paar keer aan.

Denk ook aan de documentatie van de functies die je schrijft. Denk je dat elke medestudent direct zou begrijpen wat je code doet?

3.6.4. Flow#

Zet in de juiste volgorde

Pas de code hieronder aan zodat het liedje in de juiste volgorde komt te staan. Je mag zelf bepalen of je de for-loop laat staan en een if-statement toevoegt, of dat je de functies los aanroept. We raden het je wel aan om de eerste manier te gebruiken.

def een():
    print('1')

def twee():
    print('2')

def drie():
    print('3')

def vier():
    print('4')

def hoedje():
    print('hoedje van')

def papier():
    print('papier')

def tellen():
    een()
    twee()
    drie()
    vier()

for i in range(2):
    tellen()
    hoedje()
    papier()

3.6.5. Scope#

Wat gaat hier mis?

In de onderstaande code is er een fout gemaakt met de scope. Hierdoor voert de code niet goed uit. Lees de code goed door en probeer dit op te lossen.

import math

def discriminant(a, b, c):
    ''' Bereken de discriminant voor de abc-formule '''
    return b ** 2 - 4 * a * c

def resultaat(a, b, c, sgn=1):
    ''' Bereken het resultaat van de abc-formule
    sgn bepaalt het teken (+1 of -1) dat voor de wortel van de discriminant komt
    '''
    D = discriminant(a, b, c)
    return -b + sgn * math.sqrt(D) / (2 * a)

def abc(a, b, c):
    ''' De abc-formule voor een kwadratische vergelijking
    Input:
      - a
      - b
      - c
    Output:
      - resultaat: een lijst met de mogelijke resultaten.
                   Kan lengte 0, 1 of 2 hebben
    '''

    if D > 0:
        res1 = resultaat(a, b, c, 1)
        res2 = resultaat(a, b, c, -1)
        resultaat = [res1, res2]
    elif D == 0:
        res = resultaat(a, b, c)
        resultaat = [res]
    else:
        resultaat = []
    return resultaat

    print(abc(5, -2, -3))