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