Oplossingen PGM1 Oefententamen#
Dit zijn de antwoorden op de opgaven in het Proeftentamen PGM1 en we nemen je stap voor stap mee in de uitwerkingen.
Belangrijk
Let op, de opgaven kunnen op verschillende manieren worden opgelost, het kan zijn dat jij sommige dingen anders hebt geschreven of andere stappen hebt gevolgd en dat is prima!
Opdracht 1#
In deze opdracht wordt jou om het volgende gevraagd:
het gebruik van variabelen (toekenning en hergebruik)
rekenkundige operaties (optelling en vermenigvuldiging)
de print functie voor output
Oplossing#
opbrengst_tomaten = 150
opbrengst_paprikas = 120
opbrengst_komkommers = 80
totale_opbrengst = opbrengst_tomaten + opbrengst_paprikas + opbrengst_komkommers
totale_omzet = opbrengst_tomaten * 3.24 + opbrengst_paprikas * 2.87 + opbrengst_komkommers * 1.48
print(totale_opbrengst, totale_omzet)
350 948.8000000000001
Uitleg#
Variabelen toekennen
opbrengst_tomaten = 150 opbrengst_paprikas = 120 opbrengst_komkommers = 80
Hier maken we drie variabelen aan en kennen er direct waarden aan toe. Een variabele is als een doos waar je een waarde in kunt bewaren om later te gebruiken. De = is een toekenningsoperator (geen ‘is gelijk aan’ zoals in wiskunde).
Berekening totale opbrengst
totale_opbrengst = opbrengst_tomaten + opbrengst_paprikas + opbrengst_komkommers
Hier tellen we de waardes van de drie variabelen bij elkaar op met de + operator en slaan het resultaat op in een nieuwe variabele ‘totale_opbrengst’. Dit wordt: 150 + 120 + 80 = 350 kg.
Berekening totale omzet
totale_omzet = opbrengst_tomaten * 3.24 + opbrengst_paprikas * 2.87 + opbrengst_komkommers * 1.48
Hier berekenen we de omzet door:
tomaten: 150 * €3,24
paprika’s: 120 * €2,87
komkommers: 80 * €1,48
En tellen deze bedragen bij elkaar op. De * is de vermenigvuldigingsoperator in Python.
Resultaten printen
print("Totale opbrengst =", totale_opbrengst, round(totale_omzet,2))
De print() functie wordt gebruikt om resultaten te tonen:
De tekst “Totale opbrengst =” wordt letterlijk getoond
totale_opbrengst toont de berekende kilogrammen
round(totale_omzet,2) rondt de berekende omzet af op 2 decimalen
De komma’s in de print functie zorgen voor spaties tussen de onderdelen
Opdracht 2#
In deze opdracht wordt jou gevraagd conditionele statements te schrijven (met andere woorden if
, elif
en else
combinaties).
windspeed = 150 # is niet nodig, maar is handig om je code te testen.
if windspeed >= 252:
print(5)
elif windspeed >= 209:
print(4)
elif windspeed >= 178:
print(3)
elif windspeed >= 154:
print(2)
elif windspeed >= 119:
print(1)
elif windspeed >= 63:
print("TS")
else:
print("TD")
1
Opdracht 3#
Deze opdracht vraagt jou of je een for
-lus begrijpt en fouten kan vinden en corrigeren.
def over_hundred(L):
result = 0
for i in range(len(L)): # L[i] verzaakt een indexerror, oplossing is range te gebruiken. Andere optie is om L[i] te vervangen met i.
result = result + L[i] # result wordt twee keer opgeteld door het gebruik van +=.
if result > 100:
return True
return False # De return stond in de for lus maar moet juist aan het einde van de for lus staan.
test = [12,13,14]
print(over_hundred(test)) # lc bestaat niet. vervangen met test. Het is ook mogelijk om test te vervangen met lc
False
Opdracht 4#
Deze opdracht vraagt jou om een while
-lus te schrijven.
count = 0 # bijhouden hoeveel getallen er zijn ingevuld
som = 0 # bijhouden de waarde van de getallen
inp = int(input("Geef positief getal: ")) # vragen om input
while inp >= 0: # Blijf herhalen zolang de input positief is,
count = count + 1 # counter verhogen
som = som + inp # nieuwe input optellen
inp = int(input("Geef positief getal: ")) # vraag voor nieuwe input
print("som", som, "aantal", count) # print resultaat
Opdracht 5#
Deze opdracht vraagt jou om een dubbele for
-lus te schrijven.
def number_stairs(size): # defineer de functie
for y in range(1, size + 1): # aantal rijen is gelijk aan size. De plus 1 zorgt ervoor dat er geteld wordt vanaf 1 tot en met n.
for x in range(1, y + 1): # aantal kolommen is gelijk aan de huidige rij.
print(x, end="") # print het getal. De end="" zorgt ervoor dat er geen volgende regel wordt geprint
print() #einde van de rij bereikt, print einde regel.
number_stairs(5) # roep de functie op. Gezien de functie zelf al print, is hier geen print nodig.
1
12
123
1234
12345
Opgave 6#
In deze opdracht moet je zelf een probleem kunnen oplossen en verwacht dat je gebruik kan maken van:
lussen
strings, en in in het bijzonder string slicing.
Bij deze opdracht moet ook een docstring en drie assertions worden toegevoegd.
Oplossing#
def end_check(phrase):
"""Geeft de langste substring terug die aan het begin en aan het einde van de string phrase staat, zonder te overlappen.
"""
max_length = len(phrase) // 2
for i in range(max_length):
begin = phrase[:max_length]
end = phrase[0 - max_length:]
max_length -= 1
if begin == end:
return begin
return ""
# drie assertions
assert end_check("test") == "t"
assert end_check("testing") == ""
assert end_check("123test123") == "123"
Uitleg#
Ten eerste, laten we kijken naar wat de functie moet doen:
We zoeken een substring (een deel van de tekst) die zowel aan het begin als einde staat
Deze substrings mogen niet overlappen
We willen de langste mogelijke substring vinden die aan deze voorwaarden voldoet
Laten we de code regel voor regel doornemen:
max_length = len(phrase) // 2
Dit bepaalt de maximale lengte van de substring die we kunnen zoeken
We delen door 2 omdat de substrings niet mogen overlappen
Bijvoorbeeld: bij “123test123” is len(phrase) = 10, dus max_length = 5
De
//
betekent delen en naar beneden afronden naar een heel getal
Dan hebben we een lus:
for i in range(max_length):
Let op, de variabele
i
wordt nergens in de lus gebruikt, maar is nodig vanwege de Python syntax. We hadden ookfor _ in range(max_length):
kunnen schrijven om aan te geven dat we de variabele niet gebruiken (dit is een Python conventie)We gebruiken de lus puur om een bepaald aantal keren iets te proberen, namelijk steeds
max_length
keer
Een belangrijk onderdeel! We gebruiken hier gebruik van de mogelijkheid om met negatieve indices te werken:
begin = phrase[:max_length] end = phrase[0 - max_length:]
phrase[:max_length]
pakt een substring vanaf het begin totmax_length
phrase[0 - max_length:]
gebruikt een negatieve index om een substring vanaf het einde te pakkenDit is een heel handige eigenschap van Python: negatieve indices tellen vanaf het einde!
Bij “123test123” met max_length = 3:
begin = “123” (substring van eerste drie karakters)
end = “123” (substring van laatste drie karakters want -3 betekent: pak de laatste 3)
Je kunt het zien als: -3 betekent “3 vanaf rechts”
We maken
max_length
steeds kleiner:max_length -= 1
Dit is hetzelfde als
max_length = max_length - 1
Het beïnvloedt alleen welk deel van de string we bekijken in de volgende iteratie
Als max_length start met 5, gebeurt dit:
Eerste iteratie: i=0, max_length wordt 4
Tweede iteratie: i=1, max_length wordt 3
Derde iteratie: i=2, max_length wordt 2
Vierde iteratie: i=3, max_length wordt 1
Vijfde iteratie: i=4, max_length wordt 0
Belangrijk
Dat we
max_length
steeds verminderen heeft geen invloed op hoeveel keer de lus uitgevoerd wordt!range(max_length)
wordt namelijk maar één keer bepaald, aan het begin van de lusAls
max_length
start met 5, dan maaktrange(5)
een vaste reeks[0, 1, 2, 3, 4]
Ook al verminderen we
max_length
binnen de lus, deze reeks blijft hetzelfdeDe lus zal dus gewoon 5 keer uitgevoerd worden
We controleren of we een match hebben:
if begin == end: return begin
Als de substring aan het begin gelijk is aan de substring aan het einde, hebben we een match
We geven deze substring meteen terug omdat we weten dat dit de langste is
Als we geen match vinden:
return ""
Als we de hele lus doorlopen zonder match, geven we een lege string terug
Laten we een voorbeeld doorlopen met “123test123”:
Eerste iteratie (i=0, max_length=5):
begin substring = “123te”
end substring = “t123”
Geen match, max_length wordt 4
Tweede iteratie (i=1, max_length=4):
begin substring = “123t”
end substring = “t123”
Geen match, max_length wordt 3
Derde iteratie (i=2, max_length=3):
begin substring = “123”
end substring = “123”
Match gevonden! Return “123”
Dit verklaart ook de andere voorbeelden:
“test” → vindt substring “t” (langste match aan begin en eind)
“testing” → vindt geen enkele matchende substring, dus “”
“123test123” → vindt substring “123”
“xxx” → vindt substring “x” (langere substrings zouden overlappen)
Opdracht 7#
In deze opdracht moet er een context probleem opgelost worden met behulp van een hulpfunctie.
a.
def count_char(zin, let):
"""
Deze functie kriigt twee strings binnen waarbij zin een hele zin is en let een enkele letter.
De functie geeft terug hoe vaak let voorkomt in zin.
"""
result = 0 # om te tellen is er een counter nodig
for x in zin: # ga alle characters in de zin door
if x == let: # als de character gelijk is aan let
result += 1 # tel er 1 bij op
return result # als de lus klaar is, geef het antwoord terug
assert count_char("testing", "e") == 1
assert count_char("testing", "a") == 0
assert count_char("testing", "t") == 2
b.
def max_freq_letter(z):
"""
functie max_freq_letter(z) accepteert een string z .
Deze functie moet het karakter in z teruggeven met de hoogste frequentie.
"""
result = "" # resultaat moet een string zijn
max_let = 0 # huidige maximum
for x in z: # ga alle characters in de zin langs
count = count_char(z, x) # tel hoevaak x voorkomt in z
if count > max_let: #Komt x meer voor dan de huidige 'winnaar'
max_let = count #Zo ja, vervang met nieuwe aantal
result = x # vervang 'winaar'met nieuwe x
return result #geef resultaat terug.
assert max_freq_letter("testing") == "t"
assert max_freq_letter("ditiseentest") == "t"
assert max_freq_letter("hottentotten") == "t"