1 00:00:00,000 --> 00:00:10,940 2 00:00:10,940 --> 00:00:13,060 >> DAVID J MALAN: All rett, så dette er CS50. 3 00:00:13,060 --> 00:00:15,040 Og dette er helt klart en fredag. 4 00:00:15,040 --> 00:00:16,850 Og dette er slutten av uken en. 5 00:00:16,850 --> 00:00:21,020 Så du husker kanskje at vi slapp, siste gang, med en cliffhanger slags. 6 00:00:21,020 --> 00:00:25,020 Hvor vi avsløre denne løgnen, at ingen Uansett hva du har lært voksende 7 00:00:25,020 --> 00:00:31,610 opp, 1 dividert med 10 er det, i Faktisk, 0,1 eller 0,100 eller 0,10000. 8 00:00:31,610 --> 00:00:35,270 Faktisk, hvis vi kompilere dette program, som vi gjorde i går, med, 9 00:00:35,270 --> 00:00:39,770 gjøre upresishet, og deretter gjøre dot, skråstrek, unøyaktighet, 10 00:00:39,770 --> 00:00:43,600 vi lært at dette er hva som er 1 delt på 10 faktisk er. 11 00:00:43,600 --> 00:00:46,140 Så det er egentlig ikke helt tilfelle. 12 00:00:46,140 --> 00:00:49,014 Men dette gjør hint på noen fundamental begrensning av datamaskiner. 13 00:00:49,014 --> 00:00:50,930 Og ja, blant ting vi kommer til å gjøre 14 00:00:50,930 --> 00:00:55,130 i dag er å ta en titt på hvorfor dette har skjedd, hvilke implikasjoner dette har, 15 00:00:55,130 --> 00:00:58,430 hvordan menneskeheten har mislyktes å forstå dette i noen svært 16 00:00:58,430 --> 00:01:00,410 alvorlig situations-- resultatet av hvilken 17 00:01:00,410 --> 00:01:03,141 har vært ganske tragisk og expensive-- og også 18 00:01:03,141 --> 00:01:04,849 ta en titt på hvordan vi kan faktisk forsvare 19 00:01:04,849 --> 00:01:06,530 mot slike begrensninger. 20 00:01:06,530 --> 00:01:10,940 Så intuitivt, kanskje, hvorfor er en delt med 10, 21 00:01:10,940 --> 00:01:15,480 i henhold til min datamaskin her, ikke bare 1/10, 0,10? 22 00:01:15,480 --> 00:01:15,980 Yeah. 23 00:01:15,980 --> 00:01:16,530 Hva synes du? 24 00:01:16,530 --> 00:01:17,860 >> Publikummer: The Radix er annerledes? 25 00:01:17,860 --> 00:01:18,550 >> DAVID J MALAN: The hva er? 26 00:01:18,550 --> 00:01:19,730 Oh, er radix annerledes? 27 00:01:19,730 --> 00:01:20,720 Så ikke helt. 28 00:01:20,720 --> 00:01:23,200 Det er faktisk mer grunnleggende for maskinvaren. 29 00:01:23,200 --> 00:01:23,980 Andre tanker? 30 00:01:23,980 --> 00:01:24,584 Yeah. 31 00:01:24,584 --> 00:01:26,750 Publikummer: De representerer tallene annerledes? 32 00:01:26,750 --> 00:01:27,880 DAVID J MALAN: Så they-- Høyre. 33 00:01:27,880 --> 00:01:29,338 De representerer tallene annerledes. 34 00:01:29,338 --> 00:01:30,700 Unøyaktig, tilsynelatende. 35 00:01:30,700 --> 00:01:33,190 Så det er-- Vel, forskjellig fra hva? 36 00:01:33,190 --> 00:01:34,490 Eller fra hvem? 37 00:01:34,490 --> 00:01:35,050 Fra oss? 38 00:01:35,050 --> 00:01:35,966 Publikum medlem: Yeah. 39 00:01:35,966 --> 00:01:38,930 De bruker ikke desimal system til [uhørbart]. 40 00:01:38,930 --> 00:01:39,680 DAVID J MALAN: OK. 41 00:01:39,680 --> 00:01:41,560 Så på en måte, gjør de ikke bruke desimalsystemet. 42 00:01:41,560 --> 00:01:43,720 Under panseret, alt er faktisk binære, 43 00:01:43,720 --> 00:01:45,510 og det er relatert, faktisk. 44 00:01:45,510 --> 00:01:48,135 Men det er enda en enklere forklaring enn det. 45 00:01:48,135 --> 00:01:48,635 Yeah. 46 00:01:48,635 --> 00:01:49,970 >> Publikummer: De bare har så mange biter. 47 00:01:49,970 --> 00:01:52,370 De kan bare lagre opp til en viss grad, som med desimalene. 48 00:01:52,370 --> 00:01:52,780 >> DAVID J MALAN: Yeah. 49 00:01:52,780 --> 00:01:54,420 Dette er hva som virkelig får på det. 50 00:01:54,420 --> 00:01:57,180 Det viser seg at datamaskiner Vanligvis vil alltid bare 51 00:01:57,180 --> 00:01:59,690 bruke en begrenset mengde informasjon å representere noe. 52 00:01:59,690 --> 00:01:59,870 Høyre? 53 00:01:59,870 --> 00:02:02,110 Tross alt, vi har bare en fast plass på harddisken. 54 00:02:02,110 --> 00:02:04,210 Vi har bare en fast mengde RAM, eller datamaskinens minne. 55 00:02:04,210 --> 00:02:06,251 Og hvis du bare har en fast beløp på noe, 56 00:02:06,251 --> 00:02:09,611 sikkert du ikke kan faktisk telle opp til uendelig eller så mange du vil. 57 00:02:09,611 --> 00:02:11,610 Du, slags, må velge hvilke utvalg 58 00:02:11,610 --> 00:02:13,220 av verdier du kommer til å støtte. 59 00:02:13,220 --> 00:02:18,100 >> Og så for eksempel en uke eller to siden, da vi snakket om ASCII, 60 00:02:18,100 --> 00:02:21,610 og vi snakket om 8 bits, eller en byte, så å si, 61 00:02:21,610 --> 00:02:26,360 det største antallet vi kunne representerer med 8 bits var hva? 62 00:02:26,360 --> 00:02:28,350 255. 63 00:02:28,350 --> 00:02:31,850 Og vi kan representere 256 totale verdier men ikke hvis vi bruker en av dem 64 00:02:31,850 --> 00:02:34,190 på 0-- Vel, men hvis vi bruke en av dem på 0, 65 00:02:34,190 --> 00:02:36,830 så det største antallet er, selvfølgelig, 255. 66 00:02:36,830 --> 00:02:39,410 >> Så det viser seg at dette er tilfelle også i denne sammenheng. 67 00:02:39,410 --> 00:02:42,350 Vi begynte å snakke, siste gang, om flyttall, som 68 00:02:42,350 --> 00:02:44,640 er forskjellige fra heltall, i at de har et punktum 69 00:02:44,640 --> 00:02:47,056 og, forhåpentligvis, noen tall etter det, men de er også. 70 00:02:47,056 --> 00:02:51,730 En datamaskin er bare typisk kommer å bruke 32 bits, kanskje 64 biter 71 00:02:51,730 --> 00:02:53,497 å representere et flyttall. 72 00:02:53,497 --> 00:02:56,080 Så selv om vi har vokst opp lære matematikk og vite 73 00:02:56,080 --> 00:02:58,750 som du absolutt kan ha et uendelig antall tall 74 00:02:58,750 --> 00:03:01,650 etter desimaltegnet, ikke hvis du har begrenset minne. 75 00:03:01,650 --> 00:03:03,930 Du, type, har å runde, eller velge hvilke 76 00:03:03,930 --> 00:03:05,346 tallene du kommer til å representere. 77 00:03:05,346 --> 00:03:08,710 Og så du kan tenke på, på en måte, dette blir datamaskinen nærmeste 78 00:03:08,710 --> 00:03:14,050 tilnærmelse til verdien 1/10 det kan bli, med bare 32 eller så biter. 79 00:03:14,050 --> 00:03:15,300 Og det er ikke bare 1/10. 80 00:03:15,300 --> 00:03:19,820 >> For eksempel, hvis jeg endre dette til 1/3, som vi tror er enda enklere. 81 00:03:19,820 --> 00:03:21,300 Så en delt på tre. 82 00:03:21,300 --> 00:03:22,355 La meg lagre filen. 83 00:03:22,355 --> 00:03:24,680 La meg gå videre og rekompilere den. 84 00:03:24,680 --> 00:03:25,820 Og la meg å kjøre den. 85 00:03:25,820 --> 00:03:30,000 Her også, tilsynelatende, er 1/3 ikke 0.3 og deretter et uendelig antall 3s 86 00:03:30,000 --> 00:03:30,770 etterpå. 87 00:03:30,770 --> 00:03:32,540 Du har denne unøyaktighet på slutten. 88 00:03:32,540 --> 00:03:35,544 Så vi mennesker er riktig, og hva du har lært er, faktisk, riktig, 89 00:03:35,544 --> 00:03:37,460 men vi er bumping opp mot noen begrensninger. 90 00:03:37,460 --> 00:03:39,420 >> Og det jeg trodde vi ville gjøre i dag, er å begynne 91 00:03:39,420 --> 00:03:42,190 ved å se på, for å være ærlig, det tragiske konsekvensene av dette 92 00:03:42,190 --> 00:03:45,490 noen ganger, når menneskeheten ikke helt implementere 93 00:03:45,490 --> 00:03:48,460 for denne virkeligheten og disse begrensningene. 94 00:03:48,460 --> 00:03:52,360 Og vi vil se en rekke vignetter fra History Channel som tar 95 00:03:52,360 --> 00:03:53,950 en titt på hvordan ting har gått galt. 96 00:03:53,950 --> 00:03:56,340 Det er ca 8 minutter lang, og vi vil komme tilbake etter dette 97 00:03:56,340 --> 00:03:59,439 og ta en titt på nøyaktig hva annet kan gå galt. 98 00:03:59,439 --> 00:04:00,605 Hvis vi kunne dimme lights-- 99 00:04:00,605 --> 00:04:02,350 >> [VIDEO PLAYBACK] 100 00:04:02,350 --> 00:04:06,310 >> -Computers, Har vi alle kommer til å akseptere de ofte frustrerende problemer som 101 00:04:06,310 --> 00:04:07,750 gå med dem. 102 00:04:07,750 --> 00:04:11,370 Bugs, virus og programvare glitches er små priser 103 00:04:11,370 --> 00:04:13,230 å betale for enkelhets skyld. 104 00:04:13,230 --> 00:04:17,519 Men i high-tech og high-speed militære og romprogram applikasjoner, 105 00:04:17,519 --> 00:04:22,130 det minste problemet kan foredles til katastrofe. 106 00:04:22,130 --> 00:04:27,750 4. juni 1996, forskere forberedt å lansere en ubemannet Ariane 5-raketten. 107 00:04:27,750 --> 00:04:29,890 Det var bærer vitenskapelig satellitter konstruert 108 00:04:29,890 --> 00:04:33,030 å etablere nøyaktig hvordan Jordens magnetfelt samhandler 109 00:04:33,030 --> 00:04:35,600 med solvind. 110 00:04:35,600 --> 00:04:37,930 Raketten ble bygget for European Space Agency 111 00:04:37,930 --> 00:04:41,620 og løftet av fra sitt anlegg på kysten av Fransk Guyana. 112 00:04:41,620 --> 00:04:44,924 >> -Og Ca 30 sekunder inn flyturen, de første 113 00:04:44,924 --> 00:04:46,340 la merke til noe gikk galt. 114 00:04:46,340 --> 00:04:49,280 At dysene ble sving på en måte de egentlig ikke burde. 115 00:04:49,280 --> 00:04:53,042 Rundt 40 sekunder inn i fly, klart kjøretøyet var i trøbbel, 116 00:04:53,042 --> 00:04:55,250 og det er da de gjorde beslutningen om å ødelegge det. 117 00:04:55,250 --> 00:04:58,970 En Range Safety Officer med enorm guts trykket på knappen, 118 00:04:58,970 --> 00:05:03,940 sprengte raketten før den kunne bli en fare for offentlig sikkerhet. 119 00:05:03,940 --> 00:05:06,600 >> -Dette Var jomfru voyage av Ariane 5, 120 00:05:06,600 --> 00:05:09,270 og dens ødeleggelse tok sted på grunn av en feil 121 00:05:09,270 --> 00:05:10,992 innebygd i raketten programvare. 122 00:05:10,992 --> 00:05:12,700 -Den Problem på Ariane var at det 123 00:05:12,700 --> 00:05:15,370 var et tall som kreves 64 bits til å uttrykke, 124 00:05:15,370 --> 00:05:18,150 og han ønsket å konvertere den til et 16 bits tall. 125 00:05:18,150 --> 00:05:21,160 De antok at antallet ble aldri kommer til å bli veldig stor, 126 00:05:21,160 --> 00:05:25,020 at de fleste av disse sifre i 64 biters tall var 0-tallet. 127 00:05:25,020 --> 00:05:26,310 De var galt. 128 00:05:26,310 --> 00:05:28,680 >> -Den Manglende evne til én program for å ta imot 129 00:05:28,680 --> 00:05:32,820 den type tall som genereres av en annen var ved roten av svikt. 130 00:05:32,820 --> 00:05:37,190 Programvareutvikling hadde blitt en svært kostbare delen av ny teknologi. 131 00:05:37,190 --> 00:05:40,760 Ariane 4 raketten hadde vært veldig lykkes, så mye av programvaren 132 00:05:40,760 --> 00:05:43,990 opprettet for det ble også brukes på Ariane 5. 133 00:05:43,990 --> 00:05:49,750 >> -Den Grunnleggende problemet var at Ariane 5 var raskere, akselerert raskere. 134 00:05:49,750 --> 00:05:53,000 Og programvaren ikke hadde stod for det. 135 00:05:53,000 --> 00:05:56,330 >> -Den Ødeleggelse av raketten var en stor økonomisk katastrofe, 136 00:05:56,330 --> 00:05:59,670 alt på grunn av en liten programvarefeil. 137 00:05:59,670 --> 00:06:01,990 Men dette var ikke den første time data konvertering problemer 138 00:06:01,990 --> 00:06:05,310 hadde plaget moderne rakett-teknologi. 139 00:06:05,310 --> 00:06:08,300 >> -I 1991, med start av den første Gulf-krigen, 140 00:06:08,300 --> 00:06:10,650 Patriot rakett opplevd en lignende type 141 00:06:10,650 --> 00:06:12,650 av antall konvertering problem. 142 00:06:12,650 --> 00:06:15,620 Som et resultat av 28 personer, 28 amerikanske soldater 143 00:06:15,620 --> 00:06:18,440 ble drept og om 100 andre såret, 144 00:06:18,440 --> 00:06:21,900 når Patriot, som var ment for å beskytte mot innkommende scuds, 145 00:06:21,900 --> 00:06:24,630 ikke klarte å avfyre ​​en rakett. 146 00:06:24,630 --> 00:06:29,440 >> -Når Irak invaderte Kuwait og USA lansert Desert Storm i begynnelsen av 1991, 147 00:06:29,440 --> 00:06:33,800 Patriot missilbatterier ble utplassert å beskytte Saudi Arabia og Israel 148 00:06:33,800 --> 00:06:37,000 fra irakiske Scud rakettangrep. 149 00:06:37,000 --> 00:06:40,610 The Patriot er en amerikansk, medium-range bakke-til-luft-system 150 00:06:40,610 --> 00:06:43,010 fremstilt av Raytheon Company. 151 00:06:43,010 --> 00:06:49,080 >> -Den Størrelsen på Patriot jagerfly, selv, er om, omtrent 20 fot lang. 152 00:06:49,080 --> 00:06:51,250 Og den veier ca 2000 pounds. 153 00:06:51,250 --> 00:06:55,195 Og det bærer et stridshode fra om-- Jeg tror det er omtrent 150 pounds. 154 00:06:55,195 --> 00:06:59,500 Og stridshodet, i seg selv, er en høyeksplosiv, 155 00:06:59,500 --> 00:07:02,570 som har fragmenter rundt det. 156 00:07:02,570 --> 00:07:06,890 Foringsrøret for stridshodet er laget for å fungere som buckshot. 157 00:07:06,890 --> 00:07:09,130 >> -De Raketter er gjennomført, 4 per container, 158 00:07:09,130 --> 00:07:12,080 og transporteres med en semi-trailer. 159 00:07:12,080 --> 00:07:19,100 >> -The Patriot anti missilsystem går tilbake minst 20 år nå. 160 00:07:19,100 --> 00:07:22,320 Det ble opprinnelig utviklet som en luftvernmissil 161 00:07:22,320 --> 00:07:24,180 å skyte ned fiendtlige fly. 162 00:07:24,180 --> 00:07:27,860 I den første Gulf-krigen, når den krigen kom, 163 00:07:27,860 --> 00:07:32,745 Hæren ønsket å bruke den til å skyte ned scuds, ikke fly. 164 00:07:32,745 --> 00:07:36,150 Den irakiske Force var ikke så mye av et problem, 165 00:07:36,150 --> 00:07:39,110 men hæren ble bekymret scuds. 166 00:07:39,110 --> 00:07:42,340 Og så de prøvde å oppgradere Patriot. 167 00:07:42,340 --> 00:07:44,760 >> -Intercepting En fiende rakett reiser på mach five 168 00:07:44,760 --> 00:07:47,250 skulle være utfordrende nok. 169 00:07:47,250 --> 00:07:50,000 Men når Patriot ble styrtet inn i tjeneste, 170 00:07:50,000 --> 00:07:54,030 Hæren var ikke klar over en Irakiske modifikasjon som gjorde 171 00:07:54,030 --> 00:07:56,840 sine scuds nesten umulig å treffe. 172 00:07:56,840 --> 00:08:01,020 >> -Hva Har skjedd, er de scuds som skulle komme inn, var ustabil, 173 00:08:01,020 --> 00:08:02,310 de ble vingler. 174 00:08:02,310 --> 00:08:05,140 Grunnen til dette, var irakerne, for 175 00:08:05,140 --> 00:08:09,450 å få 600 kilometer ut av en 300 kilometer rekkevidde rakett, 176 00:08:09,450 --> 00:08:12,930 tok vekten ut av foran stridshode og gjort stridshodet lettere. 177 00:08:12,930 --> 00:08:17,710 Så nå, patrioten er å prøve å komme ved Scud, og mesteparten av tiden, 178 00:08:17,710 --> 00:08:21,700 det overveldende flertallet av tid, ville det bare fly av Scud. 179 00:08:21,700 --> 00:08:25,700 >> -Når De Patriot systemoperatører innså Patriot savnet sitt mål, 180 00:08:25,700 --> 00:08:29,790 de detonerte Patriot stridshode, for å unngå mulige tap hvis det 181 00:08:29,790 --> 00:08:32,380 ble tillatt å falle til jorden. 182 00:08:32,380 --> 00:08:36,340 >> -Det Var hva folk flest så, de store ildkuler på himmelen, 183 00:08:36,340 --> 00:08:41,289 og misforstått som avskjærer av Scud-stridshoder. 184 00:08:41,289 --> 00:08:43,590 Selv i natt himmel, Patriots dukket 185 00:08:43,590 --> 00:08:47,020 å være vellykket ødelegge scuds, i Dhahran, 186 00:08:47,020 --> 00:08:49,730 det kan være noen feil om ytelsen. 187 00:08:49,730 --> 00:08:53,990 Der patriot radar system mistet oversikten over innkommende Scud, 188 00:08:53,990 --> 00:08:56,650 og aldri lansert, på grunn av en feil programvare. 189 00:08:56,650 --> 00:08:59,650 190 00:08:59,650 --> 00:09:04,100 Det var israelerne som først oppdaget at jo lenger systemet var på, 191 00:09:04,100 --> 00:09:07,510 jo større tidsavviket ble, som følge av en innebygd klokke 192 00:09:07,510 --> 00:09:09,490 i systemet datamaskin. 193 00:09:09,490 --> 00:09:12,670 >> -Om To uker før tragedien i Dhahran, 194 00:09:12,670 --> 00:09:15,010 israelerne rapportert til Forsvarsdepartementet, 195 00:09:15,010 --> 00:09:17,940 at systemet var å miste tid, at etter ca 8 timer med løping, 196 00:09:17,940 --> 00:09:21,410 de la merke til at systemet var bli merkbart mindre nøyaktig. 197 00:09:21,410 --> 00:09:25,290 Forsvarsdepartementet svarte med fortelle alle Patriot batterier 198 00:09:25,290 --> 00:09:28,070 å ikke la systemene i lang tid. 199 00:09:28,070 --> 00:09:29,960 De sa aldri hva en lang tid var. 200 00:09:29,960 --> 00:09:30,460 8 timer? 201 00:09:30,460 --> 00:09:30,960 10 timer? 202 00:09:30,960 --> 00:09:31,870 1000 timer? 203 00:09:31,870 --> 00:09:33,734 Ingen visste. 204 00:09:33,734 --> 00:09:35,650 -The Patriot batteri stasjonert ved brakkene 205 00:09:35,650 --> 00:09:40,410 på Dhahran, og dens feil interne klokke, hadde vært på over 100 timer 206 00:09:40,410 --> 00:09:43,041 på natten av februar 25 år. 207 00:09:43,041 --> 00:09:47,416 >> -Det Spores tid til en nøyaktighet på omtrent 1/10 av et sekund. 208 00:09:47,416 --> 00:09:49,290 Nå 1/10 av et sekund er et interessant tall 209 00:09:49,290 --> 00:09:52,700 fordi det ikke kan bli uttrykt i binære, akkurat. 210 00:09:52,700 --> 00:09:54,820 Hvilket betyr, kan det ikke bli uttrykt nøyaktig, 211 00:09:54,820 --> 00:09:57,420 i enhver moderne digital datamaskin. 212 00:09:57,420 --> 00:10:01,460 Det er vanskelig å tro, men bruker dette som et eksempel. 213 00:10:01,460 --> 00:10:03,520 La oss ta nummeret, 1/3. 214 00:10:03,520 --> 00:10:07,110 1/3 kan ikke uttrykkes i desimal, nøyaktig. 215 00:10:07,110 --> 00:10:11,490 1/3 er 0,333 pågått i det uendelige. 216 00:10:11,490 --> 00:10:15,486 Det er ingen måte å gjøre det, med absolutt nøyaktighet, i desimal. 217 00:10:15,486 --> 00:10:18,360 Det er akkurat samme type problem som skjedde i Patriot. 218 00:10:18,360 --> 00:10:22,510 Jo lengre system løp, den verre tiden feilen ble. 219 00:10:22,510 --> 00:10:28,420 >> -Etter 100 timers drift, feil tid var bare omtrent 1/3 av et sekund. 220 00:10:28,420 --> 00:10:31,830 Men i form av rettet mot en rakett reiser på mach 5, 221 00:10:31,830 --> 00:10:35,890 Det resulterte i en relativ feil på over 600 meter. 222 00:10:35,890 --> 00:10:38,970 Det ville være en fatal feil for soldatene på Dhahran. 223 00:10:38,970 --> 00:10:45,035 >> -Hva Har skjedd, er en Scud lanseringen var oppdaget av tidlig varsling satellitter, 224 00:10:45,035 --> 00:10:48,930 og de nye at Scud var Kommer i sin generelle retningen. 225 00:10:48,930 --> 00:10:51,170 De visste ikke hvor det kom. 226 00:10:51,170 --> 00:10:53,990 >> -Det Var nå opp til radaren komponent i Patriot system, 227 00:10:53,990 --> 00:10:58,520 forsvare Dhahran, for å finne og holde spor av innkommende fiendtlige missilet. 228 00:10:58,520 --> 00:10:59,690 >> -Den Radar var veldig smart. 229 00:10:59,690 --> 00:11:01,710 Det ville faktisk spore posisjonen til Scud 230 00:11:01,710 --> 00:11:04,040 og deretter forutse hvor det sannsynligvis ville være, 231 00:11:04,040 --> 00:11:06,140 neste gang, radar sendte en puls ut. 232 00:11:06,140 --> 00:11:07,660 Som ble kalt utvalget gate. 233 00:11:07,660 --> 00:11:11,870 >> -Da, Når Patriot bestemmer nok tid har 234 00:11:11,870 --> 00:11:16,280 vedtatt å gå tilbake og sjekke neste plassering for denne oppdagede objektet, 235 00:11:16,280 --> 00:11:17,280 det går tilbake. 236 00:11:17,280 --> 00:11:21,690 Så når det gikk tilbake til feil sted, så ser det ikke objektet 237 00:11:21,690 --> 00:11:25,230 og det bestemmer seg for at det ikke var noen objekt, det var en falsk deteksjon, 238 00:11:25,230 --> 00:11:26,650 og faller sporet. 239 00:11:26,650 --> 00:11:29,690 Den innkommende Scud forsvant fra radarskjermen, 240 00:11:29,690 --> 00:11:32,670 og sekunder senere, det slengte inn i brakkene. 241 00:11:32,670 --> 00:11:38,100 Den Scud drepte 28 og var den siste én avfyrt under første Gulf-krigen. 242 00:11:38,100 --> 00:11:43,460 Tragisk, den oppdaterte programvaren kom til Dhahran den påfølgende dagen. 243 00:11:43,460 --> 00:11:46,150 Programvaren feilen hadde vært fast, lukking 244 00:11:46,150 --> 00:11:48,940 ett kapittel i den urolige Historien om Patriot rakett. 245 00:11:48,940 --> 00:11:50,220 >> [END PLAYBACK] 246 00:11:50,220 --> 00:11:54,340 >> DAVID J MALAN: Så får vi ta en titt på noen lignende begrensninger i bare litt. 247 00:11:54,340 --> 00:11:58,470 Men først, la oss Overgangen til noen FYI finnes. 248 00:11:58,470 --> 00:12:01,575 Så one-- denne helgen, der vil være super seksjoner, 249 00:12:01,575 --> 00:12:04,200 som er ment å erstatte regelmessig seksjoner, som 250 00:12:04,200 --> 00:12:05,460 vil starte opp en uke frem i tid. 251 00:12:05,460 --> 00:12:08,204 Ta en titt på CS50 hjemmeside for mer informasjon om disse. 252 00:12:08,204 --> 00:12:11,120 De vil også bli filmet og streamet leve for de som ikke kan delta. 253 00:12:11,120 --> 00:12:12,980 Problemet satt en er på Kurset hjemmeside allerede, 254 00:12:12,980 --> 00:12:15,105 og vi tar en titt på at i bare en liten bit. 255 00:12:15,105 --> 00:12:18,350 Og arbeidstid vil også ta plassere denne mandag til torsdag. 256 00:12:18,350 --> 00:12:20,960 >> Så dette var den mest kanoniske programmet vi så på forrige gang. 257 00:12:20,960 --> 00:12:23,590 Det er som den enkleste program du kan skrive i C, 258 00:12:23,590 --> 00:12:25,250 og selv det er litt av en dristig påstand. 259 00:12:25,250 --> 00:12:25,750 Høyre? 260 00:12:25,750 --> 00:12:28,070 Fordi det er mye tilsynelatende kompleksitet til dette. 261 00:12:28,070 --> 00:12:30,445 Så la oss ta en rask titt på hva noen av disse elementene 262 00:12:30,445 --> 00:12:33,080 var og så prøve å gi en mental modell for hvordan 263 00:12:33,080 --> 00:12:35,710 disse enkleste av programmer arbeide, og så får vi begynne 264 00:12:35,710 --> 00:12:38,050 se på ting stadig mer komplekse. 265 00:12:38,050 --> 00:12:41,280 Så denne linjen her, markert nå, i gult, hva gjorde vi sier, siste gang, 266 00:12:41,280 --> 00:12:43,200 at dette betyr for oss? 267 00:12:43,200 --> 00:12:45,220 Hva er hensikten den fungerer? 268 00:12:45,220 --> 00:12:46,984 Noen fra lenger tilbake? 269 00:12:46,984 --> 00:12:47,483 Yeah. 270 00:12:47,483 --> 00:12:48,649 >> Publikummer: [uhørbart] 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 gir deg tilgang på kommandoer, eller la oss 274 00:12:53,537 --> 00:12:56,750 kaller dem fungerer, at noen andre skrev, som erklærte: 275 00:12:56,750 --> 00:12:58,350 så å si, i en annen fil. 276 00:12:58,350 --> 00:13:02,370 Så vi får se hva en .h fil er kontra en .c fil, til slutt. 277 00:13:02,370 --> 00:13:04,710 Men for nå, bare vet printf som, for eksempel, 278 00:13:04,710 --> 00:13:08,370 er blant de funksjonene som har vært deklarert i en annen fil, et sted 279 00:13:08,370 --> 00:13:12,930 annet på cloud harddisk som tillater oss å få tilgang printf og bruke den 280 00:13:12,930 --> 00:13:15,240 uten å gjenoppfinne at hjulet selv. 281 00:13:15,240 --> 00:13:16,930 I mellomtiden, hoved. 282 00:13:16,930 --> 00:13:19,690 Hva var analog av hoved, i forrige uke? 283 00:13:19,690 --> 00:13:20,190 Yeah. 284 00:13:20,190 --> 00:13:21,460 >> Publikummer: Grønn flagg klikkes. 285 00:13:21,460 --> 00:13:21,740 >> DAVID J MALAN: Yeah. 286 00:13:21,740 --> 00:13:23,490 Scratch-tallet, da grønne flagget klikket. 287 00:13:23,490 --> 00:13:25,560 Det er som puslespill brikke som sparker ting av. 288 00:13:25,560 --> 00:13:28,306 Og så på samme måte, gjorde verden besluttet noen år siden at i C, 289 00:13:28,306 --> 00:13:30,930 og en haug med andre språk, Hvis du ønsker å skrive et program, 290 00:13:30,930 --> 00:13:33,410 din første funksjonen har å bli kalt, hoved. 291 00:13:33,410 --> 00:13:34,641 Og det har å se slik ut. 292 00:13:34,641 --> 00:13:36,640 Men vi kommer tilbake, en annen gang, til hva, int, 293 00:13:36,640 --> 00:13:38,690 og, ugyldig, betyr i denne sammenhengen. 294 00:13:38,690 --> 00:13:42,860 For nå klammeparentes er snill av som Scratch puslespill brikke form 295 00:13:42,860 --> 00:13:45,080 som omslutter et antall linjer. 296 00:13:45,080 --> 00:13:47,070 Og blant på linjene her, dette er en her. 297 00:13:47,070 --> 00:13:51,610 printf er en funksjon som har som formål i livet er å skrive ut en formatert streng. 298 00:13:51,610 --> 00:13:55,010 Og ved formatert, jeg mener du kan plugge inn plassholder verdier, 299 00:13:55,010 --> 00:13:58,360 og du kan angi hvor mange desimal punkter, hvor mange tall som skal skrives ut 300 00:13:58,360 --> 00:14:00,040 etter et desimaltegn og lignende. 301 00:14:00,040 --> 00:14:05,040 Og printf, selvfølgelig, tar man eller flere argumenter eller parametere, 302 00:14:05,040 --> 00:14:06,770 også kjent, på en enklere måte, som innganger. 303 00:14:06,770 --> 00:14:09,230 >> Så printf, som mange funksjoner, tar innganger. 304 00:14:09,230 --> 00:14:12,730 Og disse inngangene er omfavnet av de to parentesene her. 305 00:14:12,730 --> 00:14:15,180 Og innsiden av dem er en inngang. 306 00:14:15,180 --> 00:14:18,600 Det er en streng, som vi har kalt det, som er bare en sekvens av tegn, 307 00:14:18,600 --> 00:14:22,310 som et ord eller en setning, eller en hel essay selv, i mellom doble anførselstegn. 308 00:14:22,310 --> 00:14:25,712 Og det er det som kommer til å påvirke oppførselen til printf grunn naturligvis 309 00:14:25,712 --> 00:14:27,170 det er bare en generisk print funksjon. 310 00:14:27,170 --> 00:14:29,600 Det kommer ikke til å vite hva å skrive ut, med mindre du forteller det. 311 00:14:29,600 --> 00:14:31,000 Og så, noen bagateller. 312 00:14:31,000 --> 00:14:34,056 Hva sa vi denne rare sekvens av symboler er? 313 00:14:34,056 --> 00:14:34,556 Yeah. 314 00:14:34,556 --> 00:14:35,410 >> Publikummer: Ny linje. 315 00:14:35,410 --> 00:14:35,990 >> DAVID J MALAN: Ny linje. 316 00:14:35,990 --> 00:14:39,340 Så det viser seg, kan du ikke bare trykke, angi når du skriver programmet. 317 00:14:39,340 --> 00:14:42,590 Generelt blir kompilatoren skal få litt forvirret med hensyn til hva du mener. 318 00:14:42,590 --> 00:14:45,340 Snarere må du bokstavelig talt si, gi meg en ny linje her. 319 00:14:45,340 --> 00:14:49,506 Og så / n er det vi vanligvis kalle en flukt karakter. 320 00:14:49,506 --> 00:14:50,870 Så n, for ny linje. 321 00:14:50,870 --> 00:14:53,810 Og kompilatoren vet at når den ser / n, 322 00:14:53,810 --> 00:14:57,420 det bør faktisk indusere datamaskinen, til slutt, eller printf, i dette tilfellet 323 00:14:57,420 --> 00:15:00,260 å skrive ut en faktisk ny linje, som treffer, skriver, 324 00:15:00,260 --> 00:15:01,480 tast på tastaturet. 325 00:15:01,480 --> 00:15:05,620 Og til slutt, hva gjorde vi sier dette stykke syntaksen er for? 326 00:15:05,620 --> 00:15:06,591 Hva representerer det? 327 00:15:06,591 --> 00:15:07,090 Yeah. 328 00:15:07,090 --> 00:15:07,490 >> Publikummer: [uhørbart] 329 00:15:07,490 --> 00:15:08,660 >> DAVID J MALAN: Det er bare enden av linjen. 330 00:15:08,660 --> 00:15:09,909 Det er slutten av setningen. 331 00:15:09,909 --> 00:15:11,890 Og innse at vi ikke sette dem overalt. 332 00:15:11,890 --> 00:15:13,900 Vi absolutt ikke sette dem ved endene av hver linje. 333 00:15:13,900 --> 00:15:16,680 For eksempel, det er ingen på første linje, det er ingen på linjen 334 00:15:16,680 --> 00:15:18,680 med, viktigste, det er ingen etter klammeparentes, 335 00:15:18,680 --> 00:15:21,740 men du vil begynne å se og få kjent med hvor det heter for. 336 00:15:21,740 --> 00:15:26,014 Og det er nesten alltid etter en funksjon Ring eller en uttalelse, litt action 337 00:15:26,014 --> 00:15:27,180 at du faktisk tar. 338 00:15:27,180 --> 00:15:29,520 >> Og vet nå, spesielt hvis blant de mindre komfortable, 339 00:15:29,520 --> 00:15:32,540 disse er den slags dumme ting at du vil ende opp ved et uhell banging 340 00:15:32,540 --> 00:15:33,873 hodet mot veggen over. 341 00:15:33,873 --> 00:15:36,107 Fordi du vil være logisk trygg på noen problem 342 00:15:36,107 --> 00:15:38,440 du har løst for et problem sett, og den jævla ting bare 343 00:15:38,440 --> 00:15:40,187 vil ikke kompilere eller selv kjøre. 344 00:15:40,187 --> 00:15:43,270 Og så ofte, tidlig, det kommer til å være fordi du savnet en parentes, 345 00:15:43,270 --> 00:15:44,455 eller du gikk glipp av et semikolon. 346 00:15:44,455 --> 00:15:46,547 Og så bare være oppmerksomme av slike ting, 347 00:15:46,547 --> 00:15:49,380 og prøv å ikke bli frustrert av dem fordi svært raskt gjør dette 348 00:15:49,380 --> 00:15:50,640 bli gammelt hat. 349 00:15:50,640 --> 00:15:53,910 Men det er veldig lett å få frustrert tidlig, som et resultat. 350 00:15:53,910 --> 00:15:57,020 >> Så nå, la oss ta en titt på hvordan denne linjen er faktisk fungerer 351 00:15:57,020 --> 00:15:59,170 og deretter se på en litt mer komplisert. 352 00:15:59,170 --> 00:16:02,017 Så vi har over her, evne til å trekke på denne skjermen. 353 00:16:02,017 --> 00:16:04,100 Og la oss anta at Dette er skjermen min, 354 00:16:04,100 --> 00:16:08,589 men jeg skriver det, hallo program, og jeg har ikke implementert, printf. 355 00:16:08,589 --> 00:16:10,130 Noen andre har implementert, printf. 356 00:16:10,130 --> 00:16:12,420 Hvem ønsker å hevde å har implementert, printf? 357 00:16:12,420 --> 00:16:12,920 Hvis vi kan? 358 00:16:12,920 --> 00:16:13,830 Greit, hva 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 opp. 361 00:16:15,529 --> 00:16:16,430 Kom opp. 362 00:16:16,430 --> 00:16:17,070 Greit. 363 00:16:17,070 --> 00:16:22,260 Så vi har, her, noen navneskilt, siden vi skal lage litt spill av dette. 364 00:16:22,260 --> 00:16:26,270 Og vi vil ringe deg, printf. 365 00:16:26,270 --> 00:16:30,170 Og hvis du ønsker å komme hit, hva jeg har bare trukket på skjermen, 366 00:16:30,170 --> 00:16:32,340 det er ganske enkelt, det er meg, dette. 367 00:16:32,340 --> 00:16:35,550 >> All right, så, hello my name is, printf, hvis du ønsker å sette det på. 368 00:16:35,550 --> 00:16:35,740 Greit. 369 00:16:35,740 --> 00:16:37,360 Og hvis du kan gå stativ av skjermen 370 00:16:37,360 --> 00:16:39,730 som om du er den funksjonen som kom med dette datasystemet. 371 00:16:39,730 --> 00:16:42,063 Og ditt formål i livet er å faktisk skrive ut noe. 372 00:16:42,063 --> 00:16:44,560 Men mye som programmet vi bare hadde på skjermen, her, 373 00:16:44,560 --> 00:16:47,060 vi er nødt til å faktisk gi deg noen innspill. 374 00:16:47,060 --> 00:16:51,810 >> Og så, hvis mitt innspill, her, er tilsynelatende, hva er gått til printf, 375 00:16:51,810 --> 00:16:53,730 la oss slags spotte det opp som dette. 376 00:16:53,730 --> 00:16:58,720 Jeg kommer til å bokstavelig talt skrive på et stykke papir, "Hei, verden" 377 00:16:58,720 --> 00:17:03,020 backslash N. Og for å være klar, hva Jeg har bare trukket på dette stykke papir, 378 00:17:03,020 --> 00:17:04,020 ser slik ut. 379 00:17:04,020 --> 00:17:08,730 Så når jeg kjører dette programmet, og dette gul linje med kode blir henrettet, 380 00:17:08,730 --> 00:17:12,970 det er som om jeg, hallo program, jeg overlate noen innspill til en funksjon 381 00:17:12,970 --> 00:17:13,970 at noen andre skrev. 382 00:17:13,970 --> 00:17:16,595 >> Og hvis du, med din finger, kunne faktisk, med fingeren, 383 00:17:16,595 --> 00:17:21,520 tegne på skjermen uansett det er du har blitt overlevert, 384 00:17:21,520 --> 00:17:27,465 effekten, til slutt, er å se nøyaktig at, på skjermen. 385 00:17:27,465 --> 00:17:29,140 Og et lite hjørne tilfelle her. 386 00:17:29,140 --> 00:17:31,540 Og bra, vi skal ikke se den, ny linje på dette punktet. 387 00:17:31,540 --> 00:17:33,900 Det ville være feil for deg eksplisitt tegne linjeskift. 388 00:17:33,900 --> 00:17:36,810 Men hvis vi fortsatte å skrive ordene på skjermen, vil de ende opp under det. 389 00:17:36,810 --> 00:17:39,560 >> Så tusen takk, men pinne rundt her for bare et øyeblikk. 390 00:17:39,560 --> 00:17:42,860 Vi trenger nå en annen frivillig, hvis vi kunne, 391 00:17:42,860 --> 00:17:46,830 som kommer til å trenge å spille rollen of-- Det er bare folk i orkesteret 392 00:17:46,830 --> 00:17:47,355 akkurat nå. 393 00:17:47,355 --> 00:17:47,980 Hvordan om-- OK. 394 00:17:47,980 --> 00:17:48,480 Akkurat her. 395 00:17:48,480 --> 00:17:49,180 Kom opp. 396 00:17:49,180 --> 00:17:49,955 Hva er navnet ditt? 397 00:17:49,955 --> 00:17:50,922 >> STUDENT 2: [? Ivay. ?] 398 00:17:50,922 --> 00:17:51,796 DAVID J MALAN: Sorry? 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 opp. 401 00:17:55,320 --> 00:17:55,820 Nei? 402 00:17:55,820 --> 00:17:58,390 Fikk jeg det galt, selv etter at du har sagt det to ganger? 403 00:17:58,390 --> 00:17:58,890 Kom opp. 404 00:17:58,890 --> 00:18:00,030 Det er vanskelig å høre her oppe. 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 Og jeg beklager, hva 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 For nå, hvis du ikke gjør det sinn, er du GetString. 411 00:18:10,430 --> 00:18:11,013 >> STUDENT 2: OK. 412 00:18:11,013 --> 00:18:11,797 Cool. 413 00:18:11,797 --> 00:18:14,630 DAVID J MALAN: Så hvis du ønsker å stå her for bare et øyeblikk, 414 00:18:14,630 --> 00:18:17,100 la oss ta en titt på en litt mer kompleks program, det vil 415 00:18:17,100 --> 00:18:18,670 nå har tre linjer med kode. 416 00:18:18,670 --> 00:18:24,080 Så vi har, en, oppgi navn ved hjelp printf; to, en oppfordring til GetString, 417 00:18:24,080 --> 00:18:28,060 etterfulgt av et oppdrag til en variabel kalt, snor s, eller kalt s; 418 00:18:28,060 --> 00:18:31,260 og deretter en annen samtale til, printf, men denne gangen med to innganger. 419 00:18:31,260 --> 00:18:33,646 >> Så vi har allerede gjort staten ditt navn, eller rettere sagt, vi har 420 00:18:33,646 --> 00:18:34,770 allerede gjort en printf samtale. 421 00:18:34,770 --> 00:18:38,960 Så jeg kommer til å skrive, oppgi navn. 422 00:18:38,960 --> 00:18:42,089 Og så, hva jeg kommer til å passere, printf, i et øyeblikk, 423 00:18:42,089 --> 00:18:43,005 er ganske enkelt, dette. 424 00:18:43,005 --> 00:18:47,760 Så hvis du ønsker å gå videre og trekke dette på skjermen, det er dine innspill nå. 425 00:18:47,760 --> 00:18:48,260 Greit. 426 00:18:48,260 --> 00:18:51,160 Og glem string, har vi nå vår egen linje av koden her. 427 00:18:51,160 --> 00:18:54,470 Så i, GetString, vi trenger å faktisk ringe, GetString. 428 00:18:54,470 --> 00:18:57,920 Så ditt formål i livet er å bare gå ut i orkesteret, hvis du kunne, 429 00:18:57,920 --> 00:18:58,980 og få noen navn. 430 00:18:58,980 --> 00:19:00,860 Men la oss gi deg noe å sette den på. 431 00:19:00,860 --> 00:19:02,908 Hvis du ønsker å gå fremover og få en streng, 432 00:19:02,908 --> 00:19:05,241 få noen navn på den stykke papir, hvis du kunne. 433 00:19:05,241 --> 00:19:12,940 434 00:19:12,940 --> 00:19:13,530 >> Greit. 435 00:19:13,530 --> 00:19:15,250 Og vi får se, i et øyeblikk, hvis navn vi får. 436 00:19:15,250 --> 00:19:17,630 I mellomtiden, hva jeg kommer til å ha klar, er et blankt 437 00:19:17,630 --> 00:19:21,340 papir, der, jeg kommer å lagre hva verdi det 438 00:19:21,340 --> 00:19:25,752 er at GetString er tilbake til meg, Jeg, som en streng variabel kalt, s. 439 00:19:25,752 --> 00:19:26,252 Greit. 440 00:19:26,252 --> 00:19:27,293 Så hva har du her? 441 00:19:27,293 --> 00:19:27,950 Nik. 442 00:19:27,950 --> 00:19:28,450 Greit. 443 00:19:28,450 --> 00:19:30,910 Så vi har Nik navn her. 444 00:19:30,910 --> 00:19:33,750 Så dette er hva bokstavelig har blitt returnert 445 00:19:33,750 --> 00:19:35,810 til meg, så å si, av GetString. 446 00:19:35,810 --> 00:19:38,720 >> Jeg, nå, jeg kommer til å utføre venstre side 447 00:19:38,720 --> 00:19:43,440 av det uttrykket, hvor jeg rett og slett kopiere ned, for dagens formål, Nik. 448 00:19:43,440 --> 00:19:46,470 Så nå har jeg en variabel kalt, s, lagring Nik navn. 449 00:19:46,470 --> 00:19:49,520 Jeg har allerede overlevert til printf, en tidligere argument. 450 00:19:49,520 --> 00:19:52,800 Men i vår tredje og siste linje av kode, jeg faktisk har til å hånd printf 451 00:19:52,800 --> 00:19:58,500 noe litt different-- "Hei,% s," backslash n. 452 00:19:58,500 --> 00:20:01,510 >> Og så den siste linjen jeg kommer til send-- den siste tingen jeg er 453 00:20:01,510 --> 00:20:03,060 kommer til å skrive ned nå, er dette. 454 00:20:03,060 --> 00:20:06,310 Så de to linjer med kode, eller snarere den siste linjen med kode, 455 00:20:06,310 --> 00:20:10,690 samtaler for to inputs-- en, denne, og to, dette. 456 00:20:10,690 --> 00:20:13,330 Så hvis vår printf funksjonen Nå kan du ta disse som input, 457 00:20:13,330 --> 00:20:16,000 la meg tømme skjermen for deg. 458 00:20:16,000 --> 00:20:17,250 Egentlig ikke, kan du gå videre. 459 00:20:17,250 --> 00:20:19,333 Vi vil la det opp, siden det er på det samme programmet. 460 00:20:19,333 --> 00:20:21,760 461 00:20:21,760 --> 00:20:27,380 Vi bør se, hallo, Nik. 462 00:20:27,380 --> 00:20:27,880 Greit. 463 00:20:27,880 --> 00:20:29,670 Så dette var ganske mange ringer å hoppe gjennom, bare 464 00:20:29,670 --> 00:20:31,620 å skrive, oppgi din navn, og, hallo, Nik. 465 00:20:31,620 --> 00:20:37,210 Men denne enkle ideen om meldingsutveksling, av input pasninger og utgang mottak, 466 00:20:37,210 --> 00:20:40,430 er akkurat den modellen vi kommer til å ha for selv de mest komplekse funksjoner. 467 00:20:40,430 --> 00:20:41,804 Så tusen takk til dere begge. 468 00:20:41,804 --> 00:20:43,730 Vi har en herlig spenning ball her for deg. 469 00:20:43,730 --> 00:20:48,890 Og takk til vår GetString og printf frivillige likt. 470 00:20:48,890 --> 00:20:49,551 Takk. 471 00:20:49,551 --> 00:20:50,050 Greit. 472 00:20:50,050 --> 00:20:50,966 Takk til dere begge. 473 00:20:50,966 --> 00:20:56,640 474 00:20:56,640 --> 00:21:00,430 >> Så vi har snakket om så langt, for det meste om strenger. 475 00:21:00,430 --> 00:21:06,550 Og det viser seg at C kan faktisk forstå noen forskjellige datatyper. 476 00:21:06,550 --> 00:21:08,860 Faktisk, la oss ta en titt på disse her. 477 00:21:08,860 --> 00:21:12,490 Så C, og en rekke språk, forstå ting som kalles tegn. 478 00:21:12,490 --> 00:21:16,852 En røye er generelt en enkelt byte, eller åtte biter. 479 00:21:16,852 --> 00:21:19,810 Og det representerer en enkelt karakter, som bokstaven A, eller hovedstaden 480 00:21:19,810 --> 00:21:21,990 bokstaven A, eller liten bokstav A, eller et utropstegn, 481 00:21:21,990 --> 00:21:25,440 eller hvilket som helst tegn på at du kan skrive på tastaturet, og noen ganger enda mer. 482 00:21:25,440 --> 00:21:26,795 Vi har også skje for å se flyter. 483 00:21:26,795 --> 00:21:31,160 En flottør er, generelt, en 32-bits verdi, eller fire byte 484 00:21:31,160 --> 00:21:33,660 fordi igjen, er en byte åtte bits. 485 00:21:33,660 --> 00:21:36,675 >> Så en dupp er et flyttall, noe med en desimal. 486 00:21:36,675 --> 00:21:38,550 Og ja, det er det filmen snakket 487 00:21:38,550 --> 00:21:42,240 om når de snakket om flytende punktverdier, noe fast antall bits 488 00:21:42,240 --> 00:21:43,940 blir brukt for å representere et reelt tall. 489 00:21:43,940 --> 00:21:45,740 Men det er også ting som kalles dobles. 490 00:21:45,740 --> 00:21:47,860 Disse finnes i Java, Hvis du har tatt APCS, 491 00:21:47,860 --> 00:21:51,540 og en dobbel, som navnet heldigvis antyder, er dobbelt så stor som en dupp. 492 00:21:51,540 --> 00:21:54,540 Det er fortsatt et reelt tall, det bare har flere biter 493 00:21:54,540 --> 00:21:58,390 med å bli stadig mer presis, eller å lagre enda større tall. 494 00:21:58,390 --> 00:21:58,890 int er enkelt. 495 00:21:58,890 --> 00:22:00,181 Vi snakket om den siste tiden. 496 00:22:00,181 --> 00:22:01,160 Det er bare et tall. 497 00:22:01,160 --> 00:22:03,980 Og det er som regel 32 biter, eller fire bytes. 498 00:22:03,980 --> 00:22:07,850 >> Og så, hvis du har, la oss se nå, 32 bits-- og vi gjorde dette i uke 0, 499 00:22:07,850 --> 00:22:10,820 aldri så briefly-- hvis du har 32 biter, hva er den største 500 00:22:10,820 --> 00:22:13,580 nummer du kan representere som et heltall? 501 00:22:13,580 --> 00:22:16,080 Gi eller ta? 502 00:22:16,080 --> 00:22:18,380 Det er som 4 milliarder kroner, og det er bare hvis vi er 503 00:22:18,380 --> 00:22:20,690 representerer bare positive tall. 504 00:22:20,690 --> 00:22:23,930 Hvis du har 32 bits, og du vil representere negative tall også, 505 00:22:23,930 --> 00:22:27,100 omfanget er, i hovedsak, negative 2 milliarder til positiv 2 milliarder. 506 00:22:27,100 --> 00:22:29,250 Men generelt, vil vi starte på 0 går opp til 4 milliarder. 507 00:22:29,250 --> 00:22:32,400 >> Du trenger ikke å vite nøyaktig, men Vi kan se dette, faktisk, hvis jeg bare 508 00:22:32,400 --> 00:22:36,400 åpne opp en liten kalkulator, her. 509 00:22:36,400 --> 00:22:41,070 Jeg kan gjøre to på 32, og det er akkurat hvor stort, 510 00:22:41,070 --> 00:22:43,190 hvor mange verdier du kan representerer, med 32 bits. 511 00:22:43,190 --> 00:22:44,442 Og det er omtrent 4 milliarder kroner. 512 00:22:44,442 --> 00:22:46,900 Så vi vil fortsette å se at antall i et par forskjellige steder. 513 00:22:46,900 --> 00:22:48,890 Men hvis du trenger lengre tall enn det, 514 00:22:48,890 --> 00:22:51,670 det viser seg at det er noe som kalles en lang lang. 515 00:22:51,670 --> 00:22:54,005 Og en lang lang er generelt 64 bits, som 516 00:22:54,005 --> 00:22:56,380 betyr at det er en størrelsesorden enda større enn en int. 517 00:22:56,380 --> 00:22:59,510 >> Så jeg kan ikke engang uttale den største nummer som du kan representere, 518 00:22:59,510 --> 00:23:01,340 men det er merkbart større. 519 00:23:01,340 --> 00:23:05,190 Nå som en side, historisk, hvis en int er 32 bits, 520 00:23:05,190 --> 00:23:12,780 og en lang lang er 64 bits, hvordan stort er en lang, ikke en lang lang tid? 521 00:23:12,780 --> 00:23:16,500 522 00:23:16,500 --> 00:23:20,330 Du tror det er lenger enn en int men kanskje mindre lang enn en lang lang, 523 00:23:20,330 --> 00:23:21,400 men det avhenger faktisk. 524 00:23:21,400 --> 00:23:23,400 >> Og så viser det seg én av frustrasjonene også, 525 00:23:23,400 --> 00:23:26,830 med å skrive kode på visse systemer, er at ikke alle av disse datatypene 526 00:23:26,830 --> 00:23:28,440 har forhåndsbestemte verdier. 527 00:23:28,440 --> 00:23:29,771 Noen ganger er det så mange biter. 528 00:23:29,771 --> 00:23:31,020 Noen ganger er det så mange biter. 529 00:23:31,020 --> 00:23:32,750 Slik at du faktisk må vite, noen ganger, hvilken maskinvare 530 00:23:32,750 --> 00:23:34,083 du kjører programvaren på. 531 00:23:34,083 --> 00:23:36,960 Heldigvis, andre språk og andre datatyper som nå finnes, 532 00:23:36,960 --> 00:23:38,400 tillate deg å være mer presis. 533 00:23:38,400 --> 00:23:41,220 Vel, vi så streng, og vi så bool, også, 534 00:23:41,220 --> 00:23:43,960 men det viser seg de kommer bare med CS50 biblioteket. 535 00:23:43,960 --> 00:23:46,240 Så de som ikke er bygget til C. De i stedet, 536 00:23:46,240 --> 00:23:49,340 kommer i den filen som heter CS50.h, at vi vil til slutt 537 00:23:49,340 --> 00:23:51,831 skallet tilbake lag av. 538 00:23:51,831 --> 00:23:53,830 Men for nå, de er bare flere datatyper. 539 00:23:53,830 --> 00:23:57,060 En bool er en sann eller usann, og en streng er en sekvens av tegn, 540 00:23:57,060 --> 00:23:57,970 som et ord. 541 00:23:57,970 --> 00:24:01,690 Nå printf, vi har sett, har plassholdere, er% s en. 542 00:24:01,690 --> 00:24:05,430 Og du kan være i stand til å nå, slutte fra disse andre eksempler, hvordan 543 00:24:05,430 --> 00:24:07,720 du kunne ha en plassholder for ulike datatyper. 544 00:24:07,720 --> 00:24:11,150 For eksempel ta en gjetning, hvis du ønsket å skrive ut en eneste røye hjelp 545 00:24:11,150 --> 00:24:15,270 printf, er plassholderen sannsynligvis% c. 546 00:24:15,270 --> 00:24:19,650 Og hvis du ønsker å skrive ut en heltall med plassholder,% i. 547 00:24:19,650 --> 00:24:25,150 % lld er en lang lang desimal verdi, men lang lang, slik at kartene til det. 548 00:24:25,150 --> 00:24:28,640 Og så% f for flytende punkt verdi eller for en dobbel, 549 00:24:28,640 --> 00:24:31,270 så noen ganger de er gjenbrukt i ulike sammenhenger. 550 00:24:31,270 --> 00:24:33,350 Så vi får se og bruke noen av de over tid. 551 00:24:33,350 --> 00:24:36,420 Og printf og andre funksjoner også støtte andres escape-sekvenser, 552 00:24:36,420 --> 00:24:38,080 og noen ganger, disse er nødvendige. 553 00:24:38,080 --> 00:24:39,770 Så backslash n er en ny linje. 554 00:24:39,770 --> 00:24:42,886 Backslash t, er det noen ønsker å ta et stikk? 555 00:24:42,886 --> 00:24:43,760 Publikum medlem: Tab. 556 00:24:43,760 --> 00:24:44,551 DAVID J MALAN: Tab. 557 00:24:44,551 --> 00:24:46,810 Så hvis du faktisk ønsker å skrive ut en fane, ikke 558 00:24:46,810 --> 00:24:49,940 et fast antall plasser, men en faktisk tabulatortegn, trenger du ikke treffer, 559 00:24:49,940 --> 00:24:53,490 tab, tast på tastaturet, generelt, du faktisk gjør backslash t. 560 00:24:53,490 --> 00:24:57,750 Backslash dobbel sitat, hvorfor skulle jeg ønske det? 561 00:24:57,750 --> 00:24:58,250 Høyre? 562 00:24:58,250 --> 00:25:00,417 Hvorfor kan jeg ikke bare skrive en dobbel sitat på tastaturet? 563 00:25:00,417 --> 00:25:02,124 Publikummer: Fordi, ellers er det 564 00:25:02,124 --> 00:25:04,830 kommer til å synes det er slutten av liker utskrifts [? tekst. ?] 565 00:25:04,830 --> 00:25:05,420 >> DAVID J MALAN: Nettopp. 566 00:25:05,420 --> 00:25:07,211 Husk at med vår printf eksempler, når vi 567 00:25:07,211 --> 00:25:10,075 var innom å printf i input, til venstre på at innspill string 568 00:25:10,075 --> 00:25:12,950 og på høyre side av at innspill våren, selvfølgelig, var en dobbel sitat. 569 00:25:12,950 --> 00:25:16,270 Hvis din egen inngang har en dobbel sitat i midten av det, 570 00:25:16,270 --> 00:25:18,920 datamaskinen kanskje potensielt blir forvirret, som til, 571 00:25:18,920 --> 00:25:20,760 gjør denne doble sitat hører hjemme i midten? 572 00:25:20,760 --> 00:25:22,150 Hører det med den venstre? 573 00:25:22,150 --> 00:25:23,566 Hører det med den rette? 574 00:25:23,566 --> 00:25:26,780 Og så, hvis du ønsker å gjøre det super klar, gjør du backslash dobbel sitat, 575 00:25:26,780 --> 00:25:30,480 slik at det er rømt, så å si, og det er ikke smeltet sammen til noe annet. 576 00:25:30,480 --> 00:25:34,400 Og det er noen andre her, backslash r, apostrof, 0, 577 00:25:34,400 --> 00:25:36,510 så vi kan se over tid, også. 578 00:25:36,510 --> 00:25:37,760 Og nå, hva om funksjoner? 579 00:25:37,760 --> 00:25:41,630 >> Så handlinger som vi kan ta så langt i dette språket, C, vel, vi har sett, 580 00:25:41,630 --> 00:25:44,320 printf, selvfølgelig, og alle av de andre på skjermen, 581 00:25:44,320 --> 00:25:47,140 her, at vi vil bruke for kursets første ukene bare, 582 00:25:47,140 --> 00:25:48,485 komme når CS50 biblioteket. 583 00:25:48,485 --> 00:25:51,850 Og de gjør det mye enklere, i C, å faktisk få brukerundersøkelser. 584 00:25:51,850 --> 00:25:54,200 Det viser seg at i C, og ærlig i noen språk, 585 00:25:54,200 --> 00:25:57,450 det er en reell smerte i nakken å gjøre noe enkelt, som ber brukeren 586 00:25:57,450 --> 00:26:01,310 for tastatur, for hans eller hennes innspill. 587 00:26:01,310 --> 00:26:03,240 Og så disse funksjonene gjør det enklere. 588 00:26:03,240 --> 00:26:05,472 >> Og det har også feil sjekker hele, 589 00:26:05,472 --> 00:26:07,180 slik at, når husker på onsdag, vi 590 00:26:07,180 --> 00:26:09,740 så, prøv på nytt, advarsel, når jeg ikke samarbeide, 591 00:26:09,740 --> 00:26:11,700 og jeg skrev et ord, i stedet for et tall? 592 00:26:11,700 --> 00:26:15,402 Vi har gjort de tunge løftene tidlig på å sørge for at brukeren samarbeider. 593 00:26:15,402 --> 00:26:17,860 Men dette er bare trening hjul som vi vil til slutt, 594 00:26:17,860 --> 00:26:19,640 og raskt, ta av. 595 00:26:19,640 --> 00:26:22,630 >> Så til oppsummering, da, la oss ta en rask titt, 596 00:26:22,630 --> 00:26:26,620 mye som vi gjorde med Scratch, på noen kanoniske konstruksjoner i C. 597 00:26:26,620 --> 00:26:28,580 Dette er ment å, liksom av, være en rask tur, 598 00:26:28,580 --> 00:26:30,990 bare slik at du har en referanse og som du har sett ting først. 599 00:26:30,990 --> 00:26:34,100 Men så skal vi se på selve kodingen bruke noen av disse byggeklosser. 600 00:26:34,100 --> 00:26:36,710 Så mye som i Scratch, når vi hadde uttalelser liker, 601 00:26:36,710 --> 00:26:41,570 si eller, vent, i C, har vi funksjoner også, som printf. 602 00:26:41,570 --> 00:26:45,350 >> Hvis vi ønsker å uttrykke en betingelse i C, er det tilsvarende, i ånd, 603 00:26:45,350 --> 00:26:47,840 til at puslespillbiten som så ut som dette i Scratch. 604 00:26:47,840 --> 00:26:49,850 Men i stedet, vi bokstavelig talt bare skrive om. 605 00:26:49,850 --> 00:26:51,830 Og så, i parentes, vi sette en betingelse, 606 00:26:51,830 --> 00:26:54,807 der at tilstanden er hva vi vil ringe, igjen, en boolsk uttrykk. 607 00:26:54,807 --> 00:26:56,390 Og igjen, dette er slags pseudokode. 608 00:26:56,390 --> 00:26:58,830 Og, faktisk, er // en kommentar. 609 00:26:58,830 --> 00:27:00,550 Det er bare engelske ord til meg selv. 610 00:27:00,550 --> 00:27:03,000 Men dette er den generelle Strukturen av en, hvis tilstand. 611 00:27:03,000 --> 00:27:05,220 Men vi får se betong eksempler i bare et øyeblikk. 612 00:27:05,220 --> 00:27:07,960 >> Hvis du ønsker å ha en toveis veiskille, 613 00:27:07,960 --> 00:27:11,740 mye som vi gjorde med våre frivillige på Onsdag, kan du ha en, annet hvis. 614 00:27:11,740 --> 00:27:16,020 Og hvis du vil ha en tredje og endelig tilstand, eller standard situasjon, 615 00:27:16,020 --> 00:27:19,006 du kan ha bare en annen blokk, der. 616 00:27:19,006 --> 00:27:21,880 Og på samme måte, med boolske uttrykk, du kan, og dem sammen. 617 00:27:21,880 --> 00:27:24,296 Og vi så på onsdag, som det er ikke en enkelt-tegn, 618 00:27:24,296 --> 00:27:28,220 det er to, for lavere nivå grunner som Vi vil til slutt se og spille med. 619 00:27:28,220 --> 00:27:30,410 Eller-ing sammen ting er 2 vertikale barer. 620 00:27:30,410 --> 00:27:32,240 På et amerikansk tastatur, dette er generelt en nøkkel 621 00:27:32,240 --> 00:27:35,730 med Skift-tasten ovenfor din Enter eller Retur-tasten. 622 00:27:35,730 --> 00:27:38,620 >> Så er det disse tingene som vi bruker kanskje en eller to ganger. 623 00:27:38,620 --> 00:27:42,570 De er funksjonelt likeverdig med hva du kan gjøre med en, om, annet hvis, 624 00:27:42,570 --> 00:27:44,950 else if annet, konstruere, men de kalles en bryter. 625 00:27:44,950 --> 00:27:48,020 De ser veldig annerledes, men vi vil se på noen av våre distribusjons kode, 626 00:27:48,020 --> 00:27:51,890 for en fremtidig problem sett, mest sannsynlig, at det er noen ganger bare en penere 627 00:27:51,890 --> 00:27:54,060 måte å uttrykke en hel haug av forholdene, 628 00:27:54,060 --> 00:27:57,590 uten å ha en masse klammeparentes og mange parenteser og innrykk. 629 00:27:57,590 --> 00:28:01,910 Men de gir oss ikke mer makt enn vi allerede har. 630 00:28:01,910 --> 00:28:02,550 Og nå loops. 631 00:28:02,550 --> 00:28:05,020 Og dette vil vi se ved en litt langsommere. 632 00:28:05,020 --> 00:28:08,470 Men så skal vi begynne å bruke disse, spesielt for de som allerede er kjent. 633 00:28:08,470 --> 00:28:13,830 Dette er den kanoniske måten, hvis utrolig uforståelige måten å skrive en løkke i C. 634 00:28:13,830 --> 00:28:15,896 >> Nå en løkke i Scratch var ganske grei. 635 00:28:15,896 --> 00:28:17,020 Du har en, for alltid, blokk. 636 00:28:17,020 --> 00:28:19,760 Du har en, gjentar, blokk med bare et tall du må skrive inn. 637 00:28:19,760 --> 00:28:22,220 Og med den, for loop, kan du gjennomføre begge disse ideene, 638 00:28:22,220 --> 00:28:23,595 men det er litt mer teknisk. 639 00:28:23,595 --> 00:28:25,994 Men ærlig talt, det er også forholdsvis enkel. 640 00:28:25,994 --> 00:28:28,160 Når du vet rekkefølgen på operasjoner, du bokstavelig talt 641 00:28:28,160 --> 00:28:30,910 bare skal plugge inn verdier og fortelle datamaskinen hva de skal gjøre. 642 00:28:30,910 --> 00:28:32,800 Så her er et eksempel. 643 00:28:32,800 --> 00:28:38,040 Dette er en løkke som, ganske enkelt, teller fra ett tall opp 644 00:28:38,040 --> 00:28:40,187 gjennom en annen. 645 00:28:40,187 --> 00:28:42,020 Og bare ved å kaste et blikk på det, selv om du har 646 00:28:42,020 --> 00:28:44,660 ingen tidligere erfaring med dette språket, hvilket nummer 647 00:28:44,660 --> 00:28:46,920 betyr det sannsynligvis begynne å telle på? 648 00:28:46,920 --> 00:28:47,730 OK, 0. 649 00:28:47,730 --> 00:28:50,240 Og jeg tipper det er fordi du se at det er en int og en jeg, 650 00:28:50,240 --> 00:28:51,073 som er en variabel. 651 00:28:51,073 --> 00:28:52,390 Det er initialisert til 0. 652 00:28:52,390 --> 00:28:55,670 >> Og senere, ser det ut som vi passerer printf, en verdi. 653 00:28:55,670 --> 00:28:58,000 Og, faktisk, gjorde jeg en liten skrivefeil her. 654 00:28:58,000 --> 00:28:59,850 Men det er lett fast. 655 00:28:59,850 --> 00:29:02,390 La meg legge inn, jeg her. 656 00:29:02,390 --> 00:29:06,150 Vi har nå printf velvære vedtatt at plassholder value. 657 00:29:06,150 --> 00:29:08,299 Og hva som kommer til å telle opp gjennom? 658 00:29:08,299 --> 00:29:08,840 PUBLIKUM: 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, ved første øyekast virker riktig. 663 00:29:13,340 --> 00:29:16,990 Men at det viser seg, kommer til å være vår tilstand som vi fortsette å se. 664 00:29:16,990 --> 00:29:21,740 Og vi kommer til å stoppe en gang i er ikke lenger mindre enn 50. 665 00:29:21,740 --> 00:29:24,920 Så denne sløyfen omvendt, bør utføre, så lenge jeg er under 50. 666 00:29:24,920 --> 00:29:28,891 Men så snart det blir 50 eller 51, eller verre, bør den stoppe automatisk. 667 00:29:28,891 --> 00:29:29,390 Greit. 668 00:29:29,390 --> 00:29:31,200 >> Så hva skjer egentlig her? 669 00:29:31,200 --> 00:29:33,160 Så dette er rekkefølgen på operasjoner for en sløyfe. 670 00:29:33,160 --> 00:29:35,440 One, har du såkalt initialisering. 671 00:29:35,440 --> 00:29:38,264 Denne gule uthevet blings av koden kjøres først, 672 00:29:38,264 --> 00:29:40,930 og det har den virkning at, per Onsdag, har du sannsynligvis forestille deg. 673 00:29:40,930 --> 00:29:45,500 Det skaper en variabel som heter jeg, og det butikker i den variabelen verdien 0. 674 00:29:45,500 --> 00:29:47,560 Så jeg er 0 på dette punktet i historien. 675 00:29:47,560 --> 00:29:49,680 >> Det neste som skjer i denne konstruksjonen, 676 00:29:49,680 --> 00:29:51,540 er at tilstanden blir kontrollert. 677 00:29:51,540 --> 00:29:54,325 Så jeg sjekke umiddelbart, er jeg mindre enn 50? 678 00:29:54,325 --> 00:29:57,700 Og selvfølgelig, er svaret for nå er, sikkert, ja. 679 00:29:57,700 --> 00:30:00,710 Ja, fordi jeg er 0, og det er sikkert mindre enn 50. 680 00:30:00,710 --> 00:30:03,866 Så hva som skjer, er at dette kodelinje blir henrettet. 681 00:30:03,866 --> 00:30:06,740 Og faktisk, hvis det er multiple kodelinjer i disse klammeparentes, 682 00:30:06,740 --> 00:30:09,020 de alle bli henrettet en etter en. 683 00:30:09,020 --> 00:30:11,450 >> Og i effekt her, er tilsynelatende, for å skrive ut 684 00:30:11,450 --> 00:30:15,365 antall i, som skal være 0, og deretter en, og deretter to. 685 00:30:15,365 --> 00:30:15,865 Men hvorfor? 686 00:30:15,865 --> 00:30:17,410 Hvorfor det blir økes? 687 00:30:17,410 --> 00:30:20,680 Vel, den fjerde tingen som skjer er at denne syntaksen 688 00:30:20,680 --> 00:30:22,610 blir utført, etter semikolon. 689 00:30:22,610 --> 00:30:27,506 i ++ er en forkortelse måte å si; ta verdien av i, og legge en til det; 690 00:30:27,506 --> 00:30:30,380 og så neste gang rundt, legge 1 til den; og neste gang rundt, 691 00:30:30,380 --> 00:30:31,330 legge en til det. 692 00:30:31,330 --> 00:30:33,640 >> Så hvis vi holder det gående, hva kommer til å skje 693 00:30:33,640 --> 00:30:35,890 neste er jeg ikke kommer til å initial jeg noensinne igjen. 694 00:30:35,890 --> 00:30:38,290 Hvis jeg holdt initialisering jeg til 0, dette eksemplet 695 00:30:38,290 --> 00:30:41,110 ville aldri slutt fordi jeg ville bli sittende fast på 0. 696 00:30:41,110 --> 00:30:43,870 Men hva kommer til å skje er at tilstanden vil bli kontrollert, 697 00:30:43,870 --> 00:30:54,280 linjen med kode vil bli henrettet, det jeg skal økes, 698 00:30:54,280 --> 00:30:56,970 tilstand vil bli kontrollert, koden vil bli henrettet. 699 00:30:56,970 --> 00:30:59,790 Og det holdt sykling igjen, og igjen, og igjen, 700 00:30:59,790 --> 00:31:03,340 før jeg ++ induserer en verdi av 50. 701 00:31:03,340 --> 00:31:05,870 >> Tilstanden da sier, er 50 mindre enn 50? 702 00:31:05,870 --> 00:31:09,360 Svaret er selvfølgelig nei, og så hele koden stopper utføring. 703 00:31:09,360 --> 00:31:13,020 Og hvis du har mer kode på skjermen der nede, det er hva som skjer videre. 704 00:31:13,020 --> 00:31:17,530 Det spretter ut av disse klammeparentes og fortsetter å skrive ut mer etter det. 705 00:31:17,530 --> 00:31:20,470 >> Så en spøk nå, fra Foxtrot, som vil du kanskje nå forstår. 706 00:31:20,470 --> 00:31:30,810 707 00:31:30,810 --> 00:31:31,560 Det er alltid morsomt. 708 00:31:31,560 --> 00:31:34,110 Det er som de humrer slags sive, 709 00:31:34,110 --> 00:31:38,370 og da du innser at du ikke burde være å le av humor som dette. 710 00:31:38,370 --> 00:31:41,160 Men det er noen takeaway her, pedagogisk, også. 711 00:31:41,160 --> 00:31:43,577 Så det viser seg at jeg er mangler en bit av syntaks, 712 00:31:43,577 --> 00:31:45,410 eller foxtrot er mangler en stykke syntaks her. 713 00:31:45,410 --> 00:31:48,076 Hva som mangler, at vi har hatt i alle andre eksempel, så langt? 714 00:31:48,076 --> 00:31:51,599 715 00:31:51,599 --> 00:31:53,390 Til gjengjeld er der, så det er noe annet, 716 00:31:53,390 --> 00:31:54,440 at vi vil komme tilbake til før lenge. 717 00:31:54,440 --> 00:31:55,398 Hva som mangler, skjønt? 718 00:31:55,398 --> 00:31:55,908 Yeah. 719 00:31:55,908 --> 00:31:58,150 >> Publikummer: The initialisering av [uhørbart]. 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å egentlig, er-- dette Vel, og teller er initialisert 723 00:32:03,210 --> 00:32:05,470 opp ovenfor, eller rettere sagt, erklærte seg over. 724 00:32:05,470 --> 00:32:06,960 Så dette er en annen måte å gjøre det. 725 00:32:06,960 --> 00:32:08,685 Men ikke i en linje er det gyldig skjønt. 726 00:32:08,685 --> 00:32:09,310 Hva med her? 727 00:32:09,310 --> 00:32:10,196 >> Publikummer: Er det klammeparentes? 728 00:32:10,196 --> 00:32:10,640 >> DAVID J MALAN: Yeah. 729 00:32:10,640 --> 00:32:12,080 Så klammeparentes mangler. 730 00:32:12,080 --> 00:32:15,495 Men denne koden, mener jeg, deres kreditt, faktisk er, syntaktisk gyldig. 731 00:32:15,495 --> 00:32:17,610 Det viser seg, trenger du ikke trenger klammeparentes 732 00:32:17,610 --> 00:32:21,691 hvis du bare har en linje med kode som du ønsker å utføre innsiden av løkken. 733 00:32:21,691 --> 00:32:24,190 Nå har vi alltid, i klassen og i alle våre distribusjons kode, 734 00:32:24,190 --> 00:32:26,730 inkluderer klammeparentes uansett, bare for klarhetens skyld. 735 00:32:26,730 --> 00:32:29,010 Men innser at i lærebøker og online eksempler, 736 00:32:29,010 --> 00:32:31,300 du kan godt se krøllete bukseseler mangler en gang. 737 00:32:31,300 --> 00:32:34,850 Og det er OK, hvis det du har rykket inn og beregnet 738 00:32:34,850 --> 00:32:38,650 er bare en eneste linje med kode, og ikke flere linjer med kode, potensielt. 739 00:32:38,650 --> 00:32:39,150 Greit. 740 00:32:39,150 --> 00:32:44,500 Så knyttet til spørsmålet om upresishet, er en sak av overløp, 741 00:32:44,500 --> 00:32:48,560 i den forstand at, på samme måte, trenger heltall ha grenser for dem 742 00:32:48,560 --> 00:32:49,970 akkurat som flyt verdier? 743 00:32:49,970 --> 00:32:53,120 I verden til et flyttall verdier, kan vi bare være så presis, 744 00:32:53,120 --> 00:32:55,710 hvoretter, iblant dårlige ting kan skje, 745 00:32:55,710 --> 00:32:57,760 og våre programmer kan være buggy og feiling. 746 00:32:57,760 --> 00:33:00,050 Nå selv med heltall, du kan støte på problemer. 747 00:33:00,050 --> 00:33:03,820 Nå et heltall ikke har en desimaltegn eller tall etter det. 748 00:33:03,820 --> 00:33:07,130 Det er bare et naturlig tall, typisk. 749 00:33:07,130 --> 00:33:09,430 Så hva kan gå galt med en int? 750 00:33:09,430 --> 00:33:12,210 Hvis jeg bruker en int til telle, hva kan gå galt? 751 00:33:12,210 --> 00:33:13,230 Virker mye enklere. 752 00:33:13,230 --> 00:33:13,873 Yeah. 753 00:33:13,873 --> 00:33:16,240 >> Publikummer: Hvis nummer blir [uhørbart] 754 00:33:16,240 --> 00:33:17,073 >> DAVID J MALAN: Yeah. 755 00:33:17,073 --> 00:33:20,820 Hva hvis du teller så høyt, at du kan ikke uttrykke at virkelig store tall. 756 00:33:20,820 --> 00:33:21,320 Høyre? 757 00:33:21,320 --> 00:33:23,910 På et tidspunkt, du kommer å overskride grensene 758 00:33:23,910 --> 00:33:27,077 av en 32-bits verdi eller et 64-bits verdi. 759 00:33:27,077 --> 00:33:29,410 Nå igjen, jeg er ikke sikker på hvordan å uttale en 64-biters verdi, 760 00:33:29,410 --> 00:33:32,230 men jeg vet at med en 32-bits heltall, den største verdi kan det være, 761 00:33:32,230 --> 00:33:35,490 hvis det er bare positivt verdier, er omtrent 4 milliarder kroner. 762 00:33:35,490 --> 00:33:39,000 Så hvis jeg prøver å telle til 5 milliarder kroner, noe kommer til å skje. 763 00:33:39,000 --> 00:33:41,050 Men la oss se hva, faktisk kan skje. 764 00:33:41,050 --> 00:33:44,570 I en verden av heltall overløp, hvor du, på en måte, 765 00:33:44,570 --> 00:33:48,270 overløp av kapasiteten til en heltall, hva som kan skje? 766 00:33:48,270 --> 00:33:51,190 >> Så her er et binært tall, det er et tilbakesteg til 0. 767 00:33:51,190 --> 00:33:54,630 Det er alle 1-tallet, og de plassholdere det er krefter på 2, 768 00:33:54,630 --> 00:33:55,980 så dette er binær. 769 00:33:55,980 --> 00:33:59,416 Så disse er 8, en biter på skjermen. 770 00:33:59,416 --> 00:34:01,290 Og hvis du husker eller du raskt gjøre regnestykket, 771 00:34:01,290 --> 00:34:06,074 hvilken verdi er representert her med disse åtte en bit? 772 00:34:06,074 --> 00:34:06,950 255. 773 00:34:06,950 --> 00:34:09,260 Og selv om du ikke var helt sikker av regnestykket, kan du gjøre det ut. 774 00:34:09,260 --> 00:34:10,550 Eller du kan bare snill fornuftens gjennom det, 775 00:34:10,550 --> 00:34:12,633 vent litt, hvis jeg er representerer en 8 bits verdi, 776 00:34:12,633 --> 00:34:17,750 og jeg har fått 256 mulige verdier, men den første av disse er 0, 777 00:34:17,750 --> 00:34:19,909 Jeg bare vet at største kommer til å være 255, 778 00:34:19,909 --> 00:34:21,510 og det er hva dette kan være. 779 00:34:21,510 --> 00:34:26,060 >> Så antar jeg prøver å legge en til denne verdien. 780 00:34:26,060 --> 00:34:28,750 Hva ville du gjøre i klasse skolen når du legger til en 1, og det 781 00:34:28,750 --> 00:34:31,139 egentlig ikke passer fordi du må bære en? 782 00:34:31,139 --> 00:34:34,380 Hva er dette tallet kommer til å bli når du legger til en? 783 00:34:34,380 --> 00:34:37,030 Det kommer til å bli 0. 784 00:34:37,030 --> 00:34:37,530 Høyre? 785 00:34:37,530 --> 00:34:41,139 Fordi hvis du hadde mer bits-- og jeg skal prøv å, på en måte, skriver den ut her-- 786 00:34:41,139 --> 00:34:44,710 hvis vi hadde flere biter, hva vi kunne gjøre her er å legge til en, 787 00:34:44,710 --> 00:34:47,370 og da vil vi få dette. 788 00:34:47,370 --> 00:34:48,739 Uff da. 789 00:34:48,739 --> 00:34:52,250 Vi ville ha en en bit hele veien over her. 790 00:34:52,250 --> 00:34:55,530 >> Men hvis dette er en endelig verdi, er det bare 8 bits, 791 00:34:55,530 --> 00:34:57,480 og det er forhåndsbestemt av datamaskinen, 792 00:34:57,480 --> 00:34:59,370 at en er effektivt ikke der. 793 00:34:59,370 --> 00:35:00,980 Det faller bare slags utfor et stup. 794 00:35:00,980 --> 00:35:05,480 Og så hvis du legg 1 til 255, hva verdi har du tydeligvis få? 795 00:35:05,480 --> 00:35:06,180 0. 796 00:35:06,180 --> 00:35:09,700 Og så tallene uhell, og kanskje ubevisst, 797 00:35:09,700 --> 00:35:12,040 ender opp innpakning rundt som dette. 798 00:35:12,040 --> 00:35:14,079 Så hva kan være konsekvensen av dette? 799 00:35:14,079 --> 00:35:15,620 Vel, det er et par forskjellige ting. 800 00:35:15,620 --> 00:35:18,751 Så en, betyr det ende opp som ser som 0, utilsiktet, 801 00:35:18,751 --> 00:35:20,750 men du kan slags se, selv i den virkelige verden, 802 00:35:20,750 --> 00:35:23,416 for bedre eller verre, manifestasjoner av denne ideen om en grense. 803 00:35:23,416 --> 00:35:26,630 For eksempel, noen av dere som noen gang har spilt Lego Star Wars, 804 00:35:26,630 --> 00:35:28,880 er det noen som tilfeldigvis vet maksimalt antall mynter 805 00:35:28,880 --> 00:35:32,032 du kan samle seg i Lego Star Wars? 806 00:35:32,032 --> 00:35:35,640 Ta en gjetning basert på dagens ledende spørsmål. 807 00:35:35,640 --> 00:35:39,140 Det er større enn 256 eller 255. 808 00:35:39,140 --> 00:35:40,330 Det er 4 milliarder kroner. 809 00:35:40,330 --> 00:35:42,080 Så det viser seg, og det er noen people-- 810 00:35:42,080 --> 00:35:46,080 noen googling bekreftet sist kvelden-- har fått 4 milliarder gullmynter, 811 00:35:46,080 --> 00:35:47,730 eller whatnot, i Lego Star Wars. 812 00:35:47,730 --> 00:35:49,860 Selv tilsynelatende, det er en måte å lure spillet, 813 00:35:49,860 --> 00:35:53,222 det er en bug eller funksjon, som lar deg bare tilfalle mange og massevis av poeng. 814 00:35:53,222 --> 00:35:54,930 Men den største mulige verdi, i henhold 815 00:35:54,930 --> 00:35:58,360 til dette skjermbilde av noen jeg funnet på nettet, er faktisk 4 milliarder. 816 00:35:58,360 --> 00:35:59,240 >> Nå hvorfor er det? 817 00:35:59,240 --> 00:36:03,040 Det er nettopp 4 milliarder kroner, sannsynligvis fordi noen bestemte seg, 818 00:36:03,040 --> 00:36:05,500 som skrev dette spillet, at de kunne gjøre 4 milliarder kroner, 819 00:36:05,500 --> 00:36:07,340 noe, noe, noe som verdien jeg satt opp 820 00:36:07,340 --> 00:36:10,256 med kalkulatoren tidligere, men det er bare litt renere for mennesker 821 00:36:10,256 --> 00:36:12,610 for å si det maksimale antallet av coins-- eller pigger, 822 00:36:12,610 --> 00:36:14,860 som de kaller them-- at du kan samle er 4 milliarder. 823 00:36:14,860 --> 00:36:16,290 Og så, hvorfor er dette? 824 00:36:16,290 --> 00:36:20,310 Hvordan er LEGO spill implementere telleren 825 00:36:20,310 --> 00:36:23,420 som holder orden på antall mynter du har? 826 00:36:23,420 --> 00:36:24,266 De bruker hva? 827 00:36:24,266 --> 00:36:26,390 Publikummer: Den stopper telling etter 4 milliarder. 828 00:36:26,390 --> 00:36:27,720 DAVID J MALAN: Den stopper telling etter 4 milliarder kroner, 829 00:36:27,720 --> 00:36:29,525 som betyr at du kan antyde, som programmerer, 830 00:36:29,525 --> 00:36:31,960 at de er sannsynligvis ved hjelp av en 32 bit heltall. 831 00:36:31,960 --> 00:36:35,380 Som programmerer bokstavelig talt bare maskinskrevet, int, i hans eller hennes kode, 832 00:36:35,380 --> 00:36:39,620 og det er den type variabel som de bruker til å lagre noen kode. 833 00:36:39,620 --> 00:36:42,230 Så det er andre manifestasjoner av slike grenser. 834 00:36:42,230 --> 00:36:45,063 >> Så jeg har ikke spilt denne game-- og jeg leste opp på historien 835 00:36:45,063 --> 00:36:48,470 å bekrefte som much-- men i opprinnelige versjonen av Civilization, der 836 00:36:48,470 --> 00:36:53,240 du tydeligvis samhandle med hverandre andre og kan føre krig eller fred, 837 00:36:53,240 --> 00:36:56,590 Gandhi var ment å være en av de mest fredelige tegn, så jeg 838 00:36:56,590 --> 00:36:59,280 forstå det, i den første versjon av Civilization. 839 00:36:59,280 --> 00:37:03,250 Og faktisk på en skala fra 1 til 10, hans aggressivitet var bare en en. 840 00:37:03,250 --> 00:37:05,620 Så aldri så mildt aggressive, tilsynelatende. 841 00:37:05,620 --> 00:37:11,590 >> Men på et tidspunkt, kan du tilsynelatende installere demokrati i geografi. 842 00:37:11,590 --> 00:37:14,900 Og hvis du installerer demokrati inn din versjon av spillet, 843 00:37:14,900 --> 00:37:17,320 så din aggresjon nivået går ned. 844 00:37:17,320 --> 00:37:18,460 Det er en god ting. 845 00:37:18,460 --> 00:37:20,890 Folk er mer rolig tydeligvis i en slik situasjon. 846 00:37:20,890 --> 00:37:23,190 Men tydeligvis gjorde noen ikke har en, dersom tilstanden 847 00:37:23,190 --> 00:37:24,780 i den opprinnelige versjonen av koden. 848 00:37:24,780 --> 00:37:30,650 >> Så Gandhis aggresjonsnivå gikk fra positiv 1, minus to, til negativ en, 849 00:37:30,650 --> 00:37:33,840 men spillet ikke forstå negative tall. 850 00:37:33,840 --> 00:37:38,680 Så det som skjedde var Gandhis aggresjon nivå gikk fra 1, 0, til en negativ, 851 00:37:38,680 --> 00:37:40,900 som hadde den virkning innpakning rundt å være 852 00:37:40,900 --> 00:37:44,690 den mest aggressive karakter i spillet, til en verdi av 255, 853 00:37:44,690 --> 00:37:46,630 på en skala fra 1 til 10. 854 00:37:46,630 --> 00:37:49,887 Og siden da har det vært flere inkarnasjoner av dette spillet, 855 00:37:49,887 --> 00:37:51,720 og de har holdt det som en slags påske egg, 856 00:37:51,720 --> 00:37:53,870 som Gandhi er tilsynelatende så fryktelig aggressiv. 857 00:37:53,870 --> 00:37:56,740 Men det var et resultat av en veldig enkel programmeringsfeil 858 00:37:56,740 --> 00:37:58,630 i at svært tidlig versjon av spillet. 859 00:37:58,630 --> 00:38:02,860 >> Nå mer urovekkende, mer nylig, Boeing 787 860 00:38:02,860 --> 00:38:05,720 ble dokumentert til å ha en bug, ikke den slags enhet 861 00:38:05,720 --> 00:38:07,340 du spesielt ønsker å ha en bug. 862 00:38:07,340 --> 00:38:10,130 Og symptomene, som jeg skal lese her, fra en artikkel på nettet, 863 00:38:10,130 --> 00:38:13,840 var dette en modell 787 fly som har vært drevet kontinuerlig 864 00:38:13,840 --> 00:38:18,030 for 248 dager kan miste alt vekselstrøm, AC, 865 00:38:18,030 --> 00:38:20,850 elektrisk kraft, på grunn de generator kontrollenheter, 866 00:38:20,850 --> 00:38:23,330 GCUs, samtidig går inn Fail-safe mode. 867 00:38:23,330 --> 00:38:26,790 Så dette var en advarsel når dette problemet ble oppdaget. 868 00:38:26,790 --> 00:38:28,750 Denne tilstanden er forårsaket av en programvareteller, 869 00:38:28,750 --> 00:38:32,230 internt i GCUs, så et helt tall eller en variabel, 870 00:38:32,230 --> 00:38:36,850 som vil overløp etter 248 dager med kontinuerlig strøm. 871 00:38:36,850 --> 00:38:40,350 Boeing er i ferd utvikle en GCU software oppgradering som 872 00:38:40,350 --> 00:38:42,350 vil avhjelpe usikre tilstand. 873 00:38:42,350 --> 00:38:44,226 >> Så mye som missilet scenario, hvor 874 00:38:44,226 --> 00:38:46,850 de hadde noen form for variabel som ble telling, og teller, 875 00:38:46,850 --> 00:38:50,720 og teller, men etter hvert overfylte grensene for sin evne, 876 00:38:50,720 --> 00:38:54,890 på samme måte gjorde jævla flyet har en variabel overløp 877 00:38:54,890 --> 00:38:56,410 etter nok tid for løping. 878 00:38:56,410 --> 00:38:59,240 Og så tongue-in-cheek måte å jobbe rundt dette problemet 879 00:38:59,240 --> 00:39:04,400 er å virkelig, reboot, flyet hver 247 dager, slik at minnet blir visket 880 00:39:04,400 --> 00:39:06,100 og den variable går tilbake til 0. 881 00:39:06,100 --> 00:39:09,410 Men innser, er dette en svært store inkarnasjon av programvare, 882 00:39:09,410 --> 00:39:14,070 men særlig ettersom vi hører om Apples operativsystemer kommer inn i biler, 883 00:39:14,070 --> 00:39:18,030 og selv kjører biler fra Google, og en rekke inkarnasjoner av programvare 884 00:39:18,030 --> 00:39:21,000 i vårt daglige liv, TV og klokker, og mer, 885 00:39:21,000 --> 00:39:24,950 realisere var omgitt av programvare, som alle er skrevet av oss mennesker. 886 00:39:24,950 --> 00:39:28,150 >> Og som vi alle snart oppdage, det er veldig enkelt og veldig typisk 887 00:39:28,150 --> 00:39:30,250 å gjøre feil når du skriver programvare. 888 00:39:30,250 --> 00:39:32,745 Og hvis du ikke fange dem, noen dårlige ting kan skje. 889 00:39:32,745 --> 00:39:35,400 Nå noen ganger, noen morsomme ting kan skje, 890 00:39:35,400 --> 00:39:38,280 eller i det minste noen ganger vi vet å forvente noen ondskap. 891 00:39:38,280 --> 00:39:41,550 Så 0 delt på 0, fra klasse skole, er generelt en dårlig ting. 892 00:39:41,550 --> 00:39:43,050 Det er udefinert. 893 00:39:43,050 --> 00:39:46,440 Og det viser out-- og la oss se om min mic kan plukke dette opp-- at Apple 894 00:39:46,440 --> 00:39:47,790 hadde litt moro med dette nylig. 895 00:39:47,790 --> 00:39:48,850 Så jeg har en iPhone her. 896 00:39:48,850 --> 00:39:54,160 Jeg kommer til å snakke med Siri og be henne å gi meg svaret på 0 delt på 0. 897 00:39:54,160 --> 00:39:55,850 Hva er 0 delt på 0? 898 00:39:55,850 --> 00:39:59,350 899 00:39:59,350 --> 00:40:02,230 >> SIRI: Tenk deg at du har 0 cookies, og du dele dem jevnt 900 00:40:02,230 --> 00:40:03,540 blant 0 venner. 901 00:40:03,540 --> 00:40:05,810 Hvor mange cookies gjør hver person får? 902 00:40:05,810 --> 00:40:06,350 Se? 903 00:40:06,350 --> 00:40:07,660 Det gir ikke mening. 904 00:40:07,660 --> 00:40:10,540 Og Cookie Monster er trist at det ikke er noen kapsler. 905 00:40:10,540 --> 00:40:13,987 Og du er trist at du har ingen venner. 906 00:40:13,987 --> 00:40:15,570 DAVID J MALAN: Det er litt ubehagelig. 907 00:40:15,570 --> 00:40:17,550 Så dette er hva som ble bare sa det. 908 00:40:17,550 --> 00:40:21,380 Det er ubestemmelig, det er ikke definert, Og ja, mange programmeringsspråk 909 00:40:21,380 --> 00:40:24,950 eller, egentlig, kompilatorer vil oppdage når du, i et program, 910 00:40:24,950 --> 00:40:27,050 prøv å dele 0 av 0. 911 00:40:27,050 --> 00:40:29,830 Mer moro enn dette selv, er som tilsynelatende, Cookie Monster 912 00:40:29,830 --> 00:40:31,270 er på Twitter i disse dager. 913 00:40:31,270 --> 00:40:37,610 Og han svarte på dette, med dette, som er helt bedårende. 914 00:40:37,610 --> 00:40:40,110 Men la oss ta en rask titt på et par andre konstruksjoner, 915 00:40:40,110 --> 00:40:43,459 og deretter sette noe av denne kode for å bruke, i gode måter. 916 00:40:43,459 --> 00:40:45,250 Så det viser seg, foruten etter looper, det er 917 00:40:45,250 --> 00:40:49,174 noe som kalles en stund loop, som ser annerledes ut og er implementert 918 00:40:49,174 --> 00:40:51,590 litt differently-- og Vi vil til slutt se examples-- 919 00:40:51,590 --> 00:40:53,500 men i noen forstand, det er enklere fordi det 920 00:40:53,500 --> 00:40:56,670 ikke tillater deg å initial og oppdatere innenfor grensen av loopen. 921 00:40:56,670 --> 00:40:57,794 Du kan fortsatt gjennomføre det. 922 00:40:57,794 --> 00:41:01,219 Så du kan gjøre de samme tingene med en stund sløyfe, som med en løkke for, 923 00:41:01,219 --> 00:41:03,260 men syntaksen, ultimately-- som vi vil til slutt 924 00:41:03,260 --> 00:41:04,551 see-- kommer til å være annerledes. 925 00:41:04,551 --> 00:41:07,450 Det er enda en gjør mens loop, som er faktisk litt annerledes, 926 00:41:07,450 --> 00:41:09,640 i at mens en for loop og en stund løkke alltid 927 00:41:09,640 --> 00:41:13,005 sjekke tilstanden deres første, hvis du leser denne tingen topp til bunn, 928 00:41:13,005 --> 00:41:16,440 den slags ser ut som det kommer til å sjekk den tilstand siste fordi det er 929 00:41:16,440 --> 00:41:17,910 virkelig den siste linje med kode. 930 00:41:17,910 --> 00:41:20,580 Og ja, det kommer til å være nyttig i enkelte programmer som vi skriver, 931 00:41:20,580 --> 00:41:23,746 Hvis du ønsker å bare blindt gjøre noe og til slutt sjekke tilstanden. 932 00:41:23,746 --> 00:41:25,205 Det er ikke nødvendigvis en dårlig ting. 933 00:41:25,205 --> 00:41:27,912 Hvis vi ønsker variabler, kan vi gjøre det i et par forskjellige måter. 934 00:41:27,912 --> 00:41:30,290 Og vi så i Foxtrot tegneserie, en måte å gjøre det, 935 00:41:30,290 --> 00:41:33,400 hvor du deklarerer variabelen, som int teller semikolon, 936 00:41:33,400 --> 00:41:36,570 og deretter later-- kanskje neste linje, kanskje 10 linjer later-- 937 00:41:36,570 --> 00:41:37,800 du faktisk initialisere den. 938 00:41:37,800 --> 00:41:42,230 Så disse 2 linjer med kode erklære en variabel av type int 939 00:41:42,230 --> 00:41:44,930 og kaller det teller, slik at det gir meg nok biter til å holde en int. 940 00:41:44,930 --> 00:41:48,230 Og så til slutt, setter det verdien 0 i den variable. 941 00:41:48,230 --> 00:41:51,250 Det ordner 0 og 1-ere i en mønster, som vi vet fra forrige uke, 942 00:41:51,250 --> 00:41:53,260 representerer antallet vi kjenner som 0. 943 00:41:53,260 --> 00:41:56,920 Eller for å være ærlig, kan du gjøre dette mye mer konsist, akkurat som dette. 944 00:41:56,920 --> 00:41:59,390 >> Nå har vi også muligheten til å ringe funksjoner. 945 00:41:59,390 --> 00:42:03,070 Og faktisk, her er en 2 linje program, eller et utsnitt av disse, 946 00:42:03,070 --> 00:42:06,157 som tillater oss å faktisk skrive noen kode som 947 00:42:06,157 --> 00:42:08,990 får en streng fra user-- mye som vår frivillig et øyeblikk ago-- 948 00:42:08,990 --> 00:42:11,320 lagring av resultatet i en variabel kalt navn, 949 00:42:11,320 --> 00:42:15,470 og then-- mye som med våre frivillige med printf-- skriver ut disse verdiene 950 00:42:15,470 --> 00:42:19,180 ved å føre i to argumenter, den streng, etterfulgt av den variable 951 00:42:19,180 --> 00:42:20,781 kalt, navn, i seg selv. 952 00:42:20,781 --> 00:42:23,155 Så la oss ta en titt, før vi kommer tilbake til Mario der, 953 00:42:23,155 --> 00:42:26,010 på et par nå, eksempler på dette. 954 00:42:26,010 --> 00:42:30,537 >> Jeg kommer til å gå videre og åpne opp, la oss si, funksjon-0.c. 955 00:42:30,537 --> 00:42:33,120 Og som alltid, er denne koden tilgjengelig på kursets hjemmeside, 956 00:42:33,120 --> 00:42:35,660 slik at du kan spille sammen hjem og se på det senere. 957 00:42:35,660 --> 00:42:40,400 Men her er programmet i det hovedsak fra linje 17-22. 958 00:42:40,400 --> 00:42:43,270 Hovedprogrammet er der Programmet er alltid kommer til å starte. 959 00:42:43,270 --> 00:42:46,980 Dette programmet, tilsynelatende, kommer å skrive ut navnet ditt, tykktarm. 960 00:42:46,980 --> 00:42:50,320 Det er da tenkt å ringe GetString, akkurat som vi gjorde med våre frivillige. 961 00:42:50,320 --> 00:42:53,365 Og så, er dette interessant, det kommer til å ringe printname. 962 00:42:53,365 --> 00:42:56,490 Det viser seg, hele denne tiden, er det ser ut til å være en funksjon som kalles printname. 963 00:42:56,490 --> 00:42:57,614 Som skriver ut noen navn. 964 00:42:57,614 --> 00:43:01,210 Vi trenger ikke å bruke printf fra svunnen tid, det er printname. 965 00:43:01,210 --> 00:43:03,500 >> Men det er misvisende fordi printname ikke 966 00:43:03,500 --> 00:43:06,760 komme med C. Folk gjorde ikke oppfinne det noen 40 eller 50 år siden, 967 00:43:06,760 --> 00:43:07,990 Jeg gjorde det, i stedet. 968 00:43:07,990 --> 00:43:10,330 Og faktisk, hvis jeg blar ned ytterligere, varsel 969 00:43:10,330 --> 00:43:14,200 hvordan jeg kan skrive min egen funksjoner i C. Vi vil til slutt 970 00:43:14,200 --> 00:43:16,319 forklare hvorfor vi fortsetter å si, tomrom, i noen få steder, 971 00:43:16,319 --> 00:43:18,110 men for i dag, la oss bare se på navnet. 972 00:43:18,110 --> 00:43:20,905 >> På linje 24, hvis du ønsker å lage din egen funksjon, 973 00:43:20,905 --> 00:43:22,780 du bokstavelig talt skrive Navnet på funksjonen. 974 00:43:22,780 --> 00:43:24,340 Jeg valgte printname. 975 00:43:24,340 --> 00:43:26,159 I parentes, du deretter angi hva slags 976 00:43:26,159 --> 00:43:28,450 innganger, og hvor mange du ønsker denne funksjonen til å ta. 977 00:43:28,450 --> 00:43:31,906 I dette tilfellet ønsker jeg å ta En variabel kalt, navn, 978 00:43:31,906 --> 00:43:34,030 og det kommer til å være av type, streng, så det kommer 979 00:43:34,030 --> 00:43:35,780 å være en sekvens av tegn. 980 00:43:35,780 --> 00:43:39,170 Og så, dette program-- mye som i Scratch, 981 00:43:39,170 --> 00:43:42,590 du kan ha tilpasset puslespill pieces-- kommer til å ha denne skikken atferd. 982 00:43:42,590 --> 00:43:46,760 Det kommer til å ringe printf bestått i, hallo, plassholder, 983 00:43:46,760 --> 00:43:49,110 og så kommer det til å plugge i hva brukeren heter. 984 00:43:49,110 --> 00:43:51,450 >> Så dette er et eksempel på hva en datamaskin vitenskapsmann ville 985 00:43:51,450 --> 00:43:55,090 samtale abstraksjon eller funksjonell dekomponering, som er like 986 00:43:55,090 --> 00:43:58,110 fancy måter av saying-- er hvis du liker dette høye nivået idé, 987 00:43:58,110 --> 00:44:01,569 som jeg vil ha funksjonalitet som skriver noen navn, absolutt du 988 00:44:01,569 --> 00:44:04,360 kan bokstavelig talt skrive printf og deretter passere i argumentene du ønsker, 989 00:44:04,360 --> 00:44:07,340 og programmet vil fungere, som den har siden onsdag. 990 00:44:07,340 --> 00:44:10,510 Men du kan begynne å abstrahere bort tanken om å skrive et navn. 991 00:44:10,510 --> 00:44:13,270 Du kan gi den et navn, som printname, og dette 992 00:44:13,270 --> 00:44:15,280 er denne ideen om lagdeling fra uke 0. 993 00:44:15,280 --> 00:44:19,910 >> Heretter, jeg og du ikke trenger å vite eller omsorg hvordan printname er implementert. 994 00:44:19,910 --> 00:44:22,470 Ja det bruker printf, kanskje det ikke gjør det, hvem vet hva bruker? 995 00:44:22,470 --> 00:44:23,410 Hvem bryr seg? 996 00:44:23,410 --> 00:44:26,034 Nå snakker jeg opp her, i stedet for ned her. 997 00:44:26,034 --> 00:44:28,700 Og ja, som våre programmer får mer avansert og sofistikert, 998 00:44:28,700 --> 00:44:32,550 vi kommer til å fortsette å ta for gitt at lavere nivå puslebiter eksisterer. 999 00:44:32,550 --> 00:44:34,780 Fordi vi skrev dem eller noen andre gjorde, så 1000 00:44:34,780 --> 00:44:36,910 at vi da kan bygge på toppen av dem. 1001 00:44:36,910 --> 00:44:39,430 La oss ta en titt på denne variant, fungerer en. 1002 00:44:39,430 --> 00:44:41,780 >> Så dette er litt mer avansert, men det viser seg 1003 00:44:41,780 --> 00:44:44,570 at i CS50 bibliotek, det er bare en GetInt funksjon. 1004 00:44:44,570 --> 00:44:47,720 Vi trodde ikke, år siden, for å implementere en GetPositiveInt funksjon. 1005 00:44:47,720 --> 00:44:50,970 Og det er litt irriterende fordi hvis dere skriver et program hvor 1006 00:44:50,970 --> 00:44:53,325 Vil du få en positiv heltall fra brukeren, 1007 00:44:53,325 --> 00:44:55,010 du kan absolutt bruke GetInt. 1008 00:44:55,010 --> 00:44:57,840 Og du kan absolutt sjekke med tilstanden og kanskje en løkke 1009 00:44:57,840 --> 00:45:00,320 hvis det int er større enn 0 og kjefte på brukeren 1010 00:45:00,320 --> 00:45:02,699 hvis han eller hun ikke gir man et positivt tall. 1011 00:45:02,699 --> 00:45:04,740 Men la oss bygge dette bygningen blokkere oss selv, en, 1012 00:45:04,740 --> 00:45:06,555 tilpassede Scratch stykke, om du vil. 1013 00:45:06,555 --> 00:45:08,680 Jeg kommer til å ha et program her som til slutt, jeg 1014 00:45:08,680 --> 00:45:11,780 ønsker å være i stand til å ringe GetPositiveInt, og jeg ønsker å være 1015 00:45:11,780 --> 00:45:14,200 i stand til å skrive ut hva som int er. 1016 00:45:14,200 --> 00:45:16,240 Men dette er abstrahert bort nå. 1017 00:45:16,240 --> 00:45:19,050 Det er bare blitt gitt en høy grad navn som sier hva den gjør, 1018 00:45:19,050 --> 00:45:21,780 som er fantastisk fordi det er veldig intuitivt nå å lese. 1019 00:45:21,780 --> 00:45:24,710 Og hvis jeg gjør bryr hva som er under panseret, la meg bla nedover. 1020 00:45:24,710 --> 00:45:27,140 Og det er litt skremmende i starten, spesielt 1021 00:45:27,140 --> 00:45:29,470 Hvis dette er ditt første program, men la oss ta en titt. 1022 00:45:29,470 --> 00:45:32,860 >> Jeg ikke lenger å si, ugyldig fordi det viser seg funksjoner, 1023 00:45:32,860 --> 00:45:34,777 mye som GetString, kan returnere en verdi for meg. 1024 00:45:34,777 --> 00:45:36,610 De har ikke bare ha skrive ut på skjermen, 1025 00:45:36,610 --> 00:45:38,410 de faktisk kan levere meg noe tilbake. 1026 00:45:38,410 --> 00:45:41,535 Og mens før printname, Jeg trengte ikke noe tilbake. 1027 00:45:41,535 --> 00:45:44,160 Jeg trengte den bivirkning av noe å dukke opp på skjermen, 1028 00:45:44,160 --> 00:45:46,570 men jeg trenger ikke et menneske å gi meg noe tilbake. 1029 00:45:46,570 --> 00:45:48,840 Her, med GetPositiveInt, som med GetInt, 1030 00:45:48,840 --> 00:45:50,640 Jeg ønsker å bli levert noe tilbake. 1031 00:45:50,640 --> 00:45:53,220 Så jeg sier ikke, ugyldig på linje 23, men int, 1032 00:45:53,220 --> 00:45:55,570 som sier, denne funksjonen som jeg skriver, 1033 00:45:55,570 --> 00:45:58,860 kalt GetPositiveInt kommer til å gi meg tilbake et tall, ikke noe, 1034 00:45:58,860 --> 00:45:59,890 ikke annullert. 1035 00:45:59,890 --> 00:46:03,280 >> I mellomtiden kommer det til å ta nei innganger, så jeg har, type, snudd det. 1036 00:46:03,280 --> 00:46:08,280 Jeg gir ikke GetPositiveInt noen input, jeg vil at det skal gi meg sin produksjon. 1037 00:46:08,280 --> 00:46:09,800 Og hva skjer nå? 1038 00:46:09,800 --> 00:46:11,640 Så her er hvordan jeg kan erklære en variabel. 1039 00:46:11,640 --> 00:46:15,090 Jeg har gjort det utenfor loop, av grunner vi vil til slutt se, 1040 00:46:15,090 --> 00:46:17,700 men dette gir bare meg 32 biter kalt, n, 1041 00:46:17,700 --> 00:46:20,952 og jeg har pre-bestemmelse dem til å lagre heltall. 1042 00:46:20,952 --> 00:46:23,660 Og her er det, gjør mens konstruere, og dette er grunnen til at det er nyttig. 1043 00:46:23,660 --> 00:46:26,700 Bokstavelig talt gjøre dette, mens n er mindre enn 1. 1044 00:46:26,700 --> 00:46:28,030 Så la oss se hva som skjer. 1045 00:46:28,030 --> 00:46:30,760 Jeg skrive ut, kan gi meg en positiv int. 1046 00:46:30,760 --> 00:46:34,300 Jeg deretter få en int, ved hjelp av CS50 s funksjon og som er lagret i n. 1047 00:46:34,300 --> 00:46:38,990 >> Og så, hva linje med kode trolig blir henrettet neste, logisk? 1048 00:46:38,990 --> 00:46:41,890 Hvilken linje nummer? 1049 00:46:41,890 --> 00:46:42,571 Ja, så 31. 1050 00:46:42,571 --> 00:46:45,320 Du vil ikke vite dette før du har blitt fortalt eller slags antyde det, 1051 00:46:45,320 --> 00:46:45,986 men det er sant. 1052 00:46:45,986 --> 00:46:48,280 Det går opp og ned og deretter holder gjenta. 1053 00:46:48,280 --> 00:46:55,840 Så hvis jeg har skrevet i si, antall negative 1, er n mindre enn negative 1? 1054 00:46:55,840 --> 00:46:56,340 Yeah. 1055 00:46:56,340 --> 00:46:58,470 Fordi negative 1 er mindre enn en. 1056 00:46:58,470 --> 00:46:59,510 Så hva skal skje? 1057 00:46:59,510 --> 00:47:03,260 Jeg kommer til å gjøre dette mens n er mindre enn 1, 1058 00:47:03,260 --> 00:47:05,760 så jeg kommer til å gå tilbake til linje 28. 1059 00:47:05,760 --> 00:47:09,530 >> Og hver tid-- og la oss kjøre dette-- gjøre funksjon en å kompilere den, 1060 00:47:09,530 --> 00:47:11,340 og nå dot slash funksjon 1. 1061 00:47:11,340 --> 00:47:14,280 Hvis jeg skriver negativ en, er det kommer til å holde roping på meg 1062 00:47:14,280 --> 00:47:17,530 før jeg samarbeide fordi hver av mine innganger er mindre enn 1 1063 00:47:17,530 --> 00:47:20,070 og hvis det er mens mindre enn 1, Jeg kommer til å fortsette å gjøre dette. 1064 00:47:20,070 --> 00:47:24,240 Hvis jeg endelig gi den et tall som 50, heldigvis, sier det, takk for den 50. 1065 00:47:24,240 --> 00:47:24,970 Hvorfor? 1066 00:47:24,970 --> 00:47:30,640 Fordi så snart n er ikke mindre enn 1, slutter jeg å bli sittende fast i denne sløyfen, 1067 00:47:30,640 --> 00:47:33,840 og denne nye søkeordet i dag, avkastning, gjør bokstavelig talt det. 1068 00:47:33,840 --> 00:47:36,800 Så jeg har nettopp gjennomført, i en forstand, tilsvarende GetString, 1069 00:47:36,800 --> 00:47:40,590 hvor jeg levere tilbake til den som bruker meg, noen verdi. 1070 00:47:40,590 --> 00:47:42,820 Det trenger ikke å være en streng, er det en int. 1071 00:47:42,820 --> 00:47:44,990 Så en enkel, rask eksempel, men vi vil snart 1072 00:47:44,990 --> 00:47:47,930 se litt mer sofistikert versjoner fortsatt. 1073 00:47:47,930 --> 00:47:53,882 Faktisk, la oss ta en titt på en numerisk en, som kalles return.c. 1074 00:47:53,882 --> 00:47:55,590 Og dette er faktisk litt enklere. 1075 00:47:55,590 --> 00:47:59,010 Så dette programmets formål i life-- la oss kompilere og kjøre den, 1076 00:47:59,010 --> 00:48:03,090 så sørg for retur, dot slash, return-- varsel 1077 00:48:03,090 --> 00:48:05,530 programmet bare terninger verdien 2. 1078 00:48:05,530 --> 00:48:08,410 Det er ganske dumt, er det vanskelig kode, tar det ikke noen innganger, 1079 00:48:08,410 --> 00:48:12,220 men det viser en annen funksjon som jeg har skrevet selv. 1080 00:48:12,220 --> 00:48:15,760 Så her har jeg erklært variabel, kalt x, av typen int, 1081 00:48:15,760 --> 00:48:17,840 lik antallet 2, helt vilkårlig. 1082 00:48:17,840 --> 00:48:19,530 Dette er bare noen fluffy utskrift. 1083 00:48:19,530 --> 00:48:23,070 Det sier x er nå, slik og sådan, cubing dot dot dot. 1084 00:48:23,070 --> 00:48:26,390 Og magien er tydeligvis på linje 21. 1085 00:48:26,390 --> 00:48:30,120 Jeg ringer en funksjon kalt, kube, Jeg overlate det et ark 1086 00:48:30,120 --> 00:48:32,890 med nummer 2 er skrevet på det, og hva verdien, matematisk, 1087 00:48:32,890 --> 00:48:34,860 ønsker jeg å få ut av det? 1088 00:48:34,860 --> 00:48:36,570 Akkurat som en mental helse sjekk? 1089 00:48:36,570 --> 00:48:37,070 8. 1090 00:48:37,070 --> 00:48:37,570 Høyre? 1091 00:48:37,570 --> 00:48:40,160 Jeg vil ha to terninger tilbake, to til kraften av tre, slik at 8 tilbake. 1092 00:48:40,160 --> 00:48:42,570 >> Så hvor er kube implementert? 1093 00:48:42,570 --> 00:48:44,349 Vel, merke til det er gjennomført her nede. 1094 00:48:44,349 --> 00:48:47,140 Og akkurat som før, logisk, selv om syntaksen er trolig 1095 00:48:47,140 --> 00:48:49,320 veldig nytt for mange av dere, Jeg vil ha denne funksjonen 1096 00:48:49,320 --> 00:48:51,780 å gi meg tilbake et ark med papir med en int på den. 1097 00:48:51,780 --> 00:48:53,990 Så jeg har en int, den Navnet er vilkårlig, 1098 00:48:53,990 --> 00:48:55,530 men beleilig kalt kube. 1099 00:48:55,530 --> 00:48:58,430 Inngangen til det, er n av skriver heltall, så det er 1100 00:48:58,430 --> 00:49:00,800 hvordan jeg kan passere i antall 2 på et ark. 1101 00:49:00,800 --> 00:49:03,910 Og så viser det seg C støtte matematikk, slik at du ikke har x-er for tiden, 1102 00:49:03,910 --> 00:49:06,680 du bare bruke stjerne for multiplikasjon. 1103 00:49:06,680 --> 00:49:11,070 Og dette returnerer n ganger n ganger n, som ganske enkelt er en terningformede verdi. 1104 00:49:11,070 --> 00:49:12,840 >> Så hvor skal vi med alt dette? 1105 00:49:12,840 --> 00:49:14,570 Dette er definitivt en virvelvind tur, være trygg, 1106 00:49:14,570 --> 00:49:16,410 som i super seksjonene og i oppgavesettet 1, 1107 00:49:16,410 --> 00:49:18,368 vil du bli gikk gjennom alt dette enda mer. 1108 00:49:18,368 --> 00:49:22,490 Og i oppgavesettet en, vil vi overgangen fra den grafiske verden av Scratch 1109 00:49:22,490 --> 00:49:25,640 til noe mer kommandolinje i C. Men vi vil trekke inspirasjon 1110 00:49:25,640 --> 00:49:27,680 fra dette her spillet fra en svunnen tid, hvor 1111 00:49:27,680 --> 00:49:31,591 ved hjelp av C og standard utgaven av p settet du vil implementere Mario pyramide. 1112 00:49:31,591 --> 00:49:34,340 Og i hacker-utgaven av p sett, hvis du velger å velge, 1113 00:49:34,340 --> 00:49:38,280 du vil implementere litt mer utfordrende pyramide med to topper. 1114 00:49:38,280 --> 00:49:41,239 Du vil også gjennomføre en algoritme, en grådig algoritme. 1115 00:49:41,239 --> 00:49:43,030 Det viser seg at det er noen interessante logikk 1116 00:49:43,030 --> 00:49:45,640 bak fremgangs kjører en kasserer stasjon 1117 00:49:45,640 --> 00:49:47,410 og faktisk overlate noen tilbake endring. 1118 00:49:47,410 --> 00:49:50,410 Det er en algoritme som er ganske grei, at du kanskje selv 1119 00:49:50,410 --> 00:49:53,576 forstå intuitivt når du først lese it-- innser det er det jeg alltid har 1120 00:49:53,576 --> 00:49:57,110 gjort noen gang jeg har gitt noen noen penger back-- som lar deg alltid 1121 00:49:57,110 --> 00:50:00,679 minimere antall papir notater eller metallmynter 1122 00:50:00,679 --> 00:50:02,220 at du leverer tilbake til brukeren. 1123 00:50:02,220 --> 00:50:04,610 Og dette, selvfølgelig, er overbevisende fordi hvis du går til CVS eller whatnot, 1124 00:50:04,610 --> 00:50:06,430 du ikke ønsker å være handed en hel haug av dem 1125 00:50:06,430 --> 00:50:07,596 eller en hel haug med pennies. 1126 00:50:07,596 --> 00:50:10,120 Du vil ha færrest mynter, sannsynligvis, det er mulig. 1127 00:50:10,120 --> 00:50:13,070 >> Til slutt, vil du også bli utfordret å prøve seg i en verden av vann 1128 00:50:13,070 --> 00:50:17,220 og faktisk få en forståelse for en mapping mellom vannføringer, 1129 00:50:17,220 --> 00:50:19,890 av lyst, vann i en dusj, hvor mye vann brukes. 1130 00:50:19,890 --> 00:50:22,640 Og hentydning deri, blir dette klippet her, 1131 00:50:22,640 --> 00:50:24,840 som vi vil ende på for bare 60 sekunder, som 1132 00:50:24,840 --> 00:50:29,070 tegner et bilde av low-flow dusjhoder. 1133 00:50:29,070 --> 00:50:30,886 >> [VIDEO PLAYBACK] 1134 00:50:30,886 --> 00:50:31,385 -Greit. 1135 00:50:31,385 --> 00:50:32,774 Jeg fikk alt her. 1136 00:50:32,774 --> 00:50:35,800 Jeg fikk 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 >> -Og Hva anbefaler du? 1139 00:50:39,265 --> 00:50:40,460 >> -Hva ser du etter? 1140 00:50:40,460 --> 00:50:41,300 >> -Power Mann. 1141 00:50:41,300 --> 00:50:42,285 Power. 1142 00:50:42,285 --> 00:50:42,910 -lignende Silkwood. 1143 00:50:42,910 --> 00:50:44,520 -Det Er for stråling. 1144 00:50:44,520 --> 00:50:46,335 -Det er riktig. 1145 00:50:46,335 --> 00:50:48,275 -Nå Hva er dette? 1146 00:50:48,275 --> 00:50:49,704 -Det Er det Commando 450. 1147 00:50:49,704 --> 00:50:50,620 Jeg selger ikke at en. 1148 00:50:50,620 --> 00:50:51,700 >> -Men Det er det vi ønsker. 1149 00:50:51,700 --> 00:50:52,680 Det er en commando 450. 1150 00:50:52,680 --> 00:50:53,882 >> -Ingen Tro meg. 1151 00:50:53,882 --> 00:50:55,090 Det er kun brukt i sirkus. 1152 00:50:55,090 --> 00:50:56,512 Det er for elefanter. 1153 00:50:56,512 --> 00:50:59,356 >> -Jeg Betale noe. 1154 00:50:59,356 --> 00:51:01,252 >> -Hva Med Jerry? 1155 00:51:01,252 --> 00:51:02,760 >> -Han Ikke kunne håndtere det. 1156 00:51:02,760 --> 00:51:04,910 Han er delikat. 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 PLAYBACK] 1160 00:51:37,320 --> 00:51:37,700 DAVID J MALAN: All right. 1161 00:51:37,700 --> 00:51:38,820 Det er hvis for CS50. 1162 00:51:38,820 --> 00:51:40,050 Vi sees neste uke. 1163 00:51:40,050 --> 00:51:45,910 1164 00:51:45,910 --> 00:51:49,029 >> SPEAKER 1: [? Scully?], [? Ian,?] så langt som dette outro prosjektet, 1165 00:51:49,029 --> 00:51:50,362 hva har dere kommet opp med? 1166 00:51:50,362 --> 00:51:51,990 >> SPEAKER 2: Vel, vi har gitt det en rekke tanke, 1167 00:51:51,990 --> 00:51:53,250 og vi tror at den beste måten to-- 1168 00:51:53,250 --> 00:51:53,660 >> SPEAKER 3: Får jeg? 1169 00:51:53,660 --> 00:51:54,326 >> SPEAKER 2: Ja. 1170 00:51:54,326 --> 00:51:56,360 For all del, faktisk. 1171 00:51:56,360 --> 00:51:59,425 >> SPEAKER 3: Så jeg tror Vi kan oppsummere vår idé 1172 00:51:59,425 --> 00:52:05,450 for de outros med ett 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 SPEAKER 3: Ingenting. 1176 00:52:11,200 --> 00:52:12,990 DAVID J MALAN: Hva betyr det? 1177 00:52:12,990 --> 00:52:16,260 SPEAKER 3: outros er om ingenting. 1178 00:52:16,260 --> 00:52:21,720 SPEAKER 2: Vel, jeg mener, i filosofi, Jeg mener, ingenting er alltid noe. 1179 00:52:21,720 --> 00:52:24,200 SPEAKER 1: Så what's-- hva er forutsetningen? 1180 00:52:24,200 --> 00:52:25,720 SPEAKER 3: Så det er som livet. 1181 00:52:25,720 --> 00:52:26,680 OK. 1182 00:52:26,680 --> 00:52:28,294 Hva gjorde du idag? 1183 00:52:28,294 --> 00:52:31,811 >> DAVID J MALAN: Jeg sto opp, hadde frokost, og kom til å fungere. 1184 00:52:31,811 --> 00:52:34,056 >> SPEAKER 3: Det er en outro. 1185 00:52:34,056 --> 00:52:36,806 SPEAKER 2: Men, jeg mener, bør ikke noe skje med ham på the-- 1186 00:52:36,806 --> 00:52:37,889 SPEAKER 3: Nei, nei, nei, nei. 1187 00:52:37,889 --> 00:52:40,220 Ingenting skjer. 1188 00:52:40,220 --> 00:52:42,910 >> SPEAKER 1: Så hvorfor er vi ser? 1189 00:52:42,910 --> 00:52:46,956 >> SPEAKER 3: Fordi det er en outro for CS50. 1190 00:52:46,956 --> 00:52:48,652 >> DAVID J MALAN: Ikke ennå. 1191 00:52:48,652 --> 00:52:49,151