1 00:00:00,000 --> 00:00:00,940 2 00:00:00,940 --> 00:00:05,440 >> [Muziek] 3 00:00:05,440 --> 00:00:11,577 4 00:00:11,577 --> 00:00:12,660 DAVID J. MALAN: Oke. 5 00:00:12,660 --> 00:00:15,590 Dit is CS50, en dit is het begin van week twee. 6 00:00:15,590 --> 00:00:19,120 Dus laten we vandaag beginnen met een bug. 7 00:00:19,120 --> 00:00:20,974 Een insect, is natuurlijk een fout in een programma, 8 00:00:20,974 --> 00:00:22,890 en je zult zeer krijgen kent dit concept 9 00:00:22,890 --> 00:00:26,050 als je nog nooit hebt geprogrammeerd voor. pset0 en nu pset1. 10 00:00:26,050 --> 00:00:29,280 Maar laten we eens kijken naar iets een beetje simpel op het eerste. 11 00:00:29,280 --> 00:00:32,189 Het programma hier dat ik gooide samen op voorhand, 12 00:00:32,189 --> 00:00:37,280 en ik beweer dat dit moet worden afgedrukt 10 sterren op het scherm met behulp van printf, 13 00:00:37,280 --> 00:00:41,020 maar het is blijkbaar buggy op een bepaalde manier. 14 00:00:41,020 --> 00:00:45,370 >> Gezien het feit dat de specificatie die het moet 10 sterren af ​​te drukken, 15 00:00:45,370 --> 00:00:50,230 maar het niet blijkbaar, wat zou u beweert is de bug? 16 00:00:50,230 --> 00:00:52,004 Yeah? 17 00:00:52,004 --> 00:00:54,420 Dus het is een uit door een fout, en wat doe je daarmee? 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 Excellent. 22 00:01:10,410 --> 00:01:13,930 We hebben dus een gespecificeerd beginnen van nul voor i, 23 00:01:13,930 --> 00:01:18,399 en we hebben een n-waarde van 10 opgegeven, maar we hebben minder dan of gelijk aan gebruikte. 24 00:01:18,399 --> 00:01:21,190 De reden dat dit twee tekens en niet slechts een symbool, 25 00:01:21,190 --> 00:01:22,630 als in een wiskunde boek, is dat je niet hoeft 26 00:01:22,630 --> 00:01:24,880 Een manier om de een teken equivalent. 27 00:01:24,880 --> 00:01:28,450 >> Dus dat betekent minder dan, maar als je begint te tellen bij nul, 28 00:01:28,450 --> 00:01:31,690 maar je telt helemaal omhoog door en gelijk aan 10, 29 00:01:31,690 --> 00:01:34,170 je bent natuurlijk gaat telt 11 dingen in totaal. 30 00:01:34,170 --> 00:01:35,900 En dus je gaat om af te drukken 11 sterren. 31 00:01:35,900 --> 00:01:37,990 Dus wat zou een oplossing voor dit zijn? 32 00:01:37,990 --> 00:01:39,970 Yeah? 33 00:01:39,970 --> 00:01:43,980 >> Dus gewoon aanpassen van de minder dan of gelijk aan iets minder dan zijn, 34 00:01:43,980 --> 00:01:46,250 en er is, ik beweer, misschien andere oplossing ook. 35 00:01:46,250 --> 00:01:47,210 Wat kan je nog doen? 36 00:01:47,210 --> 00:01:48,590 Yeah? 37 00:01:48,590 --> 00:01:53,660 >> Dus begin gelijk is aan 1, en reactie minder dan of gelijk aan. 38 00:01:53,660 --> 00:01:56,187 En eerlijk gezegd ik zou beweren dat voor een typische menselijke, 39 00:01:56,187 --> 00:01:57,770 Dit is waarschijnlijk eenvoudiger. 40 00:01:57,770 --> 00:02:00,280 Beginnen te tellen bij 1 en tellen tot 10. 41 00:02:00,280 --> 00:02:01,690 In wezen doen wat je bedoelt. 42 00:02:01,690 --> 00:02:04,010 >> Maar de realiteit is in programmering, zoals we hebben gezien, 43 00:02:04,010 --> 00:02:07,598 informatici en programmeurs over het algemeen beginnen te tellen bij nul. 44 00:02:07,598 --> 00:02:09,389 En dus dat is fijn een keer je went er wel aan. 45 00:02:09,389 --> 00:02:12,640 Uw conditie zal in het algemeen iets als minder dan. 46 00:02:12,640 --> 00:02:14,910 Dus gewoon een logische fout die we konden nu 47 00:02:14,910 --> 00:02:17,990 repareren en uiteindelijk opnieuw compileren dit en krijgen slechts 10. 48 00:02:17,990 --> 00:02:19,610 >> Nou wat dacht je van deze bug hier? 49 00:02:19,610 --> 00:02:24,200 Hier, nogmaals, ik beweer dat ik een doel van het afdrukken van 10 stars-- 50 00:02:24,200 --> 00:02:28,140 een per regel deze keer, maar het niet. 51 00:02:28,140 --> 00:02:30,940 Voordat we stellen wat de oplossing is, wat dit doet 52 00:02:30,940 --> 00:02:34,640 afdrukken visueel als ik compileren en run dit programma vind je ervan? 53 00:02:34,640 --> 00:02:35,140 Yeah? 54 00:02:35,140 --> 00:02:38,360 55 00:02:38,360 --> 00:02:38,860 >> Star. 56 00:02:38,860 --> 00:02:41,690 Dus alle sterren op de dezelfde lijn is wat ik heb gehoord, 57 00:02:41,690 --> 00:02:43,391 en dan is de nieuwe regel. 58 00:02:43,391 --> 00:02:44,140 Dus laten we proberen dat. 59 00:02:44,140 --> 00:02:48,710 Dus zorg buggy-1, voer, en ik zie het gekletter commando 60 00:02:48,710 --> 00:02:50,090 dat hebben we gesproken over de laatste tijd. 61 00:02:50,090 --> 00:02:55,180 ./buggy-1, en inderdaad zie ik alle 10 sterren op dezelfde lijn, hoewel ik claimen 62 00:02:55,180 --> 00:02:58,690 in mijn specificatie slechts een reactie boven de code die ik van plan om een ​​per doen 63 00:02:58,690 --> 00:02:59,230 lijn. 64 00:02:59,230 --> 00:03:00,580 Maar dit ziet er goed uit. 65 00:03:00,580 --> 00:03:04,620 >> Nu lijkt het lijn 15 zoals ik ben het afdrukken van een ster, en dan lijn 16 66 00:03:04,620 --> 00:03:06,620 het lijkt alsof ik afdrukken een nieuwe regel karakter, 67 00:03:06,620 --> 00:03:09,560 en ze zijn allebei zo ingesprongen Ik ben binnenkant van de lus duidelijk. 68 00:03:09,560 --> 00:03:13,610 Dus zou ik niet ster moeten doen, nieuwe lijn, ster, nieuwe lijn, ster, nieuwe lijn? 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, in tegenstelling tot een taal als Python, als je bekend bent, 72 00:03:21,240 --> 00:03:23,540 inspringing niet belangrijk voor de computer. 73 00:03:23,540 --> 00:03:25,280 Het maakt alleen de mens. 74 00:03:25,280 --> 00:03:29,860 Dus terwijl ik hier heb uitgevonden lijnen 15 en 16-- dat mooi staat, 75 00:03:29,860 --> 00:03:31,330 maar de computer wordt niet schelen. 76 00:03:31,330 --> 00:03:34,640 De computer geeft om eigenlijk met accolades 77 00:03:34,640 --> 00:03:36,310 rond deze regels code. 78 00:03:36,310 --> 00:03:39,520 >> Zodat het van Clear net als in Scratch-- dat die twee regels code 79 00:03:39,520 --> 00:03:40,450 worden uitgevoerd. 80 00:03:40,450 --> 00:03:44,390 Als een van die gele Scratch puzzel stukken opnieuw en opnieuw en opnieuw. 81 00:03:44,390 --> 00:03:50,920 >> Dus als ik nu opnieuw uit te voeren deze program-- ./buggy-2-- Hm. 82 00:03:50,920 --> 00:03:51,770 Ik heb nu een fout. 83 00:03:51,770 --> 00:03:54,212 Wat heb ik vergeten te doen? 84 00:03:54,212 --> 00:03:55,420 Ja, dus ik heb niet compileren. 85 00:03:55,420 --> 00:03:56,740 Dus zorg buggy-2. 86 00:03:56,740 --> 00:03:59,840 Geen dergelijke dossier omdat ik niet de tweede versie werkelijk compileren. 87 00:03:59,840 --> 00:04:04,860 Dus nu interessant zwartwerk variable-- niet 2. 88 00:04:04,860 --> 00:04:05,510 We doen 1. 89 00:04:05,510 --> 00:04:11,050 Maak buggy-1-- ./buggy-1-- en nu elk van hen op dezelfde lijn. 90 00:04:11,050 --> 00:04:13,880 >> Nu is er een uitzondering op deze vermeende vordering van mij 91 00:04:13,880 --> 00:04:15,520 die je nodig hebt deze accolades. 92 00:04:15,520 --> 00:04:20,160 Wanneer is het eigenlijk OK-- als je hebt opgemerkt in paragraaf of textbooks-- 93 00:04:20,160 --> 00:04:22,130 aan de accolades weglaten? 94 00:04:22,130 --> 00:04:22,630 Yeah? 95 00:04:22,630 --> 00:04:26,290 96 00:04:26,290 --> 00:04:26,870 >> Precies. 97 00:04:26,870 --> 00:04:28,940 Als er maar een regel code die u 98 00:04:28,940 --> 00:04:32,830 willen worden geassocieerd met de lus zoals in ons eerste voorbeeld. 99 00:04:32,830 --> 00:04:36,380 Het is volstrekt legitiem aan de accolades weglaten 100 00:04:36,380 --> 00:04:40,310 zoals soort gemak van de compiler om u. 101 00:04:40,310 --> 00:04:40,810 Yeah? 102 00:04:40,810 --> 00:04:43,347 103 00:04:43,347 --> 00:04:43,930 Goede vraag. 104 00:04:43,930 --> 00:04:45,500 Zou het worden beschouwd als een stijl fout? 105 00:04:45,500 --> 00:04:49,340 We zouden promote-- als in CS50 stijlgids, de URL waarvoor 106 00:04:49,340 --> 00:04:51,926 is pset1-- die altijd Gebruik de accolades. 107 00:04:51,926 --> 00:04:53,550 Zeker als je nieuw bent bij het programmeren bent. 108 00:04:53,550 --> 00:04:56,800 De realiteit is dat we niet ga u te verbieden 109 00:04:56,800 --> 00:04:58,680 van het doen van deze gemakken. 110 00:04:58,680 --> 00:05:00,846 Maar als je net in de swing van de dingen, 111 00:05:00,846 --> 00:05:04,020 absoluut gewoon altijd gebruik maken van de krullende bretels tot je onder de knie hebt. 112 00:05:04,020 --> 00:05:04,640 Goede vraag. 113 00:05:04,640 --> 00:05:05,320 >> Oke. 114 00:05:05,320 --> 00:05:07,660 Dus dat was toen een bug. 115 00:05:07,660 --> 00:05:09,190 Tenminste in iets vrij eenvoudig. 116 00:05:09,190 --> 00:05:11,260 En toch zou je dit denken is vrij rudimentair, toch? 117 00:05:11,260 --> 00:05:13,635 Dit is een soort van de eerste week kijk op de taal 118 00:05:13,635 --> 00:05:14,890 ziet, lees daarin uw bugs. 119 00:05:14,890 --> 00:05:17,250 Maar de werkelijkheid zijn dit eigenlijk vertegenwoordiger 120 00:05:17,250 --> 00:05:20,310 van een aantal behoorlijk beangstigend problemen die zich kunnen voordoen in de echte wereld. 121 00:05:20,310 --> 00:05:23,530 >> Dus sommigen van jullie nog wel herinneren als je tech nieuws te volgen, 122 00:05:23,530 --> 00:05:25,740 of misschien zelfs gevangen wind van deze in februari 123 00:05:25,740 --> 00:05:29,434 van het afgelopen jaar dat Apple had maakte een beetje een fout in zowel iOS, 124 00:05:29,434 --> 00:05:31,350 het besturingssysteem op hun telefoons, en ook 125 00:05:31,350 --> 00:05:34,220 Mac OS, het besturingssysteem op hun desktops en laptops. 126 00:05:34,220 --> 00:05:36,480 En je zag zulke krantenkoppen als dit. 127 00:05:36,480 --> 00:05:41,120 En daarna, Apple beloofde om deze bug op te lossen, 128 00:05:41,120 --> 00:05:45,950 en zeer snel deed repareren in iOS, maar dan uiteindelijk vast in Mac OS 129 00:05:45,950 --> 00:05:46,810 ook. 130 00:05:46,810 --> 00:05:50,370 >> Nu geen van deze krantenkoppen alleen echt onthullen wat het onderliggende probleem was, 131 00:05:50,370 --> 00:05:55,640 maar de bug werd uiteindelijk teruggebracht tot een bug in SSL, Secure Sockets Layer. 132 00:05:55,640 --> 00:05:57,390 En lang verhaal kort te maken, Dit is de software 133 00:05:57,390 --> 00:06:01,030 dat onze browsers en andere software die wordt gebruikt om wat te doen? 134 00:06:01,030 --> 00:06:04,090 135 00:06:04,090 --> 00:06:06,860 >> Als ik zei dat SSL is betrokken zijn, wanneer u 136 00:06:06,860 --> 00:06:13,920 een bezoek aan een URL die begint met HTTPS, wat dan zou SSL worden gerelateerd aan? 137 00:06:13,920 --> 00:06:14,580 Encryptie. 138 00:06:14,580 --> 00:06:16,470 Dus we praten over dit in de komende dagen. 139 00:06:16,470 --> 00:06:18,750 Encryptie, de kunst van het versluiering informatie. 140 00:06:18,750 --> 00:06:22,200 >> Maar lang verhaal kort te maken, Apple enige tijd geleden had een fout gemaakt 141 00:06:22,200 --> 00:06:25,970 bij de uitvoering van SSL, de software die uiteindelijk implementeert 142 00:06:25,970 --> 00:06:30,120 URL's zoals HTTPS of max verbindingen er ook. 143 00:06:30,120 --> 00:06:32,850 Het resultaat daarvan is dat de verbindingen kon potentieel 144 00:06:32,850 --> 00:06:33,920 worden onderschept. 145 00:06:33,920 --> 00:06:37,130 En je connecties waren niet noodzakelijkerwijs versleuteld 146 00:06:37,130 --> 00:06:40,350 als je had een aantal slechte kerel in tussen u en de bestemming website die 147 00:06:40,350 --> 00:06:42,170 wist hoe om te profiteren van deze. 148 00:06:42,170 --> 00:06:45,090 >> Nu Apple uiteindelijk geplaatst een fix voor dit eindelijk, 149 00:06:45,090 --> 00:06:46,920 en de beschrijving van hun moeilijke situatie was dit. 150 00:06:46,920 --> 00:06:49,878 Veilig transport niet valideren de authenticiteit van de verbinding. 151 00:06:49,878 --> 00:06:52,920 Het probleem is verholpen door ontbrekende validatiestappen herstellen. 152 00:06:52,920 --> 00:06:57,250 >> Dus dit is een zeer de hand golvende uitleg om gewoon te zeggen dat we het verknald. 153 00:06:57,250 --> 00:07:00,920 Er is letterlijk een regel code die buggy was 154 00:07:00,920 --> 00:07:05,130 bij de uitvoering van SSL, en als je online gaan en zoeken voor deze 155 00:07:05,130 --> 00:07:07,210 je kunt eigenlijk vinden de originele broncode. 156 00:07:07,210 --> 00:07:11,960 Zo, dit is een screenshot van slechts een gedeelte van een vrij groot bestand, 157 00:07:11,960 --> 00:07:15,965 maar dit is een functie genaamd blijkbaar SSL verifiëren teken server key exchange. 158 00:07:15,965 --> 00:07:17,840 En het duurt een stelletje argumenten en ingangen. 159 00:07:17,840 --> 00:07:20,298 En we zijn niet van plan om zich te concentreren te veel op de minutia er, 160 00:07:20,298 --> 00:07:24,390 maar als je je richt op de code binnen van die bovenste function-- laten 161 00:07:24,390 --> 00:07:25,590 inzoomen op dat. 162 00:07:25,590 --> 00:07:28,140 Je misschien al vermoedt wat de fout zou kunnen 163 00:07:28,140 --> 00:07:31,230 zelfs als je geen idee hebt uiteindelijk wat u zoekt op. 164 00:07:31,230 --> 00:07:35,924 Er is een soort van een anomalie hier, wat is wat? 165 00:07:35,924 --> 00:07:38,940 >> Ja, ik hou er niet echt het uiterlijk van twee goto mislukt. 166 00:07:38,940 --> 00:07:42,060 Eerlijk gezegd, heb ik niet echt weet wat goto mislukken middelen, maar met twee van hen 167 00:07:42,060 --> 00:07:42,810 rug aan rug. 168 00:07:42,810 --> 00:07:45,290 Dat wrijft me gewoon een soort van intellectueel op de verkeerde manier, 169 00:07:45,290 --> 00:07:48,910 en inderdaad, als we inzoomen op alleen die lijnen, is C. 170 00:07:48,910 --> 00:07:52,220 >> Dus veel van Apple's code is zelf geschreven in C, 171 00:07:52,220 --> 00:07:55,780 en dit blijkbaar is echt equivalent-- 172 00:07:55,780 --> 00:07:59,060 niet om dat mooie inspringen versie, maar als je het feit te erkennen 173 00:07:59,060 --> 00:08:02,560 dat er geen accolades, wat Apple echt schreef was code die eruit ziet 174 00:08:02,560 --> 00:08:03,540 als deze. 175 00:08:03,540 --> 00:08:07,080 Dus ik heb uitgezoomd en ik vastgestelde kuiltje zin 176 00:08:07,080 --> 00:08:10,690 dat als er geen accolades, dat tweede goto falen dat is in het geel 177 00:08:10,690 --> 00:08:12,500 gaat niet uit wat te voeren. 178 00:08:12,500 --> 00:08:15,540 Het is niet geassocieerd met de als voorwaarde erboven. 179 00:08:15,540 --> 00:08:19,590 >> Dus zelfs nogmaals, als je niet helemaal begrijpen wat dit zou mogelijk 180 00:08:19,590 --> 00:08:23,230 moeten doen, weten dat elk van deze conditions-- elk van deze lijnen 181 00:08:23,230 --> 00:08:26,180 is een zeer belangrijke stap in het controleren 182 00:08:26,180 --> 00:08:28,350 Als uw gegevens is in feite versleuteld. 183 00:08:28,350 --> 00:08:31,710 Dus het overslaan van een van deze stappen, niet het beste idee. 184 00:08:31,710 --> 00:08:34,840 >> Maar omdat we dit tweede goto falen geel, 185 00:08:34,840 --> 00:08:36,840 en omdat zodra we soort van esthetisch 186 00:08:36,840 --> 00:08:40,480 verplaatsen naar links, waar het logisch is op het moment, wat 187 00:08:40,480 --> 00:08:43,230 betekent dit voor de lijn van onderstaande code die tweede goto 188 00:08:43,230 --> 00:08:46,480 niet zou je denken? 189 00:08:46,480 --> 00:08:48,860 Het gaat altijd om te worden overgeslagen. 190 00:08:48,860 --> 00:08:52,100 Dus gotos zijn over het algemeen afgekeurd om redenen die we niet echt ingaan, 191 00:08:52,100 --> 00:08:54,940 en inderdaad in CS50 we de neiging niet deze verklaring goto leren, 192 00:08:54,940 --> 00:08:58,130 maar je kunt denken aan goto mislukken als betekenis gaan springen 193 00:08:58,130 --> 00:08:59,600 naar een ander deel van de code. 194 00:08:59,600 --> 00:09:03,120 >> Met andere woorden: springen over Deze laatste regel helemaal, 195 00:09:03,120 --> 00:09:07,420 en dus het resultaat van deze stomme eenvoudige fout die gewoon was 196 00:09:07,420 --> 00:09:10,330 Door waarschijnlijk iemand kopiëren en er een te plakken 197 00:09:10,330 --> 00:09:14,150 vaak is dat de gehele beveiliging van iOS en Mac OS 198 00:09:14,150 --> 00:09:18,240 was kwetsbaar voor onderschepping door slechteriken al geruime tijd. 199 00:09:18,240 --> 00:09:19,940 Totdat Apple dit uiteindelijk vastgesteld. 200 00:09:19,940 --> 00:09:23,100 >> Nu, als sommige van jullie zijn eigenlijk lopen oude versies van iOS of Mac OS, 201 00:09:23,100 --> 00:09:27,250 u kunt naar gotofail.com die is een website die iemand opzetten 202 00:09:27,250 --> 00:09:29,190 in wezen bepalen programmatisch 203 00:09:29,190 --> 00:09:30,980 als uw computer is nog steeds kwetsbaar. 204 00:09:30,980 --> 00:09:33,600 En eerlijk gezegd, als het is, is het waarschijnlijk een goed idee 205 00:09:33,600 --> 00:09:36,870 om uw telefoon bij te werken of je Mac op dit punt. 206 00:09:36,870 --> 00:09:40,120 Maar, net testament aan hoe een appreciatie van deze lagere niveau 207 00:09:40,120 --> 00:09:42,400 details en vrij eenvoudige ideeën kan echt 208 00:09:42,400 --> 00:09:44,590 vertalen in beslissingen en problemen 209 00:09:44,590 --> 00:09:47,320 affected-- in deze geval-- miljoenen mensen. 210 00:09:47,320 --> 00:09:49,107 >> Nu een woord over de administratie. 211 00:09:49,107 --> 00:09:50,690 Sectie zal komende zondag te beginnen. 212 00:09:50,690 --> 00:09:53,360 U ontvangt een email met de weekend over de afdeling, op welk punt 213 00:09:53,360 --> 00:09:55,290 het resectioning proces zal beginnen als je hebt 214 00:09:55,290 --> 00:09:56,998 realiseerde je hebt nu een aantal nieuwe conflicten. 215 00:09:56,998 --> 00:10:00,180 Dus dit gebeurt elk jaar, en we zal plaats bieden in de komende dagen. 216 00:10:00,180 --> 00:10:02,430 >> Office hours-- doen houden een oog op dit schema hier. 217 00:10:02,430 --> 00:10:05,100 Verandert een beetje deze week, vooral de starttijd 218 00:10:05,100 --> 00:10:08,180 en de locatie, dus raadpleeg dat voordat u naar het kantoor uren 219 00:10:08,180 --> 00:10:09,520 een van de volgende vier nachten. 220 00:10:09,520 --> 00:10:12,680 En nu een woord op de beoordeling, vooral als je een duik nemen in probleem 221 00:10:12,680 --> 00:10:14,350 stelt een en daarbuiten. 222 00:10:14,350 --> 00:10:17,070 >> Dus volgens de specificatie, deze zijn algemeen 223 00:10:17,070 --> 00:10:20,360 de assen waarlangs evalueren we uw werk. 224 00:10:20,360 --> 00:10:23,170 Toepassingsgebied naar hetgeen mate uw code implementeert 225 00:10:23,170 --> 00:10:25,690 de eigenschappen die nodig zijn door onze specificatie. 226 00:10:25,690 --> 00:10:28,290 Met andere woorden, hoeveel een stuk set heb je af te bijten. 227 00:10:28,290 --> 00:10:30,440 Heb je een derde van het, een helft, 100% daarvan. 228 00:10:30,440 --> 00:10:33,000 Zelfs als het niet correct is, hoeveel heb je geprobeerd? 229 00:10:33,000 --> 00:10:35,290 Zodat vangt het niveau van inspanning en de hoeveelheid 230 00:10:35,290 --> 00:10:38,260 waaraan u beet de problemen probleem set's. 231 00:10:38,260 --> 00:10:40,690 >> Correctness-- deze, naar In hoeverre is uw code 232 00:10:40,690 --> 00:10:43,150 consistent met onze specificaties en vrij van bugs. 233 00:10:43,150 --> 00:10:44,770 Zo werkt het goed werkt? 234 00:10:44,770 --> 00:10:48,700 Als we het aantal input, doet het geven ons de output die we verwachten? 235 00:10:48,700 --> 00:10:52,570 Design-- Nu is de eerste het bijzonder kwalitatieve degenen, 236 00:10:52,570 --> 00:10:56,180 of degenen die het menselijk oordeel vereisen. 237 00:10:56,180 --> 00:10:59,690 En inderdaad, dit is de reden waarom wij hebben een staf van zoveel Teaching Fellows en natuurlijk 238 00:10:59,690 --> 00:11:00,350 assistenten. 239 00:11:00,350 --> 00:11:03,480 In hoeverre is uw code goed geschreven? 240 00:11:03,480 --> 00:11:05,810 >> En wederom is dit een zeer kwalitatieve beoordeling 241 00:11:05,810 --> 00:11:09,100 dat op zal samen met u bi-directioneel in de komende weken. 242 00:11:09,100 --> 00:11:12,060 Dus dat als je niet alleen numerieke scores, maar ook 243 00:11:12,060 --> 00:11:16,682 een schriftelijke scores, of getypte feedback, of schriftelijke feedback in het Engels woorden. 244 00:11:16,682 --> 00:11:19,640 Dat is wat we zullen gebruiken om u te rijden richting eigenlijk het schrijven van betere code. 245 00:11:19,640 --> 00:11:23,320 En in collegezalen en sectie, zullen we proberen wijzen out-- zo vaak als we can-- 246 00:11:23,320 --> 00:11:26,420 wat maakt een programma niet alleen correct en functioneel goed, 247 00:11:26,420 --> 00:11:28,200 maar ook goed ontworpen. 248 00:11:28,200 --> 00:11:31,850 De meest efficiënte het zou kunnen zijn, of zelfs de mooiste het kan zijn. 249 00:11:31,850 --> 00:11:33,100 >> Die leidt ons naar stijl. 250 00:11:33,100 --> 00:11:36,876 Style uiteindelijk is een esthetisch oordeel. 251 00:11:36,876 --> 00:11:38,750 Heb je een goede keuze namen voor je variabelen? 252 00:11:38,750 --> 00:11:40,330 Heb je je code goed ingesprongen? 253 00:11:40,330 --> 00:11:44,010 Doet het er goed uitzien, en daarom, is het gemakkelijk voor een andere persoon 254 00:11:44,010 --> 00:11:46,550 te lezen van uw respectieve van de juistheid ervan. 255 00:11:46,550 --> 00:11:50,300 >> Nu over het algemeen volgens de syllabus, we scoren deze dingen op een vijfpuntsschaal. 256 00:11:50,300 --> 00:11:53,640 En laat me hameren huis het punt dat een drie is inderdaad goed. 257 00:11:53,640 --> 00:11:55,550 Heel snel mensen gaan doen rekenen. 258 00:11:55,550 --> 00:11:58,133 Als ze een drie op vijf op juistheid voor sommige pset 259 00:11:58,133 --> 00:12:02,040 en ze denken damn, ik ga 60% dat in wezen een D of E. 260 00:12:02,040 --> 00:12:03,980 >> Dat is niet de manier waarop we dat deze nummers. 261 00:12:03,980 --> 00:12:06,880 Een drie is inderdaad goed, en wat we algemeen verwacht aan het begin 262 00:12:06,880 --> 00:12:09,820 van het woord is dat als je nu op een stelletje three's-- misschien een paar 263 00:12:09,820 --> 00:12:12,540 van beurzen, een paar fours-- of een paar tweeën, een paar fours-- 264 00:12:12,540 --> 00:12:13,748 dat is een goede plek om te beginnen. 265 00:12:13,748 --> 00:12:16,320 En zolang we zien een opwaartse traject na verloop van tijd, 266 00:12:16,320 --> 00:12:18,540 je bent in een bijzonder goede plek. 267 00:12:18,540 --> 00:12:20,752 >> De formule die we gebruiken om gewicht wat in hoofdzaak 268 00:12:20,752 --> 00:12:22,710 dit per de syllabus, die gewoon betekent dat we 269 00:12:22,710 --> 00:12:24,750 meer gewicht te geven aan correctheid. 270 00:12:24,750 --> 00:12:27,930 Want het is heel vaak juistheid dat kost de meeste tijd. 271 00:12:27,930 --> 00:12:28,760 Geloof me nu. 272 00:12:28,760 --> 00:12:31,190 U zult find-- tenminste in een pset-- dat u 273 00:12:31,190 --> 00:12:36,790 besteden 90% van je tijd aan 10% van het probleem. 274 00:12:36,790 --> 00:12:39,320 >> En alles soort werkt behalve een of twee bugs, 275 00:12:39,320 --> 00:12:41,570 en dat zijn de bugs die houden u 's avonds laat. 276 00:12:41,570 --> 00:12:43,380 Dat zijn degenen die soort ontsnappen u. 277 00:12:43,380 --> 00:12:45,560 Maar na het slapen op het, of het bijwonen kantooruren 278 00:12:45,560 --> 00:12:48,844 of online vragen stellen, wordt als je naar die 100% doelstelling, 279 00:12:48,844 --> 00:12:50,760 en dat is waarom we het gewicht Correctheid het meest. 280 00:12:50,760 --> 00:12:54,102 Ontwerp een beetje minder, en stijl een beetje minder dan dat. 281 00:12:54,102 --> 00:12:56,060 Maar in mind-- stijl houden is misschien wel de makkelijkste 282 00:12:56,060 --> 00:12:58,890 deze af te bijten volgens de stijlgids. 283 00:12:58,890 --> 00:13:01,580 >> En nu, een meer serieuze Let op academische eerlijkheid. 284 00:13:01,580 --> 00:13:05,000 CS50 heeft de ongelukkige onderscheiding van het zijn de grootste producent van Ad Board 285 00:13:05,000 --> 00:13:07,330 gevallen bijna elk jaar in het verleden. 286 00:13:07,330 --> 00:13:11,012 Dit is niet omdat de studenten cheat in CS50 meer nog dan een andere klasse, 287 00:13:11,012 --> 00:13:13,720 maar omdat door de aard van het werk, het feit dat het elektronisch, 288 00:13:13,720 --> 00:13:16,636 het feit dat we voor het kijken, en het feit dat we zijn computer wetenschappers, 289 00:13:16,636 --> 00:13:20,570 Ik kan zeggen dat we helaas erg goed in het opsporen van het. 290 00:13:20,570 --> 00:13:22,710 >> Dus wat betekent dit in reële termen? 291 00:13:22,710 --> 00:13:24,820 Zodat het, volgens de syllabus, filosofie van de cursus 292 00:13:24,820 --> 00:13:28,090 echt neer redelijk te zijn. 293 00:13:28,090 --> 00:13:31,684 Er is deze lijn tussen het doen van je werk op je eigen 294 00:13:31,684 --> 00:13:34,100 en het krijgen van een beetje van redelijke hulp van een vriend, 295 00:13:34,100 --> 00:13:38,020 en regelrechte doen dat werk voor je vriend, of hem of haar uw code verzenden 296 00:13:38,020 --> 00:13:41,080 zodat hij of zij kan gewoon nemen of lenen het uit rechts. 297 00:13:41,080 --> 00:13:43,580 En dat steekt de lijn dat we getrokken in de klas. 298 00:13:43,580 --> 00:13:45,410 >> Zie, de syllabus uiteindelijk voor de lijnen 299 00:13:45,410 --> 00:13:48,209 dat trekken we als redelijk en onredelijk gedrag, 300 00:13:48,209 --> 00:13:50,000 maar het is echt niet koken naar de essentie 301 00:13:50,000 --> 00:13:53,980 van uw werk om wees dan uw eigen in het einde. 302 00:13:53,980 --> 00:13:56,230 Nu met dat gezegd, er is een heuristische. 303 00:13:56,230 --> 00:13:58,980 Want zoals je misschien imagine-- van kantooruren en de visuals 304 00:13:58,980 --> 00:14:01,060 en de video's die we hebben getoond waardoor far-- CS50 305 00:14:01,060 --> 00:14:04,530 wordt inderdaad bedoeld is als collaborative en als coöperatieve en sociale 306 00:14:04,530 --> 00:14:06,450 mogelijk. 307 00:14:06,450 --> 00:14:08,570 Als collaborative zoals ze nu streng. 308 00:14:08,570 --> 00:14:11,314 >> Maar met dit zei, de heuristische, zoals u zult zien in de syllabus, 309 00:14:11,314 --> 00:14:12,980 is dat wanneer je met een probleem. 310 00:14:12,980 --> 00:14:16,470 Je hebt een aantal bug in de code die u niet kunt oplossen, is het redelijk voor u 311 00:14:16,470 --> 00:14:18,039 om uw code aan iemand anders te laten zien. 312 00:14:18,039 --> 00:14:21,080 Een vriend zelfs in de klas, een vriend die naast je zit op het kantoor uren, 313 00:14:21,080 --> 00:14:22,680 of een lid van het personeel. 314 00:14:22,680 --> 00:14:25,810 Maar ze kunnen hun code niet laten zien. 315 00:14:25,810 --> 00:14:27,710 >> Met andere woorden, een antwoord op uw question-- 316 00:14:27,710 --> 00:14:29,940 Ik moet help-- is niet oh, hier is mijn code. 317 00:14:29,940 --> 00:14:32,440 Neem een ​​kijkje op deze en afleiden uit het wat je wil. 318 00:14:32,440 --> 00:14:34,580 Nu, natuurlijk, er is een manier om duidelijk te gamen 319 00:14:34,580 --> 00:14:37,760 Dit systeem waarbij ik zal je laten zien mijn code voor het hebben van een vraag. 320 00:14:37,760 --> 00:14:40,150 U toont mij mijn code voor het hebben van een vraag. 321 00:14:40,150 --> 00:14:45,870 Maar zie de syllabus weer voor de fijnere details van waar deze lijn is. 322 00:14:45,870 --> 00:14:50,606 >> Alleen maar om de foto nu te schilderen en delen zo transparant mogelijk 323 00:14:50,606 --> 00:14:53,480 waar we in de afgelopen jaren, Dit is het aantal Ad Board gevallen 324 00:14:53,480 --> 00:14:56,260 dat CS50 heeft meer dan gehad de afgelopen zeven jaar. 325 00:14:56,260 --> 00:14:58,717 Met 14 gevallen dit meest recente daling. 326 00:14:58,717 --> 00:15:01,300 In termen van de betrokken studenten, het was 20 een aantal vreemde studenten 327 00:15:01,300 --> 00:15:02,490 afgelopen najaar. 328 00:15:02,490 --> 00:15:05,670 Er was een piek van 33 leerlingen enkele jaren geleden. 329 00:15:05,670 --> 00:15:08,830 Van wie velen zijn helaas niet meer hier op de campus. 330 00:15:08,830 --> 00:15:13,100 >> Studenten betrokken als een percentage van de klasse heeft in het verleden varieerden van 0% 331 00:15:13,100 --> 00:15:17,300 tot 5,3%, dat wil zeggen alleen Dit is elk jaar een uitdaging. 332 00:15:17,300 --> 00:15:20,390 En naar dat einde, wat we willen doen is brengen een 333 00:15:20,390 --> 00:15:24,310 dat we dd-- gewoon FYI-- vergelijken bij een fairness voor de studenten die 334 00:15:24,310 --> 00:15:26,520 zijn naar aanleiding van de lijn daarvan. 335 00:15:26,520 --> 00:15:29,620 Wij doen vergelijken alle huidige inzendingen tegen alle vroegere missies 336 00:15:29,620 --> 00:15:30,840 van de afgelopen jaren. 337 00:15:30,840 --> 00:15:33,620 >> We weten ook hoe om rond te googlen en vind code repositories 338 00:15:33,620 --> 00:15:36,360 online, discussiefora online, job sites online. 339 00:15:36,360 --> 00:15:41,580 Als een student het kan vinden, kunnen we zeker vind het zo veel als wij helaas. 340 00:15:41,580 --> 00:15:45,330 Dus wat zie je in de syllabus al is dit spijt clausule. 341 00:15:45,330 --> 00:15:47,500 Ik kan zeker waarderen, en wij allen heeft 342 00:15:47,500 --> 00:15:50,870 personeel de cursus als het hebben gedaan deze, of deze zich na verloop van tijd, 343 00:15:50,870 --> 00:15:53,997 zeker weet wat het is als het leven in de weg als je krijgt 344 00:15:53,997 --> 00:15:56,080 sommige late night deadline-- niet alleen in deze klasse, 345 00:15:56,080 --> 00:15:58,660 maar another-- als je volledig uitgeput, gestrest, 346 00:15:58,660 --> 00:16:00,659 hebben een buitensporige aantal van andere dingen te doen. 347 00:16:00,659 --> 00:16:03,660 Je zal op een bepaald punt in leven zeker een slechte, misschien wel te laat 348 00:16:03,660 --> 00:16:04,620 nacht beslissing. 349 00:16:04,620 --> 00:16:06,520 >> Dus volgens de syllabus, Er is deze clausule, 350 00:16:06,520 --> 00:16:10,629 zodanig dat indien binnen 72 uur nadat enkele slechte beslissing, kunt u zich tot het 351 00:16:10,629 --> 00:16:12,670 en uit te reiken naar me toe en een van de hoofden van de cursus 352 00:16:12,670 --> 00:16:14,300 en wij zullen een gesprek hebben. 353 00:16:14,300 --> 00:16:16,220 We zullen de dingen gaan intern in de hoop 354 00:16:16,220 --> 00:16:18,770 daarvan steeds een leermoment of levensles, 355 00:16:18,770 --> 00:16:22,120 en niet iets met bijzonder ingrijpende gevolgen 356 00:16:22,120 --> 00:16:24,570 zoals je kunt zien op deze kaarten hier. 357 00:16:24,570 --> 00:16:26,540 >> Dus dat is een heel serieuze toon. 358 00:16:26,540 --> 00:16:29,960 Laten we pauzeren voor een paar seconden de spanning breken. 359 00:16:29,960 --> 00:16:34,442 >> [Muziek] 360 00:16:34,442 --> 00:17:17,768 361 00:17:17,768 --> 00:17:20,250 >> DAVID J. MALAN: Oke, dus hoe is dat voor een segue? 362 00:17:20,250 --> 00:17:22,059 Om de huidige primaire onderwerpen. 363 00:17:22,059 --> 00:17:23,859 De eerste is abstractie. 364 00:17:23,859 --> 00:17:26,900 Een van die gaat het worden representatie van gegevens, die eerlijk gezegd 365 00:17:26,900 --> 00:17:31,640 is echt een droge manier om te zeggen hoe kunnen we gaan over het oplossen van problemen en denken 366 00:17:31,640 --> 00:17:33,250 over het oplossen van problemen? 367 00:17:33,250 --> 00:17:37,285 Dus je hebt gezien in de Scratch, en je hebt gezien misschien al in pset1 met C 368 00:17:37,285 --> 00:17:39,930 dat je niet alleen kunt gebruiken functies zoals printf, 369 00:17:39,930 --> 00:17:42,770 dat andere mensen in de afgelopen jaren schreef voor u. 370 00:17:42,770 --> 00:17:45,340 U kunt ook uw eigen functies. 371 00:17:45,340 --> 00:17:48,440 >> En ook al heb je misschien niet gebeurt dit in C, en eerlijk gezegd in pset1 372 00:17:48,440 --> 00:17:51,866 je hoeft niet echt nodig om te schrijven van uw eigen functie omdat probleem-- 373 00:17:51,866 --> 00:17:53,990 terwijl misschien ontmoedigend op eerste glance-- je zult zien 374 00:17:53,990 --> 00:17:57,910 kan uiteindelijk worden opgelost met niet zo veel regels code. 375 00:17:57,910 --> 00:18:01,140 Maar met dat gezegd, in termen van het schrijven van uw eigen functie, 376 00:18:01,140 --> 00:18:03,570 beseffen dat C geeft op u deze mogelijkheid. 377 00:18:03,570 --> 00:18:06,940 >> Ik ga om te gaan in de huidige broncode, die al beschikbaar is online, 378 00:18:06,940 --> 00:18:10,900 en ik ga je gang en een open gaan een programma genaamd functie 0.C, 379 00:18:10,900 --> 00:18:14,620 en in functie zero we zien wel een paar dingen. 380 00:18:14,620 --> 00:18:19,160 In eerste regels 18 tot en met 23 is mijn belangrijkste functie. 381 00:18:19,160 --> 00:18:22,414 En nu we beginnen te lezen code dat we niet schrijven op de vlieg, 382 00:18:22,414 --> 00:18:25,080 maar in plaats daarvan heb ik van tevoren schriftelijk of dat je in een probleem te stellen 383 00:18:25,080 --> 00:18:27,910 mochten ontvangen hebben geschreven tevoren. 384 00:18:27,910 --> 00:18:30,040 Een goed begin code te lezen van iemand anders 385 00:18:30,040 --> 00:18:31,400 is op zoek naar de belangrijkste functie. 386 00:18:31,400 --> 00:18:34,420 Erachter te komen waar dat item punt is het uitvoeren van het programma, 387 00:18:34,420 --> 00:18:36,580 en volg het dan logisch uit daar. 388 00:18:36,580 --> 00:18:40,190 >> Dus dit programma blijkbaar prints uw naam gevolgd door een dubbele punt. 389 00:18:40,190 --> 00:18:42,490 Vervolgens gebruiken we GetString van de CS50 bibliotheek 390 00:18:42,490 --> 00:18:46,050 om een ​​string, of een woord of zin te krijgen van de gebruiker op het toetsenbord. 391 00:18:46,050 --> 00:18:48,390 En dan is er nog dit ding hier-- PrintName. 392 00:18:48,390 --> 00:18:51,420 >> Nu PrintName is geen functie die wordt geleverd met een C. 393 00:18:51,420 --> 00:18:52,970 Het is niet in de standaard io.h. 394 00:18:52,970 --> 00:18:55,570 Het is niet in CS50.h. 395 00:18:55,570 --> 00:18:57,880 Het is nogal in hetzelfde bestand. 396 00:18:57,880 --> 00:19:01,000 Merken als ik naar beneden scrollen een bit-- regels 25 tot 27-- 397 00:19:01,000 --> 00:19:05,330 het is gewoon een mooie manier van commentaar uw code met behulp van de sterren en slashes. 398 00:19:05,330 --> 00:19:07,320 Dit is een multi-lijn commentaar te leveren, en dit is slechts 399 00:19:07,320 --> 00:19:10,570 mijn beschrijving in het blauw van Wat deze functie doet. 400 00:19:10,570 --> 00:19:14,530 >> Omdat in lijnen 28 tot 31, Ik heb een super eenvoudige functie geschreven 401 00:19:14,530 --> 00:19:16,280 wiens naam is PrintName. 402 00:19:16,280 --> 00:19:19,560 Het duurt hoeveel argumenten zou je dan zeggen? 403 00:19:19,560 --> 00:19:25,120 Dus een argument-- want er is een argument vermeld tussen de haakjes. 404 00:19:25,120 --> 00:19:27,000 Het type dat is String. 405 00:19:27,000 --> 00:19:30,240 Dat wil zeggen PrintName is als deze black box 406 00:19:30,240 --> 00:19:32,910 of functie die wordt als input een string. 407 00:19:32,910 --> 00:19:35,730 >> En de naam van die String gunstig zal zijn Naam. 408 00:19:35,730 --> 00:19:37,840 Geen S, geen N, maar Naam. 409 00:19:37,840 --> 00:19:41,090 Dus wat doet PrintName doen? 410 00:19:41,090 --> 00:19:42,210 Het is leuk simpel. 411 00:19:42,210 --> 00:19:45,390 Net als een regel code voor de printf, maar blijkbaar 412 00:19:45,390 --> 00:19:47,950 drukt "Hallo," zo en zo. 413 00:19:47,950 --> 00:19:50,070 Waar het zo en zo komt van het argument. 414 00:19:50,070 --> 00:19:52,300 >> Nu is dit niet een enorme innovatie hier. 415 00:19:52,300 --> 00:19:56,710 Echt, ik heb een programma dat zou kunnen genomen zijn geschreven met een regel code 416 00:19:56,710 --> 00:20:00,190 door de invoering van deze hier boven, en veranderde het in iets 417 00:20:00,190 --> 00:20:04,920 dat vereist een zekere zes of zeven of zo regels code helemaal hier beneden. 418 00:20:04,920 --> 00:20:08,190 >> Maar het is de beoefening van een principe bekend als abstractie. 419 00:20:08,190 --> 00:20:12,550 Soort inkapselen binnen een nieuw functie die een naam heeft en betere 420 00:20:12,550 --> 00:20:14,590 maar die naam letterlijk zegt wat het doet. 421 00:20:14,590 --> 00:20:16,880 Ik bedoel printf-- dat is niet vooral beschrijvend. 422 00:20:16,880 --> 00:20:18,932 Als ik wil een maken puzzelstukje, of als ik 423 00:20:18,932 --> 00:20:21,140 een functie wilt maken dat drukt de naam van iemand, 424 00:20:21,140 --> 00:20:23,230 de schoonheid van dit te doen is dat ik kan eigenlijk 425 00:20:23,230 --> 00:20:27,170 geven dat de functie een naam die beschrijft wat het doet. 426 00:20:27,170 --> 00:20:29,844 >> Nu duurt het bij een ingang die Ik heb willekeurig genoemd naam, 427 00:20:29,844 --> 00:20:32,760 maar ook dat is heerlijk beschrijvende in plaats van iets meer 428 00:20:32,760 --> 00:20:36,140 generieke zoals S. En leegte, voor nu, betekent alleen 429 00:20:36,140 --> 00:20:38,330 dat deze functie niet geef me terug wat dan ook. 430 00:20:38,330 --> 00:20:41,127 Het is niet zoals GetString dat letterlijk geeft me terug een string 431 00:20:41,127 --> 00:20:43,960 zoals we hebben gedaan met de stukjes papier met je klasgenoten van vorige week, 432 00:20:43,960 --> 00:20:45,990 maar het is slechts een bijwerking. 433 00:20:45,990 --> 00:20:48,080 Het drukt iets naar het scherm. 434 00:20:48,080 --> 00:20:53,880 >> Dus aan het eind van de dag, als ik hoeft te maken functie-0, ./function-0, 435 00:20:53,880 --> 00:20:55,450 we zullen zien, dat het vraagt ​​om mijn naam. 436 00:20:55,450 --> 00:20:58,150 Ik typ David, en het typen van mijn naam. 437 00:20:58,150 --> 00:21:01,080 Als ik het weer doen met Rob, het gaat om te zeggen "Hallo, Rob." 438 00:21:01,080 --> 00:21:04,280 Dus een simpel idee, maar misschien extrapoleren van deze mentaal 439 00:21:04,280 --> 00:21:06,750 dat als je programma's te krijgen een beetje ingewikkelder, 440 00:21:06,750 --> 00:21:10,290 en je wilt een stuk van schrijven code en het gesprek dat code-- invoke 441 00:21:10,290 --> 00:21:13,270 dat code-- sommige beschrijvende noemen als PrintName, 442 00:21:13,270 --> 00:21:15,600 C doet veroorloven ons deze mogelijkheid. 443 00:21:15,600 --> 00:21:17,660 >> Hier is nog een eenvoudig voorbeeld. 444 00:21:17,660 --> 00:21:22,940 Bijvoorbeeld, als ik open een bestand van vandaag genoemd return.c, 445 00:21:22,940 --> 00:21:24,270 let op wat ik hier heb gedaan. 446 00:21:24,270 --> 00:21:26,330 De meeste van deze belangrijkste functie is printf. 447 00:21:26,330 --> 00:21:30,360 Ik voor het eerst willekeurig initialiseren een variabele genaamd x om het nummer 2. 448 00:21:30,360 --> 00:21:34,110 Vervolgens heb ik uitprinten "x is nu % I "passeren de waarde van x. 449 00:21:34,110 --> 00:21:35,500 Dus ik zeg gewoon wat het is. 450 00:21:35,500 --> 00:21:37,208 >> Nu ben ik gewoon vrijmoedig beweren met printf. 451 00:21:37,208 --> 00:21:42,050 Ik Cubing die waarde x, en ik ben doen door te bellen naar een functie 452 00:21:42,050 --> 00:21:45,590 genaamd cube passerende in x als argument, 453 00:21:45,590 --> 00:21:49,300 en vervolgens het opslaan van de output in de variabele zelf, x. 454 00:21:49,300 --> 00:21:51,340 Dus ik ben de oren slaat de waarde van x. 455 00:21:51,340 --> 00:21:53,380 Ik ben het overschrijven van de waarde van x met wat 456 00:21:53,380 --> 00:21:56,510 het resultaat van het aanroepen kubus functie. 457 00:21:56,510 --> 00:21:59,530 En dan druk ik gewoon een aantal pluizige spul hier te zeggen wat ik deed. 458 00:21:59,530 --> 00:22:01,600 >> Dus wat is dan kubus? 459 00:22:01,600 --> 00:22:03,510 Let op wat is fundamenteel hier anders. 460 00:22:03,510 --> 00:22:05,540 Ik heb de functie gegeven naam als voorheen. 461 00:22:05,540 --> 00:22:08,270 Ik heb een naam die is opgegeven voor een argument. 462 00:22:08,270 --> 00:22:11,650 Dit keer het heet n in plaats van de naam, maar ik kon het even wat ik wil noemen. 463 00:22:11,650 --> 00:22:12,650 Maar dit is anders. 464 00:22:12,650 --> 00:22:14,080 Dit ding aan de linkerkant. 465 00:22:14,080 --> 00:22:16,290 Voorheen was het wat zoekwoord? 466 00:22:16,290 --> 00:22:16,870 Boys. 467 00:22:16,870 --> 00:22:18,580 Nu is het natuurlijk int. 468 00:22:18,580 --> 00:22:20,630 >> Dus wat is misschien wel de weg te nemen? 469 00:22:20,630 --> 00:22:24,090 Overwegende leegte Betekent soort niets, en dat was het geval. 470 00:22:24,090 --> 00:22:25,970 PrintName teruggekeerd niets. 471 00:22:25,970 --> 00:22:27,942 Het deed iets, maar hij kwam niet terug geef me 472 00:22:27,942 --> 00:22:30,650 iets dat ik op het kon zetten linkerkant van een gelijkteken 473 00:22:30,650 --> 00:22:32,460 zoals ik heb gedaan hier op lijn 22. 474 00:22:32,460 --> 00:22:36,780 >> Dus als ik zeg in op lijn 30, wat is dat waarschijnlijk wat impliceert 475 00:22:36,780 --> 00:22:38,610 over wat cube doet voor mij? 476 00:22:38,610 --> 00:22:41,110 Yeah? 477 00:22:41,110 --> 00:22:42,310 Het geeft een geheel. 478 00:22:42,310 --> 00:22:44,590 Dus het geeft me terug, voor bijvoorbeeld een stuk papier 479 00:22:44,590 --> 00:22:46,580 waarop hij het antwoord heeft geschreven. 480 00:22:46,580 --> 00:22:50,130 2 blokjes, of 3 blokjes, of 4 cubed-- wat ik voorbij in, 481 00:22:50,130 --> 00:22:51,540 en hoe heb ik dit te implementeren? 482 00:22:51,540 --> 00:22:54,810 Nou, gewoon n keer n keer n is hoe ik een waarde zou kubus. 483 00:22:54,810 --> 00:22:57,110 Dus nogmaals, super eenvoudig idee, maar demonstratief 484 00:22:57,110 --> 00:23:00,100 nu hoe we kunnen functies schrijven dat eigenlijk had ons terug 485 00:23:00,100 --> 00:23:02,380 waarden die van belang kunnen zijn. 486 00:23:02,380 --> 00:23:05,740 >> Laten we eens kijken naar een laatste voorbeeld hier genoemd functie een. 487 00:23:05,740 --> 00:23:08,530 In dit voorbeeld begint om meer dwingende krijgen. 488 00:23:08,530 --> 00:23:12,400 Dus in functie is, deze program-- mededeling uiteindelijk 489 00:23:12,400 --> 00:23:14,920 noemt een functie genaamd GetPositiveInt. 490 00:23:14,920 --> 00:23:17,800 GetPositiveInt is geen functie in de CS50 bibliotheek 491 00:23:17,800 --> 00:23:20,400 maar we besloten we zou willen dat het bestaat. 492 00:23:20,400 --> 00:23:24,550 >> Dus als we naar beneden scrollen later in het bestand, merken hoe ik ging over het implementeren van 493 00:23:24,550 --> 00:23:26,560 krijgen positieve int, en ik zeggen dat het meer dwingende 494 00:23:26,560 --> 00:23:28,992 want dit is een behoorlijke aantal regels code. 495 00:23:28,992 --> 00:23:30,700 Het is niet alleen een domme speeltje programma. 496 00:23:30,700 --> 00:23:33,870 Het is eigenlijk nog wat foutcontrole en iets nuttiger te doen. 497 00:23:33,870 --> 00:23:38,470 >> Dus als je niet de walkthrough heb gezien video's die we hebben ingebed in pset1, 498 00:23:38,470 --> 00:23:42,350 weet dat dit een soort lus C, in dezelfde geest 499 00:23:42,350 --> 00:23:44,270 naar het soort dingen Scratch kan doen. 500 00:23:44,270 --> 00:23:46,320 En doe zegt dit te doen. 501 00:23:46,320 --> 00:23:47,500 Print dit uit. 502 00:23:47,500 --> 00:23:51,860 Dan ga je gang en krijg n-- krijgen een int en opslaan in n, 503 00:23:51,860 --> 00:23:55,760 en houd deze opnieuw en opnieuw en doet opnieuw zolang n kleiner is dan een. 504 00:23:55,760 --> 00:23:58,720 >> Zo n gaat minder dan een zijn alleen als de mens er niet mee. 505 00:23:58,720 --> 00:24:01,980 Als hij of zij aan het typen in 0 of -1 of -50, 506 00:24:01,980 --> 00:24:04,790 Deze lus gaat houden weer uitvoeren. 507 00:24:04,790 --> 00:24:07,549 En uiteindelijk merk ik gewoon terug de waarde. 508 00:24:07,549 --> 00:24:09,590 Dus nu hebben we een functie dat zou leuk geweest zijn 509 00:24:09,590 --> 00:24:14,040 als CS50 zou implementeren in CS50.h en CS50.c voor u, 510 00:24:14,040 --> 00:24:16,520 maar hier kunnen we nu uitvoering van deze onszelf. 511 00:24:16,520 --> 00:24:19,230 >> Maar twee reacties op een aantal belangrijke details. 512 00:24:19,230 --> 00:24:24,390 Een-- waarom heb ik verklaar int n, denk je, op lijn 29 513 00:24:24,390 --> 00:24:27,139 in plaats van het doen dit hier, dat 514 00:24:27,139 --> 00:24:28,930 meer in overeenstemming met wat we deden vorige week? 515 00:24:28,930 --> 00:24:29,430 Yeah? 516 00:24:29,430 --> 00:24:34,485 517 00:24:34,485 --> 00:24:35,110 Een goede gedachte. 518 00:24:35,110 --> 00:24:37,080 Dus als we waren om het te zetten hier, het is alsof we 519 00:24:37,080 --> 00:24:39,110 houden opnieuw en opnieuw aangifte te doen. 520 00:24:39,110 --> 00:24:42,000 Dat op zich is niet problematisch, zodanig, 521 00:24:42,000 --> 00:24:43,940 want we moeten alleen de waarde een keer en dan 522 00:24:43,940 --> 00:24:45,330 we gaan naar een nieuwe bemachtigen. 523 00:24:45,330 --> 00:24:45,940 Maar een goede gedachte. 524 00:24:45,940 --> 00:24:46,440 Yeah? 525 00:24:46,440 --> 00:24:52,770 526 00:24:52,770 --> 00:24:53,330 >> Sluiten. 527 00:24:53,330 --> 00:24:59,030 Dus omdat ik n op heb verklaard lijn 29 buiten de lus, 528 00:24:59,030 --> 00:25:01,390 het is in het hele hotel deze hele functie. 529 00:25:01,390 --> 00:25:05,400 Niet de andere functies, omdat N nog binnen deze curly 530 00:25:05,400 --> 00:25:06,470 bretels hier. 531 00:25:06,470 --> 00:25:07,940 Dus-- zeker. 532 00:25:07,940 --> 00:25:12,430 533 00:25:12,430 --> 00:25:12,940 >> Precies. 534 00:25:12,940 --> 00:25:14,356 Dus dit is nog meer to the point. 535 00:25:14,356 --> 00:25:18,600 Als we in plaats daarvan verklaarde n hier op lijn 32, 536 00:25:18,600 --> 00:25:22,340 het is problematisch omdat gok waar anders ik nodig om toegang te krijgen? 537 00:25:22,340 --> 00:25:25,620 Op lijn 34, en de eenvoudige vuistregel is 538 00:25:25,620 --> 00:25:30,060 dat je alleen kunt gebruik maken van een variabele binnenkant van de meest recente accolades 539 00:25:30,060 --> 00:25:31,420 waarin u het verklaard. 540 00:25:31,420 --> 00:25:35,230 >> Helaas, regel 34 is een regel te laat, 541 00:25:35,230 --> 00:25:38,560 omdat ik al heb afgesloten de accolade op lijn 33 542 00:25:38,560 --> 00:25:41,220 die overeenkomt met de accolade op lijn 30. 543 00:25:41,220 --> 00:25:44,180 En dus is dit een manier om te zeggen dat deze variabele int wordt scoped, 544 00:25:44,180 --> 00:25:46,970 zo te zeggen, slechts binnen van die accolades. 545 00:25:46,970 --> 00:25:48,910 Het werkt gewoon niet bestaan ​​buiten hen. 546 00:25:48,910 --> 00:25:51,580 >> Dus inderdaad, als ik dit doe verkeerd, laat mij de code op te slaan 547 00:25:51,580 --> 00:25:53,530 als deze niet goed is-- geschreven. 548 00:25:53,530 --> 00:25:57,990 Laat me gaan en weet te maken functie-1, en notice-- fout. 549 00:25:57,990 --> 00:26:03,502 Het gebruik van niet-aangegeven identifier n op lijn 35, die is hier. 550 00:26:03,502 --> 00:26:05,210 En als we u omhoog verder andere. 551 00:26:05,210 --> 00:26:08,750 Gebruik van zwartwerk identifier n op lijn 34. 552 00:26:08,750 --> 00:26:11,200 >> Dus de compiler, Clang, is te merken dat het gewoon 553 00:26:11,200 --> 00:26:13,720 bestaat niet alhoewel duidelijk dat het er visueel. 554 00:26:13,720 --> 00:26:16,090 Dus een eenvoudige oplossing is er aangifte te doen. 555 00:26:16,090 --> 00:26:18,790 >> Laat me nu blader naar het begin van het bestand. 556 00:26:18,790 --> 00:26:21,080 Wat springt uit bij u als een beetje anders 557 00:26:21,080 --> 00:26:23,070 van de dingen die we gekeken naar de afgelopen week? 558 00:26:23,070 --> 00:26:26,990 Niet alleen heb ik de naam niet alleen te doen Ik heb een aantal scherpe omvat tot boven, 559 00:26:26,990 --> 00:26:29,340 Ik heb iets wat ik ben bellen van een prototype. 560 00:26:29,340 --> 00:26:36,100 Nu dat ziet er erg vergelijkbaar met wat We zagen zojuist op lijn 27. 561 00:26:36,100 --> 00:26:39,230 >> Dus laten we afleiden uit een andere foutmelding waarom ik dit heb gedaan. 562 00:26:39,230 --> 00:26:42,050 Laat me gaan en daar deze lijnen te verwijderen. 563 00:26:42,050 --> 00:26:44,240 En dus we weten niets over het prototype. 564 00:26:44,240 --> 00:26:45,430 Remake van dit bestand. 565 00:26:45,430 --> 00:26:46,890 Maak een functie. 566 00:26:46,890 --> 00:26:48,090 En nu, damn, vier fouten. 567 00:26:48,090 --> 00:26:50,220 Laten scrollen tot de eerste. 568 00:26:50,220 --> 00:26:55,070 >> Impliciete verklaring van de functie krijgen positieve int is ongeldig in C99. 569 00:26:55,070 --> 00:26:57,780 C99 betekent gewoon de 1999 versie van de taal 570 00:26:57,780 --> 00:26:59,710 C, dat is wat we inderdaad gebruikt. 571 00:26:59,710 --> 00:27:01,050 Dus wat betekent dit? 572 00:27:01,050 --> 00:27:05,250 Goed C-- en meer specifiek C compilers-- zijn behoorlijk dom programma. 573 00:27:05,250 --> 00:27:07,420 Ze weten alleen dat wat je hebt vertelde hen, en dat is 574 00:27:07,420 --> 00:27:08,960 eigenlijk thematisch van vorige week. 575 00:27:08,960 --> 00:27:12,910 >> Het probleem is dat als ik ga over het implementeren van de naam hier, 576 00:27:12,910 --> 00:27:17,640 en ik noem een ​​functie genaamd GetPositiveInt hier op lijn 20, 577 00:27:17,640 --> 00:27:22,520 die functie doet technisch niet bestaan ​​tot de compiler ziet lijn 27. 578 00:27:22,520 --> 00:27:25,450 Helaas, de compiler is dingen boven, beneden, links, rechts doen, 579 00:27:25,450 --> 00:27:29,580 dus omdat het niet heeft gezien de uitvoering van GetPositiveInt, 580 00:27:29,580 --> 00:27:32,400 maar het ziet u probeert om het te gebruiken hier op, 581 00:27:32,400 --> 00:27:35,810 het is gewoon te bail-- schreeuwen tegen u met een fout Message-- misschien 582 00:27:35,810 --> 00:27:38,440 cryptische en eigenlijk het dossier samen te stellen. 583 00:27:38,440 --> 00:27:41,940 >> Dus een zogenaamde prototype up Hier is weliswaar overbodig. 584 00:27:41,940 --> 00:27:47,870 Letterlijk, ging ik hier en ik gekopieerd en geplakt, en ik zet het op hier. 585 00:27:47,870 --> 00:27:51,020 Void zou meer goed zijn, dus we zullen letterlijk kopiëren en plakken deze keer. 586 00:27:51,020 --> 00:27:52,854 Ik letterlijk gekopieerd en geplakt. 587 00:27:52,854 --> 00:27:54,270 Eigenlijk net zo als een broodkruimel. 588 00:27:54,270 --> 00:27:56,260 >> Een kleine aanwijzing voor de compiler. 589 00:27:56,260 --> 00:27:58,860 Ik weet niet wat dit doet nog niet, maar ik ben het met de belofte om u 590 00:27:58,860 --> 00:28:00,260 dat het uiteindelijk zal bestaan. 591 00:28:00,260 --> 00:28:04,010 En dat is de reden waarom deze line-- in lijn 16-- eindigt met een puntkomma. 592 00:28:04,010 --> 00:28:05,486 Het is overbodig door het ontwerp. 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 >> Als u uw bibliotheek niet koppelen naar de-- oh, goede vraag. 596 00:28:14,360 --> 00:28:17,350 Sharp is inclusief header file insluitsels. 597 00:28:17,350 --> 00:28:20,040 Moet moet bijna be-- altijd aan de top 598 00:28:20,040 --> 00:28:23,270 van het dossier voor een similar-- voor precies dezelfde reden, ja. 599 00:28:23,270 --> 00:28:26,430 Omdat in standaard io.h is letterlijk een lijn 600 00:28:26,430 --> 00:28:30,560 zoals, maar met het woord printf en met zijn argumenten en zijn terugkeer type. 601 00:28:30,560 --> 00:28:33,310 En ga zo maar door het doen van scherpe behoren tot hier, wat je letterlijk doen 602 00:28:33,310 --> 00:28:36,380 is het kopiëren en plakken van de inhoud van iemand anders schreef boven. 603 00:28:36,380 --> 00:28:39,660 Daarbij cluing uw code in om de Dat deze functies bestaan. 604 00:28:39,660 --> 00:28:40,160 Yeah? 605 00:28:40,160 --> 00:28:47,520 606 00:28:47,520 --> 00:28:48,260 >> Absoluut. 607 00:28:48,260 --> 00:28:51,690 Dus een zeer slimme en correcte oplossing zou zijn, weet je wat? 608 00:28:51,690 --> 00:28:53,760 Ik weet niet wat een prototype is, maar ik weet 609 00:28:53,760 --> 00:28:56,390 Als ik begrijp dat C is gewoon stom en herdenkt boven naar beneden. 610 00:28:56,390 --> 00:28:57,820 Nou laten we het wat het wil. 611 00:28:57,820 --> 00:29:01,650 Snijd die code, plak het op top, en nu duw belangrijkste beneden. 612 00:29:01,650 --> 00:29:03,470 Ook dit zou het probleem oplossen. 613 00:29:03,470 --> 00:29:07,409 >> Maar je kon heel gemakkelijk komen met een scenario waarin A B moeten bellen, 614 00:29:07,409 --> 00:29:10,075 en misschien B terugbelt naar A. Deze is iets genaamd recursie, 615 00:29:10,075 --> 00:29:11,370 en zullen we hierop terugkomen. 616 00:29:11,370 --> 00:29:13,911 En het wel of niet een goed ding, maar je kan zeker 617 00:29:13,911 --> 00:29:15,110 breken deze oplossing. 618 00:29:15,110 --> 00:29:17,690 >> En bovendien zou ik beweren stilistisch, 619 00:29:17,690 --> 00:29:20,760 vooral wanneer je programma's worden deze lange en deze lange, 620 00:29:20,760 --> 00:29:23,064 het is gewoon super handig boven hoofd te zetten 621 00:29:23,064 --> 00:29:25,730 want het is het ding het meest programmeurs gaan schelen. 622 00:29:25,730 --> 00:29:28,150 En dus is het een beetje schoner, misschien wel, om het te doen zoals 623 00:29:28,150 --> 00:29:30,380 Ik deed het oorspronkelijk met een prototype zelfs 624 00:29:30,380 --> 00:29:33,396 maar het ziet er een beetje redundant op het eerste gezicht. 625 00:29:33,396 --> 00:29:33,895 Yeah? 626 00:29:33,895 --> 00:29:36,472 627 00:29:36,472 --> 00:29:37,680 Sorry, kan je het zegt luider? 628 00:29:37,680 --> 00:29:45,650 629 00:29:45,650 --> 00:29:49,580 >> Als u overschakelt van de locaties van de implementatie en het prototype? 630 00:29:49,580 --> 00:29:51,270 Dus dat is een goede vraag. 631 00:29:51,270 --> 00:29:53,780 Als u opnieuw verklaren dit neer hier, laten we eens zien wat er gebeurt. 632 00:29:53,780 --> 00:29:55,530 Dus als ik dit neer Hier, je zegt. 633 00:29:55,530 --> 00:29:57,860 634 00:29:57,860 --> 00:29:58,360 Oh, sorry. 635 00:29:58,360 --> 00:29:58,859 Luider? 636 00:29:58,859 --> 00:30:02,000 637 00:30:02,000 --> 00:30:04,011 Nog harder. 638 00:30:04,011 --> 00:30:04,760 Oh, goede vraag. 639 00:30:04,760 --> 00:30:05,860 Zou het de functie vervalt? 640 00:30:05,860 --> 00:30:08,901 Je weet wel, na al die jaren, ik hebben nooit een prototype van achteraf. 641 00:30:08,901 --> 00:30:13,810 Dus laten we het doen maken functie-1 daarna doen. 642 00:30:13,810 --> 00:30:15,279 >> [Gemompel] 643 00:30:15,279 --> 00:30:16,320 DAVID J. MALAN: Oh, wacht. 644 00:30:16,320 --> 00:30:17,944 We hebben nog steeds alles opgemaakt top. 645 00:30:17,944 --> 00:30:21,400 Dus laten we dit doen hier, als ik het begrijpen van uw vraag goed. 646 00:30:21,400 --> 00:30:24,700 Ik zet alles, met inbegrip van het prototype bovenstaande belangrijkste, 647 00:30:24,700 --> 00:30:28,180 maar ik zet het prototype onder de uitvoering. 648 00:30:28,180 --> 00:30:33,190 >> Dus als ik een, krijg ik terug een error-- ongebruikte variabele n. 649 00:30:33,190 --> 00:30:37,280 650 00:30:37,280 --> 00:30:37,860 Oh, daar. 651 00:30:37,860 --> 00:30:38,360 Dank je wel. 652 00:30:38,360 --> 00:30:39,430 Laten we eens kijken, ontdoen we ons van dit. 653 00:30:39,430 --> 00:30:41,304 Dat is een andere bug, dus laten we negeren dat. 654 00:30:41,304 --> 00:30:43,910 Laten we dit echt snel remake. 655 00:30:43,910 --> 00:30:48,100 >> OK, dus data argument niet gebruikt door de format string 656 00:30:48,100 --> 00:30:52,310 n-- oh, dat komt omdat Ik veranderde deze hier. 657 00:30:52,310 --> 00:30:55,885 Oke, we weten wat het antwoord gaat om-- oke, daar gaan we. 658 00:30:55,885 --> 00:31:00,560 Ah, bedankt voor de positieve. 659 00:31:00,560 --> 00:31:03,430 Oke, zal ik deze code te bevestigen after-- negeren deze bijzondere bug 660 00:31:03,430 --> 00:31:08,300 aangezien dit was-- het werkt is het antwoord. 661 00:31:08,300 --> 00:31:11,560 >> Het maakt dus niet overschrijven wat je net hebt gedaan. 662 00:31:11,560 --> 00:31:14,800 Ik vermoed dat de compiler geschreven zodanig 663 00:31:14,800 --> 00:31:18,420 dat het negeren van uw prototype omdat het lichaam, om zo te zeggen, 664 00:31:18,420 --> 00:31:20,922 van de functie reeds geïmplementeerd hoger. 665 00:31:20,922 --> 00:31:23,380 Ik zou hebben om daadwerkelijk te raadplegen de handleiding van de compiler 666 00:31:23,380 --> 00:31:26,171 te begrijpen als er een andere implicatie, maar op het eerste gezicht 667 00:31:26,171 --> 00:31:29,290 gewoon door te proberen en te experimenteren, er lijkt geen invloed te zijn. 668 00:31:29,290 --> 00:31:30,730 Goede vraag. 669 00:31:30,730 --> 00:31:33,660 >> Dus laten we nu vooruit te smeden, het verplaatsen weg van bijwerkingen die 670 00:31:33,660 --> 00:31:36,660 zijn functies die iets doen als visueel op het scherm met printf, 671 00:31:36,660 --> 00:31:38,090 maar geen waarde terug. 672 00:31:38,090 --> 00:31:41,550 En functies die zijn terugkeer waarden zoals we net zagen een paar van. 673 00:31:41,550 --> 00:31:45,350 We zagen al deze notie van omvang, en we zullen dit opnieuw en opnieuw te zien. 674 00:31:45,350 --> 00:31:47,210 Maar voor nu, opnieuw, gebruik maken van de vuistregel 675 00:31:47,210 --> 00:31:51,410 dat een variabele alleen kan worden gebruikt binnenkant van de meest recent geopende 676 00:31:51,410 --> 00:31:54,350 en gesloten accolades als we zag in dat voorbeeld. 677 00:31:54,350 --> 00:31:56,910 >> En zoals je zei, er een ability-- 678 00:31:56,910 --> 00:32:00,040 kon sommige van deze problemen door de invoering van een variabele wereldwijd 679 00:32:00,040 --> 00:32:01,290 op de top van een bestand. 680 00:32:01,290 --> 00:32:03,630 Maar in bijna alle gevallen we zouden frons op dat, 681 00:32:03,630 --> 00:32:06,170 en inderdaad niet eens in die oplossing voor nu. 682 00:32:06,170 --> 00:32:09,890 Dus voor nu, het afhaalrestaurant is dat variabelen hebben dit begrip scope. 683 00:32:09,890 --> 00:32:13,430 >> Maar laten we nu eens kijken naar een ander droge manier daadwerkelijk kijken 684 00:32:13,430 --> 00:32:15,810 op een aantal mooie interessante implementatie details. 685 00:32:15,810 --> 00:32:17,810 Hoe wij informatie vertegenwoordigen. 686 00:32:17,810 --> 00:32:20,370 En we al gekeken naar deze in de eerste week van de klas. 687 00:32:20,370 --> 00:32:23,320 Kijkend naar binaries, en onszelf te herinneren aan decimaal. 688 00:32:23,320 --> 00:32:28,310 >> Maar herinneren van vorige week dat C heeft verschillende soorten gegevens en bossen meer, 689 00:32:28,310 --> 00:32:30,600 maar de meest bruikbare degenen nu misschien deze. 690 00:32:30,600 --> 00:32:36,030 Een char, of karakter, dat gebeurt een byte of acht bits totaal. 691 00:32:36,030 --> 00:32:40,060 En dat is om te zeggen dat de grootte van een char is slechts een byte. 692 00:32:40,060 --> 00:32:45,370 Een byte is acht bits, dat betekent dus dat we kunnen vertegenwoordigen hoeveel tekens. 693 00:32:45,370 --> 00:32:47,320 Hoeveel letters of symbolen op het toetsenbord 694 00:32:47,320 --> 00:32:49,210 als we een byte of acht bits. 695 00:32:49,210 --> 00:32:51,546 Denk terug aan week nul. 696 00:32:51,546 --> 00:32:53,420 Als je acht bits, hoeveel de totale waarden 697 00:32:53,420 --> 00:32:55,503 kunt u vertegenwoordigt met patronen van nullen en enen? 698 00:32:55,503 --> 00:32:58,170 699 00:32:58,170 --> 00:33:00,260 Een-- meer dan dat. 700 00:33:00,260 --> 00:33:03,490 Dus 256 in totaal als je beginnen te tellen vanaf nul. 701 00:33:03,490 --> 00:33:07,120 Dus als je acht bits-- dus als we hadden onze binaire bollen hier weer, 702 00:33:07,120 --> 00:33:12,180 kunnen we schakelen de lampen en uit in een van 256 unieke patronen. 703 00:33:12,180 --> 00:33:13,640 >> Nu is dit een beetje problematisch. 704 00:33:13,640 --> 00:33:16,857 Niet zozeer voor het Engels en Romaanse talen, maar zeker 705 00:33:16,857 --> 00:33:19,190 wanneer u voorstellen, voor Zo Aziatische talen, die 706 00:33:19,190 --> 00:33:22,580 hebben veel meer symbolen dan als 26 letters van het alfabet. 707 00:33:22,580 --> 00:33:24,390 We eigenlijk nodig zou kunnen meer dan een byte. 708 00:33:24,390 --> 00:33:28,240 En gelukkig in de afgelopen jaren heeft de maatschappij 709 00:33:28,240 --> 00:33:31,040 aangenomen andere standaarden die gebruikt meer dan een byte per lading. 710 00:33:31,040 --> 00:33:34,210 >> Maar voor nu in C, de standaard is slechts een byte of acht bits. 711 00:33:34,210 --> 00:33:38,195 Een integer is ondertussen vier bytes, ook bekend als 32 bits. 712 00:33:38,195 --> 00:33:41,320 Wat betekent wat is het grootst mogelijke nummer kunnen we vertegenwoordigen met een int 713 00:33:41,320 --> 00:33:41,820 blijkbaar? 714 00:33:41,820 --> 00:33:44,426 715 00:33:44,426 --> 00:33:45,050 Met een miljard. 716 00:33:45,050 --> 00:33:46,760 Dus het is 4000000000 geven of te nemen. 717 00:33:46,760 --> 00:33:49,840 2 bij de 32ste macht, als we aanvaarden geen negatieve getallen 718 00:33:49,840 --> 00:33:52,530 en gewoon gebruik maken van alle positieve aantallen, het is 4000000000 719 00:33:52,530 --> 00:33:53,730 geven of te nemen mogelijkheden. 720 00:33:53,730 --> 00:33:57,890 Een vlotter is ondertussen een ander type van het type gegevens in C. Het is nog steeds een aantal, 721 00:33:57,890 --> 00:33:58,990 maar het is een reëel getal. 722 00:33:58,990 --> 00:34:00,660 Iets met een komma. 723 00:34:00,660 --> 00:34:03,000 En het blijkt dat C maakt ook gebruik van vier bytes 724 00:34:03,000 --> 00:34:05,340 om floating point waarden vertegenwoordigen. 725 00:34:05,340 --> 00:34:09,420 >> Helaas hoeveel zwevende punt waarden zijn er in de wereld? 726 00:34:09,420 --> 00:34:11,582 Hoeveel reële getallen zijn er? 727 00:34:11,582 --> 00:34:13,540 Er is een oneindige nummer, en trouwens 728 00:34:13,540 --> 00:34:15,164 Er is een oneindig aantal getallen. 729 00:34:15,164 --> 00:34:18,070 Dus we zijn al soort graven zelf een gat hier. 730 00:34:18,070 --> 00:34:21,780 Waarbij blijkbaar in computers-- op minste programma's geschreven in C op them-- 731 00:34:21,780 --> 00:34:24,110 slechts zo hoog als tellen 4000000000 geven of te nemen, 732 00:34:24,110 --> 00:34:26,260 en floating point waarden kan alleen maar blijkbaar 733 00:34:26,260 --> 00:34:28,330 een aantal eindige hoeveelheid precisie. 734 00:34:28,330 --> 00:34:30,810 Alleen zo veel cijfers achter hun decimale punt. 735 00:34:30,810 --> 00:34:32,822 >> Want natuurlijk, als je hebt slechts 32 bits, 736 00:34:32,822 --> 00:34:36,030 Ik weet niet hoe we gaan om te gaan over vertegenwoordigen echte numbers-- waarschijnlijk 737 00:34:36,030 --> 00:34:37,409 met verschillende patronen. 738 00:34:37,409 --> 00:34:40,030 Maar er is zeker een eindige aantal van dergelijke patronen, 739 00:34:40,030 --> 00:34:41,830 dus ook hier, is dit problematisch. 740 00:34:41,830 --> 00:34:43,710 >> Nu kunnen we het probleem te vermijden iets. 741 00:34:43,710 --> 00:34:45,710 Als u niet beschikt over een float, je kon een dubbel gebruik 742 00:34:45,710 --> 00:34:50,230 in C, die u acht bytes, geeft die is veel meer mogelijke patronen van nullen 743 00:34:50,230 --> 00:34:50,730 en enen. 744 00:34:50,730 --> 00:34:55,199 Maar het is nog steeds eindige, die gaat problematisch te zijn als je schrijft software 745 00:34:55,199 --> 00:34:57,670 voor afbeeldingen of voor chique wiskundige formules. 746 00:34:57,670 --> 00:35:00,410 Dus je zou eigenlijk willen te tellen groter dan dat. 747 00:35:00,410 --> 00:35:05,640 Een lange long-- dom named-- Ook acht bytes of 64 bits, 748 00:35:05,640 --> 00:35:10,260 en dit is tweemaal zo lang als een int, en het is voor een lange integer waarde. 749 00:35:10,260 --> 00:35:15,655 >> Fun fact-- als een int is vier bytes, hoe lang is een lange in C meestal? 750 00:35:15,655 --> 00:35:18,290 751 00:35:18,290 --> 00:35:21,560 Ook vier bytes, maar een lang lang is acht bytes, 752 00:35:21,560 --> 00:35:23,050 en dit is om historische redenen. 753 00:35:23,050 --> 00:35:26,450 >> Maar de takeaway nu is gewoon dat de gegevens heeft 754 00:35:26,450 --> 00:35:29,625 in een computer-- dat is te laten vertegenwoordigen een fysiek apparaat met elektriciteit, 755 00:35:29,625 --> 00:35:32,190 het is over het algemeen rijden die nullen en ones-- 756 00:35:32,190 --> 00:35:34,320 met eindige hoeveelheden precisie. 757 00:35:34,320 --> 00:35:35,620 Dus wat is het probleem dan? 758 00:35:35,620 --> 00:35:37,480 >> Nou er is een probleem van integer overflow. 759 00:35:37,480 --> 00:35:39,780 Niet alleen in C, maar in computers in het algemeen. 760 00:35:39,780 --> 00:35:42,590 Bijvoorbeeld, indien is een byte waard bit-- 761 00:35:42,590 --> 00:35:45,120 dus als dit is acht bit-- alle waarvan het nummer een. 762 00:35:45,120 --> 00:35:47,300 Welk nummer is dit vertegenwoordigen als we aannemen 763 00:35:47,300 --> 00:35:50,730 het is allemaal positieve waarden in binaire? 764 00:35:50,730 --> 00:35:54,410 >> 255, en het is niet 256, want nul is het laagste nummer. 765 00:35:54,410 --> 00:35:56,760 Dus 255 is het hoogst een, maar het probleem 766 00:35:56,760 --> 00:36:00,330 is te veronderstellen dat ik wilde verhogen deze variabele die 767 00:36:00,330 --> 00:36:04,030 gebruikt acht bits in totaal als ik wil om het te verhogen. 768 00:36:04,030 --> 00:36:07,160 >> Nou, zodra ik een men al deze degenen, 769 00:36:07,160 --> 00:36:10,500 kun je misschien bedenken visually-- gewoon zoals het dragen van de een met behulp decimals-- 770 00:36:10,500 --> 00:36:12,300 iets aan de hand te stromen naar links. 771 00:36:12,300 --> 00:36:15,590 En inderdaad, als ik het nummer toevoegen om een, wat in binaire 772 00:36:15,590 --> 00:36:17,670 is dat overloopt op nul. 773 00:36:17,670 --> 00:36:21,730 >> Dus als je alleen use-- niet een int, maar een enkele byte aan getallen optellen 774 00:36:21,730 --> 00:36:27,170 in een programma, door default-- zodra krijg je tot 250, 251, 252, 253, 254, 775 00:36:27,170 --> 00:36:32,710 255-- 0 komt na 255, die waarschijnlijk niet wat 776 00:36:32,710 --> 00:36:34,790 een gebruiker gaat verwachten. 777 00:36:34,790 --> 00:36:39,620 >> Nu inmiddels in floating point wereld, ook een soortgelijk probleem. 778 00:36:39,620 --> 00:36:42,670 Niet zozeer met de grootste number-- maar dat is nog steeds een probleem. 779 00:36:42,670 --> 00:36:45,360 Maar de hoeveelheid precisie dat je kan vertegenwoordigen. 780 00:36:45,360 --> 00:36:49,490 Dus laten we eens een kijkje nemen op dit voorbeeld ook hier van de huidige bron code-- 781 00:36:49,490 --> 00:36:52,070 float-0.c. 782 00:36:52,070 --> 00:36:54,280 >> En merken dat het een super eenvoudig programma dat 783 00:36:54,280 --> 00:36:56,580 moet blijkbaar uitprinten welke waarde? 784 00:36:56,580 --> 00:37:00,777 785 00:37:00,777 --> 00:37:04,110 Wat doe je inzet dit gaat om af te drukken ook al is er een beetje van de nieuwe syntaxis 786 00:37:04,110 --> 00:37:05,540 hier? 787 00:37:05,540 --> 00:37:06,700 Dus hopelijk 0.1. 788 00:37:06,700 --> 00:37:10,000 Dus het equivalent van een tiende want ik ben bezig met 1 gedeeld door 10. 789 00:37:10,000 --> 00:37:12,430 Ik ben het opslaan van het antwoord in een variabele genaamd f. 790 00:37:12,430 --> 00:37:15,850 Deze variabele van het type float, die is een sleutelwoord ik net voorgesteld bestond. 791 00:37:15,850 --> 00:37:18,910 >> We hebben dit niet eerder gezien, maar Dit is een soort van een nette manier in printf 792 00:37:18,910 --> 00:37:22,110 aan hoeveel cijfers specificeren u willen zien na een komma. 793 00:37:22,110 --> 00:37:25,020 Dus deze notatie betekent gewoon dat hier is een placeholder. 794 00:37:25,020 --> 00:37:27,900 Het is voor een floating point waarde, en oh, door de manier, 795 00:37:27,900 --> 00:37:31,389 het met de decimale punt met een cijfer na de komma. 796 00:37:31,389 --> 00:37:33,180 Dus dat is het aantal significante cijfers, 797 00:37:33,180 --> 00:37:34,650 zo te zeggen, dat je zou willen. 798 00:37:34,650 --> 00:37:40,450 >> Dus laat me gaan en doen maken float-0, ./float-0, 799 00:37:40,450 --> 00:37:46,660 en blijkbaar 1 gedeeld door 10 is 0.0. 800 00:37:46,660 --> 00:37:47,760 Nu waarom is dit? 801 00:37:47,760 --> 00:37:51,380 >> Goed weer, de computer is het nemen van me letterlijk, en ik heb geschreven 1 802 00:37:51,380 --> 00:37:56,680 en ik geschreven 10, en neem een ​​gok wat is de veronderstelde gegevenstype voor die twee 803 00:37:56,680 --> 00:37:58,440 waarden? 804 00:37:58,440 --> 00:38:00,970 Een int, het is technisch gezien iets een beetje anders. 805 00:38:00,970 --> 00:38:04,150 Het is kenmerkend een lang, maar het is uiteindelijk een integrale waarde. 806 00:38:04,150 --> 00:38:06,030 Niet een floating point waarde. 807 00:38:06,030 --> 00:38:09,456 >> Dat wil zeggen dat als deze is een int en dit is een int, 808 00:38:09,456 --> 00:38:11,830 het probleem is dat de computer niet de mogelijkheid hebben 809 00:38:11,830 --> 00:38:13,680 zelfs die komma slaan. 810 00:38:13,680 --> 00:38:16,430 Dus als je dat doet 1 gedeeld met 10 behulp integers 811 00:38:16,430 --> 00:38:20,950 voor zowel de teller als de deler, het antwoord zou moeten zijn 0.1. 812 00:38:20,950 --> 00:38:24,930 Maar omdat de computer-- dat zijn integers-- 813 00:38:24,930 --> 00:38:27,430 weet niet wat te doen met de 0.1. 814 00:38:27,430 --> 00:38:30,010 >> Dus wat is het duidelijk aan het doen? 815 00:38:30,010 --> 00:38:33,120 Het is gewoon het weg te gooien, en wat ik zie uiteindelijk 816 00:38:33,120 --> 00:38:38,830 is 0.0 alleen omdat ik erop aangedrongen dat printf toon mij een komma. 817 00:38:38,830 --> 00:38:41,740 Maar het probleem is dat als u delen een geheel getal van een getal, 818 00:38:41,740 --> 00:38:44,347 je zult get-- per definitie van C-- een integer. 819 00:38:44,347 --> 00:38:46,680 En het is niet van plan om te doen iets wat mooi en handig 820 00:38:46,680 --> 00:38:49,040 zoals rond het aan de dichtstbijzijnde omhoog of omlaag. 821 00:38:49,040 --> 00:38:51,860 Het zal afkappen alles na de komma. 822 00:38:51,860 --> 00:38:54,030 >> Dus gewoon intuïtief, wat is waarschijnlijk een fix? 823 00:38:54,030 --> 00:38:55,351 Wat is de eenvoudigste oplossing hier? 824 00:38:55,351 --> 00:38:55,850 Yeah? 825 00:38:55,850 --> 00:39:00,570 826 00:39:00,570 --> 00:39:01,100 Precies. 827 00:39:01,100 --> 00:39:04,200 Waarom gaan we niet gewoon behandelen deze als floating point waarden effectief 828 00:39:04,200 --> 00:39:05,860 draaien ze in vlotters of tweepersoonskamers. 829 00:39:05,860 --> 00:39:10,500 En als ik nu doe maken praalwagens-0, of als ik compileren praalwagens-1, 830 00:39:10,500 --> 00:39:12,570 die identiek is aan wat er net werd voorgesteld. 831 00:39:12,570 --> 00:39:16,400 En nu doe ik praalwagens-0, nu krijg ik mijn 0.1. 832 00:39:16,400 --> 00:39:17,234 >> Nu is dit geweldig. 833 00:39:17,234 --> 00:39:19,441 Maar nu ga ik doen iets een beetje anders. 834 00:39:19,441 --> 00:39:22,280 Ik ben benieuwd om te zien wat er echt gebeurt onder de motorkap, 835 00:39:22,280 --> 00:39:26,050 en ik ga dit printen uit tot 28 cijfers achter de komma. 836 00:39:26,050 --> 00:39:29,730 Ik wil echt zien 0.1000-- een infinite-- 837 00:39:29,730 --> 00:39:32,710 [Onverstaanbaar] 27 nullen na dat 0,1. 838 00:39:32,710 --> 00:39:34,740 >> Nou laten we eens zien of dat is wat ik inderdaad krijgen. 839 00:39:34,740 --> 00:39:39,430 Maak praalwagens-0 hetzelfde bestand. 840 00:39:39,430 --> 00:39:41,150 ./floats-0. 841 00:39:41,150 --> 00:39:44,380 Laten we inzoomen op de dramatische antwoord. 842 00:39:44,380 --> 00:39:49,980 Al die tijd, heb je aan het denken geweest 1 gedeeld door 10 is 10%, of 0,1. 843 00:39:49,980 --> 00:39:50,810 Het is niet. 844 00:39:50,810 --> 00:39:53,210 Althans wat de computer betreft. 845 00:39:53,210 --> 00:39:57,060 >> Nu why-- OK, dat is compleet lie 1 gedeeld door 10 is 0,1. 846 00:39:57,060 --> 00:39:59,710 Maar why-- dat is niet het afhaalrestaurant vandaag. 847 00:39:59,710 --> 00:40:04,010 Dus waarom is de computer denkt, in tegenstelling tot alle van ons in de kamer, 848 00:40:04,010 --> 00:40:06,870 dat 1 gedeeld door 10 is eigenlijk die gekke waarde? 849 00:40:06,870 --> 00:40:10,620 Wat is de computer doet blijkbaar? 850 00:40:10,620 --> 00:40:12,490 Wat is dat? 851 00:40:12,490 --> 00:40:13,785 >> Het is niet overstromen, per se. 852 00:40:13,785 --> 00:40:15,910 Overflow is meestal wanneer je wikkel rond een waarde. 853 00:40:15,910 --> 00:40:18,970 Het is dit nummer van onnauwkeurigheid in een floating point 854 00:40:18,970 --> 00:40:22,220 waar je alleen 32 of misschien zelfs 64 bit. 855 00:40:22,220 --> 00:40:25,230 Maar als er een oneindige aantal echte numbers-- 856 00:40:25,230 --> 00:40:27,940 getallen met cijfers achter de komma en nummers thereafter-- zeker 857 00:40:27,940 --> 00:40:29,380 je kunt niet alles van hen te vertegenwoordigen. 858 00:40:29,380 --> 00:40:32,870 Dus de computer heeft gegeven ons die het dichtst aanleunt 859 00:40:32,870 --> 00:40:37,090 de waarde kan voorstellen via dat veel bits om de waarde ik eigenlijk wil, 860 00:40:37,090 --> 00:40:38,690 die 0.1. 861 00:40:38,690 --> 00:40:40,685 >> Helaas, als je gaan doen wiskunde, of u 862 00:40:40,685 --> 00:40:44,360 beginnen met dit soort van zwevende puntwaarden in belangrijke programs-- 863 00:40:44,360 --> 00:40:46,770 financiële software, militaire software-- iets 864 00:40:46,770 --> 00:40:49,090 wanneer waarneming waarschijnlijk vrij belangrijk. 865 00:40:49,090 --> 00:40:51,520 En u beginnen met het toevoegen nummers als deze, en start 866 00:40:51,520 --> 00:40:54,050 draait die software met echt grote ingangen 867 00:40:54,050 --> 00:40:56,890 of voor tal van uren of veel dagen of vele jaren, 868 00:40:56,890 --> 00:41:01,060 deze kleine foutjes zeker kan oplopen in de tijd. 869 00:41:01,060 --> 00:41:04,252 >> Nu nog even terzijde, als je ooit hebt gezien Superman 3 of Office Space 870 00:41:04,252 --> 00:41:05,960 en je zou herinneren hoe die jongens gestolen 871 00:41:05,960 --> 00:41:08,668 een hoop geld uit hun computer met drijvendekommagetallen 872 00:41:08,668 --> 00:41:11,290 en het toevoegen van het kleine restanten, hopelijk die film 873 00:41:11,290 --> 00:41:12,390 maakt nu meer zin. 874 00:41:12,390 --> 00:41:14,930 Dit is wat ze waren zinspelend op in die film. 875 00:41:14,930 --> 00:41:16,710 Het feit dat de meeste bedrijven zou niet kijken 876 00:41:16,710 --> 00:41:18,600 na een aantal achter de komma, 877 00:41:18,600 --> 00:41:20,009 maar dat zijn fracties van centen. 878 00:41:20,009 --> 00:41:22,550 Dus je begint te tellen, je begint om veel geld te verdienen 879 00:41:22,550 --> 00:41:23,424 op uw bankrekening. 880 00:41:23,424 --> 00:41:25,160 Dus dat is Office Space uitgelegd. 881 00:41:25,160 --> 00:41:28,220 >> Nu helaas voorbij Office Space, er 882 00:41:28,220 --> 00:41:31,794 zijn enkele legitieme verontrustend en significante effecten 883 00:41:31,794 --> 00:41:33,710 van dergelijke onderliggende ontwerp beslissingen, 884 00:41:33,710 --> 00:41:35,990 en inderdaad een van de redenen we C gedurende 885 00:41:35,990 --> 00:41:39,640 wordt, zodat je echt moet deze grond tot begrip van hoe computers werken, 886 00:41:39,640 --> 00:41:42,440 hoe software werkt, en niet neem niets voor lief. 887 00:41:42,440 --> 00:41:45,820 >> En inderdaad nog, zelfs met dat fundamenteel begrip, 888 00:41:45,820 --> 00:41:47,370 wij mensen maken fouten. 889 00:41:47,370 --> 00:41:51,310 En wat ik dacht dat ik zou delen is Dit acht minuten durende video hier genomen 890 00:41:51,310 --> 00:41:56,980 van een Modern Marvels episode, die een educatieve show on hoe dingen werken 891 00:41:56,980 --> 00:42:00,370 dat schildert twee foto's wanneer een oneigenlijk gebruik 892 00:42:00,370 --> 00:42:02,540 en begrip van floating point waarden 893 00:42:02,540 --> 00:42:05,610 genoopt tot ingrijpende ongelukkige resultaten. 894 00:42:05,610 --> 00:42:06,363 Laten we eens een kijkje nemen. 895 00:42:06,363 --> 00:42:07,029 [VIDEO AFSPELEN] 896 00:42:07,029 --> 00:42:11,290 -We nu terug naar "engineering Rampen "op Modern Marvels. 897 00:42:11,290 --> 00:42:12,940 Computers. 898 00:42:12,940 --> 00:42:15,580 We hebben allen de te accepteren vaak frustrerende problemen 899 00:42:15,580 --> 00:42:20,960 kreeg met them-- bugs, virussen, en software glitches-- voor kleine prijzen 900 00:42:20,960 --> 00:42:23,100 betalen voor het gemak. 901 00:42:23,100 --> 00:42:27,770 Maar in high tech en high speed militaire en ruimtevaart applicaties, 902 00:42:27,770 --> 00:42:32,780 de kleinste probleem kan worden vergroot tot een ramp. 903 00:42:32,780 --> 00:42:38,880 >> Op 4 juni 1996, wetenschappers voorbereid om een ​​onbemande Ariane 5-raket te lanceren. 904 00:42:38,880 --> 00:42:41,190 Het vervoerde wetenschappelijke satellieten ontworpen 905 00:42:41,190 --> 00:42:44,570 precies hoe de stand Aardmagnetische veld interageert 906 00:42:44,570 --> 00:42:47,380 met zonne-wind. 907 00:42:47,380 --> 00:42:50,580 De raket werd gebouwd voor het Europees Ruimte-Agentschap, 908 00:42:50,580 --> 00:42:54,400 en opgestegen vanaf de faciliteit aan de kust van Frans-Guyana. 909 00:42:54,400 --> 00:42:57,520 >> -at Ongeveer 37 seconden in de vlucht, ze eerst 910 00:42:57,520 --> 00:42:59,070 merkte dat er iets ging verkeerd. 911 00:42:59,070 --> 00:43:02,240 Dat de sproeiers waren draaibare op een manier dat ze echt niet moeten doen. 912 00:43:02,240 --> 00:43:06,550 Ongeveer 40 seconden in de vlucht, duidelijk het voertuig in de problemen zat, 913 00:43:06,550 --> 00:43:08,820 en dat is wanneer ze gemaakt de beslissing om het te vernietigen. 914 00:43:08,820 --> 00:43:12,370 De veiligheidsfunctionaris range, met enorme lef, drukte op de knop 915 00:43:12,370 --> 00:43:18,030 en blies de raket voordat het kon uitgegroeid tot een gevaar voor de openbare veiligheid. 916 00:43:18,030 --> 00:43:21,010 >> -Dit was het meisje reis van de Ariane 5, 917 00:43:21,010 --> 00:43:23,920 en de vernietiging nam plaats als gevolg van de fout 918 00:43:23,920 --> 00:43:25,932 ingebed in de software van de raket. 919 00:43:25,932 --> 00:43:27,640 -De Probleem op de Ariane was dat er 920 00:43:27,640 --> 00:43:30,500 een getal dat nodig is 64 bits uit te drukken, 921 00:43:30,500 --> 00:43:33,560 en ze wilden om te zetten naar een 16-bits getal. 922 00:43:33,560 --> 00:43:36,820 Zij verondersteld dat het aantal was nooit erg groot te zijn. 923 00:43:36,820 --> 00:43:40,940 Dat de meeste van deze cijfers de 64-bits getal waren nullen. 924 00:43:40,940 --> 00:43:42,450 Ze hadden het mis. 925 00:43:42,450 --> 00:43:45,000 >> -De Onvermogen van een softwareprogramma accepteren 926 00:43:45,000 --> 00:43:49,460 het soort getal gegenereerd door een ander was aan de basis van de mislukking. 927 00:43:49,460 --> 00:43:54,260 Software ontwikkeling was geworden van een zeer kostbaar onderdeel van de nieuwe technologie. 928 00:43:54,260 --> 00:43:57,060 De Ariane 4-raket had zeer succesvol geweest. 929 00:43:57,060 --> 00:44:01,600 Veel van de software gemaakt voor het werd ook gebruikt in de Ariane 5. 930 00:44:01,600 --> 00:44:04,790 >> -het Basisprobleem dat was de Ariane 5. 931 00:44:04,790 --> 00:44:11,200 Werd faster-- sneller versneld, en De software was niet goed voor dat. 932 00:44:11,200 --> 00:44:14,910 >> -De Vernietiging van de raket was een enorme financiële ramp. 933 00:44:14,910 --> 00:44:18,630 Allemaal te wijten aan een minuut softwarefout. 934 00:44:18,630 --> 00:44:21,160 Maar dit was niet de eerste time data conversie problemen 935 00:44:21,160 --> 00:44:24,770 had moderne rakettechnologie geplaagd. 936 00:44:24,770 --> 00:44:28,020 >> -In 1991 met de start van de eerste Golfoorlog, 937 00:44:28,020 --> 00:44:30,540 de Patriot raket ondervonden soortgelijke aard 938 00:44:30,540 --> 00:44:32,465 een nummerconversie probleem. 939 00:44:32,465 --> 00:44:36,760 En als gevolg daarvan 28 mensen-- 28 Amerikaanse soldiers-- werden gedood, 940 00:44:36,760 --> 00:44:39,010 en ongeveer honderd anderen gewond. 941 00:44:39,010 --> 00:44:42,830 Wanneer de Patriot, die verondersteld werd te beschermen tegen inkomende Scuds, 942 00:44:42,830 --> 00:44:45,780 niet in geslaagd een raket afvuren. 943 00:44:45,780 --> 00:44:51,610 >> -Wanneer Irak Koeweit binnenviel, en Amerika gelanceerd Desert Storm in het begin van 1991, 944 00:44:51,610 --> 00:44:55,720 Patriot raket batterijen werden ingezet te beschermen Saoedi-Arabië en Israël 945 00:44:55,720 --> 00:44:59,180 van Iraakse Scud raket aanvallen. 946 00:44:59,180 --> 00:45:03,080 De Patriot is een Amerikaanse medium-range surface-to-air-systeem 947 00:45:03,080 --> 00:45:06,530 vervaardigd door Raytheon bedrijf. 948 00:45:06,530 --> 00:45:09,500 >> -De Grootte van de Patriot interceptor itself-- 949 00:45:09,500 --> 00:45:14,705 het gaat over ongeveer 20 meter lang, en hij weegt ongeveer 2.000 kilo. 950 00:45:14,705 --> 00:45:19,090 En het draagt ​​een kernkop van over, Ik denk dat het ongeveer £ 150. 951 00:45:19,090 --> 00:45:23,880 En de kernkop zelf is een hoog explosief, die 952 00:45:23,880 --> 00:45:26,700 heeft fragmenten om hem heen. 953 00:45:26,700 --> 00:45:31,630 Dus de behuizing van de kernkop is ontworpen om te fungeren als een grove hagel. 954 00:45:31,630 --> 00:45:34,040 >> -De Raketten worden uitgevoerd vier per container, 955 00:45:34,040 --> 00:45:37,170 en worden vervoerd door een oplegger. 956 00:45:37,170 --> 00:45:44,880 >> -The Patriot anti-raket systeem gaat terug nu minstens 20 jaar. 957 00:45:44,880 --> 00:45:48,380 Het werd oorspronkelijk ontworpen als luchtafweer raket 958 00:45:48,380 --> 00:45:50,810 neer te schieten vijandelijke vliegtuigen. 959 00:45:50,810 --> 00:45:54,410 In de eerste Golfoorlog toen die oorlog kwam op, 960 00:45:54,410 --> 00:45:59,650 het leger wilde gebruiken om neer te schieten Scuds, geen vliegtuigen. 961 00:45:59,650 --> 00:46:03,580 De Iraakse luchtmacht was niet zo veel van een probleem, 962 00:46:03,580 --> 00:46:06,590 maar het leger was bezorgd over Scuds. 963 00:46:06,590 --> 00:46:10,120 En dus probeerden ze een upgrade van de Patriot. 964 00:46:10,120 --> 00:46:12,740 >> -Intercepting Een vijand raket reizen op Mach 5 965 00:46:12,740 --> 00:46:15,670 zou genoeg zijn uitdagend. 966 00:46:15,670 --> 00:46:18,440 Maar toen de Patriot werd in allerijl in gebruik, 967 00:46:18,440 --> 00:46:22,580 het leger was zich niet bewust van een Iraakse wijziging die 968 00:46:22,580 --> 00:46:25,880 maakten hun Scuds bijna onmogelijk om. 969 00:46:25,880 --> 00:46:30,690 >> Wat gebeurd is, is de Scuds dat kwamen in waren instabiel. 970 00:46:30,690 --> 00:46:32,000 Ze waren wiebelig. 971 00:46:32,000 --> 00:46:37,210 De reden hiervoor was Iraqis-- om 600 kilometer weg te gaan 972 00:46:37,210 --> 00:46:41,680 van een 300 kilometer lange range missile-- nam het gewicht van de voorste kernkop, 973 00:46:41,680 --> 00:46:43,340 en maakte de kernkop lichter. 974 00:46:43,340 --> 00:46:48,490 Dus nu de Patriot's proberen te komen het Scud, en de meeste tijd-- 975 00:46:48,490 --> 00:46:52,880 de overgrote meerderheid van de tijd-- het zou gewoon vliegen door de Scud. 976 00:46:52,880 --> 00:46:57,120 >> -once De Patriot netbeheerders realiseerde de Patriot miste zijn doel, 977 00:46:57,120 --> 00:47:01,630 ze ontploft de Patriot's kernkop mogelijke ongevallen of vermijden 978 00:47:01,630 --> 00:47:04,440 Men liet de grond vallen. 979 00:47:04,440 --> 00:47:08,700 >> Dat was wat de meeste mensen zagen als grote vuurballen in de lucht, 980 00:47:08,700 --> 00:47:14,180 en verkeerd begrepen als onderschept van Scud kernkoppen. 981 00:47:14,180 --> 00:47:18,020 >> -hoewel In de nachtelijke hemel, de Patriotten bleek succesvol te vernietigen 982 00:47:18,020 --> 00:47:23,280 Scuds, bij Dhahran kunnen er geen misverstand over zijn prestaties. 983 00:47:23,280 --> 00:47:27,930 Daar de Patriot's radarsysteem verloren spoor van een inkomende Scud 984 00:47:27,930 --> 00:47:30,260 en nooit te wijten gelanceerd om een ​​software fout. 985 00:47:30,260 --> 00:47:34,060 986 00:47:34,060 --> 00:47:38,880 >> Het was de Israëli's die voor het eerst ontdekt dat hoe langer het systeem op, 987 00:47:38,880 --> 00:47:41,130 hoe groter de tijd discrepantie werd. 988 00:47:41,130 --> 00:47:44,770 Door een klok ingebed in de computer van het systeem. 989 00:47:44,770 --> 00:47:48,190 >> -Ongeveer Twee weken voor de tragedie in Dhahran, 990 00:47:48,190 --> 00:47:50,720 de Israëli's gemeld aan het ministerie van Defensie 991 00:47:50,720 --> 00:47:52,410 dat het systeem de tijd aan het verliezen was. 992 00:47:52,410 --> 00:47:54,410 Na ongeveer acht uur van het lopen, zag ze 993 00:47:54,410 --> 00:47:57,690 dat het systeem van steeds aanmerkelijk minder nauwkeurig. 994 00:47:57,690 --> 00:48:01,850 Het ministerie van Defensie reageerde door te vertellen al van de Patriot batterijen 995 00:48:01,850 --> 00:48:04,800 niet verlaten systemen voor een lange tijd. 996 00:48:04,800 --> 00:48:06,980 Ze zei nooit wat een lange tijd was. 997 00:48:06,980 --> 00:48:09,140 8 uur, 10 uur, duizend uur. 998 00:48:09,140 --> 00:48:11,300 Niemand wist. 999 00:48:11,300 --> 00:48:13,320 >> -De Patriot batterij gestationeerd op de kazerne 1000 00:48:13,320 --> 00:48:18,310 bij Dhahran en zijn gebrekkige interne klok is zo'n meer dan 100 uur 1001 00:48:18,310 --> 00:48:21,520 Op de avond van 25 februari. 1002 00:48:21,520 --> 00:48:25,792 >> -Het Bijgehouden tijd met een nauwkeurigheid van ongeveer een tiende van een seconde. 1003 00:48:25,792 --> 00:48:27,950 Als een tiende van een seconde is een interessant getal 1004 00:48:27,950 --> 00:48:31,850 want het kan niet worden uitgedrukt in binaire precies die 1005 00:48:31,850 --> 00:48:36,500 betekent kan niet exact worden uitgedrukt in elke moderne digitale computer. 1006 00:48:36,500 --> 00:48:41,070 Het is moeilijk te geloven, maar Gebruik dit als een voorbeeld. 1007 00:48:41,070 --> 00:48:43,420 >> Laten we de nummer een derde. 1008 00:48:43,420 --> 00:48:47,330 Een derde kan niet worden uitgedrukt in decimale precies. 1009 00:48:47,330 --> 00:48:52,060 Een derde is 0.333 gaande voor oneindigheid. 1010 00:48:52,060 --> 00:48:56,420 Er is geen manier om dat te doen met absolute nauwkeurigheid in een decimaal. 1011 00:48:56,420 --> 00:48:59,530 Dat is precies het soort problemen dat gebeurde in de Patriot. 1012 00:48:59,530 --> 00:49:04,040 Hoe langer het systeem liep, de slechter de tijdfout werd. 1013 00:49:04,040 --> 00:49:08,840 >> -Na 100 uren van de werking, de fout in de tijd was slechts ongeveer een derde 1014 00:49:08,840 --> 00:49:10,440 seconde. 1015 00:49:10,440 --> 00:49:14,150 Maar in termen van zich te richten een raket reizen op Mach 5, 1016 00:49:14,150 --> 00:49:18,560 het resulteerde in een tracking fout van meer dan 600 meter. 1017 00:49:18,560 --> 00:49:21,870 Het zou een fatale fout zijn voor de soldaten aan Dhahran. 1018 00:49:21,870 --> 00:49:28,455 >> Wat is er gebeurd is een Scud lancering was gedetecteerd door vroegtijdige waarschuwing satellieten 1019 00:49:28,455 --> 00:49:32,710 en ze wisten een Scud kwam in de algemene richting. 1020 00:49:32,710 --> 00:49:35,150 Ze wisten niet waar het vandaan kwam. 1021 00:49:35,150 --> 00:49:38,210 Het was nu aan de radar component van het Patriot-systeem 1022 00:49:38,210 --> 00:49:43,150 verdedigen Dhahran te vinden en te houden spoor van de inkomende vijandelijke raketten. 1023 00:49:43,150 --> 00:49:44,561 >> -De Radar was erg slim. 1024 00:49:44,561 --> 00:49:46,560 Het zou eigenlijk bijhouden de positie van de Scud 1025 00:49:46,560 --> 00:49:48,930 en dan voorspellen waar het waarschijnlijk zou zijn 1026 00:49:48,930 --> 00:49:51,380 de volgende keer radar stuurde een puls uit. 1027 00:49:51,380 --> 00:49:53,040 Dat werd het gamma poort genoemd. 1028 00:49:53,040 --> 00:49:57,620 >> -Dan Zodra de Patriot beslist genoeg tijd heeft 1029 00:49:57,620 --> 00:50:02,400 doorgegeven om terug te gaan en controleer de volgende locatie voor dit gedetecteerde object 1030 00:50:02,400 --> 00:50:03,550 het gaat terug. 1031 00:50:03,550 --> 00:50:07,820 Dus als het ging terug naar de verkeerde plaats het dan ziet geen object. 1032 00:50:07,820 --> 00:50:10,360 En hij beslist dat er geen object. 1033 00:50:10,360 --> 00:50:13,630 Dat was er een valse detectie en het laat de baan. 1034 00:50:13,630 --> 00:50:16,970 >> -het Inkomende Scud verdwenen van het radarscherm, 1035 00:50:16,970 --> 00:50:20,200 en seconden later, sloeg in de kazerne. 1036 00:50:20,200 --> 00:50:22,570 De Scud gedood 28. 1037 00:50:22,570 --> 00:50:26,110 Het was de laatste ontslagen tijdens de eerste Golfoorlog. 1038 00:50:26,110 --> 00:50:31,920 Tragisch, de bijgewerkte software aangekomen in de vroege ochtend op de volgende dag. 1039 00:50:31,920 --> 00:50:34,870 De software fout had al vast, sluiten 1040 00:50:34,870 --> 00:50:39,150 een hoofdstuk in de onrustige geschiedenis van de Patriot raket. 1041 00:50:39,150 --> 00:50:40,030 >> [END VIDEO AFSPELEN] 1042 00:50:40,030 --> 00:50:41,488 >> DAVID J. MALAN: Dat is het voor CS50. 1043 00:50:41,488 --> 00:50:42,820 Wij zullen u op woensdag. 1044 00:50:42,820 --> 00:50:46,420 1045 00:50:46,420 --> 00:50:50,370 >> [Muziek] 1046 00:50:50,370 --> 00:54:23,446