1 00:00:00,000 --> 00:00:00,940 2 00:00:00,940 --> 00:00:05,440 >> [MUSIK SPELA] 3 00:00:05,440 --> 00:00:11,577 4 00:00:11,577 --> 00:00:12,660 DAVID J. MALAN: Okej. 5 00:00:12,660 --> 00:00:15,590 Detta är CS50, och detta är början på vecka två. 6 00:00:15,590 --> 00:00:19,120 Så låt oss börja idag med en bugg. 7 00:00:19,120 --> 00:00:20,974 Ett fel, naturligtvis, är en fel i ett program, 8 00:00:20,974 --> 00:00:22,890 och du får mycket bekant med detta begrepp 9 00:00:22,890 --> 00:00:26,050 om du aldrig har programmerat tidigare. pset0 och nu pset1. 10 00:00:26,050 --> 00:00:29,280 Men låt oss betrakta något lite enkelt i början. 11 00:00:29,280 --> 00:00:32,189 Detta program här som jag kastade samman i förväg, 12 00:00:32,189 --> 00:00:37,280 och jag hävdar att detta ska skrivas ut 10 stjärnor på skärmen med hjälp av printf, 13 00:00:37,280 --> 00:00:41,020 men det är tydligen buggy på något sätt. 14 00:00:41,020 --> 00:00:45,370 >> Med tanke på den specifikation som den bör skriva ut 10 stjärnor, 15 00:00:45,370 --> 00:00:50,230 men det gör inte uppenbarligen, vad skulle du påstår är felet? 16 00:00:50,230 --> 00:00:52,004 Yeah? 17 00:00:52,004 --> 00:00:54,420 Så det är en av av ett fel, och vad menar du med det? 18 00:00:54,420 --> 00:01:00,991 19 00:01:00,991 --> 00:01:01,490 OK. 20 00:01:01,490 --> 00:01:09,820 21 00:01:09,820 --> 00:01:10,410 Utmärkt. 22 00:01:10,410 --> 00:01:13,930 Så vi har angett en startvärde om noll för i, 23 00:01:13,930 --> 00:01:18,399 och vi har angett ett n-värde på 10, men vi har använt mindre än eller lika med. 24 00:01:18,399 --> 00:01:21,190 Och anledningen till att det är två tecken och inte bara en symbol, 25 00:01:21,190 --> 00:01:22,630 som i en mattebok, är att du inte har 26 00:01:22,630 --> 00:01:24,880 ett sätt att uttrycka ett tecken motsvarande. 27 00:01:24,880 --> 00:01:28,450 >> Så det innebär att mindre än, men om du börjar räkna på noll, 28 00:01:28,450 --> 00:01:31,690 men man räknar hela vägen upp genom och lika med 10, 29 00:01:31,690 --> 00:01:34,170 du är naturligtvis att gå till räkna 11 saker totalt. 30 00:01:34,170 --> 00:01:35,900 Och så ska du skriva ut 11 stjärnor. 31 00:01:35,900 --> 00:01:37,990 Så vad kan vara en fix för detta? 32 00:01:37,990 --> 00:01:39,970 Yeah? 33 00:01:39,970 --> 00:01:43,980 >> Så bara justera mindre än eller lika med bara vara mindre än, 34 00:01:43,980 --> 00:01:46,250 och det finns, jag påstår, kanske en annan lösning också. 35 00:01:46,250 --> 00:01:47,210 Vad kan annat du gör? 36 00:01:47,210 --> 00:01:48,590 Yeah? 37 00:01:48,590 --> 00:01:53,660 >> Så börja lika den till 1, och lämnar mindre än eller lika med. 38 00:01:53,660 --> 00:01:56,187 Och ärligt talat skulle jag påstå att för en typisk människa, 39 00:01:56,187 --> 00:01:57,770 detta är förmodligen enklare. 40 00:01:57,770 --> 00:02:00,280 Börja räkna på 1 och räkna upp genom 10. 41 00:02:00,280 --> 00:02:01,690 I huvudsak gör vad du menar. 42 00:02:01,690 --> 00:02:04,010 >> Men verkligheten är i programmering, som vi har sett, 43 00:02:04,010 --> 00:02:07,598 datavetare och programmerare allmänhet inte börja räkna på noll. 44 00:02:07,598 --> 00:02:09,389 Och så det är bra när du vänjer det. 45 00:02:09,389 --> 00:02:12,640 Ditt tillstånd kommer i allmänhet vara något i stil under. 46 00:02:12,640 --> 00:02:14,910 Så helt enkelt en logisk fel som vi kunde nu 47 00:02:14,910 --> 00:02:17,990 fixa och slutligen kompilera detta och få precis 10. 48 00:02:17,990 --> 00:02:19,610 >> Tja vad sägs om detta fel här? 49 00:02:19,610 --> 00:02:24,200 Här, igen, jag hävdar att jag har ett mål att skriva ut 10 stars-- 50 00:02:24,200 --> 00:02:28,140 ett per rad den här gången, men det gör det inte. 51 00:02:28,140 --> 00:02:30,940 Innan vi föreslår vad fix är, vad innebär det 52 00:02:30,940 --> 00:02:34,640 skriva ut visuellt om jag skulle sammanställa och kör detta program tycker du? 53 00:02:34,640 --> 00:02:35,140 Yeah? 54 00:02:35,140 --> 00:02:38,360 55 00:02:38,360 --> 00:02:38,860 >> Star. 56 00:02:38,860 --> 00:02:41,690 Så alla stjärnorna på samma linje är vad jag hört, 57 00:02:41,690 --> 00:02:43,391 och sedan den nya linjen karaktär. 58 00:02:43,391 --> 00:02:44,140 Så låt oss prova det. 59 00:02:44,140 --> 00:02:48,710 Så gör buggy-1, anger, och jag ser kommandot klang 60 00:02:48,710 --> 00:02:50,090 som vi talade om förra gången. 61 00:02:50,090 --> 00:02:55,180 ./buggy-1, och faktiskt ser jag alla 10 stjärnor på samma linje även om jag påstår 62 00:02:55,180 --> 00:02:58,690 i min specifikation bara en kommentar på toppen den kod som jag tänkte göra en per 63 00:02:58,690 --> 00:02:59,230 linje. 64 00:02:59,230 --> 00:03:00,580 Men det ser rätt. 65 00:03:00,580 --> 00:03:04,620 >> Nu line 15 det ser ut som jag är skriva ut en stjärna, och sedan linje 16 66 00:03:04,620 --> 00:03:06,620 det ser ut som jag är utskrift ett nyradstecken, 67 00:03:06,620 --> 00:03:09,560 och de är båda indragna så Jag är insidan av slingan tydligt. 68 00:03:09,560 --> 00:03:13,610 Så ska inte jag göra stjärna, nytt linje, stjärna, ny rad, stjärna, ny rad? 69 00:03:13,610 --> 00:03:14,110 Ja? 70 00:03:14,110 --> 00:03:18,430 71 00:03:18,430 --> 00:03:21,240 >> Ja, till skillnad från ett språk som Python, om du är bekant, 72 00:03:21,240 --> 00:03:23,540 indrag inte roll till datorn. 73 00:03:23,540 --> 00:03:25,280 Det spelar bara för människan. 74 00:03:25,280 --> 00:03:29,860 Så medan här har jag hittat på linjer 15 och 16-- som är vacker, 75 00:03:29,860 --> 00:03:31,330 men datorn inte bryr sig. 76 00:03:31,330 --> 00:03:34,640 Datorn bryr sig om faktiskt ha klammerparenteser 77 00:03:34,640 --> 00:03:36,310 kring dessa rader kod. 78 00:03:36,310 --> 00:03:39,520 >> Så att det är clear-- precis som i Scratch-- att dessa två rader kod 79 00:03:39,520 --> 00:03:40,450 bör verkställas. 80 00:03:40,450 --> 00:03:44,390 Som en av de gula Scratch pussel stycken igen och igen och igen. 81 00:03:44,390 --> 00:03:50,920 >> Så nu om jag åter köra program-- ./buggy-2-- Hm. 82 00:03:50,920 --> 00:03:51,770 Jag har ett fel nu. 83 00:03:51,770 --> 00:03:54,212 Vad har jag glömt att göra? 84 00:03:54,212 --> 00:03:55,420 Ja, så jag inte kompilera den. 85 00:03:55,420 --> 00:03:56,740 Så gör buggy-2. 86 00:03:56,740 --> 00:03:59,840 Ingen sådan fil eftersom jag inte faktiskt kompilera den andra versionen. 87 00:03:59,840 --> 00:04:04,860 Så nu intressant odeklarerat variable-- inte 2. 88 00:04:04,860 --> 00:04:05,510 Vi gör 1. 89 00:04:05,510 --> 00:04:11,050 Gör barnvagn-1-- ./buggy-1-- och nu var och en av dem är på samma linje. 90 00:04:11,050 --> 00:04:13,880 >> Nu finns det ett undantag denna påstådda fordran till mig 91 00:04:13,880 --> 00:04:15,520 att du behöver dessa klammerparenteser. 92 00:04:15,520 --> 00:04:20,160 När är det egentligen OK-- om du har märkt i sektion eller textbooks-- 93 00:04:20,160 --> 00:04:22,130 att utelämna klammerparentes? 94 00:04:22,130 --> 00:04:22,630 Yeah? 95 00:04:22,630 --> 00:04:26,290 96 00:04:26,290 --> 00:04:26,870 >> Exakt. 97 00:04:26,870 --> 00:04:28,940 När det bara finns en kodrad som du 98 00:04:28,940 --> 00:04:32,830 vill förknippas med den slinga som i vårt första exemplet. 99 00:04:32,830 --> 00:04:36,380 Det är helt legitimt att utelämna klammerparentes 100 00:04:36,380 --> 00:04:40,310 precis som en slags bekvämlighet från kompilatorn till dig. 101 00:04:40,310 --> 00:04:40,810 Yeah? 102 00:04:40,810 --> 00:04:43,347 103 00:04:43,347 --> 00:04:43,930 Bra fråga. 104 00:04:43,930 --> 00:04:45,500 Skulle det anses vara en stil fel? 105 00:04:45,500 --> 00:04:49,340 Vi skulle promote-- såsom i CS50 stilguide, URL som 106 00:04:49,340 --> 00:04:51,926 är i pset1-- att alltid Använd klammerparentes. 107 00:04:51,926 --> 00:04:53,550 Visst, om du är ny till programmering. 108 00:04:53,550 --> 00:04:56,800 Verkligheten är att vi inte är kommer att förbjuda dig 109 00:04:56,800 --> 00:04:58,680 från att göra dessa bekvämligheter. 110 00:04:58,680 --> 00:05:00,846 Men om du bara får in i rytmen saker, 111 00:05:00,846 --> 00:05:04,020 absolut bara alltid använda lockigt hängslen tills du får kläm på det. 112 00:05:04,020 --> 00:05:04,640 Bra fråga. 113 00:05:04,640 --> 00:05:05,320 >> Okej. 114 00:05:05,320 --> 00:05:07,660 Så att då var en bugg. 115 00:05:07,660 --> 00:05:09,190 Åtminstone i något ganska enkelt. 116 00:05:09,190 --> 00:05:11,260 Och ändå du kanske tror att detta är ganska rudimentär, eller hur? 117 00:05:11,260 --> 00:05:13,635 Detta är en slags första veckan att se på språk 118 00:05:13,635 --> 00:05:14,890 ut, se dina fel däri. 119 00:05:14,890 --> 00:05:17,250 Men verkligheten dessa är faktiskt representativ 120 00:05:17,250 --> 00:05:20,310 av några ganska skrämmande problem som kan uppstå i den verkliga världen. 121 00:05:20,310 --> 00:05:23,530 >> Så några av er kanske kommer ihåg om du följer tech news, 122 00:05:23,530 --> 00:05:25,740 eller kanske till och med fångats vind av detta i februari 123 00:05:25,740 --> 00:05:29,434 för det gångna året som Apple hade gjorde lite av ett misstag i både iOS, 124 00:05:29,434 --> 00:05:31,350 operativsystemet på sina telefoner, och även 125 00:05:31,350 --> 00:05:34,220 Mac OS, operativsystemet på sina stationära och bärbara datorer. 126 00:05:34,220 --> 00:05:36,480 Och du såg sådana rubriker som denna. 127 00:05:36,480 --> 00:05:41,120 Och därefter, Apple lovade att fixa detta fel, 128 00:05:41,120 --> 00:05:45,950 och mycket snabbt fick fixa det i iOS, men sedan slutligen fast den i Mac OS 129 00:05:45,950 --> 00:05:46,810 också. 130 00:05:46,810 --> 00:05:50,370 >> Nu ingen av dessa rubriker ensam verkligen avslöja vad det underliggande problemet var, 131 00:05:50,370 --> 00:05:55,640 men buggen slutligen reduceras till en bugg i SSL, Secure Sockets Layer. 132 00:05:55,640 --> 00:05:57,390 Och lång historia kort, Detta är den programvara 133 00:05:57,390 --> 00:06:01,030 att våra webbläsare och annat programvara som används för att göra vad? 134 00:06:01,030 --> 00:06:04,090 135 00:06:04,090 --> 00:06:06,860 >> Om jag sa att SSL är inblandade, när du 136 00:06:06,860 --> 00:06:13,920 besöka en URL som börjar med HTTPS, Vad då kanske SSL relateras till? 137 00:06:13,920 --> 00:06:14,580 Kryptering. 138 00:06:14,580 --> 00:06:16,470 Så vi pratar om detta under de kommande dagarna. 139 00:06:16,470 --> 00:06:18,750 Kryptering, konsten att förvrängningsinformation. 140 00:06:18,750 --> 00:06:22,200 >> Men lång historia kort, Apple någon gång sedan hade gjort ett misstag 141 00:06:22,200 --> 00:06:25,970 i genomförandet av SSL, den mjukvara som slutligen genomför 142 00:06:25,970 --> 00:06:30,120 Webbadresser som HTTPS eller max anslutningar där också. 143 00:06:30,120 --> 00:06:32,850 Resultatet av det är att din anslutningar skulle potentiellt 144 00:06:32,850 --> 00:06:33,920 avlyssnas. 145 00:06:33,920 --> 00:06:37,130 Och dina kontakter var inte nödvändigtvis krypterad 146 00:06:37,130 --> 00:06:40,350 om du hade en dålig kille mellan du och destinations webbplats som 147 00:06:40,350 --> 00:06:42,170 visste hur man dra nytta av detta. 148 00:06:42,170 --> 00:06:45,090 >> Nu Apple slutligen posted en fix för detta slutligen 149 00:06:45,090 --> 00:06:46,920 och beskrivningen sin fix var här. 150 00:06:46,920 --> 00:06:49,878 Säker transport misslyckades med att validera äktheten av anslutningen. 151 00:06:49,878 --> 00:06:52,920 Frågan togs upp av återställa saknade valideringssteg. 152 00:06:52,920 --> 00:06:57,250 >> Så det här är en väldigt handen vågig förklaring för att helt enkelt säga att vi klantade. 153 00:06:57,250 --> 00:07:00,920 Det är bokstavligen en kodrad som var buggy 154 00:07:00,920 --> 00:07:05,130 i genomförandet av SSL, och om du går på nätet och söka efter denna 155 00:07:05,130 --> 00:07:07,210 du kan faktiskt hitta den ursprungliga källkoden. 156 00:07:07,210 --> 00:07:11,960 Till exempel är det en skärmdump av bara en del av en ganska stor fil, 157 00:07:11,960 --> 00:07:15,965 men detta är en funktion tydligen kallas SSL verifiera sign server nyckelutbyte. 158 00:07:15,965 --> 00:07:17,840 Och det tar en massa argument och ingångar. 159 00:07:17,840 --> 00:07:20,298 Och vi kommer inte att fokusera för mycket på minutians där, 160 00:07:20,298 --> 00:07:24,390 men om du fokuserar på koden inuti av det översta function-- låt oss 161 00:07:24,390 --> 00:07:25,590 zooma in på det. 162 00:07:25,590 --> 00:07:28,140 Du kanske redan misstänker vad felet kanske 163 00:07:28,140 --> 00:07:31,230 vara även om du har ingen aning i slutändan vad du tittar på. 164 00:07:31,230 --> 00:07:35,924 Det är typ av en anomali här, vilket är vad? 165 00:07:35,924 --> 00:07:38,940 >> Ja, jag vet inte riktigt gillar utseendet på två goto misslyckas. 166 00:07:38,940 --> 00:07:42,060 Ärligt talat vet jag inte riktigt vad goto misslyckas sätt, men med två av dem 167 00:07:42,060 --> 00:07:42,810 rygg mot rygg. 168 00:07:42,810 --> 00:07:45,290 Det bara typ av gnuggar mig intellektuellt på fel sätt, 169 00:07:45,290 --> 00:07:48,910 och faktiskt om vi zoomar in på just dessa rader, är det C. 170 00:07:48,910 --> 00:07:52,220 >> Så en hel del av Apples kod är själv skriven i C, 171 00:07:52,220 --> 00:07:55,780 och detta synes är verkligen equivalent-- 172 00:07:55,780 --> 00:07:59,060 inte det ganska indrag versionen, men om du känner igen det faktum 173 00:07:59,060 --> 00:08:02,560 att det inte finns några klammerparentes, vad Apple verkligen skrev var kod som ser ut 174 00:08:02,560 --> 00:08:03,540 så här. 175 00:08:03,540 --> 00:08:07,080 Så jag har zoomat ut och jag bara fast indraget i den meningen 176 00:08:07,080 --> 00:08:10,690 att om det finns några klammerparentes, att andra goto misslyckas det är i gult 177 00:08:10,690 --> 00:08:12,500 kommer att köra oavsett vad. 178 00:08:12,500 --> 00:08:15,540 Det är inte förknippat med den om villkoret ovanför. 179 00:08:15,540 --> 00:08:19,590 >> Så även igen, inte om du gör helt förstå vad detta kan möjligen 180 00:08:19,590 --> 00:08:23,230 att göra, vet att var och en av dessa conditions-- vardera av dessa linjer 181 00:08:23,230 --> 00:08:26,180 är ett mycket viktigt steg i processen för kontroll 182 00:08:26,180 --> 00:08:28,350 Om dina data är faktiskt krypterad. 183 00:08:28,350 --> 00:08:31,710 Så hoppa över ett av dessa åtgärder, inte den bästa idén. 184 00:08:31,710 --> 00:08:34,840 >> Men eftersom vi har här andra goto misslyckas i gult, 185 00:08:34,840 --> 00:08:36,840 och eftersom när vi slags estetiskt 186 00:08:36,840 --> 00:08:40,480 flytta den till vänster där det logiskt är just nu, vad 187 00:08:40,480 --> 00:08:43,230 betyder det för linjen av koden nedan det andra goto 188 00:08:43,230 --> 00:08:46,480 misslyckas skulle du tänka? 189 00:08:46,480 --> 00:08:48,860 Det kommer alltid att hoppas över. 190 00:08:48,860 --> 00:08:52,100 Så GOTO allmänt ogillande av skäl som vi inte riktigt gå in, 191 00:08:52,100 --> 00:08:54,940 och även i CS50 vi brukar inte att undervisa detta uttalande goto, 192 00:08:54,940 --> 00:08:58,130 men du kan tänka på goto misslyckas på så sätt gå hoppa 193 00:08:58,130 --> 00:08:59,600 till någon annan del av koden. 194 00:08:59,600 --> 00:09:03,120 >> Med andra ord hoppar över denna sista raden helt och hållet, 195 00:09:03,120 --> 00:09:07,420 och så att resultatet av denna dumma enkla misstag som var precis 196 00:09:07,420 --> 00:09:10,330 ett resultat av förmodligen någon kopiera och klistra in en också 197 00:09:10,330 --> 00:09:14,150 många gånger var att hela säkerheten för iOS och Mac OS 198 00:09:14,150 --> 00:09:18,240 var utsatta för avlyssning av dåliga killar för ganska länge. 199 00:09:18,240 --> 00:09:19,940 Tills Apple äntligen fast detta. 200 00:09:19,940 --> 00:09:23,100 >> Nu om några av er är faktiskt kör gamla versioner av iOS eller Mac OS, 201 00:09:23,100 --> 00:09:27,250 du kan gå till gotofail.com som är en webbplats som någon satt upp 202 00:09:27,250 --> 00:09:29,190 att väsentligen bestämma prog 203 00:09:29,190 --> 00:09:30,980 Om datorn fortfarande är sårbar. 204 00:09:30,980 --> 00:09:33,600 Och ärligt talat, om det är, det är nog en bra idé 205 00:09:33,600 --> 00:09:36,870 att uppdatera telefonen eller din Mac på denna punkt. 206 00:09:36,870 --> 00:09:40,120 Men där, bara bevis på hur en uppskattning av dessa lägre nivå 207 00:09:40,120 --> 00:09:42,400 detaljer och ganska enkla idéer kan verkligen 208 00:09:42,400 --> 00:09:44,590 översätta till beslut och problem som 209 00:09:44,590 --> 00:09:47,320 affected-- i detta case-- miljontals människor. 210 00:09:47,320 --> 00:09:49,107 >> Nu några ord om administration. 211 00:09:49,107 --> 00:09:50,690 Avsnitt startar nu på söndag. 212 00:09:50,690 --> 00:09:53,360 Du kommer att få ett mail från helg om avdelning, vid vilken punkt 213 00:09:53,360 --> 00:09:55,290 den resektion processen börjar om du har 214 00:09:55,290 --> 00:09:56,998 insåg att du nu har några nya konflikter. 215 00:09:56,998 --> 00:10:00,180 Så det här händer varje år, och vi kommer att rymma i dagarna framöver. 216 00:10:00,180 --> 00:10:02,430 >> Office hours-- gör hålla ett öga på detta schema här. 217 00:10:02,430 --> 00:10:05,100 Ändrar lite den här veckan, särskilt starttiden 218 00:10:05,100 --> 00:10:08,180 och platsen, så konsultera att innan du går till kontorstid 219 00:10:08,180 --> 00:10:09,520 någon av de nästa fyra nätter. 220 00:10:09,520 --> 00:10:12,680 Och nu ett ord om bedömning, särskilt som du dyka in i problem 221 00:10:12,680 --> 00:10:14,350 ställer en och därefter. 222 00:10:14,350 --> 00:10:17,070 >> Så per specifikationen, dessa är i allmänhet 223 00:10:17,070 --> 00:10:20,360 axlarna längs vilka Vi utvärderar ditt arbete. 224 00:10:20,360 --> 00:10:23,170 Scope hänvisar till vad utsträckning din code redskap 225 00:10:23,170 --> 00:10:25,690 de funktioner som krävs genom vår specifikation. 226 00:10:25,690 --> 00:10:28,290 Med andra ord, hur mycket av en bit set gjorde du bita av. 227 00:10:28,290 --> 00:10:30,440 Har du gjort en tredjedel av den, en halv av den, 100% av den. 228 00:10:30,440 --> 00:10:33,000 Även om det inte är korrekt, Hur mycket har du försöker? 229 00:10:33,000 --> 00:10:35,290 Så som fångar den nivå ansträngning och det belopp 230 00:10:35,290 --> 00:10:38,260 som du bet av den Problemet set problem. 231 00:10:38,260 --> 00:10:40,690 >> Correctness-- detta en, till vilken omfattning, är din kod 232 00:10:40,690 --> 00:10:43,150 i linje med vår specifikationer och felfria. 233 00:10:43,150 --> 00:10:44,770 Så fungerar det på rätt sätt? 234 00:10:44,770 --> 00:10:48,700 Om vi ​​ger det en ingång, det gör det ge oss utgång som vi förväntar oss? 235 00:10:48,700 --> 00:10:52,570 Design-- nu detta är den första av de särskilt kvalitativa sådana, 236 00:10:52,570 --> 00:10:56,180 eller de som kräver mänsklig bedömning. 237 00:10:56,180 --> 00:10:59,690 Och faktiskt, det är därför vi har en personal så många undervisnings stipendiater och kursen 238 00:10:59,690 --> 00:11:00,350 assistenter. 239 00:11:00,350 --> 00:11:03,480 I vilken utsträckning är din kod skriven väl? 240 00:11:03,480 --> 00:11:05,810 >> Och även detta är en mycket kvalitativ bedömning 241 00:11:05,810 --> 00:11:09,100 som kommer att arbeta med dig på båda riktningarna i de kommande veckorna. 242 00:11:09,100 --> 00:11:12,060 Så att när du får inte endast numeriska poäng, men också 243 00:11:12,060 --> 00:11:16,682 en skriftlig poäng eller skrivit återkoppling, eller skriftlig återkoppling på engelska ord. 244 00:11:16,682 --> 00:11:19,640 Det är vad vi ska använda för att köra dig mot faktiskt skriver bättre kod. 245 00:11:19,640 --> 00:11:23,320 Och i föreläsning och avsnitt kommer vi att försöka peka out-- så ofta som vi can-- 246 00:11:23,320 --> 00:11:26,420 vad som gör ett program inte bara korrekt och funktionellt bra, 247 00:11:26,420 --> 00:11:28,200 men också väl utformade. 248 00:11:28,200 --> 00:11:31,850 Den mest effektiva det kan vara, eller även den vackert det kan vara. 249 00:11:31,850 --> 00:11:33,100 >> Vilket leder oss till stil. 250 00:11:33,100 --> 00:11:36,876 Stil slutligen är en estetisk bedömning. 251 00:11:36,876 --> 00:11:38,750 Visste du väljer bra namn på dina variabler? 252 00:11:38,750 --> 00:11:40,330 Har du indragen din kod ordentligt? 253 00:11:40,330 --> 00:11:44,010 Ser det bra ut, och därför, är det lätt för en annan människa 254 00:11:44,010 --> 00:11:46,550 att läsa era respektive om dess riktighet. 255 00:11:46,550 --> 00:11:50,300 >> Nu allmänhet per kursplanen, vi gör mål dessa saker på en fem-gradig skala. 256 00:11:50,300 --> 00:11:53,640 Och låt mig slå fast punkt att en tre är verkligen bra. 257 00:11:53,640 --> 00:11:55,550 Mycket snabbt gör folks börja göra aritmetik. 258 00:11:55,550 --> 00:11:58,133 När de får en tre av fem på korrekthet för lite pset 259 00:11:58,133 --> 00:12:02,040 och de tycker fan, jag går till 60% som huvudsakligen är en D eller E. 260 00:12:02,040 --> 00:12:03,980 >> Det är inte vårt sätt att tänka på dessa siffror. 261 00:12:03,980 --> 00:12:06,880 En tre är verkligen bra, och vad vi allmänhet förväntar i början 262 00:12:06,880 --> 00:12:09,820 av begreppet är att om du får ett gäng three's-- kanske ett par 263 00:12:09,820 --> 00:12:12,540 av mässor, ett par fours-- eller ett par tvåor, ett par fours-- 264 00:12:12,540 --> 00:12:13,748 det är ett bra ställe att börja. 265 00:12:13,748 --> 00:12:16,320 Och så länge vi ser en uppåtgående bana över tiden, 266 00:12:16,320 --> 00:12:18,540 du är i en särskilt bra plats. 267 00:12:18,540 --> 00:12:20,752 >> Formeln vi använder för att vikt saker är väsentligen 268 00:12:20,752 --> 00:12:22,710 detta per kursplanen, vilket bara innebär att vi 269 00:12:22,710 --> 00:12:24,750 ge mer tyngd åt riktighet. 270 00:12:24,750 --> 00:12:27,930 Eftersom det är väldigt ofta korrekthet som tar mest tid. 271 00:12:27,930 --> 00:12:28,760 Lita på mig nu. 272 00:12:28,760 --> 00:12:31,190 Du kommer find-- minst i en pset-- att du 273 00:12:31,190 --> 00:12:36,790 spenderar 90% av din tid arbetar på 10% av problemet. 274 00:12:36,790 --> 00:12:39,320 >> Och allt slags fungerar med undantag för en eller två buggar, 275 00:12:39,320 --> 00:12:41,570 och det är de buggar som hålla dig uppe sent på natten. 276 00:12:41,570 --> 00:12:43,380 De är de som slags fly dig. 277 00:12:43,380 --> 00:12:45,560 Men efter att ha sovit på den, eller deltar kontorstid 278 00:12:45,560 --> 00:12:48,844 eller ställa frågor på nätet, är när du kommer till att 100% mål, 279 00:12:48,844 --> 00:12:50,760 och det är därför vi vikt riktighet mest. 280 00:12:50,760 --> 00:12:54,102 Designa en lite mindre, och styla lite mindre än det. 281 00:12:54,102 --> 00:12:56,060 Men kom mind-- stil är kanske det enklaste 282 00:12:56,060 --> 00:12:58,890 av dessa för att bita av enligt den stilguide. 283 00:12:58,890 --> 00:13:01,580 >> Och nu, en mer allvarlig notera på akademisk hederlighet. 284 00:13:01,580 --> 00:13:05,000 CS50 har den olyckliga skillnaden av är den största tillverkaren av Ad Board 285 00:13:05,000 --> 00:13:07,330 fall nästan varje år historiskt. 286 00:13:07,330 --> 00:13:11,012 Detta beror inte på att eleverna fuska CS50 något mer så än någon annan klass, 287 00:13:11,012 --> 00:13:13,720 men på grund av arbetets art, det faktum att det är elektroniskt, 288 00:13:13,720 --> 00:13:16,636 det faktum att vi letar efter den, och det faktum att vi är datavetare, 289 00:13:16,636 --> 00:13:20,570 Jag kan säga att vi är tyvärr väldigt bra på att upptäcka det. 290 00:13:20,570 --> 00:13:22,710 >> Så vad innebär det i reala termer? 291 00:13:22,710 --> 00:13:24,820 Så det, per kursplanen, kursens filosofi 292 00:13:24,820 --> 00:13:28,090 verkligen kokar ner till att vara rimligt. 293 00:13:28,090 --> 00:13:31,684 Det finns denna linje mellan att göra något arbete på egen hand 294 00:13:31,684 --> 00:13:34,100 och att få en liten bit av rimlig hjälp från en vän, 295 00:13:34,100 --> 00:13:38,020 och hållet att göra det arbete för vän, eller skicka honom eller henne din kod 296 00:13:38,020 --> 00:13:41,080 så att han eller hon kan helt enkelt ta eller låna ut den till höger. 297 00:13:41,080 --> 00:13:43,580 Och det går över gränsen att vi dras i klassen. 298 00:13:43,580 --> 00:13:45,410 >> Se kursplanen i slutändan för linjerna 299 00:13:45,410 --> 00:13:48,209 att vi drar som rimliga och orimligt beteende, 300 00:13:48,209 --> 00:13:50,000 men det verkligen kokar ned till kärnan 301 00:13:50,000 --> 00:13:53,980 av ditt arbete att behöva vara din egen i slutändan. 302 00:13:53,980 --> 00:13:56,230 Nu med det sagt, det finns en heuristisk. 303 00:13:56,230 --> 00:13:58,980 För som du kanske imagine-- från kontorstid och det visuella 304 00:13:58,980 --> 00:14:01,060 och filmerna vi har visas således far-- CS50 305 00:14:01,060 --> 00:14:04,530 verkligen är tänkt att vara som en kollaborativ och så samarbetsvillig och social 306 00:14:04,530 --> 00:14:06,450 som möjligt. 307 00:14:06,450 --> 00:14:08,570 Som samarbetsprojekt som det är rigorös. 308 00:14:08,570 --> 00:14:11,314 >> Men med detta sagt, den heuristiska, som du ser i kursplanen, 309 00:14:11,314 --> 00:14:12,980 är att när man har något problem. 310 00:14:12,980 --> 00:14:16,470 Du har lite fel i din kod som du inte kan lösa, är det rimligt för dig 311 00:14:16,470 --> 00:14:18,039 att visa din kod till någon annan. 312 00:14:18,039 --> 00:14:21,080 En vän till och med i klassen, en vän sitter bredvid dig på kontorstid, 313 00:14:21,080 --> 00:14:22,680 eller en medlem av personalen. 314 00:14:22,680 --> 00:14:25,810 Men de kanske inte visar sin kod till dig. 315 00:14:25,810 --> 00:14:27,710 >> Med andra ord, en svaret på din question-- 316 00:14:27,710 --> 00:14:29,940 Jag behöver help-- inte oh, här är min kod. 317 00:14:29,940 --> 00:14:32,440 Ta en titt på detta och härleda från det vad du vill. 318 00:14:32,440 --> 00:14:34,580 Nu, naturligtvis, det finns ett sätt tydligt till spel 319 00:14:34,580 --> 00:14:37,760 detta system där jag ska visa dig min kod innan en fråga. 320 00:14:37,760 --> 00:14:40,150 Du visar mig mitt koden innan en fråga. 321 00:14:40,150 --> 00:14:45,870 Men se kursplanen igen för finare uppgifter om var denna linje är. 322 00:14:45,870 --> 00:14:50,606 >> Bara för att nu måla bilden och delar så öppet som möjligt 323 00:14:50,606 --> 00:14:53,480 var vi är på de senaste åren, detta är antalet Ad Board fall 324 00:14:53,480 --> 00:14:56,260 som CS50 har haft över de senaste sju åren. 325 00:14:56,260 --> 00:14:58,717 Med 14 fall denna senaste höst. 326 00:14:58,717 --> 00:15:01,300 När det gäller de elever som berörs, det var 20 några udda elever 327 00:15:01,300 --> 00:15:02,490 i höstas. 328 00:15:02,490 --> 00:15:05,670 Det fanns en topp på 33 elever för några år sedan. 329 00:15:05,670 --> 00:15:08,830 Många av dem är tyvärr inte längre här på campus. 330 00:15:08,830 --> 00:15:13,100 >> Studenter som deltar i procent av den klass har historiskt varierade mellan 0% 331 00:15:13,100 --> 00:15:17,300 till 5,3%, vilket bara är att säga det är varje år en utmaning. 332 00:15:17,300 --> 00:15:20,390 Och mot detta syfte, vad vi vill göra är att förmedla en 333 00:15:20,390 --> 00:15:24,310 att vi dd-- just FYI-- jämföra på en rättvisa för de studenter som 334 00:15:24,310 --> 00:15:26,520 följer linjen i enlighet därmed. 335 00:15:26,520 --> 00:15:29,620 Vi jämför alla aktuella inlagor mot alla tidigare uppdrag 336 00:15:29,620 --> 00:15:30,840 från de senaste många år. 337 00:15:30,840 --> 00:15:33,620 >> Vi vet också hur man Googla runt och finna kodförråd 338 00:15:33,620 --> 00:15:36,360 nätet, diskussionsforum nätet, jobbsajter på nätet. 339 00:15:36,360 --> 00:15:41,580 Om en elev kan hitta den, kan vi säkert tycker att det är så mycket som vi tyvärr gör. 340 00:15:41,580 --> 00:15:45,330 Så vad du ser i kursplanen dock är denna ånger klausul. 341 00:15:45,330 --> 00:15:47,500 Jag kan säkert uppskattar, och vi alla har 342 00:15:47,500 --> 00:15:50,870 Personalen har gjort kursen som detta, eller den här med tiden, 343 00:15:50,870 --> 00:15:53,997 verkligen vet hur det är när livet kommer i vägen när man har 344 00:15:53,997 --> 00:15:56,080 några sena deadline-- inte bara i den här klassen, 345 00:15:56,080 --> 00:15:58,660 men another-- när du är helt utmattad, stressad, 346 00:15:58,660 --> 00:16:00,659 har ett omåttligt antal andra saker att göra. 347 00:16:00,659 --> 00:16:03,660 Du kommer att göra någon gång i livet verkligen en dålig, kanske sent 348 00:16:03,660 --> 00:16:04,620 night beslut. 349 00:16:04,620 --> 00:16:06,520 >> Så per kursplanen, det är denna klausul, 350 00:16:06,520 --> 00:16:10,629 så att om inom 72 timmar från något dåligt beslut, du äger upp till den 351 00:16:10,629 --> 00:16:12,670 och nå ut till mig och en av kursens huvuden 352 00:16:12,670 --> 00:16:14,300 och vi kommer att ha en konversation. 353 00:16:14,300 --> 00:16:16,220 Vi kommer att hantera saker internt i hopp 354 00:16:16,220 --> 00:16:18,770 det blir mer av en undervisningstillfälle eller livslektion, 355 00:16:18,770 --> 00:16:22,120 och inte något med särskilt drastiska konsekvenser 356 00:16:22,120 --> 00:16:24,570 som ni kanske ser på dessa diagram här. 357 00:16:24,570 --> 00:16:26,540 >> Så det är en mycket allvarlig ton. 358 00:16:26,540 --> 00:16:29,960 Låt oss stanna upp bara några sekunder för att bryta spänningen. 359 00:16:29,960 --> 00:16:34,442 >> [MUSIK SPELA] 360 00:16:34,442 --> 00:17:17,768 361 00:17:17,768 --> 00:17:20,250 >> DAVID J. MALAN: Okej, så hur var det för ett segue? 362 00:17:20,250 --> 00:17:22,059 Till dagens primära ämnen. 363 00:17:22,059 --> 00:17:23,859 Den första är abstraktion. 364 00:17:23,859 --> 00:17:26,900 En annan som kommer att bli det representation av data, som sagt 365 00:17:26,900 --> 00:17:31,640 är en riktigt torrt sätt att säga hur kan vi gå om att lösa problem och tänka 366 00:17:31,640 --> 00:17:33,250 om att lösa problem? 367 00:17:33,250 --> 00:17:37,285 Så du har sett i Scratch, och du har kanske redan sett i pset1 med C 368 00:17:37,285 --> 00:17:39,930 att du inte bara kan använda funktioner, som printf, 369 00:17:39,930 --> 00:17:42,770 att andra människor i år tidigare skrev för dig. 370 00:17:42,770 --> 00:17:45,340 Du kan också skriva egna funktioner. 371 00:17:45,340 --> 00:17:48,440 >> Och även om du kanske inte har gjort detta i C, och uppriktigt sagt i pset1 372 00:17:48,440 --> 00:17:51,866 Du behöver egentligen inte att skriva din egen funktion eftersom problem-- 373 00:17:51,866 --> 00:17:53,990 medan kanske skrämmande i först glance-- du ser 374 00:17:53,990 --> 00:17:57,910 kan slutligen lösas med Inte så många rader kod. 375 00:17:57,910 --> 00:18:01,140 Men med det sagt, när det gäller att skriva en egen funktion, 376 00:18:01,140 --> 00:18:03,570 inse att C ger du denna förmåga. 377 00:18:03,570 --> 00:18:06,940 >> Jag kommer att gå i dagens källkod, som finns redan på nätet, 378 00:18:06,940 --> 00:18:10,900 och jag ska gå vidare och öppna ett program som kallas funktions 0.C, 379 00:18:10,900 --> 00:18:14,620 och funktion noll vi får se ett par saker. 380 00:18:14,620 --> 00:18:19,160 I första raderna 18 genom 23 är mitt huvudsakliga funktion. 381 00:18:19,160 --> 00:18:22,414 Och nu när vi börjar läsa kod som vi inte skriver i farten, 382 00:18:22,414 --> 00:18:25,080 men i stället har jag skrivit i förväg eller att du på ett problem set 383 00:18:25,080 --> 00:18:27,910 skulle få ha skrivits i förväg. 384 00:18:27,910 --> 00:18:30,040 Ett bra sätt att börja läsa någon annans kod 385 00:18:30,040 --> 00:18:31,400 är att leta efter den viktigaste funktionen. 386 00:18:31,400 --> 00:18:34,420 Räkna ut var den posten Poängen är att köra programmet, 387 00:18:34,420 --> 00:18:36,580 och sedan följa logiskt av det. 388 00:18:36,580 --> 00:18:40,190 >> Så det här programmet tydligen utskrifter ditt namn följt av ett kolon. 389 00:18:40,190 --> 00:18:42,490 Vi använder sedan GetString från CS50 biblioteket 390 00:18:42,490 --> 00:18:46,050 för att få en sträng, eller ett ord eller en fras från användaren vid tangentbordet. 391 00:18:46,050 --> 00:18:48,390 Och så finns det här sak här-- PrintName. 392 00:18:48,390 --> 00:18:51,420 >> Nu PrintName är inte en funktion som kommer med C. 393 00:18:51,420 --> 00:18:52,970 Det är inte i standard io.h. 394 00:18:52,970 --> 00:18:55,570 Det är inte i CS50.h. 395 00:18:55,570 --> 00:18:57,880 Det är snarare i samma fil. 396 00:18:57,880 --> 00:19:01,000 Lägg märke till om jag bläddra ner en bit-- linjerna 25 till 27-- 397 00:19:01,000 --> 00:19:05,330 det är bara en söt sätt att kommentera din kod med hjälp av stjärnor och snedstreck. 398 00:19:05,330 --> 00:19:07,320 Detta är en multi-line kommentera, och detta är bara 399 00:19:07,320 --> 00:19:10,570 min beskrivning i blått på Vad den här funktionen gör. 400 00:19:10,570 --> 00:19:14,530 >> För i raderna 28 till 31, Jag har skrivit en super enkel funktion 401 00:19:14,530 --> 00:19:16,280 vars namn är PrintName. 402 00:19:16,280 --> 00:19:19,560 Det tar hur många argument skulle du säga? 403 00:19:19,560 --> 00:19:25,120 Så en argument-- eftersom det finns en argument listas i parentesen. 404 00:19:25,120 --> 00:19:27,000 Den typ av som String. 405 00:19:27,000 --> 00:19:30,240 Vilket betyder att PrintName är så här svarta lådan 406 00:19:30,240 --> 00:19:32,910 eller funktion som tar som indata en sträng. 407 00:19:32,910 --> 00:19:35,730 >> Och namnet på den String lämpligen blir Namn. 408 00:19:35,730 --> 00:19:37,840 Inte S, inte N, men namn. 409 00:19:37,840 --> 00:19:41,090 Så vad gör PrintName göra? 410 00:19:41,090 --> 00:19:42,210 Det är trevligt enkelt. 411 00:19:42,210 --> 00:19:45,390 Precis som en rad kod för printf, men tydligen det 412 00:19:45,390 --> 00:19:47,950 skriver ut "Hej" så och så. 413 00:19:47,950 --> 00:19:50,070 Om så och så kommer från argumentet. 414 00:19:50,070 --> 00:19:52,300 >> Nu är detta inte en stor innovation här. 415 00:19:52,300 --> 00:19:56,710 Egentligen har jag tagit ett program som kunde har skrivits med en rad kod 416 00:19:56,710 --> 00:20:00,190 genom att sätta upp detta här, och ändrade det till något 417 00:20:00,190 --> 00:20:04,920 som innebär vissa sex eller sju eller så kodrader ända ner hit. 418 00:20:04,920 --> 00:20:08,190 >> Men det är som utövar en Principen kallas abstraktion. 419 00:20:08,190 --> 00:20:12,550 Sort av inkapslande insidan av en ny funktion som har ett namn, och bättre 420 00:20:12,550 --> 00:20:14,590 men det namnet bokstav säger vad den gör. 421 00:20:14,590 --> 00:20:16,880 Jag menar printf-- det är inte särskilt beskrivande. 422 00:20:16,880 --> 00:20:18,932 Om jag vill skapa en pusselbit, eller om jag 423 00:20:18,932 --> 00:20:21,140 vill skapa en funktion som skriver ut någons namn, 424 00:20:21,140 --> 00:20:23,230 skönheten i att göra detta är att jag faktiskt kan 425 00:20:23,230 --> 00:20:27,170 ger denna funktion ett namn som beskriver vad den gör. 426 00:20:27,170 --> 00:20:29,844 >> Nu tar det i en ingång som Jag har godtyckligt kallas namn, 427 00:20:29,844 --> 00:20:32,760 men även det är underbart beskrivande istället för att vara lite mer 428 00:20:32,760 --> 00:20:36,140 generisk som S. Och tomrum, för nu, betyder bara 429 00:20:36,140 --> 00:20:38,330 att denna funktion inte lämna mig tillbaka något. 430 00:20:38,330 --> 00:20:41,127 Det är inte som GetString som bokstavligen händer mig tillbaka en sträng 431 00:20:41,127 --> 00:20:43,960 som vi gjorde med pappersbitarna med dina klasskamrater förra veckan, 432 00:20:43,960 --> 00:20:45,990 utan snarare att det bara har en sidoeffekt. 433 00:20:45,990 --> 00:20:48,080 Den skriver ut något på skärmen. 434 00:20:48,080 --> 00:20:53,880 >> Så i slutet av dagen, om jag gör funktions 0, ./function-0, 435 00:20:53,880 --> 00:20:55,450 Vi ser att den frågar efter mitt namn. 436 00:20:55,450 --> 00:20:58,150 Jag skriver David, och det slags ut mitt namn. 437 00:20:58,150 --> 00:21:01,080 Om jag gör det igen med Rob, det kommer att säga "Hej, Rob." 438 00:21:01,080 --> 00:21:04,280 Så en enkel idé, men kanske extrapolera från det mentalt 439 00:21:04,280 --> 00:21:06,750 att när dina program får lite mer komplicerat, 440 00:21:06,750 --> 00:21:10,290 och du vill skriva en bit av kod och samtal som code-- invoke 441 00:21:10,290 --> 00:21:13,270 att code-- av några beskrivande namn som PrintName, 442 00:21:13,270 --> 00:21:15,600 C gör ger oss denna möjlighet. 443 00:21:15,600 --> 00:21:17,660 >> Här är ett annat enkelt exempel. 444 00:21:17,660 --> 00:21:22,940 Till exempel, om jag öppnar upp en fil från dag kallas return.c, 445 00:21:22,940 --> 00:21:24,270 märke till vad jag har gjort här. 446 00:21:24,270 --> 00:21:26,330 Det mesta av denna huvudsakliga funktion är printf. 447 00:21:26,330 --> 00:21:30,360 Jag först godtyckligt initiera en variabel som heter x till antalet 2. 448 00:21:30,360 --> 00:21:34,110 Jag sedan skriva ut "x är nu % I "passerar i värdet av x. 449 00:21:34,110 --> 00:21:35,500 Så jag säger bara vad det är. 450 00:21:35,500 --> 00:21:37,208 >> Nu är jag bara djärvt hävdar med printf. 451 00:21:37,208 --> 00:21:42,050 Jag cubing detta värde x, och jag är att göra så genom att anropa en funktion 452 00:21:42,050 --> 00:21:45,590 kallad kub passerande i x som argument, 453 00:21:45,590 --> 00:21:49,300 och sedan spara utmatningen i variabeln själv, x. 454 00:21:49,300 --> 00:21:51,340 Så jag dunkar värdet av x. 455 00:21:51,340 --> 00:21:53,380 Jag åsidosätta värde på x med vad 456 00:21:53,380 --> 00:21:56,510 resultatet av att ringa denna kub funktion är. 457 00:21:56,510 --> 00:21:59,530 Och då jag bara skriva ut en del fluffiga saker här som säger vad jag gjorde. 458 00:21:59,530 --> 00:22:01,600 >> Så vad är då kub? 459 00:22:01,600 --> 00:22:03,510 Lägg märke till vad som är fundamentalt annorlunda här. 460 00:22:03,510 --> 00:22:05,540 Jag har fått uppgiften ett namn som tidigare. 461 00:22:05,540 --> 00:22:08,270 Jag har angett ett namn för ett argument. 462 00:22:08,270 --> 00:22:11,650 Den här gången kallas n istället för namn, men jag kan kalla det vad jag vill. 463 00:22:11,650 --> 00:22:12,650 Men det här är annorlunda. 464 00:22:12,650 --> 00:22:14,080 Denna sak till vänster. 465 00:22:14,080 --> 00:22:16,290 Tidigare var det som sökord? 466 00:22:16,290 --> 00:22:16,870 Boys. 467 00:22:16,870 --> 00:22:18,580 Nu är det tydligen int. 468 00:22:18,580 --> 00:22:20,630 >> Så vad är den kanske ta bort? 469 00:22:20,630 --> 00:22:24,090 Av följande skäl: void betecknar slags intighet, och så var fallet. 470 00:22:24,090 --> 00:22:25,970 PrintName tillbaka någonting. 471 00:22:25,970 --> 00:22:27,942 Det gjorde något, men det inte ge mig tillbaka 472 00:22:27,942 --> 00:22:30,650 något som jag kunde sätta på vänstra sidan av ett likhetstecken 473 00:22:30,650 --> 00:22:32,460 som jag har gjort här på rad 22. 474 00:22:32,460 --> 00:22:36,780 >> Så om jag säger till på rad 30, vad är det antagligen innebär 475 00:22:36,780 --> 00:22:38,610 om vad kub gör för mig? 476 00:22:38,610 --> 00:22:41,110 Yeah? 477 00:22:41,110 --> 00:22:42,310 Den returnerar ett heltal. 478 00:22:42,310 --> 00:22:44,590 Så det händer mig tillbaka, för Exempelvis, en bit papper 479 00:22:44,590 --> 00:22:46,580 som den har skrivit svaret. 480 00:22:46,580 --> 00:22:50,130 2 kubik, eller 3 kubik, eller 4 cubed-- vad jag gick in, 481 00:22:50,130 --> 00:22:51,540 och hur har jag genomföra detta? 482 00:22:51,540 --> 00:22:54,810 Jo, just n gånger n gånger n är hur jag skulle kunna kub ett värde. 483 00:22:54,810 --> 00:22:57,110 Så återigen, super enkelt idé, men demonstra 484 00:22:57,110 --> 00:23:00,100 nu hur vi kan skriva funktioner som faktiskt hade oss tillbaka 485 00:23:00,100 --> 00:23:02,380 värden som kan vara av intresse. 486 00:23:02,380 --> 00:23:05,740 >> Låt oss titta på en sista exemplet här kallat funktion en. 487 00:23:05,740 --> 00:23:08,530 I detta exempel, börjar det att få mer övertygande. 488 00:23:08,530 --> 00:23:12,400 Så i funktion ett, detta program-- Grafiska ultimately 489 00:23:12,400 --> 00:23:14,920 anropar en funktion som heter GetPositiveInt. 490 00:23:14,920 --> 00:23:17,800 GetPositiveInt är inte en funktion i CS50 biblioteket 491 00:23:17,800 --> 00:23:20,400 men vi bestämde oss vill att det ska existera. 492 00:23:20,400 --> 00:23:24,550 >> Så om vi bläddra ner senare i filen, märker hur jag gick omkring och genomföra 493 00:23:24,550 --> 00:23:26,560 få positiva int, och jag säger att det är mer spännande 494 00:23:26,560 --> 00:23:28,992 eftersom detta är en anständig antal rader kod. 495 00:23:28,992 --> 00:23:30,700 Det är inte bara en dum lilla leksaksprogram. 496 00:23:30,700 --> 00:23:33,870 Det har faktiskt fått lite felkontroll och göra något mer användbart. 497 00:23:33,870 --> 00:23:38,470 >> Så om du inte har sett walkthrough videor som vi har inbäddade i pset1, 498 00:23:38,470 --> 00:23:42,350 vet att detta är en typ av loop i C, i samma anda 499 00:23:42,350 --> 00:23:44,270 till den typen av saker Scratch kan göra. 500 00:23:44,270 --> 00:23:46,320 Och gör säger gör detta. 501 00:23:46,320 --> 00:23:47,500 Skriv ut det här. 502 00:23:47,500 --> 00:23:51,860 Sedan gå vidare och få N-- få en int och förvara det på n, 503 00:23:51,860 --> 00:23:55,760 och fortsätter att göra det igen och igen och igen så länge som n är mindre än ett. 504 00:23:55,760 --> 00:23:58,720 >> Så n kommer att vara mindre än en endast om människan är inte samarbetsvilliga. 505 00:23:58,720 --> 00:24:01,980 Om han eller hon är att skriva i 0 eller -1 eller -50, 506 00:24:01,980 --> 00:24:04,790 denna slinga kommer att hålla exekvera igen och igen. 507 00:24:04,790 --> 00:24:07,549 Och i slutändan märker jag helt enkelt returnera värdet. 508 00:24:07,549 --> 00:24:09,590 Så nu har vi en funktion som skulle har varit trevligt 509 00:24:09,590 --> 00:24:14,040 Om CS50 skulle genomföra i CS50.h och CS50.c för dig, 510 00:24:14,040 --> 00:24:16,520 men här kan vi nu genomföra detta själva. 511 00:24:16,520 --> 00:24:19,230 >> Men två kommentarer på några viktiga detaljer. 512 00:24:19,230 --> 00:24:24,390 En-- varför jag förklarar int n, tror du, på linje 29 513 00:24:24,390 --> 00:24:27,139 istället för att bara göra detta här, vilket är 514 00:24:27,139 --> 00:24:28,930 mer i linje med vad vi gjorde förra veckan? 515 00:24:28,930 --> 00:24:29,430 Yeah? 516 00:24:29,430 --> 00:24:34,485 517 00:24:34,485 --> 00:24:35,110 En bra tanke. 518 00:24:35,110 --> 00:24:37,080 Så om vi skulle lägga den här, det är som om vi 519 00:24:37,080 --> 00:24:39,110 hålla att förklara det igen och igen. 520 00:24:39,110 --> 00:24:42,000 Som i och för sig är inte problematisk, per se, 521 00:24:42,000 --> 00:24:43,940 eftersom vi bara behöver värdet en gång och sedan 522 00:24:43,940 --> 00:24:45,330 vi kommer att få en ny i alla fall. 523 00:24:45,330 --> 00:24:45,940 Men en bra tanke. 524 00:24:45,940 --> 00:24:46,440 Yeah? 525 00:24:46,440 --> 00:24:52,770 526 00:24:52,770 --> 00:24:53,330 >> Close. 527 00:24:53,330 --> 00:24:59,030 Så eftersom jag har förklarat n på linje 29 utsidan av slingan, 528 00:24:59,030 --> 00:25:01,390 Det är tillgängligt i hela Hela denna funktion. 529 00:25:01,390 --> 00:25:05,400 Inte de andra funktioner eftersom n är fortfarande inne i dessa lockigt 530 00:25:05,400 --> 00:25:06,470 hängslen här. 531 00:25:06,470 --> 00:25:07,940 Så-- säker. 532 00:25:07,940 --> 00:25:12,430 533 00:25:12,430 --> 00:25:12,940 >> Exakt. 534 00:25:12,940 --> 00:25:14,356 Så det här är ännu mer rakt på sak. 535 00:25:14,356 --> 00:25:18,600 Om vi ​​istället deklareras n här på linje 32, 536 00:25:18,600 --> 00:25:22,340 Det är problematiskt eftersom gissning var annars jag behöver komma åt den? 537 00:25:22,340 --> 00:25:25,620 På rad 34, och den enkel tumregel är 538 00:25:25,620 --> 00:25:30,060 att du bara kan använda en variabel inne i de senaste klammerparenteser 539 00:25:30,060 --> 00:25:31,420 där du förklarade det. 540 00:25:31,420 --> 00:25:35,230 >> Olyckligtvis linje 34 är en linje för sent, 541 00:25:35,230 --> 00:25:38,560 för jag har redan stängt den lockiga stag på rad 33 542 00:25:38,560 --> 00:25:41,220 som motsvarar den klammerparentes på rad 30. 543 00:25:41,220 --> 00:25:44,180 Och så det här är ett sätt att säga att denna variabel int är scoped, 544 00:25:44,180 --> 00:25:46,970 så att säga, bara inne av dessa klammerparenteser. 545 00:25:46,970 --> 00:25:48,910 Det bara inte existerar utanför dem. 546 00:25:48,910 --> 00:25:51,580 >> Så ja, om jag gör det här fel, låt mig spara koden 547 00:25:51,580 --> 00:25:53,530 som det är-- felaktigt skrivet. 548 00:25:53,530 --> 00:25:57,990 Låt mig gå vidare och gör funktion-1, och notice-- fel. 549 00:25:57,990 --> 00:26:03,502 Användning av odeklarerat identifierare n på rad 35, vilket är rätt här. 550 00:26:03,502 --> 00:26:05,210 Och om vi rulla upp ytterligare, en annan en. 551 00:26:05,210 --> 00:26:08,750 Användning av odeklarerat identifierare n på rad 34. 552 00:26:08,750 --> 00:26:11,200 >> Så kompilatorn, klang, är märker att det bara 553 00:26:11,200 --> 00:26:13,720 finns inte, även om klart det är där visuellt. 554 00:26:13,720 --> 00:26:16,090 Så en enkel fix är att förklara det där. 555 00:26:16,090 --> 00:26:18,790 >> Låt mig nu bläddra till början av filen. 556 00:26:18,790 --> 00:26:21,080 Vad hoppar ut på dig som att vara lite annorlunda 557 00:26:21,080 --> 00:26:23,070 från det vi såg förra veckan? 558 00:26:23,070 --> 00:26:26,990 Inte nog med att jag har känt, inte bara Jag har några vassa ingår upp toppen, 559 00:26:26,990 --> 00:26:29,340 Jag har något jag är kallar en prototyp. 560 00:26:29,340 --> 00:26:36,100 Nu som ser väldigt lik vad Vi såg bara en stund sedan på rad 27. 561 00:26:36,100 --> 00:26:39,230 >> Så låt oss dra slutsatsen från en annan felmeddelande varför jag har gjort detta. 562 00:26:39,230 --> 00:26:42,050 Låt mig gå vidare och radera dessa rader där. 563 00:26:42,050 --> 00:26:44,240 Och så vi vet ingenting om prototypen. 564 00:26:44,240 --> 00:26:45,430 Remake denna fil. 565 00:26:45,430 --> 00:26:46,890 Gör funktionen ett. 566 00:26:46,890 --> 00:26:48,090 Och nu, för fan, fyra fel. 567 00:26:48,090 --> 00:26:50,220 Låt oss bläddra fram till den första. 568 00:26:50,220 --> 00:26:55,070 >> Implicit deklaration av funktionen få positiva int är ogiltigt i C99. 569 00:26:55,070 --> 00:26:57,780 C99 betyder bara 1999 version av språket 570 00:26:57,780 --> 00:26:59,710 C, vilket är vad vi faktiskt använder. 571 00:26:59,710 --> 00:27:01,050 Så vad betyder det? 572 00:27:01,050 --> 00:27:05,250 Väl C-- och mer specifikt C compilers-- är ganska dumma program. 573 00:27:05,250 --> 00:27:07,420 De vet bara vad du har berättade för dem, och det är 574 00:27:07,420 --> 00:27:08,960 faktiskt tematiska från förra veckan. 575 00:27:08,960 --> 00:27:12,910 >> Problemet är att om jag går om att genomföra namn här uppe, 576 00:27:12,910 --> 00:27:17,640 och jag kallar en funktion som kallas GetPositiveInt här på linje 20, 577 00:27:17,640 --> 00:27:22,520 funktionen gör tekniskt existerar tills kompilatorn ser linjen 27. 578 00:27:22,520 --> 00:27:25,450 Olyckligtvis är kompilatorn göra saker top, ner, vänster, höger, 579 00:27:25,450 --> 00:27:29,580 så att den inte har sett genomförande av GetPositiveInt, 580 00:27:29,580 --> 00:27:32,400 men det ser du försöker att använda upp det här, 581 00:27:32,400 --> 00:27:35,810 det bara kommer att bail-- skrika på dig med ett fel Message-- kanske 582 00:27:35,810 --> 00:27:38,440 kryptiskt, och inte faktiskt kompilera filen. 583 00:27:38,440 --> 00:27:41,940 >> Så en så kallad prototyp upp här är visserligen överflödigt. 584 00:27:41,940 --> 00:27:47,870 Bokstavligen, jag gick ner här och jag kopierade och klistras det, och jag satte upp den här. 585 00:27:47,870 --> 00:27:51,020 Void skulle vara mer korrekt, så vi ska bokstavligen kopiera och klistra in den här gången. 586 00:27:51,020 --> 00:27:52,854 Jag bokstavligen kopierat och klistrat den. 587 00:27:52,854 --> 00:27:54,270 Egentligen precis som som en brödsmula. 588 00:27:54,270 --> 00:27:56,260 >> En liten ledtråd till kompilatorn. 589 00:27:56,260 --> 00:27:58,860 Jag vet inte vad detta innebär ännu, men jag lovar att du 590 00:27:58,860 --> 00:28:00,260 att det kommer att finnas så småningom. 591 00:28:00,260 --> 00:28:04,010 Och det är därför det line-- in line 16-- avslutas med ett semikolon. 592 00:28:04,010 --> 00:28:05,486 Det är överflödigt med design. 593 00:28:05,486 --> 00:28:05,986 Ja? 594 00:28:05,986 --> 00:28:11,340 595 00:28:11,340 --> 00:28:14,360 >> Om du inte länka ditt bibliotek att i-- oh, bra fråga. 596 00:28:14,360 --> 00:28:17,350 Sharp innehåller header fil inneslutningar. 597 00:28:17,350 --> 00:28:20,040 Behöver vara-- bör nästan alltid högst upp 598 00:28:20,040 --> 00:28:23,270 av filen till en similar-- för exakt samma anledning, ja. 599 00:28:23,270 --> 00:28:26,430 För i standard io.h är bokstavligen en linje 600 00:28:26,430 --> 00:28:30,560 som denna, men med ordet printf, och med sina argument och returtyp. 601 00:28:30,560 --> 00:28:33,310 Och så genom att göra skarpa omfatta upp här, vad du är bokstavligen göra 602 00:28:33,310 --> 00:28:36,380 är att kopiera och klistra innehållet av någon annan skrev där uppe. 603 00:28:36,380 --> 00:28:39,660 Därmed cluing din kod i den Att det också finns dessa funktioner. 604 00:28:39,660 --> 00:28:40,160 Yeah? 605 00:28:40,160 --> 00:28:47,520 606 00:28:47,520 --> 00:28:48,260 >> Absolut. 607 00:28:48,260 --> 00:28:51,690 Så en mycket smart och korrekt lösning skulle vara, vet du vad? 608 00:28:51,690 --> 00:28:53,760 Jag vet inte vad en prototyp är, men jag vet 609 00:28:53,760 --> 00:28:56,390 om jag förstår att C är bara dum och rethinks topp till botten. 610 00:28:56,390 --> 00:28:57,820 Nåväl låt oss ge den vad den vill. 611 00:28:57,820 --> 00:29:01,650 Låt oss klippa den koden, klistra upp den topp, och nu driva huvud ner nedan. 612 00:29:01,650 --> 00:29:03,470 Detta skulle också lösa problemet. 613 00:29:03,470 --> 00:29:07,409 >> Men du kan mycket enkelt komma med ett scenario där A behöver ringa B, 614 00:29:07,409 --> 00:29:10,075 och kanske B ringer tillbaka till A. Detta är något som kallas rekursion, 615 00:29:10,075 --> 00:29:11,370 och vi ska återkomma till det. 616 00:29:11,370 --> 00:29:13,911 Och det kan eller inte kan vara en bra sak, men du kan definitivt 617 00:29:13,911 --> 00:29:15,110 bryta denna lösning. 618 00:29:15,110 --> 00:29:17,690 >> Och dessutom skulle jag hävdar stilist, 619 00:29:17,690 --> 00:29:20,760 speciellt när dina program blir denna långa och denna långa, 620 00:29:20,760 --> 00:29:23,064 det är bara super bekvämt att sätta huvud på toppen 621 00:29:23,064 --> 00:29:25,730 eftersom det är den sak de flesta programmerare kommer att bry sig om. 622 00:29:25,730 --> 00:29:28,150 Och så det är lite renare, vågar jag påstå, att göra det på det sätt 623 00:29:28,150 --> 00:29:30,380 Jag ursprungligen gjorde det med en prototyp även 624 00:29:30,380 --> 00:29:33,396 även om det ser lite överflödiga vid första anblicken. 625 00:29:33,396 --> 00:29:33,895 Yeah? 626 00:29:33,895 --> 00:29:36,472 627 00:29:36,472 --> 00:29:37,680 Tyvärr, du kan säga det högre? 628 00:29:37,680 --> 00:29:45,650 629 00:29:45,650 --> 00:29:49,580 >> Om du växlar platserna för genomförande och prototypen? 630 00:29:49,580 --> 00:29:51,270 Så det är en bra fråga. 631 00:29:51,270 --> 00:29:53,780 Om du åter deklarera detta ner Här, låt oss se vad som händer. 632 00:29:53,780 --> 00:29:55,530 Så om jag lägger ner det här Här, du säger. 633 00:29:55,530 --> 00:29:57,860 634 00:29:57,860 --> 00:29:58,360 Åh, förlåt. 635 00:29:58,360 --> 00:29:58,859 Louder? 636 00:29:58,859 --> 00:30:02,000 637 00:30:02,000 --> 00:30:04,011 Ännu högre. 638 00:30:04,011 --> 00:30:04,760 Åh, bra fråga. 639 00:30:04,760 --> 00:30:05,860 Skulle det ogiltig funktionen? 640 00:30:05,860 --> 00:30:08,901 Du vet, efter alla dessa år, jag har aldrig lagt en prototyp efteråt. 641 00:30:08,901 --> 00:30:13,810 Så låt oss göra göra funktions 1 efter att ha gjort det. 642 00:30:13,810 --> 00:30:15,279 >> [Muttrade] 643 00:30:15,279 --> 00:30:16,320 DAVID J. MALAN: Åh, vänta. 644 00:30:16,320 --> 00:30:17,944 Vi måste fortfarande ställa allt upp överst. 645 00:30:17,944 --> 00:30:21,400 Så låt oss göra det här, om jag är förstå din fråga rätt. 646 00:30:21,400 --> 00:30:24,700 Jag sätter allt, inklusive prototypen ovanför huvud, 647 00:30:24,700 --> 00:30:28,180 men jag sätter prototypen nedan genomförandet. 648 00:30:28,180 --> 00:30:33,190 >> Så om jag gör något, jag får tillbaka en error-- oanvänd variabel n. 649 00:30:33,190 --> 00:30:37,280 650 00:30:37,280 --> 00:30:37,860 Åh, där. 651 00:30:37,860 --> 00:30:38,360 Tack. 652 00:30:38,360 --> 00:30:39,430 Låt oss se, blir vi av med det här. 653 00:30:39,430 --> 00:30:41,304 Det är en annan bugg, så låt oss bortse från det. 654 00:30:41,304 --> 00:30:43,910 Låt oss verkligen snabbt remake här. 655 00:30:43,910 --> 00:30:48,100 >> OK, så informationen inte argument används av format String 656 00:30:48,100 --> 00:30:52,310 N-- åh, det är därför Jag bytte till dessa här. 657 00:30:52,310 --> 00:30:55,885 Okej, vi vet vad svaret går att-- okej, nu kör vi. 658 00:30:55,885 --> 00:31:00,560 Ah, tack för det positiva. 659 00:31:00,560 --> 00:31:03,430 Okej, jag kommer att fixa den här koden after-- ignorera denna bugg 660 00:31:03,430 --> 00:31:08,300 eftersom detta var-- det fungerar är svaret. 661 00:31:08,300 --> 00:31:11,560 >> Så det inte att skriva över vad du just gjort. 662 00:31:11,560 --> 00:31:14,800 Jag misstänker kompilatorn är skriven på ett sådant sätt 663 00:31:14,800 --> 00:31:18,420 att den ignorerar din prototyp eftersom kroppen, så att säga, 664 00:31:18,420 --> 00:31:20,922 av funktionen redan har genomförts högre upp. 665 00:31:20,922 --> 00:31:23,380 Jag måste faktiskt konsul handboken för kompilatorn 666 00:31:23,380 --> 00:31:26,171 för att förstå om det finns någon annan förstått, men vid första anblicken 667 00:31:26,171 --> 00:31:29,290 bara genom att försöka och experimentera, det verkar inte finnas någon effekt. 668 00:31:29,290 --> 00:31:30,730 Bra fråga. 669 00:31:30,730 --> 00:31:33,660 >> Så låt oss gå framåt nu, flyttar bort från biverkningar som 670 00:31:33,660 --> 00:31:36,660 är funktioner som gör något liknande visuellt på skärmen med printf, 671 00:31:36,660 --> 00:31:38,090 men inte returnera ett värde. 672 00:31:38,090 --> 00:31:41,550 Och funktioner som har retur värden som vi såg bara några av. 673 00:31:41,550 --> 00:31:45,350 Vi såg redan denna föreställning om utrymme, och vi får se det här om och om igen. 674 00:31:45,350 --> 00:31:47,210 Men för nu, återigen, använd tumregel 675 00:31:47,210 --> 00:31:51,410 att en variabel endast kan användas inne i den senast öppnade 676 00:31:51,410 --> 00:31:54,350 och slutna klamrar som vi såg i just exemplet. 677 00:31:54,350 --> 00:31:56,910 >> Och som du påpekade, det finns en ability-- 678 00:31:56,910 --> 00:32:00,040 du kan lösa en del av dessa problem genom att sätta en variabel globalt 679 00:32:00,040 --> 00:32:01,290 högst upp på en fil. 680 00:32:01,290 --> 00:32:03,630 Men i nästan alla fall Vi skulle rynka pannan på detta, 681 00:32:03,630 --> 00:32:06,170 och faktiskt inte ens gå in i den lösning för nu. 682 00:32:06,170 --> 00:32:09,890 Så nu är takeaway att variabler har denna föreställning om utrymme. 683 00:32:09,890 --> 00:32:13,430 >> Men nu ska vi titta på en annan torrt sätt att faktiskt se 684 00:32:13,430 --> 00:32:15,810 vid något ganska intressant genomförandet detaljer. 685 00:32:15,810 --> 00:32:17,810 Hur vi kan representera information. 686 00:32:17,810 --> 00:32:20,370 Och vi har redan tittat på det här i den första veckan i klassen. 687 00:32:20,370 --> 00:32:23,320 Om man tittar på binärer, och att påminna oss själva om decimal. 688 00:32:23,320 --> 00:32:28,310 >> Men minns från förra veckan att C har olika datatyper och klasar mer, 689 00:32:28,310 --> 00:32:30,600 men de mest användbara sådana för nu kan vara dessa. 690 00:32:30,600 --> 00:32:36,030 En röding, eller karaktär, vilket händer att vara en byte, eller åtta bitar totalt. 691 00:32:36,030 --> 00:32:40,060 Och det är att säga att storleken en röding är bara ett byte. 692 00:32:40,060 --> 00:32:45,370 En byte är åtta bitar, så det innebär att Vi kan representera hur många tecken. 693 00:32:45,370 --> 00:32:47,320 Hur många bokstäver eller symboler på tangentbordet 694 00:32:47,320 --> 00:32:49,210 om vi har en byte eller åtta bitar. 695 00:32:49,210 --> 00:32:51,546 Tänk tillbaka till vecka noll. 696 00:32:51,546 --> 00:32:53,420 Om du har åtta bitar, hur många totalvärden 697 00:32:53,420 --> 00:32:55,503 kan du representerar med mönster av ettor och nollor? 698 00:32:55,503 --> 00:32:58,170 699 00:32:58,170 --> 00:33:00,260 En-- mer än så. 700 00:33:00,260 --> 00:33:03,490 Så 256 totalt om du börja räkna från noll. 701 00:33:03,490 --> 00:33:07,120 Så om du har åtta bits-- så om vi hade våra binära lökar upp här igen, 702 00:33:07,120 --> 00:33:12,180 vi kunde vända dessa lampor på och av i någon av 256 unika mönster. 703 00:33:12,180 --> 00:33:13,640 >> Nu är det är lite problematiskt. 704 00:33:13,640 --> 00:33:16,857 Inte så mycket för engelska och romanska språk, men absolut 705 00:33:16,857 --> 00:33:19,190 när du introducerar, för instans, asiatiska språk, vilket 706 00:33:19,190 --> 00:33:22,580 har betydligt fler symboler än som 26 bokstäver i alfabetet. 707 00:33:22,580 --> 00:33:24,390 Vi faktiskt kanske behöver mer än en bitgrupp. 708 00:33:24,390 --> 00:33:28,240 Och tack och lov i senare år har samhället 709 00:33:28,240 --> 00:33:31,040 antagna andra standarder som använder mer än en bitgrupp per laddning. 710 00:33:31,040 --> 00:33:34,210 >> Men för nu i C, standard är bara ett byte eller åtta bitar. 711 00:33:34,210 --> 00:33:38,195 Ett heltal, under tiden, är fyra bytes, annars känd som 32 bitar. 712 00:33:38,195 --> 00:33:41,320 Vilket betyder vad är den största möjliga nummer som vi kan representera med en int 713 00:33:41,320 --> 00:33:41,820 tydligen? 714 00:33:41,820 --> 00:33:44,426 715 00:33:44,426 --> 00:33:45,050 Med en miljard. 716 00:33:45,050 --> 00:33:46,760 Så det är fyra miljarder ge eller ta. 717 00:33:46,760 --> 00:33:49,840 2 till 32th makten, om vi ta några negativa tal 718 00:33:49,840 --> 00:33:52,530 och bara använda alla positiva siffror, det är fyra miljarder 719 00:33:52,530 --> 00:33:53,730 ge och ta möjligheter. 720 00:33:53,730 --> 00:33:57,890 En flottör, under tiden, är en annan typ av datatyp i C. Det är fortfarande ett nummer, 721 00:33:57,890 --> 00:33:58,990 men det är ett reellt tal. 722 00:33:58,990 --> 00:34:00,660 Något med en decimal. 723 00:34:00,660 --> 00:34:03,000 Och det visar sig att C använder också fyra bitgrupper 724 00:34:03,000 --> 00:34:05,340 att representera flyttalsvärden. 725 00:34:05,340 --> 00:34:09,420 >> Olyckligtvis hur många flytande punktvärdena finns det i världen? 726 00:34:09,420 --> 00:34:11,582 Hur många reella tal finns det? 727 00:34:11,582 --> 00:34:13,540 Det finns en oändlig nummer, och för den delen 728 00:34:13,540 --> 00:34:15,164 Det finns ett oändligt antal heltal. 729 00:34:15,164 --> 00:34:18,070 Så vi är redan typ av gräva oss ett hål här. 730 00:34:18,070 --> 00:34:21,780 Varvid tydligen i computers-- vid minst program skrivna i C på dem-- 731 00:34:21,780 --> 00:34:24,110 får endast räknas som högt som fyra miljarder ge eller ta, 732 00:34:24,110 --> 00:34:26,260 och flyttalsvärden kan bara skenbart 733 00:34:26,260 --> 00:34:28,330 ha någon ändlig mängd av precision. 734 00:34:28,330 --> 00:34:30,810 Endast så många siffror efter deras decimalkomma. 735 00:34:30,810 --> 00:34:32,822 >> Jo, naturligtvis, om du har bara 32 bitar, 736 00:34:32,822 --> 00:34:36,030 Jag vet inte hur vi ska gå tillväga representerar verklig numbers-- förmodligen 737 00:34:36,030 --> 00:34:37,409 med olika typer av mönster. 738 00:34:37,409 --> 00:34:40,030 Men det finns säkert en ändlig Antalet sådana mönster, 739 00:34:40,030 --> 00:34:41,830 så även här, det här är problematiskt. 740 00:34:41,830 --> 00:34:43,710 >> Nu kan vi undvika problemet något. 741 00:34:43,710 --> 00:34:45,710 Om du inte använder en flottör, du kan använda en dubbel 742 00:34:45,710 --> 00:34:50,230 i C, vilket ger dig åtta byte, vilket är långt fler möjliga mönster av nollor 743 00:34:50,230 --> 00:34:50,730 och ettor. 744 00:34:50,730 --> 00:34:55,199 Men det är fortfarande begränsad, vilket går vara problematiskt om du skriver programvara 745 00:34:55,199 --> 00:34:57,670 för grafik eller efter fancy matematiska formler. 746 00:34:57,670 --> 00:35:00,410 Så du kanske egentligen vill att räkna upp större än så. 747 00:35:00,410 --> 00:35:05,640 En lång long-- enfaldigt named-- är också åtta byte, eller 64 bitar, 748 00:35:05,640 --> 00:35:10,260 och detta är dubbelt så lång som en int, och det är en lång heltal. 749 00:35:10,260 --> 00:35:15,655 >> Kul fact-- om en int är fyra byte, Hur lång är en lång i C normalt? 750 00:35:15,655 --> 00:35:18,290 751 00:35:18,290 --> 00:35:21,560 Också fyra byte, men en lång lång är åtta byte, 752 00:35:21,560 --> 00:35:23,050 och det är av historiska skäl. 753 00:35:23,050 --> 00:35:26,450 >> Men takeaway nu är bara det att uppgifterna har 754 00:35:26,450 --> 00:35:29,625 att vara representerade i ett computer-- som är en fysisk enhet med el, 755 00:35:29,625 --> 00:35:32,190 det är allmänt drivande dessa nollor och ones-- 756 00:35:32,190 --> 00:35:34,320 med ändliga mängder precision. 757 00:35:34,320 --> 00:35:35,620 Så vad är problemet då? 758 00:35:35,620 --> 00:35:37,480 >> Jo det finns ett problem av heltalsspill. 759 00:35:37,480 --> 00:35:39,780 Inte bara i C, men i datorer i allmänhet. 760 00:35:39,780 --> 00:35:42,590 Till exempel, om denna är ett byte värt en bit-- 761 00:35:42,590 --> 00:35:45,120 så om det är åtta bit-- alla av som är nummer ett. 762 00:35:45,120 --> 00:35:47,300 Vilket nummer är det representerar om vi antar 763 00:35:47,300 --> 00:35:50,730 det är alla positiva värden i binär? 764 00:35:50,730 --> 00:35:54,410 >> 255, och det är inte 256, eftersom noll är det lägsta numret. 765 00:35:54,410 --> 00:35:56,760 Så 255 är den högsta en, men problemet 766 00:35:56,760 --> 00:36:00,330 är tänkt att jag ville öka denna variabel som 767 00:36:00,330 --> 00:36:04,030 använder åtta bitar totalt om jag vill öka den. 768 00:36:04,030 --> 00:36:07,160 >> Väl så fort jag lägger till en en till alla dessa sådana, 769 00:36:07,160 --> 00:36:10,500 kan du kanske tänka dig visually-- bara som att bära den med hjälp decimals-- 770 00:36:10,500 --> 00:36:12,300 något som kommer att strömma till vänster. 771 00:36:12,300 --> 00:36:15,590 Och faktiskt, om jag lägger till det antal en till detta, vad som händer i binärt 772 00:36:15,590 --> 00:36:17,670 är att det flödar tillbaka till noll. 773 00:36:17,670 --> 00:36:21,730 >> Så om du bara use-- inte en int, men ett enda byte räkna heltal 774 00:36:21,730 --> 00:36:27,170 i ett program, genom default-- snarast du får 250, 251, 252, 253, 254, 775 00:36:27,170 --> 00:36:32,710 255-- 0 kommer efter 255, vilket förmodligen inte är vad 776 00:36:32,710 --> 00:36:34,790 en användare kommer att förvänta sig. 777 00:36:34,790 --> 00:36:39,620 >> Nu under tiden i flyttal värld, du har också ett liknande problem. 778 00:36:39,620 --> 00:36:42,670 Inte så mycket med den största number-- även om det är fortfarande ett problem. 779 00:36:42,670 --> 00:36:45,360 Men med mängden precision att du kan representera. 780 00:36:45,360 --> 00:36:49,490 Så låt oss ta en titt på det här exemplet här även från dagens käll code-- 781 00:36:49,490 --> 00:36:52,070 float-0.c. 782 00:36:52,070 --> 00:36:54,280 >> Och märker att det är en super enkelt program som 783 00:36:54,280 --> 00:36:56,580 ska tydligen skriva ut vilket värde? 784 00:36:56,580 --> 00:37:00,777 785 00:37:00,777 --> 00:37:04,110 Vad tror du satsa det kommer att skriva ut även om det är lite av ny syntax 786 00:37:04,110 --> 00:37:05,540 här? 787 00:37:05,540 --> 00:37:06,700 Så förhoppningsvis 0.1. 788 00:37:06,700 --> 00:37:10,000 Så motsvarande en tiondel eftersom jag gör 1 dividerat med 10. 789 00:37:10,000 --> 00:37:12,430 Jag lagra svaret i en variabel som heter f. 790 00:37:12,430 --> 00:37:15,850 Denna variabel är av typen float, vilket är ett nyckelord jag just föreslagit existerade. 791 00:37:15,850 --> 00:37:18,910 >> Vi har inte sett det här förut, men Detta är typ av ett snyggt sätt i printf 792 00:37:18,910 --> 00:37:22,110 för att ange hur många siffror du vill se efter en decimalpunkt. 793 00:37:22,110 --> 00:37:25,020 Så denna notation betyder bara det här är en platshållare. 794 00:37:25,020 --> 00:37:27,900 Det är till ett flyttal värde, och oh, förresten, 795 00:37:27,900 --> 00:37:31,389 visa den med decimalkommat med ett nummer efter decimalkommat. 796 00:37:31,389 --> 00:37:33,180 Så det är antalet signifikanta siffror, 797 00:37:33,180 --> 00:37:34,650 så att säga, som du kanske vill. 798 00:37:34,650 --> 00:37:40,450 >> Så låt mig gå vidare och göra gör float-0, ./float-0, 799 00:37:40,450 --> 00:37:46,660 och tydligen 1 delat med 10 är 0,0. 800 00:37:46,660 --> 00:37:47,760 Nu varför är detta? 801 00:37:47,760 --> 00:37:51,380 >> Väl åter är datorn tar mig bokstavligen, och jag har skrivit en 802 00:37:51,380 --> 00:37:56,680 och jag skrivit 10, och ta en gissning vad är den antagna datatyp för dessa två 803 00:37:56,680 --> 00:37:58,440 värden? 804 00:37:58,440 --> 00:38:00,970 En int, det är tekniskt något lite annorlunda. 805 00:38:00,970 --> 00:38:04,150 Det är oftast en lång, men det är slutligen en integrerad värde. 806 00:38:04,150 --> 00:38:06,030 Inte ett flyttal. 807 00:38:06,030 --> 00:38:09,456 >> Vilket är att säga att om det är en int och det är en int, 808 00:38:09,456 --> 00:38:11,830 problemet är att datorn inte har förmåga 809 00:38:11,830 --> 00:38:13,680 att även lagra den decimalkomma. 810 00:38:13,680 --> 00:38:16,430 Så när du gör en uppdelad med 10 använder heltal 811 00:38:16,430 --> 00:38:20,950 för både täljare och nämnare, bör svaret bli 0,1. 812 00:38:20,950 --> 00:38:24,930 Men computer-- eftersom de är integers-- 813 00:38:24,930 --> 00:38:27,430 vet inte vad jag ska göra med 0,1. 814 00:38:27,430 --> 00:38:30,010 >> Så vad är det tydligt gör? 815 00:38:30,010 --> 00:38:33,120 Det är bara att kasta bort den, och vad jag ser i slutändan 816 00:38:33,120 --> 00:38:38,830 är 0.0 bara för att jag insisterade på att printf visa mig en decimal. 817 00:38:38,830 --> 00:38:41,740 Men problemet är att om du dela ett heltal med ett heltal, 818 00:38:41,740 --> 00:38:44,347 hittar get-- definitions av C-- ett heltal. 819 00:38:44,347 --> 00:38:46,680 Och det kommer inte att göra något trevligt och bekvämt 820 00:38:46,680 --> 00:38:49,040 gillar runda det upp till närmaste en uppåt eller nedåt. 821 00:38:49,040 --> 00:38:51,860 Det kommer att korta av allt efter decimalkommat. 822 00:38:51,860 --> 00:38:54,030 >> Så bara intuitivt, vad är nog en fix? 823 00:38:54,030 --> 00:38:55,351 Vad är det enklaste fix här? 824 00:38:55,351 --> 00:38:55,850 Yeah? 825 00:38:55,850 --> 00:39:00,570 826 00:39:00,570 --> 00:39:01,100 Exakt. 827 00:39:01,100 --> 00:39:04,200 Varför inte vi bara behandla dessa som flyttalsvärden effektivt 828 00:39:04,200 --> 00:39:05,860 göra dem till flöten eller dubbel. 829 00:39:05,860 --> 00:39:10,500 Och nu om jag gör flottar-0, eller om jag sammanställa flottar-1, 830 00:39:10,500 --> 00:39:12,570 som är identisk med det som just föreslagits. 831 00:39:12,570 --> 00:39:16,400 Och nu gör jag flottar-0, nu får jag min 0.1. 832 00:39:16,400 --> 00:39:17,234 >> Nu är det här fantastiskt. 833 00:39:17,234 --> 00:39:19,441 Men nu ska jag göra något lite annorlunda. 834 00:39:19,441 --> 00:39:22,280 Jag är nyfiken på att se vad som verkligen händer under huven, 835 00:39:22,280 --> 00:39:26,050 och jag kommer att skriva ut detta ut till 28 decimaler. 836 00:39:26,050 --> 00:39:29,730 Jag vill verkligen se 0.1000-- en infinite-- 837 00:39:29,730 --> 00:39:32,710 [Ohörbart] 27 nollor efter att 0,1. 838 00:39:32,710 --> 00:39:34,740 >> Nåväl låt oss se om det är vad jag verkligen får. 839 00:39:34,740 --> 00:39:39,430 Gör flottar-0 samma fil. 840 00:39:39,430 --> 00:39:41,150 ./floats-0. 841 00:39:41,150 --> 00:39:44,380 Låt oss zooma in på den dramatiska svaret. 842 00:39:44,380 --> 00:39:49,980 Hela tiden har du varit tänkande 1 delat med 10 är 10%, eller 0,1. 843 00:39:49,980 --> 00:39:50,810 Det är inte. 844 00:39:50,810 --> 00:39:53,210 Minst mån dators berörs. 845 00:39:53,210 --> 00:39:57,060 >> Nu why-- OK, det är komplett lögn 1 delat med 10 är 0,1. 846 00:39:57,060 --> 00:39:59,710 Men why-- som inte är takeaway idag. 847 00:39:59,710 --> 00:40:04,010 Så varför datorn tänker, till skillnad från oss alla i rummet, 848 00:40:04,010 --> 00:40:06,870 att 1 delat med 10 är faktiskt att galna värde? 849 00:40:06,870 --> 00:40:10,620 Vad datorn gör tydligen? 850 00:40:10,620 --> 00:40:12,490 Vad är det? 851 00:40:12,490 --> 00:40:13,785 >> Det är inte svämma över, per se. 852 00:40:13,785 --> 00:40:15,910 Overflow är vanligtvis när du linda runt ett värde. 853 00:40:15,910 --> 00:40:18,970 Det är här frågan om vaghet i en flyttalsvärde 854 00:40:18,970 --> 00:40:22,220 där du bara har 32 eller kanske till och med 64 bit. 855 00:40:22,220 --> 00:40:25,230 Men om det finns en oändlig antal verkliga numbers-- 856 00:40:25,230 --> 00:40:27,940 tal med decimaler och siffror thereafter-- säkert 857 00:40:27,940 --> 00:40:29,380 du kan inte representera dem alla. 858 00:40:29,380 --> 00:40:32,870 Så datorn har gett oss den närmaste träffen 859 00:40:32,870 --> 00:40:37,090 till det värde den kan representera med hjälp av att många bitar till det värde som jag egentligen vill, 860 00:40:37,090 --> 00:40:38,690 vilket är 0,1. 861 00:40:38,690 --> 00:40:40,685 >> Tyvärr, om du börja göra matte, eller om du 862 00:40:40,685 --> 00:40:44,360 börja engagera dessa typer av flytande punktvärden i viktiga programs-- 863 00:40:44,360 --> 00:40:46,770 finansiella programvara, militär software-- något 864 00:40:46,770 --> 00:40:49,090 där uppfattningen är förmodligen ganska viktigt. 865 00:40:49,090 --> 00:40:51,520 Och du börjar lägga siffror som denna, och start 866 00:40:51,520 --> 00:40:54,050 kör den programvaran med riktigt stora ingångar 867 00:40:54,050 --> 00:40:56,890 eller för massor av timmar eller partier av dagar eller massor av år, 868 00:40:56,890 --> 00:41:01,060 Dessa små små misstag säkert kan lägga upp över tid. 869 00:41:01,060 --> 00:41:04,252 >> Nu som en sidoreplik, om du någonsin sett Superman 3 eller Office Space 870 00:41:04,252 --> 00:41:05,960 och du kanske kommer ihåg hur dessa killar stal 871 00:41:05,960 --> 00:41:08,668 mycket pengar från sin dator genom användning av flyttalsvärden 872 00:41:08,668 --> 00:41:11,290 och lägga upp den lilla rester, förhoppningsvis den filmen 873 00:41:11,290 --> 00:41:12,390 Nu är mer förnuftigt. 874 00:41:12,390 --> 00:41:14,930 Detta är vad de var anspelning på i den filmen. 875 00:41:14,930 --> 00:41:16,710 Det faktum att de flesta företag skulle inte se 876 00:41:16,710 --> 00:41:18,600 efter ett visst antal decimaler, 877 00:41:18,600 --> 00:41:20,009 men de är bråkdelar av cent. 878 00:41:20,009 --> 00:41:22,550 Så du börjar att lägga upp dem, du börjar göra en massa pengar 879 00:41:22,550 --> 00:41:23,424 på ditt bankkonto. 880 00:41:23,424 --> 00:41:25,160 Så det är Office Space förklaras. 881 00:41:25,160 --> 00:41:28,220 >> Nu tyvärr bortom Kontor finns 882 00:41:28,220 --> 00:41:31,794 är några legitimt oroande och betydande konsekvenser 883 00:41:31,794 --> 00:41:33,710 av dessa typer av underliggande designbeslut, 884 00:41:33,710 --> 00:41:35,990 och faktiskt en av anledningarna vi använder C under loppet 885 00:41:35,990 --> 00:41:39,640 är så att du verkligen har denna grund upp förståelse för hur datorer fungerar, 886 00:41:39,640 --> 00:41:42,440 hur programmet fungerar, och inte ta något för givet. 887 00:41:42,440 --> 00:41:45,820 >> Och faktiskt tyvärr även med denna grundläggande förståelse, 888 00:41:45,820 --> 00:41:47,370 vi människor gör misstag. 889 00:41:47,370 --> 00:41:51,310 Och vad jag trodde jag skulle dela är här åtta minuters video här tagit 890 00:41:51,310 --> 00:41:56,980 från en Modern Marvels episod, som är en pedagogisk utställning om hur saker fungerar 891 00:41:56,980 --> 00:42:00,370 som målar två bilder om när en felaktig användning 892 00:42:00,370 --> 00:42:02,540 och förståelse för flyttalsvärden 893 00:42:02,540 --> 00:42:05,610 lett till några betydande olyckliga resultat. 894 00:42:05,610 --> 00:42:06,363 Låt oss ta en titt. 895 00:42:06,363 --> 00:42:07,029 [VIDEOAVSPELNING] 896 00:42:07,029 --> 00:42:11,290 -Vi Nu återgå till "Engineering Katastrofer "på Moderna Marvels. 897 00:42:11,290 --> 00:42:12,940 Datorer. 898 00:42:12,940 --> 00:42:15,580 Vi har alla kommit att acceptera ofta frustrerande problem som 899 00:42:15,580 --> 00:42:20,960 kom med dem-- buggar, virus och programvara glitches-- för små priser 900 00:42:20,960 --> 00:42:23,100 att betala för bekvämlighet. 901 00:42:23,100 --> 00:42:27,770 Men i högteknologiska och hög hastighet militär och rymdprogramansökningar, 902 00:42:27,770 --> 00:42:32,780 det minsta problemet kan förstoras till katastrof. 903 00:42:32,780 --> 00:42:38,880 >> Den 4 juni 1996 vetenskapsmän beredda att lansera en obemannad Ariane 5-raketen. 904 00:42:38,880 --> 00:42:41,190 Det bar vetenskapliga satelliter utformad 905 00:42:41,190 --> 00:42:44,570 att fastställa exakt hur den Jordens magnetfält samverkar 906 00:42:44,570 --> 00:42:47,380 med solvinden. 907 00:42:47,380 --> 00:42:50,580 Raketen byggdes för Europeiska rymdorganisationen, 908 00:42:50,580 --> 00:42:54,400 och lyfte från sin anläggning vid kusten i Franska Guyana. 909 00:42:54,400 --> 00:42:57,520 >> -at Ungefär 37 sekunder in flygningen, de först 910 00:42:57,520 --> 00:42:59,070 märkte något var fel. 911 00:42:59,070 --> 00:43:02,240 Att munstyckena var svängbara på ett sätt som de borde verkligen inte. 912 00:43:02,240 --> 00:43:06,550 Cirka 40 sekunder in i flygningen, tydligt att fordonet var i trubbel, 913 00:43:06,550 --> 00:43:08,820 och det är när de gjorde beslutet om att förstöra den. 914 00:43:08,820 --> 00:43:12,370 Utbudet skyddsombud, med enorma tarmar, tryckte på knappen 915 00:43:12,370 --> 00:43:18,030 och sprängde raketen innan den kunde blivit en fara för den allmänna säkerheten. 916 00:43:18,030 --> 00:43:21,010 >> -Detta Var jungfrun resan av Ariane 5, 917 00:43:21,010 --> 00:43:23,920 och dess förstörelse tog Placera på grund av fel 918 00:43:23,920 --> 00:43:25,932 inbäddad i raketens programvara. 919 00:43:25,932 --> 00:43:27,640 -The Problem på Ariane var att det 920 00:43:27,640 --> 00:43:30,500 var ett antal som krävs 64 bitar för att uttrycka, 921 00:43:30,500 --> 00:43:33,560 och de ville omvandla den till ett 16-bitars nummer. 922 00:43:33,560 --> 00:43:36,820 De antas att antalet aldrig kommer att bli mycket stora. 923 00:43:36,820 --> 00:43:40,940 Att de flesta av dessa siffror 64-bitars numret var nollor. 924 00:43:40,940 --> 00:43:42,450 De hade fel. 925 00:43:42,450 --> 00:43:45,000 >> -The Oförmåga av en mjukvaruprogram för att acceptera 926 00:43:45,000 --> 00:43:49,460 den typ av tal som genereras av en annan var roten till misslyckande. 927 00:43:49,460 --> 00:43:54,260 Mjukvaruutveckling hade blivit en mycket kostsam del av ny teknik. 928 00:43:54,260 --> 00:43:57,060 Den Ariane 4 raketen hade varit mycket framgångsrikt. 929 00:43:57,060 --> 00:44:01,600 Så mycket av den programvara som skapats för Det användes också i Ariane 5. 930 00:44:01,600 --> 00:44:04,790 >> -The Grundläggande problemet var att Ariane 5. 931 00:44:04,790 --> 00:44:11,200 Blev faster-- accelereras snabbare, och programmet hade inte stod för det. 932 00:44:11,200 --> 00:44:14,910 >> -The Förstörelse av raketen var en enorm ekonomisk katastrof. 933 00:44:14,910 --> 00:44:18,630 Allt på grund av en minut programvarufel. 934 00:44:18,630 --> 00:44:21,160 Men detta var inte den första tidsproblem data konvertering 935 00:44:21,160 --> 00:44:24,770 hade plågat modern raketteknik. 936 00:44:24,770 --> 00:44:28,020 >> -I 1991 med starten av det första Gulfkriget, 937 00:44:28,020 --> 00:44:30,540 Patriot missil upplevt liknande slag 938 00:44:30,540 --> 00:44:32,465 av ett antal konverteringsproblem. 939 00:44:32,465 --> 00:44:36,760 Och som ett resultat 28 people-- 28 Amerikanska soldiers-- dödades, 940 00:44:36,760 --> 00:44:39,010 och ett hundratal andra skadades. 941 00:44:39,010 --> 00:44:42,830 När Patriot, som var tänkt för att skydda mot inkommande Scuds, 942 00:44:42,830 --> 00:44:45,780 misslyckades med att avfyra en missil. 943 00:44:45,780 --> 00:44:51,610 >> -När Irak invaderade Kuwait, och Amerika lanserade Desert Storm i början av 1991, 944 00:44:51,610 --> 00:44:55,720 Patriot missil batterier utplacerades att skydda Saudiarabien och Israel 945 00:44:55,720 --> 00:44:59,180 från irakiska Scud missiler. 946 00:44:59,180 --> 00:45:03,080 Patriot är ett amerikanskt medium-range surface-to-air-systemet 947 00:45:03,080 --> 00:45:06,530 tillverkas av Raytheon företaget. 948 00:45:06,530 --> 00:45:09,500 >> -The Storlek av Patriot interceptor itself-- 949 00:45:09,500 --> 00:45:14,705 det är ungefär ungefär 20 meter lång, och den väger ca 2000 pounds. 950 00:45:14,705 --> 00:45:19,090 Och det bär en stridsspets av ca, Jag tycker det är runt 150 pounds. 951 00:45:19,090 --> 00:45:23,880 Och stridsspetsen själv är ett sprängämne, som 952 00:45:23,880 --> 00:45:26,700 har fragment omkring honom. 953 00:45:26,700 --> 00:45:31,630 Så höljet hos stridsspetsen är utformats för att fungera som en hagel. 954 00:45:31,630 --> 00:45:34,040 >> -The Missiler genom fyra per container, 955 00:45:34,040 --> 00:45:37,170 och transporteras av en påhängsvagn. 956 00:45:37,170 --> 00:45:44,880 >> -The Patriot anti-missilsystem går tillbaka minst 20 år nu. 957 00:45:44,880 --> 00:45:48,380 Den var ursprungligen avsedd som ett luftvärnsrobot 958 00:45:48,380 --> 00:45:50,810 att skjuta ner fientliga flygplan. 959 00:45:50,810 --> 00:45:54,410 I det första Gulfkriget när det kriget kom, 960 00:45:54,410 --> 00:45:59,650 armén ville använda den för att skjuta ner Scuds, inte flygplan. 961 00:45:59,650 --> 00:46:03,580 Den irakiska flygvapnet var inte så mycket av ett problem, 962 00:46:03,580 --> 00:46:06,590 men armén var orolig Scuds. 963 00:46:06,590 --> 00:46:10,120 Och så försökte de att uppgradera Patriot. 964 00:46:10,120 --> 00:46:12,740 >> -Intercepting En fiende missil färdas i Mach 5 965 00:46:12,740 --> 00:46:15,670 skulle bli utmanande nog. 966 00:46:15,670 --> 00:46:18,440 Men när Patriot var rusade i bruk, 967 00:46:18,440 --> 00:46:22,580 armén var inte medveten om en irakisk ändring som 968 00:46:22,580 --> 00:46:25,880 gjorde sina Scuds nästan omöjligt att den. 969 00:46:25,880 --> 00:46:30,690 >> Vad hände är Scuds som kom in var instabila. 970 00:46:30,690 --> 00:46:32,000 De var vinglig. 971 00:46:32,000 --> 00:46:37,210 Anledningen till detta var att Iraqis-- för att få 600 kilometer ut 972 00:46:37,210 --> 00:46:41,680 av en 300 kilometer lång rad missile-- tog vikt ur den främre stridsspetsen, 973 00:46:41,680 --> 00:46:43,340 och gjorde stridsspets ljusare. 974 00:46:43,340 --> 00:46:48,490 Så nu Patriot försöker komma vid Scud, och de flesta av time-- 975 00:46:48,490 --> 00:46:52,880 den överväldigande majoriteten av time-- det skulle bara flyga av Scud. 976 00:46:52,880 --> 00:46:57,120 >> -När Patriotsystemansvariga insåg Patriot missade sitt mål, 977 00:46:57,120 --> 00:47:01,630 De detonerade Patriot stridsspets att undvika eventuella förluster om det 978 00:47:01,630 --> 00:47:04,440 tilläts falla till marken. 979 00:47:04,440 --> 00:47:08,700 >> -Det Var vad de flesta människor såg som stora eldklot på himlen, 980 00:47:08,700 --> 00:47:14,180 och missförstås som avlyssningar av Scud stridsspetsar. 981 00:47:14,180 --> 00:47:18,020 >> -Även I natthimlen, patrioter verkade med framgång förstör 982 00:47:18,020 --> 00:47:23,280 Scuds åtmin Dhahran det kan finnas Ingen tvekan om dess prestanda. 983 00:47:23,280 --> 00:47:27,930 Där Patriot radarsystem förlorat kontakten med en inkommande Scud 984 00:47:27,930 --> 00:47:30,260 och aldrig lanserats på grund till en programvara fel. 985 00:47:30,260 --> 00:47:34,060 986 00:47:34,060 --> 00:47:38,880 >> Det var israelerna som först upptäcktes att ju längre systemet var på, 987 00:47:38,880 --> 00:47:41,130 desto större tidsavvikelse blev. 988 00:47:41,130 --> 00:47:44,770 På grund av en klocka inbäddad i systemets dator. 989 00:47:44,770 --> 00:47:48,190 >> -Omkring Två veckor före tragedin i Dhahran, 990 00:47:48,190 --> 00:47:50,720 israel rapporteras till Försvarsdepartementet 991 00:47:50,720 --> 00:47:52,410 att systemet var att förlora tid. 992 00:47:52,410 --> 00:47:54,410 Efter ca åtta timmar av löpning, märkte de 993 00:47:54,410 --> 00:47:57,690 att systemets bli märkbart mindre exakt. 994 00:47:57,690 --> 00:48:01,850 Försvarsdepartementet svarade med träffande alla Patriot batterier 995 00:48:01,850 --> 00:48:04,800 att inte lämna de system på under en längre tid. 996 00:48:04,800 --> 00:48:06,980 De sa aldrig vad en lång tid var. 997 00:48:06,980 --> 00:48:09,140 8 timmar, 10 timmar, tusen timmar. 998 00:48:09,140 --> 00:48:11,300 Ingen visste. 999 00:48:11,300 --> 00:48:13,320 >> -The Patriot batteri stationerad vid barackerna 1000 00:48:13,320 --> 00:48:18,310 vid Dhahran och dess bristfälliga inre Klockan hade varit på över 100 timmar 1001 00:48:18,310 --> 00:48:21,520 på kvällen den 25 februari. 1002 00:48:21,520 --> 00:48:25,792 >> -Det Band tid med en noggrannhet för ungefär en tiondels sekund. 1003 00:48:25,792 --> 00:48:27,950 Nu har en tiondels sekund är ett intressant 1004 00:48:27,950 --> 00:48:31,850 eftersom det inte kan uttryckas i binär exakt, vilket 1005 00:48:31,850 --> 00:48:36,500 innebär det inte kan uttryckas exakt i alla moderna digitala datorn. 1006 00:48:36,500 --> 00:48:41,070 Det är svårt att tro, men använda detta som ett exempel. 1007 00:48:41,070 --> 00:48:43,420 >> Låt oss ta nummer en tredjedel. 1008 00:48:43,420 --> 00:48:47,330 En tredjedel kan inte vara uttryckt i decimal exakt. 1009 00:48:47,330 --> 00:48:52,060 En tredjedel är 0,333 pågått i oändlighet. 1010 00:48:52,060 --> 00:48:56,420 Det finns inget sätt att göra det med absolut noggrannhet i en decimal. 1011 00:48:56,420 --> 00:48:59,530 Det är precis den typ av problem som hände i Patriot. 1012 00:48:59,530 --> 00:49:04,040 Ju längre systemet sprang, den värre tidsfelet blev. 1013 00:49:04,040 --> 00:49:08,840 >> -Efter 100 timmars drift fel i tiden var endast omkring en tredjedel 1014 00:49:08,840 --> 00:49:10,440 av en sekund. 1015 00:49:10,440 --> 00:49:14,150 Men när det gäller att rikta ett missil som färdas i Mach 5, 1016 00:49:14,150 --> 00:49:18,560 Det resulterade i en spårning fel på över 600 meter. 1017 00:49:18,560 --> 00:49:21,870 Det skulle vara ett allvarligt fel för soldaterna vid Dhahran. 1018 00:49:21,870 --> 00:49:28,455 >> Vad hände är en Scud lansering var detekteras av satelliter för tidig varning, 1019 00:49:28,455 --> 00:49:32,710 och de visste en Scud skulle komma i sin allmänna riktning. 1020 00:49:32,710 --> 00:49:35,150 De visste inte var det skulle komma. 1021 00:49:35,150 --> 00:49:38,210 Det var nu upp till radarn komponent i Patriot-systemet 1022 00:49:38,210 --> 00:49:43,150 försvara Dhahran att hitta och behålla koll på inkommande fientliga missiler. 1023 00:49:43,150 --> 00:49:44,561 >> -Den Radar var väldigt smart. 1024 00:49:44,561 --> 00:49:46,560 Det skulle faktiskt spåra positionen av Scud 1025 00:49:46,560 --> 00:49:48,930 och sedan förutsäga var det förmodligen skulle vara 1026 00:49:48,930 --> 00:49:51,380 nästa gång radar skickade en puls ut. 1027 00:49:51,380 --> 00:49:53,040 Det kallades området grinden. 1028 00:49:53,040 --> 00:49:57,620 >> -Då Gång Patriot beslutar tillräckligt med tid har 1029 00:49:57,620 --> 00:50:02,400 gått att gå tillbaka och kontrollera nästa plats för detta detekterade objektet 1030 00:50:02,400 --> 00:50:03,550 den går tillbaka. 1031 00:50:03,550 --> 00:50:07,820 Så när det gick tillbaka till fel plats, då ser det inget objekt. 1032 00:50:07,820 --> 00:50:10,360 Och den beslutar att det inte fanns något föremål. 1033 00:50:10,360 --> 00:50:13,630 Att det fanns en falsk detektering och det sjunker spåret. 1034 00:50:13,630 --> 00:50:16,970 >> -The Inkommande Scud försvann från radarskärmen, 1035 00:50:16,970 --> 00:50:20,200 och sekunder senare, det smällde in i kasernerna. 1036 00:50:20,200 --> 00:50:22,570 Den Scud dödade 28. 1037 00:50:22,570 --> 00:50:26,110 Det var den sista sparken under det första Gulfkriget. 1038 00:50:26,110 --> 00:50:31,920 Tragiskt nog, den uppdaterade programvaran anlände i gryningen följande dag. 1039 00:50:31,920 --> 00:50:34,870 Programvaran fel hade varit fast, stängning 1040 00:50:34,870 --> 00:50:39,150 ett kapitel i den oroliga historia Patriot missil. 1041 00:50:39,150 --> 00:50:40,030 >> [END VIDEOAVSPELNING] 1042 00:50:40,030 --> 00:50:41,488 >> DAVID J. MALAN: Det är det för CS50. 1043 00:50:41,488 --> 00:50:42,820 Vi kommer att se dig på onsdag. 1044 00:50:42,820 --> 00:50:46,420 1045 00:50:46,420 --> 00:50:50,370 >> [MUSIK SPELA] 1046 00:50:50,370 --> 00:54:23,446