VWO Informatica study materials
VWO Informatica study resources

Een gemiddelde dat afwezigen meetelt

VWO Informatica · Put your knowledge to work in context.

All case studies

Een gemiddelde dat afwezigen meetelt

Een docent informatica laat leerlingen een Python-programma schrijven dat het gemiddelde cijfer van een toets berekent. Een cijferlijst bevat 28 waarden; een leerling die de toets niet maakte, krijgt de waarde 0. Het programma moet afwezigen niet meetellen en het gemiddelde op één decimaal afronden. Een leerling levert deze functie in:

def gemiddelde(cijfers): totaal = 0 for c in cijfers: totaal += c return round(totaal / len(cijfers), 1)

De docent test met [7.5, 8.0, 6.5] en krijgt 7.3, dus de leerling denkt dat het klopt. Bij de echte lijst [5.0, 0, 6.0, 8.0] komt er 4,8 uit, terwijl de docent 6,3 verwacht. De docent wil ook dat een lege lijst een duidelijke foutmelding geeft in plaats van een crash. In de klas wordt gediscussieerd of een 0 als 'afwezig' wel een goede keuze is.

1. Traceer de functie met [5.0, 0, 6.0, 8.0]. Leg uit waarom de uitkomst 4,8 is en waarom de test met [7.5, 8.0, 6.5] de fout niet aan het licht brengt.

Read the worked answer

De som is 5,0 + 0 + 6,0 + 8,0 = 19,0. De functie deelt door len(cijfers) = 4, ook al is één waarde een afwezigheidsmarkering. Dat geeft 19,0 / 4 = 4,75, afgerond 4,8. De docent verwacht (5,0 + 6,0 + 8,0) / 3 = 6,333..., dus 6,3.

De test met [7.5, 8.0, 6.5] bevat geen afwezigheid. Daar is de noemer toevallig gelijk aan het aantal geldige cijfers, waardoor de fout niet zichtbaar wordt. De test dekt dus niet het geval 'afwezig' en ook niet het geval 'lege lijst'. Een goede test moet juist de gevallen afdekken waarin de aanname 'elk element is een geldig cijfer' niet geldt.

2. Herschrijf de functie zodat afwezigen niet worden meegeteld, een lege lijst een ValueError oplevert en het gemiddelde op één decimaal wordt afgerond. Gebruik een geschikte representatie voor 'afwezig' en licht je keuze toe.

Read the worked answer

Gebruik None als afwezigheidsmarkering, niet 0. Een 0 is een geldig cijfer en if c zou ook 0,0 overslaan. Een mogelijke uitwerking is:

def gemiddelde(cijfers):
    aanwezig = [c for c in cijfers if c is not None]
    if not aanwezig:
        raise ValueError('Geen cijfers opgegeven')
    return round(sum(aanwezig) / len(aanwezig), 1)

Toelichting: de lijstexpressie filtert alleen None weg. c is not None is veiliger dan if c, omdat 0.0 anders ten onrechte als afwezig wordt gezien. De controle if not aanwezig voorkomt deling door nul en geeft een duidelijke foutmelding. Pas daarna wordt de som gedeeld door het aantal echte cijfers en afgerond. De aanroeper moet afwezigheid dus als None aanleveren; dat is een expliciete afspraak die je in de documentatie van de functie moet vastleggen.

3. De docent overweegt een 0 als 'afwezig' te blijven gebruiken, omdat de cijferlijst dan korter is. Beargumenteer waarom dit een slecht ontwerp is en noem een tweede maatregel waarmee je de fout in de toekomst eerder vindt.

Read the worked answer

Een 0 als afwezigheid is een semantische fout: de waarde 0 krijgt twee betekenissen en je kunt achteraf niet meer zien of een leerling een 0 scoorde of niet meedeed. Daardoor is de gemiddelde berekening niet reproduceerbaar en kunnen fouten in rapportages sluipen. Bovendien is een 0 als cijfer in het Nederlandse schoolsysteem zeldzaam maar niet onmogelijk; de markering is dus niet ondubbelzinnig. De kortere lijst is geen voordeel dat opweegt tegen deze dubbelzinnigheid.

Betere maatregelen: sla ontbrekende waarden op als None of als een lege cel, en valideer bij invoer dat een cijfer tussen de toegestane waarden ligt. Schrijf daarnaast unit tests die expliciet een afwezige waarde, een lege lijst en een echte 0,0 afdekken. Laat de tests automatisch draaien bij elke wijziging, zodat de fout niet opnieuw ongemerkt binnenkomt.