{"id":5549,"date":"2012-09-13T16:23:14","date_gmt":"2012-09-13T20:23:14","guid":{"rendered":"http:\/\/cscircles.cemc.uwaterloo.ca\/?page_id=5549"},"modified":"2020-04-08T08:41:22","modified_gmt":"2020-04-08T12:41:22","slug":"1e-de","status":"publish","type":"page","link":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/1e-de\/","title":{"rendered":"1E:  Fehler"},"content":{"rendered":"<p>Wer mehr und mehr programmiert, bei dem werden irgendwann Fehler (oder <em>Bugs<\/em>) auftreten. Das Ausl\u00f6sen, Verstehen und Korrigieren von Fehlern ist ein wichtiger Teil des Programmierens. Python wird - soweit m\u00f6glich - alles ausf\u00fchren, was gefragt ist, aber wenn es nicht m\u00f6glich ist, wird es nat\u00fcrlich auch nicht gehen. Ist das der Fall, versucht Python zumindest noch ein paar Informationen \u00fcber den Fehler zu nennen, damit du ihn korrigieren kannst.<\/p>\n<p>Hier ist ein Python-Fehler:<\/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='type'>Example: <\/span><span class='title'>Ein Syntaxfehler<\/span><\/div> <div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 32px;'><textarea wrap='off' name='usercode0' id='usercode0'  cols=10 rows=1 readonly='readonly'  style = 'height : 32px;'  class='pyboxCode RO'>\nprint \"ein Test\"<\/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<\/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=\"e03642946a2c3aa8b0f25fff5aa86dad\"\/>\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>In diesem ersten Beispiel haben wir die Klammern vergessen, die f\u00fcr <code>print(...)<\/code> erforderlich sind. Python versteht nicht, was wir zu tun versuchen.<\/p>\n<p>Hier eine andere Art von Fehler:<\/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='type'>Example: <\/span><span class='title'>Ein Laufzeitfehler<\/span><\/div> <div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 32px;'><textarea wrap='off' name='usercode1' id='usercode1'  cols=10 rows=1 readonly='readonly'  style = 'height : 32px;'  class='pyboxCode RO'>\nprint(test)<\/textarea><\/div>\n<div id='pbhistory1' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit1' value=' '\/><\/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=\"3cc6d4d6ed524e1f7720da4f845b458d\"\/>\n<div id='pbresults1' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit1\").value = \"Run program\";document.getElementById(\"inputInUse1\").value = \"N\";<\/script>\n<\/p>\n<p>In diesem zweiten Beispiel haben wir die Variable\u00a0<code>test<\/code>\u00a0nicht definiert, aber genutzt. Python wei\u00df, was wir tun wollen, aber da\u00a0<code>test<\/code>\u00a0nicht existiert, tritt ein Fehler auf.<\/p>\n<p>Ein <strong>Syntax-Fehler<\/strong>\u00a0tritt auf, wenn Python nicht versteht, was gemeint ist. Ein <strong>Laufzeitfehler<\/strong>\u00a0tritt auf, wenn Python wei\u00df, was es tun soll, aber den Befehl nicht ausf\u00fchren kann.<\/p>\n<p>Im Deutschen w\u00e4re ein <strong>Syntaxfehler<\/strong> ein Satz wie<\/p>\n<p style=\"text-align: center\"><em>Bitte Katze Hund Affe.<\/em><\/p>\n<p>Die Grammatik in diesem Satz macht keinen Sinn. Aus der Sicht der deutschen Grammatik fehlt hier ein <em>Verb<\/em> (Aktion). Man kann nicht verstehen, was gefragt ist. <em>Syntax<\/em> bedeutet das Gleiche wie <em>Grammatik<\/em>.<\/p>\n<p>Im Deutschen w\u00e4re ein <strong>Laufzeitfehler<\/strong>\u00a0ein Satz wie<\/p>\n<p style=\"text-align: center\"><em>Bitte iss das Klavier.<\/em><\/p>\n<p>Der Satz macht Sinn in grammatikalischer Sicht - es gibt ein Substantiv und ein Verb an der richtigen Stelle - also kann man verstehen, was gefragt ist. Allerdings wirst du Probleme haben, den Befehl auszuf\u00fchren - es sei denn, du bist eine Termite. Man nennt dies einen <em>Laufzeitfehler<\/em>, da es erst auftritt, wenn das Programm gestartet ist - also w\u00e4hrend der Laufzeit.<\/p>\n<p>Wir werden auch \u00fcber <strong>logische Fehler<\/strong>\u00a0reden. Das sind Fehler, die das Programm nicht zum Absturz bringen, aber das falsche Ergebnis liefern. Ein Beispiel w\u00e4re:<\/p>\n<p style=\"text-align: center\"><em>Bitte schlie\u00dfe die Hintert\u00fcre, damit keine Fliegen reinkommen.<\/em><\/p>\n<p>Das w\u00e4re ein logischer Fehler, wenn die <em>Vordert\u00fcre<\/em> auch offen ist: auch wenn der Befehl Sinn macht und du die Hintert\u00fcr schlie\u00dfen kannst, wird das Ziel - die Fliegen drau\u00dfen zu lassen - nicht erreicht, wenn sie noch durch die Vordert\u00fcr reinkommen.<\/p>\n<h2>Typische Syntaxfehler<\/h2>\n<p>Hier sind weitere Beispiele von Syntaxfehlern, die in Python auftreten k\u00f6nnen. Unter anderem k\u00f6nnen Syntaxfehler auftreten, wenn man vergisst, Strings in Anf\u00fchrungszeichen zu setzen:<\/p>\n<p><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'>Syntaxfehler<\/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(Hello, World!)<\/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<\/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=\"5ef8bf1f673c585d33471b4a9615b606\"\/>\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<\/p>\n<p>Hier versucht Python, <code>Hello<\/code> und <code>World!<\/code> als Namen von Variablen zu verstehen.  Aber das gelingt nicht. Stattdessen tritt der Fehler <code>SyntaxError: invalid syntax<\/code> auf, wobei <code>^<\/code> auf das Ausrufezeichen zeigt. Das liegt daran, dass in Python Ausrufezeichen (<code>!<\/code>) in Variablennamen nicht erlaubt sind. Die Syntax ist ung\u00fcltig.<br \/>\nDer Syntaxfehler verschwindet, wenn man <code>print(\"Hello, World!\")<\/code> benutzt.  Dann akzeptiert Python das <code>!<\/code> als Teil des Textes <code>\"Hello, World!\"<\/code>.<\/p>\n<p>Ein anderer kleiner Fehler:<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform3\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox3'>\n<div class=\"heading\"><span class='type'>Example: <\/span><span class='title'>Syntaxfehler<\/span><\/div> <div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 32px;'><textarea wrap='off' name='usercode3' id='usercode3'  cols=10 rows=1 readonly='readonly'  style = 'height : 32px;'  class='pyboxCode RO'>\nclass = \"Advanced Computronics for Beginners\"<\/textarea><\/div>\n<div id='pbhistory3' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit3' value=' '\/><\/td>\n<\/tr><\/table><\/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=\"e39dc2a8b70fe710a422a08447753c60\"\/>\n<div id='pbresults3' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit3\").value = \"Run program\";document.getElementById(\"inputInUse3\").value = \"N\";<\/script>\n<\/p>\n<p>Das Problem hier ist, dass <code>class<\/code> ein spezielles Wort in Python ist. H\u00e4tte man stattdessen <code>course<\/code> geschrieben, w\u00fcrde alles wunderbar funktionieren. Klicke <a class=\"hintlink\"  id=\"hintlink4\">hier<\/a> um eine Liste aller speziellen W\u00f6rter (auch \"Reservierte Bezeichner\") zu sehen.<\/p>\n<p>Wenn du Anf\u00fchrungszeichen oder Klammern benutzt und das\/die zweite vergessen hast, wird ein Syntaxfehler auftreten:<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform5\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox5'>\n<div class=\"heading\"><span class='type'>Example: <\/span><span class='title'>Syntax Error<\/span><\/div>Zweite Anf\u00fchrungsstriche vergessen<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 32px;'><textarea wrap='off' name='usercode5' id='usercode5'  cols=10 rows=1 readonly='readonly'  style = 'height : 32px;'  class='pyboxCode RO'>\nname = \"Jim<\/textarea><\/div>\n<div id='pbhistory5' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit5' value=' '\/><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse5\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"5\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"2b9b36f18baf10a204853abe445376e8\"\/>\n<div id='pbresults5' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit5\").value = \"Run program\";document.getElementById(\"inputInUse5\").value = \"N\";<\/script>\n<\/p>\n<p>In dieser Fehlermeldung steht <strong>EOL<\/strong> als Abk\u00fcrzung f\u00fcr \"<strong>E<\/strong>nd <strong>O<\/strong>f <strong>L<\/strong>ine\" (Ende der Zeile): Python erwartet ein weiteres <code>\"<\/code> aber das Ende der Zeile wurde erreicht, bevor es gefunden werden konnte.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform6\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox6'>\n<div class=\"heading\"><span class='type'>Example: <\/span><span class='title'>Syntax Error<\/span><\/div>Schlie\u00dfende Klammer vergessen<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 32px;'><textarea wrap='off' name='usercode6' id='usercode6'  cols=10 rows=1 readonly='readonly'  style = 'height : 32px;'  class='pyboxCode RO'>\nprint(77<\/textarea><\/div>\n<div id='pbhistory6' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit6' value=' '\/><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse6\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"6\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"baaaabc8327952d3de7cddd98e61eb2f\"\/>\n<div id='pbresults6' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit6\").value = \"Run program\";document.getElementById(\"inputInUse6\").value = \"N\";<\/script>\n<\/p>\n<p>Genauso steht\u00a0<strong>EOF<\/strong>\u00a0f\u00fcr\u00a0\"<strong>E<\/strong>nd\u00a0<strong>O<\/strong>f\u00a0<strong>F<\/strong>ile\" (Ende der Datei): Python suchte nach <code>)<\/code> aber die Datei endet vorher.<\/p>\n<h2>Laufzeitfehler<\/h2>\n<p>Hier sind einige Laufzeitfehler. Python ist in der Lage zu verstehen, was das Programm sagt, aber ger\u00e4t in Schwierigkeiten, wenn es tats\u00e4chlich die Anweisungen ausf\u00fchrt.<\/p>\n<ul>\n<li>Verwendung einer undefinierten Variable oder Funktion. Dies kann auch passieren, wenn du Gro\u00dfbuchstaben unregelm\u00e4\u00dfig im Namen einer Variablen verwendest.\u00a0<form class=\"pbform\" action=\"#\" id=\"pbform7\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox7'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Eine undefininierte Variable<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 58px;'><textarea wrap='off' name='usercode7' id='usercode7'  cols=10 rows=2 readonly='readonly'  style = 'height : 58px;'  class='pyboxCode RO'>\ncallMe = \"Maybe\"\nprint(callme)<\/textarea><\/div>\n<div id='pbhistory7' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit7' value=' '\/><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse7\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"7\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"4f31cdc433eda08b09f9520f4297481d\"\/>\n<div id='pbresults7' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit7\").value = \"Run program\";document.getElementById(\"inputInUse7\").value = \"N\";<\/script>\n<\/li>\n<li>Durch null teilen, was in der Mathematik keinen Sinn macht. (Warum? Da 0 mal egal welche Zahl immer 0 ergibt, gibt es keine L\u00f6sung f\u00fcr 1 = <em>X<\/em>\u00a0* 0, also ist 1\/0 undefiniert.) <form class=\"pbform\" action=\"#\" id=\"pbform8\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox8'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Durch Null teilen<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 32px;'><textarea wrap='off' name='usercode8' id='usercode8'  cols=10 rows=1 readonly='readonly'  style = 'height : 32px;'  class='pyboxCode RO'>\nprint(1\/0)<\/textarea><\/div>\n<div id='pbhistory8' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit8' value=' '\/><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse8\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"8\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"09f9746176a2d4230f0c6fff91c10e14\"\/>\n<div id='pbresults8' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit8\").value = \"Run program\";document.getElementById(\"inputInUse8\").value = \"N\";<\/script>\n<\/li>\n<li>Das Verwenden von Operatoren f\u00fcr die falsche Art von Daten <form class=\"pbform\" action=\"#\" id=\"pbform9\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox9'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Text und eine Zahl addieren<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 32px;'><textarea wrap='off' name='usercode9' id='usercode9'  cols=10 rows=1 readonly='readonly'  style = 'height : 32px;'  class='pyboxCode RO'>\nprint(\"you cannot add text and numbers\" + 12)<\/textarea><\/div>\n<div id='pbhistory9' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit9' value=' '\/><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse9\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"9\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"751a7ab390bfdd3c27346bc7449b2b2f\"\/>\n<div id='pbresults9' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit9\").value = \"Run program\";document.getElementById(\"inputInUse9\").value = \"N\";<\/script>\n<\/li>\n<\/ul>\n<p>Du wirst noch mehr Wege entdecken, wie du Fehler produzieren kannst, wenn du mehr \u00fcber Python lernst.<\/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> Was ist der technische Unterschied zwischen einem Syntaxfehler und einem Laufzeitfehler? Dieses Beispiel sollte es verdeutlichen. Schaue dir die Ausgabe beider Programme an.<form class=\"pbform\" action=\"#\" id=\"pbform10\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox10'>\n<div class=\"heading\"><span class='type'>Example: <\/span><span class='title'>Laufzeitfehler<\/span><\/div> <div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 58px;'><textarea wrap='off' name='usercode10' id='usercode10'  cols=10 rows=2 readonly='readonly'  style = 'height : 58px;'  class='pyboxCode RO'>\nprint(\"Here is some text\")\nprint(1\/0)<\/textarea><\/div>\n<div id='pbhistory10' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit10' value=' '\/><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse10\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"10\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"0da4b4dee75a211800054f9052197bc7\"\/>\n<div id='pbresults10' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit10\").value = \"Run program\";document.getElementById(\"inputInUse10\").value = \"N\";<\/script>\n <form class=\"pbform\" action=\"#\" id=\"pbform11\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox11'>\n<div class=\"heading\"><span class='type'>Example: <\/span><span class='title'>Syntaxfehler<\/span><\/div> <div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 58px;'><textarea wrap='off' name='usercode11' id='usercode11'  cols=10 rows=2 readonly='readonly'  style = 'height : 58px;'  class='pyboxCode RO'>\nprint(\"Here is some text\")\nprint(1*0<\/textarea><\/div>\n<div id='pbhistory11' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit11' value=' '\/><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse11\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"11\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"c8743722d6e4453a33d3a0814b10435c\"\/>\n<div id='pbresults11' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit11\").value = \"Run program\";document.getElementById(\"inputInUse11\").value = \"N\";<\/script>\nDas Programm mit dem Laufzeitfehler erzeugt eine Ausgabe, das Programm mit dem Syntaxfehler nicht. Das liegt daran, dass Python in 2 Schritten arbeitet: <\/p>\n<ol> \t<\/p>\n<li>Python pr\u00fcft die Syntax und analysiert die Struktur des Programms.<\/li>\n<p> \t<\/p>\n<li>Wenn in Schritt 1 kein Problem gefunden wurde, wird das Programm ausgef\u00fchrt.<\/li>\n<p> <\/ol>\n<p> <\/p>\n<div>Das Programm mit dem Syntaxfehler wird also gar nicht erst ausgef\u00fchrt, das Programm mit dem Laufzeitfehler hingegen schon. Es werden alle Befehle bis zum eigentlichen Fehler problemlos ausgef\u00fchrt.<\/div>\n<p>  <\/span><\/td><\/table><\/p>\n<h2>Logische Fehler<\/h2>\n<p>Dein Programm funktioniert eventuell ohne abzust\u00fcrzen (kein Syntax- oder Laufzeitfehler), macht aber dennoch etwas falsch. Ein Beispiel: Du m\u00f6chtest ein Programm schreiben, dass den <em>Durchschnitt<\/em> (arithmetisches Mittel) zweier Zahlen berechnet. Der Durchschnitt der Zahlen <em>x<\/em>\u00a0und <em>y<\/em>\u00a0ist definiert als<\/p>\n<p style=\"text-align: center\"><img src='https:\/\/s0.wp.com\/latex.php?latex=%5Cdisplaystyle%7B%5Cfrac%7Bx%2By%7D%7B2%7D%7D&#038;bg=T&#038;fg=000000&#038;s=2' alt='\\displaystyle{\\frac{x+y}{2}}' title='\\displaystyle{\\frac{x+y}{2}}' class='latex' \/><\/p>\n<p>Warum funktioniert das folgende Programm nicht?<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform12\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox12'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Dies berechnet <em>nicht<\/em> dem korrekten Durchschnitt.<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 110px;'><textarea wrap='off' name='usercode12' id='usercode12'  cols=10 rows=4 readonly='readonly'  style = 'height : 110px;'  class='pyboxCode RO'>\nx = 3\ny = 4\naverage = x + y \/ 2\nprint(average)<\/textarea><\/div>\n<div id='pbhistory12' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit12' value=' '\/><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse12\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"12\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"2495b74069089ef3bf1c45449394ab3d\"\/>\n<div id='pbresults12' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit12\").value = \"Run program\";document.getElementById(\"inputInUse12\").value = \"N\";<\/script>\n<\/p>\n<p>Der Durchschnitt sollte<\/p>\n<p style=\"text-align: center\"><img src='https:\/\/s0.wp.com\/latex.php?latex=%5Cdisplaystyle%7B%5Cfrac%7Bx%2By%7D%7B2%7D%3D%5Cfrac%7B3%2B4%7D%7B2%7D%3D%5Cfrac%7B7%7D%7B2%7D%3D3.5%7D&#038;bg=T&#038;fg=000000&#038;s=2' alt='\\displaystyle{\\frac{x+y}{2}=\\frac{3+4}{2}=\\frac{7}{2}=3.5}' title='\\displaystyle{\\frac{x+y}{2}=\\frac{3+4}{2}=\\frac{7}{2}=3.5}' class='latex' \/><\/p>\n<p>sein, aber das Programm gibt <code>5.0<\/code> aus! Der Fehler folgt aus Reihenfolge, in der die Operatoren in der Arithmetik abgearbeitet werden. Wenn du <code>x + y \/ 2<\/code> schreibst, bedeutet das dasselbe wie <img src='https:\/\/s0.wp.com\/latex.php?latex=x+%2B+%28y+%2F+2%29+%3D+3+%2B+%284+%2F+2%29+%3D+3+%2B+2+%3D+5&#038;bg=T&#038;fg=000000&#038;s=2' alt='x + (y \/ 2) = 3 + (4 \/ 2) = 3 + 2 = 5' title='x + (y \/ 2) = 3 + (4 \/ 2) = 3 + 2 = 5' class='latex' \/>. Um das Problem zu beheben, sollte die dritte Zeile\u00a0<code>average = (x + y) \/ 2<\/code> lauten, um Python klar zu machen, dass wir\u00a0<img src='https:\/\/s0.wp.com\/latex.php?latex=%5Cfrac%7Bx%2By%7D%7B2%7D&#038;bg=T&#038;fg=000000&#038;s=3' alt='\\frac{x+y}{2}' title='\\frac{x+y}{2}' class='latex' \/> berechnen wollen, wo erst addiert und danach dividiert wird.<\/p>\n<p>Logische Fehler treten auf, wenn du das Programm falsch <em>entworfen<\/em>\u00a0hast oder dein Code nicht deinem Entwurf entspricht (wie in dem\u00a0Beispiel mit <code>average<\/code>).\u00a0Logische Fehler k\u00f6nnen schwierig zu finden sein - gerade bei l\u00e4ngeren Programmen - aber mit der Zeit, wenn du besser programmieren kannst, werden auch logische Fehler seltener auftreten. Einige Tipps, wie man logische Fehler vermeidet, findest du in Lektion 6D.<\/p>\n<h2>\u00dcbungen<\/h2>\n<p>Am Ende dieser Lektion findest du drei \u00dcbungen zum <em>debuggen<\/em> (Fehlerbeseitigung). Du kannst versuchen, den Fehler vor der Ausf\u00fchrung zu beseitigen oder dir erst Pythons Fehlermeldung anschauen, um festzustellen, was fehlerhaft ist.<\/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> Jedes Programm enth\u00e4lt bereits Code. Du musst jeweils nur wenige Zeichen (Buchstaben\/Symbole\/Zahlen) \u00e4ndern, um das Problem zu beheben. <em>L\u00f6sungen, in denen zu viele Zeichen ver\u00e4ndert wurden, werden verworfen!<\/em> Klicke auf\u00a0<strong>Code zur\u00fccksetzen<\/strong>,\u00a0um die Ursprungsversion zur\u00fcckzuerlangen. <\/span><\/td><\/table><\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform13\" method=\"POST\">\n<div class='pybox modeNeutral ' id='pybox13'>\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'>Aussummieren<\/span><\/div>Korrigiere den Syntaxfehler in diesem Programm, sodass es die Summe der Zahlen von 1 bis 10 ausgibt. Du darfst maximal ein Zeichen \u00e4ndern.<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='usercode13' id='usercode13'  cols=10 rows=20   class='pyboxCode RW'>\nprint(1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 +)\n<\/textarea><\/div>\n<div id='pbhistory13' class='flexcontain' style='display:none;'><\/div>\n<input type='hidden' id='defaultCode13' value='print(1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 +)\\n'><\/input>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit13' value=' '\/><\/td>\n<td><input type='button' name='history' value=\"History\" onclick=\"historyClick(13,'1e.product')\" ><\/td>\n<td><input type='button' name='default' value=\"Reset code to default\" onclick=\"pbSetText(13,descape($('#defaultCode13').val()))\" ><\/td>\n<td><input type='button' name='help' value=\"Help\" onclick=\"helpClick(13);\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse13\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"13\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"ed79c3440de67f8f23c1e5ec92add77b\"\/>\n<div id='pbresults13' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit13\").value = \"Run program\";document.getElementById(\"inputInUse13\").value = \"N\";<\/script>\n<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform14\" method=\"POST\">\n<div class='pybox modeNeutral ' id='pybox14'>\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'>Hello Joe<\/span><\/div>Korrigiere den Laufzeitfehler in folgendem Programm, sodass es in der ersten Zeile <code>Hello<\/code>\u00a0und in der zweiten Zeile <code>Joe<\/code> ausgibt. Du darfst maximal zwei Zeichen \u00e4ndern.<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='usercode14' id='usercode14'  cols=10 rows=20   class='pyboxCode RW'>\nprint(\"Hello\")\nusername = Joe \nprint(username)\n<\/textarea><\/div>\n<div id='pbhistory14' class='flexcontain' style='display:none;'><\/div>\n<input type='hidden' id='defaultCode14' value='print(\\\"Hello\\\")\\nusername = Joe \\nprint(username)\\n'><\/input>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit14' value=' '\/><\/td>\n<td><input type='button' name='history' value=\"History\" onclick=\"historyClick(14,'1e.joe')\" ><\/td>\n<td><input type='button' name='default' value=\"Reset code to default\" onclick=\"pbSetText(14,descape($('#defaultCode14').val()))\" ><\/td>\n<td><input type='button' name='help' value=\"Help\" onclick=\"helpClick(14);\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse14\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"14\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"d240d37cf33a4191d27980eec17ea5e6\"\/>\n<div id='pbresults14' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit14\").value = \"Run program\";document.getElementById(\"inputInUse14\").value = \"N\";<\/script>\n<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform15\" method=\"POST\">\n<div class='pybox modeNeutral ' id='pybox15'>\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'>Shoppen gehen<\/span><\/div>Du gehst Milch und Fleisch einkaufen (englisch: \"milk\" bzw. \"meat\"), aber diese Produkte sind mit einer Steuer (englisch: tax) belegt. Du kaufst Milch im Wert von $2,00 und Fleisch im Wert von $4,00, wobei die Steuerrate 3% betr\u00e4gt. Gib die Gesamtkosten deiner Lebensmittel aus (du musst das Dollarzeichen nicht mit ausgeben). <a class=\"hintlink\"  id=\"hintlink16\">Tipp<\/a><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='usercode15' id='usercode15'  cols=10 rows=20   class='pyboxCode RW'>\nmeatPrice = 4.00\nmeatTax = 0.03 * meatPrice\nmilkPrice = 2.00\nmilkTax = 0.03 * milkPrice\nprint(meatTax + meatPrice + milkTax + meatPrice)\n<\/textarea><\/div>\n<div id='pbhistory15' class='flexcontain' style='display:none;'><\/div>\n<input type='hidden' id='defaultCode15' value='meatPrice = 4.00\\nmeatTax = 0.03 * meatPrice\\nmilkPrice = 2.00\\nmilkTax = 0.03 * milkPrice\\nprint(meatTax + meatPrice + milkTax + meatPrice)\\n'><\/input>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit15' value=' '\/><\/td>\n<td><input type='button' name='history' value=\"History\" onclick=\"historyClick(15,'1e.shopping')\" ><\/td>\n<td><input type='button' name='default' value=\"Reset code to default\" onclick=\"pbSetText(15,descape($('#defaultCode15').val()))\" ><\/td>\n<td><input type='button' name='help' value=\"Help\" onclick=\"helpClick(15);\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse15\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"15\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"ddf5929ca20211c26665467205e5a89b\"\/>\n<div id='pbresults15' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit15\").value = \"Run program\";document.getElementById(\"inputInUse15\").value = \"N\";<\/script>\n<\/p>\n<p>Wenn du alle Bugs zerquetscht hast, klicke unten den \"Weiter mit\" Button.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wer mehr und mehr programmiert, bei dem werden irgendwann Fehler (oder Bugs) auftreten. Das Ausl\u00f6sen, Verstehen und Korrigieren von Fehlern ist ein wichtiger Teil des Programmierens. Python wird - soweit m\u00f6glich - alles ausf\u00fchren, was gefragt ist, aber wenn es &hellip; <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/1e-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-5549","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/5549","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=5549"}],"version-history":[{"count":36,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/5549\/revisions"}],"predecessor-version":[{"id":5655,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/5549\/revisions\/5655"}],"wp:attachment":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/media?parent=5549"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}