1 00:00:00,000 --> 00:00:00,940 2 00:00:00,940 --> 00:00:05,440 >> [Musik spiller] 3 00:00:05,440 --> 00:00:11,577 4 00:00:11,577 --> 00:00:12,660 David J. MALAN: Okay. 5 00:00:12,660 --> 00:00:15,590 Dette er CS50, og dette er starten på uge to. 6 00:00:15,590 --> 00:00:19,120 Så lad os begynde i dag med en fejl. 7 00:00:19,120 --> 00:00:20,974 En fejl, selvfølgelig, er en fejl i et program, 8 00:00:20,974 --> 00:00:22,890 og du får meget bekendt med dette koncept 9 00:00:22,890 --> 00:00:26,050 hvis du aldrig har programmeret før. pset0 og nu pset1. 10 00:00:26,050 --> 00:00:29,280 Men lad os betragte noget lidt simpelt i starten. 11 00:00:29,280 --> 00:00:32,189 Dette program her, at jeg kastede sammen i forvejen, 12 00:00:32,189 --> 00:00:37,280 og jeg hævder, at dette burde udskrive 10 stjerner på skærmen ved hjælp af printf, 13 00:00:37,280 --> 00:00:41,020 men det er åbenbart fejlbehæftet eller anden måde. 14 00:00:41,020 --> 00:00:45,370 >> Eftersom specifikation, Det burde udskrive 10 stjerner, 15 00:00:45,370 --> 00:00:50,230 men det gør tilsyneladende ikke, hvad ville du hævder er fejlen? 16 00:00:50,230 --> 00:00:52,004 Ja? 17 00:00:52,004 --> 00:00:54,420 Så det er en off ved en fejl, og hvad mener du med det? 18 00:00:54,420 --> 00:01:00,991 19 00:01:00,991 --> 00:01:01,490 OK. 20 00:01:01,490 --> 00:01:09,820 21 00:01:09,820 --> 00:01:10,410 Fremragende. 22 00:01:10,410 --> 00:01:13,930 Så vi har angivet en starter på nul for jeg, 23 00:01:13,930 --> 00:01:18,399 og vi har angivet en n-værdi på 10, men vi har brugt mindre end eller lig med. 24 00:01:18,399 --> 00:01:21,190 Og grunden til, at dette er to tegn og ikke bare én symbol, 25 00:01:21,190 --> 00:01:22,630 ligesom i en matematik bog, er, at du ikke har 26 00:01:22,630 --> 00:01:24,880 en måde at udtrykke et tegn tilsvarende. 27 00:01:24,880 --> 00:01:28,450 >> Så det betyder mindre end, men hvis du begynder at tælle på nul, 28 00:01:28,450 --> 00:01:31,690 men du tælle hele vejen op gennem og er lig med 10, 29 00:01:31,690 --> 00:01:34,170 du er selvfølgelig at gå til tælle 11 ting i alt. 30 00:01:34,170 --> 00:01:35,900 Og så du kommer til at udskrive 11 stjerner. 31 00:01:35,900 --> 00:01:37,990 Så hvad kunne være en rettelse til dette? 32 00:01:37,990 --> 00:01:39,970 Ja? 33 00:01:39,970 --> 00:01:43,980 >> Så bare justere mindre end eller lig med bare være mindre end 34 00:01:43,980 --> 00:01:46,250 og der er, jeg hævder, måske en anden løsning, også. 35 00:01:46,250 --> 00:01:47,210 Hvad kan du ellers gøre? 36 00:01:47,210 --> 00:01:48,590 Ja? 37 00:01:48,590 --> 00:01:53,660 >> Så begynder svarende det til 1, og forlade mindre end eller lig med. 38 00:01:53,660 --> 00:01:56,187 Og helt ærligt, jeg vil hævde at for et typisk menneske, 39 00:01:56,187 --> 00:01:57,770 dette er sandsynligvis mere ligetil. 40 00:01:57,770 --> 00:02:00,280 Begynde at tælle på 1 og tælle op til 10. 41 00:02:00,280 --> 00:02:01,690 Væsentlige gøre, hvad du mener. 42 00:02:01,690 --> 00:02:04,010 >> Men virkeligheden er i programmering, som vi har set, 43 00:02:04,010 --> 00:02:07,598 dataloger og programmører generelt begynde at tælle på nul. 44 00:02:07,598 --> 00:02:09,389 Og så det er fint, når du vænne sig til det. 45 00:02:09,389 --> 00:02:12,640 Din tilstand vil generelt være noget lignende mindre end. 46 00:02:12,640 --> 00:02:14,910 Så simpelthen en logisk fejl, at vi kunne nu 47 00:02:14,910 --> 00:02:17,990 fix og i sidste ende genoversætte dette, og få bare 10. 48 00:02:17,990 --> 00:02:19,610 >> Jamen hvad med denne fejl her? 49 00:02:19,610 --> 00:02:24,200 Her igen, jeg hævder, at jeg har et mål om at udskrive 10 stars-- 50 00:02:24,200 --> 00:02:28,140 én pr linje denne gang, men det gør ikke. 51 00:02:28,140 --> 00:02:30,940 Før vi foreslå hvad rettelsen er, hvad betyder dette 52 00:02:30,940 --> 00:02:34,640 udskrive visuelt hvis jeg skulle kompilere og kør dette program tror du? 53 00:02:34,640 --> 00:02:35,140 Ja? 54 00:02:35,140 --> 00:02:38,360 55 00:02:38,360 --> 00:02:38,860 >> Star. 56 00:02:38,860 --> 00:02:41,690 Så alle stjernerne på samme linje er, hvad jeg har hørt, 57 00:02:41,690 --> 00:02:43,391 og derefter den nye linje tegn. 58 00:02:43,391 --> 00:02:44,140 Så lad os prøve det. 59 00:02:44,140 --> 00:02:48,710 Så gør buggy-1, indtaste, og jeg ser klang kommandoen 60 00:02:48,710 --> 00:02:50,090 som vi talte om sidste gang. 61 00:02:50,090 --> 00:02:55,180 ./buggy-1, og faktisk ser jeg alle 10 stjerner på samme linje, selvom jeg hævde 62 00:02:55,180 --> 00:02:58,690 i min specifikation bare en kommentar oven den kode, som jeg har til formål at gøre én pr 63 00:02:58,690 --> 00:02:59,230 linje. 64 00:02:59,230 --> 00:03:00,580 Men det ser rigtigt. 65 00:03:00,580 --> 00:03:04,620 >> Nu linie 15 ser det ud som om jeg er udskrivning af en stjerne, og derefter linie 16 66 00:03:04,620 --> 00:03:06,620 det ser ud som om jeg er udskrivning en ny linje, 67 00:03:06,620 --> 00:03:09,560 og de er begge indrykket så Jeg inde i sløjfen tydeligt. 68 00:03:09,560 --> 00:03:13,610 Så skulle jeg ikke gøre stjerne, nye linje, stjerne, ny linje, stjerne, ny linje? 69 00:03:13,610 --> 00:03:14,110 Ja? 70 00:03:14,110 --> 00:03:18,430 71 00:03:18,430 --> 00:03:21,240 >> Ja, i modsætning til et sprog som Python, hvis du er fortrolig, 72 00:03:21,240 --> 00:03:23,540 indrykning ikke noget til computeren. 73 00:03:23,540 --> 00:03:25,280 Det kun betyder noget for mennesket. 74 00:03:25,280 --> 00:03:29,860 Så mens jeg her har opfundet linjer 15 og 16-- der ser smuk, 75 00:03:29,860 --> 00:03:31,330 men computeren er ligeglad. 76 00:03:31,330 --> 00:03:34,640 Computeren bekymrer sig om faktisk at have krøllede parenteser 77 00:03:34,640 --> 00:03:36,310 omkring disse linjer kode. 78 00:03:36,310 --> 00:03:39,520 >> Så det er clear-- ligesom i Scratch-- at disse to linjer kode 79 00:03:39,520 --> 00:03:40,450 skal fuldbyrdes. 80 00:03:40,450 --> 00:03:44,390 Som en af ​​de gule Scratch puslespil stykker igen og igen og igen. 81 00:03:44,390 --> 00:03:50,920 >> Så nu, hvis jeg igen køre dette program-- ./buggy-2-- Hm. 82 00:03:50,920 --> 00:03:51,770 Jeg har en fejl nu. 83 00:03:51,770 --> 00:03:54,212 Hvad har jeg glemt at gøre? 84 00:03:54,212 --> 00:03:55,420 Ja, så jeg ikke kompilere det. 85 00:03:55,420 --> 00:03:56,740 Så gør buggy-2. 86 00:03:56,740 --> 00:03:59,840 Ingen sådan fil fordi jeg ikke faktisk kompilere den anden version. 87 00:03:59,840 --> 00:04:04,860 Så nu interessant sort variable-- ikke 2. 88 00:04:04,860 --> 00:04:05,510 Vi laver 1. 89 00:04:05,510 --> 00:04:11,050 Gør buggy-1-- ./buggy-1-- og nu hver af dem er på samme linje. 90 00:04:11,050 --> 00:04:13,880 >> Nu er der en undtagelse til denne formodede fordring af mine 91 00:04:13,880 --> 00:04:15,520 at du har brug for disse krøllede parenteser. 92 00:04:15,520 --> 00:04:20,160 Hvornår er det faktisk OK-- hvis du har bemærket i afsnit eller textbooks-- 93 00:04:20,160 --> 00:04:22,130 at udelade de krøllede parenteser? 94 00:04:22,130 --> 00:04:22,630 Ja? 95 00:04:22,630 --> 00:04:26,290 96 00:04:26,290 --> 00:04:26,870 >> Præcis. 97 00:04:26,870 --> 00:04:28,940 Når der kun er én linje kode, som du 98 00:04:28,940 --> 00:04:32,830 ønsker at blive forbundet med sløjfe som i vores første eksempel. 99 00:04:32,830 --> 00:04:36,380 Det er helt legitimt at udelade de krøllede parenteser 100 00:04:36,380 --> 00:04:40,310 blot som en slags bekvemmelighed fra compiler til dig. 101 00:04:40,310 --> 00:04:40,810 Ja? 102 00:04:40,810 --> 00:04:43,347 103 00:04:43,347 --> 00:04:43,930 Godt spørgsmål. 104 00:04:43,930 --> 00:04:45,500 Ville det blive betragtet som en stil fejl? 105 00:04:45,500 --> 00:04:49,340 Vi ville promote-- som i CS50 Vejledning, webadressen for hvilke 106 00:04:49,340 --> 00:04:51,926 er pset1-- der altid anvende de krøllede parenteser. 107 00:04:51,926 --> 00:04:53,550 Bestemt, hvis du er ny til programmering. 108 00:04:53,550 --> 00:04:56,800 Virkeligheden er, at vi ikke er kommer til at forbyde dig 109 00:04:56,800 --> 00:04:58,680 fra at gøre disse bekvemmeligheder. 110 00:04:58,680 --> 00:05:00,846 Men hvis du bare får ind i swing ting, 111 00:05:00,846 --> 00:05:04,020 absolut bare altid bruge den krøllede seler, indtil du får hænge af det. 112 00:05:04,020 --> 00:05:04,640 Godt spørgsmål. 113 00:05:04,640 --> 00:05:05,320 >> Okay. 114 00:05:05,320 --> 00:05:07,660 Så det da var en fejl. 115 00:05:07,660 --> 00:05:09,190 I hvert fald i noget forholdsvis enkel. 116 00:05:09,190 --> 00:05:11,260 Og alligevel tror du måske dette er temmelig rudimentær, right? 117 00:05:11,260 --> 00:05:13,635 Dette er sortering af den første uge se på sproget 118 00:05:13,635 --> 00:05:14,890 ligesom, se jeres fejl deri. 119 00:05:14,890 --> 00:05:17,250 Men virkeligheden er disse faktisk repræsentativ 120 00:05:17,250 --> 00:05:20,310 af nogle temmelig skræmmende problemer som kan opstå i den virkelige verden. 121 00:05:20,310 --> 00:05:23,530 >> Så nogle af jer måske husker hvis du følger tech nyheder, 122 00:05:23,530 --> 00:05:25,740 eller måske endda fanget vind af dette i februar 123 00:05:25,740 --> 00:05:29,434 af det sidste år, at Apple havde gjort lidt af en fejl i begge iOS, 124 00:05:29,434 --> 00:05:31,350 operativsystemet på deres telefoner, og også 125 00:05:31,350 --> 00:05:34,220 Mac OS operativsystemet på deres stationære og bærbare computere. 126 00:05:34,220 --> 00:05:36,480 Og du så sådanne overskrifter som dette. 127 00:05:36,480 --> 00:05:41,120 Og derefter, Apple lovede at fastsætte denne fejl, 128 00:05:41,120 --> 00:05:45,950 og meget hurtigt gjorde ordne det i iOS, men så i sidste ende fastsættes det i Mac OS 129 00:05:45,950 --> 00:05:46,810 samt. 130 00:05:46,810 --> 00:05:50,370 >> Nu er ingen af ​​disse overskrifter alene virkelig afsløre, hvad det underliggende problem var, 131 00:05:50,370 --> 00:05:55,640 men fejlen i sidste ende blev reduceret til en fejl i SSL, Secure Sockets Layer. 132 00:05:55,640 --> 00:05:57,390 Og lang historie kort, dette er den software 133 00:05:57,390 --> 00:06:01,030 at vores browsere og andre software, der bruges til at gøre hvad? 134 00:06:01,030 --> 00:06:04,090 135 00:06:04,090 --> 00:06:06,860 >> Hvis jeg sagde, at SSL er involveret, når du 136 00:06:06,860 --> 00:06:13,920 besøge en webadresse, der begynder med https, hvad så måske SSL være relateret til? 137 00:06:13,920 --> 00:06:14,580 Kryptering. 138 00:06:14,580 --> 00:06:16,470 Så vi vil tale om dette i de kommende dage. 139 00:06:16,470 --> 00:06:18,750 Kryptering, kunsten scrambling oplysninger. 140 00:06:18,750 --> 00:06:22,200 >> Men lang historie kort, Apple engang siden havde begået en fejl 141 00:06:22,200 --> 00:06:25,970 i deres gennemførelse af SSL, den software, der i sidste ende gennemfører 142 00:06:25,970 --> 00:06:30,120 URL'er som HTTPS eller max forbindelser der også. 143 00:06:30,120 --> 00:06:32,850 Resultatet af det er, at din forbindelser kunne potentielt 144 00:06:32,850 --> 00:06:33,920 opfanges. 145 00:06:33,920 --> 00:06:37,130 Og dine forbindelser var ikke nødvendigvis krypteret 146 00:06:37,130 --> 00:06:40,350 hvis du havde nogle dårlige fyr i mellem dig og destinationen hjemmesiden, der 147 00:06:40,350 --> 00:06:42,170 vidste hvordan man kan drage fordel af dette. 148 00:06:42,170 --> 00:06:45,090 >> Nu Apple i sidste ende sendt en rettelse til dette endelig 149 00:06:45,090 --> 00:06:46,920 og beskrivelsen deres løsning var dette. 150 00:06:46,920 --> 00:06:49,878 Sikker transport undladt at validere ægtheden af ​​forbindelsen. 151 00:06:49,878 --> 00:06:52,920 Spørgsmålet blev behandlet af genoprette manglende validering trin. 152 00:06:52,920 --> 00:06:57,250 >> Så dette er en meget hånd bølget forklaring for blot at sige, at vi skruet op. 153 00:06:57,250 --> 00:07:00,920 Der er bogstaveligt talt en linje kode, der var fejlbehæftet 154 00:07:00,920 --> 00:07:05,130 i deres gennemførelse af SSL, og hvis du går online og søge efter dette 155 00:07:05,130 --> 00:07:07,210 du kan faktisk finde den originale kildekode. 156 00:07:07,210 --> 00:07:11,960 For eksempel er et skærmbillede af kun en del af en temmelig stor fil, 157 00:07:11,960 --> 00:07:15,965 men dette er en funktion tilsyneladende kaldet SSL verificere tegn server nøgleudveksling. 158 00:07:15,965 --> 00:07:17,840 Og det tager en flok argumenter og indgange. 159 00:07:17,840 --> 00:07:20,298 Og vi kommer ikke til at fokusere for meget på minutiaernes der, 160 00:07:20,298 --> 00:07:24,390 men hvis du fokuserer på kode inde af det øverste function-- lad os 161 00:07:24,390 --> 00:07:25,590 zoome ind på det. 162 00:07:25,590 --> 00:07:28,140 Du har måske allerede mistanke hvad fejlen måske 163 00:07:28,140 --> 00:07:31,230 være, selvom du ikke har nogen idé i sidste ende, hvad du kigger på. 164 00:07:31,230 --> 00:07:35,924 Der er lidt af en anomali her, hvilket er hvad? 165 00:07:35,924 --> 00:07:38,940 >> Ja, jeg kan ikke rigtig lide udseendet af to Goto mislykkes. 166 00:07:38,940 --> 00:07:42,060 Helt ærligt, jeg ved ikke rigtig, hvad goto ikke midler, men med to af dem 167 00:07:42,060 --> 00:07:42,810 ryg mod ryg. 168 00:07:42,810 --> 00:07:45,290 Det er bare sådan gnider mig intellektuelt den forkerte vej, 169 00:07:45,290 --> 00:07:48,910 og faktisk hvis vi zoomer ind på bare disse linjer, dette er C. 170 00:07:48,910 --> 00:07:52,220 >> Så en masse af Apples kode selv er skrevet i C, 171 00:07:52,220 --> 00:07:55,780 og denne tilsyneladende er virkelig equivalent-- 172 00:07:55,780 --> 00:07:59,060 ikke til den smukke indrykning version, men hvis du erkende, 173 00:07:59,060 --> 00:08:02,560 at der er ingen krøllede parenteser, hvad Apple skrev virkelig var kode, der ser 174 00:08:02,560 --> 00:08:03,540 som denne. 175 00:08:03,540 --> 00:08:07,080 Så jeg har zoomet ud, og jeg bare fast indrykningen i den forstand, 176 00:08:07,080 --> 00:08:10,690 at hvis der er nogen krøllede parenteser, at sekund goto mislykkes, der er i gult 177 00:08:10,690 --> 00:08:12,500 kommer til at udføre uanset hvad. 178 00:08:12,500 --> 00:08:15,540 Det er ikke forbundet med den hvis betingelse ovenover. 179 00:08:15,540 --> 00:08:19,590 >> Så selv igen, hvis du ikke helt forstå, hvad det eventuelt kunne 180 00:08:19,590 --> 00:08:23,230 være at gøre, ved, at hver af disse conditions-- hver af disse linjer 181 00:08:23,230 --> 00:08:26,180 er et meget vigtigt skridt i processen med at tjekke 182 00:08:26,180 --> 00:08:28,350 Hvis dine data er i virkeligheden krypteret. 183 00:08:28,350 --> 00:08:31,710 Så springer en af ​​disse trin, ikke den bedste idé. 184 00:08:31,710 --> 00:08:34,840 >> Men fordi vi har denne anden goto mislykkes i gul, 185 00:08:34,840 --> 00:08:36,840 og fordi når vi slags æstetisk 186 00:08:36,840 --> 00:08:40,480 flytte den til venstre, hvor det logisk er i øjeblikket, hvad 187 00:08:40,480 --> 00:08:43,230 betyder det for den linje kode under den anden goto 188 00:08:43,230 --> 00:08:46,480 mislykkes skulle man tro? 189 00:08:46,480 --> 00:08:48,860 Det er altid vil blive sprunget over. 190 00:08:48,860 --> 00:08:52,100 Så gotos er generelt ildeset grunde vil vi ikke rigtig gå ind i, 191 00:08:52,100 --> 00:08:54,940 og faktisk i CS50 vi tendens til ikke at undervise i denne redegørelse goto, 192 00:08:54,940 --> 00:08:58,130 men du kan tænke på goto mislykkes således gå hoppe 193 00:08:58,130 --> 00:08:59,600 til en anden del af koden. 194 00:08:59,600 --> 00:09:03,120 >> Med andre ord springe over denne sidste linje helt, 195 00:09:03,120 --> 00:09:07,420 og så resultatet af denne dum simpel fejl, der var lige 196 00:09:07,420 --> 00:09:10,330 et resultat af nok nogen kopiere og indsætte en alt for 197 00:09:10,330 --> 00:09:14,150 mange gange var, at hele sikkerhed af iOS og Mac OS 198 00:09:14,150 --> 00:09:18,240 var sårbar over for aflytning af skurkene i temmelig lang tid. 199 00:09:18,240 --> 00:09:19,940 Indtil Apple endelig løst dette. 200 00:09:19,940 --> 00:09:23,100 >> Nu, hvis nogle af jer er faktisk kører gamle versioner af iOS eller Mac OS, 201 00:09:23,100 --> 00:09:27,250 du kan gå til gotofail.com som er en hjemmeside, at nogen sat op 202 00:09:27,250 --> 00:09:29,190 i det væsentlige bestemme programmatisk 203 00:09:29,190 --> 00:09:30,980 Hvis din computer er stadig sårbar. 204 00:09:30,980 --> 00:09:33,600 Og helt ærligt, hvis det er, er det nok en god idé 205 00:09:33,600 --> 00:09:36,870 at opdatere din telefon eller din Mac på dette punkt. 206 00:09:36,870 --> 00:09:40,120 Men der, bare bevis på, hvor en vurdering af disse lavere niveau 207 00:09:40,120 --> 00:09:42,400 detaljer og retfærdigt enkle idéer kan virkelig 208 00:09:42,400 --> 00:09:44,590 oversætte til beslutninger og problemer, 209 00:09:44,590 --> 00:09:47,320 affected-- i denne case-- millioner af mennesker. 210 00:09:47,320 --> 00:09:49,107 >> Nu nogle ord på administration. 211 00:09:49,107 --> 00:09:50,690 Afsnit vil starte denne kommende søndag. 212 00:09:50,690 --> 00:09:53,360 Du vil modtage en e-mail fra weekend om sektion, på hvilket tidspunkt 213 00:09:53,360 --> 00:09:55,290 den resektion proces vil begynde, hvis du har 214 00:09:55,290 --> 00:09:56,998 indså du nu har nogle nye konflikter. 215 00:09:56,998 --> 00:10:00,180 Så dette sker hvert år, og vi vil rumme i de kommende dage. 216 00:10:00,180 --> 00:10:02,430 >> Kontoret hours-- gør holde øje på denne liste her. 217 00:10:02,430 --> 00:10:05,100 Ændrer en lille smule i denne uge, især starttidspunktet 218 00:10:05,100 --> 00:10:08,180 og placeringen, så du skal konsultere at før overskriften til kontortid 219 00:10:08,180 --> 00:10:09,520 nogen af ​​de næste fire nætter. 220 00:10:09,520 --> 00:10:12,680 Og nu et par ord om vurdering især da du dykke ned i problemet 221 00:10:12,680 --> 00:10:14,350 sætter en og videre. 222 00:10:14,350 --> 00:10:17,070 >> Så pr specifikationen, disse er generelt 223 00:10:17,070 --> 00:10:20,360 akser, langs hvilke vi evaluerer dit arbejde. 224 00:10:20,360 --> 00:10:23,170 Anvendelsesområde refererer til hvad omfang din kode redskaber 225 00:10:23,170 --> 00:10:25,690 de funktioner, der kræves vores specifikation. 226 00:10:25,690 --> 00:10:28,290 Med andre ord, hvor meget af et stykke sæt gjorde du bide. 227 00:10:28,290 --> 00:10:30,440 Har du lavet en tredjedel af det, halvdelen af ​​det, 100% af det. 228 00:10:30,440 --> 00:10:33,000 Selv hvis det ikke er korrekt, hvor meget har du forsøger? 229 00:10:33,000 --> 00:10:35,290 Så der fanger niveau indsats og beløbet 230 00:10:35,290 --> 00:10:38,260 som du lidt væk fra den problem sæt problemer. 231 00:10:38,260 --> 00:10:40,690 >> Correctness-- dette ene, at hvilket omfang, er din kode 232 00:10:40,690 --> 00:10:43,150 overensstemmelse med vores specifikationer og fri for fejl. 233 00:10:43,150 --> 00:10:44,770 Så virker det korrekt? 234 00:10:44,770 --> 00:10:48,700 Hvis vi giver det nogle input, gør det give os output, som vi forventer? 235 00:10:48,700 --> 00:10:52,570 Design-- nu dette er den første af de særligt kvalitative, 236 00:10:52,570 --> 00:10:56,180 eller dem, der kræver menneskelig vurdering. 237 00:10:56,180 --> 00:10:59,690 Og ja, det er derfor vi har et personale af så mange pædagogiske stipendiater og kursus 238 00:10:59,690 --> 00:11:00,350 assistenter. 239 00:11:00,350 --> 00:11:03,480 I hvilket omfang er dit kode skrevet godt? 240 00:11:03,480 --> 00:11:05,810 >> Og igen er dette en meget kvalitative vurdering 241 00:11:05,810 --> 00:11:09,100 der vil arbejde med dig på bidirektionalt i de kommende uger. 242 00:11:09,100 --> 00:11:12,060 Så når du får ikke kun numeriske scoringer, men også 243 00:11:12,060 --> 00:11:16,682 en skriftlig scoringer, eller maskinskrevet feedback eller skriftlig feedback på engelske ord. 244 00:11:16,682 --> 00:11:19,640 Det er, hvad vi vil bruge til at køre dig mod faktisk skriver bedre kode. 245 00:11:19,640 --> 00:11:23,320 Og i foredrag og afsnit, vil vi prøve at pege out-- så ofte som vi can-- 246 00:11:23,320 --> 00:11:26,420 hvad der gør et program ikke kun korrekt og funktionelt godt, 247 00:11:26,420 --> 00:11:28,200 men også godt designet. 248 00:11:28,200 --> 00:11:31,850 Den mest effektive det kunne være, eller selv den smukkeste det kan være. 249 00:11:31,850 --> 00:11:33,100 >> Hvilket fører os til stil. 250 00:11:33,100 --> 00:11:36,876 Stil i sidste ende er en æstetisk dom. 251 00:11:36,876 --> 00:11:38,750 Vidste du vælge godt navne til dine variabler? 252 00:11:38,750 --> 00:11:40,330 Har du indrykket din kode korrekt? 253 00:11:40,330 --> 00:11:44,010 Ser det godt, og derfor, er det let for et andet menneske 254 00:11:44,010 --> 00:11:46,550 til at læse jeres respektive af dens korrekthed. 255 00:11:46,550 --> 00:11:50,300 >> Nu generelt pr pensum, score vi disse ting på en fem punkts skala. 256 00:11:50,300 --> 00:11:53,640 Og lad mig hammer hjem punkt at et tredimensionalt er faktisk godt. 257 00:11:53,640 --> 00:11:55,550 Meget hurtigt gøre folk begynde at gøre aritmetik. 258 00:11:55,550 --> 00:11:58,133 Når de får en tre ud af fem om korrekthed for nogle pset 259 00:11:58,133 --> 00:12:02,040 og de tror sgu, jeg går til 60% som er i det væsentlige en D eller E. 260 00:12:02,040 --> 00:12:03,980 >> Det er ikke den måde, vi tænke på disse numre. 261 00:12:03,980 --> 00:12:06,880 En tre er faktisk godt, og hvad vi forventer generelt i begyndelsen 262 00:12:06,880 --> 00:12:09,820 af begrebet er, at hvis du får en flok af three's-- måske et par 263 00:12:09,820 --> 00:12:12,540 af messer, et par fours-- eller et par toere, et par fours-- 264 00:12:12,540 --> 00:12:13,748 det er et godt sted at starte. 265 00:12:13,748 --> 00:12:16,320 Og så længe vi ser et opadgående bane over tid, 266 00:12:16,320 --> 00:12:18,540 du er i et særligt godt sted. 267 00:12:18,540 --> 00:12:20,752 >> Formlen vi bruger til at vægt ting er i det væsentlige 268 00:12:20,752 --> 00:12:22,710 dette pr pensum, hvilket betyder blot, at vi 269 00:12:22,710 --> 00:12:24,750 lægge større vægt på korrekthed. 270 00:12:24,750 --> 00:12:27,930 Fordi det er meget ofte korrekthed der tager mest tid. 271 00:12:27,930 --> 00:12:28,760 Tro mig nu. 272 00:12:28,760 --> 00:12:31,190 Du vil find-- mindst i en pset-- at man 273 00:12:31,190 --> 00:12:36,790 tilbringer 90% af din tid arbejder på 10% af problemet. 274 00:12:36,790 --> 00:12:39,320 >> Og alt slags fungerer bortset fra en eller to fejl, 275 00:12:39,320 --> 00:12:41,570 og dem er de fejl, der holde dig op sent om natten. 276 00:12:41,570 --> 00:12:43,380 De er dem, der slags slippe dig. 277 00:12:43,380 --> 00:12:45,560 Men efter at sove på det, eller deltage kontortid 278 00:12:45,560 --> 00:12:48,844 eller stille spørgsmål online, når du kommer til at 100% mål, 279 00:12:48,844 --> 00:12:50,760 og det er derfor, vi vægt Korrekthed mest. 280 00:12:50,760 --> 00:12:54,102 Design en lidt mindre, og style en lidt mindre end det. 281 00:12:54,102 --> 00:12:56,060 Men husk på mind-- stil er måske den nemmeste 282 00:12:56,060 --> 00:12:58,890 af disse til at bide fra som pr stil vejledning. 283 00:12:58,890 --> 00:13:01,580 >> Og nu, en mere alvorlig Bemærk på akademisk ærlighed. 284 00:13:01,580 --> 00:13:05,000 CS50 har den uheldige skelnen af er den største producent af Ad Board 285 00:13:05,000 --> 00:13:07,330 tilfælde næsten hvert år historisk. 286 00:13:07,330 --> 00:13:11,012 Det er ikke fordi de studerende snyde i CS50 noget mere så end nogen anden klasse, 287 00:13:11,012 --> 00:13:13,720 men på grund af arten af ​​det arbejde, det faktum, at det er elektronisk, 288 00:13:13,720 --> 00:13:16,636 det faktum, at vi ser for det, og det faktum, at vi er dataloger, 289 00:13:16,636 --> 00:13:20,570 Jeg kan sige, vi er desværre meget gode til at opdage det. 290 00:13:20,570 --> 00:13:22,710 >> Så hvad betyder det reelt? 291 00:13:22,710 --> 00:13:24,820 Så det, pr pensum, kurset filosofi 292 00:13:24,820 --> 00:13:28,090 virkelig koges ned til at være rimelig. 293 00:13:28,090 --> 00:13:31,684 Der er denne linje mellem gøre et arbejde på din egen 294 00:13:31,684 --> 00:13:34,100 og få en lille smule af rimelig hjælp fra en ven, 295 00:13:34,100 --> 00:13:38,020 og direkte at gøre det arbejde for din ven, eller sende ham eller hende din kode 296 00:13:38,020 --> 00:13:41,080 så han eller hun kan simpelthen tage eller låne det ud til højre. 297 00:13:41,080 --> 00:13:43,580 Og der krydser linjen at vi trukket i klassen. 298 00:13:43,580 --> 00:13:45,410 >> Se, pensum i sidste ende for de strækninger 299 00:13:45,410 --> 00:13:48,209 at vi trækker som værende rimelig og urimelig adfærd, 300 00:13:48,209 --> 00:13:50,000 men det virkelig kog ned til essensen 301 00:13:50,000 --> 00:13:53,980 af dit arbejde behøver at være din egen i sidste ende. 302 00:13:53,980 --> 00:13:56,230 Nu med det sagt, der er en heuristisk. 303 00:13:56,230 --> 00:13:58,980 Fordi som du måske imagine-- fra kontortid og det visuelle 304 00:13:58,980 --> 00:14:01,060 og de videoer vi har vist således far-- CS50 305 00:14:01,060 --> 00:14:04,530 er faktisk beregnet til at være collaborative og så samarbejdsvillig og social 306 00:14:04,530 --> 00:14:06,450 som muligt. 307 00:14:06,450 --> 00:14:08,570 Som kollaborative som det er stringent. 308 00:14:08,570 --> 00:14:11,314 >> Men med dette sagt, heuristisk, som du kan se i pensum, 309 00:14:11,314 --> 00:14:12,980 er, at når du har et problem. 310 00:14:12,980 --> 00:14:16,470 Du har nogle fejl i din kode, som du ikke kan løse, er det rimeligt for dig 311 00:14:16,470 --> 00:14:18,039 at vise din kode til en anden. 312 00:14:18,039 --> 00:14:21,080 En ven selv i klassen, en ven sidder ved siden af ​​dig på kontortid, 313 00:14:21,080 --> 00:14:22,680 eller et medlem af personalet. 314 00:14:22,680 --> 00:14:25,810 Men de kan ikke vise deres kode til dig. 315 00:14:25,810 --> 00:14:27,710 >> Med andre ord, en svar på dine question-- 316 00:14:27,710 --> 00:14:29,940 Jeg har brug for help-- ikke åh, her er min kode. 317 00:14:29,940 --> 00:14:32,440 Tag et kig på dette og udlede det hvad du vil. 318 00:14:32,440 --> 00:14:34,580 Nu, selvfølgelig, er der en måde klart til spil 319 00:14:34,580 --> 00:14:37,760 dette system, hvor jeg vil vise dig min kode, før de har et spørgsmål. 320 00:14:37,760 --> 00:14:40,150 Vis mig mit din kode før de har et spørgsmål. 321 00:14:40,150 --> 00:14:45,870 Men se pensum igen til finere detaljer om, hvor denne linje er. 322 00:14:45,870 --> 00:14:50,606 >> Netop nu male billedet og dele så gennemsigtigt som muligt 323 00:14:50,606 --> 00:14:53,480 hvor vi er i de seneste år, dette er antallet af Ad Board tilfælde 324 00:14:53,480 --> 00:14:56,260 at CS50 har haft over de sidste syv år. 325 00:14:56,260 --> 00:14:58,717 14 sager denne seneste fald. 326 00:14:58,717 --> 00:15:01,300 Med hensyn til de involverede studerende, det var 20 nogle ulige elever 327 00:15:01,300 --> 00:15:02,490 denne sidste efterår. 328 00:15:02,490 --> 00:15:05,670 Der var et højdepunkt på 33 studerende nogle år siden. 329 00:15:05,670 --> 00:15:08,830 Mange af dem er desværre ikke længere her på campus. 330 00:15:08,830 --> 00:15:13,100 >> Students involveret som en procentdel af klasse har historisk varierede fra 0% 331 00:15:13,100 --> 00:15:17,300 til 5,3%, hvilket er kun at sige dette er en årlig udfordring. 332 00:15:17,300 --> 00:15:20,390 Og hen imod det, hvad vi ønsker at gøre, er at formidle en 333 00:15:20,390 --> 00:15:24,310 at vi dd-- bare FYI-- sammenligne på en retfærdighed til de studerende, der 334 00:15:24,310 --> 00:15:26,520 er efter linje i overensstemmelse hermed. 335 00:15:26,520 --> 00:15:29,620 Vi gør sammenligne alle aktuelle indlæg mod alle tidligere missioner 336 00:15:29,620 --> 00:15:30,840 fra de sidste mange år. 337 00:15:30,840 --> 00:15:33,620 >> Vi ved også, hvordan man kan google rundt og find kode repositories 338 00:15:33,620 --> 00:15:36,360 online, diskussionsfora online, jobsites online. 339 00:15:36,360 --> 00:15:41,580 Hvis en studerende kan finde det, kan vi sikkert finder det lige så meget som vi desværre gør. 340 00:15:41,580 --> 00:15:45,330 Så hvad du vil se i pensum dog er denne beklagelse klausul. 341 00:15:45,330 --> 00:15:47,500 Jeg kan helt sikkert værdsætter, og vi alle har 342 00:15:47,500 --> 00:15:50,870 personale have gjort kursus som denne eller dette sig over tid, 343 00:15:50,870 --> 00:15:53,997 sikkert ved, hvad det er ligesom når livet kommer i vejen, når du har 344 00:15:53,997 --> 00:15:56,080 nogle sent nat deadline-- ikke kun i denne klasse, 345 00:15:56,080 --> 00:15:58,660 men another-- når du er helt udmattet, stresset, 346 00:15:58,660 --> 00:16:00,659 have en uforholdsmæssig antal af andre ting at gøre. 347 00:16:00,659 --> 00:16:03,660 Du vil gøre på et tidspunkt i liv helt sikkert en dårlig, måske sent 348 00:16:03,660 --> 00:16:04,620 nat beslutning. 349 00:16:04,620 --> 00:16:06,520 >> Så pr pensum, der er denne klausul, 350 00:16:06,520 --> 00:16:10,629 således at hvis inden for 72 timer for at gøre nogle dårlig beslutning, du ejer op til det 351 00:16:10,629 --> 00:16:12,670 og nå ud til mig og en af ​​kursets hoveder 352 00:16:12,670 --> 00:16:14,300 og vi vil have en samtale. 353 00:16:14,300 --> 00:16:16,220 Vi vil håndtere tingene internt i håb 354 00:16:16,220 --> 00:16:18,770 det bliver mere af en undervisning øjeblik eller liv lektion 355 00:16:18,770 --> 00:16:22,120 og ikke noget med særligt drastiske forgreninger 356 00:16:22,120 --> 00:16:24,570 som du kan se på disse diagrammer her. 357 00:16:24,570 --> 00:16:26,540 >> Så det er en meget alvorlig tone. 358 00:16:26,540 --> 00:16:29,960 Lad os stoppe for bare et par stykker sekunder for at bryde spændingen. 359 00:16:29,960 --> 00:16:34,442 >> [Musik spiller] 360 00:16:34,442 --> 00:17:17,768 361 00:17:17,768 --> 00:17:20,250 >> David J. MALAN: Okay, så hvordan var det for en Overgang? 362 00:17:20,250 --> 00:17:22,059 Til dagens primære emner. 363 00:17:22,059 --> 00:17:23,859 Den første er abstraktion. 364 00:17:23,859 --> 00:17:26,900 En anden, som vil være repræsentation af data, som ærligt talt 365 00:17:26,900 --> 00:17:31,640 er en virkelig tør måde at sige, hvordan kan vi gå om at løse problemer og tænkning 366 00:17:31,640 --> 00:17:33,250 om at løse problemer? 367 00:17:33,250 --> 00:17:37,285 Så du har set i Scratch, og du har set måske allerede i pset1 med C 368 00:17:37,285 --> 00:17:39,930 at du ikke kun kan bruge funktioner som printf, 369 00:17:39,930 --> 00:17:42,770 at andre mennesker i år tidligere skrev til dig. 370 00:17:42,770 --> 00:17:45,340 Du kan også skrive dine egne funktioner. 371 00:17:45,340 --> 00:17:48,440 >> Og selvom du måske ikke har gjort dette i C, og helt ærligt i pset1 372 00:17:48,440 --> 00:17:51,866 du ikke virkelig har brug for at skrive din egen funktion fordi problem-- 373 00:17:51,866 --> 00:17:53,990 mens måske skræmmende først glance-- du vil se 374 00:17:53,990 --> 00:17:57,910 kan i sidste ende løses med ikke alle, at mange linjer kode. 375 00:17:57,910 --> 00:18:01,140 Men med det sagt, i form for at skrive din egen funktion, 376 00:18:01,140 --> 00:18:03,570 indse, at C giver du denne evne. 377 00:18:03,570 --> 00:18:06,940 >> Jeg har tænkt mig at gå i dagens kildekode, som er tilgængelig allerede er online, 378 00:18:06,940 --> 00:18:10,900 og jeg har tænkt mig at gå videre og åbne et program kaldet funktion 0.C, 379 00:18:10,900 --> 00:18:14,620 og i funktion nul vi vil se et par ting. 380 00:18:14,620 --> 00:18:19,160 I første linjer 18 gennem 23 er min vigtigste funktion. 381 00:18:19,160 --> 00:18:22,414 Og nu hvor vi er begyndt at læse kode, som vi ikke skriver på flue, 382 00:18:22,414 --> 00:18:25,080 men i stedet har jeg skrevet på forhånd eller at du i et problem sæt 383 00:18:25,080 --> 00:18:27,910 måtte modtage have er skrevet i forvejen. 384 00:18:27,910 --> 00:18:30,040 En god måde at starte læser en andens kode 385 00:18:30,040 --> 00:18:31,400 er at kigge efter den vigtigste funktion. 386 00:18:31,400 --> 00:18:34,420 Finde ud af, hvor denne post Pointen er at køre programmet, 387 00:18:34,420 --> 00:18:36,580 og følg derefter det logisk derfra. 388 00:18:36,580 --> 00:18:40,190 >> Så dette program tilsyneladende udskrifter dit navn efterfulgt af et kolon. 389 00:18:40,190 --> 00:18:42,490 Vi bruger derefter getString fra CS50 biblioteket 390 00:18:42,490 --> 00:18:46,050 at få en snor, eller et ord eller en sætning fra brugeren ved tastaturet. 391 00:18:46,050 --> 00:18:48,390 Og så er der dette ting her-- PrintName. 392 00:18:48,390 --> 00:18:51,420 >> Nu PrintName er ikke en funktion, der kommer med C. 393 00:18:51,420 --> 00:18:52,970 Det er ikke i standard io.h. 394 00:18:52,970 --> 00:18:55,570 Det er ikke i CS50.h. 395 00:18:55,570 --> 00:18:57,880 Det er snarere i den samme fil. 396 00:18:57,880 --> 00:19:01,000 Varsel, hvis jeg rulle ned en bit-- linier 25 til 27-- 397 00:19:01,000 --> 00:19:05,330 det er bare en smuk måde at kommentere din kode ved hjælp af stjerner og skråstreger. 398 00:19:05,330 --> 00:19:07,320 Dette er en multi-line kommentar, og det er bare 399 00:19:07,320 --> 00:19:10,570 min beskrivelse i blå hvad denne funktion gør. 400 00:19:10,570 --> 00:19:14,530 >> Fordi der i linjerne 28 til 31, Jeg har skrevet en super simpel funktion 401 00:19:14,530 --> 00:19:16,280 hvis navn er PrintName. 402 00:19:16,280 --> 00:19:19,560 Det tager hvor mange argumenter ville du sige? 403 00:19:19,560 --> 00:19:25,120 Så en argument--, fordi der er en argument anført i parentes. 404 00:19:25,120 --> 00:19:27,000 Den type der er String. 405 00:19:27,000 --> 00:19:30,240 Hvilket vil sige PrintName er ligesom denne sorte boks 406 00:19:30,240 --> 00:19:32,910 eller funktion, der tager som input en streng. 407 00:19:32,910 --> 00:19:35,730 >> Og navnet på denne String vil hensigtsmæssigt være navn. 408 00:19:35,730 --> 00:19:37,840 Ikke S, ikke N, men navn. 409 00:19:37,840 --> 00:19:41,090 Så hvad gør PrintName gøre? 410 00:19:41,090 --> 00:19:42,210 Det er dejligt simpelt. 411 00:19:42,210 --> 00:19:45,390 Ligesom én linje kode til printf, men tilsyneladende er det 412 00:19:45,390 --> 00:19:47,950 udskriver "Hej," så og så. 413 00:19:47,950 --> 00:19:50,070 Hvor så og så kommer fra argumentet. 414 00:19:50,070 --> 00:19:52,300 >> Nu er det ikke en enorm innovation her. 415 00:19:52,300 --> 00:19:56,710 Virkelig, jeg har taget et program, der kunne er blevet skrevet med én linje kode 416 00:19:56,710 --> 00:20:00,190 ved at sætte dette op her, og ændret det til noget 417 00:20:00,190 --> 00:20:04,920 der indebærer en vis seks eller syv eller deromkring linjer kode hele vejen herned. 418 00:20:04,920 --> 00:20:08,190 >> Men det er den praktiserende en princip, som kaldes abstraktion. 419 00:20:08,190 --> 00:20:12,550 Kind of indkapsling inden en ny funktion, der har et navn, og bedre 420 00:20:12,550 --> 00:20:14,590 endnu dette navn bogstaveligt siger, hvad den gør. 421 00:20:14,590 --> 00:20:16,880 Jeg mener printf-- det er ikke særligt beskrivende. 422 00:20:16,880 --> 00:20:18,932 Hvis jeg ønsker at oprette en brik, eller hvis jeg 423 00:20:18,932 --> 00:20:21,140 ønsker at oprette en funktion der udskriver en persons navn, 424 00:20:21,140 --> 00:20:23,230 skønhed gøre dette er, at jeg rent faktisk kan 425 00:20:23,230 --> 00:20:27,170 give denne funktion et navn der beskriver, hvad det gør. 426 00:20:27,170 --> 00:20:29,844 >> Nu tager i en indgang, Jeg har vilkårligt kaldet navn, 427 00:20:29,844 --> 00:20:32,760 men det er også vidunderligt beskrivende i stedet for at være lidt mere 428 00:20:32,760 --> 00:20:36,140 generisk ligesom S. og ugyldig, for nu, betyder blot, 429 00:20:36,140 --> 00:20:38,330 at denne funktion ikke hånd mig tilbage noget. 430 00:20:38,330 --> 00:20:41,127 Det er ikke ligesom getString at bogstaveligt hænder mig tilbage en streng 431 00:20:41,127 --> 00:20:43,960 ligesom vi gjorde med de stykker papir med dine klassekammerater i sidste uge, 432 00:20:43,960 --> 00:20:45,990 men det har blot en bivirkning. 433 00:20:45,990 --> 00:20:48,080 Den udskriver noget til skærmen. 434 00:20:48,080 --> 00:20:53,880 >> Så i slutningen af ​​dagen, hvis jeg gør-funktion-0, ./function-0, 435 00:20:53,880 --> 00:20:55,450 Vi vil se, at den beder om mit navn. 436 00:20:55,450 --> 00:20:58,150 Jeg skriver David, og det former mit navn. 437 00:20:58,150 --> 00:21:01,080 Hvis jeg gør det igen med Rob, det kommer til at sige "Hej, Rob." 438 00:21:01,080 --> 00:21:04,280 Så en enkel idé, men måske ekstrapolere fra dette mentalt 439 00:21:04,280 --> 00:21:06,750 at da programmerne får lidt mere kompliceret, 440 00:21:06,750 --> 00:21:10,290 og du ønsker at skrive en luns af kode og opkald, code-- påberåbelse 441 00:21:10,290 --> 00:21:13,270 at code-- af nogle beskrivende navn som PrintName, 442 00:21:13,270 --> 00:21:15,600 C gør tillade os denne evne. 443 00:21:15,600 --> 00:21:17,660 >> Her er et andet simpelt eksempel. 444 00:21:17,660 --> 00:21:22,940 For eksempel, hvis jeg åbner en fil fra dag kaldet return.c, 445 00:21:22,940 --> 00:21:24,270 mærke til, hvad jeg har gjort her. 446 00:21:24,270 --> 00:21:26,330 Det meste af denne hovedfunktion er printf. 447 00:21:26,330 --> 00:21:30,360 Jeg først vilkårligt initialisere en variabel kaldet X til nummer 2. 448 00:21:30,360 --> 00:21:34,110 Jeg derefter udskrive "x er nu % I "passerer i værdien af ​​x. 449 00:21:34,110 --> 00:21:35,500 Så jeg siger bare, hvad det er. 450 00:21:35,500 --> 00:21:37,208 >> Nu er jeg bare frimodigt hævder med printf. 451 00:21:37,208 --> 00:21:42,050 Jeg cubing denne værdi x, og jeg er gøre det ved at kalde en funktion 452 00:21:42,050 --> 00:21:45,590 kaldet terning passerer ix som argument, 453 00:21:45,590 --> 00:21:49,300 og derefter gemme output i selve variablen, x. 454 00:21:49,300 --> 00:21:51,340 Så jeg clobbering værdien af ​​x. 455 00:21:51,340 --> 00:21:53,380 Jeg tvingende den værdi af x med uanset 456 00:21:53,380 --> 00:21:56,510 resultatet af ringe denne terning funktion er. 457 00:21:56,510 --> 00:21:59,530 Og så vil jeg bare udskrive nogle fluffy ting her at sige, hvad jeg gjorde. 458 00:21:59,530 --> 00:22:01,600 >> Så hvad er så terning? 459 00:22:01,600 --> 00:22:03,510 Læg mærke til, hvad der er fundamentalt anderledes her. 460 00:22:03,510 --> 00:22:05,540 Jeg har givet den funktion et navn som før. 461 00:22:05,540 --> 00:22:08,270 Jeg har angivet et navn til et argument. 462 00:22:08,270 --> 00:22:11,650 Denne gang er det hedder N i stedet for navn, men jeg kan kalde det, hvad jeg vil. 463 00:22:11,650 --> 00:22:12,650 Men det er anderledes. 464 00:22:12,650 --> 00:22:14,080 Denne ting til venstre. 465 00:22:14,080 --> 00:22:16,290 Tidligere var det hvad søgeord? 466 00:22:16,290 --> 00:22:16,870 Drenge. 467 00:22:16,870 --> 00:22:18,580 Nu er det naturligvis int. 468 00:22:18,580 --> 00:22:20,630 >> Så hvad er måske tage væk? 469 00:22:20,630 --> 00:22:24,090 Betragtninger void betegner slags intetheden, og det var tilfældet. 470 00:22:24,090 --> 00:22:25,970 PrintName returneres ingenting. 471 00:22:25,970 --> 00:22:27,942 Det gjorde det, men det ikke give mig tilbage 472 00:22:27,942 --> 00:22:30,650 noget, som jeg kunne sætte på venstre side af et lighedstegn 473 00:22:30,650 --> 00:22:32,460 ligesom jeg har gjort her på linie 22. 474 00:22:32,460 --> 00:22:36,780 >> Så hvis jeg siger, til på linje 30, hvad er det sandsynligvis indebærer 475 00:22:36,780 --> 00:22:38,610 om, hvad terning gør for mig? 476 00:22:38,610 --> 00:22:41,110 Ja? 477 00:22:41,110 --> 00:22:42,310 Den returnerer et heltal. 478 00:22:42,310 --> 00:22:44,590 Så det rækker mig tilbage, for eksempelvis et stykke papir 479 00:22:44,590 --> 00:22:46,580 som den har skrevet svaret. 480 00:22:46,580 --> 00:22:50,130 2 kubik, eller 3 kubik, eller 4 cubed-- hvad jeg gik ind, 481 00:22:50,130 --> 00:22:51,540 og hvordan jeg gennemfører denne? 482 00:22:51,540 --> 00:22:54,810 Nå, bare n gange n gange n er, hvordan jeg kunne terning en værdi. 483 00:22:54,810 --> 00:22:57,110 Så igen, super enkel idé, men demonstrativ 484 00:22:57,110 --> 00:23:00,100 nu, hvordan vi kan skrive funktioner , faktisk havde os tilbage 485 00:23:00,100 --> 00:23:02,380 værdier, der kan være af interesse. 486 00:23:02,380 --> 00:23:05,740 >> Lad os se på et sidste eksempel her kaldet funktion én. 487 00:23:05,740 --> 00:23:08,530 I dette eksempel begynder det at få mere overbevisende. 488 00:23:08,530 --> 00:23:12,400 Så i funktion én dette program-- meddelelse i sidste ende 489 00:23:12,400 --> 00:23:14,920 kalder en funktion kaldet GetPositiveInt. 490 00:23:14,920 --> 00:23:17,800 GetPositiveInt er ikke en funktion i CS50 bibliotek, 491 00:23:17,800 --> 00:23:20,400 men vi besluttede vi gerne vil have den til at eksistere. 492 00:23:20,400 --> 00:23:24,550 >> Så hvis vi rulle ned senere i filen, mærke til, hvordan jeg gik om at gennemføre 493 00:23:24,550 --> 00:23:26,560 få positiv int, og jeg siger, det er mere overbevisende 494 00:23:26,560 --> 00:23:28,992 fordi det er en anstændig Antallet af linjer kode. 495 00:23:28,992 --> 00:23:30,700 Det er ikke bare en fjollet lille stykke legetøj programmet. 496 00:23:30,700 --> 00:23:33,870 Det er faktisk fået nogle fejlkontrol og gøre noget mere nyttigt. 497 00:23:33,870 --> 00:23:38,470 >> Så hvis du ikke har set walkthrough videoer, som vi har indlejret i pset1, 498 00:23:38,470 --> 00:23:42,350 ved, at det er en type af løkke i C, samme ånd 499 00:23:42,350 --> 00:23:44,270 til den slags ting Scratch kan gøre. 500 00:23:44,270 --> 00:23:46,320 Og gør siger gøre dette. 501 00:23:46,320 --> 00:23:47,500 Udskriv dette ud. 502 00:23:47,500 --> 00:23:51,860 Så gå videre og få N-- få en int og gemme det i N, 503 00:23:51,860 --> 00:23:55,760 og holde gør det igen og igen og igen, så længe n er mindre end én. 504 00:23:55,760 --> 00:23:58,720 >> Så n kommer til at være mindre end en kun hvis mennesket er ikke at samarbejde. 505 00:23:58,720 --> 00:24:01,980 Hvis han eller hun er at skrive i 0 eller -1 eller -50, 506 00:24:01,980 --> 00:24:04,790 denne løkke vil holde udfører igen og igen. 507 00:24:04,790 --> 00:24:07,549 Og i sidste ende mærke, jeg blot returnere værdi. 508 00:24:07,549 --> 00:24:09,590 Så nu har vi en funktion det ville har været rart 509 00:24:09,590 --> 00:24:14,040 hvis CS50 ville gennemføre i CS50.h og CS50.c for dig, 510 00:24:14,040 --> 00:24:16,520 men her kan vi nu gennemføre denne selv. 511 00:24:16,520 --> 00:24:19,230 >> Men to kommentarer til nogle af de vigtigste detaljer. 512 00:24:19,230 --> 00:24:24,390 En-- hvorfor jeg erklærer int n, tror du, på linje 29 513 00:24:24,390 --> 00:24:27,139 i stedet for bare at gøre det her, som er 514 00:24:27,139 --> 00:24:28,930 mere i overensstemmelse med hvad vi gjorde i sidste uge? 515 00:24:28,930 --> 00:24:29,430 Ja? 516 00:24:29,430 --> 00:24:34,485 517 00:24:34,485 --> 00:24:35,110 En god tanke. 518 00:24:35,110 --> 00:24:37,080 Så hvis vi skulle sætte det her, det er som om vi 519 00:24:37,080 --> 00:24:39,110 holde erklære det igen og igen. 520 00:24:39,110 --> 00:24:42,000 Det er i og for sig selv er ikke problematisk i sig selv, 521 00:24:42,000 --> 00:24:43,940 fordi vi kun har brug for værdien én gang og derefter 522 00:24:43,940 --> 00:24:45,330 vi kommer til at få en ny alligevel. 523 00:24:45,330 --> 00:24:45,940 Men en god tanke. 524 00:24:45,940 --> 00:24:46,440 Ja? 525 00:24:46,440 --> 00:24:52,770 526 00:24:52,770 --> 00:24:53,330 >> Luk. 527 00:24:53,330 --> 00:24:59,030 Så fordi jeg har erklæret n på ledning 29 uden for sløjfen, 528 00:24:59,030 --> 00:25:01,390 Det er tilgængelige i hele Hele denne funktion. 529 00:25:01,390 --> 00:25:05,400 Ikke de andre funktioner, da n er stadig inde i disse krøllet 530 00:25:05,400 --> 00:25:06,470 seler her. 531 00:25:06,470 --> 00:25:07,940 Så-- sikker. 532 00:25:07,940 --> 00:25:12,430 533 00:25:12,430 --> 00:25:12,940 >> Præcis. 534 00:25:12,940 --> 00:25:14,356 Så dette er endnu mere til det punkt. 535 00:25:14,356 --> 00:25:18,600 Hvis vi i stedet erklæret n lige her på linie 32, 536 00:25:18,600 --> 00:25:22,340 Det er problematisk, fordi gæt hvor ellers jeg har brug for at få adgang til det? 537 00:25:22,340 --> 00:25:25,620 På linie 34, og simpel tommelfingerregel er 538 00:25:25,620 --> 00:25:30,060 at du kun kan bruge en variabel inde i de seneste krøllede parenteser 539 00:25:30,060 --> 00:25:31,420 hvor du erklærede det. 540 00:25:31,420 --> 00:25:35,230 >> Desværre, linie 34 er en linje for sent, 541 00:25:35,230 --> 00:25:38,560 fordi jeg allerede har lukket den klammeparentes på linje 33 542 00:25:38,560 --> 00:25:41,220 der svarer til den klammeparentes på linie 30. 543 00:25:41,220 --> 00:25:44,180 Og så dette er en måde at sige at denne variabel int er virkefelt, 544 00:25:44,180 --> 00:25:46,970 så at sige, at kun indenfor af disse krøllede parenteser. 545 00:25:46,970 --> 00:25:48,910 Det bare ikke eksisterer uden for dem. 546 00:25:48,910 --> 00:25:51,580 >> Så ja, hvis jeg gør det forkert, lad mig gemme koden 547 00:25:51,580 --> 00:25:53,530 som det fejlagtigt er-- skrevet. 548 00:25:53,530 --> 00:25:57,990 Lad mig gå videre og gør funktion-1 og notice-- fejl. 549 00:25:57,990 --> 00:26:03,502 Anvendelse af sort identifikator n på linje 35, som er lige her. 550 00:26:03,502 --> 00:26:05,210 Og hvis vi rulle op yderligere en anden. 551 00:26:05,210 --> 00:26:08,750 Anvendelse af sort identifikator n på linje 34. 552 00:26:08,750 --> 00:26:11,200 >> Så compiler, Dunk, er at bemærke, at det bare 553 00:26:11,200 --> 00:26:13,720 eksisterer ikke, selvom klart det er der visuelt. 554 00:26:13,720 --> 00:26:16,090 Så en simpel fix erklære det der. 555 00:26:16,090 --> 00:26:18,790 >> Lad mig nu rulle til toppen af ​​filen. 556 00:26:18,790 --> 00:26:21,080 Hvad springer ud på dig som være lidt anderledes 557 00:26:21,080 --> 00:26:23,070 fra de ting, vi så på i sidste uge? 558 00:26:23,070 --> 00:26:26,990 Ikke alene har jeg navn, ikke kun gøre Jeg har nogle skarpe omfatter op toppen, 559 00:26:26,990 --> 00:26:29,340 Jeg har noget, jeg kalde en prototype. 560 00:26:29,340 --> 00:26:36,100 Nu ser frygtelig svarer til, hvad vi lige så et øjeblik siden på linie 27. 561 00:26:36,100 --> 00:26:39,230 >> Så lad os slutte fra en anden fejlmeddelelse, hvorfor jeg har gjort dette. 562 00:26:39,230 --> 00:26:42,050 Lad mig gå videre og slette disse linjer der. 563 00:26:42,050 --> 00:26:44,240 Og så ved vi intet om prototype. 564 00:26:44,240 --> 00:26:45,430 Remake denne fil. 565 00:26:45,430 --> 00:26:46,890 Gør funktion én. 566 00:26:46,890 --> 00:26:48,090 Og nu, damn, fire fejl. 567 00:26:48,090 --> 00:26:50,220 Lad os rulle op til den første. 568 00:26:50,220 --> 00:26:55,070 >> Implicit erklæring af funktionen få positiv int er ugyldig i C99. 569 00:26:55,070 --> 00:26:57,780 C99 betyder blot 1999 version af sproget 570 00:26:57,780 --> 00:26:59,710 C, hvilket er, hvad vi faktisk bruger. 571 00:26:59,710 --> 00:27:01,050 Så hvad betyder dette? 572 00:27:01,050 --> 00:27:05,250 Nå C-- og mere specifikt C compilers-- er temmelig dumme programmer. 573 00:27:05,250 --> 00:27:07,420 De skal blot vide, hvad du har fortalte dem, og det er 574 00:27:07,420 --> 00:27:08,960 faktisk tematisk fra sidste uge. 575 00:27:08,960 --> 00:27:12,910 >> Problemet er, at hvis jeg går om at gennemføre navn op her, 576 00:27:12,910 --> 00:27:17,640 og jeg kalder en funktion kaldet GetPositiveInt her på linie 20, 577 00:27:17,640 --> 00:27:22,520 denne funktion teknisk ikke eksistere, indtil compileren ser linie 27. 578 00:27:22,520 --> 00:27:25,450 Desværre compiler er gøre tingene top, ned, venstre, højre, 579 00:27:25,450 --> 00:27:29,580 , fordi det ikke har set den gennemførelse af GetPositiveInt, 580 00:27:29,580 --> 00:27:32,400 men det ser du forsøger at bruge det op her, 581 00:27:32,400 --> 00:27:35,810 det bare at gå til bail-- yell på dig med en fejl message-- måske 582 00:27:35,810 --> 00:27:38,440 kryptisk, og faktisk ikke kompilere filen. 583 00:27:38,440 --> 00:27:41,940 >> Så en såkaldt prototype op her er ganske vist overflødig. 584 00:27:41,940 --> 00:27:47,870 Bogstaveligt talt, gik jeg ned her, og jeg kopierede og indsat dette, og jeg sætte det op her. 585 00:27:47,870 --> 00:27:51,020 Void ville være mere korrekt, så vi vil bogstaveligt kopiere og indsætte det denne gang. 586 00:27:51,020 --> 00:27:52,854 Jeg bogstaveligt talt kopieret og indsat det. 587 00:27:52,854 --> 00:27:54,270 Virkelig ligesom ligesom en brød krumme. 588 00:27:54,270 --> 00:27:56,260 >> En lille fingerpeg om compiler. 589 00:27:56,260 --> 00:27:58,860 Jeg ved ikke, hvad dette betyder endnu, men jeg lover at du 590 00:27:58,860 --> 00:28:00,260 at det vil eksistere sidst. 591 00:28:00,260 --> 00:28:04,010 Og det er grunden til dette line-- i linje 16-- slutter med et semikolon. 592 00:28:04,010 --> 00:28:05,486 Det er afskediget af design. 593 00:28:05,486 --> 00:28:05,986 Ja? 594 00:28:05,986 --> 00:28:11,340 595 00:28:11,340 --> 00:28:14,360 >> Hvis du ikke linke din bibliotek til-- åh, godt spørgsmål. 596 00:28:14,360 --> 00:28:17,350 Sharp inkluderer header fil optagelser. 597 00:28:17,350 --> 00:28:20,040 Behov for at være-- burde næsten altid være helt i top 598 00:28:20,040 --> 00:28:23,270 af filen til en similar-- for nøjagtig den samme grund, ja. 599 00:28:23,270 --> 00:28:26,430 Fordi i standard io.h er bogstaveligt talt en linje 600 00:28:26,430 --> 00:28:30,560 som dette, men med ordet printf og med sine argumenter og dens tilbagevenden type. 601 00:28:30,560 --> 00:28:33,310 Og så ved at gøre skarp indeholde op her, hvad du er bogstaveligt talt at gøre 602 00:28:33,310 --> 00:28:36,380 er at kopiere og indsætte indholdet af en anden skrev op øverst. 603 00:28:36,380 --> 00:28:39,660 Derved cluing din kode i den omstændighed, at disse funktioner findes. 604 00:28:39,660 --> 00:28:40,160 Ja? 605 00:28:40,160 --> 00:28:47,520 606 00:28:47,520 --> 00:28:48,260 >> Absolut. 607 00:28:48,260 --> 00:28:51,690 Så en meget klog og korrekt løsning ville være, ved du hvad? 608 00:28:51,690 --> 00:28:53,760 Jeg ved ikke, hvad en prototype er, men jeg kender 609 00:28:53,760 --> 00:28:56,390 hvis jeg forstår, at C er bare stum og nytænker top til bund. 610 00:28:56,390 --> 00:28:57,820 Jamen lad os give det hvad det vil. 611 00:28:57,820 --> 00:29:01,650 Lad os skære den kode, indsæt det op top, og nu skubbe vigtigste dernede. 612 00:29:01,650 --> 00:29:03,470 Dette ville også løse problemet. 613 00:29:03,470 --> 00:29:07,409 >> Men du kan meget nemt komme op med et scenarie, hvor et behov for at ringe til B, 614 00:29:07,409 --> 00:29:10,075 og måske B kalder tilbage til A. Denne er noget, der hedder rekursion, 615 00:29:10,075 --> 00:29:11,370 og vi vil komme tilbage til. 616 00:29:11,370 --> 00:29:13,911 Og det kan eller ikke kan være en god ting, men du kan helt sikkert 617 00:29:13,911 --> 00:29:15,110 bryde denne løsning. 618 00:29:15,110 --> 00:29:17,690 >> Og i øvrigt ville jeg hævder stilmæssigt, 619 00:29:17,690 --> 00:29:20,760 især når dine programmer bliver denne lange og denne lange, 620 00:29:20,760 --> 00:29:23,064 det er bare super praktisk at sætte vigtigste øverst 621 00:29:23,064 --> 00:29:25,730 fordi det er de ting mest programmører kommer til at bekymre sig om. 622 00:29:25,730 --> 00:29:28,150 Og så det er en lidt renere, velsagtens, at gøre det på den måde 623 00:29:28,150 --> 00:29:30,380 Jeg oprindeligt gjorde det med en prototype selv 624 00:29:30,380 --> 00:29:33,396 selvom det ser lidt overflødig ved første øjekast. 625 00:29:33,396 --> 00:29:33,895 Ja? 626 00:29:33,895 --> 00:29:36,472 627 00:29:36,472 --> 00:29:37,680 Beklager, kan du sige det højere? 628 00:29:37,680 --> 00:29:45,650 629 00:29:45,650 --> 00:29:49,580 >> Hvis du skifter placeringen af ​​den gennemførelse og prototypen? 630 00:29:49,580 --> 00:29:51,270 Så det er et godt spørgsmål. 631 00:29:51,270 --> 00:29:53,780 Hvis du igen erklære dette ned her, lad os se hvad der sker. 632 00:29:53,780 --> 00:29:55,530 Så hvis jeg sætter det ned her, du siger. 633 00:29:55,530 --> 00:29:57,860 634 00:29:57,860 --> 00:29:58,360 Åh, undskyld. 635 00:29:58,360 --> 00:29:58,859 Louder? 636 00:29:58,859 --> 00:30:02,000 637 00:30:02,000 --> 00:30:04,011 Endnu højere. 638 00:30:04,011 --> 00:30:04,760 Åh, godt spørgsmål. 639 00:30:04,760 --> 00:30:05,860 Ville det ugyldiggøre funktion? 640 00:30:05,860 --> 00:30:08,901 Du ved, efter alle disse år, jeg har aldrig sat en prototype bagefter. 641 00:30:08,901 --> 00:30:13,810 Så lad os gøre gøre funktion-1 efter at gøre det. 642 00:30:13,810 --> 00:30:15,279 >> [Mumler] 643 00:30:15,279 --> 00:30:16,320 David J. MALAN: Åh, vent. 644 00:30:16,320 --> 00:30:17,944 Vi har stadig nødt til at sætte alt op toppen. 645 00:30:17,944 --> 00:30:21,400 Så lad os gøre det op her, hvis jeg forstå dit spørgsmål korrekt. 646 00:30:21,400 --> 00:30:24,700 Jeg sætter alt, herunder prototypen ovenfor vigtigste, 647 00:30:24,700 --> 00:30:28,180 men jeg lægger prototypen under implementeringen. 648 00:30:28,180 --> 00:30:33,190 >> Så hvis jeg laver en, jeg får tilbage en error-- ubrugte variabel n. 649 00:30:33,190 --> 00:30:37,280 650 00:30:37,280 --> 00:30:37,860 Åh, der. 651 00:30:37,860 --> 00:30:38,360 Tak. 652 00:30:38,360 --> 00:30:39,430 Lad os se, får vi slippe af med dette. 653 00:30:39,430 --> 00:30:41,304 Det er en anden fejl, så lad os se bort fra dette. 654 00:30:41,304 --> 00:30:43,910 Lad os virkelig hurtigt omdannede dette. 655 00:30:43,910 --> 00:30:48,100 >> OK, så data ikke argument bruges af format String 656 00:30:48,100 --> 00:30:52,310 N-- Åh, det er fordi Jeg skiftede til disse her. 657 00:30:52,310 --> 00:30:55,885 Okay, vi ved, hvad svaret går til-- okay, her vi gå. 658 00:30:55,885 --> 00:31:00,560 Ah, tak for det positive. 659 00:31:00,560 --> 00:31:03,430 Okay, vil jeg rette denne kode after-- ignorere denne fejl 660 00:31:03,430 --> 00:31:08,300 da dette var-- det virker, er svaret. 661 00:31:08,300 --> 00:31:11,560 >> Så det ikke overskrive hvad du lige har gjort. 662 00:31:11,560 --> 00:31:14,800 Jeg formoder compileren er skrevet på en sådan måde 663 00:31:14,800 --> 00:31:18,420 at det ignorerer din prototype fordi kroppen, så at sige, 664 00:31:18,420 --> 00:31:20,922 af funktionen allerede blevet gennemført højere oppe. 665 00:31:20,922 --> 00:31:23,380 Jeg ville være nødt til rent faktisk konsultere vejledningen til compiler 666 00:31:23,380 --> 00:31:26,171 at forstå, hvis der er nogen andre implicit, men ved første øjekast 667 00:31:26,171 --> 00:31:29,290 bare ved at prøve og eksperimentere, der synes at være nogen effekt. 668 00:31:29,290 --> 00:31:30,730 Godt spørgsmål. 669 00:31:30,730 --> 00:31:33,660 >> Så lad os gå videre nu, bevæger sig væk fra bivirkninger, som 670 00:31:33,660 --> 00:31:36,660 er funktioner, der gør noget lignende visuelt på skærmen med printf, 671 00:31:36,660 --> 00:31:38,090 men returnerer ikke en værdi. 672 00:31:38,090 --> 00:31:41,550 Og funktioner, der har til gengæld værdier som vi lige har set et par af. 673 00:31:41,550 --> 00:31:45,350 Vi har allerede set denne begrebet rækkevidde, og vi vil se det igen og igen. 674 00:31:45,350 --> 00:31:47,210 Men for nu, igen, bruge tommelfingerregel 675 00:31:47,210 --> 00:31:51,410 at der kun kan bruges en variabel indersiden af ​​den senest åbnede 676 00:31:51,410 --> 00:31:54,350 og lukkede krøllede parenteser, som vi så i det pågældende eksempel. 677 00:31:54,350 --> 00:31:56,910 >> Og som du har påpeget, der er en ability-- 678 00:31:56,910 --> 00:32:00,040 du kunne løse nogle af disse problemer ved at sætte en variabel globalt 679 00:32:00,040 --> 00:32:01,290 på toppen af ​​en fil. 680 00:32:01,290 --> 00:32:03,630 Men i næsten alle tilfælde vi ville rynke panden på det, 681 00:32:03,630 --> 00:32:06,170 og faktisk ikke engang gå ind i denne løsning for nu. 682 00:32:06,170 --> 00:32:09,890 Så for nu, takeaway er, at variabler har denne opfattelse af anvendelsesområdet. 683 00:32:09,890 --> 00:32:13,430 >> Men lad os nu se på en anden tør måde faktisk ser 684 00:32:13,430 --> 00:32:15,810 på nogle temmelig interessant gennemførelse detaljer. 685 00:32:15,810 --> 00:32:17,810 Hvordan vi kan repræsentere oplysninger. 686 00:32:17,810 --> 00:32:20,370 Og vi allerede set på dette i den første uge af klassen. 687 00:32:20,370 --> 00:32:23,320 Ser man på binære filer, og minde os selv om decimal. 688 00:32:23,320 --> 00:32:28,310 >> Men husker fra sidste uge, at C har forskellige datatyper og klaser mere, 689 00:32:28,310 --> 00:32:30,600 men den mest nyttige dem for nu kunne være disse. 690 00:32:30,600 --> 00:32:36,030 En char, eller karakter, hvilket sker at være en byte, eller otte bit alt. 691 00:32:36,030 --> 00:32:40,060 Og det er at sige, at størrelsen af en char er blot én byte. 692 00:32:40,060 --> 00:32:45,370 En byte er otte bits, så det betyder, at vi kan repræsentere hvor mange tegn. 693 00:32:45,370 --> 00:32:47,320 Hvor mange bogstaver eller symboler på tastaturet 694 00:32:47,320 --> 00:32:49,210 hvis vi har en byte eller otte bits. 695 00:32:49,210 --> 00:32:51,546 Tænk tilbage til uge nul. 696 00:32:51,546 --> 00:32:53,420 Hvis du har otte bits, hvor mange samlede værdier 697 00:32:53,420 --> 00:32:55,503 kan du repræsenterer med mønstre af nuller og ettaller? 698 00:32:55,503 --> 00:32:58,170 699 00:32:58,170 --> 00:33:00,260 En-- mere end det. 700 00:33:00,260 --> 00:33:03,490 Så i alt 256, hvis du begynde at tælle fra nul. 701 00:33:03,490 --> 00:33:07,120 Så hvis du har otte bits-- så hvis vi havde vores binære løg op her igen, 702 00:33:07,120 --> 00:33:12,180 vi kunne slukke for disse pærer på og fra i en af ​​256 unikke mønstre. 703 00:33:12,180 --> 00:33:13,640 >> Nu er det en smule problematisk. 704 00:33:13,640 --> 00:33:16,857 Ikke så meget for engelsk og romanske sprog, men bestemt 705 00:33:16,857 --> 00:33:19,190 når man indfører for Eksempelvis asiatiske sprog, som 706 00:33:19,190 --> 00:33:22,580 har langt flere symboler end lignende 26 bogstaver i alfabetet. 707 00:33:22,580 --> 00:33:24,390 Vi faktisk kan have behov for mere end en byte. 708 00:33:24,390 --> 00:33:28,240 Og heldigvis i de senere år har samfundet 709 00:33:28,240 --> 00:33:31,040 vedtagne andre standarder, som bruger mere end én byte per opladning. 710 00:33:31,040 --> 00:33:34,210 >> Men for nu i C, standard er blot én byte eller otte bits. 711 00:33:34,210 --> 00:33:38,195 Et heltal, i mellemtiden, er fire byte, også kendt som 32 bit. 712 00:33:38,195 --> 00:33:41,320 Hvilket betyder, hvad der er den størst mulige nummer vi kan repræsentere med en int 713 00:33:41,320 --> 00:33:41,820 tilsyneladende? 714 00:33:41,820 --> 00:33:44,426 715 00:33:44,426 --> 00:33:45,050 Med en milliard. 716 00:33:45,050 --> 00:33:46,760 Så det er fire milliarder give eller tage. 717 00:33:46,760 --> 00:33:49,840 2 til 32th magt, hvis vi antage nogen negative tal 718 00:33:49,840 --> 00:33:52,530 og bare bruge alle positive tal, det er fire milliarder 719 00:33:52,530 --> 00:33:53,730 give eller tage muligheder. 720 00:33:53,730 --> 00:33:57,890 En svømmer, i mellemtiden, er en anden type af datatype i C. Det er stadig et tal, 721 00:33:57,890 --> 00:33:58,990 men det er et reelt tal. 722 00:33:58,990 --> 00:34:00,660 Noget med et komma. 723 00:34:00,660 --> 00:34:03,000 Og det viser sig, at C bruger også fire bytes 724 00:34:03,000 --> 00:34:05,340 at repræsentere kommeværdier. 725 00:34:05,340 --> 00:34:09,420 >> Desværre hvor mange flydende point værdier er der i verden? 726 00:34:09,420 --> 00:34:11,582 Hvor mange reelle tal er der? 727 00:34:11,582 --> 00:34:13,540 Der er en uendelig nummer, og for den sags skyld 728 00:34:13,540 --> 00:34:15,164 Der er et uendeligt antal heltal. 729 00:34:15,164 --> 00:34:18,070 Så vi er allerede slags grave os et hul her. 730 00:34:18,070 --> 00:34:21,780 Hvorved tilsyneladende computers-- på mindst programmer skrevet i C på dem-- 731 00:34:21,780 --> 00:34:24,110 kan kun tælle som højt som fire milliarder give eller tage, 732 00:34:24,110 --> 00:34:26,260 og kommeværdier kan kun tilsyneladende 733 00:34:26,260 --> 00:34:28,330 har nogle begrænset mængde præcision. 734 00:34:28,330 --> 00:34:30,810 Kun så mange cifre efter deres kommaet. 735 00:34:30,810 --> 00:34:32,822 >> Fordi, selvfølgelig, hvis du kun har 32 bits, 736 00:34:32,822 --> 00:34:36,030 Jeg ved ikke, hvordan vi kommer til at gå om repræsenterer reelle numbers-- sandsynligvis 737 00:34:36,030 --> 00:34:37,409 med forskellige typer af mønstre. 738 00:34:37,409 --> 00:34:40,030 Men der er helt sikkert et endeligt Antallet af sådanne mønstre, 739 00:34:40,030 --> 00:34:41,830 så også her, det er problematisk. 740 00:34:41,830 --> 00:34:43,710 >> Nu kan vi undgå lidt problemet. 741 00:34:43,710 --> 00:34:45,710 Hvis du ikke bruger en float, du kunne bruge en dobbelt 742 00:34:45,710 --> 00:34:50,230 i C, som giver dig otte bytes, hvilket er måde flere mulige mønstre af nuller 743 00:34:50,230 --> 00:34:50,730 og dem. 744 00:34:50,730 --> 00:34:55,199 Men det er stadig begrænset, som vil at være problematisk, hvis du skriver software 745 00:34:55,199 --> 00:34:57,670 til grafik eller fancy matematiske formler. 746 00:34:57,670 --> 00:35:00,410 Så du kan faktisk ønsker at tælle op større end. 747 00:35:00,410 --> 00:35:05,640 En lang long-- dumt named-- er også otte byte, eller 64 bit, 748 00:35:05,640 --> 00:35:10,260 og det er dobbelt så lang som en int, og det er for en lang heltal værdi. 749 00:35:10,260 --> 00:35:15,655 >> Sjov fact-- hvis en int er fire bytes, hvor lang tid er en lang i C typisk? 750 00:35:15,655 --> 00:35:18,290 751 00:35:18,290 --> 00:35:21,560 Også fire bytes, men en lang lang er otte bytes, 752 00:35:21,560 --> 00:35:23,050 og det er af historiske årsager. 753 00:35:23,050 --> 00:35:26,450 >> Men takeaway nu er bare, at data har 754 00:35:26,450 --> 00:35:29,625 at være repræsenteret i et computer-- der er en fysisk enhed med elektricitet, 755 00:35:29,625 --> 00:35:32,190 Det er generelt kører disse nuller og ones-- 756 00:35:32,190 --> 00:35:34,320 med begrænsede mængder af præcision. 757 00:35:34,320 --> 00:35:35,620 Så hvad er problemet så? 758 00:35:35,620 --> 00:35:37,480 >> Nå der er et problem af heltalsoverløb. 759 00:35:37,480 --> 00:35:39,780 Ikke bare i C, men i computere i almindelighed. 760 00:35:39,780 --> 00:35:42,590 For eksempel, hvis dette er en byte værd en bit-- 761 00:35:42,590 --> 00:35:45,120 så hvis dette er otte bit-- alle der er nummer et. 762 00:35:45,120 --> 00:35:47,300 Hvilket nummer er det repræsenterer hvis vi antager 763 00:35:47,300 --> 00:35:50,730 det er alle positive værdier i binær? 764 00:35:50,730 --> 00:35:54,410 >> 255, og det er ikke 256, fordi nul er det laveste antal. 765 00:35:54,410 --> 00:35:56,760 Så 255 er den højeste én, men problemet 766 00:35:56,760 --> 00:36:00,330 er Antag at jeg ønskede at tilvækst denne variabel, 767 00:36:00,330 --> 00:36:04,030 anvender otte bit i alt hvis jeg ønsker at forøge det. 768 00:36:04,030 --> 00:36:07,160 >> Nå, så snart jeg tilføjer en én til alle disse dem, 769 00:36:07,160 --> 00:36:10,500 kan du måske forestille visually-- bare som at bære den ene med decimals-- 770 00:36:10,500 --> 00:36:12,300 noget kommer til at flyde til venstre. 771 00:36:12,300 --> 00:36:15,590 Og ja, hvis jeg føje nummeret om en til, hvad der sker i binær 772 00:36:15,590 --> 00:36:17,670 er, at det flyder tilbage til nul. 773 00:36:17,670 --> 00:36:21,730 >> Så hvis du kun use-- ikke en int, men en enkelt byte til at tælle heltal 774 00:36:21,730 --> 00:36:27,170 i et program, ved default-- så snart du kommer til 250, 251, 252, 253, 254, 775 00:36:27,170 --> 00:36:32,710 255-- 0 kommer efter 255 der er sandsynligvis, hvad ikke 776 00:36:32,710 --> 00:36:34,790 en bruger kommer til at forvente. 777 00:36:34,790 --> 00:36:39,620 >> Nu i mellemtiden i floating point verden, du også har et lignende problem. 778 00:36:39,620 --> 00:36:42,670 Ikke så meget med den største number-- selvom det er stadig et problem. 779 00:36:42,670 --> 00:36:45,360 Men med mængden af ​​præcision at du kan repræsentere. 780 00:36:45,360 --> 00:36:49,490 Så lad os tage et kig på dette eksempel her også fra dagens kilde code-- 781 00:36:49,490 --> 00:36:52,070 float-0.c. 782 00:36:52,070 --> 00:36:54,280 >> Og bemærk, det er en super simpelt program, der 783 00:36:54,280 --> 00:36:56,580 bør tilsyneladende udskrive hvilken værdi? 784 00:36:56,580 --> 00:37:00,777 785 00:37:00,777 --> 00:37:04,110 Hvad vil du satse dette vil udskrive selvom der er lidt af ny syntaks 786 00:37:04,110 --> 00:37:05,540 her? 787 00:37:05,540 --> 00:37:06,700 Så forhåbentlig 0.1. 788 00:37:06,700 --> 00:37:10,000 Så svarer til en tiendedel fordi jeg gør 1 divideret med 10. 789 00:37:10,000 --> 00:37:12,430 Jeg lagre svaret i en variabel kaldet f. 790 00:37:12,430 --> 00:37:15,850 Denne variabel er af typen float, som er et nøgleord, jeg netop har foreslået eksisterede. 791 00:37:15,850 --> 00:37:18,910 >> Vi har ikke set det før, men Dette er sådan en pæn måde i printf 792 00:37:18,910 --> 00:37:22,110 at angive, hvor mange cifre, du ønsker at se efter et komma. 793 00:37:22,110 --> 00:37:25,020 Så denne notation betyder bare det her er en pladsholder. 794 00:37:25,020 --> 00:37:27,900 Det er til et decimaltal værdi, og åh, ved den måde, 795 00:37:27,900 --> 00:37:31,389 vise det med kommaet med et tal efter kommaet. 796 00:37:31,389 --> 00:37:33,180 Så det er det antal betydende cifre, 797 00:37:33,180 --> 00:37:34,650 så at sige, som du måske ønsker. 798 00:37:34,650 --> 00:37:40,450 >> Så lad mig gå videre og gøre gøre float-0, ./float-0, 799 00:37:40,450 --> 00:37:46,660 og tilsyneladende 1 divideret med 10 er 0,0. 800 00:37:46,660 --> 00:37:47,760 Nu, hvorfor er dette? 801 00:37:47,760 --> 00:37:51,380 >> Nå igen, er computeren tager mig bogstaveligt, og jeg har skrevet 1 802 00:37:51,380 --> 00:37:56,680 og jeg skrevet 10, og tage et gæt hvad er det antaget datatype for de to 803 00:37:56,680 --> 00:37:58,440 værdier? 804 00:37:58,440 --> 00:38:00,970 En int, det er teknisk noget lidt anderledes. 805 00:38:00,970 --> 00:38:04,150 Det er typisk en lang, men det er i sidste ende en integreret værdi. 806 00:38:04,150 --> 00:38:06,030 Ikke en floating point værdi. 807 00:38:06,030 --> 00:38:09,456 >> Hvilket vil sige, at hvis dette er en int, og dette er en int, 808 00:38:09,456 --> 00:38:11,830 Problemet er, at computeren ikke har mulighed for 809 00:38:11,830 --> 00:38:13,680 til endda gemme det kommaet. 810 00:38:13,680 --> 00:38:16,430 Så når du gør 1 divideret ved 10 hjælp af heltal 811 00:38:16,430 --> 00:38:20,950 for både tæller og nævner, bør svaret være 0.1. 812 00:38:20,950 --> 00:38:24,930 Men computer-- fordi de er integers-- 813 00:38:24,930 --> 00:38:27,430 ikke ved, hvad de skal gøre med den 0.1. 814 00:38:27,430 --> 00:38:30,010 >> Så hvad er det tydeligt gør? 815 00:38:30,010 --> 00:38:33,120 Det er bare at smide det væk, og hvad jeg ser i sidste ende 816 00:38:33,120 --> 00:38:38,830 er 0,0 kun fordi jeg insisterede på, at printf vise mig én decimal. 817 00:38:38,830 --> 00:38:41,740 Men problemet er, at hvis du opdele et heltal med et tal, 818 00:38:41,740 --> 00:38:44,347 du vil get-- definition af C-- et heltal. 819 00:38:44,347 --> 00:38:46,680 Og det kommer ikke til at gøre noget rart og bekvemt 820 00:38:46,680 --> 00:38:49,040 ligesom runde det op til nærmeste op eller ned. 821 00:38:49,040 --> 00:38:51,860 Det kommer til at afkorte alt efter kommaet. 822 00:38:51,860 --> 00:38:54,030 >> Så bare intuitivt, hvad er sandsynligvis et fix? 823 00:38:54,030 --> 00:38:55,351 Hvad er den enkleste løsning her? 824 00:38:55,351 --> 00:38:55,850 Ja? 825 00:38:55,850 --> 00:39:00,570 826 00:39:00,570 --> 00:39:01,100 Præcis. 827 00:39:01,100 --> 00:39:04,200 Hvorfor vi ikke bare behandle disse som kommeværdier effektivt 828 00:39:04,200 --> 00:39:05,860 gøre dem til flåd eller double. 829 00:39:05,860 --> 00:39:10,500 Og nu, hvis jeg gør flåd-0, eller hvis jeg kompilere flåd-1, 830 00:39:10,500 --> 00:39:12,570 som er identisk med hvad var lige foreslået. 831 00:39:12,570 --> 00:39:16,400 Og nu gør jeg flåd-0, nu får jeg min 0.1. 832 00:39:16,400 --> 00:39:17,234 >> Nu er dette er fantastisk. 833 00:39:17,234 --> 00:39:19,441 Men nu har jeg tænkt mig at gøre noget lidt anderledes. 834 00:39:19,441 --> 00:39:22,280 Jeg er nysgerrig efter at se, hvad der er virkelig foregår under kølerhjelmen, 835 00:39:22,280 --> 00:39:26,050 og jeg har tænkt mig at udskrive denne ud til 28 decimaler. 836 00:39:26,050 --> 00:39:29,730 Jeg vil virkelig se 0.1000-- en infinite-- 837 00:39:29,730 --> 00:39:32,710 [Uhørligt] 27 nuller efter at 0.1. 838 00:39:32,710 --> 00:39:34,740 >> Jamen så lad os se, om det er hvad jeg faktisk får. 839 00:39:34,740 --> 00:39:39,430 Gør flåd-0 samme fil. 840 00:39:39,430 --> 00:39:41,150 ./floats-0. 841 00:39:41,150 --> 00:39:44,380 Lad os zoome ind på den dramatiske svar. 842 00:39:44,380 --> 00:39:49,980 I al den tid, du har været tænker 1 divideret med 10 er 10%, eller 0,1. 843 00:39:49,980 --> 00:39:50,810 Det er det ikke. 844 00:39:50,810 --> 00:39:53,210 Mindst så vidt computers berørt. 845 00:39:53,210 --> 00:39:57,060 >> Nu why-- OK, det er komplet ligger 1 divideret med 10 er 0,1. 846 00:39:57,060 --> 00:39:59,710 Men why--, der ikke er takeaway i dag. 847 00:39:59,710 --> 00:40:04,010 Så hvorfor computeren tænker, i modsætning til alle os i rummet, 848 00:40:04,010 --> 00:40:06,870 at 1 divideret med 10 er faktisk, at skøre værdi? 849 00:40:06,870 --> 00:40:10,620 Hvad er den computer, gør tilsyneladende? 850 00:40:10,620 --> 00:40:12,490 Hvad er det? 851 00:40:12,490 --> 00:40:13,785 >> Det er ikke overløb, per se. 852 00:40:13,785 --> 00:40:15,910 Overflow er typisk når du wrap omkring en værdi. 853 00:40:15,910 --> 00:40:18,970 Det er dette nummer af unøjagtighed i en kommatalsværdi 854 00:40:18,970 --> 00:40:22,220 hvor du kun har 32 eller måske endda 64 bit. 855 00:40:22,220 --> 00:40:25,230 Men hvis der er en uendelig Antallet af fast numbers-- 856 00:40:25,230 --> 00:40:27,940 numre med decimaler og numre thereafter-- sikkert 857 00:40:27,940 --> 00:40:29,380 du kan ikke repræsentere dem alle. 858 00:40:29,380 --> 00:40:32,870 Så computeren har givet os den tætteste match 859 00:40:32,870 --> 00:40:37,090 til den værdi, det kan repræsentere ved hjælp af denne mange bit til den værdi, jeg rent faktisk ønsker, 860 00:40:37,090 --> 00:40:38,690 hvilket er 0,1. 861 00:40:38,690 --> 00:40:40,685 >> Desværre, hvis du begynde at gøre matematik, eller du 862 00:40:40,685 --> 00:40:44,360 begynde at inddrage disse former for flydende point værdier i vigtige programs-- 863 00:40:44,360 --> 00:40:46,770 finansiel software, militær software-- noget 864 00:40:46,770 --> 00:40:49,090 hvor opfattelsen er sandsynligvis temmelig vigtigt. 865 00:40:49,090 --> 00:40:51,520 Og du begynder at tilføje numre som dette, og start 866 00:40:51,520 --> 00:40:54,050 kører denne software med virkelig store indgange 867 00:40:54,050 --> 00:40:56,890 eller for masser af timer eller partier dage eller masser af år, 868 00:40:56,890 --> 00:41:01,060 disse bittesmå fejl sikkert kan tilføje op over tid. 869 00:41:01,060 --> 00:41:04,252 >> Nu som en sidebemærkning, hvis du nogensinde har set Superman 3 eller Office Space 870 00:41:04,252 --> 00:41:05,960 og du måske husker hvordan de fyre stjal 871 00:41:05,960 --> 00:41:08,668 en masse penge fra deres computer ved hjælp kommeværdier 872 00:41:08,668 --> 00:41:11,290 og tilføje op den lille rester, forhåbentlig, film 873 00:41:11,290 --> 00:41:12,390 nu giver mere mening. 874 00:41:12,390 --> 00:41:14,930 Dette er, hvad de var hentyder til i den film. 875 00:41:14,930 --> 00:41:16,710 Det faktum, at de fleste selskaber ville ikke se 876 00:41:16,710 --> 00:41:18,600 efter et vist antal af decimaler, 877 00:41:18,600 --> 00:41:20,009 men de er brøkdele af cent. 878 00:41:20,009 --> 00:41:22,550 Så du begynder at tilføje dem op, du begynder at gøre en masse penge 879 00:41:22,550 --> 00:41:23,424 på din bankkonto. 880 00:41:23,424 --> 00:41:25,160 Så det er Office Space forklaret. 881 00:41:25,160 --> 00:41:28,220 >> Nu desværre ud over Office Space, der 882 00:41:28,220 --> 00:41:31,794 er nogle legitimt bekymrende og væsentlige påvirkninger 883 00:41:31,794 --> 00:41:33,710 af disse former for underliggende design beslutninger, 884 00:41:33,710 --> 00:41:35,990 og faktisk en af ​​grundene vi bruger C i løbet 885 00:41:35,990 --> 00:41:39,640 er så at du virkelig har denne jord up forståelse af, hvordan computere arbejde, 886 00:41:39,640 --> 00:41:42,440 hvordan software fungerer, og ikke tage noget for givet. 887 00:41:42,440 --> 00:41:45,820 >> Og faktisk desværre selv med denne grundlæggende forståelse, 888 00:41:45,820 --> 00:41:47,370 vi mennesker begår fejl. 889 00:41:47,370 --> 00:41:51,310 Og hvad jeg tænkte jeg ville dele er dette otte minutter video her taget 890 00:41:51,310 --> 00:41:56,980 fra en Modern Marvels episode, som er en pædagogisk udstilling om, hvordan tingene fungerer 891 00:41:56,980 --> 00:42:00,370 der maler to billeder af, hvornår en uretmæssig brug 892 00:42:00,370 --> 00:42:02,540 og forståelse af kommeværdier 893 00:42:02,540 --> 00:42:05,610 ført til en vis betydelig uheldige resultater. 894 00:42:05,610 --> 00:42:06,363 Lad os tage et kig. 895 00:42:06,363 --> 00:42:07,029 [VIDEOAFSPILNING] 896 00:42:07,029 --> 00:42:11,290 -Vi Nu vende tilbage til "Engineering Katastrofer "på Modern Marvels. 897 00:42:11,290 --> 00:42:12,940 Computere. 898 00:42:12,940 --> 00:42:15,580 Vi har alle kommet til at acceptere den ofte frustrerende problemer, 899 00:42:15,580 --> 00:42:20,960 fik med dem-- bugs, vira, og software glitches-- til små priser 900 00:42:20,960 --> 00:42:23,100 til at betale for bekvemmelighed. 901 00:42:23,100 --> 00:42:27,770 Men i high tech og høj hastighed militære og rum programansøgninger, 902 00:42:27,770 --> 00:42:32,780 den mindste problem kan forstørres og blive til en katastrofe. 903 00:42:32,780 --> 00:42:38,880 >> Den 4. juni 1996 videnskabsfolk forberedt at lancere en ubemandet Ariane 5 raket. 904 00:42:38,880 --> 00:42:41,190 Det var i færd med videnskabelig satellitter designet 905 00:42:41,190 --> 00:42:44,570 præcis, hvordan det at etablere Jordens magnetfelt interagerer 906 00:42:44,570 --> 00:42:47,380 med solvind. 907 00:42:47,380 --> 00:42:50,580 Raketten blev bygget til Den Europæiske Rumorganisation, 908 00:42:50,580 --> 00:42:54,400 og løftes fra sit anlæg på kysten af ​​Fransk Guyana. 909 00:42:54,400 --> 00:42:57,520 >> -På Omkring 37 sekunder inde flyvningen, de først 910 00:42:57,520 --> 00:42:59,070 bemærket noget var galt. 911 00:42:59,070 --> 00:43:02,240 At dyserne var drejelig på en måde, de burde virkelig ikke. 912 00:43:02,240 --> 00:43:06,550 Omkring 40 sekunder inde i flyvningen, tydeligt køretøjet var i problemer, 913 00:43:06,550 --> 00:43:08,820 og det er, når de gjorde beslutningen om at ødelægge det. 914 00:43:08,820 --> 00:43:12,370 Sortimentet sikkerhed officer, med enorme indvolde, trykkede på knappen 915 00:43:12,370 --> 00:43:18,030 og sprængte raket, før det kunne blive en fare for den offentlige sikkerhed. 916 00:43:18,030 --> 00:43:21,010 >> -dette Var jomfru sejlads af Ariane 5, 917 00:43:21,010 --> 00:43:23,920 og dens ødelæggelse tog placere på grund af fejl 918 00:43:23,920 --> 00:43:25,932 indlejret i raket software. 919 00:43:25,932 --> 00:43:27,640 -Problemet På Ariane var, at der 920 00:43:27,640 --> 00:43:30,500 var et nummer, der kræves 64 bit til at udtrykke, 921 00:43:30,500 --> 00:43:33,560 og de ønskede at konvertere det til et 16-bit tal. 922 00:43:33,560 --> 00:43:36,820 De antog, at antallet var aldrig vil være meget store. 923 00:43:36,820 --> 00:43:40,940 Det fleste af disse cifre i 64-bit tal var nuller. 924 00:43:40,940 --> 00:43:42,450 De var forkert. 925 00:43:42,450 --> 00:43:45,000 >> -Den Manglende evne af en softwareprogram til at acceptere 926 00:43:45,000 --> 00:43:49,460 den slags tal, der genereres ved en anden var ved roden af ​​den fiasko. 927 00:43:49,460 --> 00:43:54,260 Softwareudvikling var blevet en meget kostbare del af ny teknologi. 928 00:43:54,260 --> 00:43:57,060 Ariane 4 raket havde været meget vellykket. 929 00:43:57,060 --> 00:44:01,600 Så meget af den software skabt til det blev også anvendt i Ariane 5. 930 00:44:01,600 --> 00:44:04,790 >> -Den Grundlæggende problem var, at Ariane 5. 931 00:44:04,790 --> 00:44:11,200 Var faster-- accelereret hurtigere, og softwaren ikke havde tegnede sig for det. 932 00:44:11,200 --> 00:44:14,910 >> -Den Ødelæggelse af raketten var en enorm økonomisk katastrofe. 933 00:44:14,910 --> 00:44:18,630 Alle på grund af et minut softwarefejl. 934 00:44:18,630 --> 00:44:21,160 Men det var ikke den første time data konvertering problemer 935 00:44:21,160 --> 00:44:24,770 havde plaget moderne raket teknologi. 936 00:44:24,770 --> 00:44:28,020 >> -I 1991 med starten af den første Golfkrig, 937 00:44:28,020 --> 00:44:30,540 Patriot missil oplevet en lignende art 938 00:44:30,540 --> 00:44:32,465 af et antal konvertering problem. 939 00:44:32,465 --> 00:44:36,760 Og som et resultat 28 people-- 28 Amerikanske soldiers-- blev dræbt, 940 00:44:36,760 --> 00:44:39,010 og omkring hundrede andre såret. 941 00:44:39,010 --> 00:44:42,830 Når Patriot, som skulle at beskytte mod indkommende Scuds, 942 00:44:42,830 --> 00:44:45,780 undladt at affyre et missil. 943 00:44:45,780 --> 00:44:51,610 >> -Når Irak invaderede Kuwait, og Amerika lanceret Desert Storm i begyndelsen af ​​1991, 944 00:44:51,610 --> 00:44:55,720 Patriot missil batterier blev indsat at beskytte Saudi-Arabien og Israel 945 00:44:55,720 --> 00:44:59,180 fra irakiske Scud missilangreb. 946 00:44:59,180 --> 00:45:03,080 The Patriot er en amerikansk mellemdistance overflade-til-luft-system 947 00:45:03,080 --> 00:45:06,530 fremstilles af Raytheon selskab. 948 00:45:06,530 --> 00:45:09,500 >> -Den Størrelsen af ​​Patriot interceptor itself-- 949 00:45:09,500 --> 00:45:14,705 det er omkring cirka 20 meter lang, og det vejer omkring 2.000 pounds. 950 00:45:14,705 --> 00:45:19,090 Og det bærer et sprænghoved på omkring, Jeg tror, ​​det er omkring 150 pounds. 951 00:45:19,090 --> 00:45:23,880 Og sprænghoved selv er en højeksplosiv, som 952 00:45:23,880 --> 00:45:26,700 har fragmenter omkring ham. 953 00:45:26,700 --> 00:45:31,630 Så kabinet sprænghoved er designet til at fungere som en hagl. 954 00:45:31,630 --> 00:45:34,040 >> -De Missiler udføres fire pr container, 955 00:45:34,040 --> 00:45:37,170 og transporteres af en sættevogn. 956 00:45:37,170 --> 00:45:44,880 >> -The Patriot anti-missil-system går tilbage mindst 20 år nu. 957 00:45:44,880 --> 00:45:48,380 Det blev oprindeligt designet som et luftforsvar missil 958 00:45:48,380 --> 00:45:50,810 at nedskyde fjendtlige fly. 959 00:45:50,810 --> 00:45:54,410 I den første Golfkrig da krigen kom, 960 00:45:54,410 --> 00:45:59,650 hæren ønskede at bruge det til nedskyde Scuds, ikke fly. 961 00:45:59,650 --> 00:46:03,580 Den irakiske luftvåben var ikke så meget af et problem, 962 00:46:03,580 --> 00:46:06,590 men hæren var bekymret Scuds. 963 00:46:06,590 --> 00:46:10,120 Og så de forsøgte at opgradere Patriot. 964 00:46:10,120 --> 00:46:12,740 >> -Intercepting En fjende missil rejser på Mach 5 965 00:46:12,740 --> 00:46:15,670 skulle være udfordrende nok. 966 00:46:15,670 --> 00:46:18,440 Men når Patriot blev hastet i brug, 967 00:46:18,440 --> 00:46:22,580 Hæren var ikke bekendt med en irakisk ændring, 968 00:46:22,580 --> 00:46:25,880 gjorde deres scuds næsten umuligt at det. 969 00:46:25,880 --> 00:46:30,690 >> Hvad er der sket er det Scuds at kom ind var ustabil. 970 00:46:30,690 --> 00:46:32,000 De var vaklende. 971 00:46:32,000 --> 00:46:37,210 Årsagen til dette var den Iraqis-- For at få 600 km ud 972 00:46:37,210 --> 00:46:41,680 af en 300 kilometer rækkevidde missile-- tog vægt ud af den forreste sprænghoved, 973 00:46:41,680 --> 00:46:43,340 og gjorde sprænghoved lysere. 974 00:46:43,340 --> 00:46:48,490 Så nu Patriot forsøger at komme på Scud, og det meste af time-- 975 00:46:48,490 --> 00:46:52,880 det overvældende flertal af den time-- det ville bare flyve af Scud. 976 00:46:52,880 --> 00:46:57,120 >> -Når Patriot systemoperatører indså Patriot savnede sit mål, 977 00:46:57,120 --> 00:47:01,630 de detonerede Patriot sprænghoved at undgå mulige tab, hvis det 978 00:47:01,630 --> 00:47:04,440 fik lov til at falde til jorden. 979 00:47:04,440 --> 00:47:08,700 >> -Det Var hvad de fleste folk så som store ildkugler på himlen, 980 00:47:08,700 --> 00:47:14,180 og misforstået som aflytninger af Scud sprænghoveder. 981 00:47:14,180 --> 00:47:18,020 >> -Selv I nattehimlen, Patriots syntes at være vellykket ødelægge 982 00:47:18,020 --> 00:47:23,280 Scuds på Dhahran der kunne være ikke fejl af dens ydeevne. 983 00:47:23,280 --> 00:47:27,930 Der Patriot radar-system mistet overblikket over et indkommende Scud 984 00:47:27,930 --> 00:47:30,260 og aldrig iværksat på grund til en software fejl. 985 00:47:30,260 --> 00:47:34,060 986 00:47:34,060 --> 00:47:38,880 >> Det var israelere, der først opdagede at jo længere systemet var på, 987 00:47:38,880 --> 00:47:41,130 jo større tidsforskel blev. 988 00:47:41,130 --> 00:47:44,770 På grund af et ur indlejret i systemets computer. 989 00:47:44,770 --> 00:47:48,190 >> -Omkring To uger før tragedien i Dhahran, 990 00:47:48,190 --> 00:47:50,720 israelerne rapporteret til forsvarsministeriet 991 00:47:50,720 --> 00:47:52,410 at systemet var ved at miste tid. 992 00:47:52,410 --> 00:47:54,410 Efter ca. otte timer af løb, bemærkede de 993 00:47:54,410 --> 00:47:57,690 at systemets blive mærkbart mindre nøjagtige. 994 00:47:57,690 --> 00:48:01,850 Forsvarsministeriet reagerede ved fortæller alle Patriot batterier 995 00:48:01,850 --> 00:48:04,800 ikke forlade systemerne i lang tid. 996 00:48:04,800 --> 00:48:06,980 De har aldrig sagt, hvad en lang tid var. 997 00:48:06,980 --> 00:48:09,140 8 timer 10 timer, tusind timer. 998 00:48:09,140 --> 00:48:11,300 Ingen vidste. 999 00:48:11,300 --> 00:48:13,320 >> -The Patriot batteri stationeret på kasernen 1000 00:48:13,320 --> 00:48:18,310 på Dhahran og dets mangelfulde interne ur havde været i over 100 timers 1001 00:48:18,310 --> 00:48:21,520 om natten den 25. februar. 1002 00:48:21,520 --> 00:48:25,792 >> -Det Spores tid til en nøjagtighed på omkring en tiendedel af et sekund. 1003 00:48:25,792 --> 00:48:27,950 Nu er en tiendedel af et sekund er et interessant tal 1004 00:48:27,950 --> 00:48:31,850 fordi det ikke kan udtrykkes i binær nøjagtigt, som 1005 00:48:31,850 --> 00:48:36,500 betyder det ikke kan udtrykkes nøjagtigt i en moderne digital computer. 1006 00:48:36,500 --> 00:48:41,070 Det er svært at tro, men bruge dette som et eksempel. 1007 00:48:41,070 --> 00:48:43,420 >> Lad os tage det nummer en tredjedel. 1008 00:48:43,420 --> 00:48:47,330 En tredjedel kan ikke være udtrykkes som et decimaltal nøjagtigt. 1009 00:48:47,330 --> 00:48:52,060 En tredjedel er 0,333 foregår til uendeligt. 1010 00:48:52,060 --> 00:48:56,420 Der er ingen måde at gøre det med absolut nøjagtighed i en decimal. 1011 00:48:56,420 --> 00:48:59,530 Det er præcis den slags problemer der skete i Patriot. 1012 00:48:59,530 --> 00:49:04,040 Jo længere systemet kørte, den værre tidspunkt fejlen blev. 1013 00:49:04,040 --> 00:49:08,840 >> -Efter 100 timers drift, fejl i tid var kun omkring en tredjedel 1014 00:49:08,840 --> 00:49:10,440 af et sekund. 1015 00:49:10,440 --> 00:49:14,150 Men med hensyn til målretning en missil rejser på Mach 5, 1016 00:49:14,150 --> 00:49:18,560 det resulterede i en tracking fejl på over 600 meter. 1017 00:49:18,560 --> 00:49:21,870 Det ville være en fatal fejl for soldaterne i Dhahran. 1018 00:49:21,870 --> 00:49:28,455 >> Hvad skete der et Scud lancering var opdaget af satellitter tidlig varsling, 1019 00:49:28,455 --> 00:49:32,710 og de vidste en Scud kommer i deres generelle retning. 1020 00:49:32,710 --> 00:49:35,150 De vidste ikke, hvor det kommer. 1021 00:49:35,150 --> 00:49:38,210 Det var nu op til radaren komponent af Patriot-systemet 1022 00:49:38,210 --> 00:49:43,150 forsvare Dhahran at lokalisere og holde spor af den indkommende fjendtlige missiler. 1023 00:49:43,150 --> 00:49:44,561 >> -Den Radar var meget smart. 1024 00:49:44,561 --> 00:49:46,560 Det ville faktisk spore position Scud 1025 00:49:46,560 --> 00:49:48,930 og derefter forudsige, hvor det sandsynligvis ville være 1026 00:49:48,930 --> 00:49:51,380 næste gang radar sendes en impuls ud. 1027 00:49:51,380 --> 00:49:53,040 Det blev kaldt intervallet porten. 1028 00:49:53,040 --> 00:49:57,620 >> -Så Når Patriot beslutter tilstrækkelig tid har 1029 00:49:57,620 --> 00:50:02,400 bestået for at gå tilbage og tjekke den næste placering til dette detekteret objekt 1030 00:50:02,400 --> 00:50:03,550 det går tilbage. 1031 00:50:03,550 --> 00:50:07,820 Så når det gik tilbage til den forkerte sted, det så ser noget objekt. 1032 00:50:07,820 --> 00:50:10,360 Og beslutter, at der ikke var noget objekt. 1033 00:50:10,360 --> 00:50:13,630 At der var en falsk detektion og det falder sporet. 1034 00:50:13,630 --> 00:50:16,970 >> -Den Indkommende Scud forsvandt fra radarskærmen, 1035 00:50:16,970 --> 00:50:20,200 og sekunder senere, hamrede ind i kasernen. 1036 00:50:20,200 --> 00:50:22,570 Den Scud dræbte 28. 1037 00:50:22,570 --> 00:50:26,110 Det var den sidste fyret under den første Golfkrig. 1038 00:50:26,110 --> 00:50:31,920 Tragisk, den opdaterede software ankom ved daggry den følgende dag. 1039 00:50:31,920 --> 00:50:34,870 Den software fejl havde været fastsat, lukning 1040 00:50:34,870 --> 00:50:39,150 et kapitel i den urolige historie Patriot missil. 1041 00:50:39,150 --> 00:50:40,030 >> [END VIDEO PLAYBACK] 1042 00:50:40,030 --> 00:50:41,488 >> David J. MALAN: Det er det for CS50. 1043 00:50:41,488 --> 00:50:42,820 Vi vil se dig på onsdag. 1044 00:50:42,820 --> 00:50:46,420 1045 00:50:46,420 --> 00:50:50,370 >> [Musik spiller] 1046 00:50:50,370 --> 00:54:23,446