Extra

Deze pagina bevat uitvoerbare code.

Opdracht 1

Met tekens op het scherm kan je tekenen. Twee functies, waarvan de tweede de eerste gebruikt.

a. Schrijf de functie lines(height, space) die twee verticale #-lijnen tekent van height regels hoog, met space spaties ertussen.

Aanroep

Tekent

lines(3, 3)

drie regels #   #

lines(2, 5)

twee regels #     #

lines(0, 4)

niets

lines(3, 3)

#   #
#   #
#   #

b. Schrijf de functie print_square(size) die een getal accepteert en een vierkant van # met zijden van size tekens tekent. Maak gebruik van de functie lines.

Let op: lines tekent alleen de twee zijkanten, niet de bovenste en de onderste rand. Die twee regels zijn dus voor print_square zelf, en de lijnen ertussen zijn er twee minder hoog en twee minder breed dan het vierkant.

Aanroep

Tekent

print_square(5)

een vierkant van 5 bij 5

print_square(3)

een vierkant van 3 bij 3

print_square(2)

twee regels ##

print_square(1)

één enkele #

print_square(5)      print_square(3)      print_square(2)      print_square(1)

#####                ###                  ##                   #
#   #                # #                  ##
#   #                ###
#   #
#####

De laatste twee zijn de randgevallen, en ze zijn niet gratis: bij size 2 is er geen ruimte tussen de randen, en bij size 1 valt de bovenste rand samen met de onderste.

Deze twee functies tekenen en geven niets terug, dus over de tekening kan een assertion niets zeggen; vergelijk die met het oog. Over de returnwaarde kan een assertion wél iets zeggen: een functie die alleen afdrukt geeft None terug, en in het college heb je gezien hoe je dat vastlegt. Schrijf minstens twee van zulke assertions.

# jouw oplossing

Opdracht 2

Een formulier vraagt om een geboortedatum: een dag, een maand en een jaar. Voordat er iets wordt opgeslagen moet het programma weten of die datum wel bestaat. 29 februari 2000 bestaat. 29 februari 1900 niet.

Dat verschil zit in de schrikkeljaren, en de regel daarvoor heeft drie treden:

Trede

Regel

Voorbeeld

1

Een jaar dat deelbaar is door 4 is een schrikkeljaar

2024

2

… behalve als het ook deelbaar is door 100

1900 is er géén

3

… behalve als het ook deelbaar is door 400

2000 is er wél weer

Voor 2000: deelbaar door 4, deelbaar door 100, en ook deelbaar door 400. Trede 3 is de laatste die iets zegt, dus 2000 is een schrikkeljaar en februari heeft 29 dagen.

Voor 1900: deelbaar door 4, deelbaar door 100, maar niet door 400. Trede 2 is hier de laatste die iets zegt, dus 1900 is geen schrikkeljaar en februari heeft er 28.

Verder heeft elke maand een vast aantal dagen:

Maand

1

2

3

4

5

6

7

8

9

10

11

12

Dagen

31

28 of 29

31

30

31

30

31

31

30

31

30

31

Schrijf de functie is_valid_date(day, month, year) die True teruggeeft als die drie getallen samen een bestaande datum vormen, en anders False.

Aanroep

Resultaat

Waarom

is_valid_date(29, 2, 2000)

True

2000 is een schrikkeljaar

is_valid_date(29, 2, 1900)

False

1900 niet

is_valid_date(29, 2, 2024)

True

2024 wel

is_valid_date(29, 2, 2023)

False

2023 niet

is_valid_date(31, 4, 2024)

False

april heeft 30 dagen

is_valid_date(30, 4, 2024)

True

is_valid_date(31, 12, 2025)

True

is_valid_date(0, 1, 2024)

False

er is geen dag 0

is_valid_date(1, 13, 2024)

False

er is geen maand 13

Verdeel het probleem zelf in kleinere functies die elk één ding doen, en bepaal zelf welke dat zijn. Meer dan %, and, if en return heb je niet nodig; er komt geen lus aan te pas.

Schrijf voor elke functie die je maakt een docstring, en test haar met minstens twee assertions waarvan er één een randgeval dekt. De jaren 1900 en 2000 zijn zulke randgevallen, en dag 0 is er ook een.

# jouw oplossing

Probeer, Plan, Programmeer!