1 00:00:07,420 --> 00:00:08,160 [Powered by Google Translate] David J. MALAN: Okej. 2 00:00:08,160 --> 00:00:11,170 Detta är CS50, och detta är slutet av vecka två. 3 00:00:11,170 --> 00:00:14,650 Om du räknar med att vara hungrig vid denna tid i morgon, vet att vi kommer 4 00:00:14,650 --> 00:00:18,920 att sammankalla en liten grupp i morgon, torsdag, 1:15 PM. 5 00:00:18,920 --> 00:00:21,460 Det är denna URL här om du vill RSVP. 6 00:00:21,460 --> 00:00:25,270 Utrymmet är begränsat, så förlåt om formuläret har fyllts upp med den tid du 7 00:00:25,270 --> 00:00:26,680 fylla ut. 8 00:00:26,680 --> 00:00:29,400 Annan URL även om det kan vara av intresse är. 9 00:00:29,400 --> 00:00:32,409 >> Så i nästan en månad, kursen kommer att göras tillgänglig 10 00:00:32,409 --> 00:00:36,090 allt bredare via EDX, via vilken folk på Internet kommer att vara 11 00:00:36,090 --> 00:00:39,580 kunna följa med, engagera sig i kursen helt aktivt, faktiskt. 12 00:00:39,580 --> 00:00:43,070 De kommer att använda CS50 Appliance och CS50 Diskutera och de flesta av 13 00:00:43,070 --> 00:00:45,840 olika mjukvaruverktyg som vi redan har använt den här terminen. 14 00:00:45,840 --> 00:00:49,030 Och en av de initiativ som vi vill ta på som ett experiment i år 15 00:00:49,030 --> 00:00:53,120 är att se hur mycket innehåll som vi kan översätta till andra talade och 16 00:00:53,120 --> 00:00:54,110 skriftspråk. 17 00:00:54,110 --> 00:00:58,000 Så om du kan ha ett intresse av att delta i detta projekt, där 18 00:00:58,000 --> 00:01:02,090 vi kommer att ge engelska avskrifter och undertexter för kursens 19 00:01:02,090 --> 00:01:05,190 föreläsningar och shorts och seminarier och sektioner och liknande - 20 00:01:05,190 --> 00:01:08,700 om du talar flytande eller skriva flytande ett annat språk, skulle vi 21 00:01:08,700 --> 00:01:12,240 älskar att engagera dig i detta projekt, där du tar på en eller flera av de 22 00:01:12,240 --> 00:01:15,340 videor, översätta dem till ett språk du känner ganska väl. 23 00:01:15,340 --> 00:01:19,050 För att ge dig en känsla av gränssnittet, det är det här webbaserade användargränssnitt 24 00:01:19,050 --> 00:01:22,330 att vi kommer att använda som kommer att skapa i huvudsak en UI som denna. 25 00:01:22,330 --> 00:01:24,520 Detta var jag undervisade lite Halloween sedan. 26 00:01:24,520 --> 00:01:27,710 Och på den högra sidan där i svart bredvid dessa tidsstämplar, 27 00:01:27,710 --> 00:01:31,300 ser du de olika saker som kom ur min mun den dagen. 28 00:01:31,300 --> 00:01:34,660 Och sedan under det, kommer du att kunna översätta till andra språk. 29 00:01:34,660 --> 00:01:37,840 Exakt vad mappningen mellan, i detta fall, Engelska 30 00:01:37,840 --> 00:01:38,660 och, säg, spanska. 31 00:01:38,660 --> 00:01:40,480 Så det är faktiskt en mycket användarvänligt verktyg. 32 00:01:40,480 --> 00:01:43,690 Du kan spola tillbaka och snabbspola framåt mycket lätt med kortkommandon. 33 00:01:43,690 --> 00:01:46,710 Så om du vill delta i detta experiment och få dina ord 34 00:01:46,710 --> 00:01:50,730 ses och läsas av potentiellt tusentals människor där ute, gör du välkommen 35 00:01:50,730 --> 00:01:51,960 gratis att delta. 36 00:01:51,960 --> 00:01:56,940 >> Nu ett ord om kattungen från måndag, så vi har skickat en alltför 37 00:01:56,940 --> 00:01:58,120 skrämmande budskap. 38 00:01:58,120 --> 00:02:02,130 Inser att när kontorstid föreslå och som sektioner antyder, den 39 00:02:02,130 --> 00:02:05,110 utformning av kursen är mycket att ha studenter samarbetar och 40 00:02:05,110 --> 00:02:09,250 pratar att arbeta igenom problemet apparater och problem tillsammans. 41 00:02:09,250 --> 00:02:13,630 Och verkligen linjen kommer bara ner till, återigen, det arbete du slutligen 42 00:02:13,630 --> 00:02:16,420 bör lämna bör vara din egen. 43 00:02:16,420 --> 00:02:19,080 Och så är det, helt ärligt - i kontorstid, det är helt normalt - 44 00:02:19,080 --> 00:02:21,560 det är helt att vänta, även - att chatta med några 45 00:02:21,560 --> 00:02:22,370 vänner bredvid dig. 46 00:02:22,370 --> 00:02:25,240 Om han eller hon kämpar med något ämne, och du är som, åh, bra låt 47 00:02:25,240 --> 00:02:27,750 mig ge er en glimt av några kodrad som jag skrev. 48 00:02:27,750 --> 00:02:28,290 Det är bra. 49 00:02:28,290 --> 00:02:28,700 Det händer. 50 00:02:28,700 --> 00:02:31,580 Och det är mycket gynnsam, tror jag, med processen för lärande. 51 00:02:31,580 --> 00:02:35,270 Där linjen, igen, blir korsade är när huvudet är typ av lutas över 52 00:02:35,270 --> 00:02:38,800 här alltför många sekunder eller minuter för att verkligen ha just 53 00:02:38,800 --> 00:02:41,250 varit ett frigörande möjlighet för din vän. 54 00:02:41,250 --> 00:02:43,870 Och visst, när det blir utväxlas via e-post och Dropbox och 55 00:02:43,870 --> 00:02:45,350 liknande, även där är linjen. 56 00:02:45,350 --> 00:02:48,940 Så med alla medel, trivs och känner uppmuntras att chatta med vänner 57 00:02:48,940 --> 00:02:51,270 och klasskamrater om psets och mycket mer. 58 00:02:51,270 --> 00:02:54,680 Och bara att inse att det du i slutändan skicka egentligen borde vara 59 00:02:54,680 --> 00:02:57,780 produkt av din skapelse och inte någon annan. 60 00:02:57,780 --> 00:03:01,010 >> Så i samma anda av gulliga varelser, kanske du 61 00:03:01,010 --> 00:03:02,820 känner den här killen här. 62 00:03:02,820 --> 00:03:06,180 Så detta är ett fasansfullt ostliknande film från år sedan. 63 00:03:06,180 --> 00:03:08,680 Någon sett här Spaceballs? 64 00:03:08,680 --> 00:03:09,120 Okej. 65 00:03:09,120 --> 00:03:10,220 Så ett stort antal här. 66 00:03:10,220 --> 00:03:13,840 Så detta är vårt underbart akademisk sätt att införa idag ytterst 67 00:03:13,840 --> 00:03:15,130 begreppet kryptografi. 68 00:03:15,130 --> 00:03:19,010 Och så en av de domänspecifika problem för pset 2, som kommer 69 00:03:19,010 --> 00:03:22,770 ut sent i morgon kväll, är att dyka in i världen av kryptering, vilket 70 00:03:22,770 --> 00:03:26,380 är konsten att kryptera eller förvränga information. 71 00:03:26,380 --> 00:03:30,160 Och detta gäller i slutändan till en värld av säkerheten. 72 00:03:30,160 --> 00:03:34,440 >> Nu trygghet för de flesta oss kommer i form av ganska vardagliga mekanismer. 73 00:03:34,440 --> 00:03:36,920 Alla av oss har användarnamn och lösenord. 74 00:03:36,920 --> 00:03:41,350 Och vi alla har mycket dåliga användarnamn och lösenord, troligen. 75 00:03:41,350 --> 00:03:45,250 Om ditt lösenord är samma på flera webbplatser, det är förmodligen inte 76 00:03:45,250 --> 00:03:47,920 den bästa idén, som vi kommer att diskutera mot termin slut. 77 00:03:47,920 --> 00:03:51,680 Om ditt lösenord är skriven på en klisterlapp - inget skämt - på 78 00:03:51,680 --> 00:03:55,130 bildskärm, som också är inte nödvändigtvis den bästa designen men ganska vanligt 79 00:03:55,130 --> 00:03:56,140 fenomen. 80 00:03:56,140 --> 00:04:00,420 Och om du inte använder kryptering för att kryptera dina lösenord, är de 81 00:04:00,420 --> 00:04:01,610 särskilt utsatta. 82 00:04:01,610 --> 00:04:04,670 Så om du tror att du är super smart genom att ha en dold ord 83 00:04:04,670 --> 00:04:07,740 dokumentera någonstans på din hårddisk som har alla dina lösenord, men 84 00:04:07,740 --> 00:04:10,550 det är i en mapp som ingen kommer att titta i, det är också inte särskilt 85 00:04:10,550 --> 00:04:11,540 säker mekanism. 86 00:04:11,540 --> 00:04:15,100 Och så vad pset 2 kommer att introducera är denna konst av kryptografi och 87 00:04:15,100 --> 00:04:18,300 förvränga information så att saker som lösenord är 88 00:04:18,300 --> 00:04:19,500 allt säkrare. 89 00:04:19,500 --> 00:04:24,500 För att motivera denna mycket verkliga problem med en mycket icke-verkliga 90 00:04:24,500 --> 00:04:28,740 scenario, låt mig presentera dig för en av våra favorit klipp här från detta 91 00:04:28,740 --> 00:04:29,895 film, Spaceballs. 92 00:04:29,895 --> 00:04:30,565 >> [VIDEOAVSPELNING] 93 00:04:30,565 --> 00:04:32,995 -Hjälm, du djävul, vad händer? 94 00:04:32,995 --> 00:04:34,730 Vad gör du med min dotter? 95 00:04:34,730 --> 00:04:38,960 -Tillåt mig att presentera den lysande unga plastikkirurg, Dr Philip 96 00:04:38,960 --> 00:04:43,290 Schlotkin, den största näsoperation mannen i hela 97 00:04:43,290 --> 00:04:45,526 universum och Beverly Hills. 98 00:04:45,526 --> 00:04:46,450 -Ers Höghet. 99 00:04:46,450 --> 00:04:47,380 -Näsa jobb? 100 00:04:47,380 --> 00:04:48,035 Jag förstår inte. 101 00:04:48,035 --> 00:04:49,480 Hon har redan haft en näsoperation. 102 00:04:49,480 --> 00:04:51,490 Det var en söt 16 närvarande. 103 00:04:51,490 --> 00:04:53,090 -Nej, det är inte vad du tror. 104 00:04:53,090 --> 00:04:55,150 Det är mycket, mycket värre. 105 00:04:55,150 --> 00:04:59,860 Om du inte ger mig kombinationen till luft sköld, Dr Schlotkin kommer 106 00:04:59,860 --> 00:05:04,135 ge din dotter tillbaka sin gamla näsa. 107 00:05:04,135 --> 00:05:05,385 -Nej! 108 00:05:08,202 --> 00:05:10,186 Var fick du det? 109 00:05:10,186 --> 00:05:11,178 -Okej. 110 00:05:11,178 --> 00:05:11,674 Jag ska berätta. 111 00:05:11,674 --> 00:05:12,666 Jag ska berätta. 112 00:05:12,666 --> 00:05:14,154 -Nej, pappa, nej. 113 00:05:14,154 --> 00:05:15,150 Du får inte. 114 00:05:15,150 --> 00:05:16,460 -Du har rätt, min kära. 115 00:05:16,460 --> 00:05:18,450 Jag kommer att sakna er nya näsa. 116 00:05:18,450 --> 00:05:21,550 Men jag vill inte berätta för dem kombinationen oavsett vad. 117 00:05:21,550 --> 00:05:23,100 -Väldigt bra. 118 00:05:23,100 --> 00:05:25,510 Dr Schlotkin, gör ditt värsta. 119 00:05:25,510 --> 00:05:26,760 -Med nöje. 120 00:05:30,560 --> 00:05:31,180 -Nej! 121 00:05:31,180 --> 00:05:33,450 Vänta, vänta. 122 00:05:33,450 --> 00:05:34,770 Jag ska berätta. 123 00:05:34,770 --> 00:05:36,400 Jag ska berätta. 124 00:05:36,400 --> 00:05:38,630 -Jag visste att det skulle fungera. 125 00:05:38,630 --> 00:05:42,040 Okej, ge det till mig. 126 00:05:42,040 --> 00:05:46,890 -Kombinationen är en. 127 00:05:46,890 --> 00:05:47,290 -One. 128 00:05:47,290 --> 00:05:48,183 -One. 129 00:05:48,183 --> 00:05:48,950 -Två. 130 00:05:48,950 --> 00:05:49,370 -Två. 131 00:05:49,370 --> 00:05:50,450 -Två. 132 00:05:50,450 --> 00:05:50,715 -Tre 133 00:05:50,715 --> 00:05:51,380 -Tre. 134 00:05:51,380 --> 00:05:52,390 -Tre. 135 00:05:52,390 --> 00:05:53,200 -Fyra. 136 00:05:53,200 --> 00:05:53,720 -Fyra. 137 00:05:53,720 --> 00:05:55,830 -Fyra. 138 00:05:55,830 --> 00:05:56,580 -Fem 139 00:05:56,580 --> 00:05:57,120 -Fem. 140 00:05:57,120 --> 00:05:58,560 -Fem. 141 00:05:58,560 --> 00:06:03,770 -Så kombinationen är en, två, tre, fyra, fem. 142 00:06:03,770 --> 00:06:06,745 Det är det dummaste kombinationen jag någonsin hört i mitt liv. 143 00:06:06,745 --> 00:06:09,290 Det är sånt en idiot skulle ha på sitt bagage. 144 00:06:09,290 --> 00:06:11,540 -Tack, Ers Höghet. 145 00:06:11,540 --> 00:06:12,940 -Vad har du gjort? 146 00:06:12,940 --> 00:06:14,230 -Jag stängde av väggen. 147 00:06:14,230 --> 00:06:14,630 -Nej, det gjorde du inte. 148 00:06:14,630 --> 00:06:15,430 Du stängde av hela filmen. 149 00:06:15,430 --> 00:06:16,722 -Jag måste ha tryckt på fel knapp. 150 00:06:16,722 --> 00:06:18,078 -Tja, sätter på den igen. 151 00:06:18,078 --> 00:06:18,805 Sätt filmen igen. 152 00:06:18,805 --> 00:06:19,080 -Ja, sir. 153 00:06:19,080 --> 00:06:19,270 Ja, sir. 154 00:06:19,270 --> 00:06:19,830 -Kom igen, Erna. 155 00:06:19,830 --> 00:06:20,270 Kom, Gretchen. 156 00:06:20,270 --> 00:06:22,850 Naturligtvis du vet att jag fortfarande blir tvungen att fakturera dig för det här. 157 00:06:27,400 --> 00:06:28,325 -Jo, det fungerade? 158 00:06:28,325 --> 00:06:29,550 Var är porten? 159 00:06:29,550 --> 00:06:29,910 -Det fungerade, sir. 160 00:06:29,910 --> 00:06:30,770 Vi har kombinationen. 161 00:06:30,770 --> 00:06:31,390 -Bra. 162 00:06:31,390 --> 00:06:35,630 Nu kan vi ta varje sista andetag av frisk luft från planeten Druidia. 163 00:06:35,630 --> 00:06:36,550 Vad är kombinationen? 164 00:06:36,550 --> 00:06:38,805 -Ett, två, tre, fyra, fem. 165 00:06:38,805 --> 00:06:40,610 -Ett, två, tre, fyra, fem? 166 00:06:40,610 --> 00:06:41,070 -Ja. 167 00:06:41,070 --> 00:06:41,760 -Det är fantastiskt. 168 00:06:41,760 --> 00:06:45,200 Jag har samma kombination av mitt bagage. 169 00:06:45,200 --> 00:06:47,800 Förbered Spaceball 1 för omedelbar avgång. 170 00:06:47,800 --> 00:06:48,536 -Ja, sir. 171 00:06:48,536 --> 00:06:52,350 -Och ändra kombinationen på mitt bagage. 172 00:06:52,350 --> 00:06:53,250 -Aj! 173 00:06:53,250 --> 00:06:55,020 [END VIDEOAVSPELNING] 174 00:06:55,020 --> 00:06:57,470 >> David J. MALAN: En fantastisk film du nu ska alla se. 175 00:07:00,600 --> 00:07:06,540 Så sammanhanget här är att med osäkra uppgifter kommer en möjlighet att 176 00:07:06,540 --> 00:07:07,790 kryptera det och att förvränga den. 177 00:07:07,790 --> 00:07:11,060 Och så detta, till exempel, är ett exempel på ett krypterat meddelande. 178 00:07:11,060 --> 00:07:12,980 Detta säger faktiskt något på engelska. 179 00:07:12,980 --> 00:07:14,750 Men det är uppenbarligen inte helt uppenbart. 180 00:07:14,750 --> 00:07:17,360 Och vi kommer full cirkel idag att retas isär vad denna hemlighet 181 00:07:17,360 --> 00:07:18,380 Meddelandet här är. 182 00:07:18,380 --> 00:07:22,370 Men i den verkliga världen av datorer, saker och ting inte ens ser ut som de kanske 183 00:07:22,370 --> 00:07:23,440 vara engelska fraser. 184 00:07:23,440 --> 00:07:27,500 Till exempel, det är vad du kan hitta på en vanlig Linux eller Mac eller 185 00:07:27,500 --> 00:07:32,080 Unix-dator i en fil som var en gång i tiden kallades lösenord filen. 186 00:07:32,080 --> 00:07:34,170 Numera är det flyttats till andra platser. 187 00:07:34,170 --> 00:07:38,660 Men om man tittar på rätt plats på ett system, ser du inte bara din 188 00:07:38,660 --> 00:07:41,430 användarnamn eller hos andra människor på systemet, men du kommer att se en 189 00:07:41,430 --> 00:07:43,410 krypterad version av sitt lösenord. 190 00:07:43,410 --> 00:07:47,800 I själva verket antyder ordet kryptan där att följande saker är krypterad. 191 00:07:47,800 --> 00:07:52,030 Och denna serie av till synes slumpmässiga bokstäver och tecken och siffror och 192 00:07:52,030 --> 00:07:56,370 så vidare kan dekrypteras endast genom allmänt veta någon hemlighet - 193 00:07:56,370 --> 00:07:58,600 ett hemligt ord, ett hemligt nummer. 194 00:07:58,600 --> 00:08:02,760 Och så faktiskt, till konsten att kryptografi slutligen handlar om förtroende för vissa 195 00:08:02,760 --> 00:08:05,700 sortera och veta något som någon annan inte gör det. 196 00:08:05,700 --> 00:08:10,010 Vi kommer att utforska detta i lite mer detalj i dag och i pset framöver. 197 00:08:10,010 --> 00:08:11,860 >> Och nu några ord om Pass / Fail. 198 00:08:11,860 --> 00:08:15,250 Så särskilt har som några av er dök i pset 1, apparaten, och 199 00:08:15,250 --> 00:08:18,390 en helt ny värld för dig själv, insåg att frustrationer och 200 00:08:18,390 --> 00:08:21,340 förvirring och bara tekniska svårigheter kan förväntas. 201 00:08:21,340 --> 00:08:24,410 Speciellt med den första pset, där det finns bara så mycket nytt, bara få 202 00:08:24,410 --> 00:08:28,830 bekant med ls och cd och alla dessa mystiska kommandon i en ny miljö. 203 00:08:28,830 --> 00:08:32,679 Och det är skilt från själva materialet och programmering själv. 204 00:08:32,679 --> 00:08:35,960 Så inser också att det finns säkert kontorstid som finns som 205 00:08:35,960 --> 00:08:36,770 stödstrukturen. 206 00:08:36,770 --> 00:08:38,620 Avsnitt börjar denna kommande söndag. 207 00:08:38,620 --> 00:08:41,990 Men viktigast av allt, om du känner bara att det inte är 208 00:08:41,990 --> 00:08:44,420 värld för dig, inse att det egentligen bara tar tid. 209 00:08:44,420 --> 00:08:47,520 Och om det inte vore för denna möjlighet år sedan för mig att ta en klass 210 00:08:47,520 --> 00:08:50,840 godkänd / underkänd, ärligt talat, jag skulle aldrig ens satt sin fot i klassrummet. 211 00:08:50,840 --> 00:08:53,520 Och du kan ändra detta fram, säger den femte måndagen i kursen. 212 00:08:53,520 --> 00:08:57,110 Så om du är på kanten nu inse att i stället huvudet i någon annan 213 00:08:57,110 --> 00:09:01,000 vatten helt och hållet, anser visserligen bara byta till godkänd / underkänd. 214 00:09:01,000 --> 00:09:03,750 Återigen, det är inte riktigt denna kultur här på Harvard för att ta saker 215 00:09:03,750 --> 00:09:08,080 godkänd / underkänd eftersom alla verkligen vill uppnå eller överträffa. 216 00:09:08,080 --> 00:09:11,470 Men ärligt talat, är detta ett underbart sätt att försöka något som kanske inte 217 00:09:11,470 --> 00:09:13,110 vara bekant för dig. 218 00:09:13,110 --> 00:09:17,090 Och du kommer att hamna gör i de flesta fall ganska bra, kanske 219 00:09:17,090 --> 00:09:18,040 mycket till din förvåning. 220 00:09:18,040 --> 00:09:20,850 Och i mer konkreta termer, vad jag tycker godkänd / underkänd i allmänhet gör, 221 00:09:20,850 --> 00:09:23,350 särskilt som du kanske har upplevt med pset 0, om du har lagt 222 00:09:23,350 --> 00:09:27,200 i 10 timmar, 15 timmar, 25 timmar i vissa pset - och du är bara banka 223 00:09:27,200 --> 00:09:28,180 huvudet mot väggen, 224 00:09:28,180 --> 00:09:29,850 och det blir super sent på natten, 225 00:09:29,850 --> 00:09:31,880 men du har tagit pset som 90% av vägen, 226 00:09:31,880 --> 00:09:33,780 du vet att du bara inte kan lista ut en sak - 227 00:09:33,780 --> 00:09:36,830 godkänd / underkänd verkligen tar udden av en klass som denna, där du kan sortera 228 00:09:36,830 --> 00:09:39,150 av glatt säga okej, jag vet att det inte är perfekt. 229 00:09:39,150 --> 00:09:40,470 Men jag jobbade häcken av mig på detta. 230 00:09:40,470 --> 00:09:42,410 Jag är ganska nöjd med var den hamnade. 231 00:09:42,410 --> 00:09:44,780 Och det kommer att uppfylla de förväntningar på godkänt / underkänt. 232 00:09:44,780 --> 00:09:46,850 Så ha det i åtanke. 233 00:09:46,850 --> 00:09:47,140 >> Okej. 234 00:09:47,140 --> 00:09:50,980 Så de av er som har kämpat för att använda Harvard University Wi-Fi-vet 235 00:09:50,980 --> 00:09:54,780 att det finns en CS50 SSID, en Wi-Fi-anslutning flyter runt som du 236 00:09:54,780 --> 00:09:56,520 kan ha bättre tur för. 237 00:09:56,520 --> 00:09:59,430 Det är lite ironiskt att lösenordet för - om du vill prova 238 00:09:59,430 --> 00:10:03,080 anslutning till detta för bättre hastigheter och låt oss veta om det är inte bättre - 239 00:10:03,080 --> 00:10:09,240 är ett, två, tre, fyra, fem, ända upp till åtta, eftersom åtta är 240 00:10:09,240 --> 00:10:10,270 säkrare än fem. 241 00:10:10,270 --> 00:10:15,520 Så om du behöver Wi-Fi-lösenord, anslut till CS50 trådlöst här. 242 00:10:15,520 --> 00:10:16,950 Ett, två, tre, fyra, fem, sex, sju, åtta. 243 00:10:16,950 --> 00:10:20,440 Och inlägg på CS50 Diskutera om du fortfarande har återkommande anslutningsproblem, 244 00:10:20,440 --> 00:10:24,880 och vi låter de befogenheter som ska veta detta utrymme. 245 00:10:24,880 --> 00:10:25,180 >> Okej. 246 00:10:25,180 --> 00:10:30,350 Så en snabb teaser, särskilt för dem av er som är fan pojkar eller flickor 247 00:10:30,350 --> 00:10:31,900 av alla saker Apple. 248 00:10:31,900 --> 00:10:37,566 Vad jag grävde upp från ett par år tillbaka var här filen här, ilock.c, bara för att 249 00:10:37,566 --> 00:10:40,930 typ av göra mer konkret och mer komplex några av de mer grundläggande C 250 00:10:40,930 --> 00:10:42,350 program vi har skrivit. 251 00:10:42,350 --> 00:10:44,360 Så jag öppnade filen, ilock.c. 252 00:10:44,360 --> 00:10:46,830 Den finns på föreläsningarna sidan för idag. 253 00:10:46,830 --> 00:10:49,470 På vänster sida ser du en lång lista med funktioner. 254 00:10:49,470 --> 00:10:51,860 Så kolleger som skrev detta skrev upp en massa funktioner, 255 00:10:51,860 --> 00:10:53,290 mer än bara stora. 256 00:10:53,290 --> 00:10:55,490 Han använde en massa bibliotek här. 257 00:10:55,490 --> 00:11:00,450 Och om vi börjar rulla igenom, vad detta egentligen är är mycket 258 00:11:00,450 --> 00:11:04,670 Först tror jag, knäcka för den ursprungliga iPhone. 259 00:11:04,670 --> 00:11:08,000 När du ville jailbreaka den ursprungliga iPhone, vilket innebär untether 260 00:11:08,000 --> 00:11:11,800 det från AT & T och faktiskt installera särskild programvara på den och göra saker 261 00:11:11,800 --> 00:11:13,510 att Apple inte vill att folk ska göra - 262 00:11:13,510 --> 00:11:17,020 Tja, tog någon tid att räkna ut exakt hur de skulle kunna utnyttja 263 00:11:17,020 --> 00:11:20,880 programvara brister, misstag, buggar, i Apples mjukvara. 264 00:11:20,880 --> 00:11:22,650 Och sålunda föddes ilock.c. 265 00:11:22,650 --> 00:11:26,670 Att om du sammanställt det på en dator och installerat det på en iPhone som 266 00:11:26,670 --> 00:11:29,810 var ansluten till datorn via exempelvis en USB-kabel, skulle detta ge dig 267 00:11:29,810 --> 00:11:33,360 administrativa eller rotbehörighet till din iPhone och låter dig göra ganska mycket 268 00:11:33,360 --> 00:11:34,170 vad du vill. 269 00:11:34,170 --> 00:11:36,740 >> Och så det har varit denna fascinerande katt-och råttalek mellan Apple och 270 00:11:36,740 --> 00:11:39,920 resten av världen, särskilt som de, liksom många företag, försök att låsa 271 00:11:39,920 --> 00:11:43,220 sina grejer ner så att du bara kan göra med den vad de tänker. 272 00:11:43,220 --> 00:11:46,620 Men tack vare personer gillar detta och deras förståelse av lågaktivt 273 00:11:46,620 --> 00:11:50,580 detaljer och, i det här fallet, C programmering och en hel del de välbekanta konstruktioner 274 00:11:50,580 --> 00:11:54,630 att vi har börjat spela med, kan du verkligen utnyttja den 275 00:11:54,630 --> 00:11:59,050 hårdvara på ett sätt som du tycker passar och inte nödvändigtvis några företagsenhet. 276 00:11:59,050 --> 00:12:01,360 Så till exempel, har jag ingen aning om vad allt detta gör. 277 00:12:01,360 --> 00:12:03,220 Men getVersion låter ganska enkelt. 278 00:12:03,220 --> 00:12:05,480 Och det ser ut så här är en funktion som denna person skrev. 279 00:12:05,480 --> 00:12:09,240 Ta någon form av heltal som argument, inte återvänder något, men 280 00:12:09,240 --> 00:12:13,080 verkar slinga med en for-slinga här och en om tillstånd, om tillstånd, 281 00:12:13,080 --> 00:12:15,620 bryta, och på något sätt rör versionsnummer. 282 00:12:15,620 --> 00:12:16,700 Om vi ​​scrolla ner - 283 00:12:16,700 --> 00:12:19,570 även om många av dessa sökord kommer att vara nya, och det finns en 284 00:12:19,570 --> 00:12:22,590 massa funktioner i här vi aldrig sett och kanske inte någonsin se över 285 00:12:22,590 --> 00:12:23,830 Under terminen - 286 00:12:23,830 --> 00:12:27,150 i slutet av dagen, följer samma regler och logik som vi har varit 287 00:12:27,150 --> 00:12:28,760 spelar med hittills. 288 00:12:28,760 --> 00:12:34,220 Så detta är alldeles för gammal för att knäcka din iPhone 3s eller 4s eller snart 5s, dessa dagar, 289 00:12:34,220 --> 00:12:37,320 men vet att det är alla mycket härrör från denna värld som vi har 290 00:12:37,320 --> 00:12:38,430 dök in. 291 00:12:38,430 --> 00:12:41,900 >> Så låt oss ta en titt på lite mer enkelt exempel. 292 00:12:41,900 --> 00:12:46,100 Den här, bara för att få värmas upp med lite syntax och även en del andra uppgifter 293 00:12:46,100 --> 00:12:49,240 typ som vi har pratat om, men har inte riktigt sett i C. Så detta är ett 294 00:12:49,240 --> 00:12:51,680 fil som heter positive1.c. 295 00:12:51,680 --> 00:12:55,120 Och per kommentarerna överst kräver detta bara att en användare ger ett 296 00:12:55,120 --> 00:12:55,960 positivt tal. 297 00:12:55,960 --> 00:12:59,530 Så det är ett exempel på en gör-while-slinga, vilket är trevligt för användaren interaktivt 298 00:12:59,530 --> 00:13:01,980 program där du behöver tala om för användaren att göra något. 299 00:13:01,980 --> 00:13:05,190 Och om de inte samarbetar, skrika dig på dem eller förkasta deras input. 300 00:13:05,190 --> 00:13:11,610 Ett typexempel, kommer jag att göra linjerna 19 till 24, så länge som användaren har 301 00:13:11,610 --> 00:13:14,310 inte gett mig ett positivt tal. 302 00:13:14,310 --> 00:13:20,400 Nu detalj här på linje 18, varför jag förklarar N över hela denna 303 00:13:20,400 --> 00:13:24,490 looping konstruktion i motsats till höger bredvid rad 22 där jag 304 00:13:24,490 --> 00:13:26,880 faktiskt bryr få n? 305 00:13:26,880 --> 00:13:27,330 Ja? 306 00:13:27,330 --> 00:13:27,780 [OHÖRBAR] 307 00:13:27,780 --> 00:13:29,040 >> David J. MALAN: Ja, så det här numret av omfattning. 308 00:13:29,040 --> 00:13:30,850 Och lekman mandatperiod, vad räckvidd hänvisar till? 309 00:13:34,690 --> 00:13:36,610 Ja? 310 00:13:36,610 --> 00:13:37,860 [OHÖRBAR] 311 00:13:40,040 --> 00:13:41,105 David J. MALAN: Kan du tala lite högre? 312 00:13:41,105 --> 00:13:43,450 Högtalare 1: Där du kan komma åt en viss variabel. 313 00:13:43,450 --> 00:13:45,170 David J. MALAN: Perfect. 314 00:13:45,170 --> 00:13:47,360 Där du kan komma en viss variabel. 315 00:13:47,360 --> 00:13:50,400 Och generellt tumregeln hittills varit att omfattningen av vissa 316 00:13:50,400 --> 00:13:55,860 variabel definieras av de senaste klammerparenteser som du har sett. 317 00:13:55,860 --> 00:14:02,010 Och så i det här fallet, om jag gjorde misstaget att förklara n på linjen 22, 318 00:14:02,010 --> 00:14:03,010 den linjen skulle fungera. 319 00:14:03,010 --> 00:14:10,990 Jag skulle få en int, och jag skulle sätta den i den variabeln n i linje 22. 320 00:14:10,990 --> 00:14:16,900 Men vilken kodrad skulle nu ha någon aning om vad jag pratar om? 321 00:14:16,900 --> 00:14:22,650 Så 25, och det visar sig 24, liksom, eftersom i detta fall, faller det utanför 322 00:14:22,650 --> 00:14:23,610 av klammerparenteser. 323 00:14:23,610 --> 00:14:27,280 Så bara en liten bit av en olägenhet men mycket enkelt lösas genom att helt enkelt förklara 324 00:14:27,280 --> 00:14:30,140 den variabla utanför själva funktionen. 325 00:14:30,140 --> 00:14:32,600 >> Nu ska vi se senare idag, kan du gå ett steg längre. 326 00:14:32,600 --> 00:14:34,860 Och du kan även få lite lat - 327 00:14:34,860 --> 00:14:37,320 och detta är inte att rekommendera, i allmänhet - 328 00:14:37,320 --> 00:14:42,260 men du kan även få lata och sätta en variabel globalt, så att säga, inte 329 00:14:42,260 --> 00:14:46,670 inuti en funktion, inte inuti en slinga, men i själva filen, utanför 330 00:14:46,670 --> 00:14:49,600 av alla de funktioner som du har skrivit, som jag gjorde här på rad 15. 331 00:14:49,600 --> 00:14:51,160 Men detta är i allmänhet ogillat. 332 00:14:51,160 --> 00:14:55,680 Men inser att detta är en lösning ibland till andra problem, som vi ska 333 00:14:55,680 --> 00:14:56,620 småningom se. 334 00:14:56,620 --> 00:14:58,130 Så nu kommer vi lämna det så här. 335 00:14:58,130 --> 00:15:01,030 Men låt oss se om vi kan skriva om det bara att börja uttrycka oss själva en 336 00:15:01,030 --> 00:15:01,990 lite annorlunda. 337 00:15:01,990 --> 00:15:05,330 >> Så det här programmet, bara för att vara tydlig, är positive1. 338 00:15:05,330 --> 00:15:11,810 Låt mig gå vidare här och i min terminalfönster göra positive1, Enter. 339 00:15:11,810 --> 00:15:12,740 Sammanställer, okej. 340 00:15:12,740 --> 00:15:14,910 Jag ska köra positive1, tryck Enter. 341 00:15:14,910 --> 00:15:16,820 Jag kräver att du ger mig ett positivt heltal. 342 00:15:16,820 --> 00:15:18,260 Jag ska säga -1. 343 00:15:18,260 --> 00:15:18,910 Det fungerade inte. 344 00:15:18,910 --> 00:15:22,150 0, 99, verkar som att arbeta. 345 00:15:22,150 --> 00:15:23,570 Kanske inte den mest rigorösa testet. 346 00:15:23,570 --> 00:15:26,480 Men åtminstone det är en trevlig förstånd kontrollera att vi är på rätt väg. 347 00:15:26,480 --> 00:15:29,240 Så nu låt mig gå vidare och öppna versionen två i detta. 348 00:15:29,240 --> 00:15:32,500 Och vad är annorlunda redan? 349 00:15:32,500 --> 00:15:35,140 Det genomför samma sak. 350 00:15:35,140 --> 00:15:40,660 Men vad är att hoppa så tydligt annorlunda den här gången? 351 00:15:40,660 --> 00:15:42,560 Ja, så detta bool i grönt. 352 00:15:42,560 --> 00:15:45,980 Gedit har markerat i grönt här sökordet som kallas bool, 353 00:15:45,980 --> 00:15:47,000 vilket är en datatyp. 354 00:15:47,000 --> 00:15:51,080 Det kommer inte inbyggd i alla versioner av C. Du måste inkludera en 355 00:15:51,080 --> 00:15:52,010 specifik bibliotek. 356 00:15:52,010 --> 00:15:54,770 I vårt fall ingår jag CS50 biblioteket så att vi 357 00:15:54,770 --> 00:15:56,460 ha tillgång till BOOL. 358 00:15:56,460 --> 00:15:59,810 Men i linje 18, verkar vi ha ett booleskt värde här kallas tacksam. 359 00:15:59,810 --> 00:16:01,040 Så jag kunde ha kallat detta någonting. 360 00:16:01,040 --> 00:16:04,500 Men jag kallade det tacksam bara typ av förmedla några semantisk innebörd. 361 00:16:04,500 --> 00:16:07,930 Så först på linjen 18, jag uppenbarligen inte tacksam eftersom 362 00:16:07,930 --> 00:16:12,150 Booleskt värde tacksam initieras till false i linje 18. 363 00:16:12,150 --> 00:16:16,890 Och då verkar det som jag har gjort här i ledningarna 21 till 23 är jag just 364 00:16:16,890 --> 00:16:18,610 typ av omskriven min logik. 365 00:16:18,610 --> 00:16:21,020 Så ingen funktionellt annorlunda. 366 00:16:21,020 --> 00:16:26,940 Men i linje 22 nu, kollar jag om int användaren har gett är större än 367 00:16:26,940 --> 00:16:31,120 0, då ändrar jag bara värdet av tacksamma till true. 368 00:16:31,120 --> 00:16:32,290 Och varför gör jag det? 369 00:16:32,290 --> 00:16:35,600 Eftersom i linje 25, tydligen, jag ska kolla ett villkor. 370 00:16:35,600 --> 00:16:39,380 Gör denna slinga medan tacksam är falskt. 371 00:16:39,380 --> 00:16:43,610 >> Så jag föreslår detta som ett alternativ till version en eftersom det är minst en 372 00:16:43,610 --> 00:16:45,130 lite mer intuitiv, kanske. 373 00:16:45,130 --> 00:16:46,900 Det är lite mer grundad på engelska. 374 00:16:46,900 --> 00:16:51,710 Så gör du följande när du inte är tacksam eller när tacksamma är falskt. 375 00:16:51,710 --> 00:16:55,890 Och den här gången också, jag tydligen bryr inte komma ihåg vad användaren skrivit 376 00:16:55,890 --> 00:16:57,730 i eftersom varsel finns ingen variabel n. 377 00:16:57,730 --> 00:16:58,650 Så egentligen har jag - 378 00:16:58,650 --> 00:17:00,080 en liten vit lögn där. 379 00:17:00,080 --> 00:17:02,770 Funktionellt är programmet lite annorlunda när vi kommer till botten av 380 00:17:02,770 --> 00:17:04,819 det eftersom jag inte ihåg vad n är. 381 00:17:04,819 --> 00:17:09,579 Men jag ville visa även här att även om vi har sett getInt och 382 00:17:09,579 --> 00:17:13,920 GetString som används på den högra sidan av ett likhetstecken hittills så att 383 00:17:13,920 --> 00:17:17,160 Vi minns värde, tekniskt, det är inte absolut nödvändigt. 384 00:17:17,160 --> 00:17:20,950 Om du av någon anledning bara inte bryr att spara värdet, vill du bara 385 00:17:20,950 --> 00:17:25,710 att kontrollera värdet, märker att vi helt enkelt kan skriva detta som getInt öppna 386 00:17:25,710 --> 00:17:27,000 paren, nära parentes. 387 00:17:27,000 --> 00:17:30,460 Denna funktion kommer att returnera ett värde, som vi har sagt. 388 00:17:30,460 --> 00:17:32,010 Det kommer att ge dig tillbaka en int. 389 00:17:32,010 --> 00:17:36,450 Och så om du tror mentalt att detta händer när jag skriver in 99, getInt 390 00:17:36,450 --> 00:17:38,160 returnerar antalet 99. 391 00:17:38,160 --> 00:17:41,330 Och så begreppsmässigt, är det som om min kod var faktiskt här. 392 00:17:41,330 --> 00:17:45,880 Så om 99 verkligen är större än 0, så tacksam blir sann. 393 00:17:45,880 --> 00:17:50,420 Då linjen 25 inser ooh, vi gjort eftersom jag nu tacksam. 394 00:17:50,420 --> 00:17:54,590 Och i linje 26, vi helt enkelt säga, tack för det positiva heltal, vad det 395 00:17:54,590 --> 00:17:55,710 råkade vara. 396 00:17:55,710 --> 00:17:58,900 >> Nu ska vi göra något syntaktisk socker här, så att säga. 397 00:17:58,900 --> 00:18:02,990 Låt oss se om vi kan städa upp denna linje 25 med denna tredje och sista varians 398 00:18:02,990 --> 00:18:04,640 i positive3. 399 00:18:04,640 --> 00:18:08,250 Så märker den enda skillnaden nu är vad kodrad? 400 00:18:11,930 --> 00:18:13,260 Ja, så 25. 401 00:18:13,260 --> 00:18:15,520 Och vi har inte har verkligen sett detta trick än. 402 00:18:15,520 --> 00:18:19,510 Men vi fick se den utropstecken på måndag, som betecknar vad? 403 00:18:19,510 --> 00:18:20,970 Så inte, eller förnekande. 404 00:18:20,970 --> 00:18:23,460 Så ta ett booleskt värde och vända dess värde. 405 00:18:23,460 --> 00:18:24,390 True blir falskt. 406 00:18:24,390 --> 00:18:25,500 Falskt blir sant. 407 00:18:25,500 --> 00:18:28,910 Så detta, jag skulle föreslå, är ännu lite mer intuitivt för ett sätt att 408 00:18:28,910 --> 00:18:32,200 skriva kod eftersom jag fortfarande initiera tacksam till false. 409 00:18:32,200 --> 00:18:33,530 Jag gör fortfarande följande. 410 00:18:33,530 --> 00:18:35,700 Jag satt tacksam till true när det är dags. 411 00:18:35,700 --> 00:18:40,690 Men nu kan du egentligen bara översätta denna kod muntligen vänster till höger, 412 00:18:40,690 --> 00:18:42,550 medan inte tacksam. 413 00:18:42,550 --> 00:18:46,170 Eftersom Bang, eller utropstecken, betecknar begreppet inte, så när 414 00:18:46,170 --> 00:18:47,010 inte tacksam. 415 00:18:47,010 --> 00:18:49,740 >> Så återigen, har vi infört några nya begrepp i sig. 416 00:18:49,740 --> 00:18:53,230 Vi har pratat om Booleans tillbaka när vi spelade med Scratch. 417 00:18:53,230 --> 00:18:55,690 Men inser nu att vi bara kan börja skriva vår kod i 418 00:18:55,690 --> 00:18:56,550 många olika sätt. 419 00:18:56,550 --> 00:19:00,010 Så speciellt i pset1, om du är typ av svårt att räkna ut vägen till 420 00:19:00,010 --> 00:19:03,400 skriva några program, har du tur odds eftersom det kommer att bli någon 421 00:19:03,400 --> 00:19:05,780 antal lösningar som du kan hända på. 422 00:19:05,780 --> 00:19:09,850 Till exempel är det bara tre för även de enklaste av programmen. 423 00:19:09,850 --> 00:19:10,180 Okej. 424 00:19:10,180 --> 00:19:13,860 Och nu minns måndagen lämnade vi på denna sedel med returvärden. 425 00:19:13,860 --> 00:19:18,280 Så för första gången skrev vi ett program som inte bara har stora, 426 00:19:18,280 --> 00:19:22,240 Det har också sin egen anpassad funktion som jag skrev här. 427 00:19:22,240 --> 00:19:26,640 Så i linje 31 till 34 har jag genomfört en kub funktion. 428 00:19:26,640 --> 00:19:27,800 Det är inte komplicerat. 429 00:19:27,800 --> 00:19:29,830 Det är bara en gånger en gånger en, i det här fallet. 430 00:19:29,830 --> 00:19:34,920 Men vad som är viktigt om det är att jag tar in i form av en och 431 00:19:34,920 --> 00:19:38,910 Jag återvänder ut i form av en gånger en gånger en. 432 00:19:38,910 --> 00:19:43,940 >> Så nu har jag möjlighet, ungefär som jag brukade med printf ensam, att ringa 433 00:19:43,940 --> 00:19:47,120 denna funktion genom att ringa kuben funktionen. 434 00:19:47,120 --> 00:19:49,470 Och kuben funktionen tar lite input. 435 00:19:49,470 --> 00:19:52,030 Och kuben returnerar någon utgång. 436 00:19:52,030 --> 00:19:56,660 Och så däremot printf bara gjorde något. 437 00:19:56,660 --> 00:19:59,490 Det tog inte tillbaka någonting som vi brydde sig om - trots att, som en 438 00:19:59,490 --> 00:20:00,820 undan, det gör det returnerar ett värde. 439 00:20:00,820 --> 00:20:02,650 Du bara allmänt ignorera det. 440 00:20:02,650 --> 00:20:04,000 Printf bara gjorde något. 441 00:20:04,000 --> 00:20:06,220 Den hade en bieffekt av att skriva ut på skärmen. 442 00:20:06,220 --> 00:20:09,480 Däremot här har vi kuben funktionen, som 443 00:20:09,480 --> 00:20:11,400 faktiskt återvänder något. 444 00:20:11,400 --> 00:20:12,960 >> Så detta är i allmänhet - 445 00:20:12,960 --> 00:20:15,260 för dem som känner till detta, det är en ganska enkel idé. 446 00:20:15,260 --> 00:20:18,460 Men för de mindre bekant med denna idé om att passera i ingångar och få 447 00:20:18,460 --> 00:20:21,700 tillbaka utgångar, låt oss försöka bara något super enkelt. 448 00:20:21,700 --> 00:20:25,180 Är det någon bekväm kommer upp på scenen en kort stund? 449 00:20:25,180 --> 00:20:27,460 Du måste vara bekväm med en kamera på dig, liksom. 450 00:20:27,460 --> 00:20:27,640 Ja. 451 00:20:27,640 --> 00:20:28,610 Okej, vad heter du? 452 00:20:28,610 --> 00:20:29,020 Ken: Ken. 453 00:20:29,020 --> 00:20:29,420 David J. MALAN: Ken. 454 00:20:29,420 --> 00:20:29,810 Okej, Ken. 455 00:20:29,810 --> 00:20:31,060 Kom upp. 456 00:20:31,060 --> 00:20:34,660 Så Ken kommer att vara en funktion av slag här. 457 00:20:34,660 --> 00:20:35,760 Och låt oss gå vidare och göra det. 458 00:20:35,760 --> 00:20:38,790 Låt oss få lite fantasi. 459 00:20:38,790 --> 00:20:39,770 TREVLIGT ATT TRÄFFAS. 460 00:20:39,770 --> 00:20:41,010 Välkommen till centrum. 461 00:20:41,010 --> 00:20:41,980 Okej. 462 00:20:41,980 --> 00:20:45,590 Låt oss slå den här knappen här. 463 00:20:45,590 --> 00:20:46,420 Okej. 464 00:20:46,420 --> 00:20:49,490 Så här har du en modern tavlan. 465 00:20:49,490 --> 00:20:53,050 Och vad jag är den viktigaste funktionen, till exempel. 466 00:20:53,050 --> 00:20:55,990 Och jag har inte en iPad i min hand. 467 00:20:55,990 --> 00:20:59,000 Jag förstår inte riktigt ihåg hur man - ja, faktiskt, kan inte säga det. 468 00:20:59,000 --> 00:21:02,200 Jag har inte riktigt bra handstil. 469 00:21:02,200 --> 00:21:05,260 Och så därför vill jag att du skriver ut något på skärmen för mig. 470 00:21:05,260 --> 00:21:07,470 >> Så jag är huvudprogrammet. 471 00:21:07,470 --> 00:21:15,060 Och jag kommer att få dig att säga detta genom att skriva det i min kyckling repor och 472 00:21:15,060 --> 00:21:16,600 då passerar du en ingång. 473 00:21:16,600 --> 00:21:20,000 Så som dumt om denna övning är, begreppet funktioner och kräver en 474 00:21:20,000 --> 00:21:22,260 funktion och returnera en funktion verkligen kokar ner till detta. 475 00:21:22,260 --> 00:21:23,120 Jag främsta. 476 00:21:23,120 --> 00:21:26,270 Jag har just skrivit printf ("något") på skärmen. 477 00:21:26,270 --> 00:21:27,470 Jag kör det här programmet. 478 00:21:27,470 --> 00:21:30,900 Och så snart printf anropas tar det ett argument - eller en parameter, 479 00:21:30,900 --> 00:21:31,660 ibland - 480 00:21:31,660 --> 00:21:32,780 mellan citationstecken. 481 00:21:32,780 --> 00:21:33,960 Här är det argumentet. 482 00:21:33,960 --> 00:21:35,740 Jag passerar den till Ken. 483 00:21:35,740 --> 00:21:39,390 Nu är han en svart låda skrivit ett visst antal år sedan som uppenbarligen 484 00:21:39,390 --> 00:21:41,070 bara vet hur man skriver ut saker på skärmen. 485 00:21:41,070 --> 00:21:42,320 >> Så, kör. 486 00:21:48,842 --> 00:21:49,900 Det är inte illa. 487 00:21:49,900 --> 00:21:50,890 Så mycket bra. 488 00:21:50,890 --> 00:21:52,900 Så nu Ken görs köra. 489 00:21:52,900 --> 00:21:55,810 Behöver han att lämna mig någonting tillbaka? 490 00:21:55,810 --> 00:21:57,240 Så inte att vi har sett hittills. 491 00:21:57,240 --> 00:21:59,230 Återigen, inte printf faktiskt returnera ett tal. 492 00:21:59,230 --> 00:22:01,640 Men vi kommer att ignorera det för nu eftersom vi aldrig har använt den. 493 00:22:01,640 --> 00:22:03,400 Så det är det för Ken. 494 00:22:03,400 --> 00:22:06,650 Och så nu viktigaste kommer tillbaka för att utföra - 495 00:22:06,650 --> 00:22:09,630 viktigaste tar över kontrollen av programmet igen eftersom det kodrad, 496 00:22:09,630 --> 00:22:11,010 printf, görs köra. 497 00:22:11,010 --> 00:22:13,890 Och vi går om vår väg utför vad andra linjer är där. 498 00:22:13,890 --> 00:22:14,130 >> Okej. 499 00:22:14,130 --> 00:22:17,080 Så nu ska vi prova en lite annorlunda exempel. 500 00:22:17,080 --> 00:22:22,430 Och den här gången här, låt oss först rensa skärmen här. 501 00:22:22,430 --> 00:22:24,670 Och den här gången ska vi göra det cubing funktionen. 502 00:22:24,670 --> 00:22:27,350 Men den här gången, jag förväntar mig ett produktionsvärde. 503 00:22:27,350 --> 00:22:28,630 Så låt oss gå vidare och göra det. 504 00:22:28,630 --> 00:22:35,680 Så nu har jag en kodrad som säger x = kub (x). 505 00:22:35,680 --> 00:22:36,930 Så egentligen let's - 506 00:22:41,450 --> 00:22:43,940 kodraden, minns, ser ut så här. 507 00:22:43,940 --> 00:22:45,960 x = kub (x). 508 00:22:45,960 --> 00:22:48,100 Så hur kommer detta att fungera? 509 00:22:48,100 --> 00:22:50,820 Så låt oss gå vidare och ge dig en vit skärm igen. 510 00:22:50,820 --> 00:22:55,000 Och jag ska skriva nu ned värdet på x, som i detta ögonblick i 511 00:22:55,000 --> 00:23:01,080 tid råkar vara, låt oss säga, 2, för att hålla det enkelt. 512 00:23:01,080 --> 00:23:04,890 Så jag har skrivit ner på ett papper värdet 2, 513 00:23:04,890 --> 00:23:06,100 som är mitt värdet x. 514 00:23:06,100 --> 00:23:08,250 Jag lämna det till Ken. 515 00:23:08,250 --> 00:23:09,200 Ken: Och jag skriver bara svaret? 516 00:23:09,200 --> 00:23:12,660 David J. MALAN: Ja, låt oss bara skriva svaret. 517 00:23:12,660 --> 00:23:13,030 Okej. 518 00:23:13,030 --> 00:23:16,280 Och nu måste han återvända mig något. 519 00:23:16,280 --> 00:23:17,560 Så - 520 00:23:17,560 --> 00:23:18,170 perfekt. 521 00:23:18,170 --> 00:23:18,840 Trevlig Segue. 522 00:23:18,840 --> 00:23:21,970 >> Så nu har han överlämnar mig tillbaka värdet 8, i detta fall. 523 00:23:21,970 --> 00:23:23,220 Och vad gör jag med den? 524 00:23:23,220 --> 00:23:26,130 Jo, faktiskt, låt oss se. 525 00:23:26,130 --> 00:23:26,640 Få ordning på detta. 526 00:23:26,640 --> 00:23:27,880 Vad ska jag göra med den? 527 00:23:27,880 --> 00:23:31,900 Nu ska jag ta detta värde och faktiskt lagra den i de 528 00:23:31,900 --> 00:23:33,400 Samma bitar i minnet. 529 00:23:33,400 --> 00:23:35,030 Men varsel, jag slags kämpar här. 530 00:23:35,030 --> 00:23:38,280 Jag är lite förvirrad eftersom där kan jag faktiskt skriva värdet på x? 531 00:23:38,280 --> 00:23:41,840 För vad jag just gjort är fysiskt handen Ken ett papper 532 00:23:41,840 --> 00:23:44,400 som hade värdet 2, vilket var X. 533 00:23:44,400 --> 00:23:46,300 Och faktiskt, det är precis vad som händer. 534 00:23:46,300 --> 00:23:50,100 Så det visar sig att när du ringer en funktion, och du passerar på ett argument 535 00:23:50,100 --> 00:23:54,130 liknande "Hello World" eller om du passerar i ett argument som 2, i allmänhet, är du 536 00:23:54,130 --> 00:23:56,720 passerar i en kopia av detta argument. 537 00:23:56,720 --> 00:24:01,020 Och så precis som jag skrev ner numret 2 här och räckte den till Ken, som måste 538 00:24:01,020 --> 00:24:04,760 innebär att jag fortfarande har en kopia av värdet 2 någonstans. 539 00:24:04,760 --> 00:24:08,140 Eftersom faktiskt, nu när jag har fått tillbaka värdet 8, behöver jag gå tillbaka i 540 00:24:08,140 --> 00:24:12,010 RAM och faktiskt skriva ner 8 där jag en gång hade numret 2. 541 00:24:12,010 --> 00:24:15,720 >> Så visuellt ihåg detta begrepp passera i bokstavligen 542 00:24:15,720 --> 00:24:16,730 en kopia av värdet. 543 00:24:16,730 --> 00:24:19,570 Ken gör sin grej, händer mig något - i det här fallet, 544 00:24:19,570 --> 00:24:20,820 ett värde som 8. 545 00:24:20,820 --> 00:24:22,660 Och då måste jag göra något med det värdet om jag 546 00:24:22,660 --> 00:24:24,880 vill hålla det runt. 547 00:24:24,880 --> 00:24:29,470 Så allt detta kommer att bli alltför bekant kort. 548 00:24:29,470 --> 00:24:33,082 Tack så mycket för denna demo här, Ken. 549 00:24:33,082 --> 00:24:34,820 Okej. 550 00:24:34,820 --> 00:24:36,720 Mycket bra gjort. 551 00:24:36,720 --> 00:24:40,610 Så låt oss se hur det i slutändan rör en del av funktionen 552 00:24:40,610 --> 00:24:42,270 ringer att vi har gjort här. 553 00:24:42,270 --> 00:24:47,610 Så låt mig gå vidare och föra oss tillbaka till cubing exempel. 554 00:24:47,610 --> 00:24:53,080 Och märker att om vi vill faktiskt börjar ta detta ytterligare, vi kommer 555 00:24:53,080 --> 00:24:57,050 att vara uppmärksam på det faktum att antalet X som är som skickas i 556 00:24:57,050 --> 00:25:01,390 Här skiljer sig från vad som faktiskt förs in i funktionen. 557 00:25:01,390 --> 00:25:03,940 Så återigen, detta förbi exemplar kommer att bli ganska 558 00:25:03,940 --> 00:25:05,620 relevant på bara ett ögonblick. 559 00:25:05,620 --> 00:25:09,320 >> Så låt oss ta en titt på något som inte riktigt fungerar rätt ännu. 560 00:25:09,320 --> 00:25:11,790 Jag ska gå vidare och öppna tredjedel buggy exempel, som 561 00:25:11,790 --> 00:25:13,560 är bristfällig av naturen. 562 00:25:13,560 --> 00:25:18,070 Och det kallas buggy3 och det genomför en swapping funktion. 563 00:25:18,070 --> 00:25:23,500 Så här har vi en huvudfunktion som x och y godtyckligt initialiseras till 564 00:25:23,500 --> 00:25:24,720 1 och 2, respektive. 565 00:25:24,720 --> 00:25:27,590 Vi skulle kunna använda getInt, men vi behöver bara en enkel övning. 566 00:25:27,590 --> 00:25:29,680 Så det är hårdkodad som 1 och 2. 567 00:25:29,680 --> 00:25:35,330 I linjerna 21 och 22, ut vi tydligen ut x och y, en per rad. 568 00:25:35,330 --> 00:25:39,620 Sedan, på linje 23, hävdar jag jag byta dessa värden, punkt, punkt, punkt. 569 00:25:39,620 --> 00:25:43,030 Jag kallar tydligen en funktion i linje 24 som heter swap 570 00:25:43,030 --> 00:25:44,000 som tar två argument. 571 00:25:44,000 --> 00:25:46,430 Det är helt legit för funktioner för att ta två argument. 572 00:25:46,430 --> 00:25:48,220 Vi har sett printf gör det redan. 573 00:25:48,220 --> 00:25:50,370 Så swap tar uppenbarligen x och y.. 574 00:25:50,370 --> 00:25:53,010 Och som namnet antyder, skulle jag hoppas att det kommer att 575 00:25:53,010 --> 00:25:54,320 byta dessa två värden. 576 00:25:54,320 --> 00:25:57,560 Så då jag hävdar på rad 25, bytte. 577 00:25:57,560 --> 00:26:01,570 Och jag nytryck x och y under antagandet att 578 00:26:01,570 --> 00:26:02,830 de har verkligen bytts. 579 00:26:02,830 --> 00:26:04,370 Men om jag kör faktiskt detta program - 580 00:26:04,370 --> 00:26:06,060 Låt mig öppna upp ett terminalfönster. 581 00:26:06,060 --> 00:26:07,750 Låt mig göra buggy3. 582 00:26:07,750 --> 00:26:09,970 Som namnet antyder, detta kommer inte att sluta bra. 583 00:26:09,970 --> 00:26:14,690 För när jag slog in, märker att x är 1. 584 00:26:14,690 --> 00:26:15,720 y är 2. 585 00:26:15,720 --> 00:26:19,160 Och ändå i slutet av programmet, de är fortfarande i själva verket detsamma. 586 00:26:19,160 --> 00:26:22,760 >> Så baserad på visad just nu med Ken, vad egentligen som händer? 587 00:26:22,760 --> 00:26:24,660 Nåväl, låt oss dyka in i denna swap funktion. 588 00:26:24,660 --> 00:26:25,800 Det är super kort. 589 00:26:25,800 --> 00:26:28,020 Det är bara några få rader kod lång. 590 00:26:28,020 --> 00:26:32,810 Men vad är det grundläggande problemet baseras på den enkla berättelse 591 00:26:32,810 --> 00:26:34,270 här uppe med Ken? 592 00:26:34,270 --> 00:26:36,115 Varför swap bruten? 593 00:26:36,115 --> 00:26:37,365 [OHÖRBAR] 594 00:26:39,840 --> 00:26:40,460 Exakt. 595 00:26:40,460 --> 00:26:43,610 Så vi lagrar en kopia, inte variabeln själv. 596 00:26:43,610 --> 00:26:46,810 Med andra ord tar swap tydligen två argument, en int. 597 00:26:46,810 --> 00:26:49,370 Och det är godtyckligt kallas a och b. 598 00:26:49,370 --> 00:26:54,430 Och här uppe, jag har gått i x-och y som är respektive 1 och 2. 599 00:26:54,430 --> 00:26:56,580 Men jag är inte bokstavligen passerar i x. 600 00:26:56,580 --> 00:26:58,410 Jag är inte bokstavligen passerar i y. 601 00:26:58,410 --> 00:27:01,230 Jag passerar en kopia av x och en kopia av y.. 602 00:27:01,230 --> 00:27:05,180 Det är som nästan som om du kopieras och klistras in byta värderingar som 603 00:27:05,180 --> 00:27:07,440 du vill att det ska faktiskt manipulera. 604 00:27:07,440 --> 00:27:11,970 Så om så är fallet, när jag, programmet börjar exekvera 605 00:27:11,970 --> 00:27:14,140 linje 35, sedan 36 - 606 00:27:14,140 --> 00:27:17,740 när jag kommer till linjen 37, vid denna punkt i berättelsen, är det värdet av en? 607 00:27:20,740 --> 00:27:24,850 Vid denna punkt i berättelsen, linje 37, vad är värdet av en vid det här laget? 608 00:27:24,850 --> 00:27:25,980 Så det borde bara vara 1. 609 00:27:25,980 --> 00:27:26,170 Eller hur? 610 00:27:26,170 --> 00:27:29,100 Eftersom X antogs i det första argumentet. 611 00:27:29,100 --> 00:27:33,150 Och denna funktion bara godtyckligt ringer sitt första argument, en. 612 00:27:33,150 --> 00:27:35,130 Likaså är y, det andra argumentet. 613 00:27:35,130 --> 00:27:37,930 Och det är bara godtyckligt ringer det andra argumentet miljarder. 614 00:27:37,930 --> 00:27:40,510 >> Nu dikotomi är faktiskt ganska enkelt förklaras. 615 00:27:40,510 --> 00:27:40,880 Tänk på det. 616 00:27:40,880 --> 00:27:42,980 Ingen av oss har träffat den person som skrev printf. 617 00:27:42,980 --> 00:27:49,880 Så säkert har han eller hon ingen aning om vad våra variabler 30 år senare går 618 00:27:49,880 --> 00:27:50,710 att kallas. 619 00:27:50,710 --> 00:27:55,110 Så det måste finnas en skillnad mellan vad du kallar variabler i 620 00:27:55,110 --> 00:27:59,960 funktioner du skriver och vad du kallar variabler i funktioner du är 621 00:27:59,960 --> 00:28:01,770 ringer eller använder. 622 00:28:01,770 --> 00:28:05,120 Så med andra ord, har jag skrivit mina variabler som x och y. 623 00:28:05,120 --> 00:28:08,060 Men om någon annan hade skrivit swap-funktionen, han eller hon verkligen 624 00:28:08,060 --> 00:28:10,480 skulle inte veta vad mina variabler kommer att kallas. 625 00:28:10,480 --> 00:28:13,850 Så inser att det är därför du har denna dualism av namn. 626 00:28:13,850 --> 00:28:16,800 Tekniskt kan jag göra detta av en tillfällighet. 627 00:28:16,800 --> 00:28:19,750 Men de skulle ändå föras in som kopior. 628 00:28:19,750 --> 00:28:22,940 Det skulle bara vara en ren tillfällighet estetiskt om personen som skrev 629 00:28:22,940 --> 00:28:25,590 swap hade använt samma namn. 630 00:28:25,590 --> 00:28:25,930 >> Okej. 631 00:28:25,930 --> 00:28:29,010 Så vid denna punkt i berättelsen, linje 37, är en 1. 632 00:28:29,010 --> 00:28:30,410 b är 2. 633 00:28:30,410 --> 00:28:32,040 Och nu har jag fortsätter att byta dem. 634 00:28:32,040 --> 00:28:34,730 Tja först av allt, låt mig faktiskt göra det mycket enklare. 635 00:28:34,730 --> 00:28:36,500 Jag vet inte vad dessa tre rader kod gjorde. 636 00:28:36,500 --> 00:28:37,370 Låt mig bara göra det här. 637 00:28:37,370 --> 00:28:38,850 b. får en. 638 00:28:38,850 --> 00:28:40,170 a får b.. 639 00:28:40,170 --> 00:28:41,450 Klar. 640 00:28:41,450 --> 00:28:43,540 Varför är denna trasig, logiskt? 641 00:28:46,980 --> 00:28:48,590 Det är typ av intuitiva sak, eller hur? 642 00:28:48,590 --> 00:28:50,640 Så en blir b.. 643 00:28:50,640 --> 00:28:52,450 Och b blir en. 644 00:28:52,450 --> 00:28:55,410 Men problemet är att så snart som linjen 37 utför, vad är 645 00:28:55,410 --> 00:28:58,170 värde av a och b? 646 00:28:58,170 --> 00:28:59,070 Samma, 1. 647 00:28:59,070 --> 00:29:03,460 Eftersom du har clobbered, så att säga, har du ändrat b för lika en. 648 00:29:03,460 --> 00:29:06,000 Så när ledningen 37 utförs, det är bra. 649 00:29:06,000 --> 00:29:09,940 Du har nu två kopior av nummer 1 på insidan av denna funktion. 650 00:29:09,940 --> 00:29:14,720 Så då när du säger i linje 38, får ett b, ja, du är typ av skruvade. 651 00:29:14,720 --> 00:29:17,370 Eftersom du bara tilldela 1 till 1. 652 00:29:17,370 --> 00:29:20,400 Du har typ av förlorat det värde som du brydde dig om. 653 00:29:20,400 --> 00:29:22,910 >> Så i den ursprungliga versionen av detta, märker vad jag gjorde. 654 00:29:22,910 --> 00:29:26,620 Jag hade i stället tredjedel kodrad som såg ut så här. 655 00:29:26,620 --> 00:29:29,910 Jag förklarar en temporär variabel - TMP är en mycket vanligt namn 656 00:29:29,910 --> 00:29:31,240 för en tillfällig variabel. 657 00:29:31,240 --> 00:29:34,280 Det är en int eftersom det har att matcha vad jag vill göra en kopia av. 658 00:29:34,280 --> 00:29:39,720 Jag lagrar en kopia av en insida tmp. Så när linjen 37 har utförts, 659 00:29:39,720 --> 00:29:41,390 Värdet på a är - 660 00:29:41,390 --> 00:29:42,970 snabb förstånd check - 661 00:29:42,970 --> 00:29:43,460 1. 662 00:29:43,460 --> 00:29:45,780 Värdet på b är 2. 663 00:29:45,780 --> 00:29:48,470 Och värdet av TMP är också 1. 664 00:29:48,470 --> 00:29:51,470 Så nu har jag köra linje 38. 665 00:29:51,470 --> 00:29:57,180 Så när linjen 38 utför, tar på värdet av b. 666 00:29:57,180 --> 00:29:58,510 Och b var 2. 667 00:29:58,510 --> 00:30:00,500 Så en är nu 2. 668 00:30:00,500 --> 00:30:03,110 Så vid denna punkt i berättelsen, är en 2, b är 2, 669 00:30:03,110 --> 00:30:05,130 och TMP är 1. 670 00:30:05,130 --> 00:30:09,330 Så nu logiskt kan vi bara plopp tmp värde i miljarder. 671 00:30:09,330 --> 00:30:10,690 Och vi är klara. 672 00:30:10,690 --> 00:30:12,170 >> Så vi har löst problemet. 673 00:30:12,170 --> 00:30:16,040 Tyvärr, när jag kör det här programmet i denna form, inte egentligen byta 674 00:30:16,040 --> 00:30:17,700 alla värden. 675 00:30:17,700 --> 00:30:18,950 Men för att vara tydlig, varför? 676 00:30:23,420 --> 00:30:26,310 Jag fixade den logiska problemet från bara en stund sedan. 677 00:30:26,310 --> 00:30:31,150 Men återigen, om jag kör det här programmet, x och y är oförändrade i slutet av 678 00:30:31,150 --> 00:30:33,834 programmets genomförande. 679 00:30:33,834 --> 00:30:34,760 [OHÖRBAR] 680 00:30:34,760 --> 00:30:36,030 David J. MALAN: Så vi inte har återvänt något. 681 00:30:36,030 --> 00:30:36,960 Så det är sant. 682 00:30:36,960 --> 00:30:39,880 Men det visar sig att det är lite av ett problem här eftersom hittills har 683 00:30:39,880 --> 00:30:42,460 enda vi har kunnat återvända är en sak. 684 00:30:42,460 --> 00:30:46,540 Och detta är en begränsning av C. Du kan bara returnera verkligen ett värde, 685 00:30:46,540 --> 00:30:48,970 i vilket fall, jag slags fastnat här 686 00:30:48,970 --> 00:30:51,805 eftersom jag kunde återvända det nya värdet på x eller jag kunde återvända till 687 00:30:51,805 --> 00:30:53,160 nytt värde y. 688 00:30:53,160 --> 00:30:54,330 Men jag vill båda tillbaka. 689 00:30:54,330 --> 00:30:58,010 Så återvänder inte den enkla lösningen här. 690 00:30:58,010 --> 00:30:59,770 Men problemet är i grunden varför? 691 00:30:59,770 --> 00:31:03,270 Vad har vi bytte egentligen? 692 00:31:03,270 --> 00:31:04,010 a och b. 693 00:31:04,010 --> 00:31:07,670 Men a och b är kopior av x och y, vilket innebär att vi bara gjorde allt detta 694 00:31:07,670 --> 00:31:10,080 arbete - vi tillbringade bara som tre minuter talar om swappen 695 00:31:10,080 --> 00:31:11,680 funktion och alla tre av dessa variabler. 696 00:31:11,680 --> 00:31:15,090 Och det är bra, helt rätt för sig. 697 00:31:15,090 --> 00:31:20,230 Men a och b omfattning är bara i dessa rader här. 698 00:31:20,230 --> 00:31:24,130 Så precis som en for-slinga, om du deklarerar ett heltal i inuti för 699 00:31:24,130 --> 00:31:27,400 loop - på samma sätt, om du förklara a och b inuti en funktion som 700 00:31:27,400 --> 00:31:30,550 du har skrivit, de är endast giltiga inuti denna funktion. 701 00:31:30,550 --> 00:31:35,020 Vilket betyder när swap sker utför och vi går från ledningen 24 till 702 00:31:35,020 --> 00:31:38,380 ledningen 25, x och y har inte ändrats alls. 703 00:31:38,380 --> 00:31:42,580 Du slösat bara en massa tid att byta kopior av variabler. 704 00:31:42,580 --> 00:31:46,490 >> Så det visar sig att lösningen på detta är faktiskt inte självklart. 705 00:31:46,490 --> 00:31:49,210 Det är inte riktigt tillräckligt för att returnera värden eftersom vi kan 706 00:31:49,210 --> 00:31:50,320 bara tillbaka en värde. 707 00:31:50,320 --> 00:31:53,370 Och jag vill verkligen byta både x och y samtidigt. 708 00:31:53,370 --> 00:31:55,020 Så vi kommer att återkomma till detta. 709 00:31:55,020 --> 00:31:58,770 Men nu inser att frågan i grunden härrör från det faktum 710 00:31:58,770 --> 00:32:00,660 att a och b är kopior. 711 00:32:00,660 --> 00:32:03,450 Och de är i sin egen räckvidd. 712 00:32:03,450 --> 00:32:04,980 Nåväl, låt oss försöka lösa detta på något sätt. 713 00:32:04,980 --> 00:32:09,200 Låt mig faktiskt rulla tillbaka hit och öppna upp, låt oss säga, en fjärde variant 714 00:32:09,200 --> 00:32:11,170 av detta, buggy4. 715 00:32:11,170 --> 00:32:13,230 Och hur är det med det? 716 00:32:13,230 --> 00:32:16,690 Detta är en liknande men enklare problem att titta på innan vi tar en stab på 717 00:32:16,690 --> 00:32:17,530 lösa det. 718 00:32:17,530 --> 00:32:19,440 Detta program kallas inkrement. 719 00:32:19,440 --> 00:32:24,320 Och det initierar tydligen ett x heltal till 1 i linje 18. 720 00:32:24,320 --> 00:32:25,950 Jag hävdar då är x 1. 721 00:32:25,950 --> 00:32:28,020 Jag då anspråk uppräkning, punkt, punkt, punkt. 722 00:32:28,020 --> 00:32:29,460 Jag kallar sedan steg. 723 00:32:29,460 --> 00:32:33,480 Men sedan i ledningarna 22 och 23, hävdar jag att det är ökats. 724 00:32:33,480 --> 00:32:37,780 Jag hävdar x är nu vad det är, 2 förmodligen. 725 00:32:37,780 --> 00:32:39,770 >> Men detta program är buggigt. 726 00:32:39,770 --> 00:32:41,020 Vad är problemet? 727 00:32:43,450 --> 00:32:44,418 Ja? 728 00:32:44,418 --> 00:32:45,668 [OHÖRBAR] 729 00:32:49,260 --> 00:32:49,850 David J. MALAN: Exakt. 730 00:32:49,850 --> 00:32:52,430 SO x har förklarats uppenbarligen på linje 18. 731 00:32:52,430 --> 00:32:54,410 Det är inne i centrala s klammerparenteser. 732 00:32:54,410 --> 00:32:58,470 Så det enkla svaret här är att, ja, det finns X här. 733 00:32:58,470 --> 00:33:01,510 Det existerar inte i linje 32. 734 00:33:01,510 --> 00:33:03,710 Så detta program faktiskt inte ens kompilera. 735 00:33:03,710 --> 00:33:07,910 Kompilatorn, när jag försöker kompilera koden, kommer att skrika på mig 736 00:33:07,910 --> 00:33:13,190 om några odeklarerat identifierare eller något om detta. 737 00:33:13,190 --> 00:33:13,870 I själva verket, låt oss försöka. 738 00:33:13,870 --> 00:33:15,235 Det är att buggy4. 739 00:33:17,780 --> 00:33:18,190 Där är det. 740 00:33:18,190 --> 00:33:22,030 Användning av odeklarerat identifierare x i linje 32. 741 00:33:22,030 --> 00:33:25,700 Och faktiskt, låt oss vara tydligare här i dag så att det är användbart i 742 00:33:25,700 --> 00:33:27,140 kontorstid och hemma. 743 00:33:27,140 --> 00:33:29,000 Observera att det är lite kryptiskt skrivet. 744 00:33:29,000 --> 00:33:31,560 Men det faktum att clang har skrek åt oss, säger 745 00:33:31,560 --> 00:33:36,970 buggy4.c: 32:5, är faktiskt bra. 746 00:33:36,970 --> 00:33:41,970 Det betyder att felet är på linje 32 vid teckenposition fem. 747 00:33:41,970 --> 00:33:44,670 Så en två, tre, fyra, fem. 748 00:33:44,670 --> 00:33:46,640 Det är i själva verket där problemet är. 749 00:33:46,640 --> 00:33:49,710 Och även att hålla i minnet vid kontorstid och hemma, jag är lycklig här. 750 00:33:49,710 --> 00:33:50,740 Jag har en misstag. 751 00:33:50,740 --> 00:33:52,660 Det kommer att vara relativt lätt att åtgärda. 752 00:33:52,660 --> 00:33:56,220 Men om du får en hel skärm full med överväldigande felmeddelanden, igen, 753 00:33:56,220 --> 00:33:59,240 inse att den nedersta en bara kan vara symtom på 754 00:33:59,240 --> 00:34:00,320 de översta sådana. 755 00:34:00,320 --> 00:34:03,560 Så alltid jaga ner dina fel uppifrån och ned. 756 00:34:03,560 --> 00:34:06,720 Eftersom det kan bara vara en daisy-chain effekt som föreslår dig 757 00:34:06,720 --> 00:34:09,030 har sätt mer problem än vad du faktiskt gör. 758 00:34:09,030 --> 00:34:14,989 >> Så hur kan vi fixa detta om mitt mål är att öka x? 759 00:34:14,989 --> 00:34:15,370 Vad är det? 760 00:34:15,370 --> 00:34:15,620 Okej. 761 00:34:15,620 --> 00:34:16,679 Så vi kan göra X globala. 762 00:34:16,679 --> 00:34:18,860 Låt oss ta en genväg som jag varnade tidigare. 763 00:34:18,860 --> 00:34:20,550 Men heck, vi behöver bara en snabb fix. 764 00:34:20,550 --> 00:34:23,949 Så låt oss bara säga int x upp här. 765 00:34:23,949 --> 00:34:25,600 Det gör X global. 766 00:34:25,600 --> 00:34:28,460 Så nu viktigaste har tillgång till den. 767 00:34:28,460 --> 00:34:31,780 Och ökning har tillgång till den. 768 00:34:31,780 --> 00:34:33,860 Och så låt mig gå vidare och sammanställa detta nu. 769 00:34:33,860 --> 00:34:36,330 Gör buggy4, Enter. 770 00:34:36,330 --> 00:34:37,440 Verkar kompilera nu. 771 00:34:37,440 --> 00:34:40,949 Låt oss springa buggy4, och det verkar faktiskt fungera. 772 00:34:40,949 --> 00:34:42,780 Nu är det här en av dessa saker - 773 00:34:42,780 --> 00:34:45,870 gör som jag säger, inte som jag gör, som jag just har gjort här. 774 00:34:45,870 --> 00:34:49,239 För i allmänhet våra program kommer att få mycket mer intressant och 775 00:34:49,239 --> 00:34:50,440 mycket längre än detta. 776 00:34:50,440 --> 00:34:53,199 Och om din lösning på livets problem är bara ah, sätta alla 777 00:34:53,199 --> 00:34:57,550 variabler på toppen av din fil, mycket snabbt göra program får 778 00:34:57,550 --> 00:34:59,700 fasansfullt svåra att hantera. 779 00:34:59,700 --> 00:35:02,050 Det blir svårare att komma på nya variabelnamn. 780 00:35:02,050 --> 00:35:05,240 Det blir svårare att förstå vad variabeln gör vad. 781 00:35:05,240 --> 00:35:08,250 >> Och så i allmänhet är detta inte en bra lösning. 782 00:35:08,250 --> 00:35:09,780 Så låt oss göra det här bättre. 783 00:35:09,780 --> 00:35:11,920 Vi vill inte använda en global variabel här. 784 00:35:11,920 --> 00:35:14,050 Jag vill öka x. 785 00:35:14,050 --> 00:35:16,050 Så jag kunde naturligtvis - 786 00:35:16,050 --> 00:35:18,450 i slutet av dagen, det är lite av en dum historia eftersom vi bara göra detta. 787 00:35:18,450 --> 00:35:22,050 Men om jag inte visste om denna aktör, eller jag inte fick 788 00:35:22,050 --> 00:35:27,700 ändra det i huvud själv, hur kunde jag annars genomföra Ken hit, detta 789 00:35:27,700 --> 00:35:31,450 tid inte till kub utan att inkrementera? 790 00:35:31,450 --> 00:35:32,700 Hur ändrar jag det här här? 791 00:35:32,700 --> 00:35:33,025 Ja. 792 00:35:33,025 --> 00:35:34,275 [OHÖRBAR] 793 00:35:37,430 --> 00:35:38,000 David J. MALAN: Okej, bra. 794 00:35:38,000 --> 00:35:40,490 Så varför inte jag gå i x? 795 00:35:40,490 --> 00:35:44,390 Och sedan i stället lämna tillbaka det, varför inte jag bara göra retur x + 1? 796 00:35:44,390 --> 00:35:46,370 Nu, ett par fler saker måste förändras här. 797 00:35:46,370 --> 00:35:47,530 Jag är på rätt spår. 798 00:35:47,530 --> 00:35:48,910 Vad behöver jag för att justera? 799 00:35:48,910 --> 00:35:49,470 Någon annan. 800 00:35:49,470 --> 00:35:49,882 Ja? 801 00:35:49,882 --> 00:35:51,530 [OHÖRBAR] 802 00:35:51,530 --> 00:35:53,520 David J. MALAN: Jag behöver ändra returtyp av inkrement 803 00:35:53,520 --> 00:35:54,590 eftersom det inte är ogiltig. 804 00:35:54,590 --> 00:35:56,650 Void betyder ingenting är som returneras. 805 00:35:56,650 --> 00:35:57,600 Men helt klart, nu är det. 806 00:35:57,600 --> 00:36:01,280 Så detta behöver ändras för att int vara förenlig med vad 807 00:36:01,280 --> 00:36:02,580 Jag är faktiskt återvänder. 808 00:36:02,580 --> 00:36:04,580 >> Nu något annat är fortfarande buggigt här. 809 00:36:04,580 --> 00:36:04,982 Ja? 810 00:36:04,982 --> 00:36:06,590 [OHÖRBAR] 811 00:36:06,590 --> 00:36:07,630 David J. MALAN: Så jag behöver öka x? 812 00:36:07,630 --> 00:36:10,336 [OHÖRBAR] 813 00:36:10,336 --> 00:36:11,880 David J. MALAN: Ah, så jag måste gå x. 814 00:36:11,880 --> 00:36:13,300 Så jag behöver göra det här. 815 00:36:17,590 --> 00:36:19,690 Så prototypen måste jag ändra detta här. 816 00:36:19,690 --> 00:36:21,290 Så detta måste bli en int. 817 00:36:21,290 --> 00:36:22,820 Detta måste bli - 818 00:36:22,820 --> 00:36:23,670 hmm. 819 00:36:23,670 --> 00:36:24,710 Jag har faktiskt en bugg här nere. 820 00:36:24,710 --> 00:36:25,780 Låt oss fixa detta först. 821 00:36:25,780 --> 00:36:27,990 Vad ska det vara egentligen? 822 00:36:27,990 --> 00:36:29,330 Så det måste vara en int något. 823 00:36:29,330 --> 00:36:30,340 Det kan vara X. 824 00:36:30,340 --> 00:36:33,120 Men ärligt talat, om du börjar ringa alla dina variabler x, det kommer att bli 825 00:36:33,120 --> 00:36:35,250 mindre och mindre tydlig vilken som är vilken. 826 00:36:35,250 --> 00:36:38,210 Så låt oss bara godtyckligt välja en annan namnkonvention för min 827 00:36:38,210 --> 00:36:40,220 hjälpfunktioner, funktioner jag skriver. 828 00:36:40,220 --> 00:36:41,100 Vi kallar det en. 829 00:36:41,100 --> 00:36:44,500 Eller vi kan kalla det - låt oss kalla det even_number vara ännu tydligare. 830 00:36:44,500 --> 00:36:47,610 Så då måste jag återvända oavsett antalet är plus 1. 831 00:36:47,610 --> 00:36:49,720 Och nu måste jag byta en annan sak upp här och en 832 00:36:49,720 --> 00:36:50,700 annan sak här uppe. 833 00:36:50,700 --> 00:36:54,150 Vad ska jag byta på linje 21 först? 834 00:36:54,150 --> 00:36:55,390 Jag måste ge det till x. 835 00:36:55,390 --> 00:36:57,480 Så jag kan inte bara ringa stegvärde x. 836 00:36:57,480 --> 00:37:01,000 Jag måste komma ihåg svaret genom att ändra värdet på x på 837 00:37:01,000 --> 00:37:02,020 den vänstra sidan. 838 00:37:02,020 --> 00:37:04,930 Och även om x är nu på vänster och höger, det är helt bra eftersom 839 00:37:04,930 --> 00:37:08,370 den högra sidan blir utförs först sedan får plopped i den vänstra 840 00:37:08,370 --> 00:37:10,240 handen sak, X i detta fall. 841 00:37:10,240 --> 00:37:11,900 Och då slutligen, är detta en enkel fix nu. 842 00:37:11,900 --> 00:37:15,080 Detta bör bara matcha vad nere. 843 00:37:15,080 --> 00:37:17,120 Int nummer. 844 00:37:17,120 --> 00:37:17,320 >> Okej. 845 00:37:17,320 --> 00:37:20,290 Så en hel massa förändringar för ett riktigt dumt funktion. 846 00:37:20,290 --> 00:37:24,250 Men representativ för saker som vi alltmer kommer att vilja göra. 847 00:37:24,250 --> 00:37:25,490 Så gör buggy4. 848 00:37:25,490 --> 00:37:26,485 Jag har skruvat upp någonstans. 849 00:37:26,485 --> 00:37:27,520 Herregud. 850 00:37:27,520 --> 00:37:29,660 Fem misstag i, liksom, en sex-line program. 851 00:37:29,660 --> 00:37:36,500 Så vad är det för fel på rad 18, 5 tecken? 852 00:37:36,500 --> 00:37:36,970 Okej. 853 00:37:36,970 --> 00:37:39,330 Så jag måste förklara detta int. 854 00:37:39,330 --> 00:37:39,630 Okej. 855 00:37:39,630 --> 00:37:41,790 Så låt oss se, en hel massa andra fel. 856 00:37:41,790 --> 00:37:42,230 Herregud. 857 00:37:42,230 --> 00:37:43,880 19, 18, 21. 858 00:37:43,880 --> 00:37:46,020 Men återigen, låt oss bara rensa skärmen - 859 00:37:46,020 --> 00:37:48,660 Kontroll L här - och kör klang. 860 00:37:48,660 --> 00:37:51,340 Så fem problem är faktiskt bara den. 861 00:37:51,340 --> 00:37:53,500 Så nu ska vi köra buggy4, Enter. 862 00:37:53,500 --> 00:37:54,150 Puh. 863 00:37:54,150 --> 00:37:57,434 x har ökats korrekt. 864 00:37:57,434 --> 00:37:58,420 >> Okej. 865 00:37:58,420 --> 00:38:01,700 Har du frågor om hur man öka siffror? 866 00:38:01,700 --> 00:38:02,896 Ja? 867 00:38:02,896 --> 00:38:06,864 Högtalare 2: Varför är det så att du bara kan byta x till antalet i variabeln 868 00:38:06,864 --> 00:38:08,860 namn och det vet vad du menar? 869 00:38:08,860 --> 00:38:09,600 David J. MALAN: Bra fråga. 870 00:38:09,600 --> 00:38:13,130 Hur kommer det sig att jag bara kan byta x till antalet och programmet kommer att veta 871 00:38:13,130 --> 00:38:13,990 omedelbart? 872 00:38:13,990 --> 00:38:16,120 Så återigen, se det som denna abstraktion. 873 00:38:16,120 --> 00:38:20,110 Så om jag är huvud och Ken är inkrementell, ärligt talat, jag bryr mig inte 874 00:38:20,110 --> 00:38:21,540 vad Ken kallar sin iPad. 875 00:38:21,540 --> 00:38:25,350 Jag bryr mig inte vad han kallar allt som har att göra med hans genomförandet 876 00:38:25,350 --> 00:38:26,550 av denna funktionalitet. 877 00:38:26,550 --> 00:38:32,130 Så detta är en implementering detalj som jag, huvud, inte 878 00:38:32,130 --> 00:38:33,010 måste bry sig om. 879 00:38:33,010 --> 00:38:37,440 Och så helt enkelt byta det konsekvent insidan av funktionen, antal här 880 00:38:37,440 --> 00:38:41,340 och nummer här, är allt som behövs så länge jag kompilera. 881 00:38:41,340 --> 00:38:43,820 Det är ungefär som om du tycker om - många av oss, de av er med förarens 882 00:38:43,820 --> 00:38:46,590 licenser som har kört, eller om du ens kört i en bil - 883 00:38:46,590 --> 00:38:50,710 de flesta av oss har ingen aning om hur en bil fungerar under huven. 884 00:38:50,710 --> 00:38:54,710 Och bokstavligen, om du öppnar upp huven, de flesta av oss - däribland jag själv - 885 00:38:54,710 --> 00:38:56,580 kommer inte att verkligen veta vad vi tittar på. 886 00:38:56,580 --> 00:38:58,850 Ungefär som du kan känna med sånt här just nu. 887 00:38:58,850 --> 00:39:01,380 Men vi har egentligen inte bry hur bilen fungerar. 888 00:39:01,380 --> 00:39:05,000 Vi behöver inte bry sig om vad alla stavar och kolvar och kablar inuti 889 00:39:05,000 --> 00:39:07,700 bilen faktiskt gör. 890 00:39:07,700 --> 00:39:11,360 >> Så något liknande vad du kallar kolven ingen roll 891 00:39:11,360 --> 00:39:11,920 Här i detta fall. 892 00:39:11,920 --> 00:39:12,490 Samma idé. 893 00:39:12,490 --> 00:39:12,670 Ja? 894 00:39:12,670 --> 00:39:13,920 [OHÖRBAR] 895 00:39:25,250 --> 00:39:29,530 David J. MALAN: Om det fanns fler användningsområden för den variabla xa stund sedan, 896 00:39:29,530 --> 00:39:32,220 du, programmerare, skulle behöva ändra dem överallt. 897 00:39:32,220 --> 00:39:35,230 Eller så kan du bokstavligen göra Fil, Meny och sedan Sök / Ersätt, 898 00:39:35,230 --> 00:39:36,270 något liknande. 899 00:39:36,270 --> 00:39:40,110 Men du kommer att behöva göra dessa ändringar själv. 900 00:39:40,110 --> 00:39:41,200 Du måste vara konsekvent. 901 00:39:41,200 --> 00:39:42,450 [OHÖRBAR] 902 00:39:47,200 --> 00:39:48,960 David J. MALAN: En särskild ordning som här? 903 00:39:48,960 --> 00:39:52,660 Om detta var int annat nummer? 904 00:39:52,660 --> 00:39:52,940 Ja. 905 00:39:52,940 --> 00:39:56,430 Så att frågor när du ringer funktionen. 906 00:39:56,430 --> 00:40:00,350 Så om jag ringer inkrement här med något kommatecken något, 907 00:40:00,350 --> 00:40:01,400 Det finns en direkt mappning. 908 00:40:01,400 --> 00:40:04,490 Den första variabeln, vad det heter, görs en kopia av det första 909 00:40:04,490 --> 00:40:05,480 argument här. 910 00:40:05,480 --> 00:40:07,280 Tyvärr, bör detta inte vara en parentes. 911 00:40:07,280 --> 00:40:09,300 Det andra argumentet ställer upp med den andra. 912 00:40:09,300 --> 00:40:11,220 >> Så att, ja, frågor. 913 00:40:11,220 --> 00:40:11,490 Okej. 914 00:40:11,490 --> 00:40:13,360 Förlåt att jag tog en lång väg dit. 915 00:40:13,360 --> 00:40:14,610 Övriga frågor? 916 00:40:16,460 --> 00:40:16,850 Okej. 917 00:40:16,850 --> 00:40:20,300 Så låt oss se om vi inte kan måla en bild av vad som egentligen händer 918 00:40:20,300 --> 00:40:22,160 Här under huven, så att säga. 919 00:40:22,160 --> 00:40:26,310 Så detta är en rektangel som kan representera datorns minne. 920 00:40:26,310 --> 00:40:31,240 Så även om du har ingen aning om hur minnet fungerar eller hur RAM fungerar, åtminstone 921 00:40:31,240 --> 00:40:33,590 anta att du har klasar av det dessa dagar. 922 00:40:33,590 --> 00:40:34,740 Du har megabyte det. 923 00:40:34,740 --> 00:40:35,760 Du har gigabyte det. 924 00:40:35,760 --> 00:40:40,690 Och vi vet från vecka noll att en byte är precis vad? 925 00:40:40,690 --> 00:40:41,280 8 bitar. 926 00:40:41,280 --> 00:40:42,730 Rätt, så 8 nollor och ettor. 927 00:40:42,730 --> 00:40:46,300 Så om din dator har en spelning RAM, två gig RAM dessa dagar, du har en 928 00:40:46,300 --> 00:40:54,450 miljarder eller 2 miljarder byte minne, eller ungefär 8 miljarder eller 16 miljarder 929 00:40:54,450 --> 00:40:56,560 bitar, inne i datorn. 930 00:40:56,560 --> 00:40:59,710 Nu till skillnad från den lilla Woolly Willy exempel, det är inte magnetiska partiklar 931 00:40:59,710 --> 00:41:00,560 typiskt längre. 932 00:41:00,560 --> 00:41:04,470 Alltmer, i bärbara datorer åtminstone är det Solid State Drives, SSD, som 933 00:41:04,470 --> 00:41:05,560 bara har inga rörliga delar. 934 00:41:05,560 --> 00:41:06,710 Det är alla elektroniska. 935 00:41:06,710 --> 00:41:08,070 Det är all el baserad. 936 00:41:08,070 --> 00:41:12,360 Så tänk dock denna rektangel som bara representerar en eller två 937 00:41:12,360 --> 00:41:13,930 gigabyte minne som du har. 938 00:41:13,930 --> 00:41:15,500 >> Så det är en bit av minne. 939 00:41:15,500 --> 00:41:20,460 Nu värld datavetenskap har slags partitionerade bort bitar av 940 00:41:20,460 --> 00:41:22,570 minne för att göra olika saker. 941 00:41:22,570 --> 00:41:25,930 Så till exempel om det är din dators RAM-minne - som föreslagits av 942 00:41:25,930 --> 00:41:30,400 rektangel där - visar sig att av konvention, på toppen av din RAM, så 943 00:41:30,400 --> 00:41:33,170 att tala, är i allmänhet vad som kallas en text segment. 944 00:41:33,170 --> 00:41:35,910 Dessa är de nollor och ettor som du har sammanställt. 945 00:41:35,910 --> 00:41:39,040 Så när vi har tittat under huven på vad a.out är allt 946 00:41:39,040 --> 00:41:40,360 de nollor och ettor - 947 00:41:40,360 --> 00:41:44,000 När du kör ett program, är dessa nollor och ettor in från hårddisken 948 00:41:44,000 --> 00:41:46,290 kör in i något som kallas RAM. 949 00:41:46,290 --> 00:41:48,950 Och i RAM, de sätter på toppen. 950 00:41:48,950 --> 00:41:50,330 Nu under tiden har du andra saker. 951 00:41:50,330 --> 00:41:53,060 Initierade uppgifter, oinitierade data. 952 00:41:53,060 --> 00:41:56,440 Dessa två stråk av minne hänvisar till globala variabler, som 953 00:41:56,440 --> 00:41:57,530 du inte använder ofta. 954 00:41:57,530 --> 00:42:00,630 Men ibland om du gör, hamnar de upp där också. 955 00:42:00,630 --> 00:42:01,620 Sedan finns några andra saker. 956 00:42:01,620 --> 00:42:04,130 Miljövariabler, som vi inte kommer att spendera mycket tid på. 957 00:42:04,130 --> 00:42:06,120 Men sedan två viktiga saker som kommer tillbaka under denna 958 00:42:06,120 --> 00:42:08,130 termin, stack och heap. 959 00:42:08,130 --> 00:42:12,280 >> Så de flesta av datorns minne är reserverat när man kör ett program för 960 00:42:12,280 --> 00:42:14,880 något som kallas stapeln och något som kallas högen. 961 00:42:14,880 --> 00:42:16,940 Och vi kommer inte att tala om högen idag, men vi kommer 962 00:42:16,940 --> 00:42:18,180 tala om stapeln. 963 00:42:18,180 --> 00:42:22,910 Och stapeln är avsedd att trolla fram den visuella av liknande matsalen 964 00:42:22,910 --> 00:42:26,120 måltid brickor i Mather House, eller varhelst du råkar vara där 965 00:42:26,120 --> 00:42:27,810 matsal personal rengör dem varje dag. 966 00:42:27,810 --> 00:42:30,180 De stack upp dem från golvet på upp. 967 00:42:30,180 --> 00:42:33,800 Och på samma sätt i minnet, det är denna idé om att sätta något på en 968 00:42:33,800 --> 00:42:36,740 stack, sätta något på en bunt, sätta något på en stack. 969 00:42:36,740 --> 00:42:38,000 Och vad menar vi med det? 970 00:42:38,000 --> 00:42:41,430 Nåväl, låt oss zooma in på bara den nedre halvan av bilden, datorns 971 00:42:41,430 --> 00:42:43,990 RAM, att föreslå följande. 972 00:42:43,990 --> 00:42:48,300 Det visar sig att när du kör ett program som a.out eller hej, vad 973 00:42:48,300 --> 00:42:49,920 programmet är att du har skrivit, 974 00:42:49,920 --> 00:42:53,030 igen, dessa nollor och ettor laddas från hårddisken - som är 975 00:42:53,030 --> 00:42:56,190 långtidslagring, stannar där även när du dra ur kontakten - 976 00:42:56,190 --> 00:42:57,220 laddas till RAM. 977 00:42:57,220 --> 00:42:59,020 RAM är snabbare än hårddiskar. 978 00:42:59,020 --> 00:43:00,700 Det är mindre än hårddiskar. 979 00:43:00,700 --> 00:43:03,490 Men det är där programmen bor när du kör dem. 980 00:43:03,490 --> 00:43:06,380 >> Så du dubbelklicka ett program på en Mac eller PC - det är laddat från 981 00:43:06,380 --> 00:43:07,750 hårddisken i RAM-minnet. 982 00:43:07,750 --> 00:43:11,760 Så snart det är laddat i RAM, de nollor och ettor går på vägen upp, de 983 00:43:11,760 --> 00:43:13,130 så kallade textsegment. 984 00:43:13,130 --> 00:43:17,040 Men sedan så fort ditt program faktiskt startar, den viktigaste 985 00:43:17,040 --> 00:43:18,140 Funktionen anropas. 986 00:43:18,140 --> 00:43:21,070 Och viktigaste, som vi har sett, ofta lokala variabler. 987 00:43:21,070 --> 00:43:24,560 Och det har Ints och strängar samt tecken och liknande. 988 00:43:24,560 --> 00:43:28,300 Så om ditt program som du har skrivit eller det program som du har 989 00:43:28,300 --> 00:43:33,680 dubbel klickade använde vissa variabler inuti huvud hamnar de på 990 00:43:33,680 --> 00:43:37,020 botten av din stack minne, så att säga. 991 00:43:37,020 --> 00:43:39,160 Nu mer konkret vad innebär egentligen? 992 00:43:39,160 --> 00:43:44,080 Det betyder bara att om vi skulle numrera saker - 993 00:43:44,080 --> 00:43:49,380 Om vi ​​skulle numrera byte RAM i datorn, märker att 994 00:43:49,380 --> 00:43:51,650 detta kan vara byte nummer noll. 995 00:43:51,650 --> 00:43:56,130 Detta kan vara byte nummer ett, två, tre, fyra, fem, sex, alla 996 00:43:56,130 --> 00:43:57,290 vägen upp till vill - 997 00:43:57,290 --> 00:44:01,520 2 miljarder skulle vara hela vägen upp där i toppen. 998 00:44:01,520 --> 00:44:05,960 Så med andra ord, när vi talar om RAM eller minne i form av byte, det 999 00:44:05,960 --> 00:44:09,680 betyder bara att någon har bestämt vad att numrera varje 1000 00:44:09,680 --> 00:44:11,110 de bitar av minne. 1001 00:44:11,110 --> 00:44:16,950 >> Så när du behöver 32 bitar för en int, eller om du behöver 8 bitar för en röding, där 1002 00:44:16,950 --> 00:44:18,320 hamnar de i minnet? 1003 00:44:18,320 --> 00:44:20,650 Nåväl begreppsmässigt, hamnar de bara upp på botten av detta 1004 00:44:20,650 --> 00:44:21,780 sak kallad stapeln. 1005 00:44:21,780 --> 00:44:25,670 Men vad som är intressant nu är när stora anropar en funktion. 1006 00:44:25,670 --> 00:44:28,830 Antag en funktion som kallas foo, bara ett godtyckligt namn. 1007 00:44:28,830 --> 00:44:32,480 Vad som händer är viktigaste är på botten av denna stapel av minne. 1008 00:44:32,480 --> 00:44:35,630 Foo nu läggs ovanpå viktigaste i minnet. 1009 00:44:35,630 --> 00:44:40,020 Så några lokala variabler som foo har hamnar slags konceptuellt över 1010 00:44:40,020 --> 00:44:40,770 de i huvud. 1011 00:44:40,770 --> 00:44:46,920 Om foo kallar en annan funktion som heter bar, dessa variabler hamna här. 1012 00:44:46,920 --> 00:44:49,790 Om spärra samtal något annat, här, här, här. 1013 00:44:49,790 --> 00:44:53,900 Så vad är intressant om hur du kör ett program är att när du ringer funktioner, 1014 00:44:53,900 --> 00:44:57,720 och eftersom dessa funktioner kräver funktioner, och som dessa funktioner kallar funktioner, 1015 00:44:57,720 --> 00:45:00,980 du bygga upp denna trave funktioner i minnet. 1016 00:45:00,980 --> 00:45:06,740 Och bara en gång en funktion returnerar börjar man få att minnet tillbaka. 1017 00:45:06,740 --> 00:45:11,190 Så en av de enklaste sätten att få slut på minne i en dator programmet är att 1018 00:45:11,190 --> 00:45:14,170 skriva funktioner som aldrig återvända. 1019 00:45:14,170 --> 00:45:16,650 >> Så till exempel, låt oss visa så mycket med en 1020 00:45:16,650 --> 00:45:18,460 avsiktligt buggy programmet. 1021 00:45:18,460 --> 00:45:24,690 Låt mig gå vidare och göra # include , int main (void). 1022 00:45:24,690 --> 00:45:31,270 Och jag ska göra medan (2> 1), som troligen inte kommer att någonsin 1023 00:45:31,270 --> 00:45:33,370 förändring på oss. 1024 00:45:33,370 --> 00:45:37,720 Och låt mig gå vidare nu och göra printf. 1025 00:45:37,720 --> 00:45:39,950 Egentligen är det kommer att bli mindre visuellt intressant. 1026 00:45:39,950 --> 00:45:40,460 Låt oss göra detta. 1027 00:45:40,460 --> 00:45:44,840 För int (i = 0, i> 0). 1028 00:45:44,840 --> 00:45:49,740 Låt oss göra detta misstag, i + +. 1029 00:45:49,740 --> 00:45:51,150 Och låt oss inte printf här. 1030 00:45:51,150 --> 00:45:52,550 Låt oss leva som jag predikade. 1031 00:45:52,550 --> 00:45:54,090 Låt oss ha en metod här. 1032 00:45:54,090 --> 00:46:00,860 Void kör, och vi kommer att säga int i. 1033 00:46:00,860 --> 00:46:02,295 Och då ska jag säga, printf - 1034 00:46:04,871 --> 00:46:06,790 Åh, låt oss göra detta mer intressant. 1035 00:46:06,790 --> 00:46:08,350 Låt oss faktiskt inte ut något alls. 1036 00:46:08,350 --> 00:46:10,530 Låt oss bara göra detta. 1037 00:46:10,530 --> 00:46:11,780 Kör (i). 1038 00:46:16,630 --> 00:46:17,000 >> Okej. 1039 00:46:17,000 --> 00:46:20,040 Så detta är buggig eftersom varför? 1040 00:46:20,040 --> 00:46:22,850 Jag gör detta som jag går eftersom programmet inte egentligen göra något 1041 00:46:22,850 --> 00:46:23,420 av intresse. 1042 00:46:23,420 --> 00:46:24,670 Men det är inte målet. 1043 00:46:24,670 --> 00:46:30,440 Målet är att skriva ett program vars huvudfunktion gör vad, tydligen? 1044 00:46:30,440 --> 00:46:31,370 Kalla sig. 1045 00:46:31,370 --> 00:46:32,600 Och faktiskt, vi behöver inte slingan. 1046 00:46:32,600 --> 00:46:36,070 Låt oss förenkla även detta bara för att inte glömma verkligen 1047 00:46:36,070 --> 00:46:37,310 grundläggande fel. 1048 00:46:37,310 --> 00:46:39,200 Huvudsakliga samtal refräng att sjunga lite kör. 1049 00:46:39,200 --> 00:46:41,760 Sen gjorde jag något dumt, och jag hade Chorus Chorus samtal eftersom jag antar 1050 00:46:41,760 --> 00:46:43,550 någon annan skulle genomföra det kanske. 1051 00:46:43,550 --> 00:46:45,960 Och nu detta inte kommer att sammanställa ännu. 1052 00:46:45,960 --> 00:46:48,340 Jag behöver göra det? 1053 00:46:48,340 --> 00:46:49,700 Jag behöver prototypen, minns. 1054 00:46:49,700 --> 00:46:55,520 Så jag måste ha här uppe void kör (int i);. 1055 00:46:55,520 --> 00:46:57,470 >> Så nu, om jag går ner här - 1056 00:46:57,470 --> 00:46:59,030 faktiskt, låt oss använda den större fönstret. 1057 00:46:59,030 --> 00:47:01,670 Låt oss gå vidare och göra kör. 1058 00:47:01,670 --> 00:47:06,000 Låt oss gå vidare och göra kör. 1059 00:47:06,000 --> 00:47:08,302 Användning av oidentifierat spelföraren i.. 1060 00:47:08,302 --> 00:47:09,860 Åh, det var dumt. 1061 00:47:09,860 --> 00:47:11,020 Vi behöver inte argumentet. 1062 00:47:11,020 --> 00:47:13,680 Låt oss bara göra detta. 1063 00:47:13,680 --> 00:47:14,550 Önska vi hade börjat på detta sätt. 1064 00:47:14,550 --> 00:47:16,160 Det skulle ha varit en mycket enklare program för att skriva. 1065 00:47:16,160 --> 00:47:20,100 Så det. 1066 00:47:20,100 --> 00:47:23,870 Nu ska vi gå över till min terminalfönster, repris klang. 1067 00:47:23,870 --> 00:47:26,900 Och nu kör vi. 1068 00:47:26,900 --> 00:47:28,020 Det var verkligen snabbt. 1069 00:47:28,020 --> 00:47:30,690 Vad som egentligen hände, men? 1070 00:47:30,690 --> 00:47:33,430 Nåväl, nu ska jag lägga den tryckta linjen, så att vi kan se. 1071 00:47:33,430 --> 00:47:41,330 Så låt mig säga printf, låt oss säga, jag är här. 1072 00:47:41,330 --> 00:47:43,470 Okej, inga variabler, vi lämnar det så. 1073 00:47:43,470 --> 00:47:44,860 Låt mig köra göra. 1074 00:47:44,860 --> 00:47:47,940 Låt mig repris kören. 1075 00:47:47,940 --> 00:47:51,235 Och kom igen. 1076 00:47:53,880 --> 00:47:55,130 Fortsätt. 1077 00:47:57,630 --> 00:47:59,750 Som en sidoreplik, varför har det kraschade inte ännu? 1078 00:47:59,750 --> 00:48:02,050 Den segmenteringsfel hände supersnabb tidigare. 1079 00:48:02,050 --> 00:48:04,250 [OHÖRBAR] 1080 00:48:04,250 --> 00:48:04,830 David J. MALAN: Exakt. 1081 00:48:04,830 --> 00:48:06,350 Så det tar tid att skriva ut. 1082 00:48:06,350 --> 00:48:08,370 Det tar bara mer arbete på datorns sida. 1083 00:48:08,370 --> 00:48:09,550 Och det är det. 1084 00:48:09,550 --> 00:48:10,620 Segmenteringsfel. 1085 00:48:10,620 --> 00:48:12,140 >> Så märker hur snabbt program körs. 1086 00:48:12,140 --> 00:48:14,110 Om du inte skriver något, supersnabb. 1087 00:48:14,110 --> 00:48:18,100 Men vi fick ändå denna segmentering fel eftersom vad som hände? 1088 00:48:18,100 --> 00:48:21,310 Tja, om du tänker på hur datorns minne är anlagd, detta 1089 00:48:21,310 --> 00:48:22,890 råkar vara huvud. 1090 00:48:22,890 --> 00:48:23,800 Men här - 1091 00:48:23,800 --> 00:48:28,670 låt oss kalla just denna kör, och låt oss kalla denna kör. 1092 00:48:28,670 --> 00:48:33,420 Och nu om jag gör mitt estetik rätt, kommer detta bara säga kör, 1093 00:48:33,420 --> 00:48:38,060 kör, kör, kör, kör, kör, kör, ad nauseum. 1094 00:48:38,060 --> 00:48:39,920 Och slutligen, vad är det kommer att hända? 1095 00:48:39,920 --> 00:48:46,690 Om den stora bilden bokstavligen är, vad händer just begreppsmässigt? 1096 00:48:46,690 --> 00:48:48,320 Bunten överskridanden högen. 1097 00:48:48,320 --> 00:48:52,400 Eller ännu värre, överskridande du bara allt, inklusive text segmentet, som är 1098 00:48:52,400 --> 00:48:54,530 de nollor och ettor som representerar ditt program. 1099 00:48:54,530 --> 00:48:56,690 Kort sagt, detta är bara super, super dåligt. 1100 00:48:56,690 --> 00:48:56,860 Eller hur? 1101 00:48:56,860 --> 00:48:58,620 Ditt program har spiraled utom kontroll. 1102 00:48:58,620 --> 00:49:02,840 Du använder mycket mer minne än du tänkt allt på grund av en dum 1103 00:49:02,840 --> 00:49:03,920 misstag, i det här fallet. 1104 00:49:03,920 --> 00:49:08,160 Eller i detta fall, ett mycket medvetet gjort funktion kallar sig. 1105 00:49:08,160 --> 00:49:09,210 Nu är detta inte alla dåliga. 1106 00:49:09,210 --> 00:49:12,540 Funktioner som kallar sig har faktiskt stor makt 1107 00:49:12,540 --> 00:49:13,700 när du använder den på rätt sätt. 1108 00:49:13,700 --> 00:49:15,650 Jag har inte använt det på rätt här. 1109 00:49:15,650 --> 00:49:16,940 >> Så detta är inte negativt. 1110 00:49:16,940 --> 00:49:20,620 Men det faktum att jag aldrig sluta kalla mig är en grundläggande 1111 00:49:20,620 --> 00:49:23,050 svaghet här i detta program. 1112 00:49:23,050 --> 00:49:25,090 Så vart är vi på väg med allt detta? 1113 00:49:25,090 --> 00:49:26,230 Tja, vad som verkligen händer? 1114 00:49:26,230 --> 00:49:30,010 När jag ringer ökningen funktionen, som vi gjorde i dessa exempel, 1115 00:49:30,010 --> 00:49:33,290 Jag har ett värde som 1 som jag passerar i. 1116 00:49:33,290 --> 00:49:35,820 Jag passerar i en kopia av nummer ett. 1117 00:49:35,820 --> 00:49:37,080 Så följande händer. 1118 00:49:37,080 --> 00:49:40,390 Så låt oss gå in i steg exempel. 1119 00:49:40,390 --> 00:49:44,230 Och den här killen här borta. 1120 00:49:44,230 --> 00:49:46,800 Så här är vad som faktiskt händer. 1121 00:49:46,800 --> 00:49:50,770 När jag ringde inkrement, och jag passerar i X, bildmässigt vad 1122 00:49:50,770 --> 00:49:53,660 pågår här är det - 1123 00:49:53,660 --> 00:50:00,240 om jag har värdet 1 sparas här, och jag faktiskt kallar steg, vilket 1124 00:50:00,240 --> 00:50:02,680 kallas nu kör - 1125 00:50:02,680 --> 00:50:04,010 Ja, det är kastar mig här. 1126 00:50:04,010 --> 00:50:06,750 Så låt oss kalla detta steg. 1127 00:50:06,750 --> 00:50:09,420 Och vi vet inte vad det nästa funktion kommer att bli. 1128 00:50:09,420 --> 00:50:14,270 Så vad som faktiskt händer är här någonstans i main, jag har en bit av 1129 00:50:14,270 --> 00:50:16,670 minne som lagrar numret 1. 1130 00:50:16,670 --> 00:50:19,730 När jag ringer steg, jag använder en annan bit av minnet, men nu har jag 1131 00:50:19,730 --> 00:50:20,840 har kopian av 1. 1132 00:50:20,840 --> 00:50:25,480 När jag öka detta värde blir detta 2 - fruktansvärt skriven på 1133 00:50:25,480 --> 00:50:26,420 skärm här. 1134 00:50:26,420 --> 00:50:30,550 Men sedan, vad händer när inkrement återvänder? 1135 00:50:30,550 --> 00:50:34,610 Detta minne blir bara lämnas tillbaka till operativsystemet, vilket betyder allt 1136 00:50:34,610 --> 00:50:37,470 du har gjort är inget användbart. 1137 00:50:37,470 --> 00:50:43,460 Den som ursprungligen ingick i huvud är fortfarande faktiskt det. 1138 00:50:43,460 --> 00:50:44,650 >> Så vart är vi på väg med detta? 1139 00:50:44,650 --> 00:50:49,400 Tja, visar det sig att i minnet du har denna back to back sekvens av 1140 00:50:49,400 --> 00:50:50,940 byte som du kan sätta saker i. 1141 00:50:50,940 --> 00:50:53,760 Och det visar sig att vi redan har sett något som innebär att sätta 1142 00:50:53,760 --> 00:50:55,100 saker rygg mot rygg mot rygg mot rygg. 1143 00:50:55,100 --> 00:51:00,170 Vad är en sträng, som bygger på vecka ett och nu vecka två? 1144 00:51:00,170 --> 00:51:01,840 Så det är bara en samling av tecken. 1145 00:51:01,840 --> 00:51:05,290 Så visar det sig, precis som du kan sätta siffror i minnet, på samma sätt kan du 1146 00:51:05,290 --> 00:51:06,900 sätta tecken i minnet. 1147 00:51:06,900 --> 00:51:09,810 Och när vi börjar sätta tecken i minnet tillbaka till tillbaka till tillbaka till 1148 00:51:09,810 --> 00:51:12,800 tillbaka, visar det sig att använda den enklaste av saker som en for-slinga eller 1149 00:51:12,800 --> 00:51:14,510 en while-slinga, kan vi iterera - 1150 00:51:14,510 --> 00:51:17,130 från vänster till höger över tecknen i en sträng - 1151 00:51:17,130 --> 00:51:20,720 och börja massera dem i olika karaktärer helt och hållet. 1152 00:51:20,720 --> 00:51:25,550 En kan bli B. B kan bli C. Så som i slutändan kan vi ta en 1153 00:51:25,550 --> 00:51:28,830 Engelska mening som faktiskt är vettigt och konvertera alla dessa 1154 00:51:28,830 --> 00:51:32,440 bokstäver i taget genom att gå igenom vår dators minne kvar att 1155 00:51:32,440 --> 00:51:34,300 rätt att faktiskt kryptera. 1156 00:51:34,300 --> 00:51:36,590 >> Så låt oss ta vår fem-minuters paus här, och när vi kommer tillbaka, vi kommer 1157 00:51:36,590 --> 00:51:39,060 starta denna process förvränga information. 1158 00:51:41,640 --> 00:51:43,180 >> Okej. 1159 00:51:43,180 --> 00:51:48,440 Så innan vi dyker in i vissa krypto och dessa saker som kallas matriser, låt mig 1160 00:51:48,440 --> 00:51:51,610 paus för alla frågor eftersom jag känner att jag verkligen slags rörig några 1161 00:51:51,610 --> 00:51:52,230 dessa ämnen. 1162 00:51:52,230 --> 00:51:53,940 Så låt oss fixa nu om vi kan. 1163 00:51:53,940 --> 00:51:56,480 Så vi pratade bara om returvärden. 1164 00:51:56,480 --> 00:51:58,630 Vi pratade om argument. 1165 00:51:58,630 --> 00:52:02,330 Och vi pratade om detta begrepp, som vi ska återkomma till under de kommande veckorna 1166 00:52:02,330 --> 00:52:07,140 komma, av att se minnet som en massa av dessa staplade 1167 00:52:07,140 --> 00:52:08,540 brickor, så att säga. 1168 00:52:08,540 --> 00:52:13,460 Från botten på upp, så att varje fack som får sätta på stacken representerar 1169 00:52:13,460 --> 00:52:15,160 en funktion som för närvarande är som anropas. 1170 00:52:17,970 --> 00:52:20,300 Några frågor? 1171 00:52:20,300 --> 00:52:22,890 Så vad sägs om - låt mig försöka ställa en fråga. 1172 00:52:22,890 --> 00:52:25,520 Jag håller förstör det, men nu it's - you've alla sett pojkens ansikte. 1173 00:52:25,520 --> 00:52:27,020 Så vi ska återkomma till det. 1174 00:52:27,020 --> 00:52:29,700 >> Så låt mig ställa en fråga här. 1175 00:52:29,700 --> 00:52:34,810 Låt mig förenkla tillbaka till vad det var innan några av våra tidigare Q & A. 1176 00:52:34,810 --> 00:52:41,730 Och det faktum att ökningen har öppen parentes, int antal, stängd 1177 00:52:41,730 --> 00:52:42,260 parentes. 1178 00:52:42,260 --> 00:52:46,370 Vad representerar int nummer? 1179 00:52:46,370 --> 00:52:47,250 [OHÖRBAR] 1180 00:52:47,250 --> 00:52:47,870 David J. MALAN: Ett argument. 1181 00:52:47,870 --> 00:52:50,732 Okej, men vad är ett argument? 1182 00:52:50,732 --> 00:52:51,620 [OHÖRBAR] 1183 00:52:51,620 --> 00:52:52,500 David J. MALAN: Tyvärr, vad är det? 1184 00:52:52,500 --> 00:52:53,150 SPEAKER 3: Något du passerar i. 1185 00:52:53,150 --> 00:52:53,570 David J. MALAN: Okej. 1186 00:52:53,570 --> 00:52:54,780 Så något som du passerar i. 1187 00:52:54,780 --> 00:52:56,560 Och mer allmänt, det är bara ingången. 1188 00:52:56,560 --> 00:52:59,860 Om du skriver en funktion och att funktionens syfte i livet är att göra 1189 00:52:59,860 --> 00:53:03,290 något lite annorlunda varje gång du använder det, då det enda sättet för 1190 00:53:03,290 --> 00:53:07,710 att det skulle hända skulle verkligen verkar vara att förse den med bidrag så att 1191 00:53:07,710 --> 00:53:10,180 kan göra något annorlunda med den ingången varje gång. 1192 00:53:10,180 --> 00:53:13,590 >> Så du måste ange två saker när en funktion tar ingångar. 1193 00:53:13,590 --> 00:53:17,240 Du måste ange det namn som du vill ge till denna ingång, rent 1194 00:53:17,240 --> 00:53:20,790 din egen bekvämlighet så att du kan hänvisa till den i den funktion som du 1195 00:53:20,790 --> 00:53:23,610 själv skriver, som jag gjorde här i linje 32. 1196 00:53:23,610 --> 00:53:27,840 Men du måste också ange dess typ eftersom C är ett programmeringsspråk 1197 00:53:27,840 --> 00:53:28,840 som bara kräver 1198 00:53:28,840 --> 00:53:31,810 att om du vill ha en variabel måste du tala om för datorn vad 1199 00:53:31,810 --> 00:53:32,790 uppgifter typ det är, 1200 00:53:32,790 --> 00:53:35,540 till stor del så att den vet hur många bitar till 1201 00:53:35,540 --> 00:53:37,230 fördela för den variabeln. 1202 00:53:37,230 --> 00:53:38,600 Eftersom det kan vara sex - 1203 00:53:38,600 --> 00:53:39,990 Tyvärr, det inte sex. 1204 00:53:39,990 --> 00:53:41,050 Det kan vara 16. 1205 00:53:41,050 --> 00:53:41,630 Det kan vara 8. 1206 00:53:41,630 --> 00:53:44,410 Det kan vara 32, även 64. 1207 00:53:44,410 --> 00:53:45,820 Men datorn behöver veta. 1208 00:53:45,820 --> 00:53:49,110 Nu int på vänster sida representerar vad däremot? 1209 00:53:52,825 --> 00:53:53,780 [OHÖRBAR] 1210 00:53:53,780 --> 00:53:54,570 David J. MALAN: Vad är det? 1211 00:53:54,570 --> 00:53:55,390 [OHÖRBAR] 1212 00:53:55,390 --> 00:53:57,920 David J. MALAN: Typen av funktionen och, mer specifikt, 1213 00:53:57,920 --> 00:53:59,755 typ av produktionen. 1214 00:53:59,755 --> 00:54:00,220 Rätt. 1215 00:54:00,220 --> 00:54:04,220 Så medan sak i parentes representerar dess ingång, om någon, 1216 00:54:04,220 --> 00:54:06,640 sak till vänster representerar dess utgång. 1217 00:54:06,640 --> 00:54:10,560 Och i det här fallet returnerar steg tydligen en int. 1218 00:54:10,560 --> 00:54:14,590 Och så int är returtyp av denna funktion. 1219 00:54:14,590 --> 00:54:16,090 >> Vad innebär det att återvända? 1220 00:54:16,090 --> 00:54:19,810 Bokstavligen, använder du nyckelordet tillbaka. 1221 00:54:19,810 --> 00:54:24,640 Och sedan om vad du återvänder till höger om sökordet är en 1222 00:54:24,640 --> 00:54:28,340 heltal, så det är verkligen överensstämmer med vad vi har lovat. 1223 00:54:28,340 --> 00:54:31,110 Du kunde inte göra något liknande - 1224 00:54:31,110 --> 00:54:32,280 hej, värld - 1225 00:54:32,280 --> 00:54:33,500 eftersom det är en sträng. 1226 00:54:33,500 --> 00:54:35,440 Uppenbarligen är det inte ett heltal. 1227 00:54:35,440 --> 00:54:40,450 Så kort sagt, är bördan verkligen på oss, programmeraren, för att vara specifik som 1228 00:54:40,450 --> 00:54:44,730 vad vi tillbaka och sedan faktiskt gå tillbaka det. 1229 00:54:44,730 --> 00:54:49,030 Och sedan för att göra en smula tydligare sammanhanget - 1230 00:54:49,030 --> 00:54:50,080 där är han igen. 1231 00:54:50,080 --> 00:54:51,060 Sammanhanget - 1232 00:54:51,060 --> 00:54:52,830 överraskning kommer in bara ett ögonblick. 1233 00:54:52,830 --> 00:54:57,720 Sammanhanget här är nu att datorns minne är återigen en 1234 00:54:57,720 --> 00:54:59,070 gigabyte, två gigabyte, vad som helst. 1235 00:54:59,070 --> 00:54:59,630 Kanske är det mer. 1236 00:54:59,630 --> 00:55:00,540 Kanske är det mindre. 1237 00:55:00,540 --> 00:55:03,750 Men datorn ser det som att ha olika sektioner. 1238 00:55:03,750 --> 00:55:04,860 Något går ner där. 1239 00:55:04,860 --> 00:55:06,020 Något annat går upp där. 1240 00:55:06,020 --> 00:55:07,540 Olika saker går i mitten. 1241 00:55:07,540 --> 00:55:09,300 Och idag börjar vi bara berätta denna historia. 1242 00:55:09,300 --> 00:55:11,130 >> Men vi ska återkomma till detta med tiden. 1243 00:55:11,130 --> 00:55:15,000 För nu, är det enda minne vi verkligen bryr oss om texten segmentet 1244 00:55:15,000 --> 00:55:17,160 eftersom det bara representerar nollor och ettor 1245 00:55:17,160 --> 00:55:18,460 som klang har matas ut. 1246 00:55:18,460 --> 00:55:21,570 Så när du kör ett kommando på tangentbordet som a.out, eller om du dubbelklickar 1247 00:55:21,570 --> 00:55:25,350 klicka på en ikon i Mac OS eller Windows, är ditt program laddas från din hårddisk 1248 00:55:25,350 --> 00:55:26,930 köra in i RAM. 1249 00:55:26,930 --> 00:55:30,850 Och det är plopped på toppen av datorns RAM-minne, så att säga. 1250 00:55:30,850 --> 00:55:35,470 Nu under tiden, eftersom ditt program startar och viktigaste anropas i 1251 00:55:35,470 --> 00:55:39,240 program som du skrev eller programmet Microsoft eller Apple skrev någon av dess 1252 00:55:39,240 --> 00:55:42,930 lokala variabler hamnar nere på botten av din dators minne. 1253 00:55:42,930 --> 00:55:46,490 Men om huvudsakliga samtal en annan funktion som själv har variabler eller 1254 00:55:46,490 --> 00:55:48,340 argument hamnar de ovanför. 1255 00:55:48,340 --> 00:55:50,670 Och om den funktionen kallar någonting, hamnar de över det, 1256 00:55:50,670 --> 00:55:51,840 ovanför det, ovanför den. 1257 00:55:51,840 --> 00:55:56,100 Och endast en gång en funktion görs verkställande gör stapeln av brickor, så 1258 00:55:56,100 --> 00:55:58,320 att tala, börjar få lägre och lägre. 1259 00:55:58,320 --> 00:56:03,370 Och detta är vad då, i ett nötskal, förklarar varför när du ringer kub - 1260 00:56:03,370 --> 00:56:04,660 eller du kallar steg - 1261 00:56:04,660 --> 00:56:06,490 du passerar i en kopia av värdet. 1262 00:56:06,490 --> 00:56:09,840 Och vad det betyder bildmässigt är att du bokstavligen skriver den 1263 00:56:09,840 --> 00:56:14,540 nummer 1 i en annan del av minnet, förändras att 1 till 2, i fallet med 1264 00:56:14,540 --> 00:56:15,360 steg - 1265 00:56:15,360 --> 00:56:17,450 eller till en 8, i fallet av kub - 1266 00:56:17,450 --> 00:56:21,450 och sedan kasta att minnet bort så snart ökning eller kuben 1267 00:56:21,450 --> 00:56:23,410 returnerar funktionen. 1268 00:56:23,410 --> 00:56:24,267 >> Fråga. 1269 00:56:24,267 --> 00:56:25,517 [OHÖRBAR] 1270 00:56:28,090 --> 00:56:29,970 David J. MALAN: Var - globala variabler lagras i vad 1271 00:56:29,970 --> 00:56:32,960 närvarande kallas de initialiserade data eller oinitierade data. 1272 00:56:32,960 --> 00:56:35,900 Skillnaden är, om du har en global variabel, och du tilldelar den 1273 00:56:35,900 --> 00:56:39,530 omedelbart ett värde med likhetstecknet, slutar det upp på toppen där. 1274 00:56:39,530 --> 00:56:43,390 Och om du bara säga int x semikolon utan värde, slutar det upp något 1275 00:56:43,390 --> 00:56:46,670 lägre i RAM helt enkelt genom konventionen. 1276 00:56:46,670 --> 00:56:49,308 Övriga frågor. 1277 00:56:49,308 --> 00:56:49,750 Okej. 1278 00:56:49,750 --> 00:56:53,040 >> Så den här bilden kommer tillbaka när vi får mer kraftfull med vad vi kan göra 1279 00:56:53,040 --> 00:56:53,830 med datorn. 1280 00:56:53,830 --> 00:56:58,790 Men för nu, låt oss ha en kort introduktion till kryptografi, en särskild typ av 1281 00:56:58,790 --> 00:57:01,910 kryptografi som inte lösa alla världens problem, men löser 1282 00:57:01,910 --> 00:57:02,480 några av dem. 1283 00:57:02,480 --> 00:57:06,090 I detta fallet här har vi något som kallas hemlig nyckel kryptografi. 1284 00:57:06,090 --> 00:57:10,430 Och hemlig nyckel kryptografi, som namnet antyder, får sin säkerhet 1285 00:57:10,430 --> 00:57:11,330 från en hemlighet. 1286 00:57:11,330 --> 00:57:14,720 Så till exempel om du är tillbaka i skolan och du passerar en 1287 00:57:14,720 --> 00:57:18,040 liten hemlighet kärleksbrev till pojke eller flicka som du krossar på - om du 1288 00:57:18,040 --> 00:57:20,820 ville passera det genom publiken, du förmodligen inte skulle skriva 1289 00:57:20,820 --> 00:57:24,120 sådan anteckning i engelska eller vad ditt modersmål är, utan du 1290 00:57:24,120 --> 00:57:25,800 kan kryptera den. 1291 00:57:25,800 --> 00:57:27,820 Eller du kanske bara skicka ett textmeddelande i dessa dagar. 1292 00:57:27,820 --> 00:57:30,310 Men du kan faktiskt passera dem en anteckning hela klassrummet. 1293 00:57:30,310 --> 00:57:33,820 Och att göra detta på ett säkert, på ett sådant sätt att dina vänner och lärare 1294 00:57:33,820 --> 00:57:36,820 vet inte vad du skriver, kan du komma med en ganska enkel 1295 00:57:36,820 --> 00:57:37,800 algoritm - 1296 00:57:37,800 --> 00:57:39,290 ung men du kanske - 1297 00:57:39,290 --> 00:57:40,780 bara förvränga orden. 1298 00:57:40,780 --> 00:57:44,390 Så istället för att skriva A kan du skriva B. Istället för B, kan du skriva 1299 00:57:44,390 --> 00:57:46,670 C. Istället för C, kan du skriva D och så vidare. 1300 00:57:46,670 --> 00:57:50,020 Eller så kan du komma med en mer sofistikerad översättning av brev 1301 00:57:50,020 --> 00:57:51,300 till olika bokstäver. 1302 00:57:51,300 --> 00:57:55,440 Men fångsten är pojke eller flicka som du ska skicka detta meddelande måste 1303 00:57:55,440 --> 00:57:56,850 vet något. 1304 00:57:56,850 --> 00:57:59,620 Vilket är vad, uppenbarligen? 1305 00:57:59,620 --> 00:58:01,400 Precis, vad din hemlighet är. 1306 00:58:01,400 --> 00:58:04,620 Liksom, vad är det mappning mellan As och Bs och Cs och Ds? 1307 00:58:04,620 --> 00:58:08,780 Är det att lägga bara en, så att säga, till var och en av bokstäverna för att gå från 1308 00:58:08,780 --> 00:58:09,730 A till B, B till C? 1309 00:58:09,730 --> 00:58:11,350 Är det mer komplext än så? 1310 00:58:11,350 --> 00:58:16,450 Så du och din kärlek måste ha denna hemlig information. 1311 00:58:16,450 --> 00:58:18,170 Men det är lite av en fångst-22 här. 1312 00:58:18,170 --> 00:58:20,760 Om detta är första gången du skickar detta kärleksbrev genom 1313 00:58:20,760 --> 00:58:25,590 klass, hur det pojke eller flicka kommer att veta vad hemligheten med är? 1314 00:58:25,590 --> 00:58:28,450 Så hemlig nyckel krypto löser inte alla världens problem. 1315 00:58:28,450 --> 00:58:30,490 Och det finns faktiskt en relation som vi ska återkomma till mot 1316 00:58:30,490 --> 00:58:31,370 termin slut. 1317 00:58:31,370 --> 00:58:35,970 >> Likaså har ingen av oss förmodligen någonsin skickat ett - 1318 00:58:35,970 --> 00:58:39,453 Inte heller vet de flesta av oss inte någon som fungerar till exempel på 1319 00:58:39,453 --> 00:58:40,300 Amazon.com. 1320 00:58:40,300 --> 00:58:43,130 Och ändå har många av oss köpte nog grejer på Amazon.com. 1321 00:58:43,130 --> 00:58:45,670 Och vi har fått lära oss att anta att dessa e-handel 1322 00:58:45,670 --> 00:58:47,060 transaktioner är säkra. 1323 00:58:47,060 --> 00:58:47,210 Eller hur? 1324 00:58:47,210 --> 00:58:49,310 Webbadressen säger förmodligen https. 1325 00:58:49,310 --> 00:58:51,590 Det är kanske en dum liten hänglås någonstans. 1326 00:58:51,590 --> 00:58:54,680 Det finns någon form av kryptering säkra din kreditkortsinformation 1327 00:58:54,680 --> 00:58:56,980 mellan dig och Amazon.com. 1328 00:58:56,980 --> 00:59:00,410 Och ändå, om kryptografi innebär att veta någon hemlighet, och ändå gör jag inte 1329 00:59:00,410 --> 00:59:03,330 Vet någon på Amazon, och jag har verkligen inte arrangerat någon form av 1330 00:59:03,330 --> 00:59:07,350 Hemligheten med någon på Amazon, hur min dator eller min webbläsare gör detta? 1331 00:59:07,350 --> 00:59:10,100 Tja, visar sig att det finns andra typer av kryptografi sammanlagt att lösa 1332 00:59:10,100 --> 00:59:10,740 det problemet. 1333 00:59:10,740 --> 00:59:13,610 Men för idag, vi fokuserar på enkel, där du kan ordna i 1334 00:59:13,610 --> 00:59:18,480 avancera till känna någon hemlig, liksom plus 1 eller någon mappning mellan As och B.. 1335 00:59:18,480 --> 00:59:20,710 >> Och processen för kryptografi involverar generellt detta. 1336 00:59:20,710 --> 00:59:23,550 Du har några oformaterad text, visas här till vänster. 1337 00:59:23,550 --> 00:59:26,260 Du kör det genom någon form av algoritm eller förfarandet 1338 00:59:26,260 --> 00:59:27,670 för kryptering det. 1339 00:59:27,670 --> 00:59:31,390 Kanske det är bara en blir B blir B C Och sedan du sluta med 1340 00:59:31,390 --> 00:59:32,260 chiffertext. 1341 00:59:32,260 --> 00:59:36,450 Samtidigt när din kärlek får den hemliga anmärkning, har han eller hon då 1342 00:59:36,450 --> 00:59:39,950 dekryptera det med allmänt motverka dessa algoritm för att få 1343 00:59:39,950 --> 00:59:41,640 stödja klartext. 1344 00:59:41,640 --> 00:59:43,860 Nu finns fysiska inkarnationer av detta. 1345 00:59:43,860 --> 00:59:46,720 Till exempel är det en liten hemlighet dekoder ringen. 1346 00:59:46,720 --> 00:59:50,060 Och detta är en ring i den meningen att det finns två rattar här. 1347 00:59:50,060 --> 00:59:53,630 På utsidan periferi denna sak, det finns bokstäverna A till Z, 1348 00:59:53,630 --> 00:59:55,110 även om de är i slumpmässig ordning. 1349 00:59:55,110 --> 00:59:58,410 Och på insidan, det finns faktiskt några siffror, så att vi med detta 1350 00:59:58,410 --> 01:00:02,940 ring, kan du typ av vrid utsidan men inte på insidan för att rada upp 1351 01:00:02,940 --> 01:00:04,110 siffror med bokstäver. 1352 01:00:04,110 --> 01:00:08,290 Och i klippet du ska se - av vilka du kan ha sett 24/7 1353 01:00:08,290 --> 01:00:11,120 runt julen från en film som heter A Christmas Story. 1354 01:00:11,120 --> 01:00:16,050 Du ser den lilla Ralphie var så ivriga att räkna ut vad lilla föräldralös 1355 01:00:16,050 --> 01:00:19,810 Annies hemliga budskap var för honom som hade lämnats ut, tror jag, i 1356 01:00:19,810 --> 01:00:22,810 form av numeriska meddelanden på en seriell låda. 1357 01:00:22,810 --> 01:00:26,760 Och du var tvungen att samla alla de små korten som kom 1358 01:00:26,760 --> 01:00:27,480 i flingpaket. 1359 01:00:27,480 --> 01:00:28,320 Du var tvungen att skicka dem i. 1360 01:00:28,320 --> 01:00:31,060 Du var tvungen att få tillbaka den hemliga dekoder ringen, så att du äntligen kan räkna 1361 01:00:31,060 --> 01:00:34,190 vad mappningen mellan bokstäver och siffror, 1362 01:00:34,190 --> 01:00:35,420 eller bokstäver och bokstäver. 1363 01:00:35,420 --> 01:00:39,790 Så jag ger er denna korta klipp från A Christmas Story att motivera pset 2 och 1364 01:00:39,790 --> 01:00:42,340 vår diskussion, i ett ögonblick av matriser. 1365 01:00:42,340 --> 01:00:43,773 Så här har vi Ralphie. 1366 01:00:43,773 --> 01:00:44,126 >> [VIDEOAVSPELNING] 1367 01:00:44,126 --> 01:00:47,470 -Var det känt för alla och envar att Ralph Parker härmed utses en 1368 01:00:47,470 --> 01:00:50,690 medlem av Little Orphan Annie Secret Circle och har rätt till alla 1369 01:00:50,690 --> 01:00:53,500 äran och fördelar inträffar detta. 1370 01:00:53,500 --> 01:00:56,040 -Undertecknad, Little Orphan Annie. 1371 01:00:56,040 --> 01:00:58,730 Kontrasignerade, Pierre Andre! 1372 01:00:58,730 --> 01:01:00,150 Med bläck! 1373 01:01:00,150 --> 01:01:02,910 Heder och förmåner som redan vid nio års ålder. 1374 01:01:09,970 --> 01:01:10,730 Kom, låt oss gå vidare med det. 1375 01:01:10,730 --> 01:01:15,000 Jag behöver inte allt som jazz om smugglare och pirater. 1376 01:01:15,000 --> 01:01:17,624 -Lyssna morgon kväll för den avslutande äventyr The Black 1377 01:01:17,624 --> 01:01:19,710 Pirate Ship. 1378 01:01:19,710 --> 01:01:23,380 Nu är det dags för Annies hemliga meddelande till dig medlemmar 1379 01:01:23,380 --> 01:01:25,670 av Secret Circle. 1380 01:01:25,670 --> 01:01:30,260 Kom ihåg, barn, kan bara medlemmar i Annies hemliga Circle avkoda 1381 01:01:30,260 --> 01:01:31,660 Annies hemliga budskap. 1382 01:01:31,660 --> 01:01:36,230 Kom ihåg att Annie beroende av dig. 1383 01:01:36,230 --> 01:01:38,720 Ställ dina stift till B2. 1384 01:01:38,720 --> 01:01:41,040 Här är budskapet. 1385 01:01:41,040 --> 01:01:42,470 12, 11 - 1386 01:01:42,470 --> 01:01:46,000 -Jag är i mitt första hemliga mötet. 1387 01:01:46,000 --> 01:01:49,440 -14, 11, 18, 16 - 1388 01:01:49,440 --> 01:01:51,700 Pierre var i stor röst ikväll. 1389 01:01:51,700 --> 01:01:54,890 Jag skulle kunna berätta att kvällens budskap var verkligen viktigt. 1390 01:01:54,890 --> 01:01:56,750 -3, 25. 1391 01:01:56,750 --> 01:01:58,590 Det är ett budskap från Annie själv. 1392 01:01:58,590 --> 01:01:59,840 Kom ihåg att inte berätta för någon. 1393 01:02:04,570 --> 01:02:08,750 -90 Sekunder senare, jag är i den enda rummet i huset där en pojke på nio 1394 01:02:08,750 --> 01:02:12,980 kunde sitta i avskildhet och avkoda. 1395 01:02:12,980 --> 01:02:17,130 Aha, gick B. Jag till nästa. 1396 01:02:17,130 --> 01:02:20,330 E. Det första ordet är vara. 1397 01:02:20,330 --> 01:02:22,670 S. Det kom lättare nu. 1398 01:02:22,670 --> 01:02:24,590 U. 1399 01:02:24,590 --> 01:02:26,510 -Kom igen, Ralphie. 1400 01:02:26,510 --> 01:02:28,430 Jag måste gå. 1401 01:02:28,430 --> 01:02:30,350 -Jag kommer ner, MA. 1402 01:02:30,350 --> 01:02:33,720 -Gee vina. 1403 01:02:33,720 --> 01:02:38,270 -T, O. Var noga med att. 1404 01:02:38,270 --> 01:02:40,000 Var noga med att vad? 1405 01:02:40,000 --> 01:02:42,105 Vad var Little Orphan Annie försöker säga? 1406 01:02:42,105 --> 01:02:43,095 Var noga med att vad? 1407 01:02:43,095 --> 01:02:43,590 -Ralphie! 1408 01:02:43,590 --> 01:02:44,580 Randy har fått gå. 1409 01:02:44,580 --> 01:02:45,570 Kan du komma ut? 1410 01:02:45,570 --> 01:02:46,560 -Okej, mamma. 1411 01:02:46,560 --> 01:02:48,540 Jag kommer strax ut. 1412 01:02:48,540 --> 01:02:50,580 -Jag närmar nu. 1413 01:02:50,580 --> 01:02:52,550 Spänningen var hemskt. 1414 01:02:52,550 --> 01:02:53,355 Vad var det? 1415 01:02:53,355 --> 01:02:56,315 Öde planeten kan hänga i balans. 1416 01:02:56,315 --> 01:02:56,790 -Ralphie! 1417 01:02:56,790 --> 01:02:59,165 Randy har fått gå. 1418 01:02:59,165 --> 01:03:02,310 -Jag är rätt ute, för crying out loud. 1419 01:03:02,310 --> 01:03:04,000 -Gee, nästan där. 1420 01:03:04,000 --> 01:03:05,180 Mina fingrar flög. 1421 01:03:05,180 --> 01:03:07,150 Mitt sinne var en stål fälla. 1422 01:03:07,150 --> 01:03:08,790 Varje por vibrerade. 1423 01:03:08,790 --> 01:03:10,040 Det var nästan klart. 1424 01:03:10,040 --> 01:03:13,400 Ja, ja, ja, ja. 1425 01:03:13,400 --> 01:03:18,960 -Var noga med att dricka ditt Ovaltine. 1426 01:03:18,960 --> 01:03:20,210 Ovaltine? 1427 01:03:24,010 --> 01:03:25,260 En crummy kommersiell? 1428 01:03:28,200 --> 01:03:29,640 Jävel. 1429 01:03:29,640 --> 01:03:33,340 [END VIDEOAVSPELNING] 1430 01:03:33,340 --> 01:03:36,040 >> David J. MALAN: Så där har vi kryptografi. 1431 01:03:36,040 --> 01:03:39,670 Så hur i en dator kan vi gå att genomföra eller 1432 01:03:39,670 --> 01:03:40,950 representerar saker som detta? 1433 01:03:40,950 --> 01:03:44,430 Tja, vi behöver ett sätt att uttrycka oss själva lite mer flexibelt än 1434 01:03:44,430 --> 01:03:46,420 våra variabler hittills ha tillåtit. 1435 01:03:46,420 --> 01:03:47,370 Vi har haft Ints. 1436 01:03:47,370 --> 01:03:48,380 Vi har haft tecken. 1437 01:03:48,380 --> 01:03:50,790 Vi har haft flöten och dubblar och några andra. 1438 01:03:50,790 --> 01:03:55,050 Men de är enskilda delar av minnet som egentligen inte möjligt för oss att 1439 01:03:55,050 --> 01:03:58,010 uttrycka saker som ord och meningar och fraser. 1440 01:03:58,010 --> 01:04:00,200 I själva verket har vi kallade dessa saker strängar. 1441 01:04:00,200 --> 01:04:03,650 Men vi lovade att det är egentligen bara en förenkling av CS50 1442 01:04:03,650 --> 01:04:07,020 bibliotek som vi avser att dra tillbaka. 1443 01:04:07,020 --> 01:04:08,970 >> Och så låt oss börja att göra det här. 1444 01:04:08,970 --> 01:04:11,130 Låt mig gå vidare och öppna upp en fil - 1445 01:04:11,130 --> 01:04:13,770 alla dessa filer finns som vanligt på nätet - 1446 01:04:13,770 --> 01:04:19,120 kallas array.c att lösa ett problem utan samband med strängar men det ger en 1447 01:04:19,120 --> 01:04:23,040 bild här av hur vi kan använda något som kallas en matris. 1448 01:04:23,040 --> 01:04:25,530 En array är en datatyp. 1449 01:04:25,530 --> 01:04:31,320 Det är en typ av variabel, av slag, har det flera mindre datatyper 1450 01:04:31,320 --> 01:04:34,150 insidan av det rygg mot rygg mot rygg mot rygg. 1451 01:04:34,150 --> 01:04:37,700 Så till exempel, om vi vill skriva ett litet program som ger dig din 1452 01:04:37,700 --> 01:04:42,110 frågesport genomsnitt för en kurs som 50 som har två frågesporter, du kan mycket enkelt 1453 01:04:42,110 --> 01:04:45,170 skriva det här programmet - baserad även på några av förra veckans material - 1454 01:04:45,170 --> 01:04:47,770 genom getInt och ett par variabler. 1455 01:04:47,770 --> 01:04:51,920 Int quiz1, int quiz2, och det är ganska enkelt. 1456 01:04:51,920 --> 01:04:55,930 Det är kanske 10, 20 rader kod, max, för att genomföra ett program som uppmanar 1457 01:04:55,930 --> 01:05:01,170 användare för två frågesport poäng och sedan beräknar deras genomsnittliga genom att lägga till dem 1458 01:05:01,170 --> 01:05:03,850 tillsammans, dela med två, och sedan skriva ut resultatet. 1459 01:05:03,850 --> 01:05:06,380 Vi kan nog göra det ganska lätt nu efter 1460 01:05:06,380 --> 01:05:07,510 ett antal minuter. 1461 01:05:07,510 --> 01:05:11,005 >> Men problemet är att anta att 50 hade tre frågesporter eller fyra. 1462 01:05:11,005 --> 01:05:13,510 Anta att du vill använda samma program för en klass som hade 1463 01:05:13,510 --> 01:05:14,850 veckovis frågesporter. 1464 01:05:14,850 --> 01:05:16,610 Tänk på en klass som varje vecka har frågesporter. 1465 01:05:16,610 --> 01:05:20,610 Om det är som 16 eller så veckor i termin, nu har du 16 variabler - 1466 01:05:20,610 --> 01:05:24,270 int quiz1, int quiz2, int quiz3, int quiz4. 1467 01:05:24,270 --> 01:05:27,560 Så snart du börjar se denna redundans, detta kopierar och klistrar in 1468 01:05:27,560 --> 01:05:31,390 av kod, bör den börja att göra dig önskar att det fanns ett bättre sätt. 1469 01:05:31,390 --> 01:05:33,930 Och tack och lov, på grund av matriser finns. 1470 01:05:33,930 --> 01:05:34,980 Så låt oss göra det här. 1471 01:05:34,980 --> 01:05:38,430 Först, låt mig presentera en mycket enkel sak att vi inte har använt hittills, 1472 01:05:38,430 --> 01:05:40,140 men du kommer att se det ibland i koden. 1473 01:05:40,140 --> 01:05:42,360 Detta är vad som allmänt kallas en konstant. 1474 01:05:42,360 --> 01:05:45,790 Så det är en konstant i den meningen att detta värde inte ändras. 1475 01:05:45,790 --> 01:05:49,210 Den mänskliga konvention när du skapar en konstant är att använda allt kapital 1476 01:05:49,210 --> 01:05:51,940 bokstäver, bara så att det verkligen sticker ut i din kod. 1477 01:05:51,940 --> 01:05:55,960 Och den speciella nyckelord som du använder i C definierar #. 1478 01:05:55,960 --> 01:06:00,250 Så om du säger # define då ett utrymme, så det ord du vill använda för 1479 01:06:00,250 --> 01:06:03,260 konstanten namn, och sedan värdet på konstanten. 1480 01:06:03,260 --> 01:06:06,180 Så varsel, skiljer sig detta från att tilldela något till en variabel. 1481 01:06:06,180 --> 01:06:07,020 Det finns inga likhetstecken. 1482 01:06:07,020 --> 01:06:08,240 Det finns ingen semikolon. 1483 01:06:08,240 --> 01:06:11,410 Detta är vad som allmänt är känt som en förprocessor direktiv, men mer på 1484 01:06:11,410 --> 01:06:12,210 att en annan gång. 1485 01:06:12,210 --> 01:06:18,540 >> För nu, skapar detta en oföränderlig värde kallas frågesporter vars faktiska 1486 01:06:18,540 --> 01:06:19,940 numeriska värdet är 2. 1487 01:06:19,940 --> 01:06:24,020 Så var du ser frågesport, frågesport, frågesporter hela filen, det är 1488 01:06:24,020 --> 01:06:25,410 bara antalet 2. 1489 01:06:25,410 --> 01:06:28,100 Nu, om jag tittar på huvud nu, låt oss se hur det fungerar. 1490 01:06:28,100 --> 01:06:29,500 Till en början ser det lite kryptiskt. 1491 01:06:29,500 --> 01:06:31,340 Men det är alla grejer från vecka ett. 1492 01:06:31,340 --> 01:06:32,710 Be användaren för betyg. 1493 01:06:32,710 --> 01:06:33,630 Hur gör vi det? 1494 01:06:33,630 --> 01:06:35,470 Tja, i linje 22 - 1495 01:06:35,470 --> 01:06:37,210 detta är verkligen saftig delen - 1496 01:06:37,210 --> 01:06:40,960 Jag förklarar en flottör, men inte bara en enda flottör. 1497 01:06:40,960 --> 01:06:44,620 Jag förklarar snarare en rad flyttal. 1498 01:06:44,620 --> 01:06:49,100 Den variabeln kommer att kallas kvaliteter, vilket antyds här. 1499 01:06:49,100 --> 01:06:53,080 Men den enda del av nya syntaxen är då dessa hakparenteser, det faktum 1500 01:06:53,080 --> 01:06:59,350 att jag har sagt float betyg och öppna sedan konsolen och sedan ett nummer. 1501 01:06:59,350 --> 01:07:02,460 Observera, om detta är en konstant, det är precis som vi gjorde här. 1502 01:07:02,460 --> 01:07:06,890 Detta innebär Hey dator, ge mig två flottar, och låt oss tillsammans kalla 1503 01:07:06,890 --> 01:07:08,220 dem betyg. 1504 01:07:08,220 --> 01:07:11,920 Detta är i motsats till en mycket mer mödosam process som denna. 1505 01:07:11,920 --> 01:07:15,850 Float Grade1, flyta grade2, och så vidare. 1506 01:07:15,850 --> 01:07:20,010 Så en array kan vi genomföra denna idé, men mycket mindre messily i 1507 01:07:20,010 --> 01:07:24,630 ett sådant sätt att vi kan skriva en kodrad i stället för, säg, 16 för en 16 1508 01:07:24,630 --> 01:07:25,740 vecka termin. 1509 01:07:25,740 --> 01:07:29,950 Så jag ville inte hård-kod 2 för om man tänker på detta nu 1510 01:07:29,950 --> 01:07:34,160 logiskt - antar nästa år CS50 ändringar 3 frågesporter istället. 1511 01:07:34,160 --> 01:07:35,510 Och jag hade nummer 2 här. 1512 01:07:35,510 --> 01:07:36,600 Jag hade nummer 2 här. 1513 01:07:36,600 --> 01:07:37,580 Jag hade nummer 2 här. 1514 01:07:37,580 --> 01:07:38,560 Jag hade nummer 2 här. 1515 01:07:38,560 --> 01:07:43,180 Det blir mycket tröttande och mycket lätt att skruva upp och av misstag ändra 1516 01:07:43,180 --> 01:07:47,690 ett värde till 3 och missa något annat värde av 2. 1517 01:07:47,690 --> 01:07:52,460 Så jag ska istället abstrakta detta bort och använda denna konstant som, som sitt 1518 01:07:52,460 --> 01:07:54,120 namnet antyder, förändras aldrig. 1519 01:07:54,120 --> 01:07:57,710 Och nu, frågesporter ingen roll om vi har olika i år eller nästa, jag 1520 01:07:57,710 --> 01:08:01,210 bara att ändra det på ett ställe, här uppe på toppen. 1521 01:08:01,210 --> 01:08:02,720 >> Så det är allt konstant är. 1522 01:08:02,720 --> 01:08:08,680 Samtidigt är den nya konceptuella funktion som av en matris. 1523 01:08:08,680 --> 01:08:14,660 Så hakparenteser ge mig så många flottar och låter mig kollektivt 1524 01:08:14,660 --> 01:08:16,630 kalla dem kvaliteter här. 1525 01:08:16,630 --> 01:08:17,990 Så nu ska vi se vad jag ska göra. 1526 01:08:17,990 --> 01:08:20,359 Här i linje 24 är början av en for-slinga. 1527 01:08:20,359 --> 01:08:22,260 Detta är verkligen ingenting fancy. 1528 01:08:22,260 --> 01:08:25,060 Det är bara att använda frågesporter stället för en hårdkodad nummer. 1529 01:08:25,060 --> 01:08:27,790 Men det finns inget intellektuellt annorlunda där från förra veckan. 1530 01:08:27,790 --> 01:08:29,040 Detta är bara printf. 1531 01:08:29,040 --> 01:08:35,490 Så printf ("frågesport nummer% d av% ​​d") eftersom jag vill bara skriva ut mig frågesport 1532 01:08:35,490 --> 01:08:38,050 nummer ett av två och sedan två av två. 1533 01:08:38,050 --> 01:08:39,850 Så detta är en ren estetisk sak. 1534 01:08:39,850 --> 01:08:42,500 Men det intressanta är nu i linje 27. 1535 01:08:42,500 --> 01:08:48,310 För att fylla i en av de två platshållare med en flyttal 1536 01:08:48,310 --> 01:08:51,029 värdet använder du igen hakparenteser. 1537 01:08:51,029 --> 01:08:55,620 I det här fallet, jag använder jag eftersom det för slinga har börjat med i motsvarande 1538 01:08:55,620 --> 01:08:57,560 vilket värde, tydligen? 1539 01:08:57,560 --> 01:08:58,279 0. 1540 01:08:58,279 --> 01:09:01,350 >> Så på den första iteration av denna slinga är det som om jag 1541 01:09:01,350 --> 01:09:02,689 skrev i kod. 1542 01:09:02,689 --> 01:09:05,580 Men på den andra iteration av denna slinga är det som om jag 1543 01:09:05,580 --> 01:09:07,750 skrev detta i min kod. 1544 01:09:07,750 --> 01:09:10,750 Men det faktum att jag använder en variabel är perfekt eftersom, som namnet 1545 01:09:10,750 --> 01:09:14,300 antyder, det variera dess värde på varje iteration. 1546 01:09:14,300 --> 01:09:17,370 Så jag fyller denna array en plats åt gången. 1547 01:09:17,370 --> 01:09:18,910 Hur ser denna array ut? 1548 01:09:18,910 --> 01:09:21,430 Jo, anledningen till att jag drog denna super enkel rektangel på skärmen här 1549 01:09:21,430 --> 01:09:23,350 tidigare var av denna anledning. 1550 01:09:23,350 --> 01:09:27,279 En array är bara en bit av minnet, följt av en annan bit av minne, 1551 01:09:27,279 --> 01:09:30,109 följt av en annan bit av minne, och så vidare. 1552 01:09:30,109 --> 01:09:35,260 Så om min array är av storlek 2, i detta fall här, allt jag skulle göra med 1553 01:09:35,260 --> 01:09:37,590 skriva i min frågesport poäng, som här. 1554 01:09:37,590 --> 01:09:39,430 Jag fick 100 på detta. 1555 01:09:39,430 --> 01:09:42,020 Och sedan fick jag en 99 på detta. 1556 01:09:42,020 --> 01:09:46,040 Då detta minne kanske inte ens användas eftersom jag har bara bett 1557 01:09:46,040 --> 01:09:48,689 dator för en rad storlek 2. 1558 01:09:48,689 --> 01:09:50,180 Dessa rutor är fortfarande där. 1559 01:09:50,180 --> 01:09:50,340 Eller hur? 1560 01:09:50,340 --> 01:09:52,500 Du har fortfarande två gigabyte RAM-minne, även om du bara 1561 01:09:52,500 --> 01:09:53,979 ber för två flottörer. 1562 01:09:53,979 --> 01:09:58,710 Så tanken bakom arrayer är att datorn bara tar en bit av minne 1563 01:09:58,710 --> 01:10:03,230 och sedan fördelas proportionellt mindre bitar rygg mot rygg mot rygg mot rygg. 1564 01:10:03,230 --> 01:10:04,740 Och så är allt en array är. 1565 01:10:04,740 --> 01:10:09,080 Det är en sammanhängande bit av minnet, inuti som du kan lägga saker. 1566 01:10:09,080 --> 01:10:12,400 >> Nu händer sedan göra några tråkiga aritmetik. 1567 01:10:12,400 --> 01:10:16,170 Om jag bläddra ner hit, det är här jag sedan iterera över arrayen. 1568 01:10:16,170 --> 01:10:19,410 Jag kommer upp med summan av alla värden i arrayen. 1569 01:10:19,410 --> 01:10:22,390 Och då använder jag den runda funktion här att faktiskt göra 1570 01:10:22,390 --> 01:10:23,940 Sammanfattningsvis dividerat med frågesporter. 1571 01:10:23,940 --> 01:10:27,450 Men låt mig våg min hand på det som en slags tillräckligt aritmetik för nu. 1572 01:10:27,450 --> 01:10:30,010 Men allt som gör för mig ytterst beräknar ett genomsnitt. 1573 01:10:30,010 --> 01:10:33,640 Så först frågesport plus 2. Frågesport, dividerat med 2, och sedan skriva ut 1574 01:10:33,640 --> 01:10:34,700 ut som en int. 1575 01:10:34,700 --> 01:10:39,030 >> Men låt övergång nu till en annan exempel heter sträng1, 1576 01:10:39,030 --> 01:10:42,370 vilket ger en liknande bild, men med strängar. 1577 01:10:42,370 --> 01:10:45,550 Låt mig gå vidare och förenkla detta för ett ögonblick. 1578 01:10:45,550 --> 01:10:48,340 Och förlåt indraget för nu. 1579 01:10:48,340 --> 01:10:52,280 Meddelande i linje 19 i detta exempel, får jag en sträng från användaren. 1580 01:10:52,280 --> 01:10:55,780 Men märka vad jag nästa ska göra i rader 22 och framåt. 1581 01:10:55,780 --> 01:11:00,260 Jag är faktiskt iteration från i upp till - och detta är ett nytt trick - 1582 01:11:00,260 --> 01:11:02,730 strlen, stränglängd. 1583 01:11:02,730 --> 01:11:07,010 Detta är en funktion som kommer med C att om du ge det en sträng, berättar den 1584 01:11:07,010 --> 01:11:08,950 hur många tecken i strängen. 1585 01:11:08,950 --> 01:11:09,440 Det är allt. 1586 01:11:09,440 --> 01:11:12,520 Det faktum att det är strlen istället för sträng längd är bara för att det är 1587 01:11:12,520 --> 01:11:13,040 mer kortfattad. 1588 01:11:13,040 --> 01:11:17,100 30 år sedan, tyckte folk att skriva saker så kortfattat som möjligt. 1589 01:11:17,100 --> 01:11:19,080 Så vi har hållit denna konvention här. 1590 01:11:19,080 --> 01:11:21,730 i + + betyder bara öka i i varje iteration. 1591 01:11:21,730 --> 01:11:24,310 Och nu märker detta, vilket är riktigt intressant. 1592 01:11:24,310 --> 01:11:28,730 Så i linje 24, säger jag dator, ge mig ett tecken, åtta 1593 01:11:28,730 --> 01:11:30,770 bitar, och kalla det C. 1594 01:11:30,770 --> 01:11:35,370 Men vad är detta på höger sida säger? 1595 01:11:35,370 --> 01:11:38,150 På engelska, vad står? 1596 01:11:38,150 --> 01:11:40,070 [OHÖRBAR] 1597 01:11:40,070 --> 01:11:40,490 David J. MALAN: Exakt. 1598 01:11:40,490 --> 01:11:42,390 Ge mig det första tecknet i arrayen. 1599 01:11:42,390 --> 01:11:45,400 Eller mer allmänt, ge mig det i: te tecknet i arrayen. 1600 01:11:45,400 --> 01:11:48,230 Och inse att det är nu viktigt att som datavetare, vi är faktiskt 1601 01:11:48,230 --> 01:11:49,330 räkna från 0. 1602 01:11:49,330 --> 01:11:51,290 Du behöver inte handlingsfrihet nu att börja göra det. 1603 01:11:51,290 --> 01:11:54,580 Nu måste du agera i enlighet med datorns förväntningar och 1604 01:11:54,580 --> 01:11:58,010 räkna från noll eftersom [0] kommer att bli den första 1605 01:11:58,010 --> 01:11:59,670 tecken i en sträng. 1606 01:11:59,670 --> 01:12:01,320 [1] kommer att bli den andra. 1607 01:12:01,320 --> 01:12:03,610 [2] kommer att vara den tredje, och så vidare. 1608 01:12:03,610 --> 01:12:08,840 Så det här programmet, om jag sammanställa det - det är, återigen, sträng1. 1609 01:12:08,840 --> 01:12:11,040 >> Så gör sträng1. 1610 01:12:11,040 --> 01:12:16,730 Och nu har jag kör sträng1 i min terminalfönster. 1611 01:12:16,730 --> 01:12:19,180 Det väntar för inmatning, så jag kommer att skriva på, säger David. 1612 01:12:19,180 --> 01:12:20,080 Enter. 1613 01:12:20,080 --> 01:12:23,350 Och nu skriver DAVID alla på olika linjer, eftersom 1614 01:12:23,350 --> 01:12:24,430 märke till vad jag gör. 1615 01:12:24,430 --> 01:12:27,510 Jag skriver ett tecken i taget. 1616 01:12:27,510 --> 01:12:29,100 Nu ska vi inte gå in i detalj i dag om detta. 1617 01:12:29,100 --> 01:12:31,610 Men jag raderade nyss denna kontroll här. 1618 01:12:31,610 --> 01:12:36,310 Det visar sig att om användaren missköter, kontradiktoriskt, eller bara 1619 01:12:36,310 --> 01:12:41,780 förvirrad, kan du inte faktiskt ge en sträng av viss längd. 1620 01:12:41,780 --> 01:12:43,640 Om du trycker på fel tangent på tangentbordet, kan du ge 1621 01:12:43,640 --> 01:12:44,390 ingen sträng alls. 1622 01:12:44,390 --> 01:12:47,790 Eller om du är skadlig, kan du prova att klistra in en gigabyte värde av en 1623 01:12:47,790 --> 01:12:49,380 uppsats för att fylla denna sträng. 1624 01:12:49,380 --> 01:12:52,060 Och om datorn får slut på minne, visar det sig att vi ska 1625 01:12:52,060 --> 01:12:54,310 att få tillbaka denna speciella värde som kallas noll. 1626 01:12:54,310 --> 01:12:57,550 Så för nu, bara veta att det är det här särskilt värde som kallas noll att 1627 01:12:57,550 --> 01:13:01,000 ger oss möjlighet att kontrollera när vi är ute på minne, bland annat. 1628 01:13:01,000 --> 01:13:07,330 >> Men om jag öppnar nu sträng2, märker en skillnad här. 1629 01:13:07,330 --> 01:13:09,760 Lägg märke till en skillnad här med sträng2. 1630 01:13:09,760 --> 01:13:13,260 Med sträng2 är detta för slinga lite annorlunda. 1631 01:13:13,260 --> 01:13:16,350 Låt mig ta bort nollorna så att vi kan tala om dem en annan gång. 1632 01:13:16,350 --> 01:13:18,460 Men vad är annorlunda for-slingan den här gången? 1633 01:13:21,580 --> 01:13:23,160 Och jag kan gå tillbaka till det tidigare exemplet. 1634 01:13:23,160 --> 01:13:24,800 Så det är version två. 1635 01:13:24,800 --> 01:13:27,020 Detta är version ett. 1636 01:13:27,020 --> 01:13:31,935 Ett, två, ett två. 1637 01:13:35,030 --> 01:13:38,240 Så strlen samtalet var? 1638 01:13:38,240 --> 01:13:40,420 Det är i första delen av for-slingan. 1639 01:13:40,420 --> 01:13:43,060 Några tankar om varför jag gör det här? 1640 01:13:43,060 --> 01:13:43,690 Ja. 1641 01:13:43,690 --> 01:13:46,010 [OHÖRBAR] 1642 01:13:46,010 --> 01:13:47,630 David J. MALAN: Så vi inte anropa funktionen varje gång. 1643 01:13:47,630 --> 01:13:48,040 Exakt. 1644 01:13:48,040 --> 01:13:50,350 Minns från loopar att de är super enkelt när du typ av 1645 01:13:50,350 --> 01:13:52,180 förstår att detta är initialiseringen, den 1646 01:13:52,180 --> 01:13:53,330 tillstånd, och uppdateringen. 1647 01:13:53,330 --> 01:13:55,430 Problemet är att villkoret händer på varje 1648 01:13:55,430 --> 01:13:56,600 iteration av slingan. 1649 01:13:56,600 --> 01:13:59,930 Och så i detta exempel här är vad dåligt över att 1650 01:13:59,930 --> 01:14:03,500 att detta är mitt tillstånd? 1651 01:14:03,500 --> 01:14:05,920 Du ringer strlen igen och igen och igen. 1652 01:14:05,920 --> 01:14:08,990 Men när jag har skrivit i David, är längden på den strängen fem. 1653 01:14:08,990 --> 01:14:11,560 Och det kommer inte att ändra på varje iteration av slingan eftersom 1654 01:14:11,560 --> 01:14:15,560 strängen är fortfarande D-A-V-I-D. Så detta är ett tips på vad som kommer att bli en 1655 01:14:15,560 --> 01:14:19,650 allt viktigare idé som kallas en konstruktion beslut där - bara inte 1656 01:14:19,650 --> 01:14:21,640 göra datorn gör onödigt arbete. 1657 01:14:21,640 --> 01:14:25,630 >> Nu precis som en förhandstitt på pset 2, pset 2 i standardversionen är 1658 01:14:25,630 --> 01:14:28,850 kommer att utmana dig att faktiskt genomföra ett visst antal chiffer, några 1659 01:14:28,850 --> 01:14:32,650 Antalet krypteringsalgoritmer, så att du både kan kryptera och dekryptera 1660 01:14:32,650 --> 01:14:35,530 hemliga meddelanden, ungefär som en Ralphie avkodas där. 1661 01:14:35,530 --> 01:14:38,720 I hacker upplagan av pset 2, kommer vi att gå lite längre. 1662 01:14:38,720 --> 01:14:42,010 Vi kommer att lämna dig en fil från en verklig datorsystem som innehåller en 1663 01:14:42,010 --> 01:14:45,690 massa användarnamn och faktiska krypterade lösenord, och utmaningen 1664 01:14:45,690 --> 01:14:49,110 för hacker upplagan kommer att vara att knäcka dessa lösenord och figur 1665 01:14:49,110 --> 01:14:53,060 vad kryptografi eller vad hemligheten användes för att faktiskt 1666 01:14:53,060 --> 01:14:55,080 generera dessa lösenord. 1667 01:14:55,080 --> 01:14:58,360 Och vi kommer att göra detta genom att använda en ny funktion här på C som jag ska ge 1668 01:14:58,360 --> 01:15:02,200 du bara en demo av, så kallad kommandoradsargument. 1669 01:15:02,200 --> 01:15:05,930 >> Så det visar sig, som en del av er kanske har sett i avsnitt eller i läroböcker, 1670 01:15:05,930 --> 01:15:09,850 viktigaste inte alltid vara ogiltig inom parentes. 1671 01:15:09,850 --> 01:15:14,060 Det visar sig att stora även kan skrivas så här, med två argument, 1672 01:15:14,060 --> 01:15:19,690 argc och argv, där argc är antalet ord som du skriver efter 1673 01:15:19,690 --> 01:15:21,940 programmets namn på kommandoraden. 1674 01:15:21,940 --> 01:15:24,550 Och argv är själva orden. 1675 01:15:24,550 --> 01:15:29,470 Och som hakparenteserna där antyder, är argv tydligen en matris. 1676 01:15:29,470 --> 01:15:33,720 Det kommer att vara en sträng efter en sträng efter en sträng i minnet. 1677 01:15:33,720 --> 01:15:36,170 Så vad vi ska kunna göra, med början pset 2, 1678 01:15:36,170 --> 01:15:37,310 något sådant. 1679 01:15:37,310 --> 01:15:42,450 Om jag gör argv1, vilket är ett exempel som vi ska återkomma till på måndag, och kör 1680 01:15:42,450 --> 01:15:45,180 den, märker att det inte verkar göra något ännu. 1681 01:15:45,180 --> 01:15:47,050 Den skriver bara ut sitt eget namn. 1682 01:15:47,050 --> 01:15:53,220 Men om jag säger adjö klass, meddelande att detta program uppenbarligen itererar 1683 01:15:53,220 --> 01:15:57,030 över vart och ett av orden som skrivs vid prompten. 1684 01:15:57,030 --> 01:16:02,050 Och de medel genom vilka vi får tillgång till ord som användaren har 1685 01:16:02,050 --> 01:16:06,780 skrivit vid prompten är genom att ändra huvud, från och med i helgen, från int 1686 01:16:06,780 --> 01:16:10,710 huvud (void) och int main (argc, argv). 1687 01:16:10,710 --> 01:16:13,700 Och på så sätt kommer att födas kommandoradsargument. 1688 01:16:13,700 --> 01:16:17,210 Och när du får riktigt sofistikerad på detta, kommer du att kunna skriva 1689 01:16:17,210 --> 01:16:21,370 verkligen trippy program, som denna här, som går utöver 1690 01:16:21,370 --> 01:16:25,520 vissa funktioner vi har gjort hittills, men alla ganska kraftfull. 1691 01:16:25,520 --> 01:16:27,330 >> Så vi lämnar detta med detta på skärmen. 1692 01:16:27,330 --> 01:16:29,160 Och vi kommer att se dig på måndag.