pythonzomerschool

Oefenroute · Trede 1: met hints · 13 opdrachten

Extra oefening

Schrijf bij elke opdracht eerst zelf een oplossing. Test met de voorbeelden en open pas daarna de hints. De opdrachten worden stap voor stap uitdagender en eindigen met drie langere verhalen zoals je die op een tentamen kunt tegenkomen.

startZo pak je een opdracht aan

  1. Lees wat je programma moet vragen en tonen.
  2. Schrijf de oplossing zonder de hints te openen.
  3. Voer je programma uit met de verborgen testgevallen en vergelijk daarna pas de verwachte uitvoer.
  4. Zit je vast? Open eerst hint 1 en pas later hint 2.

Je hebt genoeg aan print(), input(), variabelen, int(), float(), if / elif / else, for, while, range(), functies en return.

Hoe gebruik ik de testgevallen?

Open bij een opgave Test je programma. Voer de getoonde waarden precies in je eigen Python-programma in en schrijf op welke uitvoer je krijgt.

Open daarna pas Toon verwachte uitvoer. De tekst mag er iets anders uitzien, maar het bedrag, de keuze of de berekening moet hetzelfde zijn.

niveau 1Keuzes maken

01Start

Toegangscheck

Gebruik drie antwoorden om precies één passende toegangsmelding te tonen.

Vraag om de leeftijd, of iemand student is (j/n) en of het toegangsbewijs geldig is (j/n).

  • Is het bewijs niet geldig? Toon Geen toegang.
  • Anders: jonger dan 12 krijgt Kinderkaart.
  • Anders: een student krijgt Studentenkorting.
  • Alle anderen krijgen Standaardkaart.
Test je programma 4 testgevallen

Test 1 · InvoerLeeftijd: 10
Student: n
Geldig bewijs: j

Toon verwachte uitvoerKinderkaart

Test 2 · InvoerLeeftijd: 20
Student: j
Geldig bewijs: j

Toon verwachte uitvoerStudentenkorting

Test 3 · InvoerLeeftijd: 30
Student: n
Geldig bewijs: n

Toon verwachte uitvoerGeen toegang

Test 4 · GrensgevalLeeftijd: 12
Student: n
Geldig bewijs: j

Toon verwachte uitvoerStandaardkaart

Aanname: de gebruiker typt bij de twee ja/nee-vragen altijd precies j of n.

Hint 1 — welke controle komt eerst?

Controleer eerst of het bewijs geldig is. Alleen als dat zo is, hoef je naar leeftijd en studentstatus te kijken.

Hint 2 — mogelijke structuur
leeftijd = int(input("Leeftijd: ")) student = input("Student (j/n): ") geldig = input("Geldig bewijs (j/n): ") if geldig == "n": # geen toegang elif leeftijd < 12: # kinderkaart elif student == "j": # studentenkorting else: # standaardkaart
02Start

Budgetbewaker

Zet invoer om naar getallen en vertel of een aankoop past.

Vraag om een budget en een prijs. Beide mogen een kommagetal zijn. Gebruik bij het invoeren een punt, bijvoorbeeld 12.50, omdat Python de komma hier niet als decimaalteken leest. Toon daarna één van deze meldingen:

  • Je houdt €... over als de prijs lager is dan het budget.
  • Precies genoeg als beide bedragen gelijk zijn.
  • Je komt €... tekort als de prijs hoger is.
Test je programma 3 testgevallen

Test 1 · InvoerBudget: 20.50
Prijs: 17.25

Toon verwachte uitvoerJe houdt €3.25 over

Test 2 · GrensgevalBudget: 10
Prijs: 10

Toon verwachte uitvoerPrecies genoeg

Test 3 · InvoerBudget: 10
Prijs: 12.5

Toon verwachte uitvoerJe komt €2.5 tekort
Hint 1 — invoer omzetten

input() geeft tekst terug. Gebruik float(input(...)) als een bedrag ook decimalen mag hebben.

Hint 2 — voorkom een negatief antwoord

Reken bij “over” met budget - prijs en bij “tekort” met prijs - budget.

03Basis

Cijfer met invoercontrole

Beoordeel een cijfer, maar vang onmogelijke waarden eerst af.

Vraag om een cijfer als float. Een cijfer onder 1 of boven 10 is ongeldig. Voor geldige cijfers gelden deze regels:

  • 8 of hoger: Uitstekend
  • 5,5 of hoger: Geslaagd
  • lager dan 5,5: Nog even oefenen
Test je programma 4 testgevallen

Test 1 · Ongeldige invoerCijfer: 11

Toon verwachte uitvoerOngeldig

Test 2 · InvoerCijfer: 8.4

Toon verwachte uitvoerUitstekend

Test 3 · GrensgevalCijfer: 5.5

Toon verwachte uitvoerGeslaagd

Test 4 · InvoerCijfer: 4.9

Toon verwachte uitvoerNog even oefenen
Hint 1 — controleer van buiten naar binnen

Begin met if cijfer < 1:. Gebruik daarna een elif voor cijfers boven 10 en ga dan pas verder met de geldige beoordelingen.

Hint 2 — volgorde

Controleer eerst “ongeldig”, daarna van het hoogste geldige cijfer naar beneden. Zo past elke invoer bij precies één tak.

niveau 2Herhalen met lussen

04Basis

Letterzoeker

Combineer een for-lus, een vergelijking en een teller.

Vraag om een woord of korte zin en daarna om één letter. Loop door de tekst en tel hoe vaak die letter voorkomt.

  • Begin met een teller op 0.
  • Verhoog de teller alleen als de huidige letter gelijk is aan de zoekletter.
  • Toon na de lus: De letter komt ... keer voor.
  • Bonus: toon Niet gevonden als de teller 0 is.
Test je programma 2 testgevallen

Test 1 · InvoerTekst: bananen
Zoekletter: a

Toon verwachte uitvoerDe letter komt 2 keer voor

Test 2 · Niet gevondenTekst: bananen
Zoekletter: x

Toon verwachte uitvoerNiet gevonden
Hint 1 — loop door de tekst

Met for letter in tekst: krijgt letter één voor één elk teken uit de ingevoerde tekst.

Hint 2 — teller verhogen
aantal = 0 for letter in tekst: if letter == zoekletter: aantal = aantal + 1
05Basis

Aftellen naar de lancering

Laat een while-lus achteruit tellen.

Vraag om een positief startgetal. Print alle getallen vanaf het startgetal tot en met 1, elk op een eigen regel. Print daarna Lancering!.

Test je programma 2 testgevallen

Test 1 · InvoerStartgetal: 3

Toon verwachte uitvoer3
2
1
Lancering!

Test 2 · Kleinste invoerStartgetal: 1

Toon verwachte uitvoer1
Lancering!
Hint 1 — gebruik het startgetal als teller

Zolang teller > 0 is, print je de teller en haal je er daarna 1 vanaf.

Hint 2 — mogelijke structuur
teller = startgetal while teller > 0: print(teller) teller = teller - 1 print("Lancering!")
06Pittig

Drie pogingen voor de pincode

Gebruik een while-lus met een teller én een stopvariabele.

De juiste pincode is 1234. De gebruiker krijgt maximaal drie pogingen. Bij de juiste code toon je Welkom en stop je. Na drie foute pogingen toon je Kaart geblokkeerd.

  • Bewaar de ingevoerde pincode als tekst.
  • Gebruik klaar = False om te onthouden of het programma mag stoppen.
  • Vraag niet opnieuw nadat de juiste code is ingevoerd.
  • Print nooit zowel Welkom als Kaart geblokkeerd.
Test je programma 3 testreeksen

Test 1 · Meteen goed1234

Toon verwachte uitvoerWelkom

Test 2 · Derde poging goed0000
1111
1234

Toon verwachte uitvoerWelkom“Kaart geblokkeerd” mag niet verschijnen.

Test 3 · Drie keer fout0000
1111
2222

Toon verwachte uitvoerKaart geblokkeerd“Welkom” mag niet verschijnen.
Hint 1 — twee dingen onthouden

Begin met pogingen = 0 en klaar = False. Laat de lus draaien zolang klaar == False.

Hint 2 — beslis binnen de lus
while klaar == False: code = input("Pincode: ") pogingen = pogingen + 1 if code == "1234": print("Welkom") klaar = True elif pogingen == 3: print("Kaart geblokkeerd") klaar = True

niveau 3Bouwen met functies

07Pittig

Verzendkosten berekenen

Maak een functie die één bruikbare waarde teruggeeft.

Schrijf bereken_verzendkosten(bedrag, snel). snel is "j" of "n".

  • Vanaf €50 is normale verzending gratis; daaronder kost die €4,95.
  • Snelle verzending kost altijd €8,95.
  • Gebruik return, niet print(), in de functie.
Test je functie 4 functie-aanroepen

Test 1 · Gratis grensbereken_verzendkosten(50, "n")

Toon verwachte returnwaarde0

Test 2 · Normale verzendingbereken_verzendkosten(20, "n")

Toon verwachte returnwaarde4.95

Test 3 · Snel verzendenbereken_verzendkosten(60, "j")

Toon verwachte returnwaarde8.95

Test 4 · Snel bij laag bedragbereken_verzendkosten(20, "j")

Toon verwachte returnwaarde8.95
Hint 1 — snel gaat vóór gratis

Controleer eerst of snel == "j". Dan weet je meteen welke waarde je moet teruggeven.

Hint 2 — functiegeraamte
def bereken_verzendkosten(bedrag, snel): if snel == "j": return 8.95 elif bedrag >= 50: return 0 else: return 4.95
08Pittig

Beste van drie rondes

Laat functies samenwerken zonder lijsten te gebruiken.

Schrijf eerst hoogste(a, b), die de hoogste van twee scores teruggeeft. Schrijf daarna beste_van_drie(a, b, c), die hoogste() twee keer gebruikt en de beste van drie scores teruggeeft.

  • Gebruik alleen vergelijkingen, parameters en return.
  • Roep hoogste() aan vanuit beste_van_drie().
Test je functies 3 functie-aanroepen

Test 1 · Hoogste in het middenbeste_van_drie(12, 19, 16)

Toon verwachte returnwaarde19

Test 2 · Gelijke hoogste scoresbeste_van_drie(8, 8, 5)

Toon verwachte returnwaarde8

Test 3 · Hoogste als laatstebeste_van_drie(3, 7, 11)

Toon verwachte returnwaarde11
Hint 1 — de eerste vergelijking

Bereken eerst beste_eerste_twee = hoogste(a, b).

Hint 2 — hergebruik

Geef daarna hoogste(beste_eerste_twee, c) terug. Je hoeft de vergelijking dus niet opnieuw te schrijven.

niveau 4Alles combineren

09Gevorderd

Rekenmachine die blijft draaien

Combineer functies, keuzes en een menu in een lus.

Maak een programma dat steeds om twee getallen en een keuze vraagt: +, - of stop.

  • Maak bereken(a, b, bewerking); die geeft de uitkomst terug.
  • Bij een onbekende bewerking geeft de functie de tekst Ongeldige keuze terug.
  • Het hoofdprogramma blijft vragen tot de gebruiker stop invoert.
  • Vraag na stop niet meer om getallen.
Test je programma 4 testreeksen

Test 1 · OptellenBewerking: +
Eerste getal: 7
Tweede getal: 2

Toon verwachte uitvoer9

Test 2 · AftrekkenBewerking: -
Eerste getal: 7
Tweede getal: 2

Toon verwachte uitvoer5

Test 3 · Onbekende keuzeBewerking: x
Eerste getal: 7
Tweede getal: 2

Toon verwachte uitvoerOngeldige keuze

Test 4 · Direct stoppenBewerking: stop

Toon verwachte uitvoerGeen berekening; het programma vraagt niet meer om getallen.
Hint 1 — waar vraag je om de keuze?

Vraag de bewerking bovenaan de while-lus. Controleer meteen op stop en vraag pas daarna om de twee getallen.

Hint 2 — taakverdeling

De functie rekent één keer. De while-lus regelt herhalen, invoer en printen. Houd die twee taken uit elkaar.

10Eindopdracht

Bioscoopkassa

Bouw een klein compleet programma met invoer, tarieven, herhaling en functies.

De kassa verkoopt meerdere kaartjes en houdt een totaalbedrag bij. Schrijf een functie ticketprijs(leeftijd, student) met deze prijzen:

  • jonger dan 12: €6;
  • 12 t/m 17: €8;
  • 18 jaar of ouder én student: €9;
  • alle andere bezoekers: €12.

Vraag in een while-lus steeds de leeftijd en studentstatus. Tel de teruggegeven prijs op bij het totaal en tel ook het aantal kaartjes. Vraag daarna Nog een kaartje (j/n)?. Aan het einde toon je het aantal kaartjes en het totaalbedrag.

Test je programma 3 controles

Test 1 · Functieticketprijs(11, "n")

Toon verwachte returnwaarde6

Test 2 · Grensgevallenticketprijs(12, "n")
ticketprijs(17, "n")
ticketprijs(18, "j")
ticketprijs(18, "n")

Toon verwachte returnwaarden8
8
9
12

Test 3 · Volledig programmaBezoeker 1: 10 jaar, n
Nog een kaartje: j
Bezoeker 2: 20 jaar, j
Nog een kaartje: n

Toon verwachte einduitvoer2 kaartjes
Totaal: €15
Hint 1 — bouw in twee delen

Test eerst alleen ticketprijs() met vier verschillende bezoekers. Bouw de lus pas als alle prijzen kloppen.

Hint 2 — startwaarden en lus
totaal = 0 aantal = 0 doorgaan = "j" while doorgaan == "j": # vraag gegevens # tel ticketprijs(...) op bij totaal # verhoog aantal # vraag of er nog een kaartje komt
Klaar? Doe de eindcontrole
  • Geeft de functie een prijs terug met return?
  • Wordt elk kaartje precies één keer opgeteld?
  • Stopt de lus na n?
  • Kloppen de tarieven voor 11, 12 en 17 jaar én voor een 18-jarige met en zonder studentstatus?

extraLangere opdrachten in tentamenstijl

Bij deze opdrachten staat de oplossing niet al in losse programmeerstappen voorgedaan. Haal eerst zelf de variabelen, beslissingen, herhalingen en functies uit het verhaal. Schrijf eventueel eerst een kort stappenplan op papier.

11Tentamen

De kantine op de open dag

Vertaal een prijsregeling uit een verhaal naar een functie en een hoofdprogramma.

Situatie. Tijdens de open dag verkoopt de schoolkantine broodjes voor €3 en drankjes voor €2. Leerlingen krijgen 10% korting als hun bestelling vóór korting minstens €10 kost. Aan het einde van de dag wil de kantine weten hoeveel klanten zijn geholpen en wat de totale omzet is.

Jouw opdracht: schrijf eerst de functie bereken_bestelling(broodjes, drankjes, leerling). De parameter leerling bevat "j" of "n". De functie geeft het te betalen bedrag terug.

  • Bereken eerst het bedrag zonder korting.
  • Controleer daarna met twee geneste if-blokken of de leerling recht heeft op korting.
  • Vraag in het hoofdprogramma hoeveel klanten er zijn.
  • Gebruik een for-lus om per klant de aantallen en leerlingstatus te vragen.
  • Print per klant het bedrag en na de lus het aantal klanten en de totale omzet.
Test je functie en programma 4 controles

Test 1 · Kortingbereken_bestelling(2, 2, "j")

Toon verwachte returnwaarde9.0

Test 2 · Geen leerlingbereken_bestelling(2, 2, "n")

Toon verwachte returnwaarde10

Test 3 · Onder de kortingsgrensbereken_bestelling(1, 1, "j")

Toon verwachte returnwaarde5

Test 4 · Dagoverzicht2 klanten
Klant 1: 2 broodjes, 2 drankjes, j
Klant 2: 1 broodje, 1 drankje, n

Toon verwachte einduitvoer2 klanten
Totale omzet: €14

Aanname: aantallen zijn gehele getallen van 0 of hoger en de leerlingstatus is altijd j of n.

Hint 1 — haal de onderdelen uit het verhaal

Je hebt in de functie een bedrag, één keuze over de leerlingstatus en daarbinnen een keuze over de grens van €10. Het aantal klanten en de totale omzet horen juist in het hoofdprogramma.

Hint 2 — korting berekenen

Na 10% korting blijft 90% over. Dat bereken je met bedrag = bedrag * 0.90. Vergeet daarna return bedrag niet.

12Tentamen

Fietsverhuur aan het station

Verwerk een onbekend aantal ritten en maak na afloop een dagoverzicht.

Situatie. Een fietsverhuur rekent op basis van de ritduur. Een rit van maximaal 30 minuten kost €2,50. Een rit van 31 t/m 60 minuten kost €4. Een langere rit kost €6. Voor een elektrische fiets komt altijd €3 bij de prijs. De medewerker voert ritten in totdat er geen nieuwe klant meer is.

Jouw opdracht: schrijf de functie ritprijs(minuten, elektrisch), waarbij elektrisch gelijk is aan "j" of "n". Bouw daarna het programma dat alle ritten van de dag verwerkt.

  • De functie kiest eerst het juiste tijdstarief en telt daarna eventueel €3 op.
  • Gebruik return om de ritprijs terug te geven.
  • Gebruik een while-lus en vraag na elke rit Nog een rit (j/n)?.
  • Houd het aantal ritten en de totale omzet bij.
  • Print na afloop ook de gemiddelde ritprijs: totale omzet / aantal ritten.
Test je functie en programma 4 controles

Test 1 · Korte ritritprijs(20, "n")

Toon verwachte returnwaarde2.5

Test 2 · Elektrische ritritprijs(45, "j")

Toon verwachte returnwaarde7

Test 3 · Lange ritritprijs(75, "n")

Toon verwachte returnwaarde6

Test 4 · DagoverzichtRit 1: 20 minuten, n
Nog een rit: j
Rit 2: 45 minuten, j
Nog een rit: n

Toon verwachte einduitvoer2 ritten
Totale omzet: €9.50
Gemiddelde ritprijs: €4.75

Aanname: er wordt altijd minstens één rit ingevoerd en het aantal minuten is positief.

Hint 1 — functie en lus hebben een andere taak

De functie berekent één rit. De lus vraagt invoer, roept de functie aan en werkt de dagtotalen bij.

Hint 2 — één return aan het einde

Bewaar eerst het tijdstarief in prijs. Verhoog prijs met 3 bij een elektrische fiets en zet return prijs onder de keuzes.

13Tentamen

De winnaar van de sportdag

Bereken scores, houd tijdens een lus de beste deelnemer bij en maak een eindoverzicht.

Situatie. Tijdens een sportdag krijgt iedere deelnemer drie scores van 0 t/m 10: één voor sprint, één voor verspringen en één voor werpen. De totaalscore is de som van deze drie onderdelen. De organisatie wil na afloop de winnaar én de gemiddelde totaalscore van alle deelnemers zien.

Jouw opdracht: schrijf de functie bereken_score(sprint, sprong, worp). Vraag daarna hoeveel deelnemers meedoen en verwerk ze met een for-lus.

  • Vraag per deelnemer de naam en drie gehele scores.
  • Roep de functie aan en print de totaalscore van die deelnemer.
  • Houd zonder lijst bij welke naam tot nu toe de hoogste score heeft.
  • Bij een gelijke score blijft de deelnemer die eerder kwam de winnaar.
  • Houd ook alle totaalscores samen bij en bereken na de lus het gemiddelde.
Test je programma 2 testreeksen

Test 1 · Drie deelnemersNoor: 7, 8, 6
Sam: 9, 6, 8
Ilias: 8, 7, 7

Toon verwachte uitvoerNoor: 21
Sam: 23
Ilias: 22
Winnaar: Sam
Gemiddelde: 22.0

Test 2 · Gelijke hoogste scoreBo: 8, 8, 8
Mo: 9, 7, 8

Toon verwachte uitvoerBo: 24
Mo: 24
Winnaar: Bo
Gemiddelde: 24.0
Bij gelijkspel blijft de eerste deelnemer winnaar.

Aanname: er doet minstens één deelnemer mee en alle ingevoerde scores liggen tussen 0 en 10.

Hint 1 — beginwaarden voor de winnaar

Begin vóór de lus met hoogste_score = -1 en winnaar = "". Iedere echte totaalscore is dan hoger dan de beginwaarde.

Hint 2 — alleen vervangen bij echt hoger
if score > hoogste_score: hoogste_score = score winnaar = naam

Gebruik hier > en niet >=, zodat bij een gelijke score de eerste deelnemer blijft staan.

Klaar? Doe de eindcontrole
  • Staat de functie buiten de lus?
  • Wordt de functie voor iedere deelnemer precies één keer aangeroepen?
  • Blijft de eerste deelnemer winnen bij een gelijke hoogste score?
  • Deel je voor het gemiddelde door het aantal deelnemers?