{"id":6195,"date":"2012-11-05T20:45:58","date_gmt":"2012-11-06T01:45:58","guid":{"rendered":"http:\/\/cscircles.cemc.uwaterloo.ca\/?page_id=6195"},"modified":"2019-03-04T05:27:48","modified_gmt":"2019-03-04T10:27:48","slug":"6d-nl","status":"publish","type":"page","link":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/6d-nl\/","title":{"rendered":"06D: Design, Debugging en Donuts"},"content":{"rendered":"<p>In deze les geven we je suggesties hoe je het ontwerpen van programma's en het corrigeren van fouten gemakkelijker kunt maken. Hoe langer je programmeert, des te vaardiger je zult worden in het vermijden en verbeteren van fouten. Maar nu willen we je wat algemene nuttige adviezen geven. We zullen de volgende technieken bespreken:<\/p>\n<ul>\n<li>splits de opgave op en schrijf je programma in delen<\/li>\n<li>los enkele voorbeelden op met pen en papier<\/li>\n<li>maak een plan voordat je het programma begint te schrijven<\/li>\n<li>schrijf het programma<\/li>\n<li>test het programma met de voorbeelden die je op papier hebt uitgewerkt<\/li>\n<li>test met extra voorbeelden inclusief \"grensgevallen\" en willekeurig gekozen gevallen<\/li>\n<\/ul>\n<p>Deze magische formule zal niet alle moeilijkheden automatisch oplossen, maar het kan je hoofdpijn besparen en je behoeden voor een aantal problemen die je anders later moet oplossen.<br \/>\n<table class='pywarn'><tr><td class='pywarnleft'><img src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/warning.png'\/><\/td><td class='pywarnright'><span> Wanneer je programma niet correct werkt, dan kun je om het probleem te analyseren\u00a0<em><code>print<\/code>-opdrachten gebruiken om erachter te komen waar de fout zit<\/em> (we zullen dat verderop in deze les toepassen), <em>de visualizer gebruiken<\/em>, <em>het geschreven programma nauwkeurig nalezen<\/em>, en <em>goede tests schrijven.<\/em> Wanneer je <a href=\"\/run-at-home\">Python thuis uitvoert<\/a>, kun je breakpoints en step tools gebruiken om meer inzicht te krijgen in wat er misloopt. <\/span><\/td><\/table><br \/>\nEen <strong><a href=\"https:\/\/nl.wikipedia.org\/wiki\/Algoritme\">algoritme<\/a><\/strong> bestaat uit een rij opdrachten. Terwijl een computerprogramma geschreven moet worden in een speciale taal zoals Python of JavaScript, geeft een <strong>algoritme<\/strong>\u00a0de stap-voor-stap instructies weer op een meer conceptueel niveau. Een algoritme kan je dus ook in het Nederlands schrijven of in een diagramma tot uiting brengen. Zo is een recept voor donuts een algoritme, waarbij \"neem drie kopjes bloem\" een stap is, en \"laat het deeg twee uur rijzen\" een andere stap is. We zullen in deze les een eenvoudig algoritme ontwikkelen.\u00a0Daarna zullen we het algoritme <em>implementeren<\/em>, dat wil zeggen omzetten in een werkend computerprogramma.<\/p>\n<h2>Opgave: Donutkosten berekenen<\/h2>\n<p>Tim Horton, die een keten van caf\u00e9s bezit in Canada, verkoopt <strong>timbits<\/strong>, zeer smakelijke donuts:<\/p>\n<div>\n<dl id=\"\">\n<dt><a href=\"http:\/\/www.flickr.com\/photos\/looking_and_learning\/5358233785\/\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/farm6.staticflickr.com\/5203\/5358233785_13e36e1d76.jpg\" alt=\"\" width=\"500\" height=\"375\" \/><\/a><\/dt>\n<dd>Foto: looking_and_learning, flickr<\/dd>\n<\/dl>\n<\/div>\n<p>Je moet de komende week meerdere feestjes organiseren, en je wilt verschillende aantallen timbits bestellen voor elk feestje. Je wilt daarom een programma schrijven dat in staat is de prijs van een willekeurig aantal timbits te bepalen, zodat je de kosten kunt berekenen. De prijzen zijn als volgt:<\/p>\n<table>\n<tbody>\n<tr>\n<th>Aantal<\/th>\n<th>Prijs<\/th>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>$0.20<\/td>\n<\/tr>\n<tr>\n<td>10 (kleine doos)<\/td>\n<td>$1.99<\/td>\n<\/tr>\n<tr>\n<td>20 (medium doos<\/td>\n<td>$3.39<\/td>\n<\/tr>\n<tr>\n<td>40 (grote doos)<\/td>\n<td>$6.19<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Schrijf een programma, het ene deel na het andere<\/h2>\n<p>Naar we aannemen, wil je een programma schrijven waarbij de invoer bestaat uit <strong>het aantal mensen P aanwezig op het feestje<\/strong>\u00a0en de uitvoer is <strong>wat het feestje kost inclusief BTW<\/strong>. Op het hoogste niveau, zijn er drie deelprogramma's:<\/p>\n<ol>\n<li>bereken voor <strong>P<\/strong> mensen, wat het aantal timbits <strong>T<\/strong> is dat je moet kopen<\/li>\n<li>bereken de prijs van precies <strong>T<\/strong>\u00a0timbits<\/li>\n<li>bereken de BTW en daarna de totale kosten.<\/li>\n<\/ol>\n<p>Je kunt echter elk van de drie delen \u00e9\u00e9n voor \u00e9\u00e9n\u00a0schrijven. We bevelen ten zeerste aan dat je \u00e9\u00e9n deel schrijft, het test en verbetert voordat je aan het volgende deel begint, omdat\u00a0<em>hoe groter je programma is, des te moeilijker het zal zijn om een fout te vinden en die te herstellen<\/em>. Het is gemakkelijker om de drie delen van het programma apart te testen, voor dat je ze combineert tot \u00e9\u00e9n geheel. Voor de rest van deze les zullen we ons focussen op stap 2: <strong>de prijs bepalen van precies T timbits.<\/strong><\/p>\n<h2>Een paar voorbeelden handmatig oplossen<\/h2>\n<p>Om een computer te kunnen vertellen om iets te doen, moet je in staat zijn het zelf te doen. Laten we zelf een voorbeeld doorwerken: wat is de prijs van precies <strong>45<\/strong> timbits? Kijken we naar de grootte van de dozen, dan kunnen we \u00e9\u00e9n grote doos kopen met 40 timbits, met een prijs van $6.19. Daarna is het nodig om <strong>45 \u2013 40 = 5<\/strong> losse timbits te kopen die dan 5 * $0.20 = $1.00 kosten. De totale prijs is dan $6.19 + $1.00 = $7.19.<\/p>\n<h2>Maak een plan voor je programma voordat je het gaat schrijven<\/h2>\n<p>Maar wat wanneer we 4 timbits willen kopen of 456 in plaats van 45? In het algemeen dienen we zoveel mogelijk grote dozen te kopen als maar mogelijk is, en daarna zonodig een medium doos en\/of een kleine doos en\/of losse timbits om het juiste aantal te krijgen. <table class='pywarn'><tr><td class='pywarnleft'><img src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/warning.png'\/><\/td><td class='pywarnright'><span> Is dit algoritme echt het beste? Ja! Je kunt zien dat het kopen van twee medium dozen (2*$3.39 = $6.78) geen goed idee is omdat 2*20=40 timbits in \u00e9\u00e9n grote doos goedkoper is. Zo maakt een vergelijking van losse timbits tegenover een kleine doos en een kleine doos tegenover een medium doos duidelijk dat het algoritme de laagste prijs oplevert om welk aantal timbits dan ook te kopen. <em>Wanneer de prijzen anders waren, zouden we wellicht voorzichtiger moeten zijn.<\/em> <\/span><\/td><\/table><\/p>\n<p>We gaven aan dat je je programma moet structureren voor dat je het schrijft. Je kunt<\/p>\n<ul>\n<li>een korte stap-voor-stap-beschrijving geven van het algoritme in gewoon Nederlands in plaats van in Python.<\/li>\n<li>een diagram gebruiken of stroomschema om de stappen te laten zien.<\/li>\n<li>focus op de algemene lijnen in plaats van op de details, althans in het begin.<\/li>\n<\/ul>\n<p>In het volgende voorbeeld geven we je een stap-voor-stap-beschrijving in het Nederlands. <em>We zullen geen stroomschema geven voor dit programma omdat voor dit programma dat zou bestaan uit een stroomschema met stappen onder elkaar van stap 1 naar stap 2 enz. Alles in een rechte lijn.\u00a0Bij programma's met een lus, zoals we die later zullen tegenkomen, hebben we meer aan een stroomschema.<\/em><\/p>\n<div>\n<p><strong>Algoritme om de prijs te berekenen van een willekeurig aantal timbits<\/strong><\/p>\n<ol>\n<li>leg het aantal timbits vast via invoer<\/li>\n<li>houd de totale kosten bij, beginnend met nul<\/li>\n<li>koop zoveel grote dozen als je kunt\n<ol>\n<li>bereken het aantal timbits dat je nog steeds nodig hebt<\/li>\n<li>update de totale kosten<\/li>\n<\/ol>\n<\/li>\n<li>koop een medium doos wanneer dat mogelijk is en herhaal de stappen A en B.<\/li>\n<li>koop een kleine doos wanneer dat mogelijk is en herhaal de stappen A en B.<\/li>\n<li>koop losse timbits en herhaal stap B.<\/li>\n<li>voer de totale kosten uit<\/li>\n<\/ol>\n<\/div>\n<p>We noemen dit een beschrijving van het algoritme in\u00a0<strong>pseudocode<\/strong>, omdat het uit een rij instructies bestaat, stap voor stap weergegeven, maar niet in een echte programmeertaal.<\/p>\n<h2>Schrijf het programma<\/h2>\n<p>We roepen het eerste advies in herinnering, <i>schrijf je programma deel voor deel.\u00a0<\/i>Je kunt daarbij denken aan het schrijven van een apart stukje code voor elk van de stappen 1 tot en met 7. Verder moeten wij bij elk van de stappen nagaan welke variabelen we zullen gebruiken. Welke namen krijgen ze en wat is hun beginwaarde?<\/p>\n<p>Laten we <code>timbitsLeft<\/code>\u00a0gebruiken om het aantal timbits vast te leggen die we nog moeten kopen, en laten we <code>totalCost<\/code>\u00a0gebruiken om de totale kosten tot dusver vast te leggen. We hoeven in Python niet vooraf het type vast \u00a0te leggen, maar we kunnen inzien dat\u00a0<code>timbitsLeft<\/code> een\u00a0<code>int<\/code> zal zijn, terwijl\u00a0<code>totalCost<\/code> een \u00a0<code>float<\/code>-variabele zal zijn waarmee de totale kosten in dollars is vastgelegd. (Dus is een dollarcent <code>0.01<\/code>.) We zullen nog enkele extra tijdelijke variabelen bij elke stap nodig hebben, maar dat zullen we bekijken op het moment dat we ze nodig hebben.<\/p>\n<p>Stap 1 en 2 kunnen geschreven worden door middel van een regel per stap:<\/p>\n<pre>timbitsLeft = int(input()) # stap 1: leg de invoer vast\r\ntotalCost = 0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0# stap 2: initialiseer de totale kosten<\/pre>In Stap 3 dienen we het maximaal aantal grote dozen te berekenen dat we \u00a0kunnen kopen. Hoe kunnen we dat doen? Omdat een grote doos 40 timbits bevat, zal het aantal\u00a0<code>bigBoxes<\/code>\u00a0gelijk zijn aan het gehele quoti\u00ebnt van\u00a0<code>timbitsLeft<\/code> gedeeld door\u00a0<code>40<\/code>. Door de deling, de kosten en het verschil bij te houden krijgen we het volgende programmadeel:<\/p>\n<pre># stap 3: koop zoveel mogelijke grote dozen\r\nbigBoxes = timbitsLeft \/ 40\r\ntotalCost = totalCost + bigBoxes * 6.19 \u00a0 \u00a0# pas de totale prijs aan\r\ntimbitsLeft = timbitsLeft - 40 * bigBoxes \u00a0# bereken het aantal timbits dat we nog nodig hebben<\/pre>Eigenlijk, zo blijkt,\u00a0 hebben we al een fout gemaakt. De beste manier om een fout te ontdekken is je programma zo vroeg mogelijk (en ook vaak) te testen! Laten we daarom dit deel van het programma testen. We zullen een paar <code>print<\/code>-opdrachten toevoegen om de werking tot hier te kunnen bekijken. (<em>In plaats van <code>print<\/code>-opdrachten te gebruiken, kun je ook de visualizer gebruiken om elke stap te checken.<\/em>)<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform0\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox0'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Test het programma tot dusver met als invoer <strong>45, <\/strong>en gebruik daarbij een <code>print<\/code>-opdracht om het verbeteren te vergemakkelijken.<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 370px;'><textarea wrap='off' name='usercode0' id='usercode0'  cols=10 rows=14 readonly='readonly'  style = 'height : 370px;'  class='pyboxCode RO'>\ntimbitsLeft = int(input()) # step 1: get the input\n\nprint('the input is', timbitsLeft)\n\ntotalCost = 0              # step 2: initialize the total cost\n\n# step 3: buy as many large boxes as you can\nbigBoxes = timbitsLeft \/ 40\ntotalCost = totalCost + bigBoxes * 6.19    # update the total price\ntimbitsLeft = timbitsLeft - 40 * bigBoxes  # calculate timbits still needed\n\nprint('bigBoxes equals', bigBoxes)\nprint('totalCost equals', totalCost)\nprint('now timbitsLeft equals', timbitsLeft)<\/textarea><\/div>\n<div id='pbhistory0' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit0' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(0)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(0,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse0\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"0\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"0acf58630d94167b06a21d5a43bfaa34\"\/>\n<div id='pbresults0' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit0\").value = \"Run program\";document.getElementById(\"inputInUse0\").value = \"N\";<\/script>\n<\/p>\n<p>Dat werkt niet zoals we dat willen! Wat is het probleem?\u00a0<strong>Waar staat de eerste regel, waarin iets gebeurt, dat we zo niet bedoeld hebben? <\/strong>Probeer die te vinden voordat je naar de volgende paragraaf gaat. Denk eraan dat we dit voorbeeld eerder met de hand hebben opgelost.<\/p>\n<div class=\"accordion\"><div class='collapseContain hiding'>\n<div class='collapseHead'><span class='icon'><\/span>\nKlik om de uitleg te openen\n<\/div>\n<div class='collapseBody'>De oorzaak van het probleem zit in de regel met <code>bigBoxes = timbitsLeft \/ 40<\/code>, omdat <code>bigBoxes<\/code>\u00a0gelijk is aan <code>1.125<\/code>, terwijl we de waarde <code>1<\/code>\u00a0wensten. Je kunt immers geen deel van een doos kopen.\u00a0Een mogelijke uitweg, die je in hoofdstuk 7A zult zien, is het gebruik van <code>\/\/<\/code> (quoti\u00ebnt als geheel getal) in plaats van <code>\/<\/code>\u00a0(quoti\u00ebnt als kommagetal). Een andere oplossing, gebaseerd op wat we in Les 4 zagen, is <code>timbitsLeft \/ 40<\/code> te vertalen naar een geheel getal via <code>int<\/code> waardoor we de cijfers na de komma weghalen. We zullen deze aanpak gebruiken: de regel wordt\u00a0<code>bigBoxes = int(timbitsLeft \/ 40)<\/code>.<\/p>\n<p><\/div><\/div><\/div>\n<p>Stappen 4 en 5 lijken op stap 3. Als alternatief, omdat je hoogstens \u00e9\u00e9n medium doos en hoogstens \u00e9\u00e9n kleine doos koopt, kunnen we een <code>if<\/code>-opdracht gebruiken:<\/p>\n<pre>if timbitsLeft &gt;= 20: # stap 4, kunnen we een medium doos kopen?\r\n\u00a0 totalCost = totalCost + 3.39\r\n\u00a0 timbitsLeft = timbitsLeft - 20\r\nif timbitsLeft &gt;= 10: # stap 5, kunnen we een kleine doos kopen?\r\n\u00a0 totalCost = totalCost + 1.99\r\n\u00a0 timbitsLeft = timbitsLeft - 20<\/pre>Tot slot, moeten we 20 centen betalen voor elk van de overgebleven timbits en \u00a0het antwoord weergeven.<\/p>\n<pre>totalCost = totalCost + timbitsLeft * 20 # stap 6\r\nprint(totalCost) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 # stap 7<\/pre>\n<h2>Test met de voorbeelden die je met de hand hebt opgelost<\/h2>\n<p>Hier is het volledige programma. Het eerste wat we zullen doen, is de test of het werkt met invoer <strong>45<\/strong>, het geval dat we met pen en papier hebben opgelost.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform1\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox1'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Wat kosten 45 timbits?<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 448px;'><textarea wrap='off' name='usercode1' id='usercode1'  cols=10 rows=17 readonly='readonly'  style = 'height : 448px;'  class='pyboxCode RO'>\ntimbitsLeft = int(input()) # step 1: get the input\ntotalCost = 0              # step 2: initialize the total cost\n\n# step 3: buy as many large boxes as you can\nbigBoxes = int(timbitsLeft \/ 40)\ntotalCost = totalCost + bigBoxes * 6.19    # update the total price\ntimbitsLeft = timbitsLeft - 40 * bigBoxes  # calculate timbits still needed\n\nif timbitsLeft >= 20:                # step 4, can we buy a medium box?\n    totalCost = totalCost + 3.39\n    timbitsLeft = timbitsLeft - 20\nif timbitsLeft >= 10:                # step 5, can we buy a small box?\n    totalCost = totalCost + 1.99\n    timbitsLeft = timbitsLeft - 20\n\ntotalCost = totalCost + timbitsLeft * 20 # step 6\nprint(totalCost)                         # step 7<\/textarea><\/div>\n<div id='pbhistory1' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput1\">You may enter input for the program in the box below.<div class=\"pyboxTextwrap resizy\" style=\"height: 102px;\" ><textarea wrap=\"off\" name=\"userinput\" class=\"pyboxInput\" cols=10 rows=4><\/textarea><\/div><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit1' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch1\" value=\"Input Switch\" onclick=\"pbInputSwitch(1,'N')\" ><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(1)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(1,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse1\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"1\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"ae7f39a2f081174496afa1aa7fb37010\"\/>\n<div id='pbresults1' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>pbInputSwitch(1,\"N\");<\/script>\n<\/p>\n<p>Er moet ergens iets fout zijn omdat we meer dan 100 dollar betalen voor maar 45 timbits! Je laatste opdracht is om deze fout te vinden en te verbeteren, en ook nog een andere fout die in het programma zit. Het zal worden getest in de volgende les.<\/p>\n<p><table class='pywarn'><tr><td class='pywarnleft'><img src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/warning.png'\/><\/td><td class='pywarnright'><span> Je dient nog te weten dat er iets bijzonders is met de prijzen van Tim Horton, maar dat is geen fout: het kan goedkoper door <strong>T+1<\/strong> timbits te kopen in plaats van precies <strong>T<\/strong> timbits. Bijvoorbeeld, 19 timbits kosten $3.79, terwijl 20 timbits maar $3.39 kosten. Niettemin zullen we vasthouden aan de opdracht om <em>precies<\/em> <strong>T<\/strong> timbits te kopen en wel zo goedkoop mogelijk. Hiervoor is het algoritme, zoals eerder uitgelegd, correct. Dus dient je programma <code>3.79<\/code> als uitvoer te geven bij een invoer van <code>19<\/code>. <\/span><\/td><\/table><\/p>\n<h2>Test met nog meer voorbeelden<\/h2>\n<p>In Computer Science Circles proberen we je programma intelligent en geautomatiseerd te testen om er zeker van te zijn dat je het probleem correct hebt opgelost. Maar in een echte programmeersituatie, is het aan jou om je programma zorgvuldig te testen. Hier volgen een paar nuttige tips om je programma te testen.<\/p>\n<ul>\n<li>Je kunt nagaan of <em>iedere regel van je programma<\/em>\u00a0correct werkt. In het timbitprobleem zal bij gebruik van de invoer <code>10<\/code> worden getest of we goed omgaan met kleine dozen. Op dezelfde manier zullen we met invoer <code>20<\/code> en <code>40<\/code> testen of medium en grote dozen correct worden afgehandeld. Tot slot dien je na te gaan of enkelvoudige timbits juist worden afgehandeld (bv. met een invoer van <code>1<\/code>).\n<ul>\n<li>Dit kan helpen om na te gaan of waarden zoals $3.39 en $1.99 correct zijn ingevoerd.<\/li>\n<\/ul>\n<\/li>\n<li>Ga in ieder geval \"grensgevallen\" na, die je programma tot het uiterste dwingen. Zo is bijvoorbeeld de kleinste invoer bij dit programma <code>0<\/code>, omdat je niet een negatief aantal timbits kunt hebben. Ons programma heeft geen grootste invoer, maar je zou waarden kunnen proberen zoals <code>39<\/code> en <code>41<\/code> die dicht bij de grens liggen om slechts \u00e9\u00e9n grote doos te kopen.\n<ul>\n<li>Dit kan helpen om na te gaan dat je niet per ongeluk <code>&gt;<\/code> hebt ingetypt in plaats van <code>&gt;=<\/code>.<\/li>\n<\/ul>\n<\/li>\n<li>In sommige gevallen kun je automatisch <em>elke<\/em> invoer testen, of een groot aantal\u00a0<em>willekeurige<\/em>\u00a0invoerwaarden om na te gaan of je programma correct werkt. We gebruiken bij CS Circles vaak willekeurig gekozen invoer bij het testen. Gebruik je <code>import random<\/code> bij het begin van je programma, dan zal met <code>random.randint(10, 100)<\/code> een willekeurig geheel getal tussen <code>10<\/code> en\u00a0<code>100<\/code> worden gegenereerd.<\/li>\n<\/ul>\n<p>Kun je beide fouten opsporen en alle testen doorstaan? Probeer het!<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform2\" method=\"POST\">\n<div class='pybox modeNeutral ' id='pybox2'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Coding Exercise: <\/span><span class='title'>Timbits<\/span><\/div>Verbeter de fouten en doorsta alle testen!<div class=\"helpOuter\" style=\"display: none;\"><div class=\"helpInner\"><div style=\"text-align: center\">You need to create an account and log in to ask a question.<\/div><\/div><\/div><div class='pyboxTextwrap pyboxCodewrap RW resizy'  style='height: 526px;'><textarea wrap='off' name='usercode2' id='usercode2'  cols=10 rows=20   class='pyboxCode RW'>\ntimbitsLeft = int(input()) # step 1: get the input\ntotalCost = 0              # step 2: initialize the total cost\n\n# step 3: buy as many large boxes as you can\nbigBoxes = int(timbitsLeft \/ 40)\ntotalCost = totalCost + bigBoxes * 6.19    # update the total price\ntimbitsLeft = timbitsLeft - 40 * bigBoxes  # calculate timbits still needed\n\nif timbitsLeft >= 20:                # step 4, can we buy a medium box?\n    totalCost = totalCost + 3.39\n    timbitsLeft = timbitsLeft - 20\nif timbitsLeft >= 10:                # step 5, can we buy a small box?\n    totalCost = totalCost + 1.99\n    timbitsLeft = timbitsLeft - 20\n\ntotalCost = totalCost + timbitsLeft * 20 # step 6\nprint(totalCost)                         # step 7\n# delete this comment and enter your code here\n<\/textarea><\/div>\n<div id='pbhistory2' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput2\">You may enter input for the program in the box below.<div class=\"pyboxTextwrap resizy\" style=\"height: 102px;\" ><textarea wrap=\"off\" name=\"userinput\" class=\"pyboxInput\" cols=10 rows=4><\/textarea><\/div><\/div>\n<input type='hidden' id='defaultCode2' value='timbitsLeft = int(input()) # step 1: get the input\\ntotalCost = 0              # step 2: initialize the total cost\\n\\n# step 3: buy as many large boxes as you can\\nbigBoxes = int(timbitsLeft \\\/ 40)\\ntotalCost = totalCost + bigBoxes * 6.19    # update the total price\\ntimbitsLeft = timbitsLeft - 40 * bigBoxes  # calculate timbits still needed\\n\\nif timbitsLeft >= 20:                # step 4, can we buy a medium box?\\n    totalCost = totalCost + 3.39\\n    timbitsLeft = timbitsLeft - 20\\nif timbitsLeft >= 10:                # step 5, can we buy a small box?\\n    totalCost = totalCost + 1.99\\n    timbitsLeft = timbitsLeft - 20\\n\\ntotalCost = totalCost + timbitsLeft * 20 # step 6\\nprint(totalCost)                         # step 7\\n'><\/input>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit2' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch2\" value=\"Input Switch\" onclick=\"pbInputSwitch(2,'N')\" ><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(2)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(2,'N')\" ><\/td>\n<\/tr><\/table><select id='pbSelect2' class='selectmore'><option name='more'>More actions...<\/option>\n<option name='history' data-pbonclick=\"historyClick(2,'6d.timbits')\" >History<\/option>\n<option name='default' data-pbonclick=\"pbSetText(2,descape($('#defaultCode2').val()))\" >Reset code to default<\/option>\n<option name='help' data-pbonclick=\"helpClick(2);\" >Help<\/option>\n<\/select><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse2\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"2\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"f22deff57f1600624ee9b9ef744253e8\"\/>\n<div id='pbresults2' class='pbresults avoidline'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>pbInputSwitch(2,\"N\");<\/script>\n<\/p>\n<p>Nog steeds hongerig? Dan ben je klaar om verder te gaan met de volgende les!<\/p>\n<p><table class='pywarn'><tr><td class='pywarnleft'><img src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/warning.png'\/><\/td><td class='pywarnright'><span> <img decoding=\"async\" src=\"http:\/\/farm4.staticflickr.com\/3540\/3460673214_0292a66ffa_n.jpg\" alt=\"\" \/>Terwijl\u00a0 je met 10 timbits een doos kunt vullen, maken 8 tim<a href=\"http:\/\/en.wikipedia.org\/wiki\/Bit\">bits<\/a> \u00e9\u00e9n tim<a href=\"http:\/\/en.wikipedia.org\/wiki\/Byte\">byte<\/a>. <a href=\"http:\/\/www.flickr.com\/photos\/thisisbrianfisher\/3460673214\/\"><em>Photo: thisisbrianfisher, flickr<\/em><\/a> <\/span><\/td><\/table><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In deze les geven we je suggesties hoe je het ontwerpen van programma's en het corrigeren van fouten gemakkelijker kunt maken. Hoe langer je programmeert, des te vaardiger je zult worden in het vermijden en verbeteren van fouten. Maar nu &hellip; <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/6d-nl\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-6195","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/6195","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/comments?post=6195"}],"version-history":[{"count":38,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/6195\/revisions"}],"predecessor-version":[{"id":11197,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/6195\/revisions\/11197"}],"wp:attachment":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/media?parent=6195"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}