1 00:00:00,000 --> 00:00:02,270 [Powered by Google Translate] [Uge 2, Fortsat] 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. Det er CS50, og dette er slutningen af ​​uge 2. 5 00:00:10,990 --> 00:00:14,410 Hvis du forventer at være sultne omkring dette tidspunkt i morgen, 6 00:00:14,410 --> 00:00:18,620 vide, at vi kommer til at indkalde til en lille gruppe i morgen, torsdag, 13:15. 7 00:00:18,620 --> 00:00:21,360 Der er denne URL her, hvis du gerne vil RSVP. 8 00:00:21,360 --> 00:00:26,740 Rummet er begrænset, så tilgiv, hvis formularen er fyldt op med den tid du udfylde denne. 9 00:00:26,740 --> 00:00:29,300 En anden webadresse, selv om, som kunne være af interesse er dette. 10 00:00:29,300 --> 00:00:32,369 I næsten en måneds tid, er naturligvis vil blive stillet til rådighed 11 00:00:32,369 --> 00:00:36,890 desto mere bredt via EDX, via hvilke folk på internettet vil være i stand til at følge med, 12 00:00:36,890 --> 00:00:39,380 engagere sig i løbet ganske aktivt, i virkeligheden. 13 00:00:39,380 --> 00:00:42,270 De vil være ved hjælp af CS50 Appliance og CS50 Diskuter 14 00:00:42,270 --> 00:00:45,490 og de fleste af de forskellige software-værktøjer, vi allerede har brugt dette semester. 15 00:00:45,490 --> 00:00:48,710 Og en af ​​de initiativer, vi gerne vil tage på som et eksperiment i år 16 00:00:48,710 --> 00:00:51,930 er at se, hvor meget indhold, vi kan oversætte 17 00:00:51,930 --> 00:00:53,960 i andre talte og skrevne sprog. 18 00:00:53,960 --> 00:00:57,500 Så hvis du kan have en interesse i at deltage i dette projekt 19 00:00:57,500 --> 00:01:02,270 hvorved vi vil give engelske udskrifter og undertekster for kursets forelæsninger 20 00:01:02,270 --> 00:01:05,450 og shorts og seminarer og sektioner og lignende, 21 00:01:05,450 --> 00:01:08,200 hvis du taler flydende eller skrive flydende et andet sprog, 22 00:01:08,200 --> 00:01:12,290 vi ville elske at engagere dig i dette projekt, hvor du tager på en eller flere af de videoer, 23 00:01:12,290 --> 00:01:15,200 omsætte dem til et sprog, du kender ganske godt. 24 00:01:15,200 --> 00:01:18,700 >> For at give dig en fornemmelse af grænsefladen, der er denne web-baserede brugergrænseflade 25 00:01:18,700 --> 00:01:22,090 at vi kommer til at bruge, som vil skabe væsentlige en UI som denne. 26 00:01:22,090 --> 00:01:24,290 Dette blev mig undervisning nogle Halloween siden, 27 00:01:24,290 --> 00:01:27,390 og på den højre side er der i sort siden af ​​disse tidsstempler, 28 00:01:27,390 --> 00:01:31,210 kan du se de forskellige ting, der kom ud af min mund den dag, 29 00:01:31,210 --> 00:01:34,850 og derefter under det du vil være i stand til at oversætte til et andet sprog 30 00:01:34,850 --> 00:01:38,690 præcis, hvad mapping er mellem, i dette tilfælde, engelsk og sige, spansk. 31 00:01:38,690 --> 00:01:40,440 Så det er faktisk en meget brugervenligt værktøj. 32 00:01:40,440 --> 00:01:43,370 Du kan spole tilbage og spole frem meget hurtigt med tastaturgenveje. 33 00:01:43,370 --> 00:01:47,490 Så hvis du gerne vil deltage i dette forsøg, og få dine ord set og læst 34 00:01:47,490 --> 00:01:51,850 ved potentielt tusindvis af folk derude, er du velkommen til at deltage. 35 00:01:51,850 --> 00:01:54,350 Ét ord om killing fra mandag. 36 00:01:54,350 --> 00:02:00,350 Lest vi har sendt en alt for skræmmende budskab, gøre indse, at som kontortid tyder 37 00:02:00,350 --> 00:02:03,300 og som sektioner antyder, udformningen af ​​kurset er meget 38 00:02:03,300 --> 00:02:07,360 at have de studerende samarbejder og taler til arbejde gennem problematiske sæt 39 00:02:07,360 --> 00:02:11,260 og problemer sammen, og virkelig den linje bare kommer ned til, 40 00:02:11,260 --> 00:02:16,010 igen, bør det arbejde, du i sidste ende indsende være din egen. 41 00:02:16,010 --> 00:02:18,860 Og så helt ærligt, i kontortiden det er helt normalt, 42 00:02:18,860 --> 00:02:22,240 Det er helt forventes selv at blive chatter med nogle ven ved siden af ​​dig. 43 00:02:22,240 --> 00:02:24,370 >> Hvis han eller hun kæmper med nogle emne, og du er ligesom, 44 00:02:24,370 --> 00:02:27,940 "Nå, ja, lad mig give dig et glimt af nogle linje kode, som jeg skrev," det er fint, 45 00:02:27,940 --> 00:02:31,250 det sker, og det er meget befordrende, tror jeg, med processen med læring. 46 00:02:31,250 --> 00:02:36,750 Når linjen bliver krydset er, når hovedet er slags vippet over her i alt for mange sekunder 47 00:02:36,750 --> 00:02:41,160 eller minutter for at virkelig at have bare været en Unblocking mulighed for din ven, 48 00:02:41,160 --> 00:02:44,160 og i hvert fald når tingene bliver udvekslet via e-mail og Dropbox og lignende, 49 00:02:44,160 --> 00:02:45,640 der også er den linje. 50 00:02:45,640 --> 00:02:48,620 Så med alle midler føler sig trygge og føler sig tilskyndet til at chatte med venner 51 00:02:48,620 --> 00:02:52,810 og klassekammerater om psets og mere og bare indse, at hvad du i sidste ende indsende 52 00:02:52,810 --> 00:02:57,340 bør virkelig være et produkt af din skabelse og ikke en anden. 53 00:02:57,340 --> 00:03:00,490 Og så en af ​​de domæne-specifikke problemer for pset2, 54 00:03:00,490 --> 00:03:04,740 der vil komme ud sent i morgen aften, er at dykke ned i en verden af ​​kryptografi, 55 00:03:04,740 --> 00:03:08,970 som er kunsten at kryptere eller forvanske oplysninger, 56 00:03:08,970 --> 00:03:12,600 og dette i sidste ende drejer sig om verden i sikkerhed. 57 00:03:12,600 --> 00:03:16,560 Nu, sikkerhed for de fleste af os kommer i form af temmelig verdslige mekanismer. 58 00:03:16,560 --> 00:03:19,050 Vi har alle brugernavne og adgangskoder, 59 00:03:19,050 --> 00:03:23,450 og alle af os har meget dårlige brugernavne og adgangskoder, mest sandsynlige. 60 00:03:23,450 --> 00:03:28,240 >> Hvis din adgangskode er den samme på flere websteder, det er nok ikke den bedste idé, 61 00:03:28,240 --> 00:03:30,070 som vi vil diskutere mod semesters afslutning. 62 00:03:30,070 --> 00:03:34,720 Hvis din adgangskode er skrevet på en gul seddel - ingen joke - på din skærm, 63 00:03:34,720 --> 00:03:38,350 der også er ikke nødvendigvis det bedste design, men ganske almindeligt fænomen. 64 00:03:38,350 --> 00:03:42,470 Og hvis du ikke bruger kryptografi til at kryptere dine adgangskoder, 65 00:03:42,470 --> 00:03:44,210 de er særligt sårbare. 66 00:03:44,210 --> 00:03:47,270 Så hvis du tror, ​​du er super dygtig ved at have en skjult Word-dokument 67 00:03:47,270 --> 00:03:49,910 et sted på din harddisk, der har alle dine passwords 68 00:03:49,910 --> 00:03:53,670 men det er i en mappe, som ingen kommer til at se i, at også ikke er en meget sikker mekanisme. 69 00:03:53,670 --> 00:03:56,990 Og hvad så pset2 vil indføre, er denne kunst af kryptografi 70 00:03:56,990 --> 00:04:02,010 og scrambling oplysninger, således at ting som passwords er så meget desto mere 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 mulighed for at kryptere den og at scramble den. 73 00:04:07,930 --> 00:04:11,470 Og så dette for eksempel er et eksempel på en krypteret meddelelse. 74 00:04:11,470 --> 00:04:14,700 Dette faktisk siger noget på engelsk, men det er tydeligvis ikke helt indlysende. 75 00:04:14,700 --> 00:04:18,279 Og vi kommer hele vejen rundt i dag for at drille hinanden, hvad denne hemmelige budskab her er. 76 00:04:18,279 --> 00:04:23,490 Men i den virkelige verden af ​​computere, går tingene ikke engang ligne de kan være engelske sætninger. 77 00:04:23,490 --> 00:04:28,430 For eksempel er det, hvad du kan finde på en standard Linux eller Mac eller UNIX-computer 78 00:04:28,430 --> 00:04:32,070 i en fil, der var engang kaldet password-filen. 79 00:04:32,070 --> 00:04:34,200 >> I dag er det blevet flyttet til andre steder. 80 00:04:34,200 --> 00:04:39,210 Men hvis man ser på det rigtige sted på et system, vil du se ikke kun dit brugernavn 81 00:04:39,210 --> 00:04:43,400 eller for andre mennesker på systemet, men du vil se en krypteret version af deres adgangskode. 82 00:04:43,400 --> 00:04:47,980 Faktisk er ordet krypt der tyder på, at følgende ting er krypteret, 83 00:04:47,980 --> 00:04:52,680 og denne serie af tilsyneladende tilfældige bogstaver og tegn og tal og så videre 84 00:04:52,680 --> 00:04:56,480 kan dekrypteres kun ved generelt at kende nogle hemmelige - 85 00:04:56,480 --> 00:04:58,840 et hemmeligt ord, et hemmeligt nummer - 86 00:04:58,840 --> 00:05:03,160 og så endda til kunsten at kryptografi sidste ende koges ned stole af en slags 87 00:05:03,160 --> 00:05:05,650 og at vide noget som en anden ikke gør. 88 00:05:05,650 --> 00:05:10,090 Så vi vil udforske dette i en lidt mere detaljeret i dag og i Pset at komme. 89 00:05:10,090 --> 00:05:12,200 Og nu et ord om bestået / ikke bestået. 90 00:05:12,200 --> 00:05:15,360 Især som nogle af jer har dykket ned pset1 skal apparatet, 91 00:05:15,360 --> 00:05:19,080 og en meget ny verden for dig selv, indser, at frustrationer og forvirring 92 00:05:19,080 --> 00:05:21,700 og kun tekniske vanskeligheder er ganske forventes, 93 00:05:21,700 --> 00:05:24,180 især med den første Pset, hvor der er bare så meget nyt, 94 00:05:24,180 --> 00:05:27,730 bare at få kendskab til ls og cd, og alle disse mystiske kommandoer 95 00:05:27,730 --> 00:05:33,050 og et nyt miljø, og det er adskilt fra det faktiske materiale og programmering selv. 96 00:05:33,050 --> 00:05:36,940 Så indser også, at der er helt sikkert kontortid, der eksisterer som en støtte struktur. 97 00:05:36,940 --> 00:05:38,880 >> Sektioner begynder den kommende søndag. 98 00:05:38,880 --> 00:05:42,960 Men vigtigst af alt, hvis du føler bare, at dette ikke er verden for dig, 99 00:05:42,960 --> 00:05:44,710 indse, at det virkelig bare tage tid. 100 00:05:44,710 --> 00:05:48,600 Og var det ikke for denne mulighed år siden for mig at tage en klasse bestået / ikke bestået, 101 00:05:48,600 --> 00:05:50,990 ærligt, jeg aldrig ville have endog sat foden i klasseværelset. 102 00:05:50,990 --> 00:05:53,690 Og du kan ændre dette indtil, siger, den femte mandag i kurset, 103 00:05:53,690 --> 00:05:58,280 så hvis du er på kanten nu, indse, at i stedet for hovedet ind i nogle andre farvande helt, 104 00:05:58,280 --> 00:06:01,260 gør bestemt overveje bare skift til bestået / ikke bestået. 105 00:06:01,260 --> 00:06:04,570 Igen, der er ikke virkelig denne kultur her på Harvard for at tage tingene bestået / ikke bestået 106 00:06:04,570 --> 00:06:08,670 da alle virkelig ønsker at opnå eller endnu bedre end, 107 00:06:08,670 --> 00:06:11,130 men helt ærligt, det er en vidunderlig måde at forsøge noget ud 108 00:06:11,130 --> 00:06:16,720 der måske ikke være bekendt for dig, og du ender med at gøre, i de fleste tilfælde ganske fint, 109 00:06:16,720 --> 00:06:18,210 måske meget til din overraskelse. 110 00:06:18,210 --> 00:06:20,980 Og endnu mere konkret, hvad jeg tror bestået / ikke bestået generelt gør, 111 00:06:20,980 --> 00:06:22,940 især som du måske har oplevet med pset0, 112 00:06:22,940 --> 00:06:26,560 hvis du lægger i 10 timer, 15 timer, 25 timer i nogle Pset 113 00:06:26,560 --> 00:06:29,920 og du bare banke hovedet mod muren, og det bliver super sent på aftenen 114 00:06:29,920 --> 00:06:33,950 men du har taget Pset 90% af vejen, og du kan bare ikke finde ud af én ting, 115 00:06:33,950 --> 00:06:36,520 bestået / ikke bestået virkelig tager brodden af ​​en klasse som denne, 116 00:06:36,520 --> 00:06:39,100 hvor du kan sortere i lykkeligt sige, "Okay, jeg ved, det er ikke perfekt, 117 00:06:39,100 --> 00:06:42,350 men jeg arbejdede min røv ud på dette, jeg er temmelig tilfreds med, hvor det endte, " 118 00:06:42,350 --> 00:06:44,850 og det vil opfylde forventningerne til bestået / ikke bestået. 119 00:06:44,850 --> 00:06:47,540 Så du skal holde det i tankerne. Ok. 120 00:06:47,540 --> 00:06:50,520 >> Så dem af jer der har kæmpet for at bruge Harvard University Wi-Fi, 121 00:06:50,520 --> 00:06:54,780 vide, at der er en CS50 SSID, en Wi-Fi-forbindelse, flyder rundt 122 00:06:54,780 --> 00:06:56,490 at du måske har bedre held til. 123 00:06:56,490 --> 00:07:00,130 Det er lidt ironisk, at kodeordet for dette, hvis du gerne vil prøve at tilslutte til denne 124 00:07:00,130 --> 00:07:08,350 for bedre hastigheder - og lad os vide, hvis det ikke bedre - er 12345, hele vejen op til 8 125 00:07:08,350 --> 00:07:10,910 fordi 8 er mere sikker end 5. 126 00:07:10,910 --> 00:07:16,910 Så hvis du har brug for Wi-Fi-adgangskode, oprette forbindelse til CS50 trådløst her, 12345678, 127 00:07:16,910 --> 00:07:20,380 og post på CS50 Diskuter hvis du stadig har intermitterende forbindelsesproblemer, 128 00:07:20,380 --> 00:07:25,420 og vi vil lade de beføjelser, der skal vide for dette rum. Ok. 129 00:07:25,420 --> 00:07:32,230 Så en hurtig teaser, især for dem af jer der er fan drenge eller piger i alle ting Apple. 130 00:07:32,230 --> 00:07:37,460 Hvad jeg gravet op fra et par år tilbage var denne fil her, iUnlock.c, 131 00:07:37,460 --> 00:07:39,930 bare for at slags gøre mere konkret og mere komplekse 132 00:07:39,930 --> 00:07:42,560 nogle af de mere basale C-programmer, vi har skrevet. 133 00:07:42,560 --> 00:07:46,910 Så jeg åbnede denne fil, iUnlock.c. Det er til rådighed på Forelæsninger side for i dag. 134 00:07:46,910 --> 00:07:49,810 På venstre side kan du se en lang liste over funktioner. 135 00:07:49,810 --> 00:07:53,230 Så fyr, der skrev dette skrev en masse funktioner, mere end bare main. 136 00:07:53,230 --> 00:07:57,340 Han brugte en hel masse biblioteker her, og hvis vi begynder at rulle gennem, 137 00:07:57,340 --> 00:08:04,890 hvad det egentlig er, er den allerførste, jeg tror, ​​knæk for den oprindelige iPhone. 138 00:08:04,890 --> 00:08:09,830 >> Når du ønskede at jailbreake den originale iPhone, hvilket betyder untether det fra AT & T 139 00:08:09,830 --> 00:08:13,710 og faktisk installere speciel software på det og gøre ting, som Apple ikke ønskede folk til at gøre, 140 00:08:13,710 --> 00:08:18,480 nogen tog sig tid til at finde ud af præcis, hvordan de kunne udnytte software-fejl, 141 00:08:18,480 --> 00:08:22,690 fejltagelser, bugs, i Apple-software, og dermed blev født iUnlock.c-- 142 00:08:22,690 --> 00:08:26,760 at hvis du har kompileret det på din computer og installeret det på en iPhone 143 00:08:26,760 --> 00:08:29,430 der var forbundet til din computer via fx en USB-kabel, 144 00:08:29,430 --> 00:08:32,450 dette ville give dig administrative eller root-rettigheder på din iPhone 145 00:08:32,450 --> 00:08:34,620 og lad du gøre stort set hvad du vil. 146 00:08:34,620 --> 00:08:36,400 Og så der har været denne fascinerende kat og mus spil 147 00:08:36,400 --> 00:08:39,340 mellem Apple og resten af ​​verden, navnlig da de, ligesom mange virksomheder 148 00:08:39,340 --> 00:08:43,350 prøv at låse deres ting ned, så du kan kun gøre med det hvad de har til hensigt. 149 00:08:43,350 --> 00:08:47,360 Men takket være folk som dette og forståelsen af ​​low-level detaljer - 150 00:08:47,360 --> 00:08:50,830 og i dette tilfælde C programmering - og mange af de kendte konstruktioner 151 00:08:50,830 --> 00:08:55,280 at vi er begyndt at spille med, er du i stand til virkelig at udnytte den hardware 152 00:08:55,280 --> 00:08:59,250 på en måde, du kan se passer og ikke nødvendigvis nogle virksomhedsenhed. 153 00:08:59,250 --> 00:09:01,600 Så for eksempel, har jeg ingen idé om, hvad alt dette gør, 154 00:09:01,600 --> 00:09:03,580 men GetVersion lyder temmelig ligetil, 155 00:09:03,580 --> 00:09:05,710 og det ligner det er en funktion, som denne person skrev. 156 00:09:05,710 --> 00:09:09,250 Det tager en slags heltal som argument, ikke vender tilbage noget, 157 00:09:09,250 --> 00:09:13,710 men ser ud til at sløjfe med en for-løkke her, og en hvis betingelse, hvis betingelse pause, 158 00:09:13,710 --> 00:09:16,770 og på en måde vedrører versionsnumre, hvis vi rulle ned, 159 00:09:16,770 --> 00:09:19,650 selv om en masse af disse søgeord der vil være nye. 160 00:09:19,650 --> 00:09:22,590 Og der er en hel masse funktioner i her vi har aldrig set og måske ikke nogensinde se 161 00:09:22,590 --> 00:09:24,350 i løbet af semesteret. 162 00:09:24,350 --> 00:09:29,160 >> I slutningen af ​​dagen, følger det af de samme regler og logik, som vi har leget med hidtil. 163 00:09:29,160 --> 00:09:34,340 Så dette er alt for gammel til at knække din iPhone 3s eller 4s eller snart 5s disse dage, 164 00:09:34,340 --> 00:09:38,830 men ved, at det hele er meget stammer fra denne verden, som vi har dykket ned. 165 00:09:38,830 --> 00:09:42,280 Lad os tage et kig på en lidt mere simpelt eksempel: 166 00:09:42,280 --> 00:09:46,260 denne ene, bare for at få varmes op med nogle syntaks og også nogle andre datatype 167 00:09:46,260 --> 00:09:48,910 at vi har talt om, men har ikke rigtig set i C. 168 00:09:48,910 --> 00:09:53,670 Dette er en fil kaldet positive1.c, og pr bemærkningerne øverst, 169 00:09:53,670 --> 00:09:56,070 dette blot kræver, at en bruger giver et positivt tal. 170 00:09:56,070 --> 00:09:59,910 Så det er et eksempel på en gør-while-løkke, hvilket er rart for brugeren interaktive programmer 171 00:09:59,910 --> 00:10:02,070 hvor du skal fortælle brugeren til at gøre noget, 172 00:10:02,070 --> 00:10:05,530 og hvis de ikke samarbejder du råber på dem eller afvise deres input. 173 00:10:05,530 --> 00:10:10,480 Sag i punkt: Jeg kommer til at gøre linjer 19 gennem 24 174 00:10:10,480 --> 00:10:14,620 så længe brugeren ikke har givet mig et positivt tal. 175 00:10:14,620 --> 00:10:21,340 Denne detalje her på linie 18, hvorfor jeg erklærer n over hele denne looping konstruere 176 00:10:21,340 --> 00:10:26,870 i modsætning til lige ved siden af ​​linie 22, hvor jeg faktisk pleje at få n? Yeah. 177 00:10:26,870 --> 00:10:29,330 [Studerende] Scope. >> Yeah, så spørgsmålet om anvendelsesområde. 178 00:10:29,330 --> 00:10:31,770 Og i lægmandssprog, hvad omfang henvise til? 179 00:10:34,880 --> 00:10:41,560 Yeah. >> [Uhørlig student svar] >> Kan du tale lidt højere? 180 00:10:41,560 --> 00:10:45,440 [Studerende] Hvor du kan få adgang til denne variabel. >> Perfect. 181 00:10:45,440 --> 00:10:47,610 Hvor du kan få adgang til en bestemt variabel. 182 00:10:47,610 --> 00:10:50,990 Og generelt, den tommelfingerregel hidtil har været, at rækkevidden af ​​visse variable 183 00:10:50,990 --> 00:10:56,140 defineres af de seneste krøllede parenteser, som du har set. 184 00:10:56,140 --> 00:11:03,070 >> Og så i dette tilfælde, hvis jeg gjorde fejlen at erklære n on line 22, ville denne linje arbejde. 185 00:11:03,070 --> 00:11:10,840 Jeg ville få en int, og jeg ville sætte det ind i den variable n på linje 22, 186 00:11:10,840 --> 00:11:17,060 men som linje kode vil nu have nogen idé om, hvad jeg taler om? >> [Studerende] 25. 187 00:11:17,060 --> 00:11:23,840 [Malan] 25, og det viser sig 24 som godt, fordi det i dette tilfælde falder uden for de krøllede parenteser. 188 00:11:23,840 --> 00:11:28,550 Så bare en lille smule af et irritationsmoment, men meget let løses ved blot at erklære den variable 189 00:11:28,550 --> 00:11:30,700 uden for selve funktionen. 190 00:11:30,700 --> 00:11:32,760 Vi får se senere i dag, du kan gå et skridt videre 191 00:11:32,760 --> 00:11:34,940 og du kan endda få lidt doven. 192 00:11:34,940 --> 00:11:39,660 Og det er ikke at blive anbefalet i almindelighed, men du kan endda få doven 193 00:11:39,660 --> 00:11:44,150 og sætte en variabel globalt, så at sige, ikke inde i en funktion, der ikke inde i en løkke, 194 00:11:44,150 --> 00:11:49,800 men i selve filen, uden alle de funktioner, du har skrevet, som jeg gjorde her på linie 15. 195 00:11:49,800 --> 00:11:55,220 Dette er generelt ildeset, men indse dette er en løsning til tider til andre problemer, 196 00:11:55,220 --> 00:11:56,910 da vi til sidst vil se. 197 00:11:56,910 --> 00:11:59,500 Så for nu vil vi overlade det ligesom dette, men lad os se om vi kan omskrive dette 198 00:11:59,500 --> 00:12:02,360 bare at begynde at udtrykke os selv lidt anderledes. 199 00:12:02,360 --> 00:12:05,550 Dette program, bare for at være klar, er positive1. 200 00:12:05,550 --> 00:12:11,980 Lad mig gå videre her og i min terminalvindue gøre positive1, Enter. 201 00:12:11,980 --> 00:12:15,080 Kompilerer okay. Jeg har tænkt mig at køre positive1, trykke Enter. 202 00:12:15,080 --> 00:12:19,250 Jeg forlanger, at du giver mig et positivt heltal. Jeg vil sige -1. Det virkede ikke. 203 00:12:19,250 --> 00:12:22,340 0, 99. Det synes at virke. 204 00:12:22,340 --> 00:12:25,310 Måske ikke den mest strenge test, men mindst det er en nice tilregnelighed kontrol 205 00:12:25,310 --> 00:12:27,100 at vi er på rette spor. 206 00:12:27,100 --> 00:12:29,570 >> Så nu lad mig gå videre og åbne version 2 af dette, 207 00:12:29,570 --> 00:12:32,800 og hvad er anderledes allerede? 208 00:12:32,800 --> 00:12:39,030 Det gennemfører den samme ting, men hvad der springer ud som klart anderledes denne gang? 209 00:12:40,790 --> 00:12:47,090 Denne bool i grønt. Det er fremhævet i grøn, dette søgeord er kendt som bool, som er en datatype. 210 00:12:47,090 --> 00:12:50,510 Det kommer ikke indbygget i alle versioner af C. 211 00:12:50,510 --> 00:12:52,650 Du er nødt til at indeholde en specifik bibliotek. 212 00:12:52,650 --> 00:12:56,460 I vores tilfælde medtaget jeg CS50 biblioteket, så vi har adgang til bool. 213 00:12:56,460 --> 00:12:59,860 Men i linie 18, synes vi at have en boolesk værdi her kaldet taknemmelige. 214 00:12:59,860 --> 00:13:02,190 Jeg kunne have kaldt det noget, men jeg kaldte det taknemmelig 215 00:13:02,190 --> 00:13:04,750 bare for at slags formidle nogle semantiske betydning. 216 00:13:04,750 --> 00:13:07,700 Så i første omgang på linie 18, jeg er åbenbart ikke taknemmelig 217 00:13:07,700 --> 00:13:12,230 fordi den booleske værdi taknemmelig er initialiseret til false på linje 18. 218 00:13:12,230 --> 00:13:16,500 Og så synes hvad jeg har gjort her i linjerne 21 til 23 219 00:13:16,500 --> 00:13:19,200 er jeg bare lidt omskrevet min logik. 220 00:13:19,200 --> 00:13:26,100 Så ingen funktionelt forskellige, men i linie 22 nu jeg kontrollere, om int brugeren har givet 221 00:13:26,100 --> 00:13:31,360 er større end 0, så jeg simpelthen ændre værdien af ​​taknemmelige for sand. 222 00:13:31,360 --> 00:13:35,590 Og hvorfor gør jeg det? Fordi der i linje 25, tilsyneladende jeg har tænkt mig at tjekke en betingelse. 223 00:13:35,590 --> 00:13:39,760 Gør denne løkke, mens taknemmelig er falsk. 224 00:13:39,760 --> 00:13:42,960 Så jeg foreslog dette som et alternativ til version 1 225 00:13:42,960 --> 00:13:47,050 fordi det er i det mindste lidt mere intuitiv måske, det er lidt mere jordforbindelse på engelsk. 226 00:13:47,050 --> 00:13:51,980 Så skal du gøre følgende, mens du ikke er taknemmelig eller mens taknemmelig er falsk. 227 00:13:51,980 --> 00:13:56,220 Og også denne gang jeg åbenbart ligeglad at huske, hvad brugeren har indtastet i 228 00:13:56,220 --> 00:14:00,050 fordi varsel der er ingen variable n, så faktisk, en lille hvid løgn der. 229 00:14:00,050 --> 00:14:03,290 >> Funktionelt, at programmet er en smule anderledes, når vi kommer til bunds i det 230 00:14:03,290 --> 00:14:04,960 fordi jeg ikke huske, hvad n er. 231 00:14:04,960 --> 00:14:09,120 Men jeg ønskede at vise, også her, at selvom vi har set GetInt 232 00:14:09,120 --> 00:14:13,780 og GetString anvendes på højre side af et lighedstegn hidtil 233 00:14:13,780 --> 00:14:17,310 så vi husker den værdi, teknisk, det er ikke strengt nødvendigt. 234 00:14:17,310 --> 00:14:20,290 Hvis en eller anden grund, du bare ligeglad at gemme værdien, 235 00:14:20,290 --> 00:14:25,540 du blot ønsker at kontrollere værdien, bemærke, at vi bare kan skrive dette som GetInt, 236 00:14:25,540 --> 00:14:27,320 open paren tæt parentes. 237 00:14:27,320 --> 00:14:30,570 Denne funktion vil returnere en værdi, som vi har sagt. 238 00:14:30,570 --> 00:14:32,220 Det kommer til at give dig tilbage en int. 239 00:14:32,220 --> 00:14:34,460 Og så hvis du mentalt tænker på at dette sker, 240 00:14:34,460 --> 00:14:38,190 når jeg skriver i 99, GetInt returnerer tallet 99, 241 00:14:38,190 --> 00:14:41,840 og så begrebsmæssigt, det er som om min kode var faktisk dette. 242 00:14:41,840 --> 00:14:45,950 Så hvis 99 faktisk er større end 0, så taknemmelige bliver sandt, 243 00:14:45,950 --> 00:14:50,810 så linje 25 indser ooh, vi gjort, fordi jeg nu taknemmelig, 244 00:14:50,810 --> 00:14:53,970 og i linje 26, vi simpelthen sige: "Tak for den positive heltal!" 245 00:14:53,970 --> 00:14:55,960 hvad det skete for at være. 246 00:14:55,960 --> 00:14:59,140 Nu lad os gøre lidt syntaktisk sukker her, så at sige. 247 00:14:59,140 --> 00:15:04,670 Lad os se om vi kan rydde op i denne linje 25 med denne tredje og sidste variant i positive3. 248 00:15:04,670 --> 00:15:13,600 >> Bemærk den eneste forskel nu er, hvad linje kode? >> [Studerende] 25. >> [Malan] Yeah, 25. 249 00:15:13,600 --> 00:15:17,680 Og vi har ikke rigtig set dette trick bare endnu, men vi kunne se det udråbstegn på mandag, 250 00:15:17,680 --> 00:15:21,070 som angiver hvad? >> [Studerende] Not. >> Ikke eller negation. 251 00:15:21,070 --> 00:15:23,510 Så tag en boolesk værdi og vende sin værdi. 252 00:15:23,510 --> 00:15:25,810 Sand bliver falsk, falsk bliver sandt. 253 00:15:25,810 --> 00:15:30,420 Så dette, vil jeg foreslå, er endda en smule mere intuitiv en måde at skrive koden 254 00:15:30,420 --> 00:15:33,430 fordi jeg stadig initialisere taknemmelig for falsk, jeg stadig gøre følgende, 255 00:15:33,430 --> 00:15:36,010 Jeg satte taknemmelig for sand, når den tid kommer, 256 00:15:36,010 --> 00:15:40,880 men nu kan du virkelig bare oversætte denne kode verbalt venstre mod højre, 257 00:15:40,880 --> 00:15:45,630 while (taknemmelige!), fordi bang eller udråbstegn betegner begrebet ikke, 258 00:15:45,630 --> 00:15:47,580 så mens ikke taknemmelige. 259 00:15:47,580 --> 00:15:49,900 Så igen har vi ikke har indført nye koncepter i sig selv. 260 00:15:49,900 --> 00:15:53,730 Vi talte om Booleans tilbage, når vi legede med Scratch, 261 00:15:53,730 --> 00:15:56,720 men indser nu kan vi bare begynde at skrive vores kode på mange forskellige måder. 262 00:15:56,720 --> 00:16:01,060 Så specielt i pset1 hvis du er slags kæmper for at finde ud af den måde at skrive noget program, 263 00:16:01,060 --> 00:16:04,340 odds er du heldig, fordi der kan være mange løsninger 264 00:16:04,340 --> 00:16:06,110 at du kan ske på. 265 00:16:06,110 --> 00:16:10,500 For eksempel er det kun 3 for selv den simpleste af programmer. Ok. 266 00:16:10,500 --> 00:16:14,200 Og nu husker på mandag vi tilbage på denne note med returværdier. 267 00:16:14,200 --> 00:16:18,450 Så for første gang skrev vi et program, som ikke bare har main; 268 00:16:18,450 --> 00:16:22,550 det har også sin egen brugerdefinerede funktion, som jeg skrev her. 269 00:16:22,550 --> 00:16:26,810 Så i linje 31 til 34 Jeg har implementeret en terning funktion. 270 00:16:26,810 --> 00:16:30,240 Det er ikke kompliceret. Det er bare en * a * a i dette tilfælde. 271 00:16:30,240 --> 00:16:34,750 Men hvad der er vigtigt om det er, at jeg tager input i form af en 272 00:16:34,750 --> 00:16:39,180 og jeg vender tilbage output i form af a * a * a. 273 00:16:39,180 --> 00:16:43,560 Så nu har jeg mulighed for, ligesom jeg vant til med prinf alene, 274 00:16:43,560 --> 00:16:47,240 at kalde denne funktion ved at kalde terningen funktionen. 275 00:16:47,240 --> 00:16:51,970 >> Og terningen funktionen tager nogle input, og terningen returnerer funktionen nogle output. 276 00:16:51,970 --> 00:16:56,960 Derimod bare printf gjorde noget. 277 00:16:56,960 --> 00:17:00,840 Den vendte ikke tilbage noget, som vi holdt af, selvom som en sidebemærkning det gør returnerer en værdi; 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 noget. Det havde en bivirkning af udskrivning til skærmen. 280 00:17:06,510 --> 00:17:11,770 Derimod her har vi den terning-funktion, der faktisk returnerer noget. 281 00:17:11,770 --> 00:17:15,520 Så for dem, der kender til dette, er det en forholdsvis simpel idé. 282 00:17:15,520 --> 00:17:19,640 Men for dem mindre fortrolige med denne idé om at passere i inputs og få tilbage udgange, 283 00:17:19,640 --> 00:17:21,950 lad os prøve bare noget super simpelt. 284 00:17:21,950 --> 00:17:25,490 Er der nogen behagelig kommer op på scenen kortvarigt? 285 00:17:25,490 --> 00:17:28,040 Du skal være fortrolig med et kamera på dig så godt. Ja? Okay. 286 00:17:28,040 --> 00:17:31,240 Hvad er dit navn? >> [Studerende] Ken. >> Ken. Ok. Ken, kom op. 287 00:17:31,240 --> 00:17:35,050 Ken vil være en funktion af sorterer her. 288 00:17:35,050 --> 00:17:38,720 Lad os gå videre og gøre det. Lad os få lidt fancy. 289 00:17:38,720 --> 00:17:42,260 Hyggeligt at møde dig. Velkommen til centrum. Ok. 290 00:17:42,260 --> 00:17:46,640 Lad os slå denne knap her. Ok. 291 00:17:46,640 --> 00:17:49,820 Så her har du en moderne tavle, 292 00:17:49,820 --> 00:17:53,470 og hvad jeg er den vigtigste funktion, 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 kan ikke rigtig huske, hvordan man - Tja, jeg kan ikke sige det. 295 00:17:59,710 --> 00:18:02,480 Jeg har ikke rigtig god håndskrift, 296 00:18:02,480 --> 00:18:05,520 og så derfor jeg vil have dig til at udskrive noget på skærmen for mig. 297 00:18:05,520 --> 00:18:12,040 Jeg er den vigtigste program, og jeg har tænkt mig at få dig sige dette 298 00:18:12,040 --> 00:18:16,720 ved at skrive det i min kylling scratch og derefter passerer dig en indgang. 299 00:18:16,720 --> 00:18:20,400 Så fjollet men denne øvelse er, begrebet funktioner og kalde en funktion 300 00:18:20,400 --> 00:18:22,400 og returnerer en funktion virkelig kan koges ned til denne. 301 00:18:22,400 --> 00:18:26,260 Jeg er main, jeg har lige skrevet printf, citat-citat slut noget på skærmen, 302 00:18:26,260 --> 00:18:29,110 Jeg kører dette program, og så snart printf bliver kaldt, 303 00:18:29,110 --> 00:18:32,880 Den har et argument eller en parameter undertiden mellem anførselstegn. 304 00:18:32,880 --> 00:18:35,880 Her er det argument. Jeg passerer det til Ken. 305 00:18:35,880 --> 00:18:39,020 Han er en sort boks skrevet nogle flere år siden 306 00:18:39,020 --> 00:18:41,510 at der tilsyneladende kun forstår at udskrive ting på skærmen. 307 00:18:41,510 --> 00:18:43,150 Så udføre. 308 00:18:49,280 --> 00:18:51,280 Det er ikke dårligt. Meget godt. 309 00:18:51,280 --> 00:18:55,510 Så nu Ken sker fuldbyrdende. Har han brug for at give mig noget tilbage? 310 00:18:55,510 --> 00:18:57,470 Ikke at vi har set hidtil. 311 00:18:57,470 --> 00:19:00,460 Igen, ikke printf faktisk returnere et tal, men vi vil ignorere, at for nu 312 00:19:00,460 --> 00:19:03,470 fordi vi aldrig har brugt det. Så det er det for Ken. 313 00:19:03,470 --> 00:19:08,580 Og så nu main overtager styringen af ​​programmet igen 314 00:19:08,580 --> 00:19:11,060 fordi denne linje kode, printf, sker fuldbyrdende. 315 00:19:11,060 --> 00:19:14,050 Og vi går om vores måde, udføre, hvad andre linjer er der. 316 00:19:14,050 --> 00:19:17,320 Så lad os nu prøve en lidt anderledes eksempel. 317 00:19:17,320 --> 00:19:24,940 Denne gang her lad os først rydde skærmen, og denne gang vil vi gøre det Cubing funktion, 318 00:19:24,940 --> 00:19:27,080 men denne gang, jeg forventer et output værdi. 319 00:19:27,080 --> 00:19:29,180 >> Så lad os gå videre og gøre det. 320 00:19:29,180 --> 00:19:35,790 Nu har jeg en linje kode, der siger x får terning af x. 321 00:19:41,370 --> 00:19:46,370 Den linje kode, tilbagekaldelse, ser sådan ud: x = cube (x); 322 00:19:46,370 --> 00:19:50,930 Så hvordan vil dette arbejde? Lad os gå videre og give dig en hvid skærm igen. 323 00:19:50,930 --> 00:19:54,070 Jeg vil skrive ned nu værdien af ​​x, 324 00:19:54,070 --> 00:20:01,400 der på nuværende tidspunkt sker for at være, lad os sige, 2 for at holde det simpelt. 325 00:20:01,400 --> 00:20:06,150 Jeg har skrevet ned på et stykke papir værdien af ​​2, som er min værdi x. 326 00:20:06,150 --> 00:20:10,920 Jeg afleverer det til Ken. >> Og jeg bare skrive svaret? >> Ja, lad os bare skrive svaret. 327 00:20:12,760 --> 00:20:18,940 Okay. Og nu skal han returnere mig noget. Perfekt. Rart Segue. 328 00:20:18,940 --> 00:20:23,120 Så nu han rækker mig tilbage værdien af ​​8 i denne sag, og hvad skal jeg gøre med det? 329 00:20:23,120 --> 00:20:28,250 Faktisk - lad os se, få denne ret. Hvad skal jeg gøre med det? 330 00:20:28,250 --> 00:20:33,440 Nu jeg har tænkt mig at tage denne værdi og faktisk gemme det i de samme bits i hukommelsen. 331 00:20:33,440 --> 00:20:35,170 Men bemærk Jeg er lidt kæmper her. 332 00:20:35,170 --> 00:20:38,210 Jeg er lidt forvirret, fordi hvor skal jeg faktisk skrive værdien af ​​x, 333 00:20:38,210 --> 00:20:43,150 fordi det, jeg lige har gjort er fysisk hånd Ken et stykke papir, der havde værdien 2, 334 00:20:43,150 --> 00:20:46,590 der var x, og ja, det er netop, hvad der skete. 335 00:20:46,590 --> 00:20:50,210 Så det viser sig, at når du kalder funktionen, og du passerer på et argument 336 00:20:50,210 --> 00:20:53,290 ligesom hej, eller verden, du passerer på et argument som 2, 337 00:20:53,290 --> 00:20:57,110 generelt, du passerer på en kopi af dette argument. 338 00:20:57,110 --> 00:21:00,730 Og så lige som jeg skrev ned tallet 2 her og rakte det til Ken, 339 00:21:00,730 --> 00:21:04,720 det må betyde, at jeg stadig har en kopi af værdien 2 eller andet sted 340 00:21:04,720 --> 00:21:08,890 fordi ja, nu hvor jeg har fået tilbage værdien 8, jeg er nødt til at gå tilbage i RAM 341 00:21:08,890 --> 00:21:12,130 og faktisk skrive ned 8 hvor jeg engang havde et 2-tal. 342 00:21:12,130 --> 00:21:16,950 Så visuelt, husk dette begreb for at bestå i, bogstaveligt talt, en kopi af værdien. 343 00:21:16,950 --> 00:21:20,780 >> Ken gør hans ting, rækker mig tilbage noget - i dette tilfælde en værdi som 8 - 344 00:21:20,780 --> 00:21:24,980 og så har jeg at gøre noget med denne værdi, hvis jeg vil beholde den rundt. 345 00:21:24,980 --> 00:21:29,650 Så alt dette vil komme tilbage til at være alt for velkendte inden længe. 346 00:21:29,650 --> 00:21:34,920 Tak så meget for denne demo her, Ken. [Bifald] 347 00:21:34,920 --> 00:21:36,920 Meget godt klaret. 348 00:21:36,920 --> 00:21:42,690 Lad os se, hvordan det i sidste ende drejer sig nogle af den funktion at kalde, at vi har gjort her. 349 00:21:42,690 --> 00:21:47,910 Lad mig gå videre og bringe os tilbage til Cubing eksempel her. 350 00:21:47,910 --> 00:21:53,300 Bemærk, at hvis vi ønsker at rent faktisk begynder at tage dette yderligere, 351 00:21:53,300 --> 00:21:57,570 vi er nødt til at være opmærksomme på det faktum, at antallet x, der bliver vedtaget i her 352 00:21:57,570 --> 00:22:01,530 er forskellig fra, hvad der rent faktisk bliver vedtaget i til funktionen. 353 00:22:01,530 --> 00:22:05,880 Så igen, denne forbi eksemplar kommer til at blive helt germane på bare et øjeblik. 354 00:22:05,880 --> 00:22:09,580 Lad os tage et kig på noget, der ikke helt virker rigtigt endnu. 355 00:22:09,580 --> 00:22:13,250 Jeg har tænkt mig at gå videre og åbne en tredje buggy eksempel, som er behæftet med naturen, 356 00:22:13,250 --> 00:22:18,550 og det hedder buggy3 og det iværksætter en swapping-funktion. 357 00:22:18,550 --> 00:22:25,110 Her har vi en hovedfunktion, der har x og y vilkårligt initialiseres til 1 og 2, henholdsvis. 358 00:22:25,110 --> 00:22:27,700 Vi kunne bruge GetInt, men vi skal bare have en simpel øvelse, 359 00:22:27,700 --> 00:22:30,170 så det er hard-coded som 1 og 2. 360 00:22:30,170 --> 00:22:35,340 I linierne 21 og 22, tilsyneladende vi udskrive x og y, 1 per linje. 361 00:22:35,340 --> 00:22:39,720 Så på linie 23, hævder jeg, jeg swapping disse værdier, prik, prik, prik. 362 00:22:39,720 --> 00:22:44,170 Jeg åbenbart kalder en funktion på linje 24 såkaldte swap, der tager 2 argumenter. 363 00:22:44,170 --> 00:22:48,300 Det er helt legit for funktioner at tage 2 argumenter. Vi har set printf gøre det allerede. 364 00:22:48,300 --> 00:22:51,830 >> Så swap tilsyneladende tager x og y, og som navnet antyder, 365 00:22:51,830 --> 00:22:54,670 Jeg håber, at det kommer til at bytte disse 2 værdier. 366 00:22:54,670 --> 00:23:00,090 Så da jeg hævder på linie 25 "byttes!" og gengiver x og y 367 00:23:00,090 --> 00:23:03,070 under den forudsætning, at de rent faktisk er blevet skiftet. 368 00:23:03,070 --> 00:23:06,080 Men hvis jeg rent faktisk køre dette program - lad mig åbner et terminal vindue, 369 00:23:06,080 --> 00:23:09,860 lad mig gøre buggy3 - som navnet antyder, er dette ikke kommer til at ende godt 370 00:23:09,860 --> 00:23:15,770 fordi når jeg trykker på Enter, bemærke, at x er 1, y er 2, 371 00:23:15,770 --> 00:23:19,420 og dog ved afslutningen af ​​programmet, er de stadig i virkeligheden det samme. 372 00:23:19,420 --> 00:23:22,960 Så baseret på påvisning lige nu med Ken, hvad der faktisk foregår? 373 00:23:22,960 --> 00:23:28,710 Lad os dykke ned i denne swap-funktion. Det er super kort. Det er kun et par linjer kode lang. 374 00:23:28,710 --> 00:23:34,520 Men hvad er det grundlæggende problem er baseret på den enkle historie fortalt op her med Ken? 375 00:23:34,520 --> 00:23:36,670 Hvorfor er swap brudt? 376 00:23:36,670 --> 00:23:39,660 [Studerende] Du lagring til en kopi, ikke variablen. 377 00:23:39,660 --> 00:23:43,980 Præcis. Vi lagring til en kopi, ikke variablen selv. 378 00:23:43,980 --> 00:23:47,170 Med andre ord tilsyneladende swap tager to argumenter, en int, 379 00:23:47,170 --> 00:23:49,370 og det vilkårligt kaldes a og b, 380 00:23:49,370 --> 00:23:54,420 og op her Jeg har bestået i x og y, som er henholdsvis 1 og 2, 381 00:23:54,420 --> 00:23:58,770 men jeg er ikke bogstaveligt passerer i x, jeg ikke bogstaveligt passerer i y, 382 00:23:58,770 --> 00:24:01,450 Jeg passerer en kopi af x og en kopi af y. 383 00:24:01,450 --> 00:24:04,510 Det er næsten som om du har kopieret og indsat i swap 384 00:24:04,510 --> 00:24:07,810 de værdier, som du ønsker det til rent faktisk at manipulere. 385 00:24:07,810 --> 00:24:14,480 Så hvis det er tilfældet, da jeg programstart fuldbyrdende linie 35 og derefter 36, 386 00:24:14,480 --> 00:24:18,650 når jeg kommer til linie 37, på dette tidspunkt i historien, hvad er værdien af ​​et? 387 00:24:21,040 --> 00:24:25,050 På dette tidspunkt i historien, linie 37, hvad er værdien af ​​et på dette punkt? >> [Studerende] 1. 388 00:24:25,050 --> 00:24:29,280 [Malan] Det skal bare være 1, højre, fordi x blev vedtaget i som det første argument, 389 00:24:29,280 --> 00:24:33,080 og denne funktion bare vilkårligt kalder sin første argument en. 390 00:24:33,080 --> 00:24:38,200 Tilsvarende er Y det andet argument, og det er bare vilkårligt at kalde det andet argument b.. 391 00:24:38,200 --> 00:24:40,990 >> Denne kontrast er faktisk temmelig simpelt forklaret. Tænk over det. 392 00:24:40,990 --> 00:24:43,320 Ingen af ​​os har mødt den person, der skrev printf, 393 00:24:43,320 --> 00:24:50,770 så sikkert, at han eller hun ikke har nogen idé om, hvad vores variable 30 år senere kommer til at hedde. 394 00:24:50,770 --> 00:24:56,650 Så der skal være en sondring mellem det, du kalder variable i funktioner, du skriver 395 00:24:56,650 --> 00:25:02,080 og hvad du kalder variable i funktioner, du ringer eller bruger. 396 00:25:02,080 --> 00:25:05,340 Så med andre ord, har jeg skrevet mine variabler som x og y, 397 00:25:05,340 --> 00:25:08,890 men hvis en anden havde skrevet swap-funktion, han eller hun ville i hvert fald ikke vide 398 00:25:08,890 --> 00:25:10,690 hvad mine variabler vil blive kaldt, 399 00:25:10,690 --> 00:25:13,830 så indse, at det er derfor, du har denne dobbelthed af navne. 400 00:25:13,830 --> 00:25:16,750 Teknisk set kan jeg gøre det ved en tilfældighed, 401 00:25:16,750 --> 00:25:20,080 men de ville stadig blive væltet ind som kopier. 402 00:25:20,080 --> 00:25:23,650 Det ville bare være en ren tilfældighed æstetisk hvis den person, som skrev swap 403 00:25:23,650 --> 00:25:26,150 havde brugt de samme navne. 404 00:25:26,150 --> 00:25:32,370 Så på dette punkt i historien, linje 37, en er 1, b er 2, og nu vil jeg gå videre til at bytte dem. 405 00:25:32,370 --> 00:25:34,900 Først og fremmest, lad mig faktisk gøre dette meget mere simpelt. 406 00:25:34,900 --> 00:25:36,690 Jeg ved ikke, hvad disse 3 linjer kode lavede. 407 00:25:36,690 --> 00:25:41,210 Lad mig bare gøre dette: b = a, a = b; gjort. 408 00:25:41,210 --> 00:25:44,690 Hvorfor er denne brudt, logisk? 409 00:25:46,490 --> 00:25:48,900 Det er lidt af den intuitive ting, right? 410 00:25:48,900 --> 00:25:52,560 Så Â bliver b og b bliver, 411 00:25:52,560 --> 00:25:57,730 men problemet er, at så snart linien 37 udfører, hvad er værdien af ​​en og b? 412 00:25:57,730 --> 00:26:03,410 Det samme, 1, fordi du har clobbered, så at sige, du har ændret b svare til et. 413 00:26:03,410 --> 00:26:08,890 Så når linje 37 er udført, det er fantastisk, du har nu 2 kopier af nummer 1 414 00:26:08,890 --> 00:26:13,350 indersiden af ​​denne funktion, så så når du siger i linje 38 a = b, 415 00:26:13,350 --> 00:26:17,640 du er slags skruet fordi du bare tildele 1 til 1. 416 00:26:17,640 --> 00:26:20,580 Du har lidt tabt den værdi, du plejet om. 417 00:26:20,580 --> 00:26:23,220 Så i den oprindelige version af dette, mærke til, hvad jeg gjorde. 418 00:26:23,220 --> 00:26:26,850 Jeg stedet havde en tredje linje kode, der lignede 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 >> TFP er et meget almindeligt navn for en midlertidig variabel, og det er en int 421 00:26:32,170 --> 00:26:34,580 fordi det skal matche, hvad jeg ønsker at lave en kopi af. 422 00:26:34,580 --> 00:26:39,770 Jeg gemmer kopi af en indersiden af ​​tmp, så når linje 37 er udført, 423 00:26:39,770 --> 00:26:45,860 værdien af ​​a er - hurtig tilregnelighed kontrol - 1, værdien af ​​b er 2, 424 00:26:45,860 --> 00:26:48,970 og værdien af ​​TMP er også 1. 425 00:26:48,970 --> 00:26:52,060 Så nu jeg udfører linje 38. 426 00:26:52,060 --> 00:27:00,540 Når linie 38 udfører, en antager værdien af ​​b. Og b var 2, så en nu 2. 427 00:27:00,540 --> 00:27:05,210 Så på dette punkt i historien, en er 2, b er 2, og tmp er 1, 428 00:27:05,210 --> 00:27:11,060 så nu logisk, kan vi bare plop tmp værdi i b og vi er færdige. 429 00:27:11,060 --> 00:27:12,800 Så vi har løst dette problem. 430 00:27:12,800 --> 00:27:17,720 Desværre, når jeg kører dette program i denne form, betyder det faktisk ikke bytte nogle værdier. 431 00:27:17,720 --> 00:27:20,100 Men for at være klar, hvorfor? 432 00:27:23,660 --> 00:27:26,450 Jeg fast den logiske problem fra blot et øjeblik siden, 433 00:27:26,450 --> 00:27:31,020 men igen, hvis jeg køre dette program, x og y er uændrede 434 00:27:31,020 --> 00:27:33,310 ved udgangen af ​​programmets udførelse. 435 00:27:33,310 --> 00:27:37,220 [Uhørlig student kommentar] >> Vi har ikke returneret noget, så det er sandt. 436 00:27:37,220 --> 00:27:39,670 Men det viser sig, at der er lidt af et problem her, fordi hidtil, 437 00:27:39,670 --> 00:27:44,170 det eneste, vi har været i stand til at vende tilbage er én ting, og det er en begrænsning af C. 438 00:27:44,170 --> 00:27:49,070 Du kan kun returnere virkelig en værdi, i hvilket tilfælde jeg er lidt fast her 439 00:27:49,070 --> 00:27:53,310 fordi jeg kunne returnere den nye værdi af x eller jeg kunne returnere den nye værdi af y, 440 00:27:53,310 --> 00:27:55,190 men jeg vil have begge tilbage. 441 00:27:55,190 --> 00:27:58,650 Så tilbage er ikke den enkle løsning her. 442 00:27:58,650 --> 00:28:01,710 Men problemet fundamentalt er hvorfor? Hvad har vi egentlig byttes? 443 00:28:01,710 --> 00:28:04,190 [Studerende] a og b.. >> A og b.. 444 00:28:04,190 --> 00:28:08,230 Men a og b er kopier af x og y, hvilket betyder, at vi bare gjorde alt dette arbejde, 445 00:28:08,230 --> 00:28:11,650 vi lige brugt 3 minutter taler om swap-funktionen og alle 3 af disse variabler, 446 00:28:11,650 --> 00:28:15,420 og det er fantastisk, helt korrekt i isolation, 447 00:28:15,420 --> 00:28:20,740 men a og b anvendelsesområde kun er i disse linjer her. 448 00:28:20,740 --> 00:28:24,790 >> Så ligesom en for-løkke, hvis du erklærer et heltal i inde i for-løkken, 449 00:28:24,790 --> 00:28:28,760 Tilsvarende, hvis du erklære a og b inde i en funktion, du har skrevet, 450 00:28:28,760 --> 00:28:33,320 de er kun gyldig indersiden af ​​denne funktion, hvilket betyder, så snart swap sker fuldbyrdende 451 00:28:33,320 --> 00:28:38,470 og vi går fra ledning 24 til ledningen 25, er x og y ikke er blevet forandret sig. 452 00:28:38,470 --> 00:28:42,790 Du har lige spildt en hel masse tid bytte kopier af variabler. 453 00:28:42,790 --> 00:28:47,010 Så viser det sig, at løsningen på dette faktisk ikke indlysende. 454 00:28:47,010 --> 00:28:50,670 Det er ikke helt nok til at returnere værdier, fordi vi kun kan returnere 1 værdi, 455 00:28:50,670 --> 00:28:53,470 og jeg virkelig ønsker at bytte både x og y på samme tid, 456 00:28:53,470 --> 00:28:55,210 så vi bliver nødt til at vende tilbage til dette. 457 00:28:55,210 --> 00:29:01,020 Men for nu, indser, at det basalt set stammer fra den kendsgerning, at a og b er kopier 458 00:29:01,020 --> 00:29:03,630 og de er i deres egen rækkevidde. 459 00:29:03,630 --> 00:29:05,050 Lad os prøve at løse dette på en eller anden måde. 460 00:29:05,050 --> 00:29:11,250 Lad mig faktisk rulle tilbage her og åbne op, lad os sige, en fjerde variant af dette, buggy4. 461 00:29:11,250 --> 00:29:13,370 Hvad med dette? 462 00:29:13,370 --> 00:29:17,810 Dette er en lignende, men enklere problem at se på, før vi tager et stik til at løse det. 463 00:29:17,810 --> 00:29:24,190 Dette program kaldes tilvækst, og det tilsyneladende initialiserer en x heltal til 1 på linje 18. 464 00:29:24,190 --> 00:29:28,150 Jeg så hævder x er 1, jeg derefter hævder "Forøgelsen ..." 465 00:29:28,150 --> 00:29:33,730 Jeg derefter kalde tilvækst, men derefter i linjerne 22 og 23, jeg hævder, at det er blevet forøget, 466 00:29:33,730 --> 00:29:40,220 Jeg hævder x er nu, hvad det er - 2, formentlig - men dette program er buggy. 467 00:29:40,220 --> 00:29:42,610 Hvad er problemet? 468 00:29:43,440 --> 00:29:50,160 Yeah. >> [Uhørlig student svar] >> Præcis. 469 00:29:50,160 --> 00:29:52,490 Så x er erklæret naturligvis på linje 18. 470 00:29:52,490 --> 00:29:54,700 Det er inde i de vigtigste s krøllede parenteser. 471 00:29:54,700 --> 00:29:58,440 Så det enkle svar her er, at mens x eksisterer her, 472 00:29:58,440 --> 00:30:03,930 Det eksisterer ikke i linje 32, så dette program rent faktisk vil ikke engang kompilere. 473 00:30:03,930 --> 00:30:07,940 Compileren når jeg prøve at oversætte denne kode vil yell på mig 474 00:30:07,940 --> 00:30:14,100 om nogle kaldenavn eller noget i den retning. Faktisk, lad os prøve. 475 00:30:14,100 --> 00:30:18,470 Det er at gøre buggy4. Der er det. 476 00:30:18,470 --> 00:30:22,110 Anvendelse af sort identifikator »x« på linje 32. 477 00:30:22,110 --> 00:30:25,580 Og faktisk, lad os være mere eksplicit her i dag, så det er nyttigt 478 00:30:25,580 --> 00:30:27,580 i kontortiden og derhjemme. 479 00:30:27,580 --> 00:30:29,300 >> Bemærk, at det er lidt kryptisk skrevet. 480 00:30:29,300 --> 00:30:37,270 Men det faktum, at Dunk har råbte på os, siger buggy4.c: 32:5, er faktisk nyttigt. 481 00:30:37,270 --> 00:30:42,050 Det betyder, at fejlen er på linje 32 ved tegnposition 5. 482 00:30:42,050 --> 00:30:46,700 Så 1, 2, 3, 4, 5. Det er i virkeligheden, når problemet er. 483 00:30:46,700 --> 00:30:49,790 Og også, også huske på, at kontortiden og derhjemme, jeg er heldig her. 484 00:30:49,790 --> 00:30:52,990 Jeg har en fejl. Det kommer til at være relativt let at rette. 485 00:30:52,990 --> 00:30:55,990 Men hvis du får en hel skærm fuld af overvældende fejlmeddelelser, 486 00:30:55,990 --> 00:31:00,330 igen indse, at den nederste man bare kunne være symptomatisk for den øverste én. 487 00:31:00,330 --> 00:31:03,450 Så altid jage ned dine fejl fra top down 488 00:31:03,450 --> 00:31:05,820 fordi der bare kunne være en daisy chain effekt 489 00:31:05,820 --> 00:31:09,240 der foreslår du har måde flere problemer, end du rent faktisk gør. 490 00:31:09,240 --> 00:31:15,150 Så hvordan kan vi løse dette, hvis mit mål er at forøge x? >> [Studerende] Gør x global. 491 00:31:15,150 --> 00:31:17,060 Okay, så vi kan gøre x global. 492 00:31:17,060 --> 00:31:20,480 Lad os tage den genvej, jeg advarede om tidligere, men dælen, vi bare brug for et hurtigt fix, 493 00:31:20,480 --> 00:31:25,730 så lad os bare sige int x heroppe. Det gør x global. 494 00:31:25,730 --> 00:31:31,800 Så nu main har adgang til det og tilvækst har adgang til det, 495 00:31:31,800 --> 00:31:34,110 og så lad mig gå videre og kompilere dette nu. 496 00:31:34,110 --> 00:31:37,630 Gør buggy4, Enter. Synes at kompilere nu. 497 00:31:37,630 --> 00:31:41,230 Lad os løbe buggy4. Og det ser ud til rent faktisk at arbejde. 498 00:31:41,230 --> 00:31:45,150 Dette er en af ​​disse ting, der er gør som jeg siger, ikke som jeg gør, 499 00:31:45,150 --> 00:31:47,010 som jeg lige har gjort her, fordi der i almindelighed, 500 00:31:47,010 --> 00:31:50,440 vores programmer kommer til at få meget mere interessant og meget længere end dette, 501 00:31:50,440 --> 00:31:56,390 og hvis din løsning på livets problemer bare lægge alle de variabler i toppen af ​​din fil, 502 00:31:56,390 --> 00:31:59,690 meget hurtigt gør programmerne får forfærdelig vanskelige at håndtere. 503 00:31:59,690 --> 00:32:02,190 Det bliver sværere at udtænke nye variabelnavne, 504 00:32:02,190 --> 00:32:05,240 bliver det sværere at forstå, hvad variabel der gør hvad, 505 00:32:05,240 --> 00:32:08,460 og så i almindelighed, er det ikke en god løsning. 506 00:32:08,460 --> 00:32:10,030 Så lad os gøre det bedre. 507 00:32:10,030 --> 00:32:12,160 Vi ønsker ikke at bruge en global variabel her. 508 00:32:12,160 --> 00:32:16,240 >> Jeg ønsker at forøge x, så jeg kunne selvfølgelig - 509 00:32:16,240 --> 00:32:18,670 ved slutningen af ​​dagen, er denne form for en fjollet historie, fordi vi bare gøre det - 510 00:32:18,670 --> 00:32:24,450 men hvis jeg ikke vidste om det operatør eller jeg fik ikke lov til at ændre det i main selv, 511 00:32:24,450 --> 00:32:30,730 hvor ellers kunne jeg gennemføre Ken herovre denne gang ikke til kube, men at forøge? 512 00:32:31,380 --> 00:32:33,190 Hvordan ændrer jeg denne ting her? Yeah. 513 00:32:33,190 --> 00:32:38,480 [Studerende] Pass i x og derefter vende tilbage [uhørligt] >> Okay, godt. 514 00:32:38,480 --> 00:32:41,900 Så hvorfor ikke jeg passere i x og derefter i stedet returnere den, 515 00:32:41,900 --> 00:32:44,870 hvorfor kan jeg ikke bare vende tilbage x + 1. 516 00:32:44,870 --> 00:32:47,710 Et par flere ting nødt til at ændre her. Jeg er på rette spor. 517 00:32:47,710 --> 00:32:49,770 Hvad skal jeg ellers nødt til at trimme? En anden. Yeah. 518 00:32:49,770 --> 00:32:51,740 [Uhørlig student svar] 519 00:32:51,740 --> 00:32:54,730 Jeg er nødt til at ændre returtypen af ​​tilvækst fordi det ikke er ugyldig. 520 00:32:54,730 --> 00:32:57,780 Void betyder intet bliver tilbage, men det er klart nu er det, 521 00:32:57,780 --> 00:32:59,830 så dette forhold skal ændres til - >> [studerende] int. 522 00:32:59,830 --> 00:33:02,740 int at være i overensstemmelse med hvad jeg faktisk vender tilbage. 523 00:33:02,740 --> 00:33:05,180 Nu noget andet, er stadig buggy her. Yeah. 524 00:33:05,180 --> 00:33:08,400 [Uhørlig student svar] >> [Malan] Så jeg er nødt til at forøge x? 525 00:33:08,400 --> 00:33:12,080 [Uhørlig student svar] >> [Malan] Ah, så jeg er nødt til at passere x. 526 00:33:12,080 --> 00:33:16,660 Så jeg er nødt til at gøre det her. >> [Uhørlig student kommentar] 527 00:33:16,660 --> 00:33:20,050 [Malan] Så prototypen, jeg er nødt til at ændre dette op her. 528 00:33:20,050 --> 00:33:22,930 Så det skal være en int, dette skal blive - 529 00:33:22,930 --> 00:33:25,620 hmm, jeg har faktisk en fejl hernede. Lad os løse dette ene først. 530 00:33:25,620 --> 00:33:29,590 Hvad skal det egentlig være? Det må da være en int noget. 531 00:33:29,590 --> 00:33:32,700 Det kunne være x, men helt ærligt, hvis du begynder at kalde alle dine variabler x, 532 00:33:32,700 --> 00:33:35,390 Det kommer til at blive mindre og mindre tydelig der er hvad. 533 00:33:35,390 --> 00:33:39,560 >> Så lad os bare vilkårligt vælge en anden navngivningskonvention til min hjælper funktioner, 534 00:33:39,560 --> 00:33:41,940 de funktioner, jeg skriver. Vi kalder det en, eller vi kunne kalde det - 535 00:33:41,940 --> 00:33:45,010 Lad os kalde det nummer til at være endnu mere eksplicit. 536 00:33:45,010 --> 00:33:47,560 Så da jeg er nødt til at vende tilbage uanset antallet er plus 1, 537 00:33:47,560 --> 00:33:50,740 og nu har jeg nødt til at ændre 1 anden ting op her og en anden ting op her. 538 00:33:50,740 --> 00:33:54,350 Hvad skal jeg ændre på linie 21 først? >> [Uhørlig student svar] 539 00:33:54,350 --> 00:33:57,610 [Malan] Jeg er nødt til at tildele den til x. Jeg kan ikke bare ringe tilvækst (x). 540 00:33:57,610 --> 00:34:01,960 Jeg har brug for at huske svaret ved at ændre værdien af ​​x på venstre side. 541 00:34:01,960 --> 00:34:04,680 Og selv om x er nu på venstre og højre, det er helt fint 542 00:34:04,680 --> 00:34:08,860 fordi den højre side bliver udført først derefter bliver plopped ind i den venstre ting - 543 00:34:08,860 --> 00:34:10,600 x i denne sag. 544 00:34:10,600 --> 00:34:12,159 Og så endelig, det er en nem løsning nu. 545 00:34:12,159 --> 00:34:17,230 Det skal bare matche, hvad der er dernede, int tal. 546 00:34:17,230 --> 00:34:20,570 Så en hel masse ændringer for en virkelig dum funktion 547 00:34:20,570 --> 00:34:24,420 men repræsentant for ting, som vi i stigende grad vil få lyst til at gøre. 548 00:34:24,420 --> 00:34:27,090 Så gør buggy4. Jeg har skruet op et eller andet sted. 549 00:34:27,090 --> 00:34:30,139 Åh, min Gud. Fem fejl i en 6-line program. 550 00:34:30,139 --> 00:34:35,690 Så hvad er der galt på linie 18, 5 tegn? 551 00:34:35,690 --> 00:34:39,610 Så jeg er nødt til at erklære dette, int. 552 00:34:39,610 --> 00:34:41,920 Lad os se. Der er en hel masse andre fejl. 553 00:34:41,920 --> 00:34:47,010 Åh, min Gud - 19, 18, 21 - men igen, lad os bare rydde skærmen, Control L her, 554 00:34:47,010 --> 00:34:49,380 og kør Dunk. 555 00:34:49,380 --> 00:34:51,340 Så 5 problemer er faktisk bare, at 1. 556 00:34:51,340 --> 00:34:57,520 Så lad os nu køre buggy4, Enter. Puha, er x blevet inkrementeret korrekt. 557 00:34:57,520 --> 00:35:02,720 Ok. Eventuelle spørgsmål om, hvordan man inkrementere numre? Yeah. 558 00:35:02,720 --> 00:35:09,870 [Uhørlig student spørgsmål] >> Godt spørgsmål. 559 00:35:09,870 --> 00:35:14,220 Hvordan er det at jeg bare kan ændre x til nummer og programmet vil vide med det samme? 560 00:35:14,220 --> 00:35:16,200 >> Igen, tænk på det som denne abstraktion. 561 00:35:16,200 --> 00:35:21,600 Så hvis jeg er hoved-og Ken er tilvækst, helt ærligt, jeg er ligeglad med, hvad Ken kalder sin iPad. 562 00:35:21,600 --> 00:35:26,570 Jeg er ligeglad med, hvad han kalder noget, der har at gøre med hans gennemførelsen af ​​denne funktionalitet. 563 00:35:26,570 --> 00:35:33,340 Dette er en implementering detalje, at jeg, main, behøver ikke at bekymre sig om. 564 00:35:33,340 --> 00:35:38,250 Og så blot at ændre det konsekvent inde i funktion - nummer her og nummer her - 565 00:35:38,250 --> 00:35:40,960 er alt det tager så længe jeg kompilere. 566 00:35:40,960 --> 00:35:44,180 Det er lidt ligesom hvis du tænker mange af os, dem af jer med kørekort 567 00:35:44,180 --> 00:35:46,770 der har drevet eller hvis du selv har kørt i en bil, 568 00:35:46,770 --> 00:35:50,950 de fleste af os har ingen idé om, hvordan en bil fungerer under motorhjelmen. 569 00:35:50,950 --> 00:35:54,970 Og bogstaveligt, hvis du åbner op hætten, de fleste af os - inklusive mig selv - 570 00:35:54,970 --> 00:35:56,940 vil ikke rigtig ved, hvad vi ser på, 571 00:35:56,940 --> 00:35:59,220 lidt ligesom du måske føle med ting som dette lige nu. 572 00:35:59,220 --> 00:36:01,480 Men vi behøver ikke virkelig nødt til at bekymre sig, hvordan bilen fungerer, 573 00:36:01,480 --> 00:36:05,970 vi behøver ikke at bekymre sig, hvad alle stængerne og stemplerne og kabler inde i bilen 574 00:36:05,970 --> 00:36:08,160 rent faktisk gør. 575 00:36:08,160 --> 00:36:12,770 Så noget lignende hvad du kalder stemplet ligegyldigt her i dette tilfælde. Samme idé. 576 00:36:12,770 --> 00:36:25,300 Yeah. >> [Uhørlig student spørgsmål] 577 00:36:25,300 --> 00:36:29,180 Hvis der er flere anvendelser af den variable xa øjeblik siden, 578 00:36:29,180 --> 00:36:32,150 dig, programmør, skulle ændre dem overalt. 579 00:36:32,150 --> 00:36:36,600 Eller du kunne bogstaveligt talt gøre Filer, Menu, og derefter Find, Erstat - noget i den retning - 580 00:36:36,600 --> 00:36:39,170 men du er nødt til at foretage disse ændringer selv. 581 00:36:39,170 --> 00:36:47,450 Du er nødt til at være konsekvente. >> [Studerende] Hvis der er flere variabler [uhørlig] 582 00:36:47,450 --> 00:36:53,100 En særlig rækkefølge som her, hvis dette var int andet nummer? >> [Studerende] Korrekt. 583 00:36:53,100 --> 00:36:56,590 [Malan] Yeah. Bestil tæller, når du kalder funktionen. 584 00:36:56,590 --> 00:37:00,050 >> Så hvis jeg kaldte tilvækst her med noget komma noget, 585 00:37:00,050 --> 00:37:01,680 der er en direkte kortlægning. 586 00:37:01,680 --> 00:37:05,690 Den første variabel, hvad det nu hedder, er lavet en kopi af den første argument herovre. 587 00:37:05,690 --> 00:37:07,760 Undskyld. Dette bør ikke være en parentes. 588 00:37:07,760 --> 00:37:11,490 Det andet argument linjer op med den anden. Så orden, ja, spørgsmål. Ok. 589 00:37:11,490 --> 00:37:17,020 Undskyld. Jeg tog den lange måde at komme dertil. Andre spørgsmål? Ok. 590 00:37:17,020 --> 00:37:20,610 Så lad os se om vi ikke kan male et billede af, hvad der rent faktisk foregår her 591 00:37:20,610 --> 00:37:23,090 under hætten, så at sige. 592 00:37:23,090 --> 00:37:26,640 Dette er et rektangel, der kan repræsentere computerens hukommelse. 593 00:37:26,640 --> 00:37:30,970 Selv hvis du ikke har nogen idé om, hvordan hukommelsen virker, eller hvordan RAM værker, 594 00:37:30,970 --> 00:37:33,940 i det mindste forudsætter, at du har klaser af det i disse dage. 595 00:37:33,940 --> 00:37:36,280 Du har megabyte det, du har fået gigabytes af det, 596 00:37:36,280 --> 00:37:40,870 og vi ved fra uge 0, at en byte er bare hvad? >> [Studerende] 8 bit. 597 00:37:40,870 --> 00:37:42,950 8 bit, right? Således otte nuller og 1. 598 00:37:42,950 --> 00:37:45,880 Så hvis din computer har en koncert RAM, 2 gigabyte RAM i disse dage, 599 00:37:45,880 --> 00:37:55,030 du har en milliard eller 2 milliarder byte hukommelse eller omkring 8 milliarder eller 16 milliarder bits 600 00:37:55,030 --> 00:37:56,890 indersiden af ​​din computer. 601 00:37:56,890 --> 00:38:00,590 I modsætning til den lille uldne Willy eksempel er det ikke magnetiske partikler typisk længere. 602 00:38:00,590 --> 00:38:04,450 Stadig - i bærbare computere i det mindste - det er solid state-drev, SSD'er, 603 00:38:04,450 --> 00:38:08,580 der bare ikke har nogen bevægelige dele. Det hele er elektronisk. Det er alt el-baseret. 604 00:38:08,580 --> 00:38:14,060 Så tænk på dette rektangel som blot repræsenterer de 1 eller 2 gigabyte hukommelse, som du har. 605 00:38:14,060 --> 00:38:16,020 >> Så det er en luns af hukommelse. 606 00:38:16,020 --> 00:38:19,830 En verden af ​​datalogi har slags partitioneret off 607 00:38:19,830 --> 00:38:22,950 bidder af hukommelse til at gøre forskellige ting. 608 00:38:22,950 --> 00:38:27,190 For eksempel, hvis dette er computerens RAM som foreslået af rektanglet er, 609 00:38:27,190 --> 00:38:31,130 viser det sig, at ved konvention, i toppen af ​​din RAM, så at sige, 610 00:38:31,130 --> 00:38:33,660 er generelt hvad der kaldes en tekst segment. 611 00:38:33,660 --> 00:38:36,740 Det er de 0'er og 1-taller, at du har kompileret. 612 00:38:36,740 --> 00:38:39,020 Så når vi har kigget under hætten på, hvad a.out er, 613 00:38:39,020 --> 00:38:41,980 alle disse 0'er og 1-taller, når du kører et program, 614 00:38:41,980 --> 00:38:46,290 de 0'er og 1-taller er indlæst fra harddisken ind i noget, der hedder RAM, 615 00:38:46,290 --> 00:38:49,320 og i RAM de er sat på toppen. 616 00:38:49,320 --> 00:38:52,770 I mellemtiden har du andre ting: initialisere data, uninitialize data. 617 00:38:52,770 --> 00:38:57,510 Disse 2 skår af hukommelse refererer til globale variabler, som du ikke ofte bruger 618 00:38:57,510 --> 00:39:00,760 men nogle gange hvis du gør det, de ender op der. 619 00:39:00,760 --> 00:39:04,260 Så er der nogle andre ting: miljøvariabler, som vi ikke vil bruge meget tid på, 620 00:39:04,260 --> 00:39:06,860 men derefter 2 vigtige ting, som vil komme tilbage i løbet af semestret, 621 00:39:06,860 --> 00:39:08,550 stakken og bunke. 622 00:39:08,550 --> 00:39:12,210 Så de fleste af computerens hukommelse er reserveret, når du kører et program 623 00:39:12,210 --> 00:39:15,370 for noget, der kaldes stakken og noget, der hedder den bunke. 624 00:39:15,370 --> 00:39:18,840 Vi vil ikke tale om den bunke i dag, men vi vil tale om stakken. 625 00:39:18,840 --> 00:39:24,600 Stakken er beregnet til at fremmane den visuelle af den spisesal måltid bakker i Mather House 626 00:39:24,600 --> 00:39:28,110 eller hvor du tilfældigvis være der, hvor spisesal personale rense dem hver dag, 627 00:39:28,110 --> 00:39:30,180 de stak dem op fra gulvet på op, 628 00:39:30,180 --> 00:39:34,550 og ligeledes i hukommelsen, er der denne tanken om at sætte noget på en stak, 629 00:39:34,550 --> 00:39:36,860 sætte noget på en stak, sætte noget på en stak. 630 00:39:36,860 --> 00:39:38,240 Og hvad mener vi med det? 631 00:39:38,240 --> 00:39:41,860 >> Lad os zoome ind på netop den nederste halvdel af dette billede, computerens RAM, 632 00:39:41,860 --> 00:39:44,330 at foreslå følgende. 633 00:39:44,330 --> 00:39:48,170 Det viser sig, at når du kører et program som a.out eller goddag - 634 00:39:48,170 --> 00:39:50,100 uanset programmet er, at du har skrevet - 635 00:39:50,100 --> 00:39:54,020 igen, de 0'er og 1-taller er indlæst fra din harddisk, som er langtidsopbevaring, 636 00:39:54,020 --> 00:39:57,230 forbliver der selv når du trække i stikket, indlæst i RAM. 637 00:39:57,230 --> 00:40:00,610 RAM er hurtigere end harddiske - det er mindre end harddiske - 638 00:40:00,610 --> 00:40:03,300 men det er, hvor programmer leve mens du kører dem. 639 00:40:03,300 --> 00:40:08,230 Så du dobbeltklikke på et program på en Mac eller pc, er det indlæst fra harddisken ind i RAM. 640 00:40:08,230 --> 00:40:11,520 Så snart den er indlæst i RAM, 0'er og 1-taller gå på den måde, top, 641 00:40:11,520 --> 00:40:16,610 den såkaldte tekstsegment, men derefter så snart dit program faktisk begynder at køre, 642 00:40:16,610 --> 00:40:21,360 den vigtigste funktion kaldes, og vigtigste, som vi har set, har ofte lokale variabler, 643 00:40:21,360 --> 00:40:24,870 og det har int'er og bånd og specialtegn og lignende. 644 00:40:24,870 --> 00:40:29,180 Så hvis dit program, som du har skrevet, eller det program, du dobbelt har klikket 645 00:40:29,180 --> 00:40:32,970 brugt nogle variabler i main, 646 00:40:32,970 --> 00:40:37,240 ender de i bunden af ​​din stak af hukommelse, så at sige. 647 00:40:37,240 --> 00:40:39,410 Mere konkret, hvad det egentlig? 648 00:40:39,410 --> 00:40:48,450 Det betyder blot, at hvis vi skulle til at nummerere bytes RAM i din computer, 649 00:40:48,450 --> 00:40:55,750 bemærke, at dette kan være byte nummer 0, kan dette være byte nummer 1, 2, 3, 4, 5, 6, 650 00:40:55,750 --> 00:41:01,480 helt op til 2000000000 ville være helt oppe i toppen. 651 00:41:01,480 --> 00:41:05,880 Så med andre ord, når vi taler om RAM eller hukommelse i form af bytes 652 00:41:05,880 --> 00:41:11,500 Det betyder bare, at nogen har besluttet, hvad der skal nummerere hver af disse bidder af hukommelsen. 653 00:41:11,500 --> 00:41:16,650 Så når du har brug for 32 bit for en int, eller du har brug for 8 bit for en char, 654 00:41:16,650 --> 00:41:18,840 hvor ender de i hukommelsen? 655 00:41:18,840 --> 00:41:22,350 >> Begrebsmæssigt de bare ender i bunden af ​​denne ting kaldet stakken. 656 00:41:22,350 --> 00:41:25,870 Men hvad er interessant nu, er, når main kalder en funktion - 657 00:41:25,870 --> 00:41:28,750 antage en funktion kaldet foo, bare et vilkårligt navn - 658 00:41:28,750 --> 00:41:32,330 hvad der sker, er vigtigste er i bunden af ​​denne stak af hukommelse; 659 00:41:32,330 --> 00:41:35,680 Foo nu er sat på toppen af ​​main i hukommelsen. 660 00:41:35,680 --> 00:41:40,990 Så eventuelle lokale variable at foo har ender slags konceptuelt over dem i main. 661 00:41:40,990 --> 00:41:47,070 Hvis Foo kalder en anden funktion kaldet bar, disse variabler ender her. 662 00:41:47,070 --> 00:41:50,120 Hvis bar kalder noget andet, her, her, her. 663 00:41:50,120 --> 00:41:53,830 Så hvad er interessant ved at køre et program er, at du kalder funktioner 664 00:41:53,830 --> 00:41:57,750 og da disse opgaver kræver funktioner og da disse opgaver kræver funktioner, 665 00:41:57,750 --> 00:42:01,470 du opbygger denne stak af funktioner i hukommelsen. 666 00:42:01,470 --> 00:42:06,890 Og kun en gang En funktion returnerer du begynde at få at hukommelsen tilbage. 667 00:42:06,890 --> 00:42:10,860 Så en af ​​de nemmeste måder at løbe tør for hukommelse i et edb-program 668 00:42:10,860 --> 00:42:14,360 er at skrive funktioner, der aldrig vender tilbage. 669 00:42:14,360 --> 00:42:18,900 Så for eksempel, lad os vise så meget med et bevidst buggy program. 670 00:42:18,900 --> 00:42:22,230 Lad mig gå videre og gø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 har tænkt mig at gøre, mens (2> 1), som sandsynligvis ikke vil nogensinde ændre på os, 673 00:42:32,940 --> 00:42:37,560 og lad mig gå videre nu, og gøre printf. 674 00:42:37,560 --> 00:42:40,700 Faktisk er der kommer til at være mindre visuelt interessant. Lad os gøre det. 675 00:42:40,700 --> 00:42:50,240 For int i = 0; i> 0 - lad os gøre denne fejl - i + +. 676 00:42:50,240 --> 00:42:52,720 Og lad os ikke printf her. Lad os praktisere, hvad jeg prædikede. 677 00:42:52,720 --> 00:43:00,190 Lad os få en metode her, ugyldige kor, og vi vil sige int i, 678 00:43:00,190 --> 00:43:06,830 og så vil jeg sige printf - nej, lad os gøre det mere interessant. 679 00:43:06,830 --> 00:43:15,790 Lad os faktisk ikke udskrive noget som helst. Lad os bare gøre dette: omkvæd (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 gør dette som jeg går, fordi programmet ikke rent faktisk gør noget af 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 at skrive et program, hvis vigtigste funktion gør hvad, tilsyneladende? 684 00:43:30,720 --> 00:43:32,860 Ring til sig selv. Og faktisk har vi ikke brug for løkken. 685 00:43:32,860 --> 00:43:37,200 Lad os selv forenkle dette bare for ikke at tabe af syne virkelig den grundlæggende fejl. 686 00:43:37,200 --> 00:43:39,640 Vigtigste opkald kor til at synge nogle kor, 687 00:43:39,640 --> 00:43:41,440 så jeg gjorde noget dumt, og jeg havde chorus opkald kor 688 00:43:41,440 --> 00:43:43,760 fordi jeg overtog en anden ville gennemføre det måske, 689 00:43:43,760 --> 00:43:47,210 og nu dette kommer ikke til at kompilere endnu. Jeg skal gøre hvad? 690 00:43:47,210 --> 00:43:49,970 Jeg har brug for prototypen, huske. 691 00:43:49,970 --> 00:43:56,110 Så jeg er nødt til at have op her void kor (int i); 692 00:43:56,110 --> 00:43:59,210 Så nu hvis jeg går ned her - faktisk, lad os bruge den større vindue. 693 00:43:59,210 --> 00:44:01,980 Lad os gå videre og gøre kor. 694 00:44:01,980 --> 00:44:06,490 Lad os gå videre og gøre kor. 695 00:44:06,490 --> 00:44:08,370 Anvendelse af sort identifikator i. 696 00:44:08,370 --> 00:44:12,500 Åh, det var dumt. Vi har ikke brug for argumentet. Lad os bare gøre det. 697 00:44:12,500 --> 00:44:16,370 Jeg ville ønske, vi havde startet på denne måde. Det ville have været et meget lettere program til at skrive. 698 00:44:16,370 --> 00:44:25,590 Der. Lad os nu gå over til min terminal vindue, kør Dunk, og her er vi gå. 699 00:44:25,590 --> 00:44:28,460 Det var virkelig hurtig. 700 00:44:28,460 --> 00:44:31,150 Hvad der rent faktisk skete, selvom? 701 00:44:31,150 --> 00:44:33,730 Nå, nu vil jeg tilføje print linje, så vi kan se. 702 00:44:33,730 --> 00:44:43,490 Lad mig sige printf ("Jeg er herinde") - ingen variabler. Vi vil overlade det sådan. 703 00:44:43,490 --> 00:44:47,480 Lad mig køre gøre. Lad mig køre kor. 704 00:44:47,480 --> 00:44:57,380 Og ... kommer på. Hold ud. 705 00:44:57,380 --> 00:44:59,930 Som en sidebemærkning, hvorfor har det ikke styrtede ned endnu? 706 00:44:59,930 --> 00:45:02,080 Segmenteringen fejl skete super hurtigt før. 707 00:45:02,080 --> 00:45:06,570 [Uhørlig student svar] >> Præcis. Så det tager tid at udskrive, ikke? 708 00:45:06,570 --> 00:45:08,610 Det tager bare mere arbejde på computerens side. 709 00:45:08,610 --> 00:45:10,620 Og der er det: Segmentering fejl. 710 00:45:10,620 --> 00:45:12,340 >> Så opdager, hvor hurtigt programmer til at køre. 711 00:45:12,340 --> 00:45:14,130 Hvis du ikke udskriver noget, super hurtigt. 712 00:45:14,130 --> 00:45:18,770 Men vi har stadig denne segmentering skyld, fordi hvad der foregik? 713 00:45:18,770 --> 00:45:21,210 Hvis du tænker over, hvordan din computers hukommelse er lagt ud, 714 00:45:21,210 --> 00:45:28,740 Dette sker for at være vigtigste, men her lad os bare kalde dette kor, og lad os kalde dette kor. 715 00:45:28,740 --> 00:45:34,550 Og nu, hvis jeg gør mine æstetik højre, er dette bare for at sige kor, kor, kor, 716 00:45:34,550 --> 00:45:40,550 kor, kor, kor, kor, ad nauseum, og i sidste ende, hvad der vil ske? 717 00:45:40,550 --> 00:45:45,630 Hvis det store billede, bogstaveligt talt, er dette, hvad der lige sker konceptuelt? 718 00:45:46,520 --> 00:45:48,630 Stakken overskridelser heapen. 719 00:45:48,630 --> 00:45:51,940 Eller værre, du bare overrendt alt, herunder tekst-segmentet, 720 00:45:51,940 --> 00:45:54,590 som er den 0'er og 1-taller, der repræsenterer dit program. 721 00:45:54,590 --> 00:45:57,080 Kort sagt, er det bare super, super dårlig. 722 00:45:57,080 --> 00:45:58,830 Dit program har spiraled ud af kontrol. 723 00:45:58,830 --> 00:46:01,220 Du bruger måde mere hukommelse end du havde tænkt dig 724 00:46:01,220 --> 00:46:03,960 alt på grund af en dum fejl i dette tilfælde, 725 00:46:03,960 --> 00:46:08,040 eller i dette tilfælde en meget bevidst gjort funktion kalder sig. 726 00:46:08,040 --> 00:46:09,500 Nu, dette er ikke alle dårlige. 727 00:46:09,500 --> 00:46:13,800 Funktioner, der kaldte sig faktisk har stor magt, når du bruger det rigtigt. 728 00:46:13,800 --> 00:46:15,800 Jeg har ikke brugt det korrekt her. 729 00:46:15,800 --> 00:46:19,780 Så dette er ikke alle dårlige, men det faktum, at jeg faktisk aldrig stoppe med at kalde mig selv 730 00:46:19,780 --> 00:46:23,520 er en fundamental svaghed her i dette program. 731 00:46:23,520 --> 00:46:26,400 Så hvor skal vi hen med alt dette? Hvad der i virkeligheden sker? 732 00:46:26,400 --> 00:46:30,340 Når jeg kalder tilvækst funktion som vi gjorde i disse eksempler, 733 00:46:30,340 --> 00:46:33,420 Jeg har en værdi som 1, at jeg passerer i. 734 00:46:33,420 --> 00:46:37,570 Jeg passere i en kopi af nummer 1, så sker der følgende. 735 00:46:37,570 --> 00:46:44,240 Lad os gå ind i tilvækst eksempel, denne fyr lige herovre. 736 00:46:44,240 --> 00:46:46,870 Her er hvad der rent faktisk sker. 737 00:46:46,870 --> 00:46:53,400 Når jeg kalder tilvækst og jeg passere i x, billedligt, hvad der foregår her, er dette. 738 00:46:53,400 --> 00:46:59,520 >> Hvis jeg har værdien 1 gemmes her, og jeg rent faktisk kalder tilvækst, 739 00:46:59,520 --> 00:47:04,330 som nu kaldes kor - iPad er at smide mig af her. 740 00:47:04,330 --> 00:47:09,760 Lad os kalde dette interval, og vi ved ikke, hvad det næste funktion bliver. 741 00:47:09,760 --> 00:47:14,840 Så hvad der rent faktisk sker, er her et eller andet sted i main Jeg har en luns af hukommelse 742 00:47:14,840 --> 00:47:17,000 der lagrer tallet 1. 743 00:47:17,000 --> 00:47:19,380 Når jeg kalder tilvækst, jeg bruger en anden bid af hukommelse, 744 00:47:19,380 --> 00:47:21,230 men nu har jeg en kopi af 1. 745 00:47:21,230 --> 00:47:26,660 Når jeg tilvækst denne værdi, det bliver 2, 746 00:47:26,660 --> 00:47:30,560 men hvad sker der, så snart tilvækst vender tilbage? 747 00:47:30,560 --> 00:47:33,630 Denne hukommelse bare bliver givet tilbage til operativsystemet, 748 00:47:33,630 --> 00:47:37,450 hvilket betyder, alt hvad du har gjort, er noget nyttigt. 749 00:47:37,450 --> 00:47:43,120 Den 1, der oprindeligt var indeholdt i main er stadig faktisk er der. 750 00:47:43,120 --> 00:47:44,890 Så hvor skal vi hen med dette? 751 00:47:44,890 --> 00:47:49,770 Det viser sig, at der i hukommelsen du har denne back-to-back sekvens af bytes 752 00:47:49,770 --> 00:47:53,050 som du kan sætte ting i, og det viser sig, at vi allerede har set noget 753 00:47:53,050 --> 00:47:55,390 der indebærer at sætte ting tilbage til back to back to back. 754 00:47:55,390 --> 00:47:59,860 Hvad er en streng baseret på uge 1 og nu uge 2? 755 00:48:00,020 --> 00:48:01,980 Det er bare en samling af tegn. 756 00:48:01,980 --> 00:48:04,310 Så det viser sig, lige som du kan sætte tal i hukommelsen, 757 00:48:04,310 --> 00:48:06,990 ligeledes kan du sætte tegn i hukommelsen. 758 00:48:06,990 --> 00:48:10,530 Og når vi begynder at sætte tegn i hukommelsen tilbage til tilbage til ryg mod ryg, 759 00:48:10,530 --> 00:48:13,620 viser det sig, at bruge den enkleste af ting som en for-løkke eller en while-løkke, 760 00:48:13,620 --> 00:48:17,170 vi kan gentage fra venstre til højre over de tegn i en streng 761 00:48:17,170 --> 00:48:20,600 og begynder at massere dem i forskellige figurer helt - 762 00:48:20,600 --> 00:48:23,370 a kan blive b, kunne b blive c - 763 00:48:23,370 --> 00:48:27,780 så der i sidste ende kan vi tage en engelsk sætning, der rent faktisk giver mening 764 00:48:27,780 --> 00:48:30,310 og konvertere hvert af disse skrivelser en ad gangen 765 00:48:30,310 --> 00:48:34,400 ved at gå gennem vores computers hukommelse venstre mod højre til rent faktisk at kryptere. 766 00:48:34,400 --> 00:48:35,810 Så lad os tage vores fem minutters pause her, 767 00:48:35,810 --> 00:48:40,730 og når vi kommer tilbage, vil vi starte denne proces med scrambling information. 768 00:48:42,020 --> 00:48:43,520 >> Ok. 769 00:48:43,520 --> 00:48:48,070 Før vi dykke ned i nogle krypto og disse ting kaldet arrays, 770 00:48:48,070 --> 00:48:51,470 lad mig pause for eventuelle spørgsmål, fordi jeg føler, at jeg virkelig slags rodede 771 00:48:51,470 --> 00:48:54,080 nogle af disse emner. Så lad os løse nu, hvis vi kan. 772 00:48:54,080 --> 00:48:58,700 Vi har lige talt om returværdier, vi talte om argumenter, 773 00:48:58,700 --> 00:49:03,250 og vi talte om dette begreb, som vi vil vende tilbage til i de kommende uger, 774 00:49:03,250 --> 00:49:08,720 at betragte hukommelse som en hel bunke af disse stablede bakker, så at sige, 775 00:49:08,720 --> 00:49:12,660 fra bunden på op, således at hver bakke, der bliver sat på stakken 776 00:49:12,660 --> 00:49:16,530 repræsenterer en funktion, der er ved at blive kaldt. 777 00:49:17,900 --> 00:49:20,260 Eventuelle spørgsmål? 778 00:49:20,260 --> 00:49:22,640 Lad mig stille et spørgsmål her. 779 00:49:22,640 --> 00:49:27,890 Lad mig forenkle denne tilbage til hvad den var før nogle af vores tidligere Q & A. 780 00:49:27,890 --> 00:49:35,570 Den omstændighed, at tilvækst har åben parentes, int antal, lukket parentes - 781 00:49:35,570 --> 00:49:39,110 hvad betyder int tal repræsenterer? 782 00:49:39,110 --> 00:49:42,790 [Studerende] Et argument. >> Et argument. Okay. Men hvad er et argument? 783 00:49:42,790 --> 00:49:46,370 [Uhørlig student svar] >> Hvad er det? >> [Studerende] Noget, som du passerer i. 784 00:49:46,370 --> 00:49:49,940 Okay, så noget, du passerer i. Og mere generelt, det er bare input. 785 00:49:49,940 --> 00:49:52,450 Hvis du skrev en funktion, og at funktionens formål i livet 786 00:49:52,450 --> 00:49:55,770 er at gøre noget lidt anderledes, hver gang du bruger det, 787 00:49:55,770 --> 00:50:00,110 så er den eneste måde for at det skal ske ville virkelig synes at være at give det input 788 00:50:00,110 --> 00:50:03,510 så det kan gøre noget anderledes med det input hver gang. 789 00:50:03,510 --> 00:50:06,650 >> Så du er nødt til at angive to ting, når en funktion tager input. 790 00:50:06,650 --> 00:50:09,590 Du skal angive det navn, du ønsker at give til denne indgang 791 00:50:09,590 --> 00:50:12,700 udelukkende for din egen bekvemmelighed, så du kan henvise til det 792 00:50:12,700 --> 00:50:16,540 i den funktion, du selv skriver, som jeg gjorde her på linje 32. 793 00:50:16,540 --> 00:50:20,800 Men du også nødt til at specificere sin type, fordi C er et programmeringssprog 794 00:50:20,800 --> 00:50:25,940 der bare kræver, at hvis du ønsker en variabel, du nødt til at fortælle computeren, hvad datatype er det, 795 00:50:25,940 --> 00:50:30,200 for en stor del, så det ved, hvor mange bits tildele for den pågældende variabel 796 00:50:30,200 --> 00:50:33,020 fordi det kunne være 6 - undskyld, det vil ikke være 6. 797 00:50:33,020 --> 00:50:37,080 Det kan være 16, kan det være 8, kan det være 32, endog 64, 798 00:50:37,080 --> 00:50:39,130 men computeren skal vide. 799 00:50:39,130 --> 00:50:43,180 Nu int på venstre side repræsenterer, hvad der derimod? 800 00:50:46,350 --> 00:50:48,850 [Uhørlig student svar] >> Hvad er det? >> [Student] Type af funktion. 801 00:50:48,850 --> 00:50:53,610 Typen af ​​en funktion, og mere specifikt den type af produktionen. Right. 802 00:50:53,610 --> 00:50:57,380 Så mens ting i parentes repræsenterer sit input eventuelle 803 00:50:57,380 --> 00:50:59,660 de ting til venstre repræsenterer dens output. 804 00:50:59,660 --> 00:51:03,530 Og i dette tilfælde, tilvækst tilsyneladende returnerer en int, 805 00:51:03,530 --> 00:51:07,690 og så int er returtypen af ​​denne funktion. 806 00:51:07,690 --> 00:51:09,340 Hvad betyder det at vende tilbage? 807 00:51:09,340 --> 00:51:15,090 Bogstaveligt, du bruger søgeordet afkast og derefter, hvis det, du vender tilbage 808 00:51:15,090 --> 00:51:18,600 til højre for nøgleordet er et helt tal, 809 00:51:18,600 --> 00:51:21,660 så er det faktisk overensstemmelse med, hvad vi har lovet. 810 00:51:21,660 --> 00:51:26,410 Du kunne ikke gøre noget som dette - Hej, verden - fordi det er en streng. 811 00:51:26,410 --> 00:51:28,860 >> Naturligvis er det ikke et helt tal. 812 00:51:28,860 --> 00:51:33,140 Så kort sagt, at byrden er virkelig på os, programmøren, at være specifik 813 00:51:33,140 --> 00:51:37,770 om, hvad vi vender tilbage og derefter faktisk gå om tilbagesendelse. 814 00:51:37,770 --> 00:51:43,440 Konteksten her nu, er, at din computers hukommelse er en gigabyte, 2 GB - 815 00:51:43,440 --> 00:51:45,920 uanset hvad - måske er det mere, måske er det mindre, 816 00:51:45,920 --> 00:51:49,050 men computeren ser den som havende forskellige sektioner. 817 00:51:49,050 --> 00:51:51,200 Noget går dernede, noget andet går deroppe, 818 00:51:51,200 --> 00:51:54,290 forskellige ting går i midten, og i dag har vi bare begynde at fortælle historien, 819 00:51:54,290 --> 00:51:56,340 men vi vil vende tilbage til denne over tid. 820 00:51:56,340 --> 00:51:59,980 For nu, er det eneste stykke af hukommelse vi virkelig bekymrer sig om tekstsegment 821 00:51:59,980 --> 00:52:03,360 fordi det bare repræsenterer den 0'er og 1-taller, at Dunk har udsendt. 822 00:52:03,360 --> 00:52:06,050 Så når du kører en kommando på tastaturet ligesom a.out 823 00:52:06,050 --> 00:52:09,110 eller du dobbeltklikke på et ikon på Mac OS eller Windows, 824 00:52:09,110 --> 00:52:11,880 Deres program er indlæst fra harddisken til RAM 825 00:52:11,880 --> 00:52:16,330 og det er plopped øverst på computerens RAM, så at sige. 826 00:52:16,330 --> 00:52:20,450 I mellemtiden, som dit program starter, og main bliver kaldt 827 00:52:20,450 --> 00:52:23,640 i det program, du skrev, eller det program Microsoft eller Apple skrev, 828 00:52:23,640 --> 00:52:27,860 nogen af ​​sine lokale variable ender dernede på bunden af ​​computerens hukommelse. 829 00:52:27,860 --> 00:52:33,230 Men hvis de vigtigste opkald anden funktion, selv har variable eller argumenter, ender de op over det. 830 00:52:33,230 --> 00:52:36,680 Og hvis denne funktion kalder noget, de ender op over det, over det, over den. 831 00:52:36,680 --> 00:52:41,460 >> Og kun en gang en funktion er færdig fuldbyrdende ikke stakken af ​​bakker, så at sige, 832 00:52:41,460 --> 00:52:43,240 begynder at blive lavere og lavere. 833 00:52:43,240 --> 00:52:48,250 Og det er det da, i en nøddeskal, forklarer hvorfor, når du ringer terning 834 00:52:48,250 --> 00:52:51,550 eller du kalder tilvækst, du passerer på en kopi af værdien. 835 00:52:51,550 --> 00:52:55,520 Og hvad det betyder billedligt er, at du bogstaveligt talt er ved at skrive tallet 1 836 00:52:55,520 --> 00:53:00,460 i en anden del af hukommelsen, ændring, at 1-2 for inkrement 837 00:53:00,460 --> 00:53:04,820 eller til en 8 for terningen og kaster denne hukommelse væk 838 00:53:04,820 --> 00:53:09,140 så snart tilvækst eller kubefunktion afkast. Spørgsmål. 839 00:53:09,140 --> 00:53:12,900 [Studerende] Hvor globale variabler opbevaret? 840 00:53:12,900 --> 00:53:18,100 Globale variabler gemmes i, hvad der i øjeblikket hedder de initialiserede data eller startværdi data, 841 00:53:18,100 --> 00:53:21,920 idet forskellen er, hvis du har en global variabel, og du tildeler det straks en værdi 842 00:53:21,920 --> 00:53:24,640 med lighedstegnet, det ender øverst dér, 843 00:53:24,640 --> 00:53:29,200 og hvis du bare siger int x; med nogen værdi, det ender lidt lavere i RAM 844 00:53:29,200 --> 00:53:31,710 blot ved konvention. 845 00:53:31,710 --> 00:53:34,940 Andre spørgsmål? Ok. 846 00:53:34,940 --> 00:53:37,340 Så dette billede vil komme tilbage, når vi får mere kraftfuld 847 00:53:37,340 --> 00:53:39,170 med hvad vi kan gøre med computeren, 848 00:53:39,170 --> 00:53:42,720 men for nu, lad os få en kort intro til kryptografi, 849 00:53:42,720 --> 00:53:46,080 en bestemt type kryptering, der ikke løse alle verdens problemer 850 00:53:46,080 --> 00:53:47,720 men løser nogle af dem. 851 00:53:47,720 --> 00:53:51,700 I dette tilfælde her har vi noget, der hedder hemmelig-nøgle kryptering. 852 00:53:51,700 --> 00:53:56,410 Secret-key kryptografi, som navnet antyder, får sin sikkerhed fra en hemmelighed. 853 00:53:56,410 --> 00:54:00,690 >> For eksempel, hvis du var tilbage i folkeskolen og gik forbi en lille hemmelighed kærlighedsbrev 854 00:54:00,690 --> 00:54:04,850 til dreng eller pige du var knusning på, hvis du ønsker at passere dette notat gennem publikum, 855 00:54:04,850 --> 00:54:08,380 du sandsynligvis ikke ville skrive sådan en note på engelsk eller hvad dit modersmål er. 856 00:54:08,380 --> 00:54:13,340 I stedet kan du kryptere det, eller du kan bare sende dem en sms i disse dage. 857 00:54:13,340 --> 00:54:15,460 Men du kan faktisk give dem en note i hele klasseværelset. 858 00:54:15,460 --> 00:54:18,700 Og for at gøre det sikkert på en sådan måde, at dine venner og læreren 859 00:54:18,700 --> 00:54:22,650 ved ikke, hvad du skriver, kan du komme op med en forholdsvis simpel algoritme, 860 00:54:22,650 --> 00:54:25,920 ung selvom du måske være, at bare forvrænge ordene. 861 00:54:25,920 --> 00:54:28,130 Så i stedet for at skrive en du måske skrive b, 862 00:54:28,130 --> 00:54:30,220 i stedet for b du måske skrive c, 863 00:54:30,220 --> 00:54:32,140 stedet for c man kan skrive d, og så videre. 864 00:54:32,140 --> 00:54:34,360 Eller du kan komme op med en mere sofistikeret oversættelse 865 00:54:34,360 --> 00:54:36,720 af breve til forskellige bogstaver. 866 00:54:36,720 --> 00:54:39,740 Men fangsten er dreng eller pige, til hvem du sender denne note 867 00:54:39,740 --> 00:54:45,020 behov for at vide noget, hvilket er, hvad selvfølgelig? >> [Studerende] Hvad du sender. 868 00:54:45,020 --> 00:54:49,720 Hvad din hemmelighed er, ligesom hvad er det mapping mellem en A'er og B'er og C'er og D's. 869 00:54:49,720 --> 00:54:54,650 Er det bare lægge 1 til hver af de bogstaver, at gå fra A til B, B til C? 870 00:54:54,650 --> 00:54:56,670 Er det mere kompliceret end det? 871 00:54:56,670 --> 00:55:01,540 >> Så du og din knuse er nødt til at have denne hemmelige oplysninger, 872 00:55:01,540 --> 00:55:03,190 men der er lidt af en catch-22 her. 873 00:55:03,190 --> 00:55:06,830 Hvis det er allerførste gang du sender denne kærlighed brev gennem klassen, 874 00:55:06,830 --> 00:55:10,720 hvordan er den dreng eller pige går at vide, hvad hemmeligheden selv er? 875 00:55:10,720 --> 00:55:13,930 Så hemmelig-nøgle krypto ikke løse alle verdens problemer, 876 00:55:13,930 --> 00:55:16,320 og der er faktisk en sammenhæng her, at vi vil komme tilbage til hen imod semesters afslutning. 877 00:55:16,320 --> 00:55:25,110 Ligeledes gør de fleste af os ikke kender nogen, der virker for eksempel på Amazon.com, 878 00:55:25,110 --> 00:55:28,190 og alligevel mange af os har sikkert købt ting på Amazon.com, 879 00:55:28,190 --> 00:55:31,990 og vi har lært at antage, at disse e-handelstransaktioner er sikre. 880 00:55:31,990 --> 00:55:36,470 Den URL sandsynligvis siger https, er der måske en fjollet lille hængelås-ikonet et eller andet sted, 881 00:55:36,470 --> 00:55:39,930 der er en slags kryptering sikre dine kreditkortoplysninger 882 00:55:39,930 --> 00:55:42,160 mellem dig og Amazon.com. 883 00:55:42,160 --> 00:55:45,430 Og dog, hvis kryptografi indebærer at kende nogle hemmelige 884 00:55:45,430 --> 00:55:48,620 og alligevel har jeg ikke kender nogen på Amazon, og jeg har bestemt ikke arrangeret nogen form for hemmelig 885 00:55:48,620 --> 00:55:52,710 med nogen på Amazon, er, hvordan min computer eller min browser at gøre dette? 886 00:55:52,710 --> 00:55:55,720 Det viser sig, at der er andre former for kryptering helt at løse dette problem. 887 00:55:55,720 --> 00:55:57,670 Men i dag vil vi fokusere på den enkel 888 00:55:57,670 --> 00:56:00,290 hvor du kan arrangere på forhånd at kende nogle hemmelige 889 00:56:00,290 --> 00:56:03,760 som en eller nogle mapping mellem en A'er og B'er. 890 00:56:03,760 --> 00:56:05,840 Og processen for kryptografi generelt indebærer dette. 891 00:56:05,840 --> 00:56:08,620 Du har nogle almindelig tekst, der er afbildet her til venstre, 892 00:56:08,620 --> 00:56:12,930 du kører det gennem en form for algoritme eller procedure for at kryptere den - 893 00:56:12,930 --> 00:56:15,100 måske det er bare en bliver b, b bliver c - 894 00:56:15,100 --> 00:56:17,490 og så du ender op med ciphertext. 895 00:56:17,490 --> 00:56:20,380 I mellemtiden, når din knuse modtager denne hemmelige note, 896 00:56:20,380 --> 00:56:24,200 han eller hun har derefter dekryptere den ved generelt at vende en sådan algoritme 897 00:56:24,200 --> 00:56:27,190 så at komme tilbage almindelig tekst. 898 00:56:27,190 --> 00:56:28,960 Der er fysiske inkarnationer af dette. 899 00:56:28,960 --> 00:56:31,680 >> For eksempel er det en lille hemmelighed dekoder ring, 900 00:56:31,680 --> 00:56:35,110 og dette er en ring i den forstand, at der er to skiver her. 901 00:56:35,110 --> 00:56:38,490 På ydersiden periferi af det her, er der Bogstaverne A til Z, 902 00:56:38,490 --> 00:56:40,340 selvom de er i tilfældig rækkefølge, 903 00:56:40,340 --> 00:56:42,880 og på indersiden er der faktisk nogle numre 904 00:56:42,880 --> 00:56:46,620 sådan, at med denne ring du kan slags vende udefra, men ikke inde 905 00:56:46,620 --> 00:56:49,140 for at line op numre med bogstaver. 906 00:56:49,140 --> 00:56:53,020 Fra en film kaldet A Christmas Story, vil du se, at lille Ralphie 907 00:56:53,020 --> 00:56:58,000 var så ivrig efter at finde ud af, hvad Little Orphan Annie hemmelige budskab var til ham 908 00:56:58,000 --> 00:57:02,570 der var blevet meddelt, tror jeg, i form af numeriske meddelelser på en korn kasse 909 00:57:02,570 --> 00:57:07,220 og du havde at akkumulere alle de små kort, der kom i korn box, 910 00:57:07,220 --> 00:57:09,770 De var nødt til at sende dem ind, skulle du komme tilbage den hemmelige dekoder ring 911 00:57:09,770 --> 00:57:13,910 så du endelig kan finde ud af hvad den kortlægning er mellem bogstaver og tal 912 00:57:13,910 --> 00:57:15,550 eller bogstaver og bogstaver. 913 00:57:15,550 --> 00:57:19,520 Hvordan i en computer kan vi gå om gennemførelsen eller repræsenterer ting som dette? 914 00:57:19,520 --> 00:57:22,560 Vi har brug for en måde at udtrykke os selv lidt mere fleksibelt 915 00:57:22,560 --> 00:57:25,080 end vores variabler hidtil har tilladt. 916 00:57:25,080 --> 00:57:29,000 Vi har haft int'er, vi har haft chars, vi har haft flåd og doubler og et par andre, 917 00:57:29,000 --> 00:57:34,200 men de er enkelte stykker hukommelse, der ikke rigtig tillader os at udtrykke ting 918 00:57:34,200 --> 00:57:36,440 som ord og sætninger og sætninger. 919 00:57:36,440 --> 00:57:38,630 Faktisk har vi kaldt sådanne ting strygere, 920 00:57:38,630 --> 00:57:42,660 men vi lover, at dette er egentlig bare en forenkling i CS50 biblioteket 921 00:57:42,660 --> 00:57:45,540 at vi har til hensigt at skrælle tilbage. 922 00:57:45,540 --> 00:57:47,500 Og så lad os begynde at gøre det her. 923 00:57:47,500 --> 00:57:49,840 Lad mig gå videre og åbne en fil - 924 00:57:49,840 --> 00:57:54,100 alle disse filer er tilgængelige, som sædvanlig, online - kaldet array.c 925 00:57:54,100 --> 00:57:58,960 at løse et problem relateret til strenge, men det tegner et billede her 926 00:57:58,960 --> 00:58:01,520 om, hvordan vi kunne bruge noget, der hedder et array. 927 00:58:01,520 --> 00:58:04,050 >> Et array er en datatype. 928 00:58:04,050 --> 00:58:10,730 Det er en type variabel slags, der har flere mindre datatyper inde i det 929 00:58:10,730 --> 00:58:12,680 tilbage til tilbage til back to back. 930 00:58:12,680 --> 00:58:16,980 Altså for eksempel, hvis vi ønskede at skrive et lille program, der giver dig din quiz gennemsnit 931 00:58:16,980 --> 00:58:19,780 for et kursus som 50, der har 2 quizzer, 932 00:58:19,780 --> 00:58:23,450 du kunne meget nemt skrive dette program baseret selv på nogle af sidste uges materiale 933 00:58:23,450 --> 00:58:28,830 ved hjælp af GetInt og et par variabler: int quiz1, int quiz2. 934 00:58:28,830 --> 00:58:30,550 Og det er temmelig ligetil. 935 00:58:30,550 --> 00:58:33,500 Det er måske 10, 20 linjer kode max at gennemføre et program 936 00:58:33,500 --> 00:58:38,940 der beder brugeren om 2 quiz scorer og derefter beregner deres gennemsnit 937 00:58:38,940 --> 00:58:42,020 ved at tilsætte dem sammen, dividere med 2 og derefter trykning af resultaterne. 938 00:58:42,020 --> 00:58:46,400 Vi kunne sandsynligvis gøre det temmelig let nu efter et bestemt antal minutter. 939 00:58:46,400 --> 00:58:49,450 Men problemet er, at antage, at 50 havde 3 quizzer eller 4. 940 00:58:49,450 --> 00:58:52,830 Antag, at du ønskede at bruge det samme program for en klasse, der havde ugentligt quizzer. 941 00:58:52,830 --> 00:58:55,100 Tænk en klasse, der har ugentlig quizzer. 942 00:58:55,100 --> 00:58:58,840 Hvis der er 16 eller deromkring uger i et semester, nu du har 16 variabler: 943 00:58:58,840 --> 00:59:03,030 int quiz1, int quiz2, int quiz3, int quiz4. 944 00:59:03,030 --> 00:59:06,870 Så snart du begynder at se denne redundans, det kopiere og indsætte af kode, 945 00:59:06,870 --> 00:59:09,810 det skulle begynde at gøre dig ønske der var en bedre måde. 946 00:59:09,810 --> 00:59:13,610 Og heldigvis, på grund af arrays, der er. Så lad os gøre det. 947 00:59:13,610 --> 00:59:16,700 Først, lad mig introducere en meget simpel ting, som vi ikke har brugt hidtil, 948 00:59:16,700 --> 00:59:18,820 men du vil se det lejlighedsvis i kode. 949 00:59:18,820 --> 00:59:21,270 >> Dette er, hvad der generelt kaldes en konstant. 950 00:59:21,270 --> 00:59:24,410 Så det er en konstant i den forstand, at denne værdi aldrig ændrer. 951 00:59:24,410 --> 00:59:26,450 Den menneskelige konvention, når du opretter en konstant 952 00:59:26,450 --> 00:59:30,420 er at bruge store bogstaver bare så, at det virkelig skiller sig ud i din kode, 953 00:59:30,420 --> 00:59:34,270 og det særlige søgeord, som du bruger i C # define. 954 00:59:34,270 --> 00:59:39,970 Så vi siger # define, så en plads, så det ord, du vil bruge til den konstante navn 955 00:59:39,970 --> 00:59:41,730 og derefter værdien af ​​konstanten. 956 00:59:41,730 --> 00:59:44,710 Bemærk dette er forskelligt fra tildeling af noget til en variabel. 957 00:59:44,710 --> 00:59:46,430 Der er ingen lighedstegnet, der er ingen semikolon. 958 00:59:46,430 --> 00:59:49,140 Dette er hvad der normalt betegnes som en præprocessor direktiv, 959 00:59:49,140 --> 00:59:50,840 men mere om det en anden gang. 960 00:59:50,840 --> 00:59:56,350 For nu, skaber dette en uforanderlig værdi kaldet quizzer 961 00:59:56,350 --> 00:59:58,290 hvis faktiske numeriske værdi er 2. 962 00:59:58,290 --> 01:00:02,180 Så uanset hvor du ser quizzer, quizzer, quizzer hele denne fil, 963 01:00:02,180 --> 01:00:04,230 det er bare et 2-tal. 964 01:00:04,230 --> 01:00:06,550 Hvis jeg ser på main nu, lad os se hvordan det virker. 965 01:00:06,550 --> 01:00:09,770 Først det ser lidt kryptisk, men det er alle ting fra uge 1. 966 01:00:09,770 --> 01:00:12,210 Spørg brugeren om kvaliteter. Hvordan gør vi det? 967 01:00:12,210 --> 01:00:17,350 I tråd 22 - dette er virkelig den saftige del - Jeg erklærer en float 968 01:00:17,350 --> 01:00:23,240 men ikke bare en enkelt svømmer. Jeg erklærer, snarere en række floating-point værdier. 969 01:00:23,240 --> 01:00:27,700 Denne variabel vil blive kaldt kvaliteter, som antydet her, 970 01:00:27,700 --> 01:00:31,420 men det eneste stykke ny syntaks så er disse firkantede parenteser. 971 01:00:31,420 --> 01:00:37,280 Det faktum, at jeg har sagt float kvaliteter og derefter åbne bøjle og derefter en række - 972 01:00:37,280 --> 01:00:40,980 varsel, hvis dette er en konstant dette er ligesom vi gjorde dette - 973 01:00:40,980 --> 01:00:46,840 Det betyder, "Hey computer, giv mig 2 flåd og lad os kollektivt kalde dem kvaliteter." 974 01:00:46,840 --> 01:00:51,780 >> Dette er i modsætning til en langt mere kedelig proces som denne: float Grade1; 975 01:00:51,780 --> 01:00:54,580 flyde grade2, og så videre. 976 01:00:54,580 --> 01:00:58,310 Så et array giver os mulighed for at gennemføre denne idé, men langt mindre messily, 977 01:00:58,310 --> 01:01:04,560 på en sådan måde, at vi kan skrive 1 linje kode i stedet for, siger, 16 for en 16-ugers semester. 978 01:01:04,560 --> 01:01:09,060 Jeg ønskede ikke at hard-code 2, fordi hvis du tænker over det nu logisk, 979 01:01:09,060 --> 01:01:12,560 Antag næste år CS50 ændringer 3 quiz'er stedet 980 01:01:12,560 --> 01:01:15,010 og jeg havde nummer 2 her, havde jeg nummer 2 her, 981 01:01:15,010 --> 01:01:17,210 Jeg havde nummer 2 her, tallet 2 her. 982 01:01:17,210 --> 01:01:19,890 Det bliver meget trættende og meget let at skrue op 983 01:01:19,890 --> 01:01:26,550 og ved et uheld ændre 1 værdi til 3 og gå glip af en anden værdi af 2. 984 01:01:26,550 --> 01:01:30,660 Så jeg har tænkt mig at i stedet abstrakt dette væk og bruge denne konstante, at 985 01:01:30,660 --> 01:01:32,520 som navnet antyder, forandrer sig aldrig. 986 01:01:32,520 --> 01:01:35,870 Og nu uanset om vi har forskellige quizzer i år eller næste, 987 01:01:35,870 --> 01:01:39,380 Jeg bare nødt til at ændre det på ét sted heroppe på toppen. 988 01:01:39,380 --> 01:01:41,230 Så det hele er en konstant er. 989 01:01:41,230 --> 01:01:47,100 I mellemtiden er den nye begrebsmæssige træk er, at i et array. 990 01:01:47,100 --> 01:01:55,030 Så de firkantede parenteser giver mig så mange flåd og lader mig kollektivt kalder dem kvaliteter her. 991 01:01:55,030 --> 01:01:56,720 Så lad os nu se, hvad jeg har tænkt mig at gøre. 992 01:01:56,720 --> 01:01:59,220 Her i ledningen 24 er begyndelsen på en for-løkke. 993 01:01:59,220 --> 01:02:03,380 >> Dette er virkelig ikke noget fancy. Det er bare med quizzer i stedet for en hård-kodet nummer. 994 01:02:03,380 --> 01:02:06,740 Men der er ikke noget intellektuelt anderledes der fra sidste uge. 995 01:02:06,740 --> 01:02:11,650 Dette er blot printf, så printf ("Quiz #% d af% d:") 996 01:02:11,650 --> 01:02:16,670 fordi jeg bare ønsker at udskrive give mig quiz nummer 1 af 2 og derefter 2 af 2. 997 01:02:16,670 --> 01:02:18,480 Så dette er en rent æstetisk ting. 998 01:02:18,480 --> 01:02:21,000 Men det interessante del nu er på linje 27. 999 01:02:21,000 --> 01:02:27,840 For at udfylde en af ​​de to pladsholdere med et floating-point værdi, 1000 01:02:27,840 --> 01:02:29,640 du igen bruge kantede parenteser. 1001 01:02:29,640 --> 01:02:35,170 I dette tilfælde, jeg bruger i, fordi det for-løkke er begyndt med i svarende hvilken værdi, tilsyneladende? 1002 01:02:35,170 --> 01:02:36,670 [Studerende] 0. >> [Malan] 0. 1003 01:02:36,670 --> 01:02:40,990 Så på den første iteration af dette loop, er det som om jeg skrev dette i kode, 1004 01:02:40,990 --> 01:02:46,310 men på den anden iteration af dette loop, er det som om jeg skrev dette i min kode. 1005 01:02:46,310 --> 01:02:49,970 Men det faktum, at jeg bruger en variabel er perfekt, fordi, som navnet antyder, 1006 01:02:49,970 --> 01:02:52,600 det er varierende sin værdi på hver iteration, 1007 01:02:52,600 --> 01:02:55,900 så jeg udfylde dette array ét sted ad gangen. 1008 01:02:55,900 --> 01:02:57,380 Hvad betyder dette array ud? 1009 01:02:57,380 --> 01:03:01,570 Grunden til at jeg trak den super simple rektangel på skærmen her før var af denne grund. 1010 01:03:01,570 --> 01:03:05,590 Et array er bare en bid af hukommelse, efterfulgt af en anden bid af hukommelse 1011 01:03:05,590 --> 01:03:08,570 efterfulgt af et andet stykke af hukommelse og så videre. 1012 01:03:08,570 --> 01:03:13,120 Så hvis min array er af størrelse 2 i dette tilfælde her, alt jeg ville gøre 1013 01:03:13,120 --> 01:03:20,200 ved at skrive i min quiz scoringer gerne her - jeg fik 100 på denne ene og så fik jeg en 99 på denne ene - 1014 01:03:20,200 --> 01:03:24,970 så denne hukommelse måske ikke engang blive brugt, fordi jeg kun har bedt computeren 1015 01:03:24,970 --> 01:03:26,840 for en bred vifte af størrelse 2. 1016 01:03:26,840 --> 01:03:28,600 Disse pladser er der stadig, ikke? 1017 01:03:28,600 --> 01:03:32,670 Du har stadig 2 GB RAM, selvom du kun beder om 2 flåd. 1018 01:03:32,670 --> 01:03:36,840 Så ideen bag arrays er, at computeren bare tager en bid af hukommelse 1019 01:03:36,840 --> 01:03:41,340 og derefter fordeler mindre stykker tilbage til back to back to back. 1020 01:03:41,340 --> 01:03:43,310 Og så det er alt et array er. 1021 01:03:43,310 --> 01:03:47,350 >> Det er en sammenhængende luns af hukommelsen indeni, som du kan sætte ting. 1022 01:03:47,350 --> 01:03:50,700 Dette sker for derefter gøre bare nogle kedelige aritmetik. 1023 01:03:50,700 --> 01:03:54,640 Hvis jeg rulle ned her, det er her, jeg så gentage over opstillingen. 1024 01:03:54,640 --> 01:03:58,020 Jeg kommer op med summen af ​​alle værdierne i arrayet, 1025 01:03:58,020 --> 01:04:02,470 og så bruger jeg den runde funktion her til faktisk at gøre det beløb divideret med quizzer. 1026 01:04:02,470 --> 01:04:06,320 Men lad mig bølge min hånd på det som en slags nok aritmetik for nu. 1027 01:04:06,320 --> 01:04:08,370 Men alt, hvad der gør for mig i sidste ende er at beregne et gennemsnit. 1028 01:04:08,370 --> 01:04:13,580 Så første quiz plus sekunder quiz divideret med 2 og derefter printe det ud som en int. 1029 01:04:13,580 --> 01:04:17,280 Men lad os nu overgang til en anden eksempel kaldet streng1, 1030 01:04:17,280 --> 01:04:20,700 der tegner et lignende billede, men ved hjælp af strenge. 1031 01:04:20,700 --> 01:04:23,940 Lad mig gå videre og forenkle dette for bare et øjeblik. 1032 01:04:23,940 --> 01:04:27,090 Tilgiv indrykningen for nu. 1033 01:04:27,090 --> 01:04:30,870 Bemærk i linje 19 i dette eksempel, får jeg en streng fra brugeren. 1034 01:04:30,870 --> 01:04:34,640 Men bemærk hvad jeg næste gør i linjerne 22 og fremefter. 1035 01:04:34,640 --> 01:04:41,250 Jeg er faktisk iteration fra i op til - og det er et nyt trick - strlen, streng længde. 1036 01:04:41,250 --> 01:04:44,880 Dette er en funktion, der kommer med C, hvis du passerer det en streng, 1037 01:04:44,880 --> 01:04:47,730 Det fortæller dig, hvor mange tegn er i denne streng. Det er alt. 1038 01:04:47,730 --> 01:04:51,550 Og det faktum, at det er strlen stedet for streng længde er bare fordi det er mere kortfattet. 1039 01:04:51,550 --> 01:04:55,100 Tredive år siden, folk kunne lide at skrive ting som kortfattet som muligt, 1040 01:04:55,100 --> 01:04:57,630 så vi har holdt denne konvention her. 1041 01:04:57,630 --> 01:05:00,660 i + + betyder blot forøge i i hver iteration. 1042 01:05:00,660 --> 01:05:02,990 Og nu bemærke dette, som er virkelig interessant. 1043 01:05:02,990 --> 01:05:09,180 I linie 24, siger jeg, "Computer, giv mig et tegn, 8 bit, og kalder det c". 1044 01:05:09,180 --> 01:05:12,630 Men hvad er dette på højre side siger? 1045 01:05:13,490 --> 01:05:16,530 På engelsk, hvad det repræsenterer? 1046 01:05:16,530 --> 01:05:18,730 [Studerende] Det første tegn i sættet. 1047 01:05:18,730 --> 01:05:20,790 Præcis. Giv mig det første tegn i sættet. 1048 01:05:20,790 --> 01:05:24,090 Eller mere generelt, giv mig den i'te tegn i array. 1049 01:05:24,090 --> 01:05:26,100 Og indse det er vigtigt nu, at som dataloger, 1050 01:05:26,100 --> 01:05:27,890 Vi er faktisk at tælle fra 0. 1051 01:05:27,890 --> 01:05:29,720 >> Du har ikke det skøn nu at begynde at gøre dette. 1052 01:05:29,720 --> 01:05:34,160 Nu har du til at opføre sig i overensstemmelse med computerens forventninger og tælle fra 0 1053 01:05:34,160 --> 01:05:38,180 fordi [0] vil være det første tegn i en streng, 1054 01:05:38,180 --> 01:05:42,150 [1] bliver det andet, [2], bliver den tredje og så videre. 1055 01:05:42,150 --> 01:05:49,720 Så dette program, hvis jeg kompilere det, det er igen streng1, så gør streng1, 1056 01:05:49,720 --> 01:05:54,670 og nu har jeg kørt streng1 i min terminal vindue. 1057 01:05:54,670 --> 01:05:58,330 Det venter på input, så jeg har tænkt mig at skrive i David, Enter, 1058 01:05:58,330 --> 01:06:02,540 og nu er det udskriver David alle på forskellige linjer, fordi varsel hvad jeg gør. 1059 01:06:02,540 --> 01:06:05,820 Jeg udskriver et tegn ad gangen. 1060 01:06:05,820 --> 01:06:10,100 Vi vil ikke gå i detaljer i dag på dette, men jeg slettede for et øjeblik siden denne kontrol her. 1061 01:06:10,100 --> 01:06:15,480 Det viser sig, at hvis brugeren er uartig, kontradiktion, eller bare forvirret, 1062 01:06:15,480 --> 01:06:20,210 du kan faktisk undgå at give en streng af en vis længde. 1063 01:06:20,210 --> 01:06:22,860 Hvis du rammer en forkert tast på tastaturet, kan du give nogen snor på alle, 1064 01:06:22,860 --> 01:06:26,950 eller hvis du er skadeligt, kan du prøve at indsætte en gigabyte værd af et essay 1065 01:06:26,950 --> 01:06:29,290 til at udfylde denne streng, og hvis computeren løber tør for hukommelse, 1066 01:06:29,290 --> 01:06:32,710 Det viser sig, at vi vil komme tilbage denne særlige værdi kaldet NULL. 1067 01:06:32,710 --> 01:06:35,580 Så for nu, ved bare at der er denne særlige værdi kaldet NULL 1068 01:06:35,580 --> 01:06:39,580 der vil tillade os at kontrollere, når vi er ude af hukommelsen, blandt andre ting. 1069 01:06:39,580 --> 01:06:45,630 Men hvis jeg åbner nu streng2, bemærke en forskel her. 1070 01:06:45,630 --> 01:06:48,210 Bemærke en forskel her med streng2. 1071 01:06:48,210 --> 01:06:51,340 Med streng2, er dette for-løkke lidt anderledes. 1072 01:06:51,340 --> 01:06:55,010 >> Lad mig slette de nuller, så vi kan tale om dem en anden gang. 1073 01:06:55,010 --> 01:06:57,800 Hvad er anderledes ved for-løkken denne gang? 1074 01:06:59,620 --> 01:07:01,670 Jeg kan gå tilbage til det foregående eksempel. 1075 01:07:01,670 --> 01:07:08,580 Så det er version 2, det er version 1. 1, 2. 1076 01:07:08,580 --> 01:07:11,980 1, 2. 1077 01:07:13,520 --> 01:07:16,660 Det strlen opkald er hvor? 1078 01:07:16,660 --> 01:07:18,860 Det er i den første del af for-løkken. 1079 01:07:18,860 --> 01:07:21,830 Nogen tanker om, hvorfor jeg gør det? Yeah. 1080 01:07:21,830 --> 01:07:24,560 [Studerende] Så du behøver ikke kalde funktionen hver eneste gang. 1081 01:07:24,560 --> 01:07:26,440 [Malan] Så vi ikke kalde funktionen hver eneste gang. Præcis. 1082 01:07:26,440 --> 01:07:28,300 Genopkald fra efter sløjfer, at de er super simpelt 1083 01:07:28,300 --> 01:07:31,770 når du slags forstå, at dette er initialiseringen, tilstanden, og opdateringen. 1084 01:07:31,770 --> 01:07:34,750 Problemet er, at betingelsen sker på hver iteration af sløjfen. 1085 01:07:34,750 --> 01:07:40,010 Og så i dette eksempel her, er hvad dårligt om det faktum, at dette er min tilstand? 1086 01:07:40,010 --> 01:07:41,830 [Studerende] Kalder du strlen. 1087 01:07:41,830 --> 01:07:44,340 [Malan] Kalder du strlen igen og igen og igen. 1088 01:07:44,340 --> 01:07:47,410 Men når jeg har indtastet i David, længden af ​​denne streng er 5, 1089 01:07:47,410 --> 01:07:49,650 og det kommer ikke til at ændre sig på hver iteration af løkken 1090 01:07:49,650 --> 01:07:51,670 fordi strengen stadig D-a-v-i-d. 1091 01:07:51,670 --> 01:07:55,320 Så dette er en antydning af, hvad der kommer til at blive et stadigt vigtigere idé 1092 01:07:55,320 --> 01:08:00,410 kendt som et design afgørelse, når bare ikke gøre computeren gøre unødvendigt arbejde. 1093 01:08:00,410 --> 01:08:03,920 >> Ligesom et smugkig på pset2, pset2 i standard udgave 1094 01:08:03,920 --> 01:08:07,030 vil udfordre dig til rent faktisk at gennemføre nogle flere ciphers, 1095 01:08:07,030 --> 01:08:10,410 nogle antallet af krypteringsalgoritmer, så du både kan kryptere 1096 01:08:10,410 --> 01:08:13,840 og dekryptere hemmelige beskeder meget som den Ralphie der afkodes. 1097 01:08:13,840 --> 01:08:16,810 I hacker udgave af pset2, vi kommer til at gå lidt videre. 1098 01:08:16,810 --> 01:08:19,649 Vi kommer til at hånd du en fil fra et egentligt edb-system 1099 01:08:19,649 --> 01:08:23,479 , der indeholder en hel masse brugernavne og faktiske krypterede passwords, 1100 01:08:23,479 --> 01:08:26,939 og udfordringen for hacker-udgave vil være at knække disse adgangskoder 1101 01:08:26,939 --> 01:08:33,200 og finde ud af hvad kryptering eller hvad hemmelighed blev brugt til rent faktisk at generere disse passwords. 1102 01:08:33,200 --> 01:08:36,109 Og vi vil gøre dette ved hjælp af en ny funktion her for C 1103 01:08:36,109 --> 01:08:40,630 jeg vil give dig bare en demo af kendt som kommandolinjeargumenter. 1104 01:08:40,630 --> 01:08:44,229 Det viser sig, som nogle af jer måske har set i afsnit eller i lærebøger, 1105 01:08:44,229 --> 01:08:48,260 main ikke altid behøver at være ugyldig i parentes. 1106 01:08:48,260 --> 01:08:52,430 Det viser sig, at main også kan skrives på denne måde, med to argumenter, 1107 01:08:52,430 --> 01:08:56,870 argc og argv, hvor argc er antallet af ord 1108 01:08:56,870 --> 01:09:00,020 at du skriver efter programmets navn på din kommandolinje 1109 01:09:00,020 --> 01:09:03,420 og argv er de faktiske ord. 1110 01:09:03,420 --> 01:09:07,540 Og da de firkantede parenteser dér antyder, argv er tilsyneladende et array. 1111 01:09:07,540 --> 01:09:12,210 Det kommer til at være en streng efter en streng efter en streng i hukommelsen. 1112 01:09:12,210 --> 01:09:16,010 >> Så det vi vil være i stand til at gøre startende med Pset 2 er noget som dette. 1113 01:09:16,010 --> 01:09:21,350 Hvis jeg laver argv1, som er et eksempel, vi vil vende tilbage til på mandag, og kør det, 1114 01:09:21,350 --> 01:09:23,370 bemærke, at det ikke synes at gøre noget endnu. 1115 01:09:23,370 --> 01:09:25,490 Det bare udskriver sit eget navn. 1116 01:09:25,490 --> 01:09:31,479 Men hvis jeg siger farvel klasse, meddelelse om, at dette program tilsyneladende gentager 1117 01:09:31,479 --> 01:09:35,479 over hver af de ord, der blev skrevet ved prompten. 1118 01:09:35,479 --> 01:09:41,630 Og de måder, som vi vil få adgang til ord, som brugeren har indtastet ved prompten 1119 01:09:41,630 --> 01:09:49,160 er ved at ændre main starter i denne weekend fra int main (void) til int main (argc, argv) 1120 01:09:49,160 --> 01:09:52,050 og vil således blive født kommandolinjeargumenter. 1121 01:09:52,050 --> 01:09:57,100 Og når du får virkelig sofistikeret på dette, vil du være i stand til at skrive virkelig trippy programmer 1122 01:09:57,100 --> 01:09:59,610 som denne her, der går ud over 1123 01:09:59,610 --> 01:10:03,940 nogle af de funktioner, vi har gjort hidtil, men alle ganske kraftige. 1124 01:10:03,940 --> 01:10:08,950 >> Så vi vil forlade dette med dette på skærmen, og vi vil se dig på mandag. 1125 01:10:17,570 --> 01:10:20,000 >> [CS50.TV]