1 00:00:00,000 --> 00:00:10,940 2 00:00:10,940 --> 00:00:13,060 >> David J MALAN: Allt höger, så det här är CS50. 3 00:00:13,060 --> 00:00:15,040 Och detta är helt klart en fredag. 4 00:00:15,040 --> 00:00:16,850 Och detta är slutet av veckan en. 5 00:00:16,850 --> 00:00:21,020 Så du kanske minns att vi slutade, förra gången, med en cliffhanger av slag. 6 00:00:21,020 --> 00:00:25,020 Där vi avslöja denna lögn, att ingen Oavsett vad du har lärt växer 7 00:00:25,020 --> 00:00:31,610 upp, ett delat med 10 är inte i Faktum är 0,1 eller 0,100 eller 0,10000. 8 00:00:31,610 --> 00:00:35,270 Faktum är att om vi sammanställa denna program, som vi gjorde i går, med, 9 00:00:35,270 --> 00:00:39,770 gör vaghet och sedan gör prick, snedstreck, vaghet, 10 00:00:39,770 --> 00:00:43,600 vi lärt oss att det här är vad som är 1 dividerat med 10 i själva verket är. 11 00:00:43,600 --> 00:00:46,140 Så det är egentligen inte riktigt fallet. 12 00:00:46,140 --> 00:00:49,014 Men detta innebär antydan på några grundläggande begränsning av datorer. 13 00:00:49,014 --> 00:00:50,930 Och faktiskt, bland saker som vi ska göra 14 00:00:50,930 --> 00:00:55,130 idag är att ta en titt på varför detta har hänt, vilka konsekvenser detta har, 15 00:00:55,130 --> 00:00:58,430 hur mänskligheten har misslyckats att förstå detta i vissa mycket 16 00:00:58,430 --> 00:01:00,410 allvarlig situations-- resultatet av den som 17 00:01:00,410 --> 00:01:03,141 har varit ganska tragiskt och expensive-- och även 18 00:01:03,141 --> 00:01:04,849 ta en titt på hur vi kan faktiskt försvara 19 00:01:04,849 --> 00:01:06,530 mot dessa typer av begränsningar. 20 00:01:06,530 --> 00:01:10,940 Så intuitivt, kanske, varför är 1 dividerat med 10, 21 00:01:10,940 --> 00:01:15,480 enligt min dator här, inte bara 1/10, 0,10? 22 00:01:15,480 --> 00:01:15,980 Yeah. 23 00:01:15,980 --> 00:01:16,530 Vad tror du? 24 00:01:16,530 --> 00:01:17,860 >> Publiken: The radix är annorlunda? 25 00:01:17,860 --> 00:01:18,550 >> DAVID J MALAN: Den vad är? 26 00:01:18,550 --> 00:01:19,730 Åh, är radix annorlunda? 27 00:01:19,730 --> 00:01:20,720 Så inte riktigt. 28 00:01:20,720 --> 00:01:23,200 Det är faktiskt mer grundläggande för hårdvaran. 29 00:01:23,200 --> 00:01:23,980 Andra tankar? 30 00:01:23,980 --> 00:01:24,584 Yeah. 31 00:01:24,584 --> 00:01:26,750 Publiken: De representera tal på olika sätt? 32 00:01:26,750 --> 00:01:27,880 DAVID J MALAN: Så they-- höger. 33 00:01:27,880 --> 00:01:29,338 De representerar siffror på olika sätt. 34 00:01:29,338 --> 00:01:30,700 Felaktigt, tydligen. 35 00:01:30,700 --> 00:01:33,190 Så det är-- Tja, annorlunda än vad? 36 00:01:33,190 --> 00:01:34,490 Eller från vem? 37 00:01:34,490 --> 00:01:35,050 Från oss? 38 00:01:35,050 --> 00:01:35,966 Publikmedlem: Ja. 39 00:01:35,966 --> 00:01:38,930 De använder inte decimaltecknet systemet till [OHÖRBAR]. 40 00:01:38,930 --> 00:01:39,680 David J MALAN: OK. 41 00:01:39,680 --> 00:01:41,560 Så på sätt och vis, gör de inte använda decimalsystemet. 42 00:01:41,560 --> 00:01:43,720 Under huven, allt är, faktiskt, binär, 43 00:01:43,720 --> 00:01:45,510 och det är relaterat, faktiskt. 44 00:01:45,510 --> 00:01:48,135 Men det finns även en enklare förklaring än så. 45 00:01:48,135 --> 00:01:48,635 Yeah. 46 00:01:48,635 --> 00:01:49,970 >> Publiken: De bara har så många bitar. 47 00:01:49,970 --> 00:01:52,370 De kan bara lagra upp till en viss omfattning, i likhet med de decimaler. 48 00:01:52,370 --> 00:01:52,780 >> DAVID J MALAN: Ja. 49 00:01:52,780 --> 00:01:54,420 Detta är vad som verkligen komma åt det. 50 00:01:54,420 --> 00:01:57,180 Det visar sig att datorer typiskt, alltid kommer endast 51 00:01:57,180 --> 00:01:59,690 använda en begränsad mängd av information att representera något. 52 00:01:59,690 --> 00:01:59,870 Höger? 53 00:01:59,870 --> 00:02:02,110 När allt kommer omkring har vi bara en fast mängd hårddiskutrymme. 54 00:02:02,110 --> 00:02:04,210 Vi har bara ett fast belopp RAM eller datorminne. 55 00:02:04,210 --> 00:02:06,251 Och om du bara har en fast belopp på något, 56 00:02:06,251 --> 00:02:09,611 säkert kan du faktiskt inte räkna upp till oändlighet eller nummer du vill. 57 00:02:09,611 --> 00:02:11,610 Du, typ av, måste välja vad räckvidd 58 00:02:11,610 --> 00:02:13,220 av värden du kommer att stödja. 59 00:02:13,220 --> 00:02:18,100 >> Och så exempelvis en vecka eller två sedan, när vi talade om ASCII, 60 00:02:18,100 --> 00:02:21,610 och vi pratade ca 8 bitar, eller byte, så att säga, 61 00:02:21,610 --> 00:02:26,360 det största antalet vi kunde representera med 8 bitar var vad? 62 00:02:26,360 --> 00:02:28,350 255. 63 00:02:28,350 --> 00:02:31,850 Och vi kan representera 256 totalvärden men inte om vi tillbringar en av dem 64 00:02:31,850 --> 00:02:34,190 på 0-- Tja, men om vi spendera en av dem på 0, 65 00:02:34,190 --> 00:02:36,830 då det största antalet är, naturligtvis, 255. 66 00:02:36,830 --> 00:02:39,410 >> Så visar det sig att detta är fallet också i detta sammanhang. 67 00:02:39,410 --> 00:02:42,350 Vi började prata, förra gången, om flyttal, som 68 00:02:42,350 --> 00:02:44,640 skiljer sig från heltal, i att de har en decimalpunkt 69 00:02:44,640 --> 00:02:47,056 och, förhoppningsvis, några siffror efter det, men de är för. 70 00:02:47,056 --> 00:02:51,730 En dator är bara typiskt går att använda 32 bitar, kanske 64 bitar 71 00:02:51,730 --> 00:02:53,497 för att representera ett flyttal. 72 00:02:53,497 --> 00:02:56,080 Så även om vi har vuxit upp lärande i matematik och veta 73 00:02:56,080 --> 00:02:58,750 att du absolut kan ha ett oändligt antal siffror 74 00:02:58,750 --> 00:03:01,650 efter decimalkommat, inte Om du har begränsat minne. 75 00:03:01,650 --> 00:03:03,930 Du, typ av, måste runda, eller välja vilka 76 00:03:03,930 --> 00:03:05,346 nummer du kommer att representera. 77 00:03:05,346 --> 00:03:08,710 Och så du kan tänka dig, i en mening, varvid detta är datorns närmaste 78 00:03:08,710 --> 00:03:14,050 tillnärmning till värdet 1/10 som det kan få, med bara 32 eller så bitar. 79 00:03:14,050 --> 00:03:15,300 Och det är inte bara 1/10. 80 00:03:15,300 --> 00:03:19,820 >> Till exempel, om jag ändrar detta till 1/3, vilket vi tycker är ännu enklare. 81 00:03:19,820 --> 00:03:21,300 Så 1 dividerat med 3. 82 00:03:21,300 --> 00:03:22,355 Låt mig spara filen. 83 00:03:22,355 --> 00:03:24,680 Låt mig gå vidare och kompilera den. 84 00:03:24,680 --> 00:03:25,820 Och låt mig åter köra den. 85 00:03:25,820 --> 00:03:30,000 Även här, uppenbarligen, inte 0,3 1/3 och sedan ett oändligt antal 3s 86 00:03:30,000 --> 00:03:30,770 därefter. 87 00:03:30,770 --> 00:03:32,540 Du har denna vaghet i slutet. 88 00:03:32,540 --> 00:03:35,544 Så vi människor är korrekta, och vad du lärt är i själva verket, korrekt, 89 00:03:35,544 --> 00:03:37,460 men vi stöta upp mot vissa begränsningar. 90 00:03:37,460 --> 00:03:39,420 >> Och vad jag trodde vi skulle göra idag, är att börja 91 00:03:39,420 --> 00:03:42,190 genom att titta på, ärligt talat, den tragiska konsekvenserna av detta 92 00:03:42,190 --> 00:03:45,490 ibland, när mänskligheten inte riktigt genomföra 93 00:03:45,490 --> 00:03:48,460 för denna verklighet och dessa begränsningar. 94 00:03:48,460 --> 00:03:52,360 Och vi får se en serie vinjetter från History Channel som tar 95 00:03:52,360 --> 00:03:53,950 en titt på hur det har gått fel. 96 00:03:53,950 --> 00:03:56,340 Det är ca 8 minuter lång, och vi kommer tillbaka efter detta 97 00:03:56,340 --> 00:03:59,439 och ta en titt på exakt vad kan gå fel. 98 00:03:59,439 --> 00:04:00,605 Om vi ​​kunde dämpa lights-- 99 00:04:00,605 --> 00:04:02,350 >> [VIDEOAVSPELNING] 100 00:04:02,350 --> 00:04:06,310 >> -Computers, Vi har alla kommit att acceptera de ofta frustrerande problem som 101 00:04:06,310 --> 00:04:07,750 gå med dem. 102 00:04:07,750 --> 00:04:11,370 Buggar, virus och programvara glapp är små priser 103 00:04:11,370 --> 00:04:13,230 att betala för bekvämlighet. 104 00:04:13,230 --> 00:04:17,519 Men i högteknologiska och hög hastighet militära och rymdprogramansökningar, 105 00:04:17,519 --> 00:04:22,130 det minsta problemet kan förstoras till katastrof. 106 00:04:22,130 --> 00:04:27,750 Den 4 juni 1996 forskare beredda att lansera en obemannad Ariane 5-raketen. 107 00:04:27,750 --> 00:04:29,890 Det bar vetenskapliga satelliter utformade 108 00:04:29,890 --> 00:04:33,030 att fastställa exakt hur Jordens magnetfält samverkar 109 00:04:33,030 --> 00:04:35,600 med solvinden. 110 00:04:35,600 --> 00:04:37,930 Raketen byggdes för Europeiska rymdorganisationen 111 00:04:37,930 --> 00:04:41,620 och lyfte från sin anläggning vid kusten i Franska Guyana. 112 00:04:41,620 --> 00:04:44,924 >> -Och Ca 30 sekunder in flygningen, de första 113 00:04:44,924 --> 00:04:46,340 märkt något gick fel. 114 00:04:46,340 --> 00:04:49,280 Att munstyckena var svängbara på ett sätt som de borde verkligen inte. 115 00:04:49,280 --> 00:04:53,042 Runt 40 sekunder in i flygningen, klart fordonet var i trubbel, 116 00:04:53,042 --> 00:04:55,250 och det är när de gjorde beslutet att förstöra den. 117 00:04:55,250 --> 00:04:58,970 En Range säkerhetsansvarige med enorma tarmar tryckte på knappen, 118 00:04:58,970 --> 00:05:03,940 sprängde raketen innan det kunde bli en fara för den allmänna säkerheten. 119 00:05:03,940 --> 00:05:06,600 >> -detta Var jungfrun resan av Ariane 5, 120 00:05:06,600 --> 00:05:09,270 och dess förstörelse tog placera beror på ett fel 121 00:05:09,270 --> 00:05:10,992 inbäddad i raketens mjukvara. 122 00:05:10,992 --> 00:05:12,700 -Den Problem på Ariane var att det 123 00:05:12,700 --> 00:05:15,370 var ett tal som krävs 64 bitar för att uttrycka, 124 00:05:15,370 --> 00:05:18,150 och han ville konvertera den till ett 16 bitars nummer. 125 00:05:18,150 --> 00:05:21,160 De antas att antalet var aldrig kommer att bli mycket stor, 126 00:05:21,160 --> 00:05:25,020 att de flesta av dessa siffror i 64 bitars numret var 0: or. 127 00:05:25,020 --> 00:05:26,310 De hade fel. 128 00:05:26,310 --> 00:05:28,680 >> -Den Oförmåga en mjukvaruprogram för att acceptera 129 00:05:28,680 --> 00:05:32,820 den typ av nummer som genereras av en annan var vid roten av misslyckande. 130 00:05:32,820 --> 00:05:37,190 Mjukvaruutveckling hade blivit en mycket kostsam del av ny teknik. 131 00:05:37,190 --> 00:05:40,760 Ariane 4 raketen hade varit mycket framgångsrik, så mycket av mjukvaran 132 00:05:40,760 --> 00:05:43,990 skapas för det var också används på Ariane 5. 133 00:05:43,990 --> 00:05:49,750 >> -Den Grundläggande problem var att Ariane 5 var snabbare, accelereras snabbare. 134 00:05:49,750 --> 00:05:53,000 Och programvaran inte hade stod för det. 135 00:05:53,000 --> 00:05:56,330 >> -Den Förstörelse av raketen var en mycket stor ekonomisk katastrof, 136 00:05:56,330 --> 00:05:59,670 allt på grund av en minut programfel. 137 00:05:59,670 --> 00:06:01,990 Men detta var inte den första tidsproblem omvandlingsdata 138 00:06:01,990 --> 00:06:05,310 hade plågat modern raketteknik. 139 00:06:05,310 --> 00:06:08,300 >> -I 1991 med start av det första Gulfkriget, 140 00:06:08,300 --> 00:06:10,650 Patriot missil upplevt liknande slag 141 00:06:10,650 --> 00:06:12,650 av antalet konvertering problem. 142 00:06:12,650 --> 00:06:15,620 Som ett resultat, 28 personer, 28 amerikanska soldater 143 00:06:15,620 --> 00:06:18,440 dödades och omkring 100 andra skadades, 144 00:06:18,440 --> 00:06:21,900 när Patriot, som var tänkt för att skydda mot inkommande Scuds, 145 00:06:21,900 --> 00:06:24,630 misslyckades med att avfyra en missil. 146 00:06:24,630 --> 00:06:29,440 >> -När Irak invaderade Kuwait och Amerika lanserade Desert Storm i början av 1991, 147 00:06:29,440 --> 00:06:33,800 Patriot missil batterier utplacerades att skydda Saudiarabien och Israel 148 00:06:33,800 --> 00:06:37,000 från irakiska Scud missilattacker. 149 00:06:37,000 --> 00:06:40,610 The Patriot är en amerikansk, medium-range surface-to-air-system 150 00:06:40,610 --> 00:06:43,010 tillverkad av Raytheon företaget. 151 00:06:43,010 --> 00:06:49,080 >> -Den Storlek Patriot jaktplan, själv, handlar om, ungefär 20 fot lång. 152 00:06:49,080 --> 00:06:51,250 Och den väger ungefär 2000 pounds. 153 00:06:51,250 --> 00:06:55,195 Och det bär en stridsspets med about-- Jag tror att det är ungefär 150 pounds. 154 00:06:55,195 --> 00:06:59,500 Och stridsspetsen, sig själv, är en sprängämne, 155 00:06:59,500 --> 00:07:02,570 som har fragment runt den. 156 00:07:02,570 --> 00:07:06,890 Höljet av stridsspetsen är utformad för att agera som hagel. 157 00:07:06,890 --> 00:07:09,130 >> -The Missiler är transporteras, 4 per container, 158 00:07:09,130 --> 00:07:12,080 och transporteras av en påhängsvagn. 159 00:07:12,080 --> 00:07:19,100 >> -Den Patriot anti missilsystem går tillbaka åtminstone 20 år nu. 160 00:07:19,100 --> 00:07:22,320 Den var ursprungligen avsedd som en luftvärnsroboten 161 00:07:22,320 --> 00:07:24,180 att skjuta ner fientliga flygplan. 162 00:07:24,180 --> 00:07:27,860 I det första Gulfkriget, när detta krig kom, 163 00:07:27,860 --> 00:07:32,745 armén ville använda det till skjuta ner Scuds, inte flygplan. 164 00:07:32,745 --> 00:07:36,150 Den irakiska Force var inte så mycket av ett problem, 165 00:07:36,150 --> 00:07:39,110 men armén var orolig Scuds. 166 00:07:39,110 --> 00:07:42,340 Och så försökte de att uppgradera Patriot. 167 00:07:42,340 --> 00:07:44,760 >> -Intercepting En fiende missil reser på mach fem 168 00:07:44,760 --> 00:07:47,250 skulle bli utmanande nog. 169 00:07:47,250 --> 00:07:50,000 Men när Patriot var rusade i bruk, 170 00:07:50,000 --> 00:07:54,030 armén var inte medveten om en Iraks modifiering som gjort 171 00:07:54,030 --> 00:07:56,840 deras Scuds nästan omöjligt att slå. 172 00:07:56,840 --> 00:08:01,020 >> -Vad Hände, är Scuds som kom in, var instabila, 173 00:08:01,020 --> 00:08:02,310 de vinglar. 174 00:08:02,310 --> 00:08:05,140 Anledningen till detta, var irakierna, för 175 00:08:05,140 --> 00:08:09,450 att få 600 kilometer av en 300 kilometer missiler, 176 00:08:09,450 --> 00:08:12,930 tog vikt ut ur den främre stridsspets och gjorde stridsspetsen lättare. 177 00:08:12,930 --> 00:08:17,710 Så nu, Patriot s försöker komma vid scud, och för det mesta, 178 00:08:17,710 --> 00:08:21,700 den överväldigande majoriteten av tid, skulle det bara flyga genom scud. 179 00:08:21,700 --> 00:08:25,700 >> -När Patriotsystemansvariga insåg Patriot missade sitt mål, 180 00:08:25,700 --> 00:08:29,790 De detonerade Patriot stridsspets, att undvika eventuella förluster om det 181 00:08:29,790 --> 00:08:32,380 fick falla till marken. 182 00:08:32,380 --> 00:08:36,340 >> -Det Var vad de flesta människor såg, de stora eldklot på himlen, 183 00:08:36,340 --> 00:08:41,289 och missförstås som avlyssningar av Scud stridsspetsar. 184 00:08:41,289 --> 00:08:43,590 Även om i det natten himmel, verkade patrioter 185 00:08:43,590 --> 00:08:47,020 vara framgångsrikt förstöra Scuds på Dhahran, 186 00:08:47,020 --> 00:08:49,730 det kan finnas några misstag om dess prestanda. 187 00:08:49,730 --> 00:08:53,990 Där Patriot radarsystem förlorade spår av en inkommande Scud, 188 00:08:53,990 --> 00:08:56,650 och aldrig lanserats, på grund av en programvara fel. 189 00:08:56,650 --> 00:08:59,650 190 00:08:59,650 --> 00:09:04,100 Det var israelerna som först upptäckte att ju längre systemet var på, 191 00:09:04,100 --> 00:09:07,510 desto större tidsavvikelse blev, på grund av att en klocka inbäddad 192 00:09:07,510 --> 00:09:09,490 i systemets dator. 193 00:09:09,490 --> 00:09:12,670 >> -Om 2 veckor före tragedin i Dhahran, 194 00:09:12,670 --> 00:09:15,010 israelerna rapporteras till Försvarsdepartementet, 195 00:09:15,010 --> 00:09:17,940 att systemet var att förlora tid, att efter ca 8 timmars drift, 196 00:09:17,940 --> 00:09:21,410 de märkte att systemet var blir märkbart mindre exakt. 197 00:09:21,410 --> 00:09:25,290 Försvarsdepartementet svarade med berättar alla Patriot batterierna 198 00:09:25,290 --> 00:09:28,070 att inte lämna systemen på under en längre tid. 199 00:09:28,070 --> 00:09:29,960 De sa aldrig vad en lång tid var. 200 00:09:29,960 --> 00:09:30,460 8 timmar? 201 00:09:30,460 --> 00:09:30,960 10 timmar? 202 00:09:30,960 --> 00:09:31,870 1000 timmar? 203 00:09:31,870 --> 00:09:33,734 Ingen visste. 204 00:09:33,734 --> 00:09:35,650 -The Patriot batteri stationerade vid barackerna 205 00:09:35,650 --> 00:09:40,410 på Dhahran, och dess bristfälliga interna klocka, hade varit på över 100 timmar 206 00:09:40,410 --> 00:09:43,041 på natten 25 februari. 207 00:09:43,041 --> 00:09:47,416 >> -Det Spårade tid med en noggrannhet av omkring 1/10 av en sekund. 208 00:09:47,416 --> 00:09:49,290 Nu 1/10 av en sekund är ett intressant läge 209 00:09:49,290 --> 00:09:52,700 eftersom det inte kan vara uttryckt i binär, exakt. 210 00:09:52,700 --> 00:09:54,820 Vilket innebär, det kan inte uttryckas, exakt, 211 00:09:54,820 --> 00:09:57,420 i varje modern digital dator. 212 00:09:57,420 --> 00:10:01,460 Det är svårt att tro, men använda detta som ett exempel. 213 00:10:01,460 --> 00:10:03,520 Låt oss ta nummer, 1/3. 214 00:10:03,520 --> 00:10:07,110 1/3 kan inte uttryckas i decimal, exakt. 215 00:10:07,110 --> 00:10:11,490 1/3 är 0,333 pågått i oändlighet. 216 00:10:11,490 --> 00:10:15,486 Det finns inget sätt att göra det, med absolut noggrannhet, i decimal. 217 00:10:15,486 --> 00:10:18,360 Det är precis samma sorts problem som hände i Patriot. 218 00:10:18,360 --> 00:10:22,510 Ju längre systemet sprang, den värre tidsfelet blev. 219 00:10:22,510 --> 00:10:28,420 >> -Efter 100 timmars drift, felet Tiden var endast omkring 1/3 av en sekund. 220 00:10:28,420 --> 00:10:31,830 Men när det gäller att rikta en missil färdas i mach 5, 221 00:10:31,830 --> 00:10:35,890 Det resulterade i en spårning fel på över 600 meter. 222 00:10:35,890 --> 00:10:38,970 Det skulle vara ett allvarligt fel för soldaterna på Dhahran. 223 00:10:38,970 --> 00:10:45,035 >> -Vad Hände, är en Scud lansering var detekteras genom tidig varning satelliter, 224 00:10:45,035 --> 00:10:48,930 och de nya att Scud var kommer i deras allmänna riktning. 225 00:10:48,930 --> 00:10:51,170 De visste inte var det var på väg. 226 00:10:51,170 --> 00:10:53,990 >> -Det Var nu upp till radarn del av Patriot-systemet, 227 00:10:53,990 --> 00:10:58,520 försvara Dhahran, för att lokalisera och hålla koll på inkommande fientliga missiler. 228 00:10:58,520 --> 00:10:59,690 >> -Den Radarn var mycket smart. 229 00:10:59,690 --> 00:11:01,710 Det skulle faktiskt spåra positionen för Scud 230 00:11:01,710 --> 00:11:04,040 och sedan förutsäga var det förmodligen skulle vara, 231 00:11:04,040 --> 00:11:06,140 nästa gång, den radar skickade en puls ut. 232 00:11:06,140 --> 00:11:07,660 Det kallades avståndsgrinden. 233 00:11:07,660 --> 00:11:11,870 >> -Då, När Patriot beslutar tillräckligt med tid har 234 00:11:11,870 --> 00:11:16,280 passerade att gå tillbaka och kontrollera nästa plats för detta detekterade objektet, 235 00:11:16,280 --> 00:11:17,280 den går tillbaka. 236 00:11:17,280 --> 00:11:21,690 Så när det gick tillbaka till fel plats, då ser det inget objekt 237 00:11:21,690 --> 00:11:25,230 och beslutar att det inte fanns någon objekt, var det en falsk detektering, 238 00:11:25,230 --> 00:11:26,650 och droppar spåret. 239 00:11:26,650 --> 00:11:29,690 Den tillträdande Scud försvann från radarskärmen, 240 00:11:29,690 --> 00:11:32,670 och sekunder senare, det smällde in i barackerna. 241 00:11:32,670 --> 00:11:38,100 Den Scud dödade 28 och var den sista en sköt under det första Gulfkriget. 242 00:11:38,100 --> 00:11:43,460 Tragiskt nog, den uppdaterade programvaran anlände till Dhahran följande dag. 243 00:11:43,460 --> 00:11:46,150 Mjukvaran fel hade varit fast, stängning 244 00:11:46,150 --> 00:11:48,940 ett kapitel i den oroliga historia Patriot missil. 245 00:11:48,940 --> 00:11:50,220 >> [END SPELA] 246 00:11:50,220 --> 00:11:54,340 >> DAVID J MALAN: Så vi tar en titt på några liknande begränsningar i bara lite. 247 00:11:54,340 --> 00:11:58,470 Men först, låt oss Övergången till ett fåtal är FYI. 248 00:11:58,470 --> 00:12:01,575 Så en-- den här helgen, det kommer att vara super sektioner, 249 00:12:01,575 --> 00:12:04,200 vilka är tänkta att ersätta regelbundna sektioner, som 250 00:12:04,200 --> 00:12:05,460 startar en vecka därmed. 251 00:12:05,460 --> 00:12:08,204 Ta en titt på CS50 hemsida För mer information om dessa. 252 00:12:08,204 --> 00:12:11,120 De kommer också att filmas och streamas leva för dem som inte kan närvara. 253 00:12:11,120 --> 00:12:12,980 Problem set 1 är på kursens hemsida redan, 254 00:12:12,980 --> 00:12:15,105 och vi tar en titt på att bara en liten bit. 255 00:12:15,105 --> 00:12:18,350 Och kontorstid också, tar placera denna måndag till torsdag. 256 00:12:18,350 --> 00:12:20,960 >> Så det här var den mest kanoniska program vi tittade på förra gången. 257 00:12:20,960 --> 00:12:23,590 Det är som det enklaste program som du kan skriva in C, 258 00:12:23,590 --> 00:12:25,250 och även det är lite av ett djärvt påstående. 259 00:12:25,250 --> 00:12:25,750 Höger? 260 00:12:25,750 --> 00:12:28,070 Eftersom det finns en hel del sken komplexitet till detta. 261 00:12:28,070 --> 00:12:30,445 Så låt oss ta en snabb titt på vad några av dessa element 262 00:12:30,445 --> 00:12:33,080 var och sedan försöka ge en mental modell för hur 263 00:12:33,080 --> 00:12:35,710 dessa enklaste av program arbete, och sedan kommer vi att börja 264 00:12:35,710 --> 00:12:38,050 tittar på saker allt mer komplexa. 265 00:12:38,050 --> 00:12:41,280 Så här linjen här, betonade nu, i gult, vad gjorde vi säga, förra gången, 266 00:12:41,280 --> 00:12:43,200 att detta gör för oss? 267 00:12:43,200 --> 00:12:45,220 Vad är syftet det tjänar? 268 00:12:45,220 --> 00:12:46,984 Vem som helst från längre bak? 269 00:12:46,984 --> 00:12:47,483 Yeah. 270 00:12:47,483 --> 00:12:48,649 >> Publikmedlem: [OHÖRBAR] 271 00:12:48,649 --> 00:12:50,871 272 00:12:50,871 --> 00:12:51,704 DAVID J MALAN: Good. 273 00:12:51,704 --> 00:12:53,537 Så det ger dig tillgång på kommandon, eller låt oss 274 00:12:53,537 --> 00:12:56,750 kalla dem funktioner, att någon annan skrev, som deklareras, 275 00:12:56,750 --> 00:12:58,350 så att säga, i någon annan fil. 276 00:12:58,350 --> 00:13:02,370 Så vi får se exakt vad en .h fil är kontra en .c fil, så småningom. 277 00:13:02,370 --> 00:13:04,710 Men för nu, vet bara att printf, till exempel, 278 00:13:04,710 --> 00:13:08,370 är bland de funktioner som har deklareras i någon annan fil, någonstans 279 00:13:08,370 --> 00:13:12,930 annat på molnet hårddisk som tillåter oss att få tillgång till printf och använda den 280 00:13:12,930 --> 00:13:15,240 utan att behöva uppfinna som hjulet själva. 281 00:13:15,240 --> 00:13:16,930 Samtidigt viktigaste. 282 00:13:16,930 --> 00:13:19,690 Vad var analog av huvud förra veckan? 283 00:13:19,690 --> 00:13:20,190 Yeah. 284 00:13:20,190 --> 00:13:21,460 >> Publikmedlem: Grön flagg klickas. 285 00:13:21,460 --> 00:13:21,740 >> DAVID J MALAN: Ja. 286 00:13:21,740 --> 00:13:23,490 Scratch-talet, då grön flagg klickade. 287 00:13:23,490 --> 00:13:25,560 Det är som pusselbiten som sparkar saker. 288 00:13:25,560 --> 00:13:28,306 Och så samma sätt gjorde världen beslutade för några år sedan att i C, 289 00:13:28,306 --> 00:13:30,930 och ett gäng andra språk, Om du vill skriva ett program, 290 00:13:30,930 --> 00:13:33,410 din första funktion har att kallas, viktigaste. 291 00:13:33,410 --> 00:13:34,641 Och det måste se ut så här. 292 00:13:34,641 --> 00:13:36,640 Men vi kommer tillbaka, en annan tid, vad, int, 293 00:13:36,640 --> 00:13:38,690 och, tomrum, innebär i detta sammanhang. 294 00:13:38,690 --> 00:13:42,860 För nu, klammerparenteserna är vänliga av som Scratch pussel lappar form 295 00:13:42,860 --> 00:13:45,080 som kapslar in ett visst antal linjer. 296 00:13:45,080 --> 00:13:47,070 Och bland på linjerna Här är det en här. 297 00:13:47,070 --> 00:13:51,610 printf är en funktion vars syfte i livet är att skriva ut en formaterad sträng. 298 00:13:51,610 --> 00:13:55,010 Och formaterad, menar jag att du kan koppla in platshållarvärden, 299 00:13:55,010 --> 00:13:58,360 och du kan ange hur många decimaler punkter, hur många nummer som ska skrivas ut 300 00:13:58,360 --> 00:14:00,040 efter en decimalpunkt och liknande. 301 00:14:00,040 --> 00:14:05,040 Och printf, naturligtvis, tar en eller flera argument eller parametrar, 302 00:14:05,040 --> 00:14:06,770 annars känd, enklare, som insignaler. 303 00:14:06,770 --> 00:14:09,230 >> Så printf, liksom en hel del funktioner, tar ingångar. 304 00:14:09,230 --> 00:14:12,730 Och de ingångar omfamnade av de två parenteser här. 305 00:14:12,730 --> 00:14:15,180 Och insida i dem är en ingång. 306 00:14:15,180 --> 00:14:18,600 Det är en sträng, som vi har kallat det, vilket är bara en följd av tecken, 307 00:14:18,600 --> 00:14:22,310 som ett ord eller en fras, eller en hel uppsats även i mellan citattecken. 308 00:14:22,310 --> 00:14:25,712 Och det är vad som kommer att påverka beteende printf därför att, naturligtvis, 309 00:14:25,712 --> 00:14:27,170 det är bara en generisk utskriftsfunktion. 310 00:14:27,170 --> 00:14:29,600 Det kommer inte att veta vad att skriva ut, såvida du inte berätta det. 311 00:14:29,600 --> 00:14:31,000 Och sedan, några minutiae. 312 00:14:31,000 --> 00:14:34,056 Vad vi säger denna konstiga sekvens av symboler är? 313 00:14:34,056 --> 00:14:34,556 Yeah. 314 00:14:34,556 --> 00:14:35,410 >> Publikmedlem: Ny rad. 315 00:14:35,410 --> 00:14:35,990 >> DAVID J MALAN: Ny rad. 316 00:14:35,990 --> 00:14:39,340 Så visar det sig, du kan inte bara slå, ange när du skriver programmet. 317 00:14:39,340 --> 00:14:42,590 I allmänhet är kompilatorn kommer att få lite förvirrad om vad du menar. 318 00:14:42,590 --> 00:14:45,340 Snarare måste du bokstavligen säga, ge mig en ny linje här. 319 00:14:45,340 --> 00:14:49,506 Och så / n är vad vi i allmänhet ringa ett avbrottstecken. 320 00:14:49,506 --> 00:14:50,870 Så n för ny rad. 321 00:14:50,870 --> 00:14:53,810 Och kompilatorn vet att när det ser / n, 322 00:14:53,810 --> 00:14:57,420 Det borde egentligen framkalla datorn, slutligen, eller printf, i detta fall, 323 00:14:57,420 --> 00:15:00,260 att skriva ut en verklig ny linje, som att slå av, komma in, 324 00:15:00,260 --> 00:15:01,480 tangent på tangentbordet. 325 00:15:01,480 --> 00:15:05,620 Och slutligen, vad gjorde vi säger denna bit av syntaxen är till för? 326 00:15:05,620 --> 00:15:06,591 Vad betyder representerar? 327 00:15:06,591 --> 00:15:07,090 Yeah. 328 00:15:07,090 --> 00:15:07,490 >> Publikmedlem: [OHÖRBAR] 329 00:15:07,490 --> 00:15:08,660 >> DAVID J MALAN: Det är bara slutet av raden. 330 00:15:08,660 --> 00:15:09,909 Det är slutet av meddelandet. 331 00:15:09,909 --> 00:15:11,890 Och inse att vi inte sätta dem överallt. 332 00:15:11,890 --> 00:15:13,900 Vi verkligen inte sätta dem vid ändarna av varje rad. 333 00:15:13,900 --> 00:15:16,680 Till exempel finns det ingen på första raden, det finns ingen på linjen 334 00:15:16,680 --> 00:15:18,680 med huvudsakligt, det finns ingen efter klammerparenteserna, 335 00:15:18,680 --> 00:15:21,740 men du kommer att börja se och få bekant med där det kallas för. 336 00:15:21,740 --> 00:15:26,014 Och det är nästan alltid efter en funktion ring eller ett uttalande, några åtgärder 337 00:15:26,014 --> 00:15:27,180 att du faktiskt tar. 338 00:15:27,180 --> 00:15:29,520 >> Och vet nu, särskilt om bland de mindre bekväma, 339 00:15:29,520 --> 00:15:32,540 det är dessa typer av dumma saker att du kommer att hamna misstag näven 340 00:15:32,540 --> 00:15:33,873 huvudet mot väggen över. 341 00:15:33,873 --> 00:15:36,107 Eftersom du kommer att vara logiskt säker på vissa problem 342 00:15:36,107 --> 00:15:38,440 du har löst ett problem set, och skit bara 343 00:15:38,440 --> 00:15:40,187 kommer inte sammanställa eller ens köra. 344 00:15:40,187 --> 00:15:43,270 Och så ofta, tidigt på, det kommer att bero på att du missat en parentes, 345 00:15:43,270 --> 00:15:44,455 eller om du missat ett semikolon. 346 00:15:44,455 --> 00:15:46,547 Och så bara vara uppmärksam av dessa typer av saker, 347 00:15:46,547 --> 00:15:49,380 och försöka att inte bli frustrerad av dem eftersom mycket snabbt gör detta 348 00:15:49,380 --> 00:15:50,640 blir gamla hatt. 349 00:15:50,640 --> 00:15:53,910 Men det är mycket lätt att få frustrerad tidigt som ett resultat. 350 00:15:53,910 --> 00:15:57,020 >> Så nu, låt oss ta en titt på hur denna linje är faktiskt arbetar 351 00:15:57,020 --> 00:15:59,170 och sedan titta på en något mer komplicerat ett. 352 00:15:59,170 --> 00:16:02,017 Så vi har här, den förmåga att dra på den här skärmen. 353 00:16:02,017 --> 00:16:04,100 Och låt oss anta att detta är min datorskärm, 354 00:16:04,100 --> 00:16:08,589 men jag skriver, hello programmet, och jag har inte genomförts, printf. 355 00:16:08,589 --> 00:16:10,130 Någon annan har genomfört, printf. 356 00:16:10,130 --> 00:16:12,420 Vem skulle vilja göra anspråk på att har genomfört, printf? 357 00:16:12,420 --> 00:16:12,920 Om vi ​​får? 358 00:16:12,920 --> 00:16:13,830 Okej, vad heter du? 359 00:16:13,830 --> 00:16:14,155 >> STUDENT 1: [? Copal. ?] 360 00:16:14,155 --> 00:16:15,529 >> DAVID J MALAN: Copal, kom upp. 361 00:16:15,529 --> 00:16:16,430 Kom upp. 362 00:16:16,430 --> 00:16:17,070 Okej. 363 00:16:17,070 --> 00:16:22,260 Så vi har här, vissa namnbrickor, eftersom vi kommer att göra ett litet spel på detta. 364 00:16:22,260 --> 00:16:26,270 Och vi kommer att ringa dig, printf. 365 00:16:26,270 --> 00:16:30,170 Och om du vill komma hit, vad jag har precis dragit på skärmen, 366 00:16:30,170 --> 00:16:32,340 Det är helt enkelt, det är jag, det här. 367 00:16:32,340 --> 00:16:35,550 >> Okej, så, hälsningen mitt känt är, printf, om du vill lägga det på. 368 00:16:35,550 --> 00:16:35,740 Okej. 369 00:16:35,740 --> 00:16:37,360 Och om du kan gå monter genom datorskärmen 370 00:16:37,360 --> 00:16:39,730 som om du är den funktion som kom med denna datorsystem. 371 00:16:39,730 --> 00:16:42,063 Och ditt syfte i livet är att faktiskt skriva ut något. 372 00:16:42,063 --> 00:16:44,560 Men likt det program som vi bara hade på skärmen, här, 373 00:16:44,560 --> 00:16:47,060 vi kommer att behöva faktiskt ge dig lite input. 374 00:16:47,060 --> 00:16:51,810 >> Och så, om min ingång, här är uppenbarligen, vad ledes till printf, 375 00:16:51,810 --> 00:16:53,730 låt oss slags mock upp så här. 376 00:16:53,730 --> 00:16:58,720 Jag kommer att bokstavligen skriva på en bit papper, "hallå, världen" 377 00:16:58,720 --> 00:17:03,020 backslash N. Och för att vara tydlig, vad Jag har just dragit på detta papper, 378 00:17:03,020 --> 00:17:04,020 ser ut så här. 379 00:17:04,020 --> 00:17:08,730 Så när jag kör det här programmet, och detta gul kodrad blir avrättade, 380 00:17:08,730 --> 00:17:12,970 det är som om jag, hello programmet, jag lämna några igenkänning till en funktion 381 00:17:12,970 --> 00:17:13,970 att någon annan skrev. 382 00:17:13,970 --> 00:17:16,595 >> Och om du, med fingret, kunde faktiskt, med fingret, 383 00:17:16,595 --> 00:17:21,520 rita på skärmen oavsett det är du har överlämnats, 384 00:17:21,520 --> 00:17:27,465 effekten, i slutändan, är att se just det, på skärmen. 385 00:17:27,465 --> 00:17:29,140 Och ett litet hörn fallet här. 386 00:17:29,140 --> 00:17:31,540 Och bra, bör vi inte se den, nya linjen, på denna punkt. 387 00:17:31,540 --> 00:17:33,900 Det vore fel för dig uttryckligen dra nyrad. 388 00:17:33,900 --> 00:17:36,810 Men om vi höll skriva ord på skärm, skulle de hamna under den. 389 00:17:36,810 --> 00:17:39,560 >> Så tack så mycket, men stick för bara ett ögonblick runt här. 390 00:17:39,560 --> 00:17:42,860 Vi behöver nu en annan volontär, om vi kunde, 391 00:17:42,860 --> 00:17:46,830 det kommer att behöva spela rollen of-- Det är bara personer i orkestern 392 00:17:46,830 --> 00:17:47,355 just nu. 393 00:17:47,355 --> 00:17:47,980 Hur about-- OK. 394 00:17:47,980 --> 00:17:48,480 Precis här. 395 00:17:48,480 --> 00:17:49,180 Kom upp. 396 00:17:49,180 --> 00:17:49,955 Vad heter du? 397 00:17:49,955 --> 00:17:50,922 >> STUDENT 2: [? Ivay. ?] 398 00:17:50,922 --> 00:17:51,796 DAVID J MALAN: Förlåt? 399 00:17:51,796 --> 00:17:52,990 STUDENT 2: [? Ivay. ?] 400 00:17:52,990 --> 00:17:55,320 DAVID J MALAN: Ethan, kom upp. 401 00:17:55,320 --> 00:17:55,820 Nej? 402 00:17:55,820 --> 00:17:58,390 Fick jag att fel, även efter att du sa det två gånger? 403 00:17:58,390 --> 00:17:58,890 Kom upp. 404 00:17:58,890 --> 00:18:00,030 Det är svårt att höra upp här. 405 00:18:00,030 --> 00:18:05,240 406 00:18:05,240 --> 00:18:05,740 OK. 407 00:18:05,740 --> 00:18:07,190 Och jag är ledsen, vad heter du? 408 00:18:07,190 --> 00:18:07,680 >> STUDENT 2: [? Ivay. ?] 409 00:18:07,680 --> 00:18:08,790 >> [? David J MALAN: Ivay. ?] OK. 410 00:18:08,790 --> 00:18:10,430 För nu, om du inte sinne, du getString. 411 00:18:10,430 --> 00:18:11,013 >> STUDENT 2: OK. 412 00:18:11,013 --> 00:18:11,797 Häftigt. 413 00:18:11,797 --> 00:18:14,630 DAVID J MALAN: Så om du vill att stå här bara ett ögonblick, 414 00:18:14,630 --> 00:18:17,100 låt oss ta en titt på en något mer komplexa program, som 415 00:18:17,100 --> 00:18:18,670 har nu tre rader kod. 416 00:18:18,670 --> 00:18:24,080 Så vi har en, ange ditt namn med hjälp av printf; två, ett samtal till getString, 417 00:18:24,080 --> 00:18:28,060 följt av ett uppdrag till en variabel kallas, sträng s, eller kallas s; 418 00:18:28,060 --> 00:18:31,260 och sedan ytterligare ett samtal till printf, men denna gång med två ingångar. 419 00:18:31,260 --> 00:18:33,646 >> Så vi har redan gjort tillstånd ditt namn, eller snarare, vi har 420 00:18:33,646 --> 00:18:34,770 redan gjort en printf samtal. 421 00:18:34,770 --> 00:18:38,960 Så jag ska skriva, Ange ditt namn. 422 00:18:38,960 --> 00:18:42,089 Och så, vad jag ska passera, printf, på bara ett ögonblick, 423 00:18:42,089 --> 00:18:43,005 är helt enkelt detta. 424 00:18:43,005 --> 00:18:47,760 Så om du vill gå vidare och dra denna på skärmen, det är din input nu. 425 00:18:47,760 --> 00:18:48,260 Okej. 426 00:18:48,260 --> 00:18:51,160 Och glöm sträng, vi nu har vår egen kodrad här. 427 00:18:51,160 --> 00:18:54,470 Så, getString, vi behöver att faktiskt ringa, getString. 428 00:18:54,470 --> 00:18:57,920 Så ditt syfte i livet är att bara gå ut i orkestern, om du kunde, 429 00:18:57,920 --> 00:18:58,980 och få någons namn. 430 00:18:58,980 --> 00:19:00,860 Men låt oss ge dig något att sätta på den. 431 00:19:00,860 --> 00:19:02,908 Om du vill gå framåt och få en sträng, 432 00:19:02,908 --> 00:19:05,241 få någons namn på det papper, om du kunde. 433 00:19:05,241 --> 00:19:12,940 434 00:19:12,940 --> 00:19:13,530 >> Okej. 435 00:19:13,530 --> 00:19:15,250 Och vi får se, på bara ett ögonblick, vars namn vi får. 436 00:19:15,250 --> 00:19:17,630 Samtidigt vad jag ska har redo, är ett tomt 437 00:19:17,630 --> 00:19:21,340 av papper, där, jag kommer att lagra vad värde det 438 00:19:21,340 --> 00:19:25,752 är att getString återvänder till mig, Jag, som är en strängvariabel kallas, s. 439 00:19:25,752 --> 00:19:26,252 Okej. 440 00:19:26,252 --> 00:19:27,293 Så vad har du här? 441 00:19:27,293 --> 00:19:27,950 Nik. 442 00:19:27,950 --> 00:19:28,450 Okej. 443 00:19:28,450 --> 00:19:30,910 Så vi har Nik namn här. 444 00:19:30,910 --> 00:19:33,750 Så det här är vad bokstavligen har återvänt 445 00:19:33,750 --> 00:19:35,810 till mig, så att säga, av getString. 446 00:19:35,810 --> 00:19:38,720 >> Jag, nu tänker exekvera vänster sida 447 00:19:38,720 --> 00:19:43,440 av detta uttryck, där jag helt enkelt kopiera ner, för dagens ändamål, Nik. 448 00:19:43,440 --> 00:19:46,470 Så nu har jag en variabel kallas, s, lagring Nik namn. 449 00:19:46,470 --> 00:19:49,520 Jag har redan överlämnades till printf, en tidigare argumentet. 450 00:19:49,520 --> 00:19:52,800 Men i vår tredje och sista raden i kod, jag har faktiskt till hands printf 451 00:19:52,800 --> 00:19:58,500 något lite different-- "Hej,% s" backslash n. 452 00:19:58,500 --> 00:20:01,510 >> Och så den sista raden jag kommer att send-- det sista jag 453 00:20:01,510 --> 00:20:03,060 kommer att skriva ned nu, är detta. 454 00:20:03,060 --> 00:20:06,310 Så de två rader kod, eller snarare den sista raden i koden, 455 00:20:06,310 --> 00:20:10,690 Parlamentet efterlyser två inputs-- en, detta och två, redan. 456 00:20:10,690 --> 00:20:13,330 Så om vår printf funktion kan nu ta dessa som indata, 457 00:20:13,330 --> 00:20:16,000 Låt mig rensa skärmen för dig. 458 00:20:16,000 --> 00:20:17,250 Egentligen nej, kan du gå vidare. 459 00:20:17,250 --> 00:20:19,333 Vi lämnar det upp, eftersom det är på samma program. 460 00:20:19,333 --> 00:20:21,760 461 00:20:21,760 --> 00:20:27,380 Vi bör se, hej, Nik. 462 00:20:27,380 --> 00:20:27,880 Okej. 463 00:20:27,880 --> 00:20:29,670 Så detta var en hel del hoops att hoppa igenom, bara 464 00:20:29,670 --> 00:20:31,620 att skriva, ange ditt namn, och hej, Nik. 465 00:20:31,620 --> 00:20:37,210 Men denna enkla idé av meddelande passerar, för ingående passerar och utgångsmottagande, 466 00:20:37,210 --> 00:20:40,430 är exakt den modell som vi kommer att ha för även de mest komplexa funktioner. 467 00:20:40,430 --> 00:20:41,804 Så tack så mycket för er båda. 468 00:20:41,804 --> 00:20:43,730 Vi har en härlig spänning boll för dig här. 469 00:20:43,730 --> 00:20:48,890 Och tack till vår getString och printf frivilliga likadana. 470 00:20:48,890 --> 00:20:49,551 Tack. 471 00:20:49,551 --> 00:20:50,050 Okej. 472 00:20:50,050 --> 00:20:50,966 Tack till er båda. 473 00:20:50,966 --> 00:20:56,640 474 00:20:56,640 --> 00:21:00,430 >> Så vi har pratat om hittills mest om strängar. 475 00:21:00,430 --> 00:21:06,550 Och det visar sig att C kan faktiskt förstå några olika datatyper. 476 00:21:06,550 --> 00:21:08,860 I själva verket, låt oss ta en titt på dessa här. 477 00:21:08,860 --> 00:21:12,490 Så C, och en hel del språk, förstå saker som kallas tecken. 478 00:21:12,490 --> 00:21:16,852 En röding är i allmänhet en enda byte, eller åtta bitar. 479 00:21:16,852 --> 00:21:19,810 Och den representerar ett enda tecken, som bokstaven A eller kapitalet 480 00:21:19,810 --> 00:21:21,990 bokstaven A, eller liten bokstav En eller ett utropstecken, 481 00:21:21,990 --> 00:21:25,440 eller tecken som du kan skriva på tangentbordet, och ibland ännu mer. 482 00:21:25,440 --> 00:21:26,795 Vi råkar också se flottar. 483 00:21:26,795 --> 00:21:31,160 En flottör är, i allmänhet, en 32-bitars värde, eller fyra byte 484 00:21:31,160 --> 00:21:33,660 eftersom igen, är ett byte åtta bitar. 485 00:21:33,660 --> 00:21:36,675 >> Så en flottör är ett flyttalsvärde, något med ett decimalkomma. 486 00:21:36,675 --> 00:21:38,550 Och faktiskt, är vad som filmen talade 487 00:21:38,550 --> 00:21:42,240 om när de talade om flytande punkt värden, vissa fast antal bitar 488 00:21:42,240 --> 00:21:43,940 används för att representera ett reellt tal. 489 00:21:43,940 --> 00:21:45,740 Men det finns också saker som kallas dubbel. 490 00:21:45,740 --> 00:21:47,860 Dessa finns i Java, Om du har tagit APC 491 00:21:47,860 --> 00:21:51,540 och en dubbel, som namnet lyckligtvis antyder är dubbelt så stor som ett flöte. 492 00:21:51,540 --> 00:21:54,540 Det är fortfarande ett reellt tal, det bara har fler bitar 493 00:21:54,540 --> 00:21:58,390 med som att vara allt mer exakt, eller för att lagra ännu större antal. 494 00:21:58,390 --> 00:21:58,890 int är lätt. 495 00:21:58,890 --> 00:22:00,181 Vi pratade om det förra gången. 496 00:22:00,181 --> 00:22:01,160 Det är bara ett heltal. 497 00:22:01,160 --> 00:22:03,980 Och det är i allmänhet 32 bitar eller fyra byte. 498 00:22:03,980 --> 00:22:07,850 >> Och så, om du har, låt oss se nu, 32 bits-- och vi gjorde detta under vecka 0, 499 00:22:07,850 --> 00:22:10,820 någonsin så briefly-- om du har 32 bitar, vad är det största 500 00:22:10,820 --> 00:22:13,580 nummer Du kan representera som ett heltal? 501 00:22:13,580 --> 00:22:16,080 Ge eller ta? 502 00:22:16,080 --> 00:22:18,380 Det är som 4 miljarder, och det är bara om vi är 503 00:22:18,380 --> 00:22:20,690 representerar bara positiva tal. 504 00:22:20,690 --> 00:22:23,930 Om du har 32 bitar, och du vill representera negativa tal samt, 505 00:22:23,930 --> 00:22:27,100 ert sortiment är i huvudsak negativ 2000000000 till positiv 2 miljarder. 506 00:22:27,100 --> 00:22:29,250 Men generellt, börjar vi vid 0 gå upp till 4 miljarder. 507 00:22:29,250 --> 00:22:32,400 >> Du behöver inte veta exakt, men Vi kan se detta i själva verket, om jag bara 508 00:22:32,400 --> 00:22:36,400 öppna upp en liten miniräknare, här. 509 00:22:36,400 --> 00:22:41,070 Jag kan göra två 32, och det är precis hur stor, 510 00:22:41,070 --> 00:22:43,190 hur många värden som du kan representera, med 32 bitar. 511 00:22:43,190 --> 00:22:44,442 Och det är ungefär 4 miljarder. 512 00:22:44,442 --> 00:22:46,900 Så vi kommer att fortsätta att träffa det numret i några olika platser. 513 00:22:46,900 --> 00:22:48,890 Men om du behöver längre siffror än så, 514 00:22:48,890 --> 00:22:51,670 det visar sig att det finns något som kallas en lång lång. 515 00:22:51,670 --> 00:22:54,005 Och en lång lång är i allmänhet 64 bitar, som 516 00:22:54,005 --> 00:22:56,380 betyder att det är en storleksordning ännu större än en int. 517 00:22:56,380 --> 00:22:59,510 >> Så jag kan inte ens uttala största nummer som du kan representera, 518 00:22:59,510 --> 00:23:01,340 men det är betydligt större. 519 00:23:01,340 --> 00:23:05,190 Nu som en sidoreplik, historiskt, om en int är 32 bitar, 520 00:23:05,190 --> 00:23:12,780 och en lång lång är 64 bitar, hur stor är en lång, inte en lång tid? 521 00:23:12,780 --> 00:23:16,500 522 00:23:16,500 --> 00:23:20,330 Man skulle kunna tro att det är längre än en int men kanske mindre lång än en lång lång, 523 00:23:20,330 --> 00:23:21,400 men det beror faktiskt. 524 00:23:21,400 --> 00:23:23,400 >> Och så visar det sig en av frustration också, 525 00:23:23,400 --> 00:23:26,830 med att skriva kod på vissa system, är att inte alla dessa datatyper 526 00:23:26,830 --> 00:23:28,440 har förutbestämda värden. 527 00:23:28,440 --> 00:23:29,771 Ibland är det så många bitar. 528 00:23:29,771 --> 00:23:31,020 Ibland är det så många bitar. 529 00:23:31,020 --> 00:23:32,750 Så att du faktiskt måste veta, ibland, vilken maskinvara 530 00:23:32,750 --> 00:23:34,083 du kör din programvara på. 531 00:23:34,083 --> 00:23:36,960 Tack och lov, andra språk och andra datatyper som nu finns, 532 00:23:36,960 --> 00:23:38,400 tillåter dig att vara mer exakt. 533 00:23:38,400 --> 00:23:41,220 Tja, vi såg sträng, och vi såg bool också, 534 00:23:41,220 --> 00:23:43,960 men det visar sig de kommer endast med CS50 biblioteket. 535 00:23:43,960 --> 00:23:46,240 Så de inte byggs till C. De istället, 536 00:23:46,240 --> 00:23:49,340 kommer i den filen som heter CS50.h, att vi kommer så småningom 537 00:23:49,340 --> 00:23:51,831 skal tillbaka lager av. 538 00:23:51,831 --> 00:23:53,830 Men nu, de är bara ytterligare datatyper. 539 00:23:53,830 --> 00:23:57,060 En bool är en sann eller falsk, och en sträng är en sekvens av tecken, 540 00:23:57,060 --> 00:23:57,970 som ett ord. 541 00:23:57,970 --> 00:24:01,690 Nu printf, vi har sett, har platshållare, är% s en. 542 00:24:01,690 --> 00:24:05,430 Och du kanske kan, nu, dra slutsatsen från de här andra exempel, hur 543 00:24:05,430 --> 00:24:07,720 du kan ha en platshållare för olika datatyper. 544 00:24:07,720 --> 00:24:11,150 Till exempel, ta en gissning, om du ville skriva ut en enda röding med hjälp av 545 00:24:11,150 --> 00:24:15,270 printf är platshållare troligen% c. 546 00:24:15,270 --> 00:24:19,650 Och om du vill skriva ut ett heltal med platshållare,% i. 547 00:24:19,650 --> 00:24:25,150 % lld är en lång lång decimalvärde, men lång lång, så som avbildas till det. 548 00:24:25,150 --> 00:24:28,640 Och sedan% f för flytande punktvärde eller för en dubbel, 549 00:24:28,640 --> 00:24:31,270 så ibland de är återanvänds i olika sammanhang. 550 00:24:31,270 --> 00:24:33,350 Så vi får se och använda några av dem med tiden. 551 00:24:33,350 --> 00:24:36,420 Och printf och andra funktioner också stöd andras escape-sekvenser, 552 00:24:36,420 --> 00:24:38,080 och ibland, dessa är nödvändiga. 553 00:24:38,080 --> 00:24:39,770 Så snedstreck n är en ny rad. 554 00:24:39,770 --> 00:24:42,886 Bakstreck t, gör någon vill ta en stab? 555 00:24:42,886 --> 00:24:43,760 Publiken: Tab. 556 00:24:43,760 --> 00:24:44,551 DAVID J MALAN: Tab. 557 00:24:44,551 --> 00:24:46,810 Så om du verkligen vill att skriva ut en flik, inte 558 00:24:46,810 --> 00:24:49,940 ett fast antal platser utan en faktisk tabbtecken, behöver du inte träffar din, 559 00:24:49,940 --> 00:24:53,490 fliken, tangent på tangentbordet, i allmänhet, du faktiskt göra bakstreck t. 560 00:24:53,490 --> 00:24:57,750 Snedstreck dubbla citattecken, varför skulle jag någonsin vill det? 561 00:24:57,750 --> 00:24:58,250 Höger? 562 00:24:58,250 --> 00:25:00,417 Varför kan jag inte bara skriva en dubbla citattecken på tangentbordet? 563 00:25:00,417 --> 00:25:02,124 Publiken: Jo, annars är det 564 00:25:02,124 --> 00:25:04,830 kommer att tro att det är slutet av vilja utskrifts [? text. ?] 565 00:25:04,830 --> 00:25:05,420 >> DAVID J MALAN: Exakt. 566 00:25:05,420 --> 00:25:07,211 Kom ihåg, med vår printf exempel, när vi 567 00:25:07,211 --> 00:25:10,075 passerar till printf i indata, till vänster om den indatasträngen 568 00:25:10,075 --> 00:25:12,950 och till höger om ingången fjäder, naturligtvis, var en dubbel citat. 569 00:25:12,950 --> 00:25:16,270 Om din egen insats har en dubbel citat i mitten av det, 570 00:25:16,270 --> 00:25:18,920 datorn kanske potentiellt blir förvirrade, att, 571 00:25:18,920 --> 00:25:20,760 gör denna dubbla citat hör hemma i mitten? 572 00:25:20,760 --> 00:25:22,150 Är det hör ihop med den vänstra? 573 00:25:22,150 --> 00:25:23,566 Är det hör ihop med den rätta? 574 00:25:23,566 --> 00:25:26,780 Och så, om du vill göra det super klart, gör du omvänt snedstreck dubbla citattecken, 575 00:25:26,780 --> 00:25:30,480 så att det är flydde, så att säga, och det är inte conflated för något annat. 576 00:25:30,480 --> 00:25:34,400 Och det finns några andra här, bakstreck r, enkla citationstecken, 0, 577 00:25:34,400 --> 00:25:36,510 att vi kan se över tid, liksom. 578 00:25:36,510 --> 00:25:37,760 Och nu, vad om funktioner? 579 00:25:37,760 --> 00:25:41,630 >> Så åtgärder som vi kan vidta hittills på detta språk, C, ja, vi har sett, 580 00:25:41,630 --> 00:25:44,320 printf, naturligtvis, och alla av andra på skärmen, 581 00:25:44,320 --> 00:25:47,140 här, att vi kommer att använda för kursens första veckorna bara, 582 00:25:47,140 --> 00:25:48,485 komma när CS50 biblioteket. 583 00:25:48,485 --> 00:25:51,850 Och de gör det mycket lättare, i C, att faktiskt få användarens input. 584 00:25:51,850 --> 00:25:54,200 Det visar sig att i C, och uppriktigt sagt i några språk, 585 00:25:54,200 --> 00:25:57,450 Det är en verklig smärta i nacken att göra något enkelt, som uppmanar användaren 586 00:25:57,450 --> 00:26:01,310 för tangentbord, för hans eller hennes ingång. 587 00:26:01,310 --> 00:26:03,240 Och så dessa funktioner gör det lättare. 588 00:26:03,240 --> 00:26:05,472 >> Och det har också fel kontroll hela, 589 00:26:05,472 --> 00:26:07,180 så att, när man minns onsdagen vi 590 00:26:07,180 --> 00:26:09,740 såg, försöka igen, varning, när jag inte samarbetade, 591 00:26:09,740 --> 00:26:11,700 och jag skrev ett ord, i stället för ett nummer? 592 00:26:11,700 --> 00:26:15,402 Vi har gjort grovjobbet tidigt på att se till att användaren samverkar. 593 00:26:15,402 --> 00:26:17,860 Men dessa är bara träning hjul som vi kommer så småningom, 594 00:26:17,860 --> 00:26:19,640 och snabbt, ta bort. 595 00:26:19,640 --> 00:26:22,630 >> Så för att återblick, då, låt oss ta en snabb titt, 596 00:26:22,630 --> 00:26:26,620 mycket som vi gjorde med Scratch, vid vissa kanoniska konstruktioner i C. 597 00:26:26,620 --> 00:26:28,580 Detta är tänkt att sortera av, vara en virvelvind tur, 598 00:26:28,580 --> 00:26:30,990 bara så att du har en referens och när du har sett saker först. 599 00:26:30,990 --> 00:26:34,100 Men då kommer vi att titta på själva kodningen använda en del av dessa byggstenar. 600 00:26:34,100 --> 00:26:36,710 Så mycket som i Scratch, när vi hade uttalanden vill, 601 00:26:36,710 --> 00:26:41,570 säger eller vänta i C, har vi funktioner samt, som printf. 602 00:26:41,570 --> 00:26:45,350 >> Om vi ​​vill uttrycka ett tillstånd i C, är det liknande, i anden, 603 00:26:45,350 --> 00:26:47,840 till den pusselbit som såg ut så här i Scratch. 604 00:26:47,840 --> 00:26:49,850 Men i stället, vi bokstavligen bara skriva om. 605 00:26:49,850 --> 00:26:51,830 Och sedan, inom parentes, vi sätter ett villkor, 606 00:26:51,830 --> 00:26:54,807 där detta villkor är vad vi ska samtal, återigen, ett boolskt uttryck. 607 00:26:54,807 --> 00:26:56,390 Och återigen, är denna typ av pseudokod. 608 00:26:56,390 --> 00:26:58,830 Och i själva verket är // en kommentar. 609 00:26:58,830 --> 00:27:00,550 Det är bara engelska ord till mig själv. 610 00:27:00,550 --> 00:27:03,000 Men detta är den allmänna strukturen av en, om tillstånd. 611 00:27:03,000 --> 00:27:05,220 Men vi får se konkreta exempel på bara ett ögonblick. 612 00:27:05,220 --> 00:27:07,960 >> Om du vill ha en två-vägs gaffel i vägen, 613 00:27:07,960 --> 00:27:11,740 mycket som vi gjorde med vår volontär på Onsdag, kan du ha en, annars om. 614 00:27:11,740 --> 00:27:16,020 Och om du vill ha en tredje och sista villkoret, eller standardsituation, 615 00:27:16,020 --> 00:27:19,006 du kan ha bara en annan block där. 616 00:27:19,006 --> 00:27:21,880 Och på samma sätt, med booleska uttryck, du kan, och dem tillsammans. 617 00:27:21,880 --> 00:27:24,296 Och vi såg på onsdagen, att Det finns inte en enda et-tecken, 618 00:27:24,296 --> 00:27:28,220 Det är två, för lägre nivå skäl som vi så småningom kommer att se och spela med. 619 00:27:28,220 --> 00:27:30,410 Eller-ing saker tillsammans är 2 vertikala streck. 620 00:27:30,410 --> 00:27:32,240 På ett amerikanskt tangentbord, detta är i allmänhet en nyckel 621 00:27:32,240 --> 00:27:35,730 med skifttangenten ovan din Enter eller Retur-tangenten. 622 00:27:35,730 --> 00:27:38,620 >> Sedan finns dessa saker som Vi kommer att använda kanske en eller två gånger. 623 00:27:38,620 --> 00:27:42,570 De är funktionellt ekvivalenta med vad du kan göra med en, om, annars om, 624 00:27:42,570 --> 00:27:44,950 annars om annat, konstruera, men de kallas en omkopplare. 625 00:27:44,950 --> 00:27:48,020 De ser väldigt annorlunda, men vi ska se i några av våra distributionskoden, 626 00:27:48,020 --> 00:27:51,890 för en framtida problem set, mest troligt, att det ibland bara en snyggare 627 00:27:51,890 --> 00:27:54,060 sätt att uttrycka en helhet gäng villkor 628 00:27:54,060 --> 00:27:57,590 utan att ha en hel del klammerparentes och en hel del parenteser och indrag. 629 00:27:57,590 --> 00:28:01,910 Men de ger oss mer makt än vi redan har. 630 00:28:01,910 --> 00:28:02,550 Och nu loopar. 631 00:28:02,550 --> 00:28:05,020 Och den här, kommer vi att titta vid en något långsammare. 632 00:28:05,020 --> 00:28:08,470 Men då ska vi börja använda dessa, särskilt för dem som redan känner till. 633 00:28:08,470 --> 00:28:13,830 Detta är den kanoniska sätt, om oerhört svårbegripliga sätt att skriva en slinga i C. 634 00:28:13,830 --> 00:28:15,896 >> Nu en slinga i Scratch var ganska enkelt. 635 00:28:15,896 --> 00:28:17,020 Du har en, för evigt, block. 636 00:28:17,020 --> 00:28:19,760 Du har en, upprepa, block med bara ett nummer som du måste skriva in. 637 00:28:19,760 --> 00:28:22,220 Och med den, för loop, kan du genomföra båda dessa idéer, 638 00:28:22,220 --> 00:28:23,595 men det är lite mer teknisk. 639 00:28:23,595 --> 00:28:25,994 Men ärligt talat, det är också relativt enkel. 640 00:28:25,994 --> 00:28:28,160 När du vet ordning operationer, du bokstavligen 641 00:28:28,160 --> 00:28:30,910 bara ska koppla in värden och tala om för datorn vad de ska göra. 642 00:28:30,910 --> 00:28:32,800 Så här är ett exempel. 643 00:28:32,800 --> 00:28:38,040 Detta är en slinga som, ganska enkelt, räknar från ett antal upp 644 00:28:38,040 --> 00:28:40,187 genom en annan. 645 00:28:40,187 --> 00:28:42,020 Och bara genom att ögna på det, även om du har 646 00:28:42,020 --> 00:28:44,660 ingen tidigare erfarenhet av detta språk, vilket nummer 647 00:28:44,660 --> 00:28:46,920 inte nog börja det räkna på? 648 00:28:46,920 --> 00:28:47,730 OK, 0. 649 00:28:47,730 --> 00:28:50,240 Och jag gissar att det är därför du se att det finns en int och en i, 650 00:28:50,240 --> 00:28:51,073 som är en variabel. 651 00:28:51,073 --> 00:28:52,390 Det initieras till 0. 652 00:28:52,390 --> 00:28:55,670 >> Och senare, ser det ut som vi passerar printf, ett värde. 653 00:28:55,670 --> 00:28:58,000 Och i själva verket gjorde jag en liten stavfel här. 654 00:28:58,000 --> 00:28:59,850 Men det är lätt fast. 655 00:28:59,850 --> 00:29:02,390 Låt mig tillägga i, jag här. 656 00:29:02,390 --> 00:29:06,150 Vi har nu printf varelse passerat den platshållare värde. 657 00:29:06,150 --> 00:29:08,299 Och vad som kommer att räkna upp genom? 658 00:29:08,299 --> 00:29:08,840 PUBLIK: 50. 659 00:29:08,840 --> 00:29:09,340 50. 660 00:29:09,340 --> 00:29:10,160 49. 661 00:29:10,160 --> 00:29:10,910 David J MALAN: 49. 662 00:29:10,910 --> 00:29:13,340 Så 50, vid första anblicken, verkar rätt. 663 00:29:13,340 --> 00:29:16,990 Men att det visar sig, kommer att bli vår förutsättning att vi hålla kontroll. 664 00:29:16,990 --> 00:29:21,740 Och vi kommer att sluta en gång Jag är inte längre är mindre än 50. 665 00:29:21,740 --> 00:29:24,920 Så denna slinga, Omvänt bör exekvera, så länge som i är mindre än 50. 666 00:29:24,920 --> 00:29:28,891 Men så fort det blir 50 eller 51, eller ännu värre, bör det stannar automatiskt. 667 00:29:28,891 --> 00:29:29,390 Okej. 668 00:29:29,390 --> 00:29:31,200 >> Så vad händer egentligen här? 669 00:29:31,200 --> 00:29:33,160 Så det här är i storleksordningen operationer för en slinga. 670 00:29:33,160 --> 00:29:35,440 En, har du s.k. initiering. 671 00:29:35,440 --> 00:29:38,264 Denna gula markerade bit av koden exekveras först, 672 00:29:38,264 --> 00:29:40,930 och det har den effekten att per Onsdag, ni föreställa er förmodligen. 673 00:29:40,930 --> 00:29:45,500 Det skapar en variabel som heter i och det butiker i den variabeln värdet 0. 674 00:29:45,500 --> 00:29:47,560 Så jag är 0 vid denna tidpunkt i historien. 675 00:29:47,560 --> 00:29:49,680 >> Nästa sak som händer i detta konstrukt, 676 00:29:49,680 --> 00:29:51,540 är att villkoret blir kontrolleras. 677 00:29:51,540 --> 00:29:54,325 Så jag kolla omedelbart, är jag mindre än 50? 678 00:29:54,325 --> 00:29:57,700 Och naturligtvis, svaret för nu är säkert, ja. 679 00:29:57,700 --> 00:30:00,710 Ja, eftersom jag är 0, och det är säkert mindre än 50. 680 00:30:00,710 --> 00:30:03,866 Sedan vad som händer, är att detta kodrad blir exekveras. 681 00:30:03,866 --> 00:30:06,740 Och faktiskt, om det finns flera kodrader i dessa klammerparenteser, 682 00:30:06,740 --> 00:30:09,020 de alla får exekveras en efter en. 683 00:30:09,020 --> 00:30:11,450 >> Och i effekten här är tydligen, att skriva ut 684 00:30:11,450 --> 00:30:15,365 numret i, som kommer att vara 0, och sedan 1 och sedan 2. 685 00:30:15,365 --> 00:30:15,865 Men varför? 686 00:30:15,865 --> 00:30:17,410 Varför det blir ökas? 687 00:30:17,410 --> 00:30:20,680 Tja, den fjärde sak som händer är att denna syntax 688 00:30:20,680 --> 00:30:22,610 blir verk efter semikolon. 689 00:30:22,610 --> 00:30:27,506 i ++ är ett stenografi sätt att säga; ta värdet av i, och tillsätt 1 till den; 690 00:30:27,506 --> 00:30:30,380 och sedan nästa gång omkring, tillfogar En till den; och nästa gång, 691 00:30:30,380 --> 00:30:31,330 lägg 1 till den. 692 00:30:31,330 --> 00:30:33,640 >> Så om vi hålla, vad som kommer att hända 693 00:30:33,640 --> 00:30:35,890 Nästa är att jag inte tänker initiera jag någonsin igen. 694 00:30:35,890 --> 00:30:38,290 Om jag höll initiering Jag till 0, detta exempel 695 00:30:38,290 --> 00:30:41,110 skulle aldrig sluta på grund Jag skulle vara fastnat på 0. 696 00:30:41,110 --> 00:30:43,870 Men vad som kommer att hända är att villkoret kommer att kontrolleras, 697 00:30:43,870 --> 00:30:54,280 kodraden kommer att få utföras, det jag kommer att ökas, 698 00:30:54,280 --> 00:30:56,970 villkor kommer att kontrolleras, kod kommer att få exekveras. 699 00:30:56,970 --> 00:30:59,790 Och det hålls cykling igen, och igen, och igen, 700 00:30:59,790 --> 00:31:03,340 tills jag ++ inducerar ett värde av 50. 701 00:31:03,340 --> 00:31:05,870 >> Villkoret säger då, är 50 mindre än 50? 702 00:31:05,870 --> 00:31:09,360 Svaret är naturligtvis nej, och så hela koden slutar att köra. 703 00:31:09,360 --> 00:31:13,020 Och om du har mer kod på skärmen nere, det är vad som händer härnäst. 704 00:31:13,020 --> 00:31:17,530 Det poppar ut ur dessa klammerparenteserna och fortsätter att skriva ut mer efter det. 705 00:31:17,530 --> 00:31:20,470 >> Så ett skämt nu, från foxtrot, att du kanske nu förstår. 706 00:31:20,470 --> 00:31:30,810 707 00:31:30,810 --> 00:31:31,560 Det är alltid roligt. 708 00:31:31,560 --> 00:31:34,110 Det är som chuckles slags tränga, 709 00:31:34,110 --> 00:31:38,370 och sedan du inser att du inte bör vara skratta åt humor så här. 710 00:31:38,370 --> 00:31:41,160 Men det finns vissa takeaway här, pedagogiskt, också. 711 00:31:41,160 --> 00:31:43,577 Så visar det sig att jag är saknar en bit av syntax, 712 00:31:43,577 --> 00:31:45,410 eller foxtrot s saknas en bit syntaxen här. 713 00:31:45,410 --> 00:31:48,076 Vad som saknas, som vi har haft i alla andra exempel, hittills? 714 00:31:48,076 --> 00:31:51,599 715 00:31:51,599 --> 00:31:53,390 Retur är där, så det är något annat, 716 00:31:53,390 --> 00:31:54,440 att vi ska återkomma till inom kort. 717 00:31:54,440 --> 00:31:55,398 Vad som saknas, men? 718 00:31:55,398 --> 00:31:55,908 Yeah. 719 00:31:55,908 --> 00:31:58,150 >> Publiken: Den initiering av [OHÖRBAR]. 720 00:31:58,150 --> 00:31:58,470 >> David J MALAN: OK. 721 00:31:58,470 --> 00:31:58,980 Så ja. 722 00:31:58,980 --> 00:32:03,210 Så egentligen, är-- detta Tja, och räknevärdet initialiseras 723 00:32:03,210 --> 00:32:05,470 upp ovan, eller rättare sagt, förklarade upp ovan. 724 00:32:05,470 --> 00:32:06,960 Så det här är ett annat sätt att göra det. 725 00:32:06,960 --> 00:32:08,685 Men inte i ett led det gäller ändå. 726 00:32:08,685 --> 00:32:09,310 Vad sägs om här? 727 00:32:09,310 --> 00:32:10,196 >> Publiken: Är det klammerparenteserna? 728 00:32:10,196 --> 00:32:10,640 >> DAVID J MALAN: Ja. 729 00:32:10,640 --> 00:32:12,080 Så klammerparenteserna saknas. 730 00:32:12,080 --> 00:32:15,495 Men denna kod, menar jag, till heder, är faktiskt, syntaktiskt giltigt. 731 00:32:15,495 --> 00:32:17,610 Det visar sig, behöver du inte behöver klammerparenteserna 732 00:32:17,610 --> 00:32:21,691 om du bara har en kodrad som du vill köra insidan av slingan. 733 00:32:21,691 --> 00:32:24,190 Nu har vi alltid, i klassen och i alla våra distributionskoden, 734 00:32:24,190 --> 00:32:26,730 inkludera klammerparenteserna hur som helst, bara för tydlighetens skull. 735 00:32:26,730 --> 00:32:29,010 Men inser att i läroböcker och online exempel, 736 00:32:29,010 --> 00:32:31,300 Du kan mycket väl se lockigt hängslen saknas gång. 737 00:32:31,300 --> 00:32:34,850 Och det är OK, om vad du har indragna och avsedda 738 00:32:34,850 --> 00:32:38,650 är bara en enda rad kod, och inte flera rader kod, potentiellt. 739 00:32:38,650 --> 00:32:39,150 Okej. 740 00:32:39,150 --> 00:32:44,500 Så relaterad till frågan om vaghet är en fråga om överflöd, 741 00:32:44,500 --> 00:32:48,560 i den meningen att, på liknande sätt, har heltal har gränser för dem 742 00:32:48,560 --> 00:32:49,970 precis som flyttalsvärden? 743 00:32:49,970 --> 00:32:53,120 I världen en flyttals värderingar, kan vi bara vara så exakt, 744 00:32:53,120 --> 00:32:55,710 varefter, ibland dåliga saker kan hända, 745 00:32:55,710 --> 00:32:57,760 och våra program kan vara buggig och fel. 746 00:32:57,760 --> 00:33:00,050 Nu även med heltal, du kan stöta på problem. 747 00:33:00,050 --> 00:33:03,820 Nu ett heltal inte har en decimalkomma eller siffror efter den. 748 00:33:03,820 --> 00:33:07,130 Det är bara ett naturligt tal, typiskt. 749 00:33:07,130 --> 00:33:09,430 Så vad kan gå fel med en int? 750 00:33:09,430 --> 00:33:12,210 Om jag använder en int till räkna, vad kan gå fel? 751 00:33:12,210 --> 00:33:13,230 Verkar mycket enklare. 752 00:33:13,230 --> 00:33:13,873 Yeah. 753 00:33:13,873 --> 00:33:16,240 >> Publikmedlemmen: Om nummer får [OHÖRBAR] 754 00:33:16,240 --> 00:33:17,073 >> DAVID J MALAN: Ja. 755 00:33:17,073 --> 00:33:20,820 Vad händer om man räknar så högt, att du kan inte uttrycka det riktigt stora antal. 756 00:33:20,820 --> 00:33:21,320 Höger? 757 00:33:21,320 --> 00:33:23,910 Vid något tillfälle, du kommer överskrida gränserna 758 00:33:23,910 --> 00:33:27,077 av en 32-bitars värde, eller ett 64-bitars värde. 759 00:33:27,077 --> 00:33:29,410 Nu igen, jag är inte säker på hur man uttalar en 64-bitars värde, 760 00:33:29,410 --> 00:33:32,230 men jag vet med en 32-bitars heltal, det största värdet kan det vara, 761 00:33:32,230 --> 00:33:35,490 om det är enda positiva värden, är ungefär 4 miljarder. 762 00:33:35,490 --> 00:33:39,000 Så om jag försöker räkna till 5 miljarder, något som kommer att hända. 763 00:33:39,000 --> 00:33:41,050 Men låt oss se vad som i själva verket kan hända. 764 00:33:41,050 --> 00:33:44,570 I en värld av heltal överflöd, där du på sätt och vis, 765 00:33:44,570 --> 00:33:48,270 svämma kapaciteten hos en heltal, vad som kan hända? 766 00:33:48,270 --> 00:33:51,190 >> Så här är ett binärt tal, Det är en återgång till 0. 767 00:33:51,190 --> 00:33:54,630 Det är alla 1: or, och platshållare Det är befogenheter 2, 768 00:33:54,630 --> 00:33:55,980 så det är binärt. 769 00:33:55,980 --> 00:33:59,416 Så dessa är 8, 1 bitar på skärmen. 770 00:33:59,416 --> 00:34:01,290 Och om ni minns eller du snabbt och enkelt göra matten, 771 00:34:01,290 --> 00:34:06,074 vilket värde låter sig företrädas här med dessa åtta 1 bitar? 772 00:34:06,074 --> 00:34:06,950 255. 773 00:34:06,950 --> 00:34:09,260 Och även om du inte var helt säker av matematik, kan du göra det. 774 00:34:09,260 --> 00:34:10,550 Eller du kan bara typ förnuftets genom det, 775 00:34:10,550 --> 00:34:12,633 vänta en minut, om jag representerar ett 8 bitars värde, 776 00:34:12,633 --> 00:34:17,750 och jag har 256 möjliga värden, men av vilka den första är 0, 777 00:34:17,750 --> 00:34:19,909 Jag vet bara att det största kommer att bli 255, 778 00:34:19,909 --> 00:34:21,510 och det är vad detta skulle kunna vara. 779 00:34:21,510 --> 00:34:26,060 >> Så antar att jag försöker lägga till en till detta värde. 780 00:34:26,060 --> 00:34:28,750 Vad skulle du göra i lönegrad skolan när du lägger till en 1, och det 781 00:34:28,750 --> 00:34:31,139 inte riktigt passar på grund du måste bära en? 782 00:34:31,139 --> 00:34:34,380 Vad är detta nummer går att bli när du lägger en? 783 00:34:34,380 --> 00:34:37,030 Det kommer att bli 0. 784 00:34:37,030 --> 00:34:37,530 Höger? 785 00:34:37,530 --> 00:34:41,139 För om du hade mer bits-- och jag ska försöka, typ av, skriver den ut här-- 786 00:34:41,139 --> 00:34:44,710 om vi hade fler bitar, vad vi kan göra här är att lägga till en, 787 00:34:44,710 --> 00:34:47,370 och då skulle vi få detta. 788 00:34:47,370 --> 00:34:48,739 Hoppsan. 789 00:34:48,739 --> 00:34:52,250 Vi skulle ha en en bit ända hit. 790 00:34:52,250 --> 00:34:55,530 >> Men om det är en ändlig värde, det är bara 8 bitar, 791 00:34:55,530 --> 00:34:57,480 och det är förutbestämda av datorn, 792 00:34:57,480 --> 00:34:59,370 att en i själva verket är inte där. 793 00:34:59,370 --> 00:35:00,980 Det faller bara typ av från en klippa. 794 00:35:00,980 --> 00:35:05,480 Och så om du lägger till 1-255, vad värde ni tydligen få? 795 00:35:05,480 --> 00:35:06,180 0. 796 00:35:06,180 --> 00:35:09,700 Och så nummer misstag, och kanske oavsiktligt, 797 00:35:09,700 --> 00:35:12,040 sluta omslag runt så här. 798 00:35:12,040 --> 00:35:14,079 Så vad kan vara innebörden av detta? 799 00:35:14,079 --> 00:35:15,620 Tja, det finns ett par olika saker. 800 00:35:15,620 --> 00:35:18,751 Så man, det hamna ser som 0, oavsiktligt, 801 00:35:18,751 --> 00:35:20,750 men du kan typ av se, även i den verkliga världen, 802 00:35:20,750 --> 00:35:23,416 på gott och ont, manifestationer av denna idé om en gräns. 803 00:35:23,416 --> 00:35:26,630 Till exempel, någon av er som har någonsin spelat Lego Star Wars, 804 00:35:26,630 --> 00:35:28,880 Finns det någon som råkar veta det maximala antalet mynt 805 00:35:28,880 --> 00:35:32,032 kan du samla in Lego Star Wars? 806 00:35:32,032 --> 00:35:35,640 Ta en gissning baserad på dagens ledande frågor. 807 00:35:35,640 --> 00:35:39,140 Det är större än 256 eller 255. 808 00:35:39,140 --> 00:35:40,330 Det är 4 miljarder. 809 00:35:40,330 --> 00:35:42,080 Så visar det sig, och det finns vissa people-- 810 00:35:42,080 --> 00:35:46,080 några googling bekräftade förra night-- har fått 4 miljarder guldmynt, 811 00:35:46,080 --> 00:35:47,730 eller allt i Lego Star Wars. 812 00:35:47,730 --> 00:35:49,860 Skenbart, det finns ett sätt att lura spelet, 813 00:35:49,860 --> 00:35:53,222 det finns en bugg eller funktion låter dig att bara samla massor av poäng. 814 00:35:53,222 --> 00:35:54,930 Men den största möjliga värde, enligt 815 00:35:54,930 --> 00:35:58,360 denna skärmbild av någon jag hittat på nätet, är verkligen, 4 miljarder. 816 00:35:58,360 --> 00:35:59,240 >> Nu varför är det? 817 00:35:59,240 --> 00:36:03,040 Det är just 4 miljarder, förmodligen för att någon bestämde, 818 00:36:03,040 --> 00:36:05,500 som skrev det här spelet, att de kunde göra 4 miljarder, 819 00:36:05,500 --> 00:36:07,340 något, något, något, som det värde som jag satte upp 820 00:36:07,340 --> 00:36:10,256 med räknaren tidigare, men det är bara en lite renare för människor 821 00:36:10,256 --> 00:36:12,610 säga det maximala antalet av coins-- eller dubbar, 822 00:36:12,610 --> 00:36:14,860 som de kallar them-- att du kan samla är 4 miljarder. 823 00:36:14,860 --> 00:36:16,290 Och så, varför är detta? 824 00:36:16,290 --> 00:36:20,310 Hur är LEGO spelet genomförande räknaren 825 00:36:20,310 --> 00:36:23,420 som är att hålla reda på antal mynt du har? 826 00:36:23,420 --> 00:36:24,266 De använder vad? 827 00:36:24,266 --> 00:36:26,390 Publiken: Den stannar räkna efter 4 miljarder. 828 00:36:26,390 --> 00:36:27,720 DAVID J MALAN: Den stannar räkna efter 4 miljarder, 829 00:36:27,720 --> 00:36:29,525 vilket innebär att du kan sluta, som programmerare, 830 00:36:29,525 --> 00:36:31,960 att de är förmodligen med användning av en 32 bitars heltal. 831 00:36:31,960 --> 00:36:35,380 Liksom programmeraren bokstavligen bara maskinskriven, int, i hans eller hennes kod, 832 00:36:35,380 --> 00:36:39,620 och det är den typ av variabel som de använder för att lagra någon kod. 833 00:36:39,620 --> 00:36:42,230 Så det finns andra manifestationer av dessa typer av gränser. 834 00:36:42,230 --> 00:36:45,063 >> Så jag har inte spelat här game-- och jag läste upp på historien 835 00:36:45,063 --> 00:36:48,470 att bekräfta som much-- men i ursprungliga versionen av Civilization, där 836 00:36:48,470 --> 00:36:53,240 du uppenbarligen interagerar med varandra andra och kan föra krig eller ha fred, 837 00:36:53,240 --> 00:36:56,590 Gandhi var tänkt att vara en av de mest fridfulla tecken, som jag 838 00:36:56,590 --> 00:36:59,280 förstår det, i första version of Civilization. 839 00:36:59,280 --> 00:37:03,250 Och faktiskt, på en skala från 1 till 10, hans aggressivitet var bara en. 840 00:37:03,250 --> 00:37:05,620 Så någonsin så milt aggressiv, tydligen. 841 00:37:05,620 --> 00:37:11,590 >> Men någon gång, kan du tydligen installera demokrati i geografi. 842 00:37:11,590 --> 00:37:14,900 Och om du installerar demokrati i din version av spelet, 843 00:37:14,900 --> 00:37:17,320 då din aggressionsnivå går ner. 844 00:37:17,320 --> 00:37:18,460 Det är en bra sak. 845 00:37:18,460 --> 00:37:20,890 Människor är mer lugn tydligen, i den situationen. 846 00:37:20,890 --> 00:37:23,190 Men uppenbarligen gjorde någon inte ha en, om, tillstånd 847 00:37:23,190 --> 00:37:24,780 i den ursprungliga versionen av koden. 848 00:37:24,780 --> 00:37:30,650 >> Så Gandhis aggressionsnivå gick från positiva 1, minus 2, -1, 849 00:37:30,650 --> 00:37:33,840 men spelet inte förstå negativa tal. 850 00:37:33,840 --> 00:37:38,680 Så vad hände var Gandhis aggression nivå gick från 1 till 0 till -1, 851 00:37:38,680 --> 00:37:40,900 vilket fick till följd att omslag runt till vara 852 00:37:40,900 --> 00:37:44,690 den mest aggressiva karaktär i spelet, till ett värde av 255, 853 00:37:44,690 --> 00:37:46,630 på en skala från en till tio. 854 00:37:46,630 --> 00:37:49,887 Och sedan dess har det varit fler inkarnationer av detta spel, 855 00:37:49,887 --> 00:37:51,720 och de har hållit det som ett slags påskägg, 856 00:37:51,720 --> 00:37:53,870 att Gandhi är tydligen så fruktansvärt aggressiv. 857 00:37:53,870 --> 00:37:56,740 Men det var ett resultat av en mycket enkelt fel programmering 858 00:37:56,740 --> 00:37:58,630 att mycket tidig version av spelet. 859 00:37:58,630 --> 00:38:02,860 >> Nu mer oroväckande mer nyligen, Boeing 787 860 00:38:02,860 --> 00:38:05,720 dokumenterades ha en bugg, inte den typ av enhet 861 00:38:05,720 --> 00:38:07,340 du särskilt vill ha en bugg. 862 00:38:07,340 --> 00:38:10,130 Och symptomen, att jag ska läsa här, från en artikel på nätet, 863 00:38:10,130 --> 00:38:13,840 var detta en modell 787 flygplan som har kontinuerligt kraftförsörjd 864 00:38:13,840 --> 00:38:18,030 för 248 dagar kan förlora alla växelström, AC, 865 00:38:18,030 --> 00:38:20,850 elkraft, på grund av generatorstyrenheterna, 866 00:38:20,850 --> 00:38:23,330 GCUs, samtidigt gå in Felsäkert läge. 867 00:38:23,330 --> 00:38:26,790 Så det här var en varning när problemet upptäcktes. 868 00:38:26,790 --> 00:38:28,750 Detta tillstånd orsakas av en mjukvaruräknare, 869 00:38:28,750 --> 00:38:32,230 interna för GCUs, så ett heltal eller en variabel, 870 00:38:32,230 --> 00:38:36,850 som kommer svämma över efter 248 dagars kontinuerlig effekt. 871 00:38:36,850 --> 00:38:40,350 Boeing är i färd med att utveckla en uppgradering GCU programvara som 872 00:38:40,350 --> 00:38:42,350 kommer att avhjälpa risksituationen. 873 00:38:42,350 --> 00:38:44,226 >> Så mycket som missilen scenario vari 874 00:38:44,226 --> 00:38:46,850 de hade någon form av rörlig som räknade, och räkna, 875 00:38:46,850 --> 00:38:50,720 och räkna, men så småningom överfulla gränserna för sin förmåga, 876 00:38:50,720 --> 00:38:54,890 liknande gjorde jävla flygplan ha en variabel spill 877 00:38:54,890 --> 00:38:56,410 efter tillräckligt med tid att köra. 878 00:38:56,410 --> 00:38:59,240 Och så tungan i kinden sätt att arbeta runt det här problemet 879 00:38:59,240 --> 00:39:04,400 är att verkligen, starta din plan varje 247 dagar, så att minnet blir torkas 880 00:39:04,400 --> 00:39:06,100 och variabeln går tillbaka till 0. 881 00:39:06,100 --> 00:39:09,410 Men inser, är detta en mycket stora inkarnation av programvara, 882 00:39:09,410 --> 00:39:14,070 men framför allt som vi hör om Apples operativsystem går in i bilar, 883 00:39:14,070 --> 00:39:18,030 och själv kör bilar från Google, och valfritt antal inkarnationer av programvara 884 00:39:18,030 --> 00:39:21,000 i våra dagliga liv, TV och klockor, och mer, 885 00:39:21,000 --> 00:39:24,950 inser var omgiven av programvara, alla som är skriven av oss människor. 886 00:39:24,950 --> 00:39:28,150 >> Och som vi kommer alla snart att upptäcka, det är mycket lätt och mycket typiskt 887 00:39:28,150 --> 00:39:30,250 att göra misstag när du skriver mjukvara. 888 00:39:30,250 --> 00:39:32,745 Och om du inte fånga dem, några dåliga saker kan hända. 889 00:39:32,745 --> 00:39:35,400 Nu ibland, vissa roliga saker kan hända, 890 00:39:35,400 --> 00:39:38,280 eller åtminstone ibland vi veta att förvänta sig vissa dålighet. 891 00:39:38,280 --> 00:39:41,550 Så 0 dividerat med 0, från årskurs skola, är i allmänhet en dålig sak. 892 00:39:41,550 --> 00:39:43,050 Det är odefinierad. 893 00:39:43,050 --> 00:39:46,440 Och det visar out-- och låt oss se om min mic kan plocka up-- att Apple 894 00:39:46,440 --> 00:39:47,790 hade lite kul med detta nyligen. 895 00:39:47,790 --> 00:39:48,850 Så jag har en iPhone här. 896 00:39:48,850 --> 00:39:54,160 Jag ska prata med Siri och be henne att ge mig svar på 0 dividerat med 0. 897 00:39:54,160 --> 00:39:55,850 Vad är 0 dividerat med 0? 898 00:39:55,850 --> 00:39:59,350 899 00:39:59,350 --> 00:40:02,230 >> SIRI: Tänk dig att du har 0 cookies, och du dela upp dem jämnt 900 00:40:02,230 --> 00:40:03,540 bland 0 vänner. 901 00:40:03,540 --> 00:40:05,810 Hur många kakor gör varje person få? 902 00:40:05,810 --> 00:40:06,350 Ser ni? 903 00:40:06,350 --> 00:40:07,660 Det är inte vettigt. 904 00:40:07,660 --> 00:40:10,540 Och Cookie Monster är ledsen att det inte finns några cookies. 905 00:40:10,540 --> 00:40:13,987 Och du är ledsen att du har inga vänner. 906 00:40:13,987 --> 00:40:15,570 DAVID J MALAN: Det är typ av motbjudande. 907 00:40:15,570 --> 00:40:17,550 Så det här är vad som just sagt där. 908 00:40:17,550 --> 00:40:21,380 Det är obestämt, det är inte definierat, Och faktiskt, många programmeringsspråk 909 00:40:21,380 --> 00:40:24,950 eller, egentligen, kompilatorer kommer upptäcka när du i ett program, 910 00:40:24,950 --> 00:40:27,050 Försök att dela 0 av 0. 911 00:40:27,050 --> 00:40:29,830 Roligare än så här är dock som tydligen, Cookie Monster 912 00:40:29,830 --> 00:40:31,270 är på Twitter dessa dagar. 913 00:40:31,270 --> 00:40:37,610 Och han svarade på detta, med detta, vilket är helt bedårande. 914 00:40:37,610 --> 00:40:40,110 Men låt oss ta en snabb titt på ett par andra konstruktioner, 915 00:40:40,110 --> 00:40:43,459 och sedan lägga en del av detta kod att använda i bra sätt. 916 00:40:43,459 --> 00:40:45,250 Så visar det sig, förutom för loopar, det finns 917 00:40:45,250 --> 00:40:49,174 något som kallas en while-slinga, som ser annorlunda ut och genomförs 918 00:40:49,174 --> 00:40:51,590 lite differently-- och vi så småningom kommer att se examples-- 919 00:40:51,590 --> 00:40:53,500 men i någon mening, Det är enklare eftersom det 920 00:40:53,500 --> 00:40:56,670 inte tillåter dig att initiera och uppdateras inom gränsen av slingan. 921 00:40:56,670 --> 00:40:57,794 Du kan fortfarande genomföra det. 922 00:40:57,794 --> 00:41:01,219 Så du kan göra exakt samma saker med en while-slinga, som med en for-loop, 923 00:41:01,219 --> 00:41:03,260 men din syntax, ultimately-- som vi kommer så småningom 924 00:41:03,260 --> 00:41:04,551 see-- kommer att vara annorlunda. 925 00:41:04,551 --> 00:41:07,450 Det finns även en gör while-slinga, som är faktiskt lite annorlunda, 926 00:41:07,450 --> 00:41:09,640 i att medan en for-slinga och en while-slinga alltid 927 00:41:09,640 --> 00:41:13,005 kontrollera deras tillstånd först, om du läser det här uppifrån och ned, 928 00:41:13,005 --> 00:41:16,440 det slags ser ut som det kommer att kolla upp det tillstånd sista eftersom det är 929 00:41:16,440 --> 00:41:17,910 verkligen den sista raden i koden. 930 00:41:17,910 --> 00:41:20,580 Och faktiskt, det kommer att vara till nytta i vissa program som vi skriver, 931 00:41:20,580 --> 00:41:23,746 Om du vill bara blint göra något och så småningom kontrollera tillståndet. 932 00:41:23,746 --> 00:41:25,205 Det är inte nödvändigtvis en dålig sak. 933 00:41:25,205 --> 00:41:27,912 Om vi ​​vill variabler, kan vi göra den i ett par olika sätt. 934 00:41:27,912 --> 00:41:30,290 Och vi såg i foxtrot tecknad film, ett sätt att göra det, 935 00:41:30,290 --> 00:41:33,400 där du deklarerar din variabel, liknande int räknare semikolon, 936 00:41:33,400 --> 00:41:36,570 och sedan later-- kanske nästa line, kanske 10 rader later-- 937 00:41:36,570 --> 00:41:37,800 du faktiskt initiera det. 938 00:41:37,800 --> 00:41:42,230 Så dessa 2 kodrader deklarera en variabel av typen int 939 00:41:42,230 --> 00:41:44,930 och kallar det disk, så det ger mig tillräckligt många bitar för att hålla en int. 940 00:41:44,930 --> 00:41:48,230 Och sedan så småningom, uttrycker det värdet 0 till den variabeln. 941 00:41:48,230 --> 00:41:51,250 Det anordnar 0 s och 1 s i en mönster, som vi vet från förra veckan, 942 00:41:51,250 --> 00:41:53,260 representerar antalet vi känner som 0. 943 00:41:53,260 --> 00:41:56,920 Eller ärligt talat, kan du göra det mycket mer koncist, precis som detta. 944 00:41:56,920 --> 00:41:59,390 >> Nu har vi också möjligheten att ringa funktioner. 945 00:41:59,390 --> 00:42:03,070 Och i själva verket, här är en 2 rad programmet, eller ett utdrag därav, 946 00:42:03,070 --> 00:42:06,157 som tillåter oss att faktiskt skriva lite kod som 947 00:42:06,157 --> 00:42:08,990 får en sträng från user-- mycket som vår volontär en stund ago-- 948 00:42:08,990 --> 00:42:11,320 lagring av resultatet i en variabel som heter namn, 949 00:42:11,320 --> 00:42:15,470 och then-- mycket som med vår volontär med printf-- skriver ut dessa värden 950 00:42:15,470 --> 00:42:19,180 genom att i två argument, den sträng, följt av den variabla 951 00:42:19,180 --> 00:42:20,781 kallas, namn, själv. 952 00:42:20,781 --> 00:42:23,155 Så låt oss ta en titt, innan vi kommer tillbaka till Mario där, 953 00:42:23,155 --> 00:42:26,010 på ett par nu, exempel på detta. 954 00:42:26,010 --> 00:42:30,537 >> Jag kommer att gå vidare och öppna upp, låt oss säga, funktions 0.c. 955 00:42:30,537 --> 00:42:33,120 Och som alltid, är denna kod tillgänglig på kursens hemsida, 956 00:42:33,120 --> 00:42:35,660 så du kan spela tillsammans på hem och titta på det senare. 957 00:42:35,660 --> 00:42:40,400 Men här är programmet i sin huvudsak från linjen 17-22. 958 00:42:40,400 --> 00:42:43,270 Huvudprogrammet är där Programmet kommer alltid att starta. 959 00:42:43,270 --> 00:42:46,980 Detta program, tydligen går att skriva ut ditt namn, kolon. 960 00:42:46,980 --> 00:42:50,320 Det är sedan kommer att ringa getString, precis som vi gjorde med våra volontärer. 961 00:42:50,320 --> 00:42:53,365 Och då är det intressant, det kommer att ringa PrintName. 962 00:42:53,365 --> 00:42:56,490 Det visar sig, hela tiden, det verkar vara en funktion som kallas PrintName. 963 00:42:56,490 --> 00:42:57,614 Det skriver någons namn. 964 00:42:57,614 --> 00:43:01,210 Vi behövde inte använda printf från förr, det finns PrintName. 965 00:43:01,210 --> 00:43:03,500 >> Men det är vilseledande eftersom PrintName inte 966 00:43:03,500 --> 00:43:06,760 komma med C. Människor inte uppfinna det cirka 40 eller 50 år sedan, 967 00:43:06,760 --> 00:43:07,990 Jag gjorde i stället. 968 00:43:07,990 --> 00:43:10,330 Och faktiskt, om jag rullar ned ytterligare, märka 969 00:43:10,330 --> 00:43:14,200 hur jag kan skriva min egen funktioner i C. Vi ska så småningom 970 00:43:14,200 --> 00:43:16,319 förklara varför vi fortsätter att säga, tomrum, på ett par ställen, 971 00:43:16,319 --> 00:43:18,110 men för i dag, låt oss titta bara på namnet. 972 00:43:18,110 --> 00:43:20,905 >> På rad 24, om du vill skapa din egen funktion, 973 00:43:20,905 --> 00:43:22,780 du bokstavligen skriver namn på funktionen. 974 00:43:22,780 --> 00:43:24,340 Jag valde PrintName. 975 00:43:24,340 --> 00:43:26,159 Inom parentes, du ange vilken typ 976 00:43:26,159 --> 00:43:28,450 ingångar, och hur många du vill denna funktion för att ta. 977 00:43:28,450 --> 00:43:31,906 I det här fallet, jag vill ta 1 variabel kallad, namn, 978 00:43:31,906 --> 00:43:34,030 och det kommer att vara av typ, sträng, så det kommer 979 00:43:34,030 --> 00:43:35,780 att vara någon sekvens av tecken. 980 00:43:35,780 --> 00:43:39,170 Och sedan, detta program-- ungefär som i Scratch, 981 00:43:39,170 --> 00:43:42,590 du kan ha egna pussel pieces-- kommer att ha detta beställnings- beteende. 982 00:43:42,590 --> 00:43:46,760 Det kommer att kalla printf passerar, hej, platshållare, 983 00:43:46,760 --> 00:43:49,110 och sedan det kommer att ansluta oavsett i vilken användaren kallas. 984 00:43:49,110 --> 00:43:51,450 >> Så detta är ett exempel på vad datavetare skulle 985 00:43:51,450 --> 00:43:55,090 samtals abstraktion eller funktionella nedbrytning, som är bara 986 00:43:55,090 --> 00:43:58,110 tjusiga sätt av saying-- är om du gillar denna höga nivå idé, 987 00:43:58,110 --> 00:44:01,569 som jag vill ha funktioner som skriver någons namn, absolut du 988 00:44:01,569 --> 00:44:04,360 kan bokstavligen skriva printf och sedan passera i de argument som du vill, 989 00:44:04,360 --> 00:44:07,340 och programmet kommer att fungera, eftersom det har sedan onsdagen. 990 00:44:07,340 --> 00:44:10,510 Men du kan börja abstrakt bort begreppet skriva ut ett namn. 991 00:44:10,510 --> 00:44:13,270 Du kan ge den ett namn, liknande PrintName, och detta 992 00:44:13,270 --> 00:44:15,280 är denna idé om skiktning från vecka 0. 993 00:44:15,280 --> 00:44:19,910 >> Hädanefter, jag och du behöver inte veta eller bryr sig om hur PrintName genomförs. 994 00:44:19,910 --> 00:44:22,470 Ja det använder printf, kanske det inte, vem vet vad använder? 995 00:44:22,470 --> 00:44:23,410 Vem bryr sig? 996 00:44:23,410 --> 00:44:26,034 Nu jag talar här uppe, i stället för här nere. 997 00:44:26,034 --> 00:44:28,700 Och faktiskt, som våra program får mer avancerade och sofistikerade, 998 00:44:28,700 --> 00:44:32,550 vi kommer att fortsätta att ta för givet att lägre nivå pusselbitar finns. 999 00:44:32,550 --> 00:44:34,780 Eftersom vi skrev dem eller någon annan gjorde det, så 1000 00:44:34,780 --> 00:44:36,910 som vi sedan kan bygga vidare på dem. 1001 00:44:36,910 --> 00:44:39,430 Låt oss ta en titt på denna varianten, fungerar en. 1002 00:44:39,430 --> 00:44:41,780 >> Så här är lite mer avancerad, men det visar sig 1003 00:44:41,780 --> 00:44:44,570 att CS50 bibliotek, det finns bara en getInt funktion. 1004 00:44:44,570 --> 00:44:47,720 Vi trodde inte att, år sedan, implementera en GetPositiveInt funktion. 1005 00:44:47,720 --> 00:44:50,970 Och det är lite irriterande eftersom om ni skriver ett program där 1006 00:44:50,970 --> 00:44:53,325 du vill få en positiv heltal från användaren, 1007 00:44:53,325 --> 00:44:55,010 Du kan absolut använda getInt. 1008 00:44:55,010 --> 00:44:57,840 Och du kan absolut kolla med tillståndet och kanske en slinga 1009 00:44:57,840 --> 00:45:00,320 om det int är större än 0 och skrika åt användaren 1010 00:45:00,320 --> 00:45:02,699 om han eller hon inte ger du ett positivt tal. 1011 00:45:02,699 --> 00:45:04,740 Men låt oss bygga denna byggsten oss, a, 1012 00:45:04,740 --> 00:45:06,555 anpassade Scratch pjäs, om ni så vill. 1013 00:45:06,555 --> 00:45:08,680 Jag kommer att ha ett program här som i slutändan, jag 1014 00:45:08,680 --> 00:45:11,780 vill kunna ringa GetPositiveInt, och jag vill vara 1015 00:45:11,780 --> 00:45:14,200 kunna skriva ut vad det int är. 1016 00:45:14,200 --> 00:45:16,240 Men detta abstraherat bort nu. 1017 00:45:16,240 --> 00:45:19,050 Det är precis fått en hög nivå namn som säger vad den gör, 1018 00:45:19,050 --> 00:45:21,780 vilket är underbart eftersom det är mycket intuitivt nu att läsa. 1019 00:45:21,780 --> 00:45:24,710 Och om jag bryr vad som finns under huven, låt mig rulla nedåt. 1020 00:45:24,710 --> 00:45:27,140 Och det är lite skrämmande i början, särskilt 1021 00:45:27,140 --> 00:45:29,470 Om detta är ditt första programmet, men låt oss ta en titt. 1022 00:45:29,470 --> 00:45:32,860 >> Jag säger inte längre, utan laga kraft, eftersom det visar sig funktioner 1023 00:45:32,860 --> 00:45:34,777 ungefär som getString, kan returnera ett värde för mig. 1024 00:45:34,777 --> 00:45:36,610 De har inte bara skriva ut till skärmen, 1025 00:45:36,610 --> 00:45:38,410 de faktiskt kan lämna mig något tillbaka. 1026 00:45:38,410 --> 00:45:41,535 Och medan tidigare PrintName, Jag behövde något tillbaka. 1027 00:45:41,535 --> 00:45:44,160 Jag behövde bieffekt av något dyker upp på skärmen, 1028 00:45:44,160 --> 00:45:46,570 men jag behövde inte en människa att ge mig något tillbaka. 1029 00:45:46,570 --> 00:45:48,840 Här, med GetPositiveInt, liknande med getInt, 1030 00:45:48,840 --> 00:45:50,640 Jag vill lämnas något tillbaka. 1031 00:45:50,640 --> 00:45:53,220 Så jag säger inte, utan laga kraft, på ledningen 23, men int, 1032 00:45:53,220 --> 00:45:55,570 som säger, denna funktion att jag skriver, 1033 00:45:55,570 --> 00:45:58,860 kallas GetPositiveInt kommer att lämna mig tillbaka ett heltal, inte ingenting, 1034 00:45:58,860 --> 00:45:59,890 inte ogiltiga. 1035 00:45:59,890 --> 00:46:03,280 >> Samtidigt kommer det att ta några ingångar, så jag har, typ av vände det. 1036 00:46:03,280 --> 00:46:08,280 Jag tänker inte ge GetPositiveInt någon input, vill jag att ge mig sin produktion. 1037 00:46:08,280 --> 00:46:09,800 Och vad händer nu? 1038 00:46:09,800 --> 00:46:11,640 Så här är hur jag kan deklarera en variabel. 1039 00:46:11,640 --> 00:46:15,090 Jag har gjort det utanför slingan, av skäl som vi så småningom kommer att se, 1040 00:46:15,090 --> 00:46:17,700 men detta ger bara mig 32 bitar kallas, n, 1041 00:46:17,700 --> 00:46:20,952 och jag har för-bestämning dem för att lagra heltal. 1042 00:46:20,952 --> 00:46:23,660 Och här är det, göra medan konstruktionen, och det är därför det är nyttigt. 1043 00:46:23,660 --> 00:46:26,700 Bokstavligen gör detta, medan n är mindre än 1. 1044 00:46:26,700 --> 00:46:28,030 Så låt oss se vad som händer. 1045 00:46:28,030 --> 00:46:30,760 Jag skriver ut, vänligen ge mig en positiv int. 1046 00:46:30,760 --> 00:46:34,300 Jag får då en int, användning av CS50: s fungera och lagras i n. 1047 00:46:34,300 --> 00:46:38,990 >> Och då, vad kodrad förmodligen blir verk nästa logiskt? 1048 00:46:38,990 --> 00:46:41,890 Vilken linje nummer? 1049 00:46:41,890 --> 00:46:42,571 Ja, så 31. 1050 00:46:42,571 --> 00:46:45,320 Du skulle inte veta det förrän du har fått höra eller sorts sluta det, 1051 00:46:45,320 --> 00:46:45,986 men det är sant. 1052 00:46:45,986 --> 00:46:48,280 Det går uppifrån och ned och sedan fortsätter att upprepa. 1053 00:46:48,280 --> 00:46:55,840 Så om jag har skrivit i säga, antalet -1, är n mindre än -1? 1054 00:46:55,840 --> 00:46:56,340 Yeah. 1055 00:46:56,340 --> 00:46:58,470 Eftersom -1 är mindre än 1. 1056 00:46:58,470 --> 00:46:59,510 Så vad ska hända? 1057 00:46:59,510 --> 00:47:03,260 Jag kommer att göra detta medan n är mindre än 1, 1058 00:47:03,260 --> 00:47:05,760 så jag kommer att gå tillbaka till linje 28. 1059 00:47:05,760 --> 00:47:09,530 >> Och varje time-- och låt oss köra this-- gör funktion 1 att kompilera det, 1060 00:47:09,530 --> 00:47:11,340 och nu dot slash funktion 1. 1061 00:47:11,340 --> 00:47:14,280 Om jag skriver -1, är det kommer att hålla yelling på mig 1062 00:47:14,280 --> 00:47:17,530 tills jag samarbetar eftersom varje mina ingångar är mindre än 1 1063 00:47:17,530 --> 00:47:20,070 och om det är, medan mindre än 1, Jag kommer att fortsätta att göra detta. 1064 00:47:20,070 --> 00:47:24,240 Om jag äntligen ge det ett antal som 50, tack och lov, säger det, tack för 50. 1065 00:47:24,240 --> 00:47:24,970 Varför? 1066 00:47:24,970 --> 00:47:30,640 Eftersom så snart n inte är mindre än 1, jag slutar fastnar i denna slinga, 1067 00:47:30,640 --> 00:47:33,840 och denna nya sökord i dag, avkastning, bokstavligen gör det. 1068 00:47:33,840 --> 00:47:36,800 Så jag har bara genomförts i ett avkänning, motsvarande getString, 1069 00:47:36,800 --> 00:47:40,590 där jag lämna tillbaka vem använder mig, visst värde. 1070 00:47:40,590 --> 00:47:42,820 Det behöver inte vara en sträng, det är en int. 1071 00:47:42,820 --> 00:47:44,990 Så ett enkelt, snabbt exempel, men vi ska snart 1072 00:47:44,990 --> 00:47:47,930 se lite mer sofistikerade versioner fortfarande. 1073 00:47:47,930 --> 00:47:53,882 I själva verket, låt oss ta en titt på en numerisk en, som kallas return.c. 1074 00:47:53,882 --> 00:47:55,590 Och den här är faktiskt lite enklare. 1075 00:47:55,590 --> 00:47:59,010 Så det här programmets syfte i life-- låt oss kompilera och köra den, 1076 00:47:59,010 --> 00:48:03,090 så gör retur, dot snedstreck, return-- meddelande 1077 00:48:03,090 --> 00:48:05,530 Programmet kuber helt enkelt värdet 2. 1078 00:48:05,530 --> 00:48:08,410 Det är ganska dumt, är det svårt koden, tar det inte några insatsvaror, 1079 00:48:08,410 --> 00:48:12,220 men det visar en annan funktion som jag har skrivit själv. 1080 00:48:12,220 --> 00:48:15,760 Så här har jag förklarade en variabel, kallad x, av typen int, 1081 00:48:15,760 --> 00:48:17,840 lika med antalet två, helt godtycklig. 1082 00:48:17,840 --> 00:48:19,530 Detta är bara några fluffig utskrift. 1083 00:48:19,530 --> 00:48:23,070 Det säger x är nu, sådana och sådan, cubing dot dot dot. 1084 00:48:23,070 --> 00:48:26,390 Och magi är uppenbarligen i linje 21. 1085 00:48:26,390 --> 00:48:30,120 Jag ringer en funktion som kallas, kub, Jag överlämnar det ett pappersark 1086 00:48:30,120 --> 00:48:32,890 med nummer 2 skrivet på det, och vilket värde, matematiskt, 1087 00:48:32,890 --> 00:48:34,860 vill jag få ut av det? 1088 00:48:34,860 --> 00:48:36,570 Precis som en sanity check? 1089 00:48:36,570 --> 00:48:37,070 8. 1090 00:48:37,070 --> 00:48:37,570 Höger? 1091 00:48:37,570 --> 00:48:40,160 Jag vill 2 kubik tillbaka, 2 till makt 3, så 8 tillbaka. 1092 00:48:40,160 --> 00:48:42,570 >> Så där kub genomförs? 1093 00:48:42,570 --> 00:48:44,349 Tja, märker det genomförs här nere. 1094 00:48:44,349 --> 00:48:47,140 Och precis som tidigare, logiskt, även om syntaxen är förmodligen 1095 00:48:47,140 --> 00:48:49,320 mycket nytt för många av er, Jag vill ha den här funktionen 1096 00:48:49,320 --> 00:48:51,780 att lämna mig tillbaka ett ark papper med en int på det. 1097 00:48:51,780 --> 00:48:53,990 Så jag har en int, den Namnet är godtyckligt, 1098 00:48:53,990 --> 00:48:55,530 men bekvämt kallas kub. 1099 00:48:55,530 --> 00:48:58,430 Insignalen till det, är n från typ heltal, så det är 1100 00:48:58,430 --> 00:49:00,800 hur jag kan gå i antalet 2 på ett pappersark. 1101 00:49:00,800 --> 00:49:03,910 Och då visar det sig C stöder matematik, så att du inte har kryssen för tider, 1102 00:49:03,910 --> 00:49:06,680 du bara använda en asterisk för multiplikation. 1103 00:49:06,680 --> 00:49:11,070 Och detta åter n gånger n gånger n, vilket helt enkelt är en kubik värde. 1104 00:49:11,070 --> 00:49:12,840 >> Så vart är vi på väg med allt detta? 1105 00:49:12,840 --> 00:49:14,570 Detta är definitivt en virvlande tur, vara säker, 1106 00:49:14,570 --> 00:49:16,410 att i super avsnitten och problem set 1, 1107 00:49:16,410 --> 00:49:18,368 du kommer att gått igenom allt detta desto mer. 1108 00:49:18,368 --> 00:49:22,490 Och problemet set 1, kommer vi övergången från den grafiska värld Scratch 1109 00:49:22,490 --> 00:49:25,640 till något mer kommandorad i C. Men vi ska dra inspiration 1110 00:49:25,640 --> 00:49:27,680 från detta här spelet från förr, varvid 1111 00:49:27,680 --> 00:49:31,591 med C och standard upplagan av p set du genomföra Mario pyramid. 1112 00:49:31,591 --> 00:49:34,340 Och i hacker upplagan av p set, om du så önskar att välja, 1113 00:49:34,340 --> 00:49:38,280 du kommer att genomföra en lite mer utmanande pyramid med två toppar. 1114 00:49:38,280 --> 00:49:41,239 Du kommer också att genomföra ett algoritm, en girig algoritm. 1115 00:49:41,239 --> 00:49:43,030 Det visar sig att det finns några intressanta logik 1116 00:49:43,030 --> 00:49:45,640 bakom processen för kör en bankväxel station 1117 00:49:45,640 --> 00:49:47,410 och faktiskt lämna någon tillbaka förändring. 1118 00:49:47,410 --> 00:49:50,410 Det är en algoritm som är ganska okomplicerad, att du kan även 1119 00:49:50,410 --> 00:49:53,576 förstå intuitivt när du först läste det-- inse det är vad jag har alltid 1120 00:49:53,576 --> 00:49:57,110 gjort någon gång jag har gett någon del pengar back-- som gör att du alltid 1121 00:49:57,110 --> 00:50:00,679 minimera antalet papper anteckningar eller metallmynt 1122 00:50:00,679 --> 00:50:02,220 att du lämna tillbaka till användaren. 1123 00:50:02,220 --> 00:50:04,610 Och detta, naturligtvis, är övertygande eftersom om du går till CVS eller whatnot, 1124 00:50:04,610 --> 00:50:06,430 du inte vill ska överlämnas en massa ettor 1125 00:50:06,430 --> 00:50:07,596 eller en hel massa småpengar. 1126 00:50:07,596 --> 00:50:10,120 Du vill ha den mest få mynt, förmodligen möjligt. 1127 00:50:10,120 --> 00:50:13,070 >> Slutligen kommer du även ifrågasättas att plaska i världen av vatten 1128 00:50:13,070 --> 00:50:17,220 och faktiskt få en uppskattning för en avbildning mellan strömningshastigheter, 1129 00:50:17,220 --> 00:50:19,890 av vilja, vatten i en dusch, hur mycket vatten som används. 1130 00:50:19,890 --> 00:50:22,640 Och anspelning däri, blir klippet här, 1131 00:50:22,640 --> 00:50:24,840 som vi kommer att hamna på för bara 60 sekunder att 1132 00:50:24,840 --> 00:50:29,070 målar upp en bild av låga flöden duschmunstycken. 1133 00:50:29,070 --> 00:50:30,886 >> [VIDEOAVSPELNING] 1134 00:50:30,886 --> 00:50:31,385 -Okej. 1135 00:50:31,385 --> 00:50:32,774 Jag fick allt här. 1136 00:50:32,774 --> 00:50:35,800 Jag fick Cyclone F-serien, Hydra, Jetflow, Stockholm 1137 00:50:35,800 --> 00:50:37,660 Supersteam, you name it. 1138 00:50:37,660 --> 00:50:39,265 >> -Och Vad rekommenderar ni? 1139 00:50:39,265 --> 00:50:40,460 >> -Vad letar du efter? 1140 00:50:40,460 --> 00:50:41,300 >> -Power Människa. 1141 00:50:41,300 --> 00:50:42,285 Ström. 1142 00:50:42,285 --> 00:50:42,910 -Som Silkwood. 1143 00:50:42,910 --> 00:50:44,520 -Det Är för strålning. 1144 00:50:44,520 --> 00:50:46,335 -Det är rätt. 1145 00:50:46,335 --> 00:50:48,275 -Nu Vad är detta? 1146 00:50:48,275 --> 00:50:49,704 -Det Är Commando 450. 1147 00:50:49,704 --> 00:50:50,620 Jag säljer inte att en. 1148 00:50:50,620 --> 00:50:51,700 >> -Men Det är vad vi vill ha. 1149 00:50:51,700 --> 00:50:52,680 Det är en commando 450. 1150 00:50:52,680 --> 00:50:53,882 >> -Nej Tro mig. 1151 00:50:53,882 --> 00:50:55,090 Det är endast i cirkusen. 1152 00:50:55,090 --> 00:50:56,512 Det är för elefanter. 1153 00:50:56,512 --> 00:50:59,356 >> -Jag Betala något. 1154 00:50:59,356 --> 00:51:01,252 >> -Vad Om Jerry? 1155 00:51:01,252 --> 00:51:02,760 >> -Han Kunde inte hantera det. 1156 00:51:02,760 --> 00:51:04,910 Han är känslig. 1157 00:51:04,910 --> 00:51:05,750 Oh yeah. 1158 00:51:05,750 --> 00:51:36,737 1159 00:51:36,737 --> 00:51:37,320 [END SPELA] 1160 00:51:37,320 --> 00:51:37,700 DAVID J MALAN: Okej. 1161 00:51:37,700 --> 00:51:38,820 Det är om för CS50. 1162 00:51:38,820 --> 00:51:40,050 Vi ses nästa vecka. 1163 00:51:40,050 --> 00:51:45,910 1164 00:51:45,910 --> 00:51:49,029 >> TALARE 1: [? Scully?], [? Ian,?] såvitt denna outro projekt, 1165 00:51:49,029 --> 00:51:50,362 vad har ni kommit fram till? 1166 00:51:50,362 --> 00:51:51,990 >> TALARE 2: Jo, vi har gett det en mängd tanke 1167 00:51:51,990 --> 00:51:53,250 och vi anser att det bästa sättet att-- 1168 00:51:53,250 --> 00:51:53,660 >> TALARE 3: Får jag? 1169 00:51:53,660 --> 00:51:54,326 >> TALARE 2: Ja. 1170 00:51:54,326 --> 00:51:56,360 Med alla medel, faktiskt. 1171 00:51:56,360 --> 00:51:59,425 >> TALARE 3: Så jag tror Vi kan sammanfatta vår idé 1172 00:51:59,425 --> 00:52:05,450 för outros med en word-- ingenting. 1173 00:52:05,450 --> 00:52:08,950 1174 00:52:08,950 --> 00:52:10,409 >> DAVID J MALAN: Ingenting? 1175 00:52:10,409 --> 00:52:11,200 TALARE 3: Ingenting. 1176 00:52:11,200 --> 00:52:12,990 DAVID J MALAN: Vad betyder det? 1177 00:52:12,990 --> 00:52:16,260 TALARE 3: outros är ingenting. 1178 00:52:16,260 --> 00:52:21,720 TALARE 2: Tja, jag menar, i filosofi, Jag menar, är ingenting alltid något. 1179 00:52:21,720 --> 00:52:24,200 TALARE 1: Så what's-- Vad är förutsättningen? 1180 00:52:24,200 --> 00:52:25,720 TALARE 3: Så det är som livet. 1181 00:52:25,720 --> 00:52:26,680 OK. 1182 00:52:26,680 --> 00:52:28,294 Vad har du gjort idag? 1183 00:52:28,294 --> 00:52:31,811 >> DAVID J MALAN: Jag fick upp, hade frukost, och kom att arbeta. 1184 00:52:31,811 --> 00:52:34,056 >> TALARE 3: Det är ett outro. 1185 00:52:34,056 --> 00:52:36,806 TALARE 2: Men, jag menar, borde inte något hända honom på the-- 1186 00:52:36,806 --> 00:52:37,889 TALARE 3: Nej, nej, nej, nej. 1187 00:52:37,889 --> 00:52:40,220 Ingenting händer. 1188 00:52:40,220 --> 00:52:42,910 >> TALARE 1: Så varför är vi tittar på? 1189 00:52:42,910 --> 00:52:46,956 >> TALARE 3: Eftersom Det är ett outro för CS50. 1190 00:52:46,956 --> 00:52:48,652 >> DAVID J MALAN: Inte ännu. 1191 00:52:48,652 --> 00:52:49,151