1 00:00:00,000 --> 00:00:10,550 2 00:00:10,550 --> 00:00:14,050 >> David J. MALAN: Jest CS50 i to jest początek tygodnia cztery. 3 00:00:14,050 --> 00:00:18,630 A chłopak, jest Volkswagen w Kłopot wszystko z powodu oprogramowania. 4 00:00:18,630 --> 00:00:20,264 Rzućmy okiem. 5 00:00:20,264 --> 00:00:20,930 [ODTWARZANIE] 6 00:00:20,930 --> 00:00:25,560 -samochody, Najlepsi znaków w szybki i wściekły filmów. 7 00:00:25,560 --> 00:00:29,100 W tym tygodniu niemiecki producent samochodów Volkswagen znalazł się 8 00:00:29,100 --> 00:00:32,490 w środku skandalu Proporcje potencjalnie przestępcze. 9 00:00:32,490 --> 00:00:36,060 >> -Volkswagen Jest usztywnienie miliardy grzywny, ewentualne zarzuty karne 10 00:00:36,060 --> 00:00:38,560 dla jego kierownictwa, jak Firma przeprasza 11 00:00:38,560 --> 00:00:41,840 dla osprzętu 11 milionów samochodów do pomóc mu pokonać testów emisji. 12 00:00:41,840 --> 00:00:44,950 >> -Certain Modele wysokoprężne były zaprojektowany z zaawansowanego oprogramowania 13 00:00:44,950 --> 00:00:48,440 które używane informacje w tym Stanowisko sterowania i pojazdu 14 00:00:48,440 --> 00:00:51,870 prędkość do określenia samochód był w fazie testowania emisji. 15 00:00:51,870 --> 00:00:55,650 Zgodnie z tym okoliczność, silnik zmniejszy toksycznych emisji. 16 00:00:55,650 --> 00:00:59,070 Ale samochód był sfałszowane na obwodnicy że gdy był napędzany. 17 00:00:59,070 --> 00:01:03,320 Emisja wzrosła od 10 do 40 razy powyżej dopuszczalnych poziomów EPA. 18 00:01:03,320 --> 00:01:04,280 >> [Zakończyć odtwarzanie] 19 00:01:04,280 --> 00:01:05,220 >> David J. MALAN: Więc niech spójrz na to 20 00:01:05,220 --> 00:01:07,250 i zobaczyć dokładnie, jak to Może być realizowane 21 00:01:07,250 --> 00:01:09,680 i jak to może wpłynąć na tak wiele samochodów takie jak ten. 22 00:01:09,680 --> 00:01:12,840 Więc w mojej dłoni są tu prasa zwolnij, który został wydany przez EPA-- 23 00:01:12,840 --> 00:01:14,620 Environmental Agencja Ochrony, który 24 00:01:14,620 --> 00:01:18,032 jest US agencja regulacyjna, która uchwyty problemów ochrony środowiska, 25 00:01:18,032 --> 00:01:19,740 i następnie rzeczywiste Nota prawna, która była 26 00:01:19,740 --> 00:01:22,420 wysłać do Volkswagena, zaledwie kilka dni temu. 27 00:01:22,420 --> 00:01:26,530 >> Więc EPA pisze, i ujawnia się teraz publicznie, wyrafinowane oprogramowanie 28 00:01:26,530 --> 00:01:29,390 Algorytm na pewne Pojazdy Volkswagen wykrywa 29 00:01:29,390 --> 00:01:32,630 gdy samochód jest w trakcie Oficjalne badania emisji 30 00:01:32,630 --> 00:01:36,505 i zamienia pełne emisji kontroluje się tylko w trakcie testu. 31 00:01:36,505 --> 00:01:38,380 Skuteczność tych zanieczyszczeń pojazdów 32 00:01:38,380 --> 00:01:43,260 Urządzenia kontroli emisji jest znacznie zmniejszona podczas wszystkich normalnej jazdy 33 00:01:43,260 --> 00:01:44,320 sytuacje. 34 00:01:44,320 --> 00:01:48,190 Powoduje to samochody, które spełniają Standardy w laboratorium lub testowania 35 00:01:48,190 --> 00:01:52,790 Stacja, ale w normalnej pracy emitują oxides-- azotu lub NOx-- 36 00:01:52,790 --> 00:01:54,950 z prędkością do 40 razy normy. 37 00:01:54,950 --> 00:01:58,220 Oprogramowanie wyprodukowany przez Volkswagena Jest to urządzenie cytatu, porażka, 38 00:01:58,220 --> 00:02:00,650 Zgodnie z definicją Czyste Air Act w USA. 39 00:02:00,650 --> 00:02:03,410 >> Idą na powiedzieć, że EPA i inna agencja 40 00:02:03,410 --> 00:02:07,020 odkrył urządzenie obniżające Oprogramowanie po niezależnej analizy 41 00:02:07,020 --> 00:02:09,660 przez naukowców z Zachodu Uniwersytet Virginia. 42 00:02:09,660 --> 00:02:14,160 Zanieczyszczeń NOx przyczynia się do dwutlenek azotu, ozon w warstwie przyziemnej, 43 00:02:14,160 --> 00:02:15,700 i drobne cząstki stałe. 44 00:02:15,700 --> 00:02:18,090 Narażenie na te Zanieczyszczenia jest związana 45 00:02:18,090 --> 00:02:20,870 z szerokiej gamy poważne skutki zdrowotne, 46 00:02:20,870 --> 00:02:23,637 w tym zwiększoną astmy Ataki i inne oddechowego 47 00:02:23,637 --> 00:02:26,470 Choroby, które mogą być na tyle poważne, wysłać ludzi do szpitala. 48 00:02:26,470 --> 00:02:28,660 Narażenie na działanie ozonu i cząstek stałych ma także 49 00:02:28,660 --> 00:02:31,960 wiąże się z przedwczesnym zgon z powodu układu oddechowego związane 50 00:02:31,960 --> 00:02:35,690 lub układu krążenia związane efekty. 51 00:02:35,690 --> 00:02:38,940 Dzieci, osoby starsze, osoby z preegzystując choroby układu oddechowego 52 00:02:38,940 --> 00:02:42,840 są szczególnie narażone na ryzyko wpływ na zdrowie tych zanieczyszczeń. 53 00:02:42,840 --> 00:02:45,056 >> Wystarczy to znaczy, że to dość poważne. 54 00:02:45,056 --> 00:02:46,930 I przejdźmy do czytania jeszcze jeden fragment 55 00:02:46,930 --> 00:02:49,370 a następnie będziemy spojrzeć na implikacje bazowe 56 00:02:49,370 --> 00:02:50,920 o tym w związku z samochodu. 57 00:02:50,920 --> 00:02:53,730 W szczególności, Volkswagen wyprodukowany i zainstalowany 58 00:02:53,730 --> 00:02:56,210 Oprogramowanie w tak zwanych sterowanie elektroniczne 59 00:02:56,210 --> 00:02:59,320 module-- lub ECM-- od te pojazdy, które wykrywane 60 00:02:59,320 --> 00:03:03,580 gdy pojazd jest testowane pod kątem zgodność z normami emisji spalin EPA. 61 00:03:03,580 --> 00:03:07,510 Na podstawie różnych wejść włączając w pozycja kierownicy pojazdu 62 00:03:07,510 --> 00:03:11,280 prędkość, czas trwania silnika Operacja, oraz ciśnienia atmosferycznego, 63 00:03:11,280 --> 00:03:13,720 Wejścia te właśnie śledzone parametry 64 00:03:13,720 --> 00:03:17,600 federalnego procedury badania dla badanie emisji do certyfikacji EPA 65 00:03:17,600 --> 00:03:18,400 celów. 66 00:03:18,400 --> 00:03:21,850 >> Podczas badania emisji EPA, oprogramowanie pojazdów ECM 67 00:03:21,850 --> 00:03:25,060 prowadził oprogramowanie, które produkowane Wyniki emisji zgodne. 68 00:03:25,060 --> 00:03:28,340 We wszystkich innych czasach oprogramowanie ECM pojazdu 69 00:03:28,340 --> 00:03:31,090 prowadził odrębną drogę kalibracja co zmniejszyło 70 00:03:31,090 --> 00:03:34,360 Skuteczność z Cały system kontroli emisji, 71 00:03:34,360 --> 00:03:37,864 szczególnie selektywne katalityczne zmniejszenie Lean NOx trap-- 72 00:03:37,864 --> 00:03:39,280 które zobaczymy się w jednej chwili. 73 00:03:39,280 --> 00:03:43,040 W wyniku emisji NOx zwiększyła się o współczynnik od 10 do 40 razy 74 00:03:43,040 --> 00:03:47,450 powyżej poziomów zgodnych EPA W zależności od rodzaju cyklu napędowego. 75 00:03:47,450 --> 00:03:50,800 >> Więc co to naprawdę oznacza, a Kod źródłowy dla funkcjonowania oprogramowania 76 00:03:50,800 --> 00:03:53,190 na Volkswagena nie ma zostały jeszcze ujawnione publicznie, 77 00:03:53,190 --> 00:03:56,460 jest to, że w praktyce, w tym równoznaczne jest gdzieś wewnątrz 78 00:03:56,460 --> 00:03:57,830 kodu Volkswagena. 79 00:03:57,830 --> 00:04:02,200 Jeśli są testowane, a jeśli w samochodzie wykryje pewne czynniki środowiskowe 80 00:04:02,200 --> 00:04:04,330 jak kierownicy Stanowisko lub ruch 81 00:04:04,330 --> 00:04:06,710 lub jego samochodu brak lub dowolną liczbę innych czynników 82 00:04:06,710 --> 00:04:09,940 które są obecnie hipoteza być częścią tej formuły, 83 00:04:09,940 --> 00:04:12,370 po prostu włączyć Pełna kontrola emisji. 84 00:04:12,370 --> 00:04:15,670 Innymi słowy, rozpoczyna emitujące mniej zanieczyszczeń. 85 00:04:15,670 --> 00:04:18,769 >> Inaczej, w każdej innej sytuacji gdy nie jest wykrywana jako 86 00:04:18,769 --> 00:04:20,790 w laboratorium, po prostu nie. 87 00:04:20,790 --> 00:04:24,320 I tak można uprościć to do bardziej betonu pseudokod z czymś 88 00:04:24,320 --> 00:04:24,820 jak to. 89 00:04:24,820 --> 00:04:27,810 Jeżeli koła obracają ale Kierownica nie jest, sugestywne 90 00:04:27,810 --> 00:04:30,060 że samochód jest na niektórych rodzaj wirującego cylindra 91 00:04:30,060 --> 00:04:32,550 ale w jakimś magazyn testowany, 92 00:04:32,550 --> 00:04:36,070 wtedy zachowywać jak EPA będzie Cię lubić. 93 00:04:36,070 --> 00:04:37,960 W przeciwnym razie nie. 94 00:04:37,960 --> 00:04:40,420 Warto więc spojrzeć w krótkim filmie, który 95 00:04:40,420 --> 00:04:45,391 przygląda się, jakie są konsekwencje Są to w rzeczywistości mechaniczny. 96 00:04:45,391 --> 00:04:48,620 >> [ODTWARZANIE] 97 00:04:48,620 --> 00:04:52,800 >> -Last Piątek EPA zapowiedziała, że ​​niektóre Samochody Volkswagen Audi wykonane między 2009 98 00:04:52,800 --> 00:04:55,840 W tym roku były przy użyciu tak zwane urządzenie spowalniające 99 00:04:55,840 --> 00:04:59,060 aby ominąć przepisy dotyczące emisji zaprojektowane tak, aby zachować czyste powietrze. 100 00:04:59,060 --> 00:05:01,700 Ale co to dokładnie oznacza? 101 00:05:01,700 --> 00:05:04,666 >> Cóż, nowoczesne wozy mają dziesiątki komputerów wewnątrz nich. 102 00:05:04,666 --> 00:05:07,040 A niektóre z tych komputerów pomóc koordynować funkcje 103 00:05:07,040 --> 00:05:09,590 silnika do optymalnej wydajność przy jednoczesnym zapewnieniu 104 00:05:09,590 --> 00:05:12,340 że nie ma zbyt dużo śmieci wychodzi z rury wydechowej. 105 00:05:12,340 --> 00:05:15,170 Oni rzeczywiście pracuje w ten sposób już od kilku dziesięcioleci. 106 00:05:15,170 --> 00:05:17,380 Zasadniczo, każda część silnika nowoczesnego samochodu 107 00:05:17,380 --> 00:05:20,080 ma czujnik lub regulator na nim, i tych komputerów 108 00:05:20,080 --> 00:05:23,460 wczytywanie danych są tysiące razy na sekundę korekty parzenia 109 00:05:23,460 --> 00:05:26,220 jak stosunek paliwa do powietrza że idzie do cylindrów. 110 00:05:26,220 --> 00:05:28,730 >> To oszustwo Volkswagen i Audi modele są diesle, 111 00:05:28,730 --> 00:05:30,890 i diesle mają jeden naprawdę ważne komputera 112 00:05:30,890 --> 00:05:34,030 kontrolowanych parametrów, co jest ilość spalonego paliwa będzie 113 00:05:34,030 --> 00:05:35,200 w spalinach. 114 00:05:35,200 --> 00:05:36,310 Teraz to brzmi źle. 115 00:05:36,310 --> 00:05:39,642 Nie brzmi jak nie chcesz niespalone paliwo będzie w spalinach. 116 00:05:39,642 --> 00:05:41,600 Ale w przypadku połączenia diesel, masz coś 117 00:05:41,600 --> 00:05:46,110 nazywany pułapkę NOx, które to urządzenie absorbuje i pułapki tlenków azotu 118 00:05:46,110 --> 00:05:48,880 które są zanieczyszczenia, które w przeciwnym razie przejdź do atmosfery. 119 00:05:48,880 --> 00:05:53,040 I efekt tego pułapkę NOx jest wzbogacony o niespalonego paliwa. 120 00:05:53,040 --> 00:05:56,650 Tak więc urządzenie spowalniające to specjalny program wewnątrz tych komputerów, które mogą uczynić go 121 00:05:56,650 --> 00:05:59,527 wygląda jak samochód spełnia emisji normy, nawet jeśli tak nie jest. 122 00:05:59,527 --> 00:06:01,110 Volkswagen miał problem na swoich rękach. 123 00:06:01,110 --> 00:06:04,050 Jego silniki wysokoprężne były znane uzyskania wielką oszczędność paliwa, 124 00:06:04,050 --> 00:06:07,510 ale pułapkę NOx działa tylko dobrze przy stosowaniu paliwa. 125 00:06:07,510 --> 00:06:10,460 Więc samochód wykryje, za pomocą tego urządzenia obniżające, 126 00:06:10,460 --> 00:06:13,870 gdy było uzyskanie emisji testy, to zużywają więcej paliwa, 127 00:06:13,870 --> 00:06:16,830 uczynić pracę dobrze pochłaniania tlenków azotu NOx, Emisja będzie dobrze. 128 00:06:16,830 --> 00:06:21,130 Ale wtedy można dostać się na drodze, urządzenie wyłącza się, spalasz mniej paliwa 129 00:06:21,130 --> 00:06:24,256 ale jesteś wprowadzenie aż 40 razy więcej zanieczyszczeń do atmosfery. 130 00:06:24,256 --> 00:06:26,130 Ale jak do cholery nie samochód wiem, że to było 131 00:06:26,130 --> 00:06:27,720 testowane na zgodność emisjami? 132 00:06:27,720 --> 00:06:30,590 EPA mówi, że to skomplikowane system, który sprawdził rzeczy 133 00:06:30,590 --> 00:06:34,090 jak pozycji koła kierownicy, prędkość, jak długo silnik był włączony, 134 00:06:34,090 --> 00:06:35,507 i nawet pod ciśnieniem atmosferycznym. 135 00:06:35,507 --> 00:06:37,673 Innymi słowy, tam nie sposób było to przypadkowe 136 00:06:37,673 --> 00:06:40,260 dlatego, że oprogramowanie było zaprojektowane bardzo starannie, aby wykryć 137 00:06:40,260 --> 00:06:41,630 oficjalne badanie emisji. 138 00:06:41,630 --> 00:06:43,588 To niektóre całkiem poważne oszustwo i to, 139 00:06:43,588 --> 00:06:45,420 dlaczego Volkswagen w takie poważne kłopoty. 140 00:06:45,420 --> 00:06:48,600 W rzeczywistości ich dyrektor, Martin Winterkorn, po prostu zrezygnował. 141 00:06:48,600 --> 00:06:49,820 >> Więc co się dzieje dalej? 142 00:06:49,820 --> 00:06:53,900 Cóż, jeśli jesteś jednym z pół miliona Jettas diesla, Beatles, Golfy, Passats, 143 00:06:53,900 --> 00:06:56,220 lub Audi A3S dokonane, Dobrą wiadomością jest to 144 00:06:56,220 --> 00:06:57,886 że samochód jest nadal bezpieczny do jazdy. 145 00:06:57,886 --> 00:07:00,510 Nie musisz się schował aż Volkswagen wystawia wycofania. 146 00:07:00,510 --> 00:07:02,509 Ale w pewnym momencie, że są prawdopodobnie będzie mieć 147 00:07:02,509 --> 00:07:04,230 aktualizacja oprogramowania wewnątrz samochodu. 148 00:07:04,230 --> 00:07:06,927 Kiedy tak się dzieje, może się mniej mil na zbiorniku. 149 00:07:06,927 --> 00:07:09,260 Prawnicy są już szykuje się do pozwów zbiorowych 150 00:07:09,260 --> 00:07:12,500 więc właściciele mogą dostać kompensowane w pewnym punkcie w czasie. 151 00:07:12,500 --> 00:07:15,832 Ale to nie będzie wydarzyć w najbliższym czasie. 152 00:07:15,832 --> 00:07:16,711 >> [Zakończyć odtwarzanie] 153 00:07:16,711 --> 00:07:19,960 David J. MALAN: Więc to rzeczywiście podnosi ciekawe większy obraz pytanie 154 00:07:19,960 --> 00:07:20,660 jak zaufać. 155 00:07:20,660 --> 00:07:21,160 Dobrze? 156 00:07:21,160 --> 00:07:24,300 Każdy z nas ma iPhone lub androidy lub coś w naszych kieszeniach najprawdopodobniej 157 00:07:24,300 --> 00:07:26,500 Te dni, czy laptopy na kolanach, które są 158 00:07:26,500 --> 00:07:28,510 uruchomione oprogramowanie wykonane Apple i Microsoft 159 00:07:28,510 --> 00:07:30,710 i kiście inne firmy. 160 00:07:30,710 --> 00:07:34,240 Ale skąd mamy wiedzieć, że to, co produkty te oprogramowania robią 161 00:07:34,240 --> 00:07:37,680 jest w rzeczywistości, co to Firmy twierdzą, że robią? 162 00:07:37,680 --> 00:07:39,610 >> Na przykład, kto jest do powiedzieć, że za każdym razem 163 00:07:39,610 --> 00:07:42,200 wykonać telefon na iPhone lub telefon Android lub podobne, 164 00:07:42,200 --> 00:07:45,650 że numer telefonu nie jest również są przesyłane do serwera niektóre spółki 165 00:07:45,650 --> 00:07:48,399 z powodu jakiegoś programu masz napisane, czy jest to robocze 166 00:07:48,399 --> 00:07:51,070 System się jak iOS czy Android, lub dlatego, że pobrałeś 167 00:07:51,070 --> 00:07:53,880 część trzecia aplikacja strona że w jakiś sposób jest słuchanie 168 00:07:53,880 --> 00:07:57,120 do wszystkiego piszesz lub wszystko, jesteś rzeczywiście mówi. 169 00:07:57,120 --> 00:07:59,500 Skąd wiesz, że kiedy chłopaki są uruchomione brzękiem 170 00:07:59,500 --> 00:08:02,590 Lub Złóż skompilować własne oprogramowanie w CS50, jak 171 00:08:02,590 --> 00:08:06,080 Czy jesteś właścicielem tej CS50 jest personel, W drodze biblioteki CS50, 172 00:08:06,080 --> 00:08:08,690 nie było zalogowaniu każdy Ciąg kiedykolwiek dostał 173 00:08:08,690 --> 00:08:10,276 lub w każdym calu, jaką kiedykolwiek dostał? 174 00:08:10,276 --> 00:08:12,900 Cóż, można z pewnością wyglądać w kodzie źródłowym coś 175 00:08:12,900 --> 00:08:15,233 jak biblioteki CS50, ty może spojrzeć na kodzie źródłowym 176 00:08:15,233 --> 00:08:18,170 dla systemu operacyjnego Linux działa na CS50 IDE. 177 00:08:18,170 --> 00:08:23,090 Ale niesamowite prezentacji otrzymał w 1984 roku 178 00:08:23,090 --> 00:08:26,730 otrzymuje Nagrodę Turinga przez bardzo znany informatyk znany 179 00:08:26,730 --> 00:08:29,750 as-- imieniu Ken Thompson, który otrzymał Nagrodę Turinga, który 180 00:08:29,750 --> 00:08:33,500 jest rodzajem komputera Science Nagroda Nobla, jeśli chcesz, 181 00:08:33,500 --> 00:08:35,309 za pracę na system operacyjny o nazwie 182 00:08:35,309 --> 00:08:39,039 Unix, który jest bardzo podobny duch do czego używamy, który jest Linux. 183 00:08:39,039 --> 00:08:41,960 I pytanie zapytał w swoim mowy przyjęcia, zasadniczo 184 00:08:41,960 --> 00:08:44,910 ustanawiająca ramy dla rok i lata dyskusji 185 00:08:44,910 --> 00:08:46,970 o zaufania i bezpieczeństwa, to było. 186 00:08:46,970 --> 00:08:50,410 W jakim stopniu jeden ufać stwierdzenie, że program-- kawałek 187 00:08:50,410 --> 00:08:53,010 z software-- kosztuje konie trojańskie? 188 00:08:53,010 --> 00:08:56,500 Być może ważniejsze jest, aby zaufać ludzie, którzy pisali oprogramowanie. 189 00:08:56,500 --> 00:08:58,650 >> A w rzeczywistości, mamy związane w rozmowie, że 190 00:08:58,650 --> 00:09:02,400 dał przyjmując tę ​​nagrodę w latach 80. na stronie CS50 jest 191 00:09:02,400 --> 00:09:04,030 Wykłady w ramach strony na dziś. 192 00:09:04,030 --> 00:09:06,071 Bo to, co zobaczysz, jest to, że on rzeczywiście daje 193 00:09:06,071 --> 00:09:09,430 dość prosty przykład, jak również kompilator jak Clang lub cokolwiek 194 00:09:09,430 --> 00:09:13,950 kompilatory inni stosowane w przeszłości, co jeśli osadzone w my kompilatora 195 00:09:13,950 --> 00:09:18,190 sami używają jest trochę, jeśli warunkiem, że w istocie mówi, 196 00:09:18,190 --> 00:09:22,360 jeśli zauważysz, że ten kod jest przy użyciu funkcja GetString lub GetInt 197 00:09:22,360 --> 00:09:26,600 Funkcja, śmiało włożyć tylne drzwi lub koń trojański 198 00:09:26,600 --> 00:09:29,340 tak, że ten program teraz ma kilka zer 199 00:09:29,340 --> 00:09:30,930 i te, które robią coś szkodliwego. 200 00:09:30,930 --> 00:09:33,080 Zalogowaniu wszystkie swoje klawiszy, przekazywanie tych danych 201 00:09:33,080 --> 00:09:35,100 do jakiegoś serwera, czy naprawdę nic. 202 00:09:35,100 --> 00:09:37,290 >> A co Ken Thompson dzieje się to zrobić w rozmowie 203 00:09:37,290 --> 00:09:40,580 jest, aby wykazać, że nawet w przypadku masz dostęp do źródła 204 00:09:40,580 --> 00:09:43,794 Kod z kompilatora, że złośliwie może tego robić, 205 00:09:43,794 --> 00:09:46,210 to nie ma znaczenia, ponieważ jest to kurczak i jaja 206 00:09:46,210 --> 00:09:49,500 rzeczywistość przeszłości wiele lat której kompilatory 207 00:09:49,500 --> 00:09:51,960 są używane do przygotowania się. 208 00:09:51,960 --> 00:09:55,440 Innymi słowy, w drodze powrotnej, gdy ktoś Napisałem już do pierwszego kompilatora. 209 00:09:55,440 --> 00:09:59,060 A potem, za każdym razem, że już aktualizowany kompilator, zmieniając jego kod źródłowy, 210 00:09:59,060 --> 00:10:02,020 dodanie funkcji i rekompilacji dla ludzi takich jak my w użyciu, dobrze, 211 00:10:02,020 --> 00:10:04,270 oni używają stare wersja kompilatora 212 00:10:04,270 --> 00:10:06,370 skompilować nowy wersja kompilatora. 213 00:10:06,370 --> 00:10:08,370 A jeśli spojrzeć w rozmowie, że dał, 214 00:10:08,370 --> 00:10:10,970 zobaczysz, że z powodu z tego błędnego koła, 215 00:10:10,970 --> 00:10:14,330 można rzeczywiście ma błędy lub Konie trojańskie wbudowane w oprogramowanie 216 00:10:14,330 --> 00:10:14,990 używamy. 217 00:10:14,990 --> 00:10:18,010 I nawet jeśli spojrzeć na Kod źródłowy dla tych programów, 218 00:10:18,010 --> 00:10:21,550 może nawet nie być oczywiste dlatego, że oszustwo jest rzeczywiście 219 00:10:21,550 --> 00:10:24,710 w jakiejś starszej wersji kompilator, że odkąd został 220 00:10:24,710 --> 00:10:27,340 wstrzykiwanie zagrożenie do naszego oprogramowania. 221 00:10:27,340 --> 00:10:29,740 >> Który jest tylko powiedzieć, że Naprawdę nie może i nie powinna 222 00:10:29,740 --> 00:10:32,939 Oprogramowanie zaufania działa na naszych laptopach lub komórkowe oraz dowolną liczbę miejsc. 223 00:10:32,939 --> 00:10:36,230 I rzeczywiście, w dalszej części niniejszego połowie po zaczniemy mówić o programowaniu WWW 224 00:10:36,230 --> 00:10:38,521 i zacząć budować aplikacji internetowych siebie, 225 00:10:38,521 --> 00:10:40,285 porozmawiamy o nich groźby i innych. 226 00:10:40,285 --> 00:10:43,410 Teraz można się zastanawiać, i zauważyłem, że nie było to malutkie Darth 227 00:10:43,410 --> 00:10:45,842 Vader w klipów Progu pokazywał tam 228 00:10:45,842 --> 00:10:47,550 o Volkswagenie. Gdyby nigdy nie widziałem, ja 229 00:10:47,550 --> 00:10:49,190 Pomyślałem, że trzeba rozjaśnić nastrój, bo to wszystko jest 230 00:10:49,190 --> 00:10:50,780 bardzo przygnębiające i przerażające. 231 00:10:50,780 --> 00:10:52,910 Będę patrzeć wstecz na Super Bowl 2011 232 00:10:52,910 --> 00:10:55,300 kiedy handlowych przez Volkswagen-- i to 233 00:10:55,300 --> 00:10:59,620 prawie sprawia, że ​​sympatyczny again-- wyemitowany po raz pierwszy w telewizji. 234 00:10:59,620 --> 00:11:04,039 Jest to drugi klip 60 że myślę, że będziesz cieszyć. 235 00:11:04,039 --> 00:11:04,705 [ODTWARZANIE] 236 00:11:04,705 --> 00:11:08,198 [MUZYKA - motyw z "STAR WARS"] 237 00:11:08,198 --> 00:11:35,643 238 00:11:35,643 --> 00:11:38,138 [Pies Barks] 239 00:11:38,138 --> 00:11:50,114 240 00:11:50,114 --> 00:11:53,607 [Samochód zaczyna] 241 00:11:53,607 --> 00:12:04,086 242 00:12:04,086 --> 00:12:05,955 [Zakończyć odtwarzanie] 243 00:12:05,955 --> 00:12:06,830 David J. MALAN: Tak. 244 00:12:06,830 --> 00:12:07,663 Ja tylko sprawdzam. 245 00:12:07,663 --> 00:12:11,360 Ten samochód jest na liście naruszeń. 246 00:12:11,360 --> 00:12:12,000 W porządku. 247 00:12:12,000 --> 00:12:14,040 Więc patrzymy na niektóre pseudocode chwilę temu. 248 00:12:14,040 --> 00:12:15,380 I tu jest większy fragment kodu pseudocode 249 00:12:15,380 --> 00:12:16,921 które widzieliśmy już kilka razy do tej pory. 250 00:12:16,921 --> 00:12:19,970 I użyjmy jest to okazja teraz do wprowadzenia nowego programowania 251 00:12:19,970 --> 00:12:23,776 Technika, że ​​zrobiliśmy zobacz algorytmicznie 252 00:12:23,776 --> 00:12:25,400 w zeszłym tygodniu, kiedy spojrzał na sortowanie przez scalanie. 253 00:12:25,400 --> 00:12:28,270 Ale niech sformalizowania go i zobacz, jak możemy używać go w rzeczywistym kodzie 254 00:12:28,270 --> 00:12:30,350 a następnie będziemy korzystać z tego Technika w dół drogi najbardziej 255 00:12:30,350 --> 00:12:32,000 prawdopodobnie rozwiązać niektóre inne problemy. 256 00:12:32,000 --> 00:12:35,790 >> Więc był to jeden z pierwszych programów mamy kiedyś napisał, choć w kodzie pseudokod. 257 00:12:35,790 --> 00:12:37,790 A co ten program pozwoliło nam zrobić kurs 258 00:12:37,790 --> 00:12:41,510 było znalezienie Mike Smith w książce telefonicznej. 259 00:12:41,510 --> 00:12:46,216 I zauważyć, w szczególności linii ośmiu i 11, który miał to oświadczenie udać. 260 00:12:46,216 --> 00:12:48,090 W rzeczywistości niektóre Języki, C między nimi 261 00:12:48,090 --> 00:12:50,006 faktycznie mają stwierdzenie, że jest dosłownie 262 00:12:50,006 --> 00:12:52,710 przejść do, który pozwala na przejść do konkretnej linii. 263 00:12:52,710 --> 00:12:55,470 To zwykle mile widziana, ponieważ może być bardzo łatwo nadużywane 264 00:12:55,470 --> 00:12:58,490 i można rozpocząć skoki swoje Program w każdym miejscu, w przeciwieństwie 265 00:12:58,490 --> 00:13:00,690 do stosowania tego rodzaju logika i przepływ sterowania 266 00:13:00,690 --> 00:13:04,000 które używaliśmy do tej pory z tak pętle i warunki i tym podobne. 267 00:13:04,000 --> 00:13:08,660 >> Ale możemy uprościć ten algorytm Pseudokod kodu w następujący sposób. 268 00:13:08,660 --> 00:13:11,250 Zamiast tego iteracyjny lub pętli podejście 269 00:13:11,250 --> 00:13:14,160 gdzie wracamy tam i tam iz powrotem do linii trzy, 270 00:13:14,160 --> 00:13:18,300 dlaczego nie możemy po prostu rodzaj punt i więcej ogólnie mówią zgodnie siedmiu i 10, 271 00:13:18,300 --> 00:13:20,570 wystarczy wymienić te dwa pary linii o, 272 00:13:20,570 --> 00:13:22,810 else if Smith jest wcześniej w książce będziesz 273 00:13:22,810 --> 00:13:25,110 szukaj Mike w Lewa połowa książki. 274 00:13:25,110 --> 00:13:28,560 Else if Smith jest później w Książka, szukać Mike prawa 275 00:13:28,560 --> 00:13:29,540 w połowie książki. 276 00:13:29,540 --> 00:13:31,180 I zauważyć już błędnego koła. 277 00:13:31,180 --> 00:13:31,680 Dobrze? 278 00:13:31,680 --> 00:13:34,250 Szukam Mike książka telefoniczna, a następnie 279 00:13:34,250 --> 00:13:37,090 I w końcu trafić może Linia siedem czy może linia 10 280 00:13:37,090 --> 00:13:41,089 i moja instrukcja do siebie jest wyszukiwarka Mike'a w połowie książki telefonicznej. 281 00:13:41,089 --> 00:13:42,380 Cóż, jak mam szukać Mike? 282 00:13:42,380 --> 00:13:44,213 Jestem w środku szukając Mike, dlaczego 283 00:13:44,213 --> 00:13:45,860 ty rodzaj wysyłając mnie w kółko? 284 00:13:45,860 --> 00:13:49,590 Ale to jest OK, bo to, co jest dzieje się wielkości problemu 285 00:13:49,590 --> 00:13:52,630 jak napisano w linii 7 i 10? 286 00:13:52,630 --> 00:13:54,989 Nie jesteśmy po prostu mówiąc wyszukiwanie Mike'a, szukać Mike'a. 287 00:13:54,989 --> 00:13:56,280 Mamy specjalnie mówiąc, co? 288 00:13:56,280 --> 00:13:58,694 289 00:13:58,694 --> 00:14:01,610 Szukaj go w lewej połowie prawa połowa, która jest skutecznie 290 00:14:01,610 --> 00:14:03,440 o połowę mniejszy od tego problemu. 291 00:14:03,440 --> 00:14:07,170 Więc to jest OK, że jesteśmy trochę angażowania się w tego błędnego koła, 292 00:14:07,170 --> 00:14:09,180 Ten okrągły argumentem, bo przynajmniej mamy 293 00:14:09,180 --> 00:14:11,090 czyniąc problem mniejsze. 294 00:14:11,090 --> 00:14:14,220 I w końcu mamy zamiar osiągnąć że tak zwany wariant podstawowy, gdzie 295 00:14:14,220 --> 00:14:16,780 mamy tylko jedną stronę lewy-- jak nasz wolontariusz w zeszłym tygodniu 296 00:14:16,780 --> 00:14:18,684 did-- mieliśmy jedną stronę w lewo i wtedy nie 297 00:14:18,684 --> 00:14:21,600 zachować poszukiwania Mike Smith bo jest albo na tej stronie 298 00:14:21,600 --> 00:14:23,080 czy on nie jest. 299 00:14:23,080 --> 00:14:27,480 >> Więc jak możemy realizować ten pomysł, to rodzaj błędnego koła w rzeczywistym kodzie? 300 00:14:27,480 --> 00:14:31,030 Cóż, możemy wykorzystać technikę który jest powszechnie znany jako rekursji. 301 00:14:31,030 --> 00:14:33,960 I widzieliśmy to w pseudokod na sortowanie przez scalanie w zeszłym tygodniu. 302 00:14:33,960 --> 00:14:37,190 Przypomnijmy, że był to pseudokod na sortowanie przez scalanie. 303 00:14:37,190 --> 00:14:40,560 Jest to z pewnością o wiele prostsze niż bąbelkowa lub wyboru lub Sortowanie przez wstawianie 304 00:14:40,560 --> 00:14:43,310 tylko pod względem prostoty z jaką można go wyrazić. 305 00:14:43,310 --> 00:14:46,750 >> Ale to dlatego, jesteśmy jakby kołowo 306 00:14:46,750 --> 00:14:51,350 mówiąc, szukać czegoś wyszukując go ponownie. 307 00:14:51,350 --> 00:14:53,960 Ale my szukając albo na lewą połowę lub prawa połowa 308 00:14:53,960 --> 00:14:56,070 a następnie w końcu jesteśmy połączenie w tym przypadku. 309 00:14:56,070 --> 00:14:58,520 Ale i tu, z te dwie linie sortowania, 310 00:14:58,520 --> 00:15:01,320 czy znów mamy to Pomysł rekursji. 311 00:15:01,320 --> 00:15:05,350 A konkretnie, co to znaczy, W kontekście algorytmu 312 00:15:05,350 --> 00:15:10,880 jest to, że algorytm jest rekurencyjne jeśli używa lub nazywa siebie. 313 00:15:10,880 --> 00:15:14,330 >> Albo w kategoriach C, funkcja jest recursive-- funkcję o nazwie 314 00:15:14,330 --> 00:15:18,510 foo jest rekurencyjna, jeśli foo, gdzieś w jego kodu źródłowego, 315 00:15:18,510 --> 00:15:21,250 wzywa samą funkcję foo. 316 00:15:21,250 --> 00:15:25,790 I to jest złe, jeśli wszystkie foo kiedykolwiek robi jest nazywać się ponownie i ponownie. 317 00:15:25,790 --> 00:15:30,600 Jest OK, jeśli foo w końcu zatrzymuje się, podobnie jak sortowanie przez scalanie, mówiąc, chwileczkę, 318 00:15:30,600 --> 00:15:32,980 Jeśli ten problem jest super niewielka, na przykład 319 00:15:32,980 --> 00:15:35,840 lub go znalazłem, którego jestem szukają, po prostu wrócić. 320 00:15:35,840 --> 00:15:41,000 Nie rekurencyjnie, nie cyklicznie nazywam się ponownie. 321 00:15:41,000 --> 00:15:44,200 >> A więc rzućmy okiem na jak może to rzeczywiście działa. 322 00:15:44,200 --> 00:15:48,430 Więc mam zamiar iść do przodu i otwarta się dwa przykłady kodu źródłowego tutaj. 323 00:15:48,430 --> 00:15:50,321 Z których jedna zwana sigma 0. 324 00:15:50,321 --> 00:15:52,320 I nie jest w ogóle rekurencyjny, ale rzućmy 325 00:15:52,320 --> 00:15:53,694 Sprawdź co czyni ten program. 326 00:15:53,694 --> 00:15:55,737 Mam okorowane wszystkich komentarze do niego, ale wszystkie 327 00:15:55,737 --> 00:15:58,070 kodu źródłowego na CS50 na strona ma komentarzy Jeśli 328 00:15:58,070 --> 00:15:59,570 Aby zapoznać się z nim później. 329 00:15:59,570 --> 00:16:02,010 I zróbmy parę rozsądku sprawdza się tutaj. 330 00:16:02,010 --> 00:16:06,640 >> Tak więc w górnej części tego kodu mamy to CS50.h. 331 00:16:06,640 --> 00:16:07,650 Co to zrobić? 332 00:16:07,650 --> 00:16:08,990 Dlaczego jest tutaj? 333 00:16:08,990 --> 00:16:11,740 W zakresie rozsądnej laika. 334 00:16:11,740 --> 00:16:12,424 Co to robi? 335 00:16:12,424 --> 00:16:12,858 Tak. 336 00:16:12,858 --> 00:16:14,160 >> PUBLICZNOŚCI: Tak, że funkcja GetInt działa. 337 00:16:14,160 --> 00:16:16,243 >> David J. MALAN: Tak, że funkcja GetInt działa. 338 00:16:16,243 --> 00:16:18,115 Ponieważ wewnątrz tego Plik, CS50.h, które 339 00:16:18,115 --> 00:16:20,950 zobaczymy niedługo w warunki jego kodu źródłowego, 340 00:16:20,950 --> 00:16:23,270 ma kilka funkcji declared-- GetInt, GetString, 341 00:16:23,270 --> 00:16:26,950 i grono wiele innych, a jeśli nie mamy naprawdę, że Dołącz linię, 342 00:16:26,950 --> 00:16:29,320 Clang kompilator nie jest będzie wiedział, że istnieje. 343 00:16:29,320 --> 00:16:32,400 I to samo dotyczy linii dwa, gdzie int jest zdefiniowana 344 00:16:32,400 --> 00:16:35,101 printf, która jest funkcją trzymamy za pomocą całkiem sporo. 345 00:16:35,101 --> 00:16:37,850 Teraz linia czterech wydaje się nieco Funky bo to tylko jedna wkładka. 346 00:16:37,850 --> 00:16:41,570 Jest tam średnik nie kręcone szelki, brak kodu wewnątrz niej. 347 00:16:41,570 --> 00:16:44,640 Ale to, co zrobił nazywamy to coś w tygodniach przeszłości? 348 00:16:44,640 --> 00:16:45,140 Tak. 349 00:16:45,140 --> 00:16:46,060 Więc prototyp. 350 00:16:46,060 --> 00:16:48,390 I dlaczego mamy Prototyp, który wydaje 351 00:16:48,390 --> 00:16:51,050 być trochę zbędne zazwyczaj dlatego, że zwykle 352 00:16:51,050 --> 00:16:53,474 zobacz funkcję ponownie później w pliku, prawda? 353 00:16:53,474 --> 00:16:56,390 Dlaczego więc have-- jesteś tylko drapanie głowy, ale ja go zabrać. 354 00:16:56,390 --> 00:16:57,302 Tak. 355 00:16:57,302 --> 00:17:00,000 >> PUBLICZNOŚCI: [niesłyszalne] Funkcja po głównym. 356 00:17:00,000 --> 00:17:01,000 David J. MALAN: Dokładnie. 357 00:17:01,000 --> 00:17:04,089 Tak, że kompilator zna ciebie ostatecznie zdefiniować lub realizacji 358 00:17:04,089 --> 00:17:06,579 że funkcja po głównym, prawdopodobnie. 359 00:17:06,579 --> 00:17:08,462 Więc Szczęk i najbardziej kompilatory są trochę głupi 360 00:17:08,462 --> 00:17:10,510 a oni tylko wiedzieć co im każesz. 361 00:17:10,510 --> 00:17:12,569 A jeśli chcesz używać funkcja o nazwie Sigma, 362 00:17:12,569 --> 00:17:15,710 lepiej uczyć kompilator co istnieje, to z góry. 363 00:17:15,710 --> 00:17:17,970 >> Teraz głównym sama, nawet choć jest kilka linii, 364 00:17:17,970 --> 00:17:19,839 mam nadzieję, że jest całkiem znajomo teraz. 365 00:17:19,839 --> 00:17:21,942 Jest tam zrobić, gdy w pętli którego celem w życiu 366 00:17:21,942 --> 00:17:24,400 tutaj podobno jest, aby uzyskać dodatnią liczbą całkowitą od użytkownika. 367 00:17:24,400 --> 00:17:27,349 I po prostu męczył go lub jej dopóki nie współpracują. 368 00:17:27,349 --> 00:17:30,670 Następnie w linii 16 mam ciekawa rozmowa. 369 00:17:30,670 --> 00:17:31,570 IntAnswer. 370 00:17:31,570 --> 00:17:33,710 Które z lewej strony boczna daje mi Int 371 00:17:33,710 --> 00:17:36,650 które mogą store-- nazywa Answer-- która będzie przechowywać, najwyraźniej, 372 00:17:36,650 --> 00:17:39,090 wartość zwracana sigma. 373 00:17:39,090 --> 00:17:41,840 Więc sigma jest tylko arbitralne, ale znaczące nazwisko 374 00:17:41,840 --> 00:17:44,500 że dałem do funkcji którego celem w życiu 375 00:17:44,500 --> 00:17:47,680 ma mieć jeden argument-- my go nazywamy N w tym case-- 376 00:17:47,680 --> 00:17:52,280 i po prostu wziąć sumę tego numeru oraz każda liczba dodatnia to 377 00:17:52,280 --> 00:17:53,200 mniejszy od niego. 378 00:17:53,200 --> 00:17:58,140 >> Więc jeśli mogę przekazać w liczbie 2 do sigma, chcę dodać 2 plus 1 379 00:17:58,140 --> 00:18:00,240 oraz 0-- nie 0-- tak, że daje mi 3. 380 00:18:00,240 --> 00:18:05,320 Gdybym przejść w 3 do sigma, chcę posiada 3 plus 2 plus 1, która daje mi 6. 381 00:18:05,320 --> 00:18:05,900 I tak dalej. 382 00:18:05,900 --> 00:18:09,750 Więc po prostu dodaje się wszystkie numery mniej niż lub równe do niego. 383 00:18:09,750 --> 00:18:12,040 >> Teraz, tutaj jestem po prostu wydrukować odpowiedź. 384 00:18:12,040 --> 00:18:17,330 Więc jako szybki test dla pewności niech aby sigma 0-- dot ukośnik sigma 0-- 385 00:18:17,330 --> 00:18:18,690 i pozwól mi wpisać 2. 386 00:18:18,690 --> 00:18:19,960 I rzeczywiście uzyskać 3. 387 00:18:19,960 --> 00:18:21,240 Pozwól mi wpisać 3. 388 00:18:21,240 --> 00:18:22,860 I rzeczywiście dostać 6. 389 00:18:22,860 --> 00:18:27,636 A czy ktoś może do matematyki szybko, jeśli robię 50 co ja mam dostać? 390 00:18:27,636 --> 00:18:29,839 >> PUBLICZNOŚCI: [niesłyszalne]. 391 00:18:29,839 --> 00:18:30,880 David J. MALAN: No, nie. 392 00:18:30,880 --> 00:18:33,340 Ale 1275, który jest bardzo blisko. 393 00:18:33,340 --> 00:18:38,850 Więc to jest wynikiem robi 50 Plus 49 Plus 48 Plus 47 Plus 46 394 00:18:38,850 --> 00:18:40,349 w dół do 1. 395 00:18:40,349 --> 00:18:41,390 Więc to wszystko sigma robi. 396 00:18:41,390 --> 00:18:43,350 Ale zobaczmy, jak mamy wprowadziły go teraz. 397 00:18:43,350 --> 00:18:45,790 Więc tutaj jest sama funkcja. 398 00:18:45,790 --> 00:18:49,000 I nie wydaje się mieć coś zrobić z rekursji jeszcze. 399 00:18:49,000 --> 00:18:51,070 W rzeczywistości, że używasz stara technika szkoła. 400 00:18:51,070 --> 00:18:56,680 Jestem inicjalizacji zmiennej o nazwie suma do zera, a potem mam foreloop tutaj, 401 00:18:56,680 --> 00:19:00,790 a ja deklarowania Int nazwie Ja, ustawienie jest równa 1-- 402 00:19:00,790 --> 00:19:04,080 choć mogę ustawić go równa zero, ale ponieważ robię dodatek, 403 00:19:04,080 --> 00:19:05,340 kogo to obchodzi, jeśli jest zero lub jeden. 404 00:19:05,340 --> 00:19:06,660 To będzie miało wpływu. 405 00:19:06,660 --> 00:19:10,110 >> Więc jestem iteracji tak długo, jak jest mniejsze lub równe M, która 406 00:19:10,110 --> 00:19:11,671 jest argument, który został przekazany w. 407 00:19:11,671 --> 00:19:13,670 A potem po prostu zachować zwiększając I. i wgląd 408 00:19:13,670 --> 00:19:20,010 pętli wszystko robię robi sumę Plus wynosi I. I to jest celowe. 409 00:19:20,010 --> 00:19:22,326 Nie chcę, żeby to zrobić, w tym Sprawa, jak sumy powiększonej plus. 410 00:19:22,326 --> 00:19:24,790 Chcę, aby faktycznie dodać aktualna wartość I 411 00:19:24,790 --> 00:19:28,190 która staje się coraz większe i większe i większe na bieżąco rejestruje. 412 00:19:28,190 --> 00:19:30,210 >> A potem wrócę sumę. 413 00:19:30,210 --> 00:19:33,850 A więc odpowiedź dostaje sumę wartości. 414 00:19:33,850 --> 00:19:35,282 A potem wydrukować. 415 00:19:35,282 --> 00:19:37,740 Więc jest szansa tutaj, jednak do rodzaju uproszczenie 416 00:19:37,740 --> 00:19:41,260 Ten kod koncepcyjnie i rodzaj ciosu jeden jest 417 00:19:41,260 --> 00:19:43,250 przeszkadza w kategoriach Prostota, mimo to 418 00:19:43,250 --> 00:19:45,700 zajmuje trochę czasu, aby posortować od docenić, dlaczego 419 00:19:45,700 --> 00:19:47,330 jest mocny w tych małych przykładów. 420 00:19:47,330 --> 00:19:50,380 Oto sigma jedno- tak Druga wersja tego kodu. 421 00:19:50,380 --> 00:19:55,290 Wszystko się szczycie jest identyczna tak że sama historia dotyczy, jak wcześniej. 422 00:19:55,290 --> 00:19:59,220 Ale teraz spójrzmy u Realizacja sigma, które 423 00:19:59,220 --> 00:20:05,040 Mam stopniała do zaledwie nich lines-- cztery linie kodu, tak naprawdę, 424 00:20:05,040 --> 00:20:06,980 plus parę nawiasy klamrowe i białe miejsca. 425 00:20:06,980 --> 00:20:07,930 >> Ale co ja robię? 426 00:20:07,930 --> 00:20:11,050 Gdy m jest mniejsze niż lub równe zero, muszę rodzaj obsługi 427 00:20:11,050 --> 00:20:12,490 że bardzo prosta sprawa. 428 00:20:12,490 --> 00:20:15,450 A jeśli podaj mi zero lub nic ujemna, która jest po prostu dziwne, 429 00:20:15,450 --> 00:20:17,909 Idę do arbitralnie ale konsekwentnie zwracają zero. 430 00:20:17,909 --> 00:20:20,200 Nie chcę tej rzeczy do dostać się jakimś dziwnym nieskończoności 431 00:20:20,200 --> 00:20:21,810 Pętla z powodu wartości ujemnej. 432 00:20:21,810 --> 00:20:25,070 Tak Mówię tylko, jeśli dasz mi zero lub mniej, wracam do zera. 433 00:20:25,070 --> 00:20:28,220 >> Ale to dobrze, bo to pojedyncza strona z książki telefonicznej 434 00:20:28,220 --> 00:20:28,790 Pozostaje. 435 00:20:28,790 --> 00:20:32,660 Jestem odgryza bardzo specyficzny problem i nie nazywając coś rekurencyjnie. 436 00:20:32,660 --> 00:20:36,580 Jednak w linii 31, co nie wydaje mi się robi? 437 00:20:36,580 --> 00:20:39,780 Nawiasy są tylko utrzymanie rzeczy, mam nadzieję, trochę jaśniejsze. 438 00:20:39,780 --> 00:20:42,110 Ale to wszystko robię to ja jestem powrót M-- co 439 00:20:42,110 --> 00:20:45,790 dajesz me-- oraz na Wartość M-- przykro, 440 00:20:45,790 --> 00:20:49,052 plus wartość sigma mw minus 1. 441 00:20:49,052 --> 00:20:50,010 Więc co to oznacza? 442 00:20:50,010 --> 00:20:53,965 Jeśli dasz mi numer 3 jako wejście, odpowiedź Chcę ostatecznie 443 00:20:53,965 --> 00:20:57,307 jest 6, ponieważ 3 plus 2 plus 1 daje mi 6. 444 00:20:57,307 --> 00:20:59,390 Ale jak myślę o jak ten kod działa? 445 00:20:59,390 --> 00:21:03,070 Gdy pierwszy raz zadzwonić sigma i przekazać wartości 3, 446 00:21:03,070 --> 00:21:07,960 to jakby powiedzieć, na kartce z papieru, oto wartość 3 447 00:21:07,960 --> 00:21:09,920 a ja już przeszedł to jako sigma. 448 00:21:09,920 --> 00:21:13,090 3 jest oczywiście mniejszy niż 0, co warunek IF nie ma zastosowania. 449 00:21:13,090 --> 00:21:14,020 Else robi. 450 00:21:14,020 --> 00:21:14,990 Więc co mam zrobić? 451 00:21:14,990 --> 00:21:19,902 Chcę wrócić m, co jest 3 plus sigma m minus 1. 452 00:21:19,902 --> 00:21:21,110 Więc daj mi śledzić to. 453 00:21:21,110 --> 00:21:22,710 Mam zamiar umieścić to kawałek papieru dół. 454 00:21:22,710 --> 00:21:24,668 A jaką wartość, być jasne, mam zamiar przejść 455 00:21:24,668 --> 00:21:26,540 w sigma w tym momencie w historii? 456 00:21:26,540 --> 00:21:28,080 Jaki numer? 457 00:21:28,080 --> 00:21:28,610 2, prawda? 458 00:21:28,610 --> 00:21:29,670 3 minus 1 to 2. 459 00:21:29,670 --> 00:21:32,000 Więc po prostu trzeba trochę skrawek papieru tutaj. 460 00:21:32,000 --> 00:21:33,931 Więc teraz sigma jest coraz nazywa ponownie. 461 00:21:33,931 --> 00:21:35,930 A ja celowo umieścić to w dół, bo to 462 00:21:35,930 --> 00:21:38,070 trochę jak wstrzymywanie że wersja historii 463 00:21:38,070 --> 00:21:40,720 bo teraz jestem skupiony na sygnał m minus 1. 464 00:21:40,720 --> 00:21:42,660 Tak było m 3 m minus 1 2. 465 00:21:42,660 --> 00:21:45,110 Więc tutaj jest 2, że już zostały przekazane. 466 00:21:45,110 --> 00:21:48,510 2 nie jest oczywiście mniejsza niż 0 tak, że sprawa nie dotyczy. 467 00:21:48,510 --> 00:21:53,445 Jeszcze wrócę m, co jest w tym rzeczą plus sigma jakiej wartości? 468 00:21:53,445 --> 00:21:56,160 469 00:21:56,160 --> 00:21:59,650 Więc jeśli sigma 1-- bo m jest teraz 2 tak 2 minus 1 to 1. 470 00:21:59,650 --> 00:22:01,950 Więc teraz mam tylko wartość 1. 471 00:22:01,950 --> 00:22:04,810 Olewam tylko numer 1 do sigma-- funkcji 472 00:22:04,810 --> 00:22:09,120 ani ja here-- tak 1 nie jest oczywiście mniej niż zero, nadal nie ma zastosowania. 473 00:22:09,120 --> 00:22:12,970 >> Else return 1 plus sigma czego? 474 00:22:12,970 --> 00:22:13,470 0. 475 00:22:13,470 --> 00:22:14,678 Więc pozwól mi tylko pamiętam. 476 00:22:14,678 --> 00:22:15,920 Wrócę do tego później. 477 00:22:15,920 --> 00:22:18,060 Teraz mam zamiar iść do przodu i jot w dół liczby 0, ponieważ to 478 00:22:18,060 --> 00:22:19,470 mój argument lub parametr. 479 00:22:19,470 --> 00:22:22,400 Mam przeszedł numer 0 i wreszcie ten proces 480 00:22:22,400 --> 00:22:25,760 po prostu powtarzam ogłoszenie nauseum ustaje, ponieważ to, co 481 00:22:25,760 --> 00:22:28,820 mogę natychmiast zrobić, gdy widzę to 0? 482 00:22:28,820 --> 00:22:29,790 Wracam do zera. 483 00:22:29,790 --> 00:22:31,790 Więc teraz trzeba przewinąć historię. 484 00:22:31,790 --> 00:22:34,430 >> Jeśli teraz się cofnąć w czasie, co było ostatnią rzeczą, 485 00:22:34,430 --> 00:22:36,670 Zrobiłem jeśli były dosłownie przewijanie wideo? 486 00:22:36,670 --> 00:22:41,630 Jadę odebrać najnowsze 1 i które daje mi 1 plus 0 to 1. 487 00:22:41,630 --> 00:22:44,100 Jeśli trzymam przewijanie Opowieść, która będzie mi dać 488 00:22:44,100 --> 00:22:46,880 2 plus działa to wartość, która wynosi 1. 489 00:22:46,880 --> 00:22:47,789 Więc to 3. 490 00:22:47,789 --> 00:22:49,330 A potem mam zamiar utrzymać przewijanie. 491 00:22:49,330 --> 00:22:54,220 Kiedy po raz pierwszy położył liczbę 3-- więc 3 plus 3 daje mi 6. 492 00:22:54,220 --> 00:22:57,272 >> A teraz, jeśli już przewinął w górę wideo do tego momentu, 493 00:22:57,272 --> 00:22:58,980 jest to bardzo Pierwsze pytanie, zapytałem. 494 00:22:58,980 --> 00:23:01,450 Po przekazaniu 3, co jest sigma z 3? 495 00:23:01,450 --> 00:23:04,204 Jest to w istocie 6, suma wszystkie te kawałki papieru. 496 00:23:04,204 --> 00:23:07,120 Więc jeśli to zajmuje trochę czasu, aby owinąć swój umysł się, że jest w porządku. 497 00:23:07,120 --> 00:23:10,700 Ale uważają, że to little-- niego był bardzo celowe, że ułożone 498 00:23:10,700 --> 00:23:12,990 te numery na szczycie siebie. 499 00:23:12,990 --> 00:23:17,440 To trochę jak o memory-- zapis w czasie, 500 00:23:17,440 --> 00:23:19,940 jak płuczki w filmie, że mogę rzeczywiście przewinąć w. 501 00:23:19,940 --> 00:23:24,350 I mamy zamiar wrócić do że metafora się tylko trochę. 502 00:23:24,350 --> 00:23:28,240 >> Ale po pierwsze, okazuje się, że jest dużo maniaków i zabawnych ludzi, 503 00:23:28,240 --> 00:23:29,614 Myślę, Google. 504 00:23:29,614 --> 00:23:31,530 Czy ktoś, kto jest bardzo dobre na googling umysłu 505 00:23:31,530 --> 00:23:34,270 wymyślanie na chwilę i pomóż mi szukać czegoś? 506 00:23:34,270 --> 00:23:35,650 Bardzo, bardzo niski klucz. 507 00:23:35,650 --> 00:23:37,870 Ktoś, kto nigdy nie jest pojawią się wcześniej, być może. 508 00:23:37,870 --> 00:23:38,370 OK. 509 00:23:38,370 --> 00:23:39,030 Tak? 510 00:23:39,030 --> 00:23:39,530 Chodź. 511 00:23:39,530 --> 00:23:41,410 Zejdź na dół. 512 00:23:41,410 --> 00:23:42,183 Jak masz na imię? 513 00:23:42,183 --> 00:23:42,870 >> SAM: Sam. 514 00:23:42,870 --> 00:23:44,290 >> David J. MALAN: Sam, chodź na dół. 515 00:23:44,290 --> 00:23:45,320 To samo. 516 00:23:45,320 --> 00:23:46,280 Miło cię poznać. 517 00:23:46,280 --> 00:23:46,780 Hej. 518 00:23:46,780 --> 00:23:47,580 Chodź. 519 00:23:47,580 --> 00:23:51,290 Więc wszystko, co potrzebujesz zrobić, jeśli można, Sam, oto Google. 520 00:23:51,290 --> 00:23:53,240 Można wyszukać rekursji termin? 521 00:23:53,240 --> 00:23:55,770 522 00:23:55,770 --> 00:23:56,270 Nie psuj. 523 00:23:56,270 --> 00:23:59,940 524 00:23:59,940 --> 00:24:00,970 >> A teraz let's-- tak. 525 00:24:00,970 --> 00:24:03,380 OK Kliknij, że. 526 00:24:03,380 --> 00:24:04,315 Lepiej kliknij to. 527 00:24:04,315 --> 00:24:07,020 528 00:24:07,020 --> 00:24:08,020 Ach, rozumiem. 529 00:24:08,020 --> 00:24:08,520 Nie? 530 00:24:08,520 --> 00:24:09,050 OK. 531 00:24:09,050 --> 00:24:10,430 Więc zróbmy kilka innych. 532 00:24:10,430 --> 00:24:12,830 Nie tyle związane akademicko tutaj, ale czy 533 00:24:12,830 --> 00:24:14,520 kiedykolwiek wyszukiwane w Google anagram? 534 00:24:14,520 --> 00:24:15,280 >> SAM: Nie. 535 00:24:15,280 --> 00:24:15,520 >> David J. MALAN: OK. 536 00:24:15,520 --> 00:24:17,186 Szukaj anagram zamiast rekurencji. 537 00:24:17,186 --> 00:24:22,540 538 00:24:22,540 --> 00:24:23,790 Jak się krzywo. 539 00:24:23,790 --> 00:24:25,515 Czy kiedykolwiek szukał krzywo? 540 00:24:25,515 --> 00:24:29,260 541 00:24:29,260 --> 00:24:32,692 Teraz, ten jest trochę trudne do zobaczyć, ale mam nadzieję, że everything's-- OK. 542 00:24:32,692 --> 00:24:34,150 To tylko ty i ja ciesząc się tym. 543 00:24:34,150 --> 00:24:34,690 OK. 544 00:24:34,690 --> 00:24:38,950 >> Więc w końcu, to one's-- to trochę krzywo. 545 00:24:38,950 --> 00:24:40,810 Teraz zrobić beczkę. 546 00:24:40,810 --> 00:24:44,460 547 00:24:44,460 --> 00:24:45,310 Wspaniały. 548 00:24:45,310 --> 00:24:45,910 W porządku. 549 00:24:45,910 --> 00:24:47,110 Wielkie podziękowania dla Sam. 550 00:24:47,110 --> 00:24:49,416 Proszę bardzo. 551 00:24:49,416 --> 00:24:50,400 Dzięki. 552 00:24:50,400 --> 00:24:52,807 >> Więc co się dzieje w ogóle z tych głupich przykładów? 553 00:24:52,807 --> 00:24:55,640 Tak naprawdę, pod maską Miliony Google linii kodu 554 00:24:55,640 --> 00:24:58,860 podobno jest kilka głupie JEŚLI Warunki, które są zasadniczo 555 00:24:58,860 --> 00:25:01,160 sprawdzenie czy użytkownik ma wpisaniu tej frazy, 556 00:25:01,160 --> 00:25:03,760 zrobić coś, co prawdopodobnie miało nieszablonowe czas 557 00:25:03,760 --> 00:25:06,080 do realizacji tylko amusing się w ten sposób. 558 00:25:06,080 --> 00:25:08,430 Ale to wszystko sprowadza dół pod wyciągiem. 559 00:25:08,430 --> 00:25:11,570 Ale, oczywiście, rekurencja więcej z geekier 560 00:25:11,570 --> 00:25:13,880 Przykładem wśród tych specjalnych sztuczek. 561 00:25:13,880 --> 00:25:16,880 A już na pewno nie ma innych, tam jak dobrze, że być może nawet nie 562 00:25:16,880 --> 00:25:18,230 odkrył jeszcze. 563 00:25:18,230 --> 00:25:22,830 >> Więc spójrz, lub rozważyć teraz następujący program, 564 00:25:22,830 --> 00:25:24,830 i na pewno chwycić dowolny z nich na swój sposób. 565 00:25:24,830 --> 00:25:28,820 Mam zamiar iść do przodu i otwarcie programu, który jest 566 00:25:28,820 --> 00:25:30,920 Spróbuję zamienić dwie wartości. 567 00:25:30,920 --> 00:25:33,210 Ale zanim pójdziemy tam, zróbmy to. 568 00:25:33,210 --> 00:25:38,500 Możemy dostać jeszcze jeden Wolontariat, myślę? 569 00:25:38,500 --> 00:25:40,480 Chciałbyś na ochotnika? 570 00:25:40,480 --> 00:25:40,980 Nie? 571 00:25:40,980 --> 00:25:41,890 Chodź na górę. 572 00:25:41,890 --> 00:25:42,390 Chodź na górę. 573 00:25:42,390 --> 00:25:42,890 W porządku. 574 00:25:42,890 --> 00:25:44,136 Tak więc nazwa jest 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 Chodź, Lauren. 578 00:25:46,890 --> 00:25:50,140 Więc Lauren jest kwestionowane tutaj poniżej. 579 00:25:50,140 --> 00:25:52,310 Miło cię poznać. 580 00:25:52,310 --> 00:25:55,730 Więc Lauren tutaj ma przed jej dwóch pustych kubków. 581 00:25:55,730 --> 00:25:57,570 I mamy jakiś pomarańczowy sok i mleko 582 00:25:57,570 --> 00:26:00,301 i zamierzamy iść do przodu i wykonaj następujące czynności. 583 00:26:00,301 --> 00:26:01,550 Jesteśmy po prostu się do wypełnienia tego. 584 00:26:01,550 --> 00:26:07,840 Kilka uncji mleka tu i niech wypełnić trochę soku pomarańczowego tutaj. 585 00:26:07,840 --> 00:26:11,475 >> A przed wszystkim te publiczność, 586 00:26:11,475 --> 00:26:13,550 zamienić dwie wartości tych kubków. 587 00:26:13,550 --> 00:26:16,970 Umieść sok pomarańczowy w kubku mleka a mleko w kubku soku pomarańczowego. 588 00:26:16,970 --> 00:26:22,380 589 00:26:22,380 --> 00:26:26,150 W jaki sposób można to zrobić u siebie w domu i miał dostęp do innych materiałów? 590 00:26:26,150 --> 00:26:27,400 LAUREN: Umieścić go w innym kubka. 591 00:26:27,400 --> 00:26:28,191 David J. MALAN: OK. 592 00:26:28,191 --> 00:26:31,940 Warto więc mieć tymczasowy zmienna, jeśli będzie. 593 00:26:31,940 --> 00:26:35,871 I idź teraz i wdrożyć Ta sama procedura zamiana. 594 00:26:35,871 --> 00:26:36,370 Tak dobrze. 595 00:26:36,370 --> 00:26:41,490 Włożyliśmy Dz.U. pod tymczasowy Zmienna, mleko w zmiennej OJ, 596 00:26:41,490 --> 00:26:44,481 a teraz zmienna tymczasowa w zmiennej mleka. 597 00:26:44,481 --> 00:26:44,980 OK. 598 00:26:44,980 --> 00:26:48,740 Więc bardzo dobrze zrobione do tej pory. 599 00:26:48,740 --> 00:26:50,990 Okazuje out-- utrzymują, że pomyślał przez chwilę. 600 00:26:50,990 --> 00:26:54,479 Tutaj, po prostu Geek IT się trochę, to byłby odpowiedni kod C 601 00:26:54,479 --> 00:26:55,520 że po prostu realizowane. 602 00:26:55,520 --> 00:26:58,650 Mieliśmy dwa wejścia, A i B, oba które musimy po prostu powiedzieć, dla uproszczenia są 603 00:26:58,650 --> 00:26:59,260 INT. 604 00:26:59,260 --> 00:27:02,780 I tutaj odnotować, jeśli chcę zamienić wartości dwóch zmiennych, A i B, 605 00:27:02,780 --> 00:27:06,890 my rzeczywiście potrzebujemy pośredników, A tymczasowa zmienna tymczasowa kubek, 606 00:27:06,890 --> 00:27:10,830 w którym wlać wartości tak, że mamy zastępczy dla niego. 607 00:27:10,830 --> 00:27:13,480 Ale kod jest dokładnie jak Lauren tutaj realizowane. 608 00:27:13,480 --> 00:27:15,500 >> Teraz, żeby dostać Trochę szalony, okazuje się, 609 00:27:15,500 --> 00:27:20,930 że można to zrobić bez tymczasowa zmienna. 610 00:27:20,930 --> 00:27:24,870 Aby to zrobić poprawnie, choć jedziemy musiał oszukiwać z jakąś chemią. 611 00:27:24,870 --> 00:27:26,380 Mamy tu jakieś dodatkowe puchary. 612 00:27:26,380 --> 00:27:29,600 Tak więc najbliższa rzecz, która wygląda jak mleka i wody perhaps-- 613 00:27:29,600 --> 00:27:34,090 lub mleko i OJ-- to mamy pewne wody, więc my wypełnimy ten jeden się 614 00:27:34,090 --> 00:27:36,486 z kilku uncji czystej wody. 615 00:27:36,486 --> 00:27:38,332 To chyba za dużo. 616 00:27:38,332 --> 00:27:38,832 Tak. 617 00:27:38,832 --> 00:27:39,934 To zdecydowanie za dużo. 618 00:27:39,934 --> 00:27:40,600 Trzymaj się jednej sekundy. 619 00:27:40,600 --> 00:27:43,520 620 00:27:43,520 --> 00:27:48,420 >> A teraz mamy olej, który, o ile pamiętam od szkoły średniej klasy chemii, 621 00:27:48,420 --> 00:27:49,990 miejmy nadzieję, że nie miesza się z wodą. 622 00:27:49,990 --> 00:27:53,650 Ale to rodzaj jakby wygląda jak mleko i Dzienniku Urzędowym. 623 00:27:53,650 --> 00:27:55,760 Więc teraz, bez użycia tymczasowa zmienna, 624 00:27:55,760 --> 00:27:59,260 można zamienić te dwie wartości? 625 00:27:59,260 --> 00:28:03,884 Więc oleje idzie do filiżanki wody, Woda idzie do filiżanki oleju. 626 00:28:03,884 --> 00:28:04,800 LAUREN: Nie ma innych kubki? 627 00:28:04,800 --> 00:28:05,940 David J. MALAN: Żadne inne puchary. 628 00:28:05,940 --> 00:28:07,860 A ja nie mam właściwie przetestowane przed tym roku 629 00:28:07,860 --> 00:28:10,110 więc nie wiem, czy to będzie rzeczywiście działa chemicznie. 630 00:28:10,110 --> 00:28:16,130 631 00:28:16,130 --> 00:28:18,650 To nie powinno się zdarzyć. 632 00:28:18,650 --> 00:28:19,761 Czy to działa? 633 00:28:19,761 --> 00:28:20,260 W porządku. 634 00:28:20,260 --> 00:28:20,990 Tak więc oddzielenie? 635 00:28:20,990 --> 00:28:21,490 Dobry. 636 00:28:21,490 --> 00:28:24,714 Teraz udało nam się uzyskać wody do drugiej filiżance. 637 00:28:24,714 --> 00:28:27,630 Smarter koncentratory chemii mógł prawdopodobnie to zrobić lepiej niż mnie. 638 00:28:27,630 --> 00:28:28,510 >> LAUREN: Woda jest na dole. 639 00:28:28,510 --> 00:28:31,910 >> David J. MALAN: The water--, że był co jest kluczowym ostatni raz to zrobiliśmy. 640 00:28:31,910 --> 00:28:33,950 Musisz to zrobić w odpowiedniej kolejności. 641 00:28:33,950 --> 00:28:34,450 Tak. 642 00:28:34,450 --> 00:28:35,270 Dobrze. 643 00:28:35,270 --> 00:28:37,290 Więc teraz mamy dwie filiżanki oleju. 644 00:28:37,290 --> 00:28:37,790 OK. 645 00:28:37,790 --> 00:28:38,510 Dobrze. 646 00:28:38,510 --> 00:28:40,110 Ale jeśli to chemicznie pracował niż ja-- 647 00:28:40,110 --> 00:28:41,200 >> LAUREN: To jest woda. 648 00:28:41,200 --> 00:28:41,930 >> David J. MALAN: To głównie z wody. 649 00:28:41,930 --> 00:28:42,430 W porządku. 650 00:28:42,430 --> 00:28:44,210 Ale to wciąż ten sam kubek, jak wcześniej. 651 00:28:44,210 --> 00:28:47,570 Więc wlać it-- spróbuj tam. 652 00:28:47,570 --> 00:28:49,300 OK. 653 00:28:49,300 --> 00:28:51,010 To jest dobre wykorzystanie czasu klasy dziś. 654 00:28:51,010 --> 00:28:51,510 OK. 655 00:28:51,510 --> 00:28:53,890 Więc teraz we-- miłe. 656 00:28:53,890 --> 00:28:55,460 Tak jakby. 657 00:28:55,460 --> 00:28:55,960 W porządku. 658 00:28:55,960 --> 00:28:56,690 Więc bardzo dobre. 659 00:28:56,690 --> 00:29:00,006 Dziękuję Lauren. 660 00:29:00,006 --> 00:29:01,950 Bardzo dobra robota. 661 00:29:01,950 --> 00:29:04,570 >> Więc po prostu dmuchnąć wasze umysły, a to może coś 662 00:29:04,570 --> 00:29:08,660 do zabawy, jeśli chcesz w CS50 ID, można bowiem zamienić dwie zmienne 663 00:29:08,660 --> 00:29:11,470 bez tymczasowego całkowitą. 664 00:29:11,470 --> 00:29:13,060 I to jest odpowiedni kod C. 665 00:29:13,060 --> 00:29:16,110 A jeśli pamiętacie z ostatniego Środa, wprowadziliśmy, gdy na krótko, 666 00:29:16,110 --> 00:29:19,720 kilka nowych operatorów w C i nie ktoś przypomnieć, co trochę marchewki 667 00:29:19,720 --> 00:29:23,660 Symbol to, że mały trójkątny Symbol z klawiatury reprezentuje? 668 00:29:23,660 --> 00:29:26,003 Co bitowe operatora? 669 00:29:26,003 --> 00:29:26,770 >> PUBLICZNOŚCI: 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 Więc jeśli chcesz, tylko dla zabawy w do domu, dać aib dwóch arbitralne 673 00:29:32,920 --> 00:29:36,072 Wartości takie jak jakakolwiek eight-- i I wybierze wartość osiem bitów. 674 00:29:36,072 --> 00:29:38,530 Jeśli to zrobisz z 32 bitów, będziesz bardzo szybko się nudzą. 675 00:29:38,530 --> 00:29:42,150 Ale po prostu dać osiem bit Wartość to co, jeden lub dwa, 676 00:29:42,150 --> 00:29:43,790 i dać b podobnej wartości. 677 00:29:43,790 --> 00:29:46,810 A następnie z zastosowaniem definicji XOR z ostatniej środy, 678 00:29:46,810 --> 00:29:52,560 stosować ten kawałek po kawałku, każdy z te osiem bitów każdy z A i B, 679 00:29:52,560 --> 00:29:54,980 a następnie zrobić to dokładnie na tym kodzie. 680 00:29:54,980 --> 00:29:58,170 I to nie jest błędne, co tu widzisz na ekranie. 681 00:29:58,170 --> 00:30:02,100 To w istocie sprowadza się do trzech operacji XOR 682 00:30:02,100 --> 00:30:05,910 i jakoś magicznie a i b będą wymieniać pozycje 683 00:30:05,910 --> 00:30:08,010 bez utraty informacji. 684 00:30:08,010 --> 00:30:11,580 >> Więc sztuczka oleju i wody jest Najbliższy realny świat wcieleniem 685 00:30:11,580 --> 00:30:12,980 Mogłem pomyśleć, aby naśladować to. 686 00:30:12,980 --> 00:30:15,950 Ale to z pewnością łatwiej użyć zmiennej tymczasowej, 687 00:30:15,950 --> 00:30:16,920 jak w tym przypadku tutaj. 688 00:30:16,920 --> 00:30:21,190 I to też jest szansa powiedzieć, też tego rodzaju mikro optymalizacji, 689 00:30:21,190 --> 00:30:23,590 jako informatyk powiedziałbym, podczas gdy rodzaj zabawy 690 00:30:23,590 --> 00:30:27,060 się czym chwalić, jak to zrobiłeś to bez jak zamiana z dodatkową zmienną, 691 00:30:27,060 --> 00:30:28,640 to nie jest wszystko, co atrakcyjne. 692 00:30:28,640 --> 00:30:31,619 Ponieważ zaoszczędzić 32 bity, jak W przypadku rzeczywistej int 693 00:30:31,619 --> 00:30:33,410 nie jest wcale tak atrakcyjne W systemie, gdzie 694 00:30:33,410 --> 00:30:36,722 być może używasz dziesiątki megabajtów lub nawet więcej takich pamięci te dni. 695 00:30:36,722 --> 00:30:38,680 I rzeczywiście, gdy mamy do późniejszego zbioru problemów 696 00:30:38,680 --> 00:30:41,010 i wdrożyć czar sprawdzania i będziesz 697 00:30:41,010 --> 00:30:43,550 za zadanie zrobić z to za mało pamięci RAM i tak mało 698 00:30:43,550 --> 00:30:46,820 Czas, jak to możliwe na computer-- cię wciąż 699 00:30:46,820 --> 00:30:50,160 ma tydzień na realizację it-- będziesz have-- będziesz 700 00:30:50,160 --> 00:30:51,799 wyzwanie, aby zminimalizować te zasoby. 701 00:30:51,799 --> 00:30:53,840 I to jest naprawdę tylko okazja w tym semestrze 702 00:30:53,840 --> 00:30:57,940 gdzie można być zachęcani do golenia się nawet najlepszych wyników 703 00:30:57,940 --> 00:30:59,340 kosztuje inaczej. 704 00:30:59,340 --> 00:31:02,200 >> Więc what-- jak możemy Widać to w rzeczywistym kodzie? 705 00:31:02,200 --> 00:31:04,530 Pozwólcie mi iść do przodu teraz i otworzyć przykład 706 00:31:04,530 --> 00:31:07,700 że świadomie nazywa Nie Zamień ponieważ nie 707 00:31:07,700 --> 00:31:10,670 w istocie zamienić zmienne jak w rzeczywistości może się spodziewać. 708 00:31:10,670 --> 00:31:12,260 Warto więc przyjrzeć. 709 00:31:12,260 --> 00:31:17,050 Oto program, który ma CS50 Biblioteka dzieje, po prostu standardowe I / O. 710 00:31:17,050 --> 00:31:19,560 Teraz mamy prototyp swap się góry, które po prostu 711 00:31:19,560 --> 00:31:21,540 Oznacza to musi być określone później. 712 00:31:21,540 --> 00:31:22,550 A oto główne. 713 00:31:22,550 --> 00:31:26,000 >> I arbitralnie przypisano x i y, odpowiednio jedną i dwie wartości 714 00:31:26,000 --> 00:31:28,590 tylko dlatego, że są małe i łatwe do myślenia. 715 00:31:28,590 --> 00:31:32,280 A potem mam tylko kilka printfs gdzie mam testow. x oznacza 1 716 00:31:32,280 --> 00:31:35,110 a y wynosi 2 to przypuszczalnie co te printfs powie. 717 00:31:35,110 --> 00:31:36,530 Więc nie ma magii tej pory. 718 00:31:36,530 --> 00:31:40,100 >> Potem mam zamiar ubiegać się wydrukować def, zamiana dot dot dot. 719 00:31:40,100 --> 00:31:43,730 Mam zamiar zadzwonić swap Funkcja, przekazując xi y. 720 00:31:43,730 --> 00:31:47,350 I załóżmy teraz, że Swap dokładnie jest realizowany 721 00:31:47,350 --> 00:31:49,930 jak to było przed chwilą o zmiennej czasowej. 722 00:31:49,930 --> 00:31:52,670 I tak twierdzić śmiało, zamienione. 723 00:31:52,670 --> 00:31:55,429 x jest teraz to, a y jest teraz. 724 00:31:55,429 --> 00:31:57,220 Ale plik, oczywiście, nazywa No Zamień. 725 00:31:57,220 --> 00:31:58,678 Więc rzeczywiście zobaczyć, co się dzieje. 726 00:31:58,678 --> 00:32:04,450 Jeśli mogę skompilować żadnego swapa, a następnie zrobić ./noswap, x oznacza 1, y 2. 727 00:32:04,450 --> 00:32:05,770 Zamiana zamienione. 728 00:32:05,770 --> 00:32:07,200 x oznacza 1, y wynosi 2. 729 00:32:07,200 --> 00:32:11,980 Więc to rzeczywiście wydaje się być wadliwy, nawet choć swap-- niech przewiń now-- 730 00:32:11,980 --> 00:32:16,542 realizowany jest dokładnie na Kod zaproponowałem przed chwilą. 731 00:32:16,542 --> 00:32:19,000 Tak więc nie będziemy się fantazyjne z rzeczy XOR do teraz. 732 00:32:19,000 --> 00:32:21,890 To też powinno działać jak z mlekiem i OJ, 733 00:32:21,890 --> 00:32:25,820 ale nie wydaje się działać. 734 00:32:25,820 --> 00:32:27,180 >> Więc zróbmy to jeszcze raz. 735 00:32:27,180 --> 00:32:29,310 Może po prostu nie działa to dobrze. 736 00:32:29,310 --> 00:32:32,010 Warto więc uruchomić No Zamień ponownie. 737 00:32:32,010 --> 00:32:32,900 Może ja-- nie. 738 00:32:32,900 --> 00:32:34,400 Więc to jest po prostu nie działa. 739 00:32:34,400 --> 00:32:36,060 Więc zróbmy mały test dla pewności. 740 00:32:36,060 --> 00:32:39,690 Pozwólcie mi iść do przodu tu swap i po prostu dodać, chwileczkę, 741 00:32:39,690 --> 00:32:43,856 a jest% i / n oraz niech plug-in wartości a. 742 00:32:43,856 --> 00:32:45,730 Bo naprawdę chcę aby zobaczyć, co się dzieje. 743 00:32:45,730 --> 00:32:47,570 I rzeczywiście, to jest technika debugowania 744 00:32:47,570 --> 00:32:50,028 że może być używany w godziny pracy lub w domu, już 745 00:32:50,028 --> 00:32:53,560 podobny do pierwszej połowy Dan Wideo Armendáriz w PSET3 746 00:32:53,560 --> 00:32:56,870 w którym wprowadziliśmy druk def jak zalecana technika przynajmniej 747 00:32:56,870 --> 00:32:58,080 w prostych przypadkach. 748 00:32:58,080 --> 00:33:01,720 Pozwólcie mi iść do przodu i uruchomić make znowu, bez wymiany, ./noswap. 749 00:33:01,720 --> 00:33:04,370 750 00:33:04,370 --> 00:33:05,840 >> Ciekawe. 751 00:33:05,840 --> 00:33:11,670 Tak więc zauważyć, co wydaje się być prawdziwe. x jest 1, y oznacza 2, a a oznacza 2, gdy b jest 1. 752 00:33:11,670 --> 00:33:16,790 Więc te dwa jakoś zamienili a X i Y nie są coraz zamienione. 753 00:33:16,790 --> 00:33:21,090 Więc być jasne, co się dzieje jest, tu mam xiy 754 00:33:21,090 --> 00:33:25,380 a te są zmienne lokalne w Zakres głównym, jestem przekazując x i y 755 00:33:25,380 --> 00:33:26,170 zamieniać. 756 00:33:26,170 --> 00:33:29,080 Teraz, swap, jako odrębnej funkcji, to zadzwoń do swoich argumentów 757 00:33:29,080 --> 00:33:30,590 lub jego parametry cokolwiek chce. 758 00:33:30,590 --> 00:33:33,280 Foo lub baru lub X lub Y lub A lub B. 759 00:33:33,280 --> 00:33:36,870 Wystarczy, aby wyjaśnić, że są one nie identyczne x i y per se, 760 00:33:36,870 --> 00:33:38,020 Powiedziałem, a i b. 761 00:33:38,020 --> 00:33:40,040 Ale moglibyśmy nazwać im cokolwiek chcemy. 762 00:33:40,040 --> 00:33:43,960 >> I tak to wygląda Swap jest przekazywana 763 00:33:43,960 --> 00:33:48,980 X-- AKA A-- i to przeszedł y-- AKA b jest. 764 00:33:48,980 --> 00:33:51,900 Jakoś te trzy linie są zamiana tych wartości dokładnie 765 00:33:51,900 --> 00:33:53,510 jak Laura zrobiła z mlekiem i Dzienniku Urzędowym. 766 00:33:53,510 --> 00:33:56,010 Ale kiedy wydrukować wartości, a i b 767 00:33:56,010 --> 00:34:01,340 są rzeczywiście zamienić, ale xi y mają żadnych zmian do nich. 768 00:34:01,340 --> 00:34:03,150 Przypomnijmy, że X i Y są tutaj. 769 00:34:03,150 --> 00:34:05,320 >> Tak więc widzimy, w tym poprzez Inną techniką, jak również. 770 00:34:05,320 --> 00:34:08,110 I to też jest technika osadzone w problemu ustawić trzy. 771 00:34:08,110 --> 00:34:10,780 Idziemy dalej i zrobić to w CS50 ID, jeśli jeszcze tego nie zrobiłeś. 772 00:34:10,780 --> 00:34:13,730 Na stronie mamy prawej mają tę kartę Debugger. 773 00:34:13,730 --> 00:34:16,159 A jeśli to otworzyć, jest jakaś tajemna informacje 774 00:34:16,159 --> 00:34:17,530 który jest rzucony na ciebie na początku. 775 00:34:17,530 --> 00:34:19,310 Miejmy jednak drażnić to poza naprawdę szybko. 776 00:34:19,310 --> 00:34:21,620 >> Tak jeden, widać zmiennych lokalnych. 777 00:34:21,620 --> 00:34:26,230 Okazuje się, że wbudowany w CS50 IDE, oraz wiele środowisk programistycznych więcej 778 00:34:26,230 --> 00:34:28,060 Ogólnie rzecz biorąc, jest debugger. 779 00:34:28,060 --> 00:34:31,340 Narzędzie, które pozwala na wizualizacji co się dzieje wewnątrz programu 780 00:34:31,340 --> 00:34:34,380 bez konieczności uciekania się do dodawania printfs i skompilowanie i uruchomienie 781 00:34:34,380 --> 00:34:37,588 i dodając printf i kompilowania i bieganie, które już w godzinach pracy 782 00:34:37,588 --> 00:34:40,070 lub domu, to prawdopodobnie się dość uciążliwe. 783 00:34:40,070 --> 00:34:43,090 >> Tak oto, za chwilę, że jesteśmy będzie zobaczyć w czasie rzeczywistym 784 00:34:43,090 --> 00:34:44,760 wartości naszych zmiennych lokalnych. 785 00:34:44,760 --> 00:34:47,880 Jesteśmy również będzie w stanie ustawić tak zwane wartości graniczne, które 786 00:34:47,880 --> 00:34:52,570 są szanse w moim programie, aby wstrzymać wykonanie w określonym wierszu kodu 787 00:34:52,570 --> 00:34:53,710 że jestem ciekaw. 788 00:34:53,710 --> 00:34:54,210 Dobrze? 789 00:34:54,210 --> 00:34:55,969 Programy te działają w ułamku sekundy. 790 00:34:55,969 --> 00:35:00,450 To miłe dla nas wolniejszych ludzi aby być w stanie wstrzymać, poświęć chwilę, zobaczyć 791 00:35:00,450 --> 00:35:02,380 co się dzieje wokół pewna linia kodu 792 00:35:02,380 --> 00:35:05,050 bez orki programu przez niego i wykończenie całości. 793 00:35:05,050 --> 00:35:08,510 Więc graniczne zamiaru pozwolić nam złamania i przerwy w określonym punkcie. 794 00:35:08,510 --> 00:35:12,990 >> Zadzwoń stos jest fantazyjny sposób mówiąc, jakie funkcje są obecnie 795 00:35:12,990 --> 00:35:14,140 nazywany w tym momencie. 796 00:35:14,140 --> 00:35:15,370 Głównym jest zawsze najpierw zadzwonić. 797 00:35:15,370 --> 00:35:17,230 Ale jeśli Główna nazywa Funkcja o nazwie Swap, 798 00:35:17,230 --> 00:35:20,470 my rzeczywiście będzie zobaczyć Wieża funkcji, które zostały 799 00:35:20,470 --> 00:35:22,400 zwany w odwrotnym porządku chronologicznym. 800 00:35:22,400 --> 00:35:23,310 Zobaczmy więc, że. 801 00:35:23,310 --> 00:35:24,327 >> Mam zamiar pomniejszyć. 802 00:35:24,327 --> 00:35:25,660 Mam zamiar wrócić do mojego kodu. 803 00:35:25,660 --> 00:35:27,540 I tylko dlatego, że chcę być pedantyczny tutaj, 804 00:35:27,540 --> 00:35:31,100 Mam zamiar iść do przodu, a następnie kliknij na lewo od linii pięć. 805 00:35:31,100 --> 00:35:32,830 I to tworzy czerwoną kropkę. 806 00:35:32,830 --> 00:35:36,200 I zauważyć na prawej stronie że debugger wie, hej, 807 00:35:36,200 --> 00:35:41,020 Powiedziałem tylko, że punkt przerwania na noswap.c linia pięć, specjalnie 808 00:35:41,020 --> 00:35:42,480 w tej linii kodu. 809 00:35:42,480 --> 00:35:45,090 Więc debugger wie, że zwróciły się po raz kolejny 810 00:35:45,090 --> 00:35:48,530 Prowadzę go zaprogramować pauzę wykonanie tam, a nie tylko 811 00:35:48,530 --> 00:35:50,390 działa całość super szybko. 812 00:35:50,390 --> 00:35:53,889 >> Więc teraz mam zamiar kliknij Debug Przycisk na samym szczycie IDE 813 00:35:53,889 --> 00:35:55,430 i że będzie wykonać następujące czynności. 814 00:35:55,430 --> 00:36:00,680 To będzie otworzyć początkowo nieco straszne patrząc drugi terminal window-- 815 00:36:00,680 --> 00:36:02,679 zdalne debugowanie z gospodarzem takich i such-- 816 00:36:02,679 --> 00:36:04,970 i wrócimy do tego, co wszystko, co oznacza niebawem. 817 00:36:04,970 --> 00:36:09,020 Ale co ważne teraz to, że czerwona kropka został trafiony, 818 00:36:09,020 --> 00:36:11,735 debugger celowo Przerwał execution-- 819 00:36:11,735 --> 00:36:15,560 Nie na tej linii per se, ale na pierwszy linia rzeczywistego kodu w tej funkcji. 820 00:36:15,560 --> 00:36:18,040 I dlatego linia siedem jest teraz podświetlone na żółto. 821 00:36:18,040 --> 00:36:20,550 >> A teraz rzućmy okiem po prawej stronie. 822 00:36:20,550 --> 00:36:27,300 Wygląda na to, domyślnie, tyle ładnie, x ma co wartość? 823 00:36:27,300 --> 00:36:27,860 0. 824 00:36:27,860 --> 00:36:29,750 I y ma co wartość? 825 00:36:29,750 --> 00:36:30,410 Zero. 826 00:36:30,410 --> 00:36:35,540 I że należy się spodziewać w tym sensie, że x i y--, że żółty line-- ma 827 00:36:35,540 --> 00:36:36,770 jeszcze nie wykonane. 828 00:36:36,770 --> 00:36:38,510 Tak x nie powinien mieć wartość 1. 829 00:36:38,510 --> 00:36:41,470 To może mieć jakąkolwiek wartość, tak zwana wartość śmieci. 830 00:36:41,470 --> 00:36:44,320 I mamy szczęście, że jest to zera w tym punkcie, w istocie. 831 00:36:44,320 --> 00:36:46,400 >> Więc teraz jest tylko kilka Przyciski musimy dbać 832 00:36:46,400 --> 00:36:48,100 o podczas debugowania w ten sposób. 833 00:36:48,100 --> 00:36:49,970 Zauważcie, że mamy przycisk Odtwórz. 834 00:36:49,970 --> 00:36:51,877 A jeśli gramy lub uderzyć wznowić, to tylko 835 00:36:51,877 --> 00:36:53,710 będzie przebiegać przez reszta programu 836 00:36:53,710 --> 00:36:55,300 lub dopóki nie natrafi inny punkt przerwania. 837 00:36:55,300 --> 00:36:56,910 Ale już nie ustawić każdy inny wartości graniczne, więc jest to po prostu 838 00:36:56,910 --> 00:36:58,118 będzie prowadził do końca. 839 00:36:58,118 --> 00:37:00,280 Tego rodzaju porażek Celem wywiercenie. 840 00:37:00,280 --> 00:37:03,290 >> Zamiast więc, zależy mi na te ikony w prawo. 841 00:37:03,290 --> 00:37:05,360 A jeśli najedź im, jak powinieneś też, 842 00:37:05,360 --> 00:37:07,450 zobaczysz małe tips-- podpowiedzi. 843 00:37:07,450 --> 00:37:09,020 Ten jest krok nad. 844 00:37:09,020 --> 00:37:11,290 Teraz to nie oznacza pominięcia następujących linii kodu. 845 00:37:11,290 --> 00:37:14,840 To oznacza, że ​​wykonanie go i przejść do następnego, przejść do następnego, 846 00:37:14,840 --> 00:37:15,580 przejść do następnego. 847 00:37:15,580 --> 00:37:17,610 Innymi słowy, za pośrednictwem ten przycisk, mogę chodzić 848 00:37:17,610 --> 00:37:20,390 przez mój kod jeden krok na raz. 849 00:37:20,390 --> 00:37:21,914 Linia po linii, dosłownie. 850 00:37:21,914 --> 00:37:23,830 Teraz, po prawej że istnieje jeszcze jeden 851 00:37:23,830 --> 00:37:25,163 że zobaczymy za chwilę. 852 00:37:25,163 --> 00:37:27,820 Jest to tak zwane Krok w ikonę, która jest 853 00:37:27,820 --> 00:37:30,300 zamiar pozwolić mi nurkowania do innej funkcji. 854 00:37:30,300 --> 00:37:31,800 Ale zobaczmy to na chwilę. 855 00:37:31,800 --> 00:37:33,280 Więc mam zamiar kliknąć krok nad. 856 00:37:33,280 --> 00:37:35,820 A teraz zauważyć, jak klikam ten przycisk w prawym górnym rogu, 857 00:37:35,820 --> 00:37:41,260 miej oczy mniej więcej pod lokalny Zmienne i zobaczyć, co się dzieje z x. 858 00:37:41,260 --> 00:37:44,115 x jest teraz 1, ponieważ żółta linia, teraz wykonywane 859 00:37:44,115 --> 00:37:45,840 i mamy przeniósł się do linii 8. 860 00:37:45,840 --> 00:37:49,840 A za chwilę y powinna miejmy nadzieję stać się 2. 861 00:37:49,840 --> 00:37:52,330 >> Teraz nic, co ciekawe dzieje się na trochę. 862 00:37:52,330 --> 00:37:53,390 Wszystko to jest printf. 863 00:37:53,390 --> 00:37:58,010 I zauważyć, w moim terminalu wtórnego okno, widzę wyjście druku def. 864 00:37:58,010 --> 00:38:01,080 A teraz mam zrobić Decyzja jako programista. 865 00:38:01,080 --> 00:38:04,360 Mogę krok na tej linii Kod, wykonując go, ale nie 866 00:38:04,360 --> 00:38:06,220 coraz ciekawy, co jest w środku. 867 00:38:06,220 --> 00:38:11,130 Albo rzeczywiście mogę wejść do niego i wejść do środka z całości transakcji. 868 00:38:11,130 --> 00:38:12,340 Więc zróbmy to drugie. 869 00:38:12,340 --> 00:38:15,550 >> Pozwólcie mi iść do przodu, a następnie kliknij Nie Step Over ale krok w. 870 00:38:15,550 --> 00:38:17,300 Wskazówki, nagle zmiany okno 871 00:38:17,300 --> 00:38:19,330 aby podświetlić pierwszy linia kodu w swap. 872 00:38:19,330 --> 00:38:20,710 To linia 21. 873 00:38:20,710 --> 00:38:25,220 A teraz, co to niby jest, funky, jeśli spojrzeć tutaj, zgodnie z oczekiwaniami, 874 00:38:25,220 --> 00:38:29,720 przecinek b oznacza 1 i 2, odpowiednio. 875 00:38:29,720 --> 00:38:33,840 Dlaczego temp 32767? 876 00:38:33,840 --> 00:38:36,560 Przypominając, że temp, podobnie jak pusty kubek przed chwilą, 877 00:38:36,560 --> 00:38:38,980 deklaruje tu na linii 21. 878 00:38:38,980 --> 00:38:43,390 Dlaczego 32,000- Mam na myśli, dlaczego to tylko niektóre dziwne wartość? 879 00:38:43,390 --> 00:38:43,890 Tak? 880 00:38:43,890 --> 00:38:45,190 >> PUBLICZNOŚCI: To nie jest zainicjowany. 881 00:38:45,190 --> 00:38:46,940 >> David J. MALAN: Jest nie zostały zainicjowane. 882 00:38:46,940 --> 00:38:49,370 Więc nasz komputer zawsze posiada pamięć fizyczną. 883 00:38:49,370 --> 00:38:50,544 Zawsze ma fizycznej pamięci RAM. 884 00:38:50,544 --> 00:38:52,710 I zawsze Zero i jeden jest w środku, prawda? 885 00:38:52,710 --> 00:38:54,626 Ponieważ używamy naszych komputera przez cały dzień, 886 00:38:54,626 --> 00:38:57,210 używasz CS50 IDE lub serwery cały dzień. 887 00:38:57,210 --> 00:39:01,159 Tak, że RAM albo ma kilka zer lub ktoś lub kilka zer i jedynek. 888 00:39:01,159 --> 00:39:02,950 Bez względu na to, czy Nie jesteś korzystania z nich. 889 00:39:02,950 --> 00:39:05,270 Nie możesz po prostu puste miejsca, w którym chcesz bity. 890 00:39:05,270 --> 00:39:06,850 Są albo zer i jedynek. 891 00:39:06,850 --> 00:39:09,610 >> Tak więc okazuje się, że temp, ponieważ nie wcześniej zainicjowany tego jeszcze, 892 00:39:09,610 --> 00:39:14,580 mamy te 32 bity, ale nie mam zainicjalizowany jakichkolwiek znanych wartości. 893 00:39:14,580 --> 00:39:18,110 Więc co oni byli najbardziej Niedawno używane for-- tych 32 bits-- 894 00:39:18,110 --> 00:39:23,000 jesteśmy po prostu widząc artefakty niektóre poprzednia wykorzystanie tych szczególnych 32 895 00:39:23,000 --> 00:39:23,500 bitów. 896 00:39:23,500 --> 00:39:27,780 Jak tylko kliknąć Krok ciągu jednak, uff, temperatura będzie się wartość 1. 897 00:39:27,780 --> 00:39:31,600 A jeśli to zrobię to jeszcze raz, a jest będzie podana wartość 2 898 00:39:31,600 --> 00:39:33,830 a następnie b będzie mieć wartość 1. 899 00:39:33,830 --> 00:39:36,390 >> A więc to, co teraz jest miły w ten punkt w historii 900 00:39:36,390 --> 00:39:39,750 jest to, że debugger jest pokazując mi, bardzo powoli 901 00:39:39,750 --> 00:39:42,640 w moim własnym tempie, co stan wymiany jest. 902 00:39:42,640 --> 00:39:47,490 Zauważmy jednak, na górze tutaj, wypowiedzenia że stos wywołań faktycznie 903 00:39:47,490 --> 00:39:49,180 składa się z dwóch warstw do niego. 904 00:39:49,180 --> 00:39:53,240 Teraz ten, który jest zaznaczony jako Swap, gdy klikam na Main zamiast, 905 00:39:53,240 --> 00:39:57,100 zauważyć, jak zmienić zmienne lokalne dlatego, że deweloper może po prostu wskoczyć 906 00:39:57,100 --> 00:39:59,740 się i pójść do dowolnego innego zakresu. 907 00:39:59,740 --> 00:40:04,070 Więc nawet jeśli robimy wszystko pracować i poprawnie swapping A i B, 908 00:40:04,070 --> 00:40:09,080 jeśli pójdę tam iz powrotem pomiędzy swap w którym a oznacza 2 i b oznacza 1, Main, 909 00:40:09,080 --> 00:40:11,851 Główne zostały dotknięte jest w ogóle? 910 00:40:11,851 --> 00:40:12,350 Nie. 911 00:40:12,350 --> 00:40:13,930 Więc co jest na wynos tutaj? 912 00:40:13,930 --> 00:40:18,200 Cóż, okazuje się, że każdej chwili można wywołać funkcję jak swap, 913 00:40:18,200 --> 00:40:21,600 i przekazać ją argumenty, co jesteś przechodząc do funkcji swap 914 00:40:21,600 --> 00:40:24,730 w tym przypadku jest to kopia z tych argumentów. 915 00:40:24,730 --> 00:40:28,620 Tak więc, jeśli x i y oznaczają, odpowiednio, 32 bitów, co Zamień się 916 00:40:28,620 --> 00:40:30,760 to dwa nowe lokalne zmienne lub argumenty, 917 00:40:30,760 --> 00:40:34,380 nazwać i B-- ale te są arbitralne names-- ale wzór zer 918 00:40:34,380 --> 00:40:39,520 i te, w środku A i B są ułożone są identyczne z X i Y 919 00:40:39,520 --> 00:40:42,610 ale oni nie są samo co x i y. 920 00:40:42,610 --> 00:40:46,880 >> To tak jakby główna posiada na swojej kartce papieru numer 1 i 2 dla x i y, 921 00:40:46,880 --> 00:40:49,260 a następnie, gdy podaje, że kawałek papieru do wymiany, 922 00:40:49,260 --> 00:40:51,970 Zamień bardzo szybko dostaje własny długopis, spisuje 923 00:40:51,970 --> 00:40:56,240 1 i 2, na swojej własnej arkusza papieru ręce kopię oryginalnego xy do Menem 924 00:40:56,240 --> 00:40:58,790 a następnie robi własny Rzecz z a i b. 925 00:40:58,790 --> 00:41:01,940 I to jest bardzo ważne, ponieważ ma to wpływ nieszablonowe 926 00:41:01,940 --> 00:41:06,260 za faktycznie pisania poprawnego kodu ponieważ wydaje się, że nie możemy zamienić 927 00:41:06,260 --> 00:41:07,500 dwie zmienne. 928 00:41:07,500 --> 00:41:09,150 >> Pisałem prawidłowej funkcji Zamień. 929 00:41:09,150 --> 00:41:12,770 Wdrożyliśmy go Lauren jako prawidłowe swap w rzeczywistości, 930 00:41:12,770 --> 00:41:16,700 ale najwyraźniej nic z tego sprawy, jeśli nie można rzeczywiście 931 00:41:16,700 --> 00:41:19,530 zamienić dwie wartości stałe. 932 00:41:19,530 --> 00:41:21,970 Więc musimy w inny sposób rzeczywiście się na to, 933 00:41:21,970 --> 00:41:24,472 i musi być w stanie faktycznie rozwiązać ten problem. 934 00:41:24,472 --> 00:41:27,180 I okazuje out-- i wrócimy z powrotem do tego konkretnego obrazu 935 00:41:27,180 --> 00:41:30,500 przed long-- to jest jeden sposób, że można wyciągnąć pamięci komputera. 936 00:41:30,500 --> 00:41:31,460 To tylko prostokąt. 937 00:41:31,460 --> 00:41:32,960 Można go wyciągnąć jakiekolwiek wiele sposobów, ale to 938 00:41:32,960 --> 00:41:35,740 wygodne wyciągnąć go jako prostokąt z następującego powodu. 939 00:41:35,740 --> 00:41:40,040 >> Mamy zamiar rozpocząć dzisiaj i nie tylko mówić o tzw stosie. 940 00:41:40,040 --> 00:41:43,870 A stos jest tylko fragment z RAM-- kawałek memory-- 941 00:41:43,870 --> 00:41:47,100 które funkcje mają dostęp kiedy nazywa się je. 942 00:41:47,100 --> 00:41:49,800 I tak okazuje się, że w na samym dole tego stosu 943 00:41:49,800 --> 00:41:53,590 jest gdzie wszystkie zmienne lokalne Main i org C org V i wszystkie rzeczy 944 00:41:53,590 --> 00:41:56,950 zamiar iść domyślnie. A jeśli Menem wzywa inne funkcje jak swap, 945 00:41:56,950 --> 00:42:00,330 dobrze, Zamień dostanie kolejny Pamięć warstwa nad nim. 946 00:42:00,330 --> 00:42:04,490 >> I tak, po prostu daje szybki pobieżne obraz tego, jeśli pójdę na here-- 947 00:42:04,490 --> 00:42:09,450 i pozwól mi lustro to na napowietrznych, jak well-- co naprawdę muszę, 948 00:42:09,450 --> 00:42:12,100 jeśli dbamy tylko o Dno tego obrazu na razie, 949 00:42:12,100 --> 00:42:15,070 jest to, że gdy uruchamiam program i Main jest wywoływana, 950 00:42:15,070 --> 00:42:18,330 Głównym otrzymuje kawałek RAM w komputerze, który jest 951 00:42:18,330 --> 00:42:20,060 w dolnej części tej tak zwanej stosu. 952 00:42:20,060 --> 00:42:22,143 I mam zamiar go wyciągnąć celowo jako kwadrat. 953 00:42:22,143 --> 00:42:24,540 Tak to jest jak 32 bitów lub czterech bajtów. 954 00:42:24,540 --> 00:42:28,790 A jeśli to główną funkcją ma zmienną x o wartości 1 955 00:42:28,790 --> 00:42:32,626 i ma zmienną y o wartości 2, to jest 956 00:42:32,626 --> 00:42:35,750 jak przy tej skrawek pamięci Głównym nadano przez eksploatacji 957 00:42:35,750 --> 00:42:38,850 System i podzielenie go tak, że pierwsza zmienna lokalna idzie tutaj, 958 00:42:38,850 --> 00:42:40,930 drugi idzie tutaj, i to jest to. 959 00:42:40,930 --> 00:42:45,590 >> Gdy główny wzywa Zamień, Zamień dostaje swój własny kawałek pamięci 960 00:42:45,590 --> 00:42:48,280 że uda nam się wyciągnąć tak od systemu operacyjnego 961 00:42:48,280 --> 00:42:50,820 a to będzie mieć swój na podstawie własnych zmienne lokalne 962 00:42:50,820 --> 00:42:53,825 na naszej realizacji wcześniej ze zmiennymi lokalnymi 963 00:42:53,825 --> 00:42:58,010 oraz b, które początkowo uzyskać wartości 1 i 2. 964 00:42:58,010 --> 00:43:00,450 Ale potem, jak tylko Zamień kod wykonywany, 965 00:43:00,450 --> 00:43:03,760 Lauren naprawdę Zamienia Dz.U. i mleka, co się dzieje? 966 00:43:03,760 --> 00:43:09,030 Cóż, to 2 staje się 1, to 1 staje się 2, i, przy okazji, 967 00:43:09,030 --> 00:43:13,360 jest zmienna temperatura, że ​​to jest użył tego cały czas, że w końcu 968 00:43:13,360 --> 00:43:14,470 odchodzi. 969 00:43:14,470 --> 00:43:16,720 Ale to nie ma znaczenia ile pracy to zrobić 970 00:43:16,720 --> 00:43:22,160 w tej linii of-- w tym miejscu pamięci, x i y są całkowicie nienaruszona. 971 00:43:22,160 --> 00:43:26,320 >> Więc musimy jakiś sposób daje Zamień i funkcje podoba 972 00:43:26,320 --> 00:43:32,640 Sekret dostęp, jeśli chcesz, aby Funkcje like-- w pamięci jak xi y. 973 00:43:32,640 --> 00:43:35,110 Warto więc przyjrzeć się Przykładem, który pomaga 974 00:43:35,110 --> 00:43:38,220 Zobaczmy, co dokładnie było dzieje się to cały czas. 975 00:43:38,220 --> 00:43:40,284 Mam zamiar iść do przodu i otworzyć Porównaj Zero. 976 00:43:40,284 --> 00:43:42,200 I mam zamiar zamknąć nasz debugger, zamierzam 977 00:43:42,200 --> 00:43:44,360 aby zamknąć ten straszny patrząc wiadomość sprawiedliwych, mówi, czekaj, 978 00:43:44,360 --> 00:43:45,800 jesteś w środku debugowania. 979 00:43:45,800 --> 00:43:48,383 Mam zamiar ukryć tę zakładkę tutaj po prostu wrócić do prostoty. 980 00:43:48,383 --> 00:43:50,160 Więc nie martw się, jeśli GDB ginie. 981 00:43:50,160 --> 00:43:53,910 To po prostu oznacza, że ​​program ma było zamknąć, umyślnie w tym przypadku, 982 00:43:53,910 --> 00:43:54,820 przeze mnie. 983 00:43:54,820 --> 00:43:57,700 >> A teraz porównajcie Zero to robi. 984 00:43:57,700 --> 00:44:00,110 Używam CS50 W standardowej biblioteki I / O. 985 00:44:00,110 --> 00:44:04,319 Mam główną funkcję, która pierwsza mówi, coś powiedzieć, i dostaje ciąg. 986 00:44:04,319 --> 00:44:06,110 Potem mówi, to jeszcze raz i dostaje inny ciąg. 987 00:44:06,110 --> 00:44:09,910 I zauważyć, że te dwa ciągi są nazywane S i T, odpowiednio. 988 00:44:09,910 --> 00:44:12,910 A teraz ten program, porównajcie Zero, jego celem w życiu, 989 00:44:12,910 --> 00:44:15,470 to ma mi powiedzieć, ja wpisać to samo? 990 00:44:15,470 --> 00:44:16,910 I tak wracam do jednego tygodnia. 991 00:44:16,910 --> 00:44:19,950 Używam równy równego operatora który to operator jakości. 992 00:44:19,950 --> 00:44:22,220 Nie operator przypisania, operator równości. 993 00:44:22,220 --> 00:44:23,890 Jestem po prostu porównując S i T. 994 00:44:23,890 --> 00:44:27,470 >> Więc rzeczywiście iść naprzód i to zrobić. 995 00:44:27,470 --> 00:44:32,680 I mam zamiar iść do przodu i dokonać porównania Zero. 996 00:44:32,680 --> 00:44:35,110 Mam zamiar zrobić ./comparezero. 997 00:44:35,110 --> 00:44:37,150 I zamierzam iść dalej i powiedzieć coś 998 00:44:37,150 --> 00:44:43,450 tak, zróbmy mama małymi literami i jak o mamie dużymi literami. 999 00:44:43,450 --> 00:44:45,034 I oczywiście piszę różne rzeczy. 1000 00:44:45,034 --> 00:44:45,533 W porządku. 1001 00:44:45,533 --> 00:44:46,570 To należy się spodziewać. 1002 00:44:46,570 --> 00:44:47,640 >> Przyjrzyjmy się jeszcze raz. 1003 00:44:47,640 --> 00:44:49,740 Za każdym razem robić małe litery, małe litery. 1004 00:44:49,740 --> 00:44:51,490 To wygląda bardzo identyczne do mnie. 1005 00:44:51,490 --> 00:44:52,930 Wchodzić. 1006 00:44:52,930 --> 00:44:53,430 OK. 1007 00:44:53,430 --> 00:44:55,804 Może to po prostu dziwne, ponieważ to nie podoba mój gramatyki. 1008 00:44:55,804 --> 00:44:59,930 Więc zróbmy MOM kapitałowej, Kapitał MOM, identyczne. 1009 00:44:59,930 --> 00:45:01,490 Różne rzeczy. 1010 00:45:01,490 --> 00:45:03,907 >> Więc dlaczego tak jest? 1011 00:45:03,907 --> 00:45:06,240 Cóż, co się naprawdę dzieje na pod maską tutaj? 1012 00:45:06,240 --> 00:45:08,180 Więc wróćmy nad tu tylko na chwilę 1013 00:45:08,180 --> 00:45:10,910 i zastanowić się, co GetString jest rzeczywiście robi. 1014 00:45:10,910 --> 00:45:13,385 Podczas rozmowy telefonicznej getString, że to, że funkcja 1015 00:45:13,385 --> 00:45:16,510 sami napisali i to w jakiś sposób staje się sekwencja znaków od użytkownika. 1016 00:45:16,510 --> 00:45:20,280 I załóżmy, że pierwszy Czas zadzwonić getString, że daje mi 1017 00:45:20,280 --> 00:45:21,930 kawał pamięci, która wygląda tak. 1018 00:45:21,930 --> 00:45:26,990 A jeśli wpisane we wszystkich małych liter m-o-M-- a co idzie za nim? 1019 00:45:26,990 --> 00:45:28,840 Wystarczy szybkie kontrola poprawności. 1020 00:45:28,840 --> 00:45:29,780 >> Backslash zero. 1021 00:45:29,780 --> 00:45:30,510 Wiemy to. 1022 00:45:30,510 --> 00:45:32,784 I pamiętam, że graliśmy wokół nazwą Zamila w 1023 00:45:32,784 --> 00:45:34,950 i kilka innych nazw kiedy Rob został tu w poszukiwaniu 1024 00:45:34,950 --> 00:45:36,280 na to, co dzieje się wewnątrz pamięci. 1025 00:45:36,280 --> 00:45:37,780 Tak, że historia jest dokładnie to samo. 1026 00:45:37,780 --> 00:45:40,160 To co GetString wraca do mnie. 1027 00:45:40,160 --> 00:45:44,780 Teraz moje kodu przed chwilą przechowywane wartość zwracana getString 1028 00:45:44,780 --> 00:45:47,510 w zmiennej o nazwie s. 1029 00:45:47,510 --> 00:45:51,390 A potem drugi raz nazwał go, jest zapisana w zmienną t. 1030 00:45:51,390 --> 00:45:55,070 >> Więc jeśli pójdę tutaj, muszę wyciągnąć tego lokalnego zmienna-- 1031 00:45:55,070 --> 00:45:59,610 a ja na ogół będzie narysować łańcuch jako just-- że będziesz 1032 00:45:59,610 --> 00:46:02,360 Nazywamy to S-- jako placyku tutaj. 1033 00:46:02,360 --> 00:46:09,760 A teraz, w jaki sposób mama somehow-- do środka tej zmiennej s? 1034 00:46:09,760 --> 00:46:12,010 Cóż, musimy wrócić do pierwszych zasad tutaj. 1035 00:46:12,010 --> 00:46:15,660 Co jest GetString rzeczywiście powrocie? 1036 00:46:15,660 --> 00:46:19,030 >> Tak więc okazuje się, że M-O-M backslash zera, a każda liczba 1037 00:46:19,030 --> 00:46:22,364 innych ciągów znaków w pamięci, jak Zamila i Rob i Andy lub jakichkolwiek innych, 1038 00:46:22,364 --> 00:46:24,280 są oczywiście w naszym RAM lub pamięci komputera. 1039 00:46:24,280 --> 00:46:27,760 A twój RAM ma like-- masz jakiś koncert pamięci RAM, dwa koncerty pamięci RAM, 1040 00:46:27,760 --> 00:46:30,860 lub miliard lub dwa miliard bajtów, a może nawet więcej tych dni. 1041 00:46:30,860 --> 00:46:34,070 Więc załóżmy, dla dzisiejszych potrzeb, że to nie ma znaczenia, w jaki sposób zliczyć 1042 00:46:34,070 --> 00:46:36,640 je, ale możemy zaliczyć każdy z tych miliardów lub dwóch miliardów 1043 00:46:36,640 --> 00:46:37,880 lub cztery miliard bajtów. 1044 00:46:37,880 --> 00:46:42,240 >> I niech po prostu arbitralnie powiedzieć, że jest to pierwszy kęs, drugi kęs, 1045 00:46:42,240 --> 00:46:43,380 trzeci, czwarty. 1046 00:46:43,380 --> 00:46:46,570 Ja celowo nie używając zera dla dzisiaj, ale wrócimy do tego. 1047 00:46:46,570 --> 00:46:49,570 Tak więc, innymi słowy, jeśli jest to raz pierwszy używam programu, 1048 00:46:49,570 --> 00:46:52,715 Ja tylko się szczęście, a pierwszy ukąszenie jest w jednym miejscu, a następnie dwa 1049 00:46:52,715 --> 00:46:53,590 potem trzy niż cztery. 1050 00:46:53,590 --> 00:46:57,430 A jeśli trzymałem rysunek, numer skrzynki dwa miliardy byłoby sposobem tutaj. 1051 00:46:57,430 --> 00:47:02,200 >> Więc co myślisz, a następnie, GetString rzeczywiście powraca? 1052 00:47:02,200 --> 00:47:06,010 To nie jest powrót M-O-M ukośnik zera per se, ponieważ to wyraźnie 1053 00:47:06,010 --> 00:47:08,180 Nie zmieści się w okno, że mam wyciągnąć. 1054 00:47:08,180 --> 00:47:11,210 Co jeszcze może getString rzeczywistości wracać wszystkie te tygodnie? 1055 00:47:11,210 --> 00:47:14,410 1056 00:47:14,410 --> 00:47:16,820 Odpowiedź jest na wyżywienie gdzieś tutaj. 1057 00:47:16,820 --> 00:47:20,390 Nie można dopasować M-O-M ukośnik zerowy, więc co może mieć sens, a nie? 1058 00:47:20,390 --> 00:47:23,424 Jeśli miał być super mądry, wprowadzenie na tak zwanej inżynierii kapelusza 1059 00:47:23,424 --> 00:47:24,340 co można wrócić? 1060 00:47:24,340 --> 00:47:27,340 Jaka jest najmniejsza ilość informacji można powrócić, że nadal 1061 00:47:27,340 --> 00:47:30,610 pozwalają znaleźć M-O-M w pamięci? 1062 00:47:30,610 --> 00:47:31,270 Tak? 1063 00:47:31,270 --> 00:47:31,950 >> PUBLICZNOŚCI: Jeden. 1064 00:47:31,950 --> 00:47:32,200 >> David J. MALAN: Jeden. 1065 00:47:32,200 --> 00:47:33,021 I dlaczego jeden? 1066 00:47:33,021 --> 00:47:35,520 PUBLICZNOŚCI: Bo to powiedzieć masz gdzie iść [niesłyszalne]. 1067 00:47:35,520 --> 00:47:38,391 1068 00:47:38,391 --> 00:47:39,390 David J. MALAN: Dokładnie. 1069 00:47:39,390 --> 00:47:44,300 Jestem po prostu będzie zwrócić adres napisu, że mam zdobyć. 1070 00:47:44,300 --> 00:47:46,570 Adres w tym Sprawa jest lokalizacja jednego. 1071 00:47:46,570 --> 00:47:51,280 Więc co tak naprawdę jest przechowywany w S-- i każda zmienna łańcuchowa więc far-- 1072 00:47:51,280 --> 00:47:53,430 właśnie było adres tego łańcucha. 1073 00:47:53,430 --> 00:47:57,840 >> Tymczasem, jeśli zadzwonię GetString drugi raz i ja 1074 00:47:57,840 --> 00:48:03,300 wpisać dosłownie ten sam thing-- M-O-M z lowercase-- M-O-M 1075 00:48:03,300 --> 00:48:06,200 a inny odwrotny ukośnik zero, a teraz może mój programu 1076 00:48:06,200 --> 00:48:09,820 działa już od jakiegoś czasu, więc może to wynosi 10, to położenie 11, to jest 12, 1077 00:48:09,820 --> 00:48:10,700 to 13. 1078 00:48:10,700 --> 00:48:13,590 Komputery wykorzystujące inny Pamięć z jakiegokolwiek powodu. 1079 00:48:13,590 --> 00:48:18,172 Co teraz idzie w moim sekundę Zmienna w moim programie t? 1080 00:48:18,172 --> 00:48:19,390 10. 1081 00:48:19,390 --> 00:48:20,050 Dokładnie. 1082 00:48:20,050 --> 00:48:23,910 >> I tak, gdy spojrzymy na Kod źródłowy tego programu 1083 00:48:23,910 --> 00:48:26,550 gdzie jestem po prostu stara porównać dwie wartości, 1084 00:48:26,550 --> 00:48:32,180 jest s równe równe t, co jest oczywista odpowiedź człowiekiem? 1085 00:48:32,180 --> 00:48:34,890 Po prostu nie ma, ponieważ 1 nie równa się 10. 1086 00:48:34,890 --> 00:48:36,861 I tak, na tym polega szansa dla nas naprawdę 1087 00:48:36,861 --> 00:48:39,610 po prostu wrócić do znowu pierwszy Zasady i myśleć o tym, dobrze, 1088 00:48:39,610 --> 00:48:41,110 co się dzieje pod maską? 1089 00:48:41,110 --> 00:48:43,240 Rozmawialiśmy o bity i bajty i pamięci, 1090 00:48:43,240 --> 00:48:46,820 ale to jest rzeczywiście przydatne do zrozumienia dlatego, gdy dzwonisz getString, 1091 00:48:46,820 --> 00:48:50,280 nawet jeśli uważamy, że jest powrót M-O-M lub mamę ciąg 1092 00:48:50,280 --> 00:48:53,120 lub Andy lub Zamila lub podobne, technicznie 1093 00:48:53,120 --> 00:48:55,510 to jest po prostu powrót adres tego kawałka pamięci. 1094 00:48:55,510 --> 00:48:56,910 >> Ale to jest OK. 1095 00:48:56,910 --> 00:49:00,570 Bo skąd mam wiedzieć gdzie kończy się ciąg? 1096 00:49:00,570 --> 00:49:03,840 Jeśli mam podawać tylko początek? 1097 00:49:03,840 --> 00:49:05,380 Cóż, odwrotny ukośnik zero, prawda? 1098 00:49:05,380 --> 00:49:08,800 Tylko w czasie liniowym mogę print drukować z def M-O-M. 1099 00:49:08,800 --> 00:49:11,820 I jak tylko widzę ukośnik zero, nie obchodzi mnie, gdzie zacząłem, 1100 00:49:11,820 --> 00:49:14,950 Wiem już niejawnie gdzie muszę kończyć. 1101 00:49:14,950 --> 00:49:18,700 >> I tak oznacza dziś beginning-- i pozwól mi to zrobić znacznie, bo my 1102 00:49:18,700 --> 00:49:21,800 przeszedł wiele problemów do uzyskać te tutaj szkolenia wheels-- 1103 00:49:21,800 --> 00:49:29,840 tak dzisiaj kółka zacząć puścić i ujawnić przynajmniej: 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 było warte podróży do systemu TARGET to rano, tak? 1107 00:49:36,160 --> 00:49:39,600 Tak now-- jest, jak się okazuje na zewnątrz, nie ma czegoś takiego jak łańcuch. 1108 00:49:39,600 --> 00:49:41,140 String nie istnieje. 1109 00:49:41,140 --> 00:49:43,760 Jest to synonim, że jakie mieliśmy Wnętrze biblioteki CS50. 1110 00:49:43,760 --> 00:49:48,660 Odtąd mamy zamiar zacząć dzwonić s oraz t nie struny, ale gwiazdek char. 1111 00:49:48,660 --> 00:49:51,180 A gwiazda char że będziesz odciąć przed długo. 1112 00:49:51,180 --> 00:49:53,510 Ale to znaczy że nawet jeśli nadal 1113 00:49:53,510 --> 00:49:56,180 za pomocą getString teraz, technicznie powinienem 1114 00:49:56,180 --> 00:49:59,010 być mówiąc gwiazdę char i gwiazdę char. 1115 00:49:59,010 --> 00:50:01,720 >> I okazuje się, co to gwiazda będzie oznaczać coś 1116 00:50:01,720 --> 00:50:04,340 zwany wskaźnik lub adres. 1117 00:50:04,340 --> 00:50:06,110 A w rzeczywistości, teaser za to, co nas czeka 1118 00:50:06,110 --> 00:50:09,760 jest to 20 sekund klip z naszym przyjaciel Nick Parlante w Stanford 1119 00:50:09,760 --> 00:50:12,927 który jakiś czas temu, spędzić śmieszna ilość czasu, 1120 00:50:12,927 --> 00:50:15,010 jak najlepsze, co mogę powiedzieć, w jego kuchnia lub jego piwnicy, 1121 00:50:15,010 --> 00:50:17,140 co claymation wprowadzenie do świata 1122 00:50:17,140 --> 00:50:20,010 postać o imieniu Binky z którymi będzie 1123 00:50:20,010 --> 00:50:22,010 być wprowadzone następnym razem do wskaźników. 1124 00:50:22,010 --> 00:50:24,588 Więc tutaj jest podgląd tego, co nadchodzi. 1125 00:50:24,588 --> 00:50:26,370 >> [ODTWARZANIE] 1126 00:50:26,370 --> 00:50:27,510 >> Hej, Binky. 1127 00:50:27,510 --> 00:50:28,260 Obudź się. 1128 00:50:28,260 --> 00:50:30,672 Nadszedł czas na wskaźnik zabawy. 1129 00:50:30,672 --> 00:50:31,616 >> -Co to? 1130 00:50:31,616 --> 00:50:33,032 Dowiedz się o wskazówki? 1131 00:50:33,032 --> 00:50:34,450 Och, cukierek. 1132 00:50:34,450 --> 00:50:35,431 >> [Zakończyć odtwarzanie] 1133 00:50:35,431 --> 00:50:38,055 David J. MALAN: I po tej notatce, zobaczymy w środę. 1134 00:50:38,055 --> 00:50:47,590 1135 00:50:47,590 --> 00:50:48,090 W porządku. 1136 00:50:48,090 --> 00:50:48,740 Kto jest taniec? 1137 00:50:48,740 --> 00:50:49,240 Chodź. 1138 00:50:49,240 --> 00:50:50,330 Kto jest taniec? 1139 00:50:50,330 --> 00:50:51,820 Chcesz, żebym się zaczęło? 1140 00:50:51,820 --> 00:50:53,770 Wezmę to się zaczęło. 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: Słodka fantazja Mojżesz.