1 00:00:00,000 --> 00:00:10,920 >> [Muziek] 2 00:00:10,920 --> 00:00:14,680 >> DAVID J Malan: Oke, welkom terug naar CS50. 3 00:00:14,680 --> 00:00:16,500 Dit is het begin van de week twee. 4 00:00:16,500 --> 00:00:18,940 Het woord van een van onze vrienden op de campus - 5 00:00:18,940 --> 00:00:22,620 als je geïnteresseerd bent, eventueel, ofwel nu of in de toekomst termijn 6 00:00:22,620 --> 00:00:25,670 nog, eenmaal comfortabeler, onderwijs middelbare scholieren een beetje 7 00:00:25,670 --> 00:00:27,680 iets over informatica, doen hoofd naar die URL. 8 00:00:27,680 --> 00:00:32,360 Ze zijn in het bijzonder behoefte op dit moment van leraren, vooral als u 9 00:00:32,360 --> 00:00:34,700 had enkele blootstelling aan de informatica. 10 00:00:34,700 --> 00:00:38,060 >> Zo herinneren dat vorige keer, we geïntroduceerd een aantal gegevenstypes C en 11 00:00:38,060 --> 00:00:40,590 je kan zijn begonnen om uw handen vuil met deze tot nu toe 12 00:00:40,590 --> 00:00:41,940 in probleem set een. 13 00:00:41,940 --> 00:00:43,230 En we hadden een char. 14 00:00:43,230 --> 00:00:49,100 Dus in ietwat technische termen, wat is een char zoals u weet het vandaag? 15 00:00:49,100 --> 00:00:51,050 >> Dus het is een karakter, maar laten we zijn nu nauwkeuriger. 16 00:00:51,050 --> 00:00:53,735 Wat bedoelen we met karakter of individuele char? 17 00:00:53,735 --> 00:00:56,700 18 00:00:56,700 --> 00:00:59,500 Een niet-numeriek karakter - 19 00:00:59,500 --> 00:01:00,670 dus niet noodzakelijk. 20 00:01:00,670 --> 00:01:04,580 Het blijkt dat zelfs nummers, zelfs leestekens en letters zijn 21 00:01:04,580 --> 00:01:06,980 weergegeven met de gegevens Typ bekend als char. 22 00:01:06,980 --> 00:01:09,440 Dus het is niet per se alfabetisch. 23 00:01:09,440 --> 00:01:11,100 Yeah? 24 00:01:11,100 --> 00:01:12,275 >> Dus het is een ASCII-teken. 25 00:01:12,275 --> 00:01:15,510 Dus als je terugdenkt aan week nul, wanneer we hadden onze byte van vrijwilligers 26 00:01:15,510 --> 00:01:19,150 komen en of houden hun handen omhoog of niet alle, vertegenwoordigde ze bits. 27 00:01:19,150 --> 00:01:22,450 Maar gezamenlijk als een groep van acht, zij vertegenwoordigen een byte. 28 00:01:22,450 --> 00:01:26,030 En we de notie van ASCII geïntroduceerd bij die lezing, dat is gewoon een 29 00:01:26,030 --> 00:01:28,170 mapping tussen cijfers en letters. 30 00:01:28,170 --> 00:01:32,010 En ASCII toepassingen, zoals die mensen impliciete, acht bits 31 00:01:32,010 --> 00:01:33,660 om een ​​teken te vertegenwoordigen. 32 00:01:33,660 --> 00:01:36,890 >> Dus daarom, als acht bits kan elk op een van twee waarden - 33 00:01:36,890 --> 00:01:38,010 nul of een - 34 00:01:38,010 --> 00:01:40,280 dat betekent dat er waren twee mogelijkheden voor deze persoon - 35 00:01:40,280 --> 00:01:41,230 nul of een - 36 00:01:41,230 --> 00:01:44,070 twee voor deze persoon, twee voor deze persoon, twee voor deze ene. 37 00:01:44,070 --> 00:01:47,450 Dus in totaal twee keer tweemaal twee maal twee maal twee - 38 00:01:47,450 --> 00:01:49,700 dus twee van de achtste in totaal. 39 00:01:49,700 --> 00:01:54,320 Dus er is een aantal tekens 256 mogelijk dat u kunt 40 00:01:54,320 --> 00:01:55,750 vertegenwoordigen met acht bits. 41 00:01:55,750 --> 00:01:59,210 >> Nu, diegenen van jullie die Aziatische spreken talen zouden weten, dat er meer 42 00:01:59,210 --> 00:02:02,620 tekens in de wereld dan Als en B's en C's en Ds. 43 00:02:02,620 --> 00:02:06,130 En inderdaad, ASCII is niet voldoende voor veel talen van de wereld. 44 00:02:06,130 --> 00:02:07,760 Maar meer daarover een andere keer. 45 00:02:07,760 --> 00:02:11,240 Voor nu, weten dat in C als je wilt om een ​​brief, een stuk vertegenwoordigen 46 00:02:11,240 --> 00:02:15,780 interpunctie, of gewoon iets karakter in de natuur, maken we gebruik van een char. 47 00:02:15,780 --> 00:02:18,240 En het is een byte of acht bits. 48 00:02:18,240 --> 00:02:19,690 >> Hoe zit het met een int? 49 00:02:19,690 --> 00:02:20,780 Nou ja, een int is een geheel getal. 50 00:02:20,780 --> 00:02:23,175 Hoeveel bits, als u herinneren, is een integer typisch? 51 00:02:23,175 --> 00:02:25,930 52 00:02:25,930 --> 00:02:27,512 Iedereen recall? 53 00:02:27,512 --> 00:02:29,600 Dus het is meestal 32. 54 00:02:29,600 --> 00:02:32,120 Het hangt eigenlijk op de computer dat u gebruikt. 55 00:02:32,120 --> 00:02:35,770 Maar in het toestel, en in veel computers, het is 32 bits of vier 56 00:02:35,770 --> 00:02:37,140 bytes - acht keer vier. 57 00:02:37,140 --> 00:02:39,790 En ints worden alleen gebruikt voor het opslaan van aantallen, hetzij negatief, 58 00:02:39,790 --> 00:02:41,610 positief of nul. 59 00:02:41,610 --> 00:02:45,250 >> En als je hebt 32 bits en u alleen zorg over positieve getallen, kan 60 00:02:45,250 --> 00:02:48,960 iedereen marge hoeveel mogelijk integers een computer kan vertegenwoordigen van 61 00:02:48,960 --> 00:02:51,820 nul op maximaal? 62 00:02:51,820 --> 00:02:56,130 Zo zou de 32 twee zijn, die is ongeveer vier miljard euro. 63 00:02:56,130 --> 00:02:59,720 Dus deze machten van twee gaan worden terugkerende thema's in de informatica. 64 00:02:59,720 --> 00:03:03,930 Zoals we zullen zien, ze zijn heel handig om mee te werken, zelfs als het is niet helemaal 65 00:03:03,930 --> 00:03:05,790 makkelijk om de wiskunde te doen in je hoofd. 66 00:03:05,790 --> 00:03:07,000 >> Dus we grofweg 4000000000 zeggen. 67 00:03:07,000 --> 00:03:08,620 Nu, een lange lange - 68 00:03:08,620 --> 00:03:09,770 je kan soort gok. 69 00:03:09,770 --> 00:03:10,480 Het is langer dan een int. 70 00:03:10,480 --> 00:03:12,440 Hoeveel bits? 71 00:03:12,440 --> 00:03:14,250 Dus 64 bits of acht bytes. 72 00:03:14,250 --> 00:03:17,480 Dit betekent gewoon dat je kunt zelfs vertegenwoordigen grotere aantallen, groter positief of 73 00:03:17,480 --> 00:03:19,160 grotere negatieve getallen. 74 00:03:19,160 --> 00:03:20,060 >> En hoe zit het drijven? 75 00:03:20,060 --> 00:03:22,260 Dat is een floating point waarde van 32 bits. 76 00:03:22,260 --> 00:03:25,180 Dit is slechts een reëel getal, iets met een decimale punt. 77 00:03:25,180 --> 00:03:30,100 Maar als je in plaats daarvan moet meer plaatsen na de komma of u wilt 78 00:03:30,100 --> 00:03:33,720 vertegenwoordigen een groter aantal met enkele fractie na, kunt u gebruik maken van een 79 00:03:33,720 --> 00:03:36,260 dubbele, die 64 bits. 80 00:03:36,260 --> 00:03:38,240 >> Maar er is een interessante afhaalmaaltijden hier. 81 00:03:38,240 --> 00:03:42,890 Als ints worden beperkt door 32 bits en zelfs lang longs worden beperkt door 64 82 00:03:42,890 --> 00:03:46,180 beetjes, dat soort roept de vraag, wat als je eigenlijk wilt tellen 83 00:03:46,180 --> 00:03:48,790 hoger dan 4 miljard euro voor een int? 84 00:03:48,790 --> 00:03:50,330 Nou, je gewoon gebruik maken van een lange lange. 85 00:03:50,330 --> 00:03:54,200 Maar wat als je wilt een hogere tellen dan twee op de 64e, geven of nemen? 86 00:03:54,200 --> 00:03:55,810 >> Nu, dat is een enorm aantal. 87 00:03:55,810 --> 00:03:59,250 Maar uiteindelijk, zou je eigenlijk zorg over dit soort waarden, 88 00:03:59,250 --> 00:04:03,070 vooral als u gebruik maakt van een database en beginnen te veel en veel te verzamelen 89 00:04:03,070 --> 00:04:06,190 en tal van gegevens en toewijzen van unieke nummers om elk stukje van die gegevens. 90 00:04:06,190 --> 00:04:07,430 Zo vriendelijk we van een probleem. 91 00:04:07,430 --> 00:04:10,700 En evenzo met floating point waarden - vlotters of dubbelspel - 92 00:04:10,700 --> 00:04:14,290 Als u alleen hebt een eindig aantal beetjes, hoeveel de totale aantallen kon je 93 00:04:14,290 --> 00:04:16,980 eventueel vertegenwoordigen? 94 00:04:16,980 --> 00:04:19,540 >> Nou, het is minder duidelijk wanneer je impliceren een decimale punt. 95 00:04:19,540 --> 00:04:20,899 Maar het is toch eindig. 96 00:04:20,899 --> 00:04:24,390 Als je een eindig aantal bits, een eindig aantal mensen, een eindige 97 00:04:24,390 --> 00:04:27,350 aantal lampen, zeker je kunt slechts een eindig aantal vertegenwoordigen 98 00:04:27,350 --> 00:04:28,510 floating point waarden. 99 00:04:28,510 --> 00:04:33,170 Maar hoeveel reële getallen zijn hun in de wereld? 100 00:04:33,170 --> 00:04:33,680 Er is een oneindige. 101 00:04:33,680 --> 00:04:37,280 Dus dat is een beetje een probleem, omdat we niet over een oneindige hoeveelheid 102 00:04:37,280 --> 00:04:39,970 geheugen of RAM binnenkant van onze computers. 103 00:04:39,970 --> 00:04:41,780 Dus sommige uitdagende dingen kunnen gebeuren. 104 00:04:41,780 --> 00:04:43,900 >> Dus laten we gaan je gang en probeer deze uitdrukking hier. 105 00:04:43,900 --> 00:04:46,240 Laat me ga je gang en open gedit. 106 00:04:46,240 --> 00:04:50,360 Ik ga om te gaan en opslaan van een bestand genaamd "floats0.c" gewoon te zijn 107 00:04:50,360 --> 00:04:54,630 in overeenstemming met een voorbeeld dat is online beschikbaar, als je zou willen. 108 00:04:54,630 --> 00:04:58,080 En ik ga om verder te gaan en definieert het als volgt - 109 00:04:58,080 --> 00:05:01,540 Ik ga om te gaan en te zeggen, int belangrijkste leegte, zoals we vaak doen. 110 00:05:01,540 --> 00:05:07,190 >> En dan in dit programma, ga ik verklaar mezelf een float, zodat een 32-bit 111 00:05:07,190 --> 00:05:09,700 variabele genaamd f, willekeurig. 112 00:05:09,700 --> 00:05:13,910 En dan ga ik op te slaan in het Ik weet het niet, een tiende, dus 0,1. 113 00:05:13,910 --> 00:05:16,590 Dus ik ga om uit te drukken dat als een gedeeld door 10, dat perfect 114 00:05:16,590 --> 00:05:17,790 legitiem in C. 115 00:05:17,790 --> 00:05:20,460 >> En dan op de tweede regel, ik gewoon wilt afdrukken die waarde. 116 00:05:20,460 --> 00:05:22,950 Zodat herinneren dat we kunnen gebruiken het bekende printf. 117 00:05:22,950 --> 00:05:25,420 We willen niet ik gebruik% voor een int. 118 00:05:25,420 --> 00:05:28,360 We willen% f gebruiken voor een float. 119 00:05:28,360 --> 00:05:33,080 En dan ga ik doen backslash n, dicht citaat, komma, f, puntkomma. 120 00:05:33,080 --> 00:05:34,400 >> Dus hier is mijn programma. 121 00:05:34,400 --> 00:05:35,820 Er is al een bug. 122 00:05:35,820 --> 00:05:38,640 Heeft iemand voor wie dit geklikt al willen wijzen op zijn minst 123 00:05:38,640 --> 00:05:40,220 een bug die ik heb gemaakt? 124 00:05:40,220 --> 00:05:42,470 Yeah? 125 00:05:42,470 --> 00:05:42,800 Yeah. 126 00:05:42,800 --> 00:05:47,860 Ik vergat "# include" op de top, ze symptoom van die, als ik probeer te 127 00:05:47,860 --> 00:05:50,490 compileren dit gaat worden dat de compiler gaat schreeuwen tegen me, 128 00:05:50,490 --> 00:05:52,770 zeggende: undefined symbol of iets in die zin. 129 00:05:52,770 --> 00:05:55,360 Het hoeft niet iets te begrijpen zoals printf. 130 00:05:55,360 --> 00:05:59,380 >> Dus ik ga doen "# include ", Sla het bestand op. 131 00:05:59,380 --> 00:06:00,400 En nu is het beter in vorm. 132 00:06:00,400 --> 00:06:02,690 Maar ik ga ook naar punt uit een nieuw detail vandaag. 133 00:06:02,690 --> 00:06:08,620 Naast de vermelding van plaats houders zoals% f% i% s, kunt u 134 00:06:08,620 --> 00:06:12,320 soms invloed op het gedrag van die placeholder. 135 00:06:12,320 --> 00:06:15,540 Bijvoorbeeld in het geval van een zwevende puntenwaarde, als ik wil alleen maar 136 00:06:15,540 --> 00:06:22,200 met een decimaal weergegeven nadat de periode, ik kan eigenlijk doen 0.1f. 137 00:06:22,200 --> 00:06:26,830 Dus met andere woorden, I scheid de f en het procent teken met 0.1, net 138 00:06:26,830 --> 00:06:30,200 vertellen printf, zou je een hele hebt stelletje getallen na de komma 139 00:06:30,200 --> 00:06:30,930 punt voor mij. 140 00:06:30,930 --> 00:06:32,870 Maar ik wil alleen maar een van hen te zien. 141 00:06:32,870 --> 00:06:36,280 >> Dus ik ga nu verder te gaan en te besparen dit programma, ga in mijn terminal 142 00:06:36,280 --> 00:06:41,870 raam, en ik ga om verder te gaan en typ make vlotter 0, in te voeren. 143 00:06:41,870 --> 00:06:44,930 Ik zie dat enigszins cryptisch lijn die zal beginnen om meer zin te maken als we 144 00:06:44,930 --> 00:06:46,900 plagen het uit elkaar deze week en volgende. 145 00:06:46,900 --> 00:06:50,480 Nu ga ik om verder te gaan en lopen vlotter nul. 146 00:06:50,480 --> 00:06:52,020 En, verdomd. 147 00:06:52,020 --> 00:06:54,880 >> Dus er is nog een bug hier een of andere reden. 148 00:06:54,880 --> 00:07:02,490 Ik ben er vrij zeker van dat een tiende, of een gedeeld door 10, is 0.0. 149 00:07:02,490 --> 00:07:04,590 Misschien ben ik gewoon niet op zoek bij voldoende cijfers. 150 00:07:04,590 --> 00:07:08,580 Dus waarom niet ik zeg twee 0,2 tot twee te zien decimalen plaats van slechts een. 151 00:07:08,580 --> 00:07:11,810 Laat me terug naar mijn terminal venster Hier en sloeg een paar keer naar 152 00:07:11,810 --> 00:07:12,840 zie mijn geschiedenis. 153 00:07:12,840 --> 00:07:15,910 Doet zorg weer zweven nul, en dan weer omhoog. 154 00:07:15,910 --> 00:07:17,730 En nu voeren. 155 00:07:17,730 --> 00:07:20,000 >> En nu ben ik vrij zeker dat dit verkeerd is. 156 00:07:20,000 --> 00:07:23,030 En ik kon drie en vier doen, en ik ben waarschijnlijk gaat blijven zien nullen. 157 00:07:23,030 --> 00:07:24,880 Dus waar is het fout? 158 00:07:24,880 --> 00:07:27,910 Een gedeeld door 10 moet 0.1. 159 00:07:27,910 --> 00:07:30,310 Iemand wil een gooi op wat het fundamentele probleem is? 160 00:07:30,310 --> 00:07:32,400 Yeah? 161 00:07:32,400 --> 00:07:33,420 Ze zijn allebei gehele getallen. 162 00:07:33,420 --> 00:07:33,920 So what? 163 00:07:33,920 --> 00:07:37,820 Dus met een gedeeld door 10, dat is wat ik doe in de rekenkunde. 164 00:07:37,820 --> 00:07:41,185 En ik krijg 0.1. 165 00:07:41,185 --> 00:07:41,660 >> Yeah. 166 00:07:41,660 --> 00:07:43,240 En zo is het inderdaad dat probleem. 167 00:07:43,240 --> 00:07:46,700 Wanneer u een geheel getal in een computer over te nemen en je delen door een ander getal, 168 00:07:46,700 --> 00:07:50,430 de computer standaard gaat gaan ervan uit dat u wilt een integer. 169 00:07:50,430 --> 00:07:54,620 Het probleem, natuurlijk 0.1 dat geen geheel getal. 170 00:07:54,620 --> 00:07:55,680 Het is een reëel getal. 171 00:07:55,680 --> 00:07:59,610 En dus wat de computer doet door Standaard is het gewoon weggooit 172 00:07:59,610 --> 00:08:01,070 alles na de komma. 173 00:08:01,070 --> 00:08:03,380 Het maakt niet beneden af ​​te ronden of maximaal per se. 174 00:08:03,380 --> 00:08:06,480 Het gooit gewoon alles weg na de komma. 175 00:08:06,480 --> 00:08:07,430 En nu dat is logisch. 176 00:08:07,430 --> 00:08:09,740 Want nu zijn we duidelijk verliet met nul. 177 00:08:09,740 --> 00:08:10,250 >> Maar wacht eens even. 178 00:08:10,250 --> 00:08:11,840 Ik ben niet het zien van een int nul. 179 00:08:11,840 --> 00:08:14,910 Ik ben eigenlijk het zien van 0,00. 180 00:08:14,910 --> 00:08:16,340 Dus hoe kan ik nu dit te rijmen? 181 00:08:16,340 --> 00:08:22,850 Als men gedeeld door 10 is nul, maar ik ben zien van 0,00, waar wordt het steeds 182 00:08:22,850 --> 00:08:24,250 geconverteerd naar een reëel getal? 183 00:08:24,250 --> 00:08:25,500 Yeah. 184 00:08:25,500 --> 00:08:29,850 185 00:08:29,850 --> 00:08:30,630 Precies. 186 00:08:30,630 --> 00:08:35,600 >> Dus hier in lijn vijf, toen ik eigenlijk slaan dat 0.1, die dan 187 00:08:35,600 --> 00:08:39,549 afgekapt tot nul binnenkant van een vlotter, dat is effectief gelijkwaardig is aan 188 00:08:39,549 --> 00:08:42,100 slaan niet als int maar inderdaad, als float. 189 00:08:42,100 --> 00:08:46,540 Bovendien ben ik vervolgens met behulp van printf aan expliciet dat aantal afdrukken op twee 190 00:08:46,540 --> 00:08:49,740 decimalen hoewel er misschien niet eigenlijk geen. 191 00:08:49,740 --> 00:08:51,020 >> Dus dit soort zuigt, toch? 192 00:08:51,020 --> 00:08:53,640 Blijkbaar kun je niet rekenen, althans in dit niveau 193 00:08:53,640 --> 00:08:55,600 precisie in een computer. 194 00:08:55,600 --> 00:08:56,930 Maar zeker is er een oplossing. 195 00:08:56,930 --> 00:09:00,410 Wat is de eenvoudigste oplossing konden we misschien doen, zelfs gewoon intuïtief hier om 196 00:09:00,410 --> 00:09:01,130 dit oplossen? 197 00:09:01,130 --> 00:09:02,380 Yeah? 198 00:09:02,380 --> 00:09:04,700 199 00:09:04,700 --> 00:09:06,574 Draai de gehele getallen in - 200 00:09:06,574 --> 00:09:06,976 ja. 201 00:09:06,976 --> 00:09:10,420 Zelfs als ik ben niet helemaal zeker wat er echt aan de hand hier, als het 202 00:09:10,420 --> 00:09:13,440 fundamenteel heeft te maken met beide zijnde ints, goed, waarom doe ik niet 203 00:09:13,440 --> 00:09:18,230 maken dat 10,0, waardoor deze 1.0, het bestand opslaan. 204 00:09:18,230 --> 00:09:20,990 Laat me gaan terug naar de bodem en hercompileren. 205 00:09:20,990 --> 00:09:23,030 Laat me nu opnieuw uitvoeren. 206 00:09:23,030 --> 00:09:23,420 En er - 207 00:09:23,420 --> 00:09:27,690 nu, ik heb mijn tiende kreeg weergegeven als 0.10. 208 00:09:27,690 --> 00:09:28,420 >> Oke. 209 00:09:28,420 --> 00:09:29,220 Dus dat is niet slecht. 210 00:09:29,220 --> 00:09:31,730 En wil ik erop wijzen een andere kant op We konden dit hebben opgelost. 211 00:09:31,730 --> 00:09:35,580 Laat me eigenlijk terug te rollen in de tijd aan toen we dit als een 212 00:09:35,580 --> 00:09:36,680 tiende een moment geleden. 213 00:09:36,680 --> 00:09:40,800 En laat me gaan en opnieuw op te slaan dit bestand als een andere bestandsnaam, gewoon om te 214 00:09:40,800 --> 00:09:41,750 hebben een kleine controlepost. 215 00:09:41,750 --> 00:09:43,450 Dus dat was een versie. 216 00:09:43,450 --> 00:09:45,520 En nu laat ik verder gaan en doe nog een versie. 217 00:09:45,520 --> 00:09:48,540 We zullen deze versie noemen twee nul geïndexeerd. 218 00:09:48,540 --> 00:09:51,280 >> En ik ga in plaats daarvan doen deze - weet je wat? 219 00:09:51,280 --> 00:09:54,400 Het toevoegen dot zero werkt in dit geval. 220 00:09:54,400 --> 00:09:56,060 Maar stel dat men een variabele. 221 00:09:56,060 --> 00:09:57,680 Verondersteld 10 waren een variabele. 222 00:09:57,680 --> 00:10:00,680 Met andere woorden, stel dat ik niet kon gewoon moeilijk-code 0,0 aan het eind 223 00:10:00,680 --> 00:10:02,340 van deze rekenkundige expressie. 224 00:10:02,340 --> 00:10:05,820 Nou, ik kan eigenlijk iets doen haakjes genoemd gieten. 225 00:10:05,820 --> 00:10:11,920 Ik kan uitbrengen dat getal 10 een float, en ik kan dat integer men wierp een 226 00:10:11,920 --> 00:10:12,800 zweven, als goed. 227 00:10:12,800 --> 00:10:17,190 Dan is de wiskunde dat gaat gebeuren effectief 1,0 gedeeld door 10,0, 228 00:10:17,190 --> 00:10:19,250 het resultaat daarvan gaat in f als voorheen. 229 00:10:19,250 --> 00:10:26,130 Dus als ik opnieuw compileren dit als drijvers maken 2, en nu drijft 2, dezelfde krijg ik 230 00:10:26,130 --> 00:10:27,020 beantwoorden, als goed. 231 00:10:27,020 --> 00:10:29,640 >> Dit is dus een vrij gekunsteld voorbeeld, dit probleem oplossen 232 00:10:29,640 --> 00:10:31,400 door de invoering gieten. 233 00:10:31,400 --> 00:10:34,410 Maar in het algemeen, casting gaat worden een krachtig ding, met name voor 234 00:10:34,410 --> 00:10:38,180 probleem set twee in een week tijd, toen U wilt een gegevenstype converteren naar 235 00:10:38,180 --> 00:10:41,800 andere die aan het eind van de dag worden in dezelfde manier. 236 00:10:41,800 --> 00:10:44,970 Aan het eind van de dag, elke wat we hebben gesproken over tot nu toe is 237 00:10:44,970 --> 00:10:46,710 net ints onder de motorkap. 238 00:10:46,710 --> 00:10:48,950 Of als dat te laag niveau voor je, ze zijn gewoon nummers 239 00:10:48,950 --> 00:10:49,750 onder de motorkap. 240 00:10:49,750 --> 00:10:52,850 Zelfs personages, nogmaals, herinneren van week nul zijn nummers 241 00:10:52,850 --> 00:10:53,990 onder de motorkap. 242 00:10:53,990 --> 00:10:57,240 >> Dat wil zeggen, we kunnen omzetten tussen verschillende soorten nummers als 243 00:10:57,240 --> 00:10:58,060 ze zijn gewoon stukjes. 244 00:10:58,060 --> 00:11:01,020 We kunnen zetten tussen nummers en brieven als ze gewoon 245 00:11:01,020 --> 00:11:02,580 bits en vice versa. 246 00:11:02,580 --> 00:11:07,170 En gieten op deze manier een mechanisme in de programmering waarmee je met geweld 247 00:11:07,170 --> 00:11:10,970 wijzigen ene gegevenstype naar het andere. 248 00:11:10,970 --> 00:11:14,570 Helaas is dit niet zo eenvoudig als ik zou hebben gewild. 249 00:11:14,570 --> 00:11:19,220 >> Ik ga terug in praalwagens 1, die het eenvoudiger, 250 00:11:19,220 --> 00:11:22,830 ongecompliceerd een met 0,0 toegevoegd aan elk. 251 00:11:22,830 --> 00:11:25,260 En net als een snelle opfriscursus, laat me gaan en opnieuw compileren 252 00:11:25,260 --> 00:11:27,670 deze, maken praalwagens 2 - 253 00:11:27,670 --> 00:11:30,300 sorry, dit is te maken praalwagens 1. 254 00:11:30,300 --> 00:11:32,050 En nu laten we lopen praalwagens 1. 255 00:11:32,050 --> 00:11:34,810 En in de bodem, merkt dat ik inderdaad krijg 0.1. 256 00:11:34,810 --> 00:11:36,165 Dus, probleem opgelost. 257 00:11:36,165 --> 00:11:37,280 >> Maar nog niet. 258 00:11:37,280 --> 00:11:40,000 Ik ga nu een beetje nieuwsgierig te krijgen, en ik ga terug naar mijn 259 00:11:40,000 --> 00:11:41,620 printf statement en zeg, weet je wat? 260 00:11:41,620 --> 00:11:44,090 Ik zou willen dat dit te bevestigen is echt een tiende. 261 00:11:44,090 --> 00:11:47,890 En ik ga dit willen zien naar, zeg, vijf decimalen. 262 00:11:47,890 --> 00:11:48,570 Het is geen probleem. 263 00:11:48,570 --> 00:11:52,020 Ik verander de twee tot vijf, Ik compileren met make. 264 00:11:52,020 --> 00:11:53,770 Ik start het opnieuw op als drijft 1. 265 00:11:53,770 --> 00:11:54,990 Ziet er goed uit. 266 00:11:54,990 --> 00:11:58,570 Mijn sanity checks er misschien een einde, maar Ik word een beetje meer avontuurlijk. 267 00:11:58,570 --> 00:12:00,330 Ik ga naar 0.5 veranderen naar 0.10. 268 00:12:00,330 --> 00:12:03,440 Ik wil 10 cijfers zien na het decimaal. 269 00:12:03,440 --> 00:12:09,060 >> En ik ga om verder te gaan en opnieuw te compileren deze en voer drijft 1. 270 00:12:09,060 --> 00:12:13,060 Ik soort van spijt te hebben dit getest verder, want mijn wiskunde is niet zo 271 00:12:13,060 --> 00:12:14,320 corrigeren meer, lijkt het. 272 00:12:14,320 --> 00:12:15,630 Maar wacht eens even, misschien dat is gewoon een toevalstreffer. 273 00:12:15,630 --> 00:12:17,810 Misschien is de computer optreedt een beetje vreemd. 274 00:12:17,810 --> 00:12:21,810 Laat me ga je gang en doe 20 decimalen en geruststellen mezelf dat ik weet 275 00:12:21,810 --> 00:12:22,540 hoe wiskunde te doen. 276 00:12:22,540 --> 00:12:23,460 Ik weet hoe te programmeren. 277 00:12:23,460 --> 00:12:26,960 Maak praalwagens 1, compileren, en verdomme. 278 00:12:26,960 --> 00:12:31,110 Dat is echt, echt krijgen ver van de mark. 279 00:12:31,110 --> 00:12:32,490 >> Dus wat is hier aan de hand? 280 00:12:32,490 --> 00:12:36,050 Intuïtief, op basis van onze aannames eerder over de grootte van data types, 281 00:12:36,050 --> 00:12:38,040 wat moet hier gebeuren onder de motorkap? 282 00:12:38,040 --> 00:12:39,290 Yeah? 283 00:12:39,290 --> 00:12:43,000 284 00:12:43,000 --> 00:12:43,590 Precies. 285 00:12:43,590 --> 00:12:46,480 Als u wilt dat dit veel precisie, en dat is een deurklink van een veel precisie - 286 00:12:46,480 --> 00:12:48,770 20 cijfers achter de komma. 287 00:12:48,770 --> 00:12:51,990 Je kan onmogelijk vertegenwoordigen een willekeurig nummer, tenzij u een 288 00:12:51,990 --> 00:12:52,930 willekeurig aantal bits. 289 00:12:52,930 --> 00:12:54,190 Maar wij niet. 290 00:12:54,190 --> 00:12:57,200 Voor een vlotter, we hebben maar 32 bits. 291 00:12:57,200 --> 00:13:02,260 >> Als slechts 32 bits worden gepermuteerd op manier - net als onze mensen op, het podium 292 00:13:02,260 --> 00:13:05,780 handen omhoog of omlaag - in een eindig aantal wegen, er is slechts een eindig aantal 293 00:13:05,780 --> 00:13:08,640 van reële getallen je kan vertegenwoordigen met deze bits. 294 00:13:08,640 --> 00:13:10,500 En zo de computer uiteindelijk zal moeten 295 00:13:10,500 --> 00:13:11,730 beginnen snijden hoeken. 296 00:13:11,730 --> 00:13:15,500 De computer kan die details verbergen van ons een beetje tijd. 297 00:13:15,500 --> 00:13:18,880 Maar als we beginnen porren bij de cijfers en kijken verder en verder op de 298 00:13:18,880 --> 00:13:23,220 achterstand getallen in het gehele getal, dan beginnen we te zien dat het 299 00:13:23,220 --> 00:13:26,480 eigenlijk benadert de idee van een tiende. 300 00:13:26,480 --> 00:13:29,860 >> En zo blijkt, tragisch genoeg, er is een oneindig aantal nummers 301 00:13:29,860 --> 00:13:35,060 We kunnen niet precies in een vertegenwoordigen computer, tenminste het eindige 302 00:13:35,060 --> 00:13:38,030 aantal bits, een eindige hoeveelheid RAM. 303 00:13:38,030 --> 00:13:41,210 Nu helaas, dit soms heeft real-world gevolgen. 304 00:13:41,210 --> 00:13:45,980 Als mensen niet helemaal waarderen of soort voor lief nemen het feit 305 00:13:45,980 --> 00:13:48,310 dat hun computer precies zal doen wat ze zeggen dat het moet doen en niet doen 306 00:13:48,310 --> 00:13:51,430 begrijpen deze onderliggende vertegenwoordiging gegevens - 307 00:13:51,430 --> 00:13:55,290 die, eerlijk gezegd, in sommige talen zijn verborgen voor de gebruiker, in tegenstelling tot C - 308 00:13:55,290 --> 00:13:56,500 een aantal slechte dingen kunnen gebeuren. 309 00:13:56,500 --> 00:13:58,650 >> En wat ik dacht dat we doen is een stap terug. 310 00:13:58,650 --> 00:14:00,420 En dit gaat over een acht minuten durende video. 311 00:14:00,420 --> 00:14:04,200 Het luchtte een paar jaar geleden, en het geeft inzichten in eigenlijk wat kan gaan 312 00:14:04,200 --> 00:14:09,290 mis als je onder-brengen van deze soorten gegevens in het al-te 313 00:14:09,290 --> 00:14:10,080 echte wereld. 314 00:14:10,080 --> 00:14:12,965 Als we konden de lichten dimmen voor een paar minuten. 315 00:14:12,965 --> 00:14:14,360 >> LUIDSPREKER 1: We keren nu terug naar techniek 316 00:14:14,360 --> 00:14:17,160 rampen op Modern Marvels. 317 00:14:17,160 --> 00:14:18,680 >> Computers - 318 00:14:18,680 --> 00:14:21,340 we zijn allemaal gekomen om de te accepteren vaak frustrerende problemen 319 00:14:21,340 --> 00:14:23,170 die daarbij horen. 320 00:14:23,170 --> 00:14:27,570 Bugs, virussen, en software glitches zijn kleine prijzen te betalen voor de 321 00:14:27,570 --> 00:14:28,960 gemak. 322 00:14:28,960 --> 00:14:32,040 Maar in high-tech en high-speed militaire en ruimtevaartprogramma 323 00:14:32,040 --> 00:14:38,650 toepassingen, het kleinste probleem kan worden vergroot in ramp. 324 00:14:38,650 --> 00:14:44,480 >> Op 4 juni 1996 wetenschappers bereid om lanceren van een onbemande Ariane 5 raket. 325 00:14:44,480 --> 00:14:48,700 Het vervoerde wetenschappelijke satellieten ontworpen om precies hoe vast 326 00:14:48,700 --> 00:14:53,250 magnetisch veld van de Aarde interactie met zonne-wind. 327 00:14:53,250 --> 00:14:57,540 De raket werd gebouwd voor de Europese Ruimteagentschap en opgetild uit haar 328 00:14:57,540 --> 00:14:59,906 faciliteit op de kust van Frans-Guyana. 329 00:14:59,906 --> 00:15:03,660 >> JACK GANSSLE: Op ongeveer 37 seconden in de vlucht, zij eerst opgemerkt 330 00:15:03,660 --> 00:15:04,910 er iets fout gaat. 331 00:15:04,910 --> 00:15:08,130 De sproeiers zijn draaibaar in een manier waarop ze echt niet moeten doen. 332 00:15:08,130 --> 00:15:12,380 Ongeveer 40 seconden in de vlucht, duidelijk het voertuig in de problemen zat. 333 00:15:12,380 --> 00:15:14,400 En dat is wanneer ze een beslissing om het te vernietigen. 334 00:15:14,400 --> 00:15:18,520 Het bereik veiligheidsfunctionaris, met enorme lef, drukte op de knop, 335 00:15:18,520 --> 00:15:23,900 blies de raket voordat het kon uitgegroeid tot een gevaar voor de openbare veiligheid. 336 00:15:23,900 --> 00:15:27,810 >> LUIDSPREKER 1: Dit was de eerste reis van de Ariane 5, en de vernietiging 337 00:15:27,810 --> 00:15:32,020 vond plaats vanwege een fout ingebedde in de software van de raket. 338 00:15:32,020 --> 00:15:33,980 >> JACK GANSSLE: Het probleem van de Ariane was dat er een aantal 339 00:15:33,980 --> 00:15:36,390 dat de vereiste 64 bits uit te drukken. 340 00:15:36,390 --> 00:15:39,420 En ze wilden bekeren een 16-bits getal. 341 00:15:39,420 --> 00:15:43,130 Zij veronderstelden dat het nummer was nooit gaat zijn zeer groot, dat de meeste 342 00:15:43,130 --> 00:15:46,810 deze cijfers in de 64-bit aantal nullen waren. 343 00:15:46,810 --> 00:15:48,270 Ze hadden het mis. 344 00:15:48,270 --> 00:15:51,380 >> LUIDSPREKER 1: Het onvermogen van een software programma om de soort te accepteren 345 00:15:51,380 --> 00:15:55,350 nummer gegenereerd door een ander was aan de wortel van de mislukking. 346 00:15:55,350 --> 00:15:59,970 Software ontwikkeling was een zeer geworden dure deel van de nieuwe technologie. 347 00:15:59,970 --> 00:16:03,980 De Ariane 4 raket was erg geweest succesvol, zoveel van de software 348 00:16:03,980 --> 00:16:07,480 gecreëerd was ook gebruikt in de Ariane 5. 349 00:16:07,480 --> 00:16:11,980 >> PHILIP COYLE: Het fundamentele probleem was dat de Ariane 5 was sneller, 350 00:16:11,980 --> 00:16:13,720 sneller versneld. 351 00:16:13,720 --> 00:16:17,250 En de software niet had goed voor dat. 352 00:16:17,250 --> 00:16:20,770 >> LUIDSPREKER 1: De vernietiging van de raket was een enorme financiële ramp, 353 00:16:20,770 --> 00:16:24,200 allemaal te wijten aan een minuut softwarefout. 354 00:16:24,200 --> 00:16:27,820 Maar dit was niet de eerste keer gegevens conversie problemen had moderne geplaagd 355 00:16:27,820 --> 00:16:30,620 rakettechnologie. 356 00:16:30,620 --> 00:16:34,480 >> JACK GANSSLE: In 1991, met de start van de eerste Golfoorlog, de Patriot 357 00:16:34,480 --> 00:16:38,610 raket kende een zelfde soort een nummerconversie probleem. 358 00:16:38,610 --> 00:16:44,910 Dientengevolge, 28 Amerikaanse soldaten gedood en ongeveer 100 anderen gewond 359 00:16:44,910 --> 00:16:48,600 toen de Patriot, die verondersteld werd te beschermen tegen inkomende Scuds, 360 00:16:48,600 --> 00:16:51,630 niet in geslaagd een raket afvuren. 361 00:16:51,630 --> 00:16:55,110 >> LUIDSPREKER 1: Wanneer Irak Koeweit binnenviel en Amerika gelanceerd Desert Storm in 362 00:16:55,110 --> 00:17:00,570 begin 1991, Patriot raketten batterijen werden ingezet om Saudi-Arabië te beschermen 363 00:17:00,570 --> 00:17:04,760 en Israël van de Iraakse Scud raketaanvallen. 364 00:17:04,760 --> 00:17:09,720 De Patriot is een Amerikaanse middellange afstand surface-to-air-systeem vervaardigd door 365 00:17:09,720 --> 00:17:11,569 het bedrijf Raytheon. 366 00:17:11,569 --> 00:17:16,410 >> THEODORE Postol: De grootte van de Patriot interceptor zelf is ruwweg 367 00:17:16,410 --> 00:17:17,710 20-meter lang. 368 00:17:17,710 --> 00:17:20,800 En hij weegt ongeveer 2000 kilo. 369 00:17:20,800 --> 00:17:22,940 En het draagt ​​een kernkop van ongeveer - 370 00:17:22,940 --> 00:17:24,905 Ik denk dat het ongeveer £ 150. 371 00:17:24,905 --> 00:17:31,030 En de kernkop zelf een hoog explosief die heeft 372 00:17:31,030 --> 00:17:33,270 fragmenten eromheen. 373 00:17:33,270 --> 00:17:37,490 De behuizing van de kernkop ontworpen te handelen als hagel. 374 00:17:37,490 --> 00:17:40,720 >> LUIDSPREKER 1: De raketten worden uitgevoerd vier per container en worden vervoerd 375 00:17:40,720 --> 00:17:43,050 een oplegger. 376 00:17:43,050 --> 00:17:47,490 >> PHILIP COYLE: De Patriot anti-raket systeem gaat terug naar 377 00:17:47,490 --> 00:17:50,710 minstens 20 jaar nu. 378 00:17:50,710 --> 00:17:54,350 Het werd oorspronkelijk ontworpen als een luchtverdediging raket 379 00:17:54,350 --> 00:17:56,190 neer te schieten vijandelijke vliegtuigen. 380 00:17:56,190 --> 00:18:02,490 In de eerste Golfoorlog, toen die oorlog kwam langs, het leger wilde gebruiken 381 00:18:02,490 --> 00:18:05,535 om Scuds, niet vliegtuigen neer te schieten. 382 00:18:05,535 --> 00:18:09,310 De Iraakse luchtmacht was niet zo veel van een probleem. 383 00:18:09,310 --> 00:18:12,450 Maar het leger was bezorgd over Scuds. 384 00:18:12,450 --> 00:18:15,950 En dus probeerde ze te upgraden de Patriot. 385 00:18:15,950 --> 00:18:18,750 >> LUIDSPREKER 1: onderscheppen een vijandelijke raket reizen op mach vijf was 386 00:18:18,750 --> 00:18:20,890 zal genoeg zijn uitdagend. 387 00:18:20,890 --> 00:18:25,590 Maar toen de Patriot werd overhaast in dienst, het leger was niet op de hoogte van een 388 00:18:25,590 --> 00:18:31,710 Iraakse wijziging die hun gesteld Scuds bijna onmogelijk om te slaan. 389 00:18:31,710 --> 00:18:35,240 >> THEODORE Postol: Wat is er gebeurd is de Scuds die werden 390 00:18:35,240 --> 00:18:36,570 komen waren instabiel. 391 00:18:36,570 --> 00:18:37,532 Ze werden wiebelen. 392 00:18:37,532 --> 00:18:43,220 De reden hiervoor was het Irakezen in Om 600 kilometer te halen uit een 393 00:18:43,220 --> 00:18:47,530 300-kilometer-afstands raket, nam gewicht aan de voorkant kernkop. 394 00:18:47,530 --> 00:18:49,290 Ze maakten de kernkop lichter. 395 00:18:49,290 --> 00:18:53,110 Dus nu de Patriot probeert te komen op de Scud. 396 00:18:53,110 --> 00:18:56,470 En meestal het overgrote meerderheid van de tijd, het zou gewoon 397 00:18:56,470 --> 00:18:58,730 vliegen door de Scud. 398 00:18:58,730 --> 00:19:01,760 >> LUIDSPREKER 1: Zodra het Patriot-systeem operatoren realiseerde de Patriot gemist 399 00:19:01,760 --> 00:19:06,690 zijn doel, ze ontploft de Patriotten kernkop om mogelijk te vermijden 400 00:19:06,690 --> 00:19:10,300 slachtoffers indien het werd toegestaan tot op de grond vallen. 401 00:19:10,300 --> 00:19:14,540 >> THEODORE Postol: Dat was wat de meeste mensen zagen als grote vuurballen in de lucht 402 00:19:14,540 --> 00:19:20,350 en onbegrepen zo slim van Scud kernkoppen. 403 00:19:20,350 --> 00:19:23,320 >> LUIDSPREKER 1: Hoewel in de nachtelijke hemel Patriotten bleek succesvol te zijn 404 00:19:23,320 --> 00:19:27,530 Scuds vernietigen, bij Dhahran er kon er geen misverstand over haar zijn 405 00:19:27,530 --> 00:19:29,140 prestaties. 406 00:19:29,140 --> 00:19:34,180 Er is de Patriot's radarsysteem verloren bijhouden van een inkomende Scud en nooit 407 00:19:34,180 --> 00:19:36,380 gestart als gevolg van een software fout. 408 00:19:36,380 --> 00:19:39,890 409 00:19:39,890 --> 00:19:42,700 >> Het was de Israëli's die voor het eerst ontdekt hoe langer het systeem 410 00:19:42,700 --> 00:19:48,020 was, hoe groter de tijd discrepantie geworden als gevolg van een klok 411 00:19:48,020 --> 00:19:50,470 ingebed in de computer van het systeem. 412 00:19:50,470 --> 00:19:54,640 >> JACK GANSSLE: Ongeveer twee weken voor de tragedie in Dhahran, de Israëli's 413 00:19:54,640 --> 00:19:58,440 gemeld aan het ministerie van Defensie dat het systeem de tijd aan het verliezen was. 414 00:19:58,440 --> 00:20:01,280 Na ongeveer acht uur lopen, ze merkten dat het systeem is 415 00:20:01,280 --> 00:20:03,530 steeds merkbaar minder nauwkeurig. 416 00:20:03,530 --> 00:20:07,710 Het ministerie van Defensie gereageerd door vertellen al van de Patriot batterijen 417 00:20:07,710 --> 00:20:10,500 de systemen geen reactie voor een lange tijd. 418 00:20:10,500 --> 00:20:12,430 Ze hebben nooit gezegd wat een lange tijd was. 419 00:20:12,430 --> 00:20:13,330 Acht uur? 420 00:20:13,330 --> 00:20:13,810 10 uur? 421 00:20:13,810 --> 00:20:14,990 1000 uren? 422 00:20:14,990 --> 00:20:17,150 Niemand wist. 423 00:20:17,150 --> 00:20:20,220 >> LUIDSPREKER 1: The Patriot batterij gestationeerd bij de kazerne in Dhahran 424 00:20:20,220 --> 00:20:24,660 en de gebrekkige interne klok was over meer dan 100 uur in de nacht van 425 00:20:24,660 --> 00:20:27,470 25 februari. 426 00:20:27,470 --> 00:20:31,770 >> JACK GANSSLE: Het bijgehouden tijd om een nauwkeurigheid van ongeveer een tiende van een seconde. 427 00:20:31,770 --> 00:20:34,480 Nu, een tiende van een seconde is een interessant nummer omdat het niet kan worden 428 00:20:34,480 --> 00:20:39,940 uitgedrukt in binaire precies, waardoor kan niet exact worden uitgedrukt 429 00:20:39,940 --> 00:20:42,500 elke moderne digitale computer. 430 00:20:42,500 --> 00:20:46,920 Het is moeilijk te geloven, maar gebruik dit als voorbeeld. 431 00:20:46,920 --> 00:20:49,000 Laten we de nummer een derde. 432 00:20:49,000 --> 00:20:53,150 Een derde kan niet worden uitgedrukt in decimalen nauwkeurig. 433 00:20:53,150 --> 00:20:57,500 Een derde is 0.333 gaat voor oneindigheid. 434 00:20:57,500 --> 00:21:02,270 Er is geen manier om dat te doen met absolute nauwkeurigheid in decimalen. 435 00:21:02,270 --> 00:21:05,370 Dat is precies het zelfde soort probleem dat gebeurde in de Patriot. 436 00:21:05,370 --> 00:21:09,880 Hoe langer het systeem liep, de slechtste tijd fout werd. 437 00:21:09,880 --> 00:21:13,840 >> LUIDSPREKER 1: Na 100 bedrijfsuren, de fout in de tijd was slechts 438 00:21:13,840 --> 00:21:16,140 ongeveer een derde van een seconde. 439 00:21:16,140 --> 00:21:20,800 Maar in termen van targeting een raket reizen op mach vijf, het resulteerde in 440 00:21:20,800 --> 00:21:24,410 een tracking error van meer dan 600 meter. 441 00:21:24,410 --> 00:21:27,670 Het zou een fatale fout te zijn de soldaten aan Dhahran. 442 00:21:27,670 --> 00:21:33,450 >> THEODORE Postol: Wat gebeurd is, is een Scud lancering werd ontdekt door vroege 443 00:21:33,450 --> 00:21:34,280 waarschuwing satellieten. 444 00:21:34,280 --> 00:21:38,550 En zij wisten dat de Scud kwam in hun algemene richting. 445 00:21:38,550 --> 00:21:41,000 Ze wisten niet waar het vandaan kwam. 446 00:21:41,000 --> 00:21:43,900 >> LUIDSPREKER 1: Het was nu aan de radar component van het Patriot-systeem 447 00:21:43,900 --> 00:21:48,910 verdedigen Dhahran te vinden en te houden bijhouden van de inkomende vijandelijke raketten. 448 00:21:48,910 --> 00:21:50,580 >> JACK GANSSLE: De radar was erg slim. 449 00:21:50,580 --> 00:21:53,770 Het zou eigenlijk bijhouden van de positie van de Scud en vervolgens te voorspellen waar het 450 00:21:53,770 --> 00:21:57,160 zou waarschijnlijk de volgende keer de radar stuurde een puls uit. 451 00:21:57,160 --> 00:21:58,870 Dat heette de range gate. 452 00:21:58,870 --> 00:22:04,020 >> THEODORE Postol: Dan zodra de Patriot beslist voldoende tijd is verstreken om te gaan 453 00:22:04,020 --> 00:22:09,420 terug en controleer de volgende locatie voor Deze gedetecteerde object, gaat het terug. 454 00:22:09,420 --> 00:22:14,450 Dus toen ging het terug naar de verkeerde plaats, het dan ziet geen object. 455 00:22:14,450 --> 00:22:18,200 En hij beslist dat er geen object, was een valse detectie en 456 00:22:18,200 --> 00:22:19,680 laat de baan. 457 00:22:19,680 --> 00:22:22,970 >> LUIDSPREKER 1: De binnenkomende Scud verdwenen van het radarscherm, en 458 00:22:22,970 --> 00:22:26,050 seconden later sloeg in de kazerne. 459 00:22:26,050 --> 00:22:31,950 De Scud gedood 28 en was de laatste vuurde tijdens de eerste Golfoorlog. 460 00:22:31,950 --> 00:22:37,700 Tragisch, de bijgewerkte software aangekomen bij Dhahran de volgende dag. 461 00:22:37,700 --> 00:22:41,800 De software fout was vastgesteld, sluiten van een hoofdstuk in de onrustige 462 00:22:41,800 --> 00:22:43,690 geschiedenis van de Patriot raket. 463 00:22:43,690 --> 00:22:46,780 464 00:22:46,780 --> 00:22:50,710 >> Patriot is eigenlijk een afkorting voor Phased Array Tracking 465 00:22:50,710 --> 00:22:51,960 Intercept Of Target. 466 00:22:51,960 --> 00:22:54,650 467 00:22:54,650 --> 00:23:00,840 >> DAVID J Malan: Oke, dus een ontnuchterend voorbeeld, om zeker te zijn. 468 00:23:00,840 --> 00:23:03,430 En gelukkig, deze lagere niveau bugs zijn niet iets dat we zullen 469 00:23:03,430 --> 00:23:06,220 hebben meestal te waarderen, zeker niet met sommige van onze 470 00:23:06,220 --> 00:23:07,360 vroegste programma. 471 00:23:07,360 --> 00:23:10,450 Integendeel, het merendeel van de bugs zul je ontmoeting zal zijn logisch in de natuur, 472 00:23:10,450 --> 00:23:12,900 syntactische aard waarbij de code gewoon niet goed werkt. 473 00:23:12,900 --> 00:23:14,140 En je weet dat het behoorlijk snel. 474 00:23:14,140 --> 00:23:16,850 >> Maar vooral als we in de einde van het semester, het gaat om 475 00:23:16,850 --> 00:23:20,620 meer en meer een mogelijkheid echt hard na te denken over het ontwerp 476 00:23:20,620 --> 00:23:22,960 van uw programma's en de onderliggende vertegenwoordiging 477 00:23:22,960 --> 00:23:24,520 ook daar, van de gegevens. 478 00:23:24,520 --> 00:23:28,010 Bijvoorbeeld, we zullen MySQL introduceren, dat is een populaire gegevensbestandmotor 479 00:23:28,010 --> 00:23:30,850 die u kunt gebruiken met websites te gegevens op de achterkant. 480 00:23:30,850 --> 00:23:34,630 En je zult moeten beginnen om te beslissen op het einde van het semester niet alleen wat 481 00:23:34,630 --> 00:23:38,790 soorten gegevens in deze zin te gebruiken maar precies hoeveel bits te gebruiken, 482 00:23:38,790 --> 00:23:42,740 of u wilt data opslaan als datums en tijden zoals tijden en ook 483 00:23:42,740 --> 00:23:46,890 dingen als hoe groot wil je het unieke ID zijn voor bijvoorbeeld de gebruiker 484 00:23:46,890 --> 00:23:47,680 in uw database. 485 00:23:47,680 --> 00:23:51,210 >> In feite, als sommige van jullie hebben gehad Facebook goed voor geruime tijd, 486 00:23:51,210 --> 00:23:53,680 en je weet hoe je toegang krijgen om uw gebruikers-ID - 487 00:23:53,680 --> 00:23:57,930 die soms opduikt in uw URL tenzij je hebt gekozen voor een profiel 488 00:23:57,930 --> 00:24:02,070 bijnaam voor de URL, of als je hebt gebruikte Facebook's Graph API, de 489 00:24:02,070 --> 00:24:05,510 openbaar beschikbare API waarmee je kan vragen Facebook om ruwe data - 490 00:24:05,510 --> 00:24:07,580 kunt u zien wat uw numerieke ID is. 491 00:24:07,580 --> 00:24:10,880 En enkele jaren geleden, Facebook wezen moest te schakelen van 492 00:24:10,880 --> 00:24:15,980 het equivalent van ints aan het gebruik van lange lang, want na verloop van tijd als gebruikers komen 493 00:24:15,980 --> 00:24:19,780 en gaan en creëren veel rekeningen en fake accounts, zelfs zij heel gemakkelijk 494 00:24:19,780 --> 00:24:24,630 waren in staat om iets te putten als een 4 miljard mogelijke waarde als een int. 495 00:24:24,630 --> 00:24:28,340 >> Dus meer over dat soort zaken op de weg, als goed. 496 00:24:28,340 --> 00:24:30,750 Oke, dus dat was gieten. 497 00:24:30,750 --> 00:24:31,670 Dat was onnauwkeurigheid. 498 00:24:31,670 --> 00:24:32,730 Een paar aankondigingen. 499 00:24:32,730 --> 00:24:35,710 Dus secties formeel beginnen aanstaande Zondag, maandag, dinsdag. 500 00:24:35,710 --> 00:24:39,080 U zult via e-mail te horen later deze week als uw afdeling opdracht. 501 00:24:39,080 --> 00:24:42,570 En je zult ook hier op dat moment hoe om uw afdeling te veranderen als uw 502 00:24:42,570 --> 00:24:45,660 schema is nu veranderd of uw comfortniveau is nu veranderd. 503 00:24:45,660 --> 00:24:49,380 Ondertussen P-set een en hacker een zijn vanwege deze donderdag met de optie om 504 00:24:49,380 --> 00:24:52,450 breiden die termijn per de specificaties tot en met vrijdag 505 00:24:52,450 --> 00:24:53,830 op een typische manier. 506 00:24:53,830 --> 00:24:57,500 >> Realiseer je dat meegeleverd met het probleem set specificaties zijn instructies op 507 00:24:57,500 --> 00:25:02,770 hoe de CS50 apparaat gaat gebruiken, maken, evenals een aantal specifieke instrumenten CS50 508 00:25:02,770 --> 00:25:06,540 achtige stijl 50, die kan u feedback dynamisch op de 509 00:25:06,540 --> 00:25:10,230 kwaliteit van je code stijl en ook check 50, die u kunnen voorzien van 510 00:25:10,230 --> 00:25:13,160 dynamische feedback als u uw correctheid code's. 511 00:25:13,160 --> 00:25:16,850 Vergeef dat we nog steeds strijken enkele kinks met cheque 50. 512 00:25:16,850 --> 00:25:21,490 Een paar van je klasgenoten die wel starten rond 04:00 op vrijdagavond wanneer 513 00:25:21,490 --> 00:25:25,130 de spec ging hebben gemerkt sindsdien een paar bugs die we werken 514 00:25:25,130 --> 00:25:29,010 door, en excuses voor iedereen die heeft ervaren onnodige frustraties. 515 00:25:29,010 --> 00:25:30,340 Het is mijn schuld. 516 00:25:30,340 --> 00:25:34,080 Maar we zullen volgen op de CS50 bespreken wanneer dat is opgelost. 517 00:25:34,080 --> 00:25:35,700 >> Dus een woord op scores zichzelf. 518 00:25:35,700 --> 00:25:38,990 Dus het zal een week of twee duren voordat u beginnen om feedback over probleem sets krijgen 519 00:25:38,990 --> 00:25:40,640 omdat je nog niet over een leer collega. 520 00:25:40,640 --> 00:25:44,510 En zelfs dan, zullen we beginnen te evalueren de C probleem stelt voordat we 521 00:25:44,510 --> 00:25:46,970 ga terug en evalueren van nul, dus dat je meer betrokken te krijgen 522 00:25:46,970 --> 00:25:48,150 feedback sneller. 523 00:25:48,150 --> 00:25:51,870 Maar in het algemeen per de syllabus, CS50 probleem sets worden geëvalueerd aan de 524 00:25:51,870 --> 00:25:53,580 na vier assen - 525 00:25:53,580 --> 00:25:55,760 scope, correctheid, design en stijl. 526 00:25:55,760 --> 00:25:59,210 >> Scope gaat een aantal typisch tussen nul en vijf die 527 00:25:59,210 --> 00:26:01,830 vangt hoeveel van de stuk dat je beet. 528 00:26:01,830 --> 00:26:03,750 Typisch, je wil dat dit vijf. 529 00:26:03,750 --> 00:26:05,300 Je tenminste alles geprobeerd. 530 00:26:05,300 --> 00:26:09,330 En merken dat het een vermenigvuldigingsfactor zodat doet slechts een deel van de 531 00:26:09,330 --> 00:26:12,520 probleem set is niet de beste strategie. 532 00:26:12,520 --> 00:26:15,610 >> Ondertussen duidelijker is belang van correctheid - 533 00:26:15,610 --> 00:26:18,620 alleen is uw programma correct met respect voor de specificatie? 534 00:26:18,620 --> 00:26:21,510 Dit is bewust meer gewogen zwaarder dan de andere twee assen door een 535 00:26:21,510 --> 00:26:24,450 factor drie want we herkennen dat meestal je gaat naar een te brengen 536 00:26:24,450 --> 00:26:28,600 veel meer tijd jagen een aantal bugs, het krijgen van uw code te werken, dan moet je 537 00:26:28,600 --> 00:26:31,540 worden inspringen en te kiezen geschikte variabele namen en de 538 00:26:31,540 --> 00:26:33,800 vinden, die op het andere uiteinde van het spectrum van stijl. 539 00:26:33,800 --> 00:26:36,160 >> Dat wil niet zeggen dat stijl is niet belangrijk, en wij zullen het prediken dan 540 00:26:36,160 --> 00:26:37,920 tijd zowel in lezingen en in gedeelten. 541 00:26:37,920 --> 00:26:40,520 Stijl heeft betrekking op de esthetiek van je code. 542 00:26:40,520 --> 00:26:43,980 Heeft u gekozen goed genoemd variabelen die zijn kort maar enigszins 543 00:26:43,980 --> 00:26:44,680 beschrijvende? 544 00:26:44,680 --> 00:26:47,840 Is uw code ingesprongen zoals je hebt gezien in lezing en op een wijze die in overeenstemming 545 00:26:47,840 --> 00:26:49,070 met stijl 50? 546 00:26:49,070 --> 00:26:51,220 >> Ten slotte is het modelrecht daar in het midden. 547 00:26:51,220 --> 00:26:54,090 Design is het moeilijker een om een ​​put vinger op want het is veel meer 548 00:26:54,090 --> 00:26:55,000 subjectief. 549 00:26:55,000 --> 00:26:58,610 Maar het is misschien wel de belangrijkste van de drie assen in termen van pedagogische 550 00:26:58,610 --> 00:27:02,050 waarde in de tijd en dat dit zal gelegenheid het onderwijs collega's om 551 00:27:02,050 --> 00:27:04,110 u te voorzien van kwalitatieve feedback. 552 00:27:04,110 --> 00:27:08,100 Inderdaad, in CS50 hoewel we doen hebben Deze formules en scores aan het einde 553 00:27:08,100 --> 00:27:11,350 van de dag deze zijn zeer bewust zeer kleine emmers - kommawaarden 554 00:27:11,350 --> 00:27:13,460 tussen nul en drie en nul en vijf. 555 00:27:13,460 --> 00:27:17,800 We proberen niet te zeer grove lijnen te trekken tussen probleem sets of tussen 556 00:27:17,800 --> 00:27:21,490 studenten maar richt zich zoveel we kunnen op kwalitatieve, handschrift 557 00:27:21,490 --> 00:27:25,490 feedback, hetzij getypte of mondeling uit uw specifieke onderwijs-collega, 558 00:27:25,490 --> 00:27:27,050 krijg je om heel goed te kennen. 559 00:27:27,050 --> 00:27:32,340 >> Maar in het algemeen, dat zijn de gewichten dat de verschillende assen hebben. 560 00:27:32,340 --> 00:27:35,480 Ondertussen, ook, het is de moeite waard om in erg dat je niet moet ervan uitgaan dat een 561 00:27:35,480 --> 00:27:38,870 drie van de vijf is een 60% en dus ruwweg gebreke. 562 00:27:38,870 --> 00:27:41,410 Drie is bewust bedoeld soort midden van de weg goed. 563 00:27:41,410 --> 00:27:43,480 Als je krijgt drieën op de het begin van het semester, dat is 564 00:27:43,480 --> 00:27:46,340 inderdaad bedoeld om een ​​goede plaats om te beginnen. 565 00:27:46,340 --> 00:27:50,510 Als je krijgt twos, beurzen, is er zeker wat werk om een ​​beetje te betalen 566 00:27:50,510 --> 00:27:53,250 meer aandacht, om te profiteren van secties en kantooruren. 567 00:27:53,250 --> 00:27:54,590 >> Als je krijgt handen en voeten en vijven, geweldig. 568 00:27:54,590 --> 00:27:57,430 Maar echt, hopen we trajecten zien onder studenten - zeer 569 00:27:57,430 --> 00:28:00,575 geïndividualiseerd per leerling, maar vanaf het semester hier in soort 570 00:28:00,575 --> 00:28:04,100 de twee naar de drie gamma maar eindigt hier in de 4-5 range. 571 00:28:04,100 --> 00:28:05,440 Dat is wat we echt zoekt. 572 00:28:05,440 --> 00:28:09,590 En dat doen we in gedachten houden dat de delta u vertonen tussen week nul en week 573 00:28:09,590 --> 00:28:12,170 12 toen ik doe rangen. 574 00:28:12,170 --> 00:28:16,380 Het maakt niet echt hoe belangrijk voor ons je eerlijk in het begin als je 575 00:28:16,380 --> 00:28:19,330 traject is inderdaad boven en sterk. 576 00:28:19,330 --> 00:28:24,000 >> Academische eerlijkheid - dus laat ik op mijn meer serieuze stem voor slechts een moment. 577 00:28:24,000 --> 00:28:28,510 Dus deze cursus is het onderscheid van het sturen van meer studenten dan alle andere 578 00:28:28,510 --> 00:28:30,950 in de geschiedenis om de advertentie boord, geloof ik. 579 00:28:30,950 --> 00:28:34,220 We hebben een soort tel kwijt op dit punt van hoe vaak dit gebeurt. 580 00:28:34,220 --> 00:28:37,090 En dat is niet omdat de studenten in 50 zijn niet meer oneerlijk dan hun 581 00:28:37,090 --> 00:28:38,690 klasgenoten elders. 582 00:28:38,690 --> 00:28:42,800 Maar beseffen ook dat we heel goed op het opsporen van dit soort dingen. 583 00:28:42,800 --> 00:28:45,920 >> En dat is het voordeel dat een computer science class heeft in dat we 584 00:28:45,920 --> 00:28:49,110 kunnen en wij vergelijken alle studenten probleem stelt paarsgewijze tegen elke 585 00:28:49,110 --> 00:28:51,470 andere, niet alleen dit jaar maar alle voorgaande jaren. 586 00:28:51,470 --> 00:28:55,080 We hebben het vermogen, zoals studenten in de klas, naar Google en code te vinden 587 00:28:55,080 --> 00:28:57,440 op sites als GitHub en discussiefora. 588 00:28:57,440 --> 00:29:00,840 Er zijn absoluut oplossingen voor CS50's p-sets rondzweven daar. 589 00:29:00,840 --> 00:29:02,710 Maar als je ze kan vinden, kunnen we ze vinden. 590 00:29:02,710 --> 00:29:07,130 En dit alles is zeer geautomatiseerd en gemakkelijk en verdrietig voor ons te vinden. 591 00:29:07,130 --> 00:29:10,990 >> Maar ik wil benadrukken, ook, dat de academische eerlijkheid beleid cursus is 592 00:29:10,990 --> 00:29:13,960 zeer bedoeld sterk worden het tegenovergestelde van die geest. 593 00:29:13,960 --> 00:29:17,506 Inderdaad, dit jaar hebben we dingen anders geformuleerd in de syllabus om dit te zijn, dot 594 00:29:17,506 --> 00:29:19,790 dot dot, met meer detail in de syllabus. 595 00:29:19,790 --> 00:29:22,860 Maar het overkoepelende thema in de loop eigenlijk is redelijk te zijn. 596 00:29:22,860 --> 00:29:26,160 We erkennen dat er een significant hoeveelheid pedagogische 597 00:29:26,160 --> 00:29:30,550 waarde samenwerkende, tot op zekere hoogte, met klasgenoten, waarbij je 598 00:29:30,550 --> 00:29:33,700 twee of u drie of meer je bent staande op een witte boord 599 00:29:33,700 --> 00:29:35,670 whiteboarding, om zo te spreken, uw ideeën - 600 00:29:35,670 --> 00:29:39,480 uitschrijven van pseudocode in foto's, diagrammen wat moet Mario zijn als 601 00:29:39,480 --> 00:29:41,350 je was om het te schrijven eerst in pseudocode. 602 00:29:41,350 --> 00:29:43,240 Wat moet de hebzuchtige algoritme - 603 00:29:43,240 --> 00:29:46,100 hoe moet het gedragen per probleem stelt een? 604 00:29:46,100 --> 00:29:50,440 >> En dus beseffen dat gedrag dat we moedigen is erg 605 00:29:50,440 --> 00:29:51,470 veel in die richting. 606 00:29:51,470 --> 00:29:53,890 En in de syllabus, zie je een heleboel kogels onder een 607 00:29:53,890 --> 00:29:57,740 redelijke categorie en een niet redelijk categorie die ons helpt helpen 608 00:29:57,740 --> 00:30:00,740 je je geest wrap rond waar we trekken die lijn. 609 00:30:00,740 --> 00:30:04,340 En in het algemeen, een fatsoenlijke vuistregel is dat als je worstelt op te lossen 610 00:30:04,340 --> 00:30:07,990 enkele bug en je vriend of klasgenoot wordt naast je zitten, het wordt 611 00:30:07,990 --> 00:30:11,530 redelijk voor u om hem te laten zien of haar uw code en zeggen: hey, kan je helpen 612 00:30:11,530 --> 00:30:13,700 me uitzoeken wat hier fout gaat? 613 00:30:13,700 --> 00:30:17,110 >> We meestal niet omarmen de andere kant. 614 00:30:17,110 --> 00:30:20,730 Het is geen correcte respons op uw vriend of klasgenoot hier te zeggen, oh, 615 00:30:20,730 --> 00:30:22,510 kijk maar naar mij en figuur het uit van dat. 616 00:30:22,510 --> 00:30:24,400 Dat is een soort van onredelijk. 617 00:30:24,400 --> 00:30:27,750 Maar het hebben van iemand anders, een ander brein, een ander paar ogen kijken 618 00:30:27,750 --> 00:30:31,620 uw scherm of kijken naar uw code en zeggen, bent u zeker dat u wilt 619 00:30:31,620 --> 00:30:32,760 een lus hebben hier? 620 00:30:32,760 --> 00:30:34,800 Of bent u zeker dat u wilt hier dat puntkomma? 621 00:30:34,800 --> 00:30:37,090 Of oh, die foutmelding betekent dit. 622 00:30:37,090 --> 00:30:39,580 Die zijn zeer redelijk en aangemoedigd gedrag. 623 00:30:39,580 --> 00:30:44,010 >> De gevallen waarop ik werd gezinspeeld op eerder neer op als studenten 624 00:30:44,010 --> 00:30:47,350 's avonds laat maken slecht beoordelingsvermogen beslissingen en e-mailen hun code aan 625 00:30:47,350 --> 00:30:50,130 iemand anders of gewoon zeggen, hier, het is in Dropbox of 626 00:30:50,130 --> 00:30:51,610 Googlen 's avonds laat. 627 00:30:51,610 --> 00:30:54,880 En dus ik zou aanmoedigen en smeek u, als je het hebt die onvermijdelijke 628 00:30:54,880 --> 00:30:58,450 momenten van stress, je bent stoten tegen de deadline, je hebt geen late 629 00:30:58,450 --> 00:31:01,490 dag, omdat het is al vrijdag op dat punt, email hoofden van de cursus of 630 00:31:01,490 --> 00:31:02,330 mezelf direct. 631 00:31:02,330 --> 00:31:04,790 Zeg, luister, ik ben op mijn breekpunt hier. 632 00:31:04,790 --> 00:31:06,660 Laten we een gesprek en figure it out. 633 00:31:06,660 --> 00:31:10,400 Toevlucht te nemen tot het internet of een ander niet redelijke gedrag is nooit de 634 00:31:10,400 --> 00:31:13,070 oplossing, en te veel van het klasgenoten zijn niet meer hier op 635 00:31:13,070 --> 00:31:15,150 campus vanwege die slechte beslissing. 636 00:31:15,150 --> 00:31:17,840 Maar het is heel gemakkelijk om die lijn rok. 637 00:31:17,840 --> 00:31:22,950 >> En hier is een kleine afbeelding te juichen u op van Reddit, zodat nu 638 00:31:22,950 --> 00:31:25,720 alles komt goed. 639 00:31:25,720 --> 00:31:30,210 >> Dus een korte samenvatting, dan, van waar we gebleven waren. 640 00:31:30,210 --> 00:31:33,690 Dus vorige week, zich herinneren dat we introduceren omstandigheden, niet in Scratch 641 00:31:33,690 --> 00:31:34,880 C maar deze keer. 642 00:31:34,880 --> 00:31:38,300 En er was een nieuwe syntax, maar echt geen nieuwe ideeën per se. 643 00:31:38,300 --> 00:31:42,630 We hadden Booleaanse uitdrukkingen die we konden of samen met twee verticale 644 00:31:42,630 --> 00:31:46,490 bars of en samen met twee ampersand, zegt dat zowel de linker 645 00:31:46,490 --> 00:31:49,990 en het recht moet waar zijn dit uit te voeren. 646 00:31:49,990 --> 00:31:53,150 Dan hadden we schakelaars, die we gekeken in het kort, maar ik stel zijn echt 647 00:31:53,150 --> 00:31:56,830 gewoon anders syntax voor het bereiken van de zelfde soort doel als je weet in 648 00:31:56,830 --> 00:31:59,270 vooraf wat uw zaken gaan worden. 649 00:31:59,270 --> 00:32:00,160 >> We keken naar loops. 650 00:32:00,160 --> 00:32:03,340 Een for-lus is misschien wel de meest voorkomende, of tenminste degene die mensen 651 00:32:03,340 --> 00:32:05,330 typisch bereiken voor instinctief. 652 00:32:05,330 --> 00:32:08,240 Ook al ziet het er een beetje cryptisch, je zult zien vele, vele voorbeelden van deze 653 00:32:08,240 --> 00:32:11,590 het duurde niet lang, want je hebt al eind vorige week. 654 00:32:11,590 --> 00:32:14,280 Terwijl de lussen kan eveneens bereiken van het zelfde ding. 655 00:32:14,280 --> 00:32:17,550 Maar als je wilt een ophoging doen of bijstelling van 656 00:32:17,550 --> 00:32:20,230 waarden variabele, moet u doe het meer handmatig dan de 657 00:32:20,230 --> 00:32:22,440 voor lus maakt vóór. 658 00:32:22,440 --> 00:32:25,310 En dan is er nog de do-while-lus, die ons in staat om iets te doen aan 659 00:32:25,310 --> 00:32:28,460 minste terwijl iets anders is waar. 660 00:32:28,460 --> 00:32:31,550 En dit is bijzonder goed voor programma's of voor games waar je wilt 661 00:32:31,550 --> 00:32:33,810 om de gebruiker voor iets gevraagd tenminste eenmaal. 662 00:32:33,810 --> 00:32:37,110 En dan, als hij of zij niet meewerken, je zou willen om het te doen 663 00:32:37,110 --> 00:32:38,420 weer. 664 00:32:38,420 --> 00:32:41,270 >> Met variabelen, ondertussen, hadden we lijnen van code zoals deze, die zou kunnen 665 00:32:41,270 --> 00:32:41,950 zijn twee lijnen. 666 00:32:41,950 --> 00:32:44,830 Je zou kunnen verklaren een int genaamd teller, puntkomma. 667 00:32:44,830 --> 00:32:47,660 Of je kunt gewoon declareren en definiëren, om zo te zeggen. 668 00:32:47,660 --> 00:32:49,950 Geef het een waarde tegelijk. 669 00:32:49,950 --> 00:32:51,890 >> En dan tot slot, we praatten over functies. 670 00:32:51,890 --> 00:32:54,270 En dit was een mooi voorbeeld in die zin dat illustreert 671 00:32:54,270 --> 00:32:55,840 twee typen functies. 672 00:32:55,840 --> 00:32:59,030 One is GetString (), die nogmaals wordt een reeks van de gebruiker. 673 00:32:59,030 --> 00:33:02,040 Maar GetString () is een soort van interessant, Voor zover we hebben gebruikt, 674 00:33:02,040 --> 00:33:05,620 want we hebben altijd gebruikt met iets aan de linkerkant van een 675 00:33:05,620 --> 00:33:06,600 gelijk-teken. 676 00:33:06,600 --> 00:33:09,830 Dat wil zeggen dat GetString () geeft een waarde terug. 677 00:33:09,830 --> 00:33:11,970 Het geeft natuurlijk een tekenreeks. 678 00:33:11,970 --> 00:33:15,130 En dan aan de linkerkant, zijn we gewoon opslaan die string binnenkant van een 679 00:33:15,130 --> 00:33:16,580 variabele genaamd naam. 680 00:33:16,580 --> 00:33:21,100 >> Dit is anders in zekere zin van printf printf omdat, althans in onze 681 00:33:21,100 --> 00:33:23,540 gebruik hier, doet niets terug. 682 00:33:23,540 --> 00:33:24,960 Even terzijde, het doet iets terug. 683 00:33:24,960 --> 00:33:26,380 We gewoon niet schelen wat het is. 684 00:33:26,380 --> 00:33:29,090 Maar het heeft wel wat genoemd bijwerking. 685 00:33:29,090 --> 00:33:31,840 En wat is dat bijwerking bij iedere geval hebben we tot nu toe gezien? 686 00:33:31,840 --> 00:33:34,720 Wat doet printf doen? 687 00:33:34,720 --> 00:33:37,780 Hij drukt iets naar het scherm, displays tekst of getallen of iets 688 00:33:37,780 --> 00:33:38,380 op het scherm. 689 00:33:38,380 --> 00:33:41,170 En dat is net als een neveneffect omdat het niet echt overhandigen 690 00:33:41,170 --> 00:33:41,900 het terug naar mij. 691 00:33:41,900 --> 00:33:44,770 Het is niet een antwoord binnenkant van een zwarte doos die ik kan dan 692 00:33:44,770 --> 00:33:46,130 bereiken in en pak. 693 00:33:46,130 --> 00:33:49,160 Het is gewoon doet het op zijn eigen, veel zoals Colton werd aangesloten op dit 694 00:33:49,160 --> 00:33:52,560 black box vorige week, en hij een of andere manier magische wijze werd het tekenen op het bord 695 00:33:52,560 --> 00:33:54,500 zonder mij eigenlijk betrokken. 696 00:33:54,500 --> 00:33:55,560 Dat zou een bijwerking zijn. 697 00:33:55,560 --> 00:33:59,100 Maar als ik eigenlijk had om terug te komen in hier en zeggen: oh, hier is de string 698 00:33:59,100 --> 00:34:02,040 van de gebruiker, dat zou wel een return waarde. 699 00:34:02,040 --> 00:34:05,650 >> En tot nu toe hebben we alleen gebruikte functies die andere mensen hebben geschreven. 700 00:34:05,650 --> 00:34:09,219 Maar we kunnen eigenlijk doen deze allerlei dingen onszelf. 701 00:34:09,219 --> 00:34:12,730 Dus ik ga om te gaan in de CS50 apparaat weer. 702 00:34:12,730 --> 00:34:16,020 Laat ik sluit het tabblad dat we had geopend een moment geleden. 703 00:34:16,020 --> 00:34:18,530 En laat me gaan en maak een nieuw bestand. 704 00:34:18,530 --> 00:34:22,400 En ik ga om verder te gaan en noemen dit een positive.c. 705 00:34:22,400 --> 00:34:24,770 Dus ik wil iets doen met positieve getallen hier. 706 00:34:24,770 --> 00:34:27,219 Dus ik ga om verder te gaan en te doen int - 707 00:34:27,219 --> 00:34:28,000 sorry - 708 00:34:28,000 --> 00:34:31,840 # Bevatten. 709 00:34:31,840 --> 00:34:34,280 Laten we niet diezelfde maken fout als voorheen. 710 00:34:34,280 --> 00:34:40,020 Int main (void), open krullend brace, gesloten accolade. 711 00:34:40,020 --> 00:34:41,639 >> En nu wil ik het volgende doen. 712 00:34:41,639 --> 00:34:44,600 Ik wil een programma te schrijven dat dringt erop aan dat de gebruiker geeft 713 00:34:44,600 --> 00:34:46,770 me een positief geheel getal. 714 00:34:46,770 --> 00:34:50,969 Er is dus geen GetPositiveInt functie in het CS50 bibliotheek. 715 00:34:50,969 --> 00:34:52,610 Er is maar getInt (). 716 00:34:52,610 --> 00:34:55,790 Maar dat is OK want ik heb de constructen waarmee ik kan opleggen een 717 00:34:55,790 --> 00:34:59,360 weinig beperking van die waarde. 718 00:34:59,360 --> 00:35:00,990 Ik zou zoiets als dit. 719 00:35:00,990 --> 00:35:02,780 >> Dus int n - 720 00:35:02,780 --> 00:35:04,920 en als je aan het typen bent langs, gewoon beseffen Ik ga om terug te gaan en 721 00:35:04,920 --> 00:35:06,430 veranderen sommige dingen in een ogenblik - 722 00:35:06,430 --> 00:35:09,960 dus int n gelijk getInt (). 723 00:35:09,960 --> 00:35:11,780 En dat gaat zetten een int binnenkant van n. 724 00:35:11,780 --> 00:35:13,830 En laat me een meer beschrijvend. 725 00:35:13,830 --> 00:35:23,270 Laat ik iets zeggen als ik eis dat je geeft me een positief geheel getal. 726 00:35:23,270 --> 00:35:23,550 >> Oke. 727 00:35:23,550 --> 00:35:25,250 Dus gewoon een beetje van instructies. 728 00:35:25,250 --> 00:35:26,270 En nu, wat kan ik doen? 729 00:35:26,270 --> 00:35:29,840 Nou, ik weet al vanaf mijn eenvoudige voorwaarden of takken, net zoals ik 730 00:35:29,840 --> 00:35:36,100 had in Scratch, zou ik iets zeggen zoals als n kleiner is dan of gelijk aan 731 00:35:36,100 --> 00:35:44,460 nul, dan wil ik iets doen willen, dat is niet positief. 732 00:35:44,460 --> 00:35:45,560 En toen ik kon doen - 733 00:35:45,560 --> 00:35:47,310 OK, maar ik wil echt dat int krijgen. 734 00:35:47,310 --> 00:35:52,020 Dus kon ik hier ga en ik kon soort van kopieer deze en streepje dit. 735 00:35:52,020 --> 00:35:52,570 En dan, OK. 736 00:35:52,570 --> 00:35:56,990 Als n kleiner is dan of nul doen. 737 00:35:56,990 --> 00:35:58,900 >> Nu, wat als de gebruiker niet meewerkt? 738 00:35:58,900 --> 00:36:01,560 Nou, dan ga ik lenen deze hier. 739 00:36:01,560 --> 00:36:03,130 En dan ga ik in hier en hier en hier. 740 00:36:03,130 --> 00:36:06,420 Dus dit is duidelijk niet de oplossing, toch? 741 00:36:06,420 --> 00:36:07,810 Want er is geen einde in zicht. 742 00:36:07,810 --> 00:36:13,100 Als ik wil om te eisen dat de gebruiker geeft me een positief geheel getal, ik kan 743 00:36:13,100 --> 00:36:14,150 eigenlijk het int. 744 00:36:14,150 --> 00:36:15,620 Ik kan dan controleren voor die int. 745 00:36:15,620 --> 00:36:18,570 Maar dan wil ik het opnieuw controleren en check het opnieuw en opnieuw controleren. 746 00:36:18,570 --> 00:36:21,680 Zo duidelijk, wat is de betere construct hier gebruiken? 747 00:36:21,680 --> 00:36:22,840 Oke, dus een soort van lus. 748 00:36:22,840 --> 00:36:25,430 >> Dus ik ga om zich te ontdoen van bijna alle van deze. 749 00:36:25,430 --> 00:36:27,320 En ik wil dit krijgen int ten minste een keer. 750 00:36:27,320 --> 00:36:28,890 Dus ik ga zeggen te doen - 751 00:36:28,890 --> 00:36:32,110 en ik kom terug naar de come terwijl in slechts een moment - 752 00:36:32,110 --> 00:36:33,050 Nu, wat doen? 753 00:36:33,050 --> 00:36:35,860 Ik ga int n krijgt getInt () doen. 754 00:36:35,860 --> 00:36:36,080 OK. 755 00:36:36,080 --> 00:36:37,250 Dus dat is vrij goed. 756 00:36:37,250 --> 00:36:39,750 En nu hoe vaak doen Ik wil dit doen? 757 00:36:39,750 --> 00:36:45,770 >> Laat ik het printf binnenkant van de lus dus ik kan opnieuw en opnieuw te eisen, 758 00:36:45,770 --> 00:36:46,740 mocht dat nodig zijn. 759 00:36:46,740 --> 00:36:49,720 En wat wil ik dit terwijl de conditie te doen? 760 00:36:49,720 --> 00:36:53,870 Ik wil dit blijven doen terwijl wat is het geval? 761 00:36:53,870 --> 00:36:54,125 Yeah. 762 00:36:54,125 --> 00:36:55,390 N kleiner is dan of gelijk aan nul. 763 00:36:55,390 --> 00:36:58,180 Dus al aanzienlijk hebben we opgeruimd deze code. 764 00:36:58,180 --> 00:37:00,700 We hebben geleend een zeer eenvoudig te construeren - de do-while-lus. 765 00:37:00,700 --> 00:37:04,690 Ik heb gestolen net de belangrijke lijnen van de code die ik begon te kopiëren en 766 00:37:04,690 --> 00:37:05,960 plakken, dat was niet verstandig. 767 00:37:05,960 --> 00:37:09,790 En dus nu ga ik echt plakken het hier en doe het gewoon een keer. 768 00:37:09,790 --> 00:37:12,990 >> En wat moet ik nu wil doen op het einde van dit programma? 769 00:37:12,990 --> 00:37:16,810 Ik zeg gewoon dat iets simpels graag, bedankt voor de - en 770 00:37:16,810 --> 00:37:18,980 Ik zal% i do voor int - 771 00:37:18,980 --> 00:37:23,270 backslash n, komma, en dan plug in n, puntkomma. 772 00:37:23,270 --> 00:37:23,910 >> Oke. 773 00:37:23,910 --> 00:37:27,290 Dus laten we eens kijken wat er nu gebeurt wanneer ik dit programma. 774 00:37:27,290 --> 00:37:30,600 Ik ga om te gaan en doen maken positief. 775 00:37:30,600 --> 00:37:30,880 Verdomme. 776 00:37:30,880 --> 00:37:31,600 Een paar fouten. 777 00:37:31,600 --> 00:37:32,960 Dus laat me schuiven terug naar de eerste. 778 00:37:32,960 --> 00:37:34,020 Werken niet via hen naar achteren. 779 00:37:34,020 --> 00:37:37,000 Werken door ze van boven naar beneden opdat zij cascade en alleen 780 00:37:37,000 --> 00:37:38,630 een ding verkeerd. 781 00:37:38,630 --> 00:37:42,532 Impliciete verklaring van functie getInt (). 782 00:37:42,532 --> 00:37:43,020 Yeah. 783 00:37:43,020 --> 00:37:44,420 Dus het was niet genoeg. 784 00:37:44,420 --> 00:37:46,760 Ik soort van dezelfde fout gemaakt, maar een beetje anders deze keer. 785 00:37:46,760 --> 00:37:51,940 Ik moet niet alleen zijn stdio.h maar Ook cs50.h, die het bevat 786 00:37:51,940 --> 00:37:56,770 zogenaamde verklaringen van krijgen int, die leren van het apparaat, of leert 787 00:37:56,770 --> 00:37:58,760 C wat getInt () is. 788 00:37:58,760 --> 00:37:59,550 >> Dus laat me opnieuw opslaan. 789 00:37:59,550 --> 00:38:02,040 Ik ga naar de andere fouten negeren want ik ga hopen dat ze 790 00:38:02,040 --> 00:38:05,210 een of andere manier verband houden met de fout Ik heb al vast. 791 00:38:05,210 --> 00:38:08,710 Dus laat me gaan en opnieuw compileren met make positieve, Enter. 792 00:38:08,710 --> 00:38:09,020 Verdomme. 793 00:38:09,020 --> 00:38:09,985 Drie fouten, nog steeds. 794 00:38:09,985 --> 00:38:12,650 Laat me schuiven tot aan de eerste. 795 00:38:12,650 --> 00:38:14,320 Ongebruikte variabele n. 796 00:38:14,320 --> 00:38:15,850 We hebben dit niet eerder gezien. 797 00:38:15,850 --> 00:38:17,200 En ook dit is een beetje cryptisch. 798 00:38:17,200 --> 00:38:18,850 Dit is de uitgang van de compiler. 799 00:38:18,850 --> 00:38:23,610 En wat dat gemarkeerde lijn er - positive.c :9:13 - 800 00:38:23,610 --> 00:38:28,960 zegt, het is te zeggen op lijn negen van positive.c op de 13e teken, 801 00:38:28,960 --> 00:38:31,510 13e kolom, je maakte deze fout. 802 00:38:31,510 --> 00:38:34,230 >> En in het bijzonder, is het vertellen me ongebruikte variabele n. 803 00:38:34,230 --> 00:38:35,790 Dus laten we zien - 804 00:38:35,790 --> 00:38:37,150 lijn negen. 805 00:38:37,150 --> 00:38:40,430 Ik ben met behulp van n in de zin dat Ik geef het een waarde. 806 00:38:40,430 --> 00:38:44,200 Maar wat de compiler niet leuk is dat ik niet schijnbaar gebruikt. 807 00:38:44,200 --> 00:38:45,560 Maar wacht eens even, ik gebruik het. 808 00:38:45,560 --> 00:38:48,170 In lijn 11, ik gebruik het hier. 809 00:38:48,170 --> 00:38:52,430 Maar als ik naar beneden scrollen verder bij positive.c :11 - 810 00:38:52,430 --> 00:38:56,230 dus op lijn 11, karakter 12, de compiler vertelt me, het gebruik van 811 00:38:56,230 --> 00:38:58,670 gedeclareerde identifier n. 812 00:38:58,670 --> 00:39:02,760 >> Dus zwartwerk betekent dat ik heb niet gespecificeerd als een 813 00:39:02,760 --> 00:39:04,970 variabele met een gegevenstype. 814 00:39:04,970 --> 00:39:05,500 Maar wacht eens even. 815 00:39:05,500 --> 00:39:09,150 Ik deed precies dat in lijn negen. 816 00:39:09,150 --> 00:39:11,100 Zo iemand wordt hier echt verward. 817 00:39:11,100 --> 00:39:14,900 Het is of ik of de compiler omdat in lijn negen, nogmaals, Ik verklaar een 818 00:39:14,900 --> 00:39:18,650 int n, en ik ben het toewijzen van de retourneren waarde van getInt (). 819 00:39:18,650 --> 00:39:22,930 Dan gebruik ik die variabele n in lijn 11 en te controleren of de waarde lager is 820 00:39:22,930 --> 00:39:24,050 dan of gelijk aan nul. 821 00:39:24,050 --> 00:39:27,430 Maar dit is blijkbaar slecht en gebroken waarom? 822 00:39:27,430 --> 00:39:30,630 823 00:39:30,630 --> 00:39:32,490 Zeg het nog eens? 824 00:39:32,490 --> 00:39:35,690 >> Ah, ik moet n verklaren voordat invoeren van de lus. 825 00:39:35,690 --> 00:39:36,370 Maar waarom? 826 00:39:36,370 --> 00:39:39,830 Ik bedoel, we voorgesteld een beetje geleden dat het is fijn om variabelen op te geven 827 00:39:39,830 --> 00:39:43,600 allemaal op een lijn en dan toewijzen enkele waarde. 828 00:39:43,600 --> 00:39:46,790 Een globale variabele - laten we terugkeren om dat idee in slechts een moment. 829 00:39:46,790 --> 00:39:48,690 Waarom wil je dat ik te zetten Het buiten de lus? 830 00:39:48,690 --> 00:40:03,170 831 00:40:03,170 --> 00:40:03,830 Het is. 832 00:40:03,830 --> 00:40:06,780 Precies. 833 00:40:06,780 --> 00:40:09,610 >> Dus, hoewel, enigszins counterintuitive, laat me samenvatten. 834 00:40:09,610 --> 00:40:13,510 Wanneer u verklaren n binnen van de do blok er - 835 00:40:13,510 --> 00:40:16,320 bijzonder binnenin die accolades - 836 00:40:16,320 --> 00:40:19,210 die variabele n heeft wat riep een scope - 837 00:40:19,210 --> 00:40:23,210 niets ons puntensysteem de natuurlijk - maar heeft een bereik dat is 838 00:40:23,210 --> 00:40:25,190 beperkt tot die accolades. 839 00:40:25,190 --> 00:40:28,460 Met andere woorden, meestal als je verklaren een variabele in een reeks 840 00:40:28,460 --> 00:40:33,370 accolades, die variabele bestaat alleen binnenkant van die accolades. 841 00:40:33,370 --> 00:40:37,320 Zodat deze enkele logica, hoewel Ik heb n verklaarde in lijn negen, het 842 00:40:37,320 --> 00:40:41,910 verdwijnt wezen van het toepassingsgebied, verdwijnt uit het geheugen, om zo te zeggen, 843 00:40:41,910 --> 00:40:43,370 tegen de tijd dat ik raakte lijn 11. 844 00:40:43,370 --> 00:40:47,370 Omdat lijn 11, helaas, is buiten deze accolades. 845 00:40:47,370 --> 00:40:51,540 >> Dus ik helaas kan dit niet oplossen door ga terug naar wat ik deed het eerder. 846 00:40:51,540 --> 00:40:53,370 Je zou in eerste instantie dit te doen. 847 00:40:53,370 --> 00:40:56,370 Maar wat ben je nu niet cyclisch doen? 848 00:40:56,370 --> 00:40:58,260 Je bent natuurlijk niet krijgen het int cyclisch. 849 00:40:58,260 --> 00:41:01,320 Dus we kunnen de getInt () verlaten, en we moet de getInt () in de vertrekken 850 00:41:01,320 --> 00:41:04,420 lus want dat is wat we willen pester de gebruiker voor opnieuw en opnieuw. 851 00:41:04,420 --> 00:41:08,660 Maar het volstaat wel om te gaan tot lijn, zeg, zes. 852 00:41:08,660 --> 00:41:10,150 Int n, puntkomma. 853 00:41:10,150 --> 00:41:12,990 Geef het niet een waarde nog omdat je hoeft niet te gewoon nog niet. 854 00:41:12,990 --> 00:41:16,220 >> Maar nu hier beneden, bericht - dit zou een zeer gemakkelijke vergissing zijn. 855 00:41:16,220 --> 00:41:19,440 Ik wil niet mijn vorige schaduw verklaring van n. 856 00:41:19,440 --> 00:41:22,830 Ik wil de n gebruiken die daadwerkelijk bestaat. 857 00:41:22,830 --> 00:41:25,780 En dus nu in lijn 10, Ik wijs n een waarde. 858 00:41:25,780 --> 00:41:28,580 Maar in lijn zes, verklaar ik n. 859 00:41:28,580 --> 00:41:32,940 En zo kan ik of kan ik niet gebruik het in lijn 12 nu? 860 00:41:32,940 --> 00:41:37,120 Ik kan, want tussen die krullend braces is n nu verklaard? 861 00:41:37,120 --> 00:41:38,770 De ene hier op lijn vijf. 862 00:41:38,770 --> 00:41:40,330 Om een ​​hier op lijn 14. 863 00:41:40,330 --> 00:41:49,770 Dus als ik nu uitzoomen, sla dit bestand, ga terug in en start maken positief, het 864 00:41:49,770 --> 00:41:50,820 gecompileerd deze tijd. 865 00:41:50,820 --> 00:41:51,940 Dus dat is al vooruitgang. 866 00:41:51,940 --> 00:41:53,640 Slash. . / Positief, Enter. 867 00:41:53,640 --> 00:41:56,060 >> Ik eis dat je me een positief geheel getal. 868 00:41:56,060 --> 00:41:57,750 Negatief 1. 869 00:41:57,750 --> 00:41:59,020 Negatief 2. 870 00:41:59,020 --> 00:42:00,680 Negatieve 3. 871 00:42:00,680 --> 00:42:01,760 Nul. 872 00:42:01,760 --> 00:42:03,000 Een. 873 00:42:03,000 --> 00:42:05,130 En bedankt voor de een is wat er nu afgedrukt. 874 00:42:05,130 --> 00:42:07,400 >> Laat ik iets anders proberen, uit nieuwsgierigheid. 875 00:42:07,400 --> 00:42:09,600 Ik word verteld om input een integer. 876 00:42:09,600 --> 00:42:12,870 Maar wat als ik in plaats intypen lam? 877 00:42:12,870 --> 00:42:14,460 Dus zie je nu een andere prompt - 878 00:42:14,460 --> 00:42:15,350 retry. 879 00:42:15,350 --> 00:42:17,670 Maar nergens in mijn code schreef ik opnieuw proberen. 880 00:42:17,670 --> 00:42:22,320 Dus waar, vermoedelijk, is dit opnieuw proberen prompt uit, zou je zeggen? 881 00:42:22,320 --> 00:42:23,540 Ja, uit getInt () zelf. 882 00:42:23,540 --> 00:42:26,650 Dus een van de dingen personeel CS50's doet voor u, althans in deze eerste paar 883 00:42:26,650 --> 00:42:30,400 weken, wordt hebben we een aantal hoeveelheid geschreven van foutcontrole om ervoor te zorgen dat, indien 884 00:42:30,400 --> 00:42:34,260 je getInt () noemen, zul je op zijn minst weer een int van de gebruiker. 885 00:42:34,260 --> 00:42:35,460 Je krijgt niet een string. 886 00:42:35,460 --> 00:42:36,440 Je krijgt niet een char. 887 00:42:36,440 --> 00:42:39,660 Je zal niet iets te krijgen heel anders. 888 00:42:39,660 --> 00:42:40,510 U zult een int te krijgen. 889 00:42:40,510 --> 00:42:41,890 >> Nu, is het misschien niet positief. 890 00:42:41,890 --> 00:42:42,770 Het is misschien niet negatief zijn. 891 00:42:42,770 --> 00:42:44,550 Wij geven geen garanties rond dat. 892 00:42:44,550 --> 00:42:48,960 Maar we zullen pester de gebruiker om opnieuw te proberen, retry, opnieuw proberen totdat hij of zij daadwerkelijk 893 00:42:48,960 --> 00:42:49,810 samenwerkt. 894 00:42:49,810 --> 00:42:53,085 Evenzo, als ik 1.23, dat geen int. 895 00:42:53,085 --> 00:42:58,400 Maar als ik typ in, zeg, 50, dat geeft mij een waarde die ik wilde. 896 00:42:58,400 --> 00:42:59,050 >> Oke. 897 00:42:59,050 --> 00:43:01,380 Dus niet slecht. 898 00:43:01,380 --> 00:43:04,780 Heeft u vragen over wat we net gedaan hebt? 899 00:43:04,780 --> 00:43:07,930 De sleutel mee te nemen zijn, om duidelijk te zijn, niet zozeer de lus, die we hebben gezien 900 00:43:07,930 --> 00:43:10,880 voordat ook al hebben we niet echt gebruikt, maar de kwestie van de reikwijdte, waar 901 00:43:10,880 --> 00:43:17,045 variabelen alleen kan alleen worden gebruikt binnen enkele opgegeven bereik. 902 00:43:17,045 --> 00:43:19,830 >> Oke, laat me het adres van de suggestie eerder hebt gemaakt, dat van een 903 00:43:19,830 --> 00:43:20,860 globale variabele. 904 00:43:20,860 --> 00:43:24,880 Even terzijde, het blijkt dat een andere oplossing voor dit probleem, maar 905 00:43:24,880 --> 00:43:28,880 typisch een oplossing of onjuiste een slecht ontworpen oplossing is 906 00:43:28,880 --> 00:43:31,670 verklaren uw variabele als wat zogenaamde globale variabele. 907 00:43:31,670 --> 00:43:34,610 Nu ben ik soort van het schenden van mijn definitie van omvang omdat er 908 00:43:34,610 --> 00:43:37,680 geen accolades aan de top en de onderkant van een bestand. 909 00:43:37,680 --> 00:43:40,190 Maar de implicatie van die is dat nu in lijn vier, 910 00:43:40,190 --> 00:43:41,710 n is een globale variabele. 911 00:43:41,710 --> 00:43:44,460 En zoals de naam al aangeeft, is het gewoon overal toegankelijk. 912 00:43:44,460 --> 00:43:45,790 >> Kras heeft eigenlijk deze. 913 00:43:45,790 --> 00:43:48,650 Als u een variabele wordt gebruikt, zou je herinneren je moest kiezen als het voor 914 00:43:48,650 --> 00:43:50,780 deze sprite of voor alle sprites. 915 00:43:50,780 --> 00:43:54,270 Nou ja, alle sprites is gewoon het duidelijker manier om te zeggen globaal. 916 00:43:54,270 --> 00:43:55,520 Yeah? 917 00:43:55,520 --> 00:44:09,690 918 00:44:09,690 --> 00:44:10,990 Ah, echt goede vraag. 919 00:44:10,990 --> 00:44:14,310 >> Zo herinneren dat in de allereerste versie van mijn code, als ik verkeerd 920 00:44:14,310 --> 00:44:17,700 gedeclareerd en gedefinieerd n in lijn negen - 921 00:44:17,700 --> 00:44:19,980 Ik verklaarde het als een variabele en ik gaf het een waarde met 922 00:44:19,980 --> 00:44:21,160 de opdracht operator - 923 00:44:21,160 --> 00:44:22,520 Dit gaf me twee fouten. 924 00:44:22,520 --> 00:44:26,560 One, dat n niet is gebruikt, en twee, die in de lijn 11 925 00:44:26,560 --> 00:44:27,770 het was gewoon niet verklaard. 926 00:44:27,770 --> 00:44:31,120 Dus de eerste die ik niet adres op het moment. 927 00:44:31,120 --> 00:44:35,130 Het is niet strikt een fout te verklaren een variabele, maar niet gebruiken. 928 00:44:35,130 --> 00:44:38,540 Maar een van de dingen die we hebben gedaan in de CS50 apparaat, doelbewust, 929 00:44:38,540 --> 00:44:43,340 pedagogisch, is we hebben aangezwengeld het verwachtingen van de compiler te maken 930 00:44:43,340 --> 00:44:46,970 ervoor dat je dingen doet niet alleen correct maar echt correct. 931 00:44:46,970 --> 00:44:51,520 >> Want als je het declareren van een variabele als n en nooit gebruikt, of het gebruik ervan 932 00:44:51,520 --> 00:44:53,700 correct, maar dan wat is het daar? 933 00:44:53,700 --> 00:44:55,650 Het dient werkelijk geen enkel doel. 934 00:44:55,650 --> 00:44:58,980 En het is heel makkelijk na verloop van tijd, als je niet je eigen computer niet configureren in 935 00:44:58,980 --> 00:45:01,960 op deze manier, om alleen maar code die heeft weinig resten hier, resten er. 936 00:45:01,960 --> 00:45:04,390 En dan maanden later je terugkijken en je bent zoals, waarom is deze lijn van 937 00:45:04,390 --> 00:45:05,060 code daar? 938 00:45:05,060 --> 00:45:07,940 En als er geen goede reden is heeft u of uw collega's niet ten goede 939 00:45:07,940 --> 00:45:10,650 op de weg te moeten struikelen over het dan. 940 00:45:10,650 --> 00:45:12,540 >> Even terzijde, waar is dat vandaan? 941 00:45:12,540 --> 00:45:16,410 Nou, herinneren dat elke keer als we compileren programma, allemaal van dit spul is 942 00:45:16,410 --> 00:45:17,380 wordt gedrukt. 943 00:45:17,380 --> 00:45:18,350 Dus we zullen terugkomen naar dit. 944 00:45:18,350 --> 00:45:22,230 Maar nogmaals, maak is een hulpprogramma dat automatiseert het proces van het samenstellen van 945 00:45:22,230 --> 00:45:24,830 uitvoeren van de eigenlijke compiler genaamd Clang. 946 00:45:24,830 --> 00:45:27,650 Dit ding, zullen we uiteindelijk zien, heeft te maken met het debuggen met een speciale 947 00:45:27,650 --> 00:45:29,060 programma genaamd de debugger. 948 00:45:29,060 --> 00:45:32,150 Dit heeft te maken met het optimaliseren van de code - meer op dat in de toekomst. 949 00:45:32,150 --> 00:45:33,620 Std = c99 - 950 00:45:33,620 --> 00:45:37,870 Dit betekent gewoon gebruik maken van de versie van 1999 van C. C is zelfs langer dan rond geweest 951 00:45:37,870 --> 00:45:40,830 dat, maar ze maakten een aantal leuke veranderingen 10 plus jaar geleden. 952 00:45:40,830 --> 00:45:42,690 >> En hier is het relevant zijn. 953 00:45:42,690 --> 00:45:45,880 Wij zeggen maken iets dat eerder zou een waarschuwing zijn geweest 954 00:45:45,880 --> 00:45:48,560 een fout te voorkomen dat de student van compileren. 955 00:45:48,560 --> 00:45:51,400 En wand betekent dat voor een heleboel dingen, niet 956 00:45:51,400 --> 00:45:53,060 alleen gerelateerd aan variabelen. 957 00:45:53,060 --> 00:45:54,700 En dan laat ik ga naar het einde van deze lijn. 958 00:45:54,700 --> 00:45:56,430 En ook dit, we zullen uiteindelijk terug te komen op. 959 00:45:56,430 --> 00:45:59,040 Dit is uiteraard de naam van het bestand dat ik compileren. 960 00:45:59,040 --> 00:46:02,160 Dit herinnert aan de naam van het bestand Ik ben uitvoeren als de naam 961 00:46:02,160 --> 00:46:04,070 van mijn uitvoerbare programma. 962 00:46:04,070 --> 00:46:08,970 Dit-lcs50 betekent gewoon gebruik maken van de CS50 bibliotheek, en alle nullen en enen dat 963 00:46:08,970 --> 00:46:12,390 het personeel schreef en eerder gecompileerde dit jaar, te integreren 964 00:46:12,390 --> 00:46:13,490 ze in mijn programma. 965 00:46:13,490 --> 00:46:16,130 >> En iedereen weet wat-lm is? 966 00:46:16,130 --> 00:46:18,150 Het is de wiskunde bibliotheek, dat is gewoon daar zelfs als je 967 00:46:18,150 --> 00:46:19,320 niet te doen geen wiskunde. 968 00:46:19,320 --> 00:46:22,620 Het is gewoon automatisch verstrekt aan ons door te maken. 969 00:46:22,620 --> 00:46:26,540 >> Nou, laat me u een ander voorbeeld hier door het openen van een nieuw bestand. 970 00:46:26,540 --> 00:46:30,560 En laat me dit opslaan als string.c. 971 00:46:30,560 --> 00:46:37,980 Het blijkt dat als we praten over de gegevens types van vandaag, er is nog meer 972 00:46:37,980 --> 00:46:40,630 gaande onder de motorkap dan we tot nu toe heb gezien. 973 00:46:40,630 --> 00:46:42,290 Dus laat me snel doen een snelle programma. 974 00:46:42,290 --> 00:46:44,510 Omvatten stdio.h. 975 00:46:44,510 --> 00:46:45,730 En ik zal redden dat. 976 00:46:45,730 --> 00:46:48,110 En weet je, laat me niet de dezelfde fout opnieuw en opnieuw. 977 00:46:48,110 --> 00:46:50,540 Omvatten cs50.h. 978 00:46:50,540 --> 00:46:54,870 En laat me nu ga je gang en doe int main (void). 979 00:46:54,870 --> 00:46:58,790 >> En nu wil ik gewoon een programma doen die dit doet - verklaren een string 980 00:46:58,790 --> 00:47:03,610 riep s en krijg een string van de gebruiker. 981 00:47:03,610 --> 00:47:05,820 En laat me een beetje doen instructies hier - 982 00:47:05,820 --> 00:47:09,960 geef me een string - zo de gebruiker weet wat te doen. 983 00:47:09,960 --> 00:47:13,190 En dan hier beneden onder dit, Ik wil het volgende doen - 984 00:47:13,190 --> 00:47:16,060 voor int i krijgt nul. 985 00:47:16,060 --> 00:47:18,580 Nogmaals, informatici doorgaans beginnen te tellen bij nul, maar we konden 986 00:47:18,580 --> 00:47:20,340 maken dat men als we echt wilden. 987 00:47:20,340 --> 00:47:27,240 Nu ik ga doen, ik minder dan de string lengte van s. 988 00:47:27,240 --> 00:47:28,430 Dus strlen - 989 00:47:28,430 --> 00:47:29,510 S-T-R-L-E-N - 990 00:47:29,510 --> 00:47:31,650 nogmaals, het is beknopt omdat het makkelijker te typen, ook al is het een 991 00:47:31,650 --> 00:47:32,590 beetje cryptisch. 992 00:47:32,590 --> 00:47:35,290 >> Dat is een functie die we niet gebruikt vóór maar letterlijk betekent dat - 993 00:47:35,290 --> 00:47:37,810 terug naar mij een nummer dat staat voor de lengte van de tekenreeks 994 00:47:37,810 --> 00:47:38,690 dat de gebruiker heeft ingevoerd. 995 00:47:38,690 --> 00:47:41,740 Als ze ingetypt hallo, zou het terug vijf omdat er vijf 996 00:47:41,740 --> 00:47:42,890 brieven in hello. 997 00:47:42,890 --> 00:47:45,390 Dan, op elke iteratie van deze lus, i plus plus. 998 00:47:45,390 --> 00:47:49,170 Dus nogmaals, een standaard te bouwen, zelfs als je bent niet helemaal te comfortabel of 999 00:47:49,170 --> 00:47:50,420 vertrouwd met het nog niet. 1000 00:47:50,420 --> 00:47:53,220 >> Maar nu op elke iteratie van deze lus, merken wat ik ga doen. 1001 00:47:53,220 --> 00:47:56,690 Ik wil om vooruit te gaan en af ​​te drukken uit een enkel karakter - 1002 00:47:56,690 --> 00:47:59,940 dus% c backslash n op een nieuwe regel. 1003 00:47:59,940 --> 00:48:00,990 En dan, weet je wat ik wil doen? 1004 00:48:00,990 --> 00:48:05,090 Wat ook het woord is dat soorten van de gebruiker in, zoals hallo, ik wil afdrukken 1005 00:48:05,090 --> 00:48:09,530 H-E-L-L-O, een teken per regel. 1006 00:48:09,530 --> 00:48:13,080 Met andere woorden, ik wil krijgen op de afzonderlijke tekens in een string, 1007 00:48:13,080 --> 00:48:16,770 waarbij tot nu toe een string heeft net is een reeks tekens. 1008 00:48:16,770 --> 00:48:21,690 >> En het blijkt dat ik kan doen s, beugel, i, haakje sluiten, sluit 1009 00:48:21,690 --> 00:48:23,580 haakjes, puntkomma. 1010 00:48:23,580 --> 00:48:25,640 En Ik moet nog een ding doen. 1011 00:48:25,640 --> 00:48:30,570 Het is in een bestand met de naam string.h dat strlen wordt verklaard. 1012 00:48:30,570 --> 00:48:33,190 Dus als ik wil die functie te gebruiken, Ik moet de compiler te vertellen, 1013 00:48:33,190 --> 00:48:34,450 verwacht te gebruiken. 1014 00:48:34,450 --> 00:48:37,040 Laat me nu ga je gang en maak het programma genaamd string. 1015 00:48:37,040 --> 00:48:39,150 Punt, slash, string. 1016 00:48:39,150 --> 00:48:40,130 >> Geef me een string. 1017 00:48:40,130 --> 00:48:40,900 Ik zal doorgaan en typen. 1018 00:48:40,900 --> 00:48:43,040 Hallo, in hoofdletters, Enter. 1019 00:48:43,040 --> 00:48:47,390 En nu merk ik heb dit geprint een teken na de andere. 1020 00:48:47,390 --> 00:48:51,450 Dus de nieuwe detail hierbij is dat een string, aan het eind van de dag, kan 1021 00:48:51,450 --> 00:48:54,810 toegankelijk door middel van de individuele tekens door de invoering van het plein 1022 00:48:54,810 --> 00:48:55,840 haakjesnotering. 1023 00:48:55,840 --> 00:48:59,090 En dat komt omdat een string eronder de kap is inderdaad een opeenvolging van 1024 00:48:59,090 --> 00:48:59,810 tekens. 1025 00:48:59,810 --> 00:49:02,010 Maar wat is er netjes over hen is in het RAM-geheugen van uw computer - 1026 00:49:02,010 --> 00:49:05,300 Mac, pc, wat het ook is - ze zijn letterlijk rug aan rug aan rug - 1027 00:49:05,300 --> 00:49:06,225 H-E-L-L-O - 1028 00:49:06,225 --> 00:49:09,920 bij afzonderlijke, aangrenzende bytes in het geheugen. 1029 00:49:09,920 --> 00:49:13,210 >> Dus als je wilt krijgen op de achtste dergelijke byte, die deze lus zou 1030 00:49:13,210 --> 00:49:16,900 beugel nul, een beugel, de beugel twee, beugel drie, vier beugel - 1031 00:49:16,900 --> 00:49:18,890 die nul is geïndexeerd tot vijf - 1032 00:49:18,890 --> 00:49:23,330 dat zal uitprinten H-E-L-L-O op zijn eigen lijn. 1033 00:49:23,330 --> 00:49:26,320 >> Nu, als een teaser, laat ik je de allerlei dingen die je zult uiteindelijk 1034 00:49:26,320 --> 00:49:31,950 kunnen begrijpen, althans met enkele nauwe kijken. 1035 00:49:31,950 --> 00:49:35,610 Voor een, wat we in het huidige voorbeelden, als je wilt, is eigenlijk 1036 00:49:35,610 --> 00:49:38,300 een van de allereerste ontsnappingen voor de iPhone. 1037 00:49:38,300 --> 00:49:40,800 Jailbreaking betekent dat het kraken van de telefoon zodat je daadwerkelijk kunt gebruiken op een 1038 00:49:40,800 --> 00:49:43,380 andere vervoerder of install uw eigen software. 1039 00:49:43,380 --> 00:49:45,660 En je zult merken dit ziet er heel cryptisch, waarschijnlijk. 1040 00:49:45,660 --> 00:49:46,520 Maar kijk eens naar dit. 1041 00:49:46,520 --> 00:49:50,420 De iPhone was blijkbaar gebarsten met een lus, een als voorwaarde, een anders 1042 00:49:50,420 --> 00:49:52,580 conditie, een bos van functies we hebben niet gezien. 1043 00:49:52,580 --> 00:49:54,230 >> En nogmaals, dat doe je niet bij het eerste gezicht waarschijnlijk 1044 00:49:54,230 --> 00:49:55,620 begrijpen hoe dit werkt. 1045 00:49:55,620 --> 00:49:58,940 Maar alles wat we soort nemen vanzelfsprekend in ons moderne leven 1046 00:49:58,940 --> 00:50:02,040 eigenlijk meestal zelfs beperken tot sommige van deze fundamenten waar we zijn geweest 1047 00:50:02,040 --> 00:50:02,820 kijken naar. 1048 00:50:02,820 --> 00:50:06,680 Laat me ga je gang en open een andere programma, holloway.c. 1049 00:50:06,680 --> 00:50:08,970 Dus ook dit is iets wat je moet niet echt weten. 1050 00:50:08,970 --> 00:50:12,440 Zelfs niemand van het personeel of ik kon waarschijnlijk dit uit door te kijken naar 1051 00:50:12,440 --> 00:50:15,450 omdat dit was iemands code dat tot wat werd ingediend 1052 00:50:15,450 --> 00:50:19,630 van oudsher bekend als een obscure C wedstrijd, waar je een programma te schrijven 1053 00:50:19,630 --> 00:50:24,670 dat compileert en draait, maar is zo verdomd cryptische geen mens kan begrijpen wat 1054 00:50:24,670 --> 00:50:27,530 het gaat doen tot ze eigenlijk draaien. 1055 00:50:27,530 --> 00:50:29,940 >> Dus inderdaad, als je kijkt naar deze code, zie ik een switch. 1056 00:50:29,940 --> 00:50:30,870 Ik zie hoofd. 1057 00:50:30,870 --> 00:50:33,800 Ik zie deze vierkante haakjes impliceren een soort van een array. 1058 00:50:33,800 --> 00:50:35,970 Heeft iemand willen raden wat dit programma eigenlijk 1059 00:50:35,970 --> 00:50:37,220 doet als ik zonder Holloway? 1060 00:50:37,220 --> 00:50:39,940 1061 00:50:39,940 --> 00:50:40,750 Ja. 1062 00:50:40,750 --> 00:50:43,050 OK. 1063 00:50:43,050 --> 00:50:44,690 Goed gedaan. 1064 00:50:44,690 --> 00:50:48,090 Dus alleen het personeel en ik kan niet achterhalen wat deze dingen doen. 1065 00:50:48,090 --> 00:50:51,670 >> En nu tot slot, laat me ga je gang en de openstelling van een ander programma. 1066 00:50:51,670 --> 00:50:53,440 Deze - 1067 00:50:53,440 --> 00:50:55,550 weer, zullen we de broncode te maken online beschikbaar - dit is gewoon 1068 00:50:55,550 --> 00:50:57,480 soort van mooi om te zien. 1069 00:50:57,480 --> 00:50:59,750 Alles wat ze deden is geraakt de spatiebalk nogal wat. 1070 00:50:59,750 --> 00:51:01,320 Maar dit is echte code. 1071 00:51:01,320 --> 00:51:04,790 Dus als je denkt dat is vrij, als we daadwerkelijk gereden dit op de prompt, 1072 00:51:04,790 --> 00:51:08,970 uiteindelijk zult u zien hoe wij misschien dingen doen als dit. 1073 00:51:08,970 --> 00:51:14,008 >> Dus laten we u laten op die nota en zie je op woensdag. 1074 00:51:14,008 --> 00:51:18,440 >> [Muziek] 1075 00:51:18,440 --> 00:51:23,380 >> SPEAKER 2: Bij de volgende CS50, de TFs stadium een ​​muiterij. 1076 00:51:23,380 --> 00:51:24,112 >> SPEAKER 3: Daar is hij. 1077 00:51:24,112 --> 00:51:25,362 Grijp hem! 1078 00:51:25,362 --> 00:51:29,912 1079 00:51:29,912 --> 00:51:32,074 >> [Muziek]