Deze opdrachten zijn onderdeel van een programmeercursus gegeven in de opleiding Informatiekunde van de Rijksuniversiteit Groningen.
Inleiding
Om inzicht te krijgen in informatie die is opgeslagen in grote hoeveelheden tekst zijn samenvatten en visualisatie nuttige technieken. Hiervoor kunnen programma's zoals Excel, SPSS of R worden gebruikt. Maar ook programmeertalen als Python zijn hiervoor geschikt. Zij bevatten vaak modules waarmee objecten op het scherm getekend kunnen worden.
In deze opdracht gebruiken we Python om mee te tekenen en een animatie mee te maken. Hierbij hebben we de module graphics.py van John Zelle nodig. Download deze module en sla hem op in dezelfde directory als jouw Pythonbestanden.
Hier is een voorbeeld van een programma dat grafische elementen op het scherm tekent:
# laad de graphicsmodule # download van http://mcsp.wartburg.edu/zelle/python/graphics.py from graphics import * # laad de functie sleep van de timemodule (voor animatie) from time import sleep # definieer window van 150 bij 250 pixels MAXX=150 MAXY=250 mijnWindow = GraphWin("Mijn Window",MAXX,MAXY) # teken een horizontale lijn op hoogte 200 punt1 = Point(0,200) punt2 = Point(MAXX,200) mijnLijn = Line(punt1,punt2) mijnLijn.draw(mijnWindow) # tekent het lijnobject in mijnWindow # teken een groene cirkel met straal 25 punt1 = Point(75,175) # midden mijnCirkel = Circle(punt1,25) # 25 is de straal mijnCirkel.setFill('green') # definieer kleur mijnCirkel.draw(mijnWindow) # teken een blauw vierkant punt1 = Point(50,100) # linkeronderhoek punt2 = Point(100,50) # rechterbovenhoek mijnVierkant = Rectangle(punt1,punt2) mijnVierkant.setFill('blue') mijnVierkant.draw(mijnWindow) # teken een rode driehoek punt1 = Point(50,150) # linkeronderhoek punt2 = Point(100,150) # rechteronderhoek punt3 = Point(75,100) # top mijnDriehoek = Polygon(punt1,punt2,punt3) mijnDriehoek.setFill('red') mijnDriehoek.draw(mijnWindow) # schrijf een tekst punt1 = Point(75,25) # centrum van tekstblok mijnTekst = Text(punt1,"Mijn Tekst") mijnTekst.setSize(14) # fontgrootte mijnTekst.setTextColor('purple') mijnTekst.draw(mijnWindow) # beweeg het vierkant sleep(1.00) # wacht 1 seconde voor de animatie begint # verplaats het vierkant tot de rand while mijnVierkant.getP2().getX() < MAXX: # getP2() geeft het tweede punt uit de definitie van het vierkant: punt2 # getX geeft de horizontale coordinaat van dit punt (100) # verplaats het vierkant 1 pixel naar onder en rechts mijnVierkant.move(1,1) sleep(0.02) # wacht 0.02 seconde voor de volgende stap # wacht totdat de gebruiker een teken geeft input("Druk op Enter om het programma te stoppen") # verwijder het window mijnWindow.close()
Lees dit programma en probeer de instructies zo goed mogelijk te begrijpen. Zoek de instructies die je niet begrijpt of vraag om hulp. Sla daarna het programma op in een tekstbestand en draai het programma. Komt het gedrag overeen met wat je verwachtte?
Opdracht 2.1
Schrijf een Pythonprogramma dat een vlag van een land of provincie tekent. De vlag moet minstens twee kleuren bevatten.
Tip: met de functie color_rgb() van de graphicsmodule kan je andere kleuren dan de standaardkleuren definiëren, zie handleiding, sectie 6 (PDF).
Opdracht 2.2
Schrijf een Pythonprogramma dat drie woorden of woordcombinaties in een window tekent op een willekeurige positie, met een willekeurige kleur letters die een willekeurig formaat hebben. Hiernaast zie je een voorbeeld van de uitvoer van het programma. Het resultaat van het programma mag niet steeds hetzelfde zijn. Het geeft niet als de woorden elkaar soms overlappen of soms gedeeltelijk buiten het window vallen.
Tip: in opdracht 1.3 wordt uitgelegd hoe je in Python willekeurige getallen kan genereren.
Opdracht 2.3
Schrijf een Pythonprogramma dat de gebruiker vraagt om vijf getallen en deze getallen vervolgens tekent in een staafdiagram. Plaats lijnen op de horizontale en verticale as van de grafiek en geef met getallen aan wat de minimum- en maximumwaarden zijn. Een voorbeeld van de uitvoer van het programma staat hiernaast. Hier is ook een voorbeeld van de interactie met het programma:
$ python3 23.py Geef een getal tussen 0 en 100: 50 Geef een getal tussen 0 en 100: 25 Geef een getal tussen 0 en 100: 75 Geef een getal tussen 0 en 100: 95 Geef een getal tussen 0 en 100: 33 Druk op Enter om het programma te stoppen
Tip: bewaar de ingetikte getallen niet maar teken voor elk getal meteen na het inlezen een nieuwe staaf in het uitvoerwindow.
Opdracht 2.4
Schrijf een Pythonprogramma dat in een rechthoekig window (geen vierkant) een cirkel tekent op een willekeurige positie. Vervolgens moet de cirkel gaan bewegen in willekeurige constante richting met stapjes 1: -1 of +1 horizontaal en tegelijkertijd -1 of +1 verticaal. Als de cirkel de rand bereikt dan moet hij terugstuiteren: bereikt hij een horizontale rand dan verandert de verticale snelheid van positief in negatief of omgekeerd. Bereikt hij een verticale rand dan verandert de horizontale snelheid op dezelfde manier.
Tips: gebruik het commando move uit het voorbeeldprogramma hierboven om de cirkel te verplaatsen en gebruik het commando sleep uit hetzelfde voorbeeld om ervoor te zorgen dat de animatie niet te snel verloopt. Gebruik eventueel mijnWindow.checkMouse() om te controleren of op het window wordt geklikt om de animatie te stoppen (zie handleiding graphicsmodule, sectie 2: PDF).
Lever jouw programma's, testresultaten en antwoorden op vragen in op Nestor samengevoegd in 1 tekstbestand met naam studentnummer-weeknummer.txt, bijvoorbeeld s1234567-2.txt, voor maandag 9 mei 2011, 12:00.
Antwoorden
Last update: May 10, 2011. erikt(at)xs4all.nl