1 00:00:00,000 --> 00:00:00,980 2 00:00:00,980 --> 00:00:04,410 >> [Musikk spilles] 3 00:00:04,410 --> 00:00:11,147 4 00:00:11,147 --> 00:00:12,230 DAVID J. MALAN: All right. 5 00:00:12,230 --> 00:00:16,440 Dette er CS50, og denne er slutten av uke 2. 6 00:00:16,440 --> 00:00:18,480 Så i dag skal vi å fortsette vår look 7 00:00:18,480 --> 00:00:21,150 på hvordan vi representerer ting under hood-- beveger seg bort 8 00:00:21,150 --> 00:00:23,520 fra tall som heltall og flytende punkt verdier 9 00:00:23,520 --> 00:00:26,810 og fokusere på strenger og instans mer interessante programmer. 10 00:00:26,810 --> 00:00:30,140 Men vi vil også ta en titt på en par domenespesifikke problems-- 11 00:00:30,140 --> 00:00:33,620 den første av disse vil være involverer kryptografi, 12 00:00:33,620 --> 00:00:36,570 kunsten scrambling informasjon, der du ser ovenfor her 13 00:00:36,570 --> 00:00:41,480 er et bilde av Radio Orphan Annie hemmelig dekoder ring fra en svunnen tid. 14 00:00:41,480 --> 00:00:46,490 >> Dette er faktisk veldig primitiv form og barnevennlig form for cryptopgraphy 15 00:00:46,490 --> 00:00:50,590 idet denne ringen har to disks-- en inne og en ute. 16 00:00:50,590 --> 00:00:54,740 Og ved å rotere en av disse, kan du hovedsak stille opp bokstaver som A 17 00:00:54,740 --> 00:00:59,520 gjennom Z med andre bokstaver som B gjennom A. Med andre ord, 18 00:00:59,520 --> 00:01:03,730 du kan bokstavelig talt rotere alfabetet, dermed kommer opp med en kartlegging fra 19 00:01:03,730 --> 00:01:07,820 brev til bokstaver slik at hvis du ønsket å sende en hemmelig melding 20 00:01:07,820 --> 00:01:11,820 til noen som Annie, kan du skrive ned meldingen din og roter 21 00:01:11,820 --> 00:01:15,370 bokstavene, der, hvis du mener å si "A," deg i stedet si "B" 22 00:01:15,370 --> 00:01:17,280 du mener å si "B" du i stedet si "C" - 23 00:01:17,280 --> 00:01:20,240 eller noe litt mer smart enn at-- og deretter, til slutt, 24 00:01:20,240 --> 00:01:24,630 så lenge Annie har denne dekoderen ring, kan hun dekode meldingen. 25 00:01:24,630 --> 00:01:28,540 Nå kan du husker, faktisk, at dette ble anvendt i en veldig kjent film som 26 00:01:28,540 --> 00:01:31,140 spiller ad nauseum under jula. 27 00:01:31,140 --> 00:01:32,650 La oss ta en titt her. 28 00:01:32,650 --> 00:01:35,294 29 00:01:35,294 --> 00:01:37,210 Ralphie PARKER: "Det være seg kjent for alle i sammendraget 30 00:01:37,210 --> 00:01:41,000 at Ralph Parker er herved utnevnt medlem av Little Orphan Annie Secret 31 00:01:41,000 --> 00:01:44,860 Sirkel og har krav på alle de æresbevisninger og fordeler som skjer i dette. " 32 00:01:44,860 --> 00:01:47,410 >> Ralphie PARKER (lydkommentar): Signert 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 blekk. 35 00:01:51,490 --> 00:01:55,494 Honors og fordeler, allerede i en alder av ni. 36 00:01:55,494 --> 00:01:57,402 >> [Musikk spilles] 37 00:01:57,402 --> 00:02:00,470 >> [RADIO SKRAVLE] 38 00:02:00,470 --> 00:02:01,470 Ralphie PARKER: Kom igjen. 39 00:02:01,470 --> 00:02:02,344 La oss fortsette med det. 40 00:02:02,344 --> 00:02:06,029 Jeg trenger ikke all that jazz om smuglere og pirater. 41 00:02:06,029 --> 00:02:08,820 Radiostemme: Lytt i morgen natt for den avsluttende eventyr 42 00:02:08,820 --> 00:02:11,060 av The Black Pirate Ship. 43 00:02:11,060 --> 00:02:14,740 Nå er det tid for Annies Secret beskjed til deg medlemmer 44 00:02:14,740 --> 00:02:17,110 av Secret Circle. 45 00:02:17,110 --> 00:02:20,700 Husk barn, bare medlemmer av Annie Secret Circle 46 00:02:20,700 --> 00:02:23,270 kan dekode Annie hemmelige budskap. 47 00:02:23,270 --> 00:02:27,270 >> Husk, er Annie avhengig av deg. 48 00:02:27,270 --> 00:02:30,060 Still dine pins til B-2. 49 00:02:30,060 --> 00:02:34,004 Her er Message-- 12, 11, 2-- 50 00:02:34,004 --> 00:02:36,503 Ralphie PARKER (lydkommentar): Jeg er i min første hemmelig møte. 51 00:02:36,503 --> 00:02:40,041 Radiostemme: --25, 14, 11, 18, 16-- 52 00:02:40,041 --> 00:02:42,790 Ralphie PARKER (lydkommentar): Å, Pierre var i stor stemme i kveld. 53 00:02:42,790 --> 00:02:46,110 Jeg kunne fortelle at kveldens Budskapet var veldig viktig. 54 00:02:46,110 --> 00:02:47,930 >> Radiostemme: --3, 25. 55 00:02:47,930 --> 00:02:49,940 Det er en melding fra Annie selv. 56 00:02:49,940 --> 00:02:52,182 Husk, ikke si det til noen. 57 00:02:52,182 --> 00:02:55,077 >> [Pesende] 58 00:02:55,077 --> 00:02:57,285 Ralphie PARKER (lydkommentar): Nitti sekunder senere, er jeg 59 00:02:57,285 --> 00:03:00,090 i det eneste rommet i hus hvor en gutt på ni 60 00:03:00,090 --> 00:03:04,380 kunne sitte i ro og dekode. 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 >> [Humrer] 64 00:03:06,524 --> 00:03:08,684 >> Ralphie PARKER (lydkommentar): Jeg gikk til den neste. 65 00:03:08,684 --> 00:03:09,610 "E." 66 00:03:09,610 --> 00:03:11,641 Det første ordet er "være." 67 00:03:11,641 --> 00:03:12,140 Ja! 68 00:03:12,140 --> 00:03:14,293 Det kom lettere nå. 69 00:03:14,293 --> 00:03:15,259 "U." 70 00:03:15,259 --> 00:03:16,225 >> [Humrer] 71 00:03:16,225 --> 00:03:18,157 >> RANDY PARKER: Aw, kom igjen, Ralphie. 72 00:03:18,157 --> 00:03:19,606 Jeg må gå! 73 00:03:19,606 --> 00:03:21,538 >> Ralphie PARKER: Jeg kommer rett ned, Ma. 74 00:03:21,538 --> 00:03:22,504 Jøss. 75 00:03:22,504 --> 00:03:25,402 76 00:03:25,402 --> 00:03:31,220 "T." "O." "Pass til. "" Pass på å "hva? 77 00:03:31,220 --> 00:03:33,981 Hva var Little Orphan Annie prøver å si? "Sørg for å" hva? 78 00:03:33,981 --> 00:03:35,522 MOR: Ralphie, Randy har fått til å gå. 79 00:03:35,522 --> 00:03:36,735 Kan du komme ut? 80 00:03:36,735 --> 00:03:38,190 >> Ralphie PARKER: All right, mamma! 81 00:03:38,190 --> 00:03:39,787 Jeg kommer straks! 82 00:03:39,787 --> 00:03:41,995 Ralphie PARKER (lydkommentar): Jeg begynte å bli nærmere nå. 83 00:03:41,995 --> 00:03:43,370 Spenningen var forferdelig. 84 00:03:43,370 --> 00:03:44,794 Hva var det? 85 00:03:44,794 --> 00:03:47,656 Skjebnen til planeten kan henge i balanse. 86 00:03:47,656 --> 00:03:50,518 >> MOR: Ralphie, Randy må jo gå! 87 00:03:50,518 --> 00:03:53,635 >> Ralphie PARKER: Jeg kommer straks ut, for roper høyt! 88 00:03:53,635 --> 00:03:55,343 Ralphie PARKER (Lydkommentar): Nesten der! 89 00:03:55,343 --> 00:03:56,520 Fingrene mine fløy! 90 00:03:56,520 --> 00:03:58,500 Mitt sinn var en stål felle. 91 00:03:58,500 --> 00:03:59,850 Hver pore vibrerte. 92 00:03:59,850 --> 00:04:01,806 Det var nesten klar! 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: "Pass å drikke din 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 kommersielle? 101 00:04:17,539 --> 00:04:19,439 >> [Musikk spilles] 102 00:04:19,439 --> 00:04:21,724 >> Ralphie PARKER: Drittsekk. 103 00:04:21,724 --> 00:04:23,460 >> [Ler] 104 00:04:23,460 --> 00:04:27,070 >> DAVID J. MALAN: Så det er da et glimt på hva kryptografi 105 00:04:27,070 --> 00:04:29,880 kan være for dette-- en drikke fra en svunnen tid. 106 00:04:29,880 --> 00:04:30,900 Så en rask kunngjøring. 107 00:04:30,900 --> 00:04:33,410 Hvis du er fri denne Fredag ​​kl 13:15 og ville 108 00:04:33,410 --> 00:04:36,610 liker å bli med oss ​​for CS50 lunsj, hodet til denne nettadressen her. 109 00:04:36,610 --> 00:04:38,080 Først til mølla som vanlig. 110 00:04:38,080 --> 00:04:41,840 Men over tid, vil vi sørge for at mest alle som ønsker å delta 111 00:04:41,840 --> 00:04:43,640 kan planlegge-messig. 112 00:04:43,640 --> 00:04:45,170 >> Så strenger. 113 00:04:45,170 --> 00:04:47,940 Vi har Zamyla-- hvem du nå har møtt mest sannsynlig 114 00:04:47,940 --> 00:04:50,750 i oppgavesettet 1-- som navnet er stavet slik. 115 00:04:50,750 --> 00:04:53,570 Og antar at du skrev navnet hennes inn i et datamaskinprogram som er 116 00:04:53,570 --> 00:04:55,710 bruke noe sånt som getString. 117 00:04:55,710 --> 00:04:57,890 For å hente disse tastetrykk, hvordan 118 00:04:57,890 --> 00:05:01,620 kan vi gå om representerer en streng, et ord, et avsnitt, 119 00:05:01,620 --> 00:05:03,960 eller flere bokstaver som disse her? 120 00:05:03,960 --> 00:05:06,790 >> Vi snakket sist gang om heltall og problemer 121 00:05:06,790 --> 00:05:09,960 som oppstår med heltallsoverflyt og flytende punkt verdier 122 00:05:09,960 --> 00:05:12,190 og problemer som oppstår i presisjon. 123 00:05:12,190 --> 00:05:16,080 Med strenger, vi minst har litt mer fleksibilitet 124 00:05:16,080 --> 00:05:17,970 fordi strings-- bare i den virkelige verden-- 125 00:05:17,970 --> 00:05:19,790 kan være en ganske vilkårlig lengde. 126 00:05:19,790 --> 00:05:21,055 Ganske kort, ganske lenge. 127 00:05:21,055 --> 00:05:23,680 Men selv da, skal vi finne at datamaskiner kan noen ganger 128 00:05:23,680 --> 00:05:27,200 går tom for minne og ikke engang lagre et stort nok streng. 129 00:05:27,200 --> 00:05:30,840 >> Men for nå, la oss begynne å visualisere en streng som noe i disse boksene 130 00:05:30,840 --> 00:05:31,340 her. 131 00:05:31,340 --> 00:05:36,410 Så seks slike bokser, som hver representerer et tegn eller "røye." 132 00:05:36,410 --> 00:05:40,646 Så husker at "char" - c-h-en-r-- er en av de innebygde datatyper i C. 133 00:05:40,646 --> 00:05:43,520 Og hva som er fint er at du kan bruke den slags som en byggesten, 134 00:05:43,520 --> 00:05:47,880 et puslespill brikke, om du vil, for å danne en større type data som vi vil fortsette 135 00:05:47,880 --> 00:05:49,410 å kalle en "streng". 136 00:05:49,410 --> 00:05:53,650 >> Nå, hva er nyttig om å tenke om ting som strenger på denne måten? 137 00:05:53,650 --> 00:05:57,720 Vel, det viser seg at vi kan faktisk utnytte denne strukturen 138 00:05:57,720 --> 00:06:01,420 å faktisk få tilgang til enkelttegn i en ganske grei måte. 139 00:06:01,420 --> 00:06:04,099 Jeg kommer til å gå videre og skape en fil som heter "stringzero.c," 140 00:06:04,099 --> 00:06:05,765 men du kan kalle det hva du vil. 141 00:06:05,765 --> 00:06:08,500 Og på kurset hjemmeside er allerede dette eksempelet på forhånd 142 00:06:08,500 --> 00:06:10,430 slik at du ikke trenger å skriver alt ut. 143 00:06:10,430 --> 00:06:13,820 >> Og jeg kommer til å gå videre og først gjøre int main annullert. 144 00:06:13,820 --> 00:06:15,980 Og i løpet av få dager, vi begynner å erte hverandre 145 00:06:15,980 --> 00:06:19,070 hva tomrommet er her, hvorfor det er int ved siden av hoved, og så videre. 146 00:06:19,070 --> 00:06:21,180 Men for nå, la oss fortsette å kopiere lime det. 147 00:06:21,180 --> 00:06:23,455 >> Jeg kommer til å erklære en streng kalt s. 148 00:06:23,455 --> 00:06:26,920 Og jeg kommer til å returnere fra GetString hva brukeren taster inn. 149 00:06:26,920 --> 00:06:29,170 Dette kommer til å være en enkel program, ingen instruksjoner, 150 00:06:29,170 --> 00:06:31,336 Jeg skal bare blindt forvente at brukeren vet 151 00:06:31,336 --> 00:06:32,600 hva du skal gjøre for å holde det enkelt. 152 00:06:32,600 --> 00:06:34,220 >> Og nå kommer jeg til å ha en for loop. 153 00:06:34,220 --> 00:06:37,450 Og innsiden av min for loop jeg er kommer til å ha int jeg får null. 154 00:06:37,450 --> 00:06:40,660 Og jeg er, igjen, bare en konvensjon, en indeks variabel for telling, 155 00:06:40,660 --> 00:06:42,350 men jeg kunne kalle dette hva jeg vil. 156 00:06:42,350 --> 00:06:46,275 Jeg kommer til å gjøre jeg er mindre than-- godt Zamyla navn er seks bokstaver. 157 00:06:46,275 --> 00:06:48,150 Så jeg kommer til hardt kode som det for nå. 158 00:06:48,150 --> 00:06:49,730 >> Og så i ++. 159 00:06:49,730 --> 00:06:53,190 Og nå inne i disse krøllete bukseseler jeg kommer til å gjøre printf, 160 00:06:53,190 --> 00:06:55,460 og jeg ønsker å skrive ut én tegn om gangen. 161 00:06:55,460 --> 00:06:58,227 Så jeg kommer til å bruke% c for kanskje den første gangen. 162 00:06:58,227 --> 00:07:00,560 Og så vil jeg skrive ut hver tegnet på sin egen linje. 163 00:07:00,560 --> 00:07:02,550 Så jeg kommer til å sette en lite backslash n der. 164 00:07:02,550 --> 00:07:03,640 Lukk sitat. 165 00:07:03,640 --> 00:07:06,250 >> Og nå ønsker jeg å gjøre noe her. 166 00:07:06,250 --> 00:07:10,610 Jeg ønsker å skrive ut bestemt bokstav i strengen, 167 00:07:10,610 --> 00:07:13,670 s, som jeg gjentar fra null på opp til seks. 168 00:07:13,670 --> 00:07:17,150 Med andre ord, jeg vil skrive ut i'th karakter s. 169 00:07:17,150 --> 00:07:18,420 Nå hvordan kan jeg gjøre dette? 170 00:07:18,420 --> 00:07:21,550 >> Vel mye som boksene i denne representasjonen her, 171 00:07:21,550 --> 00:07:25,560 slags, trylle frem tanken om boksing bokstaver i, kan du på samme måte gjøre det 172 00:07:25,560 --> 00:07:32,630 syntaktisk i C ved ganske enkelt å spesifisere, Jeg ønsker å skrive ut s'er i'th karakter. 173 00:07:32,630 --> 00:07:35,640 Bruke hakeparenteser på datamaskinens tastatur 174 00:07:35,640 --> 00:07:38,910 som på et norsk tastatur er generelt over din retur-tasten. 175 00:07:38,910 --> 00:07:42,630 >> Så dette er ikke helt riktig ennå, som du kanskje har lagt merke til. 176 00:07:42,630 --> 00:07:44,780 Men jeg kommer til å slags blindt videre her. 177 00:07:44,780 --> 00:07:47,020 Og jeg kommer til å gjør streng 0. 178 00:07:47,020 --> 00:07:50,860 Men før jeg gjør dette, la oss se om vi kan ikke forutse noen vanlige feil. 179 00:07:50,860 --> 00:07:52,844 Dette kommer til å kompilere? 180 00:07:52,844 --> 00:07:54,510 Nei, jeg mangler en hel haug med ting. 181 00:07:54,510 --> 00:07:55,280 Bibliotekene jeg hørt. 182 00:07:55,280 --> 00:07:58,480 >> Så hvilken header filer kanskje jeg vil legge til her? 183 00:07:58,480 --> 00:07:59,205 Yeah. 184 00:07:59,205 --> 00:08:01,580 >> PUBLIKUM: Du trenger standard I / O [uhørbart] 185 00:08:01,580 --> 00:08:02,663 >> DAVID J. MALAN: Excellent. 186 00:08:02,663 --> 00:08:06,060 Så jeg trenger standard I / O. For hva Hensikten ønsker jeg standard I / O? 187 00:08:06,060 --> 00:08:06,670 For printf. 188 00:08:06,670 --> 00:08:09,220 Så inkluderer stdio.h. 189 00:08:09,220 --> 00:08:13,490 Og du også foreslå at jeg inkludere den CS50 biblioteket for hvilken grunn? 190 00:08:13,490 --> 00:08:14,650 Å ha strenger. 191 00:08:14,650 --> 00:08:17,780 Så vi får se hva CS50 bibliotek gjør 192 00:08:17,780 --> 00:08:19,260 å lage denne forestillingen om en streng. 193 00:08:19,260 --> 00:08:21,930 Men for nå, kan du bare tenke på det som en faktisk datatype. 194 00:08:21,930 --> 00:08:23,596 >> Så det ser ut til å bli litt ryddet opp. 195 00:08:23,596 --> 00:08:27,060 Og nå kommer jeg til å gå videre og faktisk gjør strengen 0. 196 00:08:27,060 --> 00:08:27,700 Kompilert. 197 00:08:27,700 --> 00:08:28,370 Så det er bra. 198 00:08:28,370 --> 00:08:32,799 Så ./string0 la meg zoome inn slik at vi kan se nærmere på hva som skjer. 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 inn. 201 00:08:37,789 --> 00:08:39,440 Og vi har skrevet ut til Zamyla navn. 202 00:08:39,440 --> 00:08:40,409 >> Så det er ganske bra. 203 00:08:40,409 --> 00:08:43,220 Så nå la oss gå videre og kjøre dette programmet på nytt, 204 00:08:43,220 --> 00:08:45,659 og skriv ut Daven fullt navn. 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 ikke skrevet Daven sin fulle første navnet riktig. 209 00:08:51,750 --> 00:08:54,250 Nå skal dette være tydelig i ettertid på grunn av det, 210 00:08:54,250 --> 00:08:57,010 liksom, dumme valg med tanke? 211 00:08:57,010 --> 00:08:59,590 >> Ja, jeg hardkodet den seks innsiden av min for loop. 212 00:08:59,590 --> 00:09:01,610 Nå gjorde jeg det bare fordi Jeg visste Zamyla navn 213 00:09:01,610 --> 00:09:02,776 skulle være seks bokstaver. 214 00:09:02,776 --> 00:09:04,720 Men sikkert dette er ikke en generell løsning. 215 00:09:04,720 --> 00:09:07,720 Så det viser seg at vi kan dynamisk regne ut lengden av en streng 216 00:09:07,720 --> 00:09:10,440 ved å kalle en funksjon som heter strlen. 217 00:09:10,440 --> 00:09:12,840 >> Igjen, bevisst konsist heter bare 218 00:09:12,840 --> 00:09:14,450 å gjøre det mer praktisk å skrive. 219 00:09:14,450 --> 00:09:17,170 Men det er synonymt med blir lengden av en streng. 220 00:09:17,170 --> 00:09:23,190 Jeg kommer til å gå tilbake til min terminal vindu og re-run kompilatoren. 221 00:09:23,190 --> 00:09:24,170 Men det er roping på meg. 222 00:09:24,170 --> 00:09:29,130 Implisitt erklære bibliotekfunksjon strlen med type unsigned int const-- 223 00:09:29,130 --> 00:09:29,780 Jeg er tapt. 224 00:09:29,780 --> 00:09:30,590 Helt. 225 00:09:30,590 --> 00:09:32,940 >> Så, særlig ettersom din øynene begynner å glasur over 226 00:09:32,940 --> 00:09:36,000 med feilmeldinger som dette, fokus ærlig på de første ordene. 227 00:09:36,000 --> 00:09:38,590 Vi vet at problemet er i linje 8, som vist her. 228 00:09:38,590 --> 00:09:40,500 Og det er i streng-0.c. 229 00:09:40,500 --> 00:09:43,580 Implisitt erklære bibliotekfunksjon strlen. 230 00:09:43,580 --> 00:09:47,000 Slik som generelt skal være et mønster av feilmeldinger. 231 00:09:47,000 --> 00:09:49,190 Implisitt erklære noe. 232 00:09:49,190 --> 00:09:53,250 >> Så kort sagt, hva har jeg syntes å ha gjort med hensyn til linje 8, her. 233 00:09:53,250 --> 00:09:56,880 Hva kan være løsningen være enda hvis du aldri har brukt strlen deg selv? 234 00:09:56,880 --> 00:09:58,907 >> PUBLIKUM: En del av et annet bibliotek? 235 00:09:58,907 --> 00:10:00,740 DAVID J. MALAN: Part av et annet bibliotek. 236 00:10:00,740 --> 00:10:02,400 Så det er erklært, så å si. 237 00:10:02,400 --> 00:10:07,510 Det er nevnt i noen fil annet enn stdio.h og CS50.h. 238 00:10:07,510 --> 00:10:09,179 Nå hvor er det definert? 239 00:10:09,179 --> 00:10:12,220 For å være ærlig, du enten nødt til å bare vet dette på toppen av hodet, 240 00:10:12,220 --> 00:10:13,640 eller du Google dette og finne ut. 241 00:10:13,640 --> 00:10:18,150 Eller vet dette, har jeg åpnet opp i CS50 apparat terminalprogrammet, som 242 00:10:18,150 --> 00:10:22,200 er bare den store, versjonen av full skjerm hva som er i bunnen av gedit vindu. 243 00:10:22,200 --> 00:10:24,970 >> Og det viser seg at det er en Tilsvar fyndig kommando, kalt 244 00:10:24,970 --> 00:10:29,280 mann for manuell, der hvis du skriver inn navnet på en funksjon og trykk Enter, 245 00:10:29,280 --> 00:10:32,240 du får tilbake ganske uforståelige dokumentasjon. 246 00:10:32,240 --> 00:10:35,299 Det er bare teksten som generelt ser litt noe sånt som dette. 247 00:10:35,299 --> 00:10:37,090 Det er litt overveldende ved første øyekast. 248 00:10:37,090 --> 00:10:39,048 Men ærlig jeg kommer til å la mine øyne glasur over 249 00:10:39,048 --> 00:10:41,930 og bare fokusere på den delen Jeg bryr meg om for øyeblikket. 250 00:10:41,930 --> 00:10:42,780 >> Som er denne. 251 00:10:42,780 --> 00:10:45,470 Som ser strukturelt like noe jeg er kjent med. 252 00:10:45,470 --> 00:10:48,080 Faktisk mannen siden, så å snakke, vil fortelle deg 253 00:10:48,080 --> 00:10:51,590 i hvilken header sende inn en funksjon som strlen er definert. 254 00:10:51,590 --> 00:10:54,170 Så jeg kommer til å gå tilbake nå til gedit. 255 00:10:54,170 --> 00:10:59,070 Og jeg kommer til å gå videre og legge inn her #include 256 00:10:59,070 --> 00:11:00,480 og lagre filen. 257 00:11:00,480 --> 00:11:04,300 >> Jeg kommer til å tømme skjermen med Kontroll L Hvis du har vært lurer på. 258 00:11:04,300 --> 00:11:08,210 Og jeg kommer til å kjøre make string.0, kompilerer denne gangen. 259 00:11:08,210 --> 00:11:11,790 ./string.0 Zamyla. 260 00:11:11,790 --> 00:11:15,020 Som syntes å fungere La meg gå foran og kjør den med Davenport. 261 00:11:15,020 --> 00:11:15,860 Enter. 262 00:11:15,860 --> 00:11:17,730 Og det også, syntes å fungere. 263 00:11:17,730 --> 00:11:21,220 >> Så vi kan gjøre det litt bedre enn dette, skjønt, kan vi begynne å rydde ting 264 00:11:21,220 --> 00:11:23,257 opp bare en liten bit. 265 00:11:23,257 --> 00:11:25,590 Og jeg skal faktisk introdusere en annen ting nå. 266 00:11:25,590 --> 00:11:28,930 Jeg kommer til å gå videre og lagre dette i en annen fil. 267 00:11:28,930 --> 00:11:31,770 Og jeg kommer til å ringe denne filen string1.c bare 268 00:11:31,770 --> 00:11:34,620 til å være i samsvar med koden vil du være i stand til å finne på nettet. 269 00:11:34,620 --> 00:11:37,050 >> Og la oss fokusere på nøyaktig den samme koden. 270 00:11:37,050 --> 00:11:39,000 Det viser seg at jeg har vært litt taking 271 00:11:39,000 --> 00:11:42,600 for gitt det faktum at min laptop, og i sin tur, CS50 apparatet 272 00:11:42,600 --> 00:11:47,450 har mye minne, mye RAM, mange byte av plass 273 00:11:47,450 --> 00:11:48,920 der jeg kan lagre strenger. 274 00:11:48,920 --> 00:11:53,560 >> Men realiteten hvis jeg skrev lang nok, og nok tastetrykk, 275 00:11:53,560 --> 00:11:56,170 Jeg kunne i teorien typen i flere tegn 276 00:11:56,170 --> 00:11:58,830 enn min datamaskin fysisk har minne for. 277 00:11:58,830 --> 00:11:59,830 Og dette er problematisk. 278 00:11:59,830 --> 00:12:03,050 Mye som en int kan bare telle så høyt, i teorien, 279 00:12:03,050 --> 00:12:06,600 du kan bare stappe så mange tegn inn i datamaskinens RAM eller Random 280 00:12:06,600 --> 00:12:07,920 Access Memory. 281 00:12:07,920 --> 00:12:11,140 >> Så jeg hadde bedre forutse dette problemet, selv 282 00:12:11,140 --> 00:12:13,660 om det kan være en sjelden hjørne tilfelle, så å si. 283 00:12:13,660 --> 00:12:15,670 Skjer ikke så ofte, kunne skje. 284 00:12:15,670 --> 00:12:18,815 Og hvis det skjer, og jeg gjør ikke forutse og program for det, 285 00:12:18,815 --> 00:12:20,300 mitt program kan gjøre hvem vet hva. 286 00:12:20,300 --> 00:12:22,220 Fryse, henge, reboot, uansett. 287 00:12:22,220 --> 00:12:24,490 Noe forventet kan skje. 288 00:12:24,490 --> 00:12:27,120 >> Så hva jeg skal gjøre nå, heretter egentlig, 289 00:12:27,120 --> 00:12:31,630 er før jeg noensinne blindt bruke en variabel som s som 290 00:12:31,630 --> 00:12:36,790 er blitt tildelt returverdi noen annen funksjon som getstring, 291 00:12:36,790 --> 00:12:40,200 Jeg kommer til å sørge for at at verdien er gyldig. 292 00:12:40,200 --> 00:12:44,280 Så jeg vet bare fra å ha lest CS50 dokumentasjon for getstring, 293 00:12:44,280 --> 00:12:49,020 som til slutt vil vi peke deg i, at getstring returnerer et spesielt symbol 294 00:12:49,020 --> 00:12:53,610 kalt NULL, N-U-L-L i alt caps, hvis noe går galt. 295 00:12:53,610 --> 00:12:55,650 >> Så normalt, returnerer den en streng. 296 00:12:55,650 --> 00:12:59,700 Men ellers dersom det returnerer N-U-L-L-- Vi vil til slutt se hva som virkelig 297 00:12:59,700 --> 00:13:01,790 means-- som bare betyr noe dårlig skjedde. 298 00:13:01,790 --> 00:13:05,560 Nå betyr dette, mye som i Scratch, Jeg kan sjekke en tilstand her i C, 299 00:13:05,560 --> 00:13:08,830 Hvis s ikke lik NULL. 300 00:13:08,830 --> 00:13:11,930 Så hvis du ikke har sett dette før, Dette betyr bare ikke lik. 301 00:13:11,930 --> 00:13:15,290 >> Så det er det motsatte av like likemenn, som, husker, 302 00:13:15,290 --> 00:13:18,940 er forskjellig fra enkelt likemenn, som er oppdraget. 303 00:13:18,940 --> 00:13:23,030 Så hvis s er ikke lik NULL, bare da gjøre 304 00:13:23,030 --> 00:13:25,980 Jeg ønsker å utføre disse linjene med kode. 305 00:13:25,980 --> 00:13:28,080 Så med andre ord, før jeg dykke i blindt 306 00:13:28,080 --> 00:13:30,919 og starte itera i løpet av s, og behandle det 307 00:13:30,919 --> 00:13:33,710 som om det er en sekvens av tegn, kommer jeg til å først sjekke, 308 00:13:33,710 --> 00:13:37,900 vent litt, er s definitivt ikke lik denne spesielle verdi, NULL? 309 00:13:37,900 --> 00:13:40,030 >> Fordi hvis det er, kan dårlige ting skje. 310 00:13:40,030 --> 00:13:43,080 Og for nå, antar at dårlige ting skjer betyr at programmet krasjer, 311 00:13:43,080 --> 00:13:45,070 og du kan ikke nødvendigvis gjenopprette. 312 00:13:45,070 --> 00:13:46,800 Så ærlig, det ser styggere. 313 00:13:46,800 --> 00:13:48,660 det er slags forvirrende nå å se på. 314 00:13:48,660 --> 00:13:50,780 Men dette vil bli mer kjent før lenge. 315 00:13:50,780 --> 00:13:52,920 >> Men jeg kommer til å foreslå nå en annen forbedring. 316 00:13:52,920 --> 00:13:54,660 Det er en forbedring av korrekthet. 317 00:13:54,660 --> 00:13:58,800 Mitt program er nå mer korrekt, fordi i sjeldne tilfelle at ikke nok minne 318 00:13:58,800 --> 00:14:01,180 eksisterer, vil jeg klare det, og jeg vil bare gjøre ingenting. 319 00:14:01,180 --> 00:14:02,680 Jeg i hvert fall ikke vil krasje. 320 00:14:02,680 --> 00:14:05,000 >> Men la oss gjøre en endelig versjon her. 321 00:14:05,000 --> 00:14:07,690 Og en fil som heter string2.c. 322 00:14:07,690 --> 00:14:10,190 Jeg kommer til å lime det samme koden for bare et øyeblikk, 323 00:14:10,190 --> 00:14:14,210 og jeg kommer til å markere dette linje, 11, her, for bare et øyeblikk. 324 00:14:14,210 --> 00:14:18,179 Nå realiteten er at smarte kompilatorer som Clang kunne fikse dette for oss 325 00:14:18,179 --> 00:14:19,970 bak kulissene uten vår noensinne vite. 326 00:14:19,970 --> 00:14:24,670 Men la oss tenke på dette fundamentalt som en problematisk design. 327 00:14:24,670 --> 00:14:29,010 >> Denne kodelinje er naturligvis sa initial litt variabel jeg til 0. 328 00:14:29,010 --> 00:14:30,260 Det er ganske grei. 329 00:14:30,260 --> 00:14:34,691 Og hva er igjen dette uttalelse, her, i ++, gjør? 330 00:14:34,691 --> 00:14:37,066 Vi har sett det før, men vi gjorde egentlig ikke snakke om det. 331 00:14:37,066 --> 00:14:37,900 >> PUBLIKUM: økes i. 332 00:14:37,900 --> 00:14:39,191 >> DAVID J. MALAN rykkes jeg. 333 00:14:39,191 --> 00:14:41,890 Så på hver iterasjon gjennom denne sløyfen, hver syklus, 334 00:14:41,890 --> 00:14:43,570 du økes jeg etter en. 335 00:14:43,570 --> 00:14:45,740 Så det blir større og større, og større til løkken avsluttes. 336 00:14:45,740 --> 00:14:46,810 Hvordan avslutte det? 337 00:14:46,810 --> 00:14:49,430 Vel det er denne middel tilstand som vi har brukt før. 338 00:14:49,430 --> 00:14:52,500 Du har sett og i walkthroughs i P sett. 339 00:14:52,500 --> 00:14:53,880 >> Men hva er dette ord? 340 00:14:53,880 --> 00:14:58,352 Gjør følgende loop slik lenge i er mindre enn hva? 341 00:14:58,352 --> 00:14:59,810 PUBLIKUM: Lengden av strengen. 342 00:14:59,810 --> 00:15:01,518 DAVID J. MALAN: The lengden av strengen. 343 00:15:01,518 --> 00:15:04,300 Så det betyr ganske renslig til engelsk i den forstand. 344 00:15:04,300 --> 00:15:08,810 Nå er problemet er at hver gang jeg iterere gjennom denne sløyfen i teorien, 345 00:15:08,810 --> 00:15:10,000 Jeg stiller dette spørsmålet. 346 00:15:10,000 --> 00:15:12,250 Er jeg mindre enn strengen lengden av s? 347 00:15:12,250 --> 00:15:14,500 Er jeg mindre enn strengen lengden av s? 348 00:15:14,500 --> 00:15:18,380 >> Nå er jeg endrer på hver iterasjon? 349 00:15:18,380 --> 00:15:18,880 Det er det. 350 00:15:18,880 --> 00:15:19,629 På grunn av den ++. 351 00:15:19,629 --> 00:15:21,700 Så hver iterasjon jeg blir større. 352 00:15:21,700 --> 00:15:25,411 Men er s blir større, eller mindre, eller endring i det hele tatt? 353 00:15:25,411 --> 00:15:25,910 Nei 354 00:15:25,910 --> 00:15:30,240 Så i form av design, en av aksene langs som vi prøver å evaluere kode 355 00:15:30,240 --> 00:15:32,610 i klassen, føles dette litt dumt. 356 00:15:32,610 --> 00:15:34,690 >> Som du er bokstavelig talt, på hver iterasjon 357 00:15:34,690 --> 00:15:37,110 av denne sløyfen spørre samme jævla spørsmålet igjen, 358 00:15:37,110 --> 00:15:40,770 og igjen, og igjen, og bokstavelig talt det aldri kommer til å forandre seg. 359 00:15:40,770 --> 00:15:44,220 I hvert fall hvis jeg ikke berøre s og forsøker å endre innholdet i s. 360 00:15:44,220 --> 00:15:46,610 Så jeg kan gjøre det litt bedre enn dette. 361 00:15:46,610 --> 00:15:49,530 >> Og hva jeg skal gjøre er ikke erklære bare én variabel i, 362 00:15:49,530 --> 00:15:53,330 men en annen variabel jeg skal vilkårlig, men konvensjonelt, kall det n. 363 00:15:53,330 --> 00:15:55,940 Tildel n lik strenglengden s. 364 00:15:55,940 --> 00:15:59,090 Og så over her, kommer jeg til å gjøre en smart liten optimalisering, så 365 00:15:59,090 --> 00:16:03,460 tale, som på slutten av dagen ikke er mer korrekt eller ikke mindre korrekt 366 00:16:03,460 --> 00:16:04,260 enn før. 367 00:16:04,260 --> 00:16:05,500 Men det er et bedre design. 368 00:16:05,500 --> 00:16:09,480 I det faktum at jeg bruker kortere tid, færre CPU-sykluser, så 369 00:16:09,480 --> 00:16:14,040 å snakke, for å svare på det samme spørsmål, men bare en gang. 370 00:16:14,040 --> 00:16:17,870 >> Eventuelle spørsmål om at generell prinsippet om bedring, 371 00:16:17,870 --> 00:16:21,294 si, et program effektivitet? 372 00:16:21,294 --> 00:16:21,991 Yeah? 373 00:16:21,991 --> 00:16:23,699 PUBLIKUM: Hvorfor gjør du bruke [uhørbart]? 374 00:16:23,699 --> 00:16:25,760 375 00:16:25,760 --> 00:16:27,010 DAVID J. MALAN: Godt spørsmål. 376 00:16:27,010 --> 00:16:30,690 Så hvorfor setter vi ++ på enden av Jeg i stedet for i begynnelsen av jeg? 377 00:16:30,690 --> 00:16:33,070 I dette tilfellet, har det ingen funksjonell betydning. 378 00:16:33,070 --> 00:16:36,670 Og generelt, kan jeg ofte bruke postfix operatør 379 00:16:36,670 --> 00:16:41,750 slik at det er litt mer tydelig som å når operasjonen skjer. 380 00:16:41,750 --> 00:16:46,670 >> For de som ikke kjenner, det er en annen uttalelser der du kan gjøre ++ jeg. 381 00:16:46,670 --> 00:16:48,747 Dette er funksjonelt tilsvarende i dette tilfellet 382 00:16:48,747 --> 00:16:51,080 fordi det er ingenting annet rundt som incrementation. 383 00:16:51,080 --> 00:16:54,435 Men du kan komme opp med saker og linjer med kode 384 00:16:54,435 --> 00:16:55,810 i hvilken det er en forskjell. 385 00:16:55,810 --> 00:16:57,810 Så generelt, gjør vi ikke engang snakke om denne. 386 00:16:57,810 --> 00:17:00,690 Fordi ærlig, gjør det kode mer sexy, og liksom stiligere, 387 00:17:00,690 --> 00:17:01,776 og færre tegn. 388 00:17:01,776 --> 00:17:04,859 Men realiteten er at det er mye vanskeligere, Jeg tror, ​​selv for meg å vikle meg 389 00:17:04,859 --> 00:17:07,319 rundt det noen ganger, rekkefølgen av operasjoner. 390 00:17:07,319 --> 00:17:09,750 Så som en side, hvis du egentlig ikke liker dette, 391 00:17:09,750 --> 00:17:14,650 selv om dette er slags sexy ser, kan du også gjøre i + = 1, 392 00:17:14,650 --> 00:17:18,880 som er den uglier versjon av samme ideen for postfix incrementation. 393 00:17:18,880 --> 00:17:22,250 >> Jeg sier dette, og du bør gjøre narr av det, 394 00:17:22,250 --> 00:17:25,140 men du vil komme til å se kode som noe vakkert før lenge. 395 00:17:25,140 --> 00:17:27,160 >> [Latter] 396 00:17:27,160 --> 00:17:28,410 >> DAVID J. MALAN: Høyre? 397 00:17:28,410 --> 00:17:29,360 Yeah. 398 00:17:29,360 --> 00:17:30,480 Spørsmål i midten. 399 00:17:30,480 --> 00:17:32,146 >> PUBLIKUM: du trenger gjøre for å si int n? 400 00:17:32,146 --> 00:17:34,020 DAVID J. MALAN: Du gjør ikke trenger å si int n. 401 00:17:34,020 --> 00:17:37,670 Så fordi vi allerede har sagt int, trenger du ikke å si det igjen. 402 00:17:37,670 --> 00:17:41,820 Fangsten er at n har til være den samme som datatypen i. 403 00:17:41,820 --> 00:17:43,310 Så det er bare et hjelpemiddel her. 404 00:17:43,310 --> 00:17:44,058 Yeah. 405 00:17:44,058 --> 00:17:47,806 >> PUBLIKUM: Kan du gå over print karakter s brakett jeg igjen? 406 00:17:47,806 --> 00:17:48,930 DAVID J. MALAN: Absolutt. 407 00:17:48,930 --> 00:17:52,110 Så% c, husker fra sist tid, er bare en plassholder. 408 00:17:52,110 --> 00:17:53,930 Det betyr sette en røye her. 409 00:17:53,930 --> 00:17:56,780 skråstrek n, selvfølgelig bare del sette et linjeskift her. 410 00:17:56,780 --> 00:17:59,540 Slik at bare blader, nå, dette stykke ny syntaks. 411 00:17:59,540 --> 00:18:03,730 Og dette er bokstavelig talt si, grip strengen som kalles s og gå får sin 412 00:18:03,730 --> 00:18:06,050 i'th karakter, så å si. 413 00:18:06,050 --> 00:18:10,590 >> Og jeg fortsetter å si i'th karakter fordi på hver iterasjon av denne sløyfen 414 00:18:10,590 --> 00:18:14,540 det er som om vi skriver ut ut, først s brakett 0, 415 00:18:14,540 --> 00:18:15,780 som programmerer kanskje si. 416 00:18:15,780 --> 00:18:18,680 Deretter s brakett 1, deretter s brakett 2, deretter 3, deretter 4. 417 00:18:18,680 --> 00:18:21,610 Men selvfølgelig er det en variabel, så jeg bare uttrykke det med jeg. 418 00:18:21,610 --> 00:18:23,900 >> Key, skjønt, er å realisere, spesielt hvis du har ikke 419 00:18:23,900 --> 00:18:26,358 blitt acclimating til denne verden programmering, der vi alle 420 00:18:26,358 --> 00:18:28,950 synes å telle fra null, gotta begynne å telle fra null nå. 421 00:18:28,950 --> 00:18:35,130 Siden strenger, første tegnet, den z i Zamyla er for bedre eller verre 422 00:18:35,130 --> 00:18:40,490 kommer til å leve på stedet tallet null. 423 00:18:40,490 --> 00:18:48,210 >> Ok, så la meg få oss tilbake hit til Zamyla 424 00:18:48,210 --> 00:18:50,746 og se hva som egentlig skjer på under panseret. 425 00:18:50,746 --> 00:18:52,370 Så det er denne oppfatningen av type casting. 426 00:18:52,370 --> 00:18:53,800 Du har kanskje faktisk spilt med dette allerede, 427 00:18:53,800 --> 00:18:55,970 kanskje for hacker utgave av P satt en. 428 00:18:55,970 --> 00:19:00,320 Men typen støping bare refererer til evne i C og noen andre språk 429 00:19:00,320 --> 00:19:03,170 å konvertere en datatype til en annen. 430 00:19:03,170 --> 00:19:05,450 >> Nå hvordan kan vi se dette ganske oversiktlig? 431 00:19:05,450 --> 00:19:08,530 Så dette, husker, er begynnelsen av det engelske alfabetet. 432 00:19:08,530 --> 00:19:11,265 Og konteksten, husker, fra som for en uke siden er ASCII. 433 00:19:11,265 --> 00:19:13,790 The American Standard Kode for Information Interchange. 434 00:19:13,790 --> 00:19:17,080 Som er bare en veldig lang vei si en kartlegging fra brev 435 00:19:17,080 --> 00:19:19,370 til tall, og fra tall til bokstaver. 436 00:19:19,370 --> 00:19:22,940 >> Så A til M her, dot dot prikk, på linje med, husker, 437 00:19:22,940 --> 00:19:25,582 desimaltallet 65 på opp. 438 00:19:25,582 --> 00:19:27,290 Og vi fikk ikke snakke om dette eksplisitt, 439 00:19:27,290 --> 00:19:29,850 men sikkert det er lik numre for små bokstaver. 440 00:19:29,850 --> 00:19:30,820 Og ja, det finnes. 441 00:19:30,820 --> 00:19:33,730 Verdens besluttet noen år siden det lille en, små bokstaver a, 442 00:19:33,730 --> 00:19:35,020 kommer til å være 97. 443 00:19:35,020 --> 00:19:38,010 Og lille b kommer å være 98, og så videre. 444 00:19:38,010 --> 00:19:40,200 >> Og for en annen tast på tastaturet, det er 445 00:19:40,200 --> 00:19:42,190 kommer til å være et lignende mønster av biter. 446 00:19:42,190 --> 00:19:44,540 Eller ekvivalent, et desimaltall. 447 00:19:44,540 --> 00:19:47,110 Så spørsmålet på hånden, kan da, er hvordan vi 448 00:19:47,110 --> 00:19:49,400 faktisk se dette under panseret? 449 00:19:49,400 --> 00:19:51,539 Så jeg kommer til å gå over til gedit igjen. 450 00:19:51,539 --> 00:19:53,330 Og snarere enn type denne fra bunnen av, 451 00:19:53,330 --> 00:19:55,330 Jeg kommer til å gå videre og bare åpne opp noe 452 00:19:55,330 --> 00:19:58,350 fra dagens kode som kalles ASCII null. 453 00:19:58,350 --> 00:20:01,210 >> Og ASCII null ser slik ut. 454 00:20:01,210 --> 00:20:02,710 Så la oss bryte våre sinn rundt dette. 455 00:20:02,710 --> 00:20:04,969 Så først, har jeg kommen koden, som er fint. 456 00:20:04,969 --> 00:20:07,010 Fordi det er bokstavelig talt forteller meg hva du kan forvente, 457 00:20:07,010 --> 00:20:08,950 vise en kartlegging for store bokstaver. 458 00:20:08,950 --> 00:20:13,690 Nå vet jeg ikke helt vet hva jeg mener med det, så la oss slutte. 459 00:20:13,690 --> 00:20:16,870 >> På engelsk, kanskje noe techie engelsk, 460 00:20:16,870 --> 00:20:20,660 hva betyr linje 18 vises til å gjøre for oss? 461 00:20:20,660 --> 00:20:21,500 Bare linje 18. 462 00:20:21,500 --> 00:20:22,430 Hva er det å fremkalle? 463 00:20:22,430 --> 00:20:25,192 Hva kommer det til å sparke i gang her? 464 00:20:25,192 --> 00:20:26,100 >> PUBLIKUM: En løkke. 465 00:20:26,100 --> 00:20:26,630 >> DAVID J. MALAN: En løkke. 466 00:20:26,630 --> 00:20:28,463 Og hvor mange ganger er som kommer til å reagere? 467 00:20:28,463 --> 00:20:31,562 468 00:20:31,562 --> 00:20:33,270 PUBLIKUM: [interposing VOICES] seks ganger. 469 00:20:33,270 --> 00:20:34,830 DAVID J. MALAN: Ikke seks ganger. 470 00:20:34,830 --> 00:20:35,840 PUBLIKUM: 26 ganger. 471 00:20:35,840 --> 00:20:36,560 DAVID J. MALAN: 26 ganger. 472 00:20:36,560 --> 00:20:37,060 Ja, beklager. 473 00:20:37,060 --> 00:20:37,960 26 ganger. 474 00:20:37,960 --> 00:20:38,460 Hvorfor? 475 00:20:38,460 --> 00:20:41,590 Vel, det er litt rart, men Jeg har begynt å telle fra 65. 476 00:20:41,590 --> 00:20:43,300 Som er rart, men ikke galt. 477 00:20:43,300 --> 00:20:44,610 Det er ikke dårlig per si. 478 00:20:44,610 --> 00:20:46,980 Og jeg gjør det bare fordi, for dette eksemplet, 479 00:20:46,980 --> 00:20:50,455 Jeg er litt i påvente at kapitalen A var 65. 480 00:20:50,455 --> 00:20:53,330 Nå er dette ikke den mest elegante måte å gjøre dette, til slags vanskelig kode 481 00:20:53,330 --> 00:20:56,130 esoteriske verdier som ingen er stadig forventes å huske. 482 00:20:56,130 --> 00:21:00,155 >> Men for nå, merker at jeg er gjør dette opp gjennom 65 pluss 26. 483 00:21:00,155 --> 00:21:03,030 Fordi tilsynelatende jeg ikke selv ønsker å gjøre det aritmetiske i hodet mitt. 484 00:21:03,030 --> 00:21:04,440 Så jeg skal la kompilatoren gjøre det. 485 00:21:04,440 --> 00:21:08,600 Men deretter på hver sløyfe, hver iterasjon av loopen, jeg økes jeg. 486 00:21:08,600 --> 00:21:10,196 >> Så nå dette ser litt kryptisk. 487 00:21:10,196 --> 00:21:13,320 Men vi bør ha grunnleggende bygge blokker med å forstå dette. 488 00:21:13,320 --> 00:21:15,510 % C er bare en plassholder for en røye. 489 00:21:15,510 --> 00:21:19,010 % I er en plassholder for en int. 490 00:21:19,010 --> 00:21:23,310 Og det viser seg at ved å bruke denne ny syntaks, dette parentes, så 491 00:21:23,310 --> 00:21:26,100 å snakke, så en datatype inne i en parentes, 492 00:21:26,100 --> 00:21:32,270 Jeg kan tvinge kompilatoren til å behandle jeg ikke er et heltall, men som en røye. 493 00:21:32,270 --> 00:21:35,520 >> Dermed viser meg karakter ekvivalent av det nummeret. 494 00:21:35,520 --> 00:21:37,986 Nå her nede, denne koden er stort sett identisk. 495 00:21:37,986 --> 00:21:39,860 Jeg ville bare gjøre super eksplisitt det faktum 496 00:21:39,860 --> 00:21:42,095 at jeg begynner på 97, som er små bokstaver en. 497 00:21:42,095 --> 00:21:44,080 På opp gjennom 26 flere bokstaver. 498 00:21:44,080 --> 00:21:46,970 Og jeg doing-- igjen, avstøpning i, så å si. 499 00:21:46,970 --> 00:21:49,160 Eller type casting i, så å si. 500 00:21:49,160 --> 00:21:51,420 >> Fra en int til en røye. 501 00:21:51,420 --> 00:21:55,760 Så sluttresultatet kommer til å bli, ærlig, informasjonen vi allerede vet. 502 00:21:55,760 --> 00:21:59,411 Jeg kommer til å gjøre ascii-0 dot-- ikke dot c. 503 00:21:59,411 --> 00:22:02,160 Varsel, har du sannsynligvis gjort at feil som jeg gjorde bare et uhell. 504 00:22:02,160 --> 00:22:03,820 Gjør ascii-0. 505 00:22:03,820 --> 00:22:06,090 Nå kommer jeg til å gjøre ./ascii-0. 506 00:22:06,090 --> 00:22:09,050 Jeg skal zoome inn, og dessverre det kommer til å rulle ut av skjermen. 507 00:22:09,050 --> 00:22:15,060 Men vi ser en hel kartet hvor et kart til 97, b kart til 98, 508 00:22:15,060 --> 00:22:18,931 og hvis vi bla opp ytterligere A, selvfølgelig, kart til 65. 509 00:22:18,931 --> 00:22:21,180 Så dette er bare for å si at det vi har forkynt, 510 00:22:21,180 --> 00:22:25,310 det er denne ekvivalens, blir faktisk tilfelle i virkeligheten. 511 00:22:25,310 --> 00:22:28,000 Slik at en rask modifikasjon av denne. 512 00:22:28,000 --> 00:22:31,220 La meg åpne opp ascii-1.c. 513 00:22:31,220 --> 00:22:38,070 Og legg merke til denne smarte, sortere av, avklaring av dette. 514 00:22:38,070 --> 00:22:41,770 Dette er ascii-1.c, og merke dette sprø ting. 515 00:22:41,770 --> 00:22:45,120 >> Og dette virkelig får hjertet av hva datamaskiner gjør. 516 00:22:45,120 --> 00:22:48,150 Selv om vi mennesker ville teller ikke i form av letters-- 517 00:22:48,150 --> 00:22:50,380 Jeg vet ikke begynne å tenke, all right en da b, 518 00:22:50,380 --> 00:22:52,590 og bruke disse til å telle fysiske objekter. 519 00:22:52,590 --> 00:22:58,680 Du kan sikkert si at jeg ønsker å initial noen variabel kalt C-- 520 00:22:58,680 --> 00:23:03,220 men jeg kunne ha kalt dette noe-- så c er initialisert til kapital A. 521 00:23:03,220 --> 00:23:07,560 >> Fordi på slutten av dagen, datamaskinen bryr seg ikke hva du lagrer, 522 00:23:07,560 --> 00:23:10,170 det bare bryr seg hvordan du vil å presentere denne informasjonen. 523 00:23:10,170 --> 00:23:13,560 Hvordan vil du at datamaskinen skal tolke dette mønsteret av biter? 524 00:23:13,560 --> 00:23:16,320 Så dette er ikke noe jeg vil generelt anbefale å gjøre. 525 00:23:16,320 --> 00:23:19,500 Det er egentlig bare et eksempel til formidle at du kan absolutt 526 00:23:19,500 --> 00:23:22,049 initial et heltall til en røye. 527 00:23:22,049 --> 00:23:24,090 Fordi undersiden hetten av en char naturligvis 528 00:23:24,090 --> 00:23:26,170 er bare et tall fra 0 til 255. 529 00:23:26,170 --> 00:23:28,540 >> Så du kan sikkert sette det inne i en int. 530 00:23:28,540 --> 00:23:30,890 Og hva dette også viser er at vi 531 00:23:30,890 --> 00:23:34,040 kan konvertere fra ett type til en annen, her, 532 00:23:34,040 --> 00:23:36,780 slutt å skrive det samme. 533 00:23:36,780 --> 00:23:44,760 Og faktisk, dette vil jeg fikse online-- var ment å si dette, igjen, her. 534 00:23:44,760 --> 00:23:48,610 La meg rydde opp dette på nettet, og vi vil se i en online walkthrough etter behov, 535 00:23:48,610 --> 00:23:50,280 det som var ment der. 536 00:23:50,280 --> 00:23:50,960 >> OK. 537 00:23:50,960 --> 00:23:53,892 Så siste eksempelet nå involverer A'er og B, og så får vi 538 00:23:53,892 --> 00:23:54,850 ta ting opp et hakk. 539 00:23:54,850 --> 00:23:58,330 Så med en sin og BS og CS i kapitalisering 540 00:23:58,330 --> 00:24:01,560 og likeverdigheten av disse, la oss ta en titt på dette eksempelet her. 541 00:24:01,560 --> 00:24:02,752 Et annet eksempel kode. 542 00:24:02,752 --> 00:24:04,460 Vi skal åpne en som er allerede gjort, så vi 543 00:24:04,460 --> 00:24:06,440 trenger ikke å skrive det alle ut fra bunnen av. 544 00:24:06,440 --> 00:24:09,420 >> Og legg merke til i påvente vi bruker flere header 545 00:24:09,420 --> 00:24:13,240 filer, blant disse er vår nye venn, string.h. 546 00:24:13,240 --> 00:24:15,597 Nå ser, ved første øyekast, litt kryptisk. 547 00:24:15,597 --> 00:24:18,180 Men la oss se om vi ikke kan resonnere gjennom hva som skjer her. 548 00:24:18,180 --> 00:24:21,150 Først får jeg en streng fra brukeren, og jeg satt som streng i en variabel 549 00:24:21,150 --> 00:24:22,286 kalt s. 550 00:24:22,286 --> 00:24:24,090 Kopiere lime fra før. 551 00:24:24,090 --> 00:24:27,250 I tråd 22, jeg er tydeligvis gjør akkurat det 552 00:24:27,250 --> 00:24:30,760 Jeg gjorde et øyeblikk siden, jeg gjentar i løpet av de tegnene i s. 553 00:24:30,760 --> 00:24:34,780 >> Og de nye triks her bruker strenglengde, den mindreårige optimalisering 554 00:24:34,780 --> 00:24:37,930 for lagring av den strenglengde på n, stedet for å ringe strlen igjen, 555 00:24:37,930 --> 00:24:38,850 og igjen og igjen. 556 00:24:38,850 --> 00:24:41,120 Og bare sjekke at jeg er mindre enn n. 557 00:24:41,120 --> 00:24:43,330 Nå her, ting blir litt interessant. 558 00:24:43,330 --> 00:24:45,980 Men det er bare en søknad av denne samme ny idé. 559 00:24:45,980 --> 00:24:48,470 Hva i engelsk gjør s brakett jeg representerer? 560 00:24:48,470 --> 00:24:51,772 561 00:24:51,772 --> 00:24:54,260 >> PUBLIKUM: Telle hver karakter [uhørbart]. 562 00:24:54,260 --> 00:24:55,926 >> DAVID J. MALAN: Telle hvert tegn. 563 00:24:55,926 --> 00:24:58,680 Og enda mer konsist, s brakett jeg representerer hva? 564 00:24:58,680 --> 00:25:00,950 Vil du si. 565 00:25:00,950 --> 00:25:04,084 Ikke for å sette deg på plass her. 566 00:25:04,084 --> 00:25:06,375 >> PUBLIKUM: samt-- 567 00:25:06,375 --> 00:25:09,500 DAVID J. MALAN: Så hvis ordet er-- hvis strengen er Zamyla, som starts-- 568 00:25:09,500 --> 00:25:12,380 PUBLIKUM: --du håndtere tegnene separately-- 569 00:25:12,380 --> 00:25:13,690 DAVID J. MALAN: Good. 570 00:25:13,690 --> 00:25:14,190 Nettopp. 571 00:25:14,190 --> 00:25:17,940 Den hakeparentes notasjon lar deg å få tilgang til hver karakter individuelt, 572 00:25:17,940 --> 00:25:21,120 så s brakett 0 kommer til å være den første tegnet i strengen. 573 00:25:21,120 --> 00:25:24,110 s brakett en kommer til å være den andre, og så videre. 574 00:25:24,110 --> 00:25:28,050 Så spørsmålet jeg spør, her, i denne tilstanden er hva? 575 00:25:28,050 --> 00:25:33,984 Er i'th karakter s større enn eller lik små bokstaver en? 576 00:25:33,984 --> 00:25:36,400 Og hva betyr dette, her, med den doble-tegn? 577 00:25:36,400 --> 00:25:36,800 Målgruppe (SAMMEN): Og. 578 00:25:36,800 --> 00:25:37,210 DAVID J. MALAN: Og. 579 00:25:37,210 --> 00:25:38,418 Det er bare tilsvarer dette. 580 00:25:38,418 --> 00:25:42,310 Og er ikke et nøkkelord i C, må du bruk, grammatikken, tegnet ampersand. 581 00:25:42,310 --> 00:25:47,520 Og dette omvendt, spør er s'er i'th karakter mindre enn eller lik 582 00:25:47,520 --> 00:25:49,030 til små bokstaver z? 583 00:25:49,030 --> 00:25:52,440 Og igjen, her er der å forstå de underliggende 584 00:25:52,440 --> 00:25:54,550 gjennomføring av en datamaskin er fornuftig. 585 00:25:54,550 --> 00:25:57,330 Legg merke til at selv om jeg har dot dot dot der borte, 586 00:25:57,330 --> 00:26:04,410 ser ut som en gjennom z med små bokstaver er alle sammenhengende verdier opp fra 97 på opp. 587 00:26:04,410 --> 00:26:07,820 >> Og samme for store bokstaver som starter på 65 år. 588 00:26:07,820 --> 00:26:10,410 Så takeaway, da, er at på engelsk, 589 00:26:10,410 --> 00:26:12,760 hvordan vil du beskrive hvilken linje 24 gjø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 >> PUBLIKUM: Den 24. er det å sjekke for å se om hver karakter er en små bokstaver. 593 00:26:21,575 --> 00:26:24,700 DAVID J. MALAN: Det er å sjekke om hvert tegn er en liten bokstav. 594 00:26:24,700 --> 00:26:28,590 Så selv mer konsist er i'th karakter s små bokstaver? 595 00:26:28,590 --> 00:26:30,690 Det er alt vi er uttrykker her logisk, 596 00:26:30,690 --> 00:26:33,750 litt kryptisk, men slutt ganske oversiktlig. 597 00:26:33,750 --> 00:26:36,480 Er s'er i'th karakter små bokstaver? 598 00:26:36,480 --> 00:26:40,130 >> Hvis ja, og her er hvor ting få litt tankene bøyd 599 00:26:40,130 --> 00:26:44,760 for bare et øyeblikk, i så fall, gå videre og skrive ut et tegn. 600 00:26:44,760 --> 00:26:47,360 Så dette er bare en plassholder, men hva karakter? 601 00:26:47,360 --> 00:26:53,710 Hvorfor gjør jeg s brakett jeg minus dette uttrykket her? 602 00:26:53,710 --> 00:26:55,110 >> Vel merke til mønsteret her. 603 00:26:55,110 --> 00:26:57,380 De faktiske tallene ikke saken så mye. 604 00:26:57,380 --> 00:27:02,700 Men legg merke til at 97 er hvor langt unna 65? 605 00:27:02,700 --> 00:27:03,560 >> PUBLIKUM: 32. 606 00:27:03,560 --> 00:27:04,480 >> DAVID J. MALAN: 32. 607 00:27:04,480 --> 00:27:06,890 Hvor langt unna er 98 fra 66? 608 00:27:06,890 --> 00:27:07,740 >> PUBLIKUM: 32. 609 00:27:07,740 --> 00:27:09,890 >> DAVID J. MALAN: Little c fra store C? 610 00:27:09,890 --> 00:27:10,420 32. 611 00:27:10,420 --> 00:27:14,550 Så det er 32 hopp fra en bokstav til en annen. 612 00:27:14,550 --> 00:27:17,790 Så ærlig jeg kunne forenkle dette til det. 613 00:27:17,790 --> 00:27:20,400 Men da er jeg like hardt koding dette lave nivået forståelse 614 00:27:20,400 --> 00:27:21,740 at ingen leser er noensinne kommer til å forstå. 615 00:27:21,740 --> 00:27:25,080 Så jeg kommer til å general det som, jeg vet de små bokstavene er større. 616 00:27:25,080 --> 00:27:28,400 Jeg vet de store bokstavene er mindre verdier, ironisk nok. 617 00:27:28,400 --> 00:27:33,216 >> Men dette er effektivt tilsvarer sier subtrahere 32 fra s brakett jeg. 618 00:27:33,216 --> 00:27:35,430 Så i sammenheng med disse bokstaver, om bokstaven 619 00:27:35,430 --> 00:27:38,950 skjer for å være en, små bokstaver en, og jeg trekke fra 32, 620 00:27:38,950 --> 00:27:43,442 Hvilken effekt har det har, matematisk, på små bokstaver en? 621 00:27:43,442 --> 00:27:44,400 PUBLIKUM: Capitalizes-- 622 00:27:44,400 --> 00:27:45,691 DAVID J. MALAN: Kapitaliserer det. 623 00:27:45,691 --> 00:27:48,440 Og ja, dette er grunnen til at vår Programmet kalles kapitalisere null. 624 00:27:48,440 --> 00:27:51,590 Dette programmet enten kapitaliserer et brev, 625 00:27:51,590 --> 00:27:54,580 etter å ha sjekket om det er faktisk en liten bokstav. 626 00:27:54,580 --> 00:27:59,810 Ellers i linje 30, hva gjør jeg hvis det er ikke en liten bokstav som jeg er 627 00:27:59,810 --> 00:28:02,852 ser på ved en spesiell iterasjon i loop. 628 00:28:02,852 --> 00:28:03,890 Bare skrive det ut. 629 00:28:03,890 --> 00:28:07,010 >> Så ikke endre ting det er ikke engang små bokstaver. 630 00:28:07,010 --> 00:28:10,790 Begrense deg til lite et gjennomspill litt z. 631 00:28:10,790 --> 00:28:12,730 Nå er dette ganske uforståelige. 632 00:28:12,730 --> 00:28:15,230 Men ved slutten av dagen, denne er hvordan vi, en gang i tiden, 633 00:28:15,230 --> 00:28:16,460 måtte gjennomføre ting. 634 00:28:16,460 --> 00:28:19,780 Hvis jeg i stedet åpne kapital en, oh Takk Gud. 635 00:28:19,780 --> 00:28:22,320 Det er en funksjon kalt til øvre som kan 636 00:28:22,320 --> 00:28:25,410 gjøre alt vi nettopp gjorde på et relativt lavt nivå. 637 00:28:25,410 --> 00:28:28,752 >> Nå til videregående er interessant fordi den er deklarert i en fil, 638 00:28:28,752 --> 00:28:31,210 og du ville bare vite dette ved å sjekke dokumentasjon, 639 00:28:31,210 --> 00:28:35,730 eller blir fortalt, sier i klassen, der den finnes, i en fil kalt ctype.h. 640 00:28:35,730 --> 00:28:37,630 Så dette er en annen ny venn av oss. 641 00:28:37,630 --> 00:28:40,750 Og til øvre gjør akkurat hva navnet antyder. 642 00:28:40,750 --> 00:28:44,860 >> Du kan sende inn, som et argument, mellom disse parentes, noen tegn. 643 00:28:44,860 --> 00:28:48,390 Jeg kommer til å passere i i'th karakter S ved hjelp av vårt fancy ny notasjon 644 00:28:48,390 --> 00:28:49,870 involverer hakeparenteser. 645 00:28:49,870 --> 00:28:53,391 Og ta en gjetning, hva er avkastningen Verdien av å over tilsynelatende kommer 646 00:28:53,391 --> 00:28:53,890 å være? 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å hvis jeg passerer små bokstaver a, forhåpentligvis, per definisjon av til videregående, 651 00:29:02,330 --> 00:29:05,600 det kommer til å returnere en store bokstaver A. Ellers 652 00:29:05,600 --> 00:29:08,590 hvis det ikke er en liten bokstav i For det første, jeg bare skrive det ut. 653 00:29:08,590 --> 00:29:10,800 Og ja, legg merke til andre venn her. 654 00:29:10,800 --> 00:29:13,840 Ikke bare for å over eksisterer, men er lavere, noe 655 00:29:13,840 --> 00:29:16,200 faktisk svar på det spørsmålet for meg. 656 00:29:16,200 --> 00:29:19,730 >> Nå hvem skrev disse tingene, 10s år siden, vet du hva? 657 00:29:19,730 --> 00:29:23,840 Implementert for å øvre og er senke bruker kode som dette. 658 00:29:23,840 --> 00:29:27,270 Men igjen, i samsvar med denne ideen om å abstrahere bort, 659 00:29:27,270 --> 00:29:29,190 liksom, lavere nivå gjennomføring detaljer. 660 00:29:29,190 --> 00:29:32,600 Og stå på skuldrene til folk som kom før oss, ved hjelp av funksjoner 661 00:29:32,600 --> 00:29:36,300 som til øvre og lavere, hvilke fantastisk nok er pent 662 00:29:36,300 --> 00:29:40,190 heter til å si hva de gjør, er en fantastisk paradigme å adoptere. 663 00:29:40,190 --> 00:29:44,040 >> Nå viser det seg at hvis jeg leser mannen siden for, sier, til øvre, 664 00:29:44,040 --> 00:29:45,010 Jeg lærer noe annet. 665 00:29:45,010 --> 00:29:46,890 Så mannen toUpper. 666 00:29:46,890 --> 00:29:48,050 Det er litt overveldende. 667 00:29:48,050 --> 00:29:51,110 Men legg merke til, her er det omtale av topptekstfilen som jeg skal bruke. 668 00:29:51,110 --> 00:29:54,460 Som en side, fordi dette er misvisende, funksjonen 669 00:29:54,460 --> 00:29:59,070 bruker ints i stedet for tegn på grunn av feilkontroll. 670 00:29:59,070 --> 00:30:01,260 Men vi vil kanskje komme tilbake til det i fremtiden. 671 00:30:01,260 --> 00:30:05,910 >> Men legg merke til, her, til øvre konvertitter bokstaven c til store bokstaver hvis mulig. 672 00:30:05,910 --> 00:30:07,674 Så det er ganske grei. 673 00:30:07,674 --> 00:30:09,340 Og nå la oss være litt mer spesifikk. 674 00:30:09,340 --> 00:30:12,750 La oss se på den delen av Mannen siden under returverdi. 675 00:30:12,750 --> 00:30:15,420 Verdien som returneres er at av den konverterte brev. 676 00:30:15,420 --> 00:30:18,690 Eller C, hvis omdannelsen var ikke mulig, 677 00:30:18,690 --> 00:30:20,250 hvor c er den opprinnelige inngang. 678 00:30:20,250 --> 00:30:24,140 Som jeg vet herfra, fra argumentet til å øvre. 679 00:30:24,140 --> 00:30:25,780 >> Så hva er det takeaway av dette? 680 00:30:25,780 --> 00:30:28,060 Verdien som returneres er at av den konverterte brevet, 681 00:30:28,060 --> 00:30:32,110 eller c, originalbrev, hvis omdannelsen var ikke mulig. 682 00:30:32,110 --> 00:30:36,460 Hva forbedring kan jeg derfor gjøre til min kode design? 683 00:30:36,460 --> 00:30:37,146 Yeah? 684 00:30:37,146 --> 00:30:38,810 >> PUBLIKUM: Du kan fjerne annet. 685 00:30:38,810 --> 00:30:40,810 DAVID J. MALAN: Jeg kan fjerne annet uttalelse, 686 00:30:40,810 --> 00:30:42,510 og ikke bare den andre setningen. 687 00:30:42,510 --> 00:30:44,150 >> PUBLIKUM: Du kan fjerne [uhørbart]. 688 00:30:44,150 --> 00:30:46,310 >> DAVID J. MALAN: Jeg kan fjerne hele gaffel 689 00:30:46,310 --> 00:30:48,209 i veien, hvis helt annet. 690 00:30:48,209 --> 00:30:50,250 Så ja, la meg åpne den endelige versjon av denne, 691 00:30:50,250 --> 00:30:55,540 kapital-2 og legge merke til hvor, hvis du vil, sexy, koden er nå å få, 692 00:30:55,540 --> 00:31:00,040 i at jeg har redusert fra noen syv eller så linjene til bare fire, 693 00:31:00,040 --> 00:31:03,850 funksjonaliteten som jeg ment ved å ringe til øvre, 694 00:31:03,850 --> 00:31:09,410 passerer s brakett i, og utskrift ut, med eksempel% c, 695 00:31:09,410 --> 00:31:11,090 det bestemt karakter. 696 00:31:11,090 --> 00:31:14,560 >> Nå uten tvil, det er en bug, eller i det minste risikoen for en bug, 697 00:31:14,560 --> 00:31:15,350 i dette programmet. 698 00:31:15,350 --> 00:31:18,200 Så bare for å komme tilbake til en tidligere takeaway, 699 00:31:18,200 --> 00:31:21,820 hva skal jeg nok også gjøre i dette programmet for å gjøre det mer robust, 700 00:31:21,820 --> 00:31:24,974 slik at det er ingen måte det kan krasje, selv i sjeldne tilfeller? 701 00:31:24,974 --> 00:31:26,390 PUBLIKUM: Pass på at det ikke er NULL. 702 00:31:26,390 --> 00:31:28,056 DAVID J. MALAN: Pass på at det ikke er NULL. 703 00:31:28,056 --> 00:31:31,030 Så egentlig, for å gjøre denne super riktig, skal jeg gjøre noe sånt, 704 00:31:31,030 --> 00:31:35,300 hvis s er ikke null, så gå videre og utføre 705 00:31:35,300 --> 00:31:38,470 disse linjene med kode, som Da kan jeg innrykk sånn, 706 00:31:38,470 --> 00:31:39,870 og deretter sette i min nære spenne. 707 00:31:39,870 --> 00:31:41,550 Så godt å knytte sammen de to ideer. 708 00:31:41,550 --> 00:31:42,429 Yeah? 709 00:31:42,429 --> 00:31:44,470 PUBLIKUM: Kan du bruke en gjøre mens loop, i stedet? 710 00:31:44,470 --> 00:31:47,270 DAVID J. MALAN: Kunne Jeg gjør en gjør mens loop? 711 00:31:47,270 --> 00:31:50,020 PUBLIKUM: --du vil være sikker at du faktisk [uhørbart]. 712 00:31:50,020 --> 00:31:51,728 DAVID J. MALAN: Kunne du bruker en gjør mens? 713 00:31:51,728 --> 00:31:52,450 Korte svaret, nei. 714 00:31:52,450 --> 00:31:54,700 Fordi du er i ferd med å introdusere et annet hjørne tilfelle. 715 00:31:54,700 --> 00:31:56,660 Hvis strengen er av null lengde. 716 00:31:56,660 --> 00:31:59,600 Hvis for eksempel, jeg bare slo Enter, uten noen gang å skrive Zamyla. 717 00:31:59,600 --> 00:32:02,490 Jeg kommer til å levere deg tilbake en faktisk string, som vi vil til slutt se, 718 00:32:02,490 --> 00:32:03,780 som har null tegn. 719 00:32:03,780 --> 00:32:05,630 Det er fortsatt en streng, det er bare super kort. 720 00:32:05,630 --> 00:32:07,960 Men hvis du bruker en gjør stund, du kommer til å blindt 721 00:32:07,960 --> 00:32:10,050 prøver å gjøre noe med respekt til denne strengen, 722 00:32:10,050 --> 00:32:12,537 og ingenting kommer til å være der. 723 00:32:12,537 --> 00:32:18,607 >> PUBLIKUM: Vel, hvis du gjorde gjøre [uhørbart] mens s-- 724 00:32:18,607 --> 00:32:21,190 DAVID J. MALAN: Å jeg ser, holde å få en streng fra brukeren. 725 00:32:21,190 --> 00:32:23,525 Så korte svaret, du kan, og holde plaging 726 00:32:23,525 --> 00:32:26,150 dem til å gi deg en streng som er kort nok til å passe i minnet. 727 00:32:26,150 --> 00:32:26,700 Absolutt. 728 00:32:26,700 --> 00:32:27,630 Jeg valgte bare ikke til. 729 00:32:27,630 --> 00:32:30,505 Hvis de ikke gi meg strengen jeg ønsker, jeg slutte, jeg gir opp. 730 00:32:30,505 --> 00:32:33,260 Men helt, og for det formål du kan absolutt gjøre det. 731 00:32:33,260 --> 00:32:37,500 >> Så bibliotekets header filer som vi er nå kjent med er disse, her. 732 00:32:37,500 --> 00:32:41,550 Standard I / O, CS50.h, string.h, ctype.h, og det er faktisk andre. 733 00:32:41,550 --> 00:32:44,460 Noen av dere har oppdaget regnestykket biblioteket i math.h. 734 00:32:44,460 --> 00:32:48,200 Men la meg introdusere deg, nå, denne ressursen som CS50 ansatte, Davin, 735 00:32:48,200 --> 00:32:50,630 og Rob, og Gabe bestemt har satt sammen. 736 00:32:50,630 --> 00:32:52,630 Det vil snart koblingen på kursets hjemmeside. 737 00:32:52,630 --> 00:32:54,870 Det kalles CS50 referanse. 738 00:32:54,870 --> 00:32:58,230 >> Som bare for å gi deg en rask Smaken av den, virker som følger. 739 00:32:58,230 --> 00:33:00,740 La meg gå til reference.cs50.net. 740 00:33:00,740 --> 00:33:02,990 Du vil se på venstre hånd side en overveldende liste 741 00:33:02,990 --> 00:33:04,595 av funksjoner som kommer med c. 742 00:33:04,595 --> 00:33:07,790 Men hvis jeg bryr meg, for øyeblikket, om noe sånt strlen, 743 00:33:07,790 --> 00:33:08,746 Jeg kan skrive det der. 744 00:33:08,746 --> 00:33:10,870 Det filtrerer ned på listen til akkurat det jeg bryr meg om. 745 00:33:10,870 --> 00:33:11,940 Jeg kommer til å klikke den. 746 00:33:11,940 --> 00:33:14,740 Og nå til venstre, du får se hva vi håper 747 00:33:14,740 --> 00:33:18,290 er en mer enkel, human vennlig forklaring på hvordan 748 00:33:18,290 --> 00:33:19,170 Denne funksjonen fungerer. 749 00:33:19,170 --> 00:33:20,600 >> Returnerer lengden på en streng. 750 00:33:20,600 --> 00:33:24,060 Her er et sammendrag, her er hvordan du bruke det i form av topptekstfilen, 751 00:33:24,060 --> 00:33:27,430 og i form av hva funksjonen ser ut i form av sine argumenter. 752 00:33:27,430 --> 00:33:30,250 Og så her, avkastning lengden på en streng. 753 00:33:30,250 --> 00:33:34,280 Men for de av dere mer komfortabel, kan du faktisk klikke mer skjegg, 754 00:33:34,280 --> 00:33:37,070 , og innholdet i denne siden, nå vil endre 755 00:33:37,070 --> 00:33:41,660 å være standardverdiene av hva du få ved å bruke mannen siden. 756 00:33:41,660 --> 00:33:44,100 >> Med andre ord, CS50 referanse er en forenkling 757 00:33:44,100 --> 00:33:46,220 av man-sidene av de ansatte, for studenter. 758 00:33:46,220 --> 00:33:49,320 Spesielt de som er mindre komfortable og i mellom, slik at du 759 00:33:49,320 --> 00:33:51,660 trenger ikke å prøve å vikle tankene dine rundt, ærlig, 760 00:33:51,660 --> 00:33:55,030 noen ganske kryptisk syntaks og dokumentasjon gang. 761 00:33:55,030 --> 00:33:57,650 >> Så hold det i tankene i dagene som kommer. 762 00:33:57,650 --> 00:33:59,560 Så her, igjen, er en Zamyla. 763 00:33:59,560 --> 00:34:03,255 La oss nå stille et spørsmål som er litt mer menneskelig tilgjengelig. 764 00:34:03,255 --> 00:34:05,380 Takk til Chang, som har vært skriver flere elefanter 765 00:34:05,380 --> 00:34:07,090 nonstop for de siste dagene. 766 00:34:07,090 --> 00:34:09,730 Vi har en mulighet til å gi minst en av dem bort. 767 00:34:09,730 --> 00:34:13,239 Hvis vi kunne få bare ett frivillig å komme på opp til tegne på skjermen. 768 00:34:13,239 --> 00:34:14,530 Hva med her? 769 00:34:14,530 --> 00:34:15,340 >> Kom opp. 770 00:34:15,340 --> 00:34:16,720 Hva er ditt navn? 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 Greit. 774 00:34:18,259 --> 00:34:19,388 Alex, kom opp. 775 00:34:19,388 --> 00:34:21,679 Vi er i ferd med å se din håndskrift på skjermen her. 776 00:34:21,679 --> 00:34:24,325 777 00:34:24,325 --> 00:34:25,570 Greit, hyggelig å møte deg. 778 00:34:25,570 --> 00:34:26,429 >> ALEX: Nice du møter deg. 779 00:34:26,429 --> 00:34:27,512 >> DAVID J. MALAN: All right. 780 00:34:27,512 --> 00:34:28,969 Så, super enkel øvelse. 781 00:34:28,969 --> 00:34:31,440 Bar er ikke høy til få en elefant i dag. 782 00:34:31,440 --> 00:34:33,439 Du spiller rollen som getstring. 783 00:34:33,439 --> 00:34:35,980 Og jeg skal bare fortelle deg strengen som du har fått. 784 00:34:35,980 --> 00:34:38,080 Og anta at du, getstring, har blitt kalt. 785 00:34:38,080 --> 00:34:42,480 Og den menneskelige, som meg, har skrevet i Zamyla, Z-A-M-Y-L-A. 786 00:34:42,480 --> 00:34:45,650 Bare gå videre og skrive Zamyla på skjermen som om du har fått det 787 00:34:45,650 --> 00:34:47,250 og lagres et eller annet sted i minnet. 788 00:34:47,250 --> 00:34:52,370 789 00:34:52,370 --> 00:34:55,570 >> Forlate rommet for hva som vil være flere andre words-- det er OK, fortsett. 790 00:34:55,570 --> 00:34:59,620 >> [Latter] 791 00:34:59,620 --> 00:35:00,800 >> Så Zamyla, Excellent. 792 00:35:00,800 --> 00:35:04,880 Så nå anta at du, getstring, kalles igjen. 793 00:35:04,880 --> 00:35:09,350 Og derfor gir jeg deg, på tastatur, med et annet navn, Belinda. 794 00:35:09,350 --> 00:35:17,560 795 00:35:17,560 --> 00:35:18,060 Greit. 796 00:35:18,060 --> 00:35:22,380 Og nå neste gang getstring er heter, jeg skriver i noe sånt som Gabe, 797 00:35:22,380 --> 00:35:27,560 G-A-B-E. Du er virkelig å ta til hjerte random access memory. 798 00:35:27,560 --> 00:35:29,631 Som trekker alt helt tilfeldig. 799 00:35:29,631 --> 00:35:30,130 OK. 800 00:35:30,130 --> 00:35:31,104 >> [Latter] 801 00:35:31,104 --> 00:35:32,520 ALEX: Beklager min håndskrift er dårlig. 802 00:35:32,520 --> 00:35:33,770 DAVID J. MALAN: Nei, det er OK. 803 00:35:33,770 --> 00:35:40,480 Og hva med Rob, R-O-B. OK. 804 00:35:40,480 --> 00:35:41,020 Good. 805 00:35:41,020 --> 00:35:43,853 Slik at jeg ikke forventer at du ville slags lå ting ut på denne måten. 806 00:35:43,853 --> 00:35:45,020 Men vi kan gjøre dette arbeidet. 807 00:35:45,020 --> 00:35:48,810 Så hvordan gikk dere frem for legging ut disse tegn i minnet? 808 00:35:48,810 --> 00:35:51,310 Med andre ord, hvis vi tenker på dette rektangulær svart skjerm 809 00:35:51,310 --> 00:35:53,550 som representerer en datamaskinens RAM, eller minne. 810 00:35:53,550 --> 00:35:55,850 >> Og husker at RAM er bare en hel haug av bytes, 811 00:35:55,850 --> 00:35:57,480 og bytes er en hel haug med biter. 812 00:35:57,480 --> 00:35:59,350 Og biter er liksom implementert, generelt 813 00:35:59,350 --> 00:36:01,119 med noen form for elektrisitet i maskinvare. 814 00:36:01,119 --> 00:36:03,160 Så det er liksom den lagdeling vi har snakket om 815 00:36:03,160 --> 00:36:04,510 og kan nå ta for gitt. 816 00:36:04,510 --> 00:36:07,020 Hvordan gikk du frem bestemmer hvor du skal skrive 817 00:36:07,020 --> 00:36:11,634 Rob versus Gabe versus Belinda versus Zamyla? 818 00:36:11,634 --> 00:36:14,020 >> ALEX: Jeg bare gjorde det i pålegg om at du fortalte meg. 819 00:36:14,020 --> 00:36:15,650 >> DAVID J. MALAN: Og det er sant. 820 00:36:15,650 --> 00:36:20,100 Men hva styrt hvor du setter Belinda navn og Gabe navn? 821 00:36:20,100 --> 00:36:20,764 >> ALEX: Ingenting? 822 00:36:20,764 --> 00:36:22,930 DAVID J. MALAN: [ler] Så det fungerer, er det helt greit. 823 00:36:22,930 --> 00:36:25,290 Så datamaskiner er lite mer ryddig enn det. 824 00:36:25,290 --> 00:36:29,000 Og så når vi implement-- bli der for bare en moment-- når vi faktisk 825 00:36:29,000 --> 00:36:31,470 gjennomføre noe sånt getstring i en datamaskin, 826 00:36:31,470 --> 00:36:34,480 Zamyla kan bli lagt ut ganske mye som du gjorde på skjermen, der. 827 00:36:34,480 --> 00:36:36,660 >> Og hva er nøkkelen til å legge merke til her, hva Alex gjorde, 828 00:36:36,660 --> 00:36:40,260 er det er slags en avgrensning blant hvert av disse ordene, ikke sant? 829 00:36:40,260 --> 00:36:46,580 Du skrev ikke 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 andre ord, det er en slags skillelinje som synes å være, 831 00:36:49,740 --> 00:36:52,370 liksom, tilfeldig avstand mellom disse forskjellige ordene. 832 00:36:52,370 --> 00:36:54,120 Men det er bra, fordi vi mennesker kan nå 833 00:36:54,120 --> 00:36:56,470 visualisere at disse er fire forskjellige strenger. 834 00:36:56,470 --> 00:36:59,540 Det er ikke bare én sekvens av mange tegn. 835 00:36:59,540 --> 00:37:04,190 Så en datamaskin, da, i mellomtiden, kan ta en streng som Zamyla, 836 00:37:04,190 --> 00:37:07,220 sette hver av disse brevene innsiden av en byte minne. 837 00:37:07,220 --> 00:37:10,400 Men det tallet er mye større, selvfølgelig enn seks tegn. 838 00:37:10,400 --> 00:37:11,690 >> Det er en hel haug med RAM. 839 00:37:11,690 --> 00:37:15,330 Og så heretter, dette rutenett av boksene kommer 840 00:37:15,330 --> 00:37:17,560 å representere hva Alex bare gjorde her på skjermen. 841 00:37:17,560 --> 00:37:20,937 Og nå, Alex, kan vi tilby deg en blå eller en appelsin elefant fra Chang. 842 00:37:20,937 --> 00:37:22,270 ALEX: Jeg 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 applaus, hvis vi kunne, for Alex her. 845 00:37:25,580 --> 00:37:26,100 >> [APPLAUSE] 846 00:37:26,100 --> 00:37:26,766 >> ALEX: Takk. 847 00:37:26,766 --> 00:37:28,820 DAVID J. MALAN: Takk. 848 00:37:28,820 --> 00:37:36,230 Så takeaway er at, selv om mønster slags endret seg over tid, her 849 00:37:36,230 --> 00:37:40,430 på bordet, var det denne avgrensning mellom de ulike strenger 850 00:37:40,430 --> 00:37:42,610 at Alex fikk for oss. 851 00:37:42,610 --> 00:37:45,230 Nå datamaskiner, ærlig, kunne gjøre det samme. 852 00:37:45,230 --> 00:37:48,210 De kunne slags plop strenger hvor som helst i RAM. 853 00:37:48,210 --> 00:37:50,710 Her oppe, over her, her nede, her nede. 854 00:37:50,710 --> 00:37:52,020 >> De kunne gjøre akkurat det. 855 00:37:52,020 --> 00:37:54,280 Men, selvfølgelig, det er trolig ikke den beste planlegging. 856 00:37:54,280 --> 00:37:54,780 Høyre? 857 00:37:54,780 --> 00:37:57,340 Hvis jeg fortsatte å be Alex til få navn, trolig han hadde 858 00:37:57,340 --> 00:38:01,370 sette noen mer her nede, kanskje opp her, her, her, til slutt 859 00:38:01,370 --> 00:38:02,211 over her. 860 00:38:02,211 --> 00:38:05,460 Men med litt mer planlegging, absolutt, vi kunne legge ting ut mer renslig. 861 00:38:05,460 --> 00:38:07,350 Og ja, det er hva en datamaskin gjør. 862 00:38:07,350 --> 00:38:10,720 >> Men fangsten er at Hvis den neste strengen jeg får 863 00:38:10,720 --> 00:38:14,050 etter Zamyla er noe som Belinda, 864 00:38:14,050 --> 00:38:17,929 foreslå hvor vi kan skrive bokstav b med hensyn til dette rutenettet? 865 00:38:17,929 --> 00:38:18,720 Hvor vil du reise? 866 00:38:18,720 --> 00:38:21,480 Til høyre for den a, under z, under en? 867 00:38:21,480 --> 00:38:23,204 Hva ville din første instinkter være? 868 00:38:23,204 --> 00:38:24,120 PUBLIKUM: Under z. 869 00:38:24,120 --> 00:38:25,100 DAVID J. MALAN: Så under z. 870 00:38:25,100 --> 00:38:26,530 Og det er ganske grei, ikke sant? 871 00:38:26,530 --> 00:38:29,321 Det er litt artig, det er hva vi gjør på et tastatur når vi trykker Enter, 872 00:38:29,321 --> 00:38:31,770 eller en e-post når du gjør en punktliste over ting. 873 00:38:31,770 --> 00:38:34,310 Men realiteten er at datamaskiner prøve å være mer effektiv, 874 00:38:34,310 --> 00:38:37,170 og stappe sikkert like mye data til RAM som mulig, 875 00:38:37,170 --> 00:38:38,890 slik at du ikke kaster bort noen bytes. 876 00:38:38,890 --> 00:38:41,545 Slik at du ikke kaster bort noen skjermen eiendomsmegling. 877 00:38:41,545 --> 00:38:44,170 Og problemet, skjønt, er at hvis vi bokstavelig talt la brevet 878 00:38:44,170 --> 00:38:49,940 b etter en, hvordan skal vi vet hvor Zamyla navn slutter 879 00:38:49,940 --> 00:38:51,840 og Belinda navn begynner? 880 00:38:51,840 --> 00:38:55,270 Så du mennesker bare foreslått, vel, trykke Enter, egentlig. 881 00:38:55,270 --> 00:38:56,410 Sett det ned nedenfor. 882 00:38:56,410 --> 00:38:59,750 Eller som Alex gjorde, bare begynne å skrive neste navn under den foregående, 883 00:38:59,750 --> 00:39:01,583 og under den ene, og deretter under den. 884 00:39:01,583 --> 00:39:02,510 Det er et blikkfang. 885 00:39:02,510 --> 00:39:05,960 >> Datamaskiner har en annen blikkfang, men det er litt mer konsis. 886 00:39:05,960 --> 00:39:07,840 Det er denne funky karakter. 887 00:39:07,840 --> 00:39:11,890 Skråstrek, 0, som er kanskje minner om backslash n, 888 00:39:11,890 --> 00:39:12,640 og så videre, nå. 889 00:39:12,640 --> 00:39:14,120 De spesielle escape-sekvenser. 890 00:39:14,120 --> 00:39:19,120 Backslash 0 er veien for som representerer åtte null biter på rad. 891 00:39:19,120 --> 00:39:22,000 0000 0000. 892 00:39:22,000 --> 00:39:26,130 >> Måten du uttrykker det er ikke å treffer tallet null på tastaturet, 893 00:39:26,130 --> 00:39:28,140 fordi faktisk det er en ASCII røye. 894 00:39:28,140 --> 00:39:30,990 Det ser ut som et tall, men er faktisk et desimaltall 895 00:39:30,990 --> 00:39:35,910 som representerer den sirkulære glyph, den sirkulære skriftsnitt. 896 00:39:35,910 --> 00:39:38,410 I mellomtiden, backslash null betyr, bokstavelig talt 897 00:39:38,410 --> 00:39:40,700 sette åtte null bytes her for meg. 898 00:39:40,700 --> 00:39:42,136 >> Så dette er noe vilkårlig. 899 00:39:42,136 --> 00:39:44,260 Vi kunne har brukt noe mønster av biter, men verden 900 00:39:44,260 --> 00:39:46,610 besluttet noen år siden, at for å representere 901 00:39:46,610 --> 00:39:49,710 i enden av en streng i minnet, bare sette en hel haug med nuller. 902 00:39:49,710 --> 00:39:51,000 Fordi vi kan oppdage det. 903 00:39:51,000 --> 00:39:54,790 Nå som betyr at ingen bokstav i alfabet kan representeres med nuller. 904 00:39:54,790 --> 00:39:58,480 >> Men det er OK, har vi allerede sett at vi bruker 65 på opp i 97 på opp. 905 00:39:58,480 --> 00:40:00,290 Vi kom ingen vei Nær alle nuller. 906 00:40:00,290 --> 00:40:03,040 907 00:40:03,040 --> 00:40:06,540 Så Belinda i datamaskinens minne faktisk kommer til å gå her. 908 00:40:06,540 --> 00:40:09,764 Jeg har trukket den i gult bare å trekke vår oppmerksomhet til det. 909 00:40:09,764 --> 00:40:11,680 Og legg merke til, også, dette er helt vilkårlig. 910 00:40:11,680 --> 00:40:12,680 Jeg har tegnet det som et rutenett. 911 00:40:12,680 --> 00:40:14,460 Som, er RAM bare noen fysisk objekt. 912 00:40:14,460 --> 00:40:17,300 Det trenger ikke nødvendigvis ha rader og kolonner, per se. 913 00:40:17,300 --> 00:40:20,490 Det har nettopp fått en hel haug med bytes implementert i maskinvare eller annen måte. 914 00:40:20,490 --> 00:40:22,817 Men hvis etter Belinda jeg skrevet i Gabe navn, 915 00:40:22,817 --> 00:40:25,650 han kommer til å ende opp her i minnet, og hvis jeg skrev i Daven navn, 916 00:40:25,650 --> 00:40:27,316 for eksempel, han kommer til å ende opp her. 917 00:40:27,316 --> 00:40:29,310 Og jeg kan fortsette å skrive enda flere navn. 918 00:40:29,310 --> 00:40:32,100 >> Dessverre, hvis jeg prøver å skrive et super langt navn, 919 00:40:32,100 --> 00:40:33,730 Jeg kan til slutt gå tom for minne. 920 00:40:33,730 --> 00:40:37,810 I så fall, er getstring kommer til å returnere NULL, som vi sa. 921 00:40:37,810 --> 00:40:41,720 Men heldigvis, i hvert fall i denne visuelle her, vi fikk ikke fullt så langt. 922 00:40:41,720 --> 00:40:45,860 >> Nå hva som er hyggelig er at dette generelle ideen om å behandle ting 923 00:40:45,860 --> 00:40:49,720 som å være i esker er representant for en funksjon i C 924 00:40:49,720 --> 00:40:52,690 og en rekke språk, kjent som en matrise. 925 00:40:52,690 --> 00:40:55,490 En matrise er en annen type av data. 926 00:40:55,490 --> 00:40:57,380 Det er en datastruktur, hvis du vil. 927 00:40:57,380 --> 00:41:01,160 Struktur i den forstand av det egentlig, slags, ser ut som en boks, i hvert fall 928 00:41:01,160 --> 00:41:02,320 i ditt indre øye. 929 00:41:02,320 --> 00:41:09,680 En matrise er en sammenhengende sekvens av identiske 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 streng, i andre ord, er en rekke tegn. 932 00:41:14,720 --> 00:41:16,120 En rekke tegn. 933 00:41:16,120 --> 00:41:19,070 Men det viser seg at du kan ha matriser med bunter av ting. 934 00:41:19,070 --> 00:41:21,870 Faktisk kan vi sette enda tall i en matrise. 935 00:41:21,870 --> 00:41:23,920 Så i hvilken form vi kommer til å starte 936 00:41:23,920 --> 00:41:26,590 erklære disse dataene struktur som er kjent som en matrise 937 00:41:26,590 --> 00:41:28,250 er også tenkt å bruke hakeparenteser. 938 00:41:28,250 --> 00:41:31,500 Men disse hakeparenteser skal har annen betydning i denne sammenheng. 939 00:41:31,500 --> 00:41:33,450 >> Og la oss se det som følger. 940 00:41:33,450 --> 00:41:36,780 Anta at jeg åpnet opp en ny fil her. 941 00:41:36,780 --> 00:41:38,535 Og jeg lagre dette som ages.c. 942 00:41:38,535 --> 00:41:41,280 943 00:41:41,280 --> 00:41:43,470 Og jeg skal lagre dette i mappen min her. 944 00:41:43,470 --> 00:41:46,130 Og nå kommer jeg til å gå videre og begynner å skrive noe 945 00:41:46,130 --> 00:41:53,940 som inkluderer CS50.h, inkluderer stdio.h, int main annullert. 946 00:41:53,940 --> 00:41:57,370 Og så innsiden av her, vil jeg å først ha en int kalt alder. 947 00:41:57,370 --> 00:42:01,371 >> Og jeg kommer til å bruke det for å få en int fra brukeren for hans eller hennes alder. 948 00:42:01,371 --> 00:42:04,620 Men dette programmet er ment å bli brukt av flere mennesker, uansett kontekst. 949 00:42:04,620 --> 00:42:05,490 Jeg har en linje av mennesker. 950 00:42:05,490 --> 00:42:08,281 Alle av dem må skrive inn deres alder for kanskje noen, vet jeg ikke, 951 00:42:08,281 --> 00:42:10,530 konkurranse, eller hendelse at de har kommet for. 952 00:42:10,530 --> 00:42:13,030 Så neste person, jeg trenger en annen variabel. 953 00:42:13,030 --> 00:42:15,790 >> Fordi hvis jeg bare gjøre alder får getInt, det er 954 00:42:15,790 --> 00:42:18,500 kommer til å clobber, eller overskrive den forrige personens alder. 955 00:42:18,500 --> 00:42:19,760 Så det er ikke bra. 956 00:42:19,760 --> 00:42:21,790 Så mitt første instinkt kan være, oh, ok, 957 00:42:21,790 --> 00:42:26,260 hvis jeg ønsker å få flere folks ages-- la oss kalle dette alder1, 958 00:42:26,260 --> 00:42:31,280 int Age2 får int, blir int Alder3 getInt. 959 00:42:31,280 --> 00:42:35,340 Og nå kommer jeg til å bruke noen pseudokode her. 960 00:42:35,340 --> 00:42:37,679 >> Gjør noe med disse tallene. 961 00:42:37,679 --> 00:42:40,470 Vi vil forlate for en annen dag hva vi gjør det, fordi vi bare 962 00:42:40,470 --> 00:42:44,200 omsorg for øyeblikket om alder1, Age2, Alder3. 963 00:42:44,200 --> 00:42:46,450 Dessverre, når jeg kompilere dette programmet 964 00:42:46,450 --> 00:42:51,140 og sette den foran faktiske brukere, hva er fundamentalt dårlig design 965 00:42:51,140 --> 00:42:53,890 avgjørelsen jeg synes å ha gjort? 966 00:42:53,890 --> 00:42:54,624 Yeah? 967 00:42:54,624 --> 00:42:55,499 PUBLIKUM: [uhørbart] 968 00:42:55,499 --> 00:42:58,071 969 00:42:58,071 --> 00:42:59,820 DAVID J. MALAN: Yeah, Jeg har ikke engang forsøkt 970 00:42:59,820 --> 00:43:02,028 å finne ut hvor mange aldre kan jeg faktisk bryr seg om? 971 00:43:02,028 --> 00:43:05,380 Hvis jeg har færre enn tre personer her, og derfor færre enn tre aldre, 972 00:43:05,380 --> 00:43:07,260 Jeg er fortsatt blindt forventer tre. 973 00:43:07,260 --> 00:43:08,720 Gud forby fire personer møter opp. 974 00:43:08,720 --> 00:43:10,990 Mitt program bare vil ikke engang støtte dem. 975 00:43:10,990 --> 00:43:13,280 >> Og så dette, lang historie Kort sagt, er ikke en god vane. 976 00:43:13,280 --> 00:43:13,780 Høyre? 977 00:43:13,780 --> 00:43:16,530 Jeg ble egentlig kopiering og lime kode og bare tweaking 978 00:43:16,530 --> 00:43:17,430 variabelnavnet. 979 00:43:17,430 --> 00:43:22,410 Og, herregud, hvis du hadde, ikke tre aldre, men 10 eller 100, eller til og med 6500 980 00:43:22,410 --> 00:43:23,820 studenter, for eksempel. 981 00:43:23,820 --> 00:43:26,950 Dette er ikke til å være spesielt elegant kode, eller bærekraftig. 982 00:43:26,950 --> 00:43:29,200 Du er nødt til å omskrive programmet hver gang 983 00:43:29,200 --> 00:43:30,760 ditt antall personer endringer. 984 00:43:30,760 --> 00:43:35,090 >> Så heldigvis, i vår faktiske ages.c fil for i dag, 985 00:43:35,090 --> 00:43:36,970 vi har en mer smart løsning. 986 00:43:36,970 --> 00:43:39,800 Først kommer jeg til å låne konstruere vi har brukt et par ganger, 987 00:43:39,800 --> 00:43:43,744 dette gjøre mens loop, for å få antall personer i rommet. 988 00:43:43,744 --> 00:43:46,910 Jeg skal bare plage brukeren, igjen og igjen, helt til han eller hun gir meg 989 00:43:46,910 --> 00:43:49,260 en verdi for n som er et positivt heltall. 990 00:43:49,260 --> 00:43:51,590 >> Jeg kunne ha brukt, sist tid komme positive int. 991 00:43:51,590 --> 00:43:53,720 Men vi har ikke det på ordentlig, så jeg gikk videre 992 00:43:53,720 --> 00:43:55,660 og re implementert denne ideen. 993 00:43:55,660 --> 00:43:58,410 Nå her nede, er dette den nye triks. 994 00:43:58,410 --> 00:44:02,260 I linje 27, som kommentarene i linje 26 antyder, 995 00:44:02,260 --> 00:44:05,180 erklære en matrise der til å lagre alle alder. 996 00:44:05,180 --> 00:44:09,320 >> Så hvis du ønsker å få, ikke en int, ikke to ints, men en hel haug med ints. 997 00:44:09,320 --> 00:44:13,800 Spesielt n heltall, var n kanskje være tre, kanskje 100, kanskje 1000. 998 00:44:13,800 --> 00:44:17,570 Syntaksen, ganske enkelt, er å si, hva datatype vil du ha? 999 00:44:17,570 --> 00:44:19,620 Hva ønsker du å ringe som del av minne? 1000 00:44:19,620 --> 00:44:23,530 Hva vil du kalle rutenettet som ser ut som dette billedlig? 1001 00:44:23,530 --> 00:44:27,700 >> Og i parentes her, sier du hvor stor du vil matrisen til å være. 1002 00:44:27,700 --> 00:44:30,450 Og så tidligere, da jeg sa Syntaksen er litt annerledes her, 1003 00:44:30,450 --> 00:44:33,614 vi fortsatt bruker hakeparenteser, men når jeg erklære en matrise, 1004 00:44:33,614 --> 00:44:35,530 antall innsiden av hakeparenteser midler 1005 00:44:35,530 --> 00:44:37,610 hvor stor vil du at array å være. 1006 00:44:37,610 --> 00:44:42,490 >> Derimot, når vi bruker s brakett jeg et øyeblikk siden, s, en streng, 1007 00:44:42,490 --> 00:44:46,820 er faktisk en rekke tegn, men når du ikke erklære en variabel, 1008 00:44:46,820 --> 00:44:49,760 som med dette søkeordet her, du bare komme 1009 00:44:49,760 --> 00:44:54,280 en bestemt indeks, en spesifikk element fra denne matrisen. 1010 00:44:54,280 --> 00:44:57,090 Når vi vet det, resten av dette er enkel. 1011 00:44:57,090 --> 00:45:00,765 Hvis nye jeg først kommer til å skrive ut hva er en alder av person nummer jeg. 1012 00:45:00,765 --> 00:45:03,890 Der jeg bare si person nummer én, person nummer to, person nummer tre. 1013 00:45:03,890 --> 00:45:06,306 >> Og jeg bare gjør aritmetikk, slik at som normale mennesker, 1014 00:45:06,306 --> 00:45:09,030 vi teller fra en for dette program, og ikke fra null. 1015 00:45:09,030 --> 00:45:13,620 Så jeg kaller getint, men jeg lagrer svaret i aldre brakett jeg. 1016 00:45:13,620 --> 00:45:16,610 Hvilken er den i'th alder i matrisen. 1017 00:45:16,610 --> 00:45:21,640 Så mens sist gang vi var behandlende disse boksene som tegn for Zamyla navn, 1018 00:45:21,640 --> 00:45:22,490 og andre. 1019 00:45:22,490 --> 00:45:26,530 Nå, disse boksene representerer 32 biter, eller fire byte 1020 00:45:26,530 --> 00:45:29,510 der vi kan lagre en int, en int, en int. 1021 00:45:29,510 --> 00:45:31,890 Alt som igjen, er de samme datatype. 1022 00:45:31,890 --> 00:45:33,890 >> Nå gjør jeg noe dumt, som tiden går, bare 1023 00:45:33,890 --> 00:45:35,510 å rettferdiggjøre å skrive dette programmet. 1024 00:45:35,510 --> 00:45:40,050 Og deretter ned her, jeg igjen iterere over matrisen si et år fra nå, 1025 00:45:40,050 --> 00:45:43,090 person nummer én vilje være noe år gammel. 1026 00:45:43,090 --> 00:45:45,010 Og for å finne ut at math-- Jeg mener, dette 1027 00:45:45,010 --> 00:45:49,260 er ikke veldig komplisert arithmetic-- Jeg bare legge en til deres alder. 1028 00:45:49,260 --> 00:45:51,240 Bare for å demonstrere, igjen, denne. 1029 00:45:51,240 --> 00:45:57,910 >> Akkurat som jeg kan indeksere inn i en streng, s, så kan jeg indeksen inn en rekke aldre, 1030 00:45:57,910 --> 00:45:59,950 sånn der. 1031 00:45:59,950 --> 00:46:03,340 Så hvor dette kommer til å være å ta oss? 1032 00:46:03,340 --> 00:46:07,070 Så vi får se, til slutt, en få ting i dagene som kommer. 1033 00:46:07,070 --> 00:46:09,510 En, hele denne tiden, når skrive dine egne programmer, 1034 00:46:09,510 --> 00:46:11,239 som Mario, grådige, kreditt. 1035 00:46:11,239 --> 00:46:13,780 Du har vært å skrive navnet på programmet og trykker Enter. 1036 00:46:13,780 --> 00:46:15,610 Og så får brukerens input. 1037 00:46:15,610 --> 00:46:18,137 >> Med getString, getInt, getLongLong, eller lignende. 1038 00:46:18,137 --> 00:46:20,720 Men det viser seg at C støtter noe som kalles kommandolinje 1039 00:46:20,720 --> 00:46:25,740 argumenter, som kommer til å gi oss faktisk få på ordene som du skriver, 1040 00:46:25,740 --> 00:46:28,570 på den blinkende teksten, etter programmets navn. 1041 00:46:28,570 --> 00:46:31,430 >> Så i dagene som kommer, du kan skrive noe sånt som Caesar, 1042 00:46:31,430 --> 00:46:34,950 eller ./caesar nummer 13, etterpå. 1043 00:46:34,950 --> 00:46:36,070 Vi får se hvordan det fungerer. 1044 00:46:36,070 --> 00:46:37,550 Fordi ja, i Problemet satt to, vi er 1045 00:46:37,550 --> 00:46:39,383 kommer til å introdusere deg til litt noe 1046 00:46:39,383 --> 00:46:42,360 minner om Ralphie utfordre tidligere av kartografi. 1047 00:46:42,360 --> 00:46:43,970 Kunsten scrambling informasjon. 1048 00:46:43,970 --> 00:46:46,660 Dette, i virkeligheten er meget minner om hva Ralphie gjorde. 1049 00:46:46,660 --> 00:46:51,380 >> Dette er et eksempel på en krypterings algoritme som heter ROT13, R-O-T 13. 1050 00:46:51,380 --> 00:46:54,910 Hvilket betyr ganske enkelt rotere bokstaver i alfabetet 13 plasser. 1051 00:46:54,910 --> 00:46:58,309 Og hvis du gjør det, vil du se nå hva er, kanskje, en kjent frase. 1052 00:46:58,309 --> 00:47:01,100 Men måten vi kommer til å bruke dette til syvende og sist er mer generelt. 1053 00:47:01,100 --> 00:47:04,390 >> I P satt to, i standardutgaven, du vil implementere et par koder, 1054 00:47:04,390 --> 00:47:06,720 en som heter Cæsar, en som heter Vigenère. 1055 00:47:06,720 --> 00:47:10,090 Begge er rotasjons chiffer, ved at en eller annen måte du 1056 00:47:10,090 --> 00:47:11,826 slå ett brev til en annen bokstav. 1057 00:47:11,826 --> 00:47:12,950 Og Caesar er super enkel. 1058 00:47:12,950 --> 00:47:16,220 Du legger en, legg 13, eller noen tall opp til 26. 1059 00:47:16,220 --> 00:47:19,570 Vigenère gjør det på en per brev basis. 1060 00:47:19,570 --> 00:47:22,140 Så Vigenère, som du ser i spec, er sikrere. 1061 00:47:22,140 --> 00:47:24,973 >> Men på slutten av dagen hva du vil være å implementere og P satt to, 1062 00:47:24,973 --> 00:47:29,050 er at nøkkelen som du bruker både for kryptering og dekryptering. 1063 00:47:29,050 --> 00:47:32,160 Henvisende til fremgangsmåten for å dreie ren tekst, noen opprinnelige meldingen, 1064 00:47:32,160 --> 00:47:34,490 inn cypher tekst, som er noe kryptert. 1065 00:47:34,490 --> 00:47:36,220 Og deretter dekryptere det igjen. 1066 00:47:36,220 --> 00:47:38,119 >> I hacker utgave, i mellomtiden, vil du være 1067 00:47:38,119 --> 00:47:40,660 oppgave med noe lignende i ånden, hvor vi vil gi deg 1068 00:47:40,660 --> 00:47:44,610 en fil, fra en typisk Linux, eller Mac eller Unix datamaskin kalt etsy 1069 00:47:44,610 --> 00:47:47,800 passord, som inneholder en hel haug av brukernavn og passord. 1070 00:47:47,800 --> 00:47:50,932 Og disse passordene har alt blitt kryptert, eller hashet, 1071 00:47:50,932 --> 00:47:53,140 så å si, mer riktig som du ser på spec. 1072 00:47:53,140 --> 00:47:57,090 >> Og hacker utgaven vil utfordre du med å ta en inngang som dette, 1073 00:47:57,090 --> 00:47:58,800 og knekke passord. 1074 00:47:58,800 --> 00:48:02,590 Det er, finne ut hva menneskets passord faktisk var. 1075 00:48:02,590 --> 00:48:05,570 Fordi, ja, passord er generelt ikke er lagret i den klare, 1076 00:48:05,570 --> 00:48:08,260 og generelt passord bør være vanskelig å gjette. 1077 00:48:08,260 --> 00:48:09,610 Det er ofte ikke tilfelle. 1078 00:48:09,610 --> 00:48:12,110 >> Og det jeg trodde vi ville gjøre er konkludere med et par minutter 1079 00:48:12,110 --> 00:48:15,160 blikk på en spesielt dårlig valg av passord 1080 00:48:15,160 --> 00:48:17,260 fra en film du kanskje husker fondly. 1081 00:48:17,260 --> 00:48:18,915 Og hvis ikke, bør du leie. 1082 00:48:18,915 --> 00:48:20,070 >> [VIDEOAVSPILLING] 1083 00:48:20,070 --> 00:48:22,320 >> -Helmet, Du djevel, hva skjer? 1084 00:48:22,320 --> 00:48:24,240 Hva gjør du til min datter? 1085 00:48:24,240 --> 00:48:28,010 >> -Permit Meg å introdusere strålende ung plastisk kirurg, 1086 00:48:28,010 --> 00:48:30,010 Doctor Phillip Schlotkin. 1087 00:48:30,010 --> 00:48:35,020 Den største nese jobb mann i hele universet og Beverly Hills. 1088 00:48:35,020 --> 00:48:36,140 >> -Din Høyhet. 1089 00:48:36,140 --> 00:48:36,820 >> -Nose Jobb? 1090 00:48:36,820 --> 00:48:37,700 Jeg forstår ikke. 1091 00:48:37,700 --> 00:48:39,070 Hun har allerede hatt en nese jobb. 1092 00:48:39,070 --> 00:48:40,800 Det var hennes søte 16 til stede. 1093 00:48:40,800 --> 00:48:42,590 >> Nei, det er ikke hva du tror. 1094 00:48:42,590 --> 00:48:44,490 Det er mye, mye verre. 1095 00:48:44,490 --> 00:48:48,160 Hvis du ikke gi meg Kombinasjonen av luftskjold, 1096 00:48:48,160 --> 00:48:52,748 Legen Schlotkin vil gi datter tilbake sin gamle nesen. 1097 00:48:52,748 --> 00:48:53,748 - [Gisp] Nooooooooooooo. 1098 00:48:53,748 --> 00:48:57,684 1099 00:48:57,684 --> 00:48:59,652 Hvor fikk du den? 1100 00:48:59,652 --> 00:49:00,640 >> -Greit. 1101 00:49:00,640 --> 00:49:02,506 Jeg skal fortelle, jeg skal fortelle. 1102 00:49:02,506 --> 00:49:03,498 >> Nei, pappa, nei. 1103 00:49:03,498 --> 00:49:04,490 Du må ikke. 1104 00:49:04,490 --> 00:49:06,090 >> -Du Har rett min kjære. 1105 00:49:06,090 --> 00:49:07,390 Jeg vil savne den nye nesen. 1106 00:49:07,390 --> 00:49:10,990 Men jeg vil ikke fortelle dem kombinasjon uansett hva. 1107 00:49:10,990 --> 00:49:12,450 >> -Veldig Godt. 1108 00:49:12,450 --> 00:49:14,830 Doctor Schlotkin, gjør din verste. 1109 00:49:14,830 --> 00:49:15,744 >> -Min Nytelse. 1110 00:49:15,744 --> 00:49:19,860 1111 00:49:19,860 --> 00:49:20,800 >> -Ingen! 1112 00:49:20,800 --> 00:49:22,780 Vent, vent. 1113 00:49:22,780 --> 00:49:24,000 Jeg skal fortelle. 1114 00:49:24,000 --> 00:49:25,830 Jeg skal fortelle. 1115 00:49:25,830 --> 00:49:28,270 >> -Jeg visste at det ville fungere. 1116 00:49:28,270 --> 00:49:31,390 Greit, gi den til meg. 1117 00:49:31,390 --> 00:49:36,220 >> -The Kombinasjonen er en. 1118 00:49:36,220 --> 00:49:36,740 >> -Ett. 1119 00:49:36,740 --> 00:49:37,473 >> -Ett. 1120 00:49:37,473 --> 00:49:37,972 -To. 1121 00:49:37,972 --> 00:49:38,471 -To. 1122 00:49:38,471 --> 00:49:39,800 -To. 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 -Fire. 1127 00:49:42,300 --> 00:49:42,800 -Fire. 1128 00:49:42,800 --> 00:49:44,707 -Fire. 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å den kombinasjonen er en, to, tre, fire, fem. 1133 00:49:53,480 --> 00:49:56,140 Det er det dummeste kombinasjonen Jeg hørt i mitt liv. 1134 00:49:56,140 --> 00:49:58,640 Det er den type ting en idiot ville ha på sin bagasje. 1135 00:49:58,640 --> 00:50:00,000 >> Takk, din høyhet. 1136 00:50:00,000 --> 00:50:01,340 >> [Ekstern CLICKS] 1137 00:50:01,340 --> 00:50:02,450 >> Hva gjorde du? 1138 00:50:02,450 --> 00:50:03,800 >> -Jeg Slått av veggen. 1139 00:50:03,800 --> 00:50:05,010 >> Nei, det gjorde du ikke, du slått av hele filmen. 1140 00:50:05,010 --> 00:50:06,220 >> -Jeg må har trykket på feil knapp. 1141 00:50:06,220 --> 00:50:07,064 >> -Vel, Sette den på igjen! 1142 00:50:07,064 --> 00:50:07,910 Sett filmen tilbake 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 -La Igjen, Arnold. 1146 00:50:09,660 --> 00:50:10,450 Kom, Gretchen. 1147 00:50:10,450 --> 00:50:12,533 Selvfølgelig vet du jeg vil nødt til å fakturere deg for dette. 1148 00:50:12,533 --> 00:50:16,720 1149 00:50:16,720 --> 00:50:17,220 -Vel? 1150 00:50:17,220 --> 00:50:17,802 Fungerte det? 1151 00:50:17,802 --> 00:50:18,510 Hvor er kongen? 1152 00:50:18,510 --> 00:50:20,218 >> -Det arbeidet, sir, vi har kombinasjonen. 1153 00:50:20,218 --> 00:50:20,740 -Flott. 1154 00:50:20,740 --> 00:50:24,810 Nå kan vi ta hver siste åndedrag av frisk luft fra planeten Druidia. 1155 00:50:24,810 --> 00:50:25,890 Hva er kombinasjonen? 1156 00:50:25,890 --> 00:50:28,155 >> -Ett, To, tre, fire, fem. 1157 00:50:28,155 --> 00:50:29,890 >> -Ett, To, tre, fire, fem? 1158 00:50:29,890 --> 00:50:30,390 Ja. 1159 00:50:30,390 --> 00:50:31,110 -Det er utrolig. 1160 00:50:31,110 --> 00:50:34,550 Jeg har den samme kombinasjonen på bagasjen min. 1161 00:50:34,550 --> 00:50:37,160 Forbered Spaceball 1 for umiddelbare avgang. 1162 00:50:37,160 --> 00:50:38,160 >> Ja, sir. 1163 00:50:38,160 --> 00:50:40,745 >> -Og Endre kombinasjonen på bagasjen min. 1164 00:50:40,745 --> 00:50:41,578 [Dørlukkingssystem SOUND] 1165 00:50:41,578 --> 00:50:42,064 [CLINK DØRER TREFFE HJELM] 1166 00:50:42,064 --> 00:50:42,550 -Ahh. 1167 00:50:42,550 --> 00:50:43,383 [END VIDEOAVSPILLING] 1168 00:50:43,383 --> 00:50:46,700 DAVID J. MALAN: Det er det for CS50, vi får se deg neste uke. 1169 00:50:46,700 --> 00:50:49,883 FORTELLER: Og nå, Deep Tanker, etter Daven Farnham. 1170 00:50:49,883 --> 00:50:53,160 1171 00:50:53,160 --> 00:50:55,860 >> Daven FARNHAM: Coding i C er så mye vanskeligere enn Scratch. 1172 00:50:55,860 --> 00:50:57,320 printf, Skrape 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