Extra¶
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 |
|---|---|
|
drie regels |
|
twee regels |
|
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 |
|---|---|
|
een vierkant van 5 bij 5 |
|
een vierkant van 3 bij 3 |
|
twee regels |
|
éé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 |
|---|---|---|
|
|
2000 is een schrikkeljaar |
|
|
1900 niet |
|
|
2024 wel |
|
|
2023 niet |
|
|
april heeft 30 dagen |
|
|
|
|
|
|
|
|
er is geen dag 0 |
|
|
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!