Naar www.aaappp.nl/informatica of Praktijkopdracht programmeren in Python

Voorbeeld stadsgezicht tekenen met Python Turtle

Uitleg over hoe je je programma laat voldoen aan de eisen van de praktische opdracht:

Versie 1: quick and dirty met commentaar

De programmeur heeft vooraf op ruitjespapier het stadsgezicht getekend en toen de coördinaten in de commando's gezet.

Het programma voldoet slechts aan één eis van de praktische opdracht: er staat commentaar in. Verder is het programma bijna onleesbaar, omdat alles achter elkaar staat.

import turtle
t = turtle.Turtle()
t.speed(10)

# teken een flat met 5 verdiepingen
t.penup()
t.goto(-300,-300)
t.fillcolor('khaki')
t.begin_fill()
t.pendown()
t.goto(-160,-300)
t.goto(-160,100)
t.goto(-300,100)
t.goto(-300,-300)
t.end_fill()
# teken ramen op alle verdiepingen)
t.penup()
t.goto(-280,-280)
t.fillcolor('blue')
t.begin_fill()
t.pendown()
t.goto(-240,-280)
t.goto(-240,-240)
t.goto(-280,-240)
t.goto(-280,-280)
t.end_fill()
t.penup()
t.goto(-220,-280)
t.fillcolor('blue')
t.begin_fill()
t.pendown()
t.goto(-180,-280)
t.goto(-180,-240)
t.goto(-220,-240)
t.goto(-220,-280)
t.end_fill()
t.penup()
t.goto(-280,-200)
t.fillcolor('blue')
t.begin_fill()
t.pendown()
t.goto(-240,-200)
t.goto(-240,-160)
t.goto(-280,-160)
t.goto(-280,-200)
t.end_fill()
t.penup()
t.goto(-220,-200)
t.fillcolor('blue')
t.begin_fill()
t.pendown()
t.goto(-180,-200)
t.goto(-180,-160)
t.goto(-220,-160)
t.goto(-220,-200)
t.end_fill()
t.penup()
t.goto(-280,-120)
t.fillcolor('blue')
t.begin_fill()
t.pendown()
t.goto(-240,-120)
t.goto(-240,-80)
t.goto(-280,-80)
t.goto(-280,-120)
t.end_fill()
t.penup()
t.goto(-220,-120)
t.fillcolor('blue')
t.begin_fill()
t.pendown()
t.goto(-180,-120)
t.goto(-180,-80)
t.goto(-220,-80)
t.goto(-220,-120)
t.end_fill()
t.penup()
t.goto(-280,-40)
t.fillcolor('blue')
t.begin_fill()
t.pendown()
t.goto(-240,-40)
t.goto(-240,0)
t.goto(-280,0)
t.goto(-280,-40)
t.end_fill()
t.penup()
t.goto(-220,-40)
t.fillcolor('blue')
t.begin_fill()
t.pendown()
t.goto(-180,-40)
t.goto(-180,0)
t.goto(-220,0)
t.goto(-220,-40)
t.end_fill()
t.penup()
t.goto(-280,40)
t.fillcolor('blue')
t.begin_fill()
t.pendown()
t.goto(-240,40)
t.goto(-240,80)
t.goto(-280,80)
t.goto(-280,40)
t.end_fill()
t.penup()
t.goto(-220,40)
t.fillcolor('blue')
t.begin_fill()
t.pendown()
t.goto(-180,40)
t.goto(-180,80)
t.goto(-220,80)
t.goto(-220,40)
t.end_fill()
# teken een deur op de begane grond
t.penup()
t.goto(-280,-300)
t.fillcolor('red')
t.begin_fill()
t.pendown()
t.goto(-240,-300)
t.goto(-240,-240)
t.goto(-280,-240)
t.goto(-280,-300)
t.end_fill()

# teken een flat met 4 verdiepingen
t.penup()
t.goto(-100,-300)
t.fillcolor('khaki')
t.begin_fill()
t.pendown()
t.goto(40,-300)
t.goto(40,20)
t.goto(-100,20)
t.goto(-100,-300)
t.end_fill()
# teken ramen op alle verdiepingen)
t.penup()
t.goto(-80,-280)
t.fillcolor('blue')
t.begin_fill()
t.pendown()
t.goto(-40,-280)
t.goto(-40,-240)
t.goto(-80,-240)
t.goto(-80,-280)
t.end_fill()
t.penup()
t.goto(-20,-280)
t.fillcolor('blue')
t.begin_fill()
t.pendown()
t.goto(20,-280)
t.goto(20,-240)
t.goto(-20,-240)
t.goto(-20,-280)
t.end_fill()
t.penup()
t.goto(-80,-200)
t.fillcolor('blue')
t.begin_fill()
t.pendown()
t.goto(-40,-200)
t.goto(-40,-160)
t.goto(-80,-160)
t.goto(-80,-200)
t.end_fill()
t.penup()
t.goto(-20,-200)
t.fillcolor('blue')
t.begin_fill()
t.pendown()
t.goto(20,-200)
t.goto(20,-160)
t.goto(-20,-160)
t.goto(-20,-200)
t.end_fill()
t.penup()
t.goto(-80,-120)
t.fillcolor('blue')
t.begin_fill()
t.pendown()
t.goto(-40,-120)
t.goto(-40,-80)
t.goto(-80,-80)
t.goto(-80,-120)
t.end_fill()
t.penup()
t.goto(-20,-120)
t.fillcolor('blue')
t.begin_fill()
t.pendown()
t.goto(20,-120)
t.goto(20,-80)
t.goto(-20,-80)
t.goto(-20,-120)
t.end_fill()
t.penup()
t.goto(-80,-40)
t.fillcolor('blue')
t.begin_fill()
t.pendown()
t.goto(-40,-40)
t.goto(-40,0)
t.goto(-80,0)
t.goto(-80,-40)
t.end_fill()
t.penup()
t.goto(-20,-40)
t.fillcolor('blue')
t.begin_fill()
t.pendown()
t.goto(20,-40)
t.goto(20,0)
t.goto(-20,0)
t.goto(-20,-40)
t.end_fill()
# teken een deur op de begane grond
t.penup()
t.goto(-80,-300)
t.fillcolor('red')
t.begin_fill()
t.pendown()
t.goto(-40,-300)
t.goto(-40,-240)
t.goto(-80,-240)
t.goto(-80,-300)
t.end_fill()

# teken een flat met 3 verdiepingen
t.penup()
t.goto(100,-300)
t.fillcolor('khaki')
t.begin_fill()
t.pendown()
t.goto(240,-300)
t.goto(240,-60)
t.goto(100,-60)
t.goto(100,-300)
t.end_fill()
# teken ramen op alle verdiepingen)
t.penup()
t.goto(120,-280)
t.fillcolor('blue')
t.begin_fill()
t.pendown()
t.goto(160,-280)
t.goto(160,-240)
t.goto(120,-240)
t.goto(120,-280)
t.end_fill()
t.penup()
t.goto(180,-280)
t.fillcolor('blue')
t.begin_fill()
t.pendown()
t.goto(220,-280)
t.goto(220,-240)
t.goto(180,-240)
t.goto(180,-280)
t.end_fill()
t.penup()
t.goto(120,-200)
t.fillcolor('blue')
t.begin_fill()
t.pendown()
t.goto(160,-200)
t.goto(160,-160)
t.goto(120,-160)
t.goto(120,-200)
t.end_fill()
t.penup()
t.goto(180,-200)
t.fillcolor('blue')
t.begin_fill()
t.pendown()
t.goto(220,-200)
t.goto(220,-160)
t.goto(180,-160)
t.goto(180,-200)
t.end_fill()
t.penup()
t.goto(120,-120)
t.fillcolor('blue')
t.begin_fill()
t.pendown()
t.goto(160,-120)
t.goto(160,-80)
t.goto(120,-80)
t.goto(120,-120)
t.end_fill()
t.penup()
t.goto(180,-120)
t.fillcolor('blue')
t.begin_fill()
t.pendown()
t.goto(220,-120)
t.goto(220,-80)
t.goto(180,-80)
t.goto(180,-120)
t.end_fill()
# teken een deur op de begane grond
t.penup()
t.goto(120,-300)
t.fillcolor('red')
t.begin_fill()
t.pendown()
t.goto(160,-300)
t.goto(160,-240)
t.goto(120,-240)
t.goto(120,-300)
t.end_fill()

# klaar en maak de turtle onzichtbaar
t.hideturtle()
    

Versie 2: met functies voor raam en deur

Door het toevoegen van functies voor raam en deur is het programma al flink korter geworden.

Het programma voldoet nu aan twee eisen van de praktische opdracht:

  1. er staat commentaar in en
  2. er zijn functies met parameters.
import turtle
t = turtle.Turtle()
t.speed(10)

def deur(x, y):
    t.penup()
    t.goto(0+x,0+y)
    t.fillcolor('red')
    t.begin_fill()
    t.pendown()
    t.goto(40+x,0+y)
    t.goto(40+x,60+y)
    t.goto(0+x,60+y)
    t.goto(0+x,0+y)
    t.end_fill()

def raam(x, y):
    t.penup()
    t.goto(0+x,0+y)
    t.fillcolor('blue')
    t.begin_fill()
    t.pendown()
    t.goto(40+x,0+y)
    t.goto(40+x,40+y)
    t.goto(0+x,40+y)
    t.goto(0+x,0+y)
    t.end_fill()    

# teken een flat met 5 verdiepingen
t.penup()
t.goto(-300,-300)
t.fillcolor('khaki')
t.begin_fill()
t.pendown()
t.goto(-160,-300)
t.goto(-160,100)
t.goto(-300,100)
t.goto(-300,-300)
t.end_fill()
# teken ramen op alle verdiepingen)
raam(-280,-280)
raam(-220,-280)
raam(-280,-200)
raam(-220,-200)
raam(-280,-120)
raam(-220,-120)
raam(-280,-40)
raam(-220,-40)
raam(-280,40)
raam(-220,40)
# teken een deur op de begane grond
deur(-280,-300)

# teken een flat met 4 verdiepingen
t.penup()
t.goto(-100,-300)
t.fillcolor('khaki')
t.begin_fill()
t.pendown()
t.goto(40,-300)
t.goto(40,20)
t.goto(-100,20)
t.goto(-100,-300)
t.end_fill()
# teken ramen op alle verdiepingen)
raam(-80,-280)
raam(-20,-280)
raam(-80,-200)
raam(-20,-200)
raam(-80,-120)
raam(-20,-120)
raam(-80,-40)
raam(-20,-40)
# teken een deur op de begane grond
deur(-80,-300)

# teken een flat met 3 verdiepingen
t.penup()
t.goto(100,-300)
t.fillcolor('khaki')
t.begin_fill()
t.pendown()
t.goto(240,-300)
t.goto(240,-60)
t.goto(100,-60)
t.goto(100,-300)
t.end_fill()
# teken ramen op alle verdiepingen)
raam(120,-280)
raam(180,-280)
raam(120,-200)
raam(180,-200)
raam(120,-120)
raam(180,-120)
# teken een deur op de begane grond
deur(120,-300)

# klaar en maak de turtle onzichtbaar
t.hideturtle()
    

Versie 3: volledig gestructureerd met functies

In deze versie is het hele programma gestructureerd door middel van functies. In de functie stadsgezicht is alles samengevat. Daarin staan drie aanroepen van de functies om de drie verschillende flats te tekenen.
Het programma besluit met de aanroep van de functie stadsgezicht. Zonder deze aanroep tekent het programma niets!

Het programma voldoet nu aan vier eisen van de praktische opdracht:

  1. er staat commentaar in,
  2. er zijn functies met parameters,
  3. het programma is gestructureerd in deelfuncties en
  4. de tekening wordt gemaakt door de aanroep van stadsgezicht.
import turtle
t = turtle.Turtle()
t.speed(10)

def deur(x, y):
    t.penup()
    t.goto(0+x,0+y)
    t.fillcolor('red')
    t.begin_fill()
    t.pendown()
    t.goto(40+x,0+y)
    t.goto(40+x,60+y)
    t.goto(0+x,60+y)
    t.goto(0+x,0+y)
    t.end_fill()

def raam(x, y):
    t.penup()
    t.goto(0+x,0+y)
    t.fillcolor('blue')
    t.begin_fill()
    t.pendown()
    t.goto(40+x,0+y)
    t.goto(40+x,40+y)
    t.goto(0+x,40+y)
    t.goto(0+x,0+y)
    t.end_fill()    

def flat5():
# teken een flat met 5 verdiepingen
    t.penup()
    t.goto(-300,-300)
    t.fillcolor('khaki')
    t.begin_fill()
    t.pendown()
    t.goto(-160,-300)
    t.goto(-160,100)
    t.goto(-300,100)
    t.goto(-300,-300)
    t.end_fill()
# teken ramen op alle verdiepingen)
    raam(-280,-280)
    raam(-220,-280)
    raam(-280,-200)
    raam(-220,-200)
    raam(-280,-120)
    raam(-220,-120)
    raam(-280,-40)
    raam(-220,-40)
    raam(-280,40)
    raam(-220,40)
# teken een deur op de begane grond
    deur(-280,-300)

def flat4():
# teken een flat met 4 verdiepingen
    t.penup()
    t.goto(-100,-300)
    t.fillcolor('khaki')
    t.begin_fill()
    t.pendown()
    t.goto(40,-300)
    t.goto(40,20)
    t.goto(-100,20)
    t.goto(-100,-300)
    t.end_fill()
# teken ramen op alle verdiepingen)
    raam(-80,-280)
    raam(-20,-280)
    raam(-80,-200)
    raam(-20,-200)
    raam(-80,-120)
    raam(-20,-120)
    raam(-80,-40)
    raam(-20,-40)
# teken een deur op de begane grond
    deur(-80,-300)

def flat3():
# teken een flat met 3 verdiepingen
    t.penup()
    t.goto(100,-300)
    t.fillcolor('khaki')
    t.begin_fill()
    t.pendown()
    t.goto(240,-300)
    t.goto(240,-60)
    t.goto(100,-60)
    t.goto(100,-300)
    t.end_fill()
# teken ramen op alle verdiepingen)
    raam(120,-280)
    raam(180,-280)
    raam(120,-200)
    raam(180,-200)
    raam(120,-120)
    raam(180,-120)
# teken een deur op de begane grond
    deur(120,-300)

def stadsgezicht():
    flat5()
    flat4()
    flat3()

stadsgezicht()

# klaar en maak de turtle onzichtbaar
t.hideturtle()
    

Versie 4: verbeterde functies voor de flats

Versie 3 was weliswaar goed gestructureerd, maar de functies voor de flats tekenen de flats steeds op dezelfde plaatsen. In versie 3 hebben de functies van de flats parameters x en y gekregen, zodat je de flats eenvoudig op andere plaatsen kunt laten tekenen.
Je kunt dit nu wijzigen bij de aanroep van die functies in de functie stadsgezicht.

  
import turtle
t = turtle.Turtle()
t.speed(10)

def deur(x, y):
    t.penup()
    t.goto(0+x,0+y)
    t.fillcolor('red')
    t.begin_fill()
    t.pendown()
    t.goto(40+x,0+y)
    t.goto(40+x,60+y)
    t.goto(0+x,60+y)
    t.goto(0+x,0+y)
    t.end_fill()

def raam(x, y):
    t.penup()
    t.goto(0+x,0+y)
    t.fillcolor('blue')
    t.begin_fill()
    t.pendown()
    t.goto(40+x,0+y)
    t.goto(40+x,40+y)
    t.goto(0+x,40+y)
    t.goto(0+x,0+y)
    t.end_fill()
    
def flat5(x,y):
# teken een flat met 5 verdiepingen
    t.penup()
    t.goto(0+x,0+y)
    t.fillcolor('khaki')
    t.begin_fill()
    t.pendown()
    t.goto(140+x,0+y)
    t.goto(140+x,400+y)
    t.goto(0+x,400+y)
    t.goto(0+x,0+y)
    t.end_fill()
# teken ramen op alle verdiepingen)
    raam(20+x,20+y)
    raam(80+x,20+y)
    raam(20+x,100+y)
    raam(80+x,100+y)
    raam(20+x,180+y)
    raam(80+x,180+y)
    raam(20+x,260+y)
    raam(80+x,260+y)
    raam(20+x,340+y)
    raam(80+x,340+y)
# teken een deur op de begane grond
    deur(20+x,0+y)

def flat4(x,y):
# teken een flat met 4 verdiepingen
    t.penup()
    t.goto(0+x,0+y)
    t.fillcolor('khaki')
    t.begin_fill()
    t.pendown()
    t.goto(140+x,0+y)
    t.goto(140+x,320+y)
    t.goto(0+x,320+y)
    t.goto(0+x,0+y)
    t.end_fill()
# teken ramen op alle verdiepingen)
    raam(20+x,20+y)
    raam(80+x,20+y)
    raam(20+x,100+y)
    raam(80+x,100+y)
    raam(20+x,180+y)
    raam(80+x,180+y)
    raam(20+x,260+y)
    raam(80+x,260+y)
# teken een deur op de begane grond
    deur(20+x,0+y)

def flat3(x,y):
# teken een flat met 3 verdiepingen
    t.penup()
    t.goto(0+x,0+y)
    t.fillcolor('khaki')
    t.begin_fill()
    t.pendown()
    t.goto(140+x,0+y)
    t.goto(140+x,240+y)
    t.goto(0+x,240+y)
    t.goto(0+x,0+y)
    t.end_fill()
# teken ramen op alle verdiepingen)
    raam(20+x,20+y)
    raam(80+x,20+y)
    raam(20+x,100+y)
    raam(80+x,100+y)
    raam(20+x,180+y)
    raam(80+x,180+y)
# teken een deur op de begane grond
    deur(20+x,0+y)

def stadsgezicht():
    flat3(-300,-300)
    flat5(-100,-300)
    flat4( 100,-300)

stadsgezicht()

# klaar en maak de turtle onzichtbaar
t.hideturtle()
    

Versie 5: met iteraties

Versie 4 had nog drie verschillende functies voor flats met 3, 4 of 5 verdiepingen. In versie 5 zijn ze vervangen door één functie flat met de parameter verdiepingen. Het programma is daardoor weer veel korter geworden!

De functie flat moet nu zelf de juiste hoogte van de flat berekenen en per verdieping ramen tekenen. De totale hoogte is hoogte van een verdieping vermenigvuldigd met het aantal verdiepingen. De ramen worden getekend door een iteratie (herhaling) in een for-loop voor elke verdieping. Je moet het aantal verdiepingen invullen bij de aanroep van de functie flat in de functie stadsgezicht.

Het programma voldoet nu aan alle eisen van de praktische opdracht:

  1. er staat commentaar in,
  2. er zijn functies met parameters,
  3. het programma is gestructureerd in deelfuncties,
  4. de tekening wordt gemaakt door de aanroep van stadsgezicht en
  5. er is een iteratie.
  
import turtle
t = turtle.Turtle()
t.speed(10)

def deur(x, y):
    t.penup()
    t.goto(0+x,0+y)
    t.fillcolor('red')
    t.begin_fill()
    t.pendown()
    t.goto(40+x,0+y)
    t.goto(40+x,60+y)
    t.goto(0+x,60+y)
    t.goto(0+x,0+y)
    t.end_fill()

def raam(x, y):
    t.penup()
    t.goto(0+x,0+y)
    t.fillcolor('blue')
    t.begin_fill()
    t.pendown()
    t.goto(40+x,0+y)
    t.goto(40+x,40+y)
    t.goto(0+x,40+y)
    t.goto(0+x,0+y)
    t.end_fill()

def flat(x,y,verdiepingen):
    # hoogte van een verdieping
    hoog = 80
    t.penup()
    t.goto(0+x,0+y)
    t.fillcolor('khaki')
    t.begin_fill()
    t.pendown()
    t.goto(140+x,0+y)
    t.goto(140+x,hoog*verdiepingen+y)
    t.goto(0+x,hoog*verdiepingen+y)
    t.goto(0+x,0+y)
    t.end_fill()
    # twee ramen op elke verdieping
    for v in range(verdiepingen):
        raam(20+x,20+y+hoog*v)
        raam(80+x,20+y+hoog*v)
    # een deur op de begane grond
    deur(20+x,y)    

def stadsgezicht():
    flat(-370,-300,5)
    flat(-170,-300,4)
    flat(  30,-300,3)
    flat( 230,-300,4)

stadsgezicht()

# klaar en maak de turtle onzichtbaar
t.hideturtle()