{"id":4650,"date":"2012-06-21T16:57:49","date_gmt":"2012-06-21T20:57:49","guid":{"rendered":"http:\/\/cscircles.cemc.uwaterloo.ca\/?page_id=4650"},"modified":"2015-04-09T13:29:59","modified_gmt":"2015-04-09T17:29:59","slug":"6d-fr","status":"publish","type":"page","link":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/6d-fr\/","title":{"rendered":"6D: Conception, d\u00e9bogage et beignets"},"content":{"rendered":"<!-- Please retain this notice and add more notes if you create a new version.<br \/>\nMain French translator: Brice Canvel, brice.canvel@gmail.com<br \/>\nOther translator: Andr\u00e9 Roberge, andre.roberge@gmail.com<br \/>\nOriginal lesson author: David Pritchard, daveagp@gmail.com<br \/>\nLicense: http:\/\/creativecommons.org\/licenses\/by-nc-sa\/3.0\/<br \/>\nFor the full site, visit http:\/\/cscircles.ca-->\n<p>Cette le\u00e7on a quelques suggestions sur des fa\u00e7ons de faciliter la conception et le d\u00e9bogage de vos programmes. Le plus d\u2019exp\u00e9rience\u00a0vous aurez avec la programmation, le meilleur vous deviendrez \u00e0 \u00e9viter et corriger des erreurs, mais ici, nous allons essayer de vous donner quelques conseils g\u00e9n\u00e9raux et utiles. Nous allons vous expliquer les techniques suivantes:<\/p>\n<ul>\n<li>la conception un morceau \u00e0 la fois<\/li>\n<li>r\u00e9solution de certains exemples \u00e0 la main<\/li>\n<li>la planification de code avant sa cr\u00e9ation<\/li>\n<li>l\u2019\u00e9criture du code<\/li>\n<li>tester les exemples que vous avez r\u00e9solu \u00e0 la main<\/li>\n<li>tester des exemples suppl\u00e9mentaires, y compris des cas \"limites\" et al\u00e9atoires<\/li>\n<\/ul>\n<p>Cette formule magique ne r\u00e9soudra pas tout automatiquement, mais pourra vous faire \u00e9conomiser de maux de t\u00eate et r\u00e9duira le nombre de probl\u00e8mes dont vous devrez vous pr\u00e9occupez plus tard.<\/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> Lorsque vous rencontrez un probl\u00e8me, des strat\u00e9gies pour vous aider \u00e0 d\u00e9boguer sont d'utiliser l'aide de <em>diagnostic par<\/em>\u00a0<em>impression d'<\/em><em>instructions d'impression<\/em>\u00a0(nous ferons cela plus tard dans la le\u00e7on), en <em>utilisant le visualiseur<\/em>, la <em>lecture de votre code avec soin<\/em>, et <em>la cr\u00e9ation de bons tests<\/em>. Si vous <a href=\"http:\/\/cscircles.cemc.uwaterloo.ca\/python-chez-vous\/\">ex\u00e9cutez Python \u00e0 la maison<\/a>, vous pouvez utiliser des outils de point d'arr\u00eat et pas \u00e0 pas pour obtenir un meilleur aper\u00e7u de ce qui se passe mal. <\/span><\/td><\/table><\/p>\n<p>Un <strong><a href=\"http:\/\/fr.wikipedia.org\/wiki\/Algorithmique\">algorithme<\/a><\/strong> d\u00e9signe une s\u00e9rie d'instructions. Bien qu'un programme informatique a besoin d'\u00eatre \u00e9crit dans une langue sp\u00e9cifique comme Python ou JavaScript pour fonctionner, le mot <strong>algorithme<\/strong> signifie, la liste, \u00e9tape par \u00e9tape, des instructions qui peuvent \u00eatre \u00e9crites en langue naturelle ou exprim\u00e9es dans un diagramme. Par exemple, une recette de beignets est un algorithme, o\u00f9 \"mesure 3 tasses de farine\" est une \u00e9tape, et \u00ablaisser lever la p\u00e2te pendant 2 heures\" est une autre \u00e9tape. Nous allons d\u00e9velopper un algorithme simple dans cette le\u00e7on. Ensuite, nous allons mettre en \u0153uvre l'algorithme, ce qui signifie de le convertir en un programme informatique de travail.<\/p>\n<h2>Le probl\u00e8me: Calculatrice de beignets<\/h2>\n<p>Tim Horton, une cha\u00eene de magasins de caf\u00e9 au Canada, vend des beignes \u00ab<strong>timbits<\/strong>\u00bb, qui sont de savoureux beignets sph\u00e9riques:<\/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\" src=\"http:\/\/farm6.staticflickr.com\/5203\/5358233785_13e36e1d76.jpg\" alt=\"\" width=\"500\" height=\"375\" \/><\/a><p class=\"wp-caption-text\">Photo: looking_and_learning, flickr<\/p><\/div>\n<p>Vous devez organiser plusieurs f\u00eates dans les prochaines semaines, et vous allez commander un nombre de beignets diff\u00e9rent pour chaque f\u00eate. Donc, vous voulez faire un programme pour calculer le prix d'un nombre arbitraire de beignets, afin de planifier votre budget. \u00c0 votre succursale locale, les prix sont les suivants:<\/p>\n<table style=\"width: 350px; margin: auto;\">\n<tbody>\n<tr>\n<th>Number<\/th>\n<th>Price<\/th>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>0.20 $<\/td>\n<\/tr>\n<tr>\n<td>10 (bo\u00eete de petite taille)<\/td>\n<td>1.99 $<\/td>\n<\/tr>\n<tr>\n<td>20 (bo\u00eete de taille moyenne)<\/td>\n<td>3.39 $<\/td>\n<\/tr>\n<tr>\n<td>40 (bo\u00eete de grande taille)<\/td>\n<td>6.19 $<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Construire une partie \u00e0 la fois<\/h2>\n<p>Au final, vous souhaitez \u00e9crire un programme o\u00f9 l'entr\u00e9e est <strong>P<\/strong>,<strong> le nombre<\/strong> <strong>de personnes \u00e0 la f\u00eate,<\/strong> et la sortie est <strong>le co\u00fbt pour nourrir ce nombre de personnes<\/strong>,<strong> taxes comprises<\/strong>. Au plus haut niveau, il ya trois composantes de ce programme:<\/p>\n<ol>\n<li>calculez, pour\u00a0<strong>P<\/strong>\u00a0personnes, quel est le nombre <strong>T<\/strong>\u00a0de beignets que vous devrez acheter?<\/li>\n<li>calculez le prix pour d\u2019achat pour exactement <strong>T<\/strong>\u00a0beignets \u00abtimbits\u00bb<\/li>\n<li>calculez les taxes et le co\u00fbt total.<\/li>\n<\/ol>\n<p>Cependant, vous pouvez travailler sur ces trois parties une \u00e0 la fois. En fait, nous vous recommandons de cr\u00e9er une partie \u00e0 la fois, avec les essais et la compl\u00e9tion de chaque partie, avant de passer \u00e0 la partie suivante, <em>car plus votre programme est long, plus il est difficile de trouver et de corriger chaque bogue<\/em>. Il est plus facile de d\u00e9velopper et de tester les trois parties s\u00e9par\u00e9ment, avant de les combiner en un seul programme. Pour le reste de cette le\u00e7on, nous allons nous concentrer sur l'\u00e9tape 2: <strong>calculer le prix d'achat pour exactement T beignets \u00abtimbits\u00bb<\/strong>.<\/p>\n<h2>R\u00e9soudre quelques exemples \u00e0 la main<\/h2>\n<p>Afin d'\u00eatre en mesure de dire \u00e0 l'ordinateur de faire quelque chose, vous devez \u00eatre en mesure de le faire vous-m\u00eame. Nous devons travailler \u00e0 travers un exemple nous-m\u00eames: quel est le prix pour acheter exactement <strong>45<\/strong> beignets \u00abtimbits\u00bb? En regardant la liste des formats, on peut acheter une grande bo\u00eete (40), qui co\u00fbtera 6,19 $. Cela laisse <strong>45 \u2013 40 = 5<\/strong> timbits plus que nous besoin d'acheter individuellement, ce qui a un co\u00fbt suppl\u00e9mentaire de 5 * 0,20 $ = 1,00 $. Le co\u00fbt total sera 6,19 $ + 1,00 $ = 7,19 $.<\/p>\n<h2>Planifier votre code avant de commencer \u00e0 l'\u00e9crire<\/h2>\n<p>Que faire si nous voulions acheter 4 ou 456 timbits au lieu de 45? En g\u00e9n\u00e9ral, nous devrions acheter autant de grandes bo\u00eetes que possible, puis prendre une bo\u00eete moyenne et \/ ou une petite bo\u00eete, si n\u00e9cessaire, et, finalement, les \u00abtimbits\u00bb individuels pour obtenir le total voulu.<\/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> Est-ce vraiment algorithme optimal? Oui! Vous pouvez voir que l'achat deux bo\u00eetes de taille moyenne (2 * 3,39 $ = 6,78 $) est une mauvaise id\u00e9e car nous pouvons obtenir 2 * 20 = 40 dans une bo\u00eete de beignes, \u00e0 un prix plus avantageux. Des comparaisons similaires de l' achat individuel \/ petit et petit \/ moyen peuvent \u00eatre utilis\u00e9es pour trouver l'algorithme donnant le prix le moins cher d'acheter un nombre exact de beignets. Si les prix ou la taille \u00e9taient diff\u00e9rents, nous devrions \u00eatre plus prudents. <\/span><\/td><\/table><\/p>\n<p>Nous avons dit que vous devez planifier votre code avant de commencer \u00e0 l'\u00e9crire. Vous pouvez:<\/p>\n<ul>\n<li>donner une courte description, \u00e9tape par \u00e9tape, de l\u2019algorithme en fran\u00e7ais au lieu d\u2019en Python.<\/li>\n<li>utiliser un diagramme ou organigramme pour montrer les \u00e9tapes<\/li>\n<li>se concentrer sur les id\u00e9es principales au lieu des d\u00e9tails, pour l\u2019instant.<\/li>\n<\/ul>\n<p>Dans notre exemple, nous allons donner une description en fran\u00e7ais. Nous n\u2019allons pas de vous montrer un organigramme pour ce programme particulier, car il repr\u00e9senterait tout simplement un encha\u00eenement de l'\u00e9tape 1 \u00e0 l'\u00e9tape 2 et ainsi de suite de mani\u00e8re lin\u00e9aire. Les programmes avec boucle(s), comme nous le verrons plus tard, profite davantage de diagrammes.<\/p>\n<div style=\"margin: 0px 100px 0px 100px; border: 1px solid blue;\">\n<p style=\"text-align: center;\"><strong>Algorithme pour calculer le prix de n'importe quel nombre de beignets<\/strong><\/p>\n<ol>\n<li>obtenir le nombre d\u2019entr\u00e9e de beignets<\/li>\n<li>garder l'information du co\u00fbt total, en commen\u00e7ant \u00e0 z\u00e9ro<\/li>\n<li>acheter autant de grandes bo\u00eetes que possible\n<ol>\n<li>calculer le nombre de beignets encore n\u00e9cessaires<\/li>\n<li>mettre \u00e0 jour le prix total<\/li>\n<li>acheter une bo\u00eete moyenne si vous le pouvez et r\u00e9p\u00e9tez les \u00e9tapes A et B.<\/li>\n<li>acheter une petite bo\u00eete si vous le pouvez et r\u00e9p\u00e9tez les \u00e9tapes A et B.<\/li>\n<li>acheter des beignets individuels et r\u00e9p\u00e9tez l\u2019\u00e9tape B.<\/li>\n<li>fournir, en sortie le co\u00fbt total<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/div>\n<p>Nous appelons ceci une description <strong>pseudocode<\/strong> de l'algorithme, car il s'agit d'une s\u00e9rie de l'\u00e9tape-par-\u00e9tape des instructions, mais pas dans un langage de programmation r\u00e9el.<\/p>\n<h2>Ecrire le code<\/h2>\n<p>R\u00e9it\u00e9rant le premier conseil, construire une partie \u00e0 la fois, vous pouvez \u00e9galement penser \u00e0 \u00e9crire un morceau de code distinct pour chaque \u00e9tape de 1 \u00e0 7. En outre, ici, voici une chose \u00e0 laquelle\u00a0nous devons penser pour toutes les \u00e9tapes: quelles variables allons-nous utiliser? Quels vont \u00eatre leurs noms, types et valeurs initiales?<\/p>\n<p>Nous allons utiliser timbitsRestant pour repr\u00e9senter le nombre de beignets que nous avons encore \u00e0 acheter, et nous allons utiliser prixTotal pour repr\u00e9senter le co\u00fbt total \u00e0 jour. Nous n'avons pas besoin de dire les types \u00e0 l'avance, mais nous pouvons planifier pour nous-m\u00eames que timbitsRestant sera un int, alors que prixTotal sera une variable de type float qui contient le co\u00fbt total en dollars. (Donc, un cent est 0,01). Nous aurons besoin de certaines variables temporaires suppl\u00e9mentaires \u00e0 chaque \u00e9tape, que nous allons traiter seulement lorsque cela est n\u00e9cessaire.<\/p>\n<p>Les \u00e9tapes 1 et 2 peuvent \u00eatre \u00e9crites avec en une seule ligne de code:<\/p>\n<pre>timbitsRestant = int(input()) \u00a0 \u00a0 \u00a0 \u00a0# \u00e9tape 1: obtenir l'entr\u00e9e\r\nprixTotal = 0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0 \u00a0 \u00a0 \u00a0 # \u00e9tape 2: initialiser le co\u00fbt total<\/pre>Pour l'\u00e9tape 3, nous avons besoin pour calculer le nombre maximal de grandes bo\u00eetes que l'on peut acheter. Comment exactement pouvons-nous faire cela? Puisqu\u2019une grande bo\u00eete contient 40 timbits, le nombre grandeBoites devrait \u00eatre le quotient entier de timbitsRestant divis\u00e9 par 40. En tenant compte de la division, le co\u00fbt, et en soustrayant, nous avons le fragment de code suivant:<\/p>\n<pre># \u00e9tape 3: acheter autant de grandes bo\u00eetes comme vous pouvez \r\ngrandeBoites = timbitsRestant \/ 40 \r\n# mettre \u00e0 jour le prix total\u00a0: \r\nprixTotal = prixTotal + grandeBoites * 6,19 \u00a0 \u00a0 \u00a0 \u00a0 \r\n# calculer le nombre de timbits encore n\u00e9cessaires : \r\ntimbitsRestant = timbitsRestant - 40 * grandeBoites<\/pre>En fait, il s'av\u00e8re que nous avons d\u00e9j\u00e0 fait une erreur. La meilleure fa\u00e7on de rep\u00e9rer des erreurs est de tester votre code t\u00f4t et souvent! Soyons optimiste et disons que nous avons test\u00e9 le code partiellement \u00e0 ce stade. Nous allons juste ajouter quelques d\u00e9clarations d'impression pour observer son comportement actuel. (<em>Au lieu d'utiliser des instructions d'impression, vous pouvez \u00e9galement utiliser le visualiseur pour v\u00e9rifier chaque \u00e9tape.)<\/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> Tester le code jusqu'\u00e0 pr\u00e9sent sur l'entr\u00e9e <strong>45<\/strong>, \u00e0 l'aide des instructions d'impression (print) pour aider le d\u00e9bogage.<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 448px;'><textarea wrap='off' name='usercode0' id='usercode0'  cols=10 rows=17 readonly='readonly'  style = 'height : 448px;'  class='pyboxCode RO'>\n# \u00e9tape 1: obtenir l'entr\u00e9e\ntimbitsRestant = int(input()) \nprint(\"l'entr\u00e9e est\", timbitsRestant)\n\n# \u00e9tape 2: initialiser le co\u00fbt total\nprixTotal = 0\n\n# \u00e9tape 3: acheter autant de grandes bo\u00eetes comme vous pouvez\ngrandeBoites = timbitsRestant \/ 40\n# mettre \u00e0 jour le prix total :\nprixTotal = prixTotal + grandeBoites * 6.19\n# calculer le nombre de timbits encore n\u00e9cessaires :\ntimbitsRestant = timbitsRestant - 40 * grandeBoites\n\nprint('grandeBoites est \u00e9gale \u00e0', grandeBoites)\nprint('prixTotale est \u00e9gale \u00e0', prixTotal)\nprint('maintenant timbitsRestant est \u00e9gale \u00e0', timbitsRestant)<\/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=\"c88d34574e566565b3b136a8085a05c6\"\/>\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>Cela ne fonctionne pas comme nous voulons! Quel est le probl\u00e8me? <strong>O\u00f9 est la premi\u00e8re ligne o\u00f9 ce que nous attendons est diff\u00e9rent de ce qui s'est pass\u00e9?<\/strong> Essayez de le localiser avant d'ouvrir le prochain paragraphe. Rappelez-vous, nous avons r\u00e9solu cet exemple \u00e0 la main plus t\u00f4t.<\/p>\n<div class='collapseContain hiding'>\n<div class='collapseHead'><span class='icon'><\/span>\nCliquez ici pour lire l'explication\n<\/div>\n<div class='collapseBody'>Le coupable est la ligne <code>grandeBoites = timbitsRestant \/ 40<\/code>, puisque grandeBoites sort que 1.125, alors que nous voulions que ce soit \u00e9gal \u00e0 1. Vous ne pouvez pas acheter une fraction d'une bo\u00eete. Une solution de contournement possible, que vous verrez dans la le\u00e7on 7A, est d'utiliser <code>\/\/<\/code> pour la division enti\u00e8re au lieu de <code>\/<\/code> qui ne la division d\u00e9cimale. Une autre solution, bas\u00e9e sur ce que nous avons vu dans la le\u00e7on 4, est de convertir <code>timbitsRestant \/ 40<\/code> en un int qui permet de supprimer la partie fractionnaire. Nous allons utiliser cette approche \u00e0 la place: la ligne devient <code>grandeBoites\u00a0= int(timbitsRestant \/ 40)<\/code>.<\/div><\/div>\n<p>Les \u00e9tapes 4 et 5 sont similaires \u00e0 l'\u00e9tape 3. Puisque vous allez acheter au plus un bo\u00eete moyenne et au plus une petite bo\u00eete, on peut utiliser une instruction if:<\/p>\n<pre>if timbitsRestant &gt;= 20: # \u00e9tape 4, peut-on acheter une bo\u00eete moyenne?\r\n\u00a0 prixTotal = prixTotal + 3.39 \r\n\u00a0 timbitsRestant = timbitsRestant - 20 \r\nif timbitsRestant &gt;= 10:\u00a0# \u00e9tape 5, peut-on acheter une petite bo\u00eete? \u00a0\r\n\u00a0 prixTotal = prixTotal + 1.99 \u00a0\r\n\u00a0 timbitsRestant = timbitsRestant - 20<\/pre>Pour finir, nous avons besoin de payer 20 cents pour chacun des derniers timbits n\u00e9cessaires et de sortir la r\u00e9ponse.<\/p>\n<pre>prixTotal = prixTotal + timbitsRestant * 20 # \u00e9tape 6 \r\nprint(prixTotal)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 \u00a0# \u00e9tape 7<\/pre>\n<h2>Testez les exemples que vous avez r\u00e9solus \u00e0 la main<\/h2>\n<p>Voici l'ensemble du programme. La premi\u00e8re chose que nous allons faire est de tester pour voir si cela fonctionne sur l'entr\u00e9e <strong>45<\/strong> que nous avons r\u00e9solue \u00e0 la main.<\/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>Quel est le prix de 45 timbits?<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 656px;'><textarea wrap='off' name='usercode1' id='usercode1'  cols=10 rows=25 readonly='readonly'  style = 'height : 656px;'  class='pyboxCode RO'>\n# \u00e9tape 1: obtenir l'entr\u00e9e\ntimbitsRestant = int(input()) \n\n# \u00e9tape 2: initialiser le co\u00fbt total\nprixTotal = 0\n\n# \u00e9tape 3: acheter autant de grandes bo\u00eetes comme vous pouvez\ngrandeBoites = timbitsRestant \/\/ 40\n# mettre \u00e0 jour le prix total :\nprixTotal = prixTotal + grandeBoites * 6.19\n# calculer le nombre de timbits encore n\u00e9cessaires :\ntimbitsRestant = timbitsRestant - 40 * grandeBoites\n\n# \u00e9tape 4, peut-on acheter une bo\u00eete moyenne?\nif timbitsRestant >= 20:\n    prixTotal = prixTotal + 3.39\n    timbitsRestant = timbitsRestant - 20\n\n# \u00e9tape 5, peut-on acheter une petite bo\u00eete?\nif timbitsRestant >= 10: \n    prixTotal = prixTotal + 1.99\n    timbitsRestant = timbitsRestant - 20\n                \nprixTotal = prixTotal + timbitsRestant * 20 # \u00e9tape 6\nprint(prixTotal)                            # \u00e9tape 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=\"2c53cdcbd5c263f02c30710d630b4423\"\/>\n<div id='pbresults1' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>pbInputSwitch(1,\"N\");<\/script>\n<\/p>\n<p>Il doit y avoir une erreur (un bogue), puisque nous payons plus de 100 dollars pour seulement 45 timbits! Votre travail final est de trouver et d'\u00e9liminer ce bogue, et un autre bogue cach\u00e9 dans le code. Il sera test\u00e9 dans la section suivante.<\/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>  Juste pour que vous le sachiez, il y a une dr\u00f4le de chose qui se produit avec des prix de Tim Horton, qui n'est pas un bogue: il peut \u00eatre moins cher d'acheter exactement <strong>T+1<\/strong> timbits que d'acheter exactement<strong> T\u00a0<\/strong>timbits. Par exemple, l'achat d'exactement 19 timbits co\u00fbte 3,79 $, mais l'achat d'exactement 20 timbits ne co\u00fbte que $ 3,39. Peu importe, nous nous en tiendrons au probl\u00e8me de l'achat timbits exactement <strong>T<\/strong> aussi bon march\u00e9 que possible, pour laquelle l'algorithme expliqu\u00e9 pr\u00e9c\u00e9demment est correct. Donc, votre programme devrait vraiment sortir 3,79 lorsque l'entr\u00e9e est de 19. <\/span><\/td><\/table><\/p>\n<p><strong>Testez d'autres exemples<\/strong><\/p>\n<p>Sur Computer Science Circles, nous essayons de faire tests automatis\u00e9s intelligents de votre code afin de veiller \u00e0 ce que vous ayez r\u00e9solu le probl\u00e8me correctement. Mais dans un cadre de programmation r\u00e9elle, c'est \u00e0 vous de tester votre propre code en profondeur. Voici quelques lignes directrices utiles pour les tests.<\/p>\n<ul>\n<li>Vous pouvez v\u00e9rifier que <em>chaque ligne de code\u00a0<\/em>de votre programme fonctionne correctement. Dans le probl\u00e8me Timbits, utiliser l'entr\u00e9e 10\u00a0va v\u00e9rifier si nous sommes correctement la manipulation de petites bo\u00eetes. De m\u00eame, les entr\u00e9es 20\u00a0et 40\u00a0vont v\u00e9rifier que les bo\u00eetes moyennes et grandes sont manipul\u00e9es correctement. Enfin, vous devez v\u00e9rifier que nous nous occupons de timbits individuels correctement (par exemple, avec l'entr\u00e9e 1).\n<ul>\n<li>Ceci peut aider \u00e0 v\u00e9rifier que des valeurs telles que 3,39 $ et 1,99 $ ont \u00e9t\u00e9 correctement tap\u00e9es.<\/li>\n<\/ul>\n<\/li>\n<li>N'oubliez pas de v\u00e9rifier les cas extr\u00eames qui poussent votre programme vers ses limites. Par exemple, l'entr\u00e9e minimum possible de ce programme est de 0, puisque vous ne pouvez pas avoir une valeur de timbits n\u00e9gative. Notre programme n'a pas d'entr\u00e9e maximum, mais vous pourriez vouloir essayer des valeurs telles que 39 et 41 qui sont pr\u00e8s de la limite qui vaut la peine d'acheter une grande bo\u00eete.\n<ul>\n<li>Cela peut aider \u00e0 v\u00e9rifier que vous n'avez pas accidentellement tap\u00e9 <code>&gt;<\/code> lorsque vous auriez d\u00fb taper <code>&gt;=<\/code>.<\/li>\n<\/ul>\n<\/li>\n<li>Dans certains cas, vous pouvez v\u00e9rifier automatiquement chaque entr\u00e9e, ou v\u00e9rifier un grand nombre de donn\u00e9es al\u00e9atoires pour voir si votre programme fonctionne correctement. Nous utilisons souvent des entr\u00e9es al\u00e9atoires dans les tests internes de CS Circles. Utilisez import random\u00a0 au d\u00e9but de votre programme, puis random.randint(10, 100) va g\u00e9n\u00e9rer un nombre al\u00e9atoire compris entre 10 et 100.<\/li>\n<\/ul>\n<p>Pouvez-vous trouver \u00e0 la fois des bugs et passer tous les tests? Tentez le coup!<\/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> Certains calculs introduire des erreurs tr\u00e8s faibles en 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'>Erreur d'arrondi<\/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=\"191c6ce0f66eb3a15265e91dd1753795\"\/>\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  Il est surprenant que le code ci-dessus ne donne pas exactement <code>0.35<\/code>! Elle est li\u00e9e \u00e0 la mani\u00e8re dont Python stocke les num\u00e9ros. Ne vous inqui\u00e9tez pas \u00e0 propos de ces petites erreurs : le correcteur n'en tient pas compte. Nous en dirons plus dans le\u00e7on 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>Corrigez les erreurs et passez tous les 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'>\n# \u00e9tape 1: obtenir l'entr\u00e9e\ntimbitsRestant = int(input()) \n\n# \u00e9tape 2: initialiser le co\u00fbt total\nprixTotal = 0\n\n# \u00e9tape 3: acheter autant de grandes bo\u00eetes comme vous pouvez\ngrandeBoites = timbitsRestant \/\/ 40\n# mettre \u00e0 jour le prix total :\nprixTotal = prixTotal + grandeBoites * 6.19\n# calculer le nombre de timbits encore n\u00e9cessaires :\ntimbitsRestant = timbitsRestant - 40 * grandeBoites\n\n# \u00e9tape 4, peut-on acheter une bo\u00eete moyenne?\nif timbitsRestant >= 20:\n    prixTotal = prixTotal + 3.39\n    timbitsRestant = timbitsRestant - 20\n\n# \u00e9tape 5, peut-on acheter une petite bo\u00eete?\nif timbitsRestant >= 10: \n    prixTotal = prixTotal + 1.99\n    timbitsRestant = timbitsRestant - 20\n                \nprixTotal = prixTotal + timbitsRestant * 20 # \u00e9tape 6\nprint(prixTotal)                            # \u00e9tape 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='# \\u00e9tape 1: obtenir l\\u0027entr\\u00e9e\\ntimbitsRestant = int(input()) \\n\\n# \\u00e9tape 2: initialiser le co\\u00fbt total\\nprixTotal = 0\\n\\n# \\u00e9tape 3: acheter autant de grandes bo\\u00eetes comme vous pouvez\\ngrandeBoites = timbitsRestant \\\/\\\/ 40\\n# mettre \\u00e0 jour le prix total :\\nprixTotal = prixTotal + grandeBoites * 6.19\\n# calculer le nombre de timbits encore n\\u00e9cessaires :\\ntimbitsRestant = timbitsRestant - 40 * grandeBoites\\n\\n# \\u00e9tape 4, peut-on acheter une bo\\u00eete moyenne?\\nif timbitsRestant >= 20:\\n    prixTotal = prixTotal + 3.39\\n    timbitsRestant = timbitsRestant - 20\\n\\n# \\u00e9tape 5, peut-on acheter une petite bo\\u00eete?\\nif timbitsRestant >= 10: \\n    prixTotal = prixTotal + 1.99\\n    timbitsRestant = timbitsRestant - 20\\n                \\nprixTotal = prixTotal + timbitsRestant * 20 # \\u00e9tape 6\\nprint(prixTotal)                            # \\u00e9tape 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=\"759197a6c2cccdc1392ae7959d2631a2\"\/>\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>Avez vous faim maintenant? Vous \u00eates pr\u00eat \u00e0 continuer \u00e0 la le\u00e7on suivante!<\/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=\"\" \/>Alors que 10 timbits fait une bo\u00eete, 8 tim<a href=\"http:\/\/fr.wikipedia.org\/wiki\/Bit\">bits<\/a> font une tim<a href=\"http:\/\/fr.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>Cette le\u00e7on a quelques suggestions sur des fa\u00e7ons de faciliter la conception et le d\u00e9bogage de vos programmes. Le plus d\u2019exp\u00e9rience\u00a0vous aurez avec la programmation, le meilleur vous deviendrez \u00e0 \u00e9viter et corriger des erreurs, mais ici, nous allons essayer &hellip; <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/6d-fr\/\">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-4650","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/4650","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=4650"}],"version-history":[{"count":36,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/4650\/revisions"}],"predecessor-version":[{"id":8972,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/4650\/revisions\/8972"}],"wp:attachment":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/media?parent=4650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}