Wt`s aanvullende Python opgaven

advertisement
Wt’s aanvullende Python opgaven
Je leert de basics met Codecademy, maar je wordt het pas meester met oefeningen. Kijk in de
studiewijzer om te zien welk deel van de Codecademy Python cursus je eerst moet doen om een bepaalde
opgave te maken. Zulke opgaven kun je ook op de praktijktoetsen verwachten.
Je maakt deze opgaven niet met de Codecademy editor, maar met IDLE (zie startmenu onder
“Informatica”, of download de versie van de site naar je USB stick).
1. Wisselkoers
Je gaat op vakantie naar Amerika en wilt graag dollars opnemen. Je schrijft een python script om je te
helpen met omrekenen van Euro’s naar Dollars en andersom.
1,00 euro is op dit moment 1,12 dollar waard
-
Maak een variabele met de naam invoerEuros
“Vul” deze variabele met een bedrag (getal) in Euros dat je wilt omrekenen
Maak ook een variabele met de naam invoerDollars
“Vul” deze variabele met een bedrag (getal) in Dollars dat je wilt omrekenen
Maak twee variabelen uitvoerDollars en uitvoerEuros
Reken het bedrag uit invoerEuros om naar Dollars en sla het resultaat op in
uitvoerDollars
Reken het bedrag uit invoerDollars om naar Euro’s en sla het resultaat op in
uitvoerEuros
Zorg dat je script de twee uitkomsten op het scherm afdrukt:
3.36666
16.34444
-
Extraatje: Zorg dat het resultaat wordt afgerond op 2 decimalen. Dit komt pas later in
codecademy aan bod, maar hier vind je alvast hoe het moet:
Met het commando round() kun je een variabele afronden op het gewenste aantal cijfers. Dus
het commando round(getal, 3) zal de variabele getal afronden op 3 decimalen.
2. Hallo gebruiker!
Je hebt net allerlei dingen geleerd over het werken met Strings (stukjes tekst tussen ""). We herhalen de
belangrijkste dingen nog een keer in deze opgave.
Voor deze opgave gaan we de gebruiker om input vragen. Dit heb je nog niet gezien bij Codecademy
(komt in blokje 3 aan bod), maar dat kun je doen zoals in het volgende stukje voorbeeldcode:
kleur = raw_input("Wat is je favoriete kleur? ")
Dit zal voor de gebruiker het bericht “Wat is je favoriete kleur? “ afdrukken op het scherm en daarna
wacht het programma op invoer. Als de gebruiker wat intypt en op enter drukt, wordt de invoer in de
variabele kleur opgeslagen.
Wt / 2016
De opdracht is als volgt:
Op de eerste regel van je code zet in een stukje commentaar met je naam, het opdrachtnummer en de
datum van vandaag.
Vraag de gebruiker dan om zijn naam en om zijn leeftijd (dat zijn 2 verschillende inputs natuurlijk!) en sla
deze op in variabelen met elk een zinnige variabelenaam.
Je programma vertelt de gebruiker vervolgens de volgende dingen:
-
-
Groet de gebruiker (Dus zeg zoiets als “Hallo <naam>!”)
Vertel de lengte van zijn/haar naam (het aantal tekens dus)
Geef de tweede letter van zijn/haar naam.
Reken uit in welk jaar de gebruiker 100 jaar wordt en druk dat af
(Als je het echt sjiek wilt doen, gebruik je de datetime library om het huidige jaartal op te vragen.
Dan werkt je script volgend jaar nog steeds...)
Lollige extra: Je kunt strings ook “ vermenigvuldigen”. Dat zorgt ervoor dat de string een aantal
keer herhaald wordt. Bijvoorbeeld:
print 4 * "hoi"
Dit drukt "hoihoihoi” af op het scherm.
Gebruik dit om 100 keer de naam van de gebruiker af te drukken
3. Alcoholchecker
Schrijf een Python script dat de gebruiker vraagt: “Wat is uw leeftijd?”
De gebruiker moet vervolgens een getal kunnen intypen.
Het script geeft aan of de gebruiker oud genoeg is om alcohol te bestellen. Als de leeftijd onder de 18 is,
geeft het script als antwoord: “Sorry je bent nog geen 18!” en als de leeftijd 18 of hoger is, geeft het script
als antwoord: “Je bent oud genoeg om alcohol te kopen”.
Breid je script daarna nog verder uit:
Je script vraagt als de persoon 18 is ook of hij/zij nog moet rijden. Als de persoon nog moet rijden, mag
toch geen alcohol besteld worden. Je script meldt: “Je mag dan wel 18 zijn, maar je bent de Bob.”
4. Schrikkeljaar
Schrikkeljaren zijn uitgevonden, omdat een jaar eigenlijk ietsje langer is dan 365 dagen. Elke 4 jaar is het
jaar daarom 366 dagen, zodat de kalender gelijk blijft lopen met de werkelijkheid.
Stiekem is het nog wat ingewikkelder dan dat. Op de lange termijn zou de kalender zo toch nog “scheef”
gaan lopen, omdat de afwijking niet precies een kwart dag per jaar is. Daarom zijn de precieze regels
rondom schrikkeljaren als volgt:
-
Als het jaartal deelbaar is door 4 is het een schrikkeljaar, tenzij:
Als het jaartal ook deelbaar is door 100, is het geen schrikkeljaar, tenzij:
Als het jaartal ook deelbaar is door 400, is het toch wel een schrikkeljaar
Enkele voorbeelden:
-
2015 is geen schrikkeljaar (niet deelbaar door 4)
Wt / 2016
-
2016 is wel een schrikkeljaar (wel deelbaar door 4, maar niet door 100
2100 is geen schrikkeljaar (deelbaar door 4, maar ook deelbaar door 100. Niet deelbaar door 400)
2400 is wel een schrikkeljaar (deelbaar door 4, ook door 100, maar ook weer door 400)
Schrijf een Python script dat de gebruiker om een jaartal vraagt. Het script vertelt je vervolgens of het
gegeven jaar een schrikkeljaar is of niet.
5. Schrikkeljaar functie
Bij vraag 4 heb je een schrikkeljaarprogramma gemaakt. Dit is typisch een stukje code dat in een functie
thuishoort. Immers als je er een functie van maakt zou je in een later, uitgebreider programma gebruik
kunnen maken van de functie en hoef je je nooit meer druk te maken om schrikkeljaren.
Maak een nieuwe versie van de schrikkeljaar-bepaler uit vraag 4, maar nu in de vorm van een functie.
Noem de functie is_schrikkeljaar(). De functie moet een jaartal als invoer nemen en de waarde
"True" teruggeven als het een schrikkeljaar is en de waarde "False" als het geen schrikkeljaar is.
Nu je er een functie van hebt gemaakt, kun je gemakkelijk de code herhaald uitvoeren (een van de grote
voordelen van een functie). Hiervoor moeten we een oneindig loopje maken (heb je nog niet gehad bij
Codecademy, maar hier heb je (een stukje van) de code, zodat we ’t toch vast kunnen gebruiken ):
#herhaal oneindig:
while True:
jaartal = raw_input("Geef een jaartal") #vraag de gebruiker om een jaartal
schikkeljaar = is_schrikkeljaar(jaartal) #geef jaartal door aan je functie
#doe iets slims om weer te geven of het wel of geen schrikkeljaar was:
if … :
# …
else:
# …
Alle code ingesprongen onder de while True: zal oneindig herhalen. Als het goed is zal je programma
de gebruiker nu dus blijven vragen om jaartallen en steeds zeggen of het ingevoerde jaartal een
schrikkeljaar is. Als je het programma wilt stoppen (want hij blijft oneindig doorgaan) druk je op ctrl+c op
je toetsenbord.
Bonus: Pas je programma aan zodanig dat hij om jaartallen blijft vragen, maar zodra het jaartal -1 wordt
ingevoerd het programma stopt. Je moet hiervoor de True achter de while aanpassen in iets slims…
6. Wijsheidgenerator
Schrijf een functie met de naam geef_wijsheid() die een geheel getal als invoer neemt. Als
antwoord geeft je functie een string terug met een wijze spreuk erin, bijvoorbeeld: “Geld uitgeven kost
geld” of “Van teveel veren in je reet ga je moeilijk lopen”. De spreuk wordt gekozen op basis van het
Wt / 2016
opgegeven nummer en hetzelfde nummer moet altijd dezelfde spreuk teruggeven. Je mag er zoveel
spreuken in stoppen als je wilt. (kijk bij de random quotes op de informatica site voor een boel wijsheden)
Zorg dat je functie alleen geldige getallen accepteert (dus alleen getallen waar ook een spreuk bij hoort).
Als een ander getal wordt gegeven, geeft je functie een foutmelding terug.
Bibliotheken en random getallen:
Bij Codecademy heb je gezien dat Python verschillende handige bibliotheken (libraries) met code en
commando’s heeft die je kunt gebruiken. Je moet hiervoor dan aan het begin van je code de bibliotheek
die je wilt gebruiken importeren (met het import commando, gevolgd door de naam van de
bibliotheek).
-
Importeer de bibliotheek met de naam random in je programma (deze bibliotheek kun je
gebruiken om willekeurige getallen te genereren).
Nu kun je (bijvoorbeeld) met het commando random.randint(1,20) een willekeurig getal
tussen de 1 en de 20 (20 zelf doet dan niet mee!) genereren.
Breid je geef_wijsheid() functie uit, zodanig dat als het getal 0 wordt opgegeven hij een
willekeurige spreuk uit de lijst terug geeft.
7. Sommengenerator
Je hebt een broertje op de basisschool en hij heeft moeite met de rekenlessen. Je besluit jouw
Pythonskills in te zetten om een sommen-oefenprogramma voor hem te maken.
Schrijf een functie genereer_som() die een willekeurige optelsom op het scherm afdrukt. De twee
getallen van de som moeten willekeurig worden gegenereerd en tussen de 1 en de 100 liggen (zie opgave
6 voor uitleg over random getallen). Bijvoorbeeld:
44 + 81
Roep als test de functie een paar keer achter elkaar aan om te zien of hij steeds andere getallen gebruikt
Je hebt nu een hele simpele sommengenerator, maar die kunnen we nog een stuk uitgebreider (en
nuttiger) maken natuurlijk…
Automatisch nakijken:
Je zou je broertje een stuk beter helpen als zijn antwoorden ook automatisch nagekeken worden door je
programma. Hiervoor passen we de genereer_som() functie aan. De functie drukt nu niet
rechtstreeks de som af op het scherm, maar “returnt” de twee random getallen waaruit de som bestaat
(gebruik een lijst!).
Je kunt deze random getallen nu gebruiken om de som op het scherm af te drukken, maar ook om de
uitkomst na te kijken! Vraag de gebruiker om zijn antwoord op de som in te voeren. Je programma
vergelijkt nu zijn invoer met de som van de twee random. Gebruik een if-constructie om de gebruiker te
vertellen of het gegeven antwoord goed of fout is. Als het fout is, moet je programma ook vertellen wat
dan wel het goede antwoord was:
Wt / 2016
Hoeveel is 21 + 66?
86
Helaas fout. Het goede antwoord was: 87
Herhaling:
Bij vraag 5 hebben we al even gespiekt hoe we een programma oneindig kunnen herhalen. Die code komt
hier ook van pas, zodat je broertje steeds nieuwe sommen achter elkaar kan maken. Je code ziet er dan
grofweg als volgt uit:
import random
def genereer_som():
# hier de inhoud van de functie
#
while
#
#
#
#
True:
- Genereer een som met behulp van genereer_som()
- Druk de som op het scherm af
- Vraag de gebruiker om het antwoord
- Vertel of het goed of fout was
(Je hebt nu weer een oneindige loop gemaakt, dus je programma stopt nooit meer. Je kunt de uitvoering
van je programma toch stoppen door op ctrl+c te drukken)
Kies je moeilijkheidsgraad:
We willen zorgen dat je broertje zelf zijn moeilijkheidsgraad kan kiezen. Aan het begin van ons
programma gaan we de gebruiker daarom vragen wat het hoogste getal is dat in de sommen mag
voorkomen (tot nu toe was dat 100). Sla dit op in een variabele.
We passen nu de definitie van genereer_som() aan, zodat je aan deze functie een maximumwaarde
kunt meegeven waarbinnen de som moet vallen. De definitie van de functie wordt dan:
genereer_som(maximum):
# genereer een som met twee willekeurige getallen
# de getallen liggen tussen 1 en maximum
Verschillende soorten sommen:
Het zou tof zijn als je programma niet alleen optelsommen genereert, maar ook vermenigvuldigings- en
aftreksommen. (Delen kan in principe ook, maar die laten we even weg omdat delen op een computer wat
anders werkt dan je verwacht. Probeer het gerust als je wilt).
Naast 2 willekeurige getallen willen we dus ook dat je programma per som willekeurig kiest voor +, - of *.
Het handigste is om deze 3 bewerkingen een eigen nummer te geven. Bijvoorbeeld + = 1, - = 2, * = 3. Je
kunt dan een willekeurig getal tussen 1 en 3 kiezen om te bepalen welke bewerking de som krijgt.
Let op dat je dit ook in de return-lijst moet zetten om de som goed te kunnen afdrukken en het antwoord
te kunnen checken. Je kunt een if-elif-else constructie gebruiken om de juiste operator (+, - of *) te kiezen
op basis van het willekeurige getal…
Wt / 2016
Bedenk zelf eventueel nog extra uitbreidingen voor de sommen-generator. Maak liefst slim gebruik van
functies om je code te structureren.
8. Schrikkeljaren. Schrikkeljaren overal!!
In vraag 4 heb je code geschreven om schrikkeljaren te berekenen. In vraag 5 heb je deze code omgezet
naar een functie die True of False teruggeeft als je er een jaartal in stopt. Nu je bekend bent met
lijsten, gaan we er een lijst met jaartallen op loslaten.
Je hebt gezien dat je met de for-constructie door de elementen uit een lijst kunt “lopen” om met elk
element iets te doen. Zoiets als dit (voorbeeld uit codecademy):
animals = ["cat", "ant", "bat"]
for animal in animals:
print animal
Hier is animals een lijst (gevuld met 3 strings). De for-constructie “wandelt” door deze lijst heen en
stopt steeds in de variabele animal het volgende element uit de lijst. In dit geval wordt zo elk dier uit de
lijst een voor een afgedrukt. We gaan deze truuk gebruiken om voor alle jaartallen van 0 t/m 2000 in een
keer te bepalen of het schrikkeljaren zijn of niet… 
Kopieer je is_schrikkeljaar(jaartal) functie uit vraag 5 naar de code voor deze opdracht. Die
komt nu goed van pas.
We gaan een lijst genereren met alle jaartallen van 0 t/m 2000. Intypen zou kunnen, maar daar ben je wel
even mee bezig. Dat kan vast handiger… Met de volgende voorbeeldcode genereer je een lijst met daarin
de getallen van 0 t/m 9:
Getallenlijst = range(0,10)
Gebruik deze code om een lijst met de jaartallen 0 t/m 2000 te maken.
Maak nu een for-constructie zoals hierboven die door alle jaartallen uit de lijst “wandelt” en ze een voor
een aan jouw is_schrikkeljaar() functie geeft om te checken of het een schrikkeljaar is. Je drukt
dit dan voor elk jaartal af op je scherm. Je uitvoer ziet er dan dus als volgt uit:
Het
Het
Het
Het
Het
Het
...
...
jaar
jaar
jaar
jaar
jaar
jaar
0
1
2
3
4
5
is
is
is
is
is
is
geen schrikkeljaar
geen schrikkeljaar
geen schrikkeljaar
geen schrikkeljaar
wel een schrikkeljaar
geen schrikkeljaar
Uitbreidingsmogelijkheid: Vraag de gebruiker tot hoe ver de lijst met jaartallen moet gaan.
Wt / 2016
9. Gemengde opgaven met strings en lijsten
Een verzameling korte opgaven waarin je functies schrijft die iets doen met een lijst of een string (een
string is stiekem ook een lijst weet je nog?)
9a Staafdiagram:
Schrijf een functie staafdiagram() die een lijst met gehele getallen als argument neemt en een
“staafdiagram” van sterretjes afdrukt. Bijvoorbeeld:
Staafdiagram([4, 8, 5]) zou de volgende uitvoer moeten produceren:
****
********
*****
Hint: je kunt strings “vermenigvuldigen” weet je nog? Het commando "hoi" * 3 zal als uitvoer hebben:
hoihoihoi
9b Ik houd niet van klinkers!
Schijf een functie klinkerloos() de een string als argument neemt en deze string afdrukt zonder
klinkers erin.
Pas vervolgens deze functie aan zodat hij alle niet-klinkers ook nog in hoofdletters verandert.
Bijvoorbeeld:
klinkerloos("Appeltaart") zou als uitvoer moeten geven:
PPLTRT
9c Palindroom
Een palindroom is een woord dat als je het omdraait nog steeds hetzelfde woord is. Zoals “lepel” of
“meetsysteem”.
Schrijf een functie is_palindroom() die een string als invoer neemt en boolean (True of False) teruggeeft
om aan te geven of de gegeven string een palindroom was of niet.
Hint: De truuk is om het gegeven woord letter voor letter te doorlopen. Kopieer elke letter die je
tegenkomt naar een nieuwe string, maar zet ze dan in omgekeerde volgorde. Als je dat gedaan hebt, hoef
je alleen de nieuwe string en de originele met elkaar te vergelijken. Als ze hetzelfde zijn, is het een
palindroom, anders niet
10. Tafels
Schrijf een Pythonscript dat om een getal vraagt. Vervolgens drukt je script de tafel van dat getal op het
scherm af. Bijvoorbeeld:
Welke tafel wil je maken?
8
Wt / 2016
1x8=8
2 x 8 = 16
3 x 8 = 24
4 x 8 = 32
5 x 8 = 40
6 x 8 = 48
7 x 8 = 56
8 x 8 = 64
9 x 8 = 72
10 x 8 = 80
11. Fibonacci
Fibonacci is een beroemde wiskundige uit de 13e eeuw. Hij is het meest bekend om zijn zogenaamde
“Fibonacci-reeks”. Deze reeks houdt verband met de zogenaamde “Gulden snede”. Die beschrijft een
ideale verhouding tussen opeenvolgende afmetingen. Dit is een fenomeen dat zich in de natuur veel
voordoet en ook in de kunstwereld veel wordt toegepast. (De beroemde Vitruviaanse Man, van Leonardo
Da Vinci zit er vol mee bijvoorbeeld.) Meer info op Wikipedia
De Fibonacci-reeks is een oneindige reeks getallen. De reeks begint met twee keer een 1. Alle volgende
getallen zijn steeds de som van de twee getallen ervoor. De reeks ziet er dus als volgt uit:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...
Schrijf een Python script dat de Fibonacci reeks kan uitschrijven. Het script vraagt de gebruiker om een
getal om aan te geven hoeveel Fibonaccigetallen er moeten worden uitgerekend. Vervolgens drukt je
script precies het gevraagde aantal stappen van de Fibonacci reeks af op het scherm.
12. Syracusereeks
Wiskundigen zijn gek op reeksen getallen die volgens bepaalde relatief eenvoudige regels worden
gegenereerd, maar wel bijzondere eigenschappen hebben. (Zoals bijvoorbeeld de Fibonacci reeks die we
al gezien hebben). Nog zo’n reeks is de Syracusereeks. De regels hiervan zijn ook eenvoudig:
-
Je kiest een startgetal (moet een geheel getal zijn)
Wt / 2016
-
-
Voor elk volgend getal geldt:
o Als het vorige getal even was, deel dat getal door 2.
o Als het vorige getal oneven was, vermenigvuldig het met 3 en tel er 1 bij op.
De reeks stopt als het getal 1 wordt bereikt
Dus bijvoorbeeld:
-
6, 3, 10, 5, 16, 8, 4, 2, 1
7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1
8, 4, 2, 1
...
Het bijzondere aan deze reeks is, is dat men het vermoeden heeft dat welk startgetal je ook kiest, de
reeks uiteindelijk altijd op 1 uitkomt en dus klaar is. Dit is getest voor hele grote startgetallen (Ongeveer
tot 5 * 1018 dus tot 5.000.000.000.000.000.000) . Maar het is nooit bewezen of het ook voor alle getallen
geldt (er zijn immers oneindig veel getallen...). De meeste wiskundigen denken dat dit wel zo is, maar
sluitend bewijs is er niet.
Schrijf een Python script dat om een startgetal vraagt en vervolgens de bijbehorende Syracusereeks op
het scherm afdrukt.
13. Dobbelen
Je kunt Python willekeurige getallen laten genereren met het commando randint(a, b) (spiek even bij
opgave 6 hoe het ook alweer zat…) Je vult dan in plaats van a de laagste waarde in die je wilt en in plaats
van b de hoogste.
Je kunt deze code bijvoorbeeld gebruiken om een dobbelsteen (een random waarde tussen 1 en 6) te
genereren.
13a Zessen tellen
Schrijf een script dat vraagt hoe vaak er met een dobbelsteen moet worden gegooid. Je script drukt
vervolgens alle gegooide waarden af en tot slot het aantal keer dat er 6 is gegooid (Dit zul je dus
“onderweg” moeten tellen)
Bijvoorbeeld:
Geef het aantal worpen:
10
2, 4, 3, 2, 2, 6, 5, 1, 6, 5
Er is 2 keer 6 gegooid
13b (uitdaging!). Yahtzee
Dit gaat boven de toetsstof, maar is een leuke uitdaging om te kijken hoe ver je komt: Maak het spelletje
Yahtzee. (Hier een link naar de officiële spelregels).
Je moet slimme dingen verzinnen om een aantal spelelementen te kunnen maken:
-
Er moet herhaaldelijk gegooid kunnen worden (beurten)
Wt / 2016
-
Per beurt zijn er 2 worpen, waarbij een deel van de dobbelstenen bewaard (vastgehouden) kan
worden na de eerste worp
De gebruiker moet kunnen kiezen in welk vak hij de score van een beurt invult
Je programma moet kunnen checken wat er gegooid is (hoe check je een straat? Of een Full
house?)
…
Meer opgaven komen eraan...
Wt / 2016
Download