{"id":10646,"date":"2018-01-22T02:47:06","date_gmt":"2018-01-22T07:47:06","guid":{"rendered":"https:\/\/cscircles.cemc.uwaterloo.ca\/?page_id=10646"},"modified":"2018-07-07T00:00:14","modified_gmt":"2018-07-07T04:00:14","slug":"6d-tr-design-debugging-and-donuts","status":"publish","type":"page","link":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/6d-tr-design-debugging-and-donuts\/","title":{"rendered":"6D: Tasar\u0131m, Hata Ay\u0131klama ve Kurabiyeler"},"content":{"rendered":"<!-- Please retain this notice and add more notes if you create a new version.<br \/>\nOriginal lesson author: David Pritchard, daveagp@gmail.com, http:\/\/cscircles.ca<br \/>\nLicense: http:\/\/creativecommons.org\/licenses\/by-nc-sa\/3.0\/-->\n<p>Bu derste programlar\u0131m\u0131z\u0131 nas\u0131l daha iyi tasarlayabilece\u011finiz ve hatalar\u0131n\u0131 nas\u0131l daha iyi ay\u0131klayabilece\u011finiz konusunda baz\u0131 tavsiyeler bulacaks\u0131n\u0131z. Ne kadar \u00e7ok program yazarsan\u0131z hatalardan ka\u00e7\u0131nma ve hatalar\u0131 d\u00fczeltme konusunda o kadar \u00e7ok deneyim kazanacaks\u0131n\u0131z, yine de \u015fimdiden i\u015fe yarayabilecek genel baz\u0131 ipu\u00e7lar\u0131 \u00fczerinde dural\u0131m. Bu derste \u015fu teknikler hakk\u0131nda konu\u015faca\u011f\u0131z:<\/p>\n<ul>\n<li>bir kerede sadece bir b\u00f6l\u00fcm\u00fc yaz\u0131n<\/li>\n<li>baz\u0131 \u00f6rnekleri k\u00e2\u011f\u0131t kalemle yap\u0131n<\/li>\n<li>kod yazmaya ba\u015flamadan \u00f6nce bir plan yap\u0131n<\/li>\n<li>kodu yaz\u0131n<\/li>\n<li>k\u00e2\u011f\u0131t kalemle \u00e7\u00f6zd\u00fc\u011f\u00fcn\u00fcz \u00f6rnekleri test edin<\/li>\n<li>ayr\u0131ca rastgele veya az rastlanabilecek \u00f6rnekler de test edin<\/li>\n<\/ul>\n<p>Tabii ki bu sihirli form\u00fcl t\u00fcm sorunlar\u0131 otomatik \u00e7\u00f6zmeyecek, ama kar\u015f\u0131n\u0131za \u00e7\u0131kabilecek pek duruma sizi haz\u0131rlayacak ve olas\u0131 problemleri en aza indirecek.<\/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> Bir problemle kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda size yard\u0131m edebilecek baz\u0131 stratejiler;<em>\u00a0print ifadelerinin te\u015fhis ama\u00e7l\u0131 kullan\u0131m\u0131<\/em>\u00a0(bu derste bunu g\u00f6rece\u011fiz), <em>g\u00f6r\u00fcnt\u00fcleyciyi kullanmak<\/em>, <em>yazd\u0131\u011f\u0131n\u0131z kodu dikkatlice okumak<\/em>, ve\u00a0<em>iyi testler yazmak.<\/em>\u00a0E\u011fer\u00a0\u00a0<a href=\"\/run-at-home\">Python'u evde \u00e7al\u0131\u015ft\u0131r<\/a>\u0131rsan\u0131z de\u011fi\u015fim noktalar\u0131n\u0131 ve ad\u0131m ad\u0131m ilerleme ara\u00e7lar\u0131n\u0131 kullanmak neyin yanl\u0131\u015f gitti\u011fini anlaman\u0131zda yard\u0131mc\u0131 olabilir. <\/span><\/td><\/table><\/p>\n<p><strong><a href=\"http:\/\/en.wikipedia.org\/wiki\/Algorithm\">Algoritma<\/a><\/strong>\u00a0bir talimatlar dizisidir. Bir program\u0131n \u00e7al\u0131\u015fabilmesi i\u00e7in algoritma Python veya JavaScript gibi bir dilde yaz\u0131lmas\u0131 gerekir ama kendi dilinizde veya bir diagramla ifade edilebilecek bir talimatlar dizisi de \u00a0<strong>algoritma\u00a0<\/strong>olarak adland\u0131r\u0131labilir. Mesela bir \u00e7\u00f6rek tarifi de bir \u00e7e\u015fit algoritmad\u0131r; \"3 bardak un al\u0131n\" ad\u0131mlardan biri, \"hamuru 2 saat dinlendirin\" ba\u015fka bir ad\u0131md\u0131r. Bu derste basit bir algoritma geli\u015ftirece\u011fiz. Ard\u0131ndan\u00a0algoritmay\u0131 uygulayaca\u011f\u0131z; yani bu, haz\u0131rlad\u0131\u011f\u0131m\u0131z talimatlar dizisinin \u00e7al\u0131\u015fabilir bir bilgisayar program\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fclmesi anlam\u0131na gelecek.<\/p>\n<h2>Problem: Kurabiye Hesaplay\u0131c\u0131<\/h2>\n<p>Tim Horton, Kanada'da <strong>timbit<\/strong>\u00a0adl\u0131 top kurabiyelerden \u00fcreten bir kahve zinciri:<\/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>Gelecek haftalarda birka\u00e7 parti d\u00fczenlemeyi planl\u0131yorsunuz ve her parti i\u00e7in farkl\u0131 say\u0131da timbit kurabiyesi sipari\u015fi vermeniz gerekecek. B\u00fct\u00e7enizi planlamak i\u00e7in, istedi\u011finiz say\u0131da timbitin fiyat\u0131n\u0131 hesaplayan bir program yapmak istiyorsunuz. Sizin mahallenizdeki markette timbit fiyatlar\u0131 da \u015f\u00f6yle:<\/p>\n<table style=\"width: 350px; margin: auto;\">\n<tbody>\n<tr>\n<th>Say\u0131<\/th>\n<th>Fiyat<\/th>\n<\/tr>\n<tr>\n<td>1 adet<\/td>\n<td>0.20<\/td>\n<\/tr>\n<tr>\n<td>10 (k\u00fc\u00e7\u00fck kutu)<\/td>\n<td>1.99<\/td>\n<\/tr>\n<tr>\n<td>20 (orta kutu)<\/td>\n<td>3.39<\/td>\n<\/tr>\n<tr>\n<td>40 (b\u00fcy\u00fck kutu)<\/td>\n<td>6.19<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Her defas\u0131nda bir b\u00f6l\u00fcm\u00fc yap<\/h2>\n<p><strong>Partiye gelen P ki\u015fi say\u0131s\u0131n\u0131<\/strong>\u00a0input olarak alacak ve <strong>vergi d\u00e2hil herkese yap\u0131lacak ikram\u0131n maliyetini<\/strong>\u00a0output olarak verecek bir program yazman\u0131z gerekiyor. En \u00fcst d\u00fczeyde, bu program\u0131n \u00fc\u00e7 bile\u015feni vard\u0131r:<\/p>\n<ol>\n<li><strong>P<\/strong> say\u0131da ki\u015fi i\u00e7in gereken\u00a0<strong>T<\/strong> say\u0131da kurabiyeyi bulmak,<\/li>\n<li><strong>T<\/strong> say\u0131da kurabiye fiyat\u0131n\u0131 bulmak,<\/li>\n<li>vergiyle birlikte genel tutar\u0131 hesaplamak.<\/li>\n<\/ol>\n<p>Bu \u00fc\u00e7 b\u00f6l\u00fcm\u00fc ayr\u0131 ayr\u0131 \u00e7al\u0131\u015fabiliriz. Bir sonraki b\u00f6l\u00fcme ge\u00e7meden \u00f6nce mevcut b\u00f6l\u00fcm\u00fc yaz\u0131p, test etmek ve d\u00fczeltmek en iyisidir, \u00e7\u00fcnk\u00fc <em>program\u0131n\u0131z uzad\u0131k\u00e7a i\u00e7indeki hatalar\u0131 bulmak ve tamir etmek daha zorla\u015f\u0131r<\/em>. Hepsini bir araya getirmeden \u00f6nce her b\u00f6l\u00fcm\u00fc ayr\u0131 ayr\u0131 geli\u015ftirmek daha kolay olacak. Dersin devam\u0131nda <strong>T say\u0131da kurabiyenin fiyat\u0131n\u0131 hesaplayaca\u011f\u0131m\u0131z<\/strong> 2. ad\u0131ma odaklanaca\u011f\u0131z.<\/p>\n<h2>K\u00e2\u011f\u0131t kalemle \u00e7\u00f6z\u00fclen baz\u0131 \u00f6rnekler<\/h2>\n<p>Bilgisayara bir \u015fey yapmas\u0131n\u0131 s\u00f6yleyebilmemiz i\u00e7in \u00f6nce onu kendimiz yapabiliyor olmam\u0131z laz\u0131m.\u00a0 Bunu bir \u00f6rnekle a\u00e7\u0131klayal\u0131m: <strong>45<\/strong> timbit kurabiyesi almak i\u00e7in ka\u00e7 para \u00f6dememiz gerekiyor?\u00a0 Kutular\u0131n i\u00e7eriklerine bakarsak en b\u00fcy\u00fck boy kutuyu alabiliriz (40 adet),\u00a0 fiyat\u0131 da 6.19. O zaman bize\u00a0\u00a0<strong>45 \u2013 40 = 5<\/strong>\u00a0kurabiye daha gerekecek, tek tek ald\u0131\u011f\u0131m\u0131zda fiyat\u0131 5 * 0.20 = 1.00 tutacak. Toplam \u00f6deyece\u011fimiz para 6.19 + 1.00 = 7.19 oluyor.<\/p>\n<h2>Yazmaya ba\u015flamadan \u00f6nce kodun plan\u0131n\u0131 yap<\/h2>\n<p>Ama 45 yerine mesela 4 veya 456 kurabiye alacak olsak? \u0130htiyac\u0131 m\u00fcmk\u00fcn oldu\u011funca b\u00fcy\u00fck kutularla kar\u015f\u0131lamaya \u00e7al\u0131\u015faca\u011f\u0131z, arta kalan\u0131 da orta ve k\u00fc\u00e7\u00fck boy kutularla tamamlayaca\u011f\u0131z. <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> Bu algoritma en iyi sonucu verecek mi? Evet! 40 kurabiyelik bir b\u00fcy\u00fck kutuyu 6.19'a alabilecekken, 2*20=40 kurabiyeyi iki orta boy kutuyla almak (2*$3.39 = $6.78) ekonomik de\u011fil.\u00a0 Benzer kar\u015f\u0131la\u015ft\u0131rmalar\u0131 di\u011fer fiyat se\u00e7enekleriyle de yapabiliriz, her defas\u0131nda ihtiyac\u0131 b\u00fcy\u00fck boy kutularla kar\u015f\u0131lamak daha ekonomik oluyor. Yani algoritmam\u0131z iyi. <em>E\u011fer fiyat\/miktar farkl\u0131 olsayd\u0131, algoritmay\u0131 ona g\u00f6re kurmam\u0131z gerekecekti.<\/em> <\/span><\/td><\/table><\/p>\n<p>Kodu yazmaya ba\u015flamadan \u00f6nce plan yapal\u0131m demi\u015ftik. \u015e\u00f6yle bir plan yapabiliriz:<\/p>\n<ul>\n<li>Python'da yazmaya ba\u015flamadan \u00f6nce kendi dilimizde algoritmam\u0131z\u0131n ad\u0131mlar\u0131n\u0131 tek tek k\u0131saca tarif edelim<\/li>\n<li>ad\u0131mlar\u0131 resmedecek \u015fekilde bir \u015fema veya diyagram \u00e7izelim<\/li>\n<li>\u015fimdilik, detaylardan ziyade ana fikre odaklanal\u0131m.<\/li>\n<\/ul>\n<p>\u00d6rne\u011fimizde ad\u0131mlar\u0131 tarif ediyoruz. <em>Bu program i\u00e7in ak\u0131\u015f \u015femas\u0131 vermiyoruz, \u00e7\u00fcnk\u00fc zaten ad\u0131mlar\u0131 s\u0131rayla ve tek tek ger\u00e7ekle\u015ftirece\u011fiz. Daha sonra g\u00f6rece\u011fimiz d\u00f6ng\u00fcsel programlarda ak\u0131\u015f \u015femalar\u0131 bize daha \u00e7ok gerekli olur.\u00a0<\/em><\/p>\n<div style=\"margin: 0px 100px 0px 100px; border: 1px solid blue;\">\n<p style=\"text-align: center;\"><strong>Herhangi bir say\u0131da kurabiyenin fiyat\u0131n\u0131 hesaplayacak algoritma<\/strong><\/p>\n<ol>\n<li>inputa bakarak gereken kurabiye say\u0131s\u0131n\u0131 tespit et<\/li>\n<li>s\u0131f\u0131rdan ba\u015flayarak, toplam tutar\u0131 takip et<\/li>\n<li>m\u00fcmk\u00fcn oldu\u011funca \u00e7ok say\u0131da b\u00fcy\u00fck kutu sat\u0131n al\n<ol>\n<li>kutular al\u0131nd\u0131ktan sonra kalan kurabiye say\u0131s\u0131n\u0131 hesapla<\/li>\n<li>toplam fiyat\u0131 g\u00fcncelle<\/li>\n<\/ol>\n<\/li>\n<li>kalan kurabiyeleri orta boy kutu alarak tamamla, A ve B ad\u0131mlar\u0131n\u0131 tekrarla.<\/li>\n<li>kalan kurabiyeleri k\u00fc\u00e7\u00fck boy kutu alarak tamamla, A ve B ad\u0131mlar\u0131n\u0131 tekrarla.<\/li>\n<li>kalan kurabiye say\u0131s\u0131n\u0131 kar\u015f\u0131lamak i\u00e7in tekli kurabiyelerden al ve B ad\u0131m\u0131n\u0131 tekrarla.<\/li>\n<li>toplam fiyat\u0131n \u00e7\u0131kt\u0131s\u0131n\u0131 ver.<\/li>\n<\/ol>\n<\/div>\n<p>Bu algoritma tarifine <strong>yalanc\u0131 kod<\/strong> (<strong>pseudocode<\/strong>)<strong>\u00a0<\/strong>deniyor, \u00e7\u00fcnk\u00fc asl\u0131nda talimatlar\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klasa da hi\u00e7bir programlama dilinde anlaml\u0131 de\u011fil.<\/p>\n<h2>Kodu yaz<\/h2>\n<p>\u0130lk tavsiyeyi hat\u0131rlayal\u0131m, <em>bir kerede bir b\u00f6l\u00fcm yaz<\/em>\u0131yoruz; yani, 1'den 7'ye kadar olan her ad\u0131m i\u00e7in ayr\u0131 bir kod par\u00e7as\u0131 yazmay\u0131 d\u00fc\u015f\u00fcnebiliriz. Ayr\u0131ca, t\u00fcm ad\u0131mlar hakk\u0131nda d\u00fc\u015f\u00fcnmemiz gereken bir \u015fey var: Hangi de\u011fi\u015fkenleri kullanaca\u011f\u0131z? Adlar\u0131, t\u00fcrleri ve ba\u015flang\u0131\u00e7 de\u011ferleri ne olmal\u0131?<\/p>\n<p>H\u00e2l\u00e2 almam\u0131z gereken kurabiye say\u0131s\u0131 i\u00e7in\u00a0 <code>kalanTimbit<\/code>, \u015fu ana kadarki toplam tutar\u0131 g\u00f6stermek i\u00e7in\u00a0<code>toplamTutar<\/code> de\u011fi\u015fkenlerini atayal\u0131m. \u015eimdilik Python'a bu nesnelerin tiplerini s\u00f6ylememize gerek yok, ama biz biliyoruz ki\u00a0<code>kalanTimbit<\/code>, kurabiye say\u0131s\u0131n\u0131 verece\u011fi i\u00e7in\u00a0 int (tamsay\u0131) ve <code>toplamTutar<\/code>\u00a0de\u011fi\u015fkeni de fiyat\u0131 g\u00f6sterece\u011fi i\u00e7in float (ondal\u0131k say\u0131) olacak. (Bir kuru\u015f\u00a0<code>0.01<\/code>). Her ad\u0131m i\u00e7in ba\u015fka ge\u00e7ici de\u011fi\u015fkenlere de ihtiyac\u0131m\u0131z olacak, ama bunlara gerektik\u00e7e bakal\u0131m.<\/p>\n<ol>\n<li>ve 2. ad\u0131mlar\u0131 birer sat\u0131rl\u0131k kodla halledebiliriz:<\/li>\n<\/ol>\n<pre><code>kalanTimbit<\/code>= int(input()) # 1. ad\u0131m: inputu al <code>toplamTutar<\/code> = 0 # 2. ad\u0131m: toplam fiyat\u0131n ilk durumunu belirle<\/pre>3. ad\u0131m i\u00e7in, alabilece\u011fimiz en y\u00fcksek say\u0131da b\u00fcy\u00fck kutuyu bulal\u0131m. Pekiyi bunu nas\u0131l yapaca\u011f\u0131z? B\u00fcy\u00fck boy kutuda 40 kurabiye oldu\u011funa g\u00f6re <code>b\u00fcy\u00fckKutu<\/code>\u00a0say\u0131s\u0131 <code>kalanTimbit<\/code>\u00a0b\u00f6l\u00fc 40 olmal\u0131. B\u00f6lme, fiyat hesaplama, \u00e7\u0131karma i\u015flemlerini takip etmek \u00fczere a\u015fa\u011f\u0131daki kod par\u00e7as\u0131n\u0131 yazabiliriz:<\/p>\n<pre># 3. ad\u0131m: m\u00fcmk\u00fcn oldu\u011funca \u00e7ok say\u0131da b\u00fcy\u00fck boy kutu sat\u0131n al\r\nb\u00fcy\u00fckKutu = kalanTimbit \/ 40\r\ntoplamTutar = toplamTutar + b\u00fcy\u00fckKutu * 6.19    # toplam tutar\u0131 g\u00fcncelle\r\nkalanTimbit = kalanTimbit - 40 * b\u00fcy\u00fckKutu # h\u00e2l\u00e2 gereken kurabiye say\u0131s\u0131n\u0131 bul<\/pre>Asl\u0131nda, g\u00f6r\u00fcn\u00fc\u015fe g\u00f6re sanki \u015fu anda bir hata yapt\u0131k. Hatay\u0131 bulabilmek i\u00e7in\u00a0en iyi yol kodunuzu s\u0131k s\u0131k test etmektir! Diyelim ki kodumuzu bu noktada test etmek istiyoruz, yapmam\u0131z gereken birka\u00e7 print ifadesi yazmak olacak. (<em>print ifadeleri kullanmak yerine g\u00f6r\u00fcnt\u00fcleyiciden her sat\u0131r\u0131 tek tek kontrol edebilirsiniz<\/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>Yazd\u0131\u011f\u0131m\u0131z kodu test etmek amac\u0131yla, inputu\u00a0<strong>45\u00a0<\/strong>kabul ederek, hata ay\u0131klamakta\u00a0<code>print<\/code> ifadelerini kullan\u0131yoruz.<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>\u0130stedi\u011fimiz gibi gitmedi\u011fine g\u00f6re bir sorun var! <strong>S\u00f6yledi\u011fimiz \u015feyle, program\u0131n yapt\u0131\u011f\u0131 \u015feyin farkl\u0131la\u015fmaya ba\u015flad\u0131\u011f\u0131 ilk sat\u0131r hangisi?<\/strong>\u00a0Bir sonraki paragrafa ge\u00e7meden \u00f6nce bunu bulmaya \u00e7al\u0131\u015f\u0131n. Biz bu sorunu en ba\u015fta kalem k\u00e2\u011f\u0131tla \u00e7\u00f6zm\u00fc\u015ft\u00fck asl\u0131nda.<\/p>\n<div class='collapseContain hiding'>\n<div class='collapseHead'><span class='icon'><\/span>\nA\u00e7\u0131klamay\u0131 okumak i\u00e7in t\u0131klay\u0131n\n<\/div>\n<div class='collapseBody'>\u015eu\u00a0<code>b\u00fcy\u00fckKutu = kalanTimbit \/ 40<\/code>, form\u00fcl\u00fcm\u00fcze g\u00f6re, input 45 oldu\u011funda\u00a0<code>b\u00fcy\u00fckKutu<\/code>\u00a0say\u0131s\u00a0<code>1.125<\/code>, olacak, ama asl\u0131nda\u00a0<code>1<\/code>\u00a0olmal\u0131yd\u0131, \u00e7\u00fcnk\u00fc kutudan bir par\u00e7a alma \u015fans\u0131m\u0131z yok. Bir \u00e7\u00f6z\u00fcm yolu, 7A dersinde g\u00f6rece\u011fimiz gibi b\u00f6lme i\u015fareti olan\u00a0 <code>\/<\/code>\u00a0yerine <code>\/\/<\/code>\u00a0 kullanarak sonucun integer (tamsay\u0131) olmas\u0131n\u0131 sa\u011flamak olabilir. Ba\u015fka bir yol ise 4. derste g\u00f6rd\u00fc\u011f\u00fcm\u00fcz \u015fekilde <code>kalanTimbit<\/code><code>\u00a0\/ 40<\/code>\u00a0i\u015fleminin sonucunu\u00a0 <code>int<\/code>\u00a0tipi ile tan\u0131mlayarak ondal\u0131k k\u0131sm\u0131 kesmek. Biz de bu yolu kullanal\u0131m ve sat\u0131r\u0131 \u015f\u00f6yle d\u00fczeltelim: <code>b\u00fcy\u00fckKutu <\/code><code>= int(kalanTimbit \/ 40)<\/code>.<br \/>\n<\/div><\/div>\n<p>4 ve 5. ad\u0131mlar 3. ad\u0131ma benziyor. En fazla bir kutu orta boy veya k\u00fc\u00e7\u00fck boy kutu alaca\u011f\u0131m\u0131zdan, bu kez\u00a0\u00a0alternatif olarak,\u00a0\u00a0<code>if<\/code> ifadesi kullanal\u0131m:<\/p>\n<pre>if kalanTimbit &gt;= 20: # 4. ad\u0131m, orta boy bir kutu alabiliyor muyuz?\r\n\u00a0 toplamTutar = toplamTutar + 3.39\r\n\u00a0 kalanTimbit = kalanTimbit - 20\r\nif kalanTimbit &gt;= 10: # 5. ad\u0131m, k\u00fc\u00e7\u00fck boy kutu alabilir miyiz?\r\n\u00a0 toplamTutar = toplamTutar + 1.99\r\n\u00a0 kalanTimbit = kalanTimbit - 20<\/pre>Son olarak her birine 20 kuru\u015f \u00f6deyerek\u00a0 kalan kurabiyeleri de toplama ekleyip sonucu yazd\u0131raca\u011f\u0131z.<\/p>\n<pre>toplamTutar = toplamTutar + kalanTimbit  * 20 # 6. ad\u0131m\r\nprint(toplamTutar)                         # 7. ad\u0131m<\/pre>\n<h2>K\u00e2\u011f\u0131t kalemle \u00e7\u00f6zd\u00fc\u011f\u00fcn \u00f6rnekleri test et<\/h2>\n<p>Program\u0131m\u0131z genel olarak haz\u0131r. Yapaca\u011f\u0131m\u0131z ilk \u015fey, inputu 45 kabul ederek k\u00e2\u011f\u0131t kalemle \u00e7\u00f6zd\u00fc\u011f\u00fcm\u00fcz \u00f6rne\u011fin \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 test etmek.<\/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>45 adet kurabiye ne kadar tutacak?<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>G\u00f6r\u00fcn\u00fc\u015fe g\u00f6re bir hata (bug) var; \u00e7\u00fcnk\u00fc 45 kurabiye i\u00e7in \u00fccret 100 TL tuttu! \u015eimdi bu hatay\u0131 ve ba\u015fka gizli hatalar\u0131 bulup d\u00fczeltmemiz gerekiyor. Bir sonraki b\u00f6l\u00fcmde de bunu test edece\u011fiz.<\/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> Market promosyon yapm\u0131\u015f, hata da de\u011fil: <strong>T+1<\/strong> kurabiye almak <strong>T<\/strong> say\u0131s\u0131nda kurabiye almaktan daha ucuza geliyor. Mesela 19 kurabiye 3.79 tutarken, 20 kurabiye almak i\u00e7in sadece 3.39 \u00f6deyece\u011fiz. Buna ba\u011fl\u0131 olmaks\u0131z\u0131n, biz T say\u0131da timbiti m\u00fcmk\u00fcn olan en ucuz fiyata alma konusunu \u00e7\u00f6zmeye \u00e7al\u0131\u015f\u0131yoruz, yani en ba\u015ftaki algoritmam\u0131z do\u011fru bir mant\u0131\u011fa oturuyor. Yani input <code>19<\/code>\u00a0 oldu\u011fu durumda fiyat <code>3.79<\/code>\u00a0 olarak \u00e7\u0131kmal\u0131. <\/span><\/td><\/table><\/p>\n<h2>Farkl\u0131 \u00f6rnekleri test et<\/h2>\n<p>Computer Science Circles burada, problemi do\u011fru \u00e7\u00f6z\u00fcmleyen kodlar yazd\u0131\u011f\u0131n\u0131z\u0131\u00a0otomatize olarak test etmeye \u00e7al\u0131\u015f\u0131yor. Ama ger\u00e7ek programlamada kendi kodunuzu en ince ayr\u0131nt\u0131lar\u0131na kadar sizin test etmeniz gerekecek. \u0130\u015finize yarayacak baz\u0131 test tavsiyelerimiz var.<\/p>\n<ul>\n<li>Program\u0131n\u0131zdaki <em>her kod sat\u0131r\u0131n\u0131n<\/em> do\u011fru \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 kontrol edebilirsiniz.\u00a0 Timbit probleminde inputu <code>10<\/code>\u00a0 kabul ederek, program\u0131n k\u00fc\u00e7\u00fck say\u0131larla nas\u0131l \u00e7al\u0131\u015faca\u011f\u0131na bak\u0131labilir. Veya inputu\u00a0\u00a0<code style=\"font-style: inherit;\">20<\/code> ve\u00a0<code style=\"font-style: inherit;\">40<\/code>\u00a0olarak de\u011fi\u015ftirip orta ve b\u00fcy\u00fck boy kutular\u0131 denersiniz. En sonunda, daha az say\u0131larla, diyelim inputu\u00a0<code>1<\/code>\u00a0vs. girip, tek tek kurabiye al\u0131m\u0131nda program\u0131n nas\u0131l i\u015fledi\u011fini kontrol edersiniz.\n<ul>\n<li>Bu 3.39 ve 1.99 say\u0131lar\u0131n\u0131 do\u011fru yaz\u0131p yazmad\u0131\u011f\u0131n\u0131z\u0131 kontrol etmeye yarar.<\/li>\n<\/ul>\n<\/li>\n<li>Program\u0131n\u0131z\u0131 en s\u0131n\u0131rda \u00f6rneklerle test ederek sorunlar\u0131 g\u00f6zlemleyin. Mesela bu programa girebilece\u011fimiz en d\u00fc\u015f\u00fck input <code style=\"font-style: inherit;\">0<\/code>, \u00e7\u00fcnk\u00fc eksi say\u0131 giremeyiz. En y\u00fcksek input i\u00e7in ise s\u0131n\u0131r yok, ama b\u00fcy\u00fck kutu i\u00e7in test edebilece\u011fimiz s\u0131n\u0131rda rakamlar\u00a0<code>39<\/code> ve\u00a0<code>41<\/code>\u00a0olabilir.\n<ul>\n<li>B\u00f6ylece mesela yanl\u0131\u015fl\u0131kla\u00a0<code>&gt;=<\/code>\u00a0 yerine\u00a0\u00a0<code>&gt;<\/code> yaz\u0131p yazmad\u0131\u011f\u0131n\u0131z\u0131 kontrol etmi\u015f olursunuz.<\/li>\n<\/ul>\n<\/li>\n<li>Baz\u0131 durumlarda <em>her<\/em> inputu veya rastgele (<em>random<\/em>) say\u0131da inputu otomatik kontrol ederek program\u0131n do\u011fru \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131na bakabilirsiniz. Biz\u00a0CS Circles'ta i\u00e7 testlerimizi yaparken rastgele (random) inputlar\u0131 \u00e7ok kullan\u0131r\u0131z. Progtram\u0131n ba\u015f\u0131na\u00a0<code>import random<\/code> yazd\u0131\u011f\u0131n\u0131zda, mesela\u00a0<code>random.randint(10, 100)<\/code>\u00a0yazarsan\u0131z\u00a0\u00a0<code>10<\/code> ve <code>100<\/code>\u00a0 aras\u0131 rastgele tam say\u0131lar\u0131 (integer) otomatik test edebilirsiniz.<\/li>\n<\/ul>\n<p>Hem hatalar\u0131 bulup hem de t\u00fcm testleri ge\u00e7tiniz mi? Haydi bir deneyelim!<\/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> Python'da baz\u0131 hesaplamalar \u00e7ok k\u00fc\u00e7\u00fck hatalar getiriyor:  <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'>Yuvarlama Hatas\u0131<\/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=\"6184544f78c855cd9fd9a6da21159348\"\/>\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  \u0130gin\u00e7tir yukar\u0131daki kod\u00a0<code>0.35<\/code>\u00a0sonucunu vermiyor! Bu Python'un veriyi depolama \u015feklinden kaynaklan\u0131r. Bu gibi k\u00fc\u00e7\u00fck hatalar\u0131 \u00f6nemsemeye gerek yok: D\u00fczenleyici onlar\u0131 yok sayar. Bu konuyu 7B dersinde daha detayl\u0131 konu\u015faca\u011f\u0131z. <\/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'>Timbit<\/span><\/div>Hatalar\u0131 tamir edip t\u00fcm testleri ge\u00e7in!<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=\"58c2aa5110cf0a35c98f60c083f93d1b\"\/>\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>Ac\u0131kt\u0131n\u0131z m\u0131? O zaman bir sonraki derse ge\u00e7elim!<\/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=\"\" \/>10 timbit bir kutu yaparsa, 8 tim<a href=\"http:\/\/en.wikipedia.org\/wiki\/Bit\">bit<\/a> 1 tim<a href=\"http:\/\/en.wikipedia.org\/wiki\/Byte\">byte<\/a>\u00a0yapar.\u00a0<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>Bu derste programlar\u0131m\u0131z\u0131 nas\u0131l daha iyi tasarlayabilece\u011finiz ve hatalar\u0131n\u0131 nas\u0131l daha iyi ay\u0131klayabilece\u011finiz konusunda baz\u0131 tavsiyeler bulacaks\u0131n\u0131z. Ne kadar \u00e7ok program yazarsan\u0131z hatalardan ka\u00e7\u0131nma ve hatalar\u0131 d\u00fczeltme konusunda o kadar \u00e7ok deneyim kazanacaks\u0131n\u0131z, yine de \u015fimdiden i\u015fe yarayabilecek genel baz\u0131 &hellip; <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/6d-tr-design-debugging-and-donuts\/\">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-10646","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/10646","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=10646"}],"version-history":[{"count":22,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/10646\/revisions"}],"predecessor-version":[{"id":11024,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/10646\/revisions\/11024"}],"wp:attachment":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/media?parent=10646"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}