1 00:00:00,000 --> 00:00:10,550 2 00:00:10,550 --> 00:00:14,050 >> DAVID J. Malan: Ovo je CS50 i ovo je početak tjedna četiri. 3 00:00:14,050 --> 00:00:18,630 I, dječak je Volkswagen u Problem sve zbog softvera. 4 00:00:18,630 --> 00:00:20,264 Neka nas pogledajte. 5 00:00:20,264 --> 00:00:20,930 [VIDEO PLAYBACK] 6 00:00:20,930 --> 00:00:25,560 -Cars, Najpametniji likovi u Brzi i žestoki filmova. 7 00:00:25,560 --> 00:00:29,100 Ovaj tjedan njemački proizvođač automobila Volkswagen našla 8 00:00:29,100 --> 00:00:32,490 usred skandala od potencijalno kazneni proporcije. 9 00:00:32,490 --> 00:00:36,060 >> -Volkswagen Se pripremaju za milijardama u kazni, moguća kaznena prijava 10 00:00:36,060 --> 00:00:38,560 za svoje rukovoditelji, kao tvrtka ispričava 11 00:00:38,560 --> 00:00:41,840 za namještanje 11 milijuna automobila pomoći da tuku ispitivanja emisija. 12 00:00:41,840 --> 00:00:44,950 >> -Certain Dizel modeli su dizajniran sa sofisticiranim softverom 13 00:00:44,950 --> 00:00:48,440 da korištene informacije uključujući položaj upravljača i vozila 14 00:00:48,440 --> 00:00:51,870 brzina kako bi se utvrdilo je automobil bio prolazi kroz testiranje emisije. 15 00:00:51,870 --> 00:00:55,650 Pod tim okolnostima, motor bi se smanjila emisija otrovnih. 16 00:00:55,650 --> 00:00:59,070 No auto je namještena na obilaznici da kada je potaknuto. 17 00:00:59,070 --> 00:01:03,320 Emisije povećana 10 do 40 puta iznad prihvatljive razine EPA. 18 00:01:03,320 --> 00:01:04,280 >> [END PLAYBACK] 19 00:01:04,280 --> 00:01:05,220 >> DAVID J. Malan: Pa neka je pogledajte ovo 20 00:01:05,220 --> 00:01:07,250 i vidjeti točno kako to može se provoditi 21 00:01:07,250 --> 00:01:09,680 i kako bi to moglo utjecati na toliko automobila kao što je ovaj. 22 00:01:09,680 --> 00:01:12,840 Tako je u ruci ovdje su novinari izdanju koje je izdalo EPA-- 23 00:01:12,840 --> 00:01:14,620 zaštite okoliša Agencija za zaštitu koja 24 00:01:14,620 --> 00:01:18,032 je regulatorna agencija SAD da ručke brige za okoliš, 25 00:01:18,032 --> 00:01:19,740 te stvarna Pravna obavijest da je 26 00:01:19,740 --> 00:01:22,420 pošalji Volkswagen je samo nekoliko dana. 27 00:01:22,420 --> 00:01:26,530 >> Dakle EPA piše i objavljuje se sada javno, sofisticirani softver 28 00:01:26,530 --> 00:01:29,390 Algoritam na sigurno Volkswagen vozila detektira 29 00:01:29,390 --> 00:01:32,630 kada je automobil u tijeku Ispitivanje službene emisije 30 00:01:32,630 --> 00:01:36,505 i pretvara pune emisije kontrolira se samo tijekom ispitivanja. 31 00:01:36,505 --> 00:01:38,380 Učinkovitost to zagađenje vozila 32 00:01:38,380 --> 00:01:43,260 kontrole emisije uređaja je uvelike smanjuje vrijeme sve normalne vožnje 33 00:01:43,260 --> 00:01:44,320 situacijama. 34 00:01:44,320 --> 00:01:48,190 To rezultira u automobilima koji zadovoljavaju standardi u laboratoriju ili testiranje 35 00:01:48,190 --> 00:01:52,790 stanica, ali tijekom normalnog rada emitiraju dušika oxides-- ili NOx-- 36 00:01:52,790 --> 00:01:54,950 na do 40 puta standarda. 37 00:01:54,950 --> 00:01:58,220 Softver produkciji Volkswagen je citat citat, poraz uređaj, 38 00:01:58,220 --> 00:02:00,650 kao što je definirano Očisti Zakon zraka u SAD-u. 39 00:02:00,650 --> 00:02:03,410 >> Oni idu na to reći da EPA i druge agencije 40 00:02:03,410 --> 00:02:07,020 otkrila Poraz uređaj Softver nakon neovisne analize 41 00:02:07,020 --> 00:02:09,660 istraživača na Zapadu Sveučilište Virginia. 42 00:02:09,660 --> 00:02:14,160 NOx zagađenje doprinosi dušikov dioksid, ozon prizemlju, 43 00:02:14,160 --> 00:02:15,700 i fino čestica. 44 00:02:15,700 --> 00:02:18,090 Izloženost tih zagađivači je povezan 45 00:02:18,090 --> 00:02:20,870 sa širokim rasponom ozbiljne zdravstvene posljedice, 46 00:02:20,870 --> 00:02:23,637 uključujući povećanu astmu napada i drugih respiratornih 47 00:02:23,637 --> 00:02:26,470 bolesti koje mogu biti dovoljno ozbiljne poslati ljude u bolnicu. 48 00:02:26,470 --> 00:02:28,660 Izloženost ozonu i čestica ima također 49 00:02:28,660 --> 00:02:31,960 bio povezan s prerano smrti zbog respiratornih 50 00:02:31,960 --> 00:02:35,690 ili kardiovaskularne učinke vezane. 51 00:02:35,690 --> 00:02:38,940 Djeca, starije osobe, osobe s prethodnih bolesti dišnog sustava 52 00:02:38,940 --> 00:02:42,840 su posebno u opasnosti za zdravstveni učinci tih zagađivača. 53 00:02:42,840 --> 00:02:45,056 >> Dovoljno je reći, to je prilično ozbiljna. 54 00:02:45,056 --> 00:02:46,930 I idemo dalje čitati Samo još jedan izvadak 55 00:02:46,930 --> 00:02:49,370 a onda ćemo pogledati temeljni implikacije 56 00:02:49,370 --> 00:02:50,920 to u kontekstu automobila. 57 00:02:50,920 --> 00:02:53,730 Naime, Volkswagen proizveden i instaliran 58 00:02:53,730 --> 00:02:56,210 Softver u tzv elektroničko upravljanje 59 00:02:56,210 --> 00:02:59,320 module-- ili ECM-- od ta vozila koja osjetili 60 00:02:59,320 --> 00:03:03,580 kada vozilo testira na usklađenost sa standardima emisije EPA. 61 00:03:03,580 --> 00:03:07,510 Na temelju raznih ulaza uključujući Položaj upravljača, vozilo 62 00:03:07,510 --> 00:03:11,280 brzina, trajanje motora rad, a tlak zraka, 63 00:03:11,280 --> 00:03:13,720 ti ulazi upravo pratiti parametre 64 00:03:13,720 --> 00:03:17,600 savezne ispitnom postupku za Ispitivanje emisije za EPA certifikacije 65 00:03:17,600 --> 00:03:18,400 svrhe. 66 00:03:18,400 --> 00:03:21,850 >> Tijekom ispitivanja emisije EPA, softver vozila ECM 67 00:03:21,850 --> 00:03:25,060 ran softver koji proizvedenu Rezultati popustljiv emisija. 68 00:03:25,060 --> 00:03:28,340 U svim drugim vremenima, Softver ECM vozila 69 00:03:28,340 --> 00:03:31,090 vodio poseban cestu kalibracija koja smanjuje 70 00:03:31,090 --> 00:03:34,360 učinkovitost Cjelokupni sustav kontrole emisije, 71 00:03:34,360 --> 00:03:37,864 posebno selektivna katalitička smanjenje Lean NOx trap-- 72 00:03:37,864 --> 00:03:39,280 što ćemo vidjeti u jednom trenutku. 73 00:03:39,280 --> 00:03:43,040 Kao rezultat toga, emisije NOx povećan za faktor od 10 do 40 puta 74 00:03:43,040 --> 00:03:47,450 iznad razine EPA popustljiv ovisno o vrsti pogona ciklusa. 75 00:03:47,450 --> 00:03:50,800 >> Dakle, što to zapravo znači, a izvorni kod za softver trčanje 76 00:03:50,800 --> 00:03:53,190 na Volkswagenov nema Još javno objavljeni, 77 00:03:53,190 --> 00:03:56,460 je da učinkovito, ovaj ekvivalent je negdje tamo unutra 78 00:03:56,460 --> 00:03:57,830 Volkswagen koda. 79 00:03:57,830 --> 00:04:02,200 Ako se testira, i ako je automobil otkriva određene okolišni čimbenici 80 00:04:02,200 --> 00:04:04,330 poput upravljača položaj ili pokret 81 00:04:04,330 --> 00:04:06,710 ili nedostatak istih auta ili bilo koji drugi broj čimbenika 82 00:04:06,710 --> 00:04:09,940 koji su trenutno pretpostavili biti dio ove formule, 83 00:04:09,940 --> 00:04:12,370 oni jednostavno uključite kontrolirati puni emisije. 84 00:04:12,370 --> 00:04:15,670 Drugim riječima, oni počnu emitira manje od zagađivača. 85 00:04:15,670 --> 00:04:18,769 >> Inače, u svakoj drugoj situaciji kada to nije otkriven kao 86 00:04:18,769 --> 00:04:20,790 u laboratoriju, oni jednostavno ne. 87 00:04:20,790 --> 00:04:24,320 I tako da možete pojednostaviti ovaj u više beton pseudokod s nečim 88 00:04:24,320 --> 00:04:24,820 kao ovo. 89 00:04:24,820 --> 00:04:27,810 Ako su kotači se okreću, ali volan nije, sugestivna 90 00:04:27,810 --> 00:04:30,060 da je automobil na neke vrsta rotirajući cilindar 91 00:04:30,060 --> 00:04:32,550 ali u nekakvoj Skladište se ispituje, 92 00:04:32,550 --> 00:04:36,070 ponašaju se kao EPA će vam se svidjeti. 93 00:04:36,070 --> 00:04:37,960 Inače ne. 94 00:04:37,960 --> 00:04:40,420 Tako ćemo pogledati na kratkom videu koji 95 00:04:40,420 --> 00:04:45,391 ima pogled na ono što implikacija su to zapravo mehanički. 96 00:04:45,391 --> 00:04:48,620 >> [VIDEO PLAYBACK] 97 00:04:48,620 --> 00:04:52,800 >> -Last Petak EPA je objavila da su neki Volkswagen Audi automobili su između 2009. 98 00:04:52,800 --> 00:04:55,840 a ove godine su pomoću takozvani uređaj za neuspjeh 99 00:04:55,840 --> 00:04:59,060 da se oko zakona emisija osmišljen kako bi zrak čist. 100 00:04:59,060 --> 00:05:01,700 No, što to točno znači? 101 00:05:01,700 --> 00:05:04,666 >> Pa, moderni automobili imaju desetke računala unutar njih. 102 00:05:04,666 --> 00:05:07,040 A neki od tih računala koordinirati pomoć funkcije 103 00:05:07,040 --> 00:05:09,590 motora za optimalno performanse, dok pazeći 104 00:05:09,590 --> 00:05:12,340 da nema previše smeća izlazi iz ispušne cijevi. 105 00:05:12,340 --> 00:05:15,170 Oni su zapravo radili Na taj način za nekoliko desetljeća. 106 00:05:15,170 --> 00:05:17,380 Uglavnom, svaki dio modernog automobila motora 107 00:05:17,380 --> 00:05:20,080 ima senzor ili kontroler na njemu, i tim računalima 108 00:05:20,080 --> 00:05:23,460 čitate u podacima tisuća puta u sekundi prilagodbe čineći 109 00:05:23,460 --> 00:05:26,220 kao omjer goriva u zraku što se događa u cilindre. 110 00:05:26,220 --> 00:05:28,730 >> To varanje Volkswagen i Audi modeli su dizelska, 111 00:05:28,730 --> 00:05:30,890 a dizelska imaju još jedan stvarno važno računala 112 00:05:30,890 --> 00:05:34,030 kontroliranih parametara, što je količina neizgorenog goriva ide 113 00:05:34,030 --> 00:05:35,200 u ispuhu. 114 00:05:35,200 --> 00:05:36,310 Sada to zvuči loše. 115 00:05:36,310 --> 00:05:39,642 Ne zvuči kao da bi htio neizgorenog goriva ide u ispuhu. 116 00:05:39,642 --> 00:05:41,600 No, u slučaju A. dizel, imate nešto 117 00:05:41,600 --> 00:05:46,110 naziva NOx zamka koji je uređaj koji upija i zamke za dušikovih oksida 118 00:05:46,110 --> 00:05:48,880 koji su zagađivači koji bi inače idu u atmosferu. 119 00:05:48,880 --> 00:05:53,040 I učinak tog NOx zamke je pojačan s neizgorenog goriva. 120 00:05:53,040 --> 00:05:56,650 Dakle poraz uređaj poseban program unutar tih računala koji mogu to učiniti 121 00:05:56,650 --> 00:05:59,527 izgleda kao automobil zadovoljava emisije Standardi čak i kad to ne čini. 122 00:05:59,527 --> 00:06:01,110 Volkswagen je imao problema na svojim rukama. 123 00:06:01,110 --> 00:06:04,050 Njegovi dizelski motori bili poznati za dobivanje veliku potrošnju goriva, 124 00:06:04,050 --> 00:06:07,510 ali NOx zamka jedino dobro radi kada se koristi više goriva. 125 00:06:07,510 --> 00:06:10,460 Tako automobil će otkriti, koristeći ovaj poraz uređaja, 126 00:06:10,460 --> 00:06:13,870 kada je dobivanje emisije test, to će koristiti više goriva, 127 00:06:13,870 --> 00:06:16,830 napraviti NOx zamku rade dobro, Emisija će biti u redu. 128 00:06:16,830 --> 00:06:21,130 Ali onda ćete dobiti na putu, uređaj isključuje, ti si gori manje goriva 129 00:06:21,130 --> 00:06:24,256 ali ste stavljajući čak 40 puta više onečišćujućih tvari u atmosferi. 130 00:06:24,256 --> 00:06:26,130 Ali kako je pakao učinio auto zna da je to bilo 131 00:06:26,130 --> 00:06:27,720 se ispituje za poštivanje emisija? 132 00:06:27,720 --> 00:06:30,590 EPA kaže da je sofisticirani sustav koji provjerava stvari 133 00:06:30,590 --> 00:06:34,090 kao i položaj kola upravljača, brzina, koliko je motor bio uključen, 134 00:06:34,090 --> 00:06:35,507 pa čak i atmosferski tlak. 135 00:06:35,507 --> 00:06:37,673 Drugim riječima, bilo je ni na koji način je to bilo slučajno 136 00:06:37,673 --> 00:06:40,260 jer softver je dizajniran vrlo pažljivo otkriti 137 00:06:40,260 --> 00:06:41,630 službena ispitivanja emisije. 138 00:06:41,630 --> 00:06:43,588 To je neke prilično ozbiljne obmana i da je 139 00:06:43,588 --> 00:06:45,420 Zašto Volkswagen je u kao ozbiljan problem. 140 00:06:45,420 --> 00:06:48,600 Naime, njihov izvršni direktor Martin Winterkorn, samo odstupio. 141 00:06:48,600 --> 00:06:49,820 >> Dakle, što se dalje događa? 142 00:06:49,820 --> 00:06:53,900 Pa, ako ste jedan od polovice milijuna dizel jettas, Beatlesi, golfs, Passats, 143 00:06:53,900 --> 00:06:56,220 ili Audi A3s izvršiti, Dobra vijest je je 144 00:06:56,220 --> 00:06:57,886 da je vaš automobil je još uvijek sigurno voziti. 145 00:06:57,886 --> 00:07:00,510 Ne morate ga staviti daleko dok Volkswagen izdaje opoziv. 146 00:07:00,510 --> 00:07:02,509 Ali u nekom trenutku oni Vjerojatno će imati 147 00:07:02,509 --> 00:07:04,230 za ažuriranje softvera unutar vašeg automobila. 148 00:07:04,230 --> 00:07:06,927 Kada se to dogodi što bi moglo dobili manje milja po spremniku. 149 00:07:06,927 --> 00:07:09,260 Odvjetnici su već pripremaju za klasa akcija tužbe 150 00:07:09,260 --> 00:07:12,500 tako da vlasnici mogli dobiti naknadu u nekom trenutku u budućnosti. 151 00:07:12,500 --> 00:07:15,832 Ali to neće dogoditi u skorije vrijeme. 152 00:07:15,832 --> 00:07:16,711 >> [END PLAYBACK] 153 00:07:16,711 --> 00:07:19,960 DAVID J. Malan: Dakle, to je zapravo postavlja zanimljivo veća slika Pitanje 154 00:07:19,960 --> 00:07:20,660 kao povjerenje. 155 00:07:20,660 --> 00:07:21,160 Pravo? 156 00:07:21,160 --> 00:07:24,300 Svatko od nas ima iPhone ili androida ili nešto u našim džepovima najvjerojatnije 157 00:07:24,300 --> 00:07:26,500 ovih dana, ili prijenosna računala na našim krugova koji su 158 00:07:26,500 --> 00:07:28,510 trčanje softver koji je Apple i Microsoft 159 00:07:28,510 --> 00:07:30,710 i grozdovima drugih tvrtki. 160 00:07:30,710 --> 00:07:34,240 Ali kako znamo da je ono što ovi softverski proizvodi rade 161 00:07:34,240 --> 00:07:37,680 je zapravo što je to tvrtke kažu da rade? 162 00:07:37,680 --> 00:07:39,610 >> Na primjer, tko je to kažu da svaki put kada 163 00:07:39,610 --> 00:07:42,200 napraviti telefonski poziv na vašem iPhone ili android telefon ili slično, 164 00:07:42,200 --> 00:07:45,650 da je telefonski broj također nije prijenosa na društvo poslužitelj 165 00:07:45,650 --> 00:07:48,399 zbog nekih programa ste napisano, da li je operativni 166 00:07:48,399 --> 00:07:51,070 Sam sustav kao iOS ili Android, ili zato što ste preuzeli 167 00:07:51,070 --> 00:07:53,880 neke treće strane aplikacija da nekako sluša 168 00:07:53,880 --> 00:07:57,120 za sve što upisujete ili sve što ste zapravo govori. 169 00:07:57,120 --> 00:07:59,500 Kako ćete znati da je, kada je vi radite zveket 170 00:07:59,500 --> 00:08:02,590 ili Napravite sastaviti svoj vlastiti softver u CS50, kako 171 00:08:02,590 --> 00:08:06,080 da li vi da je CS50 vlastiti osoblja, putem u CS50 knjižnici, 172 00:08:06,080 --> 00:08:08,690 nije bila prijavom svaki string ste ikada stečen 173 00:08:08,690 --> 00:08:10,276 ili svaki inch ste ikada stečen? 174 00:08:10,276 --> 00:08:12,900 Pa, svakako bi mogao izgledati na izvorni kod za nečim 175 00:08:12,900 --> 00:08:15,233 kao CS50 knjižnici, što mogao pogledajte izvorni kod 176 00:08:15,233 --> 00:08:18,170 za Linux operativni sustav trčanje na CS50 IDE. 177 00:08:18,170 --> 00:08:23,090 Ali nevjerojatna prezentacija je dobio natrag u 1984 178 00:08:23,090 --> 00:08:26,730 prima Turing Award mehanizmom vrlo poznati računalni znanstvenik poznat 179 00:08:26,730 --> 00:08:29,750 as-- imenu Ken Thompson, koji dobila Turingov nagradu koja 180 00:08:29,750 --> 00:08:33,500 je vrsta računalne znanosti a Nobelova nagrada, ako hoćete, 181 00:08:33,500 --> 00:08:35,309 za svoj rad na operativni sustav pod nazivom 182 00:08:35,309 --> 00:08:39,039 Unix, koji je vrlo sličan u duh ono što mi koristimo što je Linux. 183 00:08:39,039 --> 00:08:41,960 A pitanje je pitao u njegovu govoru, bitno 184 00:08:41,960 --> 00:08:44,910 kojom se utvrđuje okvir za godina i godina rasprave 185 00:08:44,910 --> 00:08:46,970 o povjerenju i sigurnosti, bio je to. 186 00:08:46,970 --> 00:08:50,410 U kojoj mjeri bi jedan veruje Izjava da program-- komad 187 00:08:50,410 --> 00:08:53,010 od softverskoj je bez trojanskih konja? 188 00:08:53,010 --> 00:08:56,500 Možda je važnije povjerenje ljudi koji su pisali softver. 189 00:08:56,500 --> 00:08:58,650 >> A u stvari, mi smo povezani na razgovor koji je 190 00:08:58,650 --> 00:09:02,400 dao prilikom prihvaćanja ovu nagradu u 80 na CS50 web stranici 191 00:09:02,400 --> 00:09:04,030 ispod stranici predavanja za danas. 192 00:09:04,030 --> 00:09:06,071 Jer ono što ćete vidjeti je da je on zapravo daje 193 00:09:06,071 --> 00:09:09,430 prilično jednostavan primjer kako čak prevodilac kao jeka ili što god 194 00:09:09,430 --> 00:09:13,950 Sastavljači drugi su korišteni u prošlosti, što ako ugrađen u prevodilac mi 195 00:09:13,950 --> 00:09:18,190 sami koristite je malo, ako uvjet da u biti, kaže, 196 00:09:18,190 --> 00:09:22,360 Ako primijetite da je ovaj broj koristi GetString funkcija ili GetInt 197 00:09:22,360 --> 00:09:26,600 funkcija, ići naprijed i umetnite stražnja vrata ili trojanski konj 198 00:09:26,600 --> 00:09:29,340 tako da taj program Sada ima neke nule 199 00:09:29,340 --> 00:09:30,930 i one koji rade nešto zlonamjerni. 200 00:09:30,930 --> 00:09:33,080 Prijava sve svoje tipke, prijenos te podatke 201 00:09:33,080 --> 00:09:35,100 na neki server, ili stvarno ništa. 202 00:09:35,100 --> 00:09:37,290 >> A što je Ken Thompson nastavlja raditi u svom govoru 203 00:09:37,290 --> 00:09:40,580 je pokazati da čak i ako imate pristup izvoru 204 00:09:40,580 --> 00:09:43,794 kod prevodilac koji zlonamjerno moglo biti to, 205 00:09:43,794 --> 00:09:46,210 to ne smeta, jer postoji ova kokoš i jaje 206 00:09:46,210 --> 00:09:49,500 stvarnost pored mnogih godine pri čemu se poželjni prevodiocima 207 00:09:49,500 --> 00:09:51,960 koriste se sami sastaviti. 208 00:09:51,960 --> 00:09:55,440 Drugim riječima, put natrag kada netko je da je napisao prvi prevodilac. 209 00:09:55,440 --> 00:09:59,060 A nakon toga, svaki put oni su ažurirani prevodilac promjenom izvornog koda, 210 00:09:59,060 --> 00:10:02,020 dodavanjem značajke i ponovnim za ljude poput nas za korištenje, dobro, 211 00:10:02,020 --> 00:10:04,270 oni koriste stari verzija prevodilac 212 00:10:04,270 --> 00:10:06,370 sastaviti novi verzija prevodilac. 213 00:10:06,370 --> 00:10:08,370 A ako pogledamo na razgovor koji je dao, 214 00:10:08,370 --> 00:10:10,970 vidjet ćete da je zbog toga te cirkularnosti, 215 00:10:10,970 --> 00:10:14,330 zapravo možete imati greške ili Trojanski konji ugrađeni u softver 216 00:10:14,330 --> 00:10:14,990 mi koristimo. 217 00:10:14,990 --> 00:10:18,010 A čak i ako pogledate na izvorni kod za te programe, 218 00:10:18,010 --> 00:10:21,550 ne bi čak moglo biti vidljivo jer je zapravo varanje 219 00:10:21,550 --> 00:10:24,710 u nekom starijem verzija prevodilac koji je tada bio 220 00:10:24,710 --> 00:10:27,340 ubrizgavanje prijetnju u našem softveru. 221 00:10:27,340 --> 00:10:29,740 >> Što je samo reći, da zapravo ne može i ne smije 222 00:10:29,740 --> 00:10:32,939 Povjerenje softver trčanje na našim prijenosnicima ili telefon ili bilo koji broj mjesta. 223 00:10:32,939 --> 00:10:36,230 A u stvari, kasnije u ovom semestru kada možemo početi govoriti o web programiranje 224 00:10:36,230 --> 00:10:38,521 i zapravo početi graditi web aplikacije sebe, 225 00:10:38,521 --> 00:10:40,285 ćemo govoriti o tim prijetnje i drugi. 226 00:10:40,285 --> 00:10:43,410 Sad, možda ste se pitali i primijetio da je maleni malo Darth 227 00:10:43,410 --> 00:10:45,842 Vader u isječaka koje Rubu je pokazivao postoji 228 00:10:45,842 --> 00:10:47,550 O Volkswagen. Ukoliko nikada nisam vidio, ja 229 00:10:47,550 --> 00:10:49,190 mislili smo trebali osvijetliti raspoloženje, jer je to sve 230 00:10:49,190 --> 00:10:50,780 vrlo depresivan i zastrašujuće. 231 00:10:50,780 --> 00:10:52,910 Idem gledati natrag na Super Bowlu 2011. godine 232 00:10:52,910 --> 00:10:55,300 kada komercijalne strane Volkswagen-- i to 233 00:10:55,300 --> 00:10:59,620 gotovo ih čini simpatičan again-- emitiran je prvi put na TV-u. 234 00:10:59,620 --> 00:11:04,039 To je drugi isječak 60 mislim da ćete uživati. 235 00:11:04,039 --> 00:11:04,705 [VIDEO PLAYBACK] 236 00:11:04,705 --> 00:11:08,198 [MUSIC - TEMA IZ "Zvjezdani ratovi"] 237 00:11:08,198 --> 00:11:35,643 238 00:11:35,643 --> 00:11:38,138 [Pas laje] 239 00:11:38,138 --> 00:11:50,114 240 00:11:50,114 --> 00:11:53,607 [CAR POČINJE] 241 00:11:53,607 --> 00:12:04,086 242 00:12:04,086 --> 00:12:05,955 [END PLAYBACK] 243 00:12:05,955 --> 00:12:06,830 DAVID J. Malan: Da. 244 00:12:06,830 --> 00:12:07,663 Samo sam ček. 245 00:12:07,663 --> 00:12:11,360 To auto je na popisu kršenja. 246 00:12:11,360 --> 00:12:12,000 U redu. 247 00:12:12,000 --> 00:12:14,040 Dakle, mi gledamo na neke pseudokod prije trenutak. 248 00:12:14,040 --> 00:12:15,380 I ovdje je veći Isječak koda pseudokod 249 00:12:15,380 --> 00:12:16,921 kako smo vidjeli nekoliko puta do sada. 250 00:12:16,921 --> 00:12:19,970 I neka je koristiti to je prilika sada uvesti novu programiranje 251 00:12:19,970 --> 00:12:23,776 tehnika koja smo učinili vidi algoritamski 252 00:12:23,776 --> 00:12:25,400 prošli tjedan, kada smo pogledali spajanje vrste. 253 00:12:25,400 --> 00:12:28,270 Ali budimo formalizirati i vidjeti kako možemo ga koristiti u stvarnom koda, 254 00:12:28,270 --> 00:12:30,350 a onda ćemo to iskoristiti Tehnika cestom najviše 255 00:12:30,350 --> 00:12:32,000 vjerojatno riješiti neke druge probleme. 256 00:12:32,000 --> 00:12:35,790 >> Dakle, to je bio jedan od prvih programa smo ikada napisao, iako u pseudokod koda. 257 00:12:35,790 --> 00:12:37,790 A ono što ovaj program omogućio nam je činiti tečaj 258 00:12:37,790 --> 00:12:41,510 bio je pronaći Mike Smith u telefonskom imeniku. 259 00:12:41,510 --> 00:12:46,216 I primjetiti u pojedinim linijama osam i 11 koji je imao tu Idi na izjavu. 260 00:12:46,216 --> 00:12:48,090 A u stvari, sigurno jezika, C među njima, 261 00:12:48,090 --> 00:12:50,006 zapravo nemamo izjavu da je doslovno 262 00:12:50,006 --> 00:12:52,710 ići koji vam omogućuje da skok na određenoj liniji. 263 00:12:52,710 --> 00:12:55,470 To je općenito namršti zbog to može biti vrlo lako zlostavljani 264 00:12:55,470 --> 00:12:58,490 i možete početi skakati svoj Program sve više mjesta u odnosu 265 00:12:58,490 --> 00:13:00,690 na korištenje vrste logika i kontrolu protoka 266 00:13:00,690 --> 00:13:04,000 da smo se koristi do sada sa samo petlje i uvjeti i slično. 267 00:13:04,000 --> 00:13:08,660 >> Ali možemo pojednostaviti ovaj algoritam u pseudokod koda kao što slijedi. 268 00:13:08,660 --> 00:13:11,250 Umjesto toga iterativan ili petlje pristup 269 00:13:11,250 --> 00:13:14,160 gdje smo zadržati ide natrag i natrag i vratiti da se postroje tri, 270 00:13:14,160 --> 00:13:18,300 zašto ne bismo samo vrsta čamac i više obično kažu u skladu sedam i 10, 271 00:13:18,300 --> 00:13:20,570 Samo zamijeniti ta dva para linije s, 272 00:13:20,570 --> 00:13:22,810 drugo, ako je ranije Smith u knjizi mi ćemo 273 00:13:22,810 --> 00:13:25,110 tražiti Mikeom u lijeva polovica knjige. 274 00:13:25,110 --> 00:13:28,560 Inače, ako je Smith kasnije u Knjiga, potražite Mike u pravu 275 00:13:28,560 --> 00:13:29,540 pola knjiga. 276 00:13:29,540 --> 00:13:31,180 I primijetiti već zakrivljenosti. 277 00:13:31,180 --> 00:13:31,680 Pravo? 278 00:13:31,680 --> 00:13:34,250 Ja sam u potrazi za Mikea u telefonskog imenika, a zatim 279 00:13:34,250 --> 00:13:37,090 I na kraju, možda pogoditi linije sedam ili možda linije 10 280 00:13:37,090 --> 00:13:41,089 a moja poduka sebi je potraga za Mikea u polovici telefonskom imeniku. 281 00:13:41,089 --> 00:13:42,380 Pa, kako mogu tražiti Mike? 282 00:13:42,380 --> 00:13:44,213 Ja sam u sredini u potrazi za Mike, zašto 283 00:13:44,213 --> 00:13:45,860 ste vrsta me poslati u krug? 284 00:13:45,860 --> 00:13:49,590 No, to je u redu, jer ono što je događa na veličinu problema, 285 00:13:49,590 --> 00:13:52,630 kako piše u liniji 7 i 10? 286 00:13:52,630 --> 00:13:54,989 Mi ne samo da govori pretragu za Mikea, potražite Mike. 287 00:13:54,989 --> 00:13:56,280 Mi izričito kaže što? 288 00:13:56,280 --> 00:13:58,694 289 00:13:58,694 --> 00:14:01,610 Traži za njega u lijevoj polovici pravo na pola što je učinkovito 290 00:14:01,610 --> 00:14:03,440 upola manji od problema. 291 00:14:03,440 --> 00:14:07,170 Tako da je u redu da smo vrsta sudjelovanje u ovom cirkularnosti, 292 00:14:07,170 --> 00:14:09,180 to kružni argument, jer barem smo 293 00:14:09,180 --> 00:14:11,090 što je problem manji i manji. 294 00:14:11,090 --> 00:14:14,220 I na kraju ćemo doći da tzv baze slučaj kada 295 00:14:14,220 --> 00:14:16,780 imamo samo jednu stranicu left-- kao naš volonter prošlog tjedna 296 00:14:16,780 --> 00:14:18,684 did-- imali smo jednu stranicu lijevo i onda mi ne 297 00:14:18,684 --> 00:14:21,600 morate držati u potrazi za Mike Smith zato što je bilo na toj stranici 298 00:14:21,600 --> 00:14:23,080 ili nije. 299 00:14:23,080 --> 00:14:27,480 >> Pa kako možemo provesti tu ideju, taj vrsta cirkularnosti u stvarnom kod? 300 00:14:27,480 --> 00:14:31,030 Pa, možemo utjecati tehniku koji je općenito poznat kao rekurzije. 301 00:14:31,030 --> 00:14:33,960 A vidjeli smo to u pseudokod za spajanje vrsta prošlog tjedna. 302 00:14:33,960 --> 00:14:37,190 Sjetite se da je to bio pseudokod za spajanje vrste. 303 00:14:37,190 --> 00:14:40,560 To je vjerojatno i jednostavnije nego mjehurić ili odabir ili umetanje sortiranje 304 00:14:40,560 --> 00:14:43,310 Samo u smislu jednostavnosti s kojima možete izraziti. 305 00:14:43,310 --> 00:14:46,750 >> Ali to je zato što Mi smo vrsta cirkularno 306 00:14:46,750 --> 00:14:51,350 govoreći, tražiti nešto u potrazi za njim opet. 307 00:14:51,350 --> 00:14:53,960 No, mi smo u potrazi bilo na lijeva polovina ili pravo na pola 308 00:14:53,960 --> 00:14:56,070 i onda na kraju smo spajanje u ovom slučaju. 309 00:14:56,070 --> 00:14:58,520 No, ovdje, previše, s ta dva sortiranje linije, 310 00:14:58,520 --> 00:15:01,320 smo opet imati ovaj ideja rekurzije. 311 00:15:01,320 --> 00:15:05,350 A konkretno što to znači, u kontekstu algoritam, 312 00:15:05,350 --> 00:15:10,880 je da algoritam je rekurzivna ako se koristi ili se poziva. 313 00:15:10,880 --> 00:15:14,330 >> Ili u odnosu na C, funkcija je recursive-- funkciju pod nazivom 314 00:15:14,330 --> 00:15:18,510 foo je rekurzivna ako foo, negdje u svom izvornom kodu, 315 00:15:18,510 --> 00:15:21,250 poziva funkciju sama foo. 316 00:15:21,250 --> 00:15:25,790 I to je loše ako sve foo nikad ne je sama i opet nazvati. 317 00:15:25,790 --> 00:15:30,600 To je u redu ako foo vremenom prestaje, kao što to čini spajanje vrsta, rekavši, čekaj malo, 318 00:15:30,600 --> 00:15:32,980 Ako se taj problem je super male, na primjer, 319 00:15:32,980 --> 00:15:35,840 ili nađoh onoga koga sam u potrazi za, samo se vrati. 320 00:15:35,840 --> 00:15:41,000 Ne rekurzivno, ne ciklički sam opet nazvati. 321 00:15:41,000 --> 00:15:44,200 >> I tako ćemo pogledati kako to može zapravo raditi. 322 00:15:44,200 --> 00:15:48,430 Tako ću ići naprijed i otvoriti do dva izvorni kod primjera ovdje. 323 00:15:48,430 --> 00:15:50,321 Od kojih je naziva sigma 0. 324 00:15:50,321 --> 00:15:52,320 A to uopće nije rekurzivna, ali uzmimo 325 00:15:52,320 --> 00:15:53,694 Pogledajte što ovaj program radi. 326 00:15:53,694 --> 00:15:55,737 Ja sam izvlaciti sve komentari, ali sve 327 00:15:55,737 --> 00:15:58,070 izvornog koda na CS50-a web stranica ima komentare ako 328 00:15:58,070 --> 00:15:59,570 želite pročitati kroz nju ponovno kasnije. 329 00:15:59,570 --> 00:16:02,010 I neka je napraviti par razuma provjerava ovdje. 330 00:16:02,010 --> 00:16:06,640 >> Dakle, na vrhu ovog koda, imamo uključuju CS50.h. 331 00:16:06,640 --> 00:16:07,650 Što učiniti? 332 00:16:07,650 --> 00:16:08,990 Zašto je ovdje? 333 00:16:08,990 --> 00:16:11,740 U razumne laik uvjete. 334 00:16:11,740 --> 00:16:12,424 Što to radi? 335 00:16:12,424 --> 00:16:12,858 Da. 336 00:16:12,858 --> 00:16:14,160 >> PUBLIKA: Tako da GetInt funkcija radi. 337 00:16:14,160 --> 00:16:16,243 >> DAVID J. Malan: Da funkcija GetInt radi. 338 00:16:16,243 --> 00:16:18,115 Zbog toga unutrašnjost datoteka, CS50.h, koji 339 00:16:18,115 --> 00:16:20,950 vidjet ćemo ubrzo u Uvjeti izvornim kodom, 340 00:16:20,950 --> 00:16:23,270 ima hrpa funkcija declared-- GetInt, GetString, 341 00:16:23,270 --> 00:16:26,950 i hrpa others-- i ako smo zapravo da Uključi liniju, 342 00:16:26,950 --> 00:16:29,320 prevodilac zveket nije će znati da ona postoji. 343 00:16:29,320 --> 00:16:32,400 A isto vrijedi i za liniju dva u kojima se definira int 344 00:16:32,400 --> 00:16:35,101 printf, koji je u funkciji držimo pomoću vrlo malo. 345 00:16:35,101 --> 00:16:37,850 Sada, linija četiri čini malo funky jer to je samo jedan brod. 346 00:16:37,850 --> 00:16:41,570 To je dobio zarez, bez kovrčava aparatić, nema kod unutar nje. 347 00:16:41,570 --> 00:16:44,640 No, ono što je učinio mi zovemo ova stvar je u prošlosti tjedna? 348 00:16:44,640 --> 00:16:45,140 Da. 349 00:16:45,140 --> 00:16:46,060 Dakle, prototip. 350 00:16:46,060 --> 00:16:48,390 A zašto imamo prototip koji čini 351 00:16:48,390 --> 00:16:51,050 da se malo suvišan obično, jer mi obično 352 00:16:51,050 --> 00:16:53,474 ponovno vidjeti funkciju kasnije u spisu, zar ne? 353 00:16:53,474 --> 00:16:56,390 Pa zašto mi have-- ste upravo grebanje glavu, ali ja ću ga uzeti. 354 00:16:56,390 --> 00:16:57,302 Da. 355 00:16:57,302 --> 00:17:00,000 >> PUBLIKA: [nečujan] Funkcija nakon što je glavni. 356 00:17:00,000 --> 00:17:01,000 DAVID J. Malan: Točno. 357 00:17:01,000 --> 00:17:04,089 Tako da je prevodilac vas zna na kraju će definirati ili provesti 358 00:17:04,089 --> 00:17:06,579 da funkcija nakon glavna, vjerojatno. 359 00:17:06,579 --> 00:17:08,462 Dakle, zveket i većina Sastavljači su vrsta glupi 360 00:17:08,462 --> 00:17:10,510 i oni će se samo zna ono što im kažem. 361 00:17:10,510 --> 00:17:12,569 A ako želite koristiti funkcija zove Sigma, 362 00:17:12,569 --> 00:17:15,710 bolje naučiti prevodilac da postoji unaprijed. 363 00:17:15,710 --> 00:17:17,970 >> Sada, glavni sama, čak iako je hrpa linija, 364 00:17:17,970 --> 00:17:19,839 je prilično poznato nadamo do sada. 365 00:17:19,839 --> 00:17:21,942 To je dobio do while petlja čija je svrha u životu 366 00:17:21,942 --> 00:17:24,400 Ovdje očito je da biste dobili pozitivni cijeli broj od korisnika. 367 00:17:24,400 --> 00:17:27,349 I samo zadržati ga gnjaviti ili nju dok ne surađuju. 368 00:17:27,349 --> 00:17:30,670 Onda u redu 16 Imam zanimljiv poziv. 369 00:17:30,670 --> 00:17:31,570 IntAnswer. 370 00:17:31,570 --> 00:17:33,710 Koji na lijevoj ruci strana mi daje Int 371 00:17:33,710 --> 00:17:36,650 što može store-- zove Answer-- koja će se pohraniti, očito, 372 00:17:36,650 --> 00:17:39,090 povratak vrijednost sigma. 373 00:17:39,090 --> 00:17:41,840 Dakle, Sigma je samo proizvoljna, ali smisleno ime 374 00:17:41,840 --> 00:17:44,500 da sam dao u funkciji čija je svrha u životu 375 00:17:44,500 --> 00:17:47,680 je da se jedan argument-- ćemo ga nazvati N u ovom case-- 376 00:17:47,680 --> 00:17:52,280 i samo da se iznos od tog broja plus svaki pozitivan broj koji je 377 00:17:52,280 --> 00:17:53,200 manji od njega. 378 00:17:53,200 --> 00:17:58,140 >> Dakle, ako sam proći broja 2 do sigma, želim dodati 2 plus 1 379 00:17:58,140 --> 00:18:00,240 plus 0-- ne 0-- tako da mi daje 3. 380 00:18:00,240 --> 00:18:05,320 Ako sam proći 3 do sigma, želim ima 3 plus 2 plus 1, što mi daje 6. 381 00:18:05,320 --> 00:18:05,900 I tako dalje. 382 00:18:05,900 --> 00:18:09,750 Dakle, to je samo zbraja sve brojeve manje od ili jednako tome. 383 00:18:09,750 --> 00:18:12,040 >> Sada, ovdje sam samo idem za ispis odgovor. 384 00:18:12,040 --> 00:18:17,330 Dakle kao brzo provjeriti razum, neka je bi sigma 0-- dot udarac sigma 0-- 385 00:18:17,330 --> 00:18:18,690 i neka mi tip u 2. 386 00:18:18,690 --> 00:18:19,960 I doista dobiti 3. 387 00:18:19,960 --> 00:18:21,240 Dopustite mi tip u 3. 388 00:18:21,240 --> 00:18:22,860 Ja doista dobiti 6. 389 00:18:22,860 --> 00:18:27,636 I ako bilo tko može učiniti math brzo, ako radim 50 što ću dobiti? 390 00:18:27,636 --> 00:18:29,839 >> PUBLIKA: [nečujan]. 391 00:18:29,839 --> 00:18:30,880 DAVID J. Malan: Pa, ne. 392 00:18:30,880 --> 00:18:33,340 No 1.275 što je prilično blizu. 393 00:18:33,340 --> 00:18:38,850 Dakle, ovo je rezultat rade 50 plus 49 plus 48 plus 47 plus 46 394 00:18:38,850 --> 00:18:40,349 sve do 1. 395 00:18:40,349 --> 00:18:41,390 Tako da je sve sigma radi. 396 00:18:41,390 --> 00:18:43,350 Ali da vidimo kako smo ga provodi sada. 397 00:18:43,350 --> 00:18:45,790 Dakle ovdje je sama funkcija. 398 00:18:45,790 --> 00:18:49,000 I to ne izgleda da je ništa s rekurzije još. 399 00:18:49,000 --> 00:18:51,070 U stvari, mi smo rabeći stara škola tehnika. 400 00:18:51,070 --> 00:18:56,680 Ja sam inicijalizacije varijablu zove suma na nulu, onda imam foreloop ovdje 401 00:18:56,680 --> 00:19:00,790 a ja sam proglašena Int zove Ja, postavljanje je jednaka 1-- 402 00:19:00,790 --> 00:19:04,080 iako sam mogao postaviti to jednako nula, ali budući da radim toga, 403 00:19:04,080 --> 00:19:05,340 koga briga ako je nula ili jedan. 404 00:19:05,340 --> 00:19:06,660 To će imati učinka. 405 00:19:06,660 --> 00:19:10,110 >> Tako sam iterating tako dugo kao što sam je manji ili jednak m, koje 406 00:19:10,110 --> 00:19:11,671 je argument da je donesen u. 407 00:19:11,671 --> 00:19:13,670 A onda sam samo zadržati povećavati I. i uvid 408 00:19:13,670 --> 00:19:20,010 petlje sve radim radi sumu plus jednako I. I to je namjerno. 409 00:19:20,010 --> 00:19:22,326 Ne želim to učiniti, u ovom slučaj, kao zbroj plus plus. 410 00:19:22,326 --> 00:19:24,790 Želim zapravo dodati trenutna vrijednost I 411 00:19:24,790 --> 00:19:28,190 koji čuva sve veći i veći a veći za trčanje odbrojavati. 412 00:19:28,190 --> 00:19:30,210 >> A onda sam se vratiti svotu. 413 00:19:30,210 --> 00:19:33,850 I tako je odgovor dobiva vrijednost svotu. 414 00:19:33,850 --> 00:19:35,282 A onda sam ga ispisati. 415 00:19:35,282 --> 00:19:37,740 Dakle, postoji mogućnost ovdje ipak, na neki način pojednostaviti 416 00:19:37,740 --> 00:19:41,260 ovaj kod konceptualno i vrsta udarca jedan je 417 00:19:41,260 --> 00:19:43,250 smeta u smislu jednostavnost iako to 418 00:19:43,250 --> 00:19:45,700 potrebno neko vrijeme za sortiranje od cijeniti zašto je to 419 00:19:45,700 --> 00:19:47,330 je moćan u tim malim primjerima. 420 00:19:47,330 --> 00:19:50,380 Ovdje je Sigma one-- tako Druga verzija ovog koda. 421 00:19:50,380 --> 00:19:55,290 Sve do vrha identičan tako ta ista priča vrijedi kao i prije. 422 00:19:55,290 --> 00:19:59,220 No, sada ćemo pogledati na provedba sigma, 423 00:19:59,220 --> 00:20:05,040 Ja sam reducirane na samo njima lines-- četiri linija koda, zapravo, 424 00:20:05,040 --> 00:20:06,980 plus neke vitičastih zagrada i bijeli prostor. 425 00:20:06,980 --> 00:20:07,930 >> Ali što ja to radim? 426 00:20:07,930 --> 00:20:11,050 Ako m je manji od ili jednak nula, moram vrsta rukovanje 427 00:20:11,050 --> 00:20:12,490 da super jednostavan slučaj. 428 00:20:12,490 --> 00:20:15,450 A ako mi ruku nula ili ništa negativna što je samo čudno, 429 00:20:15,450 --> 00:20:17,909 Samo ću samovoljno ali dosljedno vratiti na nulu. 430 00:20:17,909 --> 00:20:20,200 Ne želim ovo na dobiti u neke čudne beskonačnog 431 00:20:20,200 --> 00:20:21,810 petlje zbog negativne vrijednosti. 432 00:20:21,810 --> 00:20:25,070 Dakle, ja samo kažem, ako mi daju nula ili manje, ja se vraćaju na nulu. 433 00:20:25,070 --> 00:20:28,220 >> No, to je dobro, jer to je da jedna stranica iz telefonskog imenika 434 00:20:28,220 --> 00:20:28,790 što je ostalo. 435 00:20:28,790 --> 00:20:32,660 Ja gristi s vrlo specifičan problem i ne zove nešto rekurzivno. 436 00:20:32,660 --> 00:20:36,580 No, u redu 31, što Ne čini mi se da se radi? 437 00:20:36,580 --> 00:20:39,780 Zagradama su samo čuvanje stvari, nadam se, malo jasnije. 438 00:20:39,780 --> 00:20:42,110 Ali sve radim je sam M- povratka god 439 00:20:42,110 --> 00:20:45,790 što me-- plus ruci vrijednost M- žao, 440 00:20:45,790 --> 00:20:49,052 plus vrijednost sigma od m minus 1. 441 00:20:49,052 --> 00:20:50,010 Dakle, što to znači? 442 00:20:50,010 --> 00:20:53,965 Ako mi date broj 3 kao ulaz, odgovor želim dobiti konačnici 443 00:20:53,965 --> 00:20:57,307 je 6 jer 3 plus 2 plus 1 daje mi 6. 444 00:20:57,307 --> 00:20:59,390 Ali kako ja mislim o tome kako je to kod je trčanje? 445 00:20:59,390 --> 00:21:03,070 Prvi put kad sam nazvati sigma i ja proći u vrijednosti 3, 446 00:21:03,070 --> 00:21:07,960 To je kao da kažete na komad papira, ovdje je vrijednost 3 447 00:21:07,960 --> 00:21:09,920 i ja sam prošao to kao sigma. 448 00:21:09,920 --> 00:21:13,090 3 očito ne manje od 0 do IF uvjet ne primjenjuje. 449 00:21:13,090 --> 00:21:14,020 Drugi ne. 450 00:21:14,020 --> 00:21:14,990 Dakle, što da radim? 451 00:21:14,990 --> 00:21:19,902 Želim se vratiti m, što je 3, plus Sigma m minus 1. 452 00:21:19,902 --> 00:21:21,110 Pa neka me pratiti ovo. 453 00:21:21,110 --> 00:21:22,710 Idem staviti ovo komad papira dolje. 454 00:21:22,710 --> 00:21:24,668 A što vrijednost, da se Jasno, ja sam idući u proći 455 00:21:24,668 --> 00:21:26,540 u sigma u ovom trenutku u priči? 456 00:21:26,540 --> 00:21:28,080 Koji broj? 457 00:21:28,080 --> 00:21:28,610 2, zar ne? 458 00:21:28,610 --> 00:21:29,670 3 minus 1 je 2. 459 00:21:29,670 --> 00:21:32,000 Tako sam samo trebate malo komadić papira ovdje. 460 00:21:32,000 --> 00:21:33,931 Tako sada Sigma je dobivanje zove opet. 461 00:21:33,931 --> 00:21:35,930 I ja sam namjerno stavio ovo dolje jer je 462 00:21:35,930 --> 00:21:38,070 vrsta kao pauziranje da je verzija priče 463 00:21:38,070 --> 00:21:40,720 jer sada sam fokusiran na signal m minus 1. 464 00:21:40,720 --> 00:21:42,660 Tako je m 3, m minus 1 2. 465 00:21:42,660 --> 00:21:45,110 Dakle, ovdje je 2 koje sam prošao. 466 00:21:45,110 --> 00:21:48,510 2 je očito ne manje od 0, tako da slučaj ne primjenjuje. 467 00:21:48,510 --> 00:21:53,445 Inače sam se vratiti m, što je to stvar, plus Sigma onoga što vrijednosti? 468 00:21:53,445 --> 00:21:56,160 469 00:21:56,160 --> 00:21:59,650 Dakle, ako Sigma od 1-- jer je m sad 2 do 2 minus 1 je 1. 470 00:21:59,650 --> 00:22:01,950 Dakle, sada imam samo vrijednost 1. 471 00:22:01,950 --> 00:22:04,810 Ja sam prolazi samo broj 1 do funkcija sigma-- 472 00:22:04,810 --> 00:22:09,120 ili osobno here-- tako 1 očito nije manje od nule, i dalje se ne primjenjuje. 473 00:22:09,120 --> 00:22:12,970 >> Inače povratka 1 uz Sigma čega? 474 00:22:12,970 --> 00:22:13,470 0. 475 00:22:13,470 --> 00:22:14,678 Pa neka mi samo zapamtite to. 476 00:22:14,678 --> 00:22:15,920 Ja ću se vratiti na to kasnije. 477 00:22:15,920 --> 00:22:18,060 Sada ću ići naprijed i točkica dolje broja 0, jer je to 478 00:22:18,060 --> 00:22:19,470 moj argument ili parametar. 479 00:22:19,470 --> 00:22:22,400 Ja sam prošli broj 0 i na kraju taj proces 480 00:22:22,400 --> 00:22:25,760 samo ponavlja sebi oglas nauseum ne prestaje, jer što 481 00:22:25,760 --> 00:22:28,820 trebam učiniti odmah nakon što vidim ovu 0? 482 00:22:28,820 --> 00:22:29,790 Sam se vratiti na nulu. 483 00:22:29,790 --> 00:22:31,790 Tako sada imate premotati priču. 484 00:22:31,790 --> 00:22:34,430 >> Ako ja sada ići unatrag u vremenu, što je najnovija stvar 485 00:22:34,430 --> 00:22:36,670 Ja sam, ako ste bili doslovno premotavanja video? 486 00:22:36,670 --> 00:22:41,630 Idem pokupiti najnovije 1 i to mi daje 1 plus 0 1. 487 00:22:41,630 --> 00:22:44,100 Ako sam zadržati premotavanje Priča, koja će mi dati 488 00:22:44,100 --> 00:22:46,880 2 plus to prikazuju vrijednosti, što je 1. 489 00:22:46,880 --> 00:22:47,789 Dakle, to je 3. 490 00:22:47,789 --> 00:22:49,330 A onda ću zadržati premotavanja. 491 00:22:49,330 --> 00:22:54,220 Kad sam prvi put spustio broj 3-- tako 3 plus 3 mi daje 6. 492 00:22:54,220 --> 00:22:57,272 >> A sada, ako ste premota video do ove točke, 493 00:22:57,272 --> 00:22:58,980 to je bio vrlo Prvo pitanje koje sam pitao. 494 00:22:58,980 --> 00:23:01,450 Kada prošlo 3, što je Sigma 3? 495 00:23:01,450 --> 00:23:04,204 To je uistinu 6, suma svi ti komadi papira. 496 00:23:04,204 --> 00:23:07,120 Dakle, ako je to potrebno malo da se wrap your mind oko, to je u redu. 497 00:23:07,120 --> 00:23:10,700 Ali smatram da je bio little-- njega bio je vrlo namjerno da sam naslagani 498 00:23:10,700 --> 00:23:12,990 ovi brojevi na vrhu svake druge. 499 00:23:12,990 --> 00:23:17,440 To je vrsta kao vlasništvo memory-- rekord u vremenu, 500 00:23:17,440 --> 00:23:19,940 kao prikupljani u videu, da ja doista mogu premotati u. 501 00:23:19,940 --> 00:23:24,350 A mi ćemo se vratiti da metafora u samo malo. 502 00:23:24,350 --> 00:23:28,240 >> Ali prvo, ispada da postoji puno geeks i smiješnih ljudi, 503 00:23:28,240 --> 00:23:29,614 Mislim, u Googleu. 504 00:23:29,614 --> 00:23:31,530 Bi li netko tko je vrlo dobro googling uma 505 00:23:31,530 --> 00:23:34,270 dolazi se samo na trenutak i mi pomoći tražiti nešto? 506 00:23:34,270 --> 00:23:35,650 Vrlo, vrlo niska ključ. 507 00:23:35,650 --> 00:23:37,870 Netko tko nikad nije doći prije, možda. 508 00:23:37,870 --> 00:23:38,370 U REDU. 509 00:23:38,370 --> 00:23:39,030 Da? 510 00:23:39,030 --> 00:23:39,530 Ajde. 511 00:23:39,530 --> 00:23:41,410 Dođi dolje. 512 00:23:41,410 --> 00:23:42,183 Kako se zoveš? 513 00:23:42,183 --> 00:23:42,870 >> SAM: Sam. 514 00:23:42,870 --> 00:23:44,290 >> DAVID J. Malan: Sam došao na dolje. 515 00:23:44,290 --> 00:23:45,320 To je isto. 516 00:23:45,320 --> 00:23:46,280 Drago mi je. 517 00:23:46,280 --> 00:23:46,780 Hej. 518 00:23:46,780 --> 00:23:47,580 Dođite. 519 00:23:47,580 --> 00:23:51,290 Dakle, sve što trebate učiniti, ako je mogli, Sam, ovdje je Google. 520 00:23:51,290 --> 00:23:53,240 Možete li tražiti pojam rekurzije? 521 00:23:53,240 --> 00:23:55,770 522 00:23:55,770 --> 00:23:56,270 Nemojte pokvariti. 523 00:23:56,270 --> 00:23:59,940 524 00:23:59,940 --> 00:24:00,970 >> A sada let's-- da. 525 00:24:00,970 --> 00:24:03,380 OK Kliknite to. 526 00:24:03,380 --> 00:24:04,315 Bolje kliknite toga. 527 00:24:04,315 --> 00:24:07,020 528 00:24:07,020 --> 00:24:08,020 Ahh, dobili ga. 529 00:24:08,020 --> 00:24:08,520 Ne? 530 00:24:08,520 --> 00:24:09,050 U REDU. 531 00:24:09,050 --> 00:24:10,430 Tako ćemo napraviti par drugih. 532 00:24:10,430 --> 00:24:12,830 Ne toliko vezani akademski ovdje, ali si 533 00:24:12,830 --> 00:24:14,520 ikada tražili Google za anagram? 534 00:24:14,520 --> 00:24:15,280 >> SAM: Ne 535 00:24:15,280 --> 00:24:15,520 >> DAVID J. Malan: U redu. 536 00:24:15,520 --> 00:24:17,186 Traži anagram umjesto rekurzije. 537 00:24:17,186 --> 00:24:22,540 538 00:24:22,540 --> 00:24:23,790 Kako o iskosa. 539 00:24:23,790 --> 00:24:25,515 Jeste li ikad tražili iskosa? 540 00:24:25,515 --> 00:24:29,260 541 00:24:29,260 --> 00:24:32,692 Sad, ovo je malo teško vidjeti, ali nadamo everything's-- OK. 542 00:24:32,692 --> 00:24:34,150 To je samo ti i ja uživam u ovome. 543 00:24:34,150 --> 00:24:34,690 U REDU. 544 00:24:34,690 --> 00:24:38,950 >> Dakle konačno, to one's-- to je malo iskosa. 545 00:24:38,950 --> 00:24:40,810 Sada napraviti barel role. 546 00:24:40,810 --> 00:24:44,460 547 00:24:44,460 --> 00:24:45,310 Divno. 548 00:24:45,310 --> 00:24:45,910 U redu. 549 00:24:45,910 --> 00:24:47,110 Veliko hvala Sam. 550 00:24:47,110 --> 00:24:49,416 Izvoli. 551 00:24:49,416 --> 00:24:50,400 Hvala. 552 00:24:50,400 --> 00:24:52,807 >> Dakle, što se događa u svim tih glupih primjera? 553 00:24:52,807 --> 00:24:55,640 Pa stvarno, ispod haube Googleovi milijuni linija koda 554 00:24:55,640 --> 00:24:58,860 očito je malo glup AKO uvjeti koji su u biti 555 00:24:58,860 --> 00:25:01,160 provjere da li korisnik ima upisali u ovom izrazu, 556 00:25:01,160 --> 00:25:03,760 učiniti nešto što je vjerojatno uzeo Netrivijalno količina vremena 557 00:25:03,760 --> 00:25:06,080 provesti samo biti zabavno na ovaj način. 558 00:25:06,080 --> 00:25:08,430 No, to je sve što zbroji dolje ispod haube. 559 00:25:08,430 --> 00:25:11,570 Ali, naravno, rekurzija je više od geekier 560 00:25:11,570 --> 00:25:13,880 primjer među one posebne trikove. 561 00:25:13,880 --> 00:25:16,880 A sigurno postoji drugi vani kao i da možda nisu ni 562 00:25:16,880 --> 00:25:18,230 otkrio samo još. 563 00:25:18,230 --> 00:25:22,830 >> Pa pogledajte, ili razmotriti Sada sljedeći program, 564 00:25:22,830 --> 00:25:24,830 i svakako iskoristite bilo od njih na putu van. 565 00:25:24,830 --> 00:25:28,820 Ja ću ići naprijed i otvoriti program koji je 566 00:25:28,820 --> 00:25:30,920 će pokušati da zamijene dvije vrijednosti. 567 00:25:30,920 --> 00:25:33,210 No, prije nego što smo ići tamo, učinimo to. 568 00:25:33,210 --> 00:25:38,500 Možemo li dobiti još jedan volonter, mislim? 569 00:25:38,500 --> 00:25:40,480 Želite volontirati? 570 00:25:40,480 --> 00:25:40,980 Ne? 571 00:25:40,980 --> 00:25:41,890 Dođi gore. 572 00:25:41,890 --> 00:25:42,390 Dođi gore. 573 00:25:42,390 --> 00:25:42,890 U redu. 574 00:25:42,890 --> 00:25:44,136 Dakle, vaše ime je što? 575 00:25:44,136 --> 00:25:44,810 >> LAUREN: Lauren. 576 00:25:44,810 --> 00:25:45,768 >> DAVID J. Malan: Lauren. 577 00:25:45,768 --> 00:25:46,890 Dođi gore, Lauren. 578 00:25:46,890 --> 00:25:50,140 Tako Lauren je bio izazvao ovdje kako slijedi. 579 00:25:50,140 --> 00:25:52,310 Drago mi je. 580 00:25:52,310 --> 00:25:55,730 Tako Lauren ovdje ima ispred njezine dvije prazne čaše. 581 00:25:55,730 --> 00:25:57,570 I mi imamo neke naranče sok i mlijeko 582 00:25:57,570 --> 00:26:00,301 i mi ćemo ići naprijed i učiniti sljedeće. 583 00:26:00,301 --> 00:26:01,550 Samo ćemo ispuniti to. 584 00:26:01,550 --> 00:26:07,840 Nekoliko unci mlijeka ovamo i neka je ispunite malo soka od naranče ovdje. 585 00:26:07,840 --> 00:26:11,475 >> I pred svima ovi članovi publike, 586 00:26:11,475 --> 00:26:13,550 zamijeniti dvije vrijednosti tih šalica. 587 00:26:13,550 --> 00:26:16,970 Stavite sok od naranče u mlijeku kupu a mlijeko u sok od naranče šalicu. 588 00:26:16,970 --> 00:26:22,380 589 00:26:22,380 --> 00:26:26,150 Kako biste to učinili, ako ste bili na kući i imao pristup drugim pomagala? 590 00:26:26,150 --> 00:26:27,400 LAUREN: Stavite ga u još jednu šalicu. 591 00:26:27,400 --> 00:26:28,191 DAVID J. Malan: U redu. 592 00:26:28,191 --> 00:26:31,940 Tako ćemo imati privremeni promjenjiva, ako će. 593 00:26:31,940 --> 00:26:35,871 I ići naprijed i sada provode taj isti postupak zamjene. 594 00:26:35,871 --> 00:26:36,370 Tako dobro. 595 00:26:36,370 --> 00:26:41,490 Mi smo stavili SL u privremeni promjenjiva, mlijeko u SL varijable, 596 00:26:41,490 --> 00:26:44,481 a sad privremena varijabla u varijablu mlijeka. 597 00:26:44,481 --> 00:26:44,980 U REDU. 598 00:26:44,980 --> 00:26:48,740 Dakle, vrlo dobro do sada učinjeno. 599 00:26:48,740 --> 00:26:50,990 Tako ispada out-- drže da Mislio je samo na trenutak. 600 00:26:50,990 --> 00:26:54,479 Evo, samo to monstrum malo, to će biti odgovarajući broj C 601 00:26:54,479 --> 00:26:55,520 da smo upravo provodi. 602 00:26:55,520 --> 00:26:58,650 Imali smo dva ulaza, A i B, oba koje ćemo samo reći zbog jednostavnosti se 603 00:26:58,650 --> 00:26:59,260 int a. 604 00:26:59,260 --> 00:27:02,780 I obavijest ovdje, ako želim mijenjati vrijednosti dviju varijabli, A i B, 605 00:27:02,780 --> 00:27:06,890 mi doista treba posrednik, A privremena varijabla, privremeni šalice, 606 00:27:06,890 --> 00:27:10,830 u kojem je jedna od izlije vrijednosti tako da imamo rezervirano mjesto za to. 607 00:27:10,830 --> 00:27:13,480 Ali onda kod je točno kao Lauren ovdje provode. 608 00:27:13,480 --> 00:27:15,500 >> Sada, samo da bi dobili malo luđi, ispada 609 00:27:15,500 --> 00:27:20,930 da možete to učiniti bez privremena varijabla. 610 00:27:20,930 --> 00:27:24,870 Da biste to učinili ispravno, iako ćemo imati varati s nekim kemije. 611 00:27:24,870 --> 00:27:26,380 Imamo neke dodatne šalice ovdje. 612 00:27:26,380 --> 00:27:29,600 Dakle, najbliža stvar koja izgleda poput mlijeka i vode perhaps-- 613 00:27:29,600 --> 00:27:34,090 ili mlijeko i OJ-- je imamo neke vode, pa ćemo ispuniti ovo gore 614 00:27:34,090 --> 00:27:36,486 s nekoliko unci čistom vodom. 615 00:27:36,486 --> 00:27:38,332 To je vjerojatno previše. 616 00:27:38,332 --> 00:27:38,832 Da. 617 00:27:38,832 --> 00:27:39,934 To je definitivno previše. 618 00:27:39,934 --> 00:27:40,600 Držite na jednom sek. 619 00:27:40,600 --> 00:27:43,520 620 00:27:43,520 --> 00:27:48,420 >> I sada imamo ulje, koje, ako se dobro sjećam od srednje škole satu kemije, 621 00:27:48,420 --> 00:27:49,990 nadam se da se ne miješati s vodom. 622 00:27:49,990 --> 00:27:53,650 Ali to vrsta vrsta izgleda kao mlijeko i SL. 623 00:27:53,650 --> 00:27:55,760 Tako sada, bez korištenja privremena varijabla, 624 00:27:55,760 --> 00:27:59,260 Možete li zamijeniti one dvije vrijednosti? 625 00:27:59,260 --> 00:28:03,884 Dakle ulja ide u čašu vode, voda ide u naftnom šalicu. 626 00:28:03,884 --> 00:28:04,800 LAUREN: Nema druge čaše? 627 00:28:04,800 --> 00:28:05,940 DAVID J. Malan: Nema druge čaše. 628 00:28:05,940 --> 00:28:07,860 I nisam zapravo testirani ovo prije ove godine 629 00:28:07,860 --> 00:28:10,110 tako da ne znam da li će to zapravo rade kemijski. 630 00:28:10,110 --> 00:28:16,130 631 00:28:16,130 --> 00:28:18,650 To nije trebalo dogoditi. 632 00:28:18,650 --> 00:28:19,761 Je li to raditi? 633 00:28:19,761 --> 00:28:20,260 U redu. 634 00:28:20,260 --> 00:28:20,990 Dakle odvajanje? 635 00:28:20,990 --> 00:28:21,490 Dobra. 636 00:28:21,490 --> 00:28:24,714 Sada moramo dobiti Voda u drugu šalicu. 637 00:28:24,714 --> 00:28:27,630 Pametniji kemije concentrators mogla vjerojatno to učiniti bolje od mene. 638 00:28:27,630 --> 00:28:28,510 >> LAUREN: Voda je na dnu. 639 00:28:28,510 --> 00:28:31,910 >> DAVID J. Malan su: water-- da je što je ključ zadnji put mi je to učinio. 640 00:28:31,910 --> 00:28:33,950 Morate to učiniti u pravom redoslijedu. 641 00:28:33,950 --> 00:28:34,450 Da. 642 00:28:34,450 --> 00:28:35,270 To je u redu. 643 00:28:35,270 --> 00:28:37,290 Dakle, sada imamo dvije šalice ulja. 644 00:28:37,290 --> 00:28:37,790 U REDU. 645 00:28:37,790 --> 00:28:38,510 To je u redu. 646 00:28:38,510 --> 00:28:40,110 No, ako je to kemijski radio od I-- 647 00:28:40,110 --> 00:28:41,200 >> LAUREN: Ovo je voda. 648 00:28:41,200 --> 00:28:41,930 >> DAVID J. Malan: To je uglavnom voda. 649 00:28:41,930 --> 00:28:42,430 U redu. 650 00:28:42,430 --> 00:28:44,210 No, to je još uvijek isti kao i prije šalicu. 651 00:28:44,210 --> 00:28:47,570 Dakle, prelijte it-- probati tamo. 652 00:28:47,570 --> 00:28:49,300 U REDU. 653 00:28:49,300 --> 00:28:51,010 Ovo je dobro iskoristiti vrijeme predavanja danas. 654 00:28:51,010 --> 00:28:51,510 U REDU. 655 00:28:51,510 --> 00:28:53,890 Tako sada we-- lijepo. 656 00:28:53,890 --> 00:28:55,460 Nekako. 657 00:28:55,460 --> 00:28:55,960 U redu. 658 00:28:55,960 --> 00:28:56,690 Dakle, vrlo dobar. 659 00:28:56,690 --> 00:29:00,006 Hvala Lauren. 660 00:29:00,006 --> 00:29:01,950 Vrlo dobro učinio. 661 00:29:01,950 --> 00:29:04,570 >> Dakle, samo puhati vaš um, i to je možda nešto 662 00:29:04,570 --> 00:29:08,660 da se igraju s, ako vam se sviđa u CS50 ID, možete, zapravo, zamijeniti dvije varijable 663 00:29:08,660 --> 00:29:11,470 bez privremeni cijeli broj. 664 00:29:11,470 --> 00:29:13,060 I ovo je odgovarajući C koda. 665 00:29:13,060 --> 00:29:16,110 A ako se sjećate iz prošlog Srijeda, uveli smo, ako je kratko, 666 00:29:16,110 --> 00:29:19,720 neki novi operatori u C, a ne netko podsjetiti što malo mrkve 667 00:29:19,720 --> 00:29:23,660 Simbol je, da se malo trokutasti Simbol na tipkovnici predstavlja? 668 00:29:23,660 --> 00:29:26,003 Što bitovima operater? 669 00:29:26,003 --> 00:29:26,770 >> PUBLIKA: EXOR. 670 00:29:26,770 --> 00:29:27,645 >> DAVID J. Malan: EXOR. 671 00:29:27,645 --> 00:29:28,560 Ekskluzivni Ili. 672 00:29:28,560 --> 00:29:32,920 Dakle, ako želite, samo za zabavu na dom, dati A i B dva proizvoljna 673 00:29:32,920 --> 00:29:36,072 Vrijednosti poput bilo eight-- i ja će izabrati osam bita vrijednost. 674 00:29:36,072 --> 00:29:38,530 Ako ste to učiniti s 32 bita, ćete vrlo brzo dosadi. 675 00:29:38,530 --> 00:29:42,150 Ali samo dati osam malo vrijednost koja je god, jedan ili dva, 676 00:29:42,150 --> 00:29:43,790 i dati b sličan vrijednosti. 677 00:29:43,790 --> 00:29:46,810 I onda pomoću definicije od XOR od prošle srijede, 678 00:29:46,810 --> 00:29:52,560 prijaviti da malo po malo, svaki od te osam bitova u svakom od A i B, 679 00:29:52,560 --> 00:29:54,980 a zatim ga učiniti upravo po ovom kodu. 680 00:29:54,980 --> 00:29:58,170 I to nije netočno ono vidite ovdje na zaslonu. 681 00:29:58,170 --> 00:30:02,100 To doista svodi tri XOR operacija 682 00:30:02,100 --> 00:30:05,910 i nekako magično A i b razmijeniti stajališta 683 00:30:05,910 --> 00:30:08,010 bez gubitka podataka. 684 00:30:08,010 --> 00:30:11,580 >> Dakle, ulje i voda trik je najbliža stvarnom svijetu utjelovljenje 685 00:30:11,580 --> 00:30:12,980 Nisam mogao zamisliti da oponaša toga. 686 00:30:12,980 --> 00:30:15,950 No, to je sigurno lakše koristite privremenu varijablu, 687 00:30:15,950 --> 00:30:16,920 kao u ovom slučaju ovdje. 688 00:30:16,920 --> 00:30:21,190 A i ovo je prilika kažu, također, ta vrsta mikro optimizacije, 689 00:30:21,190 --> 00:30:23,590 kao računalni znanstvenik bih, dok je vrsta zabave 690 00:30:23,590 --> 00:30:27,060 hvaliti o tome kako je to učinio bez kao zamjene s pomoćnim varijable, 691 00:30:27,060 --> 00:30:28,640 to nije sve što je uvjerljiv. 692 00:30:28,640 --> 00:30:31,619 Budući da se spasi 32 bita, što u slučaju stvarne int, 693 00:30:31,619 --> 00:30:33,410 nije sve što je primamljivo na sustav u kojem 694 00:30:33,410 --> 00:30:36,722 možda koristite desetaka megabajta ili čak i više, kao memorijski ovih dana. 695 00:30:36,722 --> 00:30:38,680 A u stvari, kad smo dobili na kasnije problema set 696 00:30:38,680 --> 00:30:41,010 i implementirati čaroliju provjeru i vi ćete 697 00:30:41,010 --> 00:30:43,550 biti izazvani učiniti s ovo kao malo RAM-a što je manje 698 00:30:43,550 --> 00:30:46,820 Vrijeme je moguće na computer-- vas još 699 00:30:46,820 --> 00:30:50,160 imaju tjedan dana za provedbu it-- ćete have-- ćete biti 700 00:30:50,160 --> 00:30:51,799 izazvan kako bi se smanjila te resurse. 701 00:30:51,799 --> 00:30:53,840 I to je zapravo jedina prigodom ovaj semestar 702 00:30:53,840 --> 00:30:57,940 gdje ćete biti ohrabreni da obrije off čak i najfinije izvedbe 703 00:30:57,940 --> 00:30:59,340 Troškovi drugačije. 704 00:30:59,340 --> 00:31:02,200 >> Dakle what-- kako možemo vidjeti u stvarnoj šifru? 705 00:31:02,200 --> 00:31:04,530 Dopustite mi ići naprijed sada i otvoriti primjer 706 00:31:04,530 --> 00:31:07,700 da namjerno naziva Ne Swap jer ne 707 00:31:07,700 --> 00:31:10,670 u stvari mijenjati varijable kao što ste zapravo mogli očekivati. 708 00:31:10,670 --> 00:31:12,260 Tako ćemo pogledati. 709 00:31:12,260 --> 00:31:17,050 Evo program koji nema CS50 Knjižnica događa, samo standardna I / O. 710 00:31:17,050 --> 00:31:19,560 Sada imamo prototip za zamjenu do vrha koji je upravo 711 00:31:19,560 --> 00:31:21,540 znači to je dobio biti definirani naknadno. 712 00:31:21,540 --> 00:31:22,550 I ovdje je glavni. 713 00:31:22,550 --> 00:31:26,000 >> I proizvoljno pripisana X i Y, odnosno, vrijednosti jednog i dva 714 00:31:26,000 --> 00:31:28,590 samo zato jer su mali i jednostavno razmišljati o tome. 715 00:31:28,590 --> 00:31:32,280 A onda sam samo hrpa printfs gdje sam ček razum. x je 1 716 00:31:32,280 --> 00:31:35,110 i y je 2 vjerojatno što ti printfs će reći. 717 00:31:35,110 --> 00:31:36,530 Dakle, nema magije do sada. 718 00:31:36,530 --> 00:31:40,100 >> Onda ću tvrditi sa ispis def, zamjene dot dot dot. 719 00:31:40,100 --> 00:31:43,730 Idem nazvati swap funkcija, prolaze u x i y. 720 00:31:43,730 --> 00:31:47,350 I pretpostavimo da je za sada Zamjenski se provodi točno 721 00:31:47,350 --> 00:31:49,930 kao što je bio trenutak prije privremenu varijablu. 722 00:31:49,930 --> 00:31:52,670 I tako ja tvrdim hrabro, zamijenili. 723 00:31:52,670 --> 00:31:55,429 X je sada ovo i y je sada da. 724 00:31:55,429 --> 00:31:57,220 Ali datoteka, naravno, zove swap. 725 00:31:57,220 --> 00:31:58,678 Tako ćemo zapravo vidjeti što se događa. 726 00:31:58,678 --> 00:32:04,450 Ako sam sastaviti nikakvu zamjenu, a zatim to ./noswap, x je 1, y je 2. 727 00:32:04,450 --> 00:32:05,770 Zamjene zamijenili. 728 00:32:05,770 --> 00:32:07,200 x je 1, y je 2. 729 00:32:07,200 --> 00:32:11,980 Dakle, to zapravo čini se da je manjkav, čak iako swap-- neka je spustite now-- 730 00:32:11,980 --> 00:32:16,542 provodi upravo po broj sam predložio maloprije. 731 00:32:16,542 --> 00:32:19,000 Dakle, nećemo dobiti fancy sa XOR stvari za sada. 732 00:32:19,000 --> 00:32:21,890 To, također, treba raditi samo kao i sa mlijekom i SL, 733 00:32:21,890 --> 00:32:25,820 ali to ne čini da se radi. 734 00:32:25,820 --> 00:32:27,180 >> Tako ćemo to učiniti opet. 735 00:32:27,180 --> 00:32:29,310 Možda sam samo ne to radi u redu. 736 00:32:29,310 --> 00:32:32,010 Tako ćemo pokrenuti Nikakva Swap opet. 737 00:32:32,010 --> 00:32:32,900 Možda I-- br. 738 00:32:32,900 --> 00:32:34,400 Dakle, to je samo ne radi. 739 00:32:34,400 --> 00:32:36,060 Tako ćemo napraviti malo provjeriti razum. 740 00:32:36,060 --> 00:32:39,690 Dopustite mi ići naprijed ovdje Swap i samo dodati, pričekajte minutu, 741 00:32:39,690 --> 00:32:43,856 a je% i / n i neka je plug-in je vrijednost. 742 00:32:43,856 --> 00:32:45,730 Jer ja stvarno želim da vidi što se događa. 743 00:32:45,730 --> 00:32:47,570 I doista, ovo je uklanjanja bugova tehnika 744 00:32:47,570 --> 00:32:50,028 da biste mogli koristiti u radno vrijeme ili kod kuće već, 745 00:32:50,028 --> 00:32:53,560 srodan prvoj polovici Dana Armendariz je videozapis u PSET3 746 00:32:53,560 --> 00:32:56,870 u kojoj smo uveli print def kao preporučena tehnika, barem 747 00:32:56,870 --> 00:32:58,080 za jednostavne slučajeve. 748 00:32:58,080 --> 00:33:01,720 Dopustite mi ići naprijed i pokrenuti napraviti swap opet, ./noswap. 749 00:33:01,720 --> 00:33:04,370 750 00:33:04,370 --> 00:33:05,840 >> Zanimljivo. 751 00:33:05,840 --> 00:33:11,670 Dakle, primijetiti što čini se da je istina. x je 1, y je 2, ali je 2 kada b je 1. 752 00:33:11,670 --> 00:33:16,790 Dakle, ta dva nekako dobio zamijeniti ali X i Y nisu uzimajući zamijenili. 753 00:33:16,790 --> 00:33:21,090 Dakle, da bude jasno, što se događa je, ovdje sam X i Y 754 00:33:21,090 --> 00:33:25,380 a to su varijable lokalni u Opseg glavni, ja sam prolazeći xiy 755 00:33:25,380 --> 00:33:26,170 za swap. 756 00:33:26,170 --> 00:33:29,080 Sada, swap, kao posebna funkcija, slobodno nazvati svoje argumente 757 00:33:29,080 --> 00:33:30,590 ili njegov parametri nešto što želi. 758 00:33:30,590 --> 00:33:33,280 Foo ili bar ili X ili Y ili a ili b. 759 00:33:33,280 --> 00:33:36,870 Samo da je jasno da su oni nije identičan xiy per se, 760 00:33:36,870 --> 00:33:38,020 Ja sam rekao aib. 761 00:33:38,020 --> 00:33:40,040 Ali ih možemo nazvati što god želimo. 762 00:33:40,040 --> 00:33:43,960 >> I tako to izgleda Zamjenski se prošli 763 00:33:43,960 --> 00:33:48,980 x-- AKA A- i to donosi se y-- AKA b. 764 00:33:48,980 --> 00:33:51,900 Nekako ove tri linije zamjene tih vrijednosti je točno 765 00:33:51,900 --> 00:33:53,510 kao Lauren učinio s mlijekom i SL. 766 00:33:53,510 --> 00:33:56,010 No, kad smo ispisati Vrijednosti, a i b 767 00:33:56,010 --> 00:34:01,340 uistinu zamijeniti, ali x i y nemaju promjene na njih. 768 00:34:01,340 --> 00:34:03,150 Sjetite se da su x i y ovdje. 769 00:34:03,150 --> 00:34:05,320 >> Tako možemo vidjeti putem još jedna tehnika kao. 770 00:34:05,320 --> 00:34:08,110 I to je također tehnika ugrađen u problemu postaviti tri. 771 00:34:08,110 --> 00:34:10,780 Idemo naprijed i učiniti u CS50 ID, ako to već niste učinili. 772 00:34:10,780 --> 00:34:13,730 Na desnoj strani mi ima tu karticu Debugger. 773 00:34:13,730 --> 00:34:16,159 A ako otvorite ovaj gore, ima nekih kompliciranih informacija 774 00:34:16,159 --> 00:34:17,530 koja je bačena na vas u početku. 775 00:34:17,530 --> 00:34:19,310 Ali neka se zafrkavati to osim stvaran brz. 776 00:34:19,310 --> 00:34:21,620 >> Dakle, jedan, vidiš lokalne varijable. 777 00:34:21,620 --> 00:34:26,230 Ispada da izgrade u CS50 IDE, i puno programskim okruženjima više 778 00:34:26,230 --> 00:34:28,060 općenito, je ispravljanje pogrešaka. 779 00:34:28,060 --> 00:34:31,340 Alat koji vam omogućuje vizualno vidjeti što se događa unutar vašeg programa 780 00:34:31,340 --> 00:34:34,380 bez posegnuti za dodavanje printfs i sastavljanju i trčanje 781 00:34:34,380 --> 00:34:37,588 i dodavanje printf-a i sastavljanje i trčanje, koji je već u uredovno vrijeme 782 00:34:37,588 --> 00:34:40,070 ili kuće, vjerojatno uzimajući prilično dosadan. 783 00:34:40,070 --> 00:34:43,090 >> Dakle ovdje, u samo trenutak, da smo će se vidjeti u stvarnom vremenu 784 00:34:43,090 --> 00:34:44,760 vrijednosti naših lokalnih varijabli. 785 00:34:44,760 --> 00:34:47,880 Mi također će biti u mogućnosti postaviti ono što se naziva kontrolne točke koje 786 00:34:47,880 --> 00:34:52,570 su prilike u mom programu pauzirati Izvršenje na određenoj liniji koda 787 00:34:52,570 --> 00:34:53,710 da sam znatiželjan o tome. 788 00:34:53,710 --> 00:34:54,210 Pravo? 789 00:34:54,210 --> 00:34:55,969 Ovi programi pokrenuti u djeliću sekunde. 790 00:34:55,969 --> 00:35:00,450 To je vrsta lijepo za nas sporije ljudi da bi mogli zaustaviti, uzeti trenutak, vidjet 791 00:35:00,450 --> 00:35:02,380 što se događa oko određena linija koda 792 00:35:02,380 --> 00:35:05,050 bez programa oranje kroz njega i dorade u cijelosti. 793 00:35:05,050 --> 00:35:08,510 Dakle, kontrolne točke će nam omogućiti da razbiti i pauzirati u određenom trenutku. 794 00:35:08,510 --> 00:35:12,990 >> Poziv stog je fancy način govoreći ono što su funkcije trenutno 795 00:35:12,990 --> 00:35:14,140 se zove u ovom trenutku. 796 00:35:14,140 --> 00:35:15,370 Glavni je uvijek zove na prvom mjestu. 797 00:35:15,370 --> 00:35:17,230 Ali ako Glavni naziva funkcija zove swap, 798 00:35:17,230 --> 00:35:20,470 mi zapravo idemo vidjeti ovo kula funkcija koje su 799 00:35:20,470 --> 00:35:22,400 zove u obrnutom kronološkom redoslijedu. 800 00:35:22,400 --> 00:35:23,310 Tako ćemo vidjeti. 801 00:35:23,310 --> 00:35:24,327 >> Idem za smanjenje. 802 00:35:24,327 --> 00:35:25,660 Idem se vratiti na moj broj. 803 00:35:25,660 --> 00:35:27,540 I samo zato što želim biti pedantan ovdje 804 00:35:27,540 --> 00:35:31,100 Ja ću ići naprijed i kliknite samo s lijeve strane linije pet. 805 00:35:31,100 --> 00:35:32,830 A to stvara crvenu točku. 806 00:35:32,830 --> 00:35:36,200 I obavijest na desnoj strani da debugger zna, hej, 807 00:35:36,200 --> 00:35:41,020 Samo sam rekao je prijelomna točka u noswap.c linija pet, posebno 808 00:35:41,020 --> 00:35:42,480 na ovoj liniji koda. 809 00:35:42,480 --> 00:35:45,090 Dakle debugger znaju da sam zatražio da se sljedećeg puta 810 00:35:45,090 --> 00:35:48,530 Sam pokrenuti moje Program stanku Izvršenje tamo, a ne samo 811 00:35:48,530 --> 00:35:50,390 radi cijelu stvar super brzo. 812 00:35:50,390 --> 00:35:53,889 >> Dakle, sada ću kliknuti debug Gumb na samom vrhu IDE 813 00:35:53,889 --> 00:35:55,430 i da će učiniti sljedeće. 814 00:35:55,430 --> 00:36:00,680 To će otvoriti početku pomalo zastrašujuće izgleda drugi terminal window-- 815 00:36:00,680 --> 00:36:02,679 daljinski za ispravljanje pogrešaka iz ugostiti kao i such-- 816 00:36:02,679 --> 00:36:04,970 a mi ćemo se vratiti na ono što Sve to znači da prije dugo. 817 00:36:04,970 --> 00:36:09,020 No, ono što je važno za sada je da je crvena točka je udario, 818 00:36:09,020 --> 00:36:11,735 debugger je namjerno Zastao execution-- 819 00:36:11,735 --> 00:36:15,560 Ne na toj liniji po sebi, ali na prvi linija stvarnog koda u toj funkciji. 820 00:36:15,560 --> 00:36:18,040 I to je razlog zašto je linija sedam Sada označene žutom bojom. 821 00:36:18,040 --> 00:36:20,550 >> A sada ćemo pogledati na desnoj strani. 822 00:36:20,550 --> 00:36:27,300 Izgleda, po defaultu, dosta lijepo, X ima ono vrijednost? 823 00:36:27,300 --> 00:36:27,860 0. 824 00:36:27,860 --> 00:36:29,750 I Y ima ono vrijednost? 825 00:36:29,750 --> 00:36:30,410 Nula. 826 00:36:30,410 --> 00:36:35,540 I to je za očekivati ​​u smislu da X i y-- da žuta line-- ima 827 00:36:35,540 --> 00:36:36,770 još nije izvršen. 828 00:36:36,770 --> 00:36:38,510 Dakle, x ne bi trebali imati vrijednost 1. 829 00:36:38,510 --> 00:36:41,470 To bi moglo imati neku drugu vrijednost, takozvani vrijednost smeća. 830 00:36:41,470 --> 00:36:44,320 A mi se posrećilo u da je nula u ovom trenutku, u suštini. 831 00:36:44,320 --> 00:36:46,400 >> Dakle, sada postoji samo nekoliko tipke trebamo brinuti 832 00:36:46,400 --> 00:36:48,100 o kada pogrešaka na ovaj način. 833 00:36:48,100 --> 00:36:49,970 Obavijest ovdje, imamo tipku Play. 834 00:36:49,970 --> 00:36:51,877 A ako ćemo igrati ili hit nastaviti, to je samo 835 00:36:51,877 --> 00:36:53,710 će se izvoditi kroz ostatak programa 836 00:36:53,710 --> 00:36:55,300 ili dok ne udari drugi Kontrolna točka. 837 00:36:55,300 --> 00:36:56,910 Ali nisam postaviti bilo koji drugi kontrolne točke, tako da je to samo 838 00:36:56,910 --> 00:36:58,118 će pokrenuti do kraja. 839 00:36:58,118 --> 00:37:00,280 Takva poraza Svrha poking okolo. 840 00:37:00,280 --> 00:37:03,290 >> Dakle, umjesto, mi je stalo Ove ikone desno. 841 00:37:03,290 --> 00:37:05,360 I ako sam lebdjeti iznad ih, kao što bi trebao previše, 842 00:37:05,360 --> 00:37:07,450 vidjet ćete malo tips-- savjete alat. 843 00:37:07,450 --> 00:37:09,020 To je jedan korak više. 844 00:37:09,020 --> 00:37:11,290 Sada to ne znači Skip sljedeći redak koda. 845 00:37:11,290 --> 00:37:14,840 To samo znači izvršiti ga i premjestiti na sljedeći, premjestiti na sljedeći, 846 00:37:14,840 --> 00:37:15,580 premjestiti na sljedeću. 847 00:37:15,580 --> 00:37:17,610 Drugim riječima, putem koji gumb, možete hodam 848 00:37:17,610 --> 00:37:20,390 kroz moj broj jedan korak u isto vrijeme. 849 00:37:20,390 --> 00:37:21,914 Redak po redak, doslovno. 850 00:37:21,914 --> 00:37:23,830 Sada, na desnoj da, postoji još jedna 851 00:37:23,830 --> 00:37:25,163 kako ćemo vidjeti u samo trenutak. 852 00:37:25,163 --> 00:37:27,820 To je tzv Korak u ikonu koja je 853 00:37:27,820 --> 00:37:30,300 će mi dopustiti roniti u drugu funkciju. 854 00:37:30,300 --> 00:37:31,800 Ali da vidimo to u samo trenutak. 855 00:37:31,800 --> 00:37:33,280 Tako ću kliknuti korak više. 856 00:37:33,280 --> 00:37:35,820 I sada primijetiti, kao što sam kliknite ovaj gumb na gornjem desnom kutu, 857 00:37:35,820 --> 00:37:41,260 držati oči otprilike pod lokalnom Varijable i vidjeti što se događa s x. 858 00:37:41,260 --> 00:37:44,115 X je sada 1, jer je žuta linija je sada izvršen 859 00:37:44,115 --> 00:37:45,840 a mi smo se preselili na liniji 8. 860 00:37:45,840 --> 00:37:49,840 I u samo jednom trenutku y treba nadamo postali 2. 861 00:37:49,840 --> 00:37:52,330 >> Sada, ništa što zanimljivo dogoditi za malo. 862 00:37:52,330 --> 00:37:53,390 Sve je to je printf. 863 00:37:53,390 --> 00:37:58,010 I obavijest, u mom sekundarne stezaljke prozor, vidim izlaz ispisa def. 864 00:37:58,010 --> 00:38:01,080 A sada moram napraviti Odluka kao programer. 865 00:38:01,080 --> 00:38:04,360 Mogu korak preko ove linije broj, izvršavanje ga, ali ne 866 00:38:04,360 --> 00:38:06,220 uzimajući znatiželjan o tome što je unutra. 867 00:38:06,220 --> 00:38:11,130 Ili sam zapravo korak u nju i ići unutar same Swap. 868 00:38:11,130 --> 00:38:12,340 Tako ćemo učiniti potonje. 869 00:38:12,340 --> 00:38:15,550 >> Dopustite mi ići naprijed i kliknite Ne korak više, ali korak u. 870 00:38:15,550 --> 00:38:17,300 Obavijest, odjednom prozorski promjene 871 00:38:17,300 --> 00:38:19,330 istaknuti prvi linija koda u razmjenu. 872 00:38:19,330 --> 00:38:20,710 To je linija 21. 873 00:38:20,710 --> 00:38:25,220 A sada, što je vrsta funky je da, ako pogledate ovdje, kako se i očekivalo, 874 00:38:25,220 --> 00:38:29,720 zarez b je 1 i 2, redom. 875 00:38:29,720 --> 00:38:33,840 Zašto je temp 32.767? 876 00:38:33,840 --> 00:38:36,560 Podsjećajući da je temp, baš kao i prazna šalica trenutak prije, 877 00:38:36,560 --> 00:38:38,980 proglašena ovdje na liniji 21. 878 00:38:38,980 --> 00:38:43,390 Zašto 32,000- Mislim, zašto je to samo neki čudan vrijednost? 879 00:38:43,390 --> 00:38:43,890 Da? 880 00:38:43,890 --> 00:38:45,190 >> PUBLIKA: To nije pokrenut. 881 00:38:45,190 --> 00:38:46,940 >> DAVID J. Malan: To je nije pokrenut. 882 00:38:46,940 --> 00:38:49,370 Tako naše računalo uvijek ima fizičke memorije. 883 00:38:49,370 --> 00:38:50,544 Uvijek ima fizički RAM-a. 884 00:38:50,544 --> 00:38:52,710 A tu je uvijek nula-a a jedan je tamo, zar ne? 885 00:38:52,710 --> 00:38:54,626 Budući da smo pomoću naše računalo cijeli dan, 886 00:38:54,626 --> 00:38:57,210 koristite li CS50 IDE ili poslužitelji povazdan. 887 00:38:57,210 --> 00:39:01,159 Tako da RAM ili ima neke nule ili netko je ili neki nula i jedinica. 888 00:39:01,159 --> 00:39:02,950 Bez obzira da li ili Ne ste ih koristite. 889 00:39:02,950 --> 00:39:05,270 Ne možete samo prazna prostori u kojima želite bitova. 890 00:39:05,270 --> 00:39:06,850 Oni su bilo nula i jedinica. 891 00:39:06,850 --> 00:39:09,610 >> Tako ispada da je temp, jer nismo ga još inicijalizira, 892 00:39:09,610 --> 00:39:14,580 imamo one 32 bita, ali oni 'ne inicijaliziranja na bilo poznatim vrijednostima. 893 00:39:14,580 --> 00:39:18,110 Dakle, bez obzira što su bili najviše Nedavno koristiti for-- onih 32 bits-- 894 00:39:18,110 --> 00:39:23,000 mi samo gledajući artefakata nekih prethodna primjena tih pojedinih 32 895 00:39:23,000 --> 00:39:23,500 bitova. 896 00:39:23,500 --> 00:39:27,780 Čim sam kliknite korak Tijekom ipak, fuj, temp će dobiti vrijednost 1. 897 00:39:27,780 --> 00:39:31,600 A ako sam to učiniti opet, a je ide se s obzirom na vrijednost 2 898 00:39:31,600 --> 00:39:33,830 a zatim b ide dati vrijednost 1. 899 00:39:33,830 --> 00:39:36,390 >> I tako ono što je lijepo sada ta točka u priči 900 00:39:36,390 --> 00:39:39,750 je da je debugger je mi pokazuje, super polako 901 00:39:39,750 --> 00:39:42,640 na vlastitu tempom, što stanje Swap je. 902 00:39:42,640 --> 00:39:47,490 Ali primijetite na vrhu ovdje, oglasnoj da je snop poziva zapravo 903 00:39:47,490 --> 00:39:49,180 ima dva sloja na njega. 904 00:39:49,180 --> 00:39:53,240 Sada je onaj koji je istaknuo kako je Zamijeni, ako ja kliknite na Glavni umjesto toga, 905 00:39:53,240 --> 00:39:57,100 primijetiti kako su lokalne varijable promijeniti jer programer može samo hop 906 00:39:57,100 --> 00:39:59,740 oko sebe i otići u bilo različitih opsega. 907 00:39:59,740 --> 00:40:04,070 Dakle, iako radimo sve ovo raditi i pravilno zamjene A i B, 908 00:40:04,070 --> 00:40:09,080 ako idem natrag i naprijed između Swap gdje je 2, a b je 1, a glavni, 909 00:40:09,080 --> 00:40:11,851 Glavni je utjecao na sve? 910 00:40:11,851 --> 00:40:12,350 Ne. 911 00:40:12,350 --> 00:40:13,930 Pa što je takeaway ovdje? 912 00:40:13,930 --> 00:40:18,200 Pa, ispada da bilo koje vrijeme vas poziva funkciju kao Swap, 913 00:40:18,200 --> 00:40:21,600 a ti to prođe argumente, što ti prolazi na swap funkciji 914 00:40:21,600 --> 00:40:24,730 u ovom slučaju je kopija od tih argumenata. 915 00:40:24,730 --> 00:40:28,620 Dakle, ako x i y su svaki pojedinačno 32 bita, što je swap je sve 916 00:40:28,620 --> 00:40:30,760 je dva nova lokalna varijable, ili argumenata, 917 00:40:30,760 --> 00:40:34,380 naziva i B-, ali to su proizvoljni names-- ali uzorak nula 918 00:40:34,380 --> 00:40:39,520 i one unutar A i B poredanih biti identična X i Y 919 00:40:39,520 --> 00:40:42,610 ali oni nisu Ista stvar kao i x i y. 920 00:40:42,610 --> 00:40:46,880 >> To je kao da je glavni na svojoj komad Rad broj 1 i 2 za X i Y, 921 00:40:46,880 --> 00:40:49,260 i onda kad se ruke koje komad papira za swap, 922 00:40:49,260 --> 00:40:51,970 Swap vrlo brzo dobiva vlastiti olovka, zapisuje 923 00:40:51,970 --> 00:40:56,240 1 i 2 na vlastitu list papira, ruke natrag izvorni xy na glavni 924 00:40:56,240 --> 00:40:58,790 a zatim se vlastite stvar s a i b. 925 00:40:58,790 --> 00:41:01,940 A ovo sada je super važno jer to ima implikacije Netrivijalno 926 00:41:01,940 --> 00:41:06,260 za pisanje zapravo točan broj jer čini se da ne možemo mijenjati 927 00:41:06,260 --> 00:41:07,500 dvije varijable. 928 00:41:07,500 --> 00:41:09,150 >> Napisao sam ispravnu funkciju swap. 929 00:41:09,150 --> 00:41:12,770 Mi smo ga provoditi s Lauren kao ispravan funkcija zamjena u stvarnosti, 930 00:41:12,770 --> 00:41:16,700 ali očito ništa od toga stvari ako ne mogu zapravo 931 00:41:16,700 --> 00:41:19,530 zamijeniti dvije vrijednosti trajno. 932 00:41:19,530 --> 00:41:21,970 Dakle, trebamo još jedan način zapravo dobiti na to, 933 00:41:21,970 --> 00:41:24,472 i moramo biti u stanju zapravo riješiti ovaj problem. 934 00:41:24,472 --> 00:41:27,180 I ispada out-- i mi ćemo doći natrag na ovaj slici 935 00:41:27,180 --> 00:41:30,500 Prije long-- ovo je jedan od načina da se možda privući memoriju računala. 936 00:41:30,500 --> 00:41:31,460 To je samo pravokutnik. 937 00:41:31,460 --> 00:41:32,960 Možete ga izvući bilo nekoliko načina, ali to je 938 00:41:32,960 --> 00:41:35,740 zgodan ga izvući kao pravokutnik iz razloga. 939 00:41:35,740 --> 00:41:40,040 >> Idemo početi danas i dalje Riječ je o tzv stog. 940 00:41:40,040 --> 00:41:43,870 I stog je samo komad od RAM-- komad memory-- 941 00:41:43,870 --> 00:41:47,100 koja funkcionira pristup kad oni zovu. 942 00:41:47,100 --> 00:41:49,800 I tako ispada da je na samom dnu tog dimnjaka 943 00:41:49,800 --> 00:41:53,590 je mjesto gdje sve je glavna lokalnim varijablama i org C i org V i sve to 944 00:41:53,590 --> 00:41:56,950 će ići po defaultu. A ako Main traži neku drugu funkciju kao Swap, 945 00:41:56,950 --> 00:42:00,330 dobro, swap će dobiti još sloj memorije iznad njega. 946 00:42:00,330 --> 00:42:04,490 >> I tako samo da vam dati brz površnog slika toga, ako idem preko here-- 947 00:42:04,490 --> 00:42:09,450 i neka mi to ogledalo na iznad glave kao well-- što stvarno imam, 948 00:42:09,450 --> 00:42:12,100 ako mi je stalo samo o Dno ove slike za sada, 949 00:42:12,100 --> 00:42:15,070 je da kad sam pokrenuti program Glavni i dobiva se zove, 950 00:42:15,070 --> 00:42:18,330 Glavni je dao komad RAM u mojem računalo koje je 951 00:42:18,330 --> 00:42:20,060 na dnu ovog tzv stog. 952 00:42:20,060 --> 00:42:22,143 I ja ću ga izvući Namjerno kao trg. 953 00:42:22,143 --> 00:42:24,540 Dakle, to je kao 32 bita ili četiri bajta. 954 00:42:24,540 --> 00:42:28,790 A ako je to glavna funkcija ima varijabla zove x s vrijednošću od 1 955 00:42:28,790 --> 00:42:32,626 i ima varijablu nazvanu y s vrijednošću od 2, to je 956 00:42:32,626 --> 00:42:35,750 kao što je uzimanje ovu luč memorije koja Glavni je dano od strane operativnog 957 00:42:35,750 --> 00:42:38,850 Sustav i podjele, tako da prvi lokalni varijabla ide ovdje, 958 00:42:38,850 --> 00:42:40,930 druga ide ovdje, i to je to. 959 00:42:40,930 --> 00:42:45,590 >> Kada Glavni zove swap, swap dobiva svoj komadić memorije 960 00:42:45,590 --> 00:42:48,280 da ćemo izvući ovako iz operacijskog sustava, 961 00:42:48,280 --> 00:42:50,820 i to će imati svoje vlastite lokalne varijable temelji 962 00:42:50,820 --> 00:42:53,825 na našem provedbu ranije s lokalnim varijable 963 00:42:53,825 --> 00:42:58,010 b da je u početku dobili vrijednosti 1 i 2. 964 00:42:58,010 --> 00:43:00,450 Ali onda, čim je Swap kôd izvršava, 965 00:43:00,450 --> 00:43:03,760 i Lauren zapravo swaps OJ i mlijeko, što se događa? 966 00:43:03,760 --> 00:43:09,030 Pa, to je 2 postaje 1, ovaj 1 postaje 2, i, usput, 967 00:43:09,030 --> 00:43:13,360 tu je promjenjiva temperatura koji je bio koristi tu cijelo vrijeme da na kraju 968 00:43:13,360 --> 00:43:14,470 ide dalje. 969 00:43:14,470 --> 00:43:16,720 Ali to nije važno koliko posla radite 970 00:43:16,720 --> 00:43:22,160 u toj liniji of-- u ovom memorijskog prostora, x i y su potpuno netaknuta. 971 00:43:22,160 --> 00:43:26,320 >> Dakle, trebamo neki način davanja Swap i funkcije kao što je to 972 00:43:26,320 --> 00:43:32,640 Tajna pristup, ako hoćete, kako bi Funkcije volimo-članovima u memoriju kao x i y. 973 00:43:32,640 --> 00:43:35,110 Tako ćemo pogledati primjer koji pomaže 974 00:43:35,110 --> 00:43:38,220 da vidimo točno što je bio događa cijelo ovo vrijeme. 975 00:43:38,220 --> 00:43:40,284 Idem samo naprijed i otvoriti Usporedi Zero. 976 00:43:40,284 --> 00:43:42,200 I ja ću zatvoriti naš program za pronalaženje pogrešaka, idem 977 00:43:42,200 --> 00:43:44,360 zatvoriti ovu zastrašujuće izgleda poruku pravednik kaže, čekaj malo, 978 00:43:44,360 --> 00:43:45,800 ti si u sredini ispravljanje pogrešaka. 979 00:43:45,800 --> 00:43:48,383 Idem sakriti tu karticu ovdje Samo da se vrati jednostavnosti. 980 00:43:48,383 --> 00:43:50,160 Dakle, ne brinite, ako GDB je ubio. 981 00:43:50,160 --> 00:43:53,910 To samo znači da program ima je otkaz, namjerno, u ovom slučaju, 982 00:43:53,910 --> 00:43:54,820 pored mene. 983 00:43:54,820 --> 00:43:57,700 >> A sada usporedite Zero čini. 984 00:43:57,700 --> 00:44:00,110 Ja sam koristeći CS50 knjižnica u standardnoj I / O. 985 00:44:00,110 --> 00:44:04,319 Imam glavnu funkciju koja prva kaže nešto reći, i dobiva niz. 986 00:44:04,319 --> 00:44:06,110 Zatim ga opet i kaže: dobiva još jedan niz. 987 00:44:06,110 --> 00:44:09,910 I primijetite da su ove dvije žice nazivaju S i T, respektivno. 988 00:44:09,910 --> 00:44:12,910 A sada ovaj program, usporedite Nula, njegova svrha u životu, 989 00:44:12,910 --> 00:44:15,470 što je trebao reći, sam upisati istu stvar? 990 00:44:15,470 --> 00:44:16,910 I tako ću natrag u tjednu jednom. 991 00:44:16,910 --> 00:44:19,950 Ja sam koristeći moj jednak jednak operatera što je operator kvalitete. 992 00:44:19,950 --> 00:44:22,220 Ne operator dodjele, operator jednakosti. 993 00:44:22,220 --> 00:44:23,890 Samo uspoređujući s i t. 994 00:44:23,890 --> 00:44:27,470 >> Tako ćemo zapravo ići naprijed i učiniti. 995 00:44:27,470 --> 00:44:32,680 I ja ću ići naprijed i učiniti Usporedi Zero. 996 00:44:32,680 --> 00:44:35,110 Ja ću učiniti ./comparezero. 997 00:44:35,110 --> 00:44:37,150 I ja ću otići naprijed i reći nešto 998 00:44:37,150 --> 00:44:43,450 kao, neka je učiniti mama malim slovima i kako o mama u velika slova. 999 00:44:43,450 --> 00:44:45,034 I naravno da upišete različite stvari. 1000 00:44:45,034 --> 00:44:45,533 U redu. 1001 00:44:45,533 --> 00:44:46,570 To je i za očekivati. 1002 00:44:46,570 --> 00:44:47,640 >> Idemo ponovno pokrenuti. 1003 00:44:47,640 --> 00:44:49,740 Oba puta to mala slova, velika slova. 1004 00:44:49,740 --> 00:44:51,490 To izgleda super identičan mene. 1005 00:44:51,490 --> 00:44:52,930 Unesite. 1006 00:44:52,930 --> 00:44:53,430 U REDU. 1007 00:44:53,430 --> 00:44:55,804 Možda je to samo čudno jer to ne sviđa moj gramatiku. 1008 00:44:55,804 --> 00:44:59,930 Tako ćemo napraviti kapitala MOM, kapital mama, identična. 1009 00:44:59,930 --> 00:45:01,490 Različite stvari. 1010 00:45:01,490 --> 00:45:03,907 >> Pa zašto je to tako? 1011 00:45:03,907 --> 00:45:06,240 Pa, što se zapravo događa na ispod haube ovdje? 1012 00:45:06,240 --> 00:45:08,180 Dakle, vratimo se preko ovdje samo na trenutak 1013 00:45:08,180 --> 00:45:10,910 i razmislite što GetString zapravo radi. 1014 00:45:10,910 --> 00:45:13,385 Kad nazovete GetString, to je funkcija smo 1015 00:45:13,385 --> 00:45:16,510 sami pisali i to nekako dobiva niz znakova od korisnika. 1016 00:45:16,510 --> 00:45:20,280 I pretpostavimo da je prva Vrijeme zovem GetString, koji mi daje 1017 00:45:20,280 --> 00:45:21,930 komad memorije koja izgleda ovako. 1018 00:45:21,930 --> 00:45:26,990 A ako sam upisali u svim malim slovima m-o-M- i ono što ide poslije toga? 1019 00:45:26,990 --> 00:45:28,840 Samo brzo duševne ček. 1020 00:45:28,840 --> 00:45:29,780 >> Backslash nula. 1021 00:45:29,780 --> 00:45:30,510 Znamo da. 1022 00:45:30,510 --> 00:45:32,784 I podsjetiti da smo igrali s oko Zamila ime 1023 00:45:32,784 --> 00:45:34,950 i hrpa drugih imena kada je Rob je ovdje u potrazi 1024 00:45:34,950 --> 00:45:36,280 na ono što se događa unutar memorije. 1025 00:45:36,280 --> 00:45:37,780 Tako da priča je isti. 1026 00:45:37,780 --> 00:45:40,160 To je ono što GetString se vraća u meni. 1027 00:45:40,160 --> 00:45:44,780 Sada, moj broj trenutak prije pohranjeni povratak vrijednost GetString 1028 00:45:44,780 --> 00:45:47,510 u varijablu naziva s. 1029 00:45:47,510 --> 00:45:51,390 A onda drugi put sam ga nazvao, to je pohranjena u varijablu naziva t. 1030 00:45:51,390 --> 00:45:55,070 >> Dakle, ako idem ovdje, moram da ovaj lokalni variable-- 1031 00:45:55,070 --> 00:45:59,610 i ja sam uglavnom ide nacrtati niz kao just-- mi ćemo 1032 00:45:59,610 --> 00:46:02,360 ga zovu S- kao mali trg ovdje. 1033 00:46:02,360 --> 00:46:09,760 I sada, kako se mama somehow-- ići unutar ovog promjenjivog s? 1034 00:46:09,760 --> 00:46:12,010 Pa, moramo se vratiti do prvih načela ovdje. 1035 00:46:12,010 --> 00:46:15,660 Što je GetString zapravo vraća? 1036 00:46:15,660 --> 00:46:19,030 >> Tako ispada da je M-O-M backslash nula, i bilo koji broj 1037 00:46:19,030 --> 00:46:22,364 drugih žice u sjećanju kao Zamila i Rob ili Andy ili bilo koji drugi, 1038 00:46:22,364 --> 00:46:24,280 su, naravno, u našem računala RAM ili memoriju. 1039 00:46:24,280 --> 00:46:27,760 A tvoj RAM ima volimo-članovima imate koncert RAM-a, dva nastupa RAM, 1040 00:46:27,760 --> 00:46:30,860 ili milijardu ili dvije milijarde bajtova, ili možda čak i više ovih dana. 1041 00:46:30,860 --> 00:46:34,070 Dakle, pretpostavimo, za današnje potrebe, da nije važno kako se broje 1042 00:46:34,070 --> 00:46:36,640 ih, ali možemo nabrojati svaki od onih milijardu ili dvije milijarde 1043 00:46:36,640 --> 00:46:37,880 ili četiri milijarde bajtova. 1044 00:46:37,880 --> 00:46:42,240 >> I neka je samo reći da je samovoljno ovo je prvi ugriz, drugi zagriz, 1045 00:46:42,240 --> 00:46:43,380 treći, četvrti. 1046 00:46:43,380 --> 00:46:46,570 Ja sam namjerno ne koristite nula za danas, ali mi ćemo se vratiti na to. 1047 00:46:46,570 --> 00:46:49,570 Dakle, drugim riječima, ako je to Prvi put sam koristeći program, 1048 00:46:49,570 --> 00:46:52,715 Ja sam samo dobivanje sretan i prvi ugriz je na mjesto jedne zatim dva 1049 00:46:52,715 --> 00:46:53,590 zatim tri od četiri. 1050 00:46:53,590 --> 00:46:57,430 I ako sam zadržao crtež, kutija broj dvije milijarde će biti put ovdje. 1051 00:46:57,430 --> 00:47:02,200 >> Dakle, što misliš, onda, GetString zapravo vraća? 1052 00:47:02,200 --> 00:47:06,010 To nije vraćanje M-O-M kosu crtu nula per se, jer to očito 1053 00:47:06,010 --> 00:47:08,180 ne stane u okvir koji sam nacrtao. 1054 00:47:08,180 --> 00:47:11,210 Pa što bi drugo moglo GetString zapravo se vraćaju svi ovi tjedna? 1055 00:47:11,210 --> 00:47:14,410 1056 00:47:14,410 --> 00:47:16,820 Odgovor je na odbora tu negdje. 1057 00:47:16,820 --> 00:47:20,390 Ne možeš stati M-O-M kosu crtu nula, pa što bi moglo smisla umjesto toga? 1058 00:47:20,390 --> 00:47:23,424 Ako ste morali biti super pametan, stavljajući na tzv inženjering šešir, 1059 00:47:23,424 --> 00:47:24,340 što bi ste se vratili? 1060 00:47:24,340 --> 00:47:27,340 Koji je najmanji iznos podataka možete se vratiti da će i dalje 1061 00:47:27,340 --> 00:47:30,610 neka ste pronašli M-O-M u memoriji? 1062 00:47:30,610 --> 00:47:31,270 Da? 1063 00:47:31,270 --> 00:47:31,950 >> PUBLIKA: Jedan. 1064 00:47:31,950 --> 00:47:32,200 >> DAVID J. Malan: Jedan. 1065 00:47:32,200 --> 00:47:33,021 I zašto jedan? 1066 00:47:33,021 --> 00:47:35,520 PUBLIKA: Jer bi to rekao li gdje otići [nečujan]. 1067 00:47:35,520 --> 00:47:38,391 1068 00:47:38,391 --> 00:47:39,390 DAVID J. Malan: Točno. 1069 00:47:39,390 --> 00:47:44,300 Ja sam samo ide da se vrati na adresu od niza koje sam stečen. 1070 00:47:44,300 --> 00:47:46,570 Adresa na ovo Slučaj je položaj jedan. 1071 00:47:46,570 --> 00:47:51,280 Dakle, ono što je stvarno pohranjene u S- i svaki string varijabla, odnosno far-- 1072 00:47:51,280 --> 00:47:53,430 upravo bio adresu tog niza. 1073 00:47:53,430 --> 00:47:57,840 >> U međuvremenu, ako ja zovem GetString drugi put i ja 1074 00:47:57,840 --> 00:48:03,300 upišite doslovce isti stvar-- M-O-M sa lowercase-- M-O-M 1075 00:48:03,300 --> 00:48:06,200 i još backslash nula, a sad možda i moj program je 1076 00:48:06,200 --> 00:48:09,820 trčanje za neko vrijeme pa možda ovo 10, to je lokacija 11, to je 12, 1077 00:48:09,820 --> 00:48:10,700 ovo je 13. 1078 00:48:10,700 --> 00:48:13,590 Računala koriste neki drugi memorija za bilo kojeg razloga. 1079 00:48:13,590 --> 00:48:18,172 Ono što sada ide u mom sekundi varijabla u mom programu t? 1080 00:48:18,172 --> 00:48:19,390 10. 1081 00:48:19,390 --> 00:48:20,050 Točno. 1082 00:48:20,050 --> 00:48:23,910 >> I tako, kada gledamo izvorni kod ovog programa 1083 00:48:23,910 --> 00:48:26,550 gdje sam jednostavno pokušava usporediti dvije vrijednosti, 1084 00:48:26,550 --> 00:48:32,180 S jednaka jednaka t, što je očito ljudski odgovor? 1085 00:48:32,180 --> 00:48:34,890 Samo ne zato što 1 nije jednak 10. 1086 00:48:34,890 --> 00:48:36,861 I tako ovdje leži prilika za nas stvarno 1087 00:48:36,861 --> 00:48:39,610 samo se vratiti, opet, prvi načela i razmišljati o, dobro, 1088 00:48:39,610 --> 00:48:41,110 što se događa ispod haube? 1089 00:48:41,110 --> 00:48:43,240 Razgovarali smo o tome bitova i bajtova i memorije, 1090 00:48:43,240 --> 00:48:46,820 ali to je zapravo korisno razumjeti jer kad nazovete GetString, 1091 00:48:46,820 --> 00:48:50,280 iako mislimo da je povratak M-O-M ili string mama 1092 00:48:50,280 --> 00:48:53,120 ili Andy ili Zamila ili slično, tehnički 1093 00:48:53,120 --> 00:48:55,510 to je samo vraćanje adresu tog komad memorije. 1094 00:48:55,510 --> 00:48:56,910 >> No, to je u redu. 1095 00:48:56,910 --> 00:49:00,570 Jer koliko ja znam gdje je niz završava? 1096 00:49:00,570 --> 00:49:03,840 Ako sam samo s obzirom na početak? 1097 00:49:03,840 --> 00:49:05,380 Pa, backslash nula, zar ne? 1098 00:49:05,380 --> 00:49:08,800 Samo u linearnom vremenu mogu ispis s ispisa def M-O-M. 1099 00:49:08,800 --> 00:49:11,820 I čim vidim kosu crtu nula, ne zanima me, gdje sam počeo, 1100 00:49:11,820 --> 00:49:14,950 Ja već znam implicitno gdje moram završiti. 1101 00:49:14,950 --> 00:49:18,700 >> I tako danas obilježava beginning-- i neka mi to dramatično, jer mi 1102 00:49:18,700 --> 00:49:21,800 prošao kroz puno problema na dobili to ovdje trening wheels-- 1103 00:49:21,800 --> 00:49:29,840 tako da danas trening kotači počnu ispasti, a mi otkriti na least-- 1104 00:49:29,840 --> 00:49:31,373 >> [PLJESAK] 1105 00:49:31,373 --> 00:49:33,220 1106 00:49:33,220 --> 00:49:36,160 >> To je dobro vrijedi izleta za Target jutros, zar ne? 1107 00:49:36,160 --> 00:49:39,600 Dakle now-- postoji, ispada kako, ne postoji takva stvar kao što je string. 1108 00:49:39,600 --> 00:49:41,140 Gudački ne postoji. 1109 00:49:41,140 --> 00:49:43,760 To je sinonim koje smo imali unutar CS50 knjižnici. 1110 00:49:43,760 --> 00:49:48,660 Ubuduće, idemo početi zvati s i t ne žice, ali char zvijezde. 1111 00:49:48,660 --> 00:49:51,180 A char zvijezda mi ćemo zafrkavati osim prije dugo. 1112 00:49:51,180 --> 00:49:53,510 No, to će reći, da čak i ako nastavimo 1113 00:49:53,510 --> 00:49:56,180 pomoću GetString za sada, tehnički sam trebao 1114 00:49:56,180 --> 00:49:59,010 se govori char zvijezdu i char zvijezdu. 1115 00:49:59,010 --> 00:50:01,720 >> I ispada da je zvijezda što će označavati nešto 1116 00:50:01,720 --> 00:50:04,340 naziva pokazivač ili adresu. 1117 00:50:04,340 --> 00:50:06,110 A u stvari, teaser za što je pred nama 1118 00:50:06,110 --> 00:50:09,760 je to 20 drugi isječak iz naše prijatelj Nick Parlante na Stanfordu 1119 00:50:09,760 --> 00:50:12,927 koji je prije dosta vremena, provesti smiješan iznos od vrijeme, 1120 00:50:12,927 --> 00:50:15,010 najbolje što mogu reći u njegovu kuhinje ili njegov podrum, 1121 00:50:15,010 --> 00:50:17,140 što claymation uvođenje u svijetu 1122 00:50:17,140 --> 00:50:20,010 lik po imenu Binky s kojima ćemo 1123 00:50:20,010 --> 00:50:22,010 biti uvedena sljedeći put se upućuje. 1124 00:50:22,010 --> 00:50:24,588 Dakle, ovdje je pregled onoga što će doći. 1125 00:50:24,588 --> 00:50:26,370 >> [VIDEO PLAYBACK] 1126 00:50:26,370 --> 00:50:27,510 >> -Hej, Binky. 1127 00:50:27,510 --> 00:50:28,260 Probudi se. 1128 00:50:28,260 --> 00:50:30,672 To je vrijeme za zabavu pokazivač. 1129 00:50:30,672 --> 00:50:31,616 >> -Što je to? 1130 00:50:31,616 --> 00:50:33,032 Saznajte više o pokazivače? 1131 00:50:33,032 --> 00:50:34,450 Oh, Goody. 1132 00:50:34,450 --> 00:50:35,431 >> [END PLAYBACK] 1133 00:50:35,431 --> 00:50:38,055 DAVID J. Malan: I na toj bilješci, ćemo vidjeti u srijedu. 1134 00:50:38,055 --> 00:50:47,590 1135 00:50:47,590 --> 00:50:48,090 U redu. 1136 00:50:48,090 --> 00:50:48,740 Tko je ples? 1137 00:50:48,740 --> 00:50:49,240 Ajde. 1138 00:50:49,240 --> 00:50:50,330 Tko je ples? 1139 00:50:50,330 --> 00:50:51,820 Želiš da biste je počelo? 1140 00:50:51,820 --> 00:50:53,770 Ja ću je počelo. 1141 00:50:53,770 --> 00:50:54,270 Woooo! 1142 00:50:54,270 --> 00:51:04,070 1143 00:51:04,070 --> 00:51:07,580 >> LAUREN: Slatka fantazija Mojsije.