1 00:00:00,000 --> 00:00:10,982 2 00:00:10,982 --> 00:00:11,940 DAVID MALAN: Okej. 3 00:00:11,940 --> 00:00:16,470 Så detta är CS50, och detta är nu i början av vecka tre. 4 00:00:16,470 --> 00:00:19,960 >> Så fram till nu, vi har skrivit program i C 5 00:00:19,960 --> 00:00:23,210 att se lite något som detta här. 6 00:00:23,210 --> 00:00:25,470 Så vi har ett par skarp innefattar upptill. 7 00:00:25,470 --> 00:00:28,490 Vi har int, huvud, tomrum, och då något att göra i mitten, 8 00:00:28,490 --> 00:00:30,590 viss bit kod inuti av denna funktion. 9 00:00:30,590 --> 00:00:34,170 Men nyckeln har varit det faktum att Vi har sagt tomrum här. 10 00:00:34,170 --> 00:00:39,320 Så ogiltiga, all denna tid, anger att detta program, när det körs, 11 00:00:39,320 --> 00:00:41,300 kan endast köras via dess namn. 12 00:00:41,300 --> 00:00:46,330 Du kan inte skriva något annat ord eller siffror efter programmets namn när 13 00:00:46,330 --> 00:00:46,830 kör den. 14 00:00:46,830 --> 00:00:51,200 Så, till exempel om programmet var sammanställs i en fil som heter hej, 15 00:00:51,200 --> 00:00:53,480 du kunde göra ./hello, men det är det. 16 00:00:53,480 --> 00:00:56,750 >> Det enda sättet som du kan bidra till detta program 17 00:00:56,750 --> 00:00:57,960 är genom att ringa en funktion. 18 00:00:57,960 --> 00:00:59,790 Till exempel, vad funktion har vi använt hittills 19 00:00:59,790 --> 00:01:00,950 att få input från användaren? 20 00:01:00,950 --> 00:01:02,117 >> PUBLIK: Få sträng. 21 00:01:02,117 --> 00:01:04,700 DAVID MALAN: För att få strängen, eller får int, eller du har sett andra, 22 00:01:04,700 --> 00:01:07,630 även om du inte har använt dem ännu, som blir lång, lång och liknande. 23 00:01:07,630 --> 00:01:09,380 Men anta att vi egentligen vill starta 24 00:01:09,380 --> 00:01:12,760 skriva program som är lite mer mångsidig, och, ärligt talat, lite mer 25 00:01:12,760 --> 00:01:15,090 liksom de kommandon som du har varit att få, förhoppningsvis, 26 00:01:15,090 --> 00:01:16,550 lite vana vid. 27 00:01:16,550 --> 00:01:18,560 Liksom cd utrymme Dropbox. 28 00:01:18,560 --> 00:01:20,800 Detta, naturligtvis, förändringar din katalog, förutsatt 29 00:01:20,800 --> 00:01:23,590 du är i John Harvard hem katalog, till din Dropbox-mapp. 30 00:01:23,590 --> 00:01:27,380 Under tiden ett kommando som detta skapar en ny katalog som heter pset2, 31 00:01:27,380 --> 00:01:30,290 som ni kanske redan har eller kommer snart att problemet satt två. 32 00:01:30,290 --> 00:01:33,970 Gör Hej, naturligtvis, är ett kommando som bygger ett program som heter hello 33 00:01:33,970 --> 00:01:35,770 från en fil som heter hej dot c. 34 00:01:35,770 --> 00:01:39,140 Och i vart och ett av dessa fall nu, vi har haft 35 00:01:39,140 --> 00:01:43,620 ger ett argument på den så kallade kommandoraden, den blinkande prompten 36 00:01:43,620 --> 00:01:48,540 så att göra vet vad man ska bygga, och så att mkdir vet vad mapp för att skapa, 37 00:01:48,540 --> 00:01:51,110 och så att cd vet där du vill gå. 38 00:01:51,110 --> 00:01:54,720 Men fram till nu, vi fortsätter att säga det viktigaste, din standardfunktion, 39 00:01:54,720 --> 00:01:58,500 har en hålrums uttryck insidan av dessa parenteser, 40 00:01:58,500 --> 00:02:01,250 vilket innebär att den kan inte ta några argument. 41 00:02:01,250 --> 00:02:03,240 >> Så från och med idag, vad vi ska göra 42 00:02:03,240 --> 00:02:06,270 är, ska vi börja stödja saker som detta ännu. 43 00:02:06,270 --> 00:02:08,990 Faktum är att i det här fallet, som ni vanligtvis inte manuellt skriva, 44 00:02:08,990 --> 00:02:11,130 Gör har gjort detta för oss, det finns inte 45 00:02:11,130 --> 00:02:15,840 en men en, två, tre ytterligare strängar efter programmets namngiven 46 00:02:15,840 --> 00:02:16,850 klang. 47 00:02:16,850 --> 00:02:18,240 Så hur ska vi uppnå detta? 48 00:02:18,240 --> 00:02:20,260 >> Tja, med start idag, i de fall där vi vill 49 00:02:20,260 --> 00:02:22,855 att ge input via så kallad kommandoraden, 50 00:02:22,855 --> 00:02:24,980 vi ska börja lägga här vad som finns i yellow-- 51 00:02:24,980 --> 00:02:30,520 ersätta tomrummet med int argc kommatecken string argv öppen konsol nära fästet. 52 00:02:30,520 --> 00:02:32,520 Nu är det här intressant för ett par anledningar. 53 00:02:32,520 --> 00:02:35,690 Ett, det kommer att låta oss skriva program som är lite mer dynamiskt. 54 00:02:35,690 --> 00:02:37,570 Men, mer tvingande, det kommer att öppna upp 55 00:02:37,570 --> 00:02:40,340 nu en konversation som till vad arrayer kan verkligen 56 00:02:40,340 --> 00:02:43,300 användas, till vilken en sträng verkligen är under huven, 57 00:02:43,300 --> 00:02:47,320 till nästa vecka när vi börjar dyka i ännu djupare på hur maskinen är 58 00:02:47,320 --> 00:02:48,590 gör allt det här arbetet. 59 00:02:48,590 --> 00:02:51,920 Men för nu, låt oss dra, kanske en bild. 60 00:02:51,920 --> 00:02:54,950 >> När du skriver ett program med huvud deklarerade 61 00:02:54,950 --> 00:02:58,810 på detta sätt, så att huvud tar två argument, en int 62 00:02:58,810 --> 00:03:03,233 och-- vilken datatyp är det andra argumentet? 63 00:03:03,233 --> 00:03:04,529 >> PUBLIKEN: Array. 64 00:03:04,529 --> 00:03:05,320 DAVID MALAN: Array. 65 00:03:05,320 --> 00:03:09,170 Så det ser ut vid första anblicken ut att vara en sträng, men märker hakparenteserna. 66 00:03:09,170 --> 00:03:12,760 Minns förra gången vi införde föreställningen om en array. 67 00:03:12,760 --> 00:03:16,210 Och arrayer använder hakparenteser i ett par sammanhang. 68 00:03:16,210 --> 00:03:19,160 Du kan använda torget parentes för att gå in i en matris 69 00:03:19,160 --> 00:03:22,710 och få ett visst element, som konsol 0 eller konsol 1 eller konsol 2. 70 00:03:22,710 --> 00:03:25,500 Men vi såg, om kortvarigt, förra veckan att man även 71 00:03:25,500 --> 00:03:28,790 använda dessa hakparenteser till förklara storleken på en matris, 72 00:03:28,790 --> 00:03:31,790 om du vet i förväg hur många Ints eller hur många strängar eller vad du 73 00:03:31,790 --> 00:03:32,630 faktiskt vill. 74 00:03:32,630 --> 00:03:34,790 Så visar det sig att det finns en tredje kontext här 75 00:03:34,790 --> 00:03:37,890 som inte har någon numrerar insida av hakparenteserna. 76 00:03:37,890 --> 00:03:41,920 När du anger, som jag har här, namnet på något liknande argv, 77 00:03:41,920 --> 00:03:44,550 som är bara ett finare sätt att säger argumentet vektor, vilken 78 00:03:44,550 --> 00:03:47,750 är ett annat fint sätt att säger en array med argument, 79 00:03:47,750 --> 00:03:50,870 öppen fäste stäng fäste bara innebär att du inte nödvändigtvis 80 00:03:50,870 --> 00:03:52,960 i förväg veta hur stor arrayen kommer att bli, 81 00:03:52,960 --> 00:03:55,070 men du vet att det kommer att vara en array. 82 00:03:55,070 --> 00:03:57,320 Så om du inte känner till nummer inte lägga den där, 83 00:03:57,320 --> 00:04:01,160 för öppen konsol nära fästet innebär att argv inte är en sträng, 84 00:04:01,160 --> 00:04:03,124 men en array av strängar. 85 00:04:03,124 --> 00:04:05,040 Så syntaktiskt, om du tänker tillbaka förra veckan, 86 00:04:05,040 --> 00:04:09,460 Det är mycket likt att säga något som int åldrar öppna fäste, 87 00:04:09,460 --> 00:04:10,984 och sedan något därefter. 88 00:04:10,984 --> 00:04:12,150 Så hur ser det här ut som? 89 00:04:12,150 --> 00:04:13,399 Låt oss faktiskt rita en bild. 90 00:04:13,399 --> 00:04:18,756 Så när du kör det här programmet med huvud att ha två argument definieras inuti 91 00:04:18,756 --> 00:04:21,339 av dessa parenteser, du väsentligen har minst två bitar 92 00:04:21,339 --> 00:04:23,560 minne överlämnas till dig under huven. 93 00:04:23,560 --> 00:04:26,550 Ett, som jag ska drar som denna rektangel, kommer att kallas argc. 94 00:04:26,550 --> 00:04:30,645 Och precis som en snabb resumé, vad är datatyp argc? 95 00:04:30,645 --> 00:04:31,270 Så det är en int. 96 00:04:31,270 --> 00:04:33,480 Så ett antal går att gå in argc-- varv 97 00:04:33,480 --> 00:04:35,660 ut som står för argument räknas. 98 00:04:35,660 --> 00:04:38,887 Under tiden har jag dragit argv som en matris. 99 00:04:38,887 --> 00:04:40,970 Och jag vet inte riktigt hur lång tid det kommer att bli, 100 00:04:40,970 --> 00:04:42,470 så för dagens ändamål dot dot dot. 101 00:04:42,470 --> 00:04:43,636 Det kan komma en del längd. 102 00:04:43,636 --> 00:04:45,640 Men jag har på bilden åtminstone fyra rektanglar. 103 00:04:45,640 --> 00:04:50,970 Så argv en bit av minne som lagrar sträng sträng sträng dot dot dot, 104 00:04:50,970 --> 00:04:53,950 och argc är bara en bit minne för ett heltal. 105 00:04:53,950 --> 00:04:55,710 >> Så nu, låt oss vara lite mer exakt. 106 00:04:55,710 --> 00:04:59,200 Om, när jag har strängar i denna matris, som kallas 107 00:04:59,200 --> 00:05:03,290 argv, jag vill komma åt dem individuellt, precis som förra veckan, 108 00:05:03,290 --> 00:05:05,670 vi kommer att använda notation liknande argv bygel 0 109 00:05:05,670 --> 00:05:07,650 att få den första som en array. 110 00:05:07,650 --> 00:05:10,440 Argv fäste 1 för att få den andra saken, och så vidare. 111 00:05:10,440 --> 00:05:14,597 Det viktigaste här är vi fortfarande 0 indexed-- vi fortfarande räkna från 0. 112 00:05:14,597 --> 00:05:16,430 Så nu ska vi faktiskt sätta något i detta. 113 00:05:16,430 --> 00:05:21,670 Om jag skulle sammanställa ett program som kallas Hej från en fil som heter hej dot c, 114 00:05:21,670 --> 00:05:24,340 och då jag kör det programmet med dot snedstreck Hej, 115 00:05:24,340 --> 00:05:28,380 vad gör min dator, min laptop, se ut under huven 116 00:05:28,380 --> 00:05:31,300 nu jag kör dot slash hej och tryck Enter? 117 00:05:31,300 --> 00:05:33,500 Nåväl, detta är kanske vad vi skulle kunna beskriva 118 00:05:33,500 --> 00:05:37,010 som innehållet i datorns minne, eller RAM-- Random Access Memory. 119 00:05:37,010 --> 00:05:40,330 Med andra ord, om datorn, något för dig magiskt, 120 00:05:40,330 --> 00:05:45,360 sätter nummer 1 i argc, AKA argcount, och det sätter bokstav strängen 121 00:05:45,360 --> 00:05:48,200 ./hello i argv bygel 0. 122 00:05:48,200 --> 00:05:51,750 Jag har ingen aning, ärligt talat, vad är i argv fäste 1 eller 2 eller 3, 123 00:05:51,750 --> 00:05:55,550 för om användaren har inte skrivit någonting förutom ./hello, 124 00:05:55,550 --> 00:05:58,550 vi kommer att anta att dessa är mest sannolika skräp värden, 125 00:05:58,550 --> 00:05:59,700 så att säga. 126 00:05:59,700 --> 00:06:02,650 Dessa bitar av minnet finns, men det är inte upp till oss 127 00:06:02,650 --> 00:06:05,710 att titta på dem, eftersom den argcount finns bara en. 128 00:06:05,710 --> 00:06:07,870 >> Nu, under tiden, om jag skriver kör ett annat program, 129 00:06:07,870 --> 00:06:12,250 CD, vilket är mer korrekt ett kommando, i ditt blinkande prompt-- cd utrymme 130 00:06:12,250 --> 00:06:17,200 Dropbox-- när jag kör det, på ett effektivt sätt, när cd programmet körs, argc, 131 00:06:17,200 --> 00:06:22,270 insidan av datorns minne, är för mest kortaste andra siffran 2. 132 00:06:22,270 --> 00:06:25,936 Och sedan argv fäste o har cd, argv fäste 1 har Dropbox, 133 00:06:25,936 --> 00:06:28,560 och då naturligtvis kommandot avslutar, så allt detta minne 134 00:06:28,560 --> 00:06:30,420 huvudsak går bort och används för något annat. 135 00:06:30,420 --> 00:06:32,270 Och det är därför jag säger bara en bråkdels sekund. 136 00:06:32,270 --> 00:06:35,720 >> Under tiden, om vi gör mkdir pset2, bilden ser nästan samma, 137 00:06:35,720 --> 00:06:37,900 men med olika strängar inne argv. 138 00:06:37,900 --> 00:06:42,570 Om jag gör klang streck hello hello dot c, samma idé. 139 00:06:42,570 --> 00:06:47,060 Mer saker fylls i för argv och argc, naturligtvis, är fyra. 140 00:06:47,060 --> 00:06:49,150 Så med andra ord, även om denna array 141 00:06:49,150 --> 00:06:52,950 kanske dot dot dot, av något variabel längd, så att säga, 142 00:06:52,950 --> 00:06:56,720 du alltid vet var i slutet av den är, eftersom argc kommer att berätta för dig 143 00:06:56,720 --> 00:07:00,120 vid vilken tidpunkt du måste sluta tittar på element i argv. 144 00:07:00,120 --> 00:07:03,660 Du kan bara titta på fyra totalt i detta fall. 145 00:07:03,660 --> 00:07:06,600 >> Så låt oss nu ta en titt på, kanske, ett enkelt program. 146 00:07:06,600 --> 00:07:09,070 En som bara säger hej till någon som Zamyla. 147 00:07:09,070 --> 00:07:12,620 Så jag hävdar jag ska skriva ett program på bara ett ögonblick via vilket jag kunde göra 148 00:07:12,620 --> 00:07:16,670 ./hello utrymme Zamyla, och då jag vill ha mitt program för att skriva ut något 149 00:07:16,670 --> 00:07:18,520 super enkelt som "Hej, Zamyla." 150 00:07:18,520 --> 00:07:20,100 Nu i det förflutna som vi har använt getString. 151 00:07:20,100 --> 00:07:22,850 Så i det förflutna, även om du är ny till programmering, 152 00:07:22,850 --> 00:07:27,180 oddsen är att du kan piska upp en program som använder getString 153 00:07:27,180 --> 00:07:29,390 och sedan använder printf att säga hej till Zamyla. 154 00:07:29,390 --> 00:07:31,290 Men låt oss inte använda GetString här gången. 155 00:07:31,290 --> 00:07:37,510 Låt mig i stället gå in i Appliant och inkluderar standard I O dot h. 156 00:07:37,510 --> 00:07:41,160 Låt mig också inkludera CS50 dot h. 157 00:07:41,160 --> 00:07:44,730 Nu int main, och nu är jag kommer inte att göra ogiltiga idag. 158 00:07:44,730 --> 00:07:51,200 Istället kommer jag att göra int argc string argv öppen fäste stäng fäste, 159 00:07:51,200 --> 00:07:52,640 inte ange ett nummer. 160 00:07:52,640 --> 00:07:54,644 Och nu här är min så kallade att göra. 161 00:07:54,644 --> 00:07:57,560 Vad jag ska göra nu är, jag är kommer att göra lite av ett språng i tro, 162 00:07:57,560 --> 00:08:00,560 Jag kommer att anta att användarens kommer att använda det här programmet på rätt sätt, 163 00:08:00,560 --> 00:08:04,980 och jag bara går till gör printf hej,% sn. 164 00:08:04,980 --> 00:08:06,630 Så inget nytt där. 165 00:08:06,630 --> 00:08:11,470 Men jag vill nu lägga allt vad ordet det användartyper efter programmets namn. 166 00:08:11,470 --> 00:08:16,970 Så om jag gör ./hello utrymme Zamyla, jag vill på något sätt prog tillgång 167 00:08:16,970 --> 00:08:20,870 citera unquote "Zamyla." så jag kan gå in i min argumentation vektor, 168 00:08:20,870 --> 00:08:25,980 min array med strängar, och om kommandot, återigen, var ./hello utrymme Zamyla, 169 00:08:25,980 --> 00:08:29,340 vilket nummer jag vill ha att sätta i argv här? 170 00:08:29,340 --> 00:08:29,840 PUBLIKEN: 1. 171 00:08:29,840 --> 00:08:32,355 DAVID MALAN: 1, eftersom fäste 0 visar sig 172 00:08:32,355 --> 00:08:34,230 kommer att bli den programmets namn, som vi såg. 173 00:08:34,230 --> 00:08:37,789 Så fäste 1 är det första ordet att jag som användare har skrivit. 174 00:08:37,789 --> 00:08:39,559 Jag kommer att gå vidare och spara denna. 175 00:08:39,559 --> 00:08:42,830 Jag kommer att gå in i min mapp där jag har placerat den här filen. 176 00:08:42,830 --> 00:08:44,920 Jag kommer att göra göra hello 3. 177 00:08:44,920 --> 00:08:46,230 Comp IO är OK. 178 00:08:46,230 --> 00:08:51,380 ./hello Zamyla Enter. 179 00:08:51,380 --> 00:08:54,480 Vad gjorde jag för fel? 180 00:08:54,480 --> 00:08:57,270 Jag blev överraskade mig själv för en stund där. 181 00:08:57,270 --> 00:08:58,230 Vad gjorde jag för fel? 182 00:08:58,230 --> 00:08:59,220 >> PUBLIKEN: Namn. 183 00:08:59,220 --> 00:09:01,767 >> DAVID MALAN: Filens faktiskt kallas hello3.c. 184 00:09:01,767 --> 00:09:03,850 Och jag gjorde det bara för enhetlighet, eftersom vi har 185 00:09:03,850 --> 00:09:06,550 hade hej.c si tidigare i online koden. 186 00:09:06,550 --> 00:09:11,550 Så låt oss fixa detta ./hello bygel streck 3 Zamyla. 187 00:09:11,550 --> 00:09:12,370 Enter. 188 00:09:12,370 --> 00:09:14,030 Och nu har vi hej, Zamyla. 189 00:09:14,030 --> 00:09:17,650 Under tiden kan jag ändra detta till vara Rob, eller egentligen något annat ord. 190 00:09:17,650 --> 00:09:19,230 >> Men låt oss betrakta ett hörn fall. 191 00:09:19,230 --> 00:09:24,360 Vad kan du förvänta dig kommer att hända om Jag inte skriver någons namn alls? 192 00:09:24,360 --> 00:09:25,270 >> PUBLIKEN: Fel. 193 00:09:25,270 --> 00:09:27,300 >> DAVID MALAN: Ett fel av något slag, kanske. 194 00:09:27,300 --> 00:09:28,200 Låt oss se. 195 00:09:28,200 --> 00:09:29,440 Enter. 196 00:09:29,440 --> 00:09:30,210 Null. 197 00:09:30,210 --> 00:09:33,870 Så printf faktiskt vara lite skyddande av oss 198 00:09:33,870 --> 00:09:38,131 Här, och bokstavligen skriva ut öppna Paren null, men ännu värre saker kan hända. 199 00:09:38,131 --> 00:09:40,130 Och bara för att visa att något som du absolut 200 00:09:40,130 --> 00:09:42,800 inte bör göra, låt oss gå in här och börja peta runt. 201 00:09:42,800 --> 00:09:43,300 Rätt? 202 00:09:43,300 --> 00:09:46,410 Om jag vet att bilden minnet är i huvudsak denna, 203 00:09:46,410 --> 00:09:52,660 argv fäste 1 har Zamyla, argv fäste 0 har ./hello eller ./hello-3. 204 00:09:52,660 --> 00:09:55,400 Vad finns i konsolen 2? 205 00:09:55,400 --> 00:09:58,210 Så jag kan svara på det ifrågasätta mig själv, eller hur? 206 00:09:58,210 --> 00:10:00,460 Jag kan bara ändra 1 till 2. 207 00:10:00,460 --> 00:10:07,270 Jag kan nu kompilera hello 3, ./hello3 Låt oss zooma in och tryck på Retur. 208 00:10:07,270 --> 00:10:08,270 Whoops. 209 00:10:08,270 --> 00:10:10,660 Ingen citattecken. 210 00:10:10,660 --> 00:10:12,540 Intressant. 211 00:10:12,540 --> 00:10:15,530 Så det är ganska coolt att se vad annat är här. 212 00:10:15,530 --> 00:10:17,130 >> Så vad är inne i min laptop? 213 00:10:17,130 --> 00:10:20,390 Låt oss spara den med fäste 3. 214 00:10:20,390 --> 00:10:25,190 Gör hello3, ./hello-3. 215 00:10:25,190 --> 00:10:26,500 Nyfiken. 216 00:10:26,500 --> 00:10:30,560 Och nu ska vi få riktigt bold-- 50. 217 00:10:30,560 --> 00:10:34,340 Så det är verkligen dyka djupt i datorns minne. 218 00:10:34,340 --> 00:10:35,930 50 index in. 219 00:10:35,930 --> 00:10:41,950 Så gör hello 3 ./hello-3. 220 00:10:41,950 --> 00:10:42,680 Nyfiken. 221 00:10:42,680 --> 00:10:44,660 Okej, nu är jag bara kommer att få vårdslös. 222 00:10:44,660 --> 00:10:47,331 Låt oss gå till 5.000. 223 00:10:47,331 --> 00:10:47,830 Okej. 224 00:10:47,830 --> 00:10:49,520 Så låt mig kompilera. 225 00:10:49,520 --> 00:10:51,460 Gör hello3, ./hello-3. 226 00:10:51,460 --> 00:10:55,780 227 00:10:55,780 --> 00:10:56,460 OK. 228 00:10:56,460 --> 00:10:59,250 Nu några av er, det kanske vara en glödlampa gick av. 229 00:10:59,250 --> 00:11:01,900 Hur många av er har sett detta meddelande förut? 230 00:11:01,900 --> 00:11:03,440 OK. 231 00:11:03,440 --> 00:11:04,420 Så, varför? 232 00:11:04,420 --> 00:11:07,250 >> Odds är-- och det finns olika saker som kan orsaka detta, 233 00:11:07,250 --> 00:11:09,730 och tydligt att du är i god company-- vi har tydligt 234 00:11:09,730 --> 00:11:11,900 orsakade vad som kallas en segmentering fel. 235 00:11:11,900 --> 00:11:15,890 Och lång historia kort för idag, jag har berört ett segment av minne 236 00:11:15,890 --> 00:11:17,060 att jag inte borde ha. 237 00:11:17,060 --> 00:11:19,970 Om ett segment betyder bara en bit minne som jag inte borde ha. 238 00:11:19,970 --> 00:11:25,530 Nu garanterar dator som om jag köra ./helloZamyla att jag kan röra argv 239 00:11:25,530 --> 00:11:27,760 vara fästet 0 och argv fäste 1. 240 00:11:27,760 --> 00:11:32,730 Men argc är värdet 2, betyder att jag är Endast allowed-- det är typ av äran 241 00:11:32,730 --> 00:11:35,180 system-- röra fäste 0 och fäste 1. 242 00:11:35,180 --> 00:11:37,990 Om jag går något längre, det finns absolut kommer att vara minnet där. 243 00:11:37,990 --> 00:11:40,660 Lagda Min RAM fysiskt i datorn. 244 00:11:40,660 --> 00:11:42,080 Men vem vet vad som finns där? 245 00:11:42,080 --> 00:11:44,450 Faktiskt, jag kör flera program på en gång. 246 00:11:44,450 --> 00:11:46,910 Jag kanske har seen-- om jag inte göra detta på Appliant 247 00:11:46,910 --> 00:11:49,937 men på min Mac eller PC-- jag kanske har sett innehållet i ett e-post. 248 00:11:49,937 --> 00:11:52,270 Jag kanske har sett en omedelbar budskap Jag har nyligen skickats. 249 00:11:52,270 --> 00:11:55,390 Allt som kan vara dröjande runt i minnet 250 00:11:55,390 --> 00:11:59,180 kunde ha visats genom denna godtyckliga klammer notation. 251 00:11:59,180 --> 00:12:02,850 Eller, ännu värre, kanske du har hittade en av mina lösenord 252 00:12:02,850 --> 00:12:05,859 att jag nyligen hade skrivit in, att en Programmet hade lagrats i minnet som 253 00:12:05,859 --> 00:12:07,900 att autentisera mig, och sedan bara slags lämnat det 254 00:12:07,900 --> 00:12:09,910 i RAM tills jag avslutar det programmet. 255 00:12:09,910 --> 00:12:12,860 >> Och faktiskt, det här är en av faran och en de befogenheter 256 00:12:12,860 --> 00:12:15,980 av att använda ett språk som C. Du har fri tillgång 257 00:12:15,980 --> 00:12:18,860 till hela innehållet av ett program minne, 258 00:12:18,860 --> 00:12:21,340 och vilka skurkar kan göra även i de cases-- 259 00:12:21,340 --> 00:12:23,807 särskilt när vi komma till webbprogrammering 260 00:12:23,807 --> 00:12:26,890 mot slutet av terminen, vi ska besök det här topic-- är rota runt, 261 00:12:26,890 --> 00:12:31,660 potentiellt, är någon dator minne och hitta sådana underliga saker 262 00:12:31,660 --> 00:12:32,570 som vi såg där. 263 00:12:32,570 --> 00:12:36,900 Eller ännu värre ändå, lösenord som han eller hon kan sedan använda för att göra dåliga saker. 264 00:12:36,900 --> 00:12:40,240 >> Så klart jag inte borde ha gjort det här, eftersom konstiga saker börjar hända. 265 00:12:40,240 --> 00:12:42,310 Detta är faktiskt ett program kraschar. 266 00:12:42,310 --> 00:12:44,580 Detta skulle motsvara Mac OS eller Windows 267 00:12:44,580 --> 00:12:46,770 ett programfönster bara försvinna. 268 00:12:46,770 --> 00:12:48,300 Ett oväntat fel har uppstått. 269 00:12:48,300 --> 00:12:50,840 På kommandoraden miljö Vi ser ut ungefär så här. 270 00:12:50,840 --> 00:12:54,480 Men det är därför, är att jag helt enkelt röra minne som inte tillhör mig. 271 00:12:54,480 --> 00:12:57,090 >> Så låt oss försvara mot detta en lite på ett annat sätt 272 00:12:57,090 --> 00:12:59,010 genom att titta på det här programmet här. 273 00:12:59,010 --> 00:13:01,000 Så, återigen, skelettet som vi såg earlier-- 274 00:13:01,000 --> 00:13:02,480 och jag har markerat denna gång int. 275 00:13:02,480 --> 00:13:05,900 Och hela denna tid huvud har faktiskt return värde. 276 00:13:05,900 --> 00:13:09,120 Även om det i de flesta av våra föredrag exempel vi har aldrig en gång använts 277 00:13:09,120 --> 00:13:10,990 tillbaka något i main. 278 00:13:10,990 --> 00:13:13,710 Vi skriver bara printf stäng klammerparentes och det är det. 279 00:13:13,710 --> 00:13:16,500 Men gratis, vad kompilator gjort för dig, 280 00:13:16,500 --> 00:13:19,510 effektivt, återvänder 0 för dig. 281 00:13:19,510 --> 00:13:22,950 Slår out-- och det är lite counterintuitive-- att 0 är bra. 282 00:13:22,950 --> 00:13:24,690 Det betyder inte att falskt per se. 283 00:13:24,690 --> 00:13:29,080 0 är bra, och alla icke-0 värde, har världen beslutat, 284 00:13:29,080 --> 00:13:30,619 kan betyda ett fel. 285 00:13:30,619 --> 00:13:32,910 Så om du någonsin har trasslat upp något på din dator, 286 00:13:32,910 --> 00:13:36,600 eller ett program har just dött på dig och du har fått en del felaktiga fönster 287 00:13:36,600 --> 00:13:40,360 på skärmen, säger fel negativ 49 eller fel 23-- 288 00:13:40,360 --> 00:13:44,170 några till synes godtyckligt value-- som är eftersom en programmerare har hårdkodad 289 00:13:44,170 --> 00:13:49,370 ett värde som negativt 49 eller positivt 23 för att representera valfritt antal, vågar säga, 290 00:13:49,370 --> 00:13:53,340 4 miljarder möjliga saker som kan gå fel i ett program. 291 00:13:53,340 --> 00:13:55,700 >> Så hur kan jag ta Fördelen med detta själv? 292 00:13:55,700 --> 00:13:58,970 Nåväl, låt mig öppna ett program som jag skrev i förväg, 293 00:13:58,970 --> 00:14:01,450 och rota runt på nätet som heter hello 4. 294 00:14:01,450 --> 00:14:05,650 Och det är nästan identiska, förutom att dess fått en liten bit av felkontroll. 295 00:14:05,650 --> 00:14:09,660 I det här fallet har jag återigen förklarade Huvud som att ta två argument, 296 00:14:09,660 --> 00:14:13,180 men denna gång, på linje 17, tillkännagivande Jag gör lite av en sanity check. 297 00:14:13,180 --> 00:14:17,100 Jag ser till att argc lika lika med 2. 298 00:14:17,100 --> 00:14:18,960 För om det är att betyder att jag kan säkert 299 00:14:18,960 --> 00:14:21,420 Rör inte bara konsolen 0, men konsolen 1. 300 00:14:21,420 --> 00:14:24,330 Och jag gå vidare och skriva ut, i det här fallet, Zamyla eller Rob 301 00:14:24,330 --> 00:14:26,020 eller vad ord jag skrivit ut. 302 00:14:26,020 --> 00:14:28,020 Och nu bara för att få lite mer korrekt, 303 00:14:28,020 --> 00:14:31,910 Jag ska uttryckligen återvända 0 att betyda allt är bra. 304 00:14:31,910 --> 00:14:33,300 Inget dåligt hände. 305 00:14:33,300 --> 00:14:38,590 >> Men av konvention, kommer jag att returnera 1, eller ärligt talat alla icke-0 värde, 306 00:14:38,590 --> 00:14:40,160 om något gick fel. 307 00:14:40,160 --> 00:14:43,270 Nu användaren inte kommer att verkligen märker vad som händer. 308 00:14:43,270 --> 00:14:50,410 Faktiskt om jag går in i den här katalogen, vi zooma in och gör hello 4, 309 00:14:50,410 --> 00:14:54,210 ./hello-4 Zamyla uppför sig som jag förväntar mig. 310 00:14:54,210 --> 00:14:58,570 Men om jag istället inte skriva någonting, ingenting verkar hända, 311 00:14:58,570 --> 00:14:59,680 men inte kraschar. 312 00:14:59,680 --> 00:15:04,660 Och om jag i stället göra något som Rob är en proctor 313 00:15:04,660 --> 00:15:07,550 i Thayer-- delning godtycklig information. 314 00:15:07,550 --> 00:15:13,680 Men varsel, argv 1, 2, 3, 4, och 5 ska nu finnas i minnet. 315 00:15:13,680 --> 00:15:16,540 Det är också inte vad mitt program förväntar sig, 316 00:15:16,540 --> 00:15:20,300 eftersom jag har kontrollerat om argc lika jämlikar 2 eller inte. 317 00:15:20,300 --> 00:15:22,140 Så jag nu försvarar mot detta. 318 00:15:22,140 --> 00:15:25,290 >> Nu, som en sidoreplik, vi programmer-- eller snarare vi den users-- 319 00:15:25,290 --> 00:15:29,670 aldrig se att 0 eller 1 men med användning av en verktyg som kallas Debugger, eller andra verktyg, 320 00:15:29,670 --> 00:15:32,250 som vi får se innan länge, du programmeraren 321 00:15:32,250 --> 00:15:36,590 kan faktiskt se vad som kan vara går fel inne i ditt program. 322 00:15:36,590 --> 00:15:39,170 >> Så, några frågor om argc? 323 00:15:39,170 --> 00:15:40,873 Yeah. 324 00:15:40,873 --> 00:15:45,292 >> PUBLIK: Jag har sett där de har inte haft karaktären, [ohörbart] 325 00:15:45,292 --> 00:15:49,669 sa bara string stjärna d, liksom tecken asterisk kommatecken. 326 00:15:49,669 --> 00:15:50,710 Är de likvärdiga här? 327 00:15:50,710 --> 00:15:51,626 >> DAVID MALAN: De är. 328 00:15:51,626 --> 00:15:55,080 Så frågan är, har du ibland sett program 329 00:15:55,080 --> 00:15:57,270 som denna som inte gör det säga sträng argv bygel 330 00:15:57,270 --> 00:16:01,015 utan i stället säga något liknande char stjärna argv fästet. 331 00:16:01,015 --> 00:16:03,140 Och det finns även andra varianter som du kan se. 332 00:16:03,140 --> 00:16:04,264 De är verkligen likvärdiga. 333 00:16:04,264 --> 00:16:06,240 För nu har vi dessa slags utbildning hjul 334 00:16:06,240 --> 00:16:09,737 på i form av sträng i CS50 bibliotek, men i drygt en vecka 335 00:16:09,737 --> 00:16:12,570 eller så kommer vi att ta bort det obstruktion helt och faktiskt 336 00:16:12,570 --> 00:16:16,820 titta på vad röding och stjärnan är, och hur de avser minnet 337 00:16:16,820 --> 00:16:18,140 representation i allmänhet. 338 00:16:18,140 --> 00:16:19,540 Så vi ska återkomma till det. 339 00:16:19,540 --> 00:16:21,540 >> Övriga frågor om vår argv eller argc? 340 00:16:21,540 --> 00:16:22,397 Yeah. 341 00:16:22,397 --> 00:16:24,438 PUBLIK: Varför tog det tillbaka ett fel [ohörbart]? 342 00:16:24,438 --> 00:16:27,147 343 00:16:27,147 --> 00:16:29,230 DAVID MALAN: Varför gjorde det returnera ett fel only-- oh! 344 00:16:29,230 --> 00:16:31,813 I det tidigare fallet, när vi var futzing runt med minne, 345 00:16:31,813 --> 00:16:35,110 varför tog det bara returnera ett fel när jag skrev verkligen ett stort nummer? 346 00:16:35,110 --> 00:16:36,620 Kort svar är, vi har bara tur. 347 00:16:36,620 --> 00:16:39,240 Generellt sett, en dator allokerar minne i bitar, 348 00:16:39,240 --> 00:16:42,900 och det gav mig en tillräckligt stor bit som Jag kom undan, utan att det märks, 349 00:16:42,900 --> 00:16:46,280 av beröring fäste 2, fäste 3, fäste 50, men så fort jag knuffade 350 00:16:46,280 --> 00:16:49,080 min tur, jag gick förbi gränserna för den bit av minnet 351 00:16:49,080 --> 00:16:50,520 operativsystemet hade gett mig. 352 00:16:50,520 --> 00:16:52,720 Och det är då det klämmas ner och sade nej. 353 00:16:52,720 --> 00:16:54,580 Segmente fel. 354 00:16:54,580 --> 00:16:55,692 Yeah. 355 00:16:55,692 --> 00:16:58,890 >> PUBLIK: Hur fungerar datorn vet värdet av argc? 356 00:16:58,890 --> 00:17:02,390 >> DAVID MALAN: Hur fungerar Datorn vet värdet av argc? 357 00:17:02,390 --> 00:17:07,920 När du kör ett program, det programmet, som på grund av den blinkande prompten 358 00:17:07,920 --> 00:17:11,359 är handed uppsättningen av ord som skrivits 359 00:17:11,359 --> 00:17:13,300 vid prompten, det var skrivit vid prompten. 360 00:17:13,300 --> 00:17:16,569 Och så är det ditt operativsystem system som i huvudsak 361 00:17:16,569 --> 00:17:20,329 fyller huvudsakliga argument för dig. 362 00:17:20,329 --> 00:17:22,829 Så det är en av de tjänster som att du får, typ av hemlighet 363 00:17:22,829 --> 00:17:24,869 under huven av ett operativsystem. 364 00:17:24,869 --> 00:17:27,118 Övriga frågor? 365 00:17:27,118 --> 00:17:27,618 Yeah. 366 00:17:27,618 --> 00:17:29,787 >> PUBLIK: Vad innebär core dump detta? 367 00:17:29,787 --> 00:17:31,370 DAVID MALAN: Vad innebär core dump detta? 368 00:17:31,370 --> 00:17:32,950 Så det är en bra fråga. 369 00:17:32,950 --> 00:17:35,312 Och låt mig gå tillbaka till här katalogen här. 370 00:17:35,312 --> 00:17:37,270 Och du kommer att märka att Jag har en ny fil där. 371 00:17:37,270 --> 00:17:41,670 Det verkligen kallas kärna, och det är faktiskt oftast en skaplig storlek fil. 372 00:17:41,670 --> 00:17:45,300 Det är i huvudsak en ögonblicksbild av innehållet i min programmets minne 373 00:17:45,300 --> 00:17:46,902 eller RAM när den kraschade. 374 00:17:46,902 --> 00:17:49,110 Och det ska vara användbart, potentiellt, diagnostiskt, 375 00:17:49,110 --> 00:17:52,850 när vi talar i en framtida föreläsning och avsnittet om felsökning, 376 00:17:52,850 --> 00:17:55,730 eftersom du faktiskt kan göra det motsvarar ett digitalt obduktion 377 00:17:55,730 --> 00:18:00,300 på den filen för att räkna ut vad du gjorde fel i ditt program. 378 00:18:00,300 --> 00:18:01,220 Yeah. 379 00:18:01,220 --> 00:18:04,450 >> PUBLIK: Är argc ett kommando i själv, eller kan du namnge det något? 380 00:18:04,450 --> 00:18:05,575 >> DAVID MALAN: Bra fråga. 381 00:18:05,575 --> 00:18:08,040 Är argc ett kommando i sig, eller kan du namnge det något? 382 00:18:08,040 --> 00:18:09,290 Det är definitivt inte ett kommando. 383 00:18:09,290 --> 00:18:13,500 Det är helt enkelt en variabels namn eller ett argument namn, 384 00:18:13,500 --> 00:18:15,481 och så absolut vi skulle kunna kalla detta foo, 385 00:18:15,481 --> 00:18:18,480 Vi kan kalla detta bar, som tenderar att vara go-to ord som en dator 386 00:18:18,480 --> 00:18:19,860 forskare går till. 387 00:18:19,860 --> 00:18:22,820 Men av konvention, använder vi argc och argv. 388 00:18:22,820 --> 00:18:25,360 Men det är bara en människa konvention, inget mer. 389 00:18:25,360 --> 00:18:25,860 Okej. 390 00:18:25,860 --> 00:18:28,140 Så visar sig, jag har varit berätta lite av en vit lie-- 391 00:18:28,140 --> 00:18:31,264 och ärligt talat, i framtiden, ser du Vi har sagt till andra vita lögner. 392 00:18:31,264 --> 00:18:33,510 Men för nu, vi ska att skala upp en av dessa. 393 00:18:33,510 --> 00:18:37,310 I det här fallet här när jag tidigare körde ett program som ./hello eller ./hello-3 394 00:18:37,310 --> 00:18:42,780 Zamyla hade vi innehållet i min datorns minne ser ungefär som 395 00:18:42,780 --> 00:18:43,280 detta. 396 00:18:43,280 --> 00:18:45,070 Men minns vad en sträng är. 397 00:18:45,070 --> 00:18:49,279 Vad gjorde vi säga en vecka sedan vad en sträng egentligen är under huven? 398 00:18:49,279 --> 00:18:50,320 PUBLIK: Array av tecken. 399 00:18:50,320 --> 00:18:52,111 DAVID MALAN: Det är en samling av tecken, eller hur? 400 00:18:52,111 --> 00:18:55,760 Så vi kanske har en matris med strängar, men, i sin tur, en sträng 401 00:18:55,760 --> 00:18:57,150 är en samling av tecken. 402 00:18:57,150 --> 00:19:00,010 Så om jag verkligen vill vara anal när jag drar den här bilden, 403 00:19:00,010 --> 00:19:03,290 Jag borde verkligen dra det lite mer så här, 404 00:19:03,290 --> 00:19:08,000 varvid i var och en av dessa index av min argv array, 405 00:19:08,000 --> 00:19:11,432 det är i sig en hel sträng som själv är i en array. 406 00:19:11,432 --> 00:19:13,140 Och nu den vita lögnen Vi säger till idag 407 00:19:13,140 --> 00:19:15,181 är att bilden inte ser ganska så här. 408 00:19:15,181 --> 00:19:19,110 Faktum är de små rutorna är vanligtvis utanför de stora rektanglar 409 00:19:19,110 --> 00:19:19,610 där. 410 00:19:19,610 --> 00:19:21,280 Men vi ska återkomma till det inom kort. 411 00:19:21,280 --> 00:19:25,440 Men detta är ./hello bakstreck 0, att vara den speciella karaktär som 412 00:19:25,440 --> 00:19:28,310 avgränsar änden av en sträng, och vi har en annan efter 413 00:19:28,310 --> 00:19:29,360 Zamyla namn. 414 00:19:29,360 --> 00:19:30,900 Så vad betyder det? 415 00:19:30,900 --> 00:19:33,410 >> Nåväl, låt mig gå vidare och öppna upp två andra exempel 416 00:19:33,410 --> 00:19:35,220 som finns tillgängliga online. 417 00:19:35,220 --> 00:19:40,590 En kallas argv1.c och den andra är argv2. 418 00:19:40,590 --> 00:19:44,260 Det är ett super-enkelt program som skiljer sig från tidigare program 419 00:19:44,260 --> 00:19:47,260 i det nu jag använder argc och argv här uppe. 420 00:19:47,260 --> 00:19:54,300 Och nu ska jag integrera med en for-loop i linje 18, från i = 0 på upp till argc. 421 00:19:54,300 --> 00:19:56,850 Och vad ska jag göra med denna kodrad här? 422 00:19:56,850 --> 00:19:58,270 På engelska. 423 00:19:58,270 --> 00:20:00,510 Detta visar uppenbarligen användningen av argc. 424 00:20:00,510 --> 00:20:03,670 Men på engelska, vad gör det göra om jag kör det här programmet? 425 00:20:03,670 --> 00:20:04,366 Yeah? 426 00:20:04,366 --> 00:20:07,386 >> PUBLIK: Det kommer att skriva ut skärmen så många gånger du vill. 427 00:20:07,386 --> 00:20:08,260 DAVID MALAN: Exakt. 428 00:20:08,260 --> 00:20:10,480 Så vad ord I skriver vid prompten, det är 429 00:20:10,480 --> 00:20:13,120 kommer att spy dem på mig en per rad. 430 00:20:13,120 --> 00:20:14,370 Så låt oss gå vidare och göra det. 431 00:20:14,370 --> 00:20:17,862 Låt mig gå in i min katalog och gör att argv1 ./argv1. 432 00:20:17,862 --> 00:20:20,521 433 00:20:20,521 --> 00:20:21,770 Och nu, låt oss hålla det enkelt. 434 00:20:21,770 --> 00:20:23,834 Låt oss inte göra något i början. 435 00:20:23,834 --> 00:20:26,750 Det gjorde skriva ut en sak, och det är faktiskt namnet på programmet, 436 00:20:26,750 --> 00:20:28,240 eftersom det är i fästet 0. 437 00:20:28,240 --> 00:20:33,290 Om jag nu säger foo, det kommer att göra dessa två, och om jag säger foo bar, 438 00:20:33,290 --> 00:20:35,580 det kommer att säga dessa tre saker. 439 00:20:35,580 --> 00:20:37,740 Nu är något intressant, kanske. 440 00:20:37,740 --> 00:20:41,450 Men minns att argv är en array med strängar, 441 00:20:41,450 --> 00:20:45,960 men en sträng är en array med tecken, så att vi kan ta upp saker ett snäpp 442 00:20:45,960 --> 00:20:48,560 och tillämpa grundläggande logik och gör kod som 443 00:20:48,560 --> 00:20:51,160 ser lite mer kryptiskt, visserligen. 444 00:20:51,160 --> 00:20:53,540 Men genom att ha en kapslad loop, något som liknar 445 00:20:53,540 --> 00:20:57,030 vad du kanske minns från Mario, till exempel, om du gjorde det här sättet. 446 00:20:57,030 --> 00:21:00,380 >> Så nu märker på rad 19, jag är igen iterera över mina argument, 447 00:21:00,380 --> 00:21:02,410 från 0 till högst argc. 448 00:21:02,410 --> 00:21:05,510 Och nu i linje 21-- jag är låna ett trick från förra week-- 449 00:21:05,510 --> 00:21:11,090 Jag kontroll vad som är längd argv bygel i. 450 00:21:11,090 --> 00:21:12,920 Jag lagrar det svaret i n. 451 00:21:12,920 --> 00:21:18,230 Och då jag integrera från j på upp till n, där j initieras till 0. 452 00:21:18,230 --> 00:21:19,460 Så, konvent för räkning. 453 00:21:19,460 --> 00:21:22,335 När du har använt i, om du har en kapslad loop, kan du inte använda mig igen, 454 00:21:22,335 --> 00:21:25,770 annars kommer du clobber, potentiellt, värdet utsidan av den inre slingan. 455 00:21:25,770 --> 00:21:27,200 Så jag använder j av konvention. 456 00:21:27,200 --> 00:21:28,020 Vi kan använda k. 457 00:21:28,020 --> 00:21:31,080 Om du har mer än k, du förmodligen har för mycket att bygga bo, typiskt. 458 00:21:31,080 --> 00:21:33,800 Men nu märker jag printf linjen är något annorlunda. 459 00:21:33,800 --> 00:21:37,520 Jag tänker inte skriva ut% s, jag är printing% C, vilket, naturligtvis, 460 00:21:37,520 --> 00:21:39,460 är en platshållare för en röding. 461 00:21:39,460 --> 00:21:40,770 >> Och nu märker denna syntax. 462 00:21:40,770 --> 00:21:41,270 Nytt. 463 00:21:41,270 --> 00:21:42,630 Vi har inte sett det förut. 464 00:21:42,630 --> 00:21:47,290 Men logiskt, det betyder bara får den i: e strängen i argv 465 00:21:47,290 --> 00:21:50,067 och få den j: te vad? 466 00:21:50,067 --> 00:21:50,900 PUBLIKEN: Tecken. 467 00:21:50,900 --> 00:21:52,800 DAVID MALAN: Tecken på den strängen. 468 00:21:52,800 --> 00:21:57,100 Så genom att använda hakparenteser följt av hakparenteser, 469 00:21:57,100 --> 00:22:00,390 detta är dykning först in i argv strängar, 470 00:22:00,390 --> 00:22:02,225 och sedan den andra hakparenteser med j 471 00:22:02,225 --> 00:22:06,580 är dykning i karaktärerna i att särskild sträng i argv. 472 00:22:06,580 --> 00:22:09,562 Och sedan, bara för bra åtgärd, Jag skriver ut en ny linje här. 473 00:22:09,562 --> 00:22:12,020 Så nu vill jag gå vidare och öppna upp ett något större fönster 474 00:22:12,020 --> 00:22:13,600 så att vi kan se detta i handling. 475 00:22:13,600 --> 00:22:15,700 Låt mig gå in i den mappen. 476 00:22:15,700 --> 00:22:22,550 Och nu gör att argv-2-- whoops-- göra argv-2, ./argv 2. 477 00:22:22,550 --> 00:22:23,110 Enter. 478 00:22:23,110 --> 00:22:24,860 Och det är lite svårt att läsas vertikalt, 479 00:22:24,860 --> 00:22:27,920 men det är faktiskt namnet på programmet, följt av en tom rad. 480 00:22:27,920 --> 00:22:30,210 Låt mig gå vidare och göra foo. 481 00:22:30,210 --> 00:22:33,210 På samma sätt svårt att läsa, men det är faktiskt skriver ut ett tecken per rad. 482 00:22:33,210 --> 00:22:36,780 Och om jag gör bar, är det nu skriva ut dem rad för rad. 483 00:22:36,780 --> 00:22:40,140 Så den takeaway här är inte så mycket att, wow, titta på det här snyggt nya trick 484 00:22:40,140 --> 00:22:44,750 där du kan få på innehållet av en array specifika karaktärer, 485 00:22:44,750 --> 00:22:48,380 utan snarare hur vi tar dessa grundläggande idéer som indexering i en matris, 486 00:22:48,380 --> 00:22:51,620 och sedan indexera in i en array som var i den matris, 487 00:22:51,620 --> 00:22:56,180 och bara tillämpa samma idéer till något mer sofistikerade exempel. 488 00:22:56,180 --> 00:22:59,560 Men grunderna har verkligen inte ändras, även sedan förra veckan. 489 00:22:59,560 --> 00:23:02,350 >> Nu är detta slags lägligt, i det, minns, i vecka noll 490 00:23:02,350 --> 00:23:04,110 vi spelade med en telefonbok som denna. 491 00:23:04,110 --> 00:23:06,670 Och även om det inte är uppenbart fysiska papperslappar, 492 00:23:06,670 --> 00:23:09,150 du kan slags tänka på en telefonbok som en matris. 493 00:23:09,150 --> 00:23:12,770 Visst, om du skulle reimplement denna lappar dessa bitar av papper 494 00:23:12,770 --> 00:23:15,260 i en dator, troligen du skulle använda något 495 00:23:15,260 --> 00:23:20,270 som en matris för att lagra alla de som namn och nummer från A hela vägen 496 00:23:20,270 --> 00:23:23,800 genom Z. Så det här är trevligt, eftersom det tillåter oss en möjlighet, 497 00:23:23,800 --> 00:23:28,310 kanske, att tänka på hur du kanske faktiskt genomföra något liknande. 498 00:23:28,310 --> 00:23:31,250 Som med ett antal dörrar här. 499 00:23:31,250 --> 00:23:36,380 Så om jag kan-- vi behöver en frivilligt att komma vidare upp. 500 00:23:36,380 --> 00:23:36,980 Låt oss se. 501 00:23:36,980 --> 00:23:40,650 En obekant ansikte kanske, obekant ansikte kanske. 502 00:23:40,650 --> 00:23:42,090 Vad sägs om i orange? 503 00:23:42,090 --> 00:23:42,680 Här. 504 00:23:42,680 --> 00:23:45,870 Orange skjorta, kom upp. 505 00:23:45,870 --> 00:23:52,230 >> Låt oss gå vidare nu och flytta dessa dörrar över åt sidan, 506 00:23:52,230 --> 00:23:54,020 flytta dem ur vägen för ett ögonblick. 507 00:23:54,020 --> 00:23:56,600 508 00:23:56,600 --> 00:23:57,760 Vad heter du? 509 00:23:57,760 --> 00:23:58,580 >> AJAY: 510 00:23:58,580 --> 00:23:58,655 >> DAVID MALAN: Ajay. 511 00:23:58,655 --> 00:23:58,680 David. 512 00:23:58,680 --> 00:23:59,451 Trevligt att träffas. 513 00:23:59,451 --> 00:23:59,950 Okej. 514 00:23:59,950 --> 00:24:04,500 Så vi har bakom dessa sex dörrar digitalt på screen-- 515 00:24:04,500 --> 00:24:07,810 eller snarare sju dörrar på screen-- en massa siffror. 516 00:24:07,810 --> 00:24:10,099 Och jag har sagt någonting i advance-- överens? 517 00:24:10,099 --> 00:24:11,140 AJAY: Ingenting i förväg. 518 00:24:11,140 --> 00:24:14,730 DAVID MALAN: Allt jag vill att du gör nu är att hitta för mig, och för oss, 519 00:24:14,730 --> 00:24:20,920 verkligen, antalet 50, ett steg i taget. 520 00:24:20,920 --> 00:24:21,830 >> AJAY: Number 50? 521 00:24:21,830 --> 00:24:22,580 >> DAVID MALAN: Antalet 50. 522 00:24:22,580 --> 00:24:24,746 Och du kan avslöja vad som finns bakom var och en av dessa dörrar 523 00:24:24,746 --> 00:24:27,930 helt enkelt genom att röra den med ett finger. 524 00:24:27,930 --> 00:24:31,364 Fan också. [LAUGHTER] 525 00:24:31,364 --> 00:24:34,560 >> [Applåder] 526 00:24:34,560 --> 00:24:39,540 >> Mycket bra gjort. 527 00:24:39,540 --> 00:24:40,400 OK. 528 00:24:40,400 --> 00:24:44,090 Vi har en härlig present Priset för dig här. 529 00:24:44,090 --> 00:24:46,520 Ditt val av filmer som vi diskuterade förra veckan. 530 00:24:46,520 --> 00:24:47,362 >> AJAY: Oh, man. 531 00:24:47,362 --> 00:24:49,050 Åh, jag har aldrig sett Spaceballs. 532 00:24:49,050 --> 00:24:49,520 >> DAVID MALAN: Space. 533 00:24:49,520 --> 00:24:50,140 Okej. 534 00:24:50,140 --> 00:24:53,790 Så håll på bara ett ögonblick. 535 00:24:53,790 --> 00:24:57,430 How-- låt oss göra det här en teachable moment-- 536 00:24:57,430 --> 00:25:00,412 Hur gick ni tillväga hitta nummer 50? 537 00:25:00,412 --> 00:25:01,370 AJAY: Jag valde slumpmässigt. 538 00:25:01,370 --> 00:25:03,420 DAVID MALAN: Så du valde slumpmässigt och hade tur. 539 00:25:03,420 --> 00:25:03,790 AJAY: Ja. 540 00:25:03,790 --> 00:25:04,456 DAVID MALAN: OK. 541 00:25:04,456 --> 00:25:05,050 Utmärkt. 542 00:25:05,050 --> 00:25:08,470 Så nu hade du inte fått tur, vad annars 543 00:25:08,470 --> 00:25:10,210 kan ha hänt bakom dessa dörrar? 544 00:25:10,210 --> 00:25:12,930 Så om jag går vidare och avslöja dessa siffror här, 545 00:25:12,930 --> 00:25:15,180 de faktiskt är i slumpmässig ordning. 546 00:25:15,180 --> 00:25:17,750 Och det bästa du kan ha gjort, ärligt talat, är med i slutändan, 547 00:25:17,750 --> 00:25:19,410 i värsta fall, kontroll dem alla. 548 00:25:19,410 --> 00:25:23,000 Så du fick super lucky, vilket är inte vad vi skulle kalla en algoritm. 549 00:25:23,000 --> 00:25:24,730 Ja, grattis. 550 00:25:24,730 --> 00:25:27,010 Men nu let's-- humor mig, om du kunde. 551 00:25:27,010 --> 00:25:28,310 Låt oss gå till den här fliken här. 552 00:25:28,310 --> 00:25:31,460 Och här skiljer sig siffrorna i tydligt vad som verkar vara en slumpmässig ordning, 553 00:25:31,460 --> 00:25:32,280 och de var. 554 00:25:32,280 --> 00:25:35,160 Men nu när jag istället anspråk att bakom dessa dörrar 555 00:25:35,160 --> 00:25:39,070 är siffror som sorteras. 556 00:25:39,070 --> 00:25:41,780 Målet är nu att även hittar oss på numret 50. 557 00:25:41,780 --> 00:25:45,910 Men gör det algoritmiskt, och berätta hur du ska om det. 558 00:25:45,910 --> 00:25:48,020 Och om du tycker det, hålla dig filmen. 559 00:25:48,020 --> 00:25:49,520 Du tycker inte att den, du ger tillbaka den. 560 00:25:49,520 --> 00:25:52,720 561 00:25:52,720 --> 00:25:58,112 AJAY: Så jag ska kolla ändarna första, att bestämma om there's-- 562 00:25:58,112 --> 00:26:02,048 [Skratt och applåder] 563 00:26:02,048 --> 00:26:04,451 564 00:26:04,451 --> 00:26:05,492 DAVID MALAN: Varsågod. 565 00:26:05,492 --> 00:26:17,080 566 00:26:17,080 --> 00:26:21,700 Låt oss ta en titt på en av Ajay föregångare, 567 00:26:21,700 --> 00:26:25,450 Sean, som inte var riktigt lika tur. 568 00:26:25,450 --> 00:26:28,670 OK, så din uppgift här, Sean, är följande. 569 00:26:28,670 --> 00:26:32,970 Jag har gömt bakom dessa dörrar nummer sju, 570 00:26:32,970 --> 00:26:37,200 men undanstoppad i en del av dessa dörrar liksom även andra icke-negativa tal. 571 00:26:37,200 --> 00:26:40,730 Och ditt mål är att tänka på detta övre raden av siffror som bara en array. 572 00:26:40,730 --> 00:26:43,590 Du kan en sekvens av bitar papper med siffror bakom sig. 573 00:26:43,590 --> 00:26:47,640 Och ditt mål är, bara använder toppen array här, hitta mig på nummer sju. 574 00:26:47,640 --> 00:26:51,200 Och vi sedan kommer att kritisera hur du går om att göra det. 575 00:26:51,200 --> 00:26:52,920 Hitta oss på nummer sju, tack. 576 00:26:52,920 --> 00:27:02,570 577 00:27:02,570 --> 00:27:03,070 Nej 578 00:27:03,070 --> 00:27:06,760 579 00:27:06,760 --> 00:27:08,179 5, 19, 13. 580 00:27:08,179 --> 00:27:16,752 581 00:27:16,752 --> 00:27:17,835 Det är inte en kuggfråga. 582 00:27:17,835 --> 00:27:21,420 583 00:27:21,420 --> 00:27:21,920 1. 584 00:27:21,920 --> 00:27:26,715 585 00:27:26,715 --> 00:27:29,840 Vid denna punkt är din poäng inte mycket bra, så du kan lika gärna fortsätta. 586 00:27:29,840 --> 00:27:32,870 587 00:27:32,870 --> 00:27:33,370 3. 588 00:27:33,370 --> 00:27:38,570 589 00:27:38,570 --> 00:27:39,802 Fortsätt. 590 00:27:39,802 --> 00:27:42,510 Ärligt talat, jag kan inte låta bli att undra vad du ens tänka på. 591 00:27:42,510 --> 00:27:44,990 >> SEAN: Jag kan ta från endast den översta raden. 592 00:27:44,990 --> 00:27:46,240 DAVID MALAN: Endast den översta raden. 593 00:27:46,240 --> 00:27:47,281 Så du har tre kvar. 594 00:27:47,281 --> 00:27:48,310 Så hitta mig 7. 595 00:27:48,310 --> 00:27:54,758 596 00:27:54,758 --> 00:27:59,141 >> [PUBLIK ropar FÖRSLAG] 597 00:27:59,141 --> 00:28:22,210 598 00:28:22,210 --> 00:28:26,130 Så båda dessa var fantastisk för mycket olika skäl. 599 00:28:26,130 --> 00:28:29,150 Så det är där vi slutade för en stund sedan, 600 00:28:29,150 --> 00:28:32,530 och nyckeln insikt här var dessa dörrar hade siffror 601 00:28:32,530 --> 00:28:37,390 bakom dem som sorterades, den ideala takeaway som är att du kan göra 602 00:28:37,390 --> 00:28:39,670 i grunden bättre i denna andra example-- 603 00:28:39,670 --> 00:28:42,380 och, faktiskt, var Seans att första försök med slumptal 604 00:28:42,380 --> 00:28:45,460 lika before-- men så snart eftersom dessa siffror är sorterade, 605 00:28:45,460 --> 00:28:47,980 ungefär som i telefonboken, vad kan du givetvis göra? 606 00:28:47,980 --> 00:28:50,090 Eller hur kan du utnyttja den kunskapen? 607 00:28:50,090 --> 00:28:51,530 Yeah. 608 00:28:51,530 --> 00:28:54,910 >> PUBLIK: Du går halvvägs [ohörbart]. 609 00:28:54,910 --> 00:28:55,660 DAVID MALAN: Ja. 610 00:28:55,660 --> 00:28:56,160 Exakt. 611 00:28:56,160 --> 00:28:59,680 Så Ajay ursprungliga instinkt var att kontrollera ändarna, som jag minns, 612 00:28:59,680 --> 00:29:02,320 och sedan vi slags färdiga exemplet snabbt. 613 00:29:02,320 --> 00:29:05,220 Men om vi började göra detta mer metodiskt i den stilen, 614 00:29:05,220 --> 00:29:07,860 men börjar kanske i mitten, eftersom de är sorterade, 615 00:29:07,860 --> 00:29:10,900 så snart vi avslöja nummer 16, vi därför vet-- 616 00:29:10,900 --> 00:29:14,850 och låt oss göra precis det-- vi Därför vet att 50, i dagens fall, 617 00:29:14,850 --> 00:29:16,080 har fått vara till höger. 618 00:29:16,080 --> 00:29:18,735 Så precis som i vecka noll när Vi slet telefonboken i hälften 619 00:29:18,735 --> 00:29:21,490 och kastade hälften av problemet borta, samma idé här. 620 00:29:21,490 --> 00:29:23,680 Vi kan kasta Halv av problemet bort. 621 00:29:23,680 --> 00:29:25,730 Och förmodligen vad du kan göra algoritmiskt, 622 00:29:25,730 --> 00:29:28,710 när du vet att 50 måste vara till höger, om det är någonstans, 623 00:29:28,710 --> 00:29:31,390 är försök där, i mitten av de återstående luckorna. 624 00:29:31,390 --> 00:29:33,450 Naturligtvis är 50 högre än 42, så vi kan 625 00:29:33,450 --> 00:29:36,060 kasta denna återstående fjärdedel av problemet borta, 626 00:29:36,060 --> 00:29:38,510 och slutligen identifiera ungefär 50. 627 00:29:38,510 --> 00:29:41,050 Men precis som med telefonbok, dessa siffror 628 00:29:41,050 --> 00:29:44,560 gavs till oss redan i sorterad ordning, vilket lämnar oss 629 00:29:44,560 --> 00:29:47,450 med frågan, hur gör du få saker i sorterade ordning? 630 00:29:47,450 --> 00:29:49,640 Och, ärligt talat, till vilket pris? 631 00:29:49,640 --> 00:29:51,390 Det är en sak att vara räckte telefonboken 632 00:29:51,390 --> 00:29:54,810 och sedan imponera på dina vänner genom att hitta ett telefonnummer riktigt snabbt, eller hur? 633 00:29:54,810 --> 00:29:58,520 Riva 32 sidor ut för att hitta en personen av 4000 miljoner sidor, 634 00:29:58,520 --> 00:30:00,470 vi sade var ett extremt exempel. 635 00:30:00,470 --> 00:30:03,320 Men hur mycket tid tog det Verizon att sortera som telefonbok? 636 00:30:03,320 --> 00:30:06,170 Hur lång tid tog det oss att sortera dessa sju siffror? 637 00:30:06,170 --> 00:30:10,110 Det är en fråga som vi har hittills helt ignoreras. 638 00:30:10,110 --> 00:30:12,330 >> Så låt oss svara på den frågan nu. 639 00:30:12,330 --> 00:30:15,920 Och vi är alla av filmer nu, men vi har en del stress bollar. 640 00:30:15,920 --> 00:30:19,480 Om, säg, åtta frivilliga skulle inte ha något emot att gå med oss ​​här uppe? 641 00:30:19,480 --> 00:30:24,100 Låt oss gå vidare och göra, vad sägs om fyra av er, tre av er här? 642 00:30:24,100 --> 00:30:25,290 Få några nya ansikten. 643 00:30:25,290 --> 00:30:27,220 Och fyra av er där? 644 00:30:27,220 --> 00:30:30,760 Och nu-- låt oss inte fördomar här-- och nummer åtta hit på slutet. 645 00:30:30,760 --> 00:30:32,060 Kom upp. 646 00:30:32,060 --> 00:30:32,560 Okej. 647 00:30:32,560 --> 00:30:37,480 Så vad vi har för här var och en av er är ett nummer. 648 00:30:37,480 --> 00:30:40,055 Om du vill gå framåt, ta det här numret. 649 00:30:40,055 --> 00:30:40,763 Vad heter du? 650 00:30:40,763 --> 00:30:41,950 >> ARTIE: Artie. 651 00:30:41,950 --> 00:30:43,100 >> DAVID MALAN: Artie, okej. 652 00:30:43,100 --> 00:30:44,297 Du är nummer 1. 653 00:30:44,297 --> 00:30:45,310 >> AMIN: Amin. 654 00:30:45,310 --> 00:30:46,060 DAVID MALAN: Amin. 655 00:30:46,060 --> 00:30:46,820 David. 656 00:30:46,820 --> 00:30:47,530 Du är nummer 2. 657 00:30:47,530 --> 00:30:49,100 Och gå vidare, så jag lämnar du pappersarken, 658 00:30:49,100 --> 00:30:52,130 rada upp er framför musiken står i samma ordning som där uppe. 659 00:30:52,130 --> 00:30:52,660 >> ANDY: Hej, Andy. 660 00:30:52,660 --> 00:30:53,970 >> DAVID MALAN: Andy, det är trevligt att se dig. 661 00:30:53,970 --> 00:30:54,520 Nummer 3. 662 00:30:54,520 --> 00:30:55,310 >> JACOB: Jacob. 663 00:30:55,310 --> 00:30:56,760 >> DAVID MALAN: Jacob, nummer 4. 664 00:30:56,760 --> 00:30:57,549 Välkommen ombord. 665 00:30:57,549 --> 00:30:58,090 GRANT: Grant. 666 00:30:58,090 --> 00:30:58,881 DAVID MALAN: Grant. 667 00:30:58,881 --> 00:31:00,348 Nummer 5. 668 00:31:00,348 --> 00:31:01,200 >> Alanna: Alanna. 669 00:31:01,200 --> 00:31:02,766 >> DAVID MALAN: Alanna, nummer 6. 670 00:31:02,766 --> 00:31:03,589 >> FRANCES: Frances. 671 00:31:03,589 --> 00:31:04,880 DAVID MALAN: Frances, nummer 7. 672 00:31:04,880 --> 00:31:05,200 Och? 673 00:31:05,200 --> 00:31:05,830 >> RACHEL: Rachel. 674 00:31:05,830 --> 00:31:06,815 >> DAVID MALAN: Rachel, nummer 8. 675 00:31:06,815 --> 00:31:07,100 Okej. 676 00:31:07,100 --> 00:31:08,766 Gå vidare och skaffa dig i denna ordning. 677 00:31:08,766 --> 00:31:11,440 Låt mig sätta en återstående notstället på plats. 678 00:31:11,440 --> 00:31:13,670 Var behöver du ett stativ? 679 00:31:13,670 --> 00:31:14,170 OK. 680 00:31:14,170 --> 00:31:18,710 Gå vidare och bara sätta dina nummer där publiken kan se dem, 681 00:31:18,710 --> 00:31:20,340 musiken står vänd utåt. 682 00:31:20,340 --> 00:31:27,240 Och förhoppningsvis vår första sanity check här-- 4, 2, 6. 683 00:31:27,240 --> 00:31:27,890 Oh-oh. 684 00:31:27,890 --> 00:31:29,070 Vänta lite. 685 00:31:29,070 --> 00:31:31,140 Vi har inte en åtta. 686 00:31:31,140 --> 00:31:35,180 Jag behöver vräka dig från exemplet på något sätt. 687 00:31:35,180 --> 00:31:35,680 Nej 688 00:31:35,680 --> 00:31:36,940 Nej, det är OK. 689 00:31:36,940 --> 00:31:37,890 Låt oss se. 690 00:31:37,890 --> 00:31:38,880 Vi kan göra detta. 691 00:31:38,880 --> 00:31:39,440 Avvakta. 692 00:31:39,440 --> 00:31:43,970 693 00:31:43,970 --> 00:31:45,740 Sådär. 694 00:31:45,740 --> 00:31:46,800 Korrekt. 695 00:31:46,800 --> 00:31:47,360 Okej. 696 00:31:47,360 --> 00:31:50,260 Så, nu har vi 8, 1, 3 7, 5. 697 00:31:50,260 --> 00:31:50,760 OK. 698 00:31:50,760 --> 00:31:51,360 Utmärkt. 699 00:31:51,360 --> 00:31:54,400 >> Så frågan till hands är, på vilken kostnad, och via vilken metod, 700 00:31:54,400 --> 00:31:58,580 kan vi faktiskt sortera dessa siffror här så att vi typ av kan arbeta baklänges, 701 00:31:58,580 --> 00:32:02,759 i slutändan, och decide-- är det verkligen imponerande, det är verkligen effektiv, 702 00:32:02,759 --> 00:32:04,550 att jag kan dela och erövra en telefonbok? 703 00:32:04,550 --> 00:32:06,716 Är det verkligen effektivt att Jag kan dela och erövra 704 00:32:06,716 --> 00:32:08,600 dessa digitala bitar av papper på bordet, 705 00:32:08,600 --> 00:32:14,500 om kanske det kommer att kosta oss en förmögenhet i tid eller energi eller processorcykler 706 00:32:14,500 --> 00:32:17,340 att faktiskt få våra data i någon sorterad ordning? 707 00:32:17,340 --> 00:32:18,930 Så låt oss ställa den frågan. 708 00:32:18,930 --> 00:32:22,077 >> Så först av, dessa siffror är i ganska mycket slumpmässig ordning, 709 00:32:22,077 --> 00:32:24,160 och jag kommer att föreslå en algoritm, eller process 710 00:32:24,160 --> 00:32:25,970 som vi kan sortera dessa folks. 711 00:32:25,970 --> 00:32:28,100 Jag kommer att närma sig detta ganska naivt. 712 00:32:28,100 --> 00:32:30,730 Och jag kommer att känna igen att det är lite av en hel del för mig 713 00:32:30,730 --> 00:32:32,890 att linda mig runt hela datauppsättning samtidigt. 714 00:32:32,890 --> 00:32:33,640 Men vet du vad? 715 00:32:33,640 --> 00:32:37,450 Jag kommer att göra några mycket enkla marginella korrigeringar. 716 00:32:37,450 --> 00:32:41,152 4 och 2 är i ordning, om Målet är att gå från en på upp till 8. 717 00:32:41,152 --> 00:32:41,860 Så vet du vad? 718 00:32:41,860 --> 00:32:43,776 Jag kommer att ha dig killar byta, om du växlar 719 00:32:43,776 --> 00:32:46,380 fysiskt positioner och dina papperslappar. 720 00:32:46,380 --> 00:32:47,894 Nu 4 och 6, dessa är i ordning. 721 00:32:47,894 --> 00:32:49,060 Jag kommer att lämna dem vara. 722 00:32:49,060 --> 00:32:50,227 6 och 8, som är i ordning. 723 00:32:50,227 --> 00:32:51,185 Kommer att lämna dem vara. 724 00:32:51,185 --> 00:32:52,170 8 och1, i ordning. 725 00:32:52,170 --> 00:32:54,790 Om ni inte skulle ha något emot att byta. 726 00:32:54,790 --> 00:32:57,300 Nu 8 och 3, om ni kunde byta. 727 00:32:57,300 --> 00:32:59,320 8 och 7, om ni kunde byta. 728 00:32:59,320 --> 00:33:01,790 Och 8 och 5, om ni kunde byta. 729 00:33:01,790 --> 00:33:03,980 >> Nu är jag klar? 730 00:33:03,980 --> 00:33:05,200 Nej, uppenbarligen inte. 731 00:33:05,200 --> 00:33:07,880 Men jag har gjort situationen bättre, eller hur? 732 00:33:07,880 --> 00:33:09,430 Vad var ditt namn igen, nummer 8? 733 00:33:09,430 --> 00:33:10,055 >> RACHEL: Rachel. 734 00:33:10,055 --> 00:33:12,850 DAVID MALAN: Så Rachel har effektivt bubblade upp ganska långt, 735 00:33:12,850 --> 00:33:15,660 hela vägen till slutet av min samling av siffror här. 736 00:33:15,660 --> 00:33:17,310 Och så att problemet är typ av löst. 737 00:33:17,310 --> 00:33:21,670 Nu, helt klart, 2 behöver fortfarande flytta en bit, och 4 samt 6 och 1. 738 00:33:21,670 --> 00:33:24,420 Men jag verkar ha fått en lite närmare lösningen. 739 00:33:24,420 --> 00:33:26,790 Så låt oss tillämpa samma naiv heuristiska igen. 740 00:33:26,790 --> 00:33:27,690 2 och 4, OK. 741 00:33:27,690 --> 00:33:28,810 4 och 6, OK. 742 00:33:28,810 --> 00:33:29,930 6 och 1, mm-mm. 743 00:33:29,930 --> 00:33:32,230 Låt oss byta. 744 00:33:32,230 --> 00:33:33,200 6 och 3, mm-mm. 745 00:33:33,200 --> 00:33:34,420 Låt oss byta. 746 00:33:34,420 --> 00:33:35,580 6 och 7 är OK. 747 00:33:35,580 --> 00:33:36,590 7 och 5, nix. 748 00:33:36,590 --> 00:33:37,790 Låt oss byta. 749 00:33:37,790 --> 00:33:38,470 Och nu 7 och 8. 750 00:33:38,470 --> 00:33:39,862 Och vad heter du nu igen? 751 00:33:39,862 --> 00:33:40,570 FRANCES: Frances. 752 00:33:40,570 --> 00:33:41,445 DAVID MALAN: Frances. 753 00:33:41,445 --> 00:33:44,230 Så nu Frances är i ännu bättre ställning, för nu 7 och 8 754 00:33:44,230 --> 00:33:46,440 är korrekt bubblade upp till toppen. 755 00:33:46,440 --> 00:33:47,510 Så 2 och 4, OK. 756 00:33:47,510 --> 00:33:48,720 4 och 1, Låt oss byta. 757 00:33:48,720 --> 00:33:50,410 4 och 3, Låt oss byta. 758 00:33:50,410 --> 00:33:51,550 4 och 6, du är OK. 759 00:33:51,550 --> 00:33:53,340 6 och 5, Låt oss byta. 760 00:33:53,340 --> 00:33:54,590 Och nu dessa killar är bra. 761 00:33:54,590 --> 00:33:55,780 Vi är nästan där. 762 00:33:55,780 --> 00:33:57,706 2 och 1, i ordning, så byta. 763 00:33:57,706 --> 00:33:59,080 Och nu vill jag göra en sanity check. 764 00:33:59,080 --> 00:34:03,080 2 och 3, 3 och 4, 4 och 5, 5 och 6, 6 och 7, 8. 765 00:34:03,080 --> 00:34:05,060 OK, så vi är klara. 766 00:34:05,060 --> 00:34:09,310 >> Men till vilket pris jag gjorde sortera dessa siffror här? 767 00:34:09,310 --> 00:34:13,960 Nå, hur många steg jag gjorde potentiellt tar vid sortering dessa människor? 768 00:34:13,960 --> 00:34:15,710 Tja, ska vi återkomma till den frågan. 769 00:34:15,710 --> 00:34:18,030 Men, ärligt talat, om du fick lite uttråkad, det är 770 00:34:18,030 --> 00:34:22,270 typ av avslöjande i att detta inte var kanske den mest effektiva algoritmen. 771 00:34:22,270 --> 00:34:25,230 Och faktiskt, ärligt talat, jag svettas desto mer vandra fram och tillbaka. 772 00:34:25,230 --> 00:34:26,639 Det kändes inte särskilt effektiv. 773 00:34:26,639 --> 00:34:27,805 Så låt oss prova något annat. 774 00:34:27,805 --> 00:34:31,870 Om ni skulle kunna återställas er till dessa åtta värden. 775 00:34:31,870 --> 00:34:32,969 Bra jobbat. 776 00:34:32,969 --> 00:34:36,570 >> Låt oss ta en titt digitalt, för bara en stund innan vi prova något annat, 777 00:34:36,570 --> 00:34:38,179 på vad som just hände. 778 00:34:38,179 --> 00:34:41,330 Här uppe, du är på väg att se en visualisering av dessa åtta människor 779 00:34:41,330 --> 00:34:44,719 vari blått och rött barer representera tal. 780 00:34:44,719 --> 00:34:46,670 Den högre stapel, det större antalet. 781 00:34:46,670 --> 00:34:48,510 Ju kortare bar, desto mindre antal. 782 00:34:48,510 --> 00:34:51,560 Och vad du kommer att se är i slumpmässig ordning mer än åtta av dem. 783 00:34:51,560 --> 00:34:55,830 Du kommer att se dessa stänger bli sorterade efter samma algoritm, 784 00:34:55,830 --> 00:34:59,890 eller en uppsättning instruktioner som vi kallar hädan bubbla slag. 785 00:34:59,890 --> 00:35:04,000 Så märker, varje sekund eller så, två barer att tända upp i rött, 786 00:35:04,000 --> 00:35:05,590 jämförs av datorn. 787 00:35:05,590 --> 00:35:08,630 Och sedan om den stora baren och lilla baren är i ordning, 788 00:35:08,630 --> 00:35:11,220 de blir bytte för mig. 789 00:35:11,220 --> 00:35:15,120 >> Nu är det här otroligt tråkiga att titta på detta, förvisso, 790 00:35:15,120 --> 00:35:18,630 särskilt länge, men märker takeaway-- stora barer flyttar till höger, 791 00:35:18,630 --> 00:35:20,460 små barer som flyttar till vänster. 792 00:35:20,460 --> 00:35:23,380 Låt oss avbryta denna process och påskynda denna 793 00:35:23,380 --> 00:35:27,330 att vara mycket snabbare, så vi kan få en hög nivå känsla för vad, 794 00:35:27,330 --> 00:35:29,970 ja, är bubbelsorterings gör. 795 00:35:29,970 --> 00:35:33,150 I själva verket, det bubblar upp till högra sidan av listan, 796 00:35:33,150 --> 00:35:35,260 eller matrisen, de större barerna. 797 00:35:35,260 --> 00:35:40,020 Och omvänt, de små barer är bubblande sig ner till vänster, 798 00:35:40,020 --> 00:35:42,950 om än i en snabbare takt än vad vi tidigare gjorde. 799 00:35:42,950 --> 00:35:45,850 Så, svårare att se med människor, men visuellt det är faktiskt det som 800 00:35:45,850 --> 00:35:46,540 hände. 801 00:35:46,540 --> 00:35:49,110 >> Men låt oss prova en i grunden annan strategi nu. 802 00:35:49,110 --> 00:35:52,387 Låt oss prova en annan algoritm där vi har du 803 00:35:52,387 --> 00:35:59,640 Killarna börjar i dessa original positioner, vilket var denna ordning här. 804 00:35:59,640 --> 00:36:00,827 Och låt oss gå vidare nu. 805 00:36:00,827 --> 00:36:02,910 Och jag kommer att göra något ännu enklare, eller hur? 806 00:36:02,910 --> 00:36:06,710 I efterhand byta parvis igen och igen, nästan lite smart. 807 00:36:06,710 --> 00:36:10,460 Låt oss göra det hela ännu mer naivt, där om jag vill sortera dessa människor, 808 00:36:10,460 --> 00:36:12,560 låt mig bara fortsätta leta för det minsta elementet. 809 00:36:12,560 --> 00:36:14,570 Så just nu är 4 på minsta antalet jag sett. 810 00:36:14,570 --> 00:36:15,695 Jag kommer att komma ihåg det. 811 00:36:15,695 --> 00:36:17,750 Nej, 2 är bättre, och kom ihåg att. 812 00:36:17,750 --> 00:36:20,730 1 är ännu mindre. 813 00:36:20,730 --> 00:36:21,970 3, 7, 5. 814 00:36:21,970 --> 00:36:22,470 OK. 815 00:36:22,470 --> 00:36:23,750 En-- vad heter du nu igen? 816 00:36:23,750 --> 00:36:24,400 >> ARTIE: Artie. 817 00:36:24,400 --> 00:36:24,610 >> DAVID MALAN: Artie. 818 00:36:24,610 --> 00:36:25,460 Så, Artie, gå vidare. 819 00:36:25,460 --> 00:36:27,043 Jag kommer att dra dig ur linjen. 820 00:36:27,043 --> 00:36:28,400 Om du kunde komma tillbaka hit. 821 00:36:28,400 --> 00:36:30,790 Och jag måste göra plats för honom. 822 00:36:30,790 --> 00:36:32,040 Vi har en beslutspunkt här. 823 00:36:32,040 --> 00:36:36,000 Hur kan vi göra plats för Artie här i början var antalet 1 hör hemma? 824 00:36:36,000 --> 00:36:36,770 >> PUBLIKEN: Shift. 825 00:36:36,770 --> 00:36:38,950 >> DAVID MALAN: OK, vi kunde flytta alla. 826 00:36:38,950 --> 00:36:40,860 Men föreslå en optimering. 827 00:36:40,860 --> 00:36:43,410 Det känns lite irriterande för mig att fråga fyra personer 828 00:36:43,410 --> 00:36:44,620 att flytta hela vägen ner. 829 00:36:44,620 --> 00:36:45,520 Vad mer kan jag göra? 830 00:36:45,520 --> 00:36:46,360 >> PUBLIK: Slå dem. 831 00:36:46,360 --> 00:36:46,850 >> DAVID MALAN: Slå dem. 832 00:36:46,850 --> 00:36:47,900 Och vad heter du nu igen? 833 00:36:47,900 --> 00:36:48,441 >> JACOB: Jacob. 834 00:36:48,441 --> 00:36:50,330 DAVID MALAN: Jacob, flytta. 835 00:36:50,330 --> 00:36:54,440 Mycket effektivare bara för att ha Jacob swap platser med Artie, 836 00:36:54,440 --> 00:36:56,710 i motsats till att tvinga alla fyra av dessa människor, 837 00:36:56,710 --> 00:36:58,734 tack så mycket, till deras rätt läge. 838 00:36:58,734 --> 00:37:01,150 Vad är trevligt om Artie nu, han är i sitt rätta läge. 839 00:37:01,150 --> 00:37:02,060 Nu gör vi det igen. 840 00:37:02,060 --> 00:37:03,730 2, det är det minsta antalet som jag har sett. 841 00:37:03,730 --> 00:37:05,690 3, 7, 5. 842 00:37:05,690 --> 00:37:06,190 OK. 843 00:37:06,190 --> 00:37:07,467 2 är definitivt den minsta. 844 00:37:07,467 --> 00:37:08,550 Har du inte göra något arbete. 845 00:37:08,550 --> 00:37:09,320 Låt oss göra det igen. 846 00:37:09,320 --> 00:37:10,070 6. 847 00:37:10,070 --> 00:37:10,640 Minsta? 848 00:37:10,640 --> 00:37:11,140 8. 849 00:37:11,140 --> 00:37:11,590 Nope. 850 00:37:11,590 --> 00:37:11,720 4? 851 00:37:11,720 --> 00:37:12,220 Ooh. 852 00:37:12,220 --> 00:37:13,420 Låt mig komma ihåg 4. 853 00:37:13,420 --> 00:37:13,950 3. 854 00:37:13,950 --> 00:37:15,110 Låt mig komma ihåg 3. 855 00:37:15,110 --> 00:37:16,080 7, 5. 856 00:37:16,080 --> 00:37:18,490 Minsta antalet jag har ses på detta pass är 3. 857 00:37:18,490 --> 00:37:20,340 Om du skulle komma på ut. 858 00:37:20,340 --> 00:37:21,986 Vart ska vi sätta dig? 859 00:37:21,986 --> 00:37:22,860 Och vad heter du? 860 00:37:22,860 --> 00:37:23,530 >> Alanna: Alanna. 861 00:37:23,530 --> 00:37:25,780 >> DAVID MALAN: Alanna, vi är kommer att behöva vräka dig. 862 00:37:25,780 --> 00:37:28,670 Men det är mer effektiv, att bara byta två personer, 863 00:37:28,670 --> 00:37:31,850 än att ha flera personer faktiskt kringgå över. 864 00:37:31,850 --> 00:37:32,850 Nu ska göra detta igen. 865 00:37:32,850 --> 00:37:34,980 Jag kommer att välja 4, så kom ut. 866 00:37:34,980 --> 00:37:36,540 Och vem ska flytta? 867 00:37:36,540 --> 00:37:37,750 Nummer 8, förstås. 868 00:37:37,750 --> 00:37:40,260 Om jag nu hitta nummer 5, kom ut. 869 00:37:40,260 --> 00:37:42,104 Nummer 8 kommer att bli vräkta igen. 870 00:37:42,104 --> 00:37:43,770 Nu ska jag hitta nummer 6 på plats. 871 00:37:43,770 --> 00:37:44,410 7 på plats. 872 00:37:44,410 --> 00:37:45,080 8 på plats. 873 00:37:45,080 --> 00:37:48,590 >> Vad vi gjorde just nu är något som kallas val sortera, 874 00:37:48,590 --> 00:37:52,560 och om vi visualisera detta, det är kommer att kännas lite annorlunda. 875 00:37:52,560 --> 00:37:56,800 Låt oss gå vidare och från denna meny här, här visualization-- 876 00:37:56,800 --> 00:38:02,920 låt oss ändra detta att-- kom igen, Firefox. 877 00:38:02,920 --> 00:38:07,610 Låt oss ändra detta till val slag. 878 00:38:07,610 --> 00:38:11,830 Och låt oss påskynda det som tidigare, och starta visualisering nu. 879 00:38:11,830 --> 00:38:13,990 Och denna algoritm har en annan känsla. 880 00:38:13,990 --> 00:38:16,480 Vid varje iteration, ärligt talat, är det ännu enklare. 881 00:38:16,480 --> 00:38:18,385 Jag är bara att välja det minsta elementet. 882 00:38:18,385 --> 00:38:21,510 Nu, ärligt talat, jag fick lite tur att tid, i det att det sorterade supersnabb. 883 00:38:21,510 --> 00:38:22,660 Elementen var slumpmässiga. 884 00:38:22,660 --> 00:38:25,520 Det är inte, som vi ska så småningom se, i grunden snabbare. 885 00:38:25,520 --> 00:38:29,400 Men låt oss se en tredje och sista närmar här om vad som händer. 886 00:38:29,400 --> 00:38:36,230 Så låt oss gå vidare och återställa er en sista gång för att vara i denna ordning här. 887 00:38:36,230 --> 00:38:38,450 >> Och nu ska jag vara lite mer smart, 888 00:38:38,450 --> 00:38:40,220 bara för att spetsa våra algoritmer. 889 00:38:40,220 --> 00:38:41,230 Jag ska göra det här. 890 00:38:41,230 --> 00:38:43,140 Jag ska inte gå fram och tillbaka så mycket. 891 00:38:43,140 --> 00:38:44,900 Ärligt talat, jag är trött på all denna förflyttnings. 892 00:38:44,900 --> 00:38:47,691 Jag kommer bara att ta vad jag är ges i början av listan, 893 00:38:47,691 --> 00:38:49,460 och jag kommer att sortera det där och då. 894 00:38:49,460 --> 00:38:50,140 Så här är vi. 895 00:38:50,140 --> 00:38:51,030 Nummer 4. 896 00:38:51,030 --> 00:38:53,680 Jag ska in nummer 4 in i en sorterad lista. 897 00:38:53,680 --> 00:38:54,180 Klar. 898 00:38:54,180 --> 00:38:58,300 Jag påstår nu, och bara för att göra det mer klart, är denna del av min lista sortering. 899 00:38:58,300 --> 00:39:02,610 Det är lite av en dum fordran, utan faktiskt 4 sorteras i en lista med storlek ett. 900 00:39:02,610 --> 00:39:04,210 Nu ska jag ta på nummer 2. 901 00:39:04,210 --> 00:39:07,670 Nummer 2 Jag kommer nu att sätt in på rätt plats. 902 00:39:07,670 --> 00:39:08,680 Så varifrån kommer 2 hör hemma? 903 00:39:08,680 --> 00:39:09,824 Självklart, här borta. 904 00:39:09,824 --> 00:39:11,490 Så sätt igång och flytta tillbaka, om du kunde. 905 00:39:11,490 --> 00:39:14,406 Och varför inte ni bara ta musiken står med dig den här gången. 906 00:39:14,406 --> 00:39:17,020 Och låt oss med våld sätter dig i början av listan. 907 00:39:17,020 --> 00:39:17,936 Så lite mer arbete. 908 00:39:17,936 --> 00:39:20,890 Jag var tvungen att flytta Jacob runt, och vad heter du? 909 00:39:20,890 --> 00:39:21,420 >> AMIN: Amin. 910 00:39:21,420 --> 00:39:22,270 >> DAVID MALAN: Amin. 911 00:39:22,270 --> 00:39:24,350 Men åtminstone jag inte gå fram och tillbaka. 912 00:39:24,350 --> 00:39:25,739 Jag tar bara saker som jag går. 913 00:39:25,739 --> 00:39:27,530 Jag bara sätta in dem på rätt plats. 914 00:39:27,530 --> 00:39:29,220 6, detta är faktiskt ganska lätt. 915 00:39:29,220 --> 00:39:31,510 Låt oss sätta in dig där borta, om du ville bara flytta över något. 916 00:39:31,510 --> 00:39:32,870 Nummer 8, också ganska lätt. 917 00:39:32,870 --> 00:39:33,741 Där borta. 918 00:39:33,741 --> 00:39:34,240 Fan också. 919 00:39:34,240 --> 00:39:37,590 Nummer 1 kan vi inte bara byta med Amin här, 920 00:39:37,590 --> 00:39:39,340 eftersom det kommer att röra upp ordern. 921 00:39:39,340 --> 00:39:40,660 Så vi måste vara lite smartare. 922 00:39:40,660 --> 00:39:42,770 Så, Artie, om du kunde backa upp för ett ögonblick. 923 00:39:42,770 --> 00:39:46,550 Låt oss gå vidare och flytta nu, Till skillnad från våra tidigare algoritmer, 924 00:39:46,550 --> 00:39:50,910 att skapa utrymme för Artie just här i början. 925 00:39:50,910 --> 00:39:54,690 Så i slutet av dagen, jag är typ av göra vad jag ville undvika tidigare. 926 00:39:54,690 --> 00:39:57,770 Och så min algoritm är en slags i omvänd, intellektuellt, 927 00:39:57,770 --> 00:39:59,070 från vad det ursprungligen var. 928 00:39:59,070 --> 00:40:01,240 Jag gör bara växlingen vid en annan punkt. 929 00:40:01,240 --> 00:40:02,291 Nu är jag på 3. 930 00:40:02,291 --> 00:40:02,790 Åh, fan. 931 00:40:02,790 --> 00:40:04,039 Vi måste göra mer arbete igen. 932 00:40:04,039 --> 00:40:05,060 Så låt oss trycka ut dig. 933 00:40:05,060 --> 00:40:09,360 Låt oss gå 8, 6, 4-- oh oh-- och 3 kommer att gå där. 934 00:40:09,360 --> 00:40:11,490 Så åtminstone små besparingar den här gången. 935 00:40:11,490 --> 00:40:13,100 7, inte för mycket arbete att göra. 936 00:40:13,100 --> 00:40:15,370 Så om du vill att pop tillbaka, låt oss sätta in dig. 937 00:40:15,370 --> 00:40:17,440 Och slutligen, 5, om du vill pop tillbaka, vi 938 00:40:17,440 --> 00:40:22,610 behöver flytta dig, dig, dig, tills fem är på plats. 939 00:40:22,610 --> 00:40:25,670 >> Så nu för att se detta vid en hög nivå grafiskt, 940 00:40:25,670 --> 00:40:31,080 låt oss göra denna algoritm visualisering en extra gång. 941 00:40:31,080 --> 00:40:33,580 Så skall det vi kallar insättnings slag. 942 00:40:33,580 --> 00:40:37,700 Vi ska köra det precis som snabbt, och starta det här. 943 00:40:37,700 --> 00:40:39,580 Och den också har en annan känsla. 944 00:40:39,580 --> 00:40:42,180 Det slags blir bättre och bättre, men det är aldrig perfekt 945 00:40:42,180 --> 00:40:44,630 tills jag går in och smidigt i dessa luckor. 946 00:40:44,630 --> 00:40:47,860 Därför att, återigen, jag bara tar det som Jag ges från vänster till höger. 947 00:40:47,860 --> 00:40:50,350 Så fick jag inte så lycklig att allt var perfekt. 948 00:40:50,350 --> 00:40:54,190 Det är därför vi hade dessa små mispositions som vi fast med tiden. 949 00:40:54,190 --> 00:40:58,890 >> Så alla dessa algoritmer verkar kör på lite olika takt. 950 00:40:58,890 --> 00:41:02,030 I själva verket, vilket skulle du säga är den bästa eller den snabbaste hittills? 951 00:41:02,030 --> 00:41:03,450 Bubble sort, den första? 952 00:41:03,450 --> 00:41:05,000 Urval sortera, den andra? 953 00:41:05,000 --> 00:41:08,450 Insticks sortera, den tredje? 954 00:41:08,450 --> 00:41:10,710 Jag hör vissa urvals sorterar. 955 00:41:10,710 --> 00:41:13,280 Andra tankar? 956 00:41:13,280 --> 00:41:16,880 >> Så visar det sig att alla dessa algoritmer 957 00:41:16,880 --> 00:41:22,400 i grunden är lika effektiva som varje other-- eller omvänt, precis som 958 00:41:22,400 --> 00:41:25,980 ineffektiv som varandra, eftersom vi kan göra i grunden 959 00:41:25,980 --> 00:41:28,120 bättre än alla tre av dessa algoritmer. 960 00:41:28,120 --> 00:41:29,990 Och det är lite av en vit lögn, för. 961 00:41:29,990 --> 00:41:32,580 när jag säger så effektivt eller som ineffektiv, 962 00:41:32,580 --> 00:41:35,040 det är åtminstone för super stora värden på n. 963 00:41:35,040 --> 00:41:38,450 När vi har bara åtta personer här, eller kanske ett 50-tal barer på skärmen, 964 00:41:38,450 --> 00:41:41,645 Du kommer absolut att märka skillnader bland dessa tre algoritmer. 965 00:41:41,645 --> 00:41:44,020 Men som n, antalet personer, eller antalet siffror, 966 00:41:44,020 --> 00:41:46,350 eller antalet personer i telefonens bok, eller antalet webbsidor 967 00:41:46,350 --> 00:41:48,230 i Googles databas blir större och större, 968 00:41:48,230 --> 00:41:51,650 vi får se till att alla dessa tre algoritmer är faktiskt ganska dålig. 969 00:41:51,650 --> 00:41:54,060 Och vi kan göra i grunden bättre än så. 970 00:41:54,060 --> 00:41:56,830 >> Låt oss ta en titt, slutligen, på vad dessa algoritmer kanske 971 00:41:56,830 --> 00:41:59,520 låter som i samband med några andra 972 00:41:59,520 --> 00:42:03,550 såväl i form av detta visualisering här 973 00:42:03,550 --> 00:42:06,860 som kommer att presentera oss för ett antal algoritmer. 974 00:42:06,860 --> 00:42:10,330 Låt oss gå vidare och gratulerar våra deltagare här, som alla 975 00:42:10,330 --> 00:42:11,690 sorterade sig väl. 976 00:42:11,690 --> 00:42:15,124 Om du skulle vilja ta en avskedsgåva. 977 00:42:15,124 --> 00:42:16,540 Du kan behålla dina nummer också. 978 00:42:16,540 --> 00:42:19,460 979 00:42:19,460 --> 00:42:22,520 Och vad du ser, eller snarare hör, nu, 980 00:42:22,520 --> 00:42:25,710 är att när vi sätter ljud till var och en av dessa stänger 981 00:42:25,710 --> 00:42:28,660 och associera den med programvaran, olika frekvens av ljud, 982 00:42:28,660 --> 00:42:33,970 du kan svepa dig mer audioly kring vad var och en av dessa saker 983 00:42:33,970 --> 00:42:34,470 se ut. 984 00:42:34,470 --> 00:42:39,325 Den första är inför sort 985 00:42:39,325 --> 00:42:44,275 >> [TONER] 986 00:42:44,275 --> 00:42:47,245 987 00:42:47,245 --> 00:42:49,720 >> Det är bubblan slag. 988 00:42:49,720 --> 00:42:54,175 >> [TONER] 989 00:42:54,175 --> 00:43:17,250 990 00:43:17,250 --> 00:43:18,222 >> Urval slag. 991 00:43:18,222 --> 00:43:22,596 >> [TONER] 992 00:43:22,596 --> 00:43:33,570 993 00:43:33,570 --> 00:43:35,150 >> Något som kallas merge sort. 994 00:43:35,150 --> 00:43:38,140 >> [TONER] 995 00:43:38,140 --> 00:43:49,510 996 00:43:49,510 --> 00:43:51,278 >> Gnome slag. 997 00:43:51,278 --> 00:43:56,390 >> [TONER] 998 00:43:56,390 --> 00:44:08,240 999 00:44:08,240 --> 00:44:09,430 >> Det var allt för CS50. 1000 00:44:09,430 --> 00:44:13,360 Vi kommer att se dig på onsdag. 1001 00:44:13,360 --> 00:44:16,671 >> BERÄTTARE: Och nu, "Djupt Tankar, "vid Daven Farnham. 1002 00:44:16,671 --> 00:44:19,910 1003 00:44:19,910 --> 00:44:21,590 Varför är det en for-loop? 1004 00:44:21,590 --> 00:44:23,200 Varför inte göra det bättre? 1005 00:44:23,200 --> 00:44:25,970 Jag skulle göra en fem loop. 1006 00:44:25,970 --> 00:44:28,720 >> [LAUGHTER]