1 00:00:08,119 --> 00:00:11,630 [Powered by Google Translate] DAVID J. MALAN: Greit, dette er CS50, og dette er 2 00:00:11,630 --> 00:00:14,790 starter i uke to. 3 00:00:14,790 --> 00:00:16,300 Takk. 4 00:00:16,300 --> 00:00:19,000 La oss begynne her med en telefonsamtale. 5 00:00:19,000 --> 00:00:30,005 Jeg er i ferd med å ringe 617-BUG-CS50. 6 00:00:30,005 --> 00:00:31,230 CS50: Dette er CS50. 7 00:00:31,230 --> 00:00:33,930 For Shuttle Boy, trykk på 1. 8 00:00:33,930 --> 00:00:36,660 Å starte på nytt, trykk 9. 9 00:00:36,660 --> 00:00:38,180 DAVID J. MALAN: Så sa han til Shuttle Boy, en presse. 10 00:00:38,180 --> 00:00:41,560 Så vi kommer til å trykke en. 11 00:00:41,560 --> 00:00:43,230 CS50: Hva er ditt opphav? 12 00:00:43,230 --> 00:00:45,340 For quad, en presse. 13 00:00:45,340 --> 00:00:47,080 Mather, tast 2. 14 00:00:47,080 --> 00:00:49,240 Boylston, 3 trykk. 15 00:00:49,240 --> 00:00:51,280 Lamont, 4 trykk. 16 00:00:51,280 --> 00:00:53,210 Mem Hall, 5 pressen. 17 00:00:53,210 --> 00:00:55,660 Å starte på nytt, trykker du 0. 18 00:00:55,660 --> 00:00:59,590 DAVID J. MALAN: Vi trykker 1 for quad. 19 00:00:59,590 --> 00:01:03,610 CS50: Neste shuttle forlater dette svært minutt på 13:10, og 20 00:01:03,610 --> 00:01:09,820 deretter på 01:20, 01:30, 01:40. 21 00:01:09,820 --> 00:01:12,030 Dette er CS50. 22 00:01:12,030 --> 00:01:15,570 >> DAVID J. MALAN: Så dette er CS50 stemme. 23 00:01:15,570 --> 00:01:18,030 Og det er et eksempel på den slags endelige prosjekter, for 24 00:01:18,030 --> 00:01:19,500 eksempel kan du bite av mot 25 00:01:19,500 --> 00:01:20,600 slutten av semesteret. 26 00:01:20,600 --> 00:01:23,840 For eksempel finnes det shuttleboy.cs50.net - 27 00:01:23,840 --> 00:01:28,200 faktisk et prosjekt som jeg først skrev etter å ha tatt CS51 28 00:01:28,200 --> 00:01:29,740 tilbake når jeg var en lavere. 29 00:01:29,740 --> 00:01:32,250 Og inspirasjonen her var da, var alt de hadde 30 00:01:32,250 --> 00:01:34,320 de utskrevne shuttle buss tidsplaner, og det var ingen 31 00:01:34,320 --> 00:01:35,970 oppfatningen av å se ting opp på nettet. 32 00:01:35,970 --> 00:01:38,730 Og så jeg liksom due i en helg, strømmet gjennom 33 00:01:38,730 --> 00:01:41,460 trykt tidsplan, og portet det til et dataprogram. 34 00:01:41,460 --> 00:01:43,790 På den tiden skjedde dataprogrammet som skal skrives 35 00:01:43,790 --> 00:01:47,110 i C. Og du faktisk kjørte det ved å skrive Shuttle Boy på en 36 00:01:47,110 --> 00:01:48,600 blinkende be som vi har gjort så langt. 37 00:01:48,600 --> 00:01:50,450 Men i løpet av årene, har det utviklet seg til en umiddelbar 38 00:01:50,450 --> 00:01:51,390 meldinger bot. 39 00:01:51,390 --> 00:01:53,970 Det er utviklet flere nylig inn i denne nettsiden, i en 40 00:01:53,970 --> 00:01:57,720 SMS-basert verktøy, samt i denne stemmen-basert verktøy. 41 00:01:57,720 --> 00:02:00,170 Og dette er å antyde den slags ting som du kan 42 00:02:00,170 --> 00:02:02,380 gjøre for deg selv ved semester slutt. 43 00:02:02,380 --> 00:02:05,490 >> For eksempel er det, skjer SMS-versjonen av Shuttle Boy 44 00:02:05,490 --> 00:02:06,510 å operere som følger. 45 00:02:06,510 --> 00:02:10,880 Hvis, på din mobiltelefon, sender du en tekstmelding til 41411 og 46 00:02:10,880 --> 00:02:14,300 deretter sende den spesielle symbol sboy, for Shuttle Boy, 47 00:02:14,300 --> 00:02:18,350 etterfulgt av A og B, hvor A er en opprinnelse og B er en 48 00:02:18,350 --> 00:02:19,070 destinasjon - 49 00:02:19,070 --> 00:02:21,030 for eksempel, Boylston Space Quad - 50 00:02:21,030 --> 00:02:23,330 hva du bør få tilbake innen noen få sekunder er en tekst 51 00:02:23,330 --> 00:02:25,820 melding fra Shuttle Boy forteller deg nøyaktig når 52 00:02:25,820 --> 00:02:28,990 neste skyttelbussene er, fra det punkt A skal det 53 00:02:28,990 --> 00:02:29,640 punkt B. 54 00:02:29,640 --> 00:02:32,510 Og dette er et mer generelt eksempel på det som kalles 55 00:02:32,510 --> 00:02:33,920 ved hjelp av en API. 56 00:02:33,920 --> 00:02:36,930 >> Så for eksempel, er dette her bare shuttleboy.cs50.net, den 57 00:02:36,930 --> 00:02:39,300 faktiske web-basert inkarnasjon av dette. 58 00:02:39,300 --> 00:02:42,480 Men dataene som understreker dette og andre programmer som CS50 59 00:02:42,480 --> 00:02:45,560 har utviklet er alle utsatt for alle her i form 60 00:02:45,560 --> 00:02:49,340 av APIer, programmeringsgrensesnitt. 61 00:02:49,340 --> 00:02:52,220 Og det er bare en fancy måte å si at folk liker vi på 62 00:02:52,220 --> 00:02:56,010 Internett og andre har brukt litt tid på å lage 63 00:02:56,010 --> 00:02:59,970 programvare som du kan bruke for å hente data fra oss og 64 00:02:59,970 --> 00:03:02,510 deretter bygge dine egne applikasjoner på toppen 65 00:03:02,510 --> 00:03:03,840 av at datasettet. 66 00:03:03,840 --> 00:03:06,610 Så for eksempel, denne Shuttle Boy API side her, som 67 00:03:06,610 --> 00:03:09,390 skjer for å være i CS50 manuell, i hovedsak dokumenter 68 00:03:09,390 --> 00:03:13,080 hvordan du kan gå om å spørre CS50 servere for data. 69 00:03:13,080 --> 00:03:16,240 For eksempel, hvis du er kjent med CSV-filer, komma 70 00:03:16,240 --> 00:03:18,940 separerte verdier, disse er bare en slags rask og skitne 71 00:03:18,940 --> 00:03:20,310 Excel-lignende filer. 72 00:03:20,310 --> 00:03:23,110 Så du kan spørre Shuttle Boy for alle data på alle 73 00:03:23,110 --> 00:03:25,090 hus og deres GPS koordinater, og du får 74 00:03:25,090 --> 00:03:27,300 tilbake, i hovedsak, et regneark sånn at 75 00:03:27,300 --> 00:03:30,820 du kan da leses inn i et program for din egen og deretter 76 00:03:30,820 --> 00:03:33,250 generere resultater, som Shuttle Boy selv 77 00:03:33,250 --> 00:03:34,160 skjer til å gjøre. 78 00:03:34,160 --> 00:03:37,030 For de mer kjente, mer moderne data representasjoner 79 00:03:37,030 --> 00:03:39,420 inkludere JSON, JavaScript Object Notation. 80 00:03:39,420 --> 00:03:40,620 Noe vil komme tilbake til deg mot 81 00:03:40,620 --> 00:03:41,720 slutten av semesteret. 82 00:03:41,720 --> 00:03:45,440 >> Men igjen, dette er bare en av flere av CS50 egen APIer. 83 00:03:45,440 --> 00:03:48,320 Og det spennende ting er nå, i disse dager, Facebook og 84 00:03:48,320 --> 00:03:51,110 Twitter og Google, og ganske mye alle populære nettstedet ut 85 00:03:51,110 --> 00:03:54,130 Det har en slags API, som betyr at hvis du leser 86 00:03:54,130 --> 00:03:56,620 dokumentasjon på deres hjemmeside, kan du registrere deg for en 87 00:03:56,620 --> 00:03:59,980 konto, kan du begynne å skrive programvare på toppen av 88 00:03:59,980 --> 00:04:03,680 uansett verktøy eller data som selskapet det gir. 89 00:04:03,680 --> 00:04:06,210 Og så en av våre eigne pedagogiske karer et par år tilbake 90 00:04:06,210 --> 00:04:07,620 skrev en Mac-versjon av denne. 91 00:04:07,620 --> 00:04:10,990 Så på koblingen Mac her øverst til venstre, kan du faktisk 92 00:04:10,990 --> 00:04:13,940 laste ned en Mac OS widget som kjører på din egen Mac å gjøre 93 00:04:13,940 --> 00:04:15,040 samme typer ting. 94 00:04:15,040 --> 00:04:17,970 Så det handler om å bygge på toppen av datasett som disse. 95 00:04:17,970 --> 00:04:21,839 Men mer om det mot slutten av semesteret. 96 00:04:21,839 --> 00:04:25,780 >> Så la oss dykke i det virkelige rask en feil, bare for å slags få 97 00:04:25,780 --> 00:04:27,990 ting varmet opp i dag, og tenker tilbake på noen av de 98 00:04:27,990 --> 00:04:29,660 ting vi så på i forrige uke. 99 00:04:29,660 --> 00:04:32,840 Spesielt la meg gå videre og trekke opp, sier 100 00:04:32,840 --> 00:04:34,080 dette eksempelet her. 101 00:04:34,080 --> 00:04:37,500 Buggy1.c, er dette tilgjengelig på kursets hjemmeside hvis du hadde 102 00:04:37,500 --> 00:04:40,250 liker å laste det ned og rote rundt selv. 103 00:04:40,250 --> 00:04:43,520 Men la oss zoome inn her på denne relativt kort program, og bare 104 00:04:43,520 --> 00:04:46,550 en super-rask oppsummering av noen av de grunnleggende byggesteinene som 105 00:04:46,550 --> 00:04:48,880 vi virkelig kommer til å bare begynne å ta for gitt. 106 00:04:48,880 --> 00:04:51,860 >> Så den blå ting, i linje 1 til 9, er bare 107 00:04:51,860 --> 00:04:53,670 softball spørsmål. 108 00:04:53,670 --> 00:04:54,590 Så dette er bare kommentarer. 109 00:04:54,590 --> 00:04:56,230 De har ingen funksjonell betydning. 110 00:04:56,230 --> 00:04:58,460 Men de er kommentarer i den forstand at de er notater som 111 00:04:58,460 --> 00:05:02,010 Jeg, den menneskelige, laget til meg selv slik at i foredrag og etter 112 00:05:02,010 --> 00:05:04,340 forelesning, kan jeg faktisk huske hva dette programmet 113 00:05:04,340 --> 00:05:07,120 gjør uten å måtte lese gjennom det linje for linje og 114 00:05:07,120 --> 00:05:08,990 gjenskape historie i mitt sinn. 115 00:05:08,990 --> 00:05:11,000 Videre, hvis jeg levere dette programmet til noen andre som 116 00:05:11,000 --> 00:05:14,420 deg, er det mye klarere for deg, på grunn av kommentarer som dette, 117 00:05:14,420 --> 00:05:16,680 hva programmet faktisk gjør, eller i det minste hva 118 00:05:16,680 --> 00:05:18,210 Programmet er ment å være å gjøre. 119 00:05:18,210 --> 00:05:20,760 Hvorvidt det er riktig er en annen sak fullstendig. 120 00:05:20,760 --> 00:05:25,040 Nå, i C, med flere linjer kommentarer, husker at på linje 121 00:05:25,040 --> 00:05:27,880 en her er det magiske symbol / *. 122 00:05:27,880 --> 00:05:30,380 Det betyr her kommer starten på en kommentar. 123 00:05:30,380 --> 00:05:34,560 Og ingenting annet betyr noe til du kommer til slutten terminator, 124 00:05:34,560 --> 00:05:36,700 som er * /, det motsatte. 125 00:05:36,700 --> 00:05:39,120 Så det faktum at jeg har 80-noen merkelige stjerner her fra 126 00:05:39,120 --> 00:05:41,550 venstre til høyre er egentlig bare en estetisk detalj. 127 00:05:41,550 --> 00:05:43,370 Det har ingen funksjonell betydning. 128 00:05:43,370 --> 00:05:44,490 >> Nå hvordan om linje 11? 129 00:05:44,490 --> 00:05:46,940 Hva gjør dette i lekmann vilkår? 130 00:05:51,560 --> 00:05:52,540 Hva er det? 131 00:05:52,540 --> 00:05:54,280 PUBLIKUM: Inkluderer standard. 132 00:05:54,280 --> 00:05:54,740 DAVID J. MALAN: OK, god. 133 00:05:54,740 --> 00:05:57,500 Så det inkluderer stdio.h biblioteket. 134 00:05:57,500 --> 00:05:58,230 Så hva betyr det? 135 00:05:58,230 --> 00:06:01,570 Vel, inne filen, stdio.h, er en hel haug med 136 00:06:01,570 --> 00:06:03,320 funksjon erklæringer - 137 00:06:03,320 --> 00:06:05,290 altså kode som noen andre skrev. 138 00:06:05,290 --> 00:06:08,160 Og et perfekt eksempel på en funksjon som er erklært i 139 00:06:08,160 --> 00:06:10,250 stdio.h er - 140 00:06:10,250 --> 00:06:11,980 som favoritt nå? 141 00:06:11,980 --> 00:06:14,300 Så printf, til en av de mest vanlige bruk, absolutt 142 00:06:14,300 --> 00:06:15,840 tidlig, fra biblioteket er der. 143 00:06:15,840 --> 00:06:19,290 Hvis jeg ikke utelukke at kodelinje, er Clang kommer til å hyle 144 00:06:19,290 --> 00:06:22,550 på meg noe om å bruke en svart symbol. 145 00:06:22,550 --> 00:06:24,930 Noe svart er trolig den nøkkelord, fordi 146 00:06:24,930 --> 00:06:27,770 Vi har ikke informert kompilatoren hva printf ser 147 00:06:27,770 --> 00:06:29,230 liker mindre vi har den linjen. 148 00:06:29,230 --> 00:06:31,830 Og mer ned til jorden, egentlig, hva den linjen sier er 149 00:06:31,830 --> 00:06:34,890 åpne opp filen, stdio.h, uansett hvor den er på serverens 150 00:06:34,890 --> 00:06:38,200 harddisk, eller apparatet harddisk, og copy-paste det 151 00:06:38,200 --> 00:06:40,240 der inn filen min, uten min 152 00:06:40,240 --> 00:06:41,730 måtte gjøre det manuelt. 153 00:06:41,730 --> 00:06:44,420 >> Nå, når vi kommer ned hit til hovedsiden, lenge før vi begynner 154 00:06:44,420 --> 00:06:46,900 erting hverandre hva int og hva tomrommet er. 155 00:06:46,900 --> 00:06:48,430 Men for nå, la oss se på de tre linjene 156 00:06:48,430 --> 00:06:50,350 innen 15 til 17. 157 00:06:50,350 --> 00:06:52,250 Dette her jeg hevder som buggy. 158 00:06:52,250 --> 00:06:54,900 Linje 7 i mine kommentarer, sier "Skal ut 10 159 00:06:54,900 --> 00:06:59,410 asterisker men ikke. "Hvorfor dette ikke ut, faktisk, 160 00:06:59,410 --> 00:07:01,097 10 slike stjerner? 161 00:07:01,097 --> 00:07:02,347 PUBLIKUM: [uhørlig]. 162 00:07:05,210 --> 00:07:05,800 DAVID J. MALAN: Nettopp. 163 00:07:05,800 --> 00:07:08,720 Så merker at vi begynner å telle fra 0. 164 00:07:08,720 --> 00:07:10,780 Og dette er faktisk en konvensjon i programmering og 165 00:07:10,780 --> 00:07:13,230 informatikk mer generelt, begynner å telle 166 00:07:13,230 --> 00:07:14,610 fra 0 istedenfor 1. 167 00:07:14,610 --> 00:07:16,690 Og dette virkelig oppebærer bare fra det faktum at for 168 00:07:16,690 --> 00:07:18,940 eksempel, når vi hadde åtte personer på scenen, når 169 00:07:18,940 --> 00:07:20,680 ingen ble heve sin hånd, de var 170 00:07:20,680 --> 00:07:22,340 alle effektivt nuller. 171 00:07:22,340 --> 00:07:24,260 Og så er det bare en slags datamaskin konvensjon så, 172 00:07:24,260 --> 00:07:26,030 derfor å begynne å telle fra 0. 173 00:07:26,030 --> 00:07:29,130 Hvis det er det laveste antallet du kan representere i binær. 174 00:07:29,130 --> 00:07:32,270 >> Så her har vi begynt å initialisere jeg til 0. 175 00:07:32,270 --> 00:07:34,230 Vi har satt i lik 0.. 176 00:07:34,230 --> 00:07:37,780 Men da jeg gjorde dette feil her, sier jeg er mindre enn eller 177 00:07:37,780 --> 00:07:38,820 lik 10. 178 00:07:38,820 --> 00:07:41,700 Men hvis du tror at gjennom, hvis jeg starter på 0 og så går jeg bort 179 00:07:41,700 --> 00:07:46,410 opp til 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, jeg faktisk kommer til 180 00:07:46,410 --> 00:07:49,980 skrive ut 11 stjerner til skjermen, fordi jeg har gått opp 181 00:07:49,980 --> 00:07:52,410 til, eller lik 10. 182 00:07:52,410 --> 00:07:55,090 Så enkel løsning her er hva så? 183 00:07:55,090 --> 00:07:56,070 PUBLIKUM: [uhørlig]. 184 00:07:56,070 --> 00:07:57,350 DAVID J. MALAN: Bare endre det til mindre enn. 185 00:07:57,350 --> 00:07:59,700 Hvis du virkelig vil, kan du gjøre dette. 186 00:07:59,700 --> 00:08:01,370 Men generelt, det er mislikt. 187 00:08:01,370 --> 00:08:04,020 Og så begynner å telle fra 0 er bare noe du bør 188 00:08:04,020 --> 00:08:05,510 typisk bli vant til. 189 00:08:05,510 --> 00:08:07,810 Nå, hva om dette hele konstruere i seg selv? 190 00:08:07,810 --> 00:08:10,640 Denne linjen 15 demarks en for løkke. 191 00:08:10,640 --> 00:08:12,510 Så for er ikke en funksjon. 192 00:08:12,510 --> 00:08:13,640 Det er bare en uttalelse. 193 00:08:13,640 --> 00:08:16,180 Det er en looping konstruksjon, som vi så i Scratch. 194 00:08:16,180 --> 00:08:17,600 Og den har tre deler. 195 00:08:17,600 --> 00:08:19,740 Legg merke til at det er den første delen til 196 00:08:19,740 --> 00:08:21,350 venstre på semikolon. 197 00:08:21,350 --> 00:08:24,200 Det er den midtre delen i mellom de to semikolon. 198 00:08:24,200 --> 00:08:26,250 Og så er det den høyre delen til høyre 199 00:08:26,250 --> 00:08:27,640 av den andre semikolon. 200 00:08:27,640 --> 00:08:31,822 Nå gjør den første av disse hva? 201 00:08:31,822 --> 00:08:33,679 PUBLIKUM: [uhørlig]. 202 00:08:33,679 --> 00:08:34,270 DAVID J. MALAN: Back der? 203 00:08:34,270 --> 00:08:34,816 Ja? 204 00:08:34,816 --> 00:08:35,980 PUBLIKUM: Initialiseringsfeil. 205 00:08:35,980 --> 00:08:36,850 >> DAVID J. MALAN: Initialization. 206 00:08:36,850 --> 00:08:37,840 Så hva betyr dette? 207 00:08:37,840 --> 00:08:40,690 Vi har erklært en variabel kalt jeg. 208 00:08:40,690 --> 00:08:43,840 Det er av type int, fordi jeg har angitt int i. 209 00:08:43,840 --> 00:08:46,470 Og jeg initialisering jeg til verdien av 0. 210 00:08:46,470 --> 00:08:47,730 Så hva er dette egentlig si? 211 00:08:47,730 --> 00:08:50,680 Det er effektivt å si til datamaskinen hei, gi meg nok 212 00:08:50,680 --> 00:08:53,660 minne, nok RAM, for å passe et nummer, og deretter sette 213 00:08:53,660 --> 00:08:56,130 Tallet 0 i denne del av RAM. 214 00:08:56,130 --> 00:08:59,100 Og som en side, hvor stor er en int typisk, minst inne 215 00:08:59,100 --> 00:09:00,280 av apparatet? 216 00:09:00,280 --> 00:09:01,000 PUBLIKUM: 32 bit. 217 00:09:01,000 --> 00:09:01,670 DAVID J. MALAN: 32 biter. 218 00:09:01,670 --> 00:09:04,890 Så det betyr gi meg 32 bits, ellers kjent som 4 byte, 219 00:09:04,890 --> 00:09:07,250 og sette verdien 0 i den, noe som er ganske enkelt fordi 220 00:09:07,250 --> 00:09:09,110 det betyr bare sette alle bitene til 0. 221 00:09:09,110 --> 00:09:11,690 >> Så nå er den andre delen her tilstanden. 222 00:09:11,690 --> 00:09:14,590 Og tilstanden er, som navnet antyder, er det som kontrolleres 223 00:09:14,590 --> 00:09:18,100 igjen og igjen og igjen som om det er sant eller usant. 224 00:09:18,100 --> 00:09:21,410 Så dette er bare å si gjøre følgende linjer med kode - 225 00:09:21,410 --> 00:09:23,950 nemlig 16 linje, fordi det er den eneste innrykket 226 00:09:23,950 --> 00:09:24,820 under - 227 00:09:24,820 --> 00:09:26,980 så lenge jeg er mindre enn 10 år. 228 00:09:26,980 --> 00:09:30,520 Og etter hver iterasjon gjennom denne løkken, gjør 229 00:09:30,520 --> 00:09:33,840 forstørrelse, som i dette tilfellet er i + +. 230 00:09:33,840 --> 00:09:35,580 Nå betyr det ikke trenger å være i + +. 231 00:09:35,580 --> 00:09:37,610 Det kan være jeg -. 232 00:09:37,610 --> 00:09:39,860 Men hvis jeg gjorde dette, hva atferden kommer 233 00:09:39,860 --> 00:09:41,370 å være av dette programmet? 234 00:09:41,370 --> 00:09:42,290 PUBLIKUM: Det kommer til å være en uendelig loop. 235 00:09:42,290 --> 00:09:44,060 DAVID J. MALAN: Det kommer til å være en slags uendelig løkke, 236 00:09:44,060 --> 00:09:47,720 med mindre vi får heldig etter negative 2 milliarder kroner eller så. 237 00:09:47,720 --> 00:09:51,320 Kanskje ting vil vikle rundt, bare ved natur endelig 238 00:09:51,320 --> 00:09:53,930 antall bits som vi har tildelt for en int. 239 00:09:53,930 --> 00:09:56,270 Men det kommer garantert til å veksle langt mer enn 10 og 240 00:09:56,270 --> 00:09:58,630 sikkert mer enn 11 ganger her. 241 00:09:58,630 --> 00:10:02,240 >> Og nå, akkurat som en side, innser at jeg + + og jeg - 242 00:10:02,240 --> 00:10:04,420 er egentlig bare syntaktisk sukker. 243 00:10:04,420 --> 00:10:07,210 Det er bare stenografi notasjon for hva som er en litt mer 244 00:10:07,210 --> 00:10:08,720 eksplisitt skrevet som følger: 245 00:10:08,720 --> 00:10:11,200 i = i + 1. 246 00:10:11,200 --> 00:10:13,460 Som er identisk med i + +. 247 00:10:13,460 --> 00:10:15,860 Det bare slags ser penere å si i + +. 248 00:10:15,860 --> 00:10:17,490 Det er mer konsis, mer lesbar. 249 00:10:17,490 --> 00:10:19,030 Og slik at folk flest gjør det i stedet. 250 00:10:19,030 --> 00:10:21,840 Men dette er identisk funksjonelt til 251 00:10:21,840 --> 00:10:22,900 hva vi så. 252 00:10:22,900 --> 00:10:27,770 Så kort sagt, er det quick fix her bare for å si iterate jeg 253 00:10:27,770 --> 00:10:30,690 fra 0 helt opp til mindre enn 10 år. 254 00:10:30,690 --> 00:10:32,700 Og så får vi faktisk få 10 stjerner. 255 00:10:32,700 --> 00:10:33,430 >> Så la oss prøve dette. 256 00:10:33,430 --> 00:10:35,310 La meg åpne opp terminal på bunnen. 257 00:10:35,310 --> 00:10:37,420 La meg gå inn i katalogen som dette er i. 258 00:10:37,420 --> 00:10:40,030 Og jeg kommer til å kompilere den manuelt med Clang for nå. 259 00:10:40,030 --> 00:10:44,880 Og jeg kommer til å kompilere dette som buggy1.c, Enter. 260 00:10:44,880 --> 00:10:50,280 Og nå buggy1, hvorfor er det ingen slik fil eller katalog 261 00:10:50,280 --> 00:10:52,026 kalt buggy1? 262 00:10:52,026 --> 00:10:53,850 PUBLIKUM: [uhørlig]. 263 00:10:53,850 --> 00:10:54,240 DAVID J. MALAN: Yeah. 264 00:10:54,240 --> 00:10:55,420 Så det er faktisk kalt a.out. 265 00:10:55,420 --> 00:10:57,480 Så husker hvis du bare kjøre Clang, der Clang er 266 00:10:57,480 --> 00:11:00,420 kompilatoren, og du ikke oppgi navnet du ønsker å 267 00:11:00,420 --> 00:11:03,550 gi til programmet, det kommer til standard å a.out. 268 00:11:03,550 --> 00:11:05,030 Så faktisk hvis jeg gjør ls - 269 00:11:05,030 --> 00:11:05,510 oops. 270 00:11:05,510 --> 00:11:07,680 Og jeg didn't - svart-hvitt problemet noen av 271 00:11:07,680 --> 00:11:08,840 du møtt har blitt fikset. 272 00:11:08,840 --> 00:11:10,670 Men la meg gjøre dette. 273 00:11:10,670 --> 00:11:14,570 Det har vi a.out på venstre side der. 274 00:11:14,570 --> 00:11:17,360 Så vi må kjøre a.out stedet for buggy1. 275 00:11:17,360 --> 00:11:19,140 >> Så la meg gå videre og gjøre dette. 276 00:11:19,140 --> 00:11:22,840 . / A.out, Enter. 277 00:11:22,840 --> 00:11:26,160 Og jeg tydeligvis ikke gjorde det? 278 00:11:26,160 --> 00:11:26,620 PUBLIKUM: Lagre. 279 00:11:26,620 --> 00:11:27,390 DAVID J. MALAN: Save filen min. 280 00:11:27,390 --> 00:11:31,520 Så det er lett løses ved å treffe Control S, eller gå til 281 00:11:31,520 --> 00:11:33,450 Fil, Lagre som i de fleste programmer. 282 00:11:33,450 --> 00:11:36,360 La meg gå ned her, tømme skjermen, kjøre den på nytt. 283 00:11:36,360 --> 00:11:37,960 Og det er fortsatt en bug. 284 00:11:37,960 --> 00:11:41,618 Så hva som skjer - 285 00:11:41,618 --> 00:11:42,980 PUBLIKUM: Du har ikke kompilere. 286 00:11:42,980 --> 00:11:44,040 DAVID J. MALAN: Ah, good. 287 00:11:44,040 --> 00:11:45,010 Jeg hadde ikke kompilere den. 288 00:11:45,010 --> 00:11:47,250 Som en idiot, jeg ser på koden for å se hva som er galt. 289 00:11:47,250 --> 00:11:51,275 Så clang buggy1.c, nå a.out. 290 00:11:51,275 --> 00:11:52,640 Og phew, lagret. 291 00:11:52,640 --> 00:11:55,090 >> Så det ser litt stygg fordi det er ingen ny linje 292 00:11:55,090 --> 00:11:55,970 hvor som helst i programmet. 293 00:11:55,970 --> 00:11:57,390 Men igjen, det er bare et estetisk detalj. 294 00:11:57,390 --> 00:11:59,430 Og i hvert fall hvis vi regner dem ut, bør vi 295 00:11:59,430 --> 00:12:01,160 nå se 10 slike stjerner. 296 00:12:01,160 --> 00:12:03,260 Vel, hva med dette sekunders oppvarmingstid eksempel? 297 00:12:03,260 --> 00:12:07,750 Så i buggy2, hevder jeg at denne versjonen vil også ut 298 00:12:07,750 --> 00:12:10,110 10 stjerner, ett per linje. 299 00:12:10,110 --> 00:12:12,340 Så denne gangen har jeg en ny linje karakter, bare for å gjøre 300 00:12:12,340 --> 00:12:13,520 ting litt penere. 301 00:12:13,520 --> 00:12:15,410 Men i stedet hva jeg får er dette. 302 00:12:15,410 --> 00:12:19,590 Så la meg gjøre clang buggy2.c, Enter. 303 00:12:19,590 --> 00:12:21,790 Nå er det igjen kalt a.out. 304 00:12:21,790 --> 00:12:23,130 Enter. 305 00:12:23,130 --> 00:12:26,900 Jeg ser bare én ny linje, bare den aller siste nye linjen som 306 00:12:26,900 --> 00:12:29,370 flytter mitt spørsmål til neste linje. 307 00:12:29,370 --> 00:12:32,660 Og likevel klart jeg har vært utskrift *, deretter en ny linje, 308 00:12:32,660 --> 00:12:33,990 *, Deretter en ny linje. 309 00:12:33,990 --> 00:12:35,490 Men hva er feilen her? 310 00:12:35,490 --> 00:12:35,974 Ja? 311 00:12:35,974 --> 00:12:37,224 PUBLIKUM: [uhørlig]. 312 00:12:39,850 --> 00:12:40,470 >> DAVID J. MALAN: Nettopp. 313 00:12:40,470 --> 00:12:44,110 Så i motsetning til enkelte språk, som Python, der innrykk 314 00:12:44,110 --> 00:12:46,030 faktisk har funksjonell betydning, i en 315 00:12:46,030 --> 00:12:47,150 språk som C - 316 00:12:47,150 --> 00:12:49,140 som vi skal se, PHP, JavaScript - 317 00:12:49,140 --> 00:12:51,940 innrykk er egentlig bare for mennesker til gode. 318 00:12:51,940 --> 00:12:55,690 Så det faktum at jeg har rykket linje 16 og 17 ser flott ut, 319 00:12:55,690 --> 00:12:57,530 men det har ingen funksjonell betydning her. 320 00:12:57,530 --> 00:13:00,700 Hvis jeg vil begge linjene for å utføre som en del av for 321 00:13:00,700 --> 00:13:05,140 loop, så jeg må legge dem i klammeparentes ved å gjøre dette. 322 00:13:05,140 --> 00:13:08,540 Du kan bare klippe det hjørnet og hoppe over de klammeparentes hvis 323 00:13:08,540 --> 00:13:10,036 hva er tilfellet? 324 00:13:10,036 --> 00:13:10,410 PUBLIKUM: Bare én linje. 325 00:13:10,410 --> 00:13:11,130 DAVID J. MALAN: Bare én linje. 326 00:13:11,130 --> 00:13:15,280 Så det er bare en slags en fin slags syntaks detalj slik at 327 00:13:15,280 --> 00:13:17,900 du ikke kaste bort tid på å skrive tre linjer, hvorav to er 328 00:13:17,900 --> 00:13:20,040 klammeparentes, bare for å skrive en eneste linje med kode. 329 00:13:20,040 --> 00:13:21,650 Men hvis du har to eller flere linjer, vi 330 00:13:21,650 --> 00:13:22,860 faktisk må gjøre dette. 331 00:13:22,860 --> 00:13:24,210 >> Så nå la meg lagre denne. 332 00:13:24,210 --> 00:13:27,140 La meg gå videre og kjøre Clang. 333 00:13:27,140 --> 00:13:31,375 Så la meg kjøre a.out, og nå får jeg dem en per linje. 334 00:13:31,375 --> 00:13:33,670 Nå er a.out igjen en slags dum navn for et program. 335 00:13:33,670 --> 00:13:37,500 Hvordan kan jeg fortelle Clang å faktisk gi meg et filnavn 336 00:13:37,500 --> 00:13:39,820 som er mer brukervennlig, som buggy2 seg selv? 337 00:13:43,200 --> 00:13:44,466 Litt mer tydelig? 338 00:13:44,466 --> 00:13:45,220 PUBLIKUM: [uhørlig]. 339 00:13:45,220 --> 00:13:47,810 DAVID J. MALAN: OK, så jeg kan faktisk ta svært 340 00:13:47,810 --> 00:13:51,000 brukervennlig snarveien og bare skrive at buggy2. 341 00:13:51,000 --> 00:13:53,840 Jeg sier ikke noe om. C i dette tilfellet, og trykk på Enter. 342 00:13:53,840 --> 00:13:58,530 Og hva gjør gjør er det kompilerer buggy2.c for meg 343 00:13:58,530 --> 00:14:00,260 spør Clang å gjøre det. 344 00:14:00,260 --> 00:14:05,100 Spesielt, kaller det Clang, går det Clang hjelp måten mer 345 00:14:05,100 --> 00:14:08,540 kommandolinjeargumenter eller brytere enn jeg faktisk trenger. 346 00:14:08,540 --> 00:14:11,270 Med tiden vil vi komme tilbake til hva alle disse ulike 347 00:14:11,270 --> 00:14:13,810 kryptiske bindestrek uttrykk betyr. 348 00:14:13,810 --> 00:14:16,910 Men for nå, er det bare å spare meg bryet med 349 00:14:16,910 --> 00:14:19,600 å måtte huske og å måtte skrive ut alle disse 350 00:14:19,600 --> 00:14:21,150 ulike bindestrek uttrykk. 351 00:14:21,150 --> 00:14:23,240 Og oppsiden av det er til syvende og sist 352 00:14:23,240 --> 00:14:25,900 at nå har jeg buggy2. 353 00:14:25,900 --> 00:14:27,480 Hvis jeg ønsker å gjøre dette manuelt, men jeg 354 00:14:27,480 --> 00:14:28,775 kan i stedet gjøre dette - 355 00:14:28,775 --> 00:14:34,110 clang-o buggy2 og deretter buggy2.c. 356 00:14:34,110 --> 00:14:37,980 Og det vil likeledes gi meg en fil som heter buggy2. 357 00:14:37,980 --> 00:14:39,710 >> Så kort sagt, er Clang kompilatoren. 358 00:14:39,710 --> 00:14:43,080 Gjør er bare et brukervennlig verktøy som vi skal bruke mer 359 00:14:43,080 --> 00:14:44,420 og mer, fordi det begynner bare å 360 00:14:44,420 --> 00:14:47,330 forenkle ting for oss. 361 00:14:47,330 --> 00:14:49,430 Og vi kommer tilbake 0, til slutt. 362 00:14:49,430 --> 00:14:51,890 For nå, bare fordi, men vi vil starte teasing den delen 363 00:14:51,890 --> 00:14:52,930 dag og på onsdag. 364 00:14:52,930 --> 00:14:55,560 Eventuelle spørsmål om noe av dette? 365 00:14:55,560 --> 00:14:56,450 Ja? 366 00:14:56,450 --> 00:14:58,234 PUBLIKUM: [uhørlig] 367 00:14:58,234 --> 00:15:00,020 ls i anførselstegn der? 368 00:15:00,020 --> 00:15:01,710 DAVID J. MALAN: OK. 369 00:15:01,710 --> 00:15:05,880 Når jeg skrev ls i anførselstegn, som ble meg gjør litt magi 370 00:15:05,880 --> 00:15:07,160 bak kulissene for å fikse en feil. 371 00:15:07,160 --> 00:15:09,370 Jeg glemte, som vi har vært å fortelle mange av dere på 372 00:15:09,370 --> 00:15:11,600 diskusjonsfora, å gjøre - 373 00:15:11,600 --> 00:15:17,220 Vi vil gjøre dette nå - sudo yum-y oppdatering appliance50. 374 00:15:17,220 --> 00:15:19,790 Whoops, at det er stavet riktig. 375 00:15:19,790 --> 00:15:23,240 Så apparatet er som et operativsystem. 376 00:15:23,240 --> 00:15:25,650 Det kjører dette operativsystemet heter Fedora. 377 00:15:25,650 --> 00:15:27,450 Og nå på grunn av min treg Internett-tilkobling, har jeg 378 00:15:27,450 --> 00:15:28,260 virkelig spyles det. 379 00:15:28,260 --> 00:15:31,620 Så kjører sudo yum oppdatering, som vi fortelle deg å gjøre i 380 00:15:31,620 --> 00:15:34,080 oppgavesettet, er som i hovedsak kjører automatiske oppdateringer 381 00:15:34,080 --> 00:15:35,420 i Mac OS eller Windows. 382 00:15:35,420 --> 00:15:37,280 Og begrunnelsen for å kjøre dette på begynnelsen av 383 00:15:37,280 --> 00:15:39,640 Oppgavesettet er fordi når vi laget apparatet, jeg 384 00:15:39,640 --> 00:15:42,480 messed up, og jeg tilfeldigvis gjorde alle programmene dine ser 385 00:15:42,480 --> 00:15:45,210 svart på en svart skjerm, som er grunnen til at du ikke ser dem 386 00:15:45,210 --> 00:15:45,860 som standard. 387 00:15:45,860 --> 00:15:48,020 Men den nyeste versjonen av apparatet løser dette. 388 00:15:48,020 --> 00:15:50,500 Og jeg vil fikse det i pausen når jeg har internett 389 00:15:50,500 --> 00:15:51,280 tilkobling. 390 00:15:51,280 --> 00:15:54,630 >> Så sitater bare skjuler min feil, veldig diskret, 391 00:15:54,630 --> 00:15:55,730 tilsynelatende. 392 00:15:55,730 --> 00:15:56,980 Andre spørsmål? 393 00:15:59,750 --> 00:16:00,668 Ja? 394 00:16:00,668 --> 00:16:02,012 PUBLIKUM: Hvor gjør kommer fra? 395 00:16:02,012 --> 00:16:03,810 [Uhørlig] 396 00:16:03,810 --> 00:16:04,280 DAVID J. MALAN: Godt spørsmål. 397 00:16:04,280 --> 00:16:05,460 Hvor gjør kommer fra? 398 00:16:05,460 --> 00:16:09,390 Det er en Linux-program som har eksistert i mange år, lenge 399 00:16:09,390 --> 00:16:10,570 før CS50. 400 00:16:10,570 --> 00:16:12,930 Og det kommer med et operativsystem som Fedora. 401 00:16:12,930 --> 00:16:14,830 Det kommer ikke fra CS50 biblioteket. 402 00:16:14,830 --> 00:16:17,560 Faktisk, det eneste som kommer fra CS50 bibliotek 403 00:16:17,560 --> 00:16:20,470 så langt, at vi har sett, er GetString, GetInt, alle 404 00:16:20,470 --> 00:16:25,550 de Få funksjoner, og ordet streng, og til en viss 405 00:16:25,550 --> 00:16:26,575 grad ordet bool. 406 00:16:26,575 --> 00:16:29,180 Men vi vil erte at bortsett når vi dykke ned i CS50 407 00:16:29,180 --> 00:16:30,580 selve apparatet. 408 00:16:30,580 --> 00:16:32,820 >> Så ja, ett spørsmål til her. 409 00:16:32,820 --> 00:16:36,636 PUBLIKUM: Når du sa lage og deretter buggy, hvordan 410 00:16:36,636 --> 00:16:39,980 datamaskin vet [uhørlig]? 411 00:16:39,980 --> 00:16:40,520 DAVID J. MALAN: Godt spørsmål. 412 00:16:40,520 --> 00:16:43,830 Så når du bare kjøre lage buggy1 eller gjøre buggy2, hvordan 413 00:16:43,830 --> 00:16:45,220 gjør det? 414 00:16:45,220 --> 00:16:49,900 Så som standard, hvis du skriver at buggy1, lage ser for en 415 00:16:49,900 --> 00:16:52,330 fil som heter buggy1.c. 416 00:16:52,330 --> 00:16:55,570 Og da er det utfører de riktige klang kommandoer, 417 00:16:55,570 --> 00:17:00,380 dermed overstyre standard output fil kalt a.out. 418 00:17:00,380 --> 00:17:03,670 Faktisk, hvis vi ser på hva gjør, hva - 419 00:17:03,670 --> 00:17:04,839 la oss avslutte denne. 420 00:17:04,839 --> 00:17:09,530 Hvis vi ser på hva som gjør faktisk gjør, gjør buggy2, 421 00:17:09,530 --> 00:17:10,470 det er allerede oppdatert. 422 00:17:10,470 --> 00:17:13,020 Så la meg fjerne rm kommandoen, 423 00:17:13,020 --> 00:17:14,319 programmet jeg skrev før. 424 00:17:14,319 --> 00:17:17,319 Skrive Y-E-S for å bekrefte at jeg ønsker å fjerne det. 425 00:17:17,319 --> 00:17:20,480 Hvis jeg nå gjør, legge merke til at i denne svært lang linje, 426 00:17:20,480 --> 00:17:22,980 det er denne siste her,-o buggy2. 427 00:17:22,980 --> 00:17:26,959 Alle gjør gjør er forbifarten at argumentet, så å si, til 428 00:17:26,959 --> 00:17:29,665 Clang, slik at jeg ikke behøver å skrive det selv. 429 00:17:29,665 --> 00:17:32,660 >> All right, så en rask par administrative 430 00:17:32,660 --> 00:17:33,470 kunngjøringer. 431 00:17:33,470 --> 00:17:36,940 Så for deler, som offisielt startet dette kommer 432 00:17:36,940 --> 00:17:38,970 Søndag, vil du alltid ønsker å ta, dersom 433 00:17:38,970 --> 00:17:40,120 du har en, en bærbar datamaskin. 434 00:17:40,120 --> 00:17:42,570 Hvis du ikke har en bærbar PC, må nå ut til meg av 435 00:17:42,570 --> 00:17:43,580 slippe meg en epost. 436 00:17:43,580 --> 00:17:44,810 Og vi vil finne en arbeidsflyt. 437 00:17:44,810 --> 00:17:47,100 Hva du vanligvis finner i delen er at de er en del 438 00:17:47,100 --> 00:17:48,770 konseptuelle, del hands-on. 439 00:17:48,770 --> 00:17:52,190 Vi vil spesielt bruke den delen av spørsmål, en del av 440 00:17:52,190 --> 00:17:54,110 ukens oppgavesettet, å gå gjennom noen av de 441 00:17:54,110 --> 00:17:55,820 konseptuelle materiale fra forelesning. 442 00:17:55,820 --> 00:17:57,480 Og det er alt i den aktuelle oppgaven. 443 00:17:57,480 --> 00:18:00,010 Og vi vil også dykke inn i noen hands-on aktiviteter, noen ganger 444 00:18:00,010 --> 00:18:02,190 som vil være nødvendig for å bli sendt, noen ganger av 445 00:18:02,190 --> 00:18:02,830 som ikke vil. 446 00:18:02,830 --> 00:18:04,630 For eksempel, denne første uken, de mente bare som en 447 00:18:04,630 --> 00:18:05,780 warm-up trening. 448 00:18:05,780 --> 00:18:07,800 Og du vil finne at disse problemene er egentlig bare det. 449 00:18:07,800 --> 00:18:10,220 De er ment å være ganske små, men ikke nødvendigvis 450 00:18:10,220 --> 00:18:13,100 trivielle programmer for å skrive, som ikke nødvendigvis er 451 00:18:13,100 --> 00:18:16,230 spennende i seg selv, men er gode muligheter til å 452 00:18:16,230 --> 00:18:19,620 øve med syntaks, med nye funksjoner, i den komforten av en 453 00:18:19,620 --> 00:18:21,900 delen der du har noen av dine klassekamerater til stede som 454 00:18:21,900 --> 00:18:22,870 samt TF din. 455 00:18:22,870 --> 00:18:26,210 >> Og hva vi skal gjøre over tid er å bruke et verktøy kalt CS50 Spaces, 456 00:18:26,210 --> 00:18:28,940 der i stedet for bare å bruke CS50 Appliance, vil du 457 00:18:28,940 --> 00:18:32,450 i stedet gå til en nettside i en nettleser, hvor du vil kunne 458 00:18:32,450 --> 00:18:35,610 å skrive kode i en nettleser-vinduet under delen. 459 00:18:35,610 --> 00:18:38,240 Og så hvis du melder deg på, kan undervisningen stipendiat deretter vise 460 00:18:38,240 --> 00:18:40,980 hva det er du skriver på skjermen din i nettleseren din 461 00:18:40,980 --> 00:18:43,930 vinduet opp på forsiden av klassen, enten anonymt eller 462 00:18:43,930 --> 00:18:47,250 offentlig, slik at han eller hun kan deretter gå gjennom med 463 00:18:47,250 --> 00:18:50,080 klassekameratene dine hva du gjorde bra, hva du ikke gjøre det bra. 464 00:18:50,080 --> 00:18:52,750 Og igjen, forsikret resten alt dette kan være pent anonymiseres. 465 00:18:52,750 --> 00:18:54,410 Men det vil være en fin mulighet for mye mer 466 00:18:54,410 --> 00:18:56,810 interaktivitet enn noe sånt som forelesning tillater. 467 00:18:56,810 --> 00:18:58,910 >> I mellomtiden vil vi ha disse tingene kalles super 468 00:18:58,910 --> 00:19:01,610 seksjoner, som er valgfritt, men er åpne for alle i 469 00:19:01,610 --> 00:19:04,030 klassen, slik at du kan gjøre dette mer kollektivt for 470 00:19:04,030 --> 00:19:05,190 Problemet er angitt. 471 00:19:05,190 --> 00:19:06,010 Her er planen. 472 00:19:06,010 --> 00:19:08,870 Dette er også lagt ut på hjemmesiden i cs50.net. 473 00:19:08,870 --> 00:19:10,850 Legg merke til at det vil være en hacker-spesifikt 474 00:19:10,850 --> 00:19:12,430 en i morgen ettermiddag. 475 00:19:12,430 --> 00:19:15,460 Og vi vil filme en dag og en i morgen og legge dem 476 00:19:15,460 --> 00:19:16,720 online innen 24 timer. 477 00:19:16,720 --> 00:19:19,370 Så hvis du ikke kan gjøre noen av disse tider, for ikke å bekymre deg. 478 00:19:19,370 --> 00:19:22,720 Og igjen, er planen online nå på cs50.net. 479 00:19:22,720 --> 00:19:25,350 >> I form av seksjonering selv, bør du ha fått en 480 00:19:25,350 --> 00:19:28,520 e-post med beskjed om å gå til kursets hjemmeside for å finne 481 00:19:28,520 --> 00:19:29,610 ut inndelingen. 482 00:19:29,610 --> 00:19:32,890 Hvis livet har endret seg og du må endre din del, 483 00:19:32,890 --> 00:19:33,560 ikke et problem. 484 00:19:33,560 --> 00:19:37,900 Gå tilbake til det samme URL, cs50.net/section, entall, 485 00:19:37,900 --> 00:19:40,090 og du vil fylle ut lignende form, slik at du kan 486 00:19:40,090 --> 00:19:41,260 så gi oss dine preferanser. 487 00:19:41,260 --> 00:19:43,360 Og vi vil følge opp ved ukens slutt på hva vi kan 488 00:19:43,360 --> 00:19:44,240 imøtekomme. 489 00:19:44,240 --> 00:19:49,530 Forrige uke, husker at vi foreslått å bruke CS50 Diskuter, 490 00:19:49,530 --> 00:19:51,370 kursets diskusjonen verktøy, forelesning. 491 00:19:51,370 --> 00:19:53,680 Så vi hadde 40 spørsmål som ble stilt og 492 00:19:53,680 --> 00:19:54,720 svarte under forelesning. 493 00:19:54,720 --> 00:19:56,280 Så det syntes å fungere godt, så vi vil fortsette 494 00:19:56,280 --> 00:19:57,180 prøver å gjøre dette. 495 00:19:57,180 --> 00:19:59,600 Hvis du under forelesning, trenger du ikke bare føler deg komfortabel heving 496 00:19:59,600 --> 00:20:00,780 hånden, ikke et problem. 497 00:20:00,780 --> 00:20:04,640 Gå til cs50.net/discuss, legge der, og en av vår undervisning 498 00:20:04,640 --> 00:20:07,270 Stipendiatene vil enten svare på det elektronisk eller heve 499 00:20:07,270 --> 00:20:10,620 hånd på dine vegne anonymt å spørre, avhengig 500 00:20:10,620 --> 00:20:12,470 av arten av spørsmålet. 501 00:20:12,470 --> 00:20:15,000 Og i form av tilbakemeldinger, vil generelt psets være 502 00:20:15,000 --> 00:20:16,760 returneres innen en uke. 503 00:20:16,760 --> 00:20:19,080 Fordi det tar litt tid for deler for å oppnå 504 00:20:19,080 --> 00:20:22,430 likevekt, vil den første pset, 0 og 1, være litt 505 00:20:22,430 --> 00:20:24,130 forsinket som ting slå seg ned. 506 00:20:24,130 --> 00:20:27,130 Men følg med for at i ukene som kommer. 507 00:20:27,130 --> 00:20:29,750 >> All right, så la meg sette på min alvorlig 508 00:20:29,750 --> 00:20:31,040 stemme for bare et øyeblikk. 509 00:20:31,040 --> 00:20:32,690 Så dette er faktisk en interessant klima å være 510 00:20:32,690 --> 00:20:35,210 ha denne diskusjonen, hva med alle de andre ting 511 00:20:35,210 --> 00:20:37,310 skjer på campus relatert til dette. 512 00:20:37,310 --> 00:20:40,220 Men CS50 har sikkert hatt sin historie av denne spesielle 513 00:20:40,220 --> 00:20:43,360 problemstilling, i så mye som hvert år, dette kurset, for mange 514 00:20:43,360 --> 00:20:46,910 år, Ad-Boards omtrent 3% av klassen. 515 00:20:46,910 --> 00:20:51,620 Dette siste året, 2011, CS50 Ad-Boarded 35 studenter. 516 00:20:51,620 --> 00:20:54,120 Dette er ikke, tror jeg, på grunn av mangel på klarhet. 517 00:20:54,120 --> 00:20:56,760 Innse at i kursets pensum, det er en side av 518 00:20:56,760 --> 00:20:59,020 redegjørelse hvor linjene er. 519 00:20:59,020 --> 00:21:01,350 Det samme setningen gjentas på hver og en av 520 00:21:01,350 --> 00:21:03,070 Problemet setter på side en. 521 00:21:03,070 --> 00:21:05,760 >> Så jeg nevne dette i dag egentlig bare for å gjøre 522 00:21:05,760 --> 00:21:07,030 folk oppmerksom på dette. 523 00:21:07,030 --> 00:21:08,080 Og vi har prøvd forskjellige ting. 524 00:21:08,080 --> 00:21:10,630 Og det jeg trodde vi ville gjøre i dag er å ta bare et øyeblikk å 525 00:21:10,630 --> 00:21:13,830 faktisk ser på noen av de siste sakene som har kommet opp. 526 00:21:13,830 --> 00:21:16,160 Snarere enn å holde disse som skitne lille hemmeligheter, faktisk 527 00:21:16,160 --> 00:21:19,170 peke ut hva elevene har gjort og hvordan vi har oppdaget 528 00:21:19,170 --> 00:21:21,630 det og virkelig hva overordnet motivasjon er for 529 00:21:21,630 --> 00:21:23,950 selv å ha denne samtalen. 530 00:21:23,950 --> 00:21:27,060 Så med det sagt, er linjen egentlig dette - 531 00:21:27,060 --> 00:21:29,200 per pensum, er du velkommen, oppfordres du, for å 532 00:21:29,200 --> 00:21:30,210 snakke med klassekamerater. 533 00:21:30,210 --> 00:21:31,910 Det er hele hensikten med å ha disse samarbeidende 534 00:21:31,910 --> 00:21:34,470 kontortid i Annenberg og oppmuntre folk til 535 00:21:34,470 --> 00:21:35,755 endelig prosjekt å jobbe sammen. 536 00:21:35,755 --> 00:21:38,590 Men linjen trekkes når det gjelder tid til å faktisk skrive 537 00:21:38,590 --> 00:21:39,790 den endelige løsningen. 538 00:21:39,790 --> 00:21:42,590 Snakke på engelsk, helt greit, snakke i pseudo-kode, 539 00:21:42,590 --> 00:21:43,400 helt fint. 540 00:21:43,400 --> 00:21:46,340 Sende en klassekamerat din pset, la dem se over 541 00:21:46,340 --> 00:21:48,610 skjermen som hender fortsette å skrive, 542 00:21:48,610 --> 00:21:50,110 over streken også. 543 00:21:50,110 --> 00:21:52,250 Ser til pensum for de spesielle linjene. 544 00:21:52,250 --> 00:21:55,850 >> Men bare for å male et bilde av hvordan dette er dessverre en 545 00:21:55,850 --> 00:21:58,370 virkeligheten, innser at det finnes nettsteder der ute som 546 00:21:58,370 --> 00:22:01,490 ha løsninger fra denne klassen og mange andre klasser. 547 00:22:01,490 --> 00:22:04,940 Det faktum at du eller noen 3% av dere vet at dette finnes 548 00:22:04,940 --> 00:22:07,240 betyr at vi vet at dette finnes. 549 00:22:07,240 --> 00:22:09,340 Det faktum at det finnes nettsteder som dette, hvor du 550 00:22:09,340 --> 00:22:11,540 kan betale noen for å faktisk gjøre dine oppgavesett - dette var 551 00:22:11,540 --> 00:22:13,450 en aktuell sak som kom opp i fjor. 552 00:22:13,450 --> 00:22:15,790 Dette er en nettside som heter odesk.com. 553 00:22:15,790 --> 00:22:20,090 Og Tim var navnet på personen her som var oppslaget på 554 00:22:20,090 --> 00:22:24,580 dette nettstedet og spurte noen til å gjøre sin pset 7 i 555 00:22:24,580 --> 00:22:25,570 denne spesielle saken. 556 00:22:25,570 --> 00:22:28,350 Vel, er odesk.com svært Google-stand, og vi også er 557 00:22:28,350 --> 00:22:30,310 veldig flinke til Googling. 558 00:22:30,310 --> 00:22:32,360 Også her er det områder - og dette er heller 559 00:22:32,360 --> 00:22:34,234 fryktelig, ærlig. 560 00:22:34,234 --> 00:22:38,050 [Latter] 561 00:22:38,050 --> 00:22:39,610 DAVID J. MALAN: Den morsomme ting om dette nettstedet er hvis 562 00:22:39,610 --> 00:22:41,970 du leser om side, de snakker om sine corporate 563 00:22:41,970 --> 00:22:44,390 kultur og hvordan kundeservice er deres nummer én 564 00:22:44,390 --> 00:22:46,190 prioritet, for å sørge for at oppdrag får 565 00:22:46,190 --> 00:22:47,890 slått inn i tide. 566 00:22:47,890 --> 00:22:50,580 >> Men i all seriøsitet, igjen, det faktum at disse nettstedene 567 00:22:50,580 --> 00:22:52,910 eksisterer, innser vi også er bevisst på 568 00:22:52,910 --> 00:22:53,730 disse typer nettsteder. 569 00:22:53,730 --> 00:22:55,890 Og for å gi deg en følelse av hva som former dette vanligvis 570 00:22:55,890 --> 00:22:58,570 tar vi vanligvis ikke har store skandaler der folk 571 00:22:58,570 --> 00:23:01,080 samarbeider om noen form for massiv skala, men heller 572 00:23:01,080 --> 00:23:04,540 det er disse nattlige øyeblikk av svakhet, hvor du har så 573 00:23:04,540 --> 00:23:07,550 mye å gjøre, det er 04:00, er du utslitt, og du 574 00:23:07,550 --> 00:23:09,770 tenke deg selv, vel, la meg bare ta en titt på min 575 00:23:09,770 --> 00:23:11,770 romkamerat eller min venn kode eller lignende. 576 00:23:11,770 --> 00:23:14,800 Og manifestasjoner av dette dessverre innebære Student 577 00:23:14,800 --> 00:23:17,640 En sender noe som dette og Student B innsending 578 00:23:17,640 --> 00:23:20,370 noe sånt som dette, som sikkert, i en datamaskin 579 00:23:20,370 --> 00:23:23,830 vitenskap klasse, er bemerkelsesverdig lett for dataforskere 580 00:23:23,830 --> 00:23:25,690 å oppdage med programvare. 581 00:23:25,690 --> 00:23:28,410 Dette er en annen vanlig paradigmet, hvor du har liksom 582 00:23:28,410 --> 00:23:31,010 jobbet sammen for noen, kanskje snakker i 583 00:23:31,010 --> 00:23:32,360 Engelsk, helt fint, pseudokode. 584 00:23:32,360 --> 00:23:35,080 Men så det er på tide å faktisk sende inn, og psets 585 00:23:35,080 --> 00:23:37,910 bare få byttet via e-post eller Dropbox eller lignende. 586 00:23:37,910 --> 00:23:41,120 Men i et forsøk på å gjøre det mindre klart at dette er 587 00:23:41,120 --> 00:23:44,830 hva som har skjedd, så er dette hva som sendes. 588 00:23:44,830 --> 00:23:47,880 Også dette ikke turen opp velskrevne biter av 589 00:23:47,880 --> 00:23:50,360 programvare som vi må faktisk oppdage 590 00:23:50,360 --> 00:23:51,280 slike ting. 591 00:23:51,280 --> 00:23:53,760 Og faktisk det vi gjør er å kjøre programvare som sammenligner alle 592 00:23:53,760 --> 00:23:55,540 årets innleveringer mot alle tidligere år 593 00:23:55,540 --> 00:23:57,380 innleveringer, mot alt vi fant på 594 00:23:57,380 --> 00:24:00,060 Internett, mot hver jobb nettsted der ute. 595 00:24:00,060 --> 00:24:01,710 Det er veldig automatisert. 596 00:24:01,710 --> 00:24:05,665 Og så gjør vi dette virkelig i stor rettferdighet til 97% som 597 00:24:05,665 --> 00:24:07,760 som virkelig fungerer rumpa av i denne og i andre 598 00:24:07,760 --> 00:24:11,530 klasser og sette i alle som innsats, slik at arbeidet 599 00:24:11,530 --> 00:24:13,030 de til slutt sende er deres egne. 600 00:24:13,030 --> 00:24:14,220 Og jeg kan gå på for aldre. 601 00:24:14,220 --> 00:24:16,030 >> Dette er bare en håndfull av fjorårets saker. 602 00:24:16,030 --> 00:24:19,350 Noen studenter sendt disse filene likt for pset 2, 603 00:24:19,350 --> 00:24:22,460 pset 3, 4 pset, 5 pset, 6 pset, 9 pset. 604 00:24:22,460 --> 00:24:26,360 I dette tilfellet var dette quiz 0 og i fjor, der to 605 00:24:26,360 --> 00:24:29,570 studenter sendt identisk denne setningen blant mange 606 00:24:29,570 --> 00:24:32,210 andre, "Forespørselen type -" dot, dot, dot. 607 00:24:32,210 --> 00:24:34,530 Slik at selv i en klasse av 600 gjorde vi oppdage dette 608 00:24:34,530 --> 00:24:36,310 på innsendt spørrekonkurranser. 609 00:24:36,310 --> 00:24:39,080 Så kort sagt, dette - ærlig, jeg hater å ha denne type 610 00:24:39,080 --> 00:24:41,300 samtale - men dette er virkelig en bevisst innsats 611 00:24:41,300 --> 00:24:43,540 dette året for å prøve å kjøre ned dette nummeret. 612 00:24:43,540 --> 00:24:45,650 For selv om vi sier slike ting hver 613 00:24:45,650 --> 00:24:48,100 år, tror jeg realiteten av å ha dvelt på det for noen 614 00:24:48,100 --> 00:24:50,800 flere sekunder enn vanlig og faktisk bare å peke ut 615 00:24:50,800 --> 00:24:53,600 at det kan virke som, eh, ikke en så stor avtale, minst 616 00:24:53,600 --> 00:24:56,390 tenker tilbake til dette spesielle øyeblikket, både i rettferdighet til 617 00:24:56,390 --> 00:25:00,100 selv og til dine klassekamerater her. 618 00:25:00,100 --> 00:25:02,480 Så hvis du har spørsmål om hvor linjen 619 00:25:02,480 --> 00:25:04,290 er, kan du bare nå ut til meg personlig. 620 00:25:04,290 --> 00:25:07,190 Men svaret er alltid helt stresset på 621 00:25:07,190 --> 00:25:09,090 siste minutt, kontanter i en sen dag. 622 00:25:09,090 --> 00:25:11,080 Eller om det er et spørsmål om ikke å ha noen sene dager, 623 00:25:11,080 --> 00:25:12,900 ærlig, send meg personlig. 624 00:25:12,900 --> 00:25:14,110 Vi skal finne ut av noe. 625 00:25:14,110 --> 00:25:17,480 Vennligst ikke sette din tid her på Harvard i fare. 626 00:25:17,480 --> 00:25:18,570 >> Nå, jeg trodde vi skulle lette stemningen, så jeg 627 00:25:18,570 --> 00:25:20,264 inkludert dette som neste lysbilde. 628 00:25:20,264 --> 00:25:22,770 [Latter] 629 00:25:22,770 --> 00:25:23,630 DAVID J. MALAN: Dette nettstedet var stor. 630 00:25:23,630 --> 00:25:24,820 Jeg fikk faktisk litt distrahert. 631 00:25:24,820 --> 00:25:26,330 Det er denne. 632 00:25:26,330 --> 00:25:29,590 Og så dette var fantastisk. 633 00:25:29,590 --> 00:25:35,190 Ok, så tenk på at kattungen sent på kvelden når du gjør 634 00:25:35,190 --> 00:25:36,040 disse avgjørelsene. 635 00:25:36,040 --> 00:25:40,110 All right, så tilbake til mer moro og mindre alvorlige ting, som 636 00:25:40,110 --> 00:25:40,780 forhold. 637 00:25:40,780 --> 00:25:43,900 >> Greit, så vi snakket kort om disse. 638 00:25:43,900 --> 00:25:46,080 Dette er noe som er trolig ganske kjent fra 639 00:25:46,080 --> 00:25:47,260 verden av Scratch. 640 00:25:47,260 --> 00:25:49,860 Og i en verden av Scratch, har vi dette behovet noen ganger til 641 00:25:49,860 --> 00:25:51,110 gå gjøre gafler i veien. 642 00:25:51,110 --> 00:25:54,840 Enten gjøre dette eller hint eller denne andre ting her. 643 00:25:54,840 --> 00:25:58,990 Og når vi ønsker å gjøre dette, kan vi bruke, i C nå, dette hvis 644 00:25:58,990 --> 00:26:00,860 annet konstruere. 645 00:26:00,860 --> 00:26:06,420 Og så her har vi boolske uttrykk. 646 00:26:06,420 --> 00:26:09,260 For eksempel boolske uttrykk her, kan vi ELLER 647 00:26:09,260 --> 00:26:12,260 dem sammen, i den forstand at vi har denne tilstanden ELLER 648 00:26:12,260 --> 00:26:13,200 den tilstanden. 649 00:26:13,200 --> 00:26:15,100 Vi kan og dem sammen, i den forstand at vi ønsker å 650 00:26:15,100 --> 00:26:17,710 sjekk denne tilstanden, og den tilstanden. 651 00:26:17,710 --> 00:26:22,440 Og her har vi en bryter uttalelse nå, som ikke er så 652 00:26:22,440 --> 00:26:26,040 lignende syntaktisk til disse typer forhold, men det 653 00:26:26,040 --> 00:26:30,160 tillater oss å gjøre det samme som if, else if, else if, else 654 00:26:30,160 --> 00:26:34,990 hvis, og lignende ved å opplisting dem tilfelle 655 00:26:34,990 --> 00:26:36,670 av hvert enkelt tilfelle. 656 00:26:36,670 --> 00:26:38,370 Så vi så dem sist. 657 00:26:38,370 --> 00:26:40,430 Og så begynte vi å berøre ting som looper. 658 00:26:40,430 --> 00:26:42,070 Vi så en av disse bare et øyeblikk siden. 659 00:26:42,070 --> 00:26:44,180 Men det er disse andre looping konstruksjoner. 660 00:26:44,180 --> 00:26:46,370 >> For eksempel, denne her. 661 00:26:46,370 --> 00:26:50,140 Så mens (tilstand), gjør denne tingen igjen og igjen. 662 00:26:50,140 --> 00:26:53,070 Så fundamentalt, hva synes å være forskjellig mellom denne 663 00:26:53,070 --> 00:26:55,760 for loop og dette mens loop her? 664 00:27:00,810 --> 00:27:05,045 Dette for loop og dette mens loop. 665 00:27:05,045 --> 00:27:07,840 Ja? 666 00:27:07,840 --> 00:27:08,800 Hva er det? 667 00:27:08,800 --> 00:27:10,050 PUBLIKUM: [uhørlig]. 668 00:27:14,632 --> 00:27:15,120 DAVID J. MALAN: Good. 669 00:27:15,120 --> 00:27:17,130 Så mens i for loop tilstand, det er klart 670 00:27:17,130 --> 00:27:17,940 mer syntaks. 671 00:27:17,940 --> 00:27:20,560 Det er denne initialiseringen, det er denne oppdateringen. 672 00:27:20,560 --> 00:27:23,820 I en stund loop, er det bare denne tilstanden. 673 00:27:23,820 --> 00:27:26,630 Så det virker som det er litt avdempet i forhold til for 674 00:27:26,630 --> 00:27:28,770 loop, noe som betyr hvis vi ønsker å ha variabler, og vi ønsker 675 00:27:28,770 --> 00:27:30,800 å ha forstørrelse, vi faktisk nødt til å 676 00:27:30,800 --> 00:27:32,500 gjøre dette selv. 677 00:27:32,500 --> 00:27:34,420 >> Så la meg gå videre og åpne opp gedit. 678 00:27:34,420 --> 00:27:36,320 La meg slå over til apparatet. 679 00:27:36,320 --> 00:27:38,110 Og la oss bare gjøre en rask liten eksempel på at 680 00:27:38,110 --> 00:27:40,550 skiller en av disse fra hverandre. 681 00:27:40,550 --> 00:27:42,490 Og i bakhodet mitt her, skal jeg si en ting. 682 00:27:42,490 --> 00:27:44,120 Jeg nevnte spesielt navnet Tim. 683 00:27:44,120 --> 00:27:47,740 Tim var faktisk noen som en student prøvde å finne for å gjøre 684 00:27:47,740 --> 00:27:48,680 lekser for dem. 685 00:27:48,680 --> 00:27:51,280 Vi hadde ingen Tim i det aktuelle avsnittet. 686 00:27:51,280 --> 00:27:53,690 Så skjønner, så jeg avslørt en student, var det ikke en student. 687 00:27:53,690 --> 00:27:55,720 Det var en tilfeldig person på internett å gjøre ting 688 00:27:55,720 --> 00:27:57,180 ved fullmakt fjor. 689 00:27:57,180 --> 00:27:58,670 Så vi finner det også. 690 00:27:58,670 --> 00:28:00,630 Så i dette tilfellet her, la meg gå videre og 691 00:28:00,630 --> 00:28:02,810 åpne opp en ny fil. 692 00:28:02,810 --> 00:28:04,800 File, New. 693 00:28:04,800 --> 00:28:06,050 Dette gir meg en fane her. 694 00:28:06,050 --> 00:28:09,940 La meg gå videre og lagre det som loop.c. 695 00:28:09,940 --> 00:28:11,810 La meg gå og klikker på Lagre. 696 00:28:11,810 --> 00:28:15,340 Og deretter ned her, la oss gå videre og begynne å skrive 697 00:28:15,340 --> 00:28:16,605 # Include . 698 00:28:19,116 --> 00:28:20,520 La meg zoome inn 699 00:28:20,520 --> 00:28:23,410 Nå skal vi gjøre int main (void). 700 00:28:23,410 --> 00:28:30,020 Nå la meg gå videre og gjøre for (int i = 0; i < 701 00:28:30,020 --> 00:28:33,480 oh, 10; i + +). 702 00:28:33,480 --> 00:28:36,620 Og nå skal jeg gå videre og skriver ut stjernen at jeg 703 00:28:36,620 --> 00:28:37,890 gjorde tidligere. 704 00:28:37,890 --> 00:28:39,390 Og deretter ved utgangen av dette programmet, vi bare kommer til å 705 00:28:39,390 --> 00:28:41,130 skrive ut en ny linje, bare så at min spør 706 00:28:41,130 --> 00:28:42,470 ser ikke alle rotete. 707 00:28:42,470 --> 00:28:45,170 returnere 0. 708 00:28:45,170 --> 00:28:47,610 Seem syntaktisk riktig? 709 00:28:47,610 --> 00:28:48,040 Så langt. 710 00:28:48,040 --> 00:28:48,560 Så la oss se. 711 00:28:48,560 --> 00:28:51,290 >> Så la meg zoome ut, gå inn i min terminal-vinduet. 712 00:28:51,290 --> 00:28:54,570 Og la meg gå videre og kjøre loop, fordi jeg kalte dette 713 00:28:54,570 --> 00:28:55,690 ting loop.c. 714 00:28:55,690 --> 00:28:56,780 Så sørg for loop. 715 00:28:56,780 --> 00:28:57,840 Synes å kompilere OK. 716 00:28:57,840 --> 00:29:00,210 La meg kjøre loop, og nå Enter. 717 00:29:00,210 --> 00:29:01,820 Og det ser ut til å ha skrevet 10 stjerner. 718 00:29:01,820 --> 00:29:03,780 Så la oss bare konvertere dette til en stund loop og se hva 719 00:29:03,780 --> 00:29:05,220 typer saker vi turen over. 720 00:29:05,220 --> 00:29:11,290 Så i stedet for dette, la meg gå inn her og si mens jeg er 721 00:29:11,290 --> 00:29:12,760 mindre enn 10 - 722 00:29:12,760 --> 00:29:14,910 la meg bli kvitt den for loop. 723 00:29:14,910 --> 00:29:17,170 OK, så vi har et par problemer allerede. 724 00:29:17,170 --> 00:29:21,110 Så tilstanden er den samme, men jeg er tydeligvis mangler 725 00:29:21,110 --> 00:29:21,680 initialisering. 726 00:29:21,680 --> 00:29:23,840 Jeg mangler forstørrelse. 727 00:29:23,840 --> 00:29:28,020 Så hva skal kompilatoren sannsynlig fortelle meg når jeg prøver å 728 00:29:28,020 --> 00:29:29,170 kompilere dette programmet? 729 00:29:29,170 --> 00:29:29,666 Ja? 730 00:29:29,666 --> 00:29:31,154 PUBLIKUM: [uhørlig]. 731 00:29:31,154 --> 00:29:31,650 >> DAVID J. MALAN: Good. 732 00:29:31,650 --> 00:29:34,180 Så det kommer til å si noe sånt svart - i dette 733 00:29:34,180 --> 00:29:35,280 tilfelle, variabel i. 734 00:29:35,280 --> 00:29:37,980 Og faktisk, bruk av svart identifikator jeg. 735 00:29:37,980 --> 00:29:40,960 Og så dette er i kontrast med språk som PHP og 736 00:29:40,960 --> 00:29:43,120 Python og Ruby, som noen av dere kanskje kjenner, 737 00:29:43,120 --> 00:29:44,820 der du kan bare slags start med variabler 738 00:29:44,820 --> 00:29:47,420 willy-Bulle og ikke trenger å bekymre deg for å erklære dem 739 00:29:47,420 --> 00:29:48,560 eksplisitt alltid. 740 00:29:48,560 --> 00:29:51,770 I C og i språk som Java og C + +, må du være 741 00:29:51,770 --> 00:29:53,020 super eksplisitt. 742 00:29:53,020 --> 00:29:55,760 Og hvis du vil ha en variabel kalt i, må du fortelle meg 743 00:29:55,760 --> 00:29:57,360 hva slags variabel det er. 744 00:29:57,360 --> 00:29:59,360 Så vi er nødt til å fikse dette på følgende måte. 745 00:29:59,360 --> 00:30:05,510 Jeg kommer til å gå opp her og skriv int i, og derfor 746 00:30:05,510 --> 00:30:07,860 Jeg har erklært en variabel kalt jeg. 747 00:30:07,860 --> 00:30:09,180 Nå har jeg hoppet over ett trinn. 748 00:30:09,180 --> 00:30:11,340 Jeg har tydeligvis ikke initialisert det, men la oss se om det på 749 00:30:11,340 --> 00:30:13,650 Minst merker Clang stoppe klagende. 750 00:30:13,650 --> 00:30:15,770 Så la meg remake dette programmet. 751 00:30:15,770 --> 00:30:16,770 >> Greit, nå er det bare klager 752 00:30:16,770 --> 00:30:17,870 for en annen grunn. 753 00:30:17,870 --> 00:30:21,130 "Variable 'i' initialisert når det brukes her." All right, så 754 00:30:21,130 --> 00:30:22,340 det er ganske eksplisitt. 755 00:30:22,340 --> 00:30:25,510 Initialisert betyr bare å sette den lik en verdi. 756 00:30:25,510 --> 00:30:30,820 Og vi har ikke gjort det, så la meg prøve lik 0. 757 00:30:30,820 --> 00:30:35,030 La oss nå prøve dette igjen og kjøre Clang. 758 00:30:35,030 --> 00:30:36,140 Utarbeidet denne gangen. 759 00:30:36,140 --> 00:30:37,210 Og jeg er i ferd med å kjøre den. 760 00:30:37,210 --> 00:30:43,120 Men store gamle uendelig løkke, fordi jeg har gjort det 761 00:30:43,120 --> 00:30:45,530 initialisering, har jeg gjort tilstanden, men jeg har aldri gjort 762 00:30:45,530 --> 00:30:47,030 noen form for forstørrelse. 763 00:30:47,030 --> 00:30:48,780 Så hvordan kan jeg gjøre forstørrelse? 764 00:30:48,780 --> 00:30:51,170 Vel, på en stund loop, føles det som om jeg kommer til å ha 765 00:30:51,170 --> 00:30:54,180 å gjøre det inne i loopen, fordi mye som den første 766 00:30:54,180 --> 00:30:56,570 ukens eksempler på å gjøre looping konstruksjoner, som med 767 00:30:56,570 --> 00:30:59,040 sokker og med selv-telling, måtte vi gjøre 768 00:30:59,040 --> 00:31:01,550 noe helt til slutt, som går tilbake til neste linje. 769 00:31:01,550 --> 00:31:05,040 Hva hvis jeg går videre og gjøre dette i + + her? 770 00:31:05,040 --> 00:31:06,030 La oss ikke engang kompilere dette. 771 00:31:06,030 --> 00:31:06,890 Ta meg allerede. 772 00:31:06,890 --> 00:31:09,704 Hva er galt her? 773 00:31:09,704 --> 00:31:10,690 PUBLIKUM: [uhørlig]. 774 00:31:10,690 --> 00:31:11,770 >> DAVID J. MALAN: Så det er definitivt ikke int. 775 00:31:11,770 --> 00:31:13,080 Det er jeg. 776 00:31:13,080 --> 00:31:15,110 Og klammeparentes, som før, 777 00:31:15,110 --> 00:31:16,800 innrykk er ikke nok. 778 00:31:16,800 --> 00:31:18,410 Så nå har jeg konstruere denne har. 779 00:31:18,410 --> 00:31:21,780 Så mens jeg er mindre enn 10, skriver du ut en stjerne, 780 00:31:21,780 --> 00:31:23,220 deretter øke i. 781 00:31:23,220 --> 00:31:25,680 Og måten en stund løkke fungerer er at så snart du treffer 782 00:31:25,680 --> 00:31:29,630 bunnen av sløyfen, som i dette tilfellet ser ut linje 10, 783 00:31:29,630 --> 00:31:32,880 det kommer til å gå tilbake til linje 6, noe som medførte at 784 00:31:32,880 --> 00:31:34,400 tilstand vil bli sjekket igjen. 785 00:31:34,400 --> 00:31:37,500 Og hvis jeg fortsatt er mindre enn 10, vil vi gjøre linjene 8 og 786 00:31:37,500 --> 00:31:41,250 deretter 9, så får vi treffe 10, og gå tilbake til 6, igjen og 787 00:31:41,250 --> 00:31:45,580 igjen og igjen og igjen, så lenge jeg er mindre enn 10 år. 788 00:31:45,580 --> 00:31:47,860 Så la oss re-run gjøre her. 789 00:31:47,860 --> 00:31:48,940 >> Ok, vi har samlet greit. 790 00:31:48,940 --> 00:31:50,300 La meg re-run loop. 791 00:31:50,300 --> 00:31:52,620 Og nå ser det ut faktisk å jobbe. 792 00:31:52,620 --> 00:31:55,100 Så plusser og minuser her? 793 00:31:55,100 --> 00:31:58,910 Vel, så langt det er faktisk ikke en hel av PLO - 794 00:31:58,910 --> 00:31:59,420 så søt. 795 00:31:59,420 --> 00:32:01,870 Greit, det var en - ah, det var en ulykke. 796 00:32:01,870 --> 00:32:05,200 All right, så la oss gå tilbake til for loop. 797 00:32:05,200 --> 00:32:07,530 Så for løkker er fint fordi de er super eksplisitt. 798 00:32:07,530 --> 00:32:09,720 Og selv om de er litt clunky å skrive, er det 799 00:32:09,720 --> 00:32:11,500 svært kraftig og det tillater deg å gjøre 800 00:32:11,500 --> 00:32:12,980 flere ting på en gang. 801 00:32:12,980 --> 00:32:16,240 Mens løkker ikke synes å ha en stor mengde verdi bare 802 00:32:16,240 --> 00:32:18,500 ennå, fordi det føles som vi bare nødt til å gjøre mer arbeid. 803 00:32:18,500 --> 00:32:20,670 Vi må sette initialiseringen opp her, 804 00:32:20,670 --> 00:32:23,480 oppdatere her nede, og vi må huske å gjøre alt dette. 805 00:32:23,480 --> 00:32:26,260 Så vi får se i tid at mens sløyfer faktisk låne 806 00:32:26,260 --> 00:32:29,380 seg til bare forskjellige sammenhenger, ulike data 807 00:32:29,380 --> 00:32:33,900 strukturer som lister og hash tabeller, ting vi vil komme til 808 00:32:33,900 --> 00:32:34,970 mid-semester. 809 00:32:34,970 --> 00:32:37,900 Men for nå, vet at det er denne tredje typen er kjent som en do- 810 00:32:37,900 --> 00:32:38,480 mens loop. 811 00:32:38,480 --> 00:32:39,540 Og vi har sett dette kort. 812 00:32:39,540 --> 00:32:41,830 Og dette kan være super nyttig med pset en. 813 00:32:41,830 --> 00:32:45,570 Hver gang du ønsker å gjøre noe, og deretter sjekke om 814 00:32:45,570 --> 00:32:48,940 brukeren samarbeidet, og hvis de ikke gjør det igjen, en gjør- 815 00:32:48,940 --> 00:32:51,460 mens loop gir seg til den slags logikk. 816 00:32:51,460 --> 00:32:55,640 Fordi som bestiller fra topp til bunn her antyder, 817 00:32:55,640 --> 00:32:57,750 gjør betyr bokstavelig talt gjøre dette. 818 00:32:57,750 --> 00:32:59,830 Og gjøre dette igjen og igjen, hva kan det være? 819 00:32:59,830 --> 00:33:03,000 Kanskje det betyr ringer GetInt eller GetString og deretter 820 00:33:03,000 --> 00:33:05,830 sjekke verdien av GetInt eller GetString og deretter roping 821 00:33:05,830 --> 00:33:08,260 på brukeren hvis de ikke har samarbeidet ved å spørre dem 822 00:33:08,260 --> 00:33:10,100 igjen og igjen og igjen. 823 00:33:10,100 --> 00:33:11,730 Hvor du ønsker å gjøre noe en gang, 824 00:33:11,730 --> 00:33:13,210 så sjekk noen tilstand. 825 00:33:13,210 --> 00:33:14,110 >> Så la oss prøve dette. 826 00:33:14,110 --> 00:33:17,130 La meg faktisk endre dette nå til en do-while-løkke. 827 00:33:17,130 --> 00:33:18,830 Og jeg kommer til å gå videre og gjøre følgende. 828 00:33:18,830 --> 00:33:21,830 Så gjør du følgende. 829 00:33:21,830 --> 00:33:26,870 La oss gjøre int i = GetInt (); men la oss først fortelle brukeren 830 00:33:26,870 --> 00:33:27,410 hva de skal gjøre. 831 00:33:27,410 --> 00:33:29,050 Så en litt annerledes denne gangen. 832 00:33:29,050 --> 00:33:31,270 "Gi meg en int". 833 00:33:31,270 --> 00:33:32,910 Så jeg skal bruke printf for det. 834 00:33:32,910 --> 00:33:35,740 Og nå skal jeg gå ned her, og jeg kommer til å gjøre dette 835 00:33:35,740 --> 00:33:41,520 mens jeg er, la oss si, større enn - 836 00:33:41,520 --> 00:33:47,540 la oss se, er jeg, la oss si, mindre enn 0, eller jeg er 837 00:33:47,540 --> 00:33:48,730 større enn 10. 838 00:33:48,730 --> 00:33:51,810 Med andre ord, jeg vil ha et nummer fra 1 til 9, bare 839 00:33:51,810 --> 00:33:52,720 vilkårlig. 840 00:33:52,720 --> 00:33:55,290 Så jeg bruker en kombinert boolsk uttrykk her 841 00:33:55,290 --> 00:33:59,930 sørge for at i er mindre enn 0 eller større enn 10, hvor 842 00:33:59,930 --> 00:34:02,530 tilfelle jeg vil gjøre denne sløyfen her igjen. 843 00:34:02,530 --> 00:34:04,400 Så igjen, gjør dette - 844 00:34:04,400 --> 00:34:08,480 mens i er mindre enn 0 eller jeg er større enn 10. 845 00:34:08,480 --> 00:34:11,440 >> Så la oss nå gå videre og gjøre dette når vi har gjort det. 846 00:34:11,440 --> 00:34:13,270 La oss bare gjøre en rask sunn fornuft sjekk. 847 00:34:13,270 --> 00:34:18,929 printf ("Takk, jeg% d", i). 848 00:34:18,929 --> 00:34:21,350 Så dette enkle programmet ber brukeren om en int, 849 00:34:21,350 --> 00:34:24,000 gjør at det er innen noen utvalg, 1 til 9 inkluderende, 850 00:34:24,000 --> 00:34:26,280 og takk så brukeren ved å minne dem hva de bare 851 00:34:26,280 --> 00:34:27,940 skrevet i, bare som en liten mental helse sjekk. 852 00:34:27,940 --> 00:34:30,659 Men la oss se om dette fungerer som det skal. 853 00:34:30,659 --> 00:34:34,533 La meg gå hodet ned her og kjøre gjør loop. 854 00:34:34,533 --> 00:34:35,350 Hmm. 855 00:34:35,350 --> 00:34:38,600 "Bruk av svart identifikator 'i'". Det er rart. 856 00:34:38,600 --> 00:34:41,509 Jeg trodde vi løst det. 857 00:34:45,489 --> 00:34:47,560 Samme symptom, men en annen kode. 858 00:34:47,560 --> 00:34:47,899 Ja? 859 00:34:47,899 --> 00:34:50,191 PUBLIKUM: [uhørlig] inne i to, må vi 860 00:34:50,191 --> 00:34:52,639 [Uhørlig]. 861 00:34:52,639 --> 00:34:53,260 >> DAVID J. MALAN: Nettopp. 862 00:34:53,260 --> 00:34:55,989 Så dette fører oss faktisk til et emne som kalles omfang. 863 00:34:55,989 --> 00:34:59,350 Det viser seg at C, igjen, det virkelig tar deg bokstavelig talt. 864 00:34:59,350 --> 00:35:02,970 Og hvis du gjør noe som dette hvor du erklærer en int 865 00:35:02,970 --> 00:35:06,120 og deretter tilordne den en viss verdi, men du gjør det inne i en 866 00:35:06,120 --> 00:35:09,840 par klammeparentes, hva C ikke er det forutsetter at du 867 00:35:09,840 --> 00:35:14,800 bare vil de 32 bits kjent som jeg å eksistere innenfor 868 00:35:14,800 --> 00:35:18,200 sammenheng med de klammeparentes, innenfor rammen av linjer 869 00:35:18,200 --> 00:35:22,420 6 til 9. Så jeg er erklært, og det er tildelt et 870 00:35:22,420 --> 00:35:26,530 verdi i linje 8, men så snart du kommer utenfor av 871 00:35:26,530 --> 00:35:30,270 linje 9 nedenfor den krøllete seler, i er ikke lenger i 872 00:35:30,270 --> 00:35:31,910 omfang, så å si. 873 00:35:31,910 --> 00:35:35,030 S-C-O-P-E. Det er ikke lenger i riktig sammenheng. 874 00:35:35,030 --> 00:35:37,940 Så nå er det ingen jeg, så det er som om vi hadde ikke engang 875 00:35:37,940 --> 00:35:38,770 erklærte i det hele tatt. 876 00:35:38,770 --> 00:35:41,520 >> Så hva er en løsning så etter noe som dette, hvis 877 00:35:41,520 --> 00:35:44,300 Årsaken er at jeg er erklært innenfor krøllparenteser, som 878 00:35:44,300 --> 00:35:45,120 er tilsynelatende dårlig? 879 00:35:45,120 --> 00:35:45,410 Her? 880 00:35:45,410 --> 00:35:46,820 PUBLIKUM: [uhørlig]. 881 00:35:46,820 --> 00:35:47,150 DAVID J. MALAN: Yeah. 882 00:35:47,150 --> 00:35:48,710 Så vi kan initialisere den utenfor. 883 00:35:48,710 --> 00:35:53,530 Så la meg gå foran og slette erklæringen deler der 884 00:35:53,530 --> 00:35:55,820 Jeg angir type, og la meg gjøre det her oppe. 885 00:35:55,820 --> 00:36:00,220 Så i linje 5 står det nå "Gi meg en int." Kall det jeg. 886 00:36:00,220 --> 00:36:03,400 Merke til i linje 9, jeg ønsker ikke å gjøre dette, fordi jeg 887 00:36:03,400 --> 00:36:04,830 allerede har de 32 biter. 888 00:36:04,830 --> 00:36:06,140 Jeg ønsker ikke å be datamaskinen om en 889 00:36:06,140 --> 00:36:07,630 forskjellige 32 bits. 890 00:36:07,630 --> 00:36:09,850 Jeg ønsker å bruke de samme 32 bits. 891 00:36:09,850 --> 00:36:13,190 Og nå fordi jeg er deklarert i linje 5, er det fortsatt legit 892 00:36:13,190 --> 00:36:16,550 å bruke den på linje 11 og linje 12. 893 00:36:16,550 --> 00:36:19,310 >> Så la meg prøve å rekompilere dette og se 894 00:36:19,310 --> 00:36:20,490 hvis Clang slutter roping. 895 00:36:20,490 --> 00:36:22,380 lage loop. 896 00:36:22,380 --> 00:36:25,470 Så nå er det "implisitt erklæring av funksjon 897 00:36:25,470 --> 00:36:29,880 'GetInt er ugyldig i C99. "Hva er det? 898 00:36:29,880 --> 00:36:30,400 Ja? 899 00:36:30,400 --> 00:36:32,330 PUBLIKUM: [uhørlig]. 900 00:36:32,330 --> 00:36:32,690 DAVID J. MALAN: Yeah. 901 00:36:32,690 --> 00:36:35,520 Så nå som jeg faktisk bruker GetInt, dette er ikke noe 902 00:36:35,520 --> 00:36:38,190 som kommer bare med C. Dette kommer fra CS50. 903 00:36:38,190 --> 00:36:39,890 Så vi trenger dette her. 904 00:36:39,890 --> 00:36:41,450 Og la meg gå tilbake til ledeteksten ned 905 00:36:41,450 --> 00:36:43,500 her og kjøre gjør. 906 00:36:43,500 --> 00:36:44,160 Ok, til slutt. 907 00:36:44,160 --> 00:36:46,270 Nå har vi løst det, og den andre feil. 908 00:36:46,270 --> 00:36:48,930 La meg nå kjøre loop og se hva som skjer. 909 00:36:48,930 --> 00:36:51,740 "Gi meg en int." Jeg skal gi den 11. 910 00:36:51,740 --> 00:36:53,100 Jeg skal gi det -1. 911 00:36:53,100 --> 00:36:54,470 Jeg skal gi det foo. 912 00:36:54,470 --> 00:36:56,080 Jeg skal gi den 5. 913 00:36:56,080 --> 00:36:57,450 Og nå virker det faktisk. 914 00:36:57,450 --> 00:36:59,410 Men spør endret for en grunn her. 915 00:36:59,410 --> 00:37:02,800 Hvorfor gjorde det si prøve en av disse tider, men gi meg en 916 00:37:02,800 --> 00:37:03,920 int de andre tre ganger? 917 00:37:03,920 --> 00:37:05,500 Hvorfor er at atferd annerledes? 918 00:37:05,500 --> 00:37:06,980 PUBLIKUM: Ga det en streng. 919 00:37:06,980 --> 00:37:07,830 DAVID J. MALAN: Sorry? 920 00:37:07,830 --> 00:37:08,570 PUBLIKUM: Du ga det en streng. 921 00:37:08,570 --> 00:37:08,990 DAVID J. MALAN: Yeah. 922 00:37:08,990 --> 00:37:11,450 Så vi ga det en streng i denne tredje forsøk, 923 00:37:11,450 --> 00:37:12,490 når jeg skrev foo. 924 00:37:12,490 --> 00:37:13,200 Foo er en streng. 925 00:37:13,200 --> 00:37:14,340 Det er åpenbart ikke en int. 926 00:37:14,340 --> 00:37:17,500 Og måten CS50 har implementert GetInt er at vi 927 00:37:17,500 --> 00:37:20,330 kontroller ikke om noe er mindre enn 0 eller større enn 10 928 00:37:20,330 --> 00:37:22,260 for deg, fordi hvordan vet vi på forhånd hva slags 929 00:37:22,260 --> 00:37:23,130 int du vil? 930 00:37:23,130 --> 00:37:25,880 Men vi kan minimalt sjekke for deg, gjorde brukeren minst 931 00:37:25,880 --> 00:37:26,730 skriver et heltall? 932 00:37:26,730 --> 00:37:30,500 Og hvis de ikke gjorde det, kjefte vi på brukeren ved å skrive "retry" på 933 00:37:30,500 --> 00:37:31,440 skjermen. 934 00:37:31,440 --> 00:37:34,210 >> Så nå har vi et program som looping. Okay. 935 00:37:34,210 --> 00:37:37,070 Nå, er hvilken av disse slags bedre konstruksjonen? 936 00:37:37,070 --> 00:37:39,060 Så dette er hvor ting begynner å bli litt rotete, det 937 00:37:39,060 --> 00:37:42,360 faktum at du må huske å erklære en variabel opp her 938 00:37:42,360 --> 00:37:44,630 Hvis du ønsker å bruke det inne i noen 939 00:37:44,630 --> 00:37:46,460 klammeparentes og utenfor. 940 00:37:46,460 --> 00:37:48,490 Men selv om dette ser litt kryptisk i starten 941 00:37:48,490 --> 00:37:50,750 blikk, bare en gang, husker den enkle logikk. 942 00:37:50,750 --> 00:37:54,630 For å kunne bruke noe i C, enten det er en funksjon eller 943 00:37:54,630 --> 00:37:57,680 det er en variabel, må du ta det hvis det er en funksjon 944 00:37:57,680 --> 00:37:59,770 i noen bibliotek, eller du trenger å erklære det. 945 00:37:59,770 --> 00:38:02,405 Men nå må du være ekstra oppmerksom på det faktum at 946 00:38:02,405 --> 00:38:04,940 du erklære den i riktig omfang. 947 00:38:04,940 --> 00:38:08,150 Du er ikke å ta for hardt inne i parenteser. 948 00:38:08,150 --> 00:38:09,410 >> Så la meg faktisk rulle tilbake. 949 00:38:09,410 --> 00:38:12,660 Hvis vi går tilbake til våre for eksempel fra tidligere, og jeg går 950 00:38:12,660 --> 00:38:19,245 tilbake til for int, int i = 0; i <10; i + +, og jeg 951 00:38:19,245 --> 00:38:26,370 gjøre printf stjerner, som dette, og lukk deretter paren, og nå 952 00:38:26,370 --> 00:38:30,410 printf jeg er nå - 953 00:38:30,410 --> 00:38:33,500 etter samme logikk, hva vil skje når jeg prøver å 954 00:38:33,500 --> 00:38:35,500 kompilere dette programmet? 955 00:38:35,500 --> 00:38:36,790 PUBLIKUM: Ugyldig identifikator. 956 00:38:36,790 --> 00:38:38,560 DAVID J. MALAN: Så det er en annen ugyldig identifikator, 957 00:38:38,560 --> 00:38:39,470 svart identifikator. 958 00:38:39,470 --> 00:38:41,810 Nå er grunnen litt annerledes. 959 00:38:41,810 --> 00:38:44,370 Det er åpenbart ingen klammeparentes her, men det samme 960 00:38:44,370 --> 00:38:46,790 idé, gjelder den samme historien om omfang. 961 00:38:46,790 --> 00:38:50,340 Hvis du har erklært en variabel som jeg inne i en 962 00:38:50,340 --> 00:38:53,960 for loop, selv om du ikke har eksplisitt skrevet krøllete 963 00:38:53,960 --> 00:38:56,980 tannregulering, tenk på dem mentalt fortsatt være der, hvor 964 00:38:56,980 --> 00:39:00,310 tilfelle jeg er bare gyldig innsiden av for-løkke. 965 00:39:00,310 --> 00:39:03,080 Det er ikke gyldig når du kommer til neste linje, som i 966 00:39:03,080 --> 00:39:05,090 dette tilfellet er nå 10. 967 00:39:05,090 --> 00:39:09,060 Så bare noen få spørsmål om omfang og lignende. 968 00:39:09,060 --> 00:39:12,620 Greit, noen spørsmål? 969 00:39:12,620 --> 00:39:15,310 >> Greit, så dette er en slags trivielle lite program, 970 00:39:15,310 --> 00:39:17,450 utskrift bare små stjerner. 971 00:39:17,450 --> 00:39:20,400 Men la oss se om du husker denne sangen her. 972 00:39:20,400 --> 00:39:22,530 Dette er en utrolig irriterende sang ungene ville synge på 973 00:39:22,530 --> 00:39:23,550 skolebussen o.l.. 974 00:39:23,550 --> 00:39:25,990 Men hva er fint om det er at det har denne syklisitet, 975 00:39:25,990 --> 00:39:27,910 der det er "99 flasker øl på veggen, 976 00:39:27,910 --> 00:39:28,520 99 flasker øl. 977 00:39:28,520 --> 00:39:31,030 Ta en ned, passerer det rundt, 98 flasker øl på 978 00:39:31,030 --> 00:39:34,330 veggen. "Og så sang gjentar 97, deretter 96, så 979 00:39:34,330 --> 00:39:38,040 95, så 94, hele veien ned til 0 hvis du faktisk fikk det 980 00:39:38,040 --> 00:39:38,920 langt på bussen. 981 00:39:38,920 --> 00:39:41,960 Så dette er en fin program for å sortere av redskapet, fordi min 982 00:39:41,960 --> 00:39:43,650 Gud, om du bare kunne implementere dette med noen 983 00:39:43,650 --> 00:39:46,660 linjer med kode, kan du spytte ut hele teksten til denne 984 00:39:46,660 --> 00:39:48,240 sang ganske raskt. 985 00:39:48,240 --> 00:39:50,420 Men underveis, kan vi begynne å nå erte hverandre litt 986 00:39:50,420 --> 00:39:52,460 av disse grunnleggende looping konstruerer og nå også 987 00:39:52,460 --> 00:39:55,830 innføre funksjoner som vi skriver selv, returnere verdier 988 00:39:55,830 --> 00:39:57,020 at vi passerer rundt. 989 00:39:57,020 --> 00:39:58,910 Men først, hva vi gå videre og ta våre fem minutters 990 00:39:58,910 --> 00:39:59,320 bryte her? 991 00:39:59,320 --> 00:40:01,480 Og når vi kommer tilbake, vil vi synge denne sangen. 992 00:40:05,680 --> 00:40:08,760 >> Greit, så vi er tilbake. 993 00:40:08,760 --> 00:40:11,850 Og når jeg sier vi vil nå synge denne sangen, mener jeg 994 00:40:11,850 --> 00:40:13,250 programmatisk, ikke verbalt. 995 00:40:13,250 --> 00:40:19,370 Så her har vi beer1.c, som er en implementering av denne 996 00:40:19,370 --> 00:40:20,580 bestemt sang. 997 00:40:20,580 --> 00:40:23,110 Og bare for å være klar, for de som ikke kjenner det 998 00:40:23,110 --> 00:40:24,460 denne tingen ser ut, la meg gå videre 999 00:40:24,460 --> 00:40:27,070 og gjøre beer1, Enter. 1000 00:40:27,070 --> 00:40:30,400 Nå la meg kjøre beer1, og hva vi vil se - hvor mange flasker 1001 00:40:30,400 --> 00:40:31,140 av øl blir det? 1002 00:40:31,140 --> 00:40:33,240 Jeg skriver i 99, som sangen sier. 1003 00:40:33,240 --> 00:40:34,040 Enter. 1004 00:40:34,040 --> 00:40:35,650 Og nå hvis vi bla gjennom - 1005 00:40:35,650 --> 00:40:38,280 oops - hvis vi blar gjennom alt dette, vil vi se at 1006 00:40:38,280 --> 00:40:41,350 dette gjorde virkelig synge hele sangen. 1007 00:40:44,050 --> 00:40:44,540 Vent litt. 1008 00:40:44,540 --> 00:40:46,240 Min rullefeltet er litt messed up. 1009 00:40:46,240 --> 00:40:47,940 La oss bruke større vindu. 1010 00:40:47,940 --> 00:40:53,500 Så beer1, 99, der vi går. 1011 00:40:53,500 --> 00:40:56,420 Så her har vi hele sangen, sunget mye raskere ved 1012 00:40:56,420 --> 00:40:58,450 datamaskin enn det kunne ha vært av oss. 1013 00:40:58,450 --> 00:41:00,340 Så legger merke til, men den sykliske natur her. 1014 00:41:00,340 --> 00:41:03,380 Det sier 99, så 99, så "ta en ned, passerer det 1015 00:41:03,380 --> 00:41:04,740 rundt ", så 98. 1016 00:41:04,740 --> 00:41:06,640 Og nå er det gjentar igjen og igjen. 1017 00:41:06,640 --> 00:41:08,840 >> Så dette er egentlig en perfekt mulighet for en slags 1018 00:41:08,840 --> 00:41:10,400 looping konstruere. 1019 00:41:10,400 --> 00:41:12,950 Legg merke til at jeg er litt kutte et hjørne her. 1020 00:41:12,950 --> 00:41:15,960 Legg merke til at jeg sier "98 flasker øl på veggen, 1021 00:41:15,960 --> 00:41:19,010 97 flasker øl på veggen, "og det var bare så 1022 00:41:19,010 --> 00:41:21,640 at når vi kommer til en flasker med øl, jeg har ikke 1023 00:41:21,640 --> 00:41:23,300 å bekymre seg om engelsk grammatikk. 1024 00:41:23,300 --> 00:41:25,790 Men vi kan også fikse dette med en liten bit av en hvis 1025 00:41:25,790 --> 00:41:26,910 tilstand, kanskje. 1026 00:41:26,910 --> 00:41:30,110 Hvis dette tallet er entall, gå videre og si "flaske", 1027 00:41:30,110 --> 00:41:31,840 ellers hvis det er flertall, sier "flasker". 1028 00:41:31,840 --> 00:41:34,150 Men for nå, jeg er helt kutte det hjørnet. 1029 00:41:34,150 --> 00:41:35,520 Så la oss se hva vi har her. 1030 00:41:35,520 --> 00:41:37,150 Så vi har fått noen kommentarer på toppen. 1031 00:41:37,150 --> 00:41:39,450 Jeg er inkludert disse to bibliotekene, som 1032 00:41:39,450 --> 00:41:41,140 Vi har ofte vært. 1033 00:41:41,140 --> 00:41:43,610 Og nå la meg bla ned til det første 1034 00:41:43,610 --> 00:41:44,990 faktiske linjer med kode. 1035 00:41:44,990 --> 00:41:47,020 Linje 17 starter main. 1036 00:41:47,020 --> 00:41:50,610 Linje 21 og 20 har hvor mange flasker øl vil det være? 1037 00:41:50,610 --> 00:41:52,060 Og så kaller jeg GetInt. 1038 00:41:52,060 --> 00:41:53,800 Og nå har jeg litt av en mental helse sjekk. 1039 00:41:53,800 --> 00:41:57,030 >> Så dette er en konvensjon som vi vil nå begynne å vedta å 1040 00:41:57,030 --> 00:41:59,620 strengere sjekk brukerens input. 1041 00:41:59,620 --> 00:42:01,710 Noen ganger du bare ikke ønsker å be dem igjen 1042 00:42:01,710 --> 00:42:02,630 og igjen og igjen. 1043 00:42:02,630 --> 00:42:05,620 Hvis brukeren skruer opp og ikke samarbeider, fint. 1044 00:42:05,620 --> 00:42:07,430 Avslutt og bare ikke håndtere dem. 1045 00:42:07,430 --> 00:42:08,990 Og så det er det jeg gjør her. 1046 00:42:08,990 --> 00:42:12,520 Hvis n er mindre enn 1, jeg bare kommer til å kjefte på brukeren, 1047 00:42:12,520 --> 00:42:14,330 "Beklager, gjør at ingen mening." Og så skal jeg 1048 00:42:14,330 --> 00:42:16,650 vilkårlig tilbake 1. 1049 00:42:16,650 --> 00:42:18,550 Så igjen, dette er bare en konvensjon for å bli vant til. 1050 00:42:18,550 --> 00:42:19,850 For nå, ta det på tro. 1051 00:42:19,850 --> 00:42:22,700 Men inntil nå, har vi alltid vært tilbake 0, fordi 1052 00:42:22,700 --> 00:42:25,204 vi har sagt retur 0 betegner hva? 1053 00:42:25,204 --> 00:42:26,000 PUBLIKUM: Suksess. 1054 00:42:26,000 --> 00:42:27,320 DAVID J. MALAN: Suksess, det er alt. 1055 00:42:27,320 --> 00:42:29,740 Så nå som vi endelig begynner å tenke på 1056 00:42:29,740 --> 00:42:31,330 ikke-suksesser - 1057 00:42:31,330 --> 00:42:33,760 med andre ord, hjørne tilfeller, feiltilstander - 1058 00:42:33,760 --> 00:42:37,520 nå har jeg en uendelig forsyning, eller i det minste fire milliarder 1059 00:42:37,520 --> 00:42:39,790 mulige ting som kan gå galt i mine programmer. 1060 00:42:39,790 --> 00:42:42,300 Og jeg kan begynne å tildele dem individuelle tall. 1061 00:42:42,300 --> 00:42:44,340 Nå, vanligvis er det nok å bare gå tilbake 1062 00:42:44,340 --> 00:42:45,730 noe annet enn 0. 1063 00:42:45,730 --> 00:42:48,040 Så vi kommer til å bare gå tilbake 1 for nå. 1064 00:42:48,040 --> 00:42:51,440 Men grunnen for retur 1 er at så snart du kommer 1065 00:42:51,440 --> 00:42:55,110 1, gjett hva som skjer med resten av programmet? 1066 00:42:55,110 --> 00:42:55,720 Den stopper. 1067 00:42:55,720 --> 00:42:56,560 Det var det. 1068 00:42:56,560 --> 00:42:59,150 Så det faktum at jeg er tilbake 1 er effektivt 1069 00:42:59,150 --> 00:43:02,950 kortslutning dette programmet gjennomføringen slik at 1070 00:43:02,950 --> 00:43:06,780 ingenting under linje 27 vil fortsette å utføre. 1071 00:43:06,780 --> 00:43:09,210 Så snart som viktigste avkastning, er at det. 1072 00:43:09,210 --> 00:43:13,160 >> All right, så hvis brukeren ikke samarbeider, og vi kommer linje 30 1073 00:43:13,160 --> 00:43:15,680 fordi de skrev i en legitim nummer, her er min 1074 00:43:15,680 --> 00:43:16,990 gjennomføring av denne sangen. 1075 00:43:16,990 --> 00:43:19,050 Så jeg først skrive ut et linjeskift, bare for 1076 00:43:19,050 --> 00:43:19,880 estetikk. 1077 00:43:19,880 --> 00:43:21,500 Jeg har nå en for-løkke. 1078 00:43:21,500 --> 00:43:22,930 Og legg merke til at jeg gjør ting på en litt 1079 00:43:22,930 --> 00:43:23,880 av en annen retning. 1080 00:43:23,880 --> 00:43:26,210 Jeg trenger ikke å gjøre mindre enn, jeg trenger ikke å gjøre + +. 1081 00:43:26,210 --> 00:43:30,660 Jeg kan i stedet si initialisere en variabel i, sette den lik 1082 00:43:30,660 --> 00:43:35,080 n, antall brukeren skrev inn, så gjør følgende, så 1083 00:43:35,080 --> 00:43:39,590 lenge jeg er større enn 0, så jeg - 1084 00:43:39,590 --> 00:43:42,070 når du har fullført en gjentakelse av denne sløyfen. 1085 00:43:42,070 --> 00:43:44,310 Så vi kan telle ned med en for løkke i tillegg. 1086 00:43:44,310 --> 00:43:47,520 Nå er dette ganske mye uke en ting nå, med printf. 1087 00:43:47,520 --> 00:43:51,770 Så skrive "% d flasker øl på veggen." Print "% d 1088 00:43:51,770 --> 00:43:54,990 flasker øl. "" Ta en ned, passerer det rundt. "Skriv ut 1089 00:43:54,990 --> 00:43:58,880 "% D flasker øl på veggen." Så det er fortsatt% d, men 1090 00:43:58,880 --> 00:44:02,770 merke til at argumentet til printf er i endring. 1091 00:44:02,770 --> 00:44:05,840 Etter komma, jeg har jeg, fordi jeg ønsker å si 99. 1092 00:44:05,840 --> 00:44:08,590 Etter dette komma, jeg har jeg, fordi jeg ønsker å si 99. 1093 00:44:08,590 --> 00:44:14,030 Etter dette komma, jeg har i - 1, fordi jeg ønsker å si 98 i 1094 00:44:14,030 --> 00:44:16,260 denne første iterasjon, og så videre. 1095 00:44:16,260 --> 00:44:18,520 Og nå her nede, jeg bare har noen dum liten bemerkning. 1096 00:44:18,520 --> 00:44:22,270 Og deretter linje 42, returnerer jeg 0 av konvensjonen, som betyr at 1097 00:44:22,270 --> 00:44:23,650 alt er i orden. 1098 00:44:23,650 --> 00:44:24,490 >> Så hva om jeg goofed? 1099 00:44:24,490 --> 00:44:26,350 Hva kan en vanlig feil her være? 1100 00:44:26,350 --> 00:44:29,200 Vel, hva om jeg tilfeldigvis sa vel, jeg ønsker å telle 1101 00:44:29,200 --> 00:44:31,640 ned til 0, vil jeg 0 flasker øl på veggen? 1102 00:44:31,640 --> 00:44:34,620 Så jeg sier, er jeg større enn eller lik 0.. 1103 00:44:34,620 --> 00:44:38,920 Hva kommer til å være symptom som jeg nå se om jeg rekompilere 1104 00:44:38,920 --> 00:44:41,173 beer1 og kjøre den? 1105 00:44:41,173 --> 00:44:42,120 PUBLIKUM: Negativ. 1106 00:44:42,120 --> 00:44:43,590 DAVID J. MALAN: Ja, det skal gå i minus. 1107 00:44:43,590 --> 00:44:45,950 Dette er en off-by-one feil, en utrolig 1108 00:44:45,950 --> 00:44:47,270 vanlig feil å gjøre. 1109 00:44:47,270 --> 00:44:48,960 La oss faktisk gå tilbake til terminalen vinduet og gjøre det 1110 00:44:48,960 --> 00:44:50,620 her, så vi kan se flere på en gang. 1111 00:44:50,620 --> 00:44:53,280 Enter, 99 flasker øl. 1112 00:44:53,280 --> 00:44:56,580 Lukk, men vi gikk aldri så litt for langt. 1113 00:44:56,580 --> 00:45:00,500 Vi sang sangen for langt ned, slik at vi nå treffer 1114 00:45:00,500 --> 00:45:01,510 negativt tall. 1115 00:45:01,510 --> 00:45:03,680 Så det virker ikke helt. 1116 00:45:03,680 --> 00:45:06,450 >> Greit, så vi kan lett fikse det ved å gå tilbake til 1117 00:45:06,450 --> 00:45:07,650 slik det en gang var. 1118 00:45:07,650 --> 00:45:10,360 Men hva er noen muligheter nå for 1119 00:45:10,360 --> 00:45:11,190 forbedring? 1120 00:45:11,190 --> 00:45:17,200 Vel, la meg åpne beer2.c og bla ned her og ta en 1121 00:45:17,200 --> 00:45:19,310 se på denne versjonen. 1122 00:45:19,310 --> 00:45:21,370 Hva er det første som hopper ut på deg som annerledes 1123 00:45:21,370 --> 00:45:23,715 i denne versjonen her? 1124 00:45:23,715 --> 00:45:24,190 PUBLIKUM: [uhørlig]. 1125 00:45:24,190 --> 00:45:26,510 DAVID J. MALAN: Ja, så ingen mer jeg, fordi det skjedde til 1126 00:45:26,510 --> 00:45:29,350 meg vet du hva, jeg ber brukeren for n, og da er jeg 1127 00:45:29,350 --> 00:45:33,580 sette i lik n, og da er jeg endre i, men jeg er aldri 1128 00:45:33,580 --> 00:45:34,590 berøre n igjen. 1129 00:45:34,590 --> 00:45:37,390 Så hva pokker var poenget med du tildele en annen 32 1130 00:45:37,390 --> 00:45:45,210 bits jeg ringte akkurat slik at jeg kan ha en annen variabel? 1131 00:45:45,210 --> 00:45:47,960 Så i dette tilfellet, jeg liksom innsett at unødvendig 1132 00:45:47,960 --> 00:45:49,190 designelement. 1133 00:45:49,190 --> 00:45:52,730 Og jeg nå kommer til å si mens n er større enn 0, går 1134 00:45:52,730 --> 00:45:56,180 videre og skrive den samme sangen, passerer en n til printf som 1135 00:45:56,180 --> 00:46:00,210 andre argumentet, og n - 1 som det andre argumentet her nede. 1136 00:46:00,210 --> 00:46:02,930 Og deretter på hver iterasjon av denne sløyfen, gå videre og bare 1137 00:46:02,930 --> 00:46:05,080 minske n selv. 1138 00:46:05,080 --> 00:46:06,960 Nå funksjonelt, dette programmet 1139 00:46:06,960 --> 00:46:08,010 kommer til å være identiske. 1140 00:46:08,010 --> 00:46:10,730 Hvis jeg skriver i 99, begynner n på 99. 1141 00:46:10,730 --> 00:46:12,890 Jeg decrement, decrement, decrement, minking. 1142 00:46:12,890 --> 00:46:15,875 Jeg kommer til å komme helt ned til "En flaske øl på 1143 00:46:15,875 --> 00:46:16,740 veggen, en flaske øl. 1144 00:46:16,740 --> 00:46:18,020 Ta en ned, passerer det rundt. 1145 00:46:18,020 --> 00:46:21,480 0 flasker øl på veggen. "The end, fordi jeg gjorde 1146 00:46:21,480 --> 00:46:23,200 få tilstanden riktig. 1147 00:46:23,200 --> 00:46:24,280 Det er større enn 0. 1148 00:46:24,280 --> 00:46:26,220 Jeg gjorde ikke gjøre denne feilen. 1149 00:46:26,220 --> 00:46:28,470 >> Så noe som er bedre, versjon en eller versjon to? 1150 00:46:31,380 --> 00:46:33,480 Så hørte jeg en haug med knurr for to. 1151 00:46:33,480 --> 00:46:34,730 Hvorfor to? 1152 00:46:37,210 --> 00:46:38,225 Hva er det? 1153 00:46:38,225 --> 00:46:39,215 PUBLIKUM: [uhørlig]. 1154 00:46:39,215 --> 00:46:40,070 DAVID J. MALAN: Oh, okay. 1155 00:46:40,070 --> 00:46:42,870 Så det vil ikke gå under 0, men husk, i versjon en, 1156 00:46:42,870 --> 00:46:45,870 opprinnelige riktige versjonen ikke gå under 0 heller. 1157 00:46:45,870 --> 00:46:48,340 Så husk at dette er den riktige versjonen. 1158 00:46:48,340 --> 00:46:51,630 Så la oss i det minste sammenligne de to riktige versjoner. 1159 00:46:51,630 --> 00:46:53,300 Hva er et argument i favør av versjon 1160 00:46:53,300 --> 00:46:55,146 to er, mmm, bedre? 1161 00:46:55,146 --> 00:46:55,642 Ja? 1162 00:46:55,642 --> 00:46:57,630 PUBLIKUM: Det tar mindre plass. 1163 00:46:57,630 --> 00:46:59,530 DAVID J. MALAN: Ok, så den bruker mindre plass, ikke sant? 1164 00:46:59,530 --> 00:47:02,900 Mens versjon en brukt 32 bits for n, og deretter en annen 1165 00:47:02,900 --> 00:47:07,680 32 biter for jeg. 1166 00:47:07,680 --> 00:47:10,060 Versjon to bare bruker 32 bits for n, slik at 1167 00:47:10,060 --> 00:47:11,700 synes å være et pluss. 1168 00:47:11,700 --> 00:47:12,950 Andre tanker? 1169 00:47:18,070 --> 00:47:21,520 Ønsker noen å argumentere for en? 1170 00:47:21,520 --> 00:47:22,070 Ja? 1171 00:47:22,070 --> 00:47:25,240 PUBLIKUM: Du må bruke ekstra linje med kode for n -. 1172 00:47:25,240 --> 00:47:26,090 >> DAVID J. MALAN: Ok, sikkert. 1173 00:47:26,090 --> 00:47:26,960 Så det er rettferdig. 1174 00:47:26,960 --> 00:47:29,040 Så dette bare, minst for meg - 1175 00:47:29,040 --> 00:47:31,940 Jeg mener, dette faktisk føles litt Messier, det faktum at 1176 00:47:31,940 --> 00:47:35,120 Jeg kan ikke liksom kapsle alt av logikk mitt i én 1177 00:47:35,120 --> 00:47:38,030 vakre linjer, for loop, som for loop kan. 1178 00:47:38,030 --> 00:47:40,240 Her, jeg slags har å tråkle på dette n - 1179 00:47:40,240 --> 00:47:41,120 ved slutten av sløyfen, fordi 1180 00:47:41,120 --> 00:47:42,550 det er logisk nødvendig. 1181 00:47:42,550 --> 00:47:45,190 Men den slags gnir meg på feil måte, bare fordi det 1182 00:47:45,190 --> 00:47:48,260 synes atskilt fra logikk opp her, selv om, 1183 00:47:48,260 --> 00:47:49,430 igjen, det er nødvendig. 1184 00:47:49,430 --> 00:47:50,990 Andre tanker? 1185 00:47:50,990 --> 00:47:51,490 Ja? 1186 00:47:51,490 --> 00:47:52,740 PUBLIKUM: [uhørlig]. 1187 00:47:57,990 --> 00:47:58,350 >> DAVID J. MALAN: Yeah. 1188 00:47:58,350 --> 00:48:00,730 Så hva om du i stedet, på slutten av sangen, ønsket å 1189 00:48:00,730 --> 00:48:02,950 skrive ut igjen navnet på sangen? 1190 00:48:02,950 --> 00:48:05,660 Like "Takk for å spille 99 flasker øl", eller noe 1191 00:48:05,660 --> 00:48:06,690 dum sånn? 1192 00:48:06,690 --> 00:48:09,750 Men poenget er, ville du tilgang til den opprinnelige verdien. 1193 00:48:09,750 --> 00:48:13,180 Det faktum at du har mutert eller forandret n på hver 1194 00:48:13,180 --> 00:48:16,330 iterasjon, og derfor har ødelagt sin opprinnelige verdi 1195 00:48:16,330 --> 00:48:18,650 Det betyr at du bare ikke kan gjøre det på slutten. 1196 00:48:18,650 --> 00:48:20,660 Nå, uten tvil, vi åpenbart ikke ønsker å gjøre 1197 00:48:20,660 --> 00:48:21,450 at i dette programmet. 1198 00:48:21,450 --> 00:48:22,350 Så hvem bryr seg? 1199 00:48:22,350 --> 00:48:23,630 Men det er en veldig gyldig punkt. 1200 00:48:23,630 --> 00:48:25,520 Og for å være ærlig, det er egentlig ingen 1201 00:48:25,520 --> 00:48:26,630 rett svar her. 1202 00:48:26,630 --> 00:48:28,740 De er begge like riktig. 1203 00:48:28,740 --> 00:48:30,210 Jeg kunne bli overbevist uansett. 1204 00:48:30,210 --> 00:48:33,310 Jeg vil si at, generelt, er det et godt prinsipp hvis du 1205 00:48:33,310 --> 00:48:36,030 spurte brukeren for noen verdi, og du lagret i en variabel 1206 00:48:36,030 --> 00:48:38,730 som n, bare liksom på prinsippet, er det sannsynligvis bra 1207 00:48:38,730 --> 00:48:40,160 å holde det rundt. 1208 00:48:40,160 --> 00:48:43,400 Og alle data du ønsker å mutere igjen og igjen, bare 1209 00:48:43,400 --> 00:48:46,030 gi deg selv en kopi av denne variabelen, bare slik at du 1210 00:48:46,030 --> 00:48:47,830 har tilgang til den opprinnelige. 1211 00:48:47,830 --> 00:48:51,040 Du tilbringer 32 flere biter, men realiteten er dette 1212 00:48:51,040 --> 00:48:53,490 datamaskinen har lyst, to gigabyte RAM i disse dager, 1213 00:48:53,490 --> 00:48:55,310 og vi ordkløveri over 32 bits? 1214 00:48:55,310 --> 00:48:56,320 Egentlig ikke en så stor avtale. 1215 00:48:56,320 --> 00:48:58,550 Og selv om denne enheten her, med en halv gig eller en 1216 00:48:58,550 --> 00:49:01,700 gigabyte RAM, 32 bits kontra 64 bits, 1217 00:49:01,700 --> 00:49:02,920 ikke en så stor avtale. 1218 00:49:02,920 --> 00:49:05,890 Gjerne i dag, kommer det til å være måte overveldet av størrelsen 1219 00:49:05,890 --> 00:49:08,400 av selve programmet, som er tenkt å være flere hundre 1220 00:49:08,400 --> 00:49:10,890 kilobyte, om ikke noen få megabyte, i disse dager. 1221 00:49:10,890 --> 00:49:13,550 >> Så rimelige bekymringer, ingen rett svar. 1222 00:49:13,550 --> 00:49:15,490 Men minst de er tanker som skal begynne å 1223 00:49:15,490 --> 00:49:16,790 gå gjennom hodet ditt? 1224 00:49:16,790 --> 00:49:19,600 Fordi i pset 0, selv om vi egentlig bare forventet 1225 00:49:19,600 --> 00:49:22,340 korrekthet, eller i det minste fraskrive diverse bugs som 1226 00:49:22,340 --> 00:49:25,440 du kan ha oppstått, når vi beveger oss fremover, er design 1227 00:49:25,440 --> 00:49:27,910 kommer til å være en annen viktig aspekt, både for å skrive kode 1228 00:49:27,910 --> 00:49:29,770 og også vår evaluering kode. 1229 00:49:29,770 --> 00:49:32,310 Og så i det minste gi trodde ting som dette. 1230 00:49:32,310 --> 00:49:35,590 Og bare fordi noe fungerer ikke betyr det er bra, 1231 00:49:35,590 --> 00:49:37,130 betyr ikke at det er godt utformet. 1232 00:49:37,130 --> 00:49:38,820 Og det er en av de tingene de pedagogiske stipendiater og 1233 00:49:38,820 --> 00:49:41,990 oppgavesett vil hjelpe oss erte del over tid. 1234 00:49:41,990 --> 00:49:45,020 >> Vel, hva om, la oss si, denne versjonen her? 1235 00:49:45,020 --> 00:49:49,090 La meg gjøre noe litt sexy her et øyeblikk. 1236 00:49:49,090 --> 00:49:50,740 Først la meg bli kvitt dette. 1237 00:49:50,740 --> 00:49:54,120 Og nå la oss fikse dette grammatisk problemet. 1238 00:49:54,120 --> 00:49:58,780 Så i denne versjonen, vil jeg fikse grammatikk, slik at 1239 00:49:58,780 --> 00:50:02,460 snarere enn bare si parentes s, som "flaske" 1240 00:50:02,460 --> 00:50:03,360 eller "flasker" - 1241 00:50:03,360 --> 00:50:04,900 Jeg ønsker ikke å kutte det hjørnet - 1242 00:50:04,900 --> 00:50:08,350 Jeg ønsker også å dynamisk skrive ut ordet "flasker" 1243 00:50:08,350 --> 00:50:12,820 eller "flaske", og dermed bruker disse% s plassholdere i dag. 1244 00:50:12,820 --> 00:50:16,550 Så jeg trenger til betinget sjekke hva som er verdien av jeg. 1245 00:50:16,550 --> 00:50:19,590 Og hvis det er en, jeg ønsker å si "flaske", og hvis det er noe 1246 00:50:19,590 --> 00:50:23,115 annet, vil jeg si "flasker". Så la oss prøve å gjøre dette. 1247 00:50:23,115 --> 00:50:31,340 Så hvis jeg == 1, så la meg gå videre og erklærer - 1248 00:50:31,340 --> 00:50:34,080 Jeg trenger en streng, så la meg gjøre streng s1, fordi det er den 1249 00:50:34,080 --> 00:50:36,070 første strengen jeg bryr meg om akkurat nå. 1250 00:50:36,070 --> 00:50:40,980 Jeg kommer til å si "flaske". Og så, la oss se, string 1251 00:50:40,980 --> 00:50:43,110 s2 - og jeg vil forklare hvor jeg skal i et øyeblikk - 1252 00:50:43,110 --> 00:50:47,650 "Flasker." Så husker at i denne sangen, må vi være i stand til 1253 00:50:47,650 --> 00:50:50,580 å skrive ut ting, to forskjellige ord potensielt. 1254 00:50:50,580 --> 00:50:53,590 Så hvis vi ser tilbake hit, merker at når vi kommer til 1255 00:50:53,590 --> 00:50:56,440 dette eksempelet her, "to flasker med øl på veggen, 1256 00:50:56,440 --> 00:50:59,490 to flasker med øl, ta en ned, passerer det rundt ", jeg vil 1257 00:50:59,490 --> 00:51:02,380 denne fjerde linje til nå si "en flaske øl på 1258 00:51:02,380 --> 00:51:04,900 veggen ". Så jeg trenger å bestemme seg, ønsker jeg å si" flasker "eller 1259 00:51:04,900 --> 00:51:07,780 "Flaske"? Så jeg kommer til å vilkårlig si, all right, 1260 00:51:07,780 --> 00:51:10,530 Jeg kommer til å nå erklære en variabel kalt s1, string 1261 00:51:10,530 --> 00:51:13,830 en, som kommer til å få plugget inn her og også her, 1262 00:51:13,830 --> 00:51:16,070 fordi disse ordene er alltid identiske, nettopp på grunn av 1263 00:51:16,070 --> 00:51:17,290 natur sangen. 1264 00:51:17,290 --> 00:51:20,100 Og jeg kommer til å ringe s2 hvilket ord jeg vil 1265 00:51:20,100 --> 00:51:21,560 slutt vises her nede. 1266 00:51:21,560 --> 00:51:25,530 Nå, bokstavelig talt, 99 ganger på 100, kommer det til å bli 1267 00:51:25,530 --> 00:51:28,820 samme i begge disse tilfeller, fordi 3 er flertall, er 2 1268 00:51:28,820 --> 00:51:30,200 flertall, er 4 flertall. 1269 00:51:30,200 --> 00:51:34,640 Men i dette hjørnet tilfellet, hvor vi kommer til 2 og 1, eller 1270 00:51:34,640 --> 00:51:37,250 selv 1 og deretter 0, jeg trenger denne logikken. 1271 00:51:37,250 --> 00:51:41,020 Så jeg må bruke litt tid på min kode å få det rett. 1272 00:51:41,020 --> 00:51:47,530 Så hvis jeg gjør dette, hvis jeg == 1, deretter satt s1 lik "flaske" 1273 00:51:47,530 --> 00:51:52,010 og S2 lik "flasker", fordi dette vil være for en 1274 00:51:52,010 --> 00:51:56,340 flaske, og dette vil være for 0 flasker. 1275 00:51:56,340 --> 00:51:58,250 Og dette her, hva dette representerer? 1276 00:51:58,250 --> 00:51:59,780 Bare for å være klar. 1277 00:51:59,780 --> 00:52:00,620 Dette er bare en kommentar. 1278 00:52:00,620 --> 00:52:03,730 Så det faktum at du kan ha én linje kommentarer betyr at du 1279 00:52:03,730 --> 00:52:06,110 kan kommentere koden som dette, men en annen vanlig 1280 00:52:06,110 --> 00:52:09,050 paradigme, er også at hvis du har en super-kort setning som 1281 00:52:09,050 --> 00:52:11,410 du ønsker å sette deg selv og det er bare mer lesbar å sette 1282 00:52:11,410 --> 00:52:13,270 det helt på slutten av linjen med kode, kan du 1283 00:52:13,270 --> 00:52:15,230 absolutt gjøre noe som dette. 1284 00:52:15,230 --> 00:52:20,150 >> Så nå hva hvis jeg gjør dette? Annet hvis jeg ikke er lik en. 1285 00:52:20,150 --> 00:52:21,620 Så bang lik - 1286 00:52:21,620 --> 00:52:23,150 utropstegn er kjent som "bang". 1287 00:52:23,150 --> 00:52:25,080 Så bang 1 =. 1288 00:52:25,080 --> 00:52:28,530 Så hvis jeg ikke er lik 1, hva gjør jeg i stedet ønsker å gjøre? 1289 00:52:28,530 --> 00:52:31,700 Vel, det første ordet jeg ønsker å være hva? 1290 00:52:34,620 --> 00:52:40,030 Så streng en skal være "flasker" for flertall flasker, 1291 00:52:40,030 --> 00:52:42,440 og dette vil være flertall "flasker" også, for nå. 1292 00:52:42,440 --> 00:52:43,800 Og vi får se om dette faktisk får oss til å 1293 00:52:43,800 --> 00:52:44,870 der vi ønsker å gå. 1294 00:52:44,870 --> 00:52:47,680 Så nå hvis jeg ruller nedover her, merker at jeg plugge i 1295 00:52:47,680 --> 00:52:50,170 ikke bare jeg, men S1. 1296 00:52:50,170 --> 00:52:51,860 Jeg plugge inn i og s1. 1297 00:52:51,860 --> 00:52:54,440 Og deretter ned her, er jeg minus 1, som er det samme som 1298 00:52:54,440 --> 00:52:55,920 før, men s2. 1299 00:52:55,920 --> 00:52:58,730 Med andre ord, jeg vil ha det engelske ordet for å endre basert 1300 00:52:58,730 --> 00:52:59,930 på denne logikken. 1301 00:52:59,930 --> 00:53:03,310 Nå er det allerede noen problemer i denne koden. 1302 00:53:03,310 --> 00:53:08,460 Hva som er ødelagt allerede ute av porten her? 1303 00:53:08,460 --> 00:53:10,796 Ja? 1304 00:53:10,796 --> 00:53:13,210 PUBLIKUM: [uhørlig]. 1305 00:53:13,210 --> 00:53:13,800 >> DAVID J. MALAN: Nettopp. 1306 00:53:13,800 --> 00:53:16,030 Så jeg har allerede brutt leksjonen av omfanget. 1307 00:53:16,030 --> 00:53:19,610 Så jeg har erklært s1 og s2, men jeg har gjort det på innsiden av 1308 00:53:19,610 --> 00:53:22,980 klammeparentes, noe som betyr ja, vil denne koden opparbeide 1309 00:53:22,980 --> 00:53:27,430 til linje 42, men så snart jeg traff linjen 43, gjett hva ingen 1310 00:53:27,430 --> 00:53:28,900 lenger eksisterer? 1311 00:53:28,900 --> 00:53:32,600 Vel, gjett hva som er ikke lenger i omfang - verken s1 eller s2. 1312 00:53:32,600 --> 00:53:33,780 Så vi må fikse dette. 1313 00:53:33,780 --> 00:53:36,180 Så la meg slette de erklæringer. 1314 00:53:36,180 --> 00:53:39,320 Og jeg vil forlate variabelnavn og slette denne her 1315 00:53:39,320 --> 00:53:40,120 og slette denne her. 1316 00:53:40,120 --> 00:53:43,557 Og i hvilke linjer bør jeg virkelig erklære disse tingene? 1317 00:53:43,557 --> 00:53:44,960 PUBLIKUM: [uhørlig]. 1318 00:53:44,960 --> 00:53:45,410 DAVID J. MALAN: Ja, så sannsynligvis 1319 00:53:45,410 --> 00:53:46,850 rett opp her, 33-ish. 1320 00:53:46,850 --> 00:53:50,670 Så streng s1 og deretter streng s2. 1321 00:53:50,670 --> 00:53:51,950 Og det viser seg, kan jeg gjøre dette. 1322 00:53:51,950 --> 00:53:54,260 Hvis du erklære to variabler av samme type, 1323 00:53:54,260 --> 00:53:57,420 du kan faktisk bare bruke et komma og gjøre det i C. Alle 1324 00:53:57,420 --> 00:53:58,970 rett, så nå har jeg to variabler - 1325 00:53:58,970 --> 00:53:59,860 S1 og S2. 1326 00:53:59,860 --> 00:54:02,000 Jeg tildele dem verdier i disse 1327 00:54:02,000 --> 00:54:04,210 forholdene her, eller her. 1328 00:54:04,210 --> 00:54:06,690 Og så jeg bruker dem ned nedenfor. 1329 00:54:06,690 --> 00:54:10,960 Hvor godt er dette nå kommer til å fungere? 1330 00:54:10,960 --> 00:54:12,740 >> Vel, det er fortsatt litt buggy, men la oss i det minste se 1331 00:54:12,740 --> 00:54:13,730 hvor langt vi har fått. 1332 00:54:13,730 --> 00:54:16,500 Så la meg gå videre og gjøre beer3. 1333 00:54:16,500 --> 00:54:17,695 Er dette beer3? 1334 00:54:17,695 --> 00:54:19,410 Jepp, dette er beer3. 1335 00:54:19,410 --> 00:54:21,510 Og nå la meg gå videre og kjøre beer3. 1336 00:54:21,510 --> 00:54:23,820 399 99. 1337 00:54:23,820 --> 00:54:25,840 Vi kan nok hoppe fleste av dem. 1338 00:54:25,840 --> 00:54:29,100 Og her nede, se på det. 1339 00:54:29,100 --> 00:54:31,110 "En flaske øl på veggen, en flaske øl, ta 1340 00:54:31,110 --> 00:54:34,306 en ned, passerer det rundt, 0 flasker øl på veggen. " 1341 00:54:34,306 --> 00:54:37,570 Men jeg tegner oppmerksomheten til bare halvparten av løsningen. 1342 00:54:37,570 --> 00:54:39,620 Slags skrudd opp her. 1343 00:54:39,620 --> 00:54:43,030 Så det ser ut til at hjørnet tilfeller oppstår når jeg er lik hva 1344 00:54:43,030 --> 00:54:44,030 to verdier? 1345 00:54:44,030 --> 00:54:45,020 PUBLIKUM: 2, 1. 1346 00:54:45,020 --> 00:54:46,190 DAVID J. MALAN: 2 og 1. 1347 00:54:46,190 --> 00:54:48,180 Det er ikke en og ikke en. 1348 00:54:48,180 --> 00:54:51,890 Det er egentlig bare disse to siste strofene av denne sangen. 1349 00:54:51,890 --> 00:54:53,890 Så hva gjør jeg i stedet ønsker å gjøre? 1350 00:54:53,890 --> 00:54:58,890 Så jeg synes å ha fanget tilfelle der hvis jeg er == 1, 1351 00:54:58,890 --> 00:55:02,240 så det første ordet er "flaske", men det andre ordet 1352 00:55:02,240 --> 00:55:07,230 er "flasker". Men her vil jeg endre dette til å være == 2. 1353 00:55:07,230 --> 00:55:08,570 Og hvis dette er tilfelle, hva jeg ønsker 1354 00:55:08,570 --> 00:55:09,620 første ordet for å være? 1355 00:55:09,620 --> 00:55:10,430 PUBLIKUM: "flasker". 1356 00:55:10,430 --> 00:55:12,890 DAVID J. MALAN: "flasker", så for to flasker. 1357 00:55:12,890 --> 00:55:14,690 Og så dette ordet her bør være - 1358 00:55:14,690 --> 00:55:15,340 PUBLIKUM: "Bottle". 1359 00:55:15,340 --> 00:55:17,316 DAVID J. MALAN: "Bottle", entall. 1360 00:55:20,430 --> 00:55:25,160 >> Greit, la oss zoome ut, gå tilbake over her, kjører make, 1361 00:55:25,160 --> 00:55:28,590 re-run beer3, type 99 igjen. 1362 00:55:28,590 --> 00:55:30,710 Ok, "Segmentation fault (core dumpet)." 1363 00:55:30,710 --> 00:55:32,780 Hva har jeg gjort galt? 1364 00:55:36,050 --> 00:55:38,722 PUBLIKUM: Du trenger ikke ha en verdi [hørbar]. 1365 00:55:38,722 --> 00:55:40,480 DAVID J. MALAN: Ah, utmerket poeng. 1366 00:55:40,480 --> 00:55:43,310 All right, så hva er galt her? 1367 00:55:43,310 --> 00:55:45,450 Så segmentering feil, og vi faktisk kommer til å se 1368 00:55:45,450 --> 00:55:49,020 dette ganske mange ganger i fremtiden, med vilje. 1369 00:55:49,020 --> 00:55:51,030 Men for nå, hva dette egentlig betyr? 1370 00:55:51,030 --> 00:55:53,620 En segmentering feil nesten alltid betyr at du har 1371 00:55:53,620 --> 00:55:56,760 en eller annen måte forsøkt å få tilgang til minnet, RAM i datamaskinen, 1372 00:55:56,760 --> 00:56:00,600 at du ikke eier, at du ikke har faktisk spurt 1373 00:56:00,600 --> 00:56:02,050 operativsystem for. 1374 00:56:02,050 --> 00:56:04,440 Så i dette tilfellet, legge merke til hva jeg har gjort, som er 1375 00:56:04,440 --> 00:56:05,870 feil i min logikk. 1376 00:56:05,870 --> 00:56:09,500 Jeg har tildelt s1 og s2 en verdi hvis jeg er lik en. 1377 00:56:09,500 --> 00:56:11,590 Jeg har også gjort at hvis jeg er lik 2. 1378 00:56:11,590 --> 00:56:13,710 Men jeg har ikke gjort det i det uendelige rekke andre 1379 00:56:13,710 --> 00:56:14,690 muligheter - 1380 00:56:14,690 --> 00:56:17,940 spesielt 3 eller 4 eller prikk, prikk, prikk, 99. 1381 00:56:17,940 --> 00:56:20,100 Så en løsning på dette kan bare være la oss 1382 00:56:20,100 --> 00:56:22,190 har en annen tilstand. 1383 00:56:22,190 --> 00:56:26,780 Og la meg gå inn her og si s1 er lik - 1384 00:56:26,780 --> 00:56:28,180 hva bør det være her? 1385 00:56:28,180 --> 00:56:28,750 PUBLIKUM: [uhørlig]. 1386 00:56:28,750 --> 00:56:30,460 >> DAVID J. MALAN: "flasker", fordi i den felles sak, 1387 00:56:30,460 --> 00:56:32,020 det er bare det samme. 1388 00:56:32,020 --> 00:56:35,580 Så lik sitat, unquote, "flasker." Så for flertall 1389 00:56:35,580 --> 00:56:41,010 flasker, og deretter opp her, for flertall flasker. 1390 00:56:41,010 --> 00:56:44,580 Ok, så nå la meg gå tilbake til mitt terminalvindu, 1391 00:56:44,580 --> 00:56:47,200 rekompilere, kjører den. 1392 00:56:47,200 --> 00:56:48,440 99. 1393 00:56:48,440 --> 00:56:49,150 Puh. 1394 00:56:49,150 --> 00:56:50,610 Og la oss gjøre en rask sunn fornuft sjekk. 1395 00:56:50,610 --> 00:56:52,400 Teknisk, ville vi ønsker å lese alle disse for å sikre at 1396 00:56:52,400 --> 00:56:53,370 de er riktige, men la oss se på 1397 00:56:53,370 --> 00:56:54,640 minst de kjente gjerningsmennene. 1398 00:56:54,640 --> 00:56:57,370 3 flasker, 2 flasker, 2 flasker, en 1399 00:56:57,370 --> 00:57:00,380 flaske, en flaske, 0 flasker. 1400 00:57:00,380 --> 00:57:03,080 Vi synes å ha minst fikset det for nå. 1401 00:57:03,080 --> 00:57:06,010 Men fangsten her er at hva en Gud forferdelig rot dette er 1402 00:57:06,010 --> 00:57:07,470 bare for å løse en dum 1403 00:57:07,470 --> 00:57:09,540 ett tegn grammatisk detalj. 1404 00:57:09,540 --> 00:57:11,150 Så det er litt av en grunn til at jeg kuttet dette hjørnet 1405 00:57:11,150 --> 00:57:14,090 tidligere, fordi det er bare helt irriterende å 1406 00:57:14,090 --> 00:57:15,020 skrive så mye kode. 1407 00:57:15,020 --> 00:57:17,530 Men det viser seg at det er litt mer elegant måter 1408 00:57:17,530 --> 00:57:20,110 uttrykke akkurat det samme. 1409 00:57:20,110 --> 00:57:22,040 Og vi kan gjøre dette på følgende måte. 1410 00:57:22,040 --> 00:57:23,890 >> La meg forlate dette på skjermen et øyeblikk og 1411 00:57:23,890 --> 00:57:27,320 introdusere noe kjent som en trefoldig operatøren. 1412 00:57:27,320 --> 00:57:29,600 Dette er en slags one-liner som er bare ment å gjøre våre 1413 00:57:29,600 --> 00:57:31,880 lever litt mer sexy, som lovet. 1414 00:57:31,880 --> 00:57:33,130 Og jeg kommer til å gjøre dette som følger. 1415 00:57:33,130 --> 00:57:35,810 Gi meg en streng kalt s1, og la meg 1416 00:57:35,810 --> 00:57:37,200 tilordne det som følger. 1417 00:57:37,200 --> 00:57:39,900 (I == 1)? 1418 00:57:39,900 --> 00:57:47,820 "Flaske", ellers "flasker". String s2 får (i == 2)? 1419 00:57:47,820 --> 00:57:52,670 "Flaske", ellers "flasker". 1420 00:57:52,670 --> 00:57:57,050 Så hva er da forskjellen her? 1421 00:57:57,050 --> 00:57:59,370 Disse to linjer med kode, hevder jeg kan 1422 00:57:59,370 --> 00:58:02,200 erstatte hele denne rotet. 1423 00:58:02,200 --> 00:58:04,280 Så jeg kaller det et rot, bare fordi den slags gnir meg 1424 00:58:04,280 --> 00:58:05,940 feil måte at det er så mange linjer med kode. 1425 00:58:05,940 --> 00:58:06,650 Ikke galt. 1426 00:58:06,650 --> 00:58:07,700 Det er ikke dårlig design. 1427 00:58:07,700 --> 00:58:10,140 Liker, er dette helt riktig og helt greit. 1428 00:58:10,140 --> 00:58:12,970 Men koding blir kjedelig hvis du har til å uttrykke deg selv slik 1429 00:58:12,970 --> 00:58:15,530 faen spesifikt igjen og igjen og igjen med en enkel 1430 00:58:15,530 --> 00:58:16,620 scenario som dette. 1431 00:58:16,620 --> 00:58:19,470 Så C har noen snarveier, som dette. 1432 00:58:19,470 --> 00:58:24,270 Så dette egentlig sier erklære en streng kalt S1 og 1433 00:58:24,270 --> 00:58:32,610 tilordne det enten denne verdien eller denne verdien hvis jeg er == - 1434 00:58:32,610 --> 00:58:35,290 Beklager, jeg burde si dette mer tydelig. 1435 00:58:35,290 --> 00:58:41,680 Deklarerer en variabel s1, tilordne den denne verdien hvis dette er sant. 1436 00:58:41,680 --> 00:58:44,280 Ellers, tilordne den denne verdien. 1437 00:58:44,280 --> 00:58:47,220 Så med andre ord, dette er en slags en-linje måte 1438 00:58:47,220 --> 00:58:51,490 si hvis annet, men gjør et oppdrag underveis. 1439 00:58:51,490 --> 00:58:55,540 Så hvis jeg er en, og deretter gå videre og kaller dette "flaske". Og 1440 00:58:55,540 --> 00:58:59,830 så dette annet, kaller det "flasker". Imens s2, den 1441 00:58:59,830 --> 00:59:04,060 andre ord at vi trenger å definere, hvis jeg er lik 2, vil vi 1442 00:59:04,060 --> 00:59:08,350 satt s2 til "flaske". Ellers, sett den til "flasker". Og hva 1443 00:59:08,350 --> 00:59:11,460 Dette betyr nå er at jeg kan gå gjennom dette og slette alle 1444 00:59:11,460 --> 00:59:12,860 disse linjene med kode. 1445 00:59:12,860 --> 00:59:17,220 Og når jeg sier, noe latterlig, at dette er nå 1446 00:59:17,220 --> 00:59:20,060 sexier, er det mer sexy i den slags stilistisk forstand. 1447 00:59:20,060 --> 00:59:22,660 At funksjonelt, er denne koden faktisk kommer til 1448 00:59:22,660 --> 00:59:24,610 gjøre akkurat det samme. 1449 00:59:24,610 --> 00:59:26,890 Og selv om det kan se litt kryptisk i starten 1450 00:59:26,890 --> 00:59:29,250 øyekast, fordi vi ikke har sett denne konstruksjonen før, ville jeg 1451 00:59:29,250 --> 00:59:31,850 hevder at det er slutt kommer til å være så mye mer 1452 00:59:31,850 --> 00:59:34,820 lesbar og så mye lettere for vi mennesker å sortere av 1453 00:59:34,820 --> 00:59:36,830 forstå, fordi nå kan du bare lese 1454 00:59:36,830 --> 00:59:38,830 kode alle på en linje. 1455 00:59:38,830 --> 00:59:41,550 Det er fortsatt lik i ånden til en hvis, hvor dette er 1456 00:59:41,550 --> 00:59:44,920 tilstand og så er dette hva som er inni den hvis og dette 1457 00:59:44,920 --> 00:59:46,480 er hva som er inni annet. 1458 00:59:46,480 --> 00:59:49,450 Men vi kan gjøre dette bare mye mer elegant. 1459 00:59:49,450 --> 00:59:52,650 >> Og hvis jeg nå gå tilbake til terminalen min, etter å ha slettet alle 1460 00:59:52,650 --> 00:59:55,530 av disse linjene og erstattet dem med bare de to, 1461 00:59:55,530 --> 01:00:00,150 rekompilere, re-run flasker øl med 99, merker at min 1462 01:00:00,150 --> 01:00:03,350 grammatikk er faktisk fortsatt er riktig. 1463 01:00:03,350 --> 01:00:06,160 Så igjen, noe å starte. 1464 01:00:06,160 --> 01:00:08,840 2 flasker øl, en flaske øl. 1465 01:00:08,840 --> 01:00:09,370 Ser rett. 1466 01:00:09,370 --> 01:00:10,100 Ja. 1467 01:00:10,100 --> 01:00:13,900 Så det har vi en mye mer konsis løsning. 1468 01:00:13,900 --> 01:00:16,020 Så dette også, som du blir mer komfortabel med C, ikke 1469 01:00:16,020 --> 01:00:18,630 nødvendigvis med første pset eller selv andre, men 1470 01:00:18,630 --> 01:00:21,170 innse at disse konstruerer kan tillate oss å gjøre ting noensinne 1471 01:00:21,170 --> 01:00:22,810 mer elegant. 1472 01:00:22,810 --> 01:00:25,200 Nå la oss gjøre en annen ting her. 1473 01:00:25,200 --> 01:00:31,460 La meg gå videre og åpne opp return1.c. 1474 01:00:31,460 --> 01:00:34,340 Nå la oss starte å løse et annet problem på en måte som 1475 01:00:34,340 --> 01:00:37,140 tillater oss å skrive mer sofistikert kode. 1476 01:00:37,140 --> 01:00:39,960 >> Så her er en enkel liten program som har som formål i livet 1477 01:00:39,960 --> 01:00:41,870 er å øke verdiene. 1478 01:00:41,870 --> 01:00:43,100 Og faktisk, la oss ta et skritt tilbake. 1479 01:00:43,100 --> 01:00:44,400 La meg gjøre dette manuelt. 1480 01:00:44,400 --> 01:00:52,200 La meg gjøre inkludere og int main (void). 1481 01:00:52,200 --> 01:00:53,450 Og la meg kalle denne increment.c. 1482 01:00:57,150 --> 01:00:58,570 Og hva ønsker jeg å gjøre? 1483 01:00:58,570 --> 01:01:02,240 Jeg kommer til å gå foran og si noe sånt som - 1484 01:01:02,240 --> 01:01:04,280 vil vi kalle tallene det samme - 1485 01:01:04,280 --> 01:01:04,980 int x. 1486 01:01:04,980 --> 01:01:13,670 Så int x blir 2; printf x er% d, ny linje, x. 1487 01:01:13,670 --> 01:01:16,780 Så jeg skriver raskt, men slags kjent ting nå. 1488 01:01:16,780 --> 01:01:18,830 Så jeg kommer til å gjøre x + +. 1489 01:01:18,830 --> 01:01:21,710 Så jeg kommer til å skrive det samme setningen igjen. 1490 01:01:21,710 --> 01:01:24,550 Og så skal jeg komme tilbake 0 bare for å avslutte programmet. 1491 01:01:24,550 --> 01:01:25,960 Greit, så dette er et program som 1492 01:01:25,960 --> 01:01:26,960 inkrementer et nummer. 1493 01:01:26,960 --> 01:01:29,830 Det er første kommer til å initialisere noe til 2, og da er det 1494 01:01:29,830 --> 01:01:33,470 kommer til å øke den og skrive den på nytt. 1495 01:01:33,470 --> 01:01:36,930 >> Så la oss kjøre intervall, utrolig enkelt program. 1496 01:01:36,930 --> 01:01:40,940 Men anta nå at jeg ønsker å kube verdien, så gjør 1497 01:01:40,940 --> 01:01:42,490 noe noe vilkårlig. 1498 01:01:42,490 --> 01:01:45,140 Og jeg faktisk ønsker å gjøre x får kube av det. 1499 01:01:45,140 --> 01:01:47,570 Så jeg kunne bruke det som kalles pow-funksjonen, men jeg har ikke 1500 01:01:47,570 --> 01:01:48,650 virkelig vet hvor det er ennå. 1501 01:01:48,650 --> 01:01:50,580 Så jeg kommer til å gjøre dette på den gammeldagse måten. 1502 01:01:50,580 --> 01:01:54,550 x ganger dette tilsvarer x ganger x ganger x. 1503 01:01:54,550 --> 01:01:56,880 Så jeg cubing verdien, multiplisere det av seg selv igjen 1504 01:01:56,880 --> 01:02:00,440 og igjen og igjen, slik at vi får strømmen 1505 01:02:00,440 --> 01:02:02,050 av 3 i dette tilfellet. 1506 01:02:02,050 --> 01:02:06,000 Så nå tallene jeg skulle skrive ut bør være, som vi skal se 1507 01:02:06,000 --> 01:02:08,450 her - gjør tilvekst, så det er faktisk ikke egentlig øke 1508 01:02:08,450 --> 01:02:10,260 lenger, men vi vil forlate navnet alene - 1509 01:02:10,260 --> 01:02:11,590 2 og deretter 8. 1510 01:02:11,590 --> 01:02:17,670 Nå har vi begynnelsen på en mulighet for videreutvikling 1511 01:02:17,670 --> 01:02:21,570 her, der dette cubing ting av multiplisere et tall 1512 01:02:21,570 --> 01:02:24,680 av seg selv av seg selv av seg selv føles som dette kan bare være 1513 01:02:24,680 --> 01:02:27,920 nyttig å ha som en funksjon, mye som noen bestemte 1514 01:02:27,920 --> 01:02:30,430 år siden - du vet, hva slags nyttig hvis en av oss setter seg 1515 01:02:30,430 --> 01:02:33,120 og skriver printf slik at resten av verden kan bruke det, 1516 01:02:33,120 --> 01:02:36,160 hvorfor ikke vi sitte ned og skrive en funksjon som heter kube 1517 01:02:36,160 --> 01:02:39,250 som gjør dette cubing for oss slik at vi ikke trenger å manuelt 1518 01:02:39,250 --> 01:02:41,500 implementere begrepet cubing verdier her? 1519 01:02:41,500 --> 01:02:44,040 >> Så et enkelt eksempel, men la oss gå videre og bruke dette er som en 1520 01:02:44,040 --> 01:02:46,280 mulighet til å skrive vår egen funksjon. 1521 01:02:46,280 --> 01:02:49,110 Så så langt har vi bare brukt viktigste, og vi har brukt andre 1522 01:02:49,110 --> 01:02:51,780 folks funksjoner, men vi har ikke skrevet vår egen. 1523 01:02:51,780 --> 01:02:52,650 Så her går vi. 1524 01:02:52,650 --> 01:02:56,330 Jeg kommer til å gå videre og skrive en funksjon som heter kube. 1525 01:02:56,330 --> 01:02:58,490 Og jeg kommer til å ha det ta en inngang. 1526 01:02:58,490 --> 01:03:02,070 Så sitt innspill kommer til å være et heltall. 1527 01:03:02,070 --> 01:03:03,570 Og hva er det tenkt å gjøre? 1528 01:03:03,570 --> 01:03:08,500 Det kommer til å erklære int output = inngang ganger inngang 1529 01:03:08,500 --> 01:03:09,880 ganger inngang. 1530 01:03:09,880 --> 01:03:12,190 Og så det kommer til å gå tilbake som utgang. 1531 01:03:12,190 --> 01:03:14,500 Og da må jeg være konkret nå. 1532 01:03:14,500 --> 01:03:16,820 Denne funksjonen kommer til å returnere en int. 1533 01:03:16,820 --> 01:03:19,130 Så her er da hvordan du vil skrive dine egne funksjoner. 1534 01:03:19,130 --> 01:03:20,850 Du først bestemme hva som er navnet på 1535 01:03:20,850 --> 01:03:21,720 funksjon skal være. 1536 01:03:21,720 --> 01:03:23,964 Og generelt, er noe forklarende bra, så jeg vil 1537 01:03:23,964 --> 01:03:25,060 kaller det kuben. 1538 01:03:25,060 --> 01:03:27,180 Da må du spesifisere hva det kommer til å gå tilbake, er det 1539 01:03:27,180 --> 01:03:28,240 sin produksjon kommer til å bli. 1540 01:03:28,240 --> 01:03:29,595 Og vi ikke har så mange alternativer ennå. 1541 01:03:29,595 --> 01:03:32,260 Int, røye, flyte, bool, streng. 1542 01:03:32,260 --> 01:03:34,260 For nå, jeg kommer til å feste med en int, fordi jeg ønsker det 1543 01:03:34,260 --> 01:03:35,880 å returnere et heltall. 1544 01:03:35,880 --> 01:03:38,770 Da må du spesifisere hva dens innganger, om noen, er. 1545 01:03:38,770 --> 01:03:41,570 Og hvis kube tar et argument, tar noe mellom 1546 01:03:41,570 --> 01:03:44,970 parentes, må du gi det argumentet et navn slik at 1547 01:03:44,970 --> 01:03:47,860 du kan kalle det noe som du implementere eller skrive 1548 01:03:47,860 --> 01:03:50,550 denne funksjonen, og du må gi det en type, som i dette 1549 01:03:50,550 --> 01:03:51,810 saken kommer til å bli int. 1550 01:03:51,810 --> 01:03:54,690 Så kort sagt, er kuben en funksjon som tar et heltall 1551 01:03:54,690 --> 01:03:57,560 som input og returnerer et heltall som utgang. 1552 01:03:57,560 --> 01:03:59,240 >> Så hva gjør det med at innspill? 1553 01:03:59,240 --> 01:04:03,710 Vel, i linje 14, erklærer jeg en variabel kalt utgang, og jeg 1554 01:04:03,710 --> 01:04:07,410 tilordne den verdien, inngang ganger inngang ganger inngang. 1555 01:04:07,410 --> 01:04:11,490 Og så jeg kommer tilbake utgang. 1556 01:04:11,490 --> 01:04:14,890 Så hvordan bruker jeg dette da? 1557 01:04:14,890 --> 01:04:19,210 Hva kan jeg endre disse markerte tegn på linje 1558 01:04:19,210 --> 01:04:21,006 7 som skal, tror du? 1559 01:04:21,006 --> 01:04:21,800 PUBLIKUM: [uhørlig]. 1560 01:04:21,800 --> 01:04:25,570 DAVID J. MALAN: Ja, så kube av x. 1561 01:04:25,570 --> 01:04:28,290 Så x er en variabel, som betyr at det har noen verdi. 1562 01:04:28,290 --> 01:04:30,190 Heldigvis er det av type heltall. 1563 01:04:30,190 --> 01:04:34,280 Og fordi x er en int, betyr at jeg kan sende den inn kube. 1564 01:04:34,280 --> 01:04:39,500 Og selv om jeg overstyrer verdien av x med verdien 1565 01:04:39,500 --> 01:04:42,780 av cube x, har som vært tilfellet så langt, hver gang du 1566 01:04:42,780 --> 01:04:46,150 har likhetstegn og en linje med kode, ting på høyre 1567 01:04:46,150 --> 01:04:49,090 blir utført og deretter blir tilordnet 1568 01:04:49,090 --> 01:04:50,150 verdi på venstre. 1569 01:04:50,150 --> 01:04:52,950 Så rekkefølgen av operasjoner er som vi håper. 1570 01:04:52,950 --> 01:04:56,620 Så fungerer dette? 1571 01:04:56,620 --> 01:04:58,410 Vel, la meg gå ned her. 1572 01:04:58,410 --> 01:04:59,970 La meg åpne opp min terminal-vinduet. 1573 01:04:59,970 --> 01:05:03,610 La meg gjør tilvekst, Enter. 1574 01:05:03,610 --> 01:05:07,140 "Implisitt erklæring av funksjon 'kube er ugyldig i 1575 01:05:07,140 --> 01:05:13,700 C99. "Som en side, refererer C99 til språket C som det var 1576 01:05:13,700 --> 01:05:16,790 definert i 1999, som var en oppdatering over versjonen fra 1577 01:05:16,790 --> 01:05:19,360 1989, som er en oppdatering over originalen. 1578 01:05:19,360 --> 01:05:21,740 Så det er alt som betyr. 1579 01:05:21,740 --> 01:05:24,250 >> Så hva betyr det at "implisitt erklæring 1580 01:05:24,250 --> 01:05:26,790 funksjonen 'kube er ugyldig? "Det er rett her. 1581 01:05:26,790 --> 01:05:28,430 Det er akkurat der i linje 12. 1582 01:05:28,430 --> 01:05:30,460 PUBLIKUM: [uhørlig]. 1583 01:05:30,460 --> 01:05:30,730 DAVID J. MALAN: Hva er det? 1584 01:05:30,730 --> 01:05:32,470 PUBLIKUM: Det er ikke før. 1585 01:05:32,470 --> 01:05:33,540 DAVID J. MALAN: Det er ikke før. 1586 01:05:33,540 --> 01:05:34,740 Så dette er tingen. 1587 01:05:34,740 --> 01:05:38,190 C er litt dumt, eller C-kompilatorer er litt dumt. 1588 01:05:38,190 --> 01:05:41,060 De egentlig bare gjøre det du ber dem om å gjøre. 1589 01:05:41,060 --> 01:05:44,770 Og de, i særdeleshet, bare lese koden topp til bunn, 1590 01:05:44,770 --> 01:05:45,620 venstre mot høyre. 1591 01:05:45,620 --> 01:05:49,140 Så hvis kompilatoren, Clang, leser koden, linje 1, det 1592 01:05:49,140 --> 01:05:50,120 finner ut hvordan du gjør dette. 1593 01:05:50,120 --> 01:05:50,940 Oh, her kommer main. 1594 01:05:50,940 --> 01:05:53,000 Ok, la meg gå videre og erklære en variabel x. 1595 01:05:53,000 --> 01:05:54,160 La meg skrive ut noe. 1596 01:05:54,160 --> 01:05:55,890 Linje 7, hva pokker er kube? 1597 01:05:55,890 --> 01:05:58,230 Det er ikke erklært i stdio.h. 1598 01:05:58,230 --> 01:06:00,950 Det kommer ikke med C. Jeg har ingen anelse om hva jeg skal gjøre. 1599 01:06:00,950 --> 01:06:03,960 Og så Clang bails bare og avsluttes med at feilmelding. 1600 01:06:03,960 --> 01:06:05,850 Så vi kan fikse dette i et par måter. 1601 01:06:05,850 --> 01:06:10,530 Vi kan lære Clang hva kube er bare ved å flytte hvor 1602 01:06:10,530 --> 01:06:11,820 Erklæringen er. 1603 01:06:11,820 --> 01:06:14,640 Så jeg klippet ut og limt det oppå viktigste. 1604 01:06:14,640 --> 01:06:17,770 Nå innser at bare fordi viktigste er ikke lenger først, er det 1605 01:06:17,770 --> 01:06:19,150 fortsatt henrettet som standard. 1606 01:06:19,150 --> 01:06:20,060 Viktigste er viktigste. 1607 01:06:20,060 --> 01:06:21,022 Det er standard funksjon navn. 1608 01:06:21,022 --> 01:06:22,930 Det spiller ingen rolle hvor den er i en fil. 1609 01:06:22,930 --> 01:06:26,910 Men minst nå Clang har sett cube før jeg bruker det. 1610 01:06:26,910 --> 01:06:28,500 Så la oss se om Clang er lykkeligere nå. 1611 01:06:28,500 --> 01:06:31,410 Gjør tilvekst, gjorde det kompilere denne gangen. 1612 01:06:31,410 --> 01:06:33,060 >> La meg kjøre tilvekst. 1613 01:06:33,060 --> 01:06:34,810 Og ja, det synes å bli arbeider. 1614 01:06:34,810 --> 01:06:36,810 Nå kan du komme opp med scenarier slutt der 1615 01:06:36,810 --> 01:06:38,650 det er ikke mulig å sette hver funksjon 1616 01:06:38,650 --> 01:06:39,740 over alle andre funksjoner. 1617 01:06:39,740 --> 01:06:42,140 Du vil bli sittende fast i denne uendelig loop i virkeligheten, 1618 01:06:42,140 --> 01:06:43,480 hvor denne fyren ønsker å være her, men dette 1619 01:06:43,480 --> 01:06:44,390 fyren må være der. 1620 01:06:44,390 --> 01:06:45,830 Så det fungerer ikke alltid. 1621 01:06:45,830 --> 01:06:49,020 Så heldigvis har C en mer elegant løsning. 1622 01:06:49,020 --> 01:06:50,790 Jeg kommer til å sette dette tilbake der det var, bare fordi jeg 1623 01:06:50,790 --> 01:06:53,390 foretrekker, som et spørsmål om prinsipp, det viktigste alltid være 1624 01:06:53,390 --> 01:06:55,550 på toppen, fordi det er bare hyggelig å se hva dette programmet 1625 01:06:55,550 --> 01:06:56,920 gjør som standard. 1626 01:06:56,920 --> 01:06:58,950 Og hva jeg skal gjøre her oppe er erklære det som kalles 1627 01:06:58,950 --> 01:07:00,250 en prototype. 1628 01:07:00,250 --> 01:07:05,730 Jeg kommer til å re-erklære min kube funksjon ved bokstavelig talt 1629 01:07:05,730 --> 01:07:07,180 kopiere og lime inn. 1630 01:07:07,180 --> 01:07:08,290 Egentlig er det ikke bokstavelig. 1631 01:07:08,290 --> 01:07:13,060 Så bokstavelig kopiere og lime line 15 1632 01:07:13,060 --> 01:07:15,160 opp over linje 6. 1633 01:07:15,160 --> 01:07:17,010 Det spiller ingen rolle hvilken linje dette ender opp på. 1634 01:07:17,010 --> 01:07:18,380 Det skjer for å være på linje 4. 1635 01:07:18,380 --> 01:07:19,950 Men det trenger å være før viktigste. 1636 01:07:19,950 --> 01:07:21,150 Men legg merke forskjellen. 1637 01:07:21,150 --> 01:07:24,100 Linje 4 ender med et semikolon, som betyr hei, 1638 01:07:24,100 --> 01:07:27,510 Clang, ta mitt ord for det at det eksisterer en funksjon 1639 01:07:27,510 --> 01:07:31,350 kalt kube som tar en int og returnerer en int. 1640 01:07:31,350 --> 01:07:33,020 Men jeg skal ikke fortelle deg hva det er ennå. 1641 01:07:33,020 --> 01:07:35,180 Bare vet at jeg lover å fortelle dere etter hvert. 1642 01:07:35,180 --> 01:07:38,490 Og ja, nå er det greit at dette er ned nedenfor. 1643 01:07:38,490 --> 01:07:41,275 >> Så dette er generelt bedre, fordi da øverst 1644 01:07:41,275 --> 01:07:44,240 filen, kan du bare skrangle av, rapid-fire, én linje 1645 01:07:44,240 --> 01:07:46,470 hver, hva navnene på funksjonene er, hva deres 1646 01:07:46,470 --> 01:07:49,120 innganger er, hva deres utganger er. 1647 01:07:49,120 --> 01:07:52,210 Og for å være mer tydelig, betyr inngang generelt argument eller 1648 01:07:52,210 --> 01:07:54,110 parameter, synonymt. 1649 01:07:54,110 --> 01:07:56,890 Utgang betyr returverdi, hva betyr det 1650 01:07:56,890 --> 01:07:58,700 hånd tilbake til meg. 1651 01:07:58,700 --> 01:08:03,420 Så i dette tilfelle her, har cube blitt erklært øverst, men 1652 01:08:03,420 --> 01:08:06,940 definert, ellers kjent som implementert, nederst. 1653 01:08:06,940 --> 01:08:09,620 Så nå la oss gå tilbake hit og kjøre dette. 1654 01:08:09,620 --> 01:08:13,430 Så nå la meg gå videre og kjøre gjøre, re-run tilvekst. 1655 01:08:13,430 --> 01:08:16,500 Og det synes nå å jobbe helt fint. 1656 01:08:16,500 --> 01:08:19,450 Så nå kan vi gå videre og faktor ut noe som 1657 01:08:19,450 --> 01:08:23,720 øl eksempel i denne fjerde versjonen. 1658 01:08:23,720 --> 01:08:25,590 Så la meg bla nedover her. 1659 01:08:25,590 --> 01:08:28,149 Og legg merke til at jeg slags tok denne leksjonen til hjertet akkurat nå. 1660 01:08:28,149 --> 01:08:31,140 Det faktum at jeg sang den samme strofe igjen og 1661 01:08:31,140 --> 01:08:34,130 igjen og igjen, det samme refrenget linje i sangen, følte 1662 01:08:34,130 --> 01:08:36,439 som hvorfor ikke jeg faktor som ut i en funksjon? 1663 01:08:36,439 --> 01:08:38,470 Og faktisk, bør dette være en av motivasjonene. 1664 01:08:38,470 --> 01:08:40,960 Foruten det faktum at noen andre i verden vil kanskje 1665 01:08:40,960 --> 01:08:42,390 å bruke en kube funksjon - 1666 01:08:42,390 --> 01:08:44,560 det er en god grunn til å faktor noe ut og skriv din 1667 01:08:44,560 --> 01:08:45,720 egne funksjon - 1668 01:08:45,720 --> 01:08:48,720 hvis det er en del av koden i programmet som bare gjør 1669 01:08:48,720 --> 01:08:51,370 konseptuelle forstand, som du slags ønsker å gi den en 1670 01:08:51,370 --> 01:08:53,740 navn - som i dette tilfellet, chorus - 1671 01:08:53,740 --> 01:08:57,380 så kan du på samme måte skrive det som en egen funksjon. 1672 01:08:57,380 --> 01:08:59,560 Du trenger ikke å skrive alt i hoved hvis det bare 1673 01:08:59,560 --> 01:09:02,609 føles renere å skille det ut og gi den et navn. 1674 01:09:02,609 --> 01:09:05,529 >> Så i dette tilfellet her, merker at jeg har en kommentar på toppen 1675 01:09:05,529 --> 01:09:06,859 denne funksjonen som bare synger om 1676 01:09:06,859 --> 01:09:08,630 spesifiserte antall flasker. 1677 01:09:08,630 --> 01:09:10,609 Legg merke til her at jeg ikke trenger å kalle disse 1678 01:09:10,609 --> 01:09:12,520 ting inngang og utgang. 1679 01:09:12,520 --> 01:09:16,090 Faktisk, denne gangen jeg bare kalt mitt innspill b for flaske. 1680 01:09:16,090 --> 01:09:19,960 Og legg merke til her, tyder ugyldig hva? 1681 01:09:19,960 --> 01:09:21,309 Det kor - 1682 01:09:21,309 --> 01:09:22,660 PUBLIKUM: Har ikke tilbake det. 1683 01:09:22,660 --> 01:09:23,870 DAVID J. MALAN: returnerer ikke en verdi. 1684 01:09:23,870 --> 01:09:26,800 Og faktisk, trenger funksjoner ikke å returnere verdier. 1685 01:09:26,800 --> 01:09:28,060 De kan bare gjøre noe. 1686 01:09:28,060 --> 01:09:30,270 De kan ha det som kalles bivirkninger, som i dette 1687 01:09:30,270 --> 01:09:33,109 saken er bare en hel haug med utskrift på skjermen. 1688 01:09:33,109 --> 01:09:36,580 Så merker at denne koden her, jeg bokstavelig talt bare stjal fra 1689 01:09:36,580 --> 01:09:37,680 forrige eksempel. 1690 01:09:37,680 --> 01:09:39,930 Den eneste forskjellen er i stedet for å bruke i som min 1691 01:09:39,930 --> 01:09:42,890 variabel, er jeg nå bruker b som variabel min. 1692 01:09:42,890 --> 01:09:45,880 Så jeg har b her nede, jeg har b her nede, har jeg b 1693 01:09:45,880 --> 01:09:47,109 minus 1 her nede. 1694 01:09:47,109 --> 01:09:49,279 Men koden er nøyaktig den samme. 1695 01:09:49,279 --> 01:09:52,529 Men bare for å vise deg nå hvordan vi kan bruke dette, la meg gå 1696 01:09:52,529 --> 01:09:56,780 fremover og faktisk endre dette for å være en for-løkke. 1697 01:09:56,780 --> 01:10:03,850 for (int i = n; i> n; i -). 1698 01:10:03,850 --> 01:10:06,230 >> Så jeg har stjålet det fra vår forrige eksempel. 1699 01:10:06,230 --> 01:10:08,970 Tidligere er det i linje 37 som jeg ville ha startet 1700 01:10:08,970 --> 01:10:10,640 synge denne irriterende sang. 1701 01:10:10,640 --> 01:10:15,810 Men i stedet, jeg bare kommer til å nå kaller koret av jeg. 1702 01:10:15,810 --> 01:10:16,870 Ferdig. 1703 01:10:16,870 --> 01:10:20,260 Så nå i alle gjentakelse av denne sløyfen, kaller jeg dette andre 1704 01:10:20,260 --> 01:10:22,220 funksjon, chorus, at jeg skjedd å skrive. 1705 01:10:22,220 --> 01:10:24,110 Det ble ikke skrevet av noen andre år siden. 1706 01:10:24,110 --> 01:10:27,930 Men kor, i mellomtiden bruker printf å skrive ut 1707 01:10:27,930 --> 01:10:29,840 ut disse fire linjer. 1708 01:10:29,840 --> 01:10:32,720 Men det faktum at jeg ringer kor igjen og igjen i en 1709 01:10:32,720 --> 01:10:35,900 løkke betyr at jeg kommer til å få, helt på slutten, den 1710 01:10:35,900 --> 01:10:39,310 nøyaktig samme sang som jeg har så langt. 1711 01:10:39,310 --> 01:10:42,130 Så kort sagt, nå hvis jeg ser tilbake på min kode, selv om 1712 01:10:42,130 --> 01:10:44,240 funksjonelt dette er tilsvarende, legge merke til at det er 1713 01:10:44,240 --> 01:10:46,020 begynner å bli enda mer lesbart. 1714 01:10:46,020 --> 01:10:48,410 Jeg vet ikke nøyaktig hvor GetInt 1715 01:10:48,410 --> 01:10:49,250 er implementert. 1716 01:10:49,250 --> 01:10:52,050 Ærlig, jeg vet ikke hvordan kor er implementert. 1717 01:10:52,050 --> 01:10:52,970 Men det spiller ingen rolle for meg. 1718 01:10:52,970 --> 01:10:55,620 Jeg bryr meg ikke, fordi nå kan jeg liksom, som menneske, les 1719 01:10:55,620 --> 01:10:57,050 dette fra topp til bunn. 1720 01:10:57,050 --> 01:10:59,950 Og fordi funksjonene er navngitt i henhold til hva de 1721 01:10:59,950 --> 01:11:02,910 gjøre, er min kode stadig lesbar. 1722 01:11:02,910 --> 01:11:05,190 Og som våre programmer får mye mer kompleks - 1723 01:11:05,190 --> 01:11:07,220 ved semesterets slutt, vil du være å skrive hundrevis av linjer 1724 01:11:07,220 --> 01:11:10,970 av koden i språk som PHP og JavaScript og lignende - 1725 01:11:10,970 --> 01:11:13,550 vil du finne at det er så mye lettere enn å holde styr på 1726 01:11:13,550 --> 01:11:14,080 hva du har gjort. 1727 01:11:14,080 --> 01:11:15,810 Og når du begynner å samarbeide med venner eller 1728 01:11:15,810 --> 01:11:19,010 partnere eller kolleger, vil du være i stand til å skrive mye mer 1729 01:11:19,010 --> 01:11:22,910 massive programmer ved å begynne å trene disse grunnleggende 1730 01:11:22,910 --> 01:11:23,990 byggeklossene. 1731 01:11:23,990 --> 01:11:25,550 >> Så med det sagt, hvorfor ikke vi kalle det en dag? 1732 01:11:25,550 --> 01:11:27,190 Og vi vil se deg på onsdag. 1733 01:11:27,190 --> 01:11:33,611 [Applaus]