1 00:00:00,000 --> 00:00:10,550 2 00:00:10,550 --> 00:00:14,050 >> DAVID J. Malan: To je CS50 a to je začátek čtvrtého týdne. 3 00:00:14,050 --> 00:00:18,630 A chlapec, je Volkswagen v potíže všechno kvůli softwaru. 4 00:00:18,630 --> 00:00:20,264 Pojďme se podívat. 5 00:00:20,264 --> 00:00:20,930 [VIDEOPŘEHRÁVÁNÍ] 6 00:00:20,930 --> 00:00:25,560 -Cars, Nejchytřejší znaky v Rychle a zběsile filmy. 7 00:00:25,560 --> 00:00:29,100 Tento týden německý výrobce automobilů Volkswagen ocitlo 8 00:00:29,100 --> 00:00:32,490 v uprostřed skandálu potenciálně kriminální poměry. 9 00:00:32,490 --> 00:00:36,060 >> -Volkswagen Se připravuje o miliardy pokuty, možné obvinění z trestného činu 10 00:00:36,060 --> 00:00:38,560 pro jeho vedení, as společnost omlouvá 11 00:00:38,560 --> 00:00:41,840 pro rigging 11 milionů vozů pomoci mu porazit emisních zkoušek. 12 00:00:41,840 --> 00:00:44,950 >> -Certain Dieselové modely byly navržen s sofistikovaný software 13 00:00:44,950 --> 00:00:48,440 že použitá informace včetně Postavení a řízení vozidla 14 00:00:48,440 --> 00:00:51,870 rychlost určit, auto bylo probíhá měření emisí. 15 00:00:51,870 --> 00:00:55,650 Podle tohoto okolností, motor by se snížit toxické emise. 16 00:00:55,650 --> 00:00:59,070 Ale auto bylo zmanipulované do bypassu že když to bylo v provozu. 17 00:00:59,070 --> 00:01:03,320 Emise zvýšil 10 až 40 krát nad přijatelnou úroveň EPA. 18 00:01:03,320 --> 00:01:04,280 >> [END Přehrávání] 19 00:01:04,280 --> 00:01:05,220 >> DAVID J. Malan: Takže pojďme Podívej se na to 20 00:01:05,220 --> 00:01:07,250 a přesně vidět, jak to by mohl být realizován 21 00:01:07,250 --> 00:01:09,680 a jak to může mít vliv na tak mnoho aut, jako je tento. 22 00:01:09,680 --> 00:01:12,840 Takže v mé ruce tady jsou lis zprávě, která byla vydána v EPA-- 23 00:01:12,840 --> 00:01:14,620 Environmental Protection Agency, která 24 00:01:14,620 --> 00:01:18,032 je regulační agentura USA, že zpracovává otázky životního prostředí, 25 00:01:18,032 --> 00:01:19,740 a pak aktuální Právní upozornění, že byl 26 00:01:19,740 --> 00:01:22,420 poslat Volkswagen jen před pár dny. 27 00:01:22,420 --> 00:01:26,530 >> Takže EPA píše, a zveřejňuje nyní veřejně, sofistikovaný software 28 00:01:26,530 --> 00:01:29,390 algoritmus na určitý Vozidla Volkswagen detekuje 29 00:01:29,390 --> 00:01:32,630 když auto prochází Testování oficiálních emisí 30 00:01:32,630 --> 00:01:36,505 a otáčky Plné emisí Kontroly pouze v průběhu zkoušky. 31 00:01:36,505 --> 00:01:38,380 Účinnost Tyto znečištění vozidla 32 00:01:38,380 --> 00:01:43,260 ovládání emise zařízení je značně zmenšován v průběhu celého běžného provozu 33 00:01:43,260 --> 00:01:44,320 situace. 34 00:01:44,320 --> 00:01:48,190 To má za následek v autech, která splňují normy v laboratoři nebo testování 35 00:01:48,190 --> 00:01:52,790 stanice, ale při normálním provozu vyzařovat dusíku oxides-- nebo NOx-- 36 00:01:52,790 --> 00:01:54,950 rychlostí až 40 krát standardní. 37 00:01:54,950 --> 00:01:58,220 Tento software produkoval Volkswagen je citace konec citátu, odpojovací zařízení, 38 00:01:58,220 --> 00:02:00,650 jak je definován čistého Zákon o ovzduší v USA. 39 00:02:00,650 --> 00:02:03,410 >> Jdou na to říct, že EPA a další agenturou 40 00:02:03,410 --> 00:02:07,020 odhalil odpojovací zařízení Software po samostatné analýzy 41 00:02:07,020 --> 00:02:09,660 výzkumníky na Západ Virginia University. 42 00:02:09,660 --> 00:02:14,160 Znečištění NOx přispívá oxid dusičitý, přízemní ozon, 43 00:02:14,160 --> 00:02:15,700 a jemné částice. 44 00:02:15,700 --> 00:02:18,090 Vystavení těmto znečišťující látky byla spojena 45 00:02:18,090 --> 00:02:20,870 s širokou škálou závažné účinky na zdraví, 46 00:02:20,870 --> 00:02:23,637 včetně větší astmatu útoky a jiné respirační 47 00:02:23,637 --> 00:02:26,470 nemoci, které mohou být natolik závažné posílat lidi do nemocnice. 48 00:02:26,470 --> 00:02:28,660 Expozice ozonu a částic má také 49 00:02:28,660 --> 00:02:31,960 byly spojeny s předčasným úmrtí v důsledku respirační související 50 00:02:31,960 --> 00:02:35,690 nebo kardiovaskulární související účinky. 51 00:02:35,690 --> 00:02:38,940 Děti, starší lidé, lidé s Předem připravený respirační onemocnění 52 00:02:38,940 --> 00:02:42,840 jsou mimořádně ohrožené zdravotní účinky těchto znečišťujících látek. 53 00:02:42,840 --> 00:02:45,056 >> Postačí tedy, že je to velmi vážné. 54 00:02:45,056 --> 00:02:46,930 A pojďme k číst jen jeden úryvek 55 00:02:46,930 --> 00:02:49,370 a pak se budeme se podívat na podkladové důsledky 56 00:02:49,370 --> 00:02:50,920 z toho v kontextu automobilu. 57 00:02:50,920 --> 00:02:53,730 Konkrétně, Volkswagen vyrobeny a instalovány 58 00:02:53,730 --> 00:02:56,210 software v tzv Elektronická řídicí 59 00:02:56,210 --> 00:02:59,320 module-- nebo ECM-- of tato vozidla, které snímaných 60 00:02:59,320 --> 00:03:03,580 kdy se zkoušené vozidlo pro splňující emisní normy EPA. 61 00:03:03,580 --> 00:03:07,510 Na různých vstupů včetně těch na bázi poloha volantu, vozidlo 62 00:03:07,510 --> 00:03:11,280 rychlost, délka motoru provoz, a barometrický tlak, 63 00:03:11,280 --> 00:03:13,720 tyto vstupy přesně sledoval parametry 64 00:03:13,720 --> 00:03:17,600 federálního použitého zkušebního postupu na měření emisí pro certifikaci EPA 65 00:03:17,600 --> 00:03:18,400 účely. 66 00:03:18,400 --> 00:03:21,850 >> Během zkoušek emisí EPA, software vozidla ECM 67 00:03:21,850 --> 00:03:25,060 běžel software, který produkoval Výsledky shody s emisními limity. 68 00:03:25,060 --> 00:03:28,340 Ve všech ostatních případech se ECM vozidlo software 69 00:03:28,340 --> 00:03:31,090 provozoval samostatnou cestu kalibrace který snížil 70 00:03:31,090 --> 00:03:34,360 Účinnost Celková systému pro regulaci emisí, 71 00:03:34,360 --> 00:03:37,864 konkrétně selektivní katalytická Snížení NOx trap-- 72 00:03:37,864 --> 00:03:39,280 který uvidíme asi za chvíli. 73 00:03:39,280 --> 00:03:43,040 V důsledku toho se emise NOx zvýšená o faktor 10 až 40 krát 74 00:03:43,040 --> 00:03:47,450 nad úrovní vyhovující dohodách o hospodářském partnerství v závislosti na typu pohonu cyklu. 75 00:03:47,450 --> 00:03:50,800 >> Takže to, co to opravdu znamená, a Zdrojový kód k softwaru běžícího 76 00:03:50,800 --> 00:03:53,190 na Volkswagen nemá dosud zveřejněny, 77 00:03:53,190 --> 00:03:56,460 je, že účinně, toto ekvivalent je někde uvnitř 78 00:03:56,460 --> 00:03:57,830 kódu Volkswagen. 79 00:03:57,830 --> 00:04:02,200 Pokud jsou testovány, a je-li do auta rozpozná některé faktory životního prostředí 80 00:04:02,200 --> 00:04:04,330 jako volantu polohy nebo pohyb 81 00:04:04,330 --> 00:04:06,710 nebo jeho nedostatek v autě nebo jakýkoliv počet dalších faktorů 82 00:04:06,710 --> 00:04:09,940 které jsou v současné době předpokládal, být součástí tohoto vzorce, 83 00:04:09,940 --> 00:04:12,370 prostě zapnout Úplná kontrola emisí. 84 00:04:12,370 --> 00:04:15,670 Jinými slovy, začnou emitující méně znečišťujících látek. 85 00:04:15,670 --> 00:04:18,769 >> Jinak, v každé jiné situaci pokud to není detekován jako bytí 86 00:04:18,769 --> 00:04:20,790 v laboratoři, oni prostě nemají. 87 00:04:20,790 --> 00:04:24,320 A tak si můžete zjednodušit to do více beton pseudokód s něčím 88 00:04:24,320 --> 00:04:24,820 takhle. 89 00:04:24,820 --> 00:04:27,810 Pokud kola se otáčejí, ale volantu není, sugestivní 90 00:04:27,810 --> 00:04:30,060 že auto je na některých druh rotačního válce 91 00:04:30,060 --> 00:04:32,550 ale v nějakém sklad testuje, 92 00:04:32,550 --> 00:04:36,070 pak se chovají jako EPA bych vám. 93 00:04:36,070 --> 00:04:37,960 Jinak ne. 94 00:04:37,960 --> 00:04:40,420 Takže pojďme se podívat v krátké video, které 95 00:04:40,420 --> 00:04:45,391 se podívat na to, co o důsledcích jsou to vlastně mechanicky. 96 00:04:45,391 --> 00:04:48,620 >> [VIDEOPŘEHRÁVÁNÍ] 97 00:04:48,620 --> 00:04:52,800 >> -Last Pátek EPA oznámila, že někteří Vozy Volkswagen Audi mezi 2009 98 00:04:52,800 --> 00:04:55,840 a tento rok byly pomocí tzv odpojovací zařízení 99 00:04:55,840 --> 00:04:59,060 obejít zákony o emisích navrženy tak, aby vzduch čistý. 100 00:04:59,060 --> 00:05:01,700 Ale co to přesně znamená? 101 00:05:01,700 --> 00:05:04,666 >> No, moderní auta mají desítky počítačů uvnitř nich. 102 00:05:04,666 --> 00:05:07,040 A některé z těchto počítačů pomoc koordinovat funkce 103 00:05:07,040 --> 00:05:09,590 motoru pro optimální výkon a zároveň zajistit, 104 00:05:09,590 --> 00:05:12,340 že tam není příliš mnoho odpadků vycházející z výfuku. 105 00:05:12,340 --> 00:05:15,170 Už skutečně pracuje Tímto způsobem již několik desetiletí. 106 00:05:15,170 --> 00:05:17,380 V podstatě, každá část motoru moderního automobilu 107 00:05:17,380 --> 00:05:20,080 má snímač nebo řadič na tom, a tyto počítače 108 00:05:20,080 --> 00:05:23,460 čte v datech tisíce krát za sekundu úprav making 109 00:05:23,460 --> 00:05:26,220 jako poměr paliva ke vzduchu že to bude do válců. 110 00:05:26,220 --> 00:05:28,730 >> Tyto podvádění Volkswagen a Audi modely jsou diesely, 111 00:05:28,730 --> 00:05:30,890 a diesely mají ještě jeden opravdu důležité počítač 112 00:05:30,890 --> 00:05:34,030 kontrolované parametry, což je množství nespáleného paliva se 113 00:05:34,030 --> 00:05:35,200 do výfuku. 114 00:05:35,200 --> 00:05:36,310 Teď to zní špatně. 115 00:05:36,310 --> 00:05:39,642 Nezní to jako byste chtěli nespálené palivo se do výfuku. 116 00:05:39,642 --> 00:05:41,600 Ale v případě diesel, máte něco 117 00:05:41,600 --> 00:05:46,110 nazývá NOx past, což je zařízení, které absorbuje a pasti na oxidy dusíku 118 00:05:46,110 --> 00:05:48,880 že jsou znečišťující látky, které by v opačném případě přejděte do atmosféry. 119 00:05:48,880 --> 00:05:53,040 A účinek tohoto NOx pasti je obohacen nespáleného paliva. 120 00:05:53,040 --> 00:05:56,650 Takže odpojovací zařízení je speciální program uvnitř těchto počítačů, které mohou dělat to 121 00:05:56,650 --> 00:05:59,527 vypadat vůz splňuje emisní normy, i když tomu tak není. 122 00:05:59,527 --> 00:06:01,110 Volkswagen měl problém se založenýma rukama. 123 00:06:01,110 --> 00:06:04,050 Jeho dieselové motory byly známy pro získání velkou spotřebu paliva, 124 00:06:04,050 --> 00:06:07,510 ale NOx past funguje pouze dobře pokud se používá více paliva. 125 00:06:07,510 --> 00:06:10,460 Takže auto by zjistit, pomocí tohoto odpojovací zařízení, 126 00:06:10,460 --> 00:06:13,870 když to bylo získání emisí test, by spotřebovávat více paliva, 127 00:06:13,870 --> 00:06:16,830 aby NOx depeše práci dobře, Emise by bylo v pořádku. 128 00:06:16,830 --> 00:06:21,130 Ale pak se dostanete na silnici, zařízení vypne, jste pálení méně paliva 129 00:06:21,130 --> 00:06:24,256 ale jste uvedení jak hodně jako 40 krát více znečišťujících látek do ovzduší. 130 00:06:24,256 --> 00:06:26,130 Ale jak to sakra udělal auto vím, že to bylo 131 00:06:26,130 --> 00:06:27,720 testován na dodržování úrovně emisí? 132 00:06:27,720 --> 00:06:30,590 EPA říká, že to byl důmyslný systém, který kontroluje věci 133 00:06:30,590 --> 00:06:34,090 jako polohy volantu, rychlost, jak dlouho motor byl zapnutý, 134 00:06:34,090 --> 00:06:35,507 a dokonce i atmosférický tlak. 135 00:06:35,507 --> 00:06:37,673 Jinými slovy, existuje žádný způsob, jak to bylo náhodné 136 00:06:37,673 --> 00:06:40,260 proto, že software byl navržena velmi opatrně k detekci 137 00:06:40,260 --> 00:06:41,630 oficiální zkouška emisí. 138 00:06:41,630 --> 00:06:43,588 To je nějaký docela vážné podvod, a to je 139 00:06:43,588 --> 00:06:45,420 Proto je v Volkswagen jako vážný problém. 140 00:06:45,420 --> 00:06:48,600 Ve skutečnosti se jejich CEO, Martin Winterkorn, jen odstoupil. 141 00:06:48,600 --> 00:06:49,820 >> Takže co se stane dál? 142 00:06:49,820 --> 00:06:53,900 No, pokud jste jeden z půl milionu diesel Jettas, Beatles, podkolenky, Passat, 143 00:06:53,900 --> 00:06:56,220 nebo Audi A3S uskutečněny, Dobrou zprávou je, je 144 00:06:56,220 --> 00:06:57,886 že vaše auto je stále bezpečně řídit. 145 00:06:57,886 --> 00:07:00,510 Nemusíte dát to pryč dokud Volkswagen vydá odvolání. 146 00:07:00,510 --> 00:07:02,509 Ale v určitém okamžiku, že jsou pravděpodobně bude mít 147 00:07:02,509 --> 00:07:04,230 aktualizovat software v autě. 148 00:07:04,230 --> 00:07:06,927 Když se to stane, by mohl dostat méně mil na nádrž. 149 00:07:06,927 --> 00:07:09,260 Právníci jsou již chystají up pro třídu žalob 150 00:07:09,260 --> 00:07:12,500 aby majitelé mohli dostat kompenzovány v určitém okamžiku v budoucnosti. 151 00:07:12,500 --> 00:07:15,832 Ale to nebude brzy stát kdykoliv. 152 00:07:15,832 --> 00:07:16,711 >> [END Přehrávání] 153 00:07:16,711 --> 00:07:19,960 DAVID J. Malan: Takže to vlastně vyvolává zajímavá větší obrázek otázka 154 00:07:19,960 --> 00:07:20,660 pokud jde o důvěru. 155 00:07:20,660 --> 00:07:21,160 Je to tak? 156 00:07:21,160 --> 00:07:24,300 Každý z nás má iPhone nebo androidi nebo něco, co v našich kapsách s největší pravděpodobností 157 00:07:24,300 --> 00:07:26,500 V těchto dnech, nebo notebooky na našich kolech, která jsou 158 00:07:26,500 --> 00:07:28,510 běží software vyrobený Apple a Microsoft 159 00:07:28,510 --> 00:07:30,710 a svazky jiných společností. 160 00:07:30,710 --> 00:07:34,240 Ale jak víme, že to, co Tyto softwarové produkty dělají 161 00:07:34,240 --> 00:07:37,680 je vlastně to, co tito společnosti tvrdí, že dělají? 162 00:07:37,680 --> 00:07:39,610 >> Například, který je na říkají, že pokaždé, když 163 00:07:39,610 --> 00:07:42,200 uskutečnit telefonní hovor na vašem iPhone nebo Android telefon nebo podobně, 164 00:07:42,200 --> 00:07:45,650 že telefonní číslo je také není nahrávány na server nějaké společnosti 165 00:07:45,650 --> 00:07:48,399 kvůli nějaké programu, který jsem napsáno, ať už je to operační 166 00:07:48,399 --> 00:07:51,070 systém sám o sobě jako je iOS nebo Android, nebo proto, že jste si stáhli 167 00:07:51,070 --> 00:07:53,880 některé aplikace třetí strany že nějakým způsobem je poslech 168 00:07:53,880 --> 00:07:57,120 na vše, co píšete nebo vše, co jste vlastně říkal. 169 00:07:57,120 --> 00:07:59,500 Jak víte, že když vy jste běží Clang 170 00:07:59,500 --> 00:08:02,590 nebo Vytvořit kompilovat vlastní software v CS50, jak 171 00:08:02,590 --> 00:08:06,080 Máte vlastní personál, který je CS50, pomocí knihovny CS50, 172 00:08:06,080 --> 00:08:08,690 nebyl přihlášení každý string jste někdy dostali 173 00:08:08,690 --> 00:08:10,276 nebo každým coulem, jaký jste kdy dostal? 174 00:08:10,276 --> 00:08:12,900 No, mohli byste se rozhodně netváří do zdrojového kódu na něco 175 00:08:12,900 --> 00:08:15,233 jako knihovny CS50, vy se mohli podívat do zdrojového kódu 176 00:08:15,233 --> 00:08:18,170 pro operační systém Linux běží na CS50 IDE. 177 00:08:18,170 --> 00:08:23,090 Ale úžasná prezentace byl dán v roce 1984 178 00:08:23,090 --> 00:08:26,730 v přijetí Turingova Zadání zakázky velmi slavný počítačový odborník známý 179 00:08:26,730 --> 00:08:29,750 as-- jménem Ken Thompson, kteří obdržel Turing cena, která 180 00:08:29,750 --> 00:08:33,500 je druh počítačové vědy je Nobelova cena, chcete-li, 181 00:08:33,500 --> 00:08:35,309 za jeho práci na operační systém s názvem 182 00:08:35,309 --> 00:08:39,039 Unix, který je velmi podobný ducha toho, co používáme, který je Linux. 183 00:08:39,039 --> 00:08:41,960 A otázka zeptal se jeho přijetí řeč, v podstatě 184 00:08:41,960 --> 00:08:44,910 kterým se stanoví rámec pro roky a roky diskusí 185 00:08:44,910 --> 00:08:46,970 o důvěře a bezpečnosti, byla tato. 186 00:08:46,970 --> 00:08:50,410 Do jaké míry by jednoho věřit prohlášení, že program-- kus 187 00:08:50,410 --> 00:08:53,010 z software-- je bez trojských koní? 188 00:08:53,010 --> 00:08:56,500 Možná je to mnohem důležitější důvěřovat lidé, kteří psali software. 189 00:08:56,500 --> 00:08:58,650 >> A ve skutečnosti, jsme spojený do řeči, že 190 00:08:58,650 --> 00:09:02,400 dal při přijímání tohoto ocenění v 80. letech na internetových stránkách CS50 je 191 00:09:02,400 --> 00:09:04,030 pod stránce přednášky pro dnešek. 192 00:09:04,030 --> 00:09:06,071 Protože to, co uvidíte je to, že on vlastně dává 193 00:09:06,071 --> 00:09:09,430 poměrně jednoduchý příklad, jak i kompilátor jako je Clang nebo cokoliv 194 00:09:09,430 --> 00:09:13,950 kompilátory jiní používané v minulosti, Co když vložený v kompilátoru my 195 00:09:13,950 --> 00:09:18,190 sami používáte je málo, pokud podmínka, která v podstatě říká, 196 00:09:18,190 --> 00:09:22,360 pokud si všimnete, že tento kód je pomocí Funkce GetString nebo GetInt 197 00:09:22,360 --> 00:09:26,600 funkce, pokračujte a vložte zadní dveře nebo trojským koněm 198 00:09:26,600 --> 00:09:29,340 tak, že tento program Nyní má nějaké nuly 199 00:09:29,340 --> 00:09:30,930 a ty, které dělají něco škodlivého. 200 00:09:30,930 --> 00:09:33,080 Přihlašování všechny vaše úhozů, nahrávání, že data 201 00:09:33,080 --> 00:09:35,100 k nějakému serveru, nebo opravdu cokoli. 202 00:09:35,100 --> 00:09:37,290 >> A co Ken Thompson pokračuje dělat v řeči 203 00:09:37,290 --> 00:09:40,580 je prokázat, že i v případě, máte přístup ke zdroji 204 00:09:40,580 --> 00:09:43,794 kód překladače, který zlomyslně může dělat to, 205 00:09:43,794 --> 00:09:46,210 to nevadí, protože Tam je to kuře a vejce 206 00:09:46,210 --> 00:09:49,500 realita minulosti mnoho let pricemž kompilátory 207 00:09:49,500 --> 00:09:51,960 se používají k sestavování sami. 208 00:09:51,960 --> 00:09:55,440 Jinými slovy, při cestě zpět někdo musel psali první kompilátor. 209 00:09:55,440 --> 00:09:59,060 A poté, kdykoliv že jsem aktualizováno kompilátor změnou jeho zdrojový kód, 210 00:09:59,060 --> 00:10:02,020 přidávání funkcí a překompilování ji Pro lidi jako my používat, dobře, 211 00:10:02,020 --> 00:10:04,270 Používají starý verze kompilátoru 212 00:10:04,270 --> 00:10:06,370 sestavit nový verze kompilátoru. 213 00:10:06,370 --> 00:10:08,370 A pokud jste se podívat v rozhovoru, který dal, 214 00:10:08,370 --> 00:10:10,970 uvidíte, že proto, tohoto kruhovitosti, 215 00:10:10,970 --> 00:10:14,330 můžete skutečně mít chyby nebo Trojské koně vložené do softwaru 216 00:10:14,330 --> 00:10:14,990 jsme pomocí. 217 00:10:14,990 --> 00:10:18,010 A i když se podíváte na zdrojový kód pro tyto programy, 218 00:10:18,010 --> 00:10:21,550 to by mohlo být ani zřejmé protože podvod je vlastně 219 00:10:21,550 --> 00:10:24,710 v některých starších verzí kompilátor, který od té doby byla 220 00:10:24,710 --> 00:10:27,340 vstřikování hrozbu do našeho softwaru. 221 00:10:27,340 --> 00:10:29,740 >> Což je jen říkat, my opravdu nemůže a neměl by 222 00:10:29,740 --> 00:10:32,939 důvěra software běžící na našich notebooků nebo telefony nebo jakýkoliv počet míst. 223 00:10:32,939 --> 00:10:36,230 A ve skutečnosti, dále v tomto pololetí, kdy začneme mluvit o programování webu 224 00:10:36,230 --> 00:10:38,521 a skutečně začít stavět webové aplikace sami, 225 00:10:38,521 --> 00:10:40,285 budeme mluvit o těchto hrozby a další. 226 00:10:40,285 --> 00:10:43,410 Nyní, možná jste přemýšlel a všiml že to tam bylo malinké Darth 227 00:10:43,410 --> 00:10:45,842 Vader na klipy, které Krajnici tam ukazovat 228 00:10:45,842 --> 00:10:47,550 o Volkswagen. Jestliže jste nikdy neviděli, já 229 00:10:47,550 --> 00:10:49,190 myslel, že bychom měli ulehčit nálada, protože to je vše 230 00:10:49,190 --> 00:10:50,780 velmi deprimující a děsivé. 231 00:10:50,780 --> 00:10:52,910 Jdu se podívat zpět na Super Bowl 2011 232 00:10:52,910 --> 00:10:55,300 kdy je obchodní od Volkswagen-- a to 233 00:10:55,300 --> 00:10:59,620 Téměř z nich dělá sympatický again-- vysílal poprvé v televizi. 234 00:10:59,620 --> 00:11:04,039 Je tu druhý klip 60 si myslím, že se vám bude líbit. 235 00:11:04,039 --> 00:11:04,705 [VIDEOPŘEHRÁVÁNÍ] 236 00:11:04,705 --> 00:11:08,198 [MUSIC - téma z "hvězdné války"] 237 00:11:08,198 --> 00:11:35,643 238 00:11:35,643 --> 00:11:38,138 [DOG štěká] 239 00:11:38,138 --> 00:11:50,114 240 00:11:50,114 --> 00:11:53,607 [CAR ZAČÍNÁ] 241 00:11:53,607 --> 00:12:04,086 242 00:12:04,086 --> 00:12:05,955 [END Přehrávání] 243 00:12:05,955 --> 00:12:06,830 DAVID J. Malan: Jo. 244 00:12:06,830 --> 00:12:07,663 Jen jsem kontrolu. 245 00:12:07,663 --> 00:12:11,360 To auto je na seznamu porušování lidských práv. 246 00:12:11,360 --> 00:12:12,000 Dobře. 247 00:12:12,000 --> 00:12:14,040 Takže se podíváme na některé pseudokód před chvílí. 248 00:12:14,040 --> 00:12:15,380 A tady je větší úryvek pseudokódu kódu 249 00:12:15,380 --> 00:12:16,921 že jsme viděli několikrát tak daleko. 250 00:12:16,921 --> 00:12:19,970 A pojďme použití je to příležitost Nyní zavedení nového programování 251 00:12:19,970 --> 00:12:23,776 technika, kterou jsme udělali viz algoritmicky 252 00:12:23,776 --> 00:12:25,400 minulý týden, kdy jsme se podívali na sloučení druhu. 253 00:12:25,400 --> 00:12:28,270 Ale pojďme formalizovat a uvidíte, jak se nám to může používat ve skutečném kódu, 254 00:12:28,270 --> 00:12:30,350 a pak budeme používat tuto Technika po silnici nejvíce 255 00:12:30,350 --> 00:12:32,000 pravděpodobné, že k řešení některých dalších problémů. 256 00:12:32,000 --> 00:12:35,790 >> Takže to byl jeden z prvních programů jsme kdy napsal, i když v pseudokódu kódu. 257 00:12:35,790 --> 00:12:37,790 A to, co tento program povolena, abychom dělali kurz 258 00:12:37,790 --> 00:12:41,510 bylo najít Mike Smith v telefonním seznamu. 259 00:12:41,510 --> 00:12:46,216 A všimněte si v jednotlivých linií osm a 11, které měl tento výkaz jít. 260 00:12:46,216 --> 00:12:48,090 A ve skutečnosti, jisté jazyky, C mezi nimi, 261 00:12:48,090 --> 00:12:50,006 vlastně dělat mají prohlášení, že je doslova 262 00:12:50,006 --> 00:12:52,710 přejít na který vám umožní přejít na konkrétní lince. 263 00:12:52,710 --> 00:12:55,470 To je obecně odsuzován protože to může být velmi snadno zneužito 264 00:12:55,470 --> 00:12:58,490 a můžete začít skákat svůj Program všude na rozdíl 265 00:12:58,490 --> 00:13:00,690 k používání druh logika a řízení toku 266 00:13:00,690 --> 00:13:04,000 že jsme použili dosud jen s smyčky a podmínky a podobně. 267 00:13:04,000 --> 00:13:08,660 >> Ale můžeme zjednodušit tento algoritmus v pseudokódu kódu způsobem. 268 00:13:08,660 --> 00:13:11,250 Místo toho, aby tento opakovaný či smyčkovací přístup 269 00:13:11,250 --> 00:13:14,160 kde jsme neustále vracet a zpět a zpět do řádku tři, 270 00:13:14,160 --> 00:13:18,300 proč ne my jen trochu punt a více se obecně říci, v souladu sedmi a 10, 271 00:13:18,300 --> 00:13:20,570 stačí vyměnit ty dva párů linek s, 272 00:13:20,570 --> 00:13:22,810 else if Smith je starší v knize my budeme 273 00:13:22,810 --> 00:13:25,110 hledat Mike v Levá polovina knihy. 274 00:13:25,110 --> 00:13:28,560 Else pokud Smith později ve kniha, hledat Mike v právu 275 00:13:28,560 --> 00:13:29,540 polovina knihy. 276 00:13:29,540 --> 00:13:31,180 A všimněte si už na kruhovitost. 277 00:13:31,180 --> 00:13:31,680 Je to tak? 278 00:13:31,680 --> 00:13:34,250 Já jsem hledal Mike v telefonního seznamu a poté 279 00:13:34,250 --> 00:13:37,090 Nakonec jsem hit možná linka sedm nebo možná řádek 10 280 00:13:37,090 --> 00:13:41,089 a moje instrukce pro sebe, je vyhledávání Mike v polovině telefonního seznamu. 281 00:13:41,089 --> 00:13:42,380 No, jak mám vyhledat Mike? 282 00:13:42,380 --> 00:13:44,213 Jsem v polovině hledal Mike, proč 283 00:13:44,213 --> 00:13:45,860 se mi nějak odeslání v kruhu? 284 00:13:45,860 --> 00:13:49,590 Ale to je v pořádku, protože to, co je děje na rozsahu problému, 285 00:13:49,590 --> 00:13:52,630 jak je psáno v řádku 7 a 10? 286 00:13:52,630 --> 00:13:54,989 Nejsme jen říkám, hledání Mike, hledat Mike. 287 00:13:54,989 --> 00:13:56,280 My konkrétně říkat, co? 288 00:13:56,280 --> 00:13:58,694 289 00:13:58,694 --> 00:14:01,610 Hledat pro něj v levé polovině pravá polovina, která je ve skutečnosti 290 00:14:01,610 --> 00:14:03,440 poloviční velikosti problému. 291 00:14:03,440 --> 00:14:07,170 Takže je to v pořádku, že jsme trochu zapojení do této kruhovitosti, 292 00:14:07,170 --> 00:14:09,180 Tento argument oběžníku, protože alespoň jsme 293 00:14:09,180 --> 00:14:11,090 což je problém menší a menší. 294 00:14:11,090 --> 00:14:14,220 A nakonec budeme dosáhnout že takzvané referenční případ, kdy 295 00:14:14,220 --> 00:14:16,780 Máme jen jednu stránku left-- jako náš dobrovolník minulý týden 296 00:14:16,780 --> 00:14:18,684 did-- jsme měli jednu stránku doleva a pak my ne 297 00:14:18,684 --> 00:14:21,600 mít na hledání Mike Smith proto, že je to buď na této stránce 298 00:14:21,600 --> 00:14:23,080 nebo není. 299 00:14:23,080 --> 00:14:27,480 >> Tak jak můžeme realizovat tuto myšlenku, tento druh kruhovosti při skutečném kódu? 300 00:14:27,480 --> 00:14:31,030 No, můžeme využít techniku která je obecně známá jako rekurze. 301 00:14:31,030 --> 00:14:33,960 A my jsme viděli to v pseudokód pro slučovací druhu minulý týden. 302 00:14:33,960 --> 00:14:37,190 Připomeňme si, že to bylo pseudokód pro slučovací druhu. 303 00:14:37,190 --> 00:14:40,560 Je to pravděpodobně ještě jednodušší než bublina, nebo výběr nebo insertion sort 304 00:14:40,560 --> 00:14:43,310 nejen z hlediska jednoduchosti se kterou můžete vyjádřit. 305 00:14:43,310 --> 00:14:46,750 >> Ale to je proto, jsme nějak kruhově 306 00:14:46,750 --> 00:14:51,350 řka, hledat něco, tím, že hledá to znovu. 307 00:14:51,350 --> 00:14:53,960 Ale my jsme vyhledávání buď na levá polovina nebo pravá polovina 308 00:14:53,960 --> 00:14:56,070 a nakonec jsme slučování v tomto případě. 309 00:14:56,070 --> 00:14:58,520 Ale i zde se tyto dvě linky, řazení 310 00:14:58,520 --> 00:15:01,320 jsme zase se to idea rekurze. 311 00:15:01,320 --> 00:15:05,350 A konkrétně to, co znamená, v rámci algoritmu, 312 00:15:05,350 --> 00:15:10,880 je, že algoritmus je rekurzivní pokud se používá nebo volá sama sebe. 313 00:15:10,880 --> 00:15:14,330 >> Nebo, pokud jde o C, je funkce recursive-- funkci nazvanou 314 00:15:14,330 --> 00:15:18,510 foo je rekurzivní, pokud foo, kdesi v jeho zdrojovém kódu, 315 00:15:18,510 --> 00:15:21,250 volá funkci sám foo. 316 00:15:21,250 --> 00:15:25,790 A to je špatné, pokud vše foo někdy dělá je sám znovu a znovu zavolat. 317 00:15:25,790 --> 00:15:30,600 Je to OK, pokud foo nakonec přestane, stejně jako merge sort, tím, že říká, počkej, 318 00:15:30,600 --> 00:15:32,980 pokud k tomuto problému je super malý, například, 319 00:15:32,980 --> 00:15:35,840 nebo jsem ho našel, koho, že jsem hledáte, prostě vrátí. 320 00:15:35,840 --> 00:15:41,000 Nenechte rekurzivně, ne sám cyklicky znovu zavolat. 321 00:15:41,000 --> 00:15:44,200 >> A tak se pojďme podívat na jak to může skutečně pracují. 322 00:15:44,200 --> 00:15:48,430 Takže budu pokračovat a otevřený up dvou příkladech zde zdrojového kódu. 323 00:15:48,430 --> 00:15:50,321 Jedním z nich je nazýván sigma 0. 324 00:15:50,321 --> 00:15:52,320 A to není vůbec rekurzivní, ale pojďme se 325 00:15:52,320 --> 00:15:53,694 se podívat na to, co tento program dělá. 326 00:15:53,694 --> 00:15:55,737 Já jsem svlékl si vše připomínky od ní, ale všechny 327 00:15:55,737 --> 00:15:58,070 zdrojového kódu na CS50 je webové stránky má komentáře Pokud jste 328 00:15:58,070 --> 00:15:59,570 chtít číst přes to znovu později. 329 00:15:59,570 --> 00:16:02,010 A pojďme udělat pár zdravého rozumu kontroluje zde. 330 00:16:02,010 --> 00:16:06,640 >> Takže v horní části tohoto kódu, máme patří CS50.h. 331 00:16:06,640 --> 00:16:07,650 Co to dělá? 332 00:16:07,650 --> 00:16:08,990 Proč je to tady? 333 00:16:08,990 --> 00:16:11,740 Z hlediska přiměřených laicky. 334 00:16:11,740 --> 00:16:12,424 Co to dělá? 335 00:16:12,424 --> 00:16:12,858 To jo. 336 00:16:12,858 --> 00:16:14,160 >> Diváků: Tak, že funkce GetInt funguje. 337 00:16:14,160 --> 00:16:16,243 >> DAVID J. Malan: Takže to Funkce GetInt funguje. 338 00:16:16,243 --> 00:16:18,115 Vzhledem k tomu, vnitřní straně této Soubor, CS50.h, který 339 00:16:18,115 --> 00:16:20,950 uvidíme zanedlouho v podmínky jejího zdrojového kódu, 340 00:16:20,950 --> 00:16:23,270 má spoustu funkcí declared-- GetInt, GetString, 341 00:16:23,270 --> 00:16:26,950 a spoustu others-- a pokud není ve skutečnosti máme, že Zahrnout linku, 342 00:16:26,950 --> 00:16:29,320 kompilátor Clang není bude vědět, že existuje. 343 00:16:29,320 --> 00:16:32,400 A totéž platí pro linky dvou, kde je definována int 344 00:16:32,400 --> 00:16:35,101 printf, což je funkce budeme nadále používat docela dost. 345 00:16:35,101 --> 00:16:37,850 Nyní, linka čtyř zdá málo funky protože je to jen jeden vložka. 346 00:16:37,850 --> 00:16:41,570 Má to středník, ne kudrnaté šle, žádný kód uvnitř ní. 347 00:16:41,570 --> 00:16:44,640 Ale to, co udělal nazýváme tahle věc v týdnech minulosti? 348 00:16:44,640 --> 00:16:45,140 To jo. 349 00:16:45,140 --> 00:16:46,060 Takže prototyp. 350 00:16:46,060 --> 00:16:48,390 A proč máme prototyp, který se zdá 351 00:16:48,390 --> 00:16:51,050 být trochu nadbytečný obvykle proto, že jsme se obvykle 352 00:16:51,050 --> 00:16:53,474 viz funkce znovu později v souboru, je to tak? 353 00:16:53,474 --> 00:16:56,390 Tak proč have-- jste jen poškrábání vaší hlavě, ale já to beru. 354 00:16:56,390 --> 00:16:57,302 To jo. 355 00:16:57,302 --> 00:17:00,000 >> Diváků: [Neslyšitelné] Funkce po hlavní. 356 00:17:00,000 --> 00:17:01,000 DAVID J. Malan: Přesně tak. 357 00:17:01,000 --> 00:17:04,089 Tak, že překladač vás zná bude nakonec definovat nebo zavést 358 00:17:04,089 --> 00:17:06,579 že funkce po hlavní, pravděpodobně. 359 00:17:06,579 --> 00:17:08,462 Tak Clang a nejvíce kompilátory jsou trochu hloupý 360 00:17:08,462 --> 00:17:10,510 a budou vědět, jen to, co jim řeknete. 361 00:17:10,510 --> 00:17:12,569 A pokud chcete používat funkce nazvaná sigma, 362 00:17:12,569 --> 00:17:15,710 lépe učit kompilátor že existuje předem. 363 00:17:15,710 --> 00:17:17,970 >> Nyní, hlavní sama, dokonce i i když je to banda linek, 364 00:17:17,970 --> 00:17:19,839 je docela obeznámen snad nyní. 365 00:17:19,839 --> 00:17:21,942 Má to dělat, zatímco smyčky jehož účel života 366 00:17:21,942 --> 00:17:24,400 Zde prý je dostat kladné celé číslo od uživatele. 367 00:17:24,400 --> 00:17:27,349 A jen držet otravovat ho nebo ji, dokud se spolupracovat. 368 00:17:27,349 --> 00:17:30,670 Pak v řádku 16, mám zajímavý hovor. 369 00:17:30,670 --> 00:17:31,570 IntAnswer. 370 00:17:31,570 --> 00:17:33,710 Který je na levé ruce strana dává mi Int 371 00:17:33,710 --> 00:17:36,650 který může store-- nazývá Answer-- který bude ukládat, zdá se, 372 00:17:36,650 --> 00:17:39,090 návratová hodnota sigma. 373 00:17:39,090 --> 00:17:41,840 Takže sigma je jen libovolný, ale smysluplné jméno 374 00:17:41,840 --> 00:17:44,500 že jsem dal do funkce jehož účel života 375 00:17:44,500 --> 00:17:47,680 je vzít jednu argument-- budeme říkat N v tomto case-- 376 00:17:47,680 --> 00:17:52,280 a jen proto, aby součet tohoto čísla a každé kladné číslo, které je 377 00:17:52,280 --> 00:17:53,200 menší, než to. 378 00:17:53,200 --> 00:17:58,140 >> Takže když jsem se projít v počtu 2 sigma, chci přidat 2 plus 1 379 00:17:58,140 --> 00:18:00,240 a 0-- ne 0-- tak, že mi dává 3. 380 00:18:00,240 --> 00:18:05,320 Kdybych projít, během 3 až sigma, chci mají 3 + 2 plus 1, což mi dává 6. 381 00:18:05,320 --> 00:18:05,900 A tak dále. 382 00:18:05,900 --> 00:18:09,750 Tak to prostě sečte všechny Čísla menší než nebo rovna k němu. 383 00:18:09,750 --> 00:18:12,040 >> A teď, tady já jsem prostě jít vytisknout odpověď. 384 00:18:12,040 --> 00:18:17,330 Takže jako rychlou kontrolu sanitačního, pojďme aby sigma 0-- tečka lomítko sigma 0-- 385 00:18:17,330 --> 00:18:18,690 a dovolte mi, abych zadejte 2. 386 00:18:18,690 --> 00:18:19,960 A já opravdu dostat 3. 387 00:18:19,960 --> 00:18:21,240 Dovolte mi, abych zadejte 3. 388 00:18:21,240 --> 00:18:22,860 Já opravdu dostat 6. 389 00:18:22,860 --> 00:18:27,636 A pokud někdo může dělat matematiku rychle, když to udělám 50 co mám dostat? 390 00:18:27,636 --> 00:18:29,839 >> Diváků: [Neslyšitelné]. 391 00:18:29,839 --> 00:18:30,880 DAVID J. Malan: No, no. 392 00:18:30,880 --> 00:18:33,340 Ale 1275, což je dost blízko. 393 00:18:33,340 --> 00:18:38,850 Tak tohle je výsledek dělá 50 a 49 a 48 a 47 a 46 394 00:18:38,850 --> 00:18:40,349 celou cestu až do 1. 395 00:18:40,349 --> 00:18:41,390 Tak to je všechno sigma dělá. 396 00:18:41,390 --> 00:18:43,350 Ale pojďme se podívat, jak máme implementována to teď. 397 00:18:43,350 --> 00:18:45,790 Tak sem je samotná funkce. 398 00:18:45,790 --> 00:18:49,000 A to se nezdá mít něco do činění s rekurze dosud. 399 00:18:49,000 --> 00:18:51,070 Ve skutečnosti, jsme za použití old school technika. 400 00:18:51,070 --> 00:18:56,680 Jsem inicializaci proměnnou s názvem částku na nulu, pak mám foreloop tady, 401 00:18:56,680 --> 00:19:00,790 a já jsem deklarování Int názvem Já, nastavení je rovna 1-- 402 00:19:00,790 --> 00:19:04,080 když jsem mohl nastavit, že se rovná nula, ale od té doby dělám sčítání, 403 00:19:04,080 --> 00:19:05,340 Koho zajímá, jestli to je nula nebo jedna. 404 00:19:05,340 --> 00:19:06,660 Bude to mít žádný vliv. 405 00:19:06,660 --> 00:19:10,110 >> Takže jsem iterace tak dlouho, jak jsem je menší než nebo rovné M, který 406 00:19:10,110 --> 00:19:11,671 je argument, který byl předán v. 407 00:19:11,671 --> 00:19:13,670 A pak jsem se jen udržet zvyšování I. a pohled 408 00:19:13,670 --> 00:19:20,010 smyčky všechno, co dělám dělá součet a rovná I. A to je úmyslné. 409 00:19:20,010 --> 00:19:22,326 Nechci dělat, v tomto Stejně tak jako součet navíc plus. 410 00:19:22,326 --> 00:19:24,790 Chci skutečně přidat aktuální hodnota proudu I, 411 00:19:24,790 --> 00:19:28,190 který je čím dál větší a větší a větší na průběžný. 412 00:19:28,190 --> 00:19:30,210 >> A pak jsem se vrátit částku. 413 00:19:30,210 --> 00:19:33,850 A tak odpověď dostane hodnotu částku. 414 00:19:33,850 --> 00:19:35,282 A pak jsem ho vytisknout. 415 00:19:35,282 --> 00:19:37,740 Takže je tu příležitost tady, i když se trochu zjednodušit 416 00:19:37,740 --> 00:19:41,260 tento kód koncepčně a druh úderu něčí 417 00:19:41,260 --> 00:19:43,250 mysl v termínech jednoduchost, i když to 418 00:19:43,250 --> 00:19:45,700 chvíli trvá seřadit z ocenit, proč se to 419 00:19:45,700 --> 00:19:47,330 je silný v těchto malých příkladech. 420 00:19:47,330 --> 00:19:50,380 Zde je sigma one--, takže Druhá verze tohoto kódu. 421 00:19:50,380 --> 00:19:55,290 Vše up vrcholu je stejná, aby že stejný příběh, platí jako předtím. 422 00:19:55,290 --> 00:19:59,220 Ale teď pojďme podívat na provádění sigma, které 423 00:19:59,220 --> 00:20:05,040 Já jsem smrskl na pouhých těchto lines-- čtyři řádky kódu, opravdu, 424 00:20:05,040 --> 00:20:06,980 plus několik složené závorky a bílý prostor. 425 00:20:06,980 --> 00:20:07,930 >> Ale co mám dělat? 426 00:20:07,930 --> 00:20:11,050 Je-li m je menší než nebo se rovná nula, musím trochu zvládnout 427 00:20:11,050 --> 00:20:12,490 že mimořádně jednoduchý případ. 428 00:20:12,490 --> 00:20:15,450 A pokud se mi podat nula, nebo nic negativní, což je právě divné, 429 00:20:15,450 --> 00:20:17,909 Já jsem prostě jít libovolně ale konzistentně vrátit nulu. 430 00:20:17,909 --> 00:20:20,200 Nechci, aby tuto věc dostat se do nějaké podivné nekonečna 431 00:20:20,200 --> 00:20:21,810 smyčka, protože se zápornou hodnotou. 432 00:20:21,810 --> 00:20:25,070 Takže já jen říkám, jestli mi dáš nula nebo méně, Vracím nula. 433 00:20:25,070 --> 00:20:28,220 >> Ale to je dobře, protože to je že jednu stránku z telefonního seznamu 434 00:20:28,220 --> 00:20:28,790 , co zbylo. 435 00:20:28,790 --> 00:20:32,660 Jsem ukousl velmi specifický problém, a ne něco, co volá rekurzivně. 436 00:20:32,660 --> 00:20:36,580 Avšak v řadě 31, co Zdá se mi to dělat? 437 00:20:36,580 --> 00:20:39,780 Závorky jsou jen udržet věci, doufejme, trochu jasnější. 438 00:20:39,780 --> 00:20:42,110 Ale všechno, co dělám, je, že jsem vracet m-- cokoliv 439 00:20:42,110 --> 00:20:45,790 předáte me-- plus Hodnota m-- líto, 440 00:20:45,790 --> 00:20:49,052 plus hodnota sigma m minus 1. 441 00:20:49,052 --> 00:20:50,010 Takže co to znamená? 442 00:20:50,010 --> 00:20:53,965 Pokud byste mi dát číslo 3 jako vstup, odpověď Chci se dostat nakonec 443 00:20:53,965 --> 00:20:57,307 je 6, protože 3 plus 2 plus 1 6 mi dává. 444 00:20:57,307 --> 00:20:59,390 Ale jak si myslím, že o jak se spuštěním tohoto kódu? 445 00:20:59,390 --> 00:21:03,070 Poprvé jsem zavolat sigma a já se projít v hodnotě 3, 446 00:21:03,070 --> 00:21:07,960 to je jako říkat na kusu papíru, tady je hodnota 3 447 00:21:07,960 --> 00:21:09,920 a já jsem byl předán to jako Sigma. 448 00:21:09,920 --> 00:21:13,090 3 je samozřejmě menší než 0, takže podmínka IF neplatí. 449 00:21:13,090 --> 00:21:14,020 Else dělá. 450 00:21:14,020 --> 00:21:14,990 Tak co mám dělat? 451 00:21:14,990 --> 00:21:19,902 Chci se vrátit m, což je 3 plus sigma M minus 1. 452 00:21:19,902 --> 00:21:21,110 Dovolte mi tedy sledovat to. 453 00:21:21,110 --> 00:21:22,710 Chystám se dát to kus papíru dolů. 454 00:21:22,710 --> 00:21:24,668 A jaká hodnota, aby se jasné, mám jít projít 455 00:21:24,668 --> 00:21:26,540 do Sigmy v tuto chvíli v příběhu? 456 00:21:26,540 --> 00:21:28,080 Jaké číslo? 457 00:21:28,080 --> 00:21:28,610 2, že jo? 458 00:21:28,610 --> 00:21:29,670 3 minus 1 je 2. 459 00:21:29,670 --> 00:21:32,000 Tak jsem jen potřebujete trochu cár papíru sem. 460 00:21:32,000 --> 00:21:33,931 Takže teď sigma je stále znovu zavolal. 461 00:21:33,931 --> 00:21:35,930 A já jsem úmyslně to dolů, protože je to 462 00:21:35,930 --> 00:21:38,070 něco jako pozastavení že verze příběhu 463 00:21:38,070 --> 00:21:40,720 protože teď jsem soustředěný na signál M minus 1. 464 00:21:40,720 --> 00:21:42,660 Tak byla 3 m, m minus 1 je 2. 465 00:21:42,660 --> 00:21:45,110 Takže tady je 2, že jsem byl předán. 466 00:21:45,110 --> 00:21:48,510 2 je samozřejmě menší než 0 tak, že případ nevztahuje. 467 00:21:48,510 --> 00:21:53,445 Jinak se vrátím m, což je to věc, a sigma z jaké hodnoty? 468 00:21:53,445 --> 00:21:56,160 469 00:21:56,160 --> 00:21:59,650 Takže pokud sigma of 1-- protože m je teď 2 tak 2 minus 1 je 1. 470 00:21:59,650 --> 00:22:01,950 Takže teď mám jen hodnotu 1. 471 00:22:01,950 --> 00:22:04,810 Já jsem kolem jen číslo 1 do funkce sigma-- 472 00:22:04,810 --> 00:22:09,120 nebo já here-- tak 1 zjevně není menší než nula, stále ještě neplatí. 473 00:22:09,120 --> 00:22:12,970 >> Else return 1 plus sigma čeho? 474 00:22:12,970 --> 00:22:13,470 0. 475 00:22:13,470 --> 00:22:14,678 Takže mi dovolte připomenout, že. 476 00:22:14,678 --> 00:22:15,920 Vrátím se k tomu později. 477 00:22:15,920 --> 00:22:18,060 Teď budu pokračovat a drobek dolů číslo 0, protože to je 478 00:22:18,060 --> 00:22:19,470 můj argument nebo parametr. 479 00:22:19,470 --> 00:22:22,400 Já jsem prošel číslo 0 a nakonec se tento proces 480 00:22:22,400 --> 00:22:25,760 toho jen opakuji inzerát nauseum se ukončí, protože to, co 481 00:22:25,760 --> 00:22:28,820 mám hned dělat, jakmile vidím tuto 0? 482 00:22:28,820 --> 00:22:29,790 I vrátit nulu. 483 00:22:29,790 --> 00:22:31,790 Takže teď budete muset přetočit příběh. 484 00:22:31,790 --> 00:22:34,430 >> Kdybych teď jít zpět v čase, co byla poslední věc, 485 00:22:34,430 --> 00:22:36,670 Udělal jsem, když jste byli doslova převíjení videa? 486 00:22:36,670 --> 00:22:41,630 Jdu vyzvednout nejnovější 1, a to mi dává 1 plus 0 je 1. 487 00:22:41,630 --> 00:22:44,100 Mám-li držet převíjení příběh, který se chystá dát mi 488 00:22:44,100 --> 00:22:46,880 2 plus tento běh hodnota, která je 1. 489 00:22:46,880 --> 00:22:47,789 Tak to je 3. 490 00:22:47,789 --> 00:22:49,330 A pak budu držet převíjení. 491 00:22:49,330 --> 00:22:54,220 Když jsem poprvé zapsat číslo 3-- tak 3 plus 3 mi dává 6. 492 00:22:54,220 --> 00:22:57,272 >> A teď, pokud jste přetočil video až do tohoto bodu, 493 00:22:57,272 --> 00:22:58,980 toto bylo velmi První otázka, zeptal jsem se. 494 00:22:58,980 --> 00:23:01,450 Při předání 3, co je sigma z 3? 495 00:23:01,450 --> 00:23:04,204 Je to vskutku 6, součet všechny tyto kusy papíru. 496 00:23:04,204 --> 00:23:07,120 Takže pokud to trvá trochu zatímco na zabalit svou mysl kolem, to je v pořádku. 497 00:23:07,120 --> 00:23:10,700 Ale za to byl little-- ní byl velmi úmyslné, že jsem naskládané 498 00:23:10,700 --> 00:23:12,990 tato čísla na sebe. 499 00:23:12,990 --> 00:23:17,440 Je to něco jako mít memory-- záznam v čase, 500 00:23:17,440 --> 00:23:19,940 jako pračce ve videu, že mohu skutečně přetočit v. 501 00:23:19,940 --> 00:23:24,350 A budeme se vrátit do že metafora v jen trochu. 502 00:23:24,350 --> 00:23:28,240 >> Ale nejdřív, ukazuje se, že je tu spousta mágů a lidé, legrační, 503 00:23:28,240 --> 00:23:29,614 Myslím, že na Googlu. 504 00:23:29,614 --> 00:23:31,530 Chtěli někoho, kdo je velmi dobrý na Googling mysli 505 00:23:31,530 --> 00:23:34,270 přijít na chvilku a pomozte mi něco hledat? 506 00:23:34,270 --> 00:23:35,650 Velmi, velmi nízká klíč. 507 00:23:35,650 --> 00:23:37,870 Někdo, kdo je nikdy přijít dříve, možná. 508 00:23:37,870 --> 00:23:38,370 DOBŘE. 509 00:23:38,370 --> 00:23:39,030 To jo? 510 00:23:39,030 --> 00:23:39,530 No tak. 511 00:23:39,530 --> 00:23:41,410 Pojď dolů. 512 00:23:41,410 --> 00:23:42,183 Jak se jmenuješ? 513 00:23:42,183 --> 00:23:42,870 >> SAM: Sam. 514 00:23:42,870 --> 00:23:44,290 >> DAVID J. Malan: Sam, pojď dolů. 515 00:23:44,290 --> 00:23:45,320 To je stejná. 516 00:23:45,320 --> 00:23:46,280 Rád tě poznávám. 517 00:23:46,280 --> 00:23:46,780 Ahoj. 518 00:23:46,780 --> 00:23:47,580 Pojď. 519 00:23:47,580 --> 00:23:51,290 Takže vše, co potřebuji, abys udělal, pokud jste mohli, Same, tady je Google. 520 00:23:51,290 --> 00:23:53,240 Můžete hledat termínu rekurze? 521 00:23:53,240 --> 00:23:55,770 522 00:23:55,770 --> 00:23:56,270 Nikdy nezkazí. 523 00:23:56,270 --> 00:23:59,940 524 00:23:59,940 --> 00:24:00,970 >> A teď let's-- jo. 525 00:24:00,970 --> 00:24:03,380 Klepněte na tlačítko OK, že. 526 00:24:03,380 --> 00:24:04,315 Lepší klikněte na to. 527 00:24:04,315 --> 00:24:07,020 528 00:24:07,020 --> 00:24:08,020 Ach, to chápu. 529 00:24:08,020 --> 00:24:08,520 Ne? 530 00:24:08,520 --> 00:24:09,050 DOBŘE. 531 00:24:09,050 --> 00:24:10,430 Takže pojďme udělat pár dalších. 532 00:24:10,430 --> 00:24:12,830 Ani ne tak související akademicky tady, ale už jste 533 00:24:12,830 --> 00:24:14,520 někdy hledal Google pro anagram? 534 00:24:14,520 --> 00:24:15,280 >> SAM: Ne. 535 00:24:15,280 --> 00:24:15,520 >> DAVID J. Malan: OK. 536 00:24:15,520 --> 00:24:17,186 Hledat přesmyčky místo rekurze. 537 00:24:17,186 --> 00:24:22,540 538 00:24:22,540 --> 00:24:23,790 Jak se o nakřivo. 539 00:24:23,790 --> 00:24:25,515 Už jste někdy hledali nakřivo? 540 00:24:25,515 --> 00:24:29,260 541 00:24:29,260 --> 00:24:32,692 Teď, tohle je trochu těžké vidět, ale doufejme, že everything's-- OK. 542 00:24:32,692 --> 00:24:34,150 Je to jen ty a já se těší to. 543 00:24:34,150 --> 00:24:34,690 DOBŘE. 544 00:24:34,690 --> 00:24:38,950 >> Takže nakonec, to one's-- je to trochu nakřivo. 545 00:24:38,950 --> 00:24:40,810 Teď už výkrut. 546 00:24:40,810 --> 00:24:44,460 547 00:24:44,460 --> 00:24:45,310 Wonderful. 548 00:24:45,310 --> 00:24:45,910 Dobře. 549 00:24:45,910 --> 00:24:47,110 Velké poděkování patří také Sam. 550 00:24:47,110 --> 00:24:49,416 Tady máš. 551 00:24:49,416 --> 00:24:50,400 Díky. 552 00:24:50,400 --> 00:24:52,807 >> Takže, co se děje ve všech z těchto příkladů hloupé? 553 00:24:52,807 --> 00:24:55,640 Takže opravdu, pod kapotu Milióny Googlu řádků kódu 554 00:24:55,640 --> 00:24:58,860 prý je několik hloupé IF podmínky, které jsou v podstatě 555 00:24:58,860 --> 00:25:01,160 kontrolovat, zda má uživatel napsaný v této věty, 556 00:25:01,160 --> 00:25:03,760 udělat něco, co pravděpodobně vzal netriviální množství času 557 00:25:03,760 --> 00:25:06,080 realizovat jen proto, aby bylo zábavné tímto způsobem. 558 00:25:06,080 --> 00:25:08,430 Ale to je vše, to se vaří dolů pod kapotu. 559 00:25:08,430 --> 00:25:11,570 Ale, samozřejmě, rekurze je více z geekier 560 00:25:11,570 --> 00:25:13,880 příkladem z těchto speciálních triků. 561 00:25:13,880 --> 00:25:16,880 A určitě tam jiní tam venku jakož i, že mají možná ani 562 00:25:16,880 --> 00:25:18,230 objevil ještě ne. 563 00:25:18,230 --> 00:25:22,830 >> Tak se podívejte, nebo zvažte Nyní následující program, 564 00:25:22,830 --> 00:25:24,830 a určitě chytit jakýkoli z nich na své cestě ven. 565 00:25:24,830 --> 00:25:28,820 Chystám se jít dopředu a otevřít program, který je 566 00:25:28,820 --> 00:25:30,920 bude snažit vyměnit dvě hodnoty. 567 00:25:30,920 --> 00:25:33,210 Ale dříve, než jsme se tam jít, jdeme na to. 568 00:25:33,210 --> 00:25:38,500 Mohli bychom získat ještě jeden dobrovolník, myslím, že? 569 00:25:38,500 --> 00:25:40,480 Chtěli byste, aby dobrovolně? 570 00:25:40,480 --> 00:25:40,980 Ne? 571 00:25:40,980 --> 00:25:41,890 Pojď nahoru. 572 00:25:41,890 --> 00:25:42,390 Pojď nahoru. 573 00:25:42,390 --> 00:25:42,890 Dobře. 574 00:25:42,890 --> 00:25:44,136 Takže Vaše jméno je co? 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 Pojď nahoru, Lauren. 578 00:25:46,890 --> 00:25:50,140 Takže Lauren je být zde napadla následovně. 579 00:25:50,140 --> 00:25:52,310 Rád tě poznávám. 580 00:25:52,310 --> 00:25:55,730 Takže Lauren zde má vpředu z jejích dvou prázdných šálků. 581 00:25:55,730 --> 00:25:57,570 A máme nějaký oranžový šťáva a některé mléko 582 00:25:57,570 --> 00:26:00,301 a budeme pokračovat vpřed a proveďte následující. 583 00:26:00,301 --> 00:26:01,550 Jsme jen tak naplnit toto. 584 00:26:01,550 --> 00:26:07,840 Několik uncí mléka sem a pojďme vyplnit trochu pomerančové šťávy tady. 585 00:26:07,840 --> 00:26:11,475 >> A v přední části všech tito členové publikum, 586 00:26:11,475 --> 00:26:13,550 prohodit dvě hodnoty těchto poháry. 587 00:26:13,550 --> 00:26:16,970 Dejte pomerančový džus v odvětví mléka pohár a mléko v šálku pomerančové šťávy. 588 00:26:16,970 --> 00:26:22,380 589 00:26:22,380 --> 00:26:26,150 Jak byste to dělali, kdybyste byli na domů a měl přístup k jiné zásoby? 590 00:26:26,150 --> 00:26:27,400 LAUREN: Dej to do jiného šálku. 591 00:26:27,400 --> 00:26:28,191 DAVID J. Malan: OK. 592 00:26:28,191 --> 00:26:31,940 Takže pojďme se dočasné proměnná, pokud budeme chtít. 593 00:26:31,940 --> 00:26:35,871 A do toho teď a realizovat Stejný postup vyměňování. 594 00:26:35,871 --> 00:26:36,370 Tak dobré. 595 00:26:36,370 --> 00:26:41,490 My jsme dali OJ do dočasného proměnná, mléko do proměnné OJ, 596 00:26:41,490 --> 00:26:44,481 a nyní dočasné proměnná do proměnné mléka. 597 00:26:44,481 --> 00:26:44,980 DOBŘE. 598 00:26:44,980 --> 00:26:48,740 Takže velmi dobře dělali doposud. 599 00:26:48,740 --> 00:26:50,990 Tak to dopadá out-- si myslí, že Myslel jen na chvíli. 600 00:26:50,990 --> 00:26:54,479 Zde, na jenom geek to trochu, to by byl odpovídající C kód 601 00:26:54,479 --> 00:26:55,520 že jsme právě realizována. 602 00:26:55,520 --> 00:26:58,650 Měli jsme dva vstupy, a a b, a to jak z který budeme jen říct, pro jednoduchost jsou 603 00:26:58,650 --> 00:26:59,260 int je. 604 00:26:59,260 --> 00:27:02,780 A všimněte si tady, když chci vyměnit hodnoty dvou proměnných, a a b, 605 00:27:02,780 --> 00:27:06,890 my opravdu potřebujeme prostředníka, je dočasné proměnné, dočasné pohár, 606 00:27:06,890 --> 00:27:10,830 do kterého se nalije jednu z hodnot takže máme vyhrazené místo pro to. 607 00:27:10,830 --> 00:27:13,480 Ale pak je kód je přesně jako Lauren zde prováděny. 608 00:27:13,480 --> 00:27:15,500 >> Nyní, jen se dostat trochu bláznivější, dopadá 609 00:27:15,500 --> 00:27:20,930 že můžete to udělat, aniž by dočasné proměnné. 610 00:27:20,930 --> 00:27:24,870 Chcete-li to správně, když jdeme muset podvádět s nějakou chemii. 611 00:27:24,870 --> 00:27:26,380 Máme nějaké další poháry zde. 612 00:27:26,380 --> 00:27:29,600 Takže nejbližší věc, která vypadá jako je mléko a vodních perhaps-- 613 00:27:29,600 --> 00:27:34,090 nebo mléko a OJ-- je máme nějaký voda, takže budeme naplnit tenhle nahoru 614 00:27:34,090 --> 00:27:36,486 s několika uncí čistou vodou. 615 00:27:36,486 --> 00:27:38,332 To je asi moc. 616 00:27:38,332 --> 00:27:38,832 To jo. 617 00:27:38,832 --> 00:27:39,934 To je rozhodně příliš mnoho. 618 00:27:39,934 --> 00:27:40,600 Vydržte sec. 619 00:27:40,600 --> 00:27:43,520 620 00:27:43,520 --> 00:27:48,420 >> A teď máme olej, který, pokud si vzpomínám ze střední školy chemie třídy, 621 00:27:48,420 --> 00:27:49,990 Doufejme, že to nebude míchat s vodou. 622 00:27:49,990 --> 00:27:53,650 Ale je to trochu druh vypadá jako mléko a Úředním věstníku. 623 00:27:53,650 --> 00:27:55,760 Takže teď, bez použití dočasnou proměnnou, 624 00:27:55,760 --> 00:27:59,260 můžete je přesunout tyto dvě hodnoty? 625 00:27:59,260 --> 00:28:03,884 Takže oleje jde do vody poháru, voda jde do olejové šálku. 626 00:28:03,884 --> 00:28:04,800 LAUREN: Bez dalších pohárech? 627 00:28:04,800 --> 00:28:05,940 DAVID J. Malan: Žádné další poháry. 628 00:28:05,940 --> 00:28:07,860 A já jsem vlastně zkoušet to před tímto rokem 629 00:28:07,860 --> 00:28:10,110 takže si nemyslím, pokud to nebude vědět skutečně pracují chemicky. 630 00:28:10,110 --> 00:28:16,130 631 00:28:16,130 --> 00:28:18,650 To se nemělo stát. 632 00:28:18,650 --> 00:28:19,761 Funguje to? 633 00:28:19,761 --> 00:28:20,260 Dobře. 634 00:28:20,260 --> 00:28:20,990 Tak oddělování? 635 00:28:20,990 --> 00:28:21,490 Dobrý. 636 00:28:21,490 --> 00:28:24,714 Teď musíme získat voda do druhého šálku. 637 00:28:24,714 --> 00:28:27,630 Chytřejší chemie koncentrátory mohl Pravděpodobně to mělo podařit lépe než já. 638 00:28:27,630 --> 00:28:28,510 >> LAUREN: Voda je na dně. 639 00:28:28,510 --> 00:28:31,910 >> DAVID J. Malan: water--, která byla co je klíč v poslední době jsme to udělali. 640 00:28:31,910 --> 00:28:33,950 Musíte to udělat ve správném pořadí. 641 00:28:33,950 --> 00:28:34,450 To jo. 642 00:28:34,450 --> 00:28:35,270 To je v pohodě. 643 00:28:35,270 --> 00:28:37,290 Takže teď máme dva šálky oleje. 644 00:28:37,290 --> 00:28:37,790 DOBŘE. 645 00:28:37,790 --> 00:28:38,510 To je v pohodě. 646 00:28:38,510 --> 00:28:40,110 Ale chemicky pokud to fungovalo než já-- 647 00:28:40,110 --> 00:28:41,200 >> Lauren: To je voda. 648 00:28:41,200 --> 00:28:41,930 >> DAVID J. Malan: To je většinou voda. 649 00:28:41,930 --> 00:28:42,430 Dobře. 650 00:28:42,430 --> 00:28:44,210 Ale to je pořád stejný pohár jako předtím. 651 00:28:44,210 --> 00:28:47,570 Tak nalít to-- zkuste to tam. 652 00:28:47,570 --> 00:28:49,300 DOBŘE. 653 00:28:49,300 --> 00:28:51,010 To je dobré využití třídy času dnes. 654 00:28:51,010 --> 00:28:51,510 DOBŘE. 655 00:28:51,510 --> 00:28:53,890 Takže teď we-- pěkné. 656 00:28:53,890 --> 00:28:55,460 Tak nějak. 657 00:28:55,460 --> 00:28:55,960 Dobře. 658 00:28:55,960 --> 00:28:56,690 Takže velmi dobré. 659 00:28:56,690 --> 00:29:00,006 Děkuji Lauren. 660 00:29:00,006 --> 00:29:01,950 Velmi dobře. 661 00:29:01,950 --> 00:29:04,570 >> Takže jen vyhodit svou mysl, a to je něco, co možná 662 00:29:04,570 --> 00:29:08,660 hrát s, pokud se vám líbí v CS50 ID, můžete ve skutečnosti, vyměnit dvě proměnné 663 00:29:08,660 --> 00:29:11,470 bez použití dočasného celé číslo. 664 00:29:11,470 --> 00:29:13,060 A to je odpovídající C kód. 665 00:29:13,060 --> 00:29:16,110 A pokud si vzpomínám z poslední Středa, jsme zavedli, je-li krátce, 666 00:29:16,110 --> 00:29:19,720 některé nové operátory v C a dělá někdo vzpomenout, co tu malou mrkev 667 00:29:19,720 --> 00:29:23,660 symbol je, že malá trojúhelníková symbol z klávesnice znamená? 668 00:29:23,660 --> 00:29:26,003 Co bitový operátor? 669 00:29:26,003 --> 00:29:26,770 >> Diváků: EXOR. 670 00:29:26,770 --> 00:29:27,645 >> DAVID J. Malan: EXOR. 671 00:29:27,645 --> 00:29:28,560 Exclusive Or. 672 00:29:28,560 --> 00:29:32,920 Takže pokud chcete, jen tak pro zábavu na domů, čímž se získá a a b dva libovolné 673 00:29:32,920 --> 00:29:36,072 hodnoty jako jakýkoli eight-- a I by si vybral osm bitovou hodnotu. 674 00:29:36,072 --> 00:29:38,530 Pokud to budete dělat s 32 bity, budete velmi rychle nudit. 675 00:29:38,530 --> 00:29:42,150 Ale jen dát osmibitovým Hodnota, která je co, jedna nebo dva, 676 00:29:42,150 --> 00:29:43,790 a dát b podobnou hodnotu. 677 00:29:43,790 --> 00:29:46,810 A pak pomocí definice XOR od minulé středy, 678 00:29:46,810 --> 00:29:52,560 platí, že kousek po kousku, každý tyto osm bitů v každé z a a b, 679 00:29:52,560 --> 00:29:54,980 a pak to udělat přesně to, za tímto kódem. 680 00:29:54,980 --> 00:29:58,170 A není to nesprávné, co zde vidíte na obrazovce. 681 00:29:58,170 --> 00:30:02,100 Je to opravdu scvrkává na tři operace XOR 682 00:30:02,100 --> 00:30:05,910 a nějak magicky a a b vymění pozice 683 00:30:05,910 --> 00:30:08,010 bez ztráty jakékoliv informace. 684 00:30:08,010 --> 00:30:11,580 >> Takže olej a voda trik je Nejbližší reálný svět inkarnace 685 00:30:11,580 --> 00:30:12,980 Jsem mohl myslet, že napodobovat. 686 00:30:12,980 --> 00:30:15,950 Ale je to určitě jednodušší použijte dočasné proměnné, 687 00:30:15,950 --> 00:30:16,920 jako v tomto případě zde. 688 00:30:16,920 --> 00:30:21,190 A i toto je příležitost říci, Také tento druh mikro optimalizace, 689 00:30:21,190 --> 00:30:23,590 jako erudovaný bych, zatímco druh zábavy 690 00:30:23,590 --> 00:30:27,060 chlubit, jak jste to udělal, aniž jako vyměňovat s extra proměnnou, 691 00:30:27,060 --> 00:30:28,640 že to není vše, co přesvědčivé. 692 00:30:28,640 --> 00:30:31,619 Vzhledem k tomu, aby ušetřit 32 bitů, as v případě skutečného int, 693 00:30:31,619 --> 00:30:33,410 není všechno, že přesvědčivé na systému, v němž 694 00:30:33,410 --> 00:30:36,722 můžete používat desítky megabajtů nebo dokonce více jako paměť v těchto dnech. 695 00:30:36,722 --> 00:30:38,680 A ve skutečnosti, když dostaneme na pozdější Zadání problému 696 00:30:38,680 --> 00:30:41,010 a implementovat kouzlo Kontrola a budete 697 00:30:41,010 --> 00:30:43,550 být vyzváni, aby tak učinily s to tak málo RAM a tak málo, 698 00:30:43,550 --> 00:30:46,820 čas pokud možno na computer-- vám ještě 699 00:30:46,820 --> 00:30:50,160 mají za týden pro provádění to-- budete have-- budete 700 00:30:50,160 --> 00:30:51,799 vyzval k minimalizaci těchto zdrojů. 701 00:30:51,799 --> 00:30:53,840 A to je opravdu jen OCCASION tento semestr 702 00:30:53,840 --> 00:30:57,940 kde budete povzbuzováni k holení off i nejlepší výkon 703 00:30:57,940 --> 00:30:59,340 náklady na jinak. 704 00:30:59,340 --> 00:31:02,200 >> Tak what-- jak můžeme vidět ve skutečné kódu? 705 00:31:02,200 --> 00:31:04,530 Nech mě jít napřed teď a otevřít příklad 706 00:31:04,530 --> 00:31:07,700 který záměrně se nazývá Ne Swap, protože to není 707 00:31:07,700 --> 00:31:10,670 ve skutečnosti vyměnit proměnné jak jste vlastně by se dalo očekávat. 708 00:31:10,670 --> 00:31:12,260 Takže pojďme se podívat. 709 00:31:12,260 --> 00:31:17,050 Zde je program, který nemá CS50 Knihovna se děje, jen Standard I / O. 710 00:31:17,050 --> 00:31:19,560 Nyní máme prototyp jako odkládací prostor do horní, které právě 711 00:31:19,560 --> 00:31:21,540 znamená, že to musí být definovány později. 712 00:31:21,540 --> 00:31:22,550 A tady je hlavní. 713 00:31:22,550 --> 00:31:26,000 >> I libovolně přidělen X a Y v tomto pořadí, jeden hodnoty a dva 714 00:31:26,000 --> 00:31:28,590 jen proto, že jsou malé a snadno se přemýšlet. 715 00:31:28,590 --> 00:31:32,280 A pak jsem prostě spoustu printfs kde mám kontrolu zdravý rozum. x je 1 716 00:31:32,280 --> 00:31:35,110 a y je 2, je podle všeho co tyto printfs řekne. 717 00:31:35,110 --> 00:31:36,530 Takže žádná magie tak daleko. 718 00:31:36,530 --> 00:31:40,100 >> Pak budu tvrdit, s tisknout def, vyměňovat dot dot tečky. 719 00:31:40,100 --> 00:31:43,730 Chystám se zavolat swap Funkce, předávání v x a y. 720 00:31:43,730 --> 00:31:47,350 A předpokládejme, že pro tuto chvíli Swap je implementován přesně 721 00:31:47,350 --> 00:31:49,930 jak to bylo před chvílí s dočasné proměnné. 722 00:31:49,930 --> 00:31:52,670 A tak jsem se tvrdit, směle, vyměnil. 723 00:31:52,670 --> 00:31:55,429 x je nyní to, a y je nyní, že. 724 00:31:55,429 --> 00:31:57,220 Ale soubor, samozřejmě, se nazývá No Přepnout. 725 00:31:57,220 --> 00:31:58,678 Takže pojďme se skutečně vidět, co se stane. 726 00:31:58,678 --> 00:32:04,450 Mám-li sestavit bez swapu a poté do ./noswap, x je 1, y je 2. 727 00:32:04,450 --> 00:32:05,770 Swapping vyměnil. 728 00:32:05,770 --> 00:32:07,200 x je 1, y je 2. 729 00:32:07,200 --> 00:32:11,980 Takže to vlastně se zdá být chybný i ačkoli swap-- pojďme posunout dolů now-- 730 00:32:11,980 --> 00:32:16,542 se provádí přesně dle kód, který jsem navrhl před chvílí. 731 00:32:16,542 --> 00:32:19,000 Takže my nebudeme mít fantazie s XOR věci prozatím. 732 00:32:19,000 --> 00:32:21,890 I to by mělo fungovat jen stejně jako s mlékem a Úředním věstníku, 733 00:32:21,890 --> 00:32:25,820 ale nezdá se, že funguje. 734 00:32:25,820 --> 00:32:27,180 >> Takže pojďme to udělat znovu. 735 00:32:27,180 --> 00:32:29,310 Možná jsem prostě nebyl v chodu vpravo. 736 00:32:29,310 --> 00:32:32,010 Takže pojďme běžet Bez Přepnout znovu. 737 00:32:32,010 --> 00:32:32,900 Možná Já-- ne. 738 00:32:32,900 --> 00:32:34,400 Tak to prostě nefunguje. 739 00:32:34,400 --> 00:32:36,060 Takže pojďme udělat malý kontrolu zdravý rozum. 740 00:32:36,060 --> 00:32:39,690 Nechte mě jít napřed tady v Swap a stačí přidat, počkejte chvíli, 741 00:32:39,690 --> 00:32:43,856 a je% i / n, a pojďme plug-in hodnoty a. 742 00:32:43,856 --> 00:32:45,730 Protože opravdu chci aby viděli, co se děje. 743 00:32:45,730 --> 00:32:47,570 A skutečně, to je ladící technika 744 00:32:47,570 --> 00:32:50,028 že byste mohla být použití v úřední hodiny, nebo doma už, 745 00:32:50,028 --> 00:32:53,560 podobný v první polovině roku Dan Armendariz je video v PSET3 746 00:32:53,560 --> 00:32:56,870 kde jsme představili tisk def as doporučená technika, alespoň 747 00:32:56,870 --> 00:32:58,080 Pro jednoduché případy. 748 00:32:58,080 --> 00:33:01,720 Nech mě jít dopředu a spusťte make opět bez swapu, ./noswap. 749 00:33:01,720 --> 00:33:04,370 750 00:33:04,370 --> 00:33:05,840 >> Zajímavé. 751 00:33:05,840 --> 00:33:11,670 Takže si všimnout, co se zdá být pravda. x je 1, y je 2, ale je 2, když b je 1. 752 00:33:11,670 --> 00:33:16,790 Takže ti dva se nějak vyměnili ale x a y nejsou stále prohozeny. 753 00:33:16,790 --> 00:33:21,090 Tak aby bylo jasno, co se děje se, tady mám x a y 754 00:33:21,090 --> 00:33:25,380 a ty, které jsou proměnné místní v Rozsah hlavní, jsem kolem v x a y 755 00:33:25,380 --> 00:33:26,170 vyměnit. 756 00:33:26,170 --> 00:33:29,080 Nyní, swapu, jako samostatná funkce, je zdarma zavolat své argumenty 757 00:33:29,080 --> 00:33:30,590 nebo jeho parametry něco chce. 758 00:33:30,590 --> 00:33:33,280 Foo či bar nebo X nebo Y a nebo b. 759 00:33:33,280 --> 00:33:36,870 Jen aby bylo jasné, že jsou není totožný s x a y per se, 760 00:33:36,870 --> 00:33:38,020 Řekl jsem, a a b. 761 00:33:38,020 --> 00:33:40,040 Ale my jsme jim mohli nazvat, co chceme. 762 00:33:40,040 --> 00:33:43,960 >> A tak to vypadá, swap předávaný 763 00:33:43,960 --> 00:33:48,980 x-- AKA je-- a to je předáním y- AKA b. 764 00:33:48,980 --> 00:33:51,900 Nějak se tyto tři řádky jsou vyměňovat přesně tyto hodnoty 765 00:33:51,900 --> 00:33:53,510 jako Lauren udělal s mlékem a věstníku. 766 00:33:53,510 --> 00:33:56,010 Ale když jsme vytisknout Hodnoty, a a b 767 00:33:56,010 --> 00:34:01,340 jsou sice vymění, ale i x y mít žádnou změnu k nim. 768 00:34:01,340 --> 00:34:03,150 Připomeňme si, že x a y jsou tady. 769 00:34:03,150 --> 00:34:05,320 >> Takže můžeme vidět přes další technika také. 770 00:34:05,320 --> 00:34:08,110 I to je technika vložené do problému nastavit tři. 771 00:34:08,110 --> 00:34:10,780 Pojďme dál a dělat to v CS50 ID pokud jste tak již neučinili. 772 00:34:10,780 --> 00:34:13,730 Na pravé straně my mají tuto kartu debugger. 773 00:34:13,730 --> 00:34:16,159 A pokud otevřete toto nahoru, tam je nějaký tajemný informace 774 00:34:16,159 --> 00:34:17,530 že je hozen na vás zpočátku. 775 00:34:17,530 --> 00:34:19,310 Ale pojďme škádlit to od sebe opravdu rychle. 776 00:34:19,310 --> 00:34:21,620 >> Takže člověk, vidíte lokální proměnné. 777 00:34:21,620 --> 00:34:26,230 Ukázalo se, že stavět na CS50 IDE, a mnoho programovacích prostředí více 778 00:34:26,230 --> 00:34:28,060 obecně, je debugger. 779 00:34:28,060 --> 00:34:31,340 Nástroj, který vám umožní vizuálně vidět co se děje uvnitř vašeho programu 780 00:34:31,340 --> 00:34:34,380 aniž by bylo nutné uchýlit se k přidání printfs a kompilaci a spouštění 781 00:34:34,380 --> 00:34:37,588 a přidání printf je a kompilaci a běh, který již v úředních hodinách 782 00:34:37,588 --> 00:34:40,070 nebo doma, je zřejmě stále dost únavné. 783 00:34:40,070 --> 00:34:43,090 >> Tak tady, za chvíli, my jsme bude vidět v reálném čase 784 00:34:43,090 --> 00:34:44,760 hodnoty našich lokálních proměnných. 785 00:34:44,760 --> 00:34:47,880 Jsme také bude moci nastavit co se nazývá zarážky, které 786 00:34:47,880 --> 00:34:52,570 jsou možnosti v mém programu pro pozastavení zpracování od určitého řádku kódu 787 00:34:52,570 --> 00:34:53,710 že jsem zvědavý. 788 00:34:53,710 --> 00:34:54,210 Je to tak? 789 00:34:54,210 --> 00:34:55,969 Tyto programy běží ve zlomku vteřiny. 790 00:34:55,969 --> 00:35:00,450 Je to docela hezké pro nás pomalejší člověka aby bylo možné pozastavit, chvilku, viz 791 00:35:00,450 --> 00:35:02,380 co se děje kolem určitý řádek kódu 792 00:35:02,380 --> 00:35:05,050 bez programu orbě přes to a dokončovací úplně. 793 00:35:05,050 --> 00:35:08,510 Takže zarážky bude nám umožňují zlomit a pauza v určitém okamžiku. 794 00:35:08,510 --> 00:35:12,990 >> Zásobník volání je ozdobný způsob, říkat, jaké funkce jsou v současné době 795 00:35:12,990 --> 00:35:14,140 volána v tuto chvíli. 796 00:35:14,140 --> 00:35:15,370 Hlavní je vždy nejdřív zavolat. 797 00:35:15,370 --> 00:35:17,230 Ale pokud Hlavní volá volání funkce Swap, 798 00:35:17,230 --> 00:35:20,470 my vlastně bude vidět tower funkcí, které byly 799 00:35:20,470 --> 00:35:22,400 volal v obráceném chronologickém pořadí. 800 00:35:22,400 --> 00:35:23,310 Takže pojďme se podívat, že. 801 00:35:23,310 --> 00:35:24,327 >> Jdu oddálit. 802 00:35:24,327 --> 00:35:25,660 Chystám se vrátit do svého kódu. 803 00:35:25,660 --> 00:35:27,540 A jen proto, že chci, být pedantský tady, 804 00:35:27,540 --> 00:35:31,100 Chystám se jít dál a klepněte na tlačítko jen na levé straně linky pět. 805 00:35:31,100 --> 00:35:32,830 A to vytváří červenou tečku. 806 00:35:32,830 --> 00:35:36,200 A všimněte si na pravé straně že ladicí program ví, hej, 807 00:35:36,200 --> 00:35:41,020 Jen jsem řekl, zarážku na noswap.c linka pět, konkrétně 808 00:35:41,020 --> 00:35:42,480 v tomto řádku kódu. 809 00:35:42,480 --> 00:35:45,090 Takže debugger ví, že požádaly, aby příště 810 00:35:45,090 --> 00:35:48,530 Vedu můj program pozastavíte poprava tam spíše než jen 811 00:35:48,530 --> 00:35:50,390 běží celou věc velmi rychlé. 812 00:35:50,390 --> 00:35:53,889 >> Takže teď budu klepněte na Debug Tlačítko na samém vrcholu IDE 813 00:35:53,889 --> 00:35:55,430 a to bude dělat následující. 814 00:35:55,430 --> 00:36:00,680 Bude to otevřít zpočátku poněkud děsivě vypadající druhý terminál window-- 815 00:36:00,680 --> 00:36:02,679 vzdálené ladění od hostit takové a such-- 816 00:36:02,679 --> 00:36:04,970 a my se vrátíme k tomu, co všechno to znamená, že zanedlouho. 817 00:36:04,970 --> 00:36:09,020 Ale co je důležité pro tuto chvíli je to, že červená tečka byl zasažen, 818 00:36:09,020 --> 00:36:11,735 ladicí má úmyslně pozastavena execution-- 819 00:36:11,735 --> 00:36:15,560 ne na této lince sám o sobě, ale na první řádek aktuální kód v této funkci. 820 00:36:15,560 --> 00:36:18,040 A to je důvod, proč je řada sedmi nyní zvýrazněn žlutě. 821 00:36:18,040 --> 00:36:20,550 >> A teď pojďme se podívat na pravé straně. 822 00:36:20,550 --> 00:36:27,300 Vypadá to, že ve výchozím nastavení, dost hezky, x má jakou hodnotu? 823 00:36:27,300 --> 00:36:27,860 0. 824 00:36:27,860 --> 00:36:29,750 A y má jakou hodnotu? 825 00:36:29,750 --> 00:36:30,410 Zero. 826 00:36:30,410 --> 00:36:35,540 A to je třeba očekávat v tom smyslu, že x a y-, že žlutý line-- má 827 00:36:35,540 --> 00:36:36,770 neprovede dosud. 828 00:36:36,770 --> 00:36:38,510 Takže x by neměly mít hodnotu 1. 829 00:36:38,510 --> 00:36:41,470 To by mohlo mít jinou hodnotu, tzv hodnota odpadky. 830 00:36:41,470 --> 00:36:44,320 A máme to štěstí, že je to nulu v tomto okamžiku, v podstatě. 831 00:36:44,320 --> 00:36:46,400 >> Takže teď je tu jen málo Tlačítka musíme starat 832 00:36:46,400 --> 00:36:48,100 o tom, kdy ladění tímto způsobem. 833 00:36:48,100 --> 00:36:49,970 Všimněte si, máme tlačítko Play. 834 00:36:49,970 --> 00:36:51,877 A pokud budeme hrát, nebo hit pokračovat, to je jen 835 00:36:51,877 --> 00:36:53,710 se projít zbytek programu 836 00:36:53,710 --> 00:36:55,300 nebo dokud nenarazí další zarážku. 837 00:36:55,300 --> 00:36:56,910 Ale já jsem to nastavit libovolný jiný Zlomové body, takže je to jen 838 00:36:56,910 --> 00:36:58,118 bude provozovat až do konce. 839 00:36:58,118 --> 00:37:00,280 Tento druh porazí Účelem šťourat. 840 00:37:00,280 --> 00:37:03,290 >> Takže místo toho, o co se starám tyto ikony doprava. 841 00:37:03,290 --> 00:37:05,360 A když jsem se vznášet se nad je, jak byste měli taky, 842 00:37:05,360 --> 00:37:07,450 uvidíte malé tips-- tipy nástrojů. 843 00:37:07,450 --> 00:37:09,020 Tenhle je překračovat. 844 00:37:09,020 --> 00:37:11,290 Teď to neznamená, že přeskočit následující řádek kódu. 845 00:37:11,290 --> 00:37:14,840 To jen znamená, provést jej a přesunout na další, přesunout na další, 846 00:37:14,840 --> 00:37:15,580 přesunout na další. 847 00:37:15,580 --> 00:37:17,610 Jinými slovy, pomocí toto tlačítko, můžu chodit 848 00:37:17,610 --> 00:37:20,390 přes můj kód jeden krok v čase. 849 00:37:20,390 --> 00:37:21,914 Řádek po řádku, a to doslova. 850 00:37:21,914 --> 00:37:23,830 Nyní, na pravé straně to, že je tu ještě jeden 851 00:37:23,830 --> 00:37:25,163 že uvidíme za chvíli. 852 00:37:25,163 --> 00:37:27,820 Jedná se o tzv Step Into ikonu, která je 853 00:37:27,820 --> 00:37:30,300 bude dovolte mi ponor do jiné funkce. 854 00:37:30,300 --> 00:37:31,800 Ale podívejme se to za chvíli. 855 00:37:31,800 --> 00:37:33,280 Takže jdu na tlačítko překročit. 856 00:37:33,280 --> 00:37:35,820 A teď nevšiml, když jsem klikněte Toto tlačítko v pravém horním rohu, 857 00:37:35,820 --> 00:37:41,260 mějte oči zhruba v lokální Proměnné a uvidíme, co se stane s x. 858 00:37:41,260 --> 00:37:44,115 x je nyní 1, protože žlutá linka je nyní proveden 859 00:37:44,115 --> 00:37:45,840 a my jsme se přesunul k lince 8. 860 00:37:45,840 --> 00:37:49,840 A za chvíli y by se snad stane 2. 861 00:37:49,840 --> 00:37:52,330 >> Nyní, nic, co by zajímavé se stane na chvíli. 862 00:37:52,330 --> 00:37:53,390 To vše je, je printf. 863 00:37:53,390 --> 00:37:58,010 A všimněte si, v mém sekundárním terminálu okna, vidím výstup tiskového def. 864 00:37:58,010 --> 00:38:01,080 A teď musím udělat Rozhodnutí jako programátor. 865 00:38:01,080 --> 00:38:04,360 Mohu překročit tuto linii kód, spuštěním to, ale ne 866 00:38:04,360 --> 00:38:06,220 dostat zvědavý, co je uvnitř. 867 00:38:06,220 --> 00:38:11,130 Nebo jsem si skutečně krok do ní a jít dovnitř Swap sám. 868 00:38:11,130 --> 00:38:12,340 Takže pojďme udělat to druhé. 869 00:38:12,340 --> 00:38:15,550 >> Nech mě jít dopředu a klepněte na tlačítko Není Krok přes, ale krok do. 870 00:38:15,550 --> 00:38:17,300 Oznámení, najednou okenní změny 871 00:38:17,300 --> 00:38:19,330 zvýrazněte první řádek kódu v swapu. 872 00:38:19,330 --> 00:38:20,710 To je linka 21. 873 00:38:20,710 --> 00:38:25,220 A teď, co je druh funky je to, když se podíváte sem, jak se očekávalo, 874 00:38:25,220 --> 00:38:29,720 čárka b je 1 a 2, v daném pořadí. 875 00:38:29,720 --> 00:38:33,840 Proč je temp 32767? 876 00:38:33,840 --> 00:38:36,560 Připomínajíc, že ​​teplota, podobně jako prázdný šálek před chvílí, 877 00:38:36,560 --> 00:38:38,980 Zde je deklarována na řádku 21. 878 00:38:38,980 --> 00:38:43,390 Proč 32,000- Chci říct, proč je to jen nějaký divný hodnota? 879 00:38:43,390 --> 00:38:43,890 To jo? 880 00:38:43,890 --> 00:38:45,190 >> Diváků: To není inicializován. 881 00:38:45,190 --> 00:38:46,940 >> DAVID J. Malan: Je to nebyl inicializován. 882 00:38:46,940 --> 00:38:49,370 Takže náš počítač vždy má fyzické paměti. 883 00:38:49,370 --> 00:38:50,544 To má vždy fyzické paměti RAM. 884 00:38:50,544 --> 00:38:52,710 A je tu vždy Zero a jeden je tam, že jo? 885 00:38:52,710 --> 00:38:54,626 Vzhledem k tomu, že jsme pomocí našeho počítač po celý den, 886 00:38:54,626 --> 00:38:57,210 používáte CS50 IDE nebo servery po celý den. 887 00:38:57,210 --> 00:39:01,159 Tak, že RAM buď má nějaké nuly, nebo někdo je nebo některé nuly a jedničky. 888 00:39:01,159 --> 00:39:02,950 Bez ohledu na to, zda je či ne, že je máte používat. 889 00:39:02,950 --> 00:39:05,270 Nemůžete jen tak prázdný prostory, kde chcete bitů. 890 00:39:05,270 --> 00:39:06,850 Jsou to buď nuly a jedničky. 891 00:39:06,850 --> 00:39:09,610 >> Tak to dopadá, že teplota, protože jsme není inicializována to ještě, 892 00:39:09,610 --> 00:39:14,580 máme ty 32 bitů, ale jsem ne byl inicializován na jakékoliv známé hodnoty. 893 00:39:14,580 --> 00:39:18,110 Takže všechno, co byli nejvíce naposledy použité for-- těch 32 bits-- 894 00:39:18,110 --> 00:39:23,000 jsme jen vidět artefakty některých předchozí použití těchto zvláštních 32 895 00:39:23,000 --> 00:39:23,500 bitů. 896 00:39:23,500 --> 00:39:27,780 Jakmile jsem klepněte na tlačítko Krok přes ačkoli, uf, temp dostane hodnotu 1. 897 00:39:27,780 --> 00:39:31,600 A pokud bych to znovu, a je Chystáte se mít hodnotu 2 898 00:39:31,600 --> 00:39:33,830 a pak b se chystá mít hodnotu 1. 899 00:39:33,830 --> 00:39:36,390 >> A tak to, co je teď pěkná na tento bod v příběhu 900 00:39:36,390 --> 00:39:39,750 je to, že je debugger mi ukazoval, super pomalu 901 00:39:39,750 --> 00:39:42,640 v mém vlastním tempem, jaké stav swapu je. 902 00:39:42,640 --> 00:39:47,490 Nevšimnout nahoře tady, oznámení že zásobník volání skutečně 903 00:39:47,490 --> 00:39:49,180 má dvě vrstvy na to. 904 00:39:49,180 --> 00:39:53,240 Nyní se ten, který je označen jako Swap, když jsem klikněte na hlavní místo, 905 00:39:53,240 --> 00:39:57,100 Všimněte si, jak místní proměnné změnit proto, že vývojář může jen hop 906 00:39:57,100 --> 00:39:59,740 kolem a jít do jakéhokoli jiného rozsahu. 907 00:39:59,740 --> 00:40:04,070 Takže i když to děláme tohle všechno pracovat a správně vyměňovat A a B, 908 00:40:04,070 --> 00:40:09,080 když půjdu tam a zpět mezi Swap kde a je 2 a b je 1 a Main, 909 00:40:09,080 --> 00:40:11,851 byl hlavní byl ovlivněn vůbec? 910 00:40:11,851 --> 00:40:12,350 Ne. 911 00:40:12,350 --> 00:40:13,930 Takže to, co je tady stánek s jídlem? 912 00:40:13,930 --> 00:40:18,200 No, to ukáže, že kdykoliv volání funkce, jako Swap, 913 00:40:18,200 --> 00:40:21,600 a předat ji argumenty, co budete procházet k funkci Swap 914 00:40:21,600 --> 00:40:24,730 V tomto případě je kopie z těchto argumentů. 915 00:40:24,730 --> 00:40:28,620 Takže v případě, x a y jsou každý v tomto pořadí 32 bitů, co Swap je stále 916 00:40:28,620 --> 00:40:30,760 je dva nové místní proměnné, nebo argumenty, 917 00:40:30,760 --> 00:40:34,380 volal a B- ale ty jsou libovolné names-- ale vzor nul 918 00:40:34,380 --> 00:40:39,520 a ty uvnitř A a B jsou seřadili že je totožný s x a y 919 00:40:39,520 --> 00:40:42,610 ale oni nejsou totéž jako x a y. 920 00:40:42,610 --> 00:40:46,880 >> Je to jako kdyby Main má na svém kousku papír číslo 1 a 2 pro x a y, 921 00:40:46,880 --> 00:40:49,260 a pak, když to ruce, které kus papíru Swap, 922 00:40:49,260 --> 00:40:51,970 Swap velmi rychle dostane jeho vlastní pero, zapíše 923 00:40:51,970 --> 00:40:56,240 1 a 2 na vlastním listu papíru, ruce zpět původní XY Hlavní 924 00:40:56,240 --> 00:40:58,790 a pak dělá jeho vlastní ta věc s a a b. 925 00:40:58,790 --> 00:41:01,940 A toto je nyní mimořádně důležité, protože to má netriviální důsledky 926 00:41:01,940 --> 00:41:06,260 pro skutečně psaní správný kód protože to by se zdálo, že nemůžeme vyměnit 927 00:41:06,260 --> 00:41:07,500 dvě proměnné. 928 00:41:07,500 --> 00:41:09,150 >> Napsal jsem správnou funkci Zaměnit. 929 00:41:09,150 --> 00:41:12,770 Vytvořili jsme to s Lauren as správná funkce swapu ve skutečnosti, 930 00:41:12,770 --> 00:41:16,700 ale zřejmě nic z toho záležitosti, pokud nemůžete vlastně 931 00:41:16,700 --> 00:41:19,530 zaměnit dvě hodnoty trvale. 932 00:41:19,530 --> 00:41:21,970 Takže potřebujeme jiný způsob se skutečně dostat na to, 933 00:41:21,970 --> 00:41:24,472 a musíme být schopni tento problém skutečně vyřešit. 934 00:41:24,472 --> 00:41:27,180 A ukazuje out-- a my přijdeme zpět do tohoto konkrétního obrázku 935 00:41:27,180 --> 00:41:30,500 Před long-- to je jedním ze způsobů, můžete čerpat paměti počítače. 936 00:41:30,500 --> 00:41:31,460 Je to jen obdélník. 937 00:41:31,460 --> 00:41:32,960 Mohl bys ho nakreslit jakýkoliv řada způsobů, ale je to 938 00:41:32,960 --> 00:41:35,740 vhodné nakreslit to jak obdélník z následujícího důvodu. 939 00:41:35,740 --> 00:41:40,040 >> Chystáme se začít dnes a za mluví o tzv zásobníku. 940 00:41:40,040 --> 00:41:43,870 A stack je jen kus z RAM-- kus memory-- 941 00:41:43,870 --> 00:41:47,100 že funkce mají přístup , když se jim říká. 942 00:41:47,100 --> 00:41:49,800 A tak se ukáže, že na na samé dno tohoto zásobníku 943 00:41:49,800 --> 00:41:53,590 je místo, kde všechny hlavní je lokálních proměnných a org C a org V a všechny ty věci 944 00:41:53,590 --> 00:41:56,950 se chystáte jít ve výchozím nastavení. A pokud Main volá nějakou jinou funkci, jako Swap, 945 00:41:56,950 --> 00:42:00,330 dobře, Swap se chystá získat další Vrstva paměti až nad ní. 946 00:42:00,330 --> 00:42:04,490 >> A tak jen aby vám rychlé zběžnou obrázek o tom, jestli jsem jít přes here-- 947 00:42:04,490 --> 00:42:09,450 a dovolte mi, abych zrcadlit to na nad hlavou as well-- co se skutečně mám, 948 00:42:09,450 --> 00:42:12,100 pokud se staráme jen o Spodní část obrázku pro tuto chvíli, 949 00:42:12,100 --> 00:42:15,070 je, že když jsem spuštění programu a Main se zavolá, 950 00:42:15,070 --> 00:42:18,330 Hlavní je dána kus RAM v mém počítači, který je 951 00:42:18,330 --> 00:42:20,060 ve spodní části této takzvané zásobníku. 952 00:42:20,060 --> 00:42:22,143 A já budu kreslit záměrně jako čtverec. 953 00:42:22,143 --> 00:42:24,540 Takže je to jako 32 bitů nebo čtyři byty. 954 00:42:24,540 --> 00:42:28,790 A je-li tato hlavní funkce má proměnnou s názvem x s hodnotou 1 955 00:42:28,790 --> 00:42:32,626 a to má proměnnou s názvem y s hodnotou 2, to je 956 00:42:32,626 --> 00:42:35,750 jako při tento plátek paměti Hlavní byl dán provozními 957 00:42:35,750 --> 00:42:38,850 Systém a rozdělí to tak, aby první místní proměnná jde zde, 958 00:42:38,850 --> 00:42:40,930 druhá jde tady, a to je vše. 959 00:42:40,930 --> 00:42:45,590 >> Když Hlavní volá swap, Swap získá svou vlastní krajíc paměti 960 00:42:45,590 --> 00:42:48,280 že budeme čerpat takhle z operačního systému, 961 00:42:48,280 --> 00:42:50,820 a bude to mít své vlastní lokální proměnné na bázi 962 00:42:50,820 --> 00:42:53,825 Na naší implementace dříve s lokálními proměnnými 963 00:42:53,825 --> 00:42:58,010 a b, které zpočátku získat hodnoty 1 a 2. 964 00:42:58,010 --> 00:43:00,450 Ale pak, jakmile swap kód provede, 965 00:43:00,450 --> 00:43:03,760 a Lauren vlastně swapů Věst a mléko, co se děje? 966 00:43:03,760 --> 00:43:09,030 No, to 2 se stává 1, tuto 1 se stává 2, a mimochodem, 967 00:43:09,030 --> 00:43:13,360 tam je teplota proměnná, která je bytí použity, že celou tu dobu, že nakonec 968 00:43:13,360 --> 00:43:14,470 jde pryč. 969 00:43:14,470 --> 00:43:16,720 Ale to nezáleží na tom, kolik práce děláte 970 00:43:16,720 --> 00:43:22,160 v tomto řádku of-- v této paměti, x a y jsou zcela nedotčené. 971 00:43:22,160 --> 00:43:26,320 >> Takže potřebujeme nějaký způsob, jak dát Swap a funkce jako to 972 00:43:26,320 --> 00:43:32,640 tajný přístup, chcete-li, aby Funkce jako-- do paměti jako x a y. 973 00:43:32,640 --> 00:43:35,110 Takže pojďme se podívat na příklad, která pomáhá 974 00:43:35,110 --> 00:43:38,220 nám vidět přesně to, co je to děje na celém tomto období. 975 00:43:38,220 --> 00:43:40,284 Chystám se pokračovat a otevřít si porovnejte Zero. 976 00:43:40,284 --> 00:43:42,200 A já jdu zavřít naše debugger, jdu 977 00:43:42,200 --> 00:43:44,360 zavřete tuto děsivé vypadající zprávu spravedlivý říká, počkej, 978 00:43:44,360 --> 00:43:45,800 jste ve středu ladění. 979 00:43:45,800 --> 00:43:48,383 Chystám se tu schovat tuto záložku prostě se vrátit k jednoduchosti. 980 00:43:48,383 --> 00:43:50,160 Takže nebojte se, pokud je zabit GDB. 981 00:43:50,160 --> 00:43:53,910 To prostě znamená, že program má bylo skončit, záměrně v tomto případě, 982 00:43:53,910 --> 00:43:54,820 mě. 983 00:43:54,820 --> 00:43:57,700 >> A teď si porovnejte Zero to dělá. 984 00:43:57,700 --> 00:44:00,110 Jsem pomocí CS50 Knihovna ve standardním I / O. 985 00:44:00,110 --> 00:44:04,319 Mám ten první hlavní funkci říká, něco říct, a dostane řetězec. 986 00:44:04,319 --> 00:44:06,110 Pak říká, že znovu a dostane další řetězec. 987 00:44:06,110 --> 00:44:09,910 A všimněte si, že tyto dva řetězce se nazývají S a T, v daném pořadí. 988 00:44:09,910 --> 00:44:12,910 A nyní tento program, Porovnat Zero, jeho účel v životě, 989 00:44:12,910 --> 00:44:15,470 to má se mi říct, jsem zadejte totéž? 990 00:44:15,470 --> 00:44:16,910 A tak jsem se vracím do týdne jednu. 991 00:44:16,910 --> 00:44:19,950 Já používám svůj rovný rovného operátor která je provozovatelem kvalita. 992 00:44:19,950 --> 00:44:22,220 Ne operátor přiřazení, operátor rovnosti. 993 00:44:22,220 --> 00:44:23,890 Já jsem jen porovnáním s a t. 994 00:44:23,890 --> 00:44:27,470 >> Takže pojďme skutečně jít do toho a to udělat. 995 00:44:27,470 --> 00:44:32,680 A budu pokračovat a dělat si porovnejte Zero. 996 00:44:32,680 --> 00:44:35,110 Budu dělat ./comparezero. 997 00:44:35,110 --> 00:44:37,150 A já jdu vpřed a říci něco 998 00:44:37,150 --> 00:44:43,450 jako, pojďme dělat mámu malými písmeny a jak se o matce velkými písmeny. 999 00:44:43,450 --> 00:44:45,034 A samozřejmě jsem psát různé věci. 1000 00:44:45,034 --> 00:44:45,533 Dobře. 1001 00:44:45,533 --> 00:44:46,570 To je to, aby se dalo očekávat. 1002 00:44:46,570 --> 00:44:47,640 >> Pojďme jej spustit znovu. 1003 00:44:47,640 --> 00:44:49,740 V obou případech dělat malá písmena, malá písmena. 1004 00:44:49,740 --> 00:44:51,490 To vypadá super totožný se mnou. 1005 00:44:51,490 --> 00:44:52,930 Enter. 1006 00:44:52,930 --> 00:44:53,430 DOBŘE. 1007 00:44:53,430 --> 00:44:55,804 Možná je to jen trochu divné, protože to nelíbilo mé gramatiku. 1008 00:44:55,804 --> 00:44:59,930 Takže pojďme udělat kapitálu MOM, kapitál MOM, identické. 1009 00:44:59,930 --> 00:45:01,490 Různé věci. 1010 00:45:01,490 --> 00:45:03,907 >> Tak proč je to? 1011 00:45:03,907 --> 00:45:06,240 No, co se vlastně bude Na pod pokličku tady? 1012 00:45:06,240 --> 00:45:08,180 Takže pojďme se přes Zde na chvilku 1013 00:45:08,180 --> 00:45:10,910 a zvážit, co GetString je ve skutečnosti dělá. 1014 00:45:10,910 --> 00:45:13,385 Při volání getString, to je funkce jsme 1015 00:45:13,385 --> 00:45:16,510 Sami psal a to nějak dostane sled charakterů od uživatele. 1016 00:45:16,510 --> 00:45:20,280 A předpokládejme, že první Tentokrát jsem zavolat getString, že mi dává 1017 00:45:20,280 --> 00:45:21,930 kus paměti, která vypadá takto. 1018 00:45:21,930 --> 00:45:26,990 A když jsem napsal v malými m-o-m-- a to, co jde po něm? 1019 00:45:26,990 --> 00:45:28,840 Jen rychlý check zdravý rozum. 1020 00:45:28,840 --> 00:45:29,780 >> Zpětné lomítko nula. 1021 00:45:29,780 --> 00:45:30,510 Víme, že. 1022 00:45:30,510 --> 00:45:32,784 A připomněl, že jsme hráli kolem Zamila jménem 1023 00:45:32,784 --> 00:45:34,950 a spoustu dalších jmen když Rob se sem dívá 1024 00:45:34,950 --> 00:45:36,280 na to, co se děje v paměti. 1025 00:45:36,280 --> 00:45:37,780 Tak, že příběh je to přesně to samé. 1026 00:45:37,780 --> 00:45:40,160 To je to, co GetString se vrací ke mně. 1027 00:45:40,160 --> 00:45:44,780 A teď, můj kód před chvílí uložen vrácená hodnota getString 1028 00:45:44,780 --> 00:45:47,510 v proměnné nazvaný s. 1029 00:45:47,510 --> 00:45:51,390 A pak podruhé jsem volal to, to uložena v proměnné s názvem t. 1030 00:45:51,390 --> 00:45:55,070 >> Takže když jsem jít sem, potřebuji kreslit této místní proměnná-- 1031 00:45:55,070 --> 00:45:59,610 a já obecně jít do kreslit řetězec jako jenom-- my budeme 1032 00:45:59,610 --> 00:46:02,360 říkají S- jako malé náměstí zde. 1033 00:46:02,360 --> 00:46:09,760 A teď, jak se máma somehow-- jít dovnitř této proměnné s? 1034 00:46:09,760 --> 00:46:12,010 No, musíme se vrátit zpět na prvních principů zde. 1035 00:46:12,010 --> 00:46:15,660 Co je to vlastně GetString vrací? 1036 00:46:15,660 --> 00:46:19,030 >> Tak to dopadá, že M-O-M backslash nula, a jakýkoliv počet 1037 00:46:19,030 --> 00:46:22,364 ostatních řetězců v paměti, jako je Zamila a Rob nebo Andy, nebo jakékoli jiné, 1038 00:46:22,364 --> 00:46:24,280 jsou samozřejmě v našem RAM počítače nebo paměti. 1039 00:46:24,280 --> 00:46:27,760 A vaše RAM má jako-- máte koncert paměti RAM, dva koncerty RAM, 1040 00:46:27,760 --> 00:46:30,860 nebo miliarda nebo dvě miliardy bajtů, nebo možná ještě v těchto dnech. 1041 00:46:30,860 --> 00:46:34,070 Takže pojďme se předpokládat, pro dnešní účely, že nezáleží na tom, jak jsme se počítat 1042 00:46:34,070 --> 00:46:36,640 je, ale můžeme počítat každý z těch miliard, nebo dvě miliardy 1043 00:46:36,640 --> 00:46:37,880 nebo čtyři miliardy bajtů. 1044 00:46:37,880 --> 00:46:42,240 >> A ať to jen říct, že svévolně toto je první sousto, druhým skus, 1045 00:46:42,240 --> 00:46:43,380 Třetí, čtvrtý. 1046 00:46:43,380 --> 00:46:46,570 Já záměrně nepoužívají nula dnes ale vrátíme k tomu. 1047 00:46:46,570 --> 00:46:49,570 Takže jinými slovy, zda se jedná o vůbec poprvé jsem pomocí programu, 1048 00:46:49,570 --> 00:46:52,715 Já jsem jen na to, štěstí a první kousnutí je v jednom místě pak dvě 1049 00:46:52,715 --> 00:46:53,590 pak tři než čtyři. 1050 00:46:53,590 --> 00:46:57,430 A když jsem si kreslení, číslo schránky dvou miliard by cesta sem. 1051 00:46:57,430 --> 00:47:02,200 >> Tak co si myslíš, a pak, GetString vlastně vrací? 1052 00:47:02,200 --> 00:47:06,010 Není to vrací M-O-M zpětného lomítka zero per se, protože to jasně 1053 00:47:06,010 --> 00:47:08,180 se nevejde do pole, které jsem natažený. 1054 00:47:08,180 --> 00:47:11,210 Takže co jiného by mohlo getString vlastně se vrátí všechny tyto týdny? 1055 00:47:11,210 --> 00:47:14,410 1056 00:47:14,410 --> 00:47:16,820 Odpověď je na board někde tady. 1057 00:47:16,820 --> 00:47:20,390 Můžete nevejde M-O-M zpětné lomítko nula, Takže to, co by mohlo mít smysl místo? 1058 00:47:20,390 --> 00:47:23,424 Pokud byste měli být super chytrý, uvedení na tzv inženýrství klobouk, 1059 00:47:23,424 --> 00:47:24,340 co byste mohli vrátit? 1060 00:47:24,340 --> 00:47:27,340 Co je to nejmenší množství informací jste mohli vrátit, že by stále 1061 00:47:27,340 --> 00:47:30,610 vám umožní najít M-O-M v paměti? 1062 00:47:30,610 --> 00:47:31,270 To jo? 1063 00:47:31,270 --> 00:47:31,950 >> Diváků: One. 1064 00:47:31,950 --> 00:47:32,200 >> DAVID J. Malan: One. 1065 00:47:32,200 --> 00:47:33,021 A proč jeden? 1066 00:47:33,021 --> 00:47:35,520 Diváků: Vzhledem k tomu, že by se říct, vám kam jít [neslyšitelný]. 1067 00:47:35,520 --> 00:47:38,391 1068 00:47:38,391 --> 00:47:39,390 DAVID J. Malan: Přesně tak. 1069 00:47:39,390 --> 00:47:44,300 Já jsem jen jít na zpáteční adresu řetězce, které jsem dostala. 1070 00:47:44,300 --> 00:47:46,570 Adresa v tomto Případ je lokalita jednou. 1071 00:47:46,570 --> 00:47:51,280 Takže to, co opravdu je uložen v S- a každý řetězec variabilní tak far-- 1072 00:47:51,280 --> 00:47:53,430 právě bylo adresa tohoto řetězce. 1073 00:47:53,430 --> 00:47:57,840 >> Mezitím, když jsem volat GetString podruhé a já 1074 00:47:57,840 --> 00:48:03,300 zadejte doslova stejný thing-- M-O-M s lowercase-- M-O-M 1075 00:48:03,300 --> 00:48:06,200 a další zpětné lomítko nula, a teď možná můj program je 1076 00:48:06,200 --> 00:48:09,820 běží již delší dobu, takže možná to je 10, to je místo 11, to je 12, 1077 00:48:09,820 --> 00:48:10,700 to je 13. 1078 00:48:10,700 --> 00:48:13,590 Počítače používající jiné paměť z jakéhokoli důvodu. 1079 00:48:13,590 --> 00:48:18,172 Co teď chodí do mé druhé proměnná v mém program T? 1080 00:48:18,172 --> 00:48:19,390 10. 1081 00:48:19,390 --> 00:48:20,050 Přesně tak. 1082 00:48:20,050 --> 00:48:23,910 >> A tak, když se podíváme na Zdrojový kód tohoto programu 1083 00:48:23,910 --> 00:48:26,550 kde jsem prostě snaží pro srovnání dvou hodnot, 1084 00:48:26,550 --> 00:48:32,180 Je to rovná rovná t, co je zřejmá lidská odpověď? 1085 00:48:32,180 --> 00:48:34,890 Právě proto, že ne 1 se nerovná 10. 1086 00:48:34,890 --> 00:48:36,861 A tak zde táboří příležitost pro nás opravdu 1087 00:48:36,861 --> 00:48:39,610 prostě jít zpátky do znovu, nejprve principy a přemýšlet o tom, dobře, 1088 00:48:39,610 --> 00:48:41,110 co se děje pod kapotou? 1089 00:48:41,110 --> 00:48:43,240 Mluvili jsme o bity a bajty a paměť, 1090 00:48:43,240 --> 00:48:46,820 ale ve skutečnosti je to užitečné pro pochopení proto, že když zavoláte getString, 1091 00:48:46,820 --> 00:48:50,280 i když si myslíme, že to je vrácení M-O-M nebo řetězec máma 1092 00:48:50,280 --> 00:48:53,120 nebo Andy nebo Zamila nebo podobně, technicky 1093 00:48:53,120 --> 00:48:55,510 je to jen vrací adresu tohoto kusu paměti. 1094 00:48:55,510 --> 00:48:56,910 >> Ale to je v pořádku. 1095 00:48:56,910 --> 00:49:00,570 Vzhledem k tomu, jak mám vědět kde řetězec končí? 1096 00:49:00,570 --> 00:49:03,840 Pokud jsem jen dal na začátku? 1097 00:49:03,840 --> 00:49:05,380 No, zpětné lomítko nula, ne? 1098 00:49:05,380 --> 00:49:08,800 Právě v lineárním čase mohu vytisknout s potiskem def M-O-M. 1099 00:49:08,800 --> 00:49:11,820 A jakmile vidím zpětné lomítko nula, je mi jedno, kde jsem začal, 1100 00:49:11,820 --> 00:49:14,950 Já už vím, implicitně kde musím skončit. 1101 00:49:14,950 --> 00:49:18,700 >> A tak dnes označuje beginning-- a dovolte mi, abych to dramaticky, protože jsme 1102 00:49:18,700 --> 00:49:21,800 prošel spoustu problémů na získat tyto zde školení wheels-- 1103 00:49:21,800 --> 00:49:29,840 tak dnes školicí kola začátek sundat a my odhalit na least-- 1104 00:49:29,840 --> 00:49:31,373 >> [APPLAUSE] 1105 00:49:31,373 --> 00:49:33,220 1106 00:49:33,220 --> 00:49:36,160 >> To bylo dobře stojí za výlet k TARGETu dnes ráno, ano? 1107 00:49:36,160 --> 00:49:39,600 Takže now-- existuje, se ukazuje out, žádná taková věc jako řetězec. 1108 00:49:39,600 --> 00:49:41,140 Řetězec neexistuje. 1109 00:49:41,140 --> 00:49:43,760 Je to synonymum, že jsme měli uvnitř knihovny CS50. 1110 00:49:43,760 --> 00:49:48,660 Od té doby, budeme začít volat s a t nejsou řetězce, ale char hvězdy. 1111 00:49:48,660 --> 00:49:51,180 A char hvězda my budeme šprýmaři odděleně zanedlouho. 1112 00:49:51,180 --> 00:49:53,510 Ale to znamená, že i když budeme pokračovat 1113 00:49:53,510 --> 00:49:56,180 použití getString teď, technicky bych měl 1114 00:49:56,180 --> 00:49:59,010 říkat char hvězda a char hvězdu. 1115 00:49:59,010 --> 00:50:01,720 >> A ukázalo se, co to hvězdu bude pro označení je něco 1116 00:50:01,720 --> 00:50:04,340 nazýván ukazatel nebo adresa. 1117 00:50:04,340 --> 00:50:06,110 A ve skutečnosti, teaser za to, co je před námi 1118 00:50:06,110 --> 00:50:09,760 Je to 20 sekund klip z našeho přítel Nick Parlante na Stanfordu 1119 00:50:09,760 --> 00:50:12,927 kdo, před nějakou dobou, stráví směšné množství času, 1120 00:50:12,927 --> 00:50:15,010 jak nejlépe mohu říct ve svém kuchyňské nebo jeho suterénu, 1121 00:50:15,010 --> 00:50:17,140 Díky claymation zavádí do světa 1122 00:50:17,140 --> 00:50:20,010 charakter jmenoval Binky s kým budeme 1123 00:50:20,010 --> 00:50:22,010 být zavedeny příště na ukazateli. 1124 00:50:22,010 --> 00:50:24,588 Takže tady je náhled na to, co přijde. 1125 00:50:24,588 --> 00:50:26,370 >> [VIDEOPŘEHRÁVÁNÍ] 1126 00:50:26,370 --> 00:50:27,510 >> Hej, Binky. 1127 00:50:27,510 --> 00:50:28,260 Probudit. 1128 00:50:28,260 --> 00:50:30,672 Je čas na ukazatel zábavu. 1129 00:50:30,672 --> 00:50:31,616 >> -Co je to? 1130 00:50:31,616 --> 00:50:33,032 Další informace o ukazatele? 1131 00:50:33,032 --> 00:50:34,450 Oh, dobrota. 1132 00:50:34,450 --> 00:50:35,431 >> [END Přehrávání] 1133 00:50:35,431 --> 00:50:38,055 DAVID J. Malan: A v takovém případě, Vás budeme vidět ve středu. 1134 00:50:38,055 --> 00:50:47,590 1135 00:50:47,590 --> 00:50:48,090 Dobře. 1136 00:50:48,090 --> 00:50:48,740 Kdo je tanec? 1137 00:50:48,740 --> 00:50:49,240 No tak. 1138 00:50:49,240 --> 00:50:50,330 Kdo je tanec? 1139 00:50:50,330 --> 00:50:51,820 Chceš, abych si to začalo? 1140 00:50:51,820 --> 00:50:53,770 Budu si to začalo. 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: Sladké fantazie Mojžíš.