Oefenopgaven
Contents
2.8. Oefenopgaven#
2.8.1. Scripts#
Je eerste script
Kopieer en plak de inhoud van het code-blok uit de tekst naar een vers editor-venster in IDLE.
Sla het script op: geef het een goede naam en plaats het in een geschikte map. Druk op F5, of klik Run > Run Module (Run > Run in Spyder) in het menu en kijk vervolgens of je iets ziet gebeuren in het IDLE Shell venster of the Spyder Console.
2.8.2. Scripts met in- en uitvoer#
Print meerdere uitkomsten
Kopieer-en-plak het onderstaande script naar IDLE (de editor), sla het script op (geef het een goede naam en plaats het in een geschikte map) en voer het uit.
a = 12
b = 34
print(b)
Pas de code zo aan dat zowel variabele
aalsbgeprint wordt. De output zou er als volgt uit moeten zien.
12
34
Pas vervolgens de code aan zodat de variabelen
a,bgeprint worden, vervolgens een regel---- +, gevolgd door de som vanaenb. Zie hieronder voor het gewenste resultaat.
12
34
---- +
46
Invoer
print('We gaan a en b optellen.')
a = input('Wat is a? ')
b = input('Wat is b? ')
print('a + b:')
print(a + b)
Kopieer het bovenstaande blokje code naar een nieuw script en voer het uit. Probeer, wanneer er om input gevraagd wordt, verschillende types variabelen (getallen, letters, …) uit.
Had je het resultaat wat je krijgt verwacht? Als dat niet zo is, gaan we dit in de volgende opgave verbeteren.
Invoer, conversie naar getallen
print('We gaan a en b optellen.')
a = float(input('Wat is a?\n'))
b = float(input('Wat is b?\n'))
print('a + b:')
print(a + b)
Kopieer dit blokje code naar een nieuw script. Als je het uitvoert, krijg je als het goed is netjes de som van je invoer terug. Wat gebeurt er echter als je bij de invoer niet een getal, maar een letter invoert?
Eigenlijk zou het dus beter zijn om de vraag iets specifieker te maken, bijvoorbeeld Voer een getal in voor a: .
De ABC-formule
from math import sqrt
print('Dit programma implementeert de abc-formule.\n Voer eerst de waarden voor a, b, en c in.\n')
a = float(input('Wat is a? \n'))
b = float(input('Wat is b? \n'))
c = float(input('Wat is c? \n'))
D = (b ** 2) - (4 * a * c)
x_1 = (-b + sqrt(D)) / (2 * a)
x_2 = (-b - sqrt(D)) / (2 * a)
print('De uitkomsten zijn: x_1 = ', x_1, 'x_2 = ', x_2)
Kopieer en plak het bovenstaande script naar een vers bestand en sla het op. Voer het script uit en geef de volgende invoer:
a = 1, b = 0, c = -9;a = 1, b = 0, c = -0;a = a, b = 0, c = -0;a = 1, b = 2, c = 3.
Wat gebeurt er bij het uitvoeren met de laatste twee combinaties van a, b, c?
2.8.3. Foutmeldingen#
Syntax Errors
Hieronder staan vijf korte stukjes code. Kan je herkennen welke een Syntax Error zullen geven? (Let op: sommige foutjes zijn erg subtiel.)
a = 1
b = 2
c = a + b
print("a + b = c)
a = 1
b = 2
c = a + b
print("a + b =" c)
a = 1
b = 2
c = a + b
print("a + b =", c)
a = 1
b = 2
c = a + b
print(a, "+", b, "=", c)
a = 1 & b = 2
c = a + b
print("a + b =", c)
TypeErrors
De onderstaande stukjes code geven allemaal een TypeError. Herschrijf de code zodat dit opgelost wordt.
a = 5
b = '6'
c = a + b
lijst1 = [7, 8, 9, 10]
lijst2 = 'abcd'
lijst3 = lijst1 + lijst2
a = '1'
b = 2
c = a / b
Errors met lijsten
In de volgende stukjes code wordt telkens met een list gewerkt, maar er gaat wat mis. Kan jij bij elk stukje vinden wat er verkeerd gaat?
lijst1 = [1, 2, 3]
lijst2 = ['a', 'b', 'c']
print(lijst1[0], lijst2[lijst1[0]])
print(lijst1[1], lijst2[lijst1[1]])
print(lijst1[2], lijst2[lijst1[2]])
lijst1 = [1, 2, 3]
lijst2 = ['a', 'b', 'c']
print(lijst1[0] / lijst2[0])
print(lijst1[1] / lijst2[1])
print(lijst1[2] / lijst2[2])
lijst1 = [1, 2, 3]
lijst2 = ['a', 'b', 'c']
print(lijst1[0], lijst1[1], lijst1[2])
print(lijst2[0], lijst2[1], lijst2[2])
print(lijst3[0], lijst3[1], lijst3[2])
Foutmeldingen in een script
Hieronder staat een erg slecht geschreven script. Probeer stap voor stap de foutmeldingen op te lossen.
a = '1.2'
b = 2.3
print(a)
print(b)
print(a + b
c = b / 0.0
print(c)
lijst = [0, 1, 2, 3, 4]
print(ljist)
print(lijst[5])
Hint - Foutmeldingen opzoeken
Je komt achtereenvolgens een SyntaxError, TypeError, ZeroDivisionError, NameError en een IndexError tegen. Deze kan je opzoeken in Soort fout.
2.8.4. Leesbaarheid#
Verbeter het commentaar
De onderstaande code kan gebruikt worden om een som van het tweede statica werkcollege op te lossen. Er staat alleen wel erg weinig commentaar bij. Vul dit aan en verbeter dit zodat duidelijk wordt wat deze code doet.
'''
Statica, Werkcollege 2, Opgave 2
'''
vector_1 = [1, 3, 2]
vector_2 = [-2, 5, 5]
vector_3 = [0, -4, 0]
grondvlak = [
vector_2[1] * vector_3[2] - vector_2[2] * vector_3[1],
vector_2[2] * vector_3[0] - vector_2[0] * vector_3[2],
vector_2[0] * vector_3[1] - vector_2[1] * vector_3[0]
]
print(grondvlak)
# Inhoud = a . ( b x c )
inhoud = grondvlak[0] * vector_1[0] + grondvlak[1] * vector_1[1] + grondvlak[2] * vector_1[2]
print(inhoud) # Het antwoord
Variabelenamen
In de onderstaande code hebben de variabelen inconsistente namen gekregen. Daarnaast zijn ze ook niet allemaal even duidelijk. Verbeter de code zodat meteen duidelijk is wat hier gebeurt.
kracht_1 = 10 # Newton
r1 = 5 # meter
banaan = kracht_1 * r1 # Nm
F_2 = -5 # Newton
arm_2 = 3 # meter
aardbei = F_2 * arm_2 # Nm
M12 = banaan + aardbei
print("Het totale moment is", M12)
Voeg commentaar toe
In het onderstaande stuk code is het redelijk eenvoudig om te ontdekken wat de variabelen betekenen, maar is de naamgeving inconsistent. Daardoor zal het later in het programmeerproces lastig worden om deze terug te vinden (‘had ik het jaartal nou als y of als jaar opgeslagen?’) Daarnaast bevat deze code geen enkel commentaar.
Lees eerst de code door om te begrijpen wat deze doet en pas daarna de namen van de variabelen aan zodat deze eenduidig zijn. Voorzie tenslotte de code van commentaar zodat het duidelijk is wat er gebeurt.
from datetime import date
Vandaag = date.today()
N = str(input('Hallo!, wat is jouw naam?\n'))
y = int(input('In welk jaar ben jij geboren? (YYYY)\n'))
Maand = int(input('En in welke maand? (MM)\n'))
D = int(input('En op welke dag (DD)\n'))
verjaardag = date(y, Maand, D)
Dagen_Geleeft = (Vandaag - verjaardag).days
print('Nou, '+N+', dan heb jij tot nu toe',str(Dagen_Geleeft),'dagen geleefd.')
De beste manier om je antwoord te controleren is door deze aan een medestudent te laten zien. Hebben jullie dezelfde keuzes gemaakt?
2.8.5. Logica#
Syntax foutjes
Kopieer-en-plak de volgende stukjes code en repareer het syntax-foutje in elk stukje. Er is telkens een hele kleine aanpassing nodig.
body_temperature = 40
threshold_temperature = 39
patient_has_fever = (body_temperature > threshold_temperature)
if patient_has_fever
print("The patient has fever.")
body_temperature = 40
threshold_temperature = 39
patient_has_fever = (body_temperature > threshold_temperature)
if patient_has_fever:
print("The patient has fever.")
print("The patient needs treatment.")
ABC-formule met negatieve discriminant
In de onderstaande code wordt de discriminant D berekend. Vervolgens wordt hier de wortel van genomen (sqrt(D)). Er volgt een cryptische foutmelding als de discriminant kleiner dan 0 is (bijvoorbeeld als a=1, b=1, c=1).
Pas het programma zo aan dat als de waarde van D kleiner dan 0 is, er geen berekening gedaan wordt, en in plaats van de uitkomsten een nette foutmelding geprint wordt. Als D wel gelijk aan of groter dan 0 is moet het programma wel gewoon werken.
from math import sqrt
a = 1
b = 1
c = 1
D = (b ** 2) - (4 * a * c)
x_1 = (-b + sqrt(D)) / (2 * a)
x_2 = (-b - sqrt(D)) / (2 * a)
print('De uitkomsten zijn: x_1 = ', x_1, 'x_2 = ', x_2)
Meer oefeningen met if, en else
Maak opdracht PYTHON If...Else 1 t/m 7 van deze website:
W3 Schools: Python Exercises
2.8.6. Herhaalde operaties#
Kwadraat van getallen in lijst
Vul het onderstaande code-blokje zo aan dat het kwadraat van de waarden uit de lijst getallen geprint wordt.
getallen = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for <iets> in <iets anders>:
doe_iets
Print de tafel van een getal
Vul het onderstaande code-blokje zo aan dat we de tafel van tafel_van laten printen.
tafel_van = 7
for getal in <iets met range()>:
print(getal, 'keer', tafel_van, 'is:')
print(getal * tafel_van)
Geldwaarde van een inventaris
Je hebt een groentenwinkel, en jouw inventaris wordt gegeven door de volgende drie lijsten.
producten = ['Aardappels', 'Appels', 'Peren', 'Radijsjes']
prijs_per_stuk = [0.20, 0.95, 1.15, 0.15]
aantal = [67, 34, 46, 123]
Gebruik een for-loop, samen met de zip() functie om voor elk van deze producten te berekenen voor hoeveel geld je aan inventaris hebt.
Extra: Welk ander variabele type zou mogelijk beter geschikt zijn om deze informatie in op te slaan?
Fibonacci getallen
Maak het onderstaande scriptje af zodat alle Fibonacci getallen tot 1000 berekend worden.
# Beginwaarden
vorige_getal = 0
huidige_getal = 1
while <iets kleiner dan iets anders>:
# Code om het volgende getal te bereken, begrijp je wat hier gebeurt?
volgende_getal = vorige_getal + huidige_getal
vorige_getal = huidige_getal
huidige_getal = volgende_getal
print(huidige_getal)
2.8.7. Geavanceerd itereren#
Voeg een extra conditie toe
namen = ["Albert", "Bertha", "Clara", "Dennis"]
cijfers = [5.8, 5.0, 8.2, 2.3]
for naam, cijfer in zip(namen, cijfers):
print(naam, cijfer)
if cijfer > 5.75:
print(naam, "heeft een voldoende!")
else:
print(naam, "heeft een onvoldoende.")
print()
Pas het bovenstaande blokje code zo aan dat het de volgende uitkomst oplevert:
Albert 5.8
Albert heeft een voldoende!
Bertha 5.0
Bertha heeft een onvoldoende.
Clara 8.2
Clara heeft een goed cijfer!
Dennis 2.3
Dennis heeft een zware onvoldoende (sorry Dennis).
Voeg if-else conditie toe
# Op welke dagen hebben we vrije uren?
rooster = {'Maandag': [3, 4],
'Dinsdag': [1, 2],
'Woensdag': [7, 8],
'Donderdag': [],
'Vrijdag': [1, 2, 5, 6, 7, 8]}
for dag, vrije_uren in rooster.items():
print('Op', dag, 'hebben we vrij op de volgende uren:', vrije_uren)
Kopieer-en-plak het bovenstaande script naar IDLE (de editor). Hoe zou je de code kunnen aanpassen zodat er de volgende output uit komt?
Op Maandag hebben we vrij op de volgende uren: [3, 4]
Op Dinsdag hebben we vrij op de volgende uren: [1, 2]
Op Woensdag hebben we vrij op de volgende uren: [7, 8]
Op Donderdag hebben we geen uren vrij!
Op Vrijdag hebben we vrij op de volgende uren: [1, 2, 5, 6, 7, 8]
Hint
Gebruik de len()-methode om het aantal elementen in een lijst op te vragen. Als daar 0 uit komt, weet je dat er geen vrije uren zijn.
Vragen over het voorbeeld
In de tekst wordt een stukje voorbeeldcode gegeven over het berekenen van scores van concepten. Bestudeer dit voorbeeld en beantwoord dan de volgende vragen.
Waarom is er gekozen om twee keer (binnen elkaar)
forte zetten?Wat is het nut van de regel
gewogen_scores[concept_naam] = 0?Kun je een
elif-conditie verzinnen als aanvulling opif concept_score < 0:?Waarom staat het laatste
print()-statement een stukje minder ver ingesprongen dan het voorgaande commando?