1 00:00:00,000 --> 00:00:00,980 2 00:00:00,980 --> 00:00:04,410 >> [MUSIK SPELA] 3 00:00:04,410 --> 00:00:11,147 4 00:00:11,147 --> 00:00:12,230 DAVID J. MALAN: Okej. 5 00:00:12,230 --> 00:00:16,440 Detta är CS50, och detta är slutet av vecka 2. 6 00:00:16,440 --> 00:00:18,480 Så idag, vi ska att fortsätta vår look 7 00:00:18,480 --> 00:00:21,150 hur vi representerar saker nedanför hood-- rör sig bort 8 00:00:21,150 --> 00:00:23,520 från nummer som heltal och flyttalsvärden 9 00:00:23,520 --> 00:00:26,810 och fokusera på strängar och i slutändan mer intressanta program. 10 00:00:26,810 --> 00:00:30,140 Men vi ska också ta en titt på en par av domänspecifika problems-- 11 00:00:30,140 --> 00:00:33,620 av vilka den första kommer att engagera kryptografi, 12 00:00:33,620 --> 00:00:36,570 konsten att förvränga informationen, där du ser ovan här 13 00:00:36,570 --> 00:00:41,480 är en bild av Radio Orphan Annies hemliga dekoder ringen från förr. 14 00:00:41,480 --> 00:00:46,490 >> Det är faktiskt mycket primitiv form och barnvänlig form av cryptopgraphy 15 00:00:46,490 --> 00:00:50,590 varvid denna ring har två disks-- en insida och en utsida. 16 00:00:50,590 --> 00:00:54,740 Och genom att rotera en av dem, du kan huvudsak rada upp brev som A 17 00:00:54,740 --> 00:00:59,520 till Z med andra bokstäver som B genom A. Med andra ord, 18 00:00:59,520 --> 00:01:03,730 Du kan bokstavligen rotera alfabetet, därmed komma med en kartläggning av 19 00:01:03,730 --> 00:01:07,820 brev till brev, så att, om du ville skicka ett hemligt meddelande 20 00:01:07,820 --> 00:01:11,820 till någon som Annie, kan du skriva ner ditt meddelande och vrid sedan 21 00:01:11,820 --> 00:01:15,370 bokstäverna, som innebär att om du menar att säga "A," du istället säga "B", 22 00:01:15,370 --> 00:01:17,280 du menar att säga "B", man istället säger "C" - 23 00:01:17,280 --> 00:01:20,240 eller något lite mer smart än att-- och sedan, slutligen, 24 00:01:20,240 --> 00:01:24,630 så länge som Annie har denna avkodare ring, hon kan avkoda meddelandet. 25 00:01:24,630 --> 00:01:28,540 Nu kanske ni minns, faktiskt, att det användes i en mycket berömd film som 26 00:01:28,540 --> 00:01:31,140 spelar ad nauseum under julen. 27 00:01:31,140 --> 00:01:32,650 Låt oss ta en titt här. 28 00:01:32,650 --> 00:01:35,294 29 00:01:35,294 --> 00:01:37,210 Ralphie PARKER: "Var det känd för alla i sammandrag 30 00:01:37,210 --> 00:01:41,000 att Ralph Parker utnämns medlem av Little Orphan Annie Secret 31 00:01:41,000 --> 00:01:44,860 Circle och har rätt till alla de heder och förmåner inträffar dessa. " 32 00:01:44,860 --> 00:01:47,410 >> Ralphie PARKER (narrating): Signerad Little Orphan Annie. 33 00:01:47,410 --> 00:01:50,070 Kontra, Pierre Andre! 34 00:01:50,070 --> 00:01:51,490 I bläck. 35 00:01:51,490 --> 00:01:55,494 Heder och förmåner, redan vid nio års ålder. 36 00:01:55,494 --> 00:01:57,402 >> [MUSIK SPELA] 37 00:01:57,402 --> 00:02:00,470 >> [RADIO prat] 38 00:02:00,470 --> 00:02:01,470 Ralphie PARKER: Kom igen. 39 00:02:01,470 --> 00:02:02,344 Låt oss gå vidare med det. 40 00:02:02,344 --> 00:02:06,029 Jag behöver inte all that jazz om smugglare och pirater. 41 00:02:06,029 --> 00:02:08,820 RADIO ANNOUNCER: Lyssna morgon natt för den avslutande äventyret 42 00:02:08,820 --> 00:02:11,060 The Black Pirate Ship. 43 00:02:11,060 --> 00:02:14,740 Nu är det dags för Annies Secret Message för dig medlemmar 44 00:02:14,740 --> 00:02:17,110 av Secret Circle. 45 00:02:17,110 --> 00:02:20,700 Minns ungar, endast medlemmar av Annies Secret Circle 46 00:02:20,700 --> 00:02:23,270 kan avkoda Annies hemligt meddelande. 47 00:02:23,270 --> 00:02:27,270 >> Kom ihåg, är Annie beroende av dig. 48 00:02:27,270 --> 00:02:30,060 Ställ dina pins till B-2. 49 00:02:30,060 --> 00:02:34,004 Här är Message-- 12, 11, 2-- 50 00:02:34,004 --> 00:02:36,503 Ralphie PARKER (berätta): I är i mitt första hemliga mötet. 51 00:02:36,503 --> 00:02:40,041 RADIO ANNOUNCER: --25, 14, 11, 18, 16-- 52 00:02:40,041 --> 00:02:42,790 Ralphie PARKER (narrating): Åh, Pierre var i stor röst ikväll. 53 00:02:42,790 --> 00:02:46,110 Jag kan tala om att kvällens budskap var verkligen viktigt. 54 00:02:46,110 --> 00:02:47,930 >> RADIO ANNOUNCER: --3, 25. 55 00:02:47,930 --> 00:02:49,940 Det är ett budskap från Annie själv. 56 00:02:49,940 --> 00:02:52,182 Kom ihåg att inte berätta för någon. 57 00:02:52,182 --> 00:02:55,077 >> [Flämtande] 58 00:02:55,077 --> 00:02:57,285 Ralphie PARKER (narrating): Nittio sekunder senare, jag är 59 00:02:57,285 --> 00:03:00,090 i det enda rummet i hus där en pojke på nio 60 00:03:00,090 --> 00:03:04,380 kunde sitta i avskildhet och avkoda. 61 00:03:04,380 --> 00:03:04,990 Ah. 62 00:03:04,990 --> 00:03:05,680 "B" 63 00:03:05,680 --> 00:03:06,524 >> [Småskrattar] 64 00:03:06,524 --> 00:03:08,684 >> Ralphie PARKER (narrating): Jag gick till nästa. 65 00:03:08,684 --> 00:03:09,610 "E." 66 00:03:09,610 --> 00:03:11,641 Det första ordet är "att vara." 67 00:03:11,641 --> 00:03:12,140 Ja! 68 00:03:12,140 --> 00:03:14,293 Det skulle komma lättare nu. 69 00:03:14,293 --> 00:03:15,259 "U." 70 00:03:15,259 --> 00:03:16,225 >> [Småskrattar] 71 00:03:16,225 --> 00:03:18,157 >> RANDY PARKER: Kom igen, Ralphie. 72 00:03:18,157 --> 00:03:19,606 Jag måste gå! 73 00:03:19,606 --> 00:03:21,538 >> Ralphie PARKER: Jag kommer ner, Ma. 74 00:03:21,538 --> 00:03:22,504 Gee whiz. 75 00:03:22,504 --> 00:03:25,402 76 00:03:25,402 --> 00:03:31,220 "T." "O." "Glöm till. "" Se till att "vad? 77 00:03:31,220 --> 00:03:33,981 Vad var Little Orphan Annie försöker säga? "Se till att" vad? 78 00:03:33,981 --> 00:03:35,522 MODREN Ralphie, Randy har fått gå. 79 00:03:35,522 --> 00:03:36,735 Kan du komma ut? 80 00:03:36,735 --> 00:03:38,190 >> Ralphie PARKER: Okej, mamma! 81 00:03:38,190 --> 00:03:39,787 Jag kommer strax! 82 00:03:39,787 --> 00:03:41,995 Ralphie PARKER (narrating): Jag började bli närmare nu. 83 00:03:41,995 --> 00:03:43,370 Spänningen var hemskt. 84 00:03:43,370 --> 00:03:44,794 Vad var det? 85 00:03:44,794 --> 00:03:47,656 Ödet av planeten kan hänga i balans. 86 00:03:47,656 --> 00:03:50,518 >> MODREN Ralphie, Randy fick gå! 87 00:03:50,518 --> 00:03:53,635 >> Ralphie PARKER: Jag kommer strax ut, för guds skull! 88 00:03:53,635 --> 00:03:55,343 Ralphie PARKER (Berätta): Nästan där! 89 00:03:55,343 --> 00:03:56,520 Mina fingrar flög! 90 00:03:56,520 --> 00:03:58,500 Mitt sinne var en stålfälla. 91 00:03:58,500 --> 00:03:59,850 Varje por vibrerade. 92 00:03:59,850 --> 00:04:01,806 Det var nästan klart! 93 00:04:01,806 --> 00:04:02,773 Ja! 94 00:04:02,773 --> 00:04:03,273 Ja! 95 00:04:03,273 --> 00:04:03,773 Ja! 96 00:04:03,773 --> 00:04:04,740 Ja! 97 00:04:04,740 --> 00:04:10,250 >> Ralphie PARKER: "Se att dricka ditt Ovaltine. " 98 00:04:10,250 --> 00:04:10,750 Ovaltine? 99 00:04:10,750 --> 00:04:14,864 100 00:04:14,864 --> 00:04:17,539 En crummy kommersiellt? 101 00:04:17,539 --> 00:04:19,439 >> [MUSIK SPELA] 102 00:04:19,439 --> 00:04:21,724 >> Ralphie PARKER: Den jäveln. 103 00:04:21,724 --> 00:04:23,460 >> [Skrattar] 104 00:04:23,460 --> 00:04:27,070 >> DAVID J. MALAN: Så det är då en inblick i hur kryptografi 105 00:04:27,070 --> 00:04:29,880 kan vara för detta-- en dricka från förr. 106 00:04:29,880 --> 00:04:30,900 Så en snabb tillkännagivande. 107 00:04:30,900 --> 00:04:33,410 Om du är fri här Fredag ​​kl 13:15 och skulle 108 00:04:33,410 --> 00:04:36,610 vilja ansluta sig till oss för CS50 lunch, gå till denna URL här. 109 00:04:36,610 --> 00:04:38,080 Först till kvarn får först tjäna som vanligt. 110 00:04:38,080 --> 00:04:41,840 Men med tiden kommer vi se till att mest alla som vill delta 111 00:04:41,840 --> 00:04:43,640 kan schemamässigt. 112 00:04:43,640 --> 00:04:45,170 >> Så strängar. 113 00:04:45,170 --> 00:04:47,940 Vi har Zamyla-- vem du har nu träffat troligen 114 00:04:47,940 --> 00:04:50,750 i Problem Set 1-- vars namn stavas så. 115 00:04:50,750 --> 00:04:53,570 Och antar att du skrev hennes namn in i ett datorprogram som är 116 00:04:53,570 --> 00:04:55,710 med något sånt getString. 117 00:04:55,710 --> 00:04:57,890 För att hämta dessa tangenttryckningar, hur 118 00:04:57,890 --> 00:05:01,620 ska vi göra som representerar en sträng, ett ord, ett stycke, 119 00:05:01,620 --> 00:05:03,960 eller flera bokstäver som dessa här? 120 00:05:03,960 --> 00:05:06,790 >> Vi pratade förra gången om heltal och problem 121 00:05:06,790 --> 00:05:09,960 som uppstår med heltalsspill och flyttalsvärden 122 00:05:09,960 --> 00:05:12,190 och problem som uppstå inom precision. 123 00:05:12,190 --> 00:05:16,080 Med stråkar, vi åtminstone har lite mer flexibilitet 124 00:05:16,080 --> 00:05:17,970 eftersom strings-- bara i den verkliga world-- 125 00:05:17,970 --> 00:05:19,790 kan vara en ganska godtycklig längd. 126 00:05:19,790 --> 00:05:21,055 Ganska kort, ganska länge. 127 00:05:21,055 --> 00:05:23,680 Men även då ska vi tycker att datorer kan ibland 128 00:05:23,680 --> 00:05:27,200 slut på minne och inte ens lagra en tillräckligt stor sträng. 129 00:05:27,200 --> 00:05:30,840 >> Men för nu, låt oss börja att visualisera en sträng som något i dessa rutor 130 00:05:30,840 --> 00:05:31,340 här. 131 00:05:31,340 --> 00:05:36,410 Så sex sådana lådor, som var och en representerar ett tecken eller "char". 132 00:05:36,410 --> 00:05:40,646 Så minns att "char" - c-h-a-r-- är en av de inbyggda datatyper i C. 133 00:05:40,646 --> 00:05:43,520 Och vad är trevligt är att du kan använda den sortens som en byggsten, 134 00:05:43,520 --> 00:05:47,880 en pusselbit, om ni så vill, för att bilda en större typ av data som vi kommer att fortsätta 135 00:05:47,880 --> 00:05:49,410 att kalla en "sträng". 136 00:05:49,410 --> 00:05:53,650 >> Nu, vad är nyttigt om att tänka om saker som strängar på det här sättet? 137 00:05:53,650 --> 00:05:57,720 Tja, det visar sig att vi kan faktiskt utnyttja denna struktur 138 00:05:57,720 --> 00:06:01,420 att faktiskt komma åt enskilda tecken på ett ganska enkelt sätt. 139 00:06:01,420 --> 00:06:04,099 Jag kommer att gå vidare och skapa en fil som heter "stringzero.c," 140 00:06:04,099 --> 00:06:05,765 men du kan kalla det vad du vill. 141 00:06:05,765 --> 00:06:08,500 Och på kursens hemsida är redan detta exempel i förväg, 142 00:06:08,500 --> 00:06:10,430 så du behöver inte Skriv ut allt. 143 00:06:10,430 --> 00:06:13,820 >> Och jag ska gå vidare och först gör int main ogiltiga. 144 00:06:13,820 --> 00:06:15,980 Och inom några dagar, vi börjar att retas isär 145 00:06:15,980 --> 00:06:19,070 vad void är här, varför det är int bredvid huvud osv. 146 00:06:19,070 --> 00:06:21,180 Men för nu, låt oss fortsätta kopiera klistra in det. 147 00:06:21,180 --> 00:06:23,455 >> Jag ska förklara en sträng som heter s. 148 00:06:23,455 --> 00:06:26,920 Och jag kommer att återvända från GetString oavsett användaren skriver i. 149 00:06:26,920 --> 00:06:29,170 Detta kommer att bli en enkel program, inga instruktioner, 150 00:06:29,170 --> 00:06:31,336 Jag ska bara blint förvänta att användaren vet 151 00:06:31,336 --> 00:06:32,600 vad man ska göra för att hålla det enkelt. 152 00:06:32,600 --> 00:06:34,220 >> Och nu ska jag ha en for-loop. 153 00:06:34,220 --> 00:06:37,450 Och insidan av min för loop är jag kommer att ha int i blir noll. 154 00:06:37,450 --> 00:06:40,660 Och jag är, igen, bara en konvention, en indexvariabel för räkning, 155 00:06:40,660 --> 00:06:42,350 men jag kunde kalla detta vad jag vill. 156 00:06:42,350 --> 00:06:46,275 Jag kommer att göra i är mindre than-- väl Zamyla namn är sex bokstäver långa. 157 00:06:46,275 --> 00:06:48,150 Så jag ska hårt kod som finns för tillfället. 158 00:06:48,150 --> 00:06:49,730 >> Och sedan i ++. 159 00:06:49,730 --> 00:06:53,190 Och nu inne i dessa lockigt tandställning jag ska göra printf, 160 00:06:53,190 --> 00:06:55,460 och jag vill skriva ut en tecken i taget. 161 00:06:55,460 --> 00:06:58,227 Så jag kommer att använda% c för kanske första gången. 162 00:06:58,227 --> 00:07:00,560 Och sedan vill jag att skriva ut varje tecken på en egen rad. 163 00:07:00,560 --> 00:07:02,550 Så jag kommer att sätta en litet snedstreck n där. 164 00:07:02,550 --> 00:07:03,640 Stäng citat. 165 00:07:03,640 --> 00:07:06,250 >> Och nu vill jag göra något här. 166 00:07:06,250 --> 00:07:10,610 Jag vill skriva ut specifik bokstav i strängen, 167 00:07:10,610 --> 00:07:13,670 s, som jag iteration från noll på upp till sex. 168 00:07:13,670 --> 00:07:17,150 Med andra ord vill jag skriva ut det i: te karaktär s. 169 00:07:17,150 --> 00:07:18,420 Nu hur kan jag göra detta? 170 00:07:18,420 --> 00:07:21,550 >> Tja ungefär som rutorna i denna representation här, 171 00:07:21,550 --> 00:07:25,560 slags, trolla fram begreppet boxning brev i, kan du på liknande sätt göra det 172 00:07:25,560 --> 00:07:32,630 syntaktiskt i C genom att helt enkelt ange, Jag vill skriva ut S: te karaktär. 173 00:07:32,630 --> 00:07:35,640 Genom att använda hakparenteserna på datorns tangentbord 174 00:07:35,640 --> 00:07:38,910 att på ett amerikanskt tangentbord är allmänhet över din returtangenten. 175 00:07:38,910 --> 00:07:42,630 >> Så det här är inte riktigt rätt men, som ni kanske har märkt. 176 00:07:42,630 --> 00:07:44,780 Men jag ska typ av blint gå framåt här. 177 00:07:44,780 --> 00:07:47,020 Och jag kommer att göra att strängen 0. 178 00:07:47,020 --> 00:07:50,860 Men innan jag gör det, låt oss se om vi kan inte förutse några vanliga misstag. 179 00:07:50,860 --> 00:07:52,844 Kommer detta att sammanställa? 180 00:07:52,844 --> 00:07:54,510 Nej, jag saknar en hel massa saker. 181 00:07:54,510 --> 00:07:55,280 Bibliotek jag hörde. 182 00:07:55,280 --> 00:07:58,480 >> Så vilken header filer kanske jag vill lägga till här? 183 00:07:58,480 --> 00:07:59,205 Yeah. 184 00:07:59,205 --> 00:08:01,580 >> PUBLIK: Du behöver standard I / O [ohörbart] 185 00:08:01,580 --> 00:08:02,663 >> DAVID J. MALAN: Excellent. 186 00:08:02,663 --> 00:08:06,060 Så jag behöver standard I / O. För vad syfte vill jag standard I / O? 187 00:08:06,060 --> 00:08:06,670 För printf. 188 00:08:06,670 --> 00:08:09,220 Så inkluderar stdio.h. 189 00:08:09,220 --> 00:08:13,490 Och du också föreslå att jag inkluderar den CS50 biblioteket av vilken anledning? 190 00:08:13,490 --> 00:08:14,650 Att ha strängar. 191 00:08:14,650 --> 00:08:17,780 Så vi får se vad CS50 bibliotek gör 192 00:08:17,780 --> 00:08:19,260 att skapa denna föreställning om en sträng. 193 00:08:19,260 --> 00:08:21,930 Men för tillfället kan du bara tänka det som en verklig datatyp. 194 00:08:21,930 --> 00:08:23,596 >> Så det verkar vara lite saneras. 195 00:08:23,596 --> 00:08:27,060 Och nu ska jag gå vidare och faktiskt gör att strängen 0. 196 00:08:27,060 --> 00:08:27,700 Kompileras. 197 00:08:27,700 --> 00:08:28,370 Så det är bra. 198 00:08:28,370 --> 00:08:32,799 Så ./string0 låt mig zooma in så att vi kan se närmare vad som händer. 199 00:08:32,799 --> 00:08:33,850 Enter. 200 00:08:33,850 --> 00:08:37,789 Z-A-M-Y-L-A tryck. 201 00:08:37,789 --> 00:08:39,440 Och vi har tryckt ut till Zamyla namn. 202 00:08:39,440 --> 00:08:40,409 >> Så det är ganska bra. 203 00:08:40,409 --> 00:08:43,220 Så nu ska vi gå vidare och köra programmet igen, 204 00:08:43,220 --> 00:08:45,659 och skriv ut Daven fullständiga namn. 205 00:08:45,659 --> 00:08:46,450 Surprise, surprise. 206 00:08:46,450 --> 00:08:48,021 Enter. 207 00:08:48,021 --> 00:08:48,520 Hmm. 208 00:08:48,520 --> 00:08:51,750 Vi har inte tryckt Daven s utskrivet förnamn korrekt. 209 00:08:51,750 --> 00:08:54,250 Nu är detta borde vara självklart i RetroSpect grund av vad, 210 00:08:54,250 --> 00:08:57,010 slags, dumma beslut design? 211 00:08:57,010 --> 00:08:59,590 >> Ja, jag hårdkodad i sex insidan av min för slinga. 212 00:08:59,590 --> 00:09:01,610 Nu gjorde jag det bara för att Jag visste Zamyla namn 213 00:09:01,610 --> 00:09:02,776 skulle bli sex bokstäver. 214 00:09:02,776 --> 00:09:04,720 Men det är väl ändå inte en generell lösning. 215 00:09:04,720 --> 00:09:07,720 Så visar det sig att vi kan dynamiskt räkna ut längden av en sträng 216 00:09:07,720 --> 00:09:10,440 genom att anropa en funktion som heter strlen. 217 00:09:10,440 --> 00:09:12,840 >> Återigen, medvetet koncist namnges bara 218 00:09:12,840 --> 00:09:14,450 att göra det mer bekvämt att skriva. 219 00:09:14,450 --> 00:09:17,170 Men det är synonymt med få längden på en sträng. 220 00:09:17,170 --> 00:09:23,190 Jag kommer att gå tillbaka in i min terminal fönster och åter köra kompilatorn. 221 00:09:23,190 --> 00:09:24,170 Men det skriker på mig. 222 00:09:24,170 --> 00:09:29,130 Underförstått att förklara biblioteksfunktion strlen med typ unsigned int const-- 223 00:09:29,130 --> 00:09:29,780 Jag är vilse. 224 00:09:29,780 --> 00:09:30,590 Helt. 225 00:09:30,590 --> 00:09:32,940 >> Så, särskilt som din ögon börjar glasyr över 226 00:09:32,940 --> 00:09:36,000 med felmeddelanden som detta, fokus ärligt på de första orden. 227 00:09:36,000 --> 00:09:38,590 Vi vet att problemet är i linje 8, som anges här. 228 00:09:38,590 --> 00:09:40,500 Och det är i sträng-0.c. 229 00:09:40,500 --> 00:09:43,580 Underförstått att förklara biblioteksfunktionen strlen. 230 00:09:43,580 --> 00:09:47,000 Så det är i allmänhet går till vara ett mönster av felmeddelanden. 231 00:09:47,000 --> 00:09:49,190 Underförstått att förklara något. 232 00:09:49,190 --> 00:09:53,250 >> Så kort sagt, vad har jag verkade har gjort i förhållande till linje 8, här. 233 00:09:53,250 --> 00:09:56,880 Vad kan vara lösningen vara ännu Om du aldrig har använt strlen själv? 234 00:09:56,880 --> 00:09:58,907 >> PUBLIK: En del av ett annat bibliotek? 235 00:09:58,907 --> 00:10:00,740 DAVID J. MALAN: Part av ett annat bibliotek. 236 00:10:00,740 --> 00:10:02,400 Så det deklareras, så att säga. 237 00:10:02,400 --> 00:10:07,510 Det nämns i någon fil andra än stdio.h och CS50.h. 238 00:10:07,510 --> 00:10:09,179 Nu var det definieras? 239 00:10:09,179 --> 00:10:12,220 För att vara ärlig, du antingen måste bara vet detta från toppen av huvudet, 240 00:10:12,220 --> 00:10:13,640 eller du Google här och ta reda på. 241 00:10:13,640 --> 00:10:18,150 Eller vet detta, jag har öppnat i CS50 APPARAT terminalprogrammet, som 242 00:10:18,150 --> 00:10:22,200 är bara den stora, helskärm version vad som finns i botten av gedit fönster. 243 00:10:22,200 --> 00:10:24,970 >> Och det visar sig att det finns en på liknande kortfattad kommando, som kallas 244 00:10:24,970 --> 00:10:29,280 mannen för manuell, där om du skriver in namnet på en funktion och tryck Enter, 245 00:10:29,280 --> 00:10:32,240 du får tillbaka ganska svårbegripliga dokumentation. 246 00:10:32,240 --> 00:10:35,299 Det är bara text som i allmänhet ser lite ut så här. 247 00:10:35,299 --> 00:10:37,090 Det är lite överväldigande vid första anblicken. 248 00:10:37,090 --> 00:10:39,048 Men ärligt talat jag ska låta mina ögon stelnar 249 00:10:39,048 --> 00:10:41,930 och bara fokusera på den del Jag bryr mig om för tillfället. 250 00:10:41,930 --> 00:10:42,780 >> Vilket är det. 251 00:10:42,780 --> 00:10:45,470 Som ser ut som strukturellt något jag är bekant med. 252 00:10:45,470 --> 00:10:48,080 Faktum är att man-sidan, så att tala, kommer att berätta 253 00:10:48,080 --> 00:10:51,590 i vilken header in en funktion liknande strlen definieras. 254 00:10:51,590 --> 00:10:54,170 Så jag kommer att gå tillbaka nu till gedit. 255 00:10:54,170 --> 00:10:59,070 Och jag ska gå vidare och lägga in här # include 256 00:10:59,070 --> 00:11:00,480 och spara filen. 257 00:11:00,480 --> 00:11:04,300 >> Jag kommer att rensa skärmen med Kontroll L Om du har undrat. 258 00:11:04,300 --> 00:11:08,210 Och jag ska åter kör make string.0, sammanställer denna tid. 259 00:11:08,210 --> 00:11:11,790 ./string.0 Zamyla. 260 00:11:11,790 --> 00:11:15,020 Det verkade fungera Låt mig gå framåt och kör den med Davenport. 261 00:11:15,020 --> 00:11:15,860 Enter. 262 00:11:15,860 --> 00:11:17,730 Och det också, verkade fungera. 263 00:11:17,730 --> 00:11:21,220 >> Så vi kan göra lite bättre än så här, Men kan vi börja städa saker 264 00:11:21,220 --> 00:11:23,257 upp bara lite. 265 00:11:23,257 --> 00:11:25,590 Och jag ska faktiskt införa en annan sak nu. 266 00:11:25,590 --> 00:11:28,930 Jag kommer att gå vidare och spara detta i en annan fil. 267 00:11:28,930 --> 00:11:31,770 Och jag ska ringa den här filen string1.c bara 268 00:11:31,770 --> 00:11:34,620 att överensstämma med koden du kommer att kunna hitta på nätet. 269 00:11:34,620 --> 00:11:37,050 >> Och låt oss fokusera på exakt samma kod. 270 00:11:37,050 --> 00:11:39,000 Det visar sig att jag har varit sorts tagande 271 00:11:39,000 --> 00:11:42,600 för givet att min bärbara dator, och i sin tur, på CS50 apparaten 272 00:11:42,600 --> 00:11:47,450 har en hel del minne, en hel del RAM, en massa byte av utrymmet 273 00:11:47,450 --> 00:11:48,920 där kan jag lagra strängar. 274 00:11:48,920 --> 00:11:53,560 >> Men verkligheten om jag skrivit långa nog, och tillräckligt med tangenttryckningar, 275 00:11:53,560 --> 00:11:56,170 Jag kunde i teorin typ in fler tecken 276 00:11:56,170 --> 00:11:58,830 än min dator fysiskt minne rymmer. 277 00:11:58,830 --> 00:11:59,830 Och det är problematiskt. 278 00:11:59,830 --> 00:12:03,050 Ungefär som en int kan bara räkna så högt, i teorin, 279 00:12:03,050 --> 00:12:06,600 du kan bara klämma så många tecken i datorns RAM eller Random 280 00:12:06,600 --> 00:12:07,920 Access Memory. 281 00:12:07,920 --> 00:12:11,140 >> Så jag hade bättre förutse detta problem, till och med 282 00:12:11,140 --> 00:12:13,660 om det kan vara en sällsynt hörn fall, så att säga. 283 00:12:13,660 --> 00:12:15,670 Händer inte så ofta, kan hända. 284 00:12:15,670 --> 00:12:18,815 Och om det händer och det gör jag inte förutse och program för det, 285 00:12:18,815 --> 00:12:20,300 mitt program kan göra vem vet vad. 286 00:12:20,300 --> 00:12:22,220 Frys, hänga, omstart, oavsett. 287 00:12:22,220 --> 00:12:24,490 Något väntat kan hända. 288 00:12:24,490 --> 00:12:27,120 >> Så vad jag ska göra nu, hädanefter egentligen, 289 00:12:27,120 --> 00:12:31,630 är innan jag någonsin blint använda en variabel som s som 290 00:12:31,630 --> 00:12:36,790 har tilldelats returvärde någon annan funktion som getString, 291 00:12:36,790 --> 00:12:40,200 Jag ska se till att att dess värde är giltigt. 292 00:12:40,200 --> 00:12:44,280 Så jag vet bara från att ha läst CS50 dokumentation för getString, 293 00:12:44,280 --> 00:12:49,020 vilket i slutändan kommer vi att peka dig på, att getString returnerar en speciell symbol 294 00:12:49,020 --> 00:12:53,610 kallade NULL, N-U-L-L i alla mössor, om något går fel. 295 00:12:53,610 --> 00:12:55,650 >> Så normalt returneras en sträng. 296 00:12:55,650 --> 00:12:59,700 Men annars, om det återvänder N-U-L-L-- vi så småningom får se vad som verkligen 297 00:12:59,700 --> 00:13:01,790 means-- att bara medel hände något dåligt. 298 00:13:01,790 --> 00:13:05,560 Nu betyder det, ungefär som i Scratch, Jag kan kontrollera ett tillstånd här i C, 299 00:13:05,560 --> 00:13:08,830 om s inte är lika NULL. 300 00:13:08,830 --> 00:13:11,930 Så om du inte har sett det här förut, Detta betyder bara inte är lika. 301 00:13:11,930 --> 00:13:15,290 >> Så det är motsatsen till lika jämlikar, som minns, 302 00:13:15,290 --> 00:13:18,940 skiljer sig från enkel lika, vilket är uppdrag. 303 00:13:18,940 --> 00:13:23,030 Så om s inte är lika NULL, först då gör 304 00:13:23,030 --> 00:13:25,980 Jag vill köra dessa rader kod. 305 00:13:25,980 --> 00:13:28,080 Så med andra ord, innan jag dyker i blindo 306 00:13:28,080 --> 00:13:30,919 och börja iteration över s, och behandla det 307 00:13:30,919 --> 00:13:33,710 som om det är en sekvens av tecken, jag ska först kolla, 308 00:13:33,710 --> 00:13:37,900 vänta lite, är s definitivt inte lika med detta särskilt värde, NULL? 309 00:13:37,900 --> 00:13:40,030 >> För om det är, kan dåliga saker hända. 310 00:13:40,030 --> 00:13:43,080 Och nu, antar att dåliga saker händer betyder dina program kraschar, 311 00:13:43,080 --> 00:13:45,070 och du kan inte nödvändigtvis återhämta sig. 312 00:13:45,070 --> 00:13:46,800 Så ärligt talat, det ser fulare. 313 00:13:46,800 --> 00:13:48,660 det är typ av förvirrande nu att titta på. 314 00:13:48,660 --> 00:13:50,780 Men det kommer att bli mer bekant kort. 315 00:13:50,780 --> 00:13:52,920 >> Men jag kommer att föreslå nu en annan förbättring. 316 00:13:52,920 --> 00:13:54,660 Det är en förbättring riktighet. 317 00:13:54,660 --> 00:13:58,800 Mitt program är nu mer korrekt, eftersom i de sällsynta fall som inte tillräckligt med minne 318 00:13:58,800 --> 00:14:01,180 finns, kommer jag hantera det, och jag ska bara göra ingenting. 319 00:14:01,180 --> 00:14:02,680 Jag åtminstone inte kommer att krascha. 320 00:14:02,680 --> 00:14:05,000 >> Men låt oss göra en slutlig version här. 321 00:14:05,000 --> 00:14:07,690 Och en fil som heter string2.c. 322 00:14:07,690 --> 00:14:10,190 Jag kommer att klistra in samma kod för bara ett ögonblick, 323 00:14:10,190 --> 00:14:14,210 och jag kommer att belysa detta linje, 11, här, för bara ett ögonblick. 324 00:14:14,210 --> 00:14:18,179 Nu är verkligheten den att smarta kompilatorer som Clang kunde fixa detta för oss 325 00:14:18,179 --> 00:14:19,970 bakom kulisserna utan vårt någonsin veta. 326 00:14:19,970 --> 00:14:24,670 Men låt oss tänka på detta i grunden som en problematisk konstruktion. 327 00:14:24,670 --> 00:14:29,010 >> Denna kodrad är, naturligtvis, sade initiera viss variabel i till 0. 328 00:14:29,010 --> 00:14:30,260 Det är ganska enkelt. 329 00:14:30,260 --> 00:14:34,691 Och vad återigen är det här uttalande, här, i ++, gör? 330 00:14:34,691 --> 00:14:37,066 Vi har sett det förut, men vi inte riktigt prata om det. 331 00:14:37,066 --> 00:14:37,900 >> PUBLIK: Uppräkningen i. 332 00:14:37,900 --> 00:14:39,191 >> David J. MALAN: Uppräkningen i. 333 00:14:39,191 --> 00:14:41,890 Så på varje iteration genom denna slinga, varje cykel, 334 00:14:41,890 --> 00:14:43,570 du uppräkning i taget. 335 00:14:43,570 --> 00:14:45,740 Så det blir större och större, och större tills öglan upphör. 336 00:14:45,740 --> 00:14:46,810 Hur fungerar det avslutas? 337 00:14:46,810 --> 00:14:49,430 Jo det är det här mitt tillstånd som vi har använt tidigare. 338 00:14:49,430 --> 00:14:52,500 Du har sett och i walkthroughs i P set. 339 00:14:52,500 --> 00:14:53,880 >> Men vad är detta ordstäv? 340 00:14:53,880 --> 00:14:58,352 Gör följande slinga så länge jag är mindre än vad? 341 00:14:58,352 --> 00:14:59,810 AUDIENCE: Längden av strängen. 342 00:14:59,810 --> 00:15:01,518 David J. MALAN: Den strängens längd. 343 00:15:01,518 --> 00:15:04,300 Så det översätter ganska rent till engelska i den bemärkelsen. 344 00:15:04,300 --> 00:15:08,810 Nu är problemet är att varje gång jag iterera genom denna slinga i teorin, 345 00:15:08,810 --> 00:15:10,000 Jag ställer denna fråga. 346 00:15:10,000 --> 00:15:12,250 Är jag mindre än strängen längden s? 347 00:15:12,250 --> 00:15:14,500 Är jag mindre än strängen längden s? 348 00:15:14,500 --> 00:15:18,380 >> Nu är jag förändras för varje iteration? 349 00:15:18,380 --> 00:15:18,880 Det är det. 350 00:15:18,880 --> 00:15:19,629 På grund av den ++. 351 00:15:19,629 --> 00:15:21,700 Så varje iteration jag blir större. 352 00:15:21,700 --> 00:15:25,411 Men är s blir större, eller mindre, eller förändras alls? 353 00:15:25,411 --> 00:15:25,910 Nej 354 00:15:25,910 --> 00:15:30,240 Så när det gäller design, en av axlarna längs vilken vi försöka utvärdera kod 355 00:15:30,240 --> 00:15:32,610 i klassen, känns denna typ av dum. 356 00:15:32,610 --> 00:15:34,690 >> Som du är bokstavligen, på varje iteration 357 00:15:34,690 --> 00:15:37,110 av denna slinga be samma jävla fråga igen, 358 00:15:37,110 --> 00:15:40,770 och igen, och igen, och bokstavligen Det kommer aldrig att förändras. 359 00:15:40,770 --> 00:15:44,220 Åtminstone om jag inte röra s och försöker ändra innehållet i er. 360 00:15:44,220 --> 00:15:46,610 Så jag kan göra lite bättre än så här. 361 00:15:46,610 --> 00:15:49,530 >> Och vad jag ska göra är att inte förklarar bara en variabel i, 362 00:15:49,530 --> 00:15:53,330 men en andra variabel jag ska godtyckligt, men konventionellt, kalla det n. 363 00:15:53,330 --> 00:15:55,940 Tilldela n lika med stränglängd s. 364 00:15:55,940 --> 00:15:59,090 Och sedan här borta, kommer jag att gör en smart liten optimering, så 365 00:15:59,090 --> 00:16:03,460 att tala, att vid slutet av dagen är inte mer rätt eller mindre rätt 366 00:16:03,460 --> 00:16:04,260 än tidigare. 367 00:16:04,260 --> 00:16:05,500 Men det är en bättre design. 368 00:16:05,500 --> 00:16:09,480 I det faktum att jag använder mindre tid, mindre CPU-cykler, så 369 00:16:09,480 --> 00:16:14,040 att tala, för att svara på samma fråga, men bara en gång. 370 00:16:14,040 --> 00:16:17,870 >> Har du frågor om den allmänna principen förbättras, 371 00:16:17,870 --> 00:16:21,294 säger, ett programs effektivitet? 372 00:16:21,294 --> 00:16:21,991 Yeah? 373 00:16:21,991 --> 00:16:23,699 PUBLIK: Varför tror du använd [ohörbart]? 374 00:16:23,699 --> 00:16:25,760 375 00:16:25,760 --> 00:16:27,010 DAVID J. MALAN: Bra fråga. 376 00:16:27,010 --> 00:16:30,690 Så varför vi sätter ++ på slutet av jag i stället för i början av i? 377 00:16:30,690 --> 00:16:33,070 I detta fall har det ingen funktionell påverkan. 378 00:16:33,070 --> 00:16:36,670 Och i allmänhet, jag brukar använda postfix operatören 379 00:16:36,670 --> 00:16:41,750 så att det är lite mer klart som att när operationen sker. 380 00:16:41,750 --> 00:16:46,670 >> För de som känner, det finns en annan uttalanden som innebär att du kan göra ++ jag. 381 00:16:46,670 --> 00:16:48,747 Dessa är funktionellt likvärdig i detta fall 382 00:16:48,747 --> 00:16:51,080 för det finns inget annat runt det inkrementering. 383 00:16:51,080 --> 00:16:54,435 Men du kan komma med fall och kodrader 384 00:16:54,435 --> 00:16:55,810 där som gör en skillnad. 385 00:16:55,810 --> 00:16:57,810 Så generellt, det gör vi inte ens prata om det här. 386 00:16:57,810 --> 00:17:00,690 Eftersom ärligt talat, det gör ditt kod sexigare, och liksom slicker, 387 00:17:00,690 --> 00:17:01,776 och färre tecken. 388 00:17:01,776 --> 00:17:04,859 Men verkligheten är att det är mycket svårare, Jag tror, ​​även för mig att slå mig 389 00:17:04,859 --> 00:17:07,319 runt det ibland, ordningen på verksamheten. 390 00:17:07,319 --> 00:17:09,750 Så som en sidoreplik, om du verkligen inte gillar detta, 391 00:17:09,750 --> 00:17:14,650 även om det är typ av sexig ser, kan du också göra i + = 1, 392 00:17:14,650 --> 00:17:18,880 som är den fulare version av samma idé för postfix uppräkning. 393 00:17:18,880 --> 00:17:22,250 >> Jag säger detta och du bör göra narr av det, 394 00:17:22,250 --> 00:17:25,140 men du kommer att se koden som något vackert kort. 395 00:17:25,140 --> 00:17:27,160 >> [LAUGHTER] 396 00:17:27,160 --> 00:17:28,410 >> DAVID J. MALAN: Rätt? 397 00:17:28,410 --> 00:17:29,360 Yeah. 398 00:17:29,360 --> 00:17:30,480 Fråga i mitten. 399 00:17:30,480 --> 00:17:32,146 >> PUBLIK: Behöver du säga int n? 400 00:17:32,146 --> 00:17:34,020 DAVID J. MALAN: Du gör inte behöver säga int n. 401 00:17:34,020 --> 00:17:37,670 Så eftersom vi redan har sagt int, du behöver inte säga det igen. 402 00:17:37,670 --> 00:17:41,820 Fångsten är att n måste vara samma datatyp som jag. 403 00:17:41,820 --> 00:17:43,310 Så det är bara en bekvämlighet här. 404 00:17:43,310 --> 00:17:44,058 Yeah. 405 00:17:44,058 --> 00:17:47,806 >> PUBLIK: Kan du går över print tecken s fäste jag igen? 406 00:17:47,806 --> 00:17:48,930 DAVID J. MALAN: Absolut. 407 00:17:48,930 --> 00:17:52,110 Så% c, minns från förra tid, är bara en platshållare. 408 00:17:52,110 --> 00:17:53,930 Det betyder sätta en röding här. 409 00:17:53,930 --> 00:17:56,780 omvänt snedstreck n, naturligtvis, bara sätt sätta en radbrytning här. 410 00:17:56,780 --> 00:17:59,540 Så att bara lämnar, nu, denna bit av ny syntax. 411 00:17:59,540 --> 00:18:03,730 Och det är bokstavligen säger grab strängen kallas s och gå och hämta sin 412 00:18:03,730 --> 00:18:06,050 : te karaktär, så att säga. 413 00:18:06,050 --> 00:18:10,590 >> Och jag fortsätter att säga: te tecken eftersom på varje iteration av denna slinga 414 00:18:10,590 --> 00:18:14,540 det är som om vi skriver ut inledningsvis s konsol 0, 415 00:18:14,540 --> 00:18:15,780 som programmerare kan säga. 416 00:18:15,780 --> 00:18:18,680 Då är fäste 1, sedan s fäste 2, sedan 3, sedan 4. 417 00:18:18,680 --> 00:18:21,610 Men naturligtvis är det en variabel, så jag uttrycker bara det med jag. 418 00:18:21,610 --> 00:18:23,900 >> Key är dock att inse, speciellt om du har inte 419 00:18:23,900 --> 00:18:26,358 varit acclimating till den här världen programmering, där vi alla 420 00:18:26,358 --> 00:18:28,950 tyckas att räkna från noll, fånget börja räkna från noll nu. 421 00:18:28,950 --> 00:18:35,130 Because strängar, första tecknet, den z i Zamyla är på gott och ont 422 00:18:35,130 --> 00:18:40,490 kommer att leva på plats nummer noll. 423 00:18:40,490 --> 00:18:48,210 >> Okej, så låt mig få oss tillbaka hit till Zamyla 424 00:18:48,210 --> 00:18:50,746 och se vad som verkligen pågår på under huven. 425 00:18:50,746 --> 00:18:52,370 Så det är det här begreppet typ gjutning. 426 00:18:52,370 --> 00:18:53,800 Du kanske har faktiskt redan spelat med det här, 427 00:18:53,800 --> 00:18:55,970 kanske för hackare upplagan av P set ett. 428 00:18:55,970 --> 00:19:00,320 Men typ gjutning hänvisar bara till förmåga i C och en del andra språk 429 00:19:00,320 --> 00:19:03,170 konvertera en datatyp till en annan. 430 00:19:03,170 --> 00:19:05,450 >> Nu hur kan vi se här ganska rättframt? 431 00:19:05,450 --> 00:19:08,530 Så det här, minns, är början i det engelska alfabetet. 432 00:19:08,530 --> 00:19:11,265 Och sammanhanget, minns, från som för en vecka sedan är ASCII. 433 00:19:11,265 --> 00:19:13,790 Den American Standard Code for Information Interchange. 434 00:19:13,790 --> 00:19:17,080 Vilket är bara en riktigt lång väg att säga en kartläggning från brev 435 00:19:17,080 --> 00:19:19,370 till tal och från tal till bokstäver. 436 00:19:19,370 --> 00:19:22,940 >> Så A till M här, dot dot dot, ställer upp med, återkallande, 437 00:19:22,940 --> 00:19:25,582 det decimala talet 65 på upp. 438 00:19:25,582 --> 00:19:27,290 Och vi pratade inte om detta uttryckligen, 439 00:19:27,290 --> 00:19:29,850 men säkert finns det liknande nummer för små bokstäver. 440 00:19:29,850 --> 00:19:30,820 Och faktiskt, det finns. 441 00:19:30,820 --> 00:19:33,730 Världens beslutade några år sedan det lilla a, små bokstäver a, 442 00:19:33,730 --> 00:19:35,020 kommer att bli 97. 443 00:19:35,020 --> 00:19:38,010 Och lite b går att vara 98, och så vidare. 444 00:19:38,010 --> 00:19:40,200 >> Och för någon annan knapp på tangentbordet, det finns 445 00:19:40,200 --> 00:19:42,190 kommer att bli ett liknande mönster av bitar. 446 00:19:42,190 --> 00:19:44,540 Eller ekvivalent, ett decimaltal. 447 00:19:44,540 --> 00:19:47,110 Så frågan till hands, kan då, är hur vi 448 00:19:47,110 --> 00:19:49,400 faktiskt se detta under huven? 449 00:19:49,400 --> 00:19:51,539 Så jag kommer att gå över till gedit igen. 450 00:19:51,539 --> 00:19:53,330 Och i stället för typ detta från början, 451 00:19:53,330 --> 00:19:55,330 Jag kommer att gå vidare och bara öppna upp något 452 00:19:55,330 --> 00:19:58,350 från dagens kod som kallas ASCII noll. 453 00:19:58,350 --> 00:20:01,210 >> Och ASCII noll ser ut så här. 454 00:20:01,210 --> 00:20:02,710 Så låt oss slå in våra sinnen runt detta. 455 00:20:02,710 --> 00:20:04,969 Så först, har jag kommenterat koden, vilket är trevligt. 456 00:20:04,969 --> 00:20:07,010 Eftersom det är bokstavligt talat säger vad som väntar, 457 00:20:07,010 --> 00:20:08,950 visa en mappning för stora bokstäver. 458 00:20:08,950 --> 00:20:13,690 Nu vet inte riktigt jag vad jag menar med det, så låt oss sluta. 459 00:20:13,690 --> 00:20:16,870 >> På engelska, kanske något techie engelska, 460 00:20:16,870 --> 00:20:20,660 vad gör linje 18 visas att göra för oss? 461 00:20:20,660 --> 00:20:21,500 Bara linje 18. 462 00:20:21,500 --> 00:20:22,430 Hur är det att framkalla? 463 00:20:22,430 --> 00:20:25,192 Vad det kommer att sparka igång här? 464 00:20:25,192 --> 00:20:26,100 >> Publik: En ögla. 465 00:20:26,100 --> 00:20:26,630 >> David J. MALAN: En ögla. 466 00:20:26,630 --> 00:20:28,463 Och hur många gånger är som går att iterera? 467 00:20:28,463 --> 00:20:31,562 468 00:20:31,562 --> 00:20:33,270 PUBLIK: [inplacering VOICES] sex gånger. 469 00:20:33,270 --> 00:20:34,830 DAVID J. MALAN: Inte sex gånger. 470 00:20:34,830 --> 00:20:35,840 PUBLIK: 26 gånger. 471 00:20:35,840 --> 00:20:36,560 DAVID J. MALAN: 26 gånger. 472 00:20:36,560 --> 00:20:37,060 Ja, förlåt. 473 00:20:37,060 --> 00:20:37,960 26 gånger. 474 00:20:37,960 --> 00:20:38,460 Varför? 475 00:20:38,460 --> 00:20:41,590 Tja, det är lite konstigt, men Jag har börjat räkna från 65. 476 00:20:41,590 --> 00:20:43,300 Vilket är konstigt, men inte fel. 477 00:20:43,300 --> 00:20:44,610 Det är inte dåligt per säga. 478 00:20:44,610 --> 00:20:46,980 Och jag gör det bara därför att, för detta exempel, 479 00:20:46,980 --> 00:20:50,455 Jag slags förutse att kapital A var 65. 480 00:20:50,455 --> 00:20:53,330 Nu är detta inte den mest eleganta sätt att göra detta, för att typ av hårt kod 481 00:20:53,330 --> 00:20:56,130 esoteriska värden som ingen någonsin förväntas att komma ihåg. 482 00:20:56,130 --> 00:21:00,155 >> Men för nu, märker att jag är göra detta upp genom 65 plus 26. 483 00:21:00,155 --> 00:21:03,030 Eftersom tydligen jag vill inte ens att göra det aritmetiska i mitt huvud. 484 00:21:03,030 --> 00:21:04,440 Så jag ska låta kompilatorn göra det. 485 00:21:04,440 --> 00:21:08,600 Men sedan på varje slinga, varje iteration av slingan, jag uppräkning i. 486 00:21:08,600 --> 00:21:10,196 >> Så nu det ser lite kryptiskt. 487 00:21:10,196 --> 00:21:13,320 Men vi ska ha den grundläggande bygg block med för att förstå detta. 488 00:21:13,320 --> 00:21:15,510 % C är bara en platshållare för en röding. 489 00:21:15,510 --> 00:21:19,010 % I är en platshållare för en int. 490 00:21:19,010 --> 00:21:23,310 Och det visar sig att genom användning av denna ny syntax, det parentetiska, så 491 00:21:23,310 --> 00:21:26,100 att tala, så en datatyp inne i en parentes, 492 00:21:26,100 --> 00:21:32,270 Jag kan tvinga kompilatorn att behandla jag inte är ett heltal, utan som en röding. 493 00:21:32,270 --> 00:21:35,520 >> Därmed visar mig tecknet motsvarighet till det numret. 494 00:21:35,520 --> 00:21:37,986 Nu här nere, den här koden är ganska identiska. 495 00:21:37,986 --> 00:21:39,860 Jag ville bara göra super explicit faktum 496 00:21:39,860 --> 00:21:42,095 att jag börjar kl 97, vilken är gemener en. 497 00:21:42,095 --> 00:21:44,080 På upp genom ytterligare 26 bokstäver. 498 00:21:44,080 --> 00:21:46,970 Och jag doing-- igen, gjutning i, så att säga. 499 00:21:46,970 --> 00:21:49,160 Eller typ gjutning i, så att säga. 500 00:21:49,160 --> 00:21:51,420 >> Från en int till en röding. 501 00:21:51,420 --> 00:21:55,760 Så slutresultatet kommer att bli, ärligt talat, information som vi redan vet. 502 00:21:55,760 --> 00:21:59,411 Jag kommer att göra ascii-0 dot-- inte dot c. 503 00:21:59,411 --> 00:22:02,160 Kallelse, gjorde du antagligen att misstag som jag gjorde bara av misstag. 504 00:22:02,160 --> 00:22:03,820 Gör ascii-0. 505 00:22:03,820 --> 00:22:06,090 Nu ska jag göra ./ascii-0. 506 00:22:06,090 --> 00:22:09,050 Jag ska zooma in, och tyvärr det kommer att rulla ut från fönstret. 507 00:22:09,050 --> 00:22:15,060 Men vi ser en hel diagram där a kartor till 97, b-kartor till 98, 508 00:22:15,060 --> 00:22:18,931 och om vi rulla upp ytterligare En naturligtvis kartor till 65. 509 00:22:18,931 --> 00:22:21,180 Så det här är bara för att säga att vad vi har predikat, 510 00:22:21,180 --> 00:22:25,310 det är denna likvärdighet, är i själva verket är fallet i verkligheten. 511 00:22:25,310 --> 00:22:28,000 Så en snabb ändring av detta. 512 00:22:28,000 --> 00:22:31,220 Låt mig öppna ascii-1.c. 513 00:22:31,220 --> 00:22:38,070 Och märka detta smart, sortera av, klargörande av detta. 514 00:22:38,070 --> 00:22:41,770 Detta är ascii-1.c, och märker denna galna sak. 515 00:22:41,770 --> 00:22:45,120 >> Och detta verkligen blir till hjärtat om vad datorer gör. 516 00:22:45,120 --> 00:22:48,150 Även om vi människor skulle inte räkna i termer av letters-- 517 00:22:48,150 --> 00:22:50,380 Jag vill inte börja tänka, okej en då b, 518 00:22:50,380 --> 00:22:52,590 och använda dem för att räkna fysiska objekt. 519 00:22:52,590 --> 00:22:58,680 Du kan verkligen säga att jag vill initiera en variabel som heter C-- 520 00:22:58,680 --> 00:23:03,220 men jag kunde ha kallat detta anything-- så c initieras till kapital A. 521 00:23:03,220 --> 00:23:07,560 >> Eftersom i slutet av dagen, datorn bryr sig inte vad du lagrar, 522 00:23:07,560 --> 00:23:10,170 den bara bryr sig hur du vill att presentera denna information. 523 00:23:10,170 --> 00:23:13,560 Hur vill du att datorn ska tolka detta mönster bitar? 524 00:23:13,560 --> 00:23:16,320 Så det här är inte något jag skulle generellt rekommendera att göra. 525 00:23:16,320 --> 00:23:19,500 Det är egentligen bara ett exempel för förmedla att du kan absolut 526 00:23:19,500 --> 00:23:22,049 initiera ett heltal till en röding. 527 00:23:22,049 --> 00:23:24,090 Eftersom undersidan av huven på en röding, naturligtvis, 528 00:23:24,090 --> 00:23:26,170 är bara ett nummer från 0 till 255. 529 00:23:26,170 --> 00:23:28,540 >> Så kan du säkert lägga den inne i en int. 530 00:23:28,540 --> 00:23:30,890 Och vad detta även visar är att vi 531 00:23:30,890 --> 00:23:34,040 kan konvertera från en typ till en annan, här, 532 00:23:34,040 --> 00:23:36,780 slutligen skriva ut samma sak. 533 00:23:36,780 --> 00:23:44,760 Och faktiskt, det här kommer jag att fixa online-- var tänkt att säga det, återigen, här. 534 00:23:44,760 --> 00:23:48,610 Låt mig städa upp det på nätet, och vi kommer se i en online-genomgång som behövs, 535 00:23:48,610 --> 00:23:50,280 vad som var tänkt där. 536 00:23:50,280 --> 00:23:50,960 >> OK. 537 00:23:50,960 --> 00:23:53,892 Så sista exemplet nu involverar a: n och b: s och då kommer vi 538 00:23:53,892 --> 00:23:54,850 ta saker upp ett hack. 539 00:23:54,850 --> 00:23:58,330 Så med ett s och B: s och c: si kapitaliseringen 540 00:23:58,330 --> 00:24:01,560 och likvärdighet i detta, låt oss ta en titt på detta exempel här. 541 00:24:01,560 --> 00:24:02,752 Ett annat kodexempel. 542 00:24:02,752 --> 00:24:04,460 Vi ska öppna en som är redan gjort, så vi 543 00:24:04,460 --> 00:24:06,440 behöver inte skriva det alla ut från grunden. 544 00:24:06,440 --> 00:24:09,420 >> Och varsel förväntan Vi använder flera header 545 00:24:09,420 --> 00:24:13,240 filer, bland vilka är vår nya vän, string.h. 546 00:24:13,240 --> 00:24:15,597 Nu ser vid första blick, lite kryptiskt. 547 00:24:15,597 --> 00:24:18,180 Men låt oss se om vi inte kan resonera igenom vad som händer här. 548 00:24:18,180 --> 00:24:21,150 Först får jag en sträng från användaren, och jag sätter den strängen i en variabel 549 00:24:21,150 --> 00:24:22,286 kallas s. 550 00:24:22,286 --> 00:24:24,090 Kopiera klistra från tidigare. 551 00:24:24,090 --> 00:24:27,250 I linje 22, jag är tydligen gör precis vad 552 00:24:27,250 --> 00:24:30,760 Jag gjorde för en stund sedan, jag iteration över tecken i talet. 553 00:24:30,760 --> 00:24:34,780 >> Och de nya tricks här använder stränglängd, den mindre optimering 554 00:24:34,780 --> 00:24:37,930 lagra stränglängden i n, snarare än att kräva strlen igen, 555 00:24:37,930 --> 00:24:38,850 och igen, och igen. 556 00:24:38,850 --> 00:24:41,120 Och bara kontrollera att jag är mindre än n. 557 00:24:41,120 --> 00:24:43,330 Nu här, det blir lite intressant. 558 00:24:43,330 --> 00:24:45,980 Men det är bara en tillämpning av denna samma ny idé. 559 00:24:45,980 --> 00:24:48,470 Vad på engelska gör s fäste jag representerar? 560 00:24:48,470 --> 00:24:51,772 561 00:24:51,772 --> 00:24:54,260 >> PUBLIK: Räkna varje karaktär [ohörbart]. 562 00:24:54,260 --> 00:24:55,926 >> DAVID J. MALAN: Räknar varje tecken. 563 00:24:55,926 --> 00:24:58,680 Och ännu mer kortfattat, s fäste jag representerar vad? 564 00:24:58,680 --> 00:25:00,950 Skulle du säger. 565 00:25:00,950 --> 00:25:04,084 Inte för att sätta dig på plats här. 566 00:25:04,084 --> 00:25:06,375 >> PUBLIK: Well-- 567 00:25:06,375 --> 00:25:09,500 DAVID J. MALAN: Så om ordet är-- om strängen är Zamyla vilket starts-- 568 00:25:09,500 --> 00:25:12,380 PUBLIK: --you behandlar karaktärerna separately-- 569 00:25:12,380 --> 00:25:13,690 DAVID J. MALAN: Bra. 570 00:25:13,690 --> 00:25:14,190 Exakt. 571 00:25:14,190 --> 00:25:17,940 Torget hakparenteser kan du att komma åt varje tecken för sig, 572 00:25:17,940 --> 00:25:21,120 så ar fäste 0 kommer att bli den första tecknet i strängen. 573 00:25:21,120 --> 00:25:24,110 s fäste 1 kommer att bli den andra, och så vidare. 574 00:25:24,110 --> 00:25:28,050 Så frågan jag frågar, Här, i detta tillstånd är vad? 575 00:25:28,050 --> 00:25:33,984 Är det i: te karaktär s större än eller lika till gemener en? 576 00:25:33,984 --> 00:25:36,400 Och vad betyder det, här, med de dubbla et-tecken? 577 00:25:36,400 --> 00:25:36,800 PUBLIK (TILLSAMMANS): Och. 578 00:25:36,800 --> 00:25:37,210 DAVID J. MALAN: Och. 579 00:25:37,210 --> 00:25:38,418 Det är bara motsvarar detta. 580 00:25:38,418 --> 00:25:42,310 Och är inte ett nyckelord i C, måste man användning, irriterande, och-tecken-tecken. 581 00:25:42,310 --> 00:25:47,520 Och det omvänt, frågar är S: te tecknet mindre än eller lika 582 00:25:47,520 --> 00:25:49,030 till gemener z? 583 00:25:49,030 --> 00:25:52,440 Och återigen, det är här där förstå den underliggande 584 00:25:52,440 --> 00:25:54,550 genomförande av ett Datorn är vettigt. 585 00:25:54,550 --> 00:25:57,330 Lägg märke till att även om jag har dot dot dot borta, 586 00:25:57,330 --> 00:26:04,410 ser ut som en till z gemener är alla angränsande värden upp från 97 till upp. 587 00:26:04,410 --> 00:26:07,820 >> Och samma för versaler börjar vid 65. 588 00:26:07,820 --> 00:26:10,410 Så den takeaway, då, är att på engelska, 589 00:26:10,410 --> 00:26:12,760 Hur skulle du beskriva vilken linje 24 gör? 590 00:26:12,760 --> 00:26:15,736 591 00:26:15,736 --> 00:26:16,728 Yeah? 592 00:26:16,728 --> 00:26:21,575 >> PUBLIK: Den 24 det kontroll för att se huruvida varje karaktär är ett gement. 593 00:26:21,575 --> 00:26:24,700 DAVID J. MALAN: Det kontrollera om varje tecken är en liten bokstav. 594 00:26:24,700 --> 00:26:28,590 Så även mer koncist, är den : te karaktär s små bokstäver? 595 00:26:28,590 --> 00:26:30,690 Det är allt vi är uttrycker här logiskt, 596 00:26:30,690 --> 00:26:33,750 lite kryptiskt, men slutligen ganska rättframt. 597 00:26:33,750 --> 00:26:36,480 Är S: te tecken gemener? 598 00:26:36,480 --> 00:26:40,130 >> Om så är fallet, och här är där saker få lite sinne bock 599 00:26:40,130 --> 00:26:44,760 för bara ett ögonblick, i så fall går vidare och skriva ut ett tecken. 600 00:26:44,760 --> 00:26:47,360 Så det här är bara en platshållare, men vad karaktär? 601 00:26:47,360 --> 00:26:53,710 Varför gör jag s fäste i minus detta uttryck här? 602 00:26:53,710 --> 00:26:55,110 >> Väl att märka mönster här. 603 00:26:55,110 --> 00:26:57,380 De faktiska siffrorna spelar ingen roll så mycket. 604 00:26:57,380 --> 00:27:02,700 Men märker att 97 är hur långt bort från 65? 605 00:27:02,700 --> 00:27:03,560 >> Publik: 32. 606 00:27:03,560 --> 00:27:04,480 >> David J. MALAN: 32. 607 00:27:04,480 --> 00:27:06,890 Hur långt bort är 98 från 66? 608 00:27:06,890 --> 00:27:07,740 >> Publik: 32. 609 00:27:07,740 --> 00:27:09,890 >> DAVID J. MALAN: Little c från stora C? 610 00:27:09,890 --> 00:27:10,420 32. 611 00:27:10,420 --> 00:27:14,550 Så det finns 32 humle från ett brev till en annan. 612 00:27:14,550 --> 00:27:17,790 Så ärligt talat jag, kunde förenkla denna till det. 613 00:27:17,790 --> 00:27:20,400 Men då jag typ av hårt kodning denna låga nivå förståelse 614 00:27:20,400 --> 00:27:21,740 att ingen läsare är någonsin kommer att förstå. 615 00:27:21,740 --> 00:27:25,080 Så jag ska generalisera det som jag vet gemener är större. 616 00:27:25,080 --> 00:27:28,400 Jag vet att stora bokstäver är mindre värden, ironiskt nog. 617 00:27:28,400 --> 00:27:33,216 >> Men detta är ett effektivt sätt motsvarar säger subtrahera 32 från s fäste i. 618 00:27:33,216 --> 00:27:35,430 Så i samband med dessa bokstäver, om brevet 619 00:27:35,430 --> 00:27:38,950 råkar vara en, gemener a, och jag subtrahera 32, 620 00:27:38,950 --> 00:27:43,442 vilken effekt har det har, matematiskt, på gemener en? 621 00:27:43,442 --> 00:27:44,400 PUBLIK: Capitalizes-- 622 00:27:44,400 --> 00:27:45,691 David J. MALAN: aktiverar den. 623 00:27:45,691 --> 00:27:48,440 Och faktiskt, det är därför vår Programmet heter kapitalisera noll. 624 00:27:48,440 --> 00:27:51,590 Detta program antingen kapitaliserar ett brev, 625 00:27:51,590 --> 00:27:54,580 efter kontroll om det är verkligen en liten bokstav. 626 00:27:54,580 --> 00:27:59,810 Annars i linje 30, vad gör jag om det är inte en liten bokstav som jag är 627 00:27:59,810 --> 00:28:02,852 tittar på vid en viss iterationen i slingan. 628 00:28:02,852 --> 00:28:03,890 Bara skriva ut den. 629 00:28:03,890 --> 00:28:07,010 >> Så inte byta grejer det är inte ens små bokstäver. 630 00:28:07,010 --> 00:28:10,790 Begränsa dig till lilla a till lite z. 631 00:28:10,790 --> 00:28:12,730 Nu är det här ganska svårbegripliga. 632 00:28:12,730 --> 00:28:15,230 Men i slutet av dagen, det här är hur vi, en gång i tiden, 633 00:28:15,230 --> 00:28:16,460 tvungen att genomföra saker. 634 00:28:16,460 --> 00:28:19,780 Om jag i stället öppna kapitalisera en, åh tack och lov. 635 00:28:19,780 --> 00:28:22,320 Det finns en funktion kallad till övre som kan 636 00:28:22,320 --> 00:28:25,410 göra allt vi gjorde bara på en relativt låg nivå. 637 00:28:25,410 --> 00:28:28,752 >> Nu till den övre är intressant eftersom den är deklarerad i en fil, 638 00:28:28,752 --> 00:28:31,210 och du skulle bara veta detta genom att kontrollera dokumentationen, 639 00:28:31,210 --> 00:28:35,730 eller får höra, säg, i klassen, där den finns i en fil som heter ctype.h. 640 00:28:35,730 --> 00:28:37,630 Så det här är en annan ny vän till oss. 641 00:28:37,630 --> 00:28:40,750 Och för att över gör exakt vad namnet antyder. 642 00:28:40,750 --> 00:28:44,860 >> Du kan skicka in, som ett argument, mellan dessa parenteser, vissa tecken. 643 00:28:44,860 --> 00:28:48,390 Jag kommer att passera i det i: te tecknet av s med hjälp av vår tjusiga nya notation 644 00:28:48,390 --> 00:28:49,870 involverar hakparenteser. 645 00:28:49,870 --> 00:28:53,391 Och ta en gissning, vad är avkastningen värde för övre tydligen gå 646 00:28:53,391 --> 00:28:53,890 att vara? 647 00:28:53,890 --> 00:28:56,460 648 00:28:56,460 --> 00:28:57,770 En stor bokstav. 649 00:28:57,770 --> 00:28:58,620 En stor bokstav. 650 00:28:58,620 --> 00:29:02,330 >> Så om jag passerar med små bokstäver a, förhoppningsvis, per definition av att övre, 651 00:29:02,330 --> 00:29:05,600 det kommer att returnera en versaler A. Annars 652 00:29:05,600 --> 00:29:08,590 om det inte är en liten bokstav i det första jag bara skriva ut den. 653 00:29:08,590 --> 00:29:10,800 Och faktiskt, märker andra vän här. 654 00:29:10,800 --> 00:29:13,840 Inte bara för att över finns, men är lägre, vilket 655 00:29:13,840 --> 00:29:16,200 faktiskt besvarar den frågan för mig. 656 00:29:16,200 --> 00:29:19,730 >> Nu den som skrev dessa saker, 10s år sedan, vet du vad? 657 00:29:19,730 --> 00:29:23,840 Genomfört till övre och sänka med hjälp av koden så här. 658 00:29:23,840 --> 00:29:27,270 Men återigen, i överensstämmelse med denna idé om abstrahera bort, 659 00:29:27,270 --> 00:29:29,190 slags, lägre nivå genomförandet detaljer. 660 00:29:29,190 --> 00:29:32,600 Och står på axlarna av folket som kom före oss, med hjälp av funktioner 661 00:29:32,600 --> 00:29:36,300 liknande för att övre och är lägre, vilket härligt nog är fint 662 00:29:36,300 --> 00:29:40,190 namnges för att säga vad de gör, är en underbar paradigm att anta. 663 00:29:40,190 --> 00:29:44,040 >> Nu visar det sig att om jag läser manualsidan för, säger, till övre, 664 00:29:44,040 --> 00:29:45,010 Jag lär mig något annat. 665 00:29:45,010 --> 00:29:46,890 Så man TOUPPER. 666 00:29:46,890 --> 00:29:48,050 Det är lite överväldigande. 667 00:29:48,050 --> 00:29:51,110 Men varsel, här är det omnämnande av rubrik fil som jag ska använda. 668 00:29:51,110 --> 00:29:54,460 Som en sidoreplik, eftersom detta är vilseledande, den funktion 669 00:29:54,460 --> 00:29:59,070 använder ints stället för chars på grund av felkontroll. 670 00:29:59,070 --> 00:30:01,260 Men vi kanske kommer tillbaka till det i framtiden. 671 00:30:01,260 --> 00:30:05,910 >> Men märker, här, till övre konvertiter bokstaven c till versaler om möjligt. 672 00:30:05,910 --> 00:30:07,674 Så det är ganska enkelt. 673 00:30:07,674 --> 00:30:09,340 Och nu ska vi vara lite mer specifik. 674 00:30:09,340 --> 00:30:12,750 Låt oss titta på den del av Mannen sida under returvärde. 675 00:30:12,750 --> 00:30:15,420 Värdet som returneras är att av den konverterade brev. 676 00:30:15,420 --> 00:30:18,690 Eller c, om omvandlingen inte var möjligt, 677 00:30:18,690 --> 00:30:20,250 där c är den ursprungliga ingången. 678 00:30:20,250 --> 00:30:24,140 Vilket jag vet härifrån, från argumentet till att övre. 679 00:30:24,140 --> 00:30:25,780 >> Så vad är takeaway för detta? 680 00:30:25,780 --> 00:30:28,060 Värdet som returneras är att av den konverterade brev, 681 00:30:28,060 --> 00:30:32,110 eller c, den ursprungliga brev, om omvandlingen var inte möjligt. 682 00:30:32,110 --> 00:30:36,460 Vilka förbättringar kan jag därför göra till min kod design? 683 00:30:36,460 --> 00:30:37,146 Yeah? 684 00:30:37,146 --> 00:30:38,810 >> PUBLIK: Du kan ta bort annat. 685 00:30:38,810 --> 00:30:40,810 DAVID J. MALAN: Jag kan ta bort annat uttalande, 686 00:30:40,810 --> 00:30:42,510 och inte bara annat uttalande. 687 00:30:42,510 --> 00:30:44,150 >> PUBLIK: Du kan ta bort [ohörbart]. 688 00:30:44,150 --> 00:30:46,310 >> DAVID J. MALAN: Jag kan avlägsna hela gaffeln 689 00:30:46,310 --> 00:30:48,209 i vägen, om det helt annat. 690 00:30:48,209 --> 00:30:50,250 Så ja, låt mig öppna den slutliga versionen av det här, 691 00:30:50,250 --> 00:30:55,540 kapitalisera-2 och märker hur, om ni, sexigt, koden är nu får, 692 00:30:55,540 --> 00:31:00,040 i att jag har minskat från vissa sju eller så rader till bara fyra, 693 00:31:00,040 --> 00:31:03,850 den funktionalitet som jag tänkt genom att helt enkelt ringa till övre, 694 00:31:03,850 --> 00:31:09,410 passerar s fäste i, och utskrift ut, med platshållaren% c, 695 00:31:09,410 --> 00:31:11,090 att särskild karaktär. 696 00:31:11,090 --> 00:31:14,560 >> Nu vågar jag påstå, det finns en bugg, eller åtminstone risk för en bugg, 697 00:31:14,560 --> 00:31:15,350 i detta program. 698 00:31:15,350 --> 00:31:18,200 Så bara för att komma tillbaka till ett tidigare takeaway, 699 00:31:18,200 --> 00:31:21,820 vad ska jag nog också göra i detta program för att göra det mer robust, 700 00:31:21,820 --> 00:31:24,974 så att det finns inget sätt den kan krascha, även i sällsynta fall? 701 00:31:24,974 --> 00:31:26,390 PUBLIK: Se till att det inte är NULL. 702 00:31:26,390 --> 00:31:28,056 DAVID J. MALAN: Se till att det inte är NULL. 703 00:31:28,056 --> 00:31:31,030 Så egentligen, för att göra denna super korrekt, jag borde göra något liknande, 704 00:31:31,030 --> 00:31:35,300 Om s är inte NULL, då gå vidare och köra 705 00:31:35,300 --> 00:31:38,470 Dessa rader kod, vilket Jag kan då strecksatsen så där, 706 00:31:38,470 --> 00:31:39,870 och sedan lägga i min nära stag. 707 00:31:39,870 --> 00:31:41,550 Så bra att koppla ihop de båda idéerna. 708 00:31:41,550 --> 00:31:42,429 Yeah? 709 00:31:42,429 --> 00:31:44,470 PUBLIK: Kan du använda a göra medan loop, i stället? 710 00:31:44,470 --> 00:31:47,270 DAVID J. MALAN: Kunde Jag gör en gör while-slinga? 711 00:31:47,270 --> 00:31:50,020 PUBLIK: --you vill vara säker att du faktiskt [ohörbart]. 712 00:31:50,020 --> 00:31:51,728 DAVID J. MALAN: Kunde du använder en gör samtidigt? 713 00:31:51,728 --> 00:31:52,450 Kort svar, nej. 714 00:31:52,450 --> 00:31:54,700 Eftersom du är på väg att införa ett annat hörn fall. 715 00:31:54,700 --> 00:31:56,660 Om strängen är noll längd. 716 00:31:56,660 --> 00:31:59,600 Om till exempel, jag slog bara Enter, utan att någonsin skriva Zamyla. 717 00:31:59,600 --> 00:32:02,490 Jag kommer att lämna tillbaka en faktisk sträng, som vi så småningom får se, 718 00:32:02,490 --> 00:32:03,780 som har noll tecken. 719 00:32:03,780 --> 00:32:05,630 Det är fortfarande en sträng, det är bara super kort. 720 00:32:05,630 --> 00:32:07,960 Men om du använder en gör samtidigt, du kommer att blint 721 00:32:07,960 --> 00:32:10,050 försöka göra något med respekt för den strängen, 722 00:32:10,050 --> 00:32:12,537 och ingenting kommer att vara där. 723 00:32:12,537 --> 00:32:18,607 >> PUBLIK: Tja, om du gjorde göra [ohörbart] samtidigt s-- 724 00:32:18,607 --> 00:32:21,190 DAVID J. MALAN: Åh jag ser, hålla få en sträng från användaren. 725 00:32:21,190 --> 00:32:23,525 Så korta svaret, du kunde, och hålla tjat 726 00:32:23,525 --> 00:32:26,150 dem att ge dig en sträng som är kort nog att passa i minnet. 727 00:32:26,150 --> 00:32:26,700 Absolut. 728 00:32:26,700 --> 00:32:27,630 Jag valde bara att inte. 729 00:32:27,630 --> 00:32:30,505 Om de inte ger mig strängen I vill, jag sluta, jag ger upp. 730 00:32:30,505 --> 00:32:33,260 Men absolut, för detta ändamål, du kan absolut göra det. 731 00:32:33,260 --> 00:32:37,500 >> Så bibliotekets huvudfiler som vi nu känner till är dessa här. 732 00:32:37,500 --> 00:32:41,550 Standard I / O, CS50.h, string.h, ctype.h, och det finns faktiskt andra. 733 00:32:41,550 --> 00:32:44,460 Några av er har upptäckt mattebiblioteket i math.h. 734 00:32:44,460 --> 00:32:48,200 Men låt mig presentera dig, nu, till denna resurs som CS50 personal, Davin, 735 00:32:48,200 --> 00:32:50,630 och Rob och Gabe särskilt har sammanställt. 736 00:32:50,630 --> 00:32:52,630 Det kommer snart att länka på kursens hemsida. 737 00:32:52,630 --> 00:32:54,870 Det kallas CS50 referens. 738 00:32:54,870 --> 00:32:58,230 >> Vilket bara ge dig en snabb smaken av det, fungerar på följande sätt. 739 00:32:58,230 --> 00:33:00,740 Låt mig gå till reference.cs50.net. 740 00:33:00,740 --> 00:33:02,990 Du ser på vänster sida en överväldigande lista 741 00:33:02,990 --> 00:33:04,595 funktioner som kommer med c. 742 00:33:04,595 --> 00:33:07,790 Men om jag bryr mig, för tillfället, om något liknande strlen, 743 00:33:07,790 --> 00:33:08,746 Jag kan skriva det där. 744 00:33:08,746 --> 00:33:10,870 Det filtrerar ner på listan till precis vad jag bryr mig om. 745 00:33:10,870 --> 00:33:11,940 Jag kommer att klicka på den. 746 00:33:11,940 --> 00:33:14,740 Och nu till vänster, ser du vad vi hoppas 747 00:33:14,740 --> 00:33:18,290 är en enklare, mänskliga vänlig förklaring av hur 748 00:33:18,290 --> 00:33:19,170 denna funktion fungerar. 749 00:33:19,170 --> 00:33:20,600 >> Returnerar längden av en sträng. 750 00:33:20,600 --> 00:33:24,060 Här är en sammanfattning, här är hur du använda det i termer av filhuvudet, 751 00:33:24,060 --> 00:33:27,430 och i fråga om vad funktionen ser ut i termer av dess argument. 752 00:33:27,430 --> 00:33:30,250 Och här, returer längden av en sträng. 753 00:33:30,250 --> 00:33:34,280 Men för de av er bekvämare, du faktiskt kan klicka mer bekväma, 754 00:33:34,280 --> 00:33:37,070 och innehållet i detta sida, nu, kommer att ändra 755 00:33:37,070 --> 00:33:41,660 vara standardvärden för vad du får med hjälp av manualsidan. 756 00:33:41,660 --> 00:33:44,100 >> Med andra ord, CS50 referens är en förenkling 757 00:33:44,100 --> 00:33:46,220 av man-sidor av personal, för studenter. 758 00:33:46,220 --> 00:33:49,320 Särskilt de mindre bekväm och däremellan, så att man 759 00:33:49,320 --> 00:33:51,660 behöver inte försöka att linda ditt sinne runt, ärligt talat, 760 00:33:51,660 --> 00:33:55,030 några ganska kryptiska syntax och dokumentation gång. 761 00:33:55,030 --> 00:33:57,650 >> Så ha det i åtanke i dagarna framöver. 762 00:33:57,650 --> 00:33:59,560 Så här, återigen, är en Zamyla. 763 00:33:59,560 --> 00:34:03,255 Låt oss nu ställa en fråga som är lite mer mänsklig åtkomliga. 764 00:34:03,255 --> 00:34:05,380 Tack vare Chang, som varit utskrift fler elefanter 765 00:34:05,380 --> 00:34:07,090 nonstop under de senaste dagarna. 766 00:34:07,090 --> 00:34:09,730 Vi har en möjlighet att ge åtminstone en av dem bort. 767 00:34:09,730 --> 00:34:13,239 Om vi ​​kunde få bara en volontär att komma fram för att dra på skärmen. 768 00:34:13,239 --> 00:34:14,530 Hur här? 769 00:34:14,530 --> 00:34:15,340 >> Kom upp. 770 00:34:15,340 --> 00:34:16,720 Vad heter du? 771 00:34:16,720 --> 00:34:17,219 ALEX: Alex. 772 00:34:17,219 --> 00:34:17,760 DAVID J. MALAN: Alex. 773 00:34:17,760 --> 00:34:18,259 Okej. 774 00:34:18,259 --> 00:34:19,388 Alex, kom upp. 775 00:34:19,388 --> 00:34:21,679 Vi håller på att se ditt handskrift på skärmen här. 776 00:34:21,679 --> 00:34:24,325 777 00:34:24,325 --> 00:34:25,570 Okej, trevligt att träffas. 778 00:34:25,570 --> 00:34:26,429 >> ALEX: Trevligt att du träffas. 779 00:34:26,429 --> 00:34:27,512 >> DAVID J. MALAN: Okej. 780 00:34:27,512 --> 00:34:28,969 Så, super enkel övning. 781 00:34:28,969 --> 00:34:31,440 Bar är inte hög för få en elefant idag. 782 00:34:31,440 --> 00:34:33,439 Du spelar rollen av getString. 783 00:34:33,439 --> 00:34:35,980 Och jag ska bara tala om för dig strängen som du har fått. 784 00:34:35,980 --> 00:34:38,080 Och anta att du, getString, har kallats. 785 00:34:38,080 --> 00:34:42,480 Och människan, som jag, har skrivit i Zamyla, Z-A-M-Y-L-A. 786 00:34:42,480 --> 00:34:45,650 Bara gå vidare och skriva Zamyla på skärmen som om du har fått det 787 00:34:45,650 --> 00:34:47,250 och lagras den någonstans i minnet. 788 00:34:47,250 --> 00:34:52,370 789 00:34:52,370 --> 00:34:55,570 >> Lämnar utrymme för vad som kommer att vara flera andra words-- det är OK, fortsätt. 790 00:34:55,570 --> 00:34:59,620 >> [LAUGHTER] 791 00:34:59,620 --> 00:35:00,800 >> Så Zamyla, Excellent. 792 00:35:00,800 --> 00:35:04,880 Så nu antar att du, getString, kallas på nytt. 793 00:35:04,880 --> 00:35:09,350 Och därför, jag ger dig, vid tangentbord, med ett annat namn, Belinda. 794 00:35:09,350 --> 00:35:17,560 795 00:35:17,560 --> 00:35:18,060 Okej. 796 00:35:18,060 --> 00:35:22,380 Och nu nästa gång getString är heter, jag skriver in något i stil med Gabe, 797 00:35:22,380 --> 00:35:27,560 G-A-B-E. Du är verkligen tar till hjärtat direktminne. 798 00:35:27,560 --> 00:35:29,631 Där man drar allt helt slumpmässigt. 799 00:35:29,631 --> 00:35:30,130 OK. 800 00:35:30,130 --> 00:35:31,104 >> [LAUGHTER] 801 00:35:31,104 --> 00:35:32,520 ALEX: Förlåt min handstil är dålig. 802 00:35:32,520 --> 00:35:33,770 DAVID J. MALAN: Nej, det är OK. 803 00:35:33,770 --> 00:35:40,480 Och vad sägs om Rob, R-O-B. OK. 804 00:35:40,480 --> 00:35:41,020 Bra. 805 00:35:41,020 --> 00:35:43,853 Så jag ville inte föregripa ni skulle slags lägger ut saker på det här sättet. 806 00:35:43,853 --> 00:35:45,020 Men vi kan göra detta arbete. 807 00:35:45,020 --> 00:35:48,810 Så hur gick ni om dessa tecken i minnet? 808 00:35:48,810 --> 00:35:51,310 Med andra ord, om vi tänker på Detta rektangulära svart skärm 809 00:35:51,310 --> 00:35:53,550 som ett utslag datorns RAM eller minne. 810 00:35:53,550 --> 00:35:55,850 >> Och minns att RAM är bara en hel massa byte, 811 00:35:55,850 --> 00:35:57,480 och bytes är en hel massa bitar. 812 00:35:57,480 --> 00:35:59,350 Och bitarna är på något sätt genomföras, generellt 813 00:35:59,350 --> 00:36:01,119 med någon form av el i hårdvara. 814 00:36:01,119 --> 00:36:03,160 Så det är typ av skiktning som vi har pratat om 815 00:36:03,160 --> 00:36:04,510 och kan nu ta för givet. 816 00:36:04,510 --> 00:36:07,020 Hur gick ni tillväga besluta om att skriva 817 00:36:07,020 --> 00:36:11,634 Rob kontra Gabe kontra Belinda kontra Zamyla? 818 00:36:11,634 --> 00:36:14,020 >> ALEX: Jag gjorde just det i förordna att du berättade för mig. 819 00:36:14,020 --> 00:36:15,650 >> DAVID J. MALAN: Och det är sant. 820 00:36:15,650 --> 00:36:20,100 Men vad som regleras där du sätter Belindas namn och Gabe namn? 821 00:36:20,100 --> 00:36:20,764 >> ALEX: Ingenting? 822 00:36:20,764 --> 00:36:22,930 DAVID J. MALAN: [skratt] Så det fungerar, det är bra. 823 00:36:22,930 --> 00:36:25,290 Så datorer är lite mer ordnad än så. 824 00:36:25,290 --> 00:36:29,000 Och så när vi implement-- stanna kvar för bara en moment-- när vi faktiskt 825 00:36:29,000 --> 00:36:31,470 genomföra något liknande GetString i en dator, 826 00:36:31,470 --> 00:36:34,480 Zamyla skulle läggas ut ganska mycket som du gjorde på skärmen, där. 827 00:36:34,480 --> 00:36:36,660 >> Och vad är nyckeln till att märka här, vad Alex gjorde, 828 00:36:36,660 --> 00:36:40,260 är det är lite av en avgränsning bland alla dessa ord, eller hur? 829 00:36:40,260 --> 00:36:46,580 Du skrev inte Z-A-M-Y-L-A-B-E-L-I-N-D-A-G-A-B-- 830 00:36:46,580 --> 00:36:49,740 med andra ord, det finns något slags av avgränsning som verkar vara, 831 00:36:49,740 --> 00:36:52,370 slags, slump avstånd mellan dessa olika ord. 832 00:36:52,370 --> 00:36:54,120 Men det är bra, eftersom vi människor kan nu 833 00:36:54,120 --> 00:36:56,470 visualisera att dessa är fyra olika strängar. 834 00:36:56,470 --> 00:36:59,540 Det är inte bara en sekvens av massor av tecken. 835 00:36:59,540 --> 00:37:04,190 Så en dator, då, under tiden, kan ta en sträng som Zamyla, 836 00:37:04,190 --> 00:37:07,220 lägger var och en av dessa skrivelser insidan av en byte i minnet. 837 00:37:07,220 --> 00:37:10,400 Men den siffran är mycket större, naturligtvis än sex tecken. 838 00:37:10,400 --> 00:37:11,690 >> Det finns en hel massa RAM. 839 00:37:11,690 --> 00:37:15,330 Och så hädanefter, detta rutnät av lådor går 840 00:37:15,330 --> 00:37:17,560 att representera vad Alex precis gjorde här på skärmen. 841 00:37:17,560 --> 00:37:20,937 Och nu, Alex, vi kan erbjuda dig en blå eller en orange elefant från Chang. 842 00:37:20,937 --> 00:37:22,270 ALEX: Jag tar en blå elefant. 843 00:37:22,270 --> 00:37:23,120 DAVID J. MALAN: En blå elefant. 844 00:37:23,120 --> 00:37:25,580 Så en stor applåd, om vi kunde, för Alex här. 845 00:37:25,580 --> 00:37:26,100 >> [Applåder] 846 00:37:26,100 --> 00:37:26,766 >> ALEX: Tack. 847 00:37:26,766 --> 00:37:28,820 DAVID J. MALAN: Tack. 848 00:37:28,820 --> 00:37:36,230 Så takeaway är att, även om den mönster slags förändrats över tid, här 849 00:37:36,230 --> 00:37:40,430 på bordet, det var denna avgränsning mellan de olika strängarna 850 00:37:40,430 --> 00:37:42,610 att Alex fick för oss. 851 00:37:42,610 --> 00:37:45,230 Nu datorer, ärligt talat, skulle kunna göra samma sak. 852 00:37:45,230 --> 00:37:48,210 De kunde slags plopen strängar någonstans i RAM. 853 00:37:48,210 --> 00:37:50,710 Här uppe, här borta, här nere, här nere. 854 00:37:50,710 --> 00:37:52,020 >> De kunde göra just detta. 855 00:37:52,020 --> 00:37:54,280 Men naturligtvis, det är förmodligen inte den bästa planeringen. 856 00:37:54,280 --> 00:37:54,780 Rätt? 857 00:37:54,780 --> 00:37:57,340 Om jag frågade Alex till få namn, förmodligen han hade 858 00:37:57,340 --> 00:38:01,370 lägga lite mer här nere, kanske upp Här, här, här borta, så småningom 859 00:38:01,370 --> 00:38:02,211 här borta. 860 00:38:02,211 --> 00:38:05,460 Men med lite mer planering, förvisso, vi kunde lägga ut saker renare. 861 00:38:05,460 --> 00:38:07,350 Och faktiskt, det är vad en dator gör. 862 00:38:07,350 --> 00:38:10,720 >> Men kruxet är att Om nästa sträng jag får 863 00:38:10,720 --> 00:38:14,050 efter Zamyla är något som Belinda, 864 00:38:14,050 --> 00:38:17,929 förslag där vi kan skriva brev b med avseende på det här nätet? 865 00:38:17,929 --> 00:38:18,720 Vart vill du åka? 866 00:38:18,720 --> 00:38:21,480 Till höger om den a, nedanför z, nedanför a? 867 00:38:21,480 --> 00:38:23,204 Vad skulle dina första instinkter vara? 868 00:38:23,204 --> 00:38:24,120 PUBLIK: Nedanför z. 869 00:38:24,120 --> 00:38:25,100 DAVID J. MALAN: Så nedanför z. 870 00:38:25,100 --> 00:38:26,530 Och det är ganska enkelt, eller hur? 871 00:38:26,530 --> 00:38:29,321 Det är typ av snyggt, det är vad vi gör på ett tangentbord när vi träffar Enter, 872 00:38:29,321 --> 00:38:31,770 eller ett e-post när du gör en punktlista över saker. 873 00:38:31,770 --> 00:38:34,310 Men verkligheten är att datorer försök att vara mer effektiv, 874 00:38:34,310 --> 00:38:37,170 och klämma verkligen så mycket data i RAM som möjligt, 875 00:38:37,170 --> 00:38:38,890 så att du inte slösar några bytes. 876 00:38:38,890 --> 00:38:41,545 Så att du inte slösar någon skärmyta. 877 00:38:41,545 --> 00:38:44,170 Och problemet är dock att om vi sätter bokstav brevet 878 00:38:44,170 --> 00:38:49,940 b efter en, hur ska vi vet var Zamyla namn slutar 879 00:38:49,940 --> 00:38:51,840 och Belinda namn börjar? 880 00:38:51,840 --> 00:38:55,270 Så du människor just föreslagit, ja, tryck på Enter, i huvudsak. 881 00:38:55,270 --> 00:38:56,410 Lägg ner nedan. 882 00:38:56,410 --> 00:38:59,750 Eller till och med som Alex gjorde, bara börja skriva Nästa namn nedan den tidigare, 883 00:38:59,750 --> 00:39:01,583 och nedan som en, och då under den. 884 00:39:01,583 --> 00:39:02,510 Det är en visuell. 885 00:39:02,510 --> 00:39:05,960 >> Datorer har en annan visuell, men det är lite mer kortfattad. 886 00:39:05,960 --> 00:39:07,840 Det är det här funky karaktär. 887 00:39:07,840 --> 00:39:11,890 Omvänt snedstreck 0, som kanske är påminner om bakåtstreck n, 888 00:39:11,890 --> 00:39:12,640 och så vidare, nu. 889 00:39:12,640 --> 00:39:14,120 De särskilda escape-sekvenser. 890 00:39:14,120 --> 00:39:19,120 Omvänt snedstreck 0 är vägen för representerande åtta noll-bitar i rad. 891 00:39:19,120 --> 00:39:22,000 0000 0000. 892 00:39:22,000 --> 00:39:26,130 >> Det sätt du uttrycker som inte är att slår siffran noll på tangentbordet, 893 00:39:26,130 --> 00:39:28,140 eftersom det i själva verket som en ASCII röding. 894 00:39:28,140 --> 00:39:30,990 Det ser ut som ett nummer, men är faktiskt ett decimaltal 895 00:39:30,990 --> 00:39:35,910 som representerar den cirkulära skåra, den runda typsnitt. 896 00:39:35,910 --> 00:39:38,410 Samtidigt bakstreck noll betyder bokstavligen 897 00:39:38,410 --> 00:39:40,700 satte åtta noll byte här för mig. 898 00:39:40,700 --> 00:39:42,136 >> Så det här är något godtycklig. 899 00:39:42,136 --> 00:39:44,260 Vi kunde ha använt något mönster bitar, men världen 900 00:39:44,260 --> 00:39:46,610 beslutade för några år sedan, för ett företräda 901 00:39:46,610 --> 00:39:49,710 i slutet av en sträng i minnet, bara sätta en massa nollor. 902 00:39:49,710 --> 00:39:51,000 Eftersom vi kan upptäcka det. 903 00:39:51,000 --> 00:39:54,790 Nu betyder det att ingen bokstav alfabetet kan representeras med nollor. 904 00:39:54,790 --> 00:39:58,480 >> Men det är OK, vi har redan sett att vi använder 65 på uppe i 97 på upp. 905 00:39:58,480 --> 00:40:00,290 Vi fick inte komma någonstans nära till alla nollor. 906 00:40:00,290 --> 00:40:03,040 907 00:40:03,040 --> 00:40:06,540 Så Belinda i en dators minne faktiskt kommer att gå här. 908 00:40:06,540 --> 00:40:09,764 Jag har ritat den i gult precis fästa vår uppmärksamhet på den. 909 00:40:09,764 --> 00:40:11,680 Och varsel, även detta är helt godtycklig. 910 00:40:11,680 --> 00:40:12,680 Jag har ritat det som ett rutnät. 911 00:40:12,680 --> 00:40:14,460 Liksom, är RAM bara några fysiskt objekt. 912 00:40:14,460 --> 00:40:17,300 Det behöver inte nödvändigtvis rader och kolumner, per se. 913 00:40:17,300 --> 00:40:20,490 Det har precis fått en massa byte implementeras i hårdvara på något sätt. 914 00:40:20,490 --> 00:40:22,817 Men om det efter Belinda I skrev i Gabe namn, 915 00:40:22,817 --> 00:40:25,650 han kommer att hamna här i minnet, och om jag skrev i Daven namn, 916 00:40:25,650 --> 00:40:27,316 till exempel, han kommer att hamna här. 917 00:40:27,316 --> 00:40:29,310 Och jag kan fortsätta att skriva ännu fler namn. 918 00:40:29,310 --> 00:40:32,100 >> Tyvärr, om jag försöker skriva ett super långt namn, 919 00:40:32,100 --> 00:40:33,730 Jag skulle så småningom slut på minne. 920 00:40:33,730 --> 00:40:37,810 I vilket fall är getString kommer att återvända NULL, som vi sa. 921 00:40:37,810 --> 00:40:41,720 Men tack och lov, åtminstone i denna visuella Här fick vi inte riktigt så långt. 922 00:40:41,720 --> 00:40:45,860 >> Nu vad är trevligt är att detta allmän uppfattning om att behandla saker 923 00:40:45,860 --> 00:40:49,720 som i lådor är företrädare för en funktion i C 924 00:40:49,720 --> 00:40:52,690 och en hel del språk, känd som en array. 925 00:40:52,690 --> 00:40:55,490 En matris är en annan typ av data. 926 00:40:55,490 --> 00:40:57,380 Det är en datastruktur, om man så vill. 927 00:40:57,380 --> 00:41:01,160 Struktur i betydelsen det verkligen, typ av, ser ut som en låda, åtminstone 928 00:41:01,160 --> 00:41:02,320 i ditt inre öga. 929 00:41:02,320 --> 00:41:09,680 En matris är ett sammanhängande sekvens av identiska datatyper, 930 00:41:09,680 --> 00:41:11,330 rygg mot rygg mot rygg mot rygg. 931 00:41:11,330 --> 00:41:14,720 >> Så en sträng, i andra ord är en samling av tecken. 932 00:41:14,720 --> 00:41:16,120 En mängd tecken. 933 00:41:16,120 --> 00:41:19,070 Men det visar sig att du kan få arrayer av klasar av saker. 934 00:41:19,070 --> 00:41:21,870 I själva verket kan vi lägga ännu siffror i en array. 935 00:41:21,870 --> 00:41:23,920 Så i vilken form vi ska börja 936 00:41:23,920 --> 00:41:26,590 att förklara dessa data struktur känd som en matris 937 00:41:26,590 --> 00:41:28,250 kommer också att använda hakparenteser. 938 00:41:28,250 --> 00:41:31,500 Men dessa hakparenteser kommer att har olika betydelse i sammanhanget. 939 00:41:31,500 --> 00:41:33,450 >> Och låt oss se det så här. 940 00:41:33,450 --> 00:41:36,780 Antag att jag öppnade upp en ny fil här. 941 00:41:36,780 --> 00:41:38,535 Och jag spara detta som ages.c. 942 00:41:38,535 --> 00:41:41,280 943 00:41:41,280 --> 00:41:43,470 Och jag ska spara detta i min mapp här. 944 00:41:43,470 --> 00:41:46,130 Och nu ska jag gå vidare och börja skriva något 945 00:41:46,130 --> 00:41:53,940 som inkluderar CS50.h, inkluderar stdio.h, int main ogiltiga. 946 00:41:53,940 --> 00:41:57,370 Och sedan inne i här, jag vill ha att först ha en int kallas ålder. 947 00:41:57,370 --> 00:42:01,371 >> Och jag kommer att använda det för att få en int från användaren för hans eller hennes ålder. 948 00:42:01,371 --> 00:42:04,620 Men detta program är tänkt att användas av flera personer, för oavsett sammanhang. 949 00:42:04,620 --> 00:42:05,490 Jag har en rad av människor. 950 00:42:05,490 --> 00:42:08,281 Alla har att skriva in sina åldern för kanske några, jag vet inte, 951 00:42:08,281 --> 00:42:10,530 konkurrens, eller händelse att de har kommit för. 952 00:42:10,530 --> 00:42:13,030 Så nästa person, jag behöver en annan variabel. 953 00:42:13,030 --> 00:42:15,790 >> För om jag bara ålder blir getInt, det är 954 00:42:15,790 --> 00:42:18,500 kommer att clobber, eller skriva över föregående personens ålder. 955 00:42:18,500 --> 00:42:19,760 Så det är inte bra. 956 00:42:19,760 --> 00:42:21,790 Så min första instinkt skulle kunna vara, oh, okej, 957 00:42:21,790 --> 00:42:26,260 om jag vill få flera människors ages-- låt oss kalla detta ålder1, 958 00:42:26,260 --> 00:42:31,280 int age2 får int, int ålder 3 blir getInt. 959 00:42:31,280 --> 00:42:35,340 Och nu ska jag använda vissa pseudokoden här. 960 00:42:35,340 --> 00:42:37,679 >> Gör något med dessa siffror. 961 00:42:37,679 --> 00:42:40,470 Vi lämnar för en annan dag vad vi gör det, eftersom vi bara 962 00:42:40,470 --> 00:42:44,200 vård för tillfället om ålder1, age2, ålder 3. 963 00:42:44,200 --> 00:42:46,450 Tyvärr, när jag kompilera programmet 964 00:42:46,450 --> 00:42:51,140 och satte den framför faktiska användare, vad är det i grunden dålig design 965 00:42:51,140 --> 00:42:53,890 beslut jag verkar ha gjort? 966 00:42:53,890 --> 00:42:54,624 Yeah? 967 00:42:54,624 --> 00:42:55,499 PUBLIK: [ohörbart] 968 00:42:55,499 --> 00:42:58,071 969 00:42:58,071 --> 00:42:59,820 DAVID J. MALAN: Ja, Jag har inte ens försökt 970 00:42:59,820 --> 00:43:02,028 att räkna ut hur många åldrar gör jag faktiskt bryr sig om? 971 00:43:02,028 --> 00:43:05,380 Om jag har färre än tre personer här, och därmed färre än tre åldrar, 972 00:43:05,380 --> 00:43:07,260 Jag är fortfarande blint väntar tre. 973 00:43:07,260 --> 00:43:08,720 Gud förbjude fyra människor dyker upp. 974 00:43:08,720 --> 00:43:10,990 Mitt program bara inte ens stödja dem. 975 00:43:10,990 --> 00:43:13,280 >> Och så detta, lång historia Kort sagt, är inte en bra vana. 976 00:43:13,280 --> 00:43:13,780 Rätt? 977 00:43:13,780 --> 00:43:16,530 Jag var i grunden att kopiera och klistra in koden och bara tweaking 978 00:43:16,530 --> 00:43:17,430 variabelnamn. 979 00:43:17,430 --> 00:43:22,410 Och, min Gud, om du hade, inte tre åldrar, men 10, eller 100, eller till och med 6500 980 00:43:22,410 --> 00:43:23,820 studenter, till exempel. 981 00:43:23,820 --> 00:43:26,950 Detta kommer inte att vara särskilt elegant kod eller hållbart. 982 00:43:26,950 --> 00:43:29,200 Du kommer att behöva skriva om programmet varje gång 983 00:43:29,200 --> 00:43:30,760 ditt antal människor ändringar. 984 00:43:30,760 --> 00:43:35,090 >> Så tack och lov, i våra faktiska ages.c fil för i dag, 985 00:43:35,090 --> 00:43:36,970 vi har en smartare lösning. 986 00:43:36,970 --> 00:43:39,800 Först kommer jag att låna konstruerar vi har använt ett par gånger, 987 00:43:39,800 --> 00:43:43,744 detta göra medan loop, för att få antalet personer i rummet. 988 00:43:43,744 --> 00:43:46,910 Jag ska bara tjata användaren, igen och igen, tills han eller hon ger mig 989 00:43:46,910 --> 00:43:49,260 ett värde på n som är ett positivt heltal. 990 00:43:49,260 --> 00:43:51,590 >> Jag kunde ha använt, senaste tid oss ​​få positiva int. 991 00:43:51,590 --> 00:43:53,720 Men vi har inte den på riktigt, så jag gick framåt 992 00:43:53,720 --> 00:43:55,660 och åter genomfört denna idé. 993 00:43:55,660 --> 00:43:58,410 Nu här nere, detta är den nya trick. 994 00:43:58,410 --> 00:44:02,260 I linje 27, som kommentarerna i linje 26 antyder, 995 00:44:02,260 --> 00:44:05,180 deklarera en array där att lagra alla ålder. 996 00:44:05,180 --> 00:44:09,320 >> Så om du vill komma, inte en int, inte två Ints, men en hel massa Ints. 997 00:44:09,320 --> 00:44:13,800 Specifikt n heltal, var n kanske vara tre, kanske 100, kanske 1000. 998 00:44:13,800 --> 00:44:17,570 Syntaxen, helt enkelt, är att säg, vilken datatyp vill du ha? 999 00:44:17,570 --> 00:44:19,620 Vad vill du att ringa den del av minnet? 1000 00:44:19,620 --> 00:44:23,530 Vad vill du kalla nätet som ser ut så här bildmässigt? 1001 00:44:23,530 --> 00:44:27,700 >> Och inom parentes här, säger du hur stor du vill att matrisen ska vara. 1002 00:44:27,700 --> 00:44:30,450 Och så tidigare, när jag sade syntaxen är lite annorlunda här, 1003 00:44:30,450 --> 00:44:33,614 vi fortfarande använder hakparenteser, men när jag förklara en matris, 1004 00:44:33,614 --> 00:44:35,530 Antalet insidan av hakparentes medel 1005 00:44:35,530 --> 00:44:37,610 hur stor vill du matrisen ska vara. 1006 00:44:37,610 --> 00:44:42,490 >> Däremot när vi använde s fäste jag för en stund sedan, s, en sträng, 1007 00:44:42,490 --> 00:44:46,820 är verkligen en samling av tecken, men när du inte deklarera en variabel, 1008 00:44:46,820 --> 00:44:49,760 som med detta sökord här, du bara få 1009 00:44:49,760 --> 00:44:54,280 ett specifikt index, en specifik elementet från att arrayen. 1010 00:44:54,280 --> 00:44:57,090 När vi vet det, resten av detta är enkel. 1011 00:44:57,090 --> 00:45:00,765 Om ny jag först kommer att skriva ut vad är en ålder av personnummer i. 1012 00:45:00,765 --> 00:45:03,890 Där jag säger bara personen nummer ett, person nummer två, person nummer tre. 1013 00:45:03,890 --> 00:45:06,306 >> Och jag gör bara aritmetik, så att som vanliga människor, 1014 00:45:06,306 --> 00:45:09,030 Vi räknar från en för detta program, och inte från noll. 1015 00:45:09,030 --> 00:45:13,620 Då jag kallar getInt, men jag lagra svaret i åldrarna bracket jag. 1016 00:45:13,620 --> 00:45:16,610 Vilket är det i: te ålder i arrayen. 1017 00:45:16,610 --> 00:45:21,640 Så medan förra gången vi behandlar dessa lådor som tecken för Zamyla namn, 1018 00:45:21,640 --> 00:45:22,490 och andra. 1019 00:45:22,490 --> 00:45:26,530 Nu, dessa rutor representerar 32 bitar, eller fyra byte 1020 00:45:26,530 --> 00:45:29,510 där vi kan lagra en int, int, en int. 1021 00:45:29,510 --> 00:45:31,890 Allt som, återigen, är samma datatyp. 1022 00:45:31,890 --> 00:45:33,890 >> Nu gör jag något dumt, som tiden går, precis 1023 00:45:33,890 --> 00:45:35,510 att motivera att skriva det här programmet. 1024 00:45:35,510 --> 00:45:40,050 Och sedan ner här, jag återigen iterera över gruppen säger om ett år, 1025 00:45:40,050 --> 00:45:43,090 personen nummer ett kommer vara något år gammal. 1026 00:45:43,090 --> 00:45:45,010 Och att räkna ut att math-- Jag menar, det här 1027 00:45:45,010 --> 00:45:49,260 är inte mycket komplicerat arithmetic-- Jag lägger bara en till deras ålder. 1028 00:45:49,260 --> 00:45:51,240 Bara för att visa att, återigen, det här. 1029 00:45:51,240 --> 00:45:57,910 >> Precis som jag kan indexera till en sträng, s, så kan jag index i en array av åldrar, 1030 00:45:57,910 --> 00:45:59,950 sånt där. 1031 00:45:59,950 --> 00:46:03,340 Så vart kommer detta att vara med oss? 1032 00:46:03,340 --> 00:46:07,070 Så vi får se, i slutändan, en få saker i de kommande dagarna. 1033 00:46:07,070 --> 00:46:09,510 En, hela tiden, då skriva dina egna program, 1034 00:46:09,510 --> 00:46:11,239 som Mario, giriga, kredit. 1035 00:46:11,239 --> 00:46:13,780 Du har skriva namnet på programmet och slå Enter. 1036 00:46:13,780 --> 00:46:15,610 Och sedan få användarens input. 1037 00:46:15,610 --> 00:46:18,137 >> Med getString, getInt, getLongLong, eller liknande. 1038 00:46:18,137 --> 00:46:20,720 Men det visar sig att C-stöd något som kallas kommandoraden 1039 00:46:20,720 --> 00:46:25,740 argument, som kommer att låta oss faktiskt få på ord som du skriver, 1040 00:46:25,740 --> 00:46:28,570 på blinkande prompten, efter programmets namn. 1041 00:46:28,570 --> 00:46:31,430 >> Så i de kommande dagarna, du kanske skriver något i stil med Caesar, 1042 00:46:31,430 --> 00:46:34,950 eller ./caesar nummer 13, därefter. 1043 00:46:34,950 --> 00:46:36,070 Vi får se hur det fungerar. 1044 00:46:36,070 --> 00:46:37,550 Eftersom faktiskt, i Problemet set två, vi är 1045 00:46:37,550 --> 00:46:39,383 kommer att presentera dig till en liten sak 1046 00:46:39,383 --> 00:46:42,360 påminner om Ralphie utmana tidigare i kartografi. 1047 00:46:42,360 --> 00:46:43,970 Konsten att förvränga informationen. 1048 00:46:43,970 --> 00:46:46,660 Detta är i själva verket är mycket påminner om vad Ralphie gjorde. 1049 00:46:46,660 --> 00:46:51,380 >> Detta är ett exempel på en krypterings algoritm kallas rot13, R-O-T 13. 1050 00:46:51,380 --> 00:46:54,910 Vilket betyder helt enkelt rotera bokstäver i alfabetet 13 platser. 1051 00:46:54,910 --> 00:46:58,309 Och om du gör det, ser du nu vad som är, kanske, en bekant fras. 1052 00:46:58,309 --> 00:47:01,100 Men hur vi kommer att använda detta i slutändan är mer generellt. 1053 00:47:01,100 --> 00:47:04,390 >> I P set två, i standardversionen, du kommer att genomföra ett par chiffer, 1054 00:47:04,390 --> 00:47:06,720 en som heter Caesar, en som heter Vigenère. 1055 00:47:06,720 --> 00:47:10,090 Båda är roterande chiffer, i det något du 1056 00:47:10,090 --> 00:47:11,826 vända en bokstav till en annan bokstav. 1057 00:47:11,826 --> 00:47:12,950 Och Caesar är super enkelt. 1058 00:47:12,950 --> 00:47:16,220 Du lägger en, du lägger till 13, eller något nummer upp till 26. 1059 00:47:16,220 --> 00:47:19,570 Vigenère gör det på en per bokstav basis. 1060 00:47:19,570 --> 00:47:22,140 Så Vigenère, som du ser i spec, är säkrare. 1061 00:47:22,140 --> 00:47:24,973 >> Men i slutet av dagen vad du ska genomföra och P set två, 1062 00:47:24,973 --> 00:47:29,050 är att nyckeln som du använder både för kryptering och dekryptering. 1063 00:47:29,050 --> 00:47:32,160 Med hänvisning till processen för att vrida vanlig text, vissa ursprungliga meddelandet, 1064 00:47:32,160 --> 00:47:34,490 i cypher text, som är något krypterad. 1065 00:47:34,490 --> 00:47:36,220 Och sedan dekryptera det igen. 1066 00:47:36,220 --> 00:47:38,119 >> I hackaren upplagan, Samtidigt kommer du att 1067 00:47:38,119 --> 00:47:40,660 uppgift att något liknande i anden, där vi ger dig 1068 00:47:40,660 --> 00:47:44,610 en fil från en typisk Linux, eller Mac eller Unix-dator som heter etsy 1069 00:47:44,610 --> 00:47:47,800 lösenord, som innehåller en hel gäng användarnamn och lösenord. 1070 00:47:47,800 --> 00:47:50,932 Och dessa lösenord har alla krypterats eller hashas, 1071 00:47:50,932 --> 00:47:53,140 så att säga, mer korrekt som du ser i spec. 1072 00:47:53,140 --> 00:47:57,090 >> Och hacker utgåvan kommer att utmana dig att ta en ingång så här, 1073 00:47:57,090 --> 00:47:58,800 och sprickbildning lösenordet. 1074 00:47:58,800 --> 00:48:02,590 Det vill säga, att räkna ut vad det människans lösenord faktiskt var. 1075 00:48:02,590 --> 00:48:05,570 Jo, faktiskt, lösenorden är allmänhet inte lagras i klartext, 1076 00:48:05,570 --> 00:48:08,260 och generellt words borde vara svårt att gissa. 1077 00:48:08,260 --> 00:48:09,610 Det är inte ofta fallet. 1078 00:48:09,610 --> 00:48:12,110 >> Och vad jag trodde att vi skulle göra är avsluta med ett par minuter 1079 00:48:12,110 --> 00:48:15,160 blick på en särskilt dåligt val av lösenord 1080 00:48:15,160 --> 00:48:17,260 från en film som du kanske kommer ihåg ömt. 1081 00:48:17,260 --> 00:48:18,915 Och om inte, bör du hyra. 1082 00:48:18,915 --> 00:48:20,070 >> [VIDEOAVSPELNING] 1083 00:48:20,070 --> 00:48:22,320 >> -Helmet, Du ovän, vad som händer? 1084 00:48:22,320 --> 00:48:24,240 Vad gör du med min dotter? 1085 00:48:24,240 --> 00:48:28,010 >> -Permit Mig presentera den lysande unga plastikkirurg, 1086 00:48:28,010 --> 00:48:30,010 Doktor Phillip Schlotkin. 1087 00:48:30,010 --> 00:48:35,020 Den största näsoperation man i hela universum och Beverly Hills. 1088 00:48:35,020 --> 00:48:36,140 >> -Din höghet. 1089 00:48:36,140 --> 00:48:36,820 >> -Nose Jobb? 1090 00:48:36,820 --> 00:48:37,700 Jag förstår inte. 1091 00:48:37,700 --> 00:48:39,070 Hon har redan haft en näsoperation. 1092 00:48:39,070 --> 00:48:40,800 Det var hennes söta 16 närvarande. 1093 00:48:40,800 --> 00:48:42,590 >> Nej, det är inte som du tror. 1094 00:48:42,590 --> 00:48:44,490 Det är mycket, mycket värre. 1095 00:48:44,490 --> 00:48:48,160 Om du inte ger mig kombination med luftskärm, 1096 00:48:48,160 --> 00:48:52,748 Läkaren Schlotkin ger din dotter tillbaka sin gamla näsa. 1097 00:48:52,748 --> 00:48:53,748 - [Flämtar] Nooooooooooooo. 1098 00:48:53,748 --> 00:48:57,684 1099 00:48:57,684 --> 00:48:59,652 Var har du fått det? 1100 00:48:59,652 --> 00:49:00,640 >> -Okej. 1101 00:49:00,640 --> 00:49:02,506 Jag säger, jag ska säga. 1102 00:49:02,506 --> 00:49:03,498 >> Nej, pappa, nej. 1103 00:49:03,498 --> 00:49:04,490 Du får inte. 1104 00:49:04,490 --> 00:49:06,090 >> Du har rätt min kära. 1105 00:49:06,090 --> 00:49:07,390 Jag kommer att sakna din nya näsa. 1106 00:49:07,390 --> 00:49:10,990 Men jag kommer inte att berätta för dem att kombination oavsett vad. 1107 00:49:10,990 --> 00:49:12,450 >> -Väldigt Väl. 1108 00:49:12,450 --> 00:49:14,830 Doktor Schlotkin, gör din värsta. 1109 00:49:14,830 --> 00:49:15,744 >> -Min Nöje. 1110 00:49:15,744 --> 00:49:19,860 1111 00:49:19,860 --> 00:49:20,800 >> -Nej! 1112 00:49:20,800 --> 00:49:22,780 Vänta, vänta. 1113 00:49:22,780 --> 00:49:24,000 Jag ska berätta. 1114 00:49:24,000 --> 00:49:25,830 Jag ska berätta. 1115 00:49:25,830 --> 00:49:28,270 >> Jag visste att det skulle fungera. 1116 00:49:28,270 --> 00:49:31,390 Okej, ge det till mig. 1117 00:49:31,390 --> 00:49:36,220 >> -The Kombination är en. 1118 00:49:36,220 --> 00:49:36,740 >> -En. 1119 00:49:36,740 --> 00:49:37,473 >> -En. 1120 00:49:37,473 --> 00:49:37,972 -Två. 1121 00:49:37,972 --> 00:49:38,471 -Två. 1122 00:49:38,471 --> 00:49:39,800 -Två. 1123 00:49:39,800 --> 00:49:40,300 -Tre. 1124 00:49:40,300 --> 00:49:40,800 -Tre. 1125 00:49:40,800 --> 00:49:41,800 -Tre. 1126 00:49:41,800 --> 00:49:42,300 -Fyra. 1127 00:49:42,300 --> 00:49:42,800 -Fyra. 1128 00:49:42,800 --> 00:49:44,707 -Fyra. 1129 00:49:44,707 --> 00:49:45,521 -Fem. 1130 00:49:45,521 --> 00:49:46,430 -Fem. 1131 00:49:46,430 --> 00:49:47,930 -Fem. 1132 00:49:47,930 --> 00:49:53,480 -Sĺ Kombinationen är ett, två, tre, fyra, fem. 1133 00:49:53,480 --> 00:49:56,140 Det är det dummaste kombinationen Jag någonsin hör i mitt liv. 1134 00:49:56,140 --> 00:49:58,640 Det är sånt en idiot skulle ha på sitt bagage. 1135 00:49:58,640 --> 00:50:00,000 >> Tack, ers höghet. 1136 00:50:00,000 --> 00:50:01,340 >> [REMOTE CLICKS] 1137 00:50:01,340 --> 00:50:02,450 >> Vad gjorde du? 1138 00:50:02,450 --> 00:50:03,800 >> Jag stängde av muren. 1139 00:50:03,800 --> 00:50:05,010 >> Nej, det gjorde du inte, du avstängd hela filmen. 1140 00:50:05,010 --> 00:50:06,220 >> Jag måste har tryckte på fel knapp. 1141 00:50:06,220 --> 00:50:07,064 >> -Tja, Lägger tillbaka den! 1142 00:50:07,064 --> 00:50:07,910 Sätt upp videon på! 1143 00:50:07,910 --> 00:50:08,300 >> Ja, sir! 1144 00:50:08,300 --> 00:50:08,799 Ja, sir. 1145 00:50:08,799 --> 00:50:09,660 -Vi Går, Arnold. 1146 00:50:09,660 --> 00:50:10,450 Kom, Gretchen. 1147 00:50:10,450 --> 00:50:12,533 Naturligtvis vet du jag ska måste fakturera dig för det här. 1148 00:50:12,533 --> 00:50:16,720 1149 00:50:16,720 --> 00:50:17,220 -Tja? 1150 00:50:17,220 --> 00:50:17,802 Fungerade det? 1151 00:50:17,802 --> 00:50:18,510 Var är kungen? 1152 00:50:18,510 --> 00:50:20,218 >> -Det Arbetade, sir, vi har kombinationen. 1153 00:50:20,218 --> 00:50:20,740 Bra. 1154 00:50:20,740 --> 00:50:24,810 Nu kan vi ta varje sista andetag av frisk luft från planeten Druidia. 1155 00:50:24,810 --> 00:50:25,890 Vad är kombinationen? 1156 00:50:25,890 --> 00:50:28,155 >> Ett, två, tre, fyra, fem. 1157 00:50:28,155 --> 00:50:29,890 >> Ett, två, tre, fyra, fem? 1158 00:50:29,890 --> 00:50:30,390 -Ja. 1159 00:50:30,390 --> 00:50:31,110 -Det Är fantastiskt. 1160 00:50:31,110 --> 00:50:34,550 Jag har samma kombination på mitt bagage. 1161 00:50:34,550 --> 00:50:37,160 Förbered Spaceball 1 för omedelbara avgång. 1162 00:50:37,160 --> 00:50:38,160 >> Ja, sir. 1163 00:50:38,160 --> 00:50:40,745 >> -Och Ändra kombination på mitt bagage. 1164 00:50:40,745 --> 00:50:41,578 [Dörrstängnings SOUND] 1165 00:50:41,578 --> 00:50:42,064 [CLINK AV DÖRRAR SLÅ HJÄLM] 1166 00:50:42,064 --> 00:50:42,550 -Ahh. 1167 00:50:42,550 --> 00:50:43,383 [END VIDEOAVSPELNING] 1168 00:50:43,383 --> 00:50:46,700 DAVID J. MALAN: Det är den för CS50, vi ses nästa vecka. 1169 00:50:46,700 --> 00:50:49,883 BERÄTTARE: Och nu, Djup Tankar, av Daven Farnham. 1170 00:50:49,883 --> 00:50:53,160 1171 00:50:53,160 --> 00:50:55,860 >> Daven FARNHAM: Kodning i C är så mycket hårdare än Scratch. 1172 00:50:55,860 --> 00:50:57,320 printf, Scratch var en lögn. 1173 00:50:57,320 --> 00:50:59,930 1174 00:50:59,930 --> 00:51:01,430 >> [LAUGHTER Soundbite] 1175 00:51:01,430 --> 00:51:02,486