Prijsberekening bij fietsverhuur Trap & Co
Fietsverhuurbedrijf Trap & Co verhuurt fietsen aan toeristen en aan jeugdleden van de plaatselijke wielerclub. De eigenaresse heeft een klein script in haar spreadsheet gemaakt dat de prijs berekent. De regels zijn: de eerste 3 uur kosten €5,00; daarna betaal je €1,50 per begonnen half uur; jeugdleden krijgen 20% korting op de huurprijs; bovenop de huurprijs komt €20,00 borg, die niet wordt verrekend met de korting. De medewerker typt het aantal uren in als heel getal. De klant betaalt contant en krijgt de borg bij inleveren terug.
prijs = 5.00
if uren > 3:
prijs = prijs + (uren - 3) * 1.50
if jeugdlid == 'Ja':
prijs = prijs * 0.80
totaal = prijs + 20.00
Op een drukke zaterdag ziet de eigenaresse achteraf dat een jeugdlid voor 3 uur en 40 minuten te weinig heeft betaald, en een klant die 'ja' had ingevuld kreeg geen korting. Ze wil het liefst 'gewoon de code aanpassen' en daarna meteen weer gaan verhuren.
1. Noem twee testgevallen die aantonen dat de code fout rekent. Geef per geval de invoer, de uitkomst van het programma en de uitkomst die er hoort te zijn.
Read the worked answer
Testgeval 1 (grens + begonnen half uur): invoer uren = 3, jeugdlid = 'Nee', klant was 3 uur en 40 minuten. Programma: uren > 3 is onwaar, dus €5,00 + €20,00 = €25,00. Hoort: 3 uur en 40 minuten betekent twee begonnen halve uren na de eerste 3 uur, dus €5,00 + 2 × €1,50 = €8,00 + €20,00 = €28,00. Het programma rekent €3,00 te weinig.
Testgeval 2 (hoofdlettergevoeligheid): invoer uren = 2, jeugdlid = 'ja'. Programma: de vergelijking met 'Ja' is onwaar, dus €5,00 + €20,00 = €25,00. Hoort: €5,00 × 0,80 = €4,00 + €20,00 = €24,00. De korting wordt niet toegepast.
Beide gevallen zijn nodig: één laat een rekenfout bij de grens zien, de andere een invoerfout die je met normale getallen nooit tegenkomt.
2. Welke twee fouten zie je in de code en hoe herstel je ze? Schrijf de verbeterde pseudo-code.
Read the worked answer
Fout 1: de tijd wordt als heel aantal uren ingevoerd. Daardoor verdwijnen de minuten en wordt 'per begonnen half uur' nooit berekend. Herstel: reken in minuten (of in halve uren naar boven afgerond) en niet in uren.
Fout 2: de vergelijking is hoofdlettergevoelig. Het formulier levert 'ja' en de code test op 'Ja'. Herstel: zet de invoer eerst om naar kleine letters, of gebruik een echte ja/nee-keuze (selectievakje) in plaats van vrije tekst.
minuten = invoer_minuten # 3 uur 40 min = 220
if minuten <= 180:
prijs = 5.00
else:
halve_uren = ceil((minuten - 180) / 30)
prijs = 5.00 + halve_uren * 1.50
if lower(jeugdlid) == 'ja':
prijs = prijs * 0.80
totaal = round(prijs, 2) + 20.00
Merk op dat de borg pas na de korting wordt opgeteld; dat is precies wat de regel zegt.
3. De eigenaresse wil de code aanpassen en meteen weer verhuren. Geef twee argumenten waarom je eerst een testtabel met normale, grens- en foutieve invoer maakt.
Read the worked answer
Argument 1: de fouten zaten juist op de randen. Bij 2 uur en bij 4 uur rekende het programma goed; alleen bij 3 uur en een paar minuten ging het mis. Een testtabel met bewust gekozen grenzen (3 uur, 3 uur en 1 minuut, 3 uur en 30 minuten, 3 uur en 31 minuten) laat zien of de nieuwe code op alle randen klopt. Zonder die randen test je alleen wat toch al werkte.
Argument 2: geld en vertrouwen. Elke fout is direct omzetverlies of een klacht bij de balie, en achteraf terugbetalen kost meer tijd dan een half uur testen. Neem in de tabel ook foutieve invoer op (0 uren, 30 uren, leeg veld, 'tien'), want de balie typt in de drukte van alles in. Spreek af dat de code pas in gebruik gaat als alle rijen in de tabel de verwachte uitkomst geven.