{"id":5565,"date":"2012-09-13T16:38:25","date_gmt":"2012-09-13T20:38:25","guid":{"rendered":"http:\/\/cscircles.cemc.uwaterloo.ca\/?page_id=5565"},"modified":"2020-04-08T08:42:57","modified_gmt":"2020-04-08T12:42:57","slug":"6d-de","status":"publish","type":"page","link":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/6d-de\/","title":{"rendered":"6D: Design, Debugging und Donuts"},"content":{"rendered":"<p>In dieser Lektion gibt es einige Tipps, um das Entwerfen und Debuggen Deiner Programme einfacher zu machen. Je l\u00e4nger Du programmierst, um so besser wirst Du darin werden, Fehler zu vermeiden und zu beheben, aber hier werden wir versuchen, Dir ein paar sehr allgemeine und n\u00fctzliche Ratschl\u00e4ge zu geben. Wir werden die folgenden Techniken erl\u00e4utern:<\/p>\n<ul>\n<li>erstelle jeden Teil einzeln<\/li>\n<li>l\u00f6se einige Beispiele von Hand<\/li>\n<li>plane deinen Code bevor Du ihn schreibst<\/li>\n<li>schreibe den Code<\/li>\n<li>teste die Beispiele, die Du von Hand gel\u00f6st hast<\/li>\n<li>teste zus\u00e4tzliche Beispiele inklusive Grenzf\u00e4lle und zuf\u00e4llig gew\u00e4hlte F\u00e4lle<\/li>\n<\/ul>\n<p>Diese Zauberformel wird nicht alles automatisch l\u00f6sen, aber sie kann Dir einiges an Sorgen ersparen und die Probleme reduzieren, die sp\u00e4ter ausgeb\u00fcgelt werden m\u00fcssen.<\/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> Wenn ein Problem auftaucht, sind einige Strategien, um Dir das Debuggen zu erleichtern <em>Verwenden von diagnostischen Ausdr\u00fccken<\/em> (das wird sp\u00e4ter in dieser Lektion noch erl\u00e4utert), <em>Benutzen des Visualizers<\/em>, <em>den Code sorgf\u00e4ltig lesen<\/em>, und <em>gute Tests schreiben.<\/em> Falls Du <a href=\"\/run-at-home\">Python zu Hause benutzt<\/a>, kannst Du breakpoint und step Tools verwenden, um dahinter zu kommen, was falsch l\u00e4uft. <\/span><\/td><\/table><\/p>\n<p>Ein <strong><a href=\"http:\/\/http:\/\/de.wikipedia.org\/wiki\/Algorithmus\">Algorithmus<\/a><\/strong> ist eine Abfolge von Anweisungen. W\u00e4hrend ein Computerprogramm, um zu funktionieren, in einer bestimmten Sprache wie Python oder JavaScript geschrieben sein muss, bedeutet das Wort <strong>Algorithmus<\/strong> lediglich eine Schritt-f\u00fcr-Schritt Handlungsanweisung, die auch auf Deutsch geschrieben oder in einem Diagramm ausgedr\u00fcckt werden kann. Ein Rezept f\u00fcr Donuts ist zum Beispiel ein Algorithmus, mit \"nehme drei Tassen Mehl\" als ein Schritt, und \"lass den Teig f\u00fcr zwei Stunden gehen\" als ein weiterer. Wir werden in dieser Lektion einen einfachen Algorithmus entwickeln. Dann werden wir den Algorithmus <em>implementieren<\/em>, das hei\u00dft, wir werden ihn zu einem benutzbaren Computerprogramm machen.<\/p>\n<h2>Das Problem: Der Donut Rechner<\/h2>\n<p>Tim Horton's, eine Caf\u00e9-Kette in Kanada, verkauft <strong>Timbits<\/strong>, das sind leckere Donut Kugeln:<\/p>\n<div style=\"width: 510px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.flickr.com\/photos\/looking_and_learning\/5358233785\/\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" src=\"http:\/\/farm6.staticflickr.com\/5203\/5358233785_13e36e1d76.jpg\" width=\"500\" height=\"375\" \/><\/a><p class=\"wp-caption-text\">Photo: looking_and_learning, flickr<\/p><\/div>\n<p>Du musst in den n\u00e4chsten Wochen mehrere Parties organisieren, und Du wirst f\u00fcr jede Party eine andere Anzahl an Timbits bestellen. Also willst Du ein Programm schreiben, um den Preis einer beliebigen Anzahl von Timbits zu errechnen, um Dein Budget zu planen. In der Filiale in Deiner N\u00e4he gelten die folgenden Preise:<\/p>\n<table style=\"width: 350px; margin: auto;\">\n<tbody>\n<tr>\n<th>Anzahl<\/th>\n<th>Preis<\/th>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>$0.20<\/td>\n<\/tr>\n<tr>\n<td>10 (small box)<\/td>\n<td>$1.99<\/td>\n<\/tr>\n<tr>\n<td>20 (medium box)<\/td>\n<td>$3.39<\/td>\n<\/tr>\n<tr>\n<td>40 (large box)<\/td>\n<td>$6.19<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Erstelle jeden Teil einzeln<\/h2>\n<p>Letztendlich m\u00f6chtest Du ein Programm schreiben, dessen Input die <strong>Anzahl P der Leute auf der Party<\/strong> und dessen Output <strong>die Kosten, so viele Leute zu verpflegen inklusive Steuern<\/strong> ist. Auf der h\u00f6chsten Ebene hat dieses Programm drei Komponenten:<\/p>\n<ol>\n<li>berechne f\u00fcr <strong>P<\/strong> Leute, was die Anzahl <strong>T<\/strong> von Timbits ist, die Du kaufen solltest?<\/li>\n<li>berechne den Preis, um genau <strong>T<\/strong> Timbits zu kaufen<\/li>\n<li>berechne die Steuern und Gesamtkosten.<\/li>\n<\/ol>\n<p>Aber Du kannst jeden dieser Teile f\u00fcr sich bearbeiten. Wir empfehlen sogar, dass Du jeden Teil einzeln erstellst und ihn testest und in Ordnung bringst, bevor Du anf\u00e4ngst, am n\u00e4chsten Teil zu arbeiten, denn <em>je gr\u00f6\u00dfer dein Programm ist, um so schwieriger ist es, jeden Bug zu finden und zu beheben<\/em>. Es ist einfacher, die drei Teile einzeln zu entwickeln und zu testen, bevor man sie zu einem Programm zusammensetzt. F\u00fcr den Rest dieser Lektion werden wir uns auf Schritt 2 konzentrieren: <strong>berechne den Preis, um genau T Timbits zu kaufen.<\/strong><\/p>\n<h2>L\u00f6se einige Beispiele per Hand<\/h2>\n<p>Um dem Computer sagen zu k\u00f6nnen, was er tun soll, musst Du selbst in der Lage sein, es zu tun. Sehen wir uns ein Beispiel genauer an: was ist der Preis, um genau <strong>45<\/strong> Timbits zu kaufen? Wenn wir uns die Liste von Gr\u00f6\u00dfen anschauen, k\u00f6nnen wir eine gro\u00dfe Box kaufen (40), die $6.19 kostet. \u00dcbrig bleiben <strong>45 \u2013 40 = 5<\/strong> Timbits, die wir einzeln kaufen m\u00fcssen, die zus\u00e4tzlich 5 * $0.20 = $1.00 kosten. Die Gesamtkosten sind damit $6.19 + $1.00 = $7.19.<\/p>\n<h2>Plane deinen Code, bevor Du ihn schreibst<\/h2>\n<p>Was w\u00e4re, wenn Du 4 oder 456 Timbits anstatt 45 kaufen wolltest? Allgemein sollten wir so viele gro\u00dfe Boxen kaufen wie m\u00f6glich, dann eine mittlere Box und\/oder eine kleine Box nehmen falls ben\u00f6tigt, und einzelne Timbits, um die richtige Gesamtzahl zu erreichen. <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> Ist dieser Algorithmus wirklich optimal? Ja! Du kannst sehen, dass zwei mittlere Boxen zu kaufen (2*$3.39 = $6.78) eine schlechte Idee ist, da wir 2*20=40 Timbits billiger in einer einzelnen gro\u00dfen Box bekommen k\u00f6nnen. \u00c4hnliche Vergleiche zwischen einzeln\/klein und klein\/mittel k\u00f6nnen benutzt werden, um zu beweisen, dass der Algorithmus den g\u00fcnstigsten Preis liefert, um eine bestimmte Anzahl an Timbits zu kaufen. <em>Wenn die Preise\/Gr\u00f6\u00dfen andere w\u00e4ren, k\u00f6nnte es sein, dass wir vorsichtiger sein m\u00fcssten.<\/em> <\/span><\/td><\/table><\/p>\n<p>Wir haben gesagt, dass Du deinen Code planen solltest, bevor Du ihn schreibst. Du kannst:<\/p>\n<ul>\n<li>eine kurze Schritt-f\u00fcr-Schritt Beschreibung des Algorithmus' auf Deutsch statt in Python geben<\/li>\n<li>ein Diagramm oder Flowchart benutzen, um die Schritte zu zeigen<\/li>\n<li>dich f\u00fcr einen Moment auf die wichtigsten Ideen statt auf die Details konzentrieren.<\/li>\n<\/ul>\n<p>In unserem Beispiel geben wir eine Beschreibung auf Deutsch. <em>Wir zeigen Dir kein Flowchart f\u00fcr dieses spezifische Programm, weil es nur in einer geraden Linie von Schritt 1 zu Schritt 2 und so weiter laufen w\u00fcrde. F\u00fcr Programme mit Schleifen, wie wir sp\u00e4ter noch sehen werden, sind Flowcharts n\u00fctzlicher.<\/em><\/p>\n<div style=\"margin-top: 0px; margin-right: 100px; margin-bottom: 0px; margin-left: 100px; border-width: 1px; border-color: blue; border-style: solid;\">\n<p style=\"text-align: center;\"><strong>Algorithmus, um den Preis einer beliebigen Anzahl von Timbits zu berechnen<\/strong><\/p>\n<ol>\n<li>nimm die Input Anzahl von Timbits<\/li>\n<li>verfolge die Gesamtkosten, beginnend bei Null<\/li>\n<li>kaufe so viele gro\u00dfe Boxen wie m\u00f6glich\n<ol>\n<li>berechne die Anzahl von Timbits, die noch ben\u00f6tigt wird<\/li>\n<li>passe die Gesamtkosten an<\/li>\n<\/ol>\n<\/li>\n<li>kaufe eine mittlere Box, falls Du kannst und wiederhole Schritt A. und B.<\/li>\n<li>kaufe eine kleine Box, falls Du kannst und wiederhole Schritt A. und B.<\/li>\n<li>kaufe einzelne Timbits und wiederhole Schritt B.<\/li>\n<li>gib die Gesamtkosten aus<\/li>\n<\/ol>\n<\/div>\n<p>Wir nennen dies eine <strong>Pseudocode<\/strong>-Beschreibung des Algorithmus, weil es eine Reihe von Schritt-f\u00fcr-Schritt Anweisungen ist, aber nicht in einer echten Programmiersprache.<\/p>\n<h2>Schreibe den Code<\/h2>\n<p>Um den ersten Ratschlag noch einmal anzuwenden, <em>erstelle jeden Teil einzeln<\/em>, kannst Du auch auch ein separates St\u00fcck Code f\u00fcr jeden Schritt von 1 bis 7 schreiben. Zus\u00e4tzlich gibt es eine Sache, die wir f\u00fcr alle Schritte beachten m\u00fcssen: welche Variablen werden wir benutzen? Was werden ihre Namen, Typen und Ausgangswerte sein?<\/p>\n<p>Wir benutzen <code>timbitsLeft<\/code>, um die Anzahl von Timbits zu repr\u00e4sentieren, die wir noch kaufen m\u00fcssen und wir benutzen <code>totalCost<\/code>, um die Gesamtkosten bis jetzt zu repr\u00e4sentieren. Wir m\u00fcssen Python die Typen nicht im Voraus sagen, aber wir k\u00f6nnen f\u00fcr uns planen, dass <code>timbitsLeft<\/code> ein <code>int<\/code> sein wird, w\u00e4hrend <code>totalCost<\/code> eine <code>float<\/code>-Variable, die die Gesamtkosten in Dollar misst, sein wird. (Also ist ein Cent <code>0.01<\/code>). Wir werden einige zus\u00e4tzliche tempor\u00e4re Variablen innerhalb der einzelnen Schritte brauchen, die wir erst angehen werden, wenn wir sie brauchen.<\/p>\n<p>Schritte 1 und 2 k\u00f6nnen mit jeweils einer Zeile Code geschrieben werden:<\/p>\n<pre>timbitsLeft = int(input()) # Schritt 1: nimm den Input\r\ntotalCost = 0              # Schritt 2: setze die Gesamtkosten auf ihren Ausgangswert<\/pre>F\u00fcr Schritt 3 m\u00fcssen wir die maximale Anzahl an gro\u00dfen Boxen berechnen, die wir kaufen k\u00f6nnen. Wie genau k\u00f6nnen wir das machen? Da gro\u00dfe Boxen 40 Timbits enthalten, sollte die Zahl <code>bigBoxes<\/code> der ganzzahlige Quotient von <code>timbitsLeft<\/code> geteilt durch <code>40<\/code> sein. Die Division, die Kosten und die Subtraktion einbeziehend, bekommen wir das folgende Codefragment:<\/p>\n<pre># Schritt 3: kaufe so viele gro\u00dfe Boxen, wie Du kannst\r\nbigBoxes = timbitsLeft \/ 40\r\ntotalCost = totalCost + bigBoxes * 6.19    # passe die Gesamtkosten an\r\ntimbitsLeft = timbitsLeft - 40 * bigBoxes  # berechne die noch ben\u00f6tigten Timbits<\/pre>Eigentlich, so stellt sich heraus, haben wir bereits einen Fehler gemacht. Die beste Methode, um Fehler zu entdecken, ist es, deinen Code fr\u00fchzeitig und h\u00e4ufig zu testen! Lasst uns optimistischerweise sagen, dass wir den Codebestandteil an dieser Stelle testen. Wir werden einfach ein paar print statements einf\u00fcgen, um zu beobachten, wie er sich bis jetzt verh\u00e4lt. (<em>Anstatt print statements kannst Du auch den Visualizer benutzen, um jeden Schritt zu \u00fcberpr\u00fcfen.<\/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>Testet den Code bis hierhin mit dem Input <strong>45, <\/strong>unter Verwendung von <code>print<\/code> statements um das Debuggen zu erleichtern.<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>Das funktioniert nicht so, wie wir es uns vorgestellt hatten! Wo liegt das Problem? <strong>Welches ist die erste Zeile, in der etwas passiert ist, was wir so nicht geplant hatten?<\/strong> Versuche sie zu finden, bevor Du den n\u00e4chsten Absatz \u00f6ffnest. Denk daran, wir haben dieses Beispiel vorhin per Hand gel\u00f6st.<\/p>\n<div class=\"accordion\"> <div class='collapseContain hiding'>\n<div class='collapseHead'><span class='icon'><\/span>\nKlicke, um die Erkl\u00e4rung zu lesen\n<\/div>\n<div class='collapseBody'><br \/>\nSchuld an dem Problem ist die Zeile <code>bigBoxes = timbitsLeft \/ 40<\/code>, denn <code>bigBoxes<\/code> wird berechnet als <code>1.125<\/code>, w\u00e4hrend wir es mit einem Wert von <code>1<\/code> haben wollten. Man kann keinen Bruchteil einer Box kaufen. Ein m\u00f6glicher Ausweg, den Du in Lektion 7A sehen wirst, ist <code>\/\/<\/code> zu benutzen, um ganzzahlig zu dividieren anstatt <code>\/<\/code>, das Dezimalstellen hinter dem Komma ausgibt. Eine andere L\u00f6sung, die auf dem aufbaut, was wir in Lektion 4 gesehen haben, ist es,<code>timbitsLeft \/ 40<\/code> in einen <code>int<\/code> zu konvertieren, um den Bruchteil zu beseitigen. Wir werden diesen Ansatz benutzen: die Zeile wird zu <code>bigBoxes = int(timbitsLeft \/ 40)<\/code>.<br \/>\n<\/div><\/div> <\/div>\n<p>Schritte 4 und 5 sind \u00e4hnlich wie Schritt 3. Als eine Alternative, da du h\u00f6chstens eine mittlere Box und h\u00f6chstens eine kleine Box kaufen wirst, k\u00f6nnen wir auch ein <code>if<\/code> Statement benutzen:<\/p>\n<pre>if timbitsLeft &gt;= 20: # Schritt 4, k\u00f6nnen wir eine mittlere Box kaufen?\r\n  totalCost = totalCost + 3.39\r\n  timbitsLeft = timbitsLeft - 20\r\nif timbitsLeft &gt;= 10: # Schritt 5, k\u00f6nnen wir eine kleine Box kaufen?\r\n  totalCost = totalCost + 1.99\r\n  timbitsLeft = timbitsLeft - 20<\/pre>Zum Schluss m\u00fcssen wir noch 20 Cent f\u00fcr jeden der letzten ben\u00f6tigten Timbits bezahlen und die Antwort auswerfen.<\/p>\n<pre>totalCost = totalCost + timbitsLeft * 20 # Schritt 6\r\nprint(totalCost)                         # Schritt 7<\/pre>\n<h2>Teste die Beispiele, die Du von Hand gel\u00f6st hast<\/h2>\n<p>Hier ist das vollst\u00e4ndige Programm. Das erste, was wir tun werden, ist, zu testen, ob es mit dem Input <strong>45<\/strong> funktioniert, den wir von Hand gel\u00f6st hatten.<\/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>Was ist der Preis f\u00fcr 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>Es muss einen Bug geben, da wir \u00fcber 100 Dollar f\u00fcr nur 45 Timbits bezahlen sollen! Deine letzte Aufgabe ist es, diesen Bug und einen weiteren Bug, der sich im Code versteckt hat, zu finden und zu beseitigen. Das wird in der n\u00e4chsten Lektion getestet.<\/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> Nur damit Du es wei\u00dft, es gibt etwas Seltsames bei Tim Hortons Preisen, das kein Bug ist: es kann billiger sein, genau <strong>T+1<\/strong> Timbits zu kaufen als genau <strong>T<\/strong> Timbits zu kaufen. Zum Beispiel genau 19 Timbits zu kaufen kostet $3.79, w\u00e4hrend genau 20 Timbits nur $3.39 kosten. Trotzdem werden wir bei dem Problem bleiben, <em>genau<\/em> <strong>T<\/strong> Timbits so g\u00fcnstig wie m\u00f6glich zu kaufen, f\u00fcr das der oben erl\u00e4uterte Algorithmus korrekt ist. Also sollte Dein Programm tats\u00e4chlich <code>3.79<\/code> ausgeben, wenn der Input <code>19<\/code> ist. <\/span><\/td><\/table><\/p>\n<h2>Teste zus\u00e4tzliche Beispiele<\/h2>\n<p>In Computer Science Circles versuchen wir Deinen Code intelligent und automatisiert zu testen, um sicherzustellen, dass Du das Problem korrekt gel\u00f6st hast. Aber in einer echten Programmiersituation ist es deine eigene Aufgabe, deinen Code sorgf\u00e4ltig zu testen. Hier sind einige n\u00fctzliche Richtlinien f\u00fcr das Testen.<\/p>\n<ul>\n<li>Du kannst \u00fcberpr\u00fcfen, dass <em>jede Zeile Code<\/em> deines Programms korrekt funktioniert. Bezogen auf das Timbit Problem wird der Input <code>10<\/code> testen, ob wir kleine Boxen richtig handhaben. So \u00e4hnlich werden die Inputs <code>20<\/code> und <code>40<\/code> \u00fcberpr\u00fcfen, dass mittlere und gro\u00dfe Boxen korrekt gehandhabt werden. Zuletzt solltest Du \u00fcberpr\u00fcfen, ob wir einzelne Timbits richtig handhaben (z.B. mit dem Input <code>1<\/code>).\n<ul>\n<li>Dies kann helfen, zu \u00fcberpr\u00fcfen, dass Werte wie $3.39 und $1.99 korrekt eingegeben wurden.<\/li>\n<\/ul>\n<\/li>\n<li>\u00dcberpr\u00fcfe auf jeden Fall \"Grenzf\u00e4lle\", die dein Programm an seine Grenzen bringen. Zum Beispiel ist der minimale m\u00f6gliche Input f\u00fcr dieses Programm <code>0<\/code>, da es keine negativen Timbits gibts. Unser Programm hat keinen maximalen Input, aber es w\u00e4re sinnvoll, Werte wie <code>39<\/code> und <code>41<\/code> zu \u00fcberpr\u00fcfen, die nahe an der Grenze zu einfach nur eine Box kaufen sind.\n<ul>\n<li>Dies kann helfen zu \u00fcberpr\u00fcfen, dass Du nicht aus Versehen <code>&gt;<\/code> eingetippt hast, als Du stattdessen <code>&gt;=<\/code> h\u00e4ttest eintippen sollen.<\/li>\n<\/ul>\n<\/li>\n<li>In einigen F\u00e4llen kannst du automatisch <em>jeden<\/em> Input \u00fcberpr\u00fcfen, oder eine gro\u00dfe Anzahl von <em>zuf\u00e4lligen<\/em> Inputs \u00fcberpr\u00fcfen, um zu sehen, ob dein Programm wie gewollt funktioniert. Wir benutzen h\u00e4ufig zuf\u00e4llige Inputs in CS Circles' internen Tests. Benutze <code>import random<\/code> am Anfang deines Programms, dann wird zum Beispiel <code>random.randint(10, 100)<\/code> eine zuf\u00e4llige ganze Zahl zwischen <code>10<\/code> und <code>100<\/code> erzeugen.<\/li>\n<\/ul>\n<p>Kannst Du beide Bugs finden und alle Tests bestehen? Probier es mal!<\/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> Manche Berechnungen f\u00fchren zu kleinen Fehlern in Python:  <form class=\"pbform\" action=\"#\" id=\"pbform2\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox2'>\n<div class=\"heading\"><span class='type'>Example: <\/span><span class='title'>Rundungsfehler<\/span><\/div> <div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 32px;'><textarea wrap='off' name='usercode2' id='usercode2'  cols=10 rows=1 readonly='readonly'  style = 'height : 32px;'  class='pyboxCode RO'>\nprint(35 * 0.01)<\/textarea><\/div>\n<div id='pbhistory2' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit2' value=' '\/><\/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><\/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=\"4a32963604f9f165d9626da3c87bf7e5\"\/>\n<div id='pbresults2' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit2\").value = \"Run program\";document.getElementById(\"inputInUse2\").value = \"N\";<\/script>\n  Es ist \u00fcberraschend, dass der obenstehende Code nicht genau <code>0.35<\/code> gibt! Es hat etwas damit zu tun, wie Python Informationen speichert. Mach dir \u00fcber solche winzigen Fehler keine Gedanken: der Grader ignoriert sie. Dazu kommt mehr in Lektion 7B. <\/span><\/td><\/table><\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform3\" method=\"POST\">\n<div class='pybox modeNeutral ' id='pybox3'>\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>Behebe die Bugs und bestehe alle Tests!<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='usercode3' id='usercode3'  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<\/textarea><\/div>\n<div id='pbhistory3' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput3\">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='defaultCode3' 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='submit3' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch3\" value=\"Input Switch\" onclick=\"pbInputSwitch(3,'N')\" ><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(3)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(3,'N')\" ><\/td>\n<\/tr><\/table><select id='pbSelect3' class='selectmore'><option name='more'>More actions...<\/option>\n<option name='history' data-pbonclick=\"historyClick(3,'6d.timbits')\" >History<\/option>\n<option name='default' data-pbonclick=\"pbSetText(3,descape($('#defaultCode3').val()))\" >Reset code to default<\/option>\n<option name='help' data-pbonclick=\"helpClick(3);\" >Help<\/option>\n<\/select><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse3\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"3\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"0dec1aeb7d592f78a1f0645165c82b5c\"\/>\n<div id='pbresults3' class='pbresults avoidline'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>pbInputSwitch(3,\"N\");<\/script>\n<\/p>\n<p>Schon hungrig? Du bist bereit mit der n\u00e4chsten Lektion fortzufahren!<\/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\" alt=\"\" src=\"http:\/\/farm4.staticflickr.com\/3540\/3460673214_0292a66ffa_n.jpg\" \/>W\u00e4hrend 10 Timbits eine Box ergeben, ergeben 8 Tim<a href=\"http:\/\/de.wikipedia.org\/wiki\/Bit\">bits<\/a> ein Tim<a href=\"http:\/\/de.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 dieser Lektion gibt es einige Tipps, um das Entwerfen und Debuggen Deiner Programme einfacher zu machen. Je l\u00e4nger Du programmierst, um so besser wirst Du darin werden, Fehler zu vermeiden und zu beheben, aber hier werden wir versuchen, Dir &hellip; <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/6d-de\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2653,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-5565","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/5565","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\/2653"}],"replies":[{"embeddable":true,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/comments?post=5565"}],"version-history":[{"count":20,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/5565\/revisions"}],"predecessor-version":[{"id":9190,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/5565\/revisions\/9190"}],"wp:attachment":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/media?parent=5565"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}