1 00:00:00,000 --> 00:00:02,270 [Powered by Google Translate] [Uke 2, Fortsatt] 2 00:00:02,270 --> 00:00:04,220 [David J. Malan, Harvard University] 3 00:00:04,220 --> 00:00:06,880 [Dette er CS50. - CS50.TV] 4 00:00:06,880 --> 00:00:10,990 OK. Dette er CS50, og dette er slutten av uke 2. 5 00:00:10,990 --> 00:00:14,410 Hvis du forventer å være sulten på denne tiden i morgen, 6 00:00:14,410 --> 00:00:18,620 vet at vi kommer til å innkalle som en liten gruppe i morgen, torsdag, 1:15 pm. 7 00:00:18,620 --> 00:00:21,360 Det er denne nettadressen her hvis du ønsker å RSVP. 8 00:00:21,360 --> 00:00:26,740 Plassen er begrenset, så tilgi hvis skjemaet er fylt opp av den tiden du fyller ut dette. 9 00:00:26,740 --> 00:00:29,300 En annen URL, men som kan være av interesse er dette. 10 00:00:29,300 --> 00:00:32,369 I omtrent en måneds tid, er kurset skal gjøres tilgjengelig 11 00:00:32,369 --> 00:00:36,890 desto mer grovt via EDX, via som folk på internett vil være i stand til å følge med, 12 00:00:36,890 --> 00:00:39,380 drive emnet ganske aktivt, faktisk. 13 00:00:39,380 --> 00:00:42,270 De skal bruke CS50 Appliance og CS50 Diskuter 14 00:00:42,270 --> 00:00:45,490 og de fleste av de ulike dataverktøy som vi allerede har brukt dette semesteret. 15 00:00:45,490 --> 00:00:48,710 Og ett av tiltakene vi ønsker å ta på som et eksperiment i år 16 00:00:48,710 --> 00:00:51,930 er å se hvor mye innhold vi kan oversette 17 00:00:51,930 --> 00:00:53,960 i andre muntlige og skriftlige språk. 18 00:00:53,960 --> 00:00:57,500 Så hvis du kan ha en interesse i å delta i dette prosjektet 19 00:00:57,500 --> 00:01:02,270 hvor vi vil gi engelsk utskrifter og undertekster for kursets forelesninger 20 00:01:02,270 --> 00:01:05,450 og shorts og seminarer og seksjoner og lignende, 21 00:01:05,450 --> 00:01:08,200 hvis du snakker flytende eller skrive flytende et annet språk, 22 00:01:08,200 --> 00:01:12,290 vi vil gjerne engasjere deg i dette prosjektet hvor du tar på en eller flere av videoene, 23 00:01:12,290 --> 00:01:15,200 oversette dem til et språk du kjenner ganske godt. 24 00:01:15,200 --> 00:01:18,700 >> For å gi deg en følelse av grensesnittet, er det denne web-basert brukergrensesnitt 25 00:01:18,700 --> 00:01:22,090 at vi skal bruke som vil skape hovedsak en UI som dette. 26 00:01:22,090 --> 00:01:24,290 Dette ble meg å undervise noen Halloween siden, 27 00:01:24,290 --> 00:01:27,390 og på den høyre side det i sort ved siden av disse tidsstempler, 28 00:01:27,390 --> 00:01:31,210 vil du se de forskjellige tingene som kom ut av munnen min den dagen, 29 00:01:31,210 --> 00:01:34,850 og deretter under det vil du være i stand til å oversette til et annet språk 30 00:01:34,850 --> 00:01:38,690 nøyaktig hva kartleggingen er mellom, i dette tilfellet, engelsk og, si, spansk. 31 00:01:38,690 --> 00:01:40,440 Så det er faktisk en veldig brukervennlig verktøy. 32 00:01:40,440 --> 00:01:43,370 Du kan spole tilbake og spole fram svært lett med hurtigtaster. 33 00:01:43,370 --> 00:01:47,490 Så hvis du ønsker å ta del i dette eksperimentet, og har dine ord sett og lest 34 00:01:47,490 --> 00:01:51,850 ved potensielt tusenvis av folk der ute, gjør du gjerne delta. 35 00:01:51,850 --> 00:01:54,350 Ett ord om kattunge fra mandag. 36 00:01:54,350 --> 00:02:00,350 Så vi har sendt en altfor skremmende melding, innser det, som kontortid foreslår 37 00:02:00,350 --> 00:02:03,300 og som deler foreslår, er utformingen av kurset veldig mye 38 00:02:03,300 --> 00:02:07,360 å ha studenter samarbeider og snakker til å arbeide gjennom oppgavesett 39 00:02:07,360 --> 00:02:11,260 og problemer sammen, og egentlig linjen bare kommer ned til, 40 00:02:11,260 --> 00:02:16,010 igjen, bør arbeidet du til slutt sende være din egen. 41 00:02:16,010 --> 00:02:18,860 Og så helt ærlig, i kontortiden er det helt normalt, 42 00:02:18,860 --> 00:02:22,240 det er helt å forvente enda, skal chatte med noen venn ved siden av deg. 43 00:02:22,240 --> 00:02:24,370 >> Hvis han eller hun sliter med noen tema og du liker, 44 00:02:24,370 --> 00:02:27,940 "Å, vel, la meg gi deg et glimt av noen linje med kode som jeg skrev," det er greit, 45 00:02:27,940 --> 00:02:31,250 det skjer, og det er veldig mye bidrar, tror jeg, med prosessen med læring. 46 00:02:31,250 --> 00:02:36,750 Hvor linjen blir krysset er når hodet er liksom vippet over her for altfor mange sekunder 47 00:02:36,750 --> 00:02:41,160 eller minutter for at virkelig å ha fått en Unblocking mulighet for din venn, 48 00:02:41,160 --> 00:02:44,160 og sikkert når ting blir utvekslet via e-post og Dropbox og lignende, 49 00:02:44,160 --> 00:02:45,640 det er for linjen. 50 00:02:45,640 --> 00:02:48,620 Så for all del føler deg komfortabel og føler oppfordres til å chatte med venner 51 00:02:48,620 --> 00:02:52,810 og klassekamerater om psets og flere og bare innse at det du til slutt sende 52 00:02:52,810 --> 00:02:57,340 burde egentlig være et produkt av din kreasjon og ikke noen andre. 53 00:02:57,340 --> 00:03:00,490 Og så en av de domene-spesifikke problemer for pset2, 54 00:03:00,490 --> 00:03:04,740 som vil komme ut sent i morgen kveld, er å dykke inn i verden av kryptografi, 55 00:03:04,740 --> 00:03:08,970 som er kunsten for kryptering eller scrambling informasjon, 56 00:03:08,970 --> 00:03:12,600 og dette gjelder til slutt til en verden av sikkerhet. 57 00:03:12,600 --> 00:03:16,560 Nå kommer sikkerheten for de fleste av oss i form av ganske dagligdagse mekanismer. 58 00:03:16,560 --> 00:03:19,050 Alle av oss har brukernavn og passord, 59 00:03:19,050 --> 00:03:23,450 og alle av oss har svært dårlige brukernavn og passord, mest sannsynlig. 60 00:03:23,450 --> 00:03:28,240 >> Hvis passordet er det samme på flere nettsteder, det er nok ikke den beste ideen, 61 00:03:28,240 --> 00:03:30,070 som vi vil diskutere mot semesters slutt. 62 00:03:30,070 --> 00:03:34,720 Hvis passordet er skrevet på en klistrelapp - ingen spøk - på skjermen, 63 00:03:34,720 --> 00:03:38,350 som er for ikke nødvendigvis den beste design, men ganske vanlig fenomen. 64 00:03:38,350 --> 00:03:42,470 Og hvis du ikke bruker kryptografi for å kryptere passordene dine, 65 00:03:42,470 --> 00:03:44,210 de er spesielt sårbare. 66 00:03:44,210 --> 00:03:47,270 Så hvis du tror du er super flink ved å ha en skjult Word-dokument 67 00:03:47,270 --> 00:03:49,910 et sted på harddisken din som har alle passordene dine 68 00:03:49,910 --> 00:03:53,670 men det er i en mappe som ingen kommer til å se på, som også er ikke en veldig sikker mekanisme. 69 00:03:53,670 --> 00:03:56,990 Og så hva pset2 vil introdusere er denne kunsten kryptografi 70 00:03:56,990 --> 00:04:02,010 og scrambling informasjon slik at ting som passord er alle mer sikker. 71 00:04:02,010 --> 00:04:05,790 Konteksten her er at med usikre data 72 00:04:05,790 --> 00:04:07,930 kommer en mulighet til å kryptere den og til å rykke det. 73 00:04:07,930 --> 00:04:11,470 Og så dette, for eksempel, er et eksempel på en kryptert melding. 74 00:04:11,470 --> 00:04:14,700 Dette sier faktisk noe på engelsk, men det er åpenbart ikke helt opplagt. 75 00:04:14,700 --> 00:04:18,279 Og vi vil komme full sirkel i dag for å erte hverandre hva denne hemmelige budskap her er. 76 00:04:18,279 --> 00:04:23,490 Men i den virkelige verden av datamaskiner, ting ikke engang ser ut som de kan være engelske setninger. 77 00:04:23,490 --> 00:04:28,430 For eksempel er dette hva du kan finne på en standard Linux eller Mac eller UNIX-maskin 78 00:04:28,430 --> 00:04:32,070 i en fil som var en gang kalt passord fil. 79 00:04:32,070 --> 00:04:34,200 >> I dag er det blitt flyttet til andre steder. 80 00:04:34,200 --> 00:04:39,210 Men hvis du ser på rett sted på et system, vil du se ikke bare ditt brukernavn 81 00:04:39,210 --> 00:04:43,400 eller som av andre mennesker på systemet, men vil du se en kryptert versjon av passordet sitt. 82 00:04:43,400 --> 00:04:47,980 Faktisk tyder ordet krypten der at følgende ting er kryptert, 83 00:04:47,980 --> 00:04:52,680 og denne serien av tilsynelatende tilfeldige bokstaver og tegn og tall, og så videre 84 00:04:52,680 --> 00:04:56,480 kan dekrypteres bare generelt vite noen hemmelighet - 85 00:04:56,480 --> 00:04:58,840 et hemmelig ord, en hemmelig nummer - 86 00:04:58,840 --> 00:05:03,160 og så faktisk til kunsten kryptografi slutt koker ned stole av noe slag 87 00:05:03,160 --> 00:05:05,650 og vite noe som noen andre gjør det ikke. 88 00:05:05,650 --> 00:05:10,090 Så vi vil utforske dette i en litt mer detaljert i dag og i pset som kommer. 89 00:05:10,090 --> 00:05:12,200 Og nå et ord på bestått / ikke bestått. 90 00:05:12,200 --> 00:05:15,360 Særlig ettersom noen av dere har dykket inn pset1, apparatet, 91 00:05:15,360 --> 00:05:19,080 og en veldig ny verden for deg selv, innser at frustrasjoner og forvirring 92 00:05:19,080 --> 00:05:21,700 og bare tekniske problemer er ganske å forvente, 93 00:05:21,700 --> 00:05:24,180 spesielt med den første pset, der det er bare så mye nytt, 94 00:05:24,180 --> 00:05:27,730 bare å bli kjent med ls og cd og alle disse uforståelige kommandoer 95 00:05:27,730 --> 00:05:33,050 og et nytt miljø, og som er atskilt fra selve materialet og programmering selv. 96 00:05:33,050 --> 00:05:36,940 Så skjønner også at det er sikkert kontortid som eksisterer som en støtte struktur. 97 00:05:36,940 --> 00:05:38,880 >> Seksjoner begynner førstkommende søndag. 98 00:05:38,880 --> 00:05:42,960 Men viktigst av alt, hvis du føler bare at dette er ikke verden for deg, 99 00:05:42,960 --> 00:05:44,710 innse at det virkelig tar bare tid. 100 00:05:44,710 --> 00:05:48,600 Og var det ikke for denne muligheten år siden for meg for å ta en klasse bestått / ikke bestått, 101 00:05:48,600 --> 00:05:50,990 ærlig, jeg ville aldri ha selv satt foten i klasserommet. 102 00:05:50,990 --> 00:05:53,690 Og du kan endre dette frem til, sier den femte mandag av kurset, 103 00:05:53,690 --> 00:05:58,280 så hvis du er på kanten nå, innser at heller enn hodet inn i noen andre farvann helt, 104 00:05:58,280 --> 00:06:01,260 gjør absolutt vurdere å bare bytte til bestått / ikke bestått. 105 00:06:01,260 --> 00:06:04,570 Igjen, det er jo ikke denne kulturen her på Harvard for å ta ting bestått / ikke bestått 106 00:06:04,570 --> 00:06:08,670 siden alle ønsker virkelig å oppnå eller overgå, 107 00:06:08,670 --> 00:06:11,130 men ærlig, er dette en flott måte å prøve noe ut 108 00:06:11,130 --> 00:06:16,720 som kanskje ikke er kjent for deg, og du vil ende opp med å gjøre, i de fleste tilfeller, ganske fine, 109 00:06:16,720 --> 00:06:18,210 kanskje mye å overraske din. 110 00:06:18,210 --> 00:06:20,980 Og i mer konkret hva jeg tror bestått / ikke bestått generelt gjør, 111 00:06:20,980 --> 00:06:22,940 spesielt som du kanskje har opplevd med pset0, 112 00:06:22,940 --> 00:06:26,560 hvis du setter på 10 timer, 15 timer, 25 timer i noen pset 113 00:06:26,560 --> 00:06:29,920 og du bare stanger hodet mot veggen og det blir super sent på kvelden 114 00:06:29,920 --> 00:06:33,950 men du har tatt pset 90% av veien, og du bare ikke kan finne ut en ting, 115 00:06:33,950 --> 00:06:36,520 bestått / ikke bestått virkelig tar kanten av en klasse som dette, 116 00:06:36,520 --> 00:06:39,100 hvor du kan liksom gjerne si: "OK, jeg vet det er ikke perfekt, 117 00:06:39,100 --> 00:06:42,350 men jeg jobbet ræva av meg på dette, jeg er ganske fornøyd med hvor det endte opp, " 118 00:06:42,350 --> 00:06:44,850 og som vil oppfylle forventningene for bestått / ikke bestått. 119 00:06:44,850 --> 00:06:47,540 Så hold det i tankene. OK. 120 00:06:47,540 --> 00:06:50,520 >> Så de av dere som har kjempet for å bruke Harvard University Wi-Fi, 121 00:06:50,520 --> 00:06:54,780 vet at det er en CS50 SSID, en Wi-Fi-tilkobling, flyter rundt 122 00:06:54,780 --> 00:06:56,490 at du kan ha bedre lykke til. 123 00:06:56,490 --> 00:07:00,130 Det er litt ironisk at passordet for dette, hvis du ønsker å prøve å koble til dette 124 00:07:00,130 --> 00:07:08,350 for bedre hastigheter - og la oss få vite om det er noe bedre - er 12345, hele veien opp til 8 125 00:07:08,350 --> 00:07:10,910 fordi 8 er sikrere enn 5. 126 00:07:10,910 --> 00:07:16,910 Så hvis du trenger Wi-Fi passord, koble til CS50 trådløst her, 12345678, 127 00:07:16,910 --> 00:07:20,380 og innlegg på CS50 Diskuter hvis du fortsatt har intermitterende tilkoblingsproblemer, 128 00:07:20,380 --> 00:07:25,420 og vi vil gi krefter som skal vite for denne plassen. OK. 129 00:07:25,420 --> 00:07:32,230 Så en rask teaser, spesielt for de av dere som er fan gutter eller jenter av alle ting Apple. 130 00:07:32,230 --> 00:07:37,460 Hva jeg gravd opp fra et par år tilbake var denne filen her, iUnlock.c, 131 00:07:37,460 --> 00:07:39,930 bare for å slags gjør mer konkret og mer komplekse 132 00:07:39,930 --> 00:07:42,560 noen av de mer grunnleggende C-programmer vi har skrevet. 133 00:07:42,560 --> 00:07:46,910 Så jeg åpnet opp denne filen, iUnlock.c. Det er tilgjengelig på Forelesninger siden for i dag. 134 00:07:46,910 --> 00:07:49,810 På venstre side ser du en lang liste med funksjoner. 135 00:07:49,810 --> 00:07:53,230 Så fyr som skrev dette skrev opp en masse funksjoner, mer enn bare main. 136 00:07:53,230 --> 00:07:57,340 Han brukte en hel haug av biblioteker her, og hvis vi begynner å bla gjennom, 137 00:07:57,340 --> 00:08:04,890 hva dette egentlig er er den aller første, tror jeg, sprekk for den originale iPhone. 138 00:08:04,890 --> 00:08:09,830 >> Når du ønsket å jailbreak den originale iPhone, noe som betyr untether det fra AT & T 139 00:08:09,830 --> 00:08:13,710 og faktisk installere spesiell programvare på den og gjøre ting som Apple ikke vil at folk skal gjøre, 140 00:08:13,710 --> 00:08:18,480 noen tok seg tid til å finne ut nøyaktig hvordan de kan utnytte programvare feil, 141 00:08:18,480 --> 00:08:22,690 feil, feil, i Apple-programvare, og dermed ble født iUnlock.c-- 142 00:08:22,690 --> 00:08:26,760 at hvis du kompilerte det på datamaskinen og installert det på en iPhone 143 00:08:26,760 --> 00:08:29,430 som var koblet til datamaskinen via, sier en USB-kabel, 144 00:08:29,430 --> 00:08:32,450 Dette vil gi deg administrative eller rotrettigheter på din iPhone 145 00:08:32,450 --> 00:08:34,620 og lar deg gjøre ganske mye hva du vil. 146 00:08:34,620 --> 00:08:36,400 Og så det har vært denne fascinerende katt og mus lek 147 00:08:36,400 --> 00:08:39,340 mellom Apple og resten av verden særlig når de, som mange bedrifter, 148 00:08:39,340 --> 00:08:43,350 prøv å låse sine ting ned slik at du bare kan gjøre med det hva de har tenkt. 149 00:08:43,350 --> 00:08:47,360 Men takket være folk som dette og forståelsen av lavt nivå detaljer - 150 00:08:47,360 --> 00:08:50,830 og i dette tilfellet C-programmering - og mange av de kjente konstruksjoner 151 00:08:50,830 --> 00:08:55,280 at vi har begynt å leke med, er du i stand til å virkelig utnytte maskinvaren 152 00:08:55,280 --> 00:08:59,250 på en måte se deg passform og ikke nødvendigvis noen bedriftsenhet. 153 00:08:59,250 --> 00:09:01,600 Så for eksempel, har jeg ingen anelse om hva alt dette gjør, 154 00:09:01,600 --> 00:09:03,580 men GetVersion høres ganske grei, 155 00:09:03,580 --> 00:09:05,710 og det ser ut som dette er en funksjon som denne personen skrev. 156 00:09:05,710 --> 00:09:09,250 Det tar noen form for heltall som argument, ikke returnerer noe, 157 00:09:09,250 --> 00:09:13,710 men ser ut til å sløyfe med en for løkke her, og en hvis tilstand, hvis tilstanden pause, 158 00:09:13,710 --> 00:09:16,770 og relaterer eller annen måte å versjonsnumre hvis vi bla nedover, 159 00:09:16,770 --> 00:09:19,650 selv om mange av disse søkeordene skal være ny. 160 00:09:19,650 --> 00:09:22,590 Og det er en hel masse funksjoner i her vi aldri har sett, og kanskje aldri se 161 00:09:22,590 --> 00:09:24,350 i løpet av semesteret. 162 00:09:24,350 --> 00:09:29,160 >> På slutten av dagen, følger det de samme regler og logikk som vi har lekt med så langt. 163 00:09:29,160 --> 00:09:34,340 Så dette er altfor gammel til å knekke iPhone 3s eller 4s eller snart 5s disse dager, 164 00:09:34,340 --> 00:09:38,830 men vet at det er alle veldig mye avledet fra denne verden som vi har dykket inn. 165 00:09:38,830 --> 00:09:42,280 La oss ta en titt på en litt mer enkelt eksempel: 166 00:09:42,280 --> 00:09:46,260 dette, bare for å få varme opp med noen syntaks og også noen andre datatype 167 00:09:46,260 --> 00:09:48,910 som vi har snakket om, men har egentlig ikke sett i C. 168 00:09:48,910 --> 00:09:53,670 Dette er en fil som heter positive1.c, og per kommentarene på toppen, 169 00:09:53,670 --> 00:09:56,070 dette krever bare at en bruker har et positivt tall. 170 00:09:56,070 --> 00:09:59,910 Så det er et eksempel på en do-while loop, som er fint for brukeren interaktive programmer 171 00:09:59,910 --> 00:10:02,070 hvor du trenger å fortelle brukeren om å gjøre noe, 172 00:10:02,070 --> 00:10:05,530 og hvis de ikke samarbeider du kjefte på dem eller avvise deres innspill. 173 00:10:05,530 --> 00:10:10,480 Case in point: Jeg kommer til å gjøre linjene 19 til og med 24 174 00:10:10,480 --> 00:10:14,620 så lenge brukeren ikke har gitt meg et positivt tall. 175 00:10:14,620 --> 00:10:21,340 Denne detaljen her på linje 18, hvorfor jeg erklærer n over hele denne looping konstruere 176 00:10:21,340 --> 00:10:26,870 i motsetning til rett ved siden av linje 22 hvor jeg faktisk har lyst til å få n? Ja. 177 00:10:26,870 --> 00:10:29,330 [Student] Scope. >> Ja, så denne utgaven av omfanget. 178 00:10:29,330 --> 00:10:31,770 Og i lekmann vilkår, hva omfanget refererer til? 179 00:10:34,880 --> 00:10:41,560 Ja. >> [Uhørlig student respons] >> Kan du snakke litt høyere? 180 00:10:41,560 --> 00:10:45,440 [Student] Hvor du kan få tilgang til variabelen. >> Perfect. 181 00:10:45,440 --> 00:10:47,610 Hvor du kan få tilgang til en bestemt variabel. 182 00:10:47,610 --> 00:10:50,990 Og generelt, tommelfingerregelen hittil har vært at omfanget av noen variable 183 00:10:50,990 --> 00:10:56,140 defineres av de nyeste klammeparentes som du har sett. 184 00:10:56,140 --> 00:11:03,070 >> Og så i dette tilfellet, hvis jeg har gjort feil i å erklære n på linje 22, ville den linjen fungere. 185 00:11:03,070 --> 00:11:10,840 Jeg ville få en int, og jeg ville sette det inn i den variable n på linje 22, 186 00:11:10,840 --> 00:11:17,060 men hvilken linje med kode ville nå har ingen anelse om hva jeg snakker om? >> [Student] 25. 187 00:11:17,060 --> 00:11:23,840 [Malan] 25, og det viser seg 24 så vel fordi i dette tilfellet faller det utenfor klammeparentes. 188 00:11:23,840 --> 00:11:28,550 Så bare en liten bit av en ordensforstyrrelser, men veldig enkelt løses ved å erklære den variable 189 00:11:28,550 --> 00:11:30,700 utenfor selve funksjonen. 190 00:11:30,700 --> 00:11:32,760 Vi får se senere i dag kan du gå ett skritt videre 191 00:11:32,760 --> 00:11:34,940 og du kan selv få litt lat. 192 00:11:34,940 --> 00:11:39,660 Og dette er ikke å anbefale generelt, men du kan selv få lat 193 00:11:39,660 --> 00:11:44,150 og sette en variabel globalt, så å si, ikke på innsiden av en funksjon, ikke inne i en løkke, 194 00:11:44,150 --> 00:11:49,800 men i selve filen, utenfor alle funksjoner du har skrevet, som jeg gjorde her på linje 15. 195 00:11:49,800 --> 00:11:55,220 Dette er vanligvis mislikt, men at dette er en løsning noen ganger til andre problemer, 196 00:11:55,220 --> 00:11:56,910 som vi vil til slutt se. 197 00:11:56,910 --> 00:11:59,500 Så for nå skal vi la det som dette, men la oss se om vi kan omskrive dette 198 00:11:59,500 --> 00:12:02,360 bare å begynne å uttrykke oss litt annerledes. 199 00:12:02,360 --> 00:12:05,550 Dette programmet, bare for å være klar, er positive1. 200 00:12:05,550 --> 00:12:11,980 La meg gå videre her og i min terminal-vinduet gjør positive1, Enter. 201 00:12:11,980 --> 00:12:15,080 Sammenstiller greit. Jeg kommer til å kjøre positive1, trykk på Enter. 202 00:12:15,080 --> 00:12:19,250 Jeg krever at du gir meg et positivt heltall. Jeg vil si -1. Som ikke fungerte. 203 00:12:19,250 --> 00:12:22,340 0, 99. Som synes å fungere. 204 00:12:22,340 --> 00:12:25,310 Kanskje ikke den mest grundige testen, men minst det er en fin sunn fornuft sjekk 205 00:12:25,310 --> 00:12:27,100 at vi er på rett spor. 206 00:12:27,100 --> 00:12:29,570 >> Så nå la meg gå videre og åpne versjon 2 av dette, 207 00:12:29,570 --> 00:12:32,800 og hva er annerledes allerede? 208 00:12:32,800 --> 00:12:39,030 Det implementerer det samme, men hva hoppe ut som klart annerledes denne gangen? 209 00:12:40,790 --> 00:12:47,090 Dette bool i grønt. Det er uthevet i grønt, dette søkeordet kjent som bool, som er en datatype. 210 00:12:47,090 --> 00:12:50,510 Det kommer ikke innebygd i alle versjoner av C. 211 00:12:50,510 --> 00:12:52,650 Du trenger å inkludere et bestemt bibliotek. 212 00:12:52,650 --> 00:12:56,460 I vårt tilfelle, inkludert jeg CS50 biblioteket slik at vi har tilgang til bool. 213 00:12:56,460 --> 00:12:59,860 Men i linje 18, synes vi å ha en boolsk verdi her kalt takknemlig. 214 00:12:59,860 --> 00:13:02,190 Jeg kunne ha kalt dette noe, men jeg kalte det takknemlig 215 00:13:02,190 --> 00:13:04,750 bare for å slags formidle noe semantisk mening. 216 00:13:04,750 --> 00:13:07,700 Så først på linje 18, er jeg tydeligvis ikke takknemlig 217 00:13:07,700 --> 00:13:12,230 fordi den boolske verdien takknemlig er initialisert til false i linje 18. 218 00:13:12,230 --> 00:13:16,500 Og det synes det jeg har gjort her i linjer 21 til 23 219 00:13:16,500 --> 00:13:19,200 er jeg bare slags omskrevet min logikk. 220 00:13:19,200 --> 00:13:26,100 Så ingen funksjonelt forskjellige, men i linje 22 nå jeg sjekke om int brukeren har gitt 221 00:13:26,100 --> 00:13:31,360 er større enn 0, så jeg bare endre verdien av takknemlig til sann. 222 00:13:31,360 --> 00:13:35,590 Og hvorfor gjør jeg det? Fordi i linje 25, tilsynelatende jeg kommer til å sjekke en tilstand. 223 00:13:35,590 --> 00:13:39,760 Gjør dette løkke mens takknemlig er falsk. 224 00:13:39,760 --> 00:13:42,960 Så jeg foreslo dette som et alternativ til versjon 1 225 00:13:42,960 --> 00:13:47,050 fordi det er i alle fall litt mer intuitivt kanskje er det litt mer jordet på engelsk. 226 00:13:47,050 --> 00:13:51,980 Så gjør du følgende mens du ikke takknemlig eller mens takknemlig er falsk. 227 00:13:51,980 --> 00:13:56,220 Og denne gangen også jeg tydeligvis ikke lyst til å huske hva brukeren skrev i 228 00:13:56,220 --> 00:14:00,050 fordi varsel er det ingen variabel n, så egentlig en liten hvit løgn der. 229 00:14:00,050 --> 00:14:03,290 >> Funksjonelt, er programmet litt annerledes når vi kommer til bunns i det 230 00:14:03,290 --> 00:14:04,960 fordi jeg ikke husker hva n er. 231 00:14:04,960 --> 00:14:09,120 Men jeg ønsket å demonstrere her også at selv om vi har sett GetInt 232 00:14:09,120 --> 00:14:13,780 og GetString som brukes på den høyre side av et likhetstegn hittil 233 00:14:13,780 --> 00:14:17,310 slik at vi husker verdien, teknisk, det er ikke strengt nødvendig. 234 00:14:17,310 --> 00:14:20,290 Hvis en eller annen grunn bare ikke bryr seg å lagre verdien, 235 00:14:20,290 --> 00:14:25,540 du bare ønsker å sjekke verdien merke til at vi bare kan skrive dette som GetInt, 236 00:14:25,540 --> 00:14:27,320 åpen paren, nær paren. 237 00:14:27,320 --> 00:14:30,570 At funksjonen skal returnere en verdi, som vi har sagt. 238 00:14:30,570 --> 00:14:32,220 Det kommer til å gi deg tilbake en int. 239 00:14:32,220 --> 00:14:34,460 Og så hvis du mentalt tenker på at dette skjer, 240 00:14:34,460 --> 00:14:38,190 når jeg skriver i 99, returnerer GetInt tallet 99, 241 00:14:38,190 --> 00:14:41,840 og så konseptuelt, er det som om min kode var faktisk dette. 242 00:14:41,840 --> 00:14:45,950 Så hvis 99 er faktisk større enn 0, så takknemlig blir sant, 243 00:14:45,950 --> 00:14:50,810 deretter linje 25 innser ooh, vi gjort fordi jeg er nå takknemlig, 244 00:14:50,810 --> 00:14:53,970 og i linje 26, vi bare si: "Takk for den positive heltall!" 245 00:14:53,970 --> 00:14:55,960 hva det har skjedd å være. 246 00:14:55,960 --> 00:14:59,140 Nå la oss gjøre litt syntaktisk sukker her, så å si. 247 00:14:59,140 --> 00:15:04,670 La oss se om vi kan rydde opp denne linjen 25 med denne tredje og siste varianten i positive3. 248 00:15:04,670 --> 00:15:13,600 >> Legg merke den eneste forskjellen nå er hvilken linje av koden? >> [Student] 25. >> [Malan] Yeah, 25 år. 249 00:15:13,600 --> 00:15:17,680 Og vi har ikke egentlig sett dette trikset ennå, men vi fikk se utropstegnet på mandag, 250 00:15:17,680 --> 00:15:21,070 som betegner hva? >> [Student] Not. >> Ikke eller negasjon. 251 00:15:21,070 --> 00:15:23,510 Så ta en boolsk verdi og sprelle med verdi. 252 00:15:23,510 --> 00:15:25,810 Sant blir usann, blir falsk sant. 253 00:15:25,810 --> 00:15:30,420 Så dette, ville jeg foreslå, er enda litt mer intuitiv måte å skrive koden 254 00:15:30,420 --> 00:15:33,430 fordi jeg fortsatt initialisere takknemlig for falsk, jeg fortsatt gjøre følgende, 255 00:15:33,430 --> 00:15:36,010 Jeg satt takknemlig å true når den tid kommer, 256 00:15:36,010 --> 00:15:40,880 men nå kan du egentlig bare oversette denne koden verbalt venstre til høyre, 257 00:15:40,880 --> 00:15:45,630 while (takknemlig!), fordi bang eller utropstegn betegner begrepet ikke, 258 00:15:45,630 --> 00:15:47,580 så mens ikke takknemlig. 259 00:15:47,580 --> 00:15:49,900 Så igjen, har vi ikke innført noen nye konsepter per se. 260 00:15:49,900 --> 00:15:53,730 Vi snakket om boolske tilbake når vi spilte med Scratch, 261 00:15:53,730 --> 00:15:56,720 men innser nå kan vi bare begynne å skrive vår kode på mange forskjellige måter. 262 00:15:56,720 --> 00:16:01,060 Så spesielt i pset1 hvis du er liksom sliter med å finne ut en måte å skrive noen program, 263 00:16:01,060 --> 00:16:04,340 oddsen er har du flaks fordi det kan være en rekke løsninger 264 00:16:04,340 --> 00:16:06,110 at du kan skje på. 265 00:16:06,110 --> 00:16:10,500 For eksempel er dette bare 3 for selv de enkleste programmene. OK. 266 00:16:10,500 --> 00:16:14,200 Og nå husker på mandag dro vi på dette notatet med retur verdier. 267 00:16:14,200 --> 00:16:18,450 Så for aller første gang skrev vi et program som ikke bare har viktigste; 268 00:16:18,450 --> 00:16:22,550 det har også sin egen egendefinert funksjon som jeg skrev her. 269 00:16:22,550 --> 00:16:26,810 Så i tråd 31 gjennom 34 har jeg implementert en kube funksjon. 270 00:16:26,810 --> 00:16:30,240 Det er ikke komplisert. Det er bare en * en * en i dette tilfellet. 271 00:16:30,240 --> 00:16:34,750 Men det som er viktig om det er at jeg tar inn i form av en 272 00:16:34,750 --> 00:16:39,180 og jeg er tilbake ut i form av a * a * a. 273 00:16:39,180 --> 00:16:43,560 Så nå har jeg muligheten, mye som jeg brukte til med prinf alene, 274 00:16:43,560 --> 00:16:47,240 å kalle denne funksjonen ved å kalle kuben funksjonen. 275 00:16:47,240 --> 00:16:51,970 >> Og kuben funksjonen tar noen innspill, og kuben funksjonen returnerer noen utgang. 276 00:16:51,970 --> 00:16:56,960 Derimot, printf bare gjorde noe. 277 00:16:56,960 --> 00:17:00,840 Det kom ikke tilbake noe som vi brydde seg om, selv om som en side gjør det returnere en verdi; 278 00:17:00,840 --> 00:17:03,110 du bare generelt ignorere det. 279 00:17:03,110 --> 00:17:06,510 Printf bare gjorde noe. Den hadde en bivirkning av utskrift til skjermen. 280 00:17:06,510 --> 00:17:11,770 I motsetning her, har vi kuben funksjon, som faktisk returnerer noe. 281 00:17:11,770 --> 00:17:15,520 Så for de som er kjent med dette, er det en ganske grei idé. 282 00:17:15,520 --> 00:17:19,640 Men for de mindre kjent med denne ideen om bestått i innganger og komme tilbake utganger, 283 00:17:19,640 --> 00:17:21,950 la oss prøve bare noe super enkelt. 284 00:17:21,950 --> 00:17:25,490 Er noen komfortabel kommer opp på scenen kort? 285 00:17:25,490 --> 00:17:28,040 Du må være komfortabel med et kamera på deg også. Ja? Okay. 286 00:17:28,040 --> 00:17:31,240 Hva heter du? >> [Student] Ken. >> Ken. OK. Ken, kom opp. 287 00:17:31,240 --> 00:17:35,050 Ken kommer til å være en funksjon av sorterer her. 288 00:17:35,050 --> 00:17:38,720 La oss gå videre og gjøre dette. La oss få litt fancy. 289 00:17:38,720 --> 00:17:42,260 Hyggelig å treffe deg. Velkommen til sentrum scene. OK. 290 00:17:42,260 --> 00:17:46,640 La oss hit på denne knappen her. OK. 291 00:17:46,640 --> 00:17:49,820 Så her har du en moderne tavlen, 292 00:17:49,820 --> 00:17:53,470 og hva jeg er den viktigste funksjon, for eksempel, 293 00:17:53,470 --> 00:17:56,460 og jeg har ikke en iPad i hånden. 294 00:17:56,460 --> 00:17:59,710 >> Jeg vet egentlig ikke huske hvordan du - Vel, jeg kan ikke si det. 295 00:17:59,710 --> 00:18:02,480 Jeg har egentlig ikke god håndskrift, 296 00:18:02,480 --> 00:18:05,520 og så derfor jeg vil at du skal skrive ut noe på skjermen for meg. 297 00:18:05,520 --> 00:18:12,040 Jeg blir hovedprogrammet, og jeg kommer til å ha dere si dette 298 00:18:12,040 --> 00:18:16,720 ved å skrive det i min kylling scratch og deretter passerer du en inngang. 299 00:18:16,720 --> 00:18:20,400 Så dumt om denne øvelsen er, oppfatningen av funksjoner og ringer en funksjon 300 00:18:20,400 --> 00:18:22,400 og returnere en funksjon egentlig koker ned til dette. 301 00:18:22,400 --> 00:18:26,260 Jeg er viktigste, jeg har nettopp skrevet printf, sitat-unquote noe på skjermen, 302 00:18:26,260 --> 00:18:29,110 Jeg kjører dette programmet, og så snart printf blir kalt, 303 00:18:29,110 --> 00:18:32,880 det tar ett argument eller en parameter noen ganger mellom doble anførselstegn. 304 00:18:32,880 --> 00:18:35,880 Her er det argumentet. Eg gir den til Ken. 305 00:18:35,880 --> 00:18:39,020 Han er en svart boks skrevet et antall år siden 306 00:18:39,020 --> 00:18:41,510 som tilsynelatende vet bare hvordan du skriver ut ting på skjermen. 307 00:18:41,510 --> 00:18:43,150 Så kjøre. 308 00:18:49,280 --> 00:18:51,280 Det er ikke dårlig. Veldig bra. 309 00:18:51,280 --> 00:18:55,510 Så nå Ken gjøres utfører. Trenger han å gi meg noe tilbake? 310 00:18:55,510 --> 00:18:57,470 Ikke at vi har sett så langt. 311 00:18:57,470 --> 00:19:00,460 Igjen, ikke printf faktisk tilbake et nummer, men vi kommer til å ignorere det for nå 312 00:19:00,460 --> 00:19:03,470 fordi vi aldri har brukt det. Så det er det for Ken. 313 00:19:03,470 --> 00:19:08,580 Og så nå main tar kontroll over programmet på nytt 314 00:19:08,580 --> 00:19:11,060 fordi det kodelinje, printf, gjøres utfører. 315 00:19:11,060 --> 00:19:14,050 Og vi gå om vår måte, utfører hva andre linjer er der. 316 00:19:14,050 --> 00:19:17,320 Så nå skal vi prøve en litt annen eksempel. 317 00:19:17,320 --> 00:19:24,940 Denne gangen her la oss først tømme skjermen, og denne gangen skal vi gjøre det cubing funksjon, 318 00:19:24,940 --> 00:19:27,080 men denne gangen, jeg forventer en produksjon verdi. 319 00:19:27,080 --> 00:19:29,180 >> Så la oss gå videre og gjøre dette. 320 00:19:29,180 --> 00:19:35,790 Nå har jeg en linje med kode som sier x blir kube av x. 321 00:19:41,370 --> 00:19:46,370 Kodelinjen, tilbakekalling, ser slik ut: x = cube (x); 322 00:19:46,370 --> 00:19:50,930 Så hvordan dette kommer til å fungere? La oss gå videre og gi deg en hvit skjerm igjen. 323 00:19:50,930 --> 00:19:54,070 Jeg kommer til å skrive ned nå verdien av x, 324 00:19:54,070 --> 00:20:01,400 som på dette tidspunkt måtte være, la oss si, 2 for å holde det enkelt. 325 00:20:01,400 --> 00:20:06,150 Jeg har skrevet ned på et stykke papir verdien 2, som er min verdi x. 326 00:20:06,150 --> 00:20:10,920 Jeg leverer den til Ken. >> Og jeg bare skrive svaret? >> Ja, la oss bare skrive svaret. 327 00:20:12,760 --> 00:20:18,940 Okay. Og nå har han å returnere meg noe. Perfekt. Hyggelig segue. 328 00:20:18,940 --> 00:20:23,120 Så nå er han rekker meg tilbake verdien av 8 i denne saken, og hva gjør jeg med det? 329 00:20:23,120 --> 00:20:28,250 Faktisk - la oss se, får denne retten. Hva skal jeg gjøre med det? 330 00:20:28,250 --> 00:20:33,440 Nå skal jeg ta denne verdien, og faktisk lagre den i de samme bitene i minnet. 331 00:20:33,440 --> 00:20:35,170 Men merker jeg er litt sliter her. 332 00:20:35,170 --> 00:20:38,210 Jeg er litt forvirret fordi der jeg faktisk skrive verdien av x, 333 00:20:38,210 --> 00:20:43,150 fordi det jeg har nettopp gjort er fysisk hånd Ken et stykke papir som hadde verdien 2, 334 00:20:43,150 --> 00:20:46,590 som var x, og faktisk, det er nettopp det som skjedde. 335 00:20:46,590 --> 00:20:50,210 Så det viser seg at når du kaller funksjonen og du passerer i en krangel 336 00:20:50,210 --> 00:20:53,290 som hallo, verden eller du passerer i en krangel som 2, 337 00:20:53,290 --> 00:20:57,110 generelt, du passerer en kopi av argumentet. 338 00:20:57,110 --> 00:21:00,730 Og så akkurat som jeg skrev ned nummeret to her og ga den til Ken, 339 00:21:00,730 --> 00:21:04,720 det må bety at jeg fortsatt har en kopi av verdien 2 sted 340 00:21:04,720 --> 00:21:08,890 fordi faktisk, nå som jeg har fått tilbake verdien 8, jeg trenger å gå tilbake i RAM 341 00:21:08,890 --> 00:21:12,130 og faktisk skrive ned 8 der jeg en gang hadde nummer 2. 342 00:21:12,130 --> 00:21:16,950 Så visuelt, husk dette begrepet bestått i, bokstavelig talt, en kopi av verdien. 343 00:21:16,950 --> 00:21:20,780 >> Ken gjør sin ting, gir meg noe tilbake - i dette tilfellet en verdi som 8 - 344 00:21:20,780 --> 00:21:24,980 og da må jeg gjøre noe med den verdien hvis jeg ønsker å holde det rundt. 345 00:21:24,980 --> 00:21:29,650 Så alt dette vil komme tilbake for å være altfor kjent før lenge. 346 00:21:29,650 --> 00:21:34,920 Takk så mye for denne demoen her, Ken. [Applaus] 347 00:21:34,920 --> 00:21:36,920 Veldig godt gjort. 348 00:21:36,920 --> 00:21:42,690 La oss se hvordan det til slutt gjelder noen av funksjonen ringer at vi har gjort her. 349 00:21:42,690 --> 00:21:47,910 La meg gå videre og bringe oss tilbake til den cubing eksempel her. 350 00:21:47,910 --> 00:21:53,300 Legg merke til at hvis vi ønsker å faktisk begynne å ta dette videre, 351 00:21:53,300 --> 00:21:57,570 Vi er nødt til å være oppmerksom på det faktum at antall x som blir vedtatt her 352 00:21:57,570 --> 00:22:01,530 er forskjellig fra det som faktisk blir vedtatt i til funksjonen. 353 00:22:01,530 --> 00:22:05,880 Så igjen, dette passerer kopi kommer til å bli ganske germane på bare et øyeblikk. 354 00:22:05,880 --> 00:22:09,580 La oss ta en titt på noe som ikke helt fungerer riktig ennå. 355 00:22:09,580 --> 00:22:13,250 Jeg kommer til å gå videre og åpner en tredje buggy eksempel, som er feil av natur, 356 00:22:13,250 --> 00:22:18,550 og det heter buggy3 og den implementerer en byttering funksjon. 357 00:22:18,550 --> 00:22:25,110 Her har vi en hovedfunksjon som har x og y vilkårlig initialisert til 1 og 2, henholdsvis. 358 00:22:25,110 --> 00:22:27,700 Vi kunne bruke GetInt, men vi trenger bare en enkel øvelse, 359 00:22:27,700 --> 00:22:30,170 så det er hardkodet som 1 og 2. 360 00:22:30,170 --> 00:22:35,340 I linjer 21 og 22, men for tilsynelatende skrive ut x og y, 1 per linje. 361 00:22:35,340 --> 00:22:39,720 Så på linje 23, hevder jeg at jeg bytte disse verdiene, dot, dot, dot. 362 00:22:39,720 --> 00:22:44,170 Jeg tydeligvis kalle en funksjon på linje 24 såkalte swap som tar 2 argumenter. 363 00:22:44,170 --> 00:22:48,300 Det er helt legitimt for funksjoner for å ta 2 argumenter. Vi har sett printf gjøre det allerede. 364 00:22:48,300 --> 00:22:51,830 >> Så swap tar tilsynelatende x og y, og som navnet antyder, 365 00:22:51,830 --> 00:22:54,670 Jeg håper at det kommer til å bytte disse 2 verdiene. 366 00:22:54,670 --> 00:23:00,090 Så da jeg hevder på linje 25 "Byttet!" og jeg skrive x og y 367 00:23:00,090 --> 00:23:03,070 under forutsetning av at de har faktisk blitt byttet. 368 00:23:03,070 --> 00:23:06,080 Men hvis jeg faktisk kjøre dette programmet - la meg åpne opp en terminal vindu, 369 00:23:06,080 --> 00:23:09,860 la meg gjøre buggy3 - som navnet antyder, er dette ikke kommer til å ende godt 370 00:23:09,860 --> 00:23:15,770 fordi når jeg trykker Enter merke til at x er 1, y 2, 371 00:23:15,770 --> 00:23:19,420 og ennå på slutten av programmet, er de fortsatt, faktisk, det samme. 372 00:23:19,420 --> 00:23:22,960 Så basert på demonstrasjonen akkurat nå med Ken, hva som faktisk skjer? 373 00:23:22,960 --> 00:23:28,710 La oss dykke inn i denne swap-funksjon. Det er super kort. Det er bare noen få linjer med kode lang. 374 00:23:28,710 --> 00:23:34,520 Men hva er det grunnleggende problemet basert på det enkle historien fortalt her oppe med Ken? 375 00:23:34,520 --> 00:23:36,670 Hvorfor er swap brutt? 376 00:23:36,670 --> 00:23:39,660 [Student] Du lagrer en kopi, ikke variabelen. 377 00:23:39,660 --> 00:23:43,980 Akkurat. Vi lagrer en kopi, ikke variabelen selv. 378 00:23:43,980 --> 00:23:47,170 Med andre ord, tar swap tilsynelatende to argumenter, en int, 379 00:23:47,170 --> 00:23:49,370 og det vilkårlig kalles a og b, 380 00:23:49,370 --> 00:23:54,420 og opp her har jeg passert i x og y, som er henholdsvis 1 og 2, 381 00:23:54,420 --> 00:23:58,770 men jeg er ikke bokstavelig talt passerer i x, jeg er ikke bokstavelig passerer y, 382 00:23:58,770 --> 00:24:01,450 Jeg passerer en kopi av x og en kopi av y. 383 00:24:01,450 --> 00:24:04,510 Det er nesten som om kopiert deg og limes inn swap 384 00:24:04,510 --> 00:24:07,810 verdiene som du vil den skal faktisk manipulere. 385 00:24:07,810 --> 00:24:14,480 Så hvis det er tilfelle, da jeg programstart utfører linje 35 og 36, 386 00:24:14,480 --> 00:24:18,650 når jeg kommer til linje 37, på dette punktet i historien, er det verdien av en? 387 00:24:21,040 --> 00:24:25,050 På dette punktet i historien, linje 37, hvilken verdi av en på dette punktet? >> [Student] 1. 388 00:24:25,050 --> 00:24:29,280 [Malan] Det bør bare være en rett, fordi x ble vedtatt i som første argument, 389 00:24:29,280 --> 00:24:33,080 og denne funksjonen bare vilkårlig kaller sin første argumentet en. 390 00:24:33,080 --> 00:24:38,200 Tilsvarende er y det andre argumentet, og det er bare vilkårlig kaller det andre argumentet b. 391 00:24:38,200 --> 00:24:40,990 >> Denne motsetningen er faktisk ganske enkelt forklart. Tenk på det. 392 00:24:40,990 --> 00:24:43,320 Ingen av oss har møtt personen som skrev printf, 393 00:24:43,320 --> 00:24:50,770 så sikkert, har han eller hun ingen anelse om hva våre variabler 30 år senere kommer til å bli kalt. 394 00:24:50,770 --> 00:24:56,650 Så det må være et skille mellom hva du kaller variabler i funksjoner du skriver 395 00:24:56,650 --> 00:25:02,080 og hva du kaller variabler i funksjoner du ringer eller bruker. 396 00:25:02,080 --> 00:25:05,340 Så med andre ord, jeg har skrevet mine variabler som x og y, 397 00:25:05,340 --> 00:25:08,890 men hvis noen andre hadde skrevet swap-funksjonen, kan han eller hun absolutt ikke ville vite 398 00:25:08,890 --> 00:25:10,690 hva mine variabler kommer til å bli kalt, 399 00:25:10,690 --> 00:25:13,830 så skjønner at dette er grunnen til at du har denne dualiteten av navn. 400 00:25:13,830 --> 00:25:16,750 Teknisk sett kunne jeg gjøre dette ved en tilfeldighet, 401 00:25:16,750 --> 00:25:20,080 men de ville fortsatt være bestått som kopier. 402 00:25:20,080 --> 00:25:23,650 Det ville bare være en ren tilfeldighet estetisk hvis den personen som skrev swap 403 00:25:23,650 --> 00:25:26,150 hadde brukt de samme navnene. 404 00:25:26,150 --> 00:25:32,370 Så på dette punktet i historien, linje 37, er en 1, b 2, og nå er jeg fortsette å bytte dem. 405 00:25:32,370 --> 00:25:34,900 Først av alt, la meg faktisk gjør dette mye enklere. 406 00:25:34,900 --> 00:25:36,690 Jeg vet ikke hva disse tre linjer med kode gjorde. 407 00:25:36,690 --> 00:25:41,210 La meg bare gjøre dette: b = a; a = b; gjort. 408 00:25:41,210 --> 00:25:44,690 Hvorfor er denne brutt, logisk? 409 00:25:46,490 --> 00:25:48,900 Det er slags intuitiv ting, ikke sant? 410 00:25:48,900 --> 00:25:52,560 Så en blir b og b blir en, 411 00:25:52,560 --> 00:25:57,730 men problemet er at så snart som linje 37 utfører, hva er verdien av a og b? 412 00:25:57,730 --> 00:26:03,410 Det samme, 1, fordi du har angrepet, så å si, du har endret b for å tilsvare en. 413 00:26:03,410 --> 00:26:08,890 Så når linje 37 har utført, det er flott, du har nå to eksemplarer av nummer 1 414 00:26:08,890 --> 00:26:13,350 innsiden av denne funksjonen, så da når du sier i tråd 38 a = b, 415 00:26:13,350 --> 00:26:17,640 du slags skrudd fordi du bare tildele 1-1. 416 00:26:17,640 --> 00:26:20,580 Du har slags mistet verdien du brydde deg om. 417 00:26:20,580 --> 00:26:23,220 Så i den opprinnelige versjonen av dette, legge merke til hva jeg gjorde. 418 00:26:23,220 --> 00:26:26,850 Jeg i stedet hadde en tredje linje med kode som så ut som dette. 419 00:26:26,850 --> 00:26:28,580 Jeg erklærer en midlertidig variabel. 420 00:26:28,580 --> 00:26:32,170 >> Tmp er en svært vanlig navn på en midlertidig variabel, og det er en int 421 00:26:32,170 --> 00:26:34,580 fordi den har for å matche det jeg ønsker å lage en kopi av. 422 00:26:34,580 --> 00:26:39,770 Jeg lagrer kopi av en innsiden av tmp, så når linje 37 har utført, 423 00:26:39,770 --> 00:26:45,860 verdien av en er - rask tilregnelighet sjekk - 1, er verdien av b 2, 424 00:26:45,860 --> 00:26:48,970 og verdien av tmp er også en. 425 00:26:48,970 --> 00:26:52,060 Så nå er jeg utføre linje 38. 426 00:26:52,060 --> 00:27:00,540 Gang linjen 38 utfører, tar en på verdien av b. Og b var 2, slik at en er nå 2. 427 00:27:00,540 --> 00:27:05,210 Så på dette punktet i historien, er en 2, er b 2, og tmp er 1, 428 00:27:05,210 --> 00:27:11,060 så nå logisk, kan vi bare plop tmp verdi i b og vi er ferdige. 429 00:27:11,060 --> 00:27:12,800 Så vi har løst det problemet. 430 00:27:12,800 --> 00:27:17,720 Dessverre, når jeg kjører dette programmet i dette skjemaet, er det ikke egentlig bytte noen verdier. 431 00:27:17,720 --> 00:27:20,100 Men for å være klar, hvorfor? 432 00:27:23,660 --> 00:27:26,450 Jeg fikset den logiske problemet fra bare et øyeblikk siden, 433 00:27:26,450 --> 00:27:31,020 men igjen, hvis jeg kjører dette programmet, x og y uendret 434 00:27:31,020 --> 00:27:33,310 innen utgangen av programmets gjennomføring. 435 00:27:33,310 --> 00:27:37,220 [Uhørlig student kommentar] >> Vi har ikke returnert noe, så det er sant. 436 00:27:37,220 --> 00:27:39,670 Men det viser seg at det er litt av et problem her fordi så langt, 437 00:27:39,670 --> 00:27:44,170 Det eneste vi har vært i stand til å returnere er en ting, og dette er en begrensning av C. 438 00:27:44,170 --> 00:27:49,070 Du kan bare returnere virkelig en verdi, i hvilket tilfelle jeg er litt stuck her 439 00:27:49,070 --> 00:27:53,310 fordi jeg kunne gå tilbake den nye verdien av x eller jeg kunne gå tilbake den nye verdien av y, 440 00:27:53,310 --> 00:27:55,190 men jeg vil begge tilbake. 441 00:27:55,190 --> 00:27:58,650 Så tilbake ikke er den enkle løsning her. 442 00:27:58,650 --> 00:28:01,710 Men problemet er fundamentalt hvorfor? Hva har vi egentlig byttet? 443 00:28:01,710 --> 00:28:04,190 [Student] a og b. >> A og b. 444 00:28:04,190 --> 00:28:08,230 Men a og b er kopier av x og y, som betyr at vi bare gjorde alt dette arbeidet, 445 00:28:08,230 --> 00:28:11,650 Vi brukte bare 3 minutter å snakke om swap-funksjonen og alle 3 av disse variablene, 446 00:28:11,650 --> 00:28:15,420 og det er flott, helt riktig isolert 447 00:28:15,420 --> 00:28:20,740 men a og b omfang er bare i disse linjene her. 448 00:28:20,740 --> 00:28:24,790 >> Så akkurat som en for loop, hvis du deklarerer et heltall jeg inne for loop, 449 00:28:24,790 --> 00:28:28,760 Tilsvarende, hvis du erklære a og b innsiden av en funksjon som du har skrevet, 450 00:28:28,760 --> 00:28:33,320 de er bare gyldig innsiden av den funksjonen, noe som betyr så snart swap er gjort gjennomføre 451 00:28:33,320 --> 00:28:38,470 og vi går fra linje 24 til linje 25, har X og Y ikke er endret i det hele tatt. 452 00:28:38,470 --> 00:28:42,790 Du bare kastet bort en hel masse tid bytte kopier av variabler. 453 00:28:42,790 --> 00:28:47,010 Så det viser seg at løsningen på dette er faktisk ikke opplagt. 454 00:28:47,010 --> 00:28:50,670 Det er ikke helt tilstrekkelig til å returnere verdier fordi vi bare kan returnere en verdi, 455 00:28:50,670 --> 00:28:53,470 og jeg virkelig ønsker å bytte både x og y på samme tid, 456 00:28:53,470 --> 00:28:55,210 så vi er nødt til å komme tilbake til dette. 457 00:28:55,210 --> 00:29:01,020 Men for nå, innser at problemet fundamentalt avledet fra det faktum at a og b er kopier 458 00:29:01,020 --> 00:29:03,630 og de er i sin egen omfang. 459 00:29:03,630 --> 00:29:05,050 La oss prøve å løse dette på noen måte. 460 00:29:05,050 --> 00:29:11,250 La meg faktisk bla tilbake hit og åpne opp, la oss si, en fjerde variant av dette, buggy4. 461 00:29:11,250 --> 00:29:13,370 Hva med dette? 462 00:29:13,370 --> 00:29:17,810 Dette er en lignende, men enklere problem å se på før vi tar en stikke på å løse det. 463 00:29:17,810 --> 00:29:24,190 Dette programmet kalles tilvekst, og det tilsynelatende initialiserer en x heltall til en i linje 18. 464 00:29:24,190 --> 00:29:28,150 Jeg så hevder x er en, jeg da kreve "økes ..." 465 00:29:28,150 --> 00:29:33,730 Jeg deretter ringe tilvekst, men da i linjene 22 og 23, jeg hevder det er blitt økes, 466 00:29:33,730 --> 00:29:40,220 Jeg hevder x er nå hva det er - 2, formodentlig - men dette programmet er buggy. 467 00:29:40,220 --> 00:29:42,610 Hva er problemet? 468 00:29:43,440 --> 00:29:50,160 Ja. >> [Uhørlig student respons] >> Nettopp. 469 00:29:50,160 --> 00:29:52,490 Så x har blitt erklært, selvsagt, på linje 18. 470 00:29:52,490 --> 00:29:54,700 Som er inne viktigste er klammeparentes. 471 00:29:54,700 --> 00:29:58,440 Så det enkle svaret her er at mens x finnes her, 472 00:29:58,440 --> 00:30:03,930 det finnes ikke i linje 32, så dette programmet faktisk ikke engang kompilere. 473 00:30:03,930 --> 00:30:07,940 Kompilatoren når jeg prøver å kompilere denne koden kommer til å kjefte på meg 474 00:30:07,940 --> 00:30:14,100 om noen svart identifikator eller noe om dette. Faktisk, la oss prøve. 475 00:30:14,100 --> 00:30:18,470 Dette er å buggy4. Det er det. 476 00:30:18,470 --> 00:30:22,110 Bruk av svart identifikator 'x' i linje 32. 477 00:30:22,110 --> 00:30:25,580 Og faktisk, la oss være mer eksplisitt her i dag, slik at dette er nyttig 478 00:30:25,580 --> 00:30:27,580 i kontortiden og hjemme. 479 00:30:27,580 --> 00:30:29,300 >> Legg merke til at det er litt kryptisk skrevet. 480 00:30:29,300 --> 00:30:37,270 Men det faktum at Clang har skreket til oss, sier buggy4.c: 32:5, faktisk er nyttig. 481 00:30:37,270 --> 00:30:42,050 Det betyr at feilen er på linje 32 ved tegnposisjon 5. 482 00:30:42,050 --> 00:30:46,700 Så 1, 2, 3, 4, 5. Det er, faktisk, hvor problemet er. 483 00:30:46,700 --> 00:30:49,790 Og også, også, husk på kontortid og hjemme, jeg er heldig her. 484 00:30:49,790 --> 00:30:52,990 Jeg har en feil. Det kommer til å være relativt enkelt å fikse. 485 00:30:52,990 --> 00:30:55,990 Men hvis du får en hel skjerm full av overveldende feilmeldinger, 486 00:30:55,990 --> 00:31:00,330 igjen innse at den nederste man kan bare være symptomatisk for den øverste ett. 487 00:31:00,330 --> 00:31:03,450 Så alltid jage ned bugs fra toppen og ned 488 00:31:03,450 --> 00:31:05,820 fordi det kan bare være en seriekoble effekt 489 00:31:05,820 --> 00:31:09,240 som tyder du har mye mer problemer enn du faktisk gjør. 490 00:31:09,240 --> 00:31:15,150 Så hvordan kan vi fikse dette hvis mitt mål er å øke x? >> [Student] Lag x global. 491 00:31:15,150 --> 00:31:17,060 Ok, så vi kan gjøre x global. 492 00:31:17,060 --> 00:31:20,480 La oss ta snarveien som jeg advarte om tidligere, men pokker, vi trenger bare en rask løsning, 493 00:31:20,480 --> 00:31:25,730 så la oss bare si int x opp her. Det gjør x global. 494 00:31:25,730 --> 00:31:31,800 Så nå main har tilgang til det og tilvekst har tilgang til det, 495 00:31:31,800 --> 00:31:34,110 og så la meg gå videre og kompilere dette nå. 496 00:31:34,110 --> 00:31:37,630 Gjør buggy4, Enter. Synes å kompilere nå. 497 00:31:37,630 --> 00:31:41,230 La oss kjøre buggy4. Og det ser ut til å faktisk fungerer. 498 00:31:41,230 --> 00:31:45,150 Dette er en av disse tingene som er gjøre som jeg sier, ikke som jeg gjør, 499 00:31:45,150 --> 00:31:47,010 som jeg nettopp har gjort her, fordi generelt, 500 00:31:47,010 --> 00:31:50,440 våre programmer kommer til å få mye mer interessant og mye lenger enn dette, 501 00:31:50,440 --> 00:31:56,390 og hvis din løsning på livets problemer er satt bare alle variablene på toppen av filen, 502 00:31:56,390 --> 00:31:59,690 svært raskt gjør programmene får horrifically vanskelig å administrere. 503 00:31:59,690 --> 00:32:02,190 Det blir vanskeligere å finne på nye variabelnavn, 504 00:32:02,190 --> 00:32:05,240 det blir vanskeligere å forstå hva variabel som gjør hva, 505 00:32:05,240 --> 00:32:08,460 og så generelt, dette er ikke en god løsning. 506 00:32:08,460 --> 00:32:10,030 Så la oss gjøre dette bedre. 507 00:32:10,030 --> 00:32:12,160 Vi ønsker ikke å bruke en global variabel her. 508 00:32:12,160 --> 00:32:16,240 >> Jeg ønsker å øke x, så jeg kunne selvsagt - 509 00:32:16,240 --> 00:32:18,670 på slutten av dagen, er denne typen av en dum historie fordi vi bare gjøre dette - 510 00:32:18,670 --> 00:32:24,450 men hvis jeg ikke visste om at operatøren eller jeg fikk ikke lov til å endre det i hoved seg selv, 511 00:32:24,450 --> 00:32:30,730 hvordan ellers kunne jeg gjennomføre Ken over her denne gangen ikke å kube, men å øke? 512 00:32:31,380 --> 00:32:33,190 Hvordan endrer jeg denne greia her? Ja. 513 00:32:33,190 --> 00:32:38,480 [Student] Pass på x og deretter returnere [hørbar] >> Ok, bra. 514 00:32:38,480 --> 00:32:41,900 Så hvorfor ikke jeg passerer i x og da heller enn den tilbake, 515 00:32:41,900 --> 00:32:44,870 hvorfor jeg ikke bare kommer tilbake x + 1. 516 00:32:44,870 --> 00:32:47,710 Et par flere ting må endre her. Jeg er på rett spor. 517 00:32:47,710 --> 00:32:49,770 Hva annet trenger jeg å finpusse? Noen andre. Ja. 518 00:32:49,770 --> 00:32:51,740 [Uhørlig student respons] 519 00:32:51,740 --> 00:32:54,730 Jeg trenger å endre retur type tilveksten fordi det ikke er ugyldig. 520 00:32:54,730 --> 00:32:57,780 Void betyr ingenting blir returnert, men klart nå det er, 521 00:32:57,780 --> 00:32:59,830 så dette må endres til - >> [student] int. 522 00:32:59,830 --> 00:33:02,740 int å være konsekvent med hva jeg faktisk tilbake. 523 00:33:02,740 --> 00:33:05,180 Nå noe annet, er fortsatt buggy her. Ja. 524 00:33:05,180 --> 00:33:08,400 [Uhørlig student respons] >> [Malan] Så jeg trenger å øke x? 525 00:33:08,400 --> 00:33:12,080 [Uhørlig student respons] >> [Malan] Ah, så jeg må passere x. 526 00:33:12,080 --> 00:33:16,660 Så jeg trenger å gjøre dette her. >> [Uhørlig student kommentar] 527 00:33:16,660 --> 00:33:20,050 [Malan] Så prototypen, må jeg endre dette opp her. 528 00:33:20,050 --> 00:33:22,930 Så dette må bli en int, har dette å bli - 529 00:33:22,930 --> 00:33:25,620 hmm, jeg har faktisk en bug her nede. La oss fikse dette først. 530 00:33:25,620 --> 00:33:29,590 Hva bør dette faktisk være? Det er nødt til å være en int noe. 531 00:33:29,590 --> 00:33:32,700 Det kan være x, men ærlig, hvis du begynner å ringe alle dine variablene x, 532 00:33:32,700 --> 00:33:35,390 det kommer til å bli mindre og mindre tydelig hva som er hva. 533 00:33:35,390 --> 00:33:39,560 >> Så la oss bare vilkårlig velge en annen navnekonvensjon for min hjelper funksjoner, 534 00:33:39,560 --> 00:33:41,940 funksjonene jeg skriver. Vi kaller det en, eller vi kan kalle det - 535 00:33:41,940 --> 00:33:45,010 La oss kalle det for å være enda mer eksplisitt. 536 00:33:45,010 --> 00:33:47,560 Så da må jeg tilbake uansett antall er pluss 1, 537 00:33:47,560 --> 00:33:50,740 og nå har jeg å endre en annen ting her oppe og en annen ting her oppe. 538 00:33:50,740 --> 00:33:54,350 Hva må jeg endre på linje 21 første? >> [Uhørlig student respons] 539 00:33:54,350 --> 00:33:57,610 [Malan] Jeg må tilordne den til x. Jeg kan ikke bare ringe tilvekst (x). 540 00:33:57,610 --> 00:34:01,960 Jeg trenger å huske svaret ved å endre verdien av x på venstre side. 541 00:34:01,960 --> 00:34:04,680 Og selv om x er nå på venstre og høyre, det er helt greit 542 00:34:04,680 --> 00:34:08,860 fordi høyre side blir utført først da blir plopped inn i venstre hånd ting - 543 00:34:08,860 --> 00:34:10,600 x i dette tilfellet. 544 00:34:10,600 --> 00:34:12,159 Og så til slutt, er dette lett å fikse nå. 545 00:34:12,159 --> 00:34:17,230 Dette bør bare matche det er der nede, int tall. 546 00:34:17,230 --> 00:34:20,570 Så en hel haug av endringer for en virkelig dum funksjon 547 00:34:20,570 --> 00:34:24,420 men representativ for ting som vi vil i økende grad ønsker å gjøre. 548 00:34:24,420 --> 00:34:27,090 Så sørg buggy4. Jeg har skrudd opp et sted. 549 00:34:27,090 --> 00:34:30,139 Herregud. Fem feil i en 6-linjers programmet. 550 00:34:30,139 --> 00:34:35,690 Så hva er galt på linje 18, 5 karakter? 551 00:34:35,690 --> 00:34:39,610 Så jeg må erklære dette, int. 552 00:34:39,610 --> 00:34:41,920 La oss se. Det finnes en hel haug med andre feil. 553 00:34:41,920 --> 00:34:47,010 Herregud - 19, 18, 21 - men igjen, la oss bare tømme skjermen, Control L her, 554 00:34:47,010 --> 00:34:49,380 og kjør Clang. 555 00:34:49,380 --> 00:34:51,340 Så 5 problemer er faktisk akkurat det en. 556 00:34:51,340 --> 00:34:57,520 Så nå la oss kjøre buggy4, Enter. Puh, har x blitt økes riktig. 557 00:34:57,520 --> 00:35:02,720 OK. Eventuelle spørsmål om hvordan å øke tallene? Ja. 558 00:35:02,720 --> 00:35:09,870 [Uhørlig student spørsmål] >> Godt spørsmål. 559 00:35:09,870 --> 00:35:14,220 Hvordan har det seg at jeg bare kan endre x til nummer og programmet vil vite umiddelbart? 560 00:35:14,220 --> 00:35:16,200 >> Igjen, tenk på det som denne abstraksjon. 561 00:35:16,200 --> 00:35:21,600 Så hvis jeg er hoved-og Ken er tilvekst, ærlig, jeg bryr meg ikke hva Ken kaller sin iPad. 562 00:35:21,600 --> 00:35:26,570 Jeg bryr meg ikke hva han kaller alt som har å gjøre med hans gjennomføring av denne funksjonaliteten. 563 00:35:26,570 --> 00:35:33,340 Dette er en implementering detaljer som jeg, viktigste, ikke å bry seg om. 564 00:35:33,340 --> 00:35:38,250 Og så bare å endre det konsekvent innsiden av funksjon - antall her og nummer her - 565 00:35:38,250 --> 00:35:40,960 er alt det tar så lang som jeg rekompilere. 566 00:35:40,960 --> 00:35:44,180 Det er liksom som om du tenker på mange av oss, de av dere med førerkort 567 00:35:44,180 --> 00:35:46,770 som har drevet eller hvis du har selv kjørt i en bil, 568 00:35:46,770 --> 00:35:50,950 de fleste av oss har ingen anelse om hvordan en bil fungerer under panseret. 569 00:35:50,950 --> 00:35:54,970 Og bokstavelig talt, hvis du åpner opp panseret, de fleste av oss - meg selv inkludert - 570 00:35:54,970 --> 00:35:56,940 kommer ikke til å virkelig vite hva vi ser på, 571 00:35:56,940 --> 00:35:59,220 typen som du kanskje føler med ting som dette akkurat nå. 572 00:35:59,220 --> 00:36:01,480 Men vi trenger egentlig ikke å bry seg om hvordan bilen fungerer, 573 00:36:01,480 --> 00:36:05,970 vi trenger ikke å bry seg hva alle de stenger og stempler og kabler inne i bilen 574 00:36:05,970 --> 00:36:08,160 faktisk gjør. 575 00:36:08,160 --> 00:36:12,770 Så noe som det du kaller stempelet spiller ingen rolle her i dette tilfellet. Samme idé. 576 00:36:12,770 --> 00:36:25,300 Ja. >> [Uhørlig student spørsmål] 577 00:36:25,300 --> 00:36:29,180 Hvis det er flere anvendelser av den variable XA øyeblikk siden, 578 00:36:29,180 --> 00:36:32,150 deg, programmerer, måtte endre dem overalt. 579 00:36:32,150 --> 00:36:36,600 Eller du kan bokstavelig talt gjøre Fil, Meny og deretter Finn, Erstatt - noe sånt - 580 00:36:36,600 --> 00:36:39,170 men du er nødt til å gjøre disse endringene selv. 581 00:36:39,170 --> 00:36:47,450 Du må være konsekvent. >> [Student] Hvis det er flere variabler [hørbar] 582 00:36:47,450 --> 00:36:53,100 En spesiell rekkefølge som her, hvis dette var int annet nummer? >> [Student] Riktig. 583 00:36:53,100 --> 00:36:56,590 [Malan] Yeah. Bestill teller når du ringer funksjonen. 584 00:36:56,590 --> 00:37:00,050 >> Så hvis jeg skulle kalle tilvekst her med noe komma noe, 585 00:37:00,050 --> 00:37:01,680 det er en direkte kartlegging. 586 00:37:01,680 --> 00:37:05,690 Den første variabelen, hva det heter, er laget en kopi av det første argumentet over her. 587 00:37:05,690 --> 00:37:07,760 Unnskyld. Dette bør ikke være en parentes. 588 00:37:07,760 --> 00:37:11,490 Det andre argumentet på linje med andre. Så orden, ja, saker. OK. 589 00:37:11,490 --> 00:37:17,020 Unnskyld. Jeg tok den lange veien for å komme dit. Andre spørsmål? OK. 590 00:37:17,020 --> 00:37:20,610 Så la oss se om vi ikke kan male et bilde av hva som faktisk skjer her 591 00:37:20,610 --> 00:37:23,090 under panseret, så å si. 592 00:37:23,090 --> 00:37:26,640 Dette er et rektangel som kan representere datamaskinens minne. 593 00:37:26,640 --> 00:37:30,970 Selv om du ikke har noen anelse om hvordan hukommelsen virker eller hvordan RAM fungerer, 594 00:37:30,970 --> 00:37:33,940 minst forutsetter at du har bunter av det i disse dager. 595 00:37:33,940 --> 00:37:36,280 Du har megabyte av det, har du gigabyte av det, 596 00:37:36,280 --> 00:37:40,870 og vi vet fra uke 0 som en byte er bare hva? >> [Student] 8 biter. 597 00:37:40,870 --> 00:37:42,950 8 biter, ikke sant? Så 8 nuller og ett. 598 00:37:42,950 --> 00:37:45,880 Så hvis datamaskinen har en gig RAM, 2 gigabyte RAM i disse dager, 599 00:37:45,880 --> 00:37:55,030 du har en milliard eller 2 milliarder bytes minne eller omtrent 8 milliarder kroner eller 16 milliard bits 600 00:37:55,030 --> 00:37:56,890 innsiden av datamaskinen. 601 00:37:56,890 --> 00:38:00,590 I motsetning til den lille Wooly Willy eksempel, er det ikke magnetiske partikler vanligvis lenger. 602 00:38:00,590 --> 00:38:04,450 I økende grad - i bærbare datamaskiner minst - det er solid state-disker, SSD, 603 00:38:04,450 --> 00:38:08,580 som bare har noen bevegelige deler. Det er all elektronisk. Det er all elektrisitet-basert. 604 00:38:08,580 --> 00:38:14,060 Så tenk på dette rektangelet som bare representerer 1 eller 2 gigabyte minne som du har. 605 00:38:14,060 --> 00:38:16,020 >> Så det er en del av minnet. 606 00:38:16,020 --> 00:38:19,830 En verden av datateknologi har liksom fradeles 607 00:38:19,830 --> 00:38:22,950 biter av minne til å gjøre forskjellige ting. 608 00:38:22,950 --> 00:38:27,190 For eksempel, hvis dette er datamaskinens RAM, som foreslått av rektangelet der, 609 00:38:27,190 --> 00:38:31,130 det viser seg at ved konvensjonen, på toppen av RAM, så å si, 610 00:38:31,130 --> 00:38:33,660 er generelt det som kalles en tekst segment. 611 00:38:33,660 --> 00:38:36,740 De er 0'er og 1'ere som du har samlet. 612 00:38:36,740 --> 00:38:39,020 Så når vi har sett under panseret på hva a.out er, 613 00:38:39,020 --> 00:38:41,980 alle disse 0'er og 1'ere, når du kjører et program, 614 00:38:41,980 --> 00:38:46,290 de 0'er og 1'ere er lastet fra harddisken til noe som kalles RAM, 615 00:38:46,290 --> 00:38:49,320 og i RAM de er satt på toppen. 616 00:38:49,320 --> 00:38:52,770 I mellomtiden har du andre ting: initialisere data, uninitialize data. 617 00:38:52,770 --> 00:38:57,510 De to ranker minne refererer til globale variabler, som du ikke bruker så ofte 618 00:38:57,510 --> 00:39:00,760 men noen ganger hvis du gjør det, ender de opp der oppe også. 619 00:39:00,760 --> 00:39:04,260 Så er det noen andre ting: miljøvariabler, som vi ikke vil bruke mye tid på, 620 00:39:04,260 --> 00:39:06,860 men da 2 viktige ting som vil komme tilbake gjennom hele semesteret, 621 00:39:06,860 --> 00:39:08,550 stack og heap. 622 00:39:08,550 --> 00:39:12,210 Så de fleste av datamaskinens minne er reservert når du kjører et program 623 00:39:12,210 --> 00:39:15,370 for noe som kalles stabelen og noe som kalles haugen. 624 00:39:15,370 --> 00:39:18,840 Vi kommer ikke til å snakke om heap i dag, men vi vil snakke om stabelen. 625 00:39:18,840 --> 00:39:24,600 Stabelen er ment å trylle frem det visuelle av matsalen matbrett i Mather House 626 00:39:24,600 --> 00:39:28,110 eller hvor du tilfeldigvis være der matsalen ansatte rengjør dem hver dag, 627 00:39:28,110 --> 00:39:30,180 de stable dem opp fra gulvet på opp, 628 00:39:30,180 --> 00:39:34,550 og tilsvarende, i minnet, er det denne ideen om å sette noe på en stabel, 629 00:39:34,550 --> 00:39:36,860 sette noe på en stabel, sette noe på en stabel. 630 00:39:36,860 --> 00:39:38,240 Og hva mener vi med dette? 631 00:39:38,240 --> 00:39:41,860 >> La oss zoome inn på akkurat den nedre halvdelen av dette bildet, datamaskinens RAM, 632 00:39:41,860 --> 00:39:44,330 å foreslå følgende. 633 00:39:44,330 --> 00:39:48,170 Det viser seg at når du kjører et program som a.out eller Hallo - 634 00:39:48,170 --> 00:39:50,100 hva programmet er at du har skrevet - 635 00:39:50,100 --> 00:39:54,020 igjen, de 0'er og 1'ere er lastet fra harddisken, som er langsiktig lagring, 636 00:39:54,020 --> 00:39:57,230 forblir det selv når du trekker ut kontakten, lastet inn i RAM. 637 00:39:57,230 --> 00:40:00,610 RAM er raskere enn harddisker - det er mindre enn harddisker - 638 00:40:00,610 --> 00:40:03,300 men det er der programmene leve mens du kjører dem. 639 00:40:03,300 --> 00:40:08,230 Så du dobbeltklikker et program på en Mac eller PC, er det lastet fra harddisk til RAM. 640 00:40:08,230 --> 00:40:11,520 Så snart det er lastet inn i RAM, det 0'er og 1'ere gå på veien toppen, 641 00:40:11,520 --> 00:40:16,610 den såkalte tekstsegment, men deretter så snart programmet faktisk begynner å kjøre, 642 00:40:16,610 --> 00:40:21,360 den viktigste funksjonen kalles, og viktigste, som vi har sett, ofte har lokale variabler, 643 00:40:21,360 --> 00:40:24,870 og det har ints og strenger og chars og lignende. 644 00:40:24,870 --> 00:40:29,180 Så hvis programmet som du har skrevet eller programmet som du har dobbeltklikket 645 00:40:29,180 --> 00:40:32,970 brukt noen variabler inne i main, 646 00:40:32,970 --> 00:40:37,240 de ender opp på bunnen av bunken med minne, så å si. 647 00:40:37,240 --> 00:40:39,410 Mer konkret hva dette egentlig betyr? 648 00:40:39,410 --> 00:40:48,450 Dette betyr bare at hvis vi skulle nummerere bytes RAM i datamaskinen, 649 00:40:48,450 --> 00:40:55,750 merke til at dette kan være bytenummer 0, kan dette være byte nummer 1, 2, 3, 4, 5, 6, 650 00:40:55,750 --> 00:41:01,480 hele veien opp til 2 milliarder ville være helt der oppe på toppen. 651 00:41:01,480 --> 00:41:05,880 Så med andre ord, når vi snakker om RAM eller minne i form av bytes, 652 00:41:05,880 --> 00:41:11,500 det betyr bare at noen har bestemt hva de skal telle hver av disse biter av minnet. 653 00:41:11,500 --> 00:41:16,650 Så når du trenger 32 bits for en int eller trenger du 8 biter for en røye, 654 00:41:16,650 --> 00:41:18,840 hvor ender de opp i minnet? 655 00:41:18,840 --> 00:41:22,350 >> Konseptuelt, de bare ender opp på bunnen av denne tingen kalt stabelen. 656 00:41:22,350 --> 00:41:25,870 Men det som er interessant nå er når main kaller en funksjon - 657 00:41:25,870 --> 00:41:28,750 anta en funksjon kalt foo, bare et tilfeldig navn - 658 00:41:28,750 --> 00:41:32,330 hva som skjer er det viktigste er på bunnen av denne bunken med minne; 659 00:41:32,330 --> 00:41:35,680 Foo nå er satt på toppen av hoved i minnet. 660 00:41:35,680 --> 00:41:40,990 Slik at eventuelle lokale variabler som Foo har ender opp slags begrepsmessig over de i main. 661 00:41:40,990 --> 00:41:47,070 Hvis foo kaller en annen funksjon kalt bar, disse variablene ende opp her. 662 00:41:47,070 --> 00:41:50,120 Hvis bar kaller noe annet, her, her, her. 663 00:41:50,120 --> 00:41:53,830 Så hva er interessant om hvordan du kjører et program er at når du kaller funksjoner 664 00:41:53,830 --> 00:41:57,750 og som disse funksjonene kaller funksjoner og som disse funksjonene kaller funksjoner, 665 00:41:57,750 --> 00:42:01,470 du bygge opp denne bunken av funksjoner i minnet. 666 00:42:01,470 --> 00:42:06,890 Og bare en gang i funksjonen returnerer du begynne å få det minnet tilbake. 667 00:42:06,890 --> 00:42:10,860 Så en av de enkleste måtene å kjøre ut av minnet i et dataprogram 668 00:42:10,860 --> 00:42:14,360 er å skrive funksjoner som aldri tilbake. 669 00:42:14,360 --> 00:42:18,900 Så for eksempel, la oss vise så mye med en bevisst buggy program. 670 00:42:18,900 --> 00:42:22,230 La meg gå videre og gjøre # include , 671 00:42:22,230 --> 00:42:25,000 int main (void), 672 00:42:25,000 --> 00:42:32,940 og jeg kommer til å gjøre mens (2> 1), som sannsynligvis ikke vil noensinne forandre på oss, 673 00:42:32,940 --> 00:42:37,560 og la meg gå videre nå og gjøre printf. 674 00:42:37,560 --> 00:42:40,700 Egentlig, det kommer til å være mindre visuelt interessant. La oss gjøre dette. 675 00:42:40,700 --> 00:42:50,240 For int i = 0; i> 0 - la oss gjøre dette feil - i + +. 676 00:42:50,240 --> 00:42:52,720 Og la oss ikke printf her. La oss praktisere det jeg forkynner. 677 00:42:52,720 --> 00:43:00,190 La oss ha en metode her, ugyldige refreng, og vi vil si int i, 678 00:43:00,190 --> 00:43:06,830 og da kommer jeg til å si printf - nei, la oss gjøre dette mer interessant. 679 00:43:06,830 --> 00:43:15,790 La oss faktisk ikke skrive noe i det hele tatt. La oss bare gjøre dette: kor (i). 680 00:43:15,790 --> 00:43:20,390 OK. Så dette er buggy fordi hvorfor? 681 00:43:20,390 --> 00:43:23,380 Jeg gjør dette som jeg gå fordi programmet ikke gjør faktisk noe av interesse. 682 00:43:23,380 --> 00:43:25,320 >> Men det er ikke målet. 683 00:43:25,320 --> 00:43:29,630 Målet er å skrive et program som viktigste funksjon gjør hva, tilsynelatende? 684 00:43:30,720 --> 00:43:32,860 Kalle seg. Og faktisk, trenger vi ikke loopen. 685 00:43:32,860 --> 00:43:37,200 La oss selv forenkle dette bare for ikke å miste av syne virkelig grunnleggende feil. 686 00:43:37,200 --> 00:43:39,640 Viktigste samtaler kor til å synge noen chorus, 687 00:43:39,640 --> 00:43:41,440 så jeg gjorde noe dumt og jeg hadde kor samtale kor 688 00:43:41,440 --> 00:43:43,760 fordi jeg antok noen andre skulle gjennomføre det kanskje, 689 00:43:43,760 --> 00:43:47,210 og nå er dette ikke kommer til å kompilere ennå. Jeg trenger å gjøre hva? 690 00:43:47,210 --> 00:43:49,970 Jeg trenger prototypen, huske. 691 00:43:49,970 --> 00:43:56,110 Så jeg må ha her oppe void kor (int i); 692 00:43:56,110 --> 00:43:59,210 Så nå hvis jeg går ned her - faktisk, la oss bruke større vindu. 693 00:43:59,210 --> 00:44:01,980 La oss gå videre og gjøre refreng. 694 00:44:01,980 --> 00:44:06,490 La oss gå videre og gjøre refreng. 695 00:44:06,490 --> 00:44:08,370 Bruk av svart identifikator jeg. 696 00:44:08,370 --> 00:44:12,500 Å, det var dumt. Vi trenger ikke argumentet. La oss bare gjøre dette. 697 00:44:12,500 --> 00:44:16,370 Jeg skulle ønske vi hadde startet på denne måten. Det ville ha vært en mye enklere program for å skrive. 698 00:44:16,370 --> 00:44:25,590 Det. Nå la oss gå over til min terminal-vinduet, kjører Clang, og her vi går. 699 00:44:25,590 --> 00:44:28,460 Det var virkelig rask. 700 00:44:28,460 --> 00:44:31,150 Hva som faktisk skjedde, da? 701 00:44:31,150 --> 00:44:33,730 Vel, nå skal jeg legge ut linjen slik at vi kan se. 702 00:44:33,730 --> 00:44:43,490 La meg si printf ("Jeg er her") - ingen variabler. Vi vil la det sånn. 703 00:44:43,490 --> 00:44:47,480 La meg kjøre gjøre. La meg kjøre refreng. 704 00:44:47,480 --> 00:44:57,380 Og ... kom igjen. Holde det gående. 705 00:44:57,380 --> 00:44:59,930 Som en side, hvorfor har det ikke krasjet ennå? 706 00:44:59,930 --> 00:45:02,080 Segmentering feil skjedde super rask før. 707 00:45:02,080 --> 00:45:06,570 [Uhørlig student respons] >> Nettopp. Så det tar tid å skrive ut, ikke sant? 708 00:45:06,570 --> 00:45:08,610 Det tar bare mer arbeid på datamaskinen del. 709 00:45:08,610 --> 00:45:10,620 Og det er det: Segmentering feil. 710 00:45:10,620 --> 00:45:12,340 >> Så legge merke til hvor raskt programmene kjører. 711 00:45:12,340 --> 00:45:14,130 Hvis du ikke skriver noe, super rask. 712 00:45:14,130 --> 00:45:18,770 Men vi har fortsatt denne segmentering feil fordi det som skjedde? 713 00:45:18,770 --> 00:45:21,210 Hvis du tenker på hvordan datamaskinens minne er lagt ut, 714 00:45:21,210 --> 00:45:28,740 Dette skjer for å være viktigste, men her la oss bare kalle dette koret, og la oss kalle dette koret. 715 00:45:28,740 --> 00:45:34,550 Og nå hvis jeg gjør mine estetikk rett, dette bare kommer til å si kor, kor, kor, 716 00:45:34,550 --> 00:45:40,550 kor, kor, kor, kor, ad nauseum, og til slutt, hva kommer til å skje? 717 00:45:40,550 --> 00:45:45,630 Hvis det store bildet, bokstavelig talt, er dette, hva skjer bare konseptuelt? 718 00:45:46,520 --> 00:45:48,630 Stabelen overskridelser haugen. 719 00:45:48,630 --> 00:45:51,940 Eller enda verre, du bare overkjørt alt, inkludert tekst-segmentet, 720 00:45:51,940 --> 00:45:54,590 som er den 0'er og 1'ere som representerer programmet. 721 00:45:54,590 --> 00:45:57,080 Kort sagt, dette er bare super, super dårlig. 722 00:45:57,080 --> 00:45:58,830 Ditt program har kommet ut av kontroll. 723 00:45:58,830 --> 00:46:01,220 Du bruker mye mer minne enn du hadde tenkt 724 00:46:01,220 --> 00:46:03,960 alt på grunn av en dum feil i dette tilfellet, 725 00:46:03,960 --> 00:46:08,040 eller i dette tilfellet en svært bevisst gjort funksjon kaller seg. 726 00:46:08,040 --> 00:46:09,500 Nå, dette er ikke så verst. 727 00:46:09,500 --> 00:46:13,800 Funksjoner som kaller seg faktisk har stor makt når du bruker den riktig. 728 00:46:13,800 --> 00:46:15,800 Jeg har ikke brukt den riktig her. 729 00:46:15,800 --> 00:46:19,780 Så dette er ikke så verst, men det faktum at jeg aldri slutte å kalle meg selv 730 00:46:19,780 --> 00:46:23,520 er en grunnleggende svakhet her av dette programmet. 731 00:46:23,520 --> 00:46:26,400 Så hvor skal vi med alt dette? Hva som egentlig skjer? 732 00:46:26,400 --> 00:46:30,340 Når jeg kaller tilvekst funksjonen som vi gjorde i disse eksemplene, 733 00:46:30,340 --> 00:46:33,420 Jeg har en verdi som en som jeg passerer i. 734 00:46:33,420 --> 00:46:37,570 Jeg passerer i en kopi av nummer 1, slik at følgende skjer. 735 00:46:37,570 --> 00:46:44,240 La oss gå inn i tilvekst eksempel denne fyren rett over her. 736 00:46:44,240 --> 00:46:46,870 Her er hva som faktisk skjer. 737 00:46:46,870 --> 00:46:53,400 Når jeg ringer tilvekst og passerer jeg i x, billedlig, hva skjer her er dette. 738 00:46:53,400 --> 00:46:59,520 >> Hvis jeg har verdien av en lagret her, og jeg faktisk ringe tilvekst, 739 00:46:59,520 --> 00:47:04,330 som nå kalles kor - iPad er å kaste meg av her. 740 00:47:04,330 --> 00:47:09,760 La oss kalle denne tilveksten, og vi vet ikke hva dette neste funksjon skal være. 741 00:47:09,760 --> 00:47:14,840 Så hva som faktisk skjer er her et sted i hoved Jeg har en del av minnet 742 00:47:14,840 --> 00:47:17,000 som lagrer tallet 1. 743 00:47:17,000 --> 00:47:19,380 Når jeg ringer tilvekst, jeg bruker en annen del av minnet, 744 00:47:19,380 --> 00:47:21,230 men nå har jeg kopi av en. 745 00:47:21,230 --> 00:47:26,660 Når jeg øke denne verdien, blir dette to, 746 00:47:26,660 --> 00:47:30,560 men hva skjer så snart tilvekst avkastning? 747 00:47:30,560 --> 00:47:33,630 Dette minnet bare blir sendt tilbake til operativsystemet, 748 00:47:33,630 --> 00:47:37,450 som betyr at alt du har gjort er ingenting nyttig. 749 00:47:37,450 --> 00:47:43,120 1 som ble opprinnelig inneholdt i main er fortsatt faktisk der. 750 00:47:43,120 --> 00:47:44,890 Så hvor skal vi med dette? 751 00:47:44,890 --> 00:47:49,770 Det viser seg at i minnet du har denne back-to-back sekvens av bytes 752 00:47:49,770 --> 00:47:53,050 at du kan sette ting i, og det viser seg at vi allerede har sett noe 753 00:47:53,050 --> 00:47:55,390 som innebærer å sette ting tilbake til rygg mot rygg til rygg. 754 00:47:55,390 --> 00:47:59,860 Hva er en streng basert på uke 1, og nå uke 2? 755 00:48:00,020 --> 00:48:01,980 Det er bare en samling av tegn. 756 00:48:01,980 --> 00:48:04,310 Så det viser seg akkurat som du kan sette tall i minnet, 757 00:48:04,310 --> 00:48:06,990 Tilsvarende kan du sette tegn i minnet. 758 00:48:06,990 --> 00:48:10,530 Og når vi begynner å sette karakterer i minnet rygg mot rygg til rygg mot rygg, 759 00:48:10,530 --> 00:48:13,620 det viser seg at det å bruke de enkleste ting som en for loop eller en stund loop, 760 00:48:13,620 --> 00:48:17,170 Vi kan iterate fra venstre til høyre over tegnene i en streng 761 00:48:17,170 --> 00:48:20,600 og begynne å massere dem inn i ulike karakterer helt - 762 00:48:20,600 --> 00:48:23,370 en kan bli b, kan b bli c - 763 00:48:23,370 --> 00:48:27,780 slik at til slutt, kan vi ta en engelsk setning som faktisk er fornuftig 764 00:48:27,780 --> 00:48:30,310 og konvertere hver av disse brevene en om gangen 765 00:48:30,310 --> 00:48:34,400 ved å gå gjennom vår datamaskinens minne venstre til høyre for å faktisk kryptere. 766 00:48:34,400 --> 00:48:35,810 Så la oss ta våre fem-minutters pause her, 767 00:48:35,810 --> 00:48:40,730 og når vi kommer tilbake, vil vi starte denne prosessen med scrambling informasjon. 768 00:48:42,020 --> 00:48:43,520 >> OK. 769 00:48:43,520 --> 00:48:48,070 Før vi dykke inn i noen krypto og disse tingene som kalles matriser, 770 00:48:48,070 --> 00:48:51,470 la meg pause for eventuelle spørsmål fordi jeg føler at jeg virkelig slags forvirret 771 00:48:51,470 --> 00:48:54,080 noen av disse emnene. Så la oss fikse nå hvis vi kan. 772 00:48:54,080 --> 00:48:58,700 Vi bare snakket om retur verdier, snakket vi om argumenter, 773 00:48:58,700 --> 00:49:03,250 og vi snakket om denne tanken, som vi vil komme tilbake til i ukene som kommer, 774 00:49:03,250 --> 00:49:08,720 å vise minne som en hel haug av disse stablet skuffer, så å si, 775 00:49:08,720 --> 00:49:12,660 fra bunnen på opp, slik at hver skuff som blir satt på stakken 776 00:49:12,660 --> 00:49:16,530 representerer en funksjon som for tiden å bli kalt. 777 00:49:17,900 --> 00:49:20,260 Eventuelle spørsmål? 778 00:49:20,260 --> 00:49:22,640 La meg stille et spørsmål her. 779 00:49:22,640 --> 00:49:27,890 La meg forenkle dette tilbake til hva det var før noen av våre tidligere Q & A. 780 00:49:27,890 --> 00:49:35,570 Det faktum at tilveksten har åpen parentes, int antall, lukket parentes - 781 00:49:35,570 --> 00:49:39,110 Hva representerer int nummer? 782 00:49:39,110 --> 00:49:42,790 [Student] Et argument. >> Et argument. Okay. Men hva er et argument? 783 00:49:42,790 --> 00:49:46,370 [Uhørlig student respons] >> Hva er det? >> [Student] Noe som du passerer i. 784 00:49:46,370 --> 00:49:49,940 Ok, så noe som du passerer i. Og mer generelt, er det bare inngangen. 785 00:49:49,940 --> 00:49:52,450 Hvis du skulle skrive en funksjon og at funksjons formål i livet 786 00:49:52,450 --> 00:49:55,770 er å gjøre noe litt annerledes hver gang du bruker den, 787 00:49:55,770 --> 00:50:00,110 så den eneste måten for at det skal skje virkelig synes å være å gi den med innspill 788 00:50:00,110 --> 00:50:03,510 slik at den kan gjøre noe annerledes med at innspill hver gang. 789 00:50:03,510 --> 00:50:06,650 >> Så du trenger å angi to ting når en funksjon tar input. 790 00:50:06,650 --> 00:50:09,590 Du må angi navnet du ønsker å gi til den inngangen 791 00:50:09,590 --> 00:50:12,700 rent for din egen bekvemmelighet, slik at du kan referere til den 792 00:50:12,700 --> 00:50:16,540 i funksjonen som du selv skriver, som jeg gjorde her i linje 32. 793 00:50:16,540 --> 00:50:20,800 Men du må også angi sin type fordi C er et programmeringsspråk 794 00:50:20,800 --> 00:50:25,940 som krever bare at hvis du vil ha en variabel, må du fortelle datamaskinen hva datatype det er, 795 00:50:25,940 --> 00:50:30,200 i stor grad slik at den vet hvor mange biter som skal tildeles den variabelen 796 00:50:30,200 --> 00:50:33,020 fordi det kan være 6 - beklager, vil det ikke være 6. 797 00:50:33,020 --> 00:50:37,080 Det kan være 16, kan det være åtte, kan det være 32, selv 64, 798 00:50:37,080 --> 00:50:39,130 men datamaskinen trenger å vite. 799 00:50:39,130 --> 00:50:43,180 Nå, representerer int på venstre side hva, derimot? 800 00:50:46,350 --> 00:50:48,850 [Uhørlig student respons] >> Hva er det? >> [Student] Type av funksjon. 801 00:50:48,850 --> 00:50:53,610 Typen av en funksjon og, mer spesifikt, den type av produksjonen. Høyre. 802 00:50:53,610 --> 00:50:57,380 Så mens tingen i parentes representerer sin inngang, hvis noen, 803 00:50:57,380 --> 00:50:59,660 tingen til venstre representerer sin produksjon. 804 00:50:59,660 --> 00:51:03,530 Og i dette tilfellet, returnerer tilvekst tilsynelatende en int, 805 00:51:03,530 --> 00:51:07,690 og så int er avkastningen type av denne funksjonen. 806 00:51:07,690 --> 00:51:09,340 Hva betyr det å vende tilbake? 807 00:51:09,340 --> 00:51:15,090 Bokstavelig talt, bruker du nøkkelordet retur og hvis hva du er tilbake 808 00:51:15,090 --> 00:51:18,600 til høyre for søkeordet er et heltall, 809 00:51:18,600 --> 00:51:21,660 så det er faktisk i samsvar med det vi har lovet. 810 00:51:21,660 --> 00:51:26,410 Du kunne ikke gjøre noe som dette - Hei, verden - fordi det er en streng. 811 00:51:26,410 --> 00:51:28,860 >> Selvfølgelig er det ikke et heltall. 812 00:51:28,860 --> 00:51:33,140 Så kort sagt, er byrden virkelig på oss, programmerer, for å være spesifikk 813 00:51:33,140 --> 00:51:37,770 om hva vi er tilbake og deretter faktisk gå om retur det. 814 00:51:37,770 --> 00:51:43,440 Konteksten her nå er at datamaskinens minne er en gigabyte, 2 gigabyte - 815 00:51:43,440 --> 00:51:45,920 uansett - kanskje det er mer, kanskje det er mindre, 816 00:51:45,920 --> 00:51:49,050 men datamaskinen ser det som å ha forskjellige seksjoner. 817 00:51:49,050 --> 00:51:51,200 Noe går der nede, går noe annet der oppe, 818 00:51:51,200 --> 00:51:54,290 forskjellige ting går i midten, og i dag er vi bare begynne å fortelle historien, 819 00:51:54,290 --> 00:51:56,340 men vi vil komme tilbake til dette over tid. 820 00:51:56,340 --> 00:51:59,980 For nå er det eneste stykke minne vi virkelig bryr seg om tekstsegment 821 00:51:59,980 --> 00:52:03,360 fordi det bare representerer 0'er og 1'ere som Clang har generert. 822 00:52:03,360 --> 00:52:06,050 Så når du kjører en kommando på tastaturet som a.out 823 00:52:06,050 --> 00:52:09,110 eller du dobbeltklikker et ikon på Mac OS eller Windows, 824 00:52:09,110 --> 00:52:11,880 programmet er lastet fra harddisken til RAM 825 00:52:11,880 --> 00:52:16,330 og det er plopped på toppen av datamaskinens RAM, så å si. 826 00:52:16,330 --> 00:52:20,450 Samtidig som programmet starter, og viktigste blir kalt 827 00:52:20,450 --> 00:52:23,640 i programmet skrev du eller programmet Microsoft eller Apple skrev, 828 00:52:23,640 --> 00:52:27,860 noen av sine lokale variabler ende opp der nede på bunnen av datamaskinens minne. 829 00:52:27,860 --> 00:52:33,230 Men hvis viktigste samtaler annen funksjon som selv har variabler eller argumenter, de ender opp over det. 830 00:52:33,230 --> 00:52:36,680 Og hvis det funksjon kaller noe, ender de opp over det, over det, over det. 831 00:52:36,680 --> 00:52:41,460 >> Og bare en gang i funksjonen er ferdig utfører ikke bunken med skuffer, så å si, 832 00:52:41,460 --> 00:52:43,240 begynne å bli lavere og lavere. 833 00:52:43,240 --> 00:52:48,250 Og dette er hva da, i et nøtteskall, forklarer hvorfor når du ringer kube 834 00:52:48,250 --> 00:52:51,550 eller du kaller tilvekst, du passerer en kopi av verdien. 835 00:52:51,550 --> 00:52:55,520 Og hva det betyr billedlig er at du bokstavelig talt skrive nummer 1 836 00:52:55,520 --> 00:53:00,460 i en annen del av minnet, endring at 1 til 2 i tilfelle av inkrementet 837 00:53:00,460 --> 00:53:04,820 eller til en 8 i tilfelle av kuben og deretter kaste dette minnet unna 838 00:53:04,820 --> 00:53:09,140 så snart dette inkrementet eller kuben funksjonen returnerer. Spørsmål. 839 00:53:09,140 --> 00:53:12,900 [Student] Hvor er globale variabler lagret? 840 00:53:12,900 --> 00:53:18,100 Globale variabler er lagret i det som i dag kalles initialisert data eller uinitialiserte data, 841 00:53:18,100 --> 00:53:21,920 forskjellen er hvis du har en global variabel og tildele deg den umiddelbart en verdi 842 00:53:21,920 --> 00:53:24,640 med likhetstegnet, ender det opp på toppen der, 843 00:53:24,640 --> 00:53:29,200 og hvis du bare si int x; uten verdi, ender det opp litt lavere i RAM 844 00:53:29,200 --> 00:53:31,710 bare ved konvensjonen. 845 00:53:31,710 --> 00:53:34,940 Andre spørsmål? OK. 846 00:53:34,940 --> 00:53:37,340 Så dette bildet vil komme tilbake som vi får kraftigere 847 00:53:37,340 --> 00:53:39,170 med hva vi kan gjøre med datamaskinen, 848 00:53:39,170 --> 00:53:42,720 men for nå, la oss ta en kort intro til kryptografi, 849 00:53:42,720 --> 00:53:46,080 en bestemt type kryptografi som løser ikke alle verdens problemer 850 00:53:46,080 --> 00:53:47,720 men løser noen av dem. 851 00:53:47,720 --> 00:53:51,700 I dette tilfellet her har vi noe som heter hemmelig-nøkkel kryptografi. 852 00:53:51,700 --> 00:53:56,410 Hemmelig-nøkkel kryptografi, som navnet antyder, stammer sikkerhet fra en hemmelighet. 853 00:53:56,410 --> 00:54:00,690 >> For eksempel, hvis du var tilbake i grunnskolen og du passerer en liten hemmelighet kjærlighetsbrev 854 00:54:00,690 --> 00:54:04,850 til gutten eller jenta du var knusende på, hvis du ønsket å passere dette notatet gjennom publikum, 855 00:54:04,850 --> 00:54:08,380 du sannsynligvis ikke ville skrive en merknad på engelsk eller hva morsmålet ditt er. 856 00:54:08,380 --> 00:54:13,340 Snarere kan du kryptere den, eller du kan bare sende dem en tekstmelding i disse dager. 857 00:54:13,340 --> 00:54:15,460 Men du kan faktisk sende dem et notat i hele klasserommet. 858 00:54:15,460 --> 00:54:18,700 Og for å gjøre dette sikkert på en slik måte at dine venner og læreren 859 00:54:18,700 --> 00:54:22,650 vet ikke hva du skriver, kan du komme opp med en ganske enkel algoritme, 860 00:54:22,650 --> 00:54:25,920 ung om du kan være, å bare rykke ordene. 861 00:54:25,920 --> 00:54:28,130 Så i stedet for å skrive en kan du skrive b, 862 00:54:28,130 --> 00:54:30,220 i stedet for b kan du skrive c, 863 00:54:30,220 --> 00:54:32,140 stedet for c kan du skrive d, og så videre. 864 00:54:32,140 --> 00:54:34,360 Eller du kan komme opp med en mer sofistikert oversettelse 865 00:54:34,360 --> 00:54:36,720 av brev til forskjellige bokstaver. 866 00:54:36,720 --> 00:54:39,740 Men fangsten er gutt eller jente som du sender dette notatet 867 00:54:39,740 --> 00:54:45,020 behov for å vite noe, som er det, selvsagt? >> [Student] Hva du sender. 868 00:54:45,020 --> 00:54:49,720 Hva hemmeligheten din er, som hva er det mapping mellom A og B-og c-og d er. 869 00:54:49,720 --> 00:54:54,650 Er det bare å legge en til hver av bokstavene til å gå fra A til B, B til C? 870 00:54:54,650 --> 00:54:56,670 Er det mer komplisert enn som så? 871 00:54:56,670 --> 00:55:01,540 >> Slik at du og din knuse trenger å ha denne hemmelig informasjon, 872 00:55:01,540 --> 00:55:03,190 men det er litt av en catch-22 her. 873 00:55:03,190 --> 00:55:06,830 Hvis dette er den aller første gangen du skal sende denne kjærlighetsbrev gjennom klassen, 874 00:55:06,830 --> 00:55:10,720 hvordan er det gutt eller jente kommer til å vite hva hemmeligheten selv er? 875 00:55:10,720 --> 00:55:13,930 Så hemmelig-nøkkel kryptering løser ikke alle verdens problemer, 876 00:55:13,930 --> 00:55:16,320 og det er faktisk et forhold her at vi vil komme tilbake til mot semesters slutt. 877 00:55:16,320 --> 00:55:25,110 Tilsvarende gjør de fleste av oss ikke kjenner noen som fungerer, for eksempel på Amazon.com, 878 00:55:25,110 --> 00:55:28,190 og ennå mange av oss har sikkert kjøpt ting på Amazon.com, 879 00:55:28,190 --> 00:55:31,990 og vi har blitt opplært til å anta at disse e-handelstransaksjoner er sikre. 880 00:55:31,990 --> 00:55:36,470 Nettadressen sier trolig https, er det kanskje en dum liten hengelås sted, 881 00:55:36,470 --> 00:55:39,930 det er en slags kryptografi sikre kredittkortinformasjonen 882 00:55:39,930 --> 00:55:42,160 mellom deg og Amazon.com. 883 00:55:42,160 --> 00:55:45,430 Og likevel hvis kryptografi innebærer å vite noen hemmelighet 884 00:55:45,430 --> 00:55:48,620 og ennå jeg ikke kjenner noen på Amazon, og jeg har absolutt ikke arrangert noen form for hemmelig 885 00:55:48,620 --> 00:55:52,710 med noen på Amazon, hvordan er min datamaskin eller nettleseren min å gjøre dette? 886 00:55:52,710 --> 00:55:55,720 Det viser seg at det er andre typer kryptografi helt som løser det problemet. 887 00:55:55,720 --> 00:55:57,670 Men for i dag, vil vi fokusere på enkel en 888 00:55:57,670 --> 00:56:00,290 hvor du kan ordne på forhånd for å vite noe hemmelig 889 00:56:00,290 --> 00:56:03,760 som en eller noen tilordning mellom A og B-tallet. 890 00:56:03,760 --> 00:56:05,840 Og prosessen med kryptografi generelt innebærer dette. 891 00:56:05,840 --> 00:56:08,620 Du har noen ren tekst, avbildet her til venstre, 892 00:56:08,620 --> 00:56:12,930 du kjøre det gjennom en slags algoritme eller prosedyre for kryptering det - 893 00:56:12,930 --> 00:56:15,100 kanskje det er bare en blir b, blir b c - 894 00:56:15,100 --> 00:56:17,490 og så ender du opp med chiffertekst. 895 00:56:17,490 --> 00:56:20,380 I mellomtiden, når forelskelsen mottar denne hemmelige notatet, 896 00:56:20,380 --> 00:56:24,200 han eller hun må da dekryptere den ved generelt å reversere den algoritmen 897 00:56:24,200 --> 00:56:27,190 slik som å få tilbake den ren tekst. 898 00:56:27,190 --> 00:56:28,960 Det er fysiske inkarnasjoner av dette. 899 00:56:28,960 --> 00:56:31,680 >> For eksempel er dette en liten hemmelighet dekoder ring, 900 00:56:31,680 --> 00:56:35,110 og dette er en ring i den forstand at det er to ringer her. 901 00:56:35,110 --> 00:56:38,490 På utsiden periferien av denne tingen, det er bokstavene A til Z, 902 00:56:38,490 --> 00:56:40,340 selv om de er i tilfeldig rekkefølge, 903 00:56:40,340 --> 00:56:42,880 og på innsiden, det er faktisk noen tall 904 00:56:42,880 --> 00:56:46,620 slik at med denne ringen kan du slags skru utsiden, men ikke på innsiden 905 00:56:46,620 --> 00:56:49,140 for å stille opp tallene med bokstaver. 906 00:56:49,140 --> 00:56:53,020 Fra en film som heter A Christmas Story, vil du se at lille Ralphie 907 00:56:53,020 --> 00:56:58,000 var så ivrig etter å finne ut hva Little Orphan Annie hemmelige budskap var til ham 908 00:56:58,000 --> 00:57:02,570 som hadde blitt kommunisert, tror jeg, i form av tallkoder på en frokostblanding boks 909 00:57:02,570 --> 00:57:07,220 og du måtte samle alle de små kortene som fulgte med i frokostblanding boksen, 910 00:57:07,220 --> 00:57:09,770 du måtte sende dem inn, måtte du få tilbake den hemmelige dekoder ring 911 00:57:09,770 --> 00:57:13,910 slik at du kan endelig finne ut hva kartleggingen er mellom bokstaver og tall 912 00:57:13,910 --> 00:57:15,550 eller bokstaver og bokstaver. 913 00:57:15,550 --> 00:57:19,520 Hvordan i en datamaskin kan vi gå om etablering eller representerer ting som dette? 914 00:57:19,520 --> 00:57:22,560 Vi trenger en måte å uttrykke oss selv litt mer fleksibelt 915 00:57:22,560 --> 00:57:25,080 enn våre variabler så langt har tillatt. 916 00:57:25,080 --> 00:57:29,000 Vi har hatt ints, vi har hatt tegn, vi har hatt flyter og dobbeltrom og noen få andre, 917 00:57:29,000 --> 00:57:34,200 men de er individuelle deler av minnet som ikke egentlig tillater oss å uttrykke ting 918 00:57:34,200 --> 00:57:36,440 som ord og setninger og uttrykk. 919 00:57:36,440 --> 00:57:38,630 Faktisk har vi kalt slike ting strenger, 920 00:57:38,630 --> 00:57:42,660 men vi lover at dette er egentlig bare en forenkling i CS50 bibliotek 921 00:57:42,660 --> 00:57:45,540 at vi har tenkt å skrelle tilbake. 922 00:57:45,540 --> 00:57:47,500 Og så la oss begynne å gjøre det her. 923 00:57:47,500 --> 00:57:49,840 La meg gå videre og åpne opp en fil - 924 00:57:49,840 --> 00:57:54,100 alle disse filene er tilgjengelige, som vanlig, online - kalt array.c 925 00:57:54,100 --> 00:57:58,960 å løse et problem som ikke er relatert til strenger, men det tegner et bilde her 926 00:57:58,960 --> 00:58:01,520 av hvordan kan vi bruke noe som kalles en matrise. 927 00:58:01,520 --> 00:58:04,050 >> En matrise er en datatype. 928 00:58:04,050 --> 00:58:10,730 Det er en type variabel slags som har flere mindre datatyper innsiden av det 929 00:58:10,730 --> 00:58:12,680 rygg mot rygg til rygg mot rygg. 930 00:58:12,680 --> 00:58:16,980 Så for eksempel, hvis vi ønsket å skrive et lite program som gir deg din quiz gjennomsnitt 931 00:58:16,980 --> 00:58:19,780 for et kurs som 50 som har to spørrekonkurranser, 932 00:58:19,780 --> 00:58:23,450 du kan veldig lett skrive dette programmet basert selv på noen av forrige ukes materiale 933 00:58:23,450 --> 00:58:28,830 ved hjelp GetInt og et par av variabler: int quiz1, int quiz2. 934 00:58:28,830 --> 00:58:30,550 Og det er ganske grei. 935 00:58:30,550 --> 00:58:33,500 Det er kanskje 10, 20 linjer med kode maks å gjennomføre et program 936 00:58:33,500 --> 00:58:38,940 som ber brukeren om to quiz score og deretter regner deres gjennomsnittlige 937 00:58:38,940 --> 00:58:42,020 ved å legge dem sammen, dividere med 2, og deretter skrive ut resultatene. 938 00:58:42,020 --> 00:58:46,400 Vi kunne sannsynligvis gjøre det ganske lett nå etter et antall minutter. 939 00:58:46,400 --> 00:58:49,450 Men problemet er at anta at 50 hadde 3 spørrekonkurranser eller 4. 940 00:58:49,450 --> 00:58:52,830 Anta at du ønsket å bruke det samme programmet for en klasse som hadde ukentlige quiz. 941 00:58:52,830 --> 00:58:55,100 Tenk om en klasse som har ukentlige quiz. 942 00:58:55,100 --> 00:58:58,840 Hvis det er 16 eller så uker i et semester, nå har du 16 variabler: 943 00:58:58,840 --> 00:59:03,030 int quiz1, int quiz2, int quiz3, quiz4 int. 944 00:59:03,030 --> 00:59:06,870 Så snart du begynner å se denne redundans, dette kopieres og limes inn koden, 945 00:59:06,870 --> 00:59:09,810 det bør begynne å gjøre deg skulle ønske det var en bedre måte. 946 00:59:09,810 --> 00:59:13,610 Og heldigvis, på grunn av arrays er det. Så la oss gjøre dette. 947 00:59:13,610 --> 00:59:16,700 Først, la meg presentere en veldig enkel ting som vi ikke har brukt så langt, 948 00:59:16,700 --> 00:59:18,820 men du vil se det noen ganger i koden. 949 00:59:18,820 --> 00:59:21,270 >> Dette er hva som er generelt kalt en konstant. 950 00:59:21,270 --> 00:59:24,410 Så det er en konstant i den forstand at denne verdien ikke endres. 951 00:59:24,410 --> 00:59:26,450 Den menneskelige konvensjonen når du oppretter en konstant 952 00:59:26,450 --> 00:59:30,420 er å bruke store bokstaver akkurat slik at det virkelig skiller seg ut i koden, 953 00:59:30,420 --> 00:59:34,270 og den spesielle søkeord som du bruker i C er å definere #. 954 00:59:34,270 --> 00:59:39,970 Så vi sier # define, deretter et mellomrom og deretter ordet du vil bruke for den konstante navn 955 00:59:39,970 --> 00:59:41,730 og deretter verdien av konstanten. 956 00:59:41,730 --> 00:59:44,710 Merke dette er forskjellig fra å tildele noe til en variabel. 957 00:59:44,710 --> 00:59:46,430 Det er ingen likhetstegnet, er det ingen semikolon. 958 00:59:46,430 --> 00:59:49,140 Dette er hva som er allment kjent som en preprosessor direktivet, 959 00:59:49,140 --> 00:59:50,840 men mer om det en annen gang. 960 00:59:50,840 --> 00:59:56,350 For nå, skaper dette en uforanderlig verdi som kalles quizer 961 00:59:56,350 --> 00:59:58,290 hvis faktisk numerisk verdi er 2. 962 00:59:58,290 --> 01:00:02,180 Så når du ser spørrekonkurranser, quiz, spørrekonkurranser hele denne filen, 963 01:00:02,180 --> 01:00:04,230 det er bare nummer to. 964 01:00:04,230 --> 01:00:06,550 Hvis jeg ser på main nå, la oss se hvordan dette fungerer. 965 01:00:06,550 --> 01:00:09,770 Først det ser litt kryptisk, men det er alle ting fra uke 1. 966 01:00:09,770 --> 01:00:12,210 Spør brukeren for karakterer. Hvordan gjør vi dette? 967 01:00:12,210 --> 01:00:17,350 I tråd 22 - dette er virkelig den saftige delen - Jeg erklærer en flåte 968 01:00:17,350 --> 01:00:23,240 men ikke bare en enkelt flåte. Jeg erklærer heller en rekke flyttallsytelse verdier. 969 01:00:23,240 --> 01:00:27,700 Den variabelen kommer til å bli kalt karakterer, som underforstått her, 970 01:00:27,700 --> 01:00:31,420 men den eneste stykke av ny syntaks så er disse hakeparenteser. 971 01:00:31,420 --> 01:00:37,280 Det faktum at jeg har sagt float karakterer og deretter åpen klamme og deretter et nummer - 972 01:00:37,280 --> 01:00:40,980 legge merke til hvis dette er en konstant dette er akkurat som vi gjorde dette - 973 01:00:40,980 --> 01:00:46,840 dette betyr, "Hey datamaskin, gi meg 2 flyter og la oss kollektivt kalle dem karakterer." 974 01:00:46,840 --> 01:00:51,780 >> Dette er i motsetning til en mye mer langtekkelig prosess som dette: float Grade1; 975 01:00:51,780 --> 01:00:54,580 flyte Grade2, og så videre. 976 01:00:54,580 --> 01:00:58,310 Så en matrise tillater oss å gjennomføre denne ideen, men mye mindre messily, 977 01:00:58,310 --> 01:01:04,560 på en slik måte at vi kan skrive en linje med kode i stedet for, sier 16 for en 16-ukers semester. 978 01:01:04,560 --> 01:01:09,060 Jeg ønsker ikke å hard-kode 2 fordi hvis du tenker på dette nå logisk, 979 01:01:09,060 --> 01:01:12,560 anta neste år CS50 endringer i 3 quizer stedet 980 01:01:12,560 --> 01:01:15,010 og jeg hadde nummer 2 her, hadde jeg nummer 2 her, 981 01:01:15,010 --> 01:01:17,210 Jeg hadde nummer 2 her, nummer 2 her. 982 01:01:17,210 --> 01:01:19,890 Det blir veldig kjedelig og veldig lett å skru opp 983 01:01:19,890 --> 01:01:26,550 og ved et uhell endrer en verdi til 3 og savner noen annen verdi på 2. 984 01:01:26,550 --> 01:01:30,660 Så jeg kommer til stedet abstrakt dette bort og bruke denne konstant som, 985 01:01:30,660 --> 01:01:32,520 som navnet antyder, endres aldri. 986 01:01:32,520 --> 01:01:35,870 Og nå uansett om vi har forskjellige quizer i år eller neste, 987 01:01:35,870 --> 01:01:39,380 Jeg må bare endre den i en plass opp her på toppen. 988 01:01:39,380 --> 01:01:41,230 Så det er alt en konstant er. 989 01:01:41,230 --> 01:01:47,100 I mellomtiden er den nye konseptuelle funksjon som av en matrise. 990 01:01:47,100 --> 01:01:55,030 Så klammeparentesene gi meg så mange flyter og lar meg kollektivt kaller dem karakterer her. 991 01:01:55,030 --> 01:01:56,720 Så la oss nå se hva jeg skal gjøre. 992 01:01:56,720 --> 01:01:59,220 Her i linje 24 er begynnelsen av en for løkke. 993 01:01:59,220 --> 01:02:03,380 >> Dette er egentlig ikke noe fancy. Det er bare å bruke quizer i stedet for en hardkodet nummer. 994 01:02:03,380 --> 01:02:06,740 Men det er ingenting intellektuelt annerledes der fra forrige uke. 995 01:02:06,740 --> 01:02:11,650 Dette er bare printf, så printf ("Quiz #% d av% ​​d:") 996 01:02:11,650 --> 01:02:16,670 fordi jeg vil bare skrive ut gi meg quiz nummer 1 av 2 og deretter 2 av 2. 997 01:02:16,670 --> 01:02:18,480 Så dette er et rent estetisk ting. 998 01:02:18,480 --> 01:02:21,000 Men det interessante delen er nå på linje 27. 999 01:02:21,000 --> 01:02:27,840 For å fylle en av de to med en plassholderne kommatal, 1000 01:02:27,840 --> 01:02:29,640 du igjen bruke hakeparenteser. 1001 01:02:29,640 --> 01:02:35,170 I dette tilfellet, jeg bruker jeg fordi dette for loop har startet med i tilsvarende hva verdien, tilsynelatende? 1002 01:02:35,170 --> 01:02:36,670 [Student] 0. >> [Malan] 0. 1003 01:02:36,670 --> 01:02:40,990 Så på den første iterasjon av denne sløyfen, er det som om jeg skrev dette i koden, 1004 01:02:40,990 --> 01:02:46,310 men på den andre iterasjon av denne sløyfen, er det som om jeg skrev dette i min kode. 1005 01:02:46,310 --> 01:02:49,970 Men det faktum at jeg bruker en variabel er perfekt fordi, som navnet antyder, 1006 01:02:49,970 --> 01:02:52,600 det er varierende sin verdi på hver iterasjon, 1007 01:02:52,600 --> 01:02:55,900 så jeg fyller denne tabellen ett sted om gangen. 1008 01:02:55,900 --> 01:02:57,380 Hvordan ser denne tabellen ut? 1009 01:02:57,380 --> 01:03:01,570 Grunnen til at jeg trakk super enkel firkant på skjermen her før var på grunn av dette. 1010 01:03:01,570 --> 01:03:05,590 En matrise er bare en del av minnet etterfulgt av en annen del av minnet 1011 01:03:05,590 --> 01:03:08,570 etterfulgt av en annen del av minne og så videre. 1012 01:03:08,570 --> 01:03:13,120 Så hvis min array er av størrelse 2 i dette tilfellet her, alt jeg skulle gjøre 1013 01:03:13,120 --> 01:03:20,200 ved å skrive i min quiz score liker her - jeg fikk 100 på dette og så fikk jeg en 99 på dette - 1014 01:03:20,200 --> 01:03:24,970 så dette minnet kanskje ikke engang brukes fordi jeg har bare spurt datamaskinen 1015 01:03:24,970 --> 01:03:26,840 for en rekke størrelser som 2. 1016 01:03:26,840 --> 01:03:28,600 Disse rutene er der fremdeles, ikke sant? 1017 01:03:28,600 --> 01:03:32,670 Du har fortsatt to gigabyte RAM, selv om du bare ber om 2 flyter. 1018 01:03:32,670 --> 01:03:36,840 Så ideen bak arrays er at datamaskinen bare tar en bit av minne 1019 01:03:36,840 --> 01:03:41,340 og apportions deretter mindre biter rygg mot rygg til rygg mot rygg. 1020 01:03:41,340 --> 01:03:43,310 Og så det er alt en matrise er. 1021 01:03:43,310 --> 01:03:47,350 >> Det er en sammenhengende del av minnet innsiden av som du kan sette ting. 1022 01:03:47,350 --> 01:03:50,700 Dette skjer så å gjøre bare noen kjedelig aritmetikk. 1023 01:03:50,700 --> 01:03:54,640 Hvis jeg ruller nedover her, dette er hvor jeg da iterere over tabellen. 1024 01:03:54,640 --> 01:03:58,020 Jeg kommer opp med summering av alle verdiene i matrisen, 1025 01:03:58,020 --> 01:04:02,470 og da bruker jeg den runde funksjon her å faktisk gjøre summen deles spørrekonkurranser. 1026 01:04:02,470 --> 01:04:06,320 Men la meg bølge min hånd på det som en slags nok aritmetikk for nå. 1027 01:04:06,320 --> 01:04:08,370 Men alle som gjør for meg til slutt beregner et gjennomsnitt. 1028 01:04:08,370 --> 01:04:13,580 Så første quiz pluss andre quiz delt på 2 og deretter skrive det ut som en int. 1029 01:04:13,580 --> 01:04:17,280 Men la oss nå gjøre overgangen til et annet eksempel heter streng1, 1030 01:04:17,280 --> 01:04:20,700 som maler et lignende bilde, men bruker strenger. 1031 01:04:20,700 --> 01:04:23,940 La meg gå videre og forenkle dette for bare et øyeblikk. 1032 01:04:23,940 --> 01:04:27,090 Tilgi innrykk for nå. 1033 01:04:27,090 --> 01:04:30,870 Varsel i linje 19 i denne eksempel, får jeg en streng fra brukeren. 1034 01:04:30,870 --> 01:04:34,640 Men legg merke hva jeg neste gjøre i linjer 22 og fremover. 1035 01:04:34,640 --> 01:04:41,250 Jeg er faktisk iterating fra jeg opp til - og dette er et nytt triks - strlen, streng lengde. 1036 01:04:41,250 --> 01:04:44,880 Dette er en funksjon som kommer med C at hvis du passerer den en streng, 1037 01:04:44,880 --> 01:04:47,730 den forteller deg hvor mange tegn er i strengen. Det er alt. 1038 01:04:47,730 --> 01:04:51,550 Og det faktum at det er strlen stedet for streng lengde er bare fordi det er mer konsis. 1039 01:04:51,550 --> 01:04:55,100 Tretti år siden, likte folk å skrive ting som konsist som mulig, 1040 01:04:55,100 --> 01:04:57,630 så vi har holdt at konvensjonen her. 1041 01:04:57,630 --> 01:05:00,660 i + + betyr bare øke jeg i hver iterasjon. 1042 01:05:00,660 --> 01:05:02,990 Og nå merke til dette, noe som er veldig interessant. 1043 01:05:02,990 --> 01:05:09,180 I linje 24, sier jeg, "Computer, gi meg et tegn, 8 bits, og kaller det c". 1044 01:05:09,180 --> 01:05:12,630 Men hva er dette på høyre side sier? 1045 01:05:13,490 --> 01:05:16,530 På engelsk, hva som representerer? 1046 01:05:16,530 --> 01:05:18,730 [Student] Det første tegnet i rekken. 1047 01:05:18,730 --> 01:05:20,790 Akkurat. Gi meg det første tegnet i rekken. 1048 01:05:20,790 --> 01:05:24,090 Eller mer generelt, gi meg i. tegnet i rekken. 1049 01:05:24,090 --> 01:05:26,100 Og realisere det er viktig nå at så dataforskere, 1050 01:05:26,100 --> 01:05:27,890 vi faktisk telle fra 0. 1051 01:05:27,890 --> 01:05:29,720 >> Du har ikke skjønn nå for å begynne å gjøre dette. 1052 01:05:29,720 --> 01:05:34,160 Nå må du oppføre seg i henhold til datamaskinens forventninger og telle fra 0 1053 01:05:34,160 --> 01:05:38,180 fordi [0] kommer til å være det første tegnet i en streng, 1054 01:05:38,180 --> 01:05:42,150 [1] kommer til å bli den andre, [2] kommer til å bli den tredje, og så videre. 1055 01:05:42,150 --> 01:05:49,720 Så dette programmet, hvis jeg kompilere den, er dette igjen streng1, så sørg streng1, 1056 01:05:49,720 --> 01:05:54,670 og nå har jeg kjørt streng1 i min terminal-vinduet. 1057 01:05:54,670 --> 01:05:58,330 Den venter på innspill, så jeg kommer til å skrive i David, Enter, 1058 01:05:58,330 --> 01:06:02,540 og nå er det ut David alle på ulike linjer fordi varsel hva jeg gjør. 1059 01:06:02,540 --> 01:06:05,820 Jeg skriver ett tegn om gangen. 1060 01:06:05,820 --> 01:06:10,100 Vi vil ikke gå i detalj i dag på dette, men jeg slettet et øyeblikk siden denne sjekken her. 1061 01:06:10,100 --> 01:06:15,480 Det viser seg at hvis brukeren ikke ordentlig, motstandere, eller bare forvirret, 1062 01:06:15,480 --> 01:06:20,210 du kan faktisk ikke klarer å gi en streng av noen lengde. 1063 01:06:20,210 --> 01:06:22,860 Hvis du treffer feil tast på tastaturet, kan du gi noen streng i det hele tatt, 1064 01:06:22,860 --> 01:06:26,950 eller hvis du er ondsinnet, kan du prøve å lime på en gigabyte verdt av et essay 1065 01:06:26,950 --> 01:06:29,290 å fylle denne strengen, og hvis maskinen går tom for minne, 1066 01:06:29,290 --> 01:06:32,710 det viser seg at vi kommer til å få tilbake denne spesielle verdi som kalles NULL. 1067 01:06:32,710 --> 01:06:35,580 Så for nå, bare vet at det er denne spesielle verdi som kalles NULL 1068 01:06:35,580 --> 01:06:39,580 som vil tillate oss å sjekke når vi er ute av minne, blant annet. 1069 01:06:39,580 --> 01:06:45,630 Men hvis jeg åpner opp nå streng2, merke en forskjell her. 1070 01:06:45,630 --> 01:06:48,210 Merke en forskjell her med streng2. 1071 01:06:48,210 --> 01:06:51,340 Med streng2, dette er for loop litt annerledes. 1072 01:06:51,340 --> 01:06:55,010 >> La meg slette NULL, slik at vi kan snakke om dem en annen gang. 1073 01:06:55,010 --> 01:06:57,800 Hva er annerledes med for loop denne gangen? 1074 01:06:59,620 --> 01:07:01,670 Jeg kan gå tilbake til forrige eksempel. 1075 01:07:01,670 --> 01:07:08,580 Så det er versjon 2, er denne versjonen en. 1, 2. 1076 01:07:08,580 --> 01:07:11,980 1, 2. 1077 01:07:13,520 --> 01:07:16,660 Den strlen samtalen er der? 1078 01:07:16,660 --> 01:07:18,860 Det er i den første del av for loop. 1079 01:07:18,860 --> 01:07:21,830 Noen tanker om hvorfor jeg gjør dette? Ja. 1080 01:07:21,830 --> 01:07:24,560 [Student] Så du ikke kaller funksjonen hver eneste gang. 1081 01:07:24,560 --> 01:07:26,440 [Malan] Så vi ikke kalle funksjonen hver eneste gang. Akkurat. 1082 01:07:26,440 --> 01:07:28,300 Husker fra for looper at de er super enkelt 1083 01:07:28,300 --> 01:07:31,770 når du liksom forstå at dette er initialisering, tilstanden, og oppdateringen. 1084 01:07:31,770 --> 01:07:34,750 Problemet er at tilstanden skjer på hver iterasjon av sløyfen. 1085 01:07:34,750 --> 01:07:40,010 Og så i dette eksempelet her, er hva dårlig om det faktum at dette er min tilstand? 1086 01:07:40,010 --> 01:07:41,830 [Student] Du ringer strlen. 1087 01:07:41,830 --> 01:07:44,340 [Malan] Du ringer strlen igjen og igjen og igjen. 1088 01:07:44,340 --> 01:07:47,410 Men når jeg har skrevet i David, er lengden av strengen 5, 1089 01:07:47,410 --> 01:07:49,650 og det kommer ikke til å endre på hver iterasjon av loopen 1090 01:07:49,650 --> 01:07:51,670 fordi strengen fremdeles D-a-v-i-d. 1091 01:07:51,670 --> 01:07:55,320 Så dette er et hint om hva som kommer til å bli en stadig viktigere idé 1092 01:07:55,320 --> 01:08:00,410 kjent som en design beslutning der bare ikke gjør maskinen gjøre unødvendig arbeid. 1093 01:08:00,410 --> 01:08:03,920 >> Akkurat som en sniktitt på pset2, pset2 i standardutgaven 1094 01:08:03,920 --> 01:08:07,030 kommer til å utfordre deg til å faktisk gjennomføre noen flere koder, 1095 01:08:07,030 --> 01:08:10,410 noen flere krypteringsalgoritmer, slik at du både kan kryptere 1096 01:08:10,410 --> 01:08:13,840 og dekryptere hemmelige meldinger mye som den Ralphie det dekodet. 1097 01:08:13,840 --> 01:08:16,810 I hacker utgave av pset2, vi kommer til å gå litt lenger. 1098 01:08:16,810 --> 01:08:19,649 Vi kommer til å gi deg en fil fra en faktisk datasystem 1099 01:08:19,649 --> 01:08:23,479 som inneholder en hel haug med brukernavn og faktiske krypterte passord, 1100 01:08:23,479 --> 01:08:26,939 og utfordringen for hacker utgaven kommer til å være å knekke disse passordene 1101 01:08:26,939 --> 01:08:33,200 og finne ut hva kryptografi eller hva hemmeligheten ble brukt til å faktisk lage disse passordene. 1102 01:08:33,200 --> 01:08:36,109 Og vi kommer til å gjøre dette ved hjelp av en ny funksjon her på C 1103 01:08:36,109 --> 01:08:40,630 at jeg skal gi dere en demo av kjent som kommandolinjeargumenter. 1104 01:08:40,630 --> 01:08:44,229 Det viser seg, som noen av dere kanskje har sett i avsnitt eller i lærebøker, 1105 01:08:44,229 --> 01:08:48,260 main ikke alltid trenger å være ugyldig i parentes. 1106 01:08:48,260 --> 01:08:52,430 Det viser seg at hoved kan også skrives som dette, med to argumenter, 1107 01:08:52,430 --> 01:08:56,870 argc og argv, hvor argc er antall ord 1108 01:08:56,870 --> 01:09:00,020 at du skriver etter programmets navn på kommandolinjen 1109 01:09:00,020 --> 01:09:03,420 og argv er de faktiske ordene. 1110 01:09:03,420 --> 01:09:07,540 Og som klammeparentesene det foreslår, er argv tilsynelatende en matrise. 1111 01:09:07,540 --> 01:09:12,210 Det kommer til å være en streng etter en streng etter en streng i minnet. 1112 01:09:12,210 --> 01:09:16,010 >> Så det vi kommer til å være i stand til å gjøre starter med pset 2 er noe sånt som dette. 1113 01:09:16,010 --> 01:09:21,350 Hvis jeg gjør argv1, som er et eksempel vi vil komme tilbake til på mandag, og kjøre den, 1114 01:09:21,350 --> 01:09:23,370 legge merke til at det ikke synes å gjøre noe ennå. 1115 01:09:23,370 --> 01:09:25,490 Det skriver bare ut sitt eget navn. 1116 01:09:25,490 --> 01:09:31,479 Men hvis jeg sier farvel klasse, legg merke til at dette programmet tilsynelatende gjentar 1117 01:09:31,479 --> 01:09:35,479 over hver av de ordene som ble skrevet ved ledeteksten. 1118 01:09:35,479 --> 01:09:41,630 Og midlene som vi får tilgang til ord som brukeren har skrevet inn ved ledeteksten 1119 01:09:41,630 --> 01:09:49,160 er ved å endre hoved starte denne helgen fra int main (void) til int main (argc, argv) 1120 01:09:49,160 --> 01:09:52,050 og dermed vil bli født kommandolinjeargumenter. 1121 01:09:52,050 --> 01:09:57,100 Og når du får virkelig sofistikert på dette, vil du være i stand til å skrive virkelig trippy programmer 1122 01:09:57,100 --> 01:09:59,610 slik som denne en her, som går utover 1123 01:09:59,610 --> 01:10:03,940 noen av funksjonene vi har gjort så langt, men alle ganske kraftig. 1124 01:10:03,940 --> 01:10:08,950 >> Så vi vil forlate dette med denne på skjermen, og vi vil se deg på mandag. 1125 01:10:17,570 --> 01:10:20,000 >> [CS50.TV]