1 00:00:00,000 --> 00:00:11,280 2 00:00:11,280 --> 00:00:13,650 >> Högtalare 1: Okej. 3 00:00:13,650 --> 00:00:14,390 Välkommen tillbaka. 4 00:00:14,390 --> 00:00:19,260 Detta är Vecka två av CS50, och vi har hittills använt funktioner men 5 00:00:19,260 --> 00:00:20,830 till stor del tagit dem för givna. 6 00:00:20,830 --> 00:00:23,430 Vi har använt printf som har den bieffekt av tryckning 7 00:00:23,430 --> 00:00:24,110 saker på skärmen. 8 00:00:24,110 --> 00:00:25,790 Vi har använt get-int, får flyta. 9 00:00:25,790 --> 00:00:29,230 >> Men vad händer om du verkligen vill skapa egna funktioner, som en del av 10 00:00:29,230 --> 00:00:31,740 Du kanske redan har börjat göra för Problem Set One, men 11 00:00:31,740 --> 00:00:33,140 inte absolut nödvändigt? 12 00:00:33,140 --> 00:00:37,150 Nåväl, låt oss gå vidare och se över den Problemet med just be användaren 13 00:00:37,150 --> 00:00:40,660 deras namn och skriva något på skärmen, men försök att räkna ut vissa 14 00:00:40,660 --> 00:00:44,000 av likheterna som vi har sett i vår kod hittills. 15 00:00:44,000 --> 00:00:45,120 Så med det menar jag följande. 16 00:00:45,120 --> 00:00:47,315 >> Jag kommer att gå vidare och skapa ett nytt program, bara att ringa 17 00:00:47,315 --> 00:00:49,320 det hej.c som vanligt. 18 00:00:49,320 --> 00:00:53,730 Jag kommer att gå vidare och ge mig själv innehålla standardinformation io.h på toppen. 19 00:00:53,730 --> 00:00:57,040 Jag ska också ge mig själv preemptively den CS50 biblioteket så att 20 00:00:57,040 --> 00:00:59,080 Jag blir inte utskälld av kompilatorn. 21 00:00:59,080 --> 00:01:02,400 Och nu ska jag gå vidare och förklara int, huvud, tomrum. 22 00:01:02,400 --> 00:01:09,020 >> Och sedan i här, är det där jag vill ha att börja lägga ut funktioner till 23 00:01:09,020 --> 00:01:12,090 någon annan funktion som jag själv kommer att skriva, men som inte 24 00:01:12,090 --> 00:01:13,820 närvarande existerar. 25 00:01:13,820 --> 00:01:19,210 Anta till exempel att jag ville skriva en funktion som tillåter mig att 26 00:01:19,210 --> 00:01:23,830 skriva ut Hej, kommatecken, och sedan några användarens namn. 27 00:01:23,830 --> 00:01:29,010 Istället för att fortsätta att göra printf Hej% s, inte skulle det vara trevligt om 28 00:01:29,010 --> 00:01:33,380 Det fanns bara en funktion som kallas inte printf men print namn? 29 00:01:33,380 --> 00:01:36,600 >> Så med andra ord, vill jag kunna skriva ett program som gör en liten 30 00:01:36,600 --> 00:01:37,710 ungefär så här. 31 00:01:37,710 --> 00:01:42,070 Först kommer jag att säga printf din namn, varigenom uppmanar användaren att 32 00:01:42,070 --> 00:01:46,150 ge mig hans eller hennes namn, och då är jag kommer att använda de välkända sträng s till 33 00:01:46,150 --> 00:01:47,290 deklarera en sträng. 34 00:01:47,290 --> 00:01:50,420 Ge mig en variabel av typen String, kalla det s, och förvara i att den 35 00:01:50,420 --> 00:01:52,120 resultera i ringa hämta sträng. 36 00:01:52,120 --> 00:01:56,060 Men nu i veckor tidigare, skulle jag ha något tröttande gjort hej,% s / n. 37 00:01:56,060 --> 00:01:58,630 38 00:01:58,630 --> 00:02:02,570 >> Och med andra ord, vi har sett det här exempel ett gäng gånger, och det är en 39 00:02:02,570 --> 00:02:05,280 trivialt exempel eftersom det finns bara en kodrad så det är egentligen inte en 40 00:02:05,280 --> 00:02:06,860 big deal att hålla skriva in igen. 41 00:02:06,860 --> 00:02:09,990 Men anta att denna kodrad faktiskt höll på att bli en börda, och 42 00:02:09,990 --> 00:02:12,900 det är inte en kodrad men det är 10 kodrader ett par veckor från nu, 43 00:02:12,900 --> 00:02:15,190 och du bara få trött att kopiera och klistra in eller 44 00:02:15,190 --> 00:02:17,180 behöva skriva samma kod. 45 00:02:17,180 --> 00:02:22,100 Skulle det inte vara trevligt istället för att göra printf hej,% s och så vidare, 46 00:02:22,100 --> 00:02:26,500 skulle det inte vara trevligt om det fanns bara en funktion som kallas print namn som 47 00:02:26,500 --> 00:02:27,560 tar ett argument - 48 00:02:27,560 --> 00:02:29,120 med andra ord, det tar ingång - 49 00:02:29,120 --> 00:02:30,620 och sedan semikolon. 50 00:02:30,620 --> 00:02:33,240 Så det fungerar, skulle det inte vara trevligt om det fanns? 51 00:02:33,240 --> 00:02:36,690 Då skulle jag inte behöva oroa sig för vad printf är, vad% s och alla 52 00:02:36,690 --> 00:02:39,400 dessa komplikationer som är inte så intressant. 53 00:02:39,400 --> 00:02:40,570 De är användbara. 54 00:02:40,570 --> 00:02:44,700 >> Så skriv ut namn, tyvärr var inte uppfann några 40 plus år sedan. 55 00:02:44,700 --> 00:02:45,980 Ingen trodde att skriva det. 56 00:02:45,980 --> 00:02:48,300 Men det är det fina med att ha en programmeringsspråk, precis som i 57 00:02:48,300 --> 00:02:52,930 Scratch kan du definiera egna block, så i C och mest något språk, kan du 58 00:02:52,930 --> 00:02:57,260 definiera egna funktioner, kan du definiera egna funktioner. 59 00:02:57,260 --> 00:03:01,710 Så även om vi får huvud genom automatiskt för gratis, kan vi deklarera 60 00:03:01,710 --> 00:03:02,730 våra egna funktioner. 61 00:03:02,730 --> 00:03:05,670 >> Så jag kommer att göra några rum här uppe uppe, och jag ska förklara min 62 00:03:05,670 --> 00:03:08,210 egen funktion som kommer att se en lite konstigt i början, men vi ska komma 63 00:03:08,210 --> 00:03:09,400 tillbaka till detta kort. 64 00:03:09,400 --> 00:03:12,310 Jag kommer att säga ogiltig och därigenom indikerar denna funktion gör 65 00:03:12,310 --> 00:03:16,040 något, har en bieffekt, men det inte tillbaka något till mig i 66 00:03:16,040 --> 00:03:18,810 samma sätt som får int eller få strängen själv gör. 67 00:03:18,810 --> 00:03:22,450 Och jag kommer att ge denna funktion en name of print namn, och jag ska 68 00:03:22,450 --> 00:03:26,470 ange att den här killen kommer att ta en sträng, och jag kommer att kalla det 69 00:03:26,470 --> 00:03:27,600 string name. 70 00:03:27,600 --> 00:03:32,100 Jag skulle kunna kalla det vad jag vill, men jag vill ha min kod för att vara själv-dokumentera. 71 00:03:32,100 --> 00:03:34,770 Med andra ord, var om en av er att öppna filen och läsa den, kan du 72 00:03:34,770 --> 00:03:39,020 slags utläsa namnet på det ingång vilken roll den ska spela. 73 00:03:39,020 --> 00:03:42,270 >> Och nu under det, kommer jag att öppna klammerparentes och slutna klammerparentes, 74 00:03:42,270 --> 00:03:47,140 och så märker jag har följt samma mönster på linjerna fyra till sju som 75 00:03:47,140 --> 00:03:51,622 Jag har följt efter en bra vecka plus nu mellan, säg, linjer nio och 76 00:03:51,622 --> 00:03:53,400 14 som komponerar main. 77 00:03:53,400 --> 00:03:56,160 Med andra ord, skriv ut namn är en annan funktion. 78 00:03:56,160 --> 00:03:58,990 Nu är kompilatorn går inte att veta att kalla denna sak automatiskt 79 00:03:58,990 --> 00:04:02,670 eftersom jag bokstavligen bara uppfunnit det, men det kommer fortfarande vet att kalla main 80 00:04:02,670 --> 00:04:08,710 automatiskt, och då naturligtvis i linje 13, jag kallar min egen funktion. 81 00:04:08,710 --> 00:04:12,805 Och eftersom jag har förklarat att funktionen upp på rad fyra före main, 82 00:04:12,805 --> 00:04:16,579 detta kommer att undervisa kompilatorn vad citationstecken, unquote, "print namn" 83 00:04:16,579 --> 00:04:18,140 innebär och vad den ska göra. 84 00:04:18,140 --> 00:04:22,700 Så jag är liksom att ge det en ny anpassad blockera i samband med, säg, Scratch. 85 00:04:22,700 --> 00:04:27,240 >> Så här kan jag sätta det mycket vanligt eller återkommande mönster av koden jag håller 86 00:04:27,240 --> 00:04:32,300 skriver i klassen, printf % S Hej% s / n ", - 87 00:04:32,300 --> 00:04:36,720 88 00:04:36,720 --> 00:04:37,590 vad vill jag sätta här? 89 00:04:37,590 --> 00:04:39,200 S? 90 00:04:39,200 --> 00:04:41,420 Så jag vill sätta namn i det här sammanhanget. 91 00:04:41,420 --> 00:04:43,440 Så märker lite av en dikotomi här. 92 00:04:43,440 --> 00:04:47,680 Eftersom jag förklara min egen funktion och jag har något godtyckligt kallat 93 00:04:47,680 --> 00:04:50,880 det skriver ut namn, och eftersom jag har inom parentes att detta 94 00:04:50,880 --> 00:04:55,035 Funktionen tar ett argument, vilken typ av vilket är en sträng - så det är ett ord 95 00:04:55,035 --> 00:05:00,010 eller fras eller något liknande - och Jag ringer det argumentet namn, som 96 00:05:00,010 --> 00:05:04,770 innebär den enda variabel som finns i räckvidd, så att säga, är namnet. 97 00:05:04,770 --> 00:05:07,780 >> S existerar endast mellan vad två Klammerparenteserna, förstås? 98 00:05:07,780 --> 00:05:12,990 Jo verkligen, precis som linje 10 genom 14, så precis som på måndagen inte kan använda 99 00:05:12,990 --> 00:05:17,650 S, men vad jag kan göra är att passera S i tryck namn. 100 00:05:17,650 --> 00:05:21,030 Skriv namn råkar vara så att ge det ett alias, en synonym, ett smeknamn 101 00:05:21,030 --> 00:05:24,400 kalla det namnet, och nu använda det i denna linje. 102 00:05:24,400 --> 00:05:26,840 Så nu vill jag spara detta, zooma ut. 103 00:05:26,840 --> 00:05:31,250 >> Låt mig gå vidare och göra hej. 104 00:05:31,250 --> 00:05:32,400 Ser bra ut. 105 00:05:32,400 --> 00:05:36,110 Inte spotta ut eventuella fel. . / Hello Enter. 106 00:05:36,110 --> 00:05:37,020 Vad heter jag? 107 00:05:37,020 --> 00:05:38,060 David. 108 00:05:38,060 --> 00:05:39,270 Och hej David. 109 00:05:39,270 --> 00:05:41,820 Så inte så spännande, men tänk nu. 110 00:05:41,820 --> 00:05:44,310 Du har nu samma ingrediens som vi gjorde i Scratch till 111 00:05:44,310 --> 00:05:45,420 göra våra egna funktioner. 112 00:05:45,420 --> 00:05:46,770 >> Men det är lite av en Gotcha. 113 00:05:46,770 --> 00:05:50,620 Antag att jag inte riktigt hade tänkt igenom detta och jag faktiskt utan 114 00:05:50,620 --> 00:05:54,250 verkligen tänka på det skrev som fungerar här nere. 115 00:05:54,250 --> 00:05:55,420 Känns helt rimligt. 116 00:05:55,420 --> 00:05:58,440 I Scratch finns det ingen föreställning över platsen i dina skript. 117 00:05:58,440 --> 00:06:00,670 Du kan sätta en upp här, en här uppe, en här uppe, och det kan börja 118 00:06:00,670 --> 00:06:03,310 se lite rörigt om du inte lägga ut det prydligt, men det gör det inte 119 00:06:03,310 --> 00:06:05,910 Vart fysiskt skript var på skärmen. 120 00:06:05,910 --> 00:06:09,660 Tyvärr i C - och det är skillnad språk som Java och Python 121 00:06:09,660 --> 00:06:13,600 och andra som du kanske känner med - tyvärr i C, gör att 122 00:06:13,600 --> 00:06:15,830 roll eftersom klockan vad kommer att hända nu. 123 00:06:15,830 --> 00:06:19,010 >> Den förvalda funktionen som händer att verkställa är, naturligtvis, main. 124 00:06:19,010 --> 00:06:22,290 Huvudsaklig ska ringa print namn på line åtta, men tyvärr, det 125 00:06:22,290 --> 00:06:26,660 kompilatorn kommer inte ens veta att print namn existerar innan den kommer till ledningen 11, 126 00:06:26,660 --> 00:06:28,520 som tyvärr kommer att vara för sent. 127 00:06:28,520 --> 00:06:30,660 Så låt oss göra göra hello. 128 00:06:30,660 --> 00:06:32,950 Och nu Fan, två fel genereras. 129 00:06:32,950 --> 00:06:36,050 Så nu låt mig rulla fram till den mycket först, som vi alltid gör, och 130 00:06:36,050 --> 00:06:39,560 märker att det skriker på mig, "Implicit deklaration av funktionen 131 00:06:39,560 --> 00:06:40,540 skriva ut namn. " 132 00:06:40,540 --> 00:06:43,860 >> Så vi har sett detta meddelande innan, implicit deklaration av funktionen. 133 00:06:43,860 --> 00:06:48,080 När har vi sett denna typ av fel? 134 00:06:48,080 --> 00:06:49,180 När jag inte har ett bibliotek. 135 00:06:49,180 --> 00:06:53,470 Om jag glömde cs50.h och jag skulle få skrek åt för att få strängen eller få int. 136 00:06:53,470 --> 00:06:56,880 Men i detta fall, denna funktion tryck Namnet är inte i ett bibliotek, eller hur? 137 00:06:56,880 --> 00:07:00,230 Det är bokstavligen i den här filen, så vad är egentligen problemet? 138 00:07:00,230 --> 00:07:04,660 >> Jo tyvärr i C, det tar dig så otroligt bokstavligen att om du 139 00:07:04,660 --> 00:07:08,640 vill ha en funktion som kallas print namn till existerar, måste du antingen tillämpa 140 00:07:08,640 --> 00:07:11,940 som fungerar i den absoluta toppen av din kod så att den är tillgänglig för att sänka 141 00:07:11,940 --> 00:07:15,070 funktioner, men ärligt talat, blir det slarvig mycket snabbt. 142 00:07:15,070 --> 00:07:18,160 Personligen gillar jag att sätta på första eftersom det då är mycket tydligt vad detta 143 00:07:18,160 --> 00:07:19,890 Programmet gör vid första anblicken. 144 00:07:19,890 --> 00:07:23,290 Och plus, kan du komma in i konstiga hörn fall där om x vill ringa 145 00:07:23,290 --> 00:07:27,530 y men y kan kalla x, du bara fysiskt kan faktiskt inte sätta en 146 00:07:27,530 --> 00:07:28,540 ovanför den andra. 147 00:07:28,540 --> 00:07:31,230 >> Men det visar sig i C, kan vi lösa detta mycket enkelt. 148 00:07:31,230 --> 00:07:34,010 Jag kommer att sätta lite utrymme här uppe, och jag ska bara 149 00:07:34,010 --> 00:07:38,170 preemptively, om än något redundant, kommer att undervisa 150 00:07:38,170 --> 00:07:42,320 kompilatorn att det finns en funktion kallas print namn, det tar en sträng, 151 00:07:42,320 --> 00:07:46,330 och jag ska ringa det namn semikolon. 152 00:07:46,330 --> 00:07:50,220 >> Så här nu i linje fyra, som vi inte har sett förut, är en förklaring 153 00:07:50,220 --> 00:07:53,940 av en funktion print namn, men det är bara ett löfte om att denna funktion kommer 154 00:07:53,940 --> 00:07:56,620 så småningom att definieras, så småningom genomföras. 155 00:07:56,620 --> 00:08:00,180 Det jag nu kan lämna ensam eftersom nu detta är definitionen, den 156 00:08:00,180 --> 00:08:04,090 genomförande, sortera den sista milen av genomförandet av detta 157 00:08:04,090 --> 00:08:05,130 viss funktion. 158 00:08:05,130 --> 00:08:08,450 Så ärligt talat det är dumt, det är irriterande, men detta är det sätt C är, och det är 159 00:08:08,450 --> 00:08:12,050 eftersom det tar väldigt bokstavligt och, som en dator uppriktigt sagt bör, 160 00:08:12,050 --> 00:08:16,020 bara gör exakt vad du säger till göra, och så att beställning är viktigt. 161 00:08:16,020 --> 00:08:18,940 >> Så ha det i åtanke och igen, börja märker återkommande mönster. 162 00:08:18,940 --> 00:08:21,850 Oddsen är att du kommer, om du inte har redan, börja stöta meddelanden 163 00:08:21,850 --> 00:08:24,700 som denna som vid första anblicken verkar helt kryptiskt, men om du börjar 164 00:08:24,700 --> 00:08:29,000 att leta efter dessa nyckelord som "Implicit deklaration," tala om en 165 00:08:29,000 --> 00:08:32,380 funktion i det här fallet - och ärligt talat, du ibland även få en liten grön 166 00:08:32,380 --> 00:08:35,010 morot symbol som berättar var frågan är nog - 167 00:08:35,010 --> 00:08:40,980 du kan börja arbeta dig igenom ännu osedda felmeddelanden. 168 00:08:40,980 --> 00:08:45,860 Har du frågor om hur du skriver ditt egen funktion på detta sätt? 169 00:08:45,860 --> 00:08:47,540 >> Låt oss göra något som är en lite mer övertygande. 170 00:08:47,540 --> 00:08:51,760 Snarare än att bara göra något som har en bieffekt av utskrift, låt mig gå 171 00:08:51,760 --> 00:08:55,340 framåt och spara en ny fil, och vi kommer kalla detta positive.c, även om det är 172 00:08:55,340 --> 00:08:57,600 kommer att vara lite annorlunda jämfört med förra gången. 173 00:08:57,600 --> 00:09:01,910 Och den här gången vill jag att åter genomföra sista gången s positive.C exempel, som 174 00:09:01,910 --> 00:09:04,430 är att tvinga användaren att ge mig ett positivt heltal. 175 00:09:04,430 --> 00:09:07,280 Men jag var tvungen att använda få int förra gången. 176 00:09:07,280 --> 00:09:10,780 Skulle det inte ha varit trevligt om det fanns en funktion som kallas få positiv int 177 00:09:10,780 --> 00:09:13,610 att jag bara kunde lägga ut detta bit funktionalitet? 178 00:09:13,610 --> 00:09:16,480 Så skillnaden här är vi kommer genomföra få positiv int, men till skillnad från 179 00:09:16,480 --> 00:09:20,330 print namn som hade en bieffekt - det inte tillbaka något till mig som 180 00:09:20,330 --> 00:09:21,710 ett nummer eller en sträng - 181 00:09:21,710 --> 00:09:25,510 få positiv int är naturligtvis att gå till återvända, förhoppningsvis, en positiv int. 182 00:09:25,510 --> 00:09:26,170 >> Så låt oss göra det här. 183 00:09:26,170 --> 00:09:30,840 Inkludera cs50.h, Inkludera standard io.h. 184 00:09:30,840 --> 00:09:33,520 Int main tomrum. 185 00:09:33,520 --> 00:09:42,160 Och nu i här, kommer jag att gå vidare och låt oss säga int, kalla det n, lika 186 00:09:42,160 --> 00:09:44,270 få positiv int. 187 00:09:44,270 --> 00:09:49,080 Och precis som att få int redan finns eftersom personalen skrev det, jag kommer 188 00:09:49,080 --> 00:09:53,950 att för ett ögonblick anta att få positiv int existerar, och nu ska jag 189 00:09:53,950 --> 00:09:57,730 att gå vidare och säga printf, tack för% i / n ", n. 190 00:09:57,730 --> 00:10:02,940 191 00:10:02,940 --> 00:10:07,770 >> Så nu om jag kompilera programmet, vad kommer att hända i mitt terminal 192 00:10:07,770 --> 00:10:09,075 längst ned på skärmen? 193 00:10:09,075 --> 00:10:11,580 194 00:10:11,580 --> 00:10:13,900 Jag ska nog få det samma fel som tidigare. 195 00:10:13,900 --> 00:10:14,570 Så låt oss prova det här. 196 00:10:14,570 --> 00:10:16,450 Gör positivt. 197 00:10:16,450 --> 00:10:19,900 Och återigen, implicit deklaration av funktion, få positiv int. 198 00:10:19,900 --> 00:10:21,970 Så vi kan lösa detta i ett par olika sätt. 199 00:10:21,970 --> 00:10:27,310 Jag kommer att hålla det enkelt och bara sätta min förklaring här uppe och få 200 00:10:27,310 --> 00:10:28,120 positiv int. 201 00:10:28,120 --> 00:10:29,720 Jag behöver den så kallade signatur. 202 00:10:29,720 --> 00:10:32,410 Signaturen hänvisar bara till estetik 203 00:10:32,410 --> 00:10:34,090 första raden i programmet. 204 00:10:34,090 --> 00:10:37,420 Så vad bör få positiva int retur? 205 00:10:37,420 --> 00:10:37,970 >> Så en int. 206 00:10:37,970 --> 00:10:41,540 Jag menar Helst skulle det återgå något positivt int, men att 207 00:10:41,540 --> 00:10:42,160 finns inte. 208 00:10:42,160 --> 00:10:45,280 Vi har inte sett att det bland våra data typer, så vi måste ta itu med den 209 00:10:45,280 --> 00:10:47,170 faktum att vi har väldigt få datatyper för att arbeta med. 210 00:10:47,170 --> 00:10:50,360 Men vi kan returnera en int och bara litar på att det kommer att vara positivt. 211 00:10:50,360 --> 00:10:52,690 Det kommer att kallas få positiv int. 212 00:10:52,690 --> 00:10:55,122 >> Och nu hur om sina argument? 213 00:10:55,122 --> 00:10:56,440 Tar det någon ingång? 214 00:10:56,440 --> 00:10:58,280 Behöver det någon ingång? 215 00:10:58,280 --> 00:11:00,900 Så det inte behöver veta i förväg något. 216 00:11:00,900 --> 00:11:03,220 Få sträng inte får int inte. 217 00:11:03,220 --> 00:11:06,430 Printf gör - det måste ha vissa input passerade in det - och skriv ut namnet 218 00:11:06,430 --> 00:11:09,020 behövs vissa indata, men få positiv int inte. 219 00:11:09,020 --> 00:11:11,530 Så jag ska uttryckligen tala om för kompilatorn ogiltig. 220 00:11:11,530 --> 00:11:13,470 Void är frånvaron av något annat. 221 00:11:13,470 --> 00:11:17,990 Så void betyder ingenting kommer innanför av dessa parenteser, semikolon. 222 00:11:17,990 --> 00:11:20,840 >> Och nu på botten av min fil - och igen, jag bara vara typ av anal 223 00:11:20,840 --> 00:11:23,640 Här sätter main upptill, vilket är god praxis eftersom det här sättet, 224 00:11:23,640 --> 00:11:26,220 när du eller någon annan öppnar filen, den 225 00:11:26,220 --> 00:11:27,400 funktionalitet är rätt där. 226 00:11:27,400 --> 00:11:29,660 Du kan dyka i från ruta ett. 227 00:11:29,660 --> 00:11:34,190 Så nu ska jag kopiera detta, få positiv int tomrum, men jag är inte 228 00:11:34,190 --> 00:11:35,430 kommer att drabba ett semikolon nu. 229 00:11:35,430 --> 00:11:38,280 Jag ska öppna klammerparenteser, och nu jag behöver låna 230 00:11:38,280 --> 00:11:39,700 några idéer från måndag. 231 00:11:39,700 --> 00:11:44,450 >> Så som ni minns, gjorde vi något vilja göra följande medan 232 00:11:44,450 --> 00:11:45,830 något var sant. 233 00:11:45,830 --> 00:11:46,630 Och vad gjorde jag? 234 00:11:46,630 --> 00:11:51,540 Jag gjorde något som ger mig ett positivt heltal, 235 00:11:51,540 --> 00:11:52,430 lite av en prompt. 236 00:11:52,430 --> 00:11:53,540 Jag skulle kunna använda några ord som jag vill. 237 00:11:53,540 --> 00:11:54,960 Och sedan jag använde vad? 238 00:11:54,960 --> 00:11:59,530 Int n är lika få int, inga argument till det. 239 00:11:59,530 --> 00:12:00,550 >> Och märker skillnaden. 240 00:12:00,550 --> 00:12:04,680 När du ringer en funktion, när du använder en funktion, behöver du inte lägga in ogiltiga. 241 00:12:04,680 --> 00:12:08,570 Du gör bara det när du deklarerar en funktion, undervisning kompilatorn vad 242 00:12:08,570 --> 00:12:09,780 Det bör förvänta. 243 00:12:09,780 --> 00:12:11,650 Så du behöver inte lägga ogiltigförklara det själv. 244 00:12:11,650 --> 00:12:12,940 >> Och nu vad var mitt tillstånd? 245 00:12:12,940 --> 00:12:19,670 Tja, är n inte lika positiv, men det är bara pseudo-kod. 246 00:12:19,670 --> 00:12:22,530 Så hur gör jag uttrycka det renare? 247 00:12:22,530 --> 00:12:24,090 Så mindre än eller lika med noll. 248 00:12:24,090 --> 00:12:26,250 Så återigen, märker du kan göra mindre än eller lika med. 249 00:12:26,250 --> 00:12:28,100 Även om det är två separata symboler, kan du göra det på 250 00:12:28,100 --> 00:12:29,350 tangentbordet som sådan. 251 00:12:29,350 --> 00:12:33,950 >> Men det finns fortfarande en bugg som Jag klantade mig förra gången också. 252 00:12:33,950 --> 00:12:36,950 Jag måste förklara - 253 00:12:36,950 --> 00:12:37,460 exakt. 254 00:12:37,460 --> 00:12:39,640 Jag måste förklara n utanför av slingan. 255 00:12:39,640 --> 00:12:44,180 Så jag måste sätta n här uppe, och jag gör inte vill åter förklara den här 256 00:12:44,180 --> 00:12:46,480 så att jag får en ny variabel. 257 00:12:46,480 --> 00:12:48,860 Jag vill bara att tilldela ett värde här. 258 00:12:48,860 --> 00:12:54,320 >> Och nu är jag inte riktigt gjort här. 259 00:12:54,320 --> 00:12:57,290 Låt mig få inför mig själv och låtsas att jag är klar. 260 00:12:57,290 --> 00:13:01,220 Gör positivt, och nu det finns ett nytt fel. 261 00:13:01,220 --> 00:13:04,550 Kontroll når slutet av icke-void funktion. 262 00:13:04,550 --> 00:13:07,760 Så nytt felmeddelande, men om du typ av retas isär varje ord, det 263 00:13:07,760 --> 00:13:09,620 förmodligen antyder vad som är fel. 264 00:13:09,620 --> 00:13:11,240 >> Kontroll. 265 00:13:11,240 --> 00:13:14,250 Kontroll betyder bara att ordern av verksamheten i ett program. 266 00:13:14,250 --> 00:13:16,510 Datorn är i kontroll och något gick fel. 267 00:13:16,510 --> 00:13:18,510 Så det når slutet av en icke-void funktion. 268 00:13:18,510 --> 00:13:21,760 Vilken funktion är det uppenbarligen hänvisar till? 269 00:13:21,760 --> 00:13:24,790 Vilken funktion är icke-void? 270 00:13:24,790 --> 00:13:27,400 Så får positiv int, och lite förvirrande eftersom väl, 271 00:13:27,400 --> 00:13:29,010 det är typ av tomrum. 272 00:13:29,010 --> 00:13:33,070 Den har en specifikation av tomrum för dess argument, men dess effekt kommer att 273 00:13:33,070 --> 00:13:34,540 vara av typ N. 274 00:13:34,540 --> 00:13:37,260 Så ordet till vänster är så kallade returtyp. 275 00:13:37,260 --> 00:13:40,320 Ordet på insidan här är noll eller flera argument 276 00:13:40,320 --> 00:13:41,970 att en funktion tar. 277 00:13:41,970 --> 00:13:44,060 >> Så vad behöver jag göra? 278 00:13:44,060 --> 00:13:47,650 Vid denna punkt i min kod, rad 21 där den blinkande prompten är nu, jag 279 00:13:47,650 --> 00:13:51,430 ha en positiv int inuti av variabeln kallade N. 280 00:13:51,430 --> 00:13:55,200 Hur ger jag det tillbaka till main? 281 00:13:55,200 --> 00:13:55,960 Bokstavligen. 282 00:13:55,960 --> 00:13:59,320 Återgå n semikolon. 283 00:13:59,320 --> 00:14:04,090 >> Så precis som Colton tillbaka en bit av papper med ett svar till mig genom att släppa 284 00:14:04,090 --> 00:14:07,020 det papper i den lilla svarta box på bordet, för att göra det i 285 00:14:07,020 --> 00:14:10,100 kod, du bokstavligen bara skriva, tillbaka n, och det är som om Colton var 286 00:14:10,100 --> 00:14:12,140 gav mig något fysiskt tillbaka. 287 00:14:12,140 --> 00:14:15,870 I det här fallet, vad som händer är att få positiv int kommer att lämna tillbaka 288 00:14:15,870 --> 00:14:19,220 vad är förmodligen en positiv heltal till vem? 289 00:14:19,220 --> 00:14:21,380 Var slutar det värdet upp? 290 00:14:21,380 --> 00:14:29,080 Som hamnar i denna variabel, n, och då vi går vidare med linje nio. 291 00:14:29,080 --> 00:14:31,920 >> Så med andra ord, i den ordning de verksamheten, startar detta program 292 00:14:31,920 --> 00:14:34,430 verkställande, och kompilatorn inser, åh, vill du biblioteket? 293 00:14:34,430 --> 00:14:36,310 Låt mig gå ta vad som finns inuti det. 294 00:14:36,310 --> 00:14:37,750 Åh, vill du standard IO biblioteket? 295 00:14:37,750 --> 00:14:39,660 Låt mig gå ta vad som finns inuti det. 296 00:14:39,660 --> 00:14:44,510 Vad säger kompilatorn att själv när den träffar linjen fyra? 297 00:14:44,510 --> 00:14:47,980 Åh, du lovade att genomföra Funktionen kallas få positiva, men 298 00:14:47,980 --> 00:14:50,820 Vi återkommer till det senare, något i den stilen. 299 00:14:50,820 --> 00:14:53,450 >> Int main void betyder just här är innanmätet av mitt program. 300 00:14:53,450 --> 00:14:54,990 Rad sju är bara en klammerparentes. 301 00:14:54,990 --> 00:14:59,540 Linje åtta säger till vänster, ge me 32 bitar för ett heltal, kalla det n. 302 00:14:59,540 --> 00:15:02,160 På höger sida, det säger få positiv int. 303 00:15:02,160 --> 00:15:07,120 Nu ska vi pausa den historien för nu Jag håller inte flytta min markören nedåt. 304 00:15:07,120 --> 00:15:11,720 Min markören går nu här nere eftersom nu får positiva int exekverar. 305 00:15:11,720 --> 00:15:13,100 Int n deklareras. 306 00:15:13,100 --> 00:15:14,040 Gör följande. 307 00:15:14,040 --> 00:15:16,090 Printf ger mig ett positivt heltal. 308 00:15:16,090 --> 00:15:19,740 >> Få en int från användaren, förvara den i N, och kanske göra det igen och igen. 309 00:15:19,740 --> 00:15:23,010 Denna slinga innebär att denna kod skulle kunna köra upp och ner så här igen 310 00:15:23,010 --> 00:15:25,810 och igen, men när användaren slutligen samarbetar och ger mig en positiv 311 00:15:25,810 --> 00:15:31,750 int, slog jag linje 21, vid vilken punkt antal lämnas tillbaka, och som ett 312 00:15:31,750 --> 00:15:34,280 ska jag lyfta fram nu? 313 00:15:34,280 --> 00:15:35,070 Nio. 314 00:15:35,070 --> 00:15:39,010 Kontroll, så att säga, återgår att rada nio. 315 00:15:39,010 --> 00:15:40,650 Det är den linje som nu är ansvarig. 316 00:15:40,650 --> 00:15:43,250 >> Så det är vad som har hänt alla denna gång under huven, men 317 00:15:43,250 --> 00:15:46,480 när vi har använt funktioner som printf eller ens få sträng som någon annan 318 00:15:46,480 --> 00:15:50,600 skrev till dig, var kontroll som överlämnas iväg till någon annans kodrad 319 00:15:50,600 --> 00:15:51,290 av rad för rad. 320 00:15:51,290 --> 00:15:53,770 Det är bara att vi inte kunde se det och vi kunde inte riktigt beskriva det i detta 321 00:15:53,770 --> 00:15:57,620 program eftersom det är i vissa andra fil på hårddisken 322 00:15:57,620 --> 00:16:00,000 varken oss. 323 00:16:00,000 --> 00:16:02,100 Så låt oss faktiskt sammanställa och kör detta nu. 324 00:16:02,100 --> 00:16:03,890 >> Gör positivt. 325 00:16:03,890 --> 00:16:05,260 Sammanställa, det är framsteg. 326 00:16:05,260 --> 00:16:06,650 . / Positiv. 327 00:16:06,650 --> 00:16:08,020 Ge mig ett positivt heltal. 328 00:16:08,020 --> 00:16:08,800 Låt oss vara svårt. 329 00:16:08,800 --> 00:16:10,430 Negativt 1. 330 00:16:10,430 --> 00:16:11,360 Zero. 331 00:16:11,360 --> 00:16:13,370 Låt oss ge det 50. 332 00:16:13,370 --> 00:16:18,100 Tack för 50, och så kontroll har nu återvänt. 333 00:16:18,100 --> 00:16:21,750 Alla frågor, då, på det? 334 00:16:21,750 --> 00:16:23,180 Yeah? 335 00:16:23,180 --> 00:16:25,630 >> [OHÖRBAR]. 336 00:16:25,630 --> 00:16:26,130 >> Säg igen. 337 00:16:26,130 --> 00:16:27,860 Åh, bra fråga. 338 00:16:27,860 --> 00:16:31,100 Så du kanske märker en parallell här som Jag är typ av skära ett hörn. 339 00:16:31,100 --> 00:16:35,420 I linje 12, jag säger, få positiv int returnerar en int, men med samma 340 00:16:35,420 --> 00:16:39,660 logik, står det nu att anledningen till att i linje sex, jag säger att främsta avkastning 341 00:16:39,660 --> 00:16:44,040 en int, men vad har vi aldrig hade i något av våra program? 342 00:16:44,040 --> 00:16:46,470 Vi har aldrig haft omnämnande av här nyckelordet avkastning. 343 00:16:46,470 --> 00:16:49,970 >> Så visar det sig att i C, åtminstone den version av det som vi använder 344 00:16:49,970 --> 00:16:55,750 gjordes 1999, tekniskt, är detta händer för dig automatiskt. 345 00:16:55,750 --> 00:16:59,300 Varje gång du genomför ett program och du implementera en funktion som heter main, 346 00:16:59,300 --> 00:17:04,230 att funktionen returnerar noll standard om du inte säger något annat, 347 00:17:04,230 --> 00:17:05,849 och noll är bara en konvention. 348 00:17:05,849 --> 00:17:09,430 Världen returnerar noll därigenom vilket indikerar att allt är bra, 349 00:17:09,430 --> 00:17:13,040 effektivt lämnar oss med fyra miljarder möjliga saker som kan gå 350 00:17:13,040 --> 00:17:17,530 fel så att om vi återvänder man, som skulle betyda en kod som innebär 351 00:17:17,530 --> 00:17:18,310 sak gick fel. 352 00:17:18,310 --> 00:17:20,589 Vi kunde återvända två, vilket innebär denna andra sak som gick fel. 353 00:17:20,589 --> 00:17:23,440 Vi kunde återvända fyra miljarder, vilket innebär denna andra sak som gick fel. 354 00:17:23,440 --> 00:17:27,170 >> Och om du nu tycker om din egen PC eller Mac, kanske ni minns att 355 00:17:27,170 --> 00:17:29,610 ibland får du kryptiska felmeddelanden från program som du är 356 00:17:29,610 --> 00:17:32,650 användning, och ibland har en mänsklig vänliga beskrivning, men det finns 357 00:17:32,650 --> 00:17:35,265 ofta en kod eller ett nummer på skärmen? 358 00:17:35,265 --> 00:17:37,800 Om detta inte kommer att tänka på, bara hålla utkik efter det. 359 00:17:37,800 --> 00:17:40,790 Det är typiskt vad dessa koderna avser. 360 00:17:40,790 --> 00:17:44,200 De ingår i Microsoft Word och andra program så att om du lämnar in en 361 00:17:44,200 --> 00:17:48,850 felrapport med företaget, kan du berätta för dem, oh, fick jag felmeddelande nummer 45. 362 00:17:48,850 --> 00:17:51,750 Och några programmerare tillbaka på företaget kan leta upp det i hans eller hennes 363 00:17:51,750 --> 00:17:54,940 koden och säger, åh, det är därför jag gjorde denna bugg och det är därför användaren 364 00:17:54,940 --> 00:17:56,240 fick detta meddelande. 365 00:17:56,240 --> 00:17:59,490 >> Men ärligt talat, det är bara en liten störande och lite jobbigt att 366 00:17:59,490 --> 00:18:02,130 dra slutsatsen att, åtminstone på vår första program, så vi har 367 00:18:02,130 --> 00:18:02,970 varit att utelämna det. 368 00:18:02,970 --> 00:18:07,450 Men hela denna tid var och en av dina funktioner main har i hemlighet haft detta 369 00:18:07,450 --> 00:18:11,600 linjen läggs till automatiskt för dig genom kompilator, bara genom konvention till 370 00:18:11,600 --> 00:18:13,172 spara lite tid. 371 00:18:13,172 --> 00:18:14,620 >> [OHÖRBAR]. 372 00:18:14,620 --> 00:18:16,250 >> Du behöver inte inkludera det i main. 373 00:18:16,250 --> 00:18:16,700 Det är bra. 374 00:18:16,700 --> 00:18:20,260 Du behöver ta med det om du var genomföra en funktion som denna. 375 00:18:20,260 --> 00:18:22,850 Annars funktionen platta ut skulle inte fungera. 376 00:18:22,850 --> 00:18:24,480 Men i huvudsak är det inte nödvändigt. 377 00:18:24,480 --> 00:18:28,450 I en vecka eller två, börjar vi få in i den vanan när vi vill starta 378 00:18:28,450 --> 00:18:29,690 betyda fel. 379 00:18:29,690 --> 00:18:32,550 Riktigt bra fråga. 380 00:18:32,550 --> 00:18:36,880 >> Så snabb verbal rast nämna att denna fredag, kommer vi inte att ha lunch 381 00:18:36,880 --> 00:18:39,980 per se, men vi ska ha middag med några av de elever och personal. 382 00:18:39,980 --> 00:18:42,940 Om du vill gå med oss, känns fri att gå till cs50.net/rsvp. 383 00:18:42,940 --> 00:18:45,030 06:00 på fredag. 384 00:18:45,030 --> 00:18:47,990 Rymden är, som alltid, begränsad, men vi ska fortsätta att göra dessa på en nästan 385 00:18:47,990 --> 00:18:51,420 veckobasis om rymden löper ut den här veckan. 386 00:18:51,420 --> 00:18:56,160 >> Så cliffhanger som vi slutade på Måndag var att strängarna kan faktiskt 387 00:18:56,160 --> 00:19:00,520 indexeras in, vilket betyder bara att du kan få på det första tecknet, den 388 00:19:00,520 --> 00:19:03,770 andra tecknet, det tredje tecknet och så vidare, eftersom du kan 389 00:19:03,770 --> 00:19:07,860 effektivt tänka på en sträng, som hej, som i detta fall fem 390 00:19:07,860 --> 00:19:09,670 Bokstäverna i lådor. 391 00:19:09,670 --> 00:19:13,370 Och du kan få vid varje av dessa lådor med vad syntax gjorde vi 392 00:19:13,370 --> 00:19:15,230 införa på måndag? 393 00:19:15,230 --> 00:19:16,760 Dessa hakparenteser på tangentbordet. 394 00:19:16,760 --> 00:19:18,980 Det innebar bara att gå till platsen noll. 395 00:19:18,980 --> 00:19:22,840 >> Vi börjar räkna på noll, så fäste noll betecknar h, fäste en 396 00:19:22,840 --> 00:19:25,170 betecknar e, och så vidare. 397 00:19:25,170 --> 00:19:28,490 Och så hela tiden när vi har varit använda strängar och skriva in "Hej" 398 00:19:28,490 --> 00:19:31,250 och "världen" och andra saker på skärmen, det har lagrats 399 00:19:31,250 --> 00:19:32,820 i rutor som denna. 400 00:19:32,820 --> 00:19:33,370 Och ta en gissning. 401 00:19:33,370 --> 00:19:37,470 Vad varje ruta representerar fysiskt insidan av din dator? 402 00:19:37,470 --> 00:19:38,250 >> [OHÖRBAR]. 403 00:19:38,250 --> 00:19:39,150 >> Förlåt? 404 00:19:39,150 --> 00:19:39,580 >> Tecken. 405 00:19:39,580 --> 00:19:44,760 >> Så en karaktär, säkerligen i fallet av strängar, och ett tecken är precis 406 00:19:44,760 --> 00:19:46,800 åtta bitar eller en byte. 407 00:19:46,800 --> 00:19:49,550 Så du är förmodligen åtminstone vagt bekant med det faktum att din 408 00:19:49,550 --> 00:19:50,500 dator har minne. 409 00:19:50,500 --> 00:19:52,110 Det finns två typer av minne åtminstone. 410 00:19:52,110 --> 00:19:54,810 En är hårddisken där du sparar grejer permanent, och det är 411 00:19:54,810 --> 00:19:57,400 vanligtvis stora så att du kan få filmer och musik och så vidare. 412 00:19:57,400 --> 00:20:04,010 >> Då har du en annan typ av minne kallas RAM, R-A-M, Random Access 413 00:20:04,010 --> 00:20:07,510 Minne, och detta är den typ av minne som används när datorn är 414 00:20:07,510 --> 00:20:11,520 kör men om du förlorar makt eller din batteriet dör, något som är lagrade 415 00:20:11,520 --> 00:20:15,300 i RAM försvinner om du förlorar makten helt och hållet eftersom det inte är 416 00:20:15,300 --> 00:20:16,060 ihållande. 417 00:20:16,060 --> 00:20:19,120 Du har normalt, dessa dagar, en spelning av det, två spelningar, kanske fler. 418 00:20:19,120 --> 00:20:23,490 Och uppsidan RAM är att det är mycket mycket, mycket snabbare än hårddiskar 419 00:20:23,490 --> 00:20:27,390 eller ens Solid State Drives dessa dagar, men det är oftast dyrare så 420 00:20:27,390 --> 00:20:28,480 du har mindre av det. 421 00:20:28,480 --> 00:20:32,400 >> Så dagens samtal hänvisar egentligen till RAM, denna typ av minne som 422 00:20:32,400 --> 00:20:35,270 existerar endast när det finns ström matas in i datorn. 423 00:20:35,270 --> 00:20:40,530 Så när du skriver i H-E-L-L-O, Enter på tangentbordet, är H går i ett 424 00:20:40,530 --> 00:20:44,550 bitgruppen i RAM, är den E går i en annan byte i RAM, är lika 425 00:20:44,550 --> 00:20:45,800 resten av ordet. 426 00:20:45,800 --> 00:20:49,010 Så minns vad vi kunde att göra förra gången var det. 427 00:20:49,010 --> 00:20:53,940 Låt mig gå vidare och öppna upp filen som vi kallade string.c, och minns 428 00:20:53,940 --> 00:20:56,860 att det såg lite ungefär så här. 429 00:20:56,860 --> 00:20:59,860 Låt mig faktiskt rulla tillbaka och ändra det till exakt hur det såg ut, 430 00:20:59,860 --> 00:21:02,654 sträng längd s. 431 00:21:02,654 --> 00:21:04,560 >> Så titta på programmet här. 432 00:21:04,560 --> 00:21:08,530 Vi inkluderar CS50 biblioteket så att vi kan använda få sträng. 433 00:21:08,530 --> 00:21:11,400 Vi inkluderar standard io.h så att vi kan använda printf. 434 00:21:11,400 --> 00:21:13,580 Varför har vi inkludera string.h? 435 00:21:13,580 --> 00:21:16,980 Detta var nya på måndag. 436 00:21:16,980 --> 00:21:18,230 Så vi ville sträng längd. 437 00:21:18,230 --> 00:21:19,090 Str Leng. 438 00:21:19,090 --> 00:21:21,470 Folk bestämde år sedan, låt oss bara vara kortfattad. 439 00:21:21,470 --> 00:21:24,290 Istället för att kalla det "sträng längd," låt oss kalla det "Str Leng" och låt 440 00:21:24,290 --> 00:21:28,540 världen lista ut, och så det är vad vi får tillgång till med string.h. 441 00:21:28,540 --> 00:21:29,390 >> Detta är bekant. 442 00:21:29,390 --> 00:21:30,320 Detta är bekant. 443 00:21:30,320 --> 00:21:31,450 Detta är bekant. 444 00:21:31,450 --> 00:21:32,370 Detta är ett lite nytt. 445 00:21:32,370 --> 00:21:35,420 I linje 22 - och vi ska återkomma till detta, men nu vet - 446 00:21:35,420 --> 00:21:37,880 och du skulle bara veta detta från att ha läs dokumentationen eller om 447 00:21:37,880 --> 00:21:39,010 du visste C redan - 448 00:21:39,010 --> 00:21:41,510 hämta sträng ibland kan skruva upp. 449 00:21:41,510 --> 00:21:45,130 Om användaren är verkligen kontradiktoriskt eller samarbetsvillig och han eller hon bara 450 00:21:45,130 --> 00:21:49,450 inte skriver något på tangentbordet eller typer så mycket på tangentbordet som 451 00:21:49,450 --> 00:21:53,760 Det överväldigar datorns minne, i teorin, få strängen kunde återvända 452 00:21:53,760 --> 00:21:56,270 något annat än en teckensträng. 453 00:21:56,270 --> 00:22:01,930 Det kan returnera ett speciellt värde som kallas NULL i versaler, N-U-L-L, och detta är 454 00:22:01,930 --> 00:22:03,390 bara en så kallad vaktpostvärde. 455 00:22:03,390 --> 00:22:08,010 Det är ett speciellt värde som betecknar hände något dåligt i det här fallet. 456 00:22:08,010 --> 00:22:10,520 Det är avsaknaden av en sträng. 457 00:22:10,520 --> 00:22:16,190 >> Så null Jag kollar efter helt enkelt så att, lång historia kort, str Leng och 458 00:22:16,190 --> 00:22:20,230 andra funktioner som kommer med C om de förväntar sig en sträng men du passerar dem 459 00:22:20,230 --> 00:22:23,630 avsaknaden av en sträng, om du klarar dem NULL, datorn eller programmet 460 00:22:23,630 --> 00:22:25,000 kommer bara krascha direkt. 461 00:22:25,000 --> 00:22:25,610 Det kommer att hänga. 462 00:22:25,610 --> 00:22:27,250 Det kommer att kasta upp några felmeddelande. 463 00:22:27,250 --> 00:22:28,690 Dåliga saker kommer att hända. 464 00:22:28,690 --> 00:22:31,130 Så även om detta är fortfarande inte väldefinierad - 465 00:22:31,130 --> 00:22:33,730 detta kommer att göra mer känsla i en vecka eller två - i linje 22, är detta bara en 466 00:22:33,730 --> 00:22:38,790 exempel av själv defensiv felkontroll bara i fall en tid av 467 00:22:38,790 --> 00:22:42,040 en miljon något går fel, till åtminstone mitt program inte kommer att krascha. 468 00:22:42,040 --> 00:22:45,960 >> Så om s inte lika något dåligt, Jag har här för loop, och detta var 469 00:22:45,960 --> 00:22:47,710 där vi hade den andra ny bit av syntaxen. 470 00:22:47,710 --> 00:22:51,580 Jag har en for-loop iterera från noll på upp till längden på s. 471 00:22:51,580 --> 00:22:56,140 Och så här, var jag en utskrift ut s fäste jag, men varför jag använder% c alla 472 00:22:56,140 --> 00:23:00,770 en plötslig istället för% s ännu men s är en sträng? 473 00:23:00,770 --> 00:23:02,110 Det är ett tecken, eller hur? 474 00:23:02,110 --> 00:23:06,560 S är en sträng, men s fäste något, s fäste i där jag är noll 475 00:23:06,560 --> 00:23:10,380 eller ett eller två, det är en individuell tecken i strängen, och så för 476 00:23:10,380 --> 00:23:14,970 att printf måste informeras om att det är verkligen en karaktär att förvänta. 477 00:23:14,970 --> 00:23:18,096 >> Och sedan minns, gjorde vad detta Programmet gör egentligen? 478 00:23:18,096 --> 00:23:19,848 >> Skrivs det ut i kolumner. 479 00:23:19,848 --> 00:23:21,120 >> Ja, exakt. 480 00:23:21,120 --> 00:23:24,990 Det skrivs just det ord som jag skriver in en kolumn, ett tecken per rad. 481 00:23:24,990 --> 00:23:26,190 Så låt oss se detta igen. 482 00:23:26,190 --> 00:23:27,810 Så gör strängen. 483 00:23:27,810 --> 00:23:30,200 Sammanställt OK. . / String. 484 00:23:30,200 --> 00:23:35,560 Låt mig skriva i H-E-L-L-O, Enter, och ja jag får det, en per rad. 485 00:23:35,560 --> 00:23:37,280 >> Så låt mig göra en optimering här. 486 00:23:37,280 --> 00:23:40,240 Om du tänker på det, speciellt om du har programmerat tidigare, det finns 487 00:23:40,240 --> 00:23:43,340 utan tvekan en ineffektivitet i linje 24. 488 00:23:43,340 --> 00:23:46,160 Med andra ord, det är inte nödvändigtvis den bästa designen. 489 00:23:46,160 --> 00:23:50,200 Okomplicerad, minst en gång du ihåg vad Str Leng är, men det är 490 00:23:50,200 --> 00:23:52,640 göra något dumt potentiellt. 491 00:23:52,640 --> 00:23:54,863 Vad kan det vara? 492 00:23:54,863 --> 00:23:56,280 >> [OHÖRBAR]. 493 00:23:56,280 --> 00:23:56,800 >> Exakt. 494 00:23:56,800 --> 00:24:00,340 Det kollar för längden på s varenda gång trots 495 00:24:00,340 --> 00:24:02,980 H-E-L-L-O kommer alltid att vara fem tecken. 496 00:24:02,980 --> 00:24:05,490 Varje gång genom denna slinga, de fem inte förändras. 497 00:24:05,490 --> 00:24:08,750 Jag kanske uppräkning i, men vad är längden av s på varje 498 00:24:08,750 --> 00:24:09,690 variant av denna loop? 499 00:24:09,690 --> 00:24:15,810 Det är fem, det är fem, det är fem, och men jag ändå frågar detta 500 00:24:15,810 --> 00:24:18,320 fråga igen och igen och igen. 501 00:24:18,320 --> 00:24:20,750 Nu ärligt talat, är datorn så jävla snabbt, ingen kommer att märka en 502 00:24:20,750 --> 00:24:23,780 skillnad i detta fall, men dessa typer av dåliga designbeslut kan 503 00:24:23,780 --> 00:24:28,330 börja lägga upp om kompilatorn själv försöker inte att fixa detta för dig som 504 00:24:28,330 --> 00:24:30,630 det skulle typiskt inte vid åtminstone i apparaten. 505 00:24:30,630 --> 00:24:31,540 >> Så jag kommer att göra detta. 506 00:24:31,540 --> 00:24:34,580 Jag kommer att lägga till ett kommatecken efter min första variabeln, jag. 507 00:24:34,580 --> 00:24:37,310 Jag ska ge mig själv en annan variabel, kalla det n, bara genom 508 00:24:37,310 --> 00:24:41,330 konvention för siffror, och så är jag kommer att tilldela n Värdet på strängen 509 00:24:41,330 --> 00:24:42,530 längd s. 510 00:24:42,530 --> 00:24:46,060 Och sen ska jag byta mitt tillstånd att vara vad? 511 00:24:46,060 --> 00:24:51,960 Jag ska ändra mitt tillstånd att medan jag är mindre än n. 512 00:24:51,960 --> 00:24:55,700 >> Så nu, hur många gånger jag kontrollera längden av s? 513 00:24:55,700 --> 00:25:00,110 En gång, men det är OK att ta i mot n igen och igen eftersom nu de 514 00:25:00,110 --> 00:25:03,170 värden faktiskt inte förändras. 515 00:25:03,170 --> 00:25:06,020 Nu för nu, vet bara att när du anropa en funktion, det är lite av 516 00:25:06,020 --> 00:25:09,930 overhead, inte tillräckligt för att avskräcka dig egentligen från att någonsin använda funktioner, men 517 00:25:09,930 --> 00:25:12,750 säkert när det finns en kodrad gillar det - och linjerna kommer att få 518 00:25:12,750 --> 00:25:15,490 mer intressant innan länge - där det finns en möjlighet att tänka, om jag 519 00:25:15,490 --> 00:25:18,320 skriver denna kod, hur många gånger kommer det köra? 520 00:25:18,320 --> 00:25:20,950 Du kommer att börja se över tid resultatet av dina program kan 521 00:25:20,950 --> 00:25:21,660 faktiskt förändras. 522 00:25:21,660 --> 00:25:24,110 >> I själva verket sätter en av de problem vi har gjort i år tidigare innebär 523 00:25:24,110 --> 00:25:27,600 genomförande, som ni kanske minns från vecka noll, en stavningskontroll, men en 524 00:25:27,600 --> 00:25:31,380 stavningskontroll som är utformad för att stödja en ordbok av 150.000 plus 525 00:25:31,380 --> 00:25:32,860 ord som vi ger er. 526 00:25:32,860 --> 00:25:37,100 Du måste skriva kod som laddar dessa ord i RAM, så till 527 00:25:37,100 --> 00:25:40,700 rutor som vi såg på skärmen en stund sedan, och sedan så fort du 528 00:25:40,700 --> 00:25:43,740 kan, måste du kunna svara på ett frågan om formen, är detta ord 529 00:25:43,740 --> 00:25:44,280 felstavat? 530 00:25:44,280 --> 00:25:45,420 Är detta ord felstavat? 531 00:25:45,420 --> 00:25:46,770 Är detta ord felstavat? 532 00:25:46,770 --> 00:25:49,525 >> Och i något liknande det vi har gjort i år förflutna förvandlat det till, 533 00:25:49,525 --> 00:25:53,500 om än på en opt-in frivillig basis, ett konkurrens av slag, varvid 534 00:25:53,500 --> 00:25:59,470 studenter som använder mindre RAM och mindre tid, färre CPU-cykler, hamnar 535 00:25:59,470 --> 00:26:02,640 bubblar upp till toppen av en liten ledare ombord eller rangordning som vi sätter på 536 00:26:02,640 --> 00:26:04,770 kursens hemsida som vi har gjort under tidigare år. 537 00:26:04,770 --> 00:26:08,100 Så återigen, helt frivilligt, men detta talar till designmöjligheter 538 00:26:08,100 --> 00:26:11,250 som är framåt när vi börjar bygga atop vissa av dessa 539 00:26:11,250 --> 00:26:14,010 grundläggande byggstenar. 540 00:26:14,010 --> 00:26:16,780 >> Så låt mig gå tillbaka till detta diagram för bara ett ögonblick och avslöjar lite 541 00:26:16,780 --> 00:26:17,610 något mer. 542 00:26:17,610 --> 00:26:21,400 Detta är verkligen en sträng, och vi har tagit utnyttjade ett bibliotek, 543 00:26:21,400 --> 00:26:25,150 standard io.h som har - 544 00:26:25,150 --> 00:26:26,110 >> Printf. 545 00:26:26,110 --> 00:26:27,860 >> Printf, bland annat. 546 00:26:27,860 --> 00:26:31,540 cs50.h, vilket har få int och få strängen och så vidare, string.h, som 547 00:26:31,540 --> 00:26:32,570 hade Str Leng. 548 00:26:32,570 --> 00:26:34,800 Men det visar sig att det finns ännu en. 549 00:26:34,800 --> 00:26:38,540 Ärligt talat, det finns massor av header filer som deklarerar funktioner 550 00:26:38,540 --> 00:26:43,320 för bibliotek, men detta ctype.h är faktiskt kommer att vara något 551 00:26:43,320 --> 00:26:46,900 fördelaktigt eftersom jag ska att gå vidare och genomföra en 552 00:26:46,900 --> 00:26:48,120 andra program här. 553 00:26:48,120 --> 00:26:52,420 >> Låt mig gå vidare och öppna upp något Jag skrev i heter förväg 554 00:26:52,420 --> 00:26:55,750 capitalize.c, och låt oss ta en titt på hur det fungerar. 555 00:26:55,750 --> 00:27:00,340 Lägg märke till att jag använder, i denna version av den, tre välbekanta filer. 556 00:27:00,340 --> 00:27:04,110 Lägg märke till att i linje 18, jag är att få en rad med text. 557 00:27:04,110 --> 00:27:07,660 Meddelande i linje 21, jag hävdar att Följande kod kommer att 558 00:27:07,660 --> 00:27:12,170 kapitalisera s, oavsett användaren skrivit in, och hur gör jag det? 559 00:27:12,170 --> 00:27:13,300 Nåväl, jag tar - 560 00:27:13,300 --> 00:27:14,750 lärdom från förra gången - 561 00:27:14,750 --> 00:27:18,370 Jag förklarar i och n och iteration över tecken i strängen. 562 00:27:18,370 --> 00:27:22,720 Och vad är då detta block av kod i linje 24 genom 27 563 00:27:22,720 --> 00:27:24,550 gör i lekmannaspråk? 564 00:27:24,550 --> 00:27:27,766 565 00:27:27,766 --> 00:27:29,730 >> Liten bokstav tillbaka. 566 00:27:29,730 --> 00:27:30,430 >> Exakt. 567 00:27:30,430 --> 00:27:35,920 Om s fäste i - så om det i: te karaktären av s, som är en specifik 568 00:27:35,920 --> 00:27:40,220 char i strängen, är större än eller lika med små bokstäver en och - 569 00:27:40,220 --> 00:27:42,670 minns att dubbla ampersand betyder och - 570 00:27:42,670 --> 00:27:46,810 och samma karaktär, s fäste i, är mindre än eller lika till gemener z, 571 00:27:46,810 --> 00:27:50,600 det betyder att det är ett a eller ett b eller c eller dot, dot, dot, eller ett z, vilket innebär 572 00:27:50,600 --> 00:27:51,340 det är gemener. 573 00:27:51,340 --> 00:27:52,900 Vad vill jag göra i så fall? 574 00:27:52,900 --> 00:27:55,010 Tja, kan jag göra detta något kryptiskt, men 575 00:27:55,010 --> 00:27:56,160 Låt oss reta detta isär. 576 00:27:56,160 --> 00:28:00,210 >> Jag ska ringa printf skriver% c eftersom jag vill skriva ut detta 577 00:28:00,210 --> 00:28:01,580 tecken på skärmen. 578 00:28:01,580 --> 00:28:06,650 Jag sedan kommer att ta s fäste i, den i: te tecknet i s, och varför 579 00:28:06,650 --> 00:28:12,330 gör jag detta lilla trick här, gemener ett minus kapital A? 580 00:28:12,330 --> 00:28:16,352 Vad är det som kommer att ge mig, generellt sett? 581 00:28:16,352 --> 00:28:18,600 >> [OHÖRBAR]. 582 00:28:18,600 --> 00:28:19,390 >> Exakt. 583 00:28:19,390 --> 00:28:20,860 Jag kommer inte riktigt ihåg - 584 00:28:20,860 --> 00:28:24,390 det var 65 för kapital A. Jag vet inte riktigt ihåg vad gemener en är, 585 00:28:24,390 --> 00:28:25,540 men oavsett. 586 00:28:25,540 --> 00:28:26,580 Datorn vet. 587 00:28:26,580 --> 00:28:30,380 Så genom att säga, gemener ett minus huvudstad A, är det konstigt att vara 588 00:28:30,380 --> 00:28:33,530 subtrahera en röding från varandra, men vad är tecken under huven? 589 00:28:33,530 --> 00:28:34,520 De är bara siffror. 590 00:28:34,520 --> 00:28:36,980 Så oavsett vad dessa siffror är, låta datorn komma ihåg det 591 00:28:36,980 --> 00:28:38,240 snarare än mig människa. 592 00:28:38,240 --> 00:28:41,710 >> Så små bokstäver ett minus kapital A är kommer att ge mig en skillnad. 593 00:28:41,710 --> 00:28:45,370 Det råkar vara 32, och det skulle vara fallet för gement b och kapital B 594 00:28:45,370 --> 00:28:45,930 och så vidare. 595 00:28:45,930 --> 00:28:47,710 Det stannar konsekvent, tack och lov. 596 00:28:47,710 --> 00:28:51,930 Så jag i huvudsak menar, ta liten bokstav, subtrahera bort det 597 00:28:51,930 --> 00:28:55,340 standard skillnad, och att effektivt förändringar s fäste i från 598 00:28:55,340 --> 00:28:59,400 gemener till, naturligtvis, versaler, utan att jag verkligen tänka 599 00:28:59,400 --> 00:29:03,040 om eller komma ihåg, vad var de siffror vi pratade om när åtta 600 00:29:03,040 --> 00:29:04,800 volontärer kom upp på scenen? 601 00:29:04,800 --> 00:29:08,800 Nu under tiden, i annars, om det inte en liten bokstav bestämd 602 00:29:08,800 --> 00:29:10,400 av linje 24, bara skriva ut den. 603 00:29:10,400 --> 00:29:12,590 Jag vill bara beröra tecken som var 604 00:29:12,590 --> 00:29:14,410 faktiskt ursprungligen gemener. 605 00:29:14,410 --> 00:29:15,150 >> Så låt oss se detta. 606 00:29:15,150 --> 00:29:17,400 Gör nytta. 607 00:29:17,400 --> 00:29:18,470 Sammanställt, OK. 608 00:29:18,470 --> 00:29:19,730 . / Nytta. 609 00:29:19,730 --> 00:29:23,530 Och låt mig skriva i H-E-L-L-O med gemener, Enter. 610 00:29:23,530 --> 00:29:26,370 Och märker att det omvandlas i versaler. 611 00:29:26,370 --> 00:29:27,940 Låt mig göra det här igen med ett annat ord. 612 00:29:27,940 --> 00:29:32,720 Vad sägs om D-A-V-I-D med den första D aktiveras som ett namn är typiskt? 613 00:29:32,720 --> 00:29:33,560 Enter. 614 00:29:33,560 --> 00:29:34,870 Lägg märke till att det är fortfarande korrekt. 615 00:29:34,870 --> 00:29:40,250 Det matas bara det första D oförändrad via det konstruera annat. 616 00:29:40,250 --> 00:29:42,170 >> Så kom ihåg, då en par saker här. 617 00:29:42,170 --> 00:29:45,060 En, om du någonsin vill se två förhållandena på en gång, kan du och dem 618 00:29:45,060 --> 00:29:46,500 tillsammans som vi förutspådde. 619 00:29:46,500 --> 00:29:49,900 Du kan jämföra tecken på detta sätt och effektivt behandla tecken som 620 00:29:49,900 --> 00:29:53,050 siffror, men ärligt talat, är det så jävla kryptiskt Jag kommer aldrig att komma ihåg 621 00:29:53,050 --> 00:29:56,510 hur att komma med detta från grunden utan motivering igenom det ganska 622 00:29:56,510 --> 00:29:57,140 lite tid. 623 00:29:57,140 --> 00:30:00,590 >> Skulle det inte ha varit trevligt om någon därute skrev en funktion som kallas är 624 00:30:00,590 --> 00:30:05,390 sänka som kunde svara för mig sant eller falskt, är detta tecken gemener? 625 00:30:05,390 --> 00:30:09,350 Jo tack och lov, den som skrev ctype.h gjorde precis det. 626 00:30:09,350 --> 00:30:15,540 Låt mig gå upp hit och lägga ctyp för c typer, och nu vill jag gå ner hit och 627 00:30:15,540 --> 00:30:18,820 skriva denna linje enligt följande. 628 00:30:18,820 --> 00:30:27,510 >> Så om det kallas är lägre, jag hävdar, s fäste jag, då ska jag ta bort 629 00:30:27,510 --> 00:30:29,400 dessa två linjer helt och hållet. 630 00:30:29,400 --> 00:30:32,570 Så nu någon annan, jag hoppas, skrev en funktion som kallas är lägre, och det 631 00:30:32,570 --> 00:30:36,250 Visar sig de gjorde och de förklarade det inne i ctype.h. 632 00:30:36,250 --> 00:30:39,480 Och nu ska jag lämna linjen 27 ensam, kommer jag att lämna linjen 31 633 00:30:39,480 --> 00:30:41,890 ensam, men märker hur mycket jag har skärpt min kod. 634 00:30:41,890 --> 00:30:42,690 Det är nu renare. 635 00:30:42,690 --> 00:30:47,250 Det är mindre svårt att titta igenom för nu funktionen för övrigt är 636 00:30:47,250 --> 00:30:50,080 så härligt heter det bara gör vad den säger. 637 00:30:50,080 --> 00:30:51,520 >> Så nu ska jag spara detta. 638 00:30:51,520 --> 00:30:52,930 Jag kommer att zooma ut. 639 00:30:52,930 --> 00:30:56,650 Och precis som i Scratch kan du ha Booleans, Booleska värden sant eller 640 00:30:56,650 --> 00:31:01,530 falskt, det är precis det som är sänka effektivt avkastning. 641 00:31:01,530 --> 00:31:02,960 Låt mig kompilera. 642 00:31:02,960 --> 00:31:04,500 Låt mig repris. 643 00:31:04,500 --> 00:31:07,350 Och nu ska vi prova det igen, H-E-L-L-O, Enter. 644 00:31:07,350 --> 00:31:07,970 Det är ganska bra. 645 00:31:07,970 --> 00:31:10,150 Och prova igen, se till att jag inte skruva upp något. 646 00:31:10,150 --> 00:31:11,670 Det aktiveras också. 647 00:31:11,670 --> 00:31:14,190 >> Men detta är inte bra nog, eftersom annan sak som jag aldrig tänker 648 00:31:14,190 --> 00:31:19,090 minns inte jag arbeta igenom det verkligen noga på, säg, är papper 649 00:31:19,090 --> 00:31:19,920 denna jävla linje. 650 00:31:19,920 --> 00:31:23,450 Skulle det inte vara trevligt om det fanns en funktion som kallas för övre? 651 00:31:23,450 --> 00:31:26,930 Jo det visar sig att det är i ctype.h också. 652 00:31:26,930 --> 00:31:30,150 Jag ska gå vidare och skriva - 653 00:31:30,150 --> 00:31:31,340 låt mig ta den linjen tillbaka. 654 00:31:31,340 --> 00:31:36,430 Istället för det här, låt mig gå vidare och säga, ersätta den% C 655 00:31:36,430 --> 00:31:42,110 resultat av att kalla denna funktion övre på den i: te karaktär s. 656 00:31:42,110 --> 00:31:45,430 Och nu märker det blir lite balanserad. 657 00:31:45,430 --> 00:31:48,870 Jag måste hålla reda på hur många parentes har jag öppnat och stängt. 658 00:31:48,870 --> 00:31:50,050 >> Så nu är det ännu renare. 659 00:31:50,050 --> 00:31:53,460 Nu är detta program blir bättre och bättre utformade utan tvekan eftersom det är 660 00:31:53,460 --> 00:31:56,450 mycket, mycket mer läsbar men det låter inget stämmer. 661 00:31:56,450 --> 00:31:57,600 Gör nytta. 662 00:31:57,600 --> 00:31:58,930 . / Nytta. 663 00:31:58,930 --> 00:32:03,220 H-E-L-L-O. Låt oss köra den igen, D-A-V-I-D. OK, så vi är fortfarande i 664 00:32:03,220 --> 00:32:04,250 ganska bra form. 665 00:32:04,250 --> 00:32:06,030 >> Men nu till övre. 666 00:32:06,030 --> 00:32:09,720 Jag föreslår att det finns en mer förfining vi kunde göra som skulle vara 667 00:32:09,720 --> 00:32:12,820 riktigt nice, som verkligen skulle kunna dra upp den här koden och verkligen ge oss fem 668 00:32:12,820 --> 00:32:15,150 av fem för design, till exempel. 669 00:32:15,150 --> 00:32:16,510 Vad skulle vara trevligt att bli av med? 670 00:32:16,510 --> 00:32:20,770 Tja, titta hur jävla länge detta block av koden är bara att göra något enkelt. 671 00:32:20,770 --> 00:32:23,850 >> Nu som en åt sidan, som ni kanske har sett i super avsnitt detta tidigare 672 00:32:23,850 --> 00:32:27,570 helg, behöver du inte absolut behöver den Klammerparenteserna när du bara har en 673 00:32:27,570 --> 00:32:32,180 kodrad, trots att vi föreslog hålla dem så att det gör mycket 674 00:32:32,180 --> 00:32:36,190 mer tydliga, liksom i Scratch s U-formad block, vad som finns inne i grenen. 675 00:32:36,190 --> 00:32:40,170 Men skulle det inte vara trevligt om till övre, när det ges dess ingång, förvandlas det till 676 00:32:40,170 --> 00:32:44,730 versaler om det inte är, och vad som skulle vara underbart i det motsatta fallet om 677 00:32:44,730 --> 00:32:47,210 det är redan versaler? 678 00:32:47,210 --> 00:32:49,620 Bara för det genom och lämna den ensam. 679 00:32:49,620 --> 00:32:50,660 >> Så kanske det gör det. 680 00:32:50,660 --> 00:32:52,990 Jag kan försöka och hoppas bara att det gör, men låt mig 681 00:32:52,990 --> 00:32:54,450 införa en annan sak. 682 00:32:54,450 --> 00:32:57,440 Istället för att använda denna inbyggda terminal fönster här nere, minns att 683 00:32:57,440 --> 00:33:01,130 detta torg svart ikon ger dig en större terminalfönster som jag kan fullt 684 00:33:01,130 --> 00:33:02,260 skärmen om jag vill? 685 00:33:02,260 --> 00:33:05,820 Så visar det sig att de är slags märkligt heter, men det finns dessa saker som kallas 686 00:33:05,820 --> 00:33:10,970 man-sidor, manuella sidor, man för kort, och jag kan komma åt dessa genom 687 00:33:10,970 --> 00:33:14,515 skriver man - 688 00:33:14,515 --> 00:33:15,570 vad jag vill skriva? 689 00:33:15,570 --> 00:33:17,830 Man till övre. 690 00:33:17,830 --> 00:33:21,090 >> Och nu märker om det finns en fungera datorns insida, i 691 00:33:21,090 --> 00:33:23,970 detta fall apparaten, som är bara operativsystemet Linux, det kommer 692 00:33:23,970 --> 00:33:27,920 ge mig ett något kryptiskt uppsättning utgång, men du hittar över tiden som 693 00:33:27,920 --> 00:33:31,720 det alltid är formaterad ganska mycket samma så du börjar vänja sig. 694 00:33:31,720 --> 00:33:35,130 Lägg märke upptill till övre och tydligen är det samma dokumentation 695 00:33:35,130 --> 00:33:35,680 för att sänka. 696 00:33:35,680 --> 00:33:38,740 Den som skrev det var att klippa några hörn och sätta allt på en sida. 697 00:33:38,740 --> 00:33:40,720 Dessa saker "syftet i livet är att omvandla en 698 00:33:40,720 --> 00:33:42,780 brev till övre eller gemener. 699 00:33:42,780 --> 00:33:46,290 >> Observera att enligt Synopsis, mannen sidan lär mig vilken fil jag har 700 00:33:46,290 --> 00:33:48,130 att inkludera att använda denna sak. 701 00:33:48,130 --> 00:33:51,320 Det ger mig signaturerna för dessa funktioner, båda av dem, även 702 00:33:51,320 --> 00:33:53,510 även om vi just nu bara bryr sig om en. 703 00:33:53,510 --> 00:33:54,730 Här är nu en beskrivning. 704 00:33:54,730 --> 00:33:58,800 Till övre omvandlar bokstaven c till versaler om möjligt. 705 00:33:58,800 --> 00:34:02,280 >> Fortfarande inte så lärorikt, men låt mig nu titta under returvärde, saken 706 00:34:02,280 --> 00:34:03,520 som har lämnas tillbaka. 707 00:34:03,520 --> 00:34:08,600 Så det returnerade värdet är det som konverterade bokstav eller c om 708 00:34:08,600 --> 00:34:09,870 konvertering inte var möjligt. 709 00:34:09,870 --> 00:34:11,202 Vad är c? 710 00:34:11,202 --> 00:34:12,560 >> Den ursprungliga karaktären. 711 00:34:12,560 --> 00:34:15,370 >> Den ursprungliga karaktär och vi vet att genom att, återigen, gå upp till 712 00:34:15,370 --> 00:34:19,179 synopsis, och den som skrev detta funktion just beslutat att ingången 713 00:34:19,179 --> 00:34:22,909 till att övre och nedre är bara godtyckligt kommer att kallas c.. 714 00:34:22,909 --> 00:34:24,909 De kunde ha kallat det mest något de vill, men de höll det 715 00:34:24,909 --> 00:34:26,270 enkelt som c. 716 00:34:26,270 --> 00:34:27,880 Så jag har hört mannen sidan. 717 00:34:27,880 --> 00:34:31,870 Denna mening lugnar mig att om det är inte en liten bokstav, det är 718 00:34:31,870 --> 00:34:34,969 kommer att bara ge mig tillbaka c, vilket är perfekt, vilket betyder att jag kan bli av 719 00:34:34,969 --> 00:34:36,199 min annanstans skick. 720 00:34:36,199 --> 00:34:39,679 >> Så låt mig gå tillbaka till gedit, och nu vill jag bara göra det här. 721 00:34:39,679 --> 00:34:41,960 Jag kommer att kopiera min printf uttalande. 722 00:34:41,960 --> 00:34:45,969 Jag ska gå vidare och höger innanför för loop utskrift som ut, och få 723 00:34:45,969 --> 00:34:48,760 bli av nu denna helhet om konstruktion. 724 00:34:48,760 --> 00:34:51,860 Var inte en dålig idé, och det var mycket mycket korrekt och konsekvent med 725 00:34:51,860 --> 00:34:54,100 allt vi har predikat, men bara inte nödvändigt. 726 00:34:54,100 --> 00:34:57,070 Så fort du inser att vissa bibliotek Funktionen finns att någon annan 727 00:34:57,070 --> 00:35:01,340 skrev, eller kanske du skrev någon annanstans i filen, kan du använda det och verkligen 728 00:35:01,340 --> 00:35:02,690 börja strama upp koden. 729 00:35:02,690 --> 00:35:06,080 >> Och när jag säger saker som god stil, det faktum att denna person kallas 730 00:35:06,080 --> 00:35:11,490 fungera till övre, eller tidigare är lägre är fantastiskt användbart eftersom 731 00:35:11,490 --> 00:35:12,900 de är mycket beskrivande. 732 00:35:12,900 --> 00:35:16,120 Du vill inte att ringa dina uppgifter x och y och z, som har 733 00:35:16,120 --> 00:35:19,620 mycket, mycket mindre betydelse. 734 00:35:19,620 --> 00:35:25,160 Eventuella frågor om denna serie av förbättringar? 735 00:35:25,160 --> 00:35:28,010 >> Så det räcker att säga en av de hämtställen är även som ditt eget problem 736 00:35:28,010 --> 00:35:30,960 set - kanske problemet set en, men säkerligen P satt två och framåt, även 737 00:35:30,960 --> 00:35:34,380 när de är riktiga inte nödvändigtvis menar att de är perfekta precis 738 00:35:34,380 --> 00:35:36,155 ännu eller särskilt väl utformade. 739 00:35:36,155 --> 00:35:38,420 Det är den andra axeln till börja tänka. 740 00:35:38,420 --> 00:35:41,730 Så detta var en sträng inne i din datorns minne, men om du har en 741 00:35:41,730 --> 00:35:46,180 massa tecken som H-E-L-L-O insidan av RAM, och antag 742 00:35:46,180 --> 00:35:51,330 att du i ditt program ringa hämta sträng flera gånger så att du 743 00:35:51,330 --> 00:35:54,200 ring får strängen gång, då du ring får strängen igen. 744 00:35:54,200 --> 00:35:55,880 Tja, vad som händer med ske över tiden? 745 00:35:55,880 --> 00:35:59,170 >> Med andra ord, om du har en rad av kod, om än ur sitt sammanhang, liksom 746 00:35:59,170 --> 00:36:02,120 string s blir - 747 00:36:02,120 --> 00:36:02,960 Låt oss göra detta. 748 00:36:02,960 --> 00:36:05,270 String namn är lika få strängen. 749 00:36:05,270 --> 00:36:08,590 Så antar att kodrad menas att fråga användaren om hans eller hennes namn. 750 00:36:08,590 --> 00:36:14,580 Denna nästa kodrad är tänkt att fråga användaren för hans eller hennes skola, och 751 00:36:14,580 --> 00:36:15,920 denna nästa rad, och så vidare. 752 00:36:15,920 --> 00:36:18,150 Antag att vi frågar användaren för en annan och 753 00:36:18,150 --> 00:36:19,750 annan och en annan sträng. 754 00:36:19,750 --> 00:36:22,390 De kommer att stanna i minnet på samma gång. 755 00:36:22,390 --> 00:36:24,280 Man kommer inte att clobber den andra. 756 00:36:24,280 --> 00:36:26,420 Skolan skriver inte den andra. 757 00:36:26,420 --> 00:36:28,520 Men var gör de alla hamna i minnet? 758 00:36:28,520 --> 00:36:32,030 >> Tja, om vi börjar att rita på skärmen, som vi kan använda denna sak 759 00:36:32,030 --> 00:36:35,800 här som en tavla, om detta svarta rektangel representerar datorns 760 00:36:35,800 --> 00:36:39,800 minne, kommer jag att godtyckligt starta dela upp den i små fyrkanter, 761 00:36:39,800 --> 00:36:42,120 var och en representerar en byte med minne. 762 00:36:42,120 --> 00:36:46,560 Ärligt talat, om du har en gigabyte RAM dessa dagar, har du en miljard byte 763 00:36:46,560 --> 00:36:49,540 minne i datorn, så en miljard av dessa rutor. 764 00:36:49,540 --> 00:36:52,110 Så det räcker att säga, detta är egentligen inte i skala. 765 00:36:52,110 --> 00:36:58,250 >> Men vi kunde hålla rita alla dessa uppenbarligen inte skalenliga kvadrater, och detta 766 00:36:58,250 --> 00:37:01,260 kollektivt representerar min dators minne. 767 00:37:01,260 --> 00:37:03,136 Nu ska vi bara ska göra prick, prick, prick. 768 00:37:03,136 --> 00:37:06,260 Så med andra ord, när jag frågar nu användare med hämta sträng för att ge mig en 769 00:37:06,260 --> 00:37:07,350 sträng, vad händer? 770 00:37:07,350 --> 00:37:14,270 Om användaren skriver i "hej", som slutar upp i H-E-L-L-O. Men anta att 771 00:37:14,270 --> 00:37:15,720 Användaren skriver sedan in - 772 00:37:15,720 --> 00:37:17,250 Egentligen borde jag inte ha gjort hej eftersom vi ber 773 00:37:17,250 --> 00:37:18,330 dem för deras namn. 774 00:37:18,330 --> 00:37:20,580 Så låt oss gå tillbaka om jag kan göra det här. 775 00:37:20,580 --> 00:37:26,130 >> Så om jag skriver D-A-V-I-D för mitt namn, men minns att den andra raden 776 00:37:26,130 --> 00:37:29,220 koden får strängen igen att få sin skola. 777 00:37:29,220 --> 00:37:32,090 Där är det ord som användaren avfallsslag i kommer att gå nästa? 778 00:37:32,090 --> 00:37:38,290 Tja, kanske det kommer att gå in i H-A-R-V-A-R-D. Så trots att jag har 779 00:37:38,290 --> 00:37:41,560 dras det som två rader, är detta bara en hel massa byte i din 780 00:37:41,560 --> 00:37:42,710 datorns RAM-minne. 781 00:37:42,710 --> 00:37:46,560 Det finns ett problem nu för nu om jag med RAM i detta mycket rimliga 782 00:37:46,560 --> 00:37:49,910 men slags naivt sätt, vad kan du uppenbarligen inte skilja? 783 00:37:49,910 --> 00:37:52,640 784 00:37:52,640 --> 00:37:54,680 När man börjar och där ena ändar, eller hur? 785 00:37:54,680 --> 00:37:55,860 De är typ av oskärpa tillsammans. 786 00:37:55,860 --> 00:37:57,920 >> Så visar det sig datorn gör inte detta. 787 00:37:57,920 --> 00:38:04,720 Låt mig rulla faktiskt tillbaka i tiden få tecken, och i stället för Harvard 788 00:38:04,720 --> 00:38:09,570 går omedelbart efter användarens namn, användaren får faktiskt, bakom 789 00:38:09,570 --> 00:38:12,000 kulisserna, en speciell karaktär införd genom 790 00:38:12,000 --> 00:38:13,885 dator för honom eller henne. 791 00:38:13,885 --> 00:38:19,470 / 0, annars känd som NUL-tecken annoyingly kallas N-U-L, inte 792 00:38:19,470 --> 00:38:22,190 N-U-L-L, men du skriver det som / 0. 793 00:38:22,190 --> 00:38:27,130 Det är bara alla nollbitar är en markör i mellan det första ordet som användarens 794 00:38:27,130 --> 00:38:28,290 skrivit och den andra. 795 00:38:28,290 --> 00:38:33,020 >> Så Harvard faktiskt nu hamnar eftersom detta teckensekvens 796 00:38:33,020 --> 00:38:36,110 och en mer / 0. 797 00:38:36,110 --> 00:38:41,690 Så med andra ord, genom att ha dessa sentinel värden, åtta sammanhängande noll 798 00:38:41,690 --> 00:38:45,220 bitar, kan du börja nu att skilja ett tecken från en annan. 799 00:38:45,220 --> 00:38:49,720 Så all denna tid vad "hej" är faktiskt "hej" med en / 0, och 800 00:38:49,720 --> 00:38:53,580 under tiden, det kan mycket väl vara ganska lite mer RAM-minne 801 00:38:53,580 --> 00:38:56,400 inuti datorn. 802 00:38:56,400 --> 00:38:57,810 >> Låt mig göra en sak nu. 803 00:38:57,810 --> 00:39:01,800 Det visar sig att alla dessa rutor vi har dragit, de är, ja, 804 00:39:01,800 --> 00:39:06,140 strängar, men mer generellt, dessa saker är matriser. 805 00:39:06,140 --> 00:39:10,590 En array är bara en bit av minnet det är rygg mot rygg mot rygg mot rygg, 806 00:39:10,590 --> 00:39:15,130 och du brukar använda en array genom av denna hakparentes notation. 807 00:39:15,130 --> 00:39:18,210 Så vi kommer att se dem en hel över tiden, men låt mig gå vidare och 808 00:39:18,210 --> 00:39:21,160 öppna upp, låt oss kalla det åldrar. 809 00:39:21,160 --> 00:39:23,920 Och märker vad vi kan göra med dessa samma trick, lite 810 00:39:23,920 --> 00:39:25,750 lite mer syntax här. 811 00:39:25,750 --> 00:39:29,270 >> Så i linje 17 i detta program - faktiskt, låt mig köra programmet först 812 00:39:29,270 --> 00:39:30,770 så att vi kan se vad den här saken gör. 813 00:39:30,770 --> 00:39:33,530 Låt mig kalla göra åldrar att kompilera programmet. 814 00:39:33,530 --> 00:39:34,950 . / Åldrar. 815 00:39:34,950 --> 00:39:36,480 Hur många människor är i rummet? 816 00:39:36,480 --> 00:39:38,020 Kalla det tre. 817 00:39:38,020 --> 00:39:39,575 Ålder på den första personen? 818 00:39:39,575 --> 00:39:42,710 18, 19, och 20. 819 00:39:42,710 --> 00:39:46,770 Och nu något löjligt, bara jag har gjort ett program som åldrar dem 820 00:39:46,770 --> 00:39:47,740 tre personer. 821 00:39:47,740 --> 00:39:50,390 >> Så det finns helt klart en möjlighet för lite kul aritmetiska här. 822 00:39:50,390 --> 00:39:51,560 Tack och lov är det matte korrekt. 823 00:39:51,560 --> 00:39:54,720 18 gick till 19, 19 gick till 20 och så vidare. 824 00:39:54,720 --> 00:39:58,510 Men vad som verkligen tänkt att vara belysande här är hur vi lagrar 825 00:39:58,510 --> 00:40:00,190 dessa tre människors åldrar. 826 00:40:00,190 --> 00:40:02,370 Låt mig zooma in på vad som finns pågår här. 827 00:40:02,370 --> 00:40:06,240 >> Så först, dessa första raderna bör att få ganska bekant. 828 00:40:06,240 --> 00:40:08,770 Jag bara uppmanar användaren för Antalet personer i rummet. 829 00:40:08,770 --> 00:40:11,490 Då jag använder få int och gör samtidigt att göra det igen och igen och igen. 830 00:40:11,490 --> 00:40:15,780 Vi har sett detta mönster tidigare, men linje 27 är ny och faktiskt ganska 831 00:40:15,780 --> 00:40:18,160 användbart kommer och bli allt mer användbara. 832 00:40:18,160 --> 00:40:21,620 Lägg märke till att det som är annorlunda i linje 27 är att jag verkar vara att förklara en 833 00:40:21,620 --> 00:40:23,960 int kallas åldrar, men vänta. 834 00:40:23,960 --> 00:40:27,140 Det är inte bara int åldrar. 835 00:40:27,140 --> 00:40:30,130 Det finns dessa hakparenteser, inuti vilken är n. 836 00:40:30,130 --> 00:40:35,150 >> Så fästet n i detta sammanhang, inte insidan av en printf uttalande här men 837 00:40:35,150 --> 00:40:44,370 i denna enda linje 27, är denna linje säger, ge mig n ints, vilka var 838 00:40:44,370 --> 00:40:46,080 är av typen int. 839 00:40:46,080 --> 00:40:49,870 Så detta är en hink, så att säga, av, i det här fallet, tre heltal tillbaka till 840 00:40:49,870 --> 00:40:52,770 rygg mot rygg så att jag effektivt har tre variabler. 841 00:40:52,770 --> 00:40:54,890 Alternativet, att vara klart, skulle vara så här. 842 00:40:54,890 --> 00:40:57,400 >> Om jag ville ha den första studentens ålder, kan jag göra det här. 843 00:40:57,400 --> 00:40:59,520 Om jag ville ha den andra studentens ålder jag kan göra det här. 844 00:40:59,520 --> 00:41:01,860 Om jag ville ha den tredje studentens ålder, kan jag göra det här. 845 00:41:01,860 --> 00:41:04,320 Och gud förbjude att vi behöver allas ålder i det här rummet - 846 00:41:04,320 --> 00:41:07,670 Jag menar, detta är en fan av mycket av exemplar, klistra igen och igen och igen. 847 00:41:07,670 --> 00:41:10,870 Och plus när jag kompilera detta program, Om en annan elev går in över ut 848 00:41:10,870 --> 00:41:14,200 att dörren, nu mitt nummer variabler är felaktig. 849 00:41:14,200 --> 00:41:17,450 >> Så vad är trevligt om en array är som snart du börjar känna dig själv 850 00:41:17,450 --> 00:41:20,190 kopiera och klistra in, oddsen är att det är inte den bästa metoden. 851 00:41:20,190 --> 00:41:22,240 En array är dynamisk potentiellt. 852 00:41:22,240 --> 00:41:24,610 Jag vet inte i förväg hur många människor kommer att vara i rummet, 853 00:41:24,610 --> 00:41:28,670 men jag vet att jag behöver n av dem, och jag ska räkna ut n när det är dags. 854 00:41:28,670 --> 00:41:35,500 Denna kodrad nu betyder, ge mig en bit av minnet som ser ut så här 855 00:41:35,500 --> 00:41:40,380 där antalet rutor på skärmen är helt beroende av n som 856 00:41:40,380 --> 00:41:42,010 användaren skrivit i. 857 00:41:42,010 --> 00:41:44,850 >> Så nu resten av detta program är faktiskt ganska lik vad vi 858 00:41:44,850 --> 00:41:46,860 precis gjorde med tecken. 859 00:41:46,860 --> 00:41:49,970 Märker jag har en for-loop med början på rad 30. 860 00:41:49,970 --> 00:41:54,920 Så direkt efter jag får arrayen, jag upprepa från y är lika med noll på upp till n. 861 00:41:54,920 --> 00:41:58,890 Jag har just denna lärorika printf Meddelandet säger bara, ge mig en ålder 862 00:41:58,890 --> 00:42:03,690 person #% i, så nummer ett, nummer två, nummer tre. 863 00:42:03,690 --> 00:42:04,730 Och varför gjorde jag det? 864 00:42:04,730 --> 00:42:08,870 Ärligt talat, människor föredrar att räkna från ett på upp medan datavetare, 865 00:42:08,870 --> 00:42:09,620 noll på upp. 866 00:42:09,620 --> 00:42:11,700 datavetare kommer inte att använda denna typ av program, så vi är 867 00:42:11,700 --> 00:42:13,990 ska bara börja räkna på en som normala människor. 868 00:42:13,990 --> 00:42:17,630 >> Och nu i linje 33, märker något annan bit av syntaxen. 869 00:42:17,630 --> 00:42:23,710 Den i: te ålder i denna variabel av typen array kommer att få en int. 870 00:42:23,710 --> 00:42:25,770 Och nu slutligen, är detta bara aritmetiska här nere. 871 00:42:25,770 --> 00:42:29,200 Jag bestämde i en separat slinga för att hävda viss tid passerar, och nu i detta 872 00:42:29,200 --> 00:42:31,400 separat slinga, dessa rader exekvera. 873 00:42:31,400 --> 00:42:35,810 >> Ett år från nu, personen jag kommer att vara i år gammal, men märker det inte är 874 00:42:35,810 --> 00:42:36,500 variabeln i.. 875 00:42:36,500 --> 00:42:38,390 Detta är nu% i för int. 876 00:42:38,390 --> 00:42:43,210 Och meddelandet som första platshållare, jag plug in i plus 1, så vi räknar som en 877 00:42:43,210 --> 00:42:44,250 normal person. 878 00:42:44,250 --> 00:42:49,190 Och sedan för värdet av deras ålder, för jag år gammal, jag tar evigheter fäste 879 00:42:49,190 --> 00:42:52,980 Jag - och varför gör jag plus en här? 880 00:42:52,980 --> 00:42:53,760 De åldriga precis. 881 00:42:53,760 --> 00:42:55,030 Det är min dumma val av program. 882 00:42:55,030 --> 00:42:56,810 De åldriga precis ett år. 883 00:42:56,810 --> 00:42:59,770 Jag kunde skriva in valfritt antal som Jag vill verkligen det. 884 00:42:59,770 --> 00:43:02,430 >> Så vad är egentligen alla relevans här? 885 00:43:02,430 --> 00:43:07,610 Nåväl, låt mig faktiskt rulla tillbaka hit och måla en bild 886 00:43:07,610 --> 00:43:10,830 om vad som väntar. 887 00:43:10,830 --> 00:43:15,720 Vad vi ska göra med vår nästa Problem Set Two är plaska i 888 00:43:15,720 --> 00:43:17,070 värld av kryptografi. 889 00:43:17,070 --> 00:43:22,500 Så detta är en sträng av tecken, så en sekvens av flera tecken, och vad 890 00:43:22,500 --> 00:43:23,750 säger detta? 891 00:43:23,750 --> 00:43:28,530 892 00:43:28,530 --> 00:43:30,600 Det är inte i den online-version av bilderna. 893 00:43:30,600 --> 00:43:35,880 >> Så jag hävdar att detta är lika med detta, en dum annons från många år 894 00:43:35,880 --> 00:43:39,950 sedan som faktiskt kan erinra en av dess ursprung. 895 00:43:39,950 --> 00:43:42,740 Så detta är ett exempel på kryptering eller kryptografi. 896 00:43:42,740 --> 00:43:46,150 Det visar sig att om man vill faktiskt skicka information eller dela 897 00:43:46,150 --> 00:43:49,310 information med någon ordentligt, som ett budskap som detta, kan du 898 00:43:49,310 --> 00:43:50,500 förvränga bokstäverna. 899 00:43:50,500 --> 00:43:53,170 Men typiskt, orden är inte oordning slumpmässigt. 900 00:43:53,170 --> 00:43:56,365 De är permuteras på något sätt eller ändrats på något sätt så att - OJ. 901 00:43:56,365 --> 00:43:59,040 Det är en rolig spoiler för nästa gång. 902 00:43:59,040 --> 00:44:04,390 >> Så du kan mappa det är tydligen O till B. Observera att linjerna upp 903 00:44:04,390 --> 00:44:05,420 kapitalisering-wise. 904 00:44:05,420 --> 00:44:07,960 Tydligen blir r e. 905 00:44:07,960 --> 00:44:14,000 Tydligen F-H-E-R blir S-U-R-E. Så Det visar sig att det finns en kartläggning, och i 906 00:44:14,000 --> 00:44:18,720 detta fall finns det en ganska dum kartläggning om någon har räknat ut det? 907 00:44:18,720 --> 00:44:21,440 Detta är något som kallas Rot 13, Rotera 13. 908 00:44:21,440 --> 00:44:24,760 Det är den dummaste av kryptering mekanismer eftersom det bokstavligen bara 909 00:44:24,760 --> 00:44:29,160 adderar 13 till var och en av bokstäverna, dum i den meningen att om man bara 910 00:44:29,160 --> 00:44:31,890 har lite ledig tid på dina händer och en penna, eller du tycker bara det 911 00:44:31,890 --> 00:44:35,260 igenom i ditt huvud, du kan försöka alla möjliga tillägg - ett, två, 912 00:44:35,260 --> 00:44:38,470 tre, dot, dot, dot, 25 till strax rotera hela alfabetet, och 913 00:44:38,470 --> 00:44:40,860 Så småningom kommer du räkna ut Vad meddelandet är. 914 00:44:40,860 --> 00:44:43,700 Så om du gjorde något liknande i grundskola skicka meddelanden till din 915 00:44:43,700 --> 00:44:46,830 bästa vän, om din grundskolan Läraren läser helt enkelt genom 916 00:44:46,830 --> 00:44:50,320 meddelandet och brute tvingade lösningen, du kanske har fått 917 00:44:50,320 --> 00:44:52,550 ett svar av det. 918 00:44:52,550 --> 00:44:54,970 >> Nu naturligtvis, i den verkliga världen, kryptografi är mer sofistikerad. 919 00:44:54,970 --> 00:45:00,120 Detta är ett utdrag av text från en datorsystem som har användarnamn och 920 00:45:00,120 --> 00:45:03,630 lösenord, som nästan alla av oss gör, och detta är vad ditt lösenord kanske 921 00:45:03,630 --> 00:45:07,260 se ut om de lagras på din hårddisk köra men i krypterad form. 922 00:45:07,260 --> 00:45:11,050 Detta är inte bara en vridning av bokstäver, A är B och B är C. Detta är 923 00:45:11,050 --> 00:45:15,620 mycket mer sofistikerade, men den använder vad brukar kallas hemlig nyckel 924 00:45:15,620 --> 00:45:16,690 kryptografi. 925 00:45:16,690 --> 00:45:20,210 Denna bild berättar följande berättelse med några ikoner. 926 00:45:20,210 --> 00:45:22,250 >> Till vänster har vi vad vi kallar vanlig text. 927 00:45:22,250 --> 00:45:25,420 I en värld av kryptografi, slätt text är bara det ursprungliga meddelandet 928 00:45:25,420 --> 00:45:29,050 skriven på engelska eller franska eller vilket språk som helst. 929 00:45:29,050 --> 00:45:32,405 Om du vill kryptera det, kommer vi att passera det bildmässigt genom ett hänglås, så 930 00:45:32,405 --> 00:45:35,580 några av typ av algoritm, någon funktion eller program som någon skrev 931 00:45:35,580 --> 00:45:39,880 som förvränger bokstäverna förhoppningsvis mer komplicerat än att bara lägga 13 932 00:45:39,880 --> 00:45:40,980 till var och en av dem. 933 00:45:40,980 --> 00:45:43,780 >> Vad du får ut av denna process i mitten finns kallas cyphertext. 934 00:45:43,780 --> 00:45:44,850 Så lite av en sexig ord. 935 00:45:44,850 --> 00:45:47,630 Det betyder bara att det är den krypterade version av vanlig text. 936 00:45:47,630 --> 00:45:52,570 Och bara om du har samma hemlighet, 13 eller minus 13, kan du 937 00:45:52,570 --> 00:45:54,970 dekryptera ett meddelande som. 938 00:45:54,970 --> 00:45:57,770 >> Så i Problem Set Two, bland de saker kommer du göra om i Hacker 939 00:45:57,770 --> 00:46:01,860 Edition, måste du skriva koden till knäcka dessa lösenord, räkna ut 940 00:46:01,860 --> 00:46:05,170 vad de var och hur de var krypterad, även om vi gör ger dig lite 941 00:46:05,170 --> 00:46:06,460 av vägledning på vägen. 942 00:46:06,460 --> 00:46:09,320 I Standard Edition, introducerar vi ett par av chiffer, kryptering 943 00:46:09,320 --> 00:46:12,400 mekanismer, som kallas en Caesar, en kallas Vigenère, som fortfarande 944 00:46:12,400 --> 00:46:16,100 roterande chiffer där A blir något, blir B något, men 945 00:46:16,100 --> 00:46:18,820 du måste göra det programmatiskt eftersom det kommer verkligen att bli en hemlighet 946 00:46:18,820 --> 00:46:22,840 nyckel inblandade som är vanligen ett antal eller ett sökord som enbart 947 00:46:22,840 --> 00:46:26,420 avsändaren och mottagaren av dessa meddelanden ska förstå. 948 00:46:26,420 --> 00:46:28,660 >> Nu har detta faktiskt inkarnationer i den verkliga världen. 949 00:46:28,660 --> 00:46:32,910 Detta, till exempel, är lite föräldralösa Annies hemliga dekoder ringen, och du 950 00:46:32,910 --> 00:46:35,180 kan faktiskt genomföra dessa roterande chiffer - 951 00:46:35,180 --> 00:46:37,930 A blir något, blir B något - med ett par hjul, 952 00:46:37,930 --> 00:46:40,840 en på utsidan, en på insidan så att om du vrider ratten eller 953 00:46:40,840 --> 00:46:44,170 ringen, kan du rada faktiskt upp bokstäver med olika bokstäver, 954 00:46:44,170 --> 00:46:45,430 få en hemlig kod. 955 00:46:45,430 --> 00:46:48,110 Och så den cliffhanger för idag, vad jag trodde jag skulle göra är lite av 956 00:46:48,110 --> 00:46:52,170 throwback att om du slår på TV den 24 december, kan du titta på 957 00:46:52,170 --> 00:46:55,390 filmannons nauseum för 24 timmar i sträck. 958 00:46:55,390 --> 00:47:06,030 Men för idag, jag ska öppna det här och ger oss bara två minuter av en 959 00:47:06,030 --> 00:47:13,493 pedagogiskt relevant Christmas Story med en liten grabb som heter Ralphie. 960 00:47:13,493 --> 00:47:14,400 >> [VIDEO SPELA] 961 00:47:14,400 --> 00:47:17,420 >> -Var det känt för alla och envar att Ralph Parker utnämns till 962 00:47:17,420 --> 00:47:20,650 medlem av Little Orphan Annie hemlighet cirkel och har rätt till alla 963 00:47:20,650 --> 00:47:23,460 heder och förmåner förekommande därtill. 964 00:47:23,460 --> 00:47:25,990 >> -Undertecknad, Little Orphan Annie. 965 00:47:25,990 --> 00:47:30,100 Kontrasignerade, Pierre Andre i bläck. 966 00:47:30,100 --> 00:47:34,270 Heder och förmåner som redan vid nio års ålder. 967 00:47:34,270 --> 00:47:39,440 >> [SKRIKER PÅ RADIO] 968 00:47:39,440 --> 00:47:40,770 >> Kom, låt oss gå vidare med det. 969 00:47:40,770 --> 00:47:44,965 Jag behöver inte all that jazz om smugglare och pirater. 970 00:47:44,965 --> 00:47:48,270 >> -Lyssna morgon kväll för avslutande äventyret i svart 971 00:47:48,270 --> 00:47:49,650 piratskepp. 972 00:47:49,650 --> 00:47:53,320 Nu är det dags för Annie hemlighet Meddelande till dig medlemmar 973 00:47:53,320 --> 00:47:55,720 av den hemliga cirkeln. 974 00:47:55,720 --> 00:47:56,580 Kom ihåg, barn. 975 00:47:56,580 --> 00:48:01,720 Endast medlemmar i Annies Secret Circle kan avkoda Annies hemliga budskap. 976 00:48:01,720 --> 00:48:05,872 Kom ihåg, är Annie beroende av dig. 977 00:48:05,872 --> 00:48:08,670 Ställ dina stift till B2. 978 00:48:08,670 --> 00:48:11,000 Här är meddelandet. 979 00:48:11,000 --> 00:48:12,335 12, 11, 2 - 980 00:48:12,335 --> 00:48:14,670 >> -Jag är i mitt första hemliga mötet. 981 00:48:14,670 --> 00:48:19,720 >> -25, 14, 11, 18, 16 - 982 00:48:19,720 --> 00:48:21,650 >> -Pierre var i stor röst ikväll. 983 00:48:21,650 --> 00:48:24,830 Jag kan tala om att kvällens budskap var verkligen viktigt. 984 00:48:24,830 --> 00:48:26,400 >> -3, 25. 985 00:48:26,400 --> 00:48:28,540 Det är ett budskap från Annie själv. 986 00:48:28,540 --> 00:48:30,086 Kom ihåg att inte berätta för någon. 987 00:48:30,086 --> 00:48:34,370 988 00:48:34,370 --> 00:48:38,710 >> -90 Sekunder senare, jag är i det enda rummet i huset där en pojke på nio 989 00:48:38,710 --> 00:48:42,668 kunde sitta i avskildhet och avkoda. 990 00:48:42,668 --> 00:48:47,628 Aha, gick B. I till nästa. 991 00:48:47,628 --> 00:48:53,060 E. Det första ordet är "att vara." S. Det skulle komma lättare nu. 992 00:48:53,060 --> 00:48:54,980 U. 25. 993 00:48:54,980 --> 00:48:55,940 Det är R. 994 00:48:55,940 --> 00:48:56,900 >> -Kom igen, Ralphie. 995 00:48:56,900 --> 00:48:57,860 Jag måste gå. 996 00:48:57,860 --> 00:48:59,780 >> -Jag är rätt ner, Ma. 997 00:48:59,780 --> 00:49:01,030 Gee vina. 998 00:49:01,030 --> 00:49:04,300 999 00:49:04,300 --> 00:49:08,220 >> -T. O. Var noga med att. 1000 00:49:08,220 --> 00:49:09,500 Var noga med vad? 1001 00:49:09,500 --> 00:49:11,660 Vad var Little Orphan Annie försöker säga? 1002 00:49:11,660 --> 00:49:12,844 Var noga med vad? 1003 00:49:12,844 --> 00:49:14,732 >> -Ralphie, har Randy fått gå. 1004 00:49:14,732 --> 00:49:16,148 Kan du komma ut? 1005 00:49:16,148 --> 00:49:17,092 >> -Okej, Ma. 1006 00:49:17,092 --> 00:49:18,510 Jag kommer strax. 1007 00:49:18,510 --> 00:49:20,270 >> -Jag kom närmare nu. 1008 00:49:20,270 --> 00:49:21,823 Spänningen var hemskt. 1009 00:49:21,823 --> 00:49:23,045 Vad var det? 1010 00:49:23,045 --> 00:49:26,510 Den planetens öde kan i vågskålen. 1011 00:49:26,510 --> 00:49:28,985 >> -Ralphie, Randys gotta go. 1012 00:49:28,985 --> 00:49:32,680 >> -Jag är rätt ut för crying out loud. 1013 00:49:32,680 --> 00:49:33,956 >> -Nästan där. 1014 00:49:33,956 --> 00:49:35,140 Mina fingrar flög. 1015 00:49:35,140 --> 00:49:36,880 Mitt sinne var en stål fälla. 1016 00:49:36,880 --> 00:49:38,010 Varje por vibrerade. 1017 00:49:38,010 --> 00:49:39,878 Det var nästan klart. 1018 00:49:39,878 --> 00:49:43,210 Ja, ja, ja, ja, ja. 1019 00:49:43,210 --> 00:49:49,030 >> -Glöm inte att dricka ditt Ovaltine. 1020 00:49:49,030 --> 00:49:50,280 Ovaltine? 1021 00:49:50,280 --> 00:49:53,980 1022 00:49:53,980 --> 00:49:55,230 En crummy kommersiell? 1023 00:49:55,230 --> 00:49:58,572 1024 00:49:58,572 --> 00:50:00,694 Son of a bitch. 1025 00:50:00,694 --> 00:50:01,900 >> [END VIDEOAVSPELNING] 1026 00:50:01,900 --> 00:50:04,260 >> SPEAKER 1: Detta är CS50, och att blir Problem Set Two. 1027 00:50:04,260 --> 00:50:06,305 Vi ses nästa vecka. 1028 00:50:06,305 --> 00:50:08,800 >> TALARE 2: Vid nästa CS50, detta händer. 1029 00:50:08,800 --> 00:50:11,060 >> Högtalare 1: Så ett ämne vi har inte tittat på hittills är 1030 00:50:11,060 --> 00:50:12,220 som funktionspekare. 1031 00:50:12,220 --> 00:50:14,540 Nu är en funktion pekare bara adressen till en offentlig 1032 00:50:14,540 --> 00:50:17,000 funktion, men likt - 1033 00:50:17,000 --> 00:50:18,250 son till en - 1034 00:50:18,250 --> 00:50:19,670