Uitwerking toets#

Opgave 1#

Bij deze opgave gaat het om het toekennen van waarden aan variabelen en bewerkingen met deze variabelen uit te voeren.

feet = 6
inches = 3

centimeter = (feet * 12 + inches) * 2.54

meter = centimeter // 100
centimeter = centimeter % 100

print(f"{meter} meter en {centimeter} centimeter")
1.0 meter en 90.5 centimeter

Gegeven is hoe je op basis van feet en inches tot een totaal aantal inches kan komen, vermenigvuldig dit met 2,54 om vervolgens tot het totaal aantal centimeters te komen. Bedenk dat je de floor division // kan gebruiken hoeveel keer 100 (1 meter is 100 centimeter) in het aantal centimeters past. Voor het aantal centimeters dat overblijft is modulo % geschikt want dat geeft een restant terug.

We gebruiken hier een f-string voor het formatteren van een string met waarden, maar het volgende is ook heel goed mogelijk

print(meter, "meter en", centimeter, "centimeter")

Opgave 2#

Deze opgave gaat over conditional statements en met name over het uitsluiten van mogelijkheden.

s = 100

if s >= 252:
    print(5)
elif s >= 209:
    print(4)
elif s >= 178:
    print(3)
elif s >= 154:
    print(2)
elif s >= 119:
    print(1)
elif s >= 63:
    print("TS")
else:
    print("TD")
TS

Het volstaat hier om te controleren op de laagste waarden want dat is een begrenzing van de categorieën. Maar andere uitwerkingen zijn mogelijk, bijvoorbeeld

if s >= 252:
    print(5)
elif s >= 209 and s <= 251:
    print(4)
elif s >= 178 and s <= 208:
    ...

of

if s >= 252:
    print(5)
elif 209 >= s <= 251:
    print(4)
elif 178 >= s <= 208:
    ...

Opgave 3#

Deze opgave gaat over lezen en begrijpen van code, maar ook aanpassingen kunt doen waar je gebruik maakt van de fouten (feedback) die Python geeft. Je ziet hier de gecorrigeerde code

def remove_double(L):
    """Verwijder dubbele waarden uit een list

    Deze functie accepteert een list L en geeft een list
    met de unieke elementen in L terug als resultaat.
    """
    if len(L) == 0:
        return L
    if L[0] in L[1:]:
        return remove_double(L[1:])
    return [L[0]] + remove_double(L[1:])
assert remove_double([1, 4, 2, 3, 2]) == [1, 4, 3, 2]

Opgave 3a#

  • Deze functie geeft een list terug, dit betekent ook dat de base case een list moet teruggeven (hier wordt nu L teruggegeven, een lege list)

  • Gecontroleerd moet worden of het eerste element (L[0]) zich in ook in de rest (L[1:]) van de lijst bevindt

  • De rest van de lijst (L[1:]) zal in de recursieve aanroep moeten worden doorgegeven.

  • Het resultaat van de lijst is een list, om L[0] aan de lijst toe te voegen zal het in een list moeten worden gezet ([L[0]]). Want een list + een list geeft een nieuwe list.

Opgave 3b#

Een docstring documenteert de functie en geeft beknopte informatie over wat de functie doet en eventueel verdere informatie over de parameters die worden geaccepteerd en de returnwaarde. Dit is een vrij tekstveld, zorg er voor dat je voldoende de kenmerken van de functie hier beschrijft.

Opgave 3c#

Voeg extra assertions (tests) toe. Ga hier op zoek naar bijzondere gevallen of bedenk variaties op de gegeven assertion, bijvoorbeeld

assert remove_double([1, 2, 3, 4]) == [1, 2, 3, 4]
assert remove_double([]) == []
assert remove_double([4, 4, 4, 4]) == [4]

Opgave 4#

Deze opgave gaat over het kunnen herkennen van base- en recursive case(s) en het algoritme kunnen omzetten naar code.

def check_extension(s, e):
    if len(e) == 0:
        return True

    if len(s) == 0:
        return False

    if e[-1] != s[-1]:
        return False
    else:
        return check_extension(s[:-1], e[:-1])
assert check_extension("tentamen.docx", ".exe") == False
assert check_extension("program.exe", ".exe") == True
assert check_extension("wk8ex1.py", ".py") == True

Opgave 5#

Deze opgave gaat over het ontwerpen van een algoritme op basis van een probleembeschrijving en de regels die gelden.

Opgave 5a#

Beschrijf in eigen woorden de handelingen die de gevangenen moeten uitvoeren. Denk hier ook aan opgave 4 waar uiteindelijk een algoritme, of stappenplan wordt gegeven.

Een beschrijving zou als volgt kunnen zijn. Een dief pakt een getal uit de beker en controleert of het een even getal is. Als het een oneven getal is fluistert hij direct False aan de buurman waar hij eerder het kopje heeft gekregen (de linkerbuur). Anders geeft hij het kopje door naar de volgende (de rechterbuur) en wacht op wat hem teruggefluisterd wordt en geeft dat door aan de linkerbuur. Het is eenvoudig als het kopje leeg is want dan wordt direct True teruggefluisterd en hoeft het kopje niet te worden doorgegeven.

Opgave 5b#

Als het goed is zou je de strategie die je hebt bedacht kunnen vertalen naar een oplossing in code.

def all_even(L):
    if len(L) == 0:  # leeg kopje ...
        return True

    if L[0] % 2 == 0:  # even, geef de rest van het kopje door en fluister het antwoord terug
        return all_even(L[1:])
    else:  # het getrokken getal is niet even
        return False
assert all_even([1, 2, 3, 4]) == False
assert all_even([2, 4, 6, 8]) == True

Opgave 6#

Deze opgave gaat over het ontwerpen en schrijven van een hulpfunctie in combinatie met een hoofdfunctie.

Opgave 6a#

Ook hier wordt gevraagd eerst goed na te denken over het probleem om vervolgens tot een stappenplan te komen. Dit lijkt weer veel op opgave 5a, een mogelijke (beknopte) beschrijving zou als volgt kunnen zijn.

  • als s leeg is dan valt er verder niets te controleren en geef je True terug, want g moet met s beginnen (en die is leeg en dat is prima)

  • als g leeg is dan valt er ook niets te controleren en geef je False terug, want een groet g moet aanwezig zijn om te controleren voor s

  • als het eerste karakter van s niet gelijk is aan het eerste karakter van g, geef dan False terug

  • anders herhaal je de bovenstaande handelingen voor de zowel s als g zonder de eerste karakters (want die zijn zojuist al gecontroleerd)

Opgave 6b#

Op basis van het bovenstaande algoritme zou een oplossing als volgt zijn

def starts_with(g, s):
    if not s:  # of if len(s) == 0
        return True
    if not g:  # of if len(g) == 0
        return False

    if g[0] != s[0]:
        return False
    else:
        return starts_with(g[1:], s[1:])
assert starts_with("hoi", "hoi") == True
assert starts_with("hoipiepeloi", "hoi") == True
assert starts_with("hey", "h") == True
assert starts_with("moi", "hoi") == False
assert starts_with("", "hoi") == False
assert starts_with("ho", "hoi") == False

Opgave 6c#

Deze functie zal gebruik gaan maken van de zojuist geschreven hulpfunctie en implementeert de regels zoals afgesproken met de manager van de bank

def greeting(g):
    if starts_with(g, "hello"):
        return 0
    elif starts_with(g, "h"):
        return 20
    else:
        return 100
assert greeting("dit is een test") == 100
assert greeting("hoi") == 20
assert greeting("hello world") == 0

Mocht je de functie starts_with niet hebben kunnen schrijven dan kan je volgens de tip als alternatief het volgende gebruiken

def greeting(g):
    if g.find("hello") == 0:
        return 0
    elif g.find("h") == 0:
        return 20
    else:
        return 100
assert greeting("dit is een test") == 100
assert greeting("hoi") == 20
assert greeting("hello world") == 0