1 00:00:07,420 --> 00:00:08,160 [Powered by Google Translate] DAVID J. MALAN: All right. 2 00:00:08,160 --> 00:00:11,170 Dette er CS50, og dette er slutten av uke to. 3 00:00:11,170 --> 00:00:14,650 Hvis du forventer å være sulten på denne tiden i morgen, vet at vi skal 4 00:00:14,650 --> 00:00:18,920 å innkalle som en liten gruppe i morgen, torsdag, 1:15 PM. 5 00:00:18,920 --> 00:00:21,460 Det er denne nettadressen her hvis du ønsker å RSVP. 6 00:00:21,460 --> 00:00:25,270 Plassen er begrenset, så tilgi hvis skjemaet er fylt opp av den tiden du 7 00:00:25,270 --> 00:00:26,680 fylle ut dette. 8 00:00:26,680 --> 00:00:29,400 En annen URL skjønt som kan være av interesse er dette. 9 00:00:29,400 --> 00:00:32,409 >> Så i omtrent en måneds tid, er kurset skal gjøres tilgjengelig 10 00:00:32,409 --> 00:00:36,090 desto mer grovt via EDX, via som folk på internett vil være 11 00:00:36,090 --> 00:00:39,580 i stand til å følge med, delta i kurset ganske aktivt, faktisk. 12 00:00:39,580 --> 00:00:43,070 De skal bruke CS50 Appliance og CS50 Diskuter og det meste av 13 00:00:43,070 --> 00:00:45,840 ulike dataverktøy som vi allerede har brukt dette semesteret. 14 00:00:45,840 --> 00:00:49,030 Og ett av tiltakene vi ønsker å ta på som et eksperiment i år 15 00:00:49,030 --> 00:00:53,120 er å se hvor mye innhold vi kan oversette til andre talt og 16 00:00:53,120 --> 00:00:54,110 skriftspråk. 17 00:00:54,110 --> 00:00:58,000 Så hvis du kan ha en interesse i å delta i dette prosjektet, der 18 00:00:58,000 --> 00:01:02,090 Vi vil gi engelsk utskrifter og undertekster for kurset er 19 00:01:02,090 --> 00:01:05,190 forelesninger og shorts og seminarer og seksjoner og lignende - 20 00:01:05,190 --> 00:01:08,700 hvis du snakker flytende eller skrive flytende et annet språk, ville vi 21 00:01:08,700 --> 00:01:12,240 elsker å engasjere deg i dette prosjektet, hvor du tar på en eller flere av 22 00:01:12,240 --> 00:01:15,340 videoer, oversette dem til et språk du kjenner ganske godt. 23 00:01:15,340 --> 00:01:19,050 For å gi deg en følelse av grensesnittet, er det denne web-basert brukergrensesnitt 24 00:01:19,050 --> 00:01:22,330 at vi skal bruke som vil skape hovedsak en UI som dette. 25 00:01:22,330 --> 00:01:24,520 Dette ble meg å undervise noen Halloween siden. 26 00:01:24,520 --> 00:01:27,710 Og på høyre side der i svart ved siden av disse tidsstempler, 27 00:01:27,710 --> 00:01:31,300 vil du se de forskjellige tingene som kom ut av munnen min den dagen. 28 00:01:31,300 --> 00:01:34,660 Og deretter under det, vil du være i stand til å oversette til et annet språk. 29 00:01:34,660 --> 00:01:37,840 Nøyaktig hva kartleggingen er mellom, i dette tilfellet, engelsk 30 00:01:37,840 --> 00:01:38,660 og, si, spansk. 31 00:01:38,660 --> 00:01:40,480 Så det er faktisk en veldig brukervennlig verktøy. 32 00:01:40,480 --> 00:01:43,690 Du kan spole tilbake og spole frem veldig lett med hurtigtaster. 33 00:01:43,690 --> 00:01:46,710 Så hvis du ønsker å ta del i dette eksperimentet, og har dine ord 34 00:01:46,710 --> 00:01:50,730 sett og lest av potensielt tusenvis av folk der ute, gjør du gjerne 35 00:01:50,730 --> 00:01:51,960 gratis å delta. 36 00:01:51,960 --> 00:01:56,940 >> Nå ett ord om kattungen fra mandag, for at vi har sendt en altfor 37 00:01:56,940 --> 00:01:58,120 skremmende melding. 38 00:01:58,120 --> 00:02:02,130 Innser at så kontortid foreslå og som deler foreslår, den 39 00:02:02,130 --> 00:02:05,110 utformingen av kurset er veldig mye å ha studenter samarbeider og 40 00:02:05,110 --> 00:02:09,250 snakker å arbeide gjennom oppgavesett og problemer sammen. 41 00:02:09,250 --> 00:02:13,630 Og virkelig linjen kommer bare ned til, igjen, arbeidet du til slutt 42 00:02:13,630 --> 00:02:16,420 skal sende bør være din egen. 43 00:02:16,420 --> 00:02:19,080 Og så er det, helt ærlig - i kontortiden, er det helt normalt - 44 00:02:19,080 --> 00:02:21,560 det er helt å forvente, selv - for å bli chatter med noen 45 00:02:21,560 --> 00:02:22,370 venner ved siden av deg. 46 00:02:22,370 --> 00:02:25,240 Hvis han eller hun sliter med noen tema, og du liker, oh, vel la 47 00:02:25,240 --> 00:02:27,750 meg gi deg et glimt av noen linje med kode som jeg skrev. 48 00:02:27,750 --> 00:02:28,290 Det er fint. 49 00:02:28,290 --> 00:02:28,700 Det skjer. 50 00:02:28,700 --> 00:02:31,580 Og det er veldig mye bidrar, tror jeg, med prosessen med læring. 51 00:02:31,580 --> 00:02:35,270 Hvor linjen, igjen, blir krysset er når hodet er slags vippet løpet 52 00:02:35,270 --> 00:02:38,800 her for altfor mange sekunder eller minutter for at virkelig å ha bare 53 00:02:38,800 --> 00:02:41,250 vært en Unblocking mulighet for din venn. 54 00:02:41,250 --> 00:02:43,870 Og sikkert, når ting blir utvekslet via e-post og Dropbox og 55 00:02:43,870 --> 00:02:45,350 lignende, er det for linjen. 56 00:02:45,350 --> 00:02:48,940 Så for all del, føler deg komfortabel og føler oppfordres til å chatte med venner 57 00:02:48,940 --> 00:02:51,270 og klassekamerater om psets og mer. 58 00:02:51,270 --> 00:02:54,680 Og bare innse at det du til slutt sende burde egentlig være 59 00:02:54,680 --> 00:02:57,780 produkt av din kreasjon og ikke noen andre. 60 00:02:57,780 --> 00:03:01,010 >> Så i samme ånd av kosete skapninger, kanskje du 61 00:03:01,010 --> 00:03:02,820 vet denne fyren her. 62 00:03:02,820 --> 00:03:06,180 Så dette er en horrifically cheesy film fra år siden. 63 00:03:06,180 --> 00:03:08,680 Noen her sett Spaceballs? 64 00:03:08,680 --> 00:03:09,120 OK. 65 00:03:09,120 --> 00:03:10,220 Så en god del her. 66 00:03:10,220 --> 00:03:13,840 Så dette er vår fantastisk akademisk måte å introdusere i dag til slutt 67 00:03:13,840 --> 00:03:15,130 oppfatningen av kryptografi. 68 00:03:15,130 --> 00:03:19,010 Og så en av de domene spesifikke problemer for to pset, som vil komme 69 00:03:19,010 --> 00:03:22,770 ut sent i morgen kveld, er å dykke inn i verden av kryptografi, som 70 00:03:22,770 --> 00:03:26,380 er kunsten å kryptere eller scrambling informasjon. 71 00:03:26,380 --> 00:03:30,160 Og dette gjelder slutt til en verden av sikkerhet. 72 00:03:30,160 --> 00:03:34,440 >> Nå sikkerhet for de fleste kommer oss i form av ganske dagligdagse mekanismer. 73 00:03:34,440 --> 00:03:36,920 Alle av oss har brukernavn og passord. 74 00:03:36,920 --> 00:03:41,350 Og alle av oss har svært dårlige brukernavn og passord, mest sannsynlig. 75 00:03:41,350 --> 00:03:45,250 Hvis passordet er det samme på flere nettsteder, er det sannsynligvis ikke 76 00:03:45,250 --> 00:03:47,920 den beste ideen, som vi vil diskutere mot semesters slutt. 77 00:03:47,920 --> 00:03:51,680 Hvis passordet er skrevet på en klistrelapp - ingen spøk - på 78 00:03:51,680 --> 00:03:55,130 monitor, som også er ikke nødvendigvis den beste design, men ganske vanlig 79 00:03:55,130 --> 00:03:56,140 fenomen. 80 00:03:56,140 --> 00:04:00,420 Og hvis du ikke bruker kryptografi for å kryptere passordene dine, er de 81 00:04:00,420 --> 00:04:01,610 spesielt sårbare. 82 00:04:01,610 --> 00:04:04,670 Så hvis du tror du er super flink ved å ha en skjult Word 83 00:04:04,670 --> 00:04:07,740 dokumentere et sted på harddisken din som har alle passordene dine, men 84 00:04:07,740 --> 00:04:10,550 det er i en mappe som ingen kommer til å se på, som er for ikke en veldig 85 00:04:10,550 --> 00:04:11,540 sikker mekanisme. 86 00:04:11,540 --> 00:04:15,100 Og så hva pset 2 vil introdusere er denne kunsten av kryptografi og 87 00:04:15,100 --> 00:04:18,300 scrambling informasjon slik at ting som passord er 88 00:04:18,300 --> 00:04:19,500 desto mer sikker. 89 00:04:19,500 --> 00:04:24,500 Slik som å motivere denne svært virkelige verden problem med en veldig ikke-real-world 90 00:04:24,500 --> 00:04:28,740 scenario, la meg introdusere deg til en av våre favorittklipp her fra dette 91 00:04:28,740 --> 00:04:29,895 film, Spaceballs. 92 00:04:29,895 --> 00:04:30,565 >> [VIDEOAVSPILLING] 93 00:04:30,565 --> 00:04:32,995 -Hjelm, du djevel, hva skjer? 94 00:04:32,995 --> 00:04:34,730 Hva gjør du til datteren min? 95 00:04:34,730 --> 00:04:38,960 -Tillat meg å presentere den strålende unge plastisk kirurg, Dr. Philip 96 00:04:38,960 --> 00:04:43,290 Schlotkin, den største nesen jobb mann i hele 97 00:04:43,290 --> 00:04:45,526 universet og Beverly Hills. 98 00:04:45,526 --> 00:04:46,450 -Deres Høyhet. 99 00:04:46,450 --> 00:04:47,380 -Nose jobb? 100 00:04:47,380 --> 00:04:48,035 Jeg forstår ikke. 101 00:04:48,035 --> 00:04:49,480 Hun har allerede hatt en nese jobb. 102 00:04:49,480 --> 00:04:51,490 Det var en søt 16 stede. 103 00:04:51,490 --> 00:04:53,090 -Nei, det er ikke hva du tror. 104 00:04:53,090 --> 00:04:55,150 Det er mye, mye verre. 105 00:04:55,150 --> 00:04:59,860 Hvis du ikke gir meg kombinasjonen til luft skjold, Dr. Schlotkin vil 106 00:04:59,860 --> 00:05:04,135 gi din datter tilbake sitt gamle nesen. 107 00:05:04,135 --> 00:05:05,385 -Nei! 108 00:05:08,202 --> 00:05:10,186 Hvor fikk du den? 109 00:05:10,186 --> 00:05:11,178 -Greit. 110 00:05:11,178 --> 00:05:11,674 Jeg skal fortelle. 111 00:05:11,674 --> 00:05:12,666 Jeg skal fortelle. 112 00:05:12,666 --> 00:05:14,154 -Nei, pappa, nei. 113 00:05:14,154 --> 00:05:15,150 Du må ikke. 114 00:05:15,150 --> 00:05:16,460 -Du har rett, min kjære. 115 00:05:16,460 --> 00:05:18,450 Jeg kommer til å savne den nye nesen. 116 00:05:18,450 --> 00:05:21,550 Men jeg vil ikke fortelle dem kombinasjonen uansett. 117 00:05:21,550 --> 00:05:23,100 -Veldig godt. 118 00:05:23,100 --> 00:05:25,510 Dr. Schlotkin, gjør din verste. 119 00:05:25,510 --> 00:05:26,760 -Min glede. 120 00:05:30,560 --> 00:05:31,180 -Nei! 121 00:05:31,180 --> 00:05:33,450 Vent, vent. 122 00:05:33,450 --> 00:05:34,770 Jeg skal fortelle. 123 00:05:34,770 --> 00:05:36,400 Jeg skal fortelle. 124 00:05:36,400 --> 00:05:38,630 -Jeg visste det ville fungere. 125 00:05:38,630 --> 00:05:42,040 Greit, gi den til meg. 126 00:05:42,040 --> 00:05:46,890 -Kombinasjonen er en. 127 00:05:46,890 --> 00:05:47,290 -One. 128 00:05:47,290 --> 00:05:48,183 -One. 129 00:05:48,183 --> 00:05:48,950 -To. 130 00:05:48,950 --> 00:05:49,370 -To. 131 00:05:49,370 --> 00:05:50,450 -To. 132 00:05:50,450 --> 00:05:50,715 -Tre 133 00:05:50,715 --> 00:05:51,380 -Tre. 134 00:05:51,380 --> 00:05:52,390 -Tre. 135 00:05:52,390 --> 00:05:53,200 -Four. 136 00:05:53,200 --> 00:05:53,720 -Four. 137 00:05:53,720 --> 00:05:55,830 -Four. 138 00:05:55,830 --> 00:05:56,580 -Fem 139 00:05:56,580 --> 00:05:57,120 -Fem. 140 00:05:57,120 --> 00:05:58,560 -Fem. 141 00:05:58,560 --> 00:06:03,770 -Så kombinasjonen er en, to, tre, fire, fem. 142 00:06:03,770 --> 00:06:06,745 Det er den dummeste kombinasjonen jeg noensinne har hørt i mitt liv. 143 00:06:06,745 --> 00:06:09,290 Det er den slags ting en idiot ville ha på bagasjen sin. 144 00:06:09,290 --> 00:06:11,540 -Takk, din høyhet. 145 00:06:11,540 --> 00:06:12,940 -Hva gjorde du? 146 00:06:12,940 --> 00:06:14,230 -Jeg slått av veggen. 147 00:06:14,230 --> 00:06:14,630 -Nei, det gjorde du ikke. 148 00:06:14,630 --> 00:06:15,430 Du har slått av hele filmen. 149 00:06:15,430 --> 00:06:16,722 -Jeg må ha trykket på feil knapp. 150 00:06:16,722 --> 00:06:18,078 -Vel, sette den på igjen. 151 00:06:18,078 --> 00:06:18,805 Sette filmen på igjen. 152 00:06:18,805 --> 00:06:19,080 -Ja, sir. 153 00:06:19,080 --> 00:06:19,270 Ja, sir. 154 00:06:19,270 --> 00:06:19,830 -Kom igjen, Erna. 155 00:06:19,830 --> 00:06:20,270 Kom, Gretchen. 156 00:06:20,270 --> 00:06:22,850 Selvfølgelig vet du at jeg har fortsatt å fakturere deg for dette. 157 00:06:27,400 --> 00:06:28,325 -Vel, fungerte det? 158 00:06:28,325 --> 00:06:29,550 Hvor er porten? 159 00:06:29,550 --> 00:06:29,910 -Det fungerte, sir. 160 00:06:29,910 --> 00:06:30,770 Vi har kombinasjonen. 161 00:06:30,770 --> 00:06:31,390 -Flott. 162 00:06:31,390 --> 00:06:35,630 Nå kan vi ta hver siste pust av frisk luft fra planeten Druidia. 163 00:06:35,630 --> 00:06:36,550 Hva er kombinasjonen? 164 00:06:36,550 --> 00:06:38,805 -En, to, tre, fire, fem. 165 00:06:38,805 --> 00:06:40,610 -En, to, tre, fire, fem? 166 00:06:40,610 --> 00:06:41,070 -Ja. 167 00:06:41,070 --> 00:06:41,760 -Det er utrolig. 168 00:06:41,760 --> 00:06:45,200 Jeg har den samme kombinasjonen på bagasjen min. 169 00:06:45,200 --> 00:06:47,800 Forbered Spaceball 1 for umiddelbar avgang. 170 00:06:47,800 --> 00:06:48,536 -Ja, sir. 171 00:06:48,536 --> 00:06:52,350 -Og endre kombinasjonen på bagasjen min. 172 00:06:52,350 --> 00:06:53,250 -Au! 173 00:06:53,250 --> 00:06:55,020 [END VIDEOAVSPILLING] 174 00:06:55,020 --> 00:06:57,470 >> DAVID J. MALAN: An amazing film du skal nå alle se. 175 00:07:00,600 --> 00:07:06,540 Så sammenhengen her er at med usikre data kommer en mulighet til å 176 00:07:06,540 --> 00:07:07,790 kryptere den og til å rykke det. 177 00:07:07,790 --> 00:07:11,060 Og så dette, for eksempel, er et eksempel på en kryptert melding. 178 00:07:11,060 --> 00:07:12,980 Dette sier faktisk noe på engelsk. 179 00:07:12,980 --> 00:07:14,750 Men det er åpenbart ikke helt opplagt. 180 00:07:14,750 --> 00:07:17,360 Og vi vil komme full sirkel i dag for å erte hverandre hva denne hemmeligheten 181 00:07:17,360 --> 00:07:18,380 budskap her er. 182 00:07:18,380 --> 00:07:22,370 Men i den virkelige verden av datamaskiner, ting ikke engang ser ut som de kanskje 183 00:07:22,370 --> 00:07:23,440 være engelske setninger. 184 00:07:23,440 --> 00:07:27,500 For eksempel er dette hva du kan finne på en standard Linux eller Mac eller 185 00:07:27,500 --> 00:07:32,080 Unix datamaskin i en fil som var en gang kalt passord fil. 186 00:07:32,080 --> 00:07:34,170 I dag er det blitt flyttet til andre steder. 187 00:07:34,170 --> 00:07:38,660 Men hvis du ser på rett sted på et system, vil du se ikke bare din 188 00:07:38,660 --> 00:07:41,430 brukernavn eller som av andre mennesker på systemet, men du vil se en 189 00:07:41,430 --> 00:07:43,410 kryptert versjon av passordet sitt. 190 00:07:43,410 --> 00:07:47,800 Faktisk tyder ordet krypten der at følgende ting er kryptert. 191 00:07:47,800 --> 00:07:52,030 Og denne serien av tilsynelatende tilfeldige bokstaver og tegn og tall, og 192 00:07:52,030 --> 00:07:56,370 så videre kan dekrypteres bare generelt vite noen hemmelighet - 193 00:07:56,370 --> 00:07:58,600 et hemmelig ord, et hemmelig nummer. 194 00:07:58,600 --> 00:08:02,760 Og så ja, til kunsten kryptografi slutt koker ned stole på noen 195 00:08:02,760 --> 00:08:05,700 sortere og vite noe som noen andre gjør det ikke. 196 00:08:05,700 --> 00:08:10,010 Vi vil utforske dette i en litt mer detaljert i dag og i pset som kommer. 197 00:08:10,010 --> 00:08:11,860 >> Og nå et ord på bestått / ikke bestått. 198 00:08:11,860 --> 00:08:15,250 Så spesielt, har som noen av dere stupte inn en pset, apparatet, og 199 00:08:15,250 --> 00:08:18,390 en veldig ny verden for deg selv, innså at frustrasjoner og 200 00:08:18,390 --> 00:08:21,340 forvirring og bare tekniske problemer er å være forventet. 201 00:08:21,340 --> 00:08:24,410 Spesielt med den første pset, der det er bare så mye nytt, bare å få 202 00:08:24,410 --> 00:08:28,830 kjent med ls og cd og alle disse uforståelige kommandoer i et nytt miljø. 203 00:08:28,830 --> 00:08:32,679 Og som er atskilt fra selve materialet og programmering selv. 204 00:08:32,679 --> 00:08:35,960 Så skjønner også at det er sikkert kontortid som finnes som 205 00:08:35,960 --> 00:08:36,770 bærekonstruksjonen. 206 00:08:36,770 --> 00:08:38,620 Seksjoner begynner førstkommende søndag. 207 00:08:38,620 --> 00:08:41,990 Men viktigst av alt, hvis du føler bare at dette ikke er 208 00:08:41,990 --> 00:08:44,420 verden for deg, skjønner at det virkelig tar bare tid. 209 00:08:44,420 --> 00:08:47,520 Og var det ikke for denne muligheten år siden for meg for å ta en klasse 210 00:08:47,520 --> 00:08:50,840 bestått / ikke bestått, ærlig, jeg ville aldri ha selv satt foten i klasserommet. 211 00:08:50,840 --> 00:08:53,520 Og du kan endre dette frem til, sier den femte mandag av kurset. 212 00:08:53,520 --> 00:08:57,110 Så hvis du er på kanten nå, innser at heller enn hodet til noen andre 213 00:08:57,110 --> 00:09:01,000 farvann helt, gjør absolutt vurdere å bare bytte til bestått / ikke bestått. 214 00:09:01,000 --> 00:09:03,750 Igjen, det er jo ikke denne kulturen her på Harvard for å ta ting 215 00:09:03,750 --> 00:09:08,080 bestått / ikke bestått siden alle egentlig ønsker å oppnå eller overgå. 216 00:09:08,080 --> 00:09:11,470 Men ærlig, dette er en flott måte å prøve noe ut som kanskje ikke 217 00:09:11,470 --> 00:09:13,110 være kjent for deg. 218 00:09:13,110 --> 00:09:17,090 Og du vil ende opp med å gjøre i de fleste tilfeller ganske fine, kanskje 219 00:09:17,090 --> 00:09:18,040 mye å overraske din. 220 00:09:18,040 --> 00:09:20,850 Og i mer konkret hva jeg tror bestått / ikke bestått generelt gjør, 221 00:09:20,850 --> 00:09:23,350 spesielt som du kanskje har opplevd med pset 0, hvis du har satt 222 00:09:23,350 --> 00:09:27,200 i 10 timer, 15 timer, 25 timer i noen pset - og du er bare banging 223 00:09:27,200 --> 00:09:28,180 hodet mot veggen, 224 00:09:28,180 --> 00:09:29,850 og det blir super sent på kvelden, 225 00:09:29,850 --> 00:09:31,880 men du har tatt pset som 90% av veien, 226 00:09:31,880 --> 00:09:33,780 du vet du bare ikke kan finne ut en ting - 227 00:09:33,780 --> 00:09:36,830 bestått / ikke bestått virkelig tar kanten av en klasse som dette, hvor du kan sortere 228 00:09:36,830 --> 00:09:39,150 av gjerne si greit, jeg vet det er ikke perfekt. 229 00:09:39,150 --> 00:09:40,470 Men jeg jobbet ræva av meg på dette. 230 00:09:40,470 --> 00:09:42,410 Jeg er ganske fornøyd med hvor det endte opp. 231 00:09:42,410 --> 00:09:44,780 Og som vil tilfredsstille forventningene til bestått / ikke bestått. 232 00:09:44,780 --> 00:09:46,850 Så hold det i tankene. 233 00:09:46,850 --> 00:09:47,140 >> OK. 234 00:09:47,140 --> 00:09:50,980 Så de av dere som har kjempet for å bruke Harvard University Wi-Fi vet 235 00:09:50,980 --> 00:09:54,780 at det er en CS50 SSID, en Wi-Fi-tilkobling flyter rundt som du 236 00:09:54,780 --> 00:09:56,520 kan ha bedre lykke til. 237 00:09:56,520 --> 00:09:59,430 Det er litt ironisk at passordet for dette - hvis du ønsker å prøve 238 00:09:59,430 --> 00:10:03,080 tilkobling til dette for bedre hastigheter og la oss få vite om det er noe bedre - 239 00:10:03,080 --> 00:10:09,240 er en, to, tre, fire, fem, hele veien opp til åtte fordi åtte er 240 00:10:09,240 --> 00:10:10,270 sikrere enn fem. 241 00:10:10,270 --> 00:10:15,520 Så hvis du trenger Wi-Fi passord, koble til CS50 trådløst her. 242 00:10:15,520 --> 00:10:16,950 En, to, tre, fire, fem, seks, sju, åtte. 243 00:10:16,950 --> 00:10:20,440 Og innlegg på CS50 Diskuter hvis du fortsatt har intermitterende tilkoblingsproblemer, 244 00:10:20,440 --> 00:10:24,880 og vi vil gi krefter som skal vite for denne plassen. 245 00:10:24,880 --> 00:10:25,180 >> OK. 246 00:10:25,180 --> 00:10:30,350 Så en rask teaser, spesielt for de av dere som er fan gutter eller jenter 247 00:10:30,350 --> 00:10:31,900 av alle ting Apple. 248 00:10:31,900 --> 00:10:37,566 Hva jeg gravd opp fra et par år tilbake var denne filen her, ilock.c, bare for å 249 00:10:37,566 --> 00:10:40,930 slags gjør mer konkret og mer komplekse noen av de mer rene C 250 00:10:40,930 --> 00:10:42,350 programmene vi har skrevet. 251 00:10:42,350 --> 00:10:44,360 Så jeg åpnet opp denne filen, ilock.c. 252 00:10:44,360 --> 00:10:46,830 Det er tilgjengelig på forelesninger siden for i dag. 253 00:10:46,830 --> 00:10:49,470 På venstre side ser du en lang liste med funksjoner. 254 00:10:49,470 --> 00:10:51,860 Så fyr som skrev dette skrev opp en masse funksjoner, 255 00:10:51,860 --> 00:10:53,290 mer enn bare main. 256 00:10:53,290 --> 00:10:55,490 Han brukte en hel haug av biblioteker her. 257 00:10:55,490 --> 00:11:00,450 Og hvis vi begynner å bla gjennom, hva dette egentlig er er svært 258 00:11:00,450 --> 00:11:04,670 første, tror jeg, sprekk for den originale iPhone. 259 00:11:04,670 --> 00:11:08,000 Når du ønsket å jailbreak den originale iPhone, noe som betyr untether 260 00:11:08,000 --> 00:11:11,800 det fra AT & T, nemlig å installere spesiell programvare på den og gjøre ting 261 00:11:11,800 --> 00:11:13,510 at Apple ikke vil at folk skal gjøre - 262 00:11:13,510 --> 00:11:17,020 vel, tok noen tid til å finne ut nøyaktig hvordan de kan utnytte 263 00:11:17,020 --> 00:11:20,880 programvare feil, feil, feil, i Apples programvare. 264 00:11:20,880 --> 00:11:22,650 Og slik ble født ilock.c. 265 00:11:22,650 --> 00:11:26,670 At hvis du kompilerte det på en datamaskin og installerte den på en iPhone som 266 00:11:26,670 --> 00:11:29,810 ble koblet til datamaskinen via, sier en USB-kabel, vil dette gi deg 267 00:11:29,810 --> 00:11:33,360 administrative eller rotrettigheter på din iPhone og lar deg gjøre ganske mye 268 00:11:33,360 --> 00:11:34,170 hva du vil. 269 00:11:34,170 --> 00:11:36,740 >> Og så det har vært denne fascinerende katt og mus lek mellom Apple og 270 00:11:36,740 --> 00:11:39,920 resten av verden særlig når de, som mange bedrifter, kan du prøve å låse 271 00:11:39,920 --> 00:11:43,220 sine ting ned slik at du bare kan gjøre med det hva de har tenkt. 272 00:11:43,220 --> 00:11:46,620 Men takket være folk som dette og deres forståelse av lavt nivå 273 00:11:46,620 --> 00:11:50,580 detaljer og i dette tilfellet, C programmering og mye av de kjente konstruksjoner 274 00:11:50,580 --> 00:11:54,630 at vi har begynt å leke med, er du i stand til å virkelig utnytte den 275 00:11:54,630 --> 00:11:59,050 maskinvare på en måte det passer og ikke nødvendigvis noen bedriftsenhet. 276 00:11:59,050 --> 00:12:01,360 Så for eksempel, har jeg ingen anelse om hva alt dette gjør. 277 00:12:01,360 --> 00:12:03,220 Men GetVersion høres ganske grei. 278 00:12:03,220 --> 00:12:05,480 Og det ser ut som dette er en funksjon som denne personen skrev. 279 00:12:05,480 --> 00:12:09,240 Ta noen form for heltall som argument, ikke returnerer noe, men 280 00:12:09,240 --> 00:12:13,080 ser ut til å sløyfe med en for løkke her, og en hvis tilstanden, hvis tilstand, 281 00:12:13,080 --> 00:12:15,620 pause, og noe relatert til versjonsnumre. 282 00:12:15,620 --> 00:12:16,700 Hvis vi bla nedover - 283 00:12:16,700 --> 00:12:19,570 selv om mange av disse søkeordene skal være nye, og det er en 284 00:12:19,570 --> 00:12:22,590 hel masse funksjoner i her vi aldri har sett, og kanskje aldri se over 285 00:12:22,590 --> 00:12:23,830 løpet av semesteret - 286 00:12:23,830 --> 00:12:27,150 på slutten av dagen, følger det samme regler og logikk som vi har vært 287 00:12:27,150 --> 00:12:28,760 spille med så langt. 288 00:12:28,760 --> 00:12:34,220 Så dette er altfor gammel til å knekke iPhone 3s eller 4s eller snart 5s, i disse dager, 289 00:12:34,220 --> 00:12:37,320 men vet at det er alle veldig mye avledet fra denne verden som vi har 290 00:12:37,320 --> 00:12:38,430 stupte inn. 291 00:12:38,430 --> 00:12:41,900 >> Så la oss ta en titt på en litt mer enkelt eksempel. 292 00:12:41,900 --> 00:12:46,100 Denne, bare for å få varme opp med noen syntaks og også noen andre data 293 00:12:46,100 --> 00:12:49,240 type som vi har snakket om, men har egentlig ikke sett i C. Så dette er en 294 00:12:49,240 --> 00:12:51,680 fil som heter positive1.c. 295 00:12:51,680 --> 00:12:55,120 Og per kommentarene på toppen, krever dette bare at en bruker gir en 296 00:12:55,120 --> 00:12:55,960 positivt tall. 297 00:12:55,960 --> 00:12:59,530 Så det er et eksempel på en do-while loop, som er fint for bruker-interaktiv 298 00:12:59,530 --> 00:13:01,980 programmer der du trenger for å fortelle brukeren om å gjøre noe. 299 00:13:01,980 --> 00:13:05,190 Og hvis de ikke samarbeider, roper du på dem eller avvise deres innspill. 300 00:13:05,190 --> 00:13:11,610 Case in point, jeg kommer til å gjøre linjene 19 til 24 så lenge brukeren har 301 00:13:11,610 --> 00:13:14,310 ikke gitt meg et positivt tall. 302 00:13:14,310 --> 00:13:20,400 Nå er denne detalj her på linje 18, hvorfor jeg erklærer n over hele denne 303 00:13:20,400 --> 00:13:24,490 looping konstruere motsetning til rett ved siden av linje 22 hvor jeg 304 00:13:24,490 --> 00:13:26,880 faktisk har lyst til å få n? 305 00:13:26,880 --> 00:13:27,330 Ja? 306 00:13:27,330 --> 00:13:27,780 [Uhørlig] 307 00:13:27,780 --> 00:13:29,040 >> DAVID J. MALAN: Ja, så denne utgaven av omfanget. 308 00:13:29,040 --> 00:13:30,850 Og i lekmann sikt, hva omfanget refererer til? 309 00:13:34,690 --> 00:13:36,610 Ja? 310 00:13:36,610 --> 00:13:37,860 [Uhørlig] 311 00:13:40,040 --> 00:13:41,105 DAVID J. MALAN: Kan du snakke litt høyere? 312 00:13:41,105 --> 00:13:43,450 SPEAKER 1: Hvor du kan få tilgang til et bestemt variabel. 313 00:13:43,450 --> 00:13:45,170 DAVID J. MALAN: Perfect. 314 00:13:45,170 --> 00:13:47,360 Hvor du kan få tilgang til en bestemt variabel. 315 00:13:47,360 --> 00:13:50,400 Og generelt, tommelfingerregelen hittil har vært at omfanget av noen 316 00:13:50,400 --> 00:13:55,860 variabelen er definert av de nyeste klammeparentes som du har sett. 317 00:13:55,860 --> 00:14:02,010 Og så i dette tilfellet, hvis jeg har gjort feil i å erklære n på linje 22, 318 00:14:02,010 --> 00:14:03,010 den linjen ville fungere. 319 00:14:03,010 --> 00:14:10,990 Jeg ville få en int, og jeg ville sette det inn i den variable n i linje 22. 320 00:14:10,990 --> 00:14:16,900 Men hvilken linje med kode ville nå har ingen anelse om hva jeg snakker om? 321 00:14:16,900 --> 00:14:22,650 Så 25, og det viser seg 24, så vel, fordi i dette tilfellet, faller den utenfor 322 00:14:22,650 --> 00:14:23,610 av klammeparentes. 323 00:14:23,610 --> 00:14:27,280 Så bare en liten bit av en ordensforstyrrelser, men veldig enkelt løses ved å erklære 324 00:14:27,280 --> 00:14:30,140 den variable utenfor funksjonen selv. 325 00:14:30,140 --> 00:14:32,600 >> Nå får vi se senere i dag, kan du gå ett steg videre. 326 00:14:32,600 --> 00:14:34,860 Og du kan selv få litt lat - 327 00:14:34,860 --> 00:14:37,320 og dette er ikke å bli anbefalt, generelt - 328 00:14:37,320 --> 00:14:42,260 men du kan selv bli lat og sette en variabel globalt, så å si, ikke 329 00:14:42,260 --> 00:14:46,670 innsiden av en funksjon, ikke inne i en løkke, men i selve filen, utenfor 330 00:14:46,670 --> 00:14:49,600 av alle funksjonene du har skrevet, som jeg gjorde her på linje 15. 331 00:14:49,600 --> 00:14:51,160 Men dette er generelt mislikt. 332 00:14:51,160 --> 00:14:55,680 Men innser at dette er en løsning noen ganger til andre problemer, som vi vil 333 00:14:55,680 --> 00:14:56,620 slutt se. 334 00:14:56,620 --> 00:14:58,130 Så for nå, vil vi la det slik. 335 00:14:58,130 --> 00:15:01,030 Men la oss se om vi kan omskrive dette bare for å begynne å uttrykke oss selv en 336 00:15:01,030 --> 00:15:01,990 litt annerledes. 337 00:15:01,990 --> 00:15:05,330 >> Så dette programmet, bare for å være klar, er positive1. 338 00:15:05,330 --> 00:15:11,810 La meg gå videre her og i min terminal-vinduet gjør positive1, Enter. 339 00:15:11,810 --> 00:15:12,740 Sammenstiller, ok. 340 00:15:12,740 --> 00:15:14,910 Jeg kommer til å kjøre positive1, trykk på Enter. 341 00:15:14,910 --> 00:15:16,820 Jeg krever at du gir meg et positivt heltall. 342 00:15:16,820 --> 00:15:18,260 Jeg vil si -1. 343 00:15:18,260 --> 00:15:18,910 Som ikke fungerte. 344 00:15:18,910 --> 00:15:22,150 0, 99, som synes å fungere. 345 00:15:22,150 --> 00:15:23,570 Kanskje ikke den mest grundige test. 346 00:15:23,570 --> 00:15:26,480 Men minst det er en fin sunn fornuft sjekk at vi er på rett spor. 347 00:15:26,480 --> 00:15:29,240 Så nå la meg gå videre og åpne versjon to av dette. 348 00:15:29,240 --> 00:15:32,500 Og hva er annerledes allerede? 349 00:15:32,500 --> 00:15:35,140 Det implementerer det samme. 350 00:15:35,140 --> 00:15:40,660 Men hva hoppe ut som klart annerledes denne gangen? 351 00:15:40,660 --> 00:15:42,560 Ja, så dette bool i grønt. 352 00:15:42,560 --> 00:15:45,980 Gedit har uthevet i grønt dette søkeordet kjent som bool, 353 00:15:45,980 --> 00:15:47,000 som er en datatype. 354 00:15:47,000 --> 00:15:51,080 Det kommer ikke innebygd i alle versjoner av C. Du må inkludere en 355 00:15:51,080 --> 00:15:52,010 bestemt bibliotek. 356 00:15:52,010 --> 00:15:54,770 I vårt tilfelle, inkludert jeg CS50 biblioteket slik at vi 357 00:15:54,770 --> 00:15:56,460 har tilgang til bool. 358 00:15:56,460 --> 00:15:59,810 Men i linje 18, synes vi å ha en boolsk verdi her kalt takknemlig. 359 00:15:59,810 --> 00:16:01,040 Så jeg kunne ha kalt dette noe. 360 00:16:01,040 --> 00:16:04,500 Men jeg kalte det takknemlig bare for å slags formidle noe semantisk mening. 361 00:16:04,500 --> 00:16:07,930 Så først på linje 18, er jeg tydeligvis ikke takknemlig fordi 362 00:16:07,930 --> 00:16:12,150 Boolean verdi takknemlig er initialisert til false i linje 18. 363 00:16:12,150 --> 00:16:16,890 Og det synes det jeg har gjort her i linjer 21 til 23 er jeg bare 364 00:16:16,890 --> 00:16:18,610 slags omskrevet min logikk. 365 00:16:18,610 --> 00:16:21,020 Så ingen funksjonelt forskjellige. 366 00:16:21,020 --> 00:16:26,940 Men i linje 22 nå, jeg sjekke om int brukeren har gitt er større enn 367 00:16:26,940 --> 00:16:31,120 0, så jeg bare endre verdien av takknemlig til sann. 368 00:16:31,120 --> 00:16:32,290 Og hvorfor gjør jeg det? 369 00:16:32,290 --> 00:16:35,600 Fordi i linje 25, tilsynelatende, jeg kommer til å sjekke en tilstand. 370 00:16:35,600 --> 00:16:39,380 Gjør dette løkke mens takknemlig er falsk. 371 00:16:39,380 --> 00:16:43,610 >> Så jeg foreslår dette som et alternativ til versjon fordi det er minst en 372 00:16:43,610 --> 00:16:45,130 litt mer intuitiv, kanskje. 373 00:16:45,130 --> 00:16:46,900 Det er litt mer jordet på engelsk. 374 00:16:46,900 --> 00:16:51,710 Så gjør du følgende mens du ikke er takknemlig eller mens takknemlig er falsk. 375 00:16:51,710 --> 00:16:55,890 Og denne gangen også, jeg tydeligvis ikke lyst til å huske hva brukeren har skrevet 376 00:16:55,890 --> 00:16:57,730 i fordi varsel er det ingen variabel n. 377 00:16:57,730 --> 00:16:58,650 Så egentlig, jeg - 378 00:16:58,650 --> 00:17:00,080 en liten hvit løgn der. 379 00:17:00,080 --> 00:17:02,770 Funksjonelt, er programmet litt annerledes når vi kommer til bunns i 380 00:17:02,770 --> 00:17:04,819 det fordi jeg ikke husker hva n er. 381 00:17:04,819 --> 00:17:09,579 Men jeg ønsket å demonstrere her også at selv om vi har sett GetInt og 382 00:17:09,579 --> 00:17:13,920 GetString som brukes på den høyre side av et likhetstegn hittil slik at 383 00:17:13,920 --> 00:17:17,160 vi husker verdien, teknisk, det er ikke strengt nødvendig. 384 00:17:17,160 --> 00:17:20,950 Hvis uansett grunn bare du ikke lyst til å lagre verdien, du bare ønsker 385 00:17:20,950 --> 00:17:25,710 å sjekke verdien merke til at vi bare kan skrive dette som GetInt åpen 386 00:17:25,710 --> 00:17:27,000 paren, nær paren. 387 00:17:27,000 --> 00:17:30,460 At funksjonen skal returnere en verdi, som vi har sagt. 388 00:17:30,460 --> 00:17:32,010 Det kommer til å gi deg tilbake en int. 389 00:17:32,010 --> 00:17:36,450 Og så hvis du mentalt tenker på at dette skjer, når jeg skriver i 99, GetInt 390 00:17:36,450 --> 00:17:38,160 returnerer tallet 99. 391 00:17:38,160 --> 00:17:41,330 Og så konseptuelt, er det som om min kode var faktisk dette. 392 00:17:41,330 --> 00:17:45,880 Så hvis 99 er faktisk større enn 0, så takknemlig blir sant. 393 00:17:45,880 --> 00:17:50,420 Deretter linje 25 innser ooh, vi gjort fordi jeg er nå takknemlig. 394 00:17:50,420 --> 00:17:54,590 Og i linje 26, vi bare si, takk for den positive heltall, uansett hva det 395 00:17:54,590 --> 00:17:55,710 skjedd å være. 396 00:17:55,710 --> 00:17:58,900 >> Nå la oss gjøre litt syntaktisk sukker her, så å si. 397 00:17:58,900 --> 00:18:02,990 La oss se om vi kan rydde opp denne linjen 25 med denne tredje og siste varians 398 00:18:02,990 --> 00:18:04,640 i positive3. 399 00:18:04,640 --> 00:18:08,250 Så merker den eneste forskjellen nå er hvilken linje av koden? 400 00:18:11,930 --> 00:18:13,260 Ja, så 25. 401 00:18:13,260 --> 00:18:15,520 Og vi har ikke egentlig sett dette trikset ennå. 402 00:18:15,520 --> 00:18:19,510 Men vi fikk se utropstegn på mandag, som betegner hva? 403 00:18:19,510 --> 00:18:20,970 Så ikke, eller negasjon. 404 00:18:20,970 --> 00:18:23,460 Så ta en boolsk verdi og sprelle med verdi. 405 00:18:23,460 --> 00:18:24,390 Sant blir falskt. 406 00:18:24,390 --> 00:18:25,500 Falske blir sant. 407 00:18:25,500 --> 00:18:28,910 Så dette, ville jeg foreslå, er enda litt mer intuitiv av en måte å 408 00:18:28,910 --> 00:18:32,200 skrive koden fordi jeg fortsatt initialisere takknemlig for falsk. 409 00:18:32,200 --> 00:18:33,530 Jeg fortsatt gjøre følgende. 410 00:18:33,530 --> 00:18:35,700 Jeg satt takknemlig å true når den tid kommer. 411 00:18:35,700 --> 00:18:40,690 Men nå kan du egentlig bare oversette denne koden verbalt venstre til høyre, 412 00:18:40,690 --> 00:18:42,550 mens ikke takknemlig. 413 00:18:42,550 --> 00:18:46,170 Fordi bang, eller utropstegn, betegner begrepet ikke, så mens 414 00:18:46,170 --> 00:18:47,010 ikke takknemlig. 415 00:18:47,010 --> 00:18:49,740 >> Så igjen, har vi ikke innført noen nye konsepter per se. 416 00:18:49,740 --> 00:18:53,230 Vi har snakket om boolske tilbake når vi spilte med Scratch. 417 00:18:53,230 --> 00:18:55,690 Men innser nå kan vi bare begynne å skrive vår kode i 418 00:18:55,690 --> 00:18:56,550 mange forskjellige måter. 419 00:18:56,550 --> 00:19:00,010 Så spesielt i pset1, hvis du er liksom sliter med å finne ut en måte å 420 00:19:00,010 --> 00:19:03,400 skrive noen program, er du flaks odds fordi det kommer til å være noen 421 00:19:03,400 --> 00:19:05,780 antall løsninger som du kan skje på. 422 00:19:05,780 --> 00:19:09,850 For eksempel er dette bare tre for selv de enkleste programmene. 423 00:19:09,850 --> 00:19:10,180 OK. 424 00:19:10,180 --> 00:19:13,860 Og nå husker på mandag, vi igjen på dette notatet med retur verdier. 425 00:19:13,860 --> 00:19:18,280 Så for aller første gang, skrev vi et program som ikke bare har main, 426 00:19:18,280 --> 00:19:22,240 det har også sin egen egendefinert funksjon som jeg skrev her. 427 00:19:22,240 --> 00:19:26,640 Så i tråd 31 gjennom 34, har jeg implementert en kube funksjon. 428 00:19:26,640 --> 00:19:27,800 Det er ikke komplisert. 429 00:19:27,800 --> 00:19:29,830 Det er bare en ganger en ganger en, i dette tilfellet. 430 00:19:29,830 --> 00:19:34,920 Men det som er viktig om det er at jeg tar inn i form av en og 431 00:19:34,920 --> 00:19:38,910 Jeg er tilbake ut i form av en ganger en ganger en. 432 00:19:38,910 --> 00:19:43,940 >> Så nå har jeg muligheten, mye som jeg brukte til med printf alene, å ringe 433 00:19:43,940 --> 00:19:47,120 denne funksjonen ved å kalle kuben funksjonen. 434 00:19:47,120 --> 00:19:49,470 Og kuben funksjonen tar noen innspill. 435 00:19:49,470 --> 00:19:52,030 Og kuben funksjonen returnerer noen utgang. 436 00:19:52,030 --> 00:19:56,660 Og så derimot, printf bare gjorde noe. 437 00:19:56,660 --> 00:19:59,490 Det kom ikke tilbake noe som vi brydde seg om - selv om, som en 438 00:19:59,490 --> 00:20:00,820 side, gjør det returnere en verdi. 439 00:20:00,820 --> 00:20:02,650 Du bare generelt ignorere det. 440 00:20:02,650 --> 00:20:04,000 Printf bare gjorde noe. 441 00:20:04,000 --> 00:20:06,220 Den hadde en bivirkning av utskrift til skjermen. 442 00:20:06,220 --> 00:20:09,480 I motsetning her, har vi kuben funksjonen, som 443 00:20:09,480 --> 00:20:11,400 faktisk returnerer noe. 444 00:20:11,400 --> 00:20:12,960 >> Så dette er generelt - 445 00:20:12,960 --> 00:20:15,260 for de som er kjent med dette, er det en ganske grei idé. 446 00:20:15,260 --> 00:20:18,460 Men for de mindre kjent med denne ideen om bestått i innganger og få 447 00:20:18,460 --> 00:20:21,700 tilbake utganger, la oss prøve bare noe super enkelt. 448 00:20:21,700 --> 00:20:25,180 Er noen komfortabel kommer opp på scenen kort? 449 00:20:25,180 --> 00:20:27,460 Du må være komfortabel med et kamera på deg, så vel. 450 00:20:27,460 --> 00:20:27,640 Ja. 451 00:20:27,640 --> 00:20:28,610 Ok, hva heter du? 452 00:20:28,610 --> 00:20:29,020 KEN: Ken. 453 00:20:29,020 --> 00:20:29,420 DAVID J. MALAN: Ken. 454 00:20:29,420 --> 00:20:29,810 Greit, Ken. 455 00:20:29,810 --> 00:20:31,060 Kom opp. 456 00:20:31,060 --> 00:20:34,660 Så Ken kommer til å være en funksjon av sorterer her. 457 00:20:34,660 --> 00:20:35,760 Og la oss gå videre og gjøre dette. 458 00:20:35,760 --> 00:20:38,790 La oss få litt fancy. 459 00:20:38,790 --> 00:20:39,770 Hyggelig å treffe deg. 460 00:20:39,770 --> 00:20:41,010 Velkommen til sentrum scene. 461 00:20:41,010 --> 00:20:41,980 OK. 462 00:20:41,980 --> 00:20:45,590 La oss hit på denne knappen her. 463 00:20:45,590 --> 00:20:46,420 OK. 464 00:20:46,420 --> 00:20:49,490 Så her har du en moderne tavle. 465 00:20:49,490 --> 00:20:53,050 Og hva jeg er den viktigste funksjonen, for eksempel. 466 00:20:53,050 --> 00:20:55,990 Og jeg har ikke en iPad i hånden. 467 00:20:55,990 --> 00:20:59,000 Jeg vet egentlig ikke huske hvordan du - vel, egentlig, kan ikke si det. 468 00:20:59,000 --> 00:21:02,200 Jeg har egentlig ikke god håndskrift. 469 00:21:02,200 --> 00:21:05,260 Og så derfor vil jeg at du skal skrive ut noe på skjermen for meg. 470 00:21:05,260 --> 00:21:07,470 >> Så jeg blir hovedprogrammet. 471 00:21:07,470 --> 00:21:15,060 Og jeg kommer til å ha dere si dette ved å skrive det i min kylling scratch og 472 00:21:15,060 --> 00:21:16,600 så passerer du en inngang. 473 00:21:16,600 --> 00:21:20,000 Så som dum om denne øvelsen er, oppfatningen av funksjoner og ringer en 474 00:21:20,000 --> 00:21:22,260 funksjon og returnere en funksjon egentlig koker ned til dette. 475 00:21:22,260 --> 00:21:23,120 Jeg er viktigste. 476 00:21:23,120 --> 00:21:26,270 Jeg har nettopp skrevet printf ("noe") på skjermen. 477 00:21:26,270 --> 00:21:27,470 Jeg kjører dette programmet. 478 00:21:27,470 --> 00:21:30,900 Og så snart printf blir kalt, tar det ett argument - eller en parameter, 479 00:21:30,900 --> 00:21:31,660 noen ganger - 480 00:21:31,660 --> 00:21:32,780 mellom doble anførselstegn. 481 00:21:32,780 --> 00:21:33,960 Her er det argumentet. 482 00:21:33,960 --> 00:21:35,740 Eg gir den til Ken. 483 00:21:35,740 --> 00:21:39,390 Nå er han en svart boks skrevet et antall år siden at tilsynelatende 484 00:21:39,390 --> 00:21:41,070 bare vet hvordan du skriver ut ting på skjermen. 485 00:21:41,070 --> 00:21:42,320 >> Så, utføre. 486 00:21:48,842 --> 00:21:49,900 Det er ikke dårlig. 487 00:21:49,900 --> 00:21:50,890 Så, veldig bra. 488 00:21:50,890 --> 00:21:52,900 Så nå Ken gjøres utfører. 489 00:21:52,900 --> 00:21:55,810 Trenger han å gi meg noe tilbake? 490 00:21:55,810 --> 00:21:57,240 Så ikke at vi har sett så langt. 491 00:21:57,240 --> 00:21:59,230 Igjen, ikke printf faktisk tilbake et nummer. 492 00:21:59,230 --> 00:22:01,640 Men vi kommer til å ignorere det for nå fordi vi aldri har brukt det. 493 00:22:01,640 --> 00:22:03,400 Så det er det for Ken. 494 00:22:03,400 --> 00:22:06,650 Og så nå main kommer tilbake for å utføre - 495 00:22:06,650 --> 00:22:09,630 main tar over kontrollen av programmet igjen fordi den linjen med kode, 496 00:22:09,630 --> 00:22:11,010 printf, gjøres utfører. 497 00:22:11,010 --> 00:22:13,890 Og vi går om vår måte å utføre hva andre linjer er der. 498 00:22:13,890 --> 00:22:14,130 >> OK. 499 00:22:14,130 --> 00:22:17,080 Så nå skal vi prøve en litt annen eksempel. 500 00:22:17,080 --> 00:22:22,430 Og denne gangen her, la oss først tømme skjermen her. 501 00:22:22,430 --> 00:22:24,670 Og denne gangen vil vi gjøre det cubing funksjonen. 502 00:22:24,670 --> 00:22:27,350 Men denne gangen, jeg forventer en produksjon verdi. 503 00:22:27,350 --> 00:22:28,630 Så la oss gå videre og gjøre dette. 504 00:22:28,630 --> 00:22:35,680 Så nå har jeg en linje med kode som sier x = cube (x). 505 00:22:35,680 --> 00:22:36,930 Så egentlig let's - 506 00:22:41,450 --> 00:22:43,940 kodelinjen, tilbakekalling, ser ut som dette. 507 00:22:43,940 --> 00:22:45,960 x = cube (x). 508 00:22:45,960 --> 00:22:48,100 Så hvordan dette kommer til å fungere? 509 00:22:48,100 --> 00:22:50,820 Så la oss gå videre og gi deg en hvit skjerm igjen. 510 00:22:50,820 --> 00:22:55,000 Og jeg kommer til å skrive nå ned verdien av x, som på dette tidspunktet i 511 00:22:55,000 --> 00:23:01,080 tid skjer for å være, la oss si, 2, for å holde det enkelt. 512 00:23:01,080 --> 00:23:04,890 Så jeg har skrevet ned på et stykke papir verdien av 2, 513 00:23:04,890 --> 00:23:06,100 som er min verdi x. 514 00:23:06,100 --> 00:23:08,250 Jeg leverer den til Ken. 515 00:23:08,250 --> 00:23:09,200 KEN: Og jeg bare skrive svaret? 516 00:23:09,200 --> 00:23:12,660 DAVID J. MALAN: Ja, la oss bare skrive svaret. 517 00:23:12,660 --> 00:23:13,030 Okay. 518 00:23:13,030 --> 00:23:16,280 Og nå har han å returnere meg noe. 519 00:23:16,280 --> 00:23:17,560 Så - 520 00:23:17,560 --> 00:23:18,170 perfekt. 521 00:23:18,170 --> 00:23:18,840 Hyggelig segue. 522 00:23:18,840 --> 00:23:21,970 >> Så nå er han rekker meg tilbake verdien av 8, i dette tilfellet. 523 00:23:21,970 --> 00:23:23,220 Og hva gjør jeg med det? 524 00:23:23,220 --> 00:23:26,130 Vel, faktisk, la oss se. 525 00:23:26,130 --> 00:23:26,640 Få denne retten. 526 00:23:26,640 --> 00:23:27,880 Hva skal jeg gjøre med det? 527 00:23:27,880 --> 00:23:31,900 Nå skal jeg ta denne verdien, og faktisk lagre den i dem 528 00:23:31,900 --> 00:23:33,400 samme biter i minnet. 529 00:23:33,400 --> 00:23:35,030 Men legg merke til, jeg slags sliter her. 530 00:23:35,030 --> 00:23:38,280 Jeg er litt forvirret fordi der jeg faktisk skrive verdien av x? 531 00:23:38,280 --> 00:23:41,840 Fordi det jeg har nettopp gjort er fysisk hånd Ken et stykke papir 532 00:23:41,840 --> 00:23:44,400 som hadde verdien 2, som var x. 533 00:23:44,400 --> 00:23:46,300 Og ja, det er nettopp det som skjer. 534 00:23:46,300 --> 00:23:50,100 Så det viser seg at når du kaller en funksjon, og du passerer i en krangel 535 00:23:50,100 --> 00:23:54,130 som "Hello World", eller du passerer i en krangel som 2, generelt, er du 536 00:23:54,130 --> 00:23:56,720 passerer i en kopi av argumentet. 537 00:23:56,720 --> 00:24:01,020 Og så akkurat som jeg skrev ned nummeret to her og ga den til Ken, det må 538 00:24:01,020 --> 00:24:04,760 mener at jeg fortsatt har en kopi av verdien 2 et sted. 539 00:24:04,760 --> 00:24:08,140 Fordi faktisk, nå som jeg har fått tilbake verdien 8, jeg trenger å gå tilbake i 540 00:24:08,140 --> 00:24:12,010 RAM og faktisk skrive ned 8 der jeg en gang hadde nummer 2. 541 00:24:12,010 --> 00:24:15,720 >> Så visuelt huske denne oppfatningen av passerer i bokstavelig 542 00:24:15,720 --> 00:24:16,730 en kopi av verdien. 543 00:24:16,730 --> 00:24:19,570 Ken gjør sin ting, gir meg noe tilbake - i dette tilfellet, 544 00:24:19,570 --> 00:24:20,820 en verdi som 8. 545 00:24:20,820 --> 00:24:22,660 Og da må jeg gjøre noe med den verdien hvis jeg 546 00:24:22,660 --> 00:24:24,880 ønsker å holde den rundt. 547 00:24:24,880 --> 00:24:29,470 Så alt dette vil være alt for kjent før lenge. 548 00:24:29,470 --> 00:24:33,082 Takk så mye for denne demoen her, Ken. 549 00:24:33,082 --> 00:24:34,820 OK. 550 00:24:34,820 --> 00:24:36,720 Veldig godt gjort. 551 00:24:36,720 --> 00:24:40,610 Så la oss se hvordan det til slutt gjelder noen av funksjonen 552 00:24:40,610 --> 00:24:42,270 ringer som vi har gjort her. 553 00:24:42,270 --> 00:24:47,610 Så la meg gå videre og bringe oss tilbake til den cubing eksempel her. 554 00:24:47,610 --> 00:24:53,080 Og legg merke til at hvis vi ønsker å faktisk begynne å ta dette videre, skal vi 555 00:24:53,080 --> 00:24:57,050 til å være oppmerksom på det faktum at antall x som blir vedtatt i 556 00:24:57,050 --> 00:25:01,390 her er forskjellig fra det som faktisk blir vedtatt i funksjon. 557 00:25:01,390 --> 00:25:03,940 Så igjen, dette vedtatt av kopien kommer til å bli ganske 558 00:25:03,940 --> 00:25:05,620 germane i bare et øyeblikk. 559 00:25:05,620 --> 00:25:09,320 >> Så la oss ta en titt på noe som ikke helt fungerer riktig ennå. 560 00:25:09,320 --> 00:25:11,790 Jeg kommer til å gå videre og åpner en tredje buggy eksempel, som 561 00:25:11,790 --> 00:25:13,560 er feil av naturen. 562 00:25:13,560 --> 00:25:18,070 Og det heter buggy3, og den implementerer en byttering funksjon. 563 00:25:18,070 --> 00:25:23,500 Så her har vi en viktig funksjon som har x og y vilkårlig initialisert til 564 00:25:23,500 --> 00:25:24,720 1 og 2, henholdsvis. 565 00:25:24,720 --> 00:25:27,590 Vi kunne bruke GetInt, men vi trenger bare en enkel øvelse. 566 00:25:27,590 --> 00:25:29,680 Så det er hardkodet som 1 og 2. 567 00:25:29,680 --> 00:25:35,330 I linjene 21 og 22, vi tilsynelatende skrive ut x og y, ett per linje. 568 00:25:35,330 --> 00:25:39,620 Deretter, på linje 23, hevder jeg at jeg bytte disse verdiene, dot, dot, dot. 569 00:25:39,620 --> 00:25:43,030 Jeg tydeligvis kalle en funksjon på linje 24 som heter swap 570 00:25:43,030 --> 00:25:44,000 som tar to argumenter. 571 00:25:44,000 --> 00:25:46,430 Det er helt legit for funksjoner for å ta to argumenter. 572 00:25:46,430 --> 00:25:48,220 Vi har sett printf gjøre det allerede. 573 00:25:48,220 --> 00:25:50,370 Så swap tar tilsynelatende x og y. 574 00:25:50,370 --> 00:25:53,010 Og som navnet antyder, ville jeg håper at det kommer til å 575 00:25:53,010 --> 00:25:54,320 bytte disse to verdiene. 576 00:25:54,320 --> 00:25:57,560 Så da jeg hevder på linje 25, byttet. 577 00:25:57,560 --> 00:26:01,570 Og jeg skrive x og y under forutsetning av at 578 00:26:01,570 --> 00:26:02,830 de har faktisk blitt byttet. 579 00:26:02,830 --> 00:26:04,370 Men hvis jeg faktisk kjøre dette programmet - 580 00:26:04,370 --> 00:26:06,060 la meg åpne opp en terminal vindu. 581 00:26:06,060 --> 00:26:07,750 La meg gjøre buggy3. 582 00:26:07,750 --> 00:26:09,970 Som navnet antyder, er dette ikke kommer til å ende godt. 583 00:26:09,970 --> 00:26:14,690 Fordi når jeg trykker Enter merke til at x er en. 584 00:26:14,690 --> 00:26:15,720 y er to. 585 00:26:15,720 --> 00:26:19,160 Og likevel på slutten av programmet, er de fortsatt, faktisk, det samme. 586 00:26:19,160 --> 00:26:22,760 >> Så basert på demonstrasjonen akkurat nå med Ken, hva som faktisk skjer? 587 00:26:22,760 --> 00:26:24,660 Vel, la oss dykke inn i denne swap-funksjon. 588 00:26:24,660 --> 00:26:25,800 Det er super kort. 589 00:26:25,800 --> 00:26:28,020 Det er bare noen få linjer med kode lang. 590 00:26:28,020 --> 00:26:32,810 Men hva er det grunnleggende problemet basert på det enkle historien fortalt 591 00:26:32,810 --> 00:26:34,270 opp her med Ken? 592 00:26:34,270 --> 00:26:36,115 Hvorfor er swap brutt? 593 00:26:36,115 --> 00:26:37,365 [Uhørlig] 594 00:26:39,840 --> 00:26:40,460 Akkurat. 595 00:26:40,460 --> 00:26:43,610 Så vi lagring til en kopi, ikke variabelen selv. 596 00:26:43,610 --> 00:26:46,810 Med andre ord, tar swap tilsynelatende to argumenter, en int. 597 00:26:46,810 --> 00:26:49,370 Og det er vilkårlig kalles a og b. 598 00:26:49,370 --> 00:26:54,430 Og her oppe, jeg har gått i x og y, som er henholdsvis 1 og 2. 599 00:26:54,430 --> 00:26:56,580 Men jeg er ikke bokstavelig talt passerer i x. 600 00:26:56,580 --> 00:26:58,410 Jeg er ikke bokstavelig passerer y. 601 00:26:58,410 --> 00:27:01,230 Jeg passerer en kopi av x og en kopi av y. 602 00:27:01,230 --> 00:27:05,180 Det er som nesten som om du har kopiert og limt inn i bytte verdier som 603 00:27:05,180 --> 00:27:07,440 du vil den skal faktisk manipulere. 604 00:27:07,440 --> 00:27:11,970 Så hvis det er tilfelle, da jeg, programmet, begynner utfører 605 00:27:11,970 --> 00:27:14,140 linje 35, og deretter 36 - 606 00:27:14,140 --> 00:27:17,740 når jeg kommer til linje 37, på dette punktet i historien, er det verdien av en? 607 00:27:20,740 --> 00:27:24,850 På dette punktet i historien, linje 37, hvilken verdi av en på dette punktet? 608 00:27:24,850 --> 00:27:25,980 Så det skulle bare være en. 609 00:27:25,980 --> 00:27:26,170 Rett? 610 00:27:26,170 --> 00:27:29,100 Fordi x ble vedtatt i som det første argumentet. 611 00:27:29,100 --> 00:27:33,150 Og denne funksjonen bare vilkårlig kaller sin første argumentet, en. 612 00:27:33,150 --> 00:27:35,130 Tilsvarende er y, det andre argumentet. 613 00:27:35,130 --> 00:27:37,930 Og det er bare vilkårlig kaller det andre argumentet b. 614 00:27:37,930 --> 00:27:40,510 >> Nå er denne motsetningen er faktisk ganske enkelt forklart. 615 00:27:40,510 --> 00:27:40,880 Tenk på det. 616 00:27:40,880 --> 00:27:42,980 Ingen av oss har møtt personen som skrev printf. 617 00:27:42,980 --> 00:27:49,880 Så sikkert, har han eller hun ingen anelse om hva våre variabler 30 år senere kommer 618 00:27:49,880 --> 00:27:50,710 å bli kalt. 619 00:27:50,710 --> 00:27:55,110 Så det må være et skille mellom det du kaller variabler i 620 00:27:55,110 --> 00:27:59,960 funksjoner du skriver og hva du kaller variabler i funksjoner du er 621 00:27:59,960 --> 00:28:01,770 ringer eller bruker. 622 00:28:01,770 --> 00:28:05,120 Så med andre ord, jeg har skrevet mine variabler som x og y. 623 00:28:05,120 --> 00:28:08,060 Men hvis noen andre hadde skrevet swap-funksjonen, vil han eller hun sikkert 624 00:28:08,060 --> 00:28:10,480 ville ikke vite hva mine variabler kommer til å bli kalt. 625 00:28:10,480 --> 00:28:13,850 Så skjønner at dette er grunnen til at du har denne dualiteten av navn. 626 00:28:13,850 --> 00:28:16,800 Teknisk sett kunne jeg gjøre dette ved en tilfeldighet. 627 00:28:16,800 --> 00:28:19,750 Men de ville fortsatt være bestått som kopier. 628 00:28:19,750 --> 00:28:22,940 Det ville bare være en ren tilfeldighet estetisk hvis den personen som skrev 629 00:28:22,940 --> 00:28:25,590 swap hadde brukt de samme navnene. 630 00:28:25,590 --> 00:28:25,930 >> OK. 631 00:28:25,930 --> 00:28:29,010 Så på dette punktet i historien, linje 37, er en 1. 632 00:28:29,010 --> 00:28:30,410 b er 2. 633 00:28:30,410 --> 00:28:32,040 Og nå har jeg fortsette å bytte dem. 634 00:28:32,040 --> 00:28:34,730 Vel først av alt, la meg faktisk gjør dette mye enklere. 635 00:28:34,730 --> 00:28:36,500 Jeg vet ikke hva disse tre linjer med kode gjorde. 636 00:28:36,500 --> 00:28:37,370 La meg bare gjøre dette. 637 00:28:37,370 --> 00:28:38,850 b får en. 638 00:28:38,850 --> 00:28:40,170 en får b. 639 00:28:40,170 --> 00:28:41,450 Ferdig. 640 00:28:41,450 --> 00:28:43,540 Hvorfor er denne brutt, logisk? 641 00:28:46,980 --> 00:28:48,590 Det er slags intuitiv ting, ikke sant? 642 00:28:48,590 --> 00:28:50,640 Så en blir b. 643 00:28:50,640 --> 00:28:52,450 Og b blir en. 644 00:28:52,450 --> 00:28:55,410 Men problemet er at så snart linje 37 kjører, hva er 645 00:28:55,410 --> 00:28:58,170 verdien av a og b? 646 00:28:58,170 --> 00:28:59,070 Det samme, en. 647 00:28:59,070 --> 00:29:03,460 Fordi du har angrepet, så å si, har du endret b for å tilsvare en. 648 00:29:03,460 --> 00:29:06,000 Så når linje 37 er utført, er det flott. 649 00:29:06,000 --> 00:29:09,940 Du har nå to eksemplarer av nummer 1 på innsiden av denne funksjonen. 650 00:29:09,940 --> 00:29:14,720 Så når du sier i tråd 38, får en b, vel, er du slags skrudd. 651 00:29:14,720 --> 00:29:17,370 Fordi du bare tildele 1-1. 652 00:29:17,370 --> 00:29:20,400 Du har slags mistet verdien du brydde deg om. 653 00:29:20,400 --> 00:29:22,910 >> Så i den opprinnelige versjonen av dette, legge merke til hva jeg gjorde. 654 00:29:22,910 --> 00:29:26,620 Jeg i stedet hadde en tredje linje med kode som så ut som dette. 655 00:29:26,620 --> 00:29:29,910 Jeg erklærer en midlertidig variabel - tmp er et svært vanlig navn 656 00:29:29,910 --> 00:29:31,240 for en midlertidig variabel. 657 00:29:31,240 --> 00:29:34,280 Det er en int fordi det har å matche det jeg ønsker å lage en kopi av. 658 00:29:34,280 --> 00:29:39,720 Jeg lagrer en kopi av en innsiden av tmp. Så når linje 37 har utført, 659 00:29:39,720 --> 00:29:41,390 verdien av a er - 660 00:29:41,390 --> 00:29:42,970 rask tilregnelighet sjekk - 661 00:29:42,970 --> 00:29:43,460 1. 662 00:29:43,460 --> 00:29:45,780 Verdien av b er 2. 663 00:29:45,780 --> 00:29:48,470 Og verdien av tmp er også en. 664 00:29:48,470 --> 00:29:51,470 Så nå er jeg utføre linje 38. 665 00:29:51,470 --> 00:29:57,180 Så når linjen 38 utfører, tar en på verdien av b. 666 00:29:57,180 --> 00:29:58,510 Og b var to. 667 00:29:58,510 --> 00:30:00,500 Så en er nå 2. 668 00:30:00,500 --> 00:30:03,110 Så på dette punktet i historien, er en 2, er b 2, 669 00:30:03,110 --> 00:30:05,130 og tmp er en. 670 00:30:05,130 --> 00:30:09,330 Så nå logisk, kan vi bare plop tmp verdi inn b. 671 00:30:09,330 --> 00:30:10,690 Og vi er ferdige. 672 00:30:10,690 --> 00:30:12,170 >> Så vi har løst det problemet. 673 00:30:12,170 --> 00:30:16,040 Dessverre, når jeg kjører dette programmet i dette skjemaet, er det ikke egentlig bytte 674 00:30:16,040 --> 00:30:17,700 noen verdier. 675 00:30:17,700 --> 00:30:18,950 Men for å være klar, hvorfor? 676 00:30:23,420 --> 00:30:26,310 Jeg fikset den logiske problemet fra bare et øyeblikk siden. 677 00:30:26,310 --> 00:30:31,150 Men igjen, hvis jeg kjører dette programmet, x og y forblir uendret ved utgangen av 678 00:30:31,150 --> 00:30:33,834 programmets gjennomføring. 679 00:30:33,834 --> 00:30:34,760 [Uhørlig] 680 00:30:34,760 --> 00:30:36,030 DAVID J. MALAN: Så vi har ikke returnert noe. 681 00:30:36,030 --> 00:30:36,960 Så det er sant. 682 00:30:36,960 --> 00:30:39,880 Men det viser seg at det er litt av et problem her fordi så langt, 683 00:30:39,880 --> 00:30:42,460 eneste vi har vært i stand til å returnere er én ting. 684 00:30:42,460 --> 00:30:46,540 Og dette er en begrensning av C. Du kan bare returnere virkelig en verdi, 685 00:30:46,540 --> 00:30:48,970 i så fall, jeg slags fast her 686 00:30:48,970 --> 00:30:51,805 fordi jeg kunne gå tilbake den nye verdien av x eller jeg kunne gå tilbake 687 00:30:51,805 --> 00:30:53,160 ny verdi av y. 688 00:30:53,160 --> 00:30:54,330 Men jeg vil begge tilbake. 689 00:30:54,330 --> 00:30:58,010 Så tilbake ikke er den enkle løsning her. 690 00:30:58,010 --> 00:30:59,770 Men problemet er fundamentalt hvorfor? 691 00:30:59,770 --> 00:31:03,270 Hva har vi egentlig byttet? 692 00:31:03,270 --> 00:31:04,010 a og b. 693 00:31:04,010 --> 00:31:07,670 Men a og b er kopier av x og y, slik at vi bare gjorde alt dette 694 00:31:07,670 --> 00:31:10,080 jobbe - vi bare brukt som tre minutter å snakke om swap 695 00:31:10,080 --> 00:31:11,680 funksjon og alle tre av disse størrelsene. 696 00:31:11,680 --> 00:31:15,090 Og det er flott, helt riktig i isolasjon. 697 00:31:15,090 --> 00:31:20,230 Men a og b omfang er bare i disse linjene her. 698 00:31:20,230 --> 00:31:24,130 Så akkurat som en for loop, hvis du deklarerer et heltall i inne i for 699 00:31:24,130 --> 00:31:27,400 loop - på samme måte, hvis du erklære a og b innsiden av en funksjon som 700 00:31:27,400 --> 00:31:30,550 har du skrevet, de er bare gyldig innsiden av denne funksjonen. 701 00:31:30,550 --> 00:31:35,020 Som betyr så snart swap er gjort utføring og vi går fra linje 24 til 702 00:31:35,020 --> 00:31:38,380 25 linje, x og y er ikke endret i det hele tatt. 703 00:31:38,380 --> 00:31:42,580 Du bare kastet bort en hel masse tid bytte kopier av variabler. 704 00:31:42,580 --> 00:31:46,490 >> Så det viser seg at løsningen på dette er faktisk ikke opplagt. 705 00:31:46,490 --> 00:31:49,210 Det er ikke helt tilstrekkelig til å returnere verdier fordi vi kan 706 00:31:49,210 --> 00:31:50,320 bare returnere en verdi. 707 00:31:50,320 --> 00:31:53,370 Og jeg virkelig ønsker å bytte både x og y på samme tid. 708 00:31:53,370 --> 00:31:55,020 Så vi kommer til å komme tilbake til dette. 709 00:31:55,020 --> 00:31:58,770 Men for nå, innser at problemet fundamentalt stammer fra det faktum 710 00:31:58,770 --> 00:32:00,660 at a og b er kopier. 711 00:32:00,660 --> 00:32:03,450 Og de er i sitt eget omfang. 712 00:32:03,450 --> 00:32:04,980 Vel, la oss prøve å løse dette på noen måte. 713 00:32:04,980 --> 00:32:09,200 La meg faktisk bla tilbake hit og åpne opp, la oss si, en fjerde variant 714 00:32:09,200 --> 00:32:11,170 av dette, buggy4. 715 00:32:11,170 --> 00:32:13,230 Og hva med dette? 716 00:32:13,230 --> 00:32:16,690 Dette er en lignende, men enklere problem å se på før vi tar en stikke på 717 00:32:16,690 --> 00:32:17,530 løse det. 718 00:32:17,530 --> 00:32:19,440 Dette programmet kalles tilvekst. 719 00:32:19,440 --> 00:32:24,320 Og det initialiseres tilsynelatende en x heltall til en i linje 18. 720 00:32:24,320 --> 00:32:25,950 Jeg så hevder x er en. 721 00:32:25,950 --> 00:32:28,020 Jeg så hevder økes, dot, dot, dot. 722 00:32:28,020 --> 00:32:29,460 Jeg deretter ringe tilvekst. 723 00:32:29,460 --> 00:32:33,480 Men da i linjene 22 og 23, hevder jeg at det er blitt økes. 724 00:32:33,480 --> 00:32:37,780 Jeg hevder x er nå hva det er, 2 formodentlig. 725 00:32:37,780 --> 00:32:39,770 >> Men dette programmet er buggy. 726 00:32:39,770 --> 00:32:41,020 Hva er problemet? 727 00:32:43,450 --> 00:32:44,418 Ja? 728 00:32:44,418 --> 00:32:45,668 [Uhørlig] 729 00:32:49,260 --> 00:32:49,850 DAVID J. MALAN: Nettopp. 730 00:32:49,850 --> 00:32:52,430 Så x har blitt erklært åpenbart på linje 18. 731 00:32:52,430 --> 00:32:54,410 Som er inne viktigste er klammeparentes. 732 00:32:54,410 --> 00:32:58,470 Så det enkle svaret her er at, vel, finnes x her. 733 00:32:58,470 --> 00:33:01,510 Det finnes ikke i linje 32. 734 00:33:01,510 --> 00:33:03,710 Så dette programmet faktisk ikke engang kompilere. 735 00:33:03,710 --> 00:33:07,910 Kompilatoren, når jeg prøver å kompilere denne koden, kommer til å kjefte på meg 736 00:33:07,910 --> 00:33:13,190 om noen svart identifikator eller noe om dette. 737 00:33:13,190 --> 00:33:13,870 Faktisk, la oss prøve. 738 00:33:13,870 --> 00:33:15,235 Dette er å buggy4. 739 00:33:17,780 --> 00:33:18,190 Det er det. 740 00:33:18,190 --> 00:33:22,030 Bruk av svart identifikator x i linje 32. 741 00:33:22,030 --> 00:33:25,700 Og faktisk, la oss være mer eksplisitt her i dag, slik at dette er nyttig i 742 00:33:25,700 --> 00:33:27,140 kontortid og hjemme. 743 00:33:27,140 --> 00:33:29,000 Legg merke til at det er litt kryptisk skrevet. 744 00:33:29,000 --> 00:33:31,560 Men det faktum at Clang har skreket til oss, sier 745 00:33:31,560 --> 00:33:36,970 buggy4.c: 32:5, faktisk er nyttig. 746 00:33:36,970 --> 00:33:41,970 Det betyr at feilen er på linje 32 ved tegnposisjon fem. 747 00:33:41,970 --> 00:33:44,670 Så en, to, tre, fire, fem. 748 00:33:44,670 --> 00:33:46,640 Det er, faktisk, hvor problemet er. 749 00:33:46,640 --> 00:33:49,710 Og også å huske på kontortid og hjemme, jeg er heldig her. 750 00:33:49,710 --> 00:33:50,740 Jeg har en feil. 751 00:33:50,740 --> 00:33:52,660 Det kommer til å være relativt enkelt å fikse. 752 00:33:52,660 --> 00:33:56,220 Men hvis du får en hel skjerm full av overveldende feilmeldinger, igjen, 753 00:33:56,220 --> 00:33:59,240 innse at den nederste man kan bare være symptomatisk for 754 00:33:59,240 --> 00:34:00,320 de øverste seg. 755 00:34:00,320 --> 00:34:03,560 Så alltid jage ned bugs fra toppen og ned. 756 00:34:03,560 --> 00:34:06,720 Fordi det kan bare være en daisy-chain effekt som insinuerer du 757 00:34:06,720 --> 00:34:09,030 har mye mer problemer enn du faktisk gjør. 758 00:34:09,030 --> 00:34:14,989 >> Så hvordan kan vi fikse dette hvis mitt mål er å øke x? 759 00:34:14,989 --> 00:34:15,370 Hva er det? 760 00:34:15,370 --> 00:34:15,620 Okay. 761 00:34:15,620 --> 00:34:16,679 Så vi kan gjøre x global. 762 00:34:16,679 --> 00:34:18,860 La oss ta snarveien at jeg advarte om tidligere. 763 00:34:18,860 --> 00:34:20,550 Men pokker, vi trenger bare en rask løsning. 764 00:34:20,550 --> 00:34:23,949 Så la oss bare si int x opp her. 765 00:34:23,949 --> 00:34:25,600 Det gjør x global. 766 00:34:25,600 --> 00:34:28,460 Så nå main har tilgang til den. 767 00:34:28,460 --> 00:34:31,780 Og tilvekst har tilgang til den. 768 00:34:31,780 --> 00:34:33,860 Og så la meg gå videre og kompilere dette nå. 769 00:34:33,860 --> 00:34:36,330 Gjør buggy4, Enter. 770 00:34:36,330 --> 00:34:37,440 Synes å kompilere nå. 771 00:34:37,440 --> 00:34:40,949 La oss kjøre buggy4, og det synes å faktisk fungerer. 772 00:34:40,949 --> 00:34:42,780 Nå er dette en av disse tingene - 773 00:34:42,780 --> 00:34:45,870 gjør som jeg sier, ikke som jeg gjør, så jeg har nettopp gjort her. 774 00:34:45,870 --> 00:34:49,239 Fordi Generelt, våre programmer kommer til å få mye mer interessant og 775 00:34:49,239 --> 00:34:50,440 mye lenger enn dette. 776 00:34:50,440 --> 00:34:53,199 Og hvis din løsning på livets problemer er bare ah, legge all 777 00:34:53,199 --> 00:34:57,550 variabler på toppen av filen, veldig raskt gjøre programmer får 778 00:34:57,550 --> 00:34:59,700 horrifically vanskelig å administrere. 779 00:34:59,700 --> 00:35:02,050 Det blir vanskeligere å finne på nye variabelnavn. 780 00:35:02,050 --> 00:35:05,240 Det blir vanskeligere å forstå hva variabel som gjør hva. 781 00:35:05,240 --> 00:35:08,250 >> Og så generelt, dette er ikke en god løsning. 782 00:35:08,250 --> 00:35:09,780 Så la oss gjøre dette bedre. 783 00:35:09,780 --> 00:35:11,920 Vi ønsker ikke å bruke en global variabel her. 784 00:35:11,920 --> 00:35:14,050 Jeg ønsker å øke x. 785 00:35:14,050 --> 00:35:16,050 Så jeg kunne selvsagt - 786 00:35:16,050 --> 00:35:18,450 på slutten av dagen, er det en slags dum historie fordi vi bare gjøre dette. 787 00:35:18,450 --> 00:35:22,050 Men hvis jeg ikke visste om at operatøren, eller jeg ikke fikk lov til å 788 00:35:22,050 --> 00:35:27,700 endre den i hoved seg selv, hvordan kunne jeg ellers iverksette Ken over her, dette 789 00:35:27,700 --> 00:35:31,450 tid ikke å kube, men å øke? 790 00:35:31,450 --> 00:35:32,700 Hvordan endrer jeg denne greia her? 791 00:35:32,700 --> 00:35:33,025 Ja. 792 00:35:33,025 --> 00:35:34,275 [Uhørlig] 793 00:35:37,430 --> 00:35:38,000 DAVID J. MALAN: Ok, bra. 794 00:35:38,000 --> 00:35:40,490 Så hvorfor ikke jeg passere i x? 795 00:35:40,490 --> 00:35:44,390 Og så heller enn den tilbake, hvorfor jeg ikke bare må returnere x + 1? 796 00:35:44,390 --> 00:35:46,370 Nå, et par flere ting må endre her. 797 00:35:46,370 --> 00:35:47,530 Jeg er på rett spor. 798 00:35:47,530 --> 00:35:48,910 Hva annet trenger jeg å finpusse? 799 00:35:48,910 --> 00:35:49,470 Noen andre. 800 00:35:49,470 --> 00:35:49,882 Ja? 801 00:35:49,882 --> 00:35:51,530 [Uhørlig] 802 00:35:51,530 --> 00:35:53,520 DAVID J. MALAN: Jeg trenger å endre retur type tilveksten 803 00:35:53,520 --> 00:35:54,590 fordi det ikke er ugyldig. 804 00:35:54,590 --> 00:35:56,650 Void betyr ingenting som blir returnert. 805 00:35:56,650 --> 00:35:57,600 Men klart, nå er det. 806 00:35:57,600 --> 00:36:01,280 Så dette må endres til int å være konsekvent med hva 807 00:36:01,280 --> 00:36:02,580 Jeg er faktisk tilbake. 808 00:36:02,580 --> 00:36:04,580 >> Nå noe annet, er fortsatt buggy her. 809 00:36:04,580 --> 00:36:04,982 Ja? 810 00:36:04,982 --> 00:36:06,590 [Uhørlig] 811 00:36:06,590 --> 00:36:07,630 DAVID J. MALAN: Så jeg trenger å øke x? 812 00:36:07,630 --> 00:36:10,336 [Uhørlig] 813 00:36:10,336 --> 00:36:11,880 DAVID J. MALAN: Ah, så jeg må passere x. 814 00:36:11,880 --> 00:36:13,300 Så jeg trenger å gjøre dette her. 815 00:36:17,590 --> 00:36:19,690 Så prototypen, må jeg endre dette opp her. 816 00:36:19,690 --> 00:36:21,290 Så dette må bli en int. 817 00:36:21,290 --> 00:36:22,820 Dette må bli - 818 00:36:22,820 --> 00:36:23,670 hmm. 819 00:36:23,670 --> 00:36:24,710 Jeg har faktisk en bug her nede. 820 00:36:24,710 --> 00:36:25,780 La oss fikse dette først. 821 00:36:25,780 --> 00:36:27,990 Hva bør dette faktisk være? 822 00:36:27,990 --> 00:36:29,330 Så det er nødt til å være en int noe. 823 00:36:29,330 --> 00:36:30,340 Det kan være x. 824 00:36:30,340 --> 00:36:33,120 Men ærlig, hvis du begynner å ringe alle dine variablene x, kommer det til å bli 825 00:36:33,120 --> 00:36:35,250 mindre og mindre tydelig hva som er hva. 826 00:36:35,250 --> 00:36:38,210 Så la oss bare vilkårlig velge en annen navnekonvensjon for min 827 00:36:38,210 --> 00:36:40,220 helper funksjoner, funksjoner jeg skriver. 828 00:36:40,220 --> 00:36:41,100 Vi kaller det en. 829 00:36:41,100 --> 00:36:44,500 Eller vi kan kalle det - la oss kalle even_number det å være enda mer eksplisitt. 830 00:36:44,500 --> 00:36:47,610 Så da må jeg tilbake uansett antall er pluss en. 831 00:36:47,610 --> 00:36:49,720 Og nå må jeg endre en annen ting her oppe, og en 832 00:36:49,720 --> 00:36:50,700 andre ting her oppe. 833 00:36:50,700 --> 00:36:54,150 Hva må jeg endre på linje 21 første? 834 00:36:54,150 --> 00:36:55,390 Jeg må tilordne den til x. 835 00:36:55,390 --> 00:36:57,480 Så jeg kan ikke bare ringe tilvekst x. 836 00:36:57,480 --> 00:37:01,000 Jeg trenger å huske svaret ved å endre verdien av x på 837 00:37:01,000 --> 00:37:02,020 venstre side. 838 00:37:02,020 --> 00:37:04,930 Og selv om x er nå på venstre og høyre, det er helt fint fordi 839 00:37:04,930 --> 00:37:08,370 høyre side blir utført først da blir plopped i den venstre 840 00:37:08,370 --> 00:37:10,240 hånden ting, x i dette tilfellet. 841 00:37:10,240 --> 00:37:11,900 Og så til slutt, er dette lett å fikse nå. 842 00:37:11,900 --> 00:37:15,080 Dette bør bare matche det er ned nedenfor. 843 00:37:15,080 --> 00:37:17,120 Int nummer. 844 00:37:17,120 --> 00:37:17,320 >> OK. 845 00:37:17,320 --> 00:37:20,290 Så en hel haug av endringer for en virkelig dum funksjon. 846 00:37:20,290 --> 00:37:24,250 Men representant for ting som vi vil i økende grad ønsker å gjøre. 847 00:37:24,250 --> 00:37:25,490 Så sørg buggy4. 848 00:37:25,490 --> 00:37:26,485 Jeg har skrudd opp et sted. 849 00:37:26,485 --> 00:37:27,520 Herregud. 850 00:37:27,520 --> 00:37:29,660 Fem feil i, liker, en seks-line program. 851 00:37:29,660 --> 00:37:36,500 Så hva er galt på linje 18, 5 karakter? 852 00:37:36,500 --> 00:37:36,970 OK. 853 00:37:36,970 --> 00:37:39,330 Så jeg må erklære denne int. 854 00:37:39,330 --> 00:37:39,630 OK. 855 00:37:39,630 --> 00:37:41,790 Så la oss se, en hel haug med andre feil. 856 00:37:41,790 --> 00:37:42,230 Oh my god. 857 00:37:42,230 --> 00:37:43,880 19, 18, 21. 858 00:37:43,880 --> 00:37:46,020 Men igjen, la oss bare tømme skjermen - 859 00:37:46,020 --> 00:37:48,660 Kontroll L her - og re-run Clang. 860 00:37:48,660 --> 00:37:51,340 Så fem problemene er faktisk bare den. 861 00:37:51,340 --> 00:37:53,500 Så nå la oss kjøre buggy4, Enter. 862 00:37:53,500 --> 00:37:54,150 Puh. 863 00:37:54,150 --> 00:37:57,434 x er økes riktig. 864 00:37:57,434 --> 00:37:58,420 >> OK. 865 00:37:58,420 --> 00:38:01,700 Eventuelle spørsmål om hvordan å øke tallene? 866 00:38:01,700 --> 00:38:02,896 Ja? 867 00:38:02,896 --> 00:38:06,864 SPEAKER 2: Hvorfor er det slik at du bare kan endre x til tallet i variabelen 868 00:38:06,864 --> 00:38:08,860 navngi og det vil vite hva du mener? 869 00:38:08,860 --> 00:38:09,600 DAVID J. MALAN: Godt spørsmål. 870 00:38:09,600 --> 00:38:13,130 Hvordan har det seg at jeg bare kan endre x til nummer og programmet vil vite 871 00:38:13,130 --> 00:38:13,990 umiddelbart? 872 00:38:13,990 --> 00:38:16,120 Så igjen, tenk på det som denne abstraksjon. 873 00:38:16,120 --> 00:38:20,110 Så hvis jeg er hoved-og Ken er inkrementell, ærlig, jeg bryr meg ikke 874 00:38:20,110 --> 00:38:21,540 hva Ken kaller sin iPad. 875 00:38:21,540 --> 00:38:25,350 Jeg bryr meg ikke hva han kaller alt som har å gjøre med gjennomføringen hans 876 00:38:25,350 --> 00:38:26,550 av denne funksjonaliteten. 877 00:38:26,550 --> 00:38:32,130 Så dette er en implementering detaljer som jeg, viktigste, ikke 878 00:38:32,130 --> 00:38:33,010 å bry seg om. 879 00:38:33,010 --> 00:38:37,440 Og så bare å endre det konsekvent innsiden av funksjonen, antall her 880 00:38:37,440 --> 00:38:41,340 og nummeret her, er alt det tar så lang som jeg rekompilere. 881 00:38:41,340 --> 00:38:43,820 Det er liksom som om du tenker på - mange av oss, de av dere med førerens 882 00:38:43,820 --> 00:38:46,590 lisenser som har kjørt, eller hvis du har selv kjørt i en bil - 883 00:38:46,590 --> 00:38:50,710 de fleste av oss har ingen anelse om hvordan en bil fungerer under panseret. 884 00:38:50,710 --> 00:38:54,710 Og bokstavelig talt, hvis du åpner opp panseret, de fleste av oss - meg selv inkludert - 885 00:38:54,710 --> 00:38:56,580 kommer ikke til å virkelig vite hva vi ser på. 886 00:38:56,580 --> 00:38:58,850 Typen som du kanskje føler med ting som dette akkurat nå. 887 00:38:58,850 --> 00:39:01,380 Men vi trenger egentlig ikke å bry seg om hvordan bilen fungerer. 888 00:39:01,380 --> 00:39:05,000 Vi trenger ikke å bry seg hva alle stenger og stempler og kabler inne i 889 00:39:05,000 --> 00:39:07,700 bilen faktisk gjør. 890 00:39:07,700 --> 00:39:11,360 >> Så noe som det du kaller stempelet ingen rolle 891 00:39:11,360 --> 00:39:11,920 her i dette tilfellet. 892 00:39:11,920 --> 00:39:12,490 Samme idé. 893 00:39:12,490 --> 00:39:12,670 Ja? 894 00:39:12,670 --> 00:39:13,920 [Uhørlig] 895 00:39:25,250 --> 00:39:29,530 DAVID J. MALAN: Hvis det var mer bruk av variabelen xa øyeblikk siden, 896 00:39:29,530 --> 00:39:32,220 deg, programmerer, måtte endre dem overalt. 897 00:39:32,220 --> 00:39:35,230 Eller du kan bokstavelig talt gjøre Fil, Meny og deretter Finn / Erstatt, 898 00:39:35,230 --> 00:39:36,270 noe sånt. 899 00:39:36,270 --> 00:39:40,110 Men du er nødt til å gjøre disse endringene selv. 900 00:39:40,110 --> 00:39:41,200 Du må være konsekvent. 901 00:39:41,200 --> 00:39:42,450 [Uhørlig] 902 00:39:47,200 --> 00:39:48,960 DAVID J. MALAN: En spesiell rekkefølge som her? 903 00:39:48,960 --> 00:39:52,660 Hvis dette var int annet nummer? 904 00:39:52,660 --> 00:39:52,940 Ja. 905 00:39:52,940 --> 00:39:56,430 Så for teller når du ringer funksjonen. 906 00:39:56,430 --> 00:40:00,350 Så hvis jeg skulle kalle tilvekst her med noe komma noe, 907 00:40:00,350 --> 00:40:01,400 det er en direkte kartlegging. 908 00:40:01,400 --> 00:40:04,490 Den første variabelen, hva det heter, er laget en kopi av den første 909 00:40:04,490 --> 00:40:05,480 argument over her. 910 00:40:05,480 --> 00:40:07,280 Beklager, dette burde ikke være en parentes. 911 00:40:07,280 --> 00:40:09,300 Det andre argumentet på linje med andre. 912 00:40:09,300 --> 00:40:11,220 >> Så orden, ja, saker. 913 00:40:11,220 --> 00:40:11,490 OK. 914 00:40:11,490 --> 00:40:13,360 Beklager at jeg tok en lang vei å komme dit. 915 00:40:13,360 --> 00:40:14,610 Andre spørsmål? 916 00:40:16,460 --> 00:40:16,850 OK. 917 00:40:16,850 --> 00:40:20,300 Så la oss se om vi ikke kan male et bilde av hva som faktisk skjer 918 00:40:20,300 --> 00:40:22,160 her under panseret, så å si. 919 00:40:22,160 --> 00:40:26,310 Så dette er et rektangel som kan representere datamaskinens minne. 920 00:40:26,310 --> 00:40:31,240 Så selv om du har ingen anelse om hvordan hukommelsen virker eller hvordan RAM fungerer, minst 921 00:40:31,240 --> 00:40:33,590 anta at du har bunter av det i disse dager. 922 00:40:33,590 --> 00:40:34,740 Du har megabyte det. 923 00:40:34,740 --> 00:40:35,760 Du har gigabyte det. 924 00:40:35,760 --> 00:40:40,690 Og vi vet fra uke null som en byte er bare hva? 925 00:40:40,690 --> 00:40:41,280 8 biter. 926 00:40:41,280 --> 00:40:42,730 Høyre, så 8 nuller og enere. 927 00:40:42,730 --> 00:40:46,300 Så hvis datamaskinen har en gig RAM, to gigabyte RAM i disse dager, har du en 928 00:40:46,300 --> 00:40:54,450 milliarder eller 2 milliarder bytes minne, eller om lag 8 milliarder kroner eller 16 milliard 929 00:40:54,450 --> 00:40:56,560 biter, på innsiden av datamaskinen. 930 00:40:56,560 --> 00:40:59,710 Nå motsetning til lille Woolly Willy eksempel, er det ikke magnetiske partikler 931 00:40:59,710 --> 00:41:00,560 typisk lenger. 932 00:41:00,560 --> 00:41:04,470 Stadig, i bærbare datamaskiner i det minste, det er solid state-disker, SSD, som 933 00:41:04,470 --> 00:41:05,560 bare har ingen bevegelige deler. 934 00:41:05,560 --> 00:41:06,710 Det er all elektronisk. 935 00:41:06,710 --> 00:41:08,070 Det er all elektrisitet basert. 936 00:41:08,070 --> 00:41:12,360 Så tenker, skjønt, av dette rektangel som bare representerer en eller to 937 00:41:12,360 --> 00:41:13,930 gigabyte minne som du har. 938 00:41:13,930 --> 00:41:15,500 >> Så det er en del av minnet. 939 00:41:15,500 --> 00:41:20,460 Nå er verden av datateknologi har liksom fradeles biter av 940 00:41:20,460 --> 00:41:22,570 minne til å gjøre forskjellige ting. 941 00:41:22,570 --> 00:41:25,930 Så for eksempel, hvis dette er datamaskinens RAM - som foreslått av 942 00:41:25,930 --> 00:41:30,400 rektangel der - det viser seg at ved konvensjonen, på toppen av RAM, så 943 00:41:30,400 --> 00:41:33,170 å snakke, er generelt det som kalles en tekst segment. 944 00:41:33,170 --> 00:41:35,910 De er de nuller og enere som du har samlet. 945 00:41:35,910 --> 00:41:39,040 Så når vi har sett under panseret på hva a.out er, alle 946 00:41:39,040 --> 00:41:40,360 nullpunktene og enere - 947 00:41:40,360 --> 00:41:44,000 når du kjører et program, er de nuller og enere lastet inn fra harddisken din 948 00:41:44,000 --> 00:41:46,290 kjøre inn noe som kalles RAM. 949 00:41:46,290 --> 00:41:48,950 Og i RAM, blir de satt på toppen. 950 00:41:48,950 --> 00:41:50,330 Nå i mellomtiden, har du andre ting. 951 00:41:50,330 --> 00:41:53,060 Initialisert data, uinitialiserte data. 952 00:41:53,060 --> 00:41:56,440 De to ranker minne refererer til globale variabler, som 953 00:41:56,440 --> 00:41:57,530 du ikke bruker ofte. 954 00:41:57,530 --> 00:42:00,630 Men noen ganger hvis du gjør det, ender de opp der oppe også. 955 00:42:00,630 --> 00:42:01,620 Så er det noen andre ting. 956 00:42:01,620 --> 00:42:04,130 Miljøvariabler, som vi ikke vil tilbringe mye tid på. 957 00:42:04,130 --> 00:42:06,120 Men så to viktige ting som vil komme tilbake gjennom hele denne 958 00:42:06,120 --> 00:42:08,130 semester, stack og heap. 959 00:42:08,130 --> 00:42:12,280 >> Så de fleste av datamaskinens minne er reservert når du kjører et program for 960 00:42:12,280 --> 00:42:14,880 noe som kalles stabelen og noe som kalles haugen. 961 00:42:14,880 --> 00:42:16,940 Og vi kommer ikke til å snakke om heap i dag, men vi vil 962 00:42:16,940 --> 00:42:18,180 snakke om bunken. 963 00:42:18,180 --> 00:42:22,910 Og stakken er ment å trylle frem det visuelle av som matsalen 964 00:42:22,910 --> 00:42:26,120 matbrett i Mather House, eller hvor du måtte befinne deg, hvor 965 00:42:26,120 --> 00:42:27,810 spisesal personalet rense dem hver dag. 966 00:42:27,810 --> 00:42:30,180 De stable dem opp fra gulvet på opp. 967 00:42:30,180 --> 00:42:33,800 Og tilsvarende i minnet, er det denne ideen om å sette noe på en 968 00:42:33,800 --> 00:42:36,740 stable sette noe på en stabel, sette noe på en stabel. 969 00:42:36,740 --> 00:42:38,000 Og hva mener vi med dette? 970 00:42:38,000 --> 00:42:41,430 Vel, la oss zoome inn på akkurat den nedre halvdelen av dette bildet, datamaskinens 971 00:42:41,430 --> 00:42:43,990 RAM, for å foreslå følgende. 972 00:42:43,990 --> 00:42:48,300 Det viser seg at når du kjører et program som a.out eller Hallo, hva 973 00:42:48,300 --> 00:42:49,920 programmet er at du har skrevet, 974 00:42:49,920 --> 00:42:53,030 igjen, blir disse nuller og enere lastet fra harddisken - som er 975 00:42:53,030 --> 00:42:56,190 langtidslagring, forblir der selv når du trekker ut pluggen - 976 00:42:56,190 --> 00:42:57,220 lastet inn i RAM. 977 00:42:57,220 --> 00:42:59,020 RAM er raskere enn harddisker. 978 00:42:59,020 --> 00:43:00,700 Det er mindre enn harddisker. 979 00:43:00,700 --> 00:43:03,490 Men det er der programmene leve mens du kjører dem. 980 00:43:03,490 --> 00:43:06,380 >> Så du dobbeltklikker et program på en Mac eller en PC - det er lastet fra 981 00:43:06,380 --> 00:43:07,750 harddisken inn RAM. 982 00:43:07,750 --> 00:43:11,760 Så snart det er lastet inn i RAM, nullpunktene og enere gå på veien toppen, 983 00:43:11,760 --> 00:43:13,130 såkalte tekstsegment. 984 00:43:13,130 --> 00:43:17,040 Men så så snart programmet faktisk begynner å kjøre, det viktigste 985 00:43:17,040 --> 00:43:18,140 funksjonen kalles. 986 00:43:18,140 --> 00:43:21,070 Og viktigste, som vi har sett, ofte har lokale variabler. 987 00:43:21,070 --> 00:43:24,560 Og det har ints og strenger og chars og lignende. 988 00:43:24,560 --> 00:43:28,300 Så hvis programmet som du har skrevet eller det programmet du har 989 00:43:28,300 --> 00:43:33,680 dobbeltklikket brukt noen variabler inne i main, de ender opp på 990 00:43:33,680 --> 00:43:37,020 bunnen av bunken med minne, så å si. 991 00:43:37,020 --> 00:43:39,160 Nå mer konkret, hva dette egentlig betyr? 992 00:43:39,160 --> 00:43:44,080 Dette betyr bare at hvis vi skulle nummerere ting - 993 00:43:44,080 --> 00:43:49,380 hvis vi skulle nummerere bytes RAM i datamaskinen, legge merke til at 994 00:43:49,380 --> 00:43:51,650 dette kan være bytenummer null. 995 00:43:51,650 --> 00:43:56,130 Dette kan være byte nummer en, to, tre, fire, fem, seks, alle 996 00:43:56,130 --> 00:43:57,290 veien opp til å like - 997 00:43:57,290 --> 00:44:01,520 2000000000 ville være helt der oppe på toppen. 998 00:44:01,520 --> 00:44:05,960 Så med andre ord, når vi snakker om RAM eller minne i form av bytes, det 999 00:44:05,960 --> 00:44:09,680 betyr bare at noen har bestemt seg for hva de skal telle hver av 1000 00:44:09,680 --> 00:44:11,110 de biter av minnet. 1001 00:44:11,110 --> 00:44:16,950 >> Så når du trenger 32 bits for en int, eller du trenger 8 biter for en røye, der 1002 00:44:16,950 --> 00:44:18,320 ende de opp i minnet? 1003 00:44:18,320 --> 00:44:20,650 Vel konseptuelt, de bare ende opp på bunnen av denne 1004 00:44:20,650 --> 00:44:21,780 tingen kalt stabelen. 1005 00:44:21,780 --> 00:44:25,670 Men det som er interessant nå er når main kaller en funksjon. 1006 00:44:25,670 --> 00:44:28,830 Anta at en funksjon kalt foo, bare et tilfeldig navn. 1007 00:44:28,830 --> 00:44:32,480 Det som skjer er main er på bunnen av denne stabel av minnet. 1008 00:44:32,480 --> 00:44:35,630 Foo nå er satt på toppen av hoved i minnet. 1009 00:44:35,630 --> 00:44:40,020 Slik at eventuelle lokale variabler som Foo har ende opp slags begrepsmessig over 1010 00:44:40,020 --> 00:44:40,770 de i main. 1011 00:44:40,770 --> 00:44:46,920 Hvis foo kaller en annen funksjon kalt bar, disse variablene ende opp her. 1012 00:44:46,920 --> 00:44:49,790 Hvis bar kaller noe annet, her, her, her. 1013 00:44:49,790 --> 00:44:53,900 Så hva er interessant om hvordan du kjører et program er at når du kaller funksjoner, 1014 00:44:53,900 --> 00:44:57,720 og som disse funksjonene kaller funksjoner, og som disse funksjonene kaller funksjoner, 1015 00:44:57,720 --> 00:45:00,980 du bygge opp denne bunken av funksjoner i minnet. 1016 00:45:00,980 --> 00:45:06,740 Og bare en gang i funksjonen returnerer du begynne å få det minnet tilbake. 1017 00:45:06,740 --> 00:45:11,190 Så en av de enkleste måtene å kjøre ut av minnet i et dataprogram er å 1018 00:45:11,190 --> 00:45:14,170 skrive funksjoner som aldri tilbake. 1019 00:45:14,170 --> 00:45:16,650 >> Så for eksempel, la oss vise så mye med en 1020 00:45:16,650 --> 00:45:18,460 forsettlig buggy program. 1021 00:45:18,460 --> 00:45:24,690 La meg gå videre og gjøre # include , int main (void). 1022 00:45:24,690 --> 00:45:31,270 Og jeg kommer til å gjøre mens (2> 1), som sannsynligvis ikke vil noensinne 1023 00:45:31,270 --> 00:45:33,370 endre på oss. 1024 00:45:33,370 --> 00:45:37,720 Og la meg gå videre nå og gjøre printf. 1025 00:45:37,720 --> 00:45:39,950 Egentlig, det kommer til å være mindre visuelt interessant. 1026 00:45:39,950 --> 00:45:40,460 La oss gjøre dette. 1027 00:45:40,460 --> 00:45:44,840 For int (i = 0; i> 0). 1028 00:45:44,840 --> 00:45:49,740 La oss gjøre dette feil, i + +. 1029 00:45:49,740 --> 00:45:51,150 Og la oss ikke printf her. 1030 00:45:51,150 --> 00:45:52,550 La oss praktisere det jeg forkynner. 1031 00:45:52,550 --> 00:45:54,090 La oss ha en metode her. 1032 00:45:54,090 --> 00:46:00,860 Void chorus, og vi vil si int i. 1033 00:46:00,860 --> 00:46:02,295 Og så skal jeg si, printf - 1034 00:46:04,871 --> 00:46:06,790 oh, la oss gjøre dette mer interessant. 1035 00:46:06,790 --> 00:46:08,350 La oss faktisk ikke skrive noe i det hele tatt. 1036 00:46:08,350 --> 00:46:10,530 La oss bare gjøre dette. 1037 00:46:10,530 --> 00:46:11,780 Chorus (i). 1038 00:46:16,630 --> 00:46:17,000 >> OK. 1039 00:46:17,000 --> 00:46:20,040 Så dette er buggy fordi hvorfor? 1040 00:46:20,040 --> 00:46:22,850 Jeg gjør dette som jeg gå fordi programmet ikke gjør faktisk noe 1041 00:46:22,850 --> 00:46:23,420 av interesse. 1042 00:46:23,420 --> 00:46:24,670 Men det er ikke målet. 1043 00:46:24,670 --> 00:46:30,440 Målet er å skrive et program som viktigste funksjon gjør hva, tilsynelatende? 1044 00:46:30,440 --> 00:46:31,370 Kalle seg. 1045 00:46:31,370 --> 00:46:32,600 Og faktisk, trenger vi ikke loopen. 1046 00:46:32,600 --> 00:46:36,070 La oss selv forenkle dette bare for ikke å miste av syne virkelig 1047 00:46:36,070 --> 00:46:37,310 fundamental feil. 1048 00:46:37,310 --> 00:46:39,200 Viktigste samtaler kor til å synge noen refreng. 1049 00:46:39,200 --> 00:46:41,760 Så jeg gjorde noe dumt, og jeg hadde kor samtale kor fordi jeg antok 1050 00:46:41,760 --> 00:46:43,550 noen andre skulle gjennomføre det kanskje. 1051 00:46:43,550 --> 00:46:45,960 Og nå er dette ikke kommer til å kompilere ennå. 1052 00:46:45,960 --> 00:46:48,340 Jeg trenger å gjøre hva? 1053 00:46:48,340 --> 00:46:49,700 Jeg trenger prototypen, huske. 1054 00:46:49,700 --> 00:46:55,520 Så jeg må ha her oppe void kor (int i);. 1055 00:46:55,520 --> 00:46:57,470 >> Så nå, hvis jeg går ned her - 1056 00:46:57,470 --> 00:46:59,030 faktisk, la oss bruke større vindu. 1057 00:46:59,030 --> 00:47:01,670 La oss gå videre og gjøre refreng. 1058 00:47:01,670 --> 00:47:06,000 La oss gå videre og gjøre refreng. 1059 00:47:06,000 --> 00:47:08,302 Bruk av uidentifiserte spillefører jeg. 1060 00:47:08,302 --> 00:47:09,860 Å, det var dumt. 1061 00:47:09,860 --> 00:47:11,020 Vi trenger ikke argumentet. 1062 00:47:11,020 --> 00:47:13,680 La oss bare gjøre dette. 1063 00:47:13,680 --> 00:47:14,550 Skulle ønske vi hadde startet på denne måten. 1064 00:47:14,550 --> 00:47:16,160 Det ville ha vært en mye enklere program for å skrive. 1065 00:47:16,160 --> 00:47:20,100 Så det. 1066 00:47:20,100 --> 00:47:23,870 Nå la oss gå over til min terminal-vinduet, re-run Clang. 1067 00:47:23,870 --> 00:47:26,900 Og her vi går. 1068 00:47:26,900 --> 00:47:28,020 Det var virkelig rask. 1069 00:47:28,020 --> 00:47:30,690 Hva som faktisk skjedde, da? 1070 00:47:30,690 --> 00:47:33,430 Vel, nå skal jeg legge ut linje, slik at vi kan se. 1071 00:47:33,430 --> 00:47:41,330 Så la meg si printf, la oss si, jeg er her. 1072 00:47:41,330 --> 00:47:43,470 Ok, ingen variabler, vil vi la det sånn. 1073 00:47:43,470 --> 00:47:44,860 La meg re-run gjøre. 1074 00:47:44,860 --> 00:47:47,940 La meg re-run refreng. 1075 00:47:47,940 --> 00:47:51,235 Og kom igjen. 1076 00:47:53,880 --> 00:47:55,130 Holde det gående. 1077 00:47:57,630 --> 00:47:59,750 Som en side, hvorfor har det ikke krasjet ennå? 1078 00:47:59,750 --> 00:48:02,050 Segmentering feil skjedde super rask før. 1079 00:48:02,050 --> 00:48:04,250 [Uhørlig] 1080 00:48:04,250 --> 00:48:04,830 DAVID J. MALAN: Nettopp. 1081 00:48:04,830 --> 00:48:06,350 Så det tar tid å skrive ut. 1082 00:48:06,350 --> 00:48:08,370 Det tar bare mer arbeid på datamaskinen del. 1083 00:48:08,370 --> 00:48:09,550 Og det er det. 1084 00:48:09,550 --> 00:48:10,620 Segmentering feil. 1085 00:48:10,620 --> 00:48:12,140 >> Så legge merke til hvor raskt programmene kjører. 1086 00:48:12,140 --> 00:48:14,110 Hvis du ikke skriver noe, super rask. 1087 00:48:14,110 --> 00:48:18,100 Men vi har fortsatt denne segmentering feil fordi det som skjedde? 1088 00:48:18,100 --> 00:48:21,310 Vel, hvis du tenker på hvordan datamaskinens minne er lagt ut, dette 1089 00:48:21,310 --> 00:48:22,890 skjer for å være viktigste. 1090 00:48:22,890 --> 00:48:23,800 Men her - 1091 00:48:23,800 --> 00:48:28,670 la oss bare kalle dette koret, og la oss kalle dette koret. 1092 00:48:28,670 --> 00:48:33,420 Og nå hvis jeg gjør mine estetikk rett, dette bare kommer til å si kor, 1093 00:48:33,420 --> 00:48:38,060 kor, kor, kor, kor, kor, kor, ad nauseum. 1094 00:48:38,060 --> 00:48:39,920 Og til slutt, hva kommer til å skje? 1095 00:48:39,920 --> 00:48:46,690 Hvis det store bildet bokstavelig er dette, hva skjer bare konseptuelt? 1096 00:48:46,690 --> 00:48:48,320 Stabelen overskridelser haugen. 1097 00:48:48,320 --> 00:48:52,400 Eller verre, du bare overkjørt alt, inkludert tekst-segmentet, som er 1098 00:48:52,400 --> 00:48:54,530 nullpunktene og de som representerer programmet. 1099 00:48:54,530 --> 00:48:56,690 Kort sagt, dette er bare super, super dårlig. 1100 00:48:56,690 --> 00:48:56,860 Rett? 1101 00:48:56,860 --> 00:48:58,620 Ditt program har kommet ut av kontroll. 1102 00:48:58,620 --> 00:49:02,840 Du bruker mye mer minne enn du hadde tenkt alt på grunn av en dum 1103 00:49:02,840 --> 00:49:03,920 feil, i dette tilfellet. 1104 00:49:03,920 --> 00:49:08,160 Eller i dette tilfellet, en svært bevisst gjort funksjon Ringekonto seg. 1105 00:49:08,160 --> 00:49:09,210 Nå er dette ikke så verst. 1106 00:49:09,210 --> 00:49:12,540 Funksjoner som kaller seg faktisk har stor makt 1107 00:49:12,540 --> 00:49:13,700 når du bruker den riktig. 1108 00:49:13,700 --> 00:49:15,650 Jeg har ikke brukt den riktig her. 1109 00:49:15,650 --> 00:49:16,940 >> Så dette er ikke så verst. 1110 00:49:16,940 --> 00:49:20,620 Men det faktum at jeg aldri slutte å kalle meg selv er en grunnleggende 1111 00:49:20,620 --> 00:49:23,050 svakhet her av dette programmet. 1112 00:49:23,050 --> 00:49:25,090 Så hvor skal vi med alt dette? 1113 00:49:25,090 --> 00:49:26,230 Vel, hva som egentlig skjer? 1114 00:49:26,230 --> 00:49:30,010 Når jeg kaller tilvekst funksjonen, som vi gjorde i disse eksemplene, 1115 00:49:30,010 --> 00:49:33,290 Jeg har en verdi som en som jeg passerer i. 1116 00:49:33,290 --> 00:49:35,820 Jeg passerer i en kopi av nummer én. 1117 00:49:35,820 --> 00:49:37,080 Så følgende skjer. 1118 00:49:37,080 --> 00:49:40,390 Så la oss gå inn i inkrement eksempel. 1119 00:49:40,390 --> 00:49:44,230 Og denne fyren rett over her. 1120 00:49:44,230 --> 00:49:46,800 Så her er hva som faktisk skjer. 1121 00:49:46,800 --> 00:49:50,770 Når jeg ringte tilvekst, og jeg passerer i x, billedlig hva som er 1122 00:49:50,770 --> 00:49:53,660 skjer her er dette - 1123 00:49:53,660 --> 00:50:00,240 hvis jeg har verdien 1 lagret her, og jeg faktisk ringe tilvekst, noe som 1124 00:50:00,240 --> 00:50:02,680 heter nå kor - 1125 00:50:02,680 --> 00:50:04,010 Ja, det er å kaste meg av her. 1126 00:50:04,010 --> 00:50:06,750 Så la oss kalle dette tilvekst. 1127 00:50:06,750 --> 00:50:09,420 Og vi vet ikke hva dette neste funksjonen kommer til å bli. 1128 00:50:09,420 --> 00:50:14,270 Så hva som faktisk skjer er her et sted i hoved, jeg har en del av 1129 00:50:14,270 --> 00:50:16,670 minne som lagrer nummer 1. 1130 00:50:16,670 --> 00:50:19,730 Når jeg ringer tilvekst, jeg bruker en annen del av minnet, men nå har jeg 1131 00:50:19,730 --> 00:50:20,840 har kopi av en. 1132 00:50:20,840 --> 00:50:25,480 Når jeg øke denne verdien, blir dette 2 - horribly skrevet på 1133 00:50:25,480 --> 00:50:26,420 skjermen her. 1134 00:50:26,420 --> 00:50:30,550 Men så, hva skjer så snart tilvekst avkastning? 1135 00:50:30,550 --> 00:50:34,610 Dette minnet bare blir sendt tilbake til operativsystemet, noe som betyr alt 1136 00:50:34,610 --> 00:50:37,470 du har gjort er ikke noe nyttig. 1137 00:50:37,470 --> 00:50:43,460 Den som opprinnelig ble inneholdt i main er fortsatt faktisk der. 1138 00:50:43,460 --> 00:50:44,650 >> Så hvor skal vi med dette? 1139 00:50:44,650 --> 00:50:49,400 Vel, det viser seg at i minnet du har denne rygg mot rygg sekvens av 1140 00:50:49,400 --> 00:50:50,940 byte som du kan sette ting i. 1141 00:50:50,940 --> 00:50:53,760 Og det viser seg at vi allerede har sett noe som innebærer å sette 1142 00:50:53,760 --> 00:50:55,100 ting tilbake til tilbake til rygg mot rygg. 1143 00:50:55,100 --> 00:51:00,170 Hva er en streng, basert på uke en og nå uke to? 1144 00:51:00,170 --> 00:51:01,840 Så det er bare en samling av tegn. 1145 00:51:01,840 --> 00:51:05,290 Så det viser seg, akkurat som du kan sette tall i minnet, på samme måte kan du 1146 00:51:05,290 --> 00:51:06,900 sette tegn i minnet. 1147 00:51:06,900 --> 00:51:09,810 Og når vi begynner å sette karakterer i minnet rygg mot rygg til rygg å 1148 00:51:09,810 --> 00:51:12,800 tilbake, viser det seg at det å bruke de enkleste ting som en for loop eller 1149 00:51:12,800 --> 00:51:14,510 en stund loop, kan vi iterate - 1150 00:51:14,510 --> 00:51:17,130 fra venstre til høyre over tegnene i en streng - 1151 00:51:17,130 --> 00:51:20,720 og begynne å massere dem inn i ulike karakterer helt. 1152 00:51:20,720 --> 00:51:25,550 En kan bli B. B kan bli C. Så det slutt, kan vi ta en 1153 00:51:25,550 --> 00:51:28,830 Engelsk setning som faktisk er fornuftig og konvertere hver av dem 1154 00:51:28,830 --> 00:51:32,440 bokstaver en av gangen ved å gå gjennom vår datamaskinens minne til å 1155 00:51:32,440 --> 00:51:34,300 rett til faktisk kryptere. 1156 00:51:34,300 --> 00:51:36,590 >> Så la oss ta våre fem minutters pause her, og når vi kommer tilbake, vil vi 1157 00:51:36,590 --> 00:51:39,060 starte denne prosessen med scrambling informasjon. 1158 00:51:41,640 --> 00:51:43,180 >> OK. 1159 00:51:43,180 --> 00:51:48,440 Så før vi dykke i noen krypto og disse tingene som kalles matriser, la meg 1160 00:51:48,440 --> 00:51:51,610 pause for eventuelle spørsmål fordi jeg føler at jeg virkelig slags forvirret noen av 1161 00:51:51,610 --> 00:51:52,230 disse emnene. 1162 00:51:52,230 --> 00:51:53,940 Så la oss fikse nå hvis vi kan. 1163 00:51:53,940 --> 00:51:56,480 Så vi bare snakket om retur verdier. 1164 00:51:56,480 --> 00:51:58,630 Vi snakket om argumenter. 1165 00:51:58,630 --> 00:52:02,330 Og vi snakket om denne tanken, som vi vil komme tilbake til i de neste ukene 1166 00:52:02,330 --> 00:52:07,140 komme, for visning minne som en hel haug av disse stablet 1167 00:52:07,140 --> 00:52:08,540 skuffer, så å si. 1168 00:52:08,540 --> 00:52:13,460 Fra bunnen på opp, slik at hver skuff som blir satt på stakken representerer 1169 00:52:13,460 --> 00:52:15,160 en funksjon som for tiden å bli kalt. 1170 00:52:17,970 --> 00:52:20,300 Eventuelle spørsmål? 1171 00:52:20,300 --> 00:52:22,890 Så hva med - la meg prøve å stille et spørsmål. 1172 00:52:22,890 --> 00:52:25,520 Jeg holder ødelegger det, men nå det er - you've alle sett guttens ansikt. 1173 00:52:25,520 --> 00:52:27,020 Så vi vil komme tilbake til det. 1174 00:52:27,020 --> 00:52:29,700 >> Så la meg stille et spørsmål her. 1175 00:52:29,700 --> 00:52:34,810 La meg forenkle dette tilbake til hva det var før noen av våre tidligere Q & A. 1176 00:52:34,810 --> 00:52:41,730 Og det faktum at tilveksten har åpen parentes, int antall, lukket 1177 00:52:41,730 --> 00:52:42,260 parentes. 1178 00:52:42,260 --> 00:52:46,370 Hva representerer int nummer? 1179 00:52:46,370 --> 00:52:47,250 [Uhørlig] 1180 00:52:47,250 --> 00:52:47,870 DAVID J. MALAN: Et argument. 1181 00:52:47,870 --> 00:52:50,732 Ok, men hva er et argument? 1182 00:52:50,732 --> 00:52:51,620 [Uhørlig] 1183 00:52:51,620 --> 00:52:52,500 DAVID J. MALAN: Beklager, hva er det? 1184 00:52:52,500 --> 00:52:53,150 SPEAKER 3: Noe du passerer i. 1185 00:52:53,150 --> 00:52:53,570 DAVID J. MALAN: Ok. 1186 00:52:53,570 --> 00:52:54,780 Så noe som du passerer i. 1187 00:52:54,780 --> 00:52:56,560 Og mer generelt, er det bare inngangen. 1188 00:52:56,560 --> 00:52:59,860 Hvis du skriver en funksjon og at funksjons mål i livet er å gjøre 1189 00:52:59,860 --> 00:53:03,290 noe litt annerledes hver gang du bruker den, så den eneste måten for 1190 00:53:03,290 --> 00:53:07,710 at det skal skje virkelig synes å være å gi den med innspill slik at den 1191 00:53:07,710 --> 00:53:10,180 kan gjøre noe annerledes med at innspill hver gang. 1192 00:53:10,180 --> 00:53:13,590 >> Så du trenger å angi to ting når en funksjon tar innganger. 1193 00:53:13,590 --> 00:53:17,240 Du må angi navnet du ønsker å gi til den inngangen, rent for 1194 00:53:17,240 --> 00:53:20,790 din egen bekvemmelighet, slik at du kan se den i funksjonen du 1195 00:53:20,790 --> 00:53:23,610 selv skriver, som jeg gjorde her i linje 32. 1196 00:53:23,610 --> 00:53:27,840 Men du må også angi sin type fordi C er et programmeringsspråk 1197 00:53:27,840 --> 00:53:28,840 som krever bare 1198 00:53:28,840 --> 00:53:31,810 at hvis du ønsker en variabel, må du fortelle datamaskinen hva 1199 00:53:31,810 --> 00:53:32,790 data type det er, 1200 00:53:32,790 --> 00:53:35,540 i stor grad slik at den vet hvor mange biter til 1201 00:53:35,540 --> 00:53:37,230 bevilge for denne variabelen. 1202 00:53:37,230 --> 00:53:38,600 Fordi det kan være seks - 1203 00:53:38,600 --> 00:53:39,990 lei, vil det ikke være seks. 1204 00:53:39,990 --> 00:53:41,050 Det kan være 16. 1205 00:53:41,050 --> 00:53:41,630 Det kan være 8. 1206 00:53:41,630 --> 00:53:44,410 Det kan være 32, selv 64. 1207 00:53:44,410 --> 00:53:45,820 Men datamaskinen trenger å vite. 1208 00:53:45,820 --> 00:53:49,110 Nå int på venstre side representerer det derimot? 1209 00:53:52,825 --> 00:53:53,780 [Uhørlig] 1210 00:53:53,780 --> 00:53:54,570 DAVID J. MALAN: Hva er det? 1211 00:53:54,570 --> 00:53:55,390 [Uhørlig] 1212 00:53:55,390 --> 00:53:57,920 DAVID J. MALAN: Typen av funksjonen og, mer spesifikt, 1213 00:53:57,920 --> 00:53:59,755 type produksjonen sin. 1214 00:53:59,755 --> 00:54:00,220 Høyre. 1215 00:54:00,220 --> 00:54:04,220 Så mens tingen i parentes representerer sin inngang, om noen, 1216 00:54:04,220 --> 00:54:06,640 ting til venstre representerer sin produksjon. 1217 00:54:06,640 --> 00:54:10,560 Og i dette tilfellet, returnerer tilvekst tilsynelatende en int. 1218 00:54:10,560 --> 00:54:14,590 Og så int er avkastningen type av denne funksjonen. 1219 00:54:14,590 --> 00:54:16,090 >> Hva betyr det å vende tilbake? 1220 00:54:16,090 --> 00:54:19,810 Bokstavelig talt, bruker du nøkkelordet retur. 1221 00:54:19,810 --> 00:54:24,640 Og så hvis det du er tilbake til høyre for søkeordet er en 1222 00:54:24,640 --> 00:54:28,340 heltall, så det er faktisk i samsvar med det vi har lovet. 1223 00:54:28,340 --> 00:54:31,110 Du kunne ikke gjøre noe som dette - 1224 00:54:31,110 --> 00:54:32,280 Hei, verden - 1225 00:54:32,280 --> 00:54:33,500 fordi det er en streng. 1226 00:54:33,500 --> 00:54:35,440 Selvfølgelig er det ikke et heltall. 1227 00:54:35,440 --> 00:54:40,450 Så kort sagt, er byrden virkelig på oss, programmerer, for å være spesifikk som 1228 00:54:40,450 --> 00:54:44,730 til hva vi er tilbake og deretter faktisk gå om retur det. 1229 00:54:44,730 --> 00:54:49,030 Og deretter å gjøre en tad mer tydelig sammenheng - 1230 00:54:49,030 --> 00:54:50,080 Der er han igjen. 1231 00:54:50,080 --> 00:54:51,060 Sammenheng - 1232 00:54:51,060 --> 00:54:52,830 stor overraskelse kommer i løpet av et øyeblikk. 1233 00:54:52,830 --> 00:54:57,720 Konteksten her nå er at datamaskinens minne er, igjen, en 1234 00:54:57,720 --> 00:54:59,070 gigabyte, to gigabyte, uansett. 1235 00:54:59,070 --> 00:54:59,630 Kanskje det er mer. 1236 00:54:59,630 --> 00:55:00,540 Kanskje det er mindre. 1237 00:55:00,540 --> 00:55:03,750 Men datamaskinen ser det som å ha forskjellige seksjoner. 1238 00:55:03,750 --> 00:55:04,860 Noe går der nede. 1239 00:55:04,860 --> 00:55:06,020 Noe annet går opp der. 1240 00:55:06,020 --> 00:55:07,540 Forskjellige ting går i midten. 1241 00:55:07,540 --> 00:55:09,300 Og i dag, vi bare begynne å fortelle denne historien. 1242 00:55:09,300 --> 00:55:11,130 >> Men vi vil komme tilbake til dette over tid. 1243 00:55:11,130 --> 00:55:15,000 For nå er det eneste stykke minne vi virkelig bryr seg om tekstsegment 1244 00:55:15,000 --> 00:55:17,160 fordi det representerer bare de nuller og enere 1245 00:55:17,160 --> 00:55:18,460 som Clang har generert. 1246 00:55:18,460 --> 00:55:21,570 Så når du kjører en kommando på tastaturet som a.out, eller du dobbeltklikker 1247 00:55:21,570 --> 00:55:25,350 klikk på et ikon på Mac OS eller Windows, er programmet lastet ned fra hardt 1248 00:55:25,350 --> 00:55:26,930 kjøre inn RAM. 1249 00:55:26,930 --> 00:55:30,850 Og det er plopped på toppen av datamaskinens RAM, så å si. 1250 00:55:30,850 --> 00:55:35,470 Nå i mellomtiden, som programmet starter, og viktigste blir kalt i 1251 00:55:35,470 --> 00:55:39,240 program du har skrevet eller programmet Microsoft eller Apple skrev noen av sine 1252 00:55:39,240 --> 00:55:42,930 lokale variabler ender opp der nede på bunnen av datamaskinens minne. 1253 00:55:42,930 --> 00:55:46,490 Men hvis viktigste ringer en annen funksjon som selv har variabler eller 1254 00:55:46,490 --> 00:55:48,340 argumenter, de ender opp over det. 1255 00:55:48,340 --> 00:55:50,670 Og hvis det funksjon kaller noe, ender de opp over det, 1256 00:55:50,670 --> 00:55:51,840 ovenfor det, ovenfor den. 1257 00:55:51,840 --> 00:55:56,100 Og bare en gang i funksjonen er ferdig utfører gjør stabelen med skuffer, så 1258 00:55:56,100 --> 00:55:58,320 å snakke, begynne å bli lavere og lavere. 1259 00:55:58,320 --> 00:56:03,370 Og dette er hva da, i et nøtteskall, forklarer hvorfor, når du ringer kube - 1260 00:56:03,370 --> 00:56:04,660 eller du kaller stigning - 1261 00:56:04,660 --> 00:56:06,490 du passerer i en kopi av verdien. 1262 00:56:06,490 --> 00:56:09,840 Og hva det betyr billedlig er at du bokstavelig talt skrive 1263 00:56:09,840 --> 00:56:14,540 nummer 1 i en annen del av minnet, endring at 1-2, i tilfelle av 1264 00:56:14,540 --> 00:56:15,360 stigning - 1265 00:56:15,360 --> 00:56:17,450 eller til en 8, i tilfellet av kuben - 1266 00:56:17,450 --> 00:56:21,450 og deretter kaste at minnet bort så snart tilvekst eller kuben 1267 00:56:21,450 --> 00:56:23,410 funksjonen returnerer. 1268 00:56:23,410 --> 00:56:24,267 >> Spørsmål. 1269 00:56:24,267 --> 00:56:25,517 [Uhørlig] 1270 00:56:28,090 --> 00:56:29,970 DAVID J. MALAN: Hvor - globale variabler er lagret i hva som er 1271 00:56:29,970 --> 00:56:32,960 i dag kalt initialisert data eller uinitialiserte data. 1272 00:56:32,960 --> 00:56:35,900 Forskjellen er, hvis du har en global variabel, og du tilordne det 1273 00:56:35,900 --> 00:56:39,530 umiddelbart en verdi med likhetstegnet, ender det opp på toppen der. 1274 00:56:39,530 --> 00:56:43,390 Og hvis du bare si int x semikolon uten verdi, ender det opp litt 1275 00:56:43,390 --> 00:56:46,670 lavere i RAM ved å konvensjonen. 1276 00:56:46,670 --> 00:56:49,308 Andre spørsmål. 1277 00:56:49,308 --> 00:56:49,750 OK. 1278 00:56:49,750 --> 00:56:53,040 >> Så dette bildet vil komme tilbake som vi får mer kraftig med hva vi kan gjøre 1279 00:56:53,040 --> 00:56:53,830 med datamaskinen. 1280 00:56:53,830 --> 00:56:58,790 Men for nå, la oss ta en kort intro til kryptografi, en bestemt type 1281 00:56:58,790 --> 00:57:01,910 kryptografi som ikke løser alle verdens problemer, men løser 1282 00:57:01,910 --> 00:57:02,480 noen av dem. 1283 00:57:02,480 --> 00:57:06,090 I dette tilfellet her har vi noe som heter hemmelig nøkkel kryptografi. 1284 00:57:06,090 --> 00:57:10,430 Og hemmelig nøkkel kryptografi, som navnet antyder, stammer sikkerhet 1285 00:57:10,430 --> 00:57:11,330 fra en hemmelighet. 1286 00:57:11,330 --> 00:57:14,720 Så for eksempel, hvis du er tilbake på grunnskolen og du passerer en 1287 00:57:14,720 --> 00:57:18,040 liten hemmelighet kjærlighetsbrev til gutten eller jenta du er knusende på - hvis du 1288 00:57:18,040 --> 00:57:20,820 ønsket å passere som gjennom publikum, har du sannsynligvis ikke ville skrive 1289 00:57:20,820 --> 00:57:24,120 slik et notat på engelsk eller hva morsmålet ditt er, heller, du 1290 00:57:24,120 --> 00:57:25,800 kan kryptere den. 1291 00:57:25,800 --> 00:57:27,820 Eller du kan bare sende dem en tekstmelding i disse dager. 1292 00:57:27,820 --> 00:57:30,310 Men du kan faktisk sende dem et notat i hele klasserommet. 1293 00:57:30,310 --> 00:57:33,820 Og for å gjøre dette sikkert, på en slik måte at dine venner og læreren 1294 00:57:33,820 --> 00:57:36,820 vet ikke hva du skriver, kan du komme opp med en ganske enkel 1295 00:57:36,820 --> 00:57:37,800 algoritme - 1296 00:57:37,800 --> 00:57:39,290 ung om du kan være - 1297 00:57:39,290 --> 00:57:40,780 å bare krafse ordene. 1298 00:57:40,780 --> 00:57:44,390 Så i stedet for å skrive en, kan du skrive B. I stedet for B, kan du skrive 1299 00:57:44,390 --> 00:57:46,670 C. I stedet for C, kan du skrive D, og ​​så videre. 1300 00:57:46,670 --> 00:57:50,020 Eller du kan komme opp med en mer sofistikert oversettelse av brev 1301 00:57:50,020 --> 00:57:51,300 til forskjellige bokstaver. 1302 00:57:51,300 --> 00:57:55,440 Men fangsten er gutt eller jente som du sender dette notatet må 1303 00:57:55,440 --> 00:57:56,850 vet noe. 1304 00:57:56,850 --> 00:57:59,620 Som er det, selvsagt? 1305 00:57:59,620 --> 00:58:01,400 Liker, hva hemmeligheten er. 1306 00:58:01,400 --> 00:58:04,620 Liker, hva er det mapping mellom As og Bs og Cs og Ds? 1307 00:58:04,620 --> 00:58:08,780 Er det bare å legge en, så å si, til hver av bokstavene til å gå fra 1308 00:58:08,780 --> 00:58:09,730 A til B, B til C? 1309 00:58:09,730 --> 00:58:11,350 Er det mer komplisert enn som så? 1310 00:58:11,350 --> 00:58:16,450 Slik at du og din knuse trenger å ha denne hemmelig informasjon. 1311 00:58:16,450 --> 00:58:18,170 Men det er litt av en catch-22 her. 1312 00:58:18,170 --> 00:58:20,760 Hvis dette er den aller første gangen du skal sende denne kjærlighetsbrev gjennom 1313 00:58:20,760 --> 00:58:25,590 klasse, hvordan det gutt eller jente kommer til å vite hva hemmeligheten selv er? 1314 00:58:25,590 --> 00:58:28,450 Så hemmelig nøkkel kryptering løser ikke alle verdens problemer. 1315 00:58:28,450 --> 00:58:30,490 Og det er faktisk et forhold som vi vil komme tilbake til mot 1316 00:58:30,490 --> 00:58:31,370 semesters slutt. 1317 00:58:31,370 --> 00:58:35,970 >> Tilsvarende har ingen av oss noen sinne sendt en - 1318 00:58:35,970 --> 00:58:39,453 Tilsvarende, de fleste av oss ikke kjenner noen som fungerer, for eksempel på 1319 00:58:39,453 --> 00:58:40,300 Amazon.com. 1320 00:58:40,300 --> 00:58:43,130 Og likevel har mange av oss sannsynligvis kjøpt ting på Amazon.com. 1321 00:58:43,130 --> 00:58:45,670 Og vi har blitt opplært til å anta at disse e-handel 1322 00:58:45,670 --> 00:58:47,060 transaksjoner er sikre. 1323 00:58:47,060 --> 00:58:47,210 Rett? 1324 00:58:47,210 --> 00:58:49,310 Nettadressen sier trolig https. 1325 00:58:49,310 --> 00:58:51,590 Det er kanskje en dum liten hengelås sted. 1326 00:58:51,590 --> 00:58:54,680 Det er en slags kryptografi sikre kredittkortinformasjonen 1327 00:58:54,680 --> 00:58:56,980 mellom deg og Amazon.com. 1328 00:58:56,980 --> 00:59:00,410 Og likevel, hvis kryptografi innebærer å vite noen hemmelighet, og likevel gjør jeg ikke 1329 00:59:00,410 --> 00:59:03,330 Vet noen på Amazon, og jeg har absolutt ikke arrangert noen form for 1330 00:59:03,330 --> 00:59:07,350 Hemmeligheten med noen på Amazon, er hvordan min datamaskin eller nettleseren min å gjøre dette? 1331 00:59:07,350 --> 00:59:10,100 Vel, det viser seg det er andre typer kryptografi sammen som løser 1332 00:59:10,100 --> 00:59:10,740 det problemet. 1333 00:59:10,740 --> 00:59:13,610 Men for i dag, vil vi fokusere på enkel en, der du kan ordne i 1334 00:59:13,610 --> 00:59:18,480 avansere til kjenne noen hemmelighet, som i tillegg til en eller noen tilordning mellom As og Bs. 1335 00:59:18,480 --> 00:59:20,710 >> Og prosessen med kryptografi generelt innebærer dette. 1336 00:59:20,710 --> 00:59:23,550 Du har noen ren tekst, avbildet her til venstre. 1337 00:59:23,550 --> 00:59:26,260 Du kjører det gjennom en slags algoritme eller prosedyre 1338 00:59:26,260 --> 00:59:27,670 for kryptering det. 1339 00:59:27,670 --> 00:59:31,390 Kanskje det er bare A blir B, blir B C. Og så ender du opp med 1340 00:59:31,390 --> 00:59:32,260 uleselig tekst. 1341 00:59:32,260 --> 00:59:36,450 I mellomtiden, når forelskelsen mottar hemmelige notatet, har han eller hun til da 1342 00:59:36,450 --> 00:59:39,950 dekryptere den ved generelt reversere at algoritmen slik som å få 1343 00:59:39,950 --> 00:59:41,640 tilbake ren tekst. 1344 00:59:41,640 --> 00:59:43,860 Nå er det fysiske inkarnasjoner av dette. 1345 00:59:43,860 --> 00:59:46,720 For eksempel er dette en liten hemmelighet dekoder ring. 1346 00:59:46,720 --> 00:59:50,060 Og dette er en ring i den forstand at det er to ringer her. 1347 00:59:50,060 --> 00:59:53,630 På utsiden periferien av denne tingen, det er bokstavene A til Z, 1348 00:59:53,630 --> 00:59:55,110 selv om de er i tilfeldig rekkefølge. 1349 00:59:55,110 --> 00:59:58,410 Og på innsiden, det er faktisk noen tall, slik at med dette 1350 00:59:58,410 --> 01:00:02,940 ring, kan du slags slå utsiden, men ikke på innsiden for å stille opp 1351 01:00:02,940 --> 01:00:04,110 tall med bokstaver. 1352 01:00:04,110 --> 01:00:08,290 Og i klippet du er i ferd med å se - noen som du kanskje har sett 24/7 1353 01:00:08,290 --> 01:00:11,120 rundt jula fra en film som heter A Christmas Story. 1354 01:00:11,120 --> 01:00:16,050 Du vil se at lille Ralphie var så ivrig etter å finne ut hva liten foreldreløs 1355 01:00:16,050 --> 01:00:19,810 Annie hemmelige budskap var til ham som hadde blitt kommunisert, tror jeg, i 1356 01:00:19,810 --> 01:00:22,810 danne av numeriske meldinger på en seriell boks. 1357 01:00:22,810 --> 01:00:26,760 Og du måtte samle alle de små kortene som kom 1358 01:00:26,760 --> 01:00:27,480 i frokostblanding boksen. 1359 01:00:27,480 --> 01:00:28,320 Du måtte sende dem i. 1360 01:00:28,320 --> 01:00:31,060 Du måtte komme tilbake den hemmelige dekoder ring, slik at du kan endelig finne 1361 01:00:31,060 --> 01:00:34,190 ut hva kartleggingen er mellom bokstaver og tall, 1362 01:00:34,190 --> 01:00:35,420 eller bokstaver og bokstaver. 1363 01:00:35,420 --> 01:00:39,790 Så jeg gir deg denne korte klipp fra A Christmas Story å motivere pset 2 og 1364 01:00:39,790 --> 01:00:42,340 vår diskusjon, i et øyeblikk, for arrays. 1365 01:00:42,340 --> 01:00:43,773 Så her har vi Ralphie. 1366 01:00:43,773 --> 01:00:44,126 >> [VIDEOAVSPILLING] 1367 01:00:44,126 --> 01:00:47,470 -La det være kjent for alle og enhver at Ralph Parker herved utnevnt en 1368 01:00:47,470 --> 01:00:50,690 medlem av Little Orphan Annie Secret Circle og har krav på 1369 01:00:50,690 --> 01:00:53,500 æren og fordeler forekommer dette. 1370 01:00:53,500 --> 01:00:56,040 -Signert, Little Orphan Annie. 1371 01:00:56,040 --> 01:00:58,730 Countersigned, Pierre Andre! 1372 01:00:58,730 --> 01:01:00,150 I blekk! 1373 01:01:00,150 --> 01:01:02,910 Æresbevisninger og fordeler, som allerede i en alder av ni. 1374 01:01:09,970 --> 01:01:10,730 Kom igjen, la oss fortsette med det. 1375 01:01:10,730 --> 01:01:15,000 Jeg trenger ikke all that jazz om smuglere og pirater. 1376 01:01:15,000 --> 01:01:17,624 -Lytt morgen kveld for den avsluttende eventyr av The Black 1377 01:01:17,624 --> 01:01:19,710 Pirate Ship. 1378 01:01:19,710 --> 01:01:23,380 Nå er det tid for Annie hemmelige budskap til deg medlemmer 1379 01:01:23,380 --> 01:01:25,670 av Secret Circle. 1380 01:01:25,670 --> 01:01:30,260 Husk, barn, kan bare medlemmer av Annie Secret Circle dekode 1381 01:01:30,260 --> 01:01:31,660 Annie hemmelige budskap. 1382 01:01:31,660 --> 01:01:36,230 Husk at Annie avhengig av deg. 1383 01:01:36,230 --> 01:01:38,720 Sett dine pins til B2. 1384 01:01:38,720 --> 01:01:41,040 Her er budskapet. 1385 01:01:41,040 --> 01:01:42,470 12, 11 - 1386 01:01:42,470 --> 01:01:46,000 -Jeg er i mitt første hemmelig møte. 1387 01:01:46,000 --> 01:01:49,440 -14, 11, 18, 16 - 1388 01:01:49,440 --> 01:01:51,700 -Pierre var i stor stemme i kveld. 1389 01:01:51,700 --> 01:01:54,890 Jeg kunne fortelle at kveldens budskap var veldig viktig. 1390 01:01:54,890 --> 01:01:56,750 -3, 25. 1391 01:01:56,750 --> 01:01:58,590 Det er en melding fra Annie selv. 1392 01:01:58,590 --> 01:01:59,840 Husk, ikke si det til noen. 1393 01:02:04,570 --> 01:02:08,750 -90 Sekunder senere, jeg er i det eneste rommet i huset der en gutt på ni 1394 01:02:08,750 --> 01:02:12,980 kunne sitte i fred og dekode. 1395 01:02:12,980 --> 01:02:17,130 Aha, gikk B. Jeg til den neste. 1396 01:02:17,130 --> 01:02:20,330 E. Det første ordet er være. 1397 01:02:20,330 --> 01:02:22,670 S. Det kom lettere nå. 1398 01:02:22,670 --> 01:02:24,590 U. 1399 01:02:24,590 --> 01:02:26,510 -Kom igjen, Ralphie. 1400 01:02:26,510 --> 01:02:28,430 Jeg må gå. 1401 01:02:28,430 --> 01:02:30,350 -Jeg er rett ned, ma. 1402 01:02:30,350 --> 01:02:33,720 -Jøss. 1403 01:02:33,720 --> 01:02:38,270 -T, O. Pass til. 1404 01:02:38,270 --> 01:02:40,000 Pass på hva? 1405 01:02:40,000 --> 01:02:42,105 Hva var Little Orphan Annie prøver å si? 1406 01:02:42,105 --> 01:02:43,095 Pass på hva? 1407 01:02:43,095 --> 01:02:43,590 -Ralphie! 1408 01:02:43,590 --> 01:02:44,580 Randy har å gå. 1409 01:02:44,580 --> 01:02:45,570 Kan du komme ut? 1410 01:02:45,570 --> 01:02:46,560 -Greit, ma. 1411 01:02:46,560 --> 01:02:48,540 Jeg kommer rett ut. 1412 01:02:48,540 --> 01:02:50,580 -Jeg begynte å bli nærmere nå. 1413 01:02:50,580 --> 01:02:52,550 Spenningen var forferdelig. 1414 01:02:52,550 --> 01:02:53,355 Hva var det? 1415 01:02:53,355 --> 01:02:56,315 Skjebnen til planeten kan henge i balanse. 1416 01:02:56,315 --> 01:02:56,790 -Ralphie! 1417 01:02:56,790 --> 01:02:59,165 Randy er nødt til å gå. 1418 01:02:59,165 --> 01:03:02,310 -Jeg er rett ut, for roper høyt. 1419 01:03:02,310 --> 01:03:04,000 -Jøss, nesten der. 1420 01:03:04,000 --> 01:03:05,180 Fingrene mine fløy. 1421 01:03:05,180 --> 01:03:07,150 Mitt sinn var en stål felle. 1422 01:03:07,150 --> 01:03:08,790 Hver pore dirret. 1423 01:03:08,790 --> 01:03:10,040 Det var nesten klar. 1424 01:03:10,040 --> 01:03:13,400 Ja, ja, ja, ja. 1425 01:03:13,400 --> 01:03:18,960 -Sørg for å drikke din Ovaltine. 1426 01:03:18,960 --> 01:03:20,210 Ovaltine? 1427 01:03:24,010 --> 01:03:25,260 En crummy kommersielle? 1428 01:03:28,200 --> 01:03:29,640 Drittsekk. 1429 01:03:29,640 --> 01:03:33,340 [END VIDEOAVSPILLING] 1430 01:03:33,340 --> 01:03:36,040 >> DAVID J. MALAN: Så det har vi kryptografi. 1431 01:03:36,040 --> 01:03:39,670 Så hvordan i en datamaskin kan vi gå om etablering eller 1432 01:03:39,670 --> 01:03:40,950 representerer ting som dette? 1433 01:03:40,950 --> 01:03:44,430 Vel, vi trenger en måte å uttrykke oss selv litt mer fleksibelt enn 1434 01:03:44,430 --> 01:03:46,420 våre variabler så langt har tillatt. 1435 01:03:46,420 --> 01:03:47,370 Vi har hatt ints. 1436 01:03:47,370 --> 01:03:48,380 Vi har hatt tegn. 1437 01:03:48,380 --> 01:03:50,790 Vi har hatt flyter og dobbeltrom og noen få andre. 1438 01:03:50,790 --> 01:03:55,050 Men de er individuelle deler av minnet som ikke egentlig tillate oss å 1439 01:03:55,050 --> 01:03:58,010 uttrykke ting som ord og setninger og uttrykk. 1440 01:03:58,010 --> 01:04:00,200 Faktisk har vi kalt slike ting strenger. 1441 01:04:00,200 --> 01:04:03,650 Men vi lovet at dette er egentlig bare en forenkling i CS50 1442 01:04:03,650 --> 01:04:07,020 bibliotek som vi har tenkt å skrelle tilbake. 1443 01:04:07,020 --> 01:04:08,970 >> Og så la oss begynne å gjøre det her. 1444 01:04:08,970 --> 01:04:11,130 La meg gå videre og åpne opp en fil - 1445 01:04:11,130 --> 01:04:13,770 alle disse filene er tilgjengelig som vanlig på nettet - 1446 01:04:13,770 --> 01:04:19,120 kalt array.c å løse et problem som ikke er relatert til strenger, men det tegner et 1447 01:04:19,120 --> 01:04:23,040 bilde her av hvordan vi kan bruke noe som kalles en matrise. 1448 01:04:23,040 --> 01:04:25,530 En matrise er en datatype. 1449 01:04:25,530 --> 01:04:31,320 Det er en type variabel, sorterer, som har flere mindre datatyper 1450 01:04:31,320 --> 01:04:34,150 innsiden av det tilbake til tilbake til rygg mot rygg. 1451 01:04:34,150 --> 01:04:37,700 Så for eksempel, hvis vi ønsker å skrive et lite program som gir deg din 1452 01:04:37,700 --> 01:04:42,110 quiz gjennomsnittet for et kurs som 50 som har to spørrekonkurranser, du kan veldig lett 1453 01:04:42,110 --> 01:04:45,170 skrive dette programmet - basert selv på noen av forrige ukes materiale - 1454 01:04:45,170 --> 01:04:47,770 ved hjelp GetInt og et par variable. 1455 01:04:47,770 --> 01:04:51,920 Int quiz1, quiz2 int, og det er ganske grei. 1456 01:04:51,920 --> 01:04:55,930 Det er kanskje 10, 20 linjer med kode, maks, for å gjennomføre et program som ber 1457 01:04:55,930 --> 01:05:01,170 bruker for to quiz score og deretter regner gjennomsnittlig ved å legge dem 1458 01:05:01,170 --> 01:05:03,850 sammen, dividere med to, og deretter skrive resultatene. 1459 01:05:03,850 --> 01:05:06,380 Vi kunne sannsynligvis gjøre det ganske lett nå etter 1460 01:05:06,380 --> 01:05:07,510 noen flere minutter. 1461 01:05:07,510 --> 01:05:11,005 >> Men problemet er at anta at 50 hadde tre quizer eller fire. 1462 01:05:11,005 --> 01:05:13,510 Anta at du ønsket å bruke det samme programmet for en klasse som hadde 1463 01:05:13,510 --> 01:05:14,850 ukentlig quiz. 1464 01:05:14,850 --> 01:05:16,610 Tenk om en klasse som har ukentlige quiz. 1465 01:05:16,610 --> 01:05:20,610 Hvis det er som 16 eller så uker i et semester, nå har du 16 variabler - 1466 01:05:20,610 --> 01:05:24,270 int quiz1, int quiz2, int quiz3, quiz4 int. 1467 01:05:24,270 --> 01:05:27,560 Så snart du begynner å se denne redundans, dette kopiere og lime inn 1468 01:05:27,560 --> 01:05:31,390 av koden, bør det begynne å gjøre deg skulle ønske det var en bedre måte. 1469 01:05:31,390 --> 01:05:33,930 Og heldigvis, på grunn av matriser, er det. 1470 01:05:33,930 --> 01:05:34,980 Så la oss gjøre dette. 1471 01:05:34,980 --> 01:05:38,430 Først, la meg presentere en veldig enkel ting som vi ikke har brukt så langt, 1472 01:05:38,430 --> 01:05:40,140 men du vil se det noen ganger i koden. 1473 01:05:40,140 --> 01:05:42,360 Dette er hva som er generelt kalt en konstant. 1474 01:05:42,360 --> 01:05:45,790 Så det er en konstant i den forstand at denne verdien ikke endres. 1475 01:05:45,790 --> 01:05:49,210 Den menneskelige konvensjonen når du oppretter en konstant er å bruke all kapital 1476 01:05:49,210 --> 01:05:51,940 brev, bare slik at det virkelig skiller seg ut i koden din. 1477 01:05:51,940 --> 01:05:55,960 Og den spesielle nøkkelord som du bruker i C er å definere #. 1478 01:05:55,960 --> 01:06:00,250 Så hvis du sier # define, deretter et mellomrom, deretter ordet du vil bruke for 1479 01:06:00,250 --> 01:06:03,260 konstanten navn, og deretter verdien av konstanten. 1480 01:06:03,260 --> 01:06:06,180 Så varsel, er dette forskjellig fra å tildele noe til en variabel. 1481 01:06:06,180 --> 01:06:07,020 Det er ingen likhetstegn. 1482 01:06:07,020 --> 01:06:08,240 Det er ingen semikolon. 1483 01:06:08,240 --> 01:06:11,410 Dette er hva som er allment kjent som en preprosessor direktivet, men mer på 1484 01:06:11,410 --> 01:06:12,210 at en annen gang. 1485 01:06:12,210 --> 01:06:18,540 >> For nå, skaper dette en uforanderlig verdi som kalles quizer som faktisk 1486 01:06:18,540 --> 01:06:19,940 numerisk verdi er 2. 1487 01:06:19,940 --> 01:06:24,020 Så når du ser spørrekonkurranser, quiz, spørrekonkurranser hele denne filen, er at 1488 01:06:24,020 --> 01:06:25,410 bare nummer 2. 1489 01:06:25,410 --> 01:06:28,100 Nå, hvis jeg ser på main nå, la oss se hvordan dette fungerer. 1490 01:06:28,100 --> 01:06:29,500 Ved første, ser det litt kryptisk. 1491 01:06:29,500 --> 01:06:31,340 Men det er all ting fra uke én. 1492 01:06:31,340 --> 01:06:32,710 Spør brukeren for karakterer. 1493 01:06:32,710 --> 01:06:33,630 Hvordan gjør vi dette? 1494 01:06:33,630 --> 01:06:35,470 Vel, i linje 22 - 1495 01:06:35,470 --> 01:06:37,210 dette er virkelig saftig del - 1496 01:06:37,210 --> 01:06:40,960 Jeg erklærer en flåte, men ikke bare en enkelt flåte. 1497 01:06:40,960 --> 01:06:44,620 Jeg erklærer heller en rekke flytpunktverdier. 1498 01:06:44,620 --> 01:06:49,100 Den variabelen kommer til å bli kalt karakterer, som underforstått her. 1499 01:06:49,100 --> 01:06:53,080 Men den eneste stykke av ny syntaks så er disse hakeparenteser, det faktum 1500 01:06:53,080 --> 01:06:59,350 at jeg har sagt float karakterer og deretter åpen klamme og deretter et tall. 1501 01:06:59,350 --> 01:07:02,460 Varsel, hvis dette er en konstant, er dette akkurat som vi gjorde dette. 1502 01:07:02,460 --> 01:07:06,890 Dette betyr hei datamaskin, gi meg to flottører, og la oss kollektivt kalle 1503 01:07:06,890 --> 01:07:08,220 dem karakterer. 1504 01:07:08,220 --> 01:07:11,920 Dette er i kontrast til en mye mer langtekkelig prosess som dette. 1505 01:07:11,920 --> 01:07:15,850 Float Grade1, flyte Grade2, og så videre. 1506 01:07:15,850 --> 01:07:20,010 Så en matrise tillater oss å gjennomføre denne ideen, men mye mindre messily, i 1507 01:07:20,010 --> 01:07:24,630 en slik måte at vi kan skrive en linje med kode i stedet for, sier 16 for en 16 1508 01:07:24,630 --> 01:07:25,740 uke semester. 1509 01:07:25,740 --> 01:07:29,950 Så jeg ønsker ikke å hard-kode 2 fordi hvis du tenker på dette nå 1510 01:07:29,950 --> 01:07:34,160 logisk - anta neste år CS50 endringer i 3 quizer i stedet. 1511 01:07:34,160 --> 01:07:35,510 Og jeg hadde nummer 2 her. 1512 01:07:35,510 --> 01:07:36,600 Jeg hadde nummer 2 her. 1513 01:07:36,600 --> 01:07:37,580 Jeg hadde nummer 2 her. 1514 01:07:37,580 --> 01:07:38,560 Jeg hadde nummer 2 her. 1515 01:07:38,560 --> 01:07:43,180 Det blir veldig kjedelig og veldig lett å skru opp og til uhell endrer 1516 01:07:43,180 --> 01:07:47,690 en verdi til 3 og savner noen annen verdi med 2 stk. 1517 01:07:47,690 --> 01:07:52,460 Så jeg kommer til stedet abstrakt dette bort og bruke denne konstant som, som sin 1518 01:07:52,460 --> 01:07:54,120 navnet antyder, aldri endres. 1519 01:07:54,120 --> 01:07:57,710 Og nå, quizer uansett om vi har annerledes i år eller neste, jeg 1520 01:07:57,710 --> 01:08:01,210 må bare endre det på ett sted, her oppe på toppen. 1521 01:08:01,210 --> 01:08:02,720 >> Så det er all konstant er. 1522 01:08:02,720 --> 01:08:08,680 I mellomtiden er den nye konseptuelle funksjon som av en matrise. 1523 01:08:08,680 --> 01:08:14,660 Så klammeparentesene gi meg så mange flyter og lar meg kollektivt 1524 01:08:14,660 --> 01:08:16,630 kaller dem karakterer her. 1525 01:08:16,630 --> 01:08:17,990 Så la oss nå se hva jeg skal gjøre. 1526 01:08:17,990 --> 01:08:20,359 Her i linje 24 er begynnelsen av en for løkke. 1527 01:08:20,359 --> 01:08:22,260 Dette er egentlig ikke noe fancy. 1528 01:08:22,260 --> 01:08:25,060 Det er bare å bruke spørrekonkurranser stedet for en hardkodet nummer. 1529 01:08:25,060 --> 01:08:27,790 Men det er ingenting intellektuelt annerledes der fra forrige uke. 1530 01:08:27,790 --> 01:08:29,040 Dette er bare printf. 1531 01:08:29,040 --> 01:08:35,490 Så printf ("quiz nummer% d av% ​​d") fordi jeg vil bare skrive ut gi meg quiz 1532 01:08:35,490 --> 01:08:38,050 nummer én av to og deretter to av to. 1533 01:08:38,050 --> 01:08:39,850 Så dette er en ren estetisk ting. 1534 01:08:39,850 --> 01:08:42,500 Men det interessante delen er nå på linje 27. 1535 01:08:42,500 --> 01:08:48,310 For å fylle en av de to plassholderne med et flyttall 1536 01:08:48,310 --> 01:08:51,029 verdi, du igjen bruke hakeparenteser. 1537 01:08:51,029 --> 01:08:55,620 I dette tilfellet, jeg bruker jeg fordi dette for loop har startet med i tilsvarende 1538 01:08:55,620 --> 01:08:57,560 hva verdien, tilsynelatende? 1539 01:08:57,560 --> 01:08:58,279 0. 1540 01:08:58,279 --> 01:09:01,350 >> Så på den første iterasjon av denne sløyfen, er det som om jeg 1541 01:09:01,350 --> 01:09:02,689 skrev dette i koden. 1542 01:09:02,689 --> 01:09:05,580 Men på den andre iterasjon av denne sløyfen, er det som om jeg 1543 01:09:05,580 --> 01:09:07,750 skrev dette i min kode. 1544 01:09:07,750 --> 01:09:10,750 Men det faktum at jeg bruker en variabel er perfekt fordi, som navnet 1545 01:09:10,750 --> 01:09:14,300 antyder, er det varierende sin verdi på hver iterasjon. 1546 01:09:14,300 --> 01:09:17,370 Så jeg fyller denne tabellen ett sted om gangen. 1547 01:09:17,370 --> 01:09:18,910 Hvordan ser denne tabellen ut? 1548 01:09:18,910 --> 01:09:21,430 Vel, grunnen til at jeg trakk denne super enkle rektangel på skjermen her 1549 01:09:21,430 --> 01:09:23,350 før var på grunn av dette. 1550 01:09:23,350 --> 01:09:27,279 En matrise er bare en del av minnet etterfulgt av en annen del av minnet, 1551 01:09:27,279 --> 01:09:30,109 etterfulgt av en annen del av minnet, og så videre. 1552 01:09:30,109 --> 01:09:35,260 Så hvis min array er av størrelse 2, i dette tilfellet her, alt jeg ville gjøre med 1553 01:09:35,260 --> 01:09:37,590 skrive i min quiz score, som her. 1554 01:09:37,590 --> 01:09:39,430 Jeg fikk 100 på denne. 1555 01:09:39,430 --> 01:09:42,020 Og så fikk jeg en 99 på dette. 1556 01:09:42,020 --> 01:09:46,040 Da dette minnet kanskje ikke engang brukes fordi jeg har bare spurt 1557 01:09:46,040 --> 01:09:48,689 datamaskin for en matrise av størrelse 2. 1558 01:09:48,689 --> 01:09:50,180 Disse rutene er der fortsatt. 1559 01:09:50,180 --> 01:09:50,340 Rett? 1560 01:09:50,340 --> 01:09:52,500 Du har fortsatt to gigabyte RAM, selv om du bare 1561 01:09:52,500 --> 01:09:53,979 ber om to flyter. 1562 01:09:53,979 --> 01:09:58,710 Så ideen bak arrays er at datamaskinen bare tar en bit av minne 1563 01:09:58,710 --> 01:10:03,230 og apportions deretter mindre biter rygg mot rygg til rygg mot rygg. 1564 01:10:03,230 --> 01:10:04,740 Og så det er alt en matrise er. 1565 01:10:04,740 --> 01:10:09,080 Det er en sammenhengende del av minnet, innsiden av som du kan sette ting. 1566 01:10:09,080 --> 01:10:12,400 >> Nå skjer så gjør bare noen kjedelig aritmetikk. 1567 01:10:12,400 --> 01:10:16,170 Hvis jeg ruller nedover her, dette er hvor jeg da iterere over tabellen. 1568 01:10:16,170 --> 01:10:19,410 Jeg kommer opp med summering av alle verdiene i tabellen. 1569 01:10:19,410 --> 01:10:22,390 Og så bruker jeg den runde funksjon her å faktisk gjøre 1570 01:10:22,390 --> 01:10:23,940 summen deles spørrekonkurranser. 1571 01:10:23,940 --> 01:10:27,450 Men la meg bølge min hånd på det som en slags nok aritmetikk for nå. 1572 01:10:27,450 --> 01:10:30,010 Men alle som gjør for meg til slutt beregner et gjennomsnitt. 1573 01:10:30,010 --> 01:10:33,640 Så første quiz pluss andre quiz, delt på to, og deretter skrive ut 1574 01:10:33,640 --> 01:10:34,700 det ut som en int. 1575 01:10:34,700 --> 01:10:39,030 >> Men la oss nå gjøre overgangen til et annet eksempel heter streng1, 1576 01:10:39,030 --> 01:10:42,370 som maler et lignende bilde, men bruker strenger. 1577 01:10:42,370 --> 01:10:45,550 La meg gå videre og forenkle dette for bare et øyeblikk. 1578 01:10:45,550 --> 01:10:48,340 Og tilgi innrykk for nå. 1579 01:10:48,340 --> 01:10:52,280 Varsel i linje 19 i denne eksempel, får jeg en streng fra brukeren. 1580 01:10:52,280 --> 01:10:55,780 Men legg merke hva jeg neste gjøre i linjer 22 og fremover. 1581 01:10:55,780 --> 01:11:00,260 Jeg er faktisk iterating fra jeg opp til - og dette er et nytt triks - 1582 01:11:00,260 --> 01:11:02,730 strlen, hyssinglengde. 1583 01:11:02,730 --> 01:11:07,010 Dette er en funksjon som kommer med C at hvis du sender den en streng, forteller det 1584 01:11:07,010 --> 01:11:08,950 deg hvor mange tegn er i strengen. 1585 01:11:08,950 --> 01:11:09,440 Det er alt. 1586 01:11:09,440 --> 01:11:12,520 Det faktum at det er strlen stedet for streng lengde er bare fordi det er 1587 01:11:12,520 --> 01:11:13,040 mer konsis. 1588 01:11:13,040 --> 01:11:17,100 30 år siden, likte folk å skrive ting som konsist som mulig. 1589 01:11:17,100 --> 01:11:19,080 Så vi har holdt at konvensjonen her. 1590 01:11:19,080 --> 01:11:21,730 i + + betyr bare øke jeg i hver iterasjon. 1591 01:11:21,730 --> 01:11:24,310 Og nå merke til dette, noe som er veldig interessant. 1592 01:11:24,310 --> 01:11:28,730 Så i linje 24, sier jeg datamaskin, gi meg et tegn, åtte 1593 01:11:28,730 --> 01:11:30,770 biter, og kaller det c. 1594 01:11:30,770 --> 01:11:35,370 Men hva er dette på høyre side sier? 1595 01:11:35,370 --> 01:11:38,150 På engelsk, hva som representerer? 1596 01:11:38,150 --> 01:11:40,070 [Uhørlig] 1597 01:11:40,070 --> 01:11:40,490 DAVID J. MALAN: Nettopp. 1598 01:11:40,490 --> 01:11:42,390 Gi meg det første tegnet i rekken. 1599 01:11:42,390 --> 01:11:45,400 Eller mer generelt, gi meg i-th karakter i tabellen. 1600 01:11:45,400 --> 01:11:48,230 Og realisere det er viktig nå at så dataforskere, er vi faktisk 1601 01:11:48,230 --> 01:11:49,330 telle fra 0. 1602 01:11:49,330 --> 01:11:51,290 Du har ikke skjønn nå for å begynne å gjøre dette. 1603 01:11:51,290 --> 01:11:54,580 Nå må du oppføre seg i henhold til datamaskinens forventninger og 1604 01:11:54,580 --> 01:11:58,010 telle fra null fordi [0] kommer til å være den første 1605 01:11:58,010 --> 01:11:59,670 tegnet i en streng. 1606 01:11:59,670 --> 01:12:01,320 [1] kommer til å bli den andre. 1607 01:12:01,320 --> 01:12:03,610 [2] kommer til å bli den tredje, og så videre. 1608 01:12:03,610 --> 01:12:08,840 Så dette programmet, hvis jeg kompilere det - dette er, igjen, streng1. 1609 01:12:08,840 --> 01:12:11,040 >> Så sørg streng1. 1610 01:12:11,040 --> 01:12:16,730 Og nå har jeg kjørt streng1 i min terminal-vinduet. 1611 01:12:16,730 --> 01:12:19,180 Den venter på innspill, så jeg kommer til å skrive i, sier David. 1612 01:12:19,180 --> 01:12:20,080 Enter. 1613 01:12:20,080 --> 01:12:23,350 Og nå er det ut DAVID alle på ulike linjer fordi 1614 01:12:23,350 --> 01:12:24,430 Legg merke til hva jeg gjør. 1615 01:12:24,430 --> 01:12:27,510 Jeg skriver ett tegn om gangen. 1616 01:12:27,510 --> 01:12:29,100 Nå vil vi ikke gå i detalj i dag på dette. 1617 01:12:29,100 --> 01:12:31,610 Men jeg slettet et øyeblikk siden denne sjekken her. 1618 01:12:31,610 --> 01:12:36,310 Det viser seg at hvis brukeren ikke ordentlig, motstandere, eller bare 1619 01:12:36,310 --> 01:12:41,780 forvirret, kan du faktisk ikke klarer å gi en streng av noen lengde. 1620 01:12:41,780 --> 01:12:43,640 Hvis du treffer feil tast på tastaturet, kan du gi 1621 01:12:43,640 --> 01:12:44,390 ingen streng i det hele tatt. 1622 01:12:44,390 --> 01:12:47,790 Eller hvis du er ondsinnet, kan du prøve å lime på en gigabyte verdt av en 1623 01:12:47,790 --> 01:12:49,380 essay å fylle denne strengen. 1624 01:12:49,380 --> 01:12:52,060 Og hvis maskinen går tom for minne, viser det seg at vi skal 1625 01:12:52,060 --> 01:12:54,310 å komme tilbake denne spesielle verdi som kalles null. 1626 01:12:54,310 --> 01:12:57,550 Så for nå, bare vet at det er denne spesielle verdi som kalles null som 1627 01:12:57,550 --> 01:13:01,000 vil tillate oss å sjekke når vi er ute av minne, blant annet. 1628 01:13:01,000 --> 01:13:07,330 >> Men hvis jeg åpner opp nå streng2, merke en forskjell her. 1629 01:13:07,330 --> 01:13:09,760 Merke en forskjell her med streng2. 1630 01:13:09,760 --> 01:13:13,260 Med streng2, dette er for loop litt annerledes. 1631 01:13:13,260 --> 01:13:16,350 La meg slette nuller slik at vi kan snakke om dem en annen gang. 1632 01:13:16,350 --> 01:13:18,460 Men hva er annerledes om for loop denne gangen? 1633 01:13:21,580 --> 01:13:23,160 Og jeg kan gå tilbake til forrige eksempel. 1634 01:13:23,160 --> 01:13:24,800 Så det er versjon to. 1635 01:13:24,800 --> 01:13:27,020 Dette er versjon én. 1636 01:13:27,020 --> 01:13:31,935 En, to, en to. 1637 01:13:35,030 --> 01:13:38,240 Så strlen samtalen er der? 1638 01:13:38,240 --> 01:13:40,420 Det er i den første del av for loop. 1639 01:13:40,420 --> 01:13:43,060 Noen tanker om hvorfor jeg gjør dette? 1640 01:13:43,060 --> 01:13:43,690 Ja. 1641 01:13:43,690 --> 01:13:46,010 [Uhørlig] 1642 01:13:46,010 --> 01:13:47,630 DAVID J. MALAN: Så vi ikke kalle funksjonen hver eneste gang. 1643 01:13:47,630 --> 01:13:48,040 Akkurat. 1644 01:13:48,040 --> 01:13:50,350 Husker fra for looper at de er super enkelt når du liksom 1645 01:13:50,350 --> 01:13:52,180 forstå at dette er initialiseringen, 1646 01:13:52,180 --> 01:13:53,330 tilstand, og oppdateringen. 1647 01:13:53,330 --> 01:13:55,430 Problemet er at tilstanden skjer på hver 1648 01:13:55,430 --> 01:13:56,600 iterasjon av sløyfen. 1649 01:13:56,600 --> 01:13:59,930 Og så i dette eksempelet her, er hva dårlig med det faktum 1650 01:13:59,930 --> 01:14:03,500 at dette er min tilstand? 1651 01:14:03,500 --> 01:14:05,920 Du ringer strlen igjen og igjen og igjen. 1652 01:14:05,920 --> 01:14:08,990 Men når jeg har skrevet i DAVID, er lengden av strengen fem. 1653 01:14:08,990 --> 01:14:11,560 Og det kommer ikke til å forandre på hver iterasjon av loopen fordi 1654 01:14:11,560 --> 01:14:15,560 streng er fortsatt D-A-V-I-D. Så dette er et hint om hva som kommer til å bli en 1655 01:14:15,560 --> 01:14:19,650 stadig viktigere idé kjent som en design beslutning, hvor - bare ikke 1656 01:14:19,650 --> 01:14:21,640 gjøre datamaskinen gjøre unødvendig arbeid. 1657 01:14:21,640 --> 01:14:25,630 >> Nå bare som en sniktitt på to pset, 2 pset i standardutgaven er 1658 01:14:25,630 --> 01:14:28,850 kommer til å utfordre deg til å faktisk gjennomføre noen flere koder, noen 1659 01:14:28,850 --> 01:14:32,650 antall krypteringsalgoritmer, slik at du både kan kryptere og dekryptere 1660 01:14:32,650 --> 01:14:35,530 hemmelige meldinger, mye som den Ralphie det dekodet. 1661 01:14:35,530 --> 01:14:38,720 I hacker utgave av pset 2, vi kommer til å gå litt lenger. 1662 01:14:38,720 --> 01:14:42,010 Vi kommer til å gi deg en fil fra en faktisk datasystem som inneholder en 1663 01:14:42,010 --> 01:14:45,690 hel haug med brukernavn og faktiske krypterte passord, og utfordringen 1664 01:14:45,690 --> 01:14:49,110 for hacker utgaven kommer til å være å knekke disse passordene og figur 1665 01:14:49,110 --> 01:14:53,060 ut hva kryptografi eller hva hemmeligheten ble brukt til å faktisk 1666 01:14:53,060 --> 01:14:55,080 generere disse passordene. 1667 01:14:55,080 --> 01:14:58,360 Og vi kommer til å gjøre dette ved hjelp av en ny funksjon her på C som jeg skal gi 1668 01:14:58,360 --> 01:15:02,200 du bare en demo av, kjent som kommandolinjeargumenter. 1669 01:15:02,200 --> 01:15:05,930 >> Så det viser seg, som noen av dere kanskje har sett i avsnitt eller i lærebøker, 1670 01:15:05,930 --> 01:15:09,850 main ikke alltid trenger å være ugyldig i parentes. 1671 01:15:09,850 --> 01:15:14,060 Det viser seg at hoved kan også skrives som dette, med to argumenter, 1672 01:15:14,060 --> 01:15:19,690 argc og argv, hvor argc er antall ord som du skriver etter 1673 01:15:19,690 --> 01:15:21,940 programmets navn på kommandolinjen. 1674 01:15:21,940 --> 01:15:24,550 Og argv er de faktiske ordene. 1675 01:15:24,550 --> 01:15:29,470 Og som klammeparentesene det foreslår, er argv tilsynelatende en matrise. 1676 01:15:29,470 --> 01:15:33,720 Det kommer til å være en streng etter en streng etter en streng i minnet. 1677 01:15:33,720 --> 01:15:36,170 Så det vi kommer til å være i stand til å gjøre, starter med pset 2, 1678 01:15:36,170 --> 01:15:37,310 noe sånt som dette. 1679 01:15:37,310 --> 01:15:42,450 Hvis jeg gjør argv1, som er et eksempel vi vil komme tilbake til på mandag, og kjøre 1680 01:15:42,450 --> 01:15:45,180 det merke til at det ikke synes å gjøre noe ennå. 1681 01:15:45,180 --> 01:15:47,050 Det skriver bare ut sitt eget navn. 1682 01:15:47,050 --> 01:15:53,220 Men hvis jeg sier farvel klasse, legg merke til at dette programmet tilsynelatende gjentar 1683 01:15:53,220 --> 01:15:57,030 over hver av de ordene som ble skrevet ved ledeteksten. 1684 01:15:57,030 --> 01:16:02,050 Og midlene som vi får tilgang til ord som brukeren har 1685 01:16:02,050 --> 01:16:06,780 skrives inn ved ledeteksten er ved å endre viktigste, starter denne helgen, fra int 1686 01:16:06,780 --> 01:16:10,710 main (void) til int main (argc, argv). 1687 01:16:10,710 --> 01:16:13,700 Og dermed vil bli født kommandolinjeargumenter. 1688 01:16:13,700 --> 01:16:17,210 Og når du får virkelig sofistikert på dette, vil du være i stand til å skrive 1689 01:16:17,210 --> 01:16:21,370 virkelig trippy programmer, slik som denne her, som går utover 1690 01:16:21,370 --> 01:16:25,520 noen av funksjonene vi har gjort så langt, men alle ganske kraftig. 1691 01:16:25,520 --> 01:16:27,330 >> Så vi vil forlate dette med denne på skjermen. 1692 01:16:27,330 --> 01:16:29,160 Og vi vil se deg på mandag.