David J. MALAN: Jest CS50 i to jest początek tygodnia cztery. A chłopak, jest Volkswagen w Kłopot wszystko z powodu oprogramowania. Rzućmy okiem. [ODTWARZANIE] -samochody, Najlepsi znaków w szybki i wściekły filmów. W tym tygodniu niemiecki producent samochodów Volkswagen znalazł się w środku skandalu Proporcje potencjalnie przestępcze. -Volkswagen Jest usztywnienie miliardy grzywny, ewentualne zarzuty karne dla jego kierownictwa, jak Firma przeprasza dla osprzętu 11 milionów samochodów do pomóc mu pokonać testów emisji. -Certain Modele wysokoprężne były zaprojektowany z zaawansowanego oprogramowania które używane informacje w tym Stanowisko sterowania i pojazdu prędkość do określenia samochód był w fazie testowania emisji. Zgodnie z tym okoliczność, silnik zmniejszy toksycznych emisji. Ale samochód był sfałszowane na obwodnicy że gdy był napędzany. Emisja wzrosła od 10 do 40 razy powyżej dopuszczalnych poziomów EPA. [Zakończyć odtwarzanie] David J. MALAN: Więc niech spójrz na to i zobaczyć dokładnie, jak to Może być realizowane i jak to może wpłynąć na tak wiele samochodów takie jak ten. Więc w mojej dłoni są tu prasa zwolnij, który został wydany przez EPA-- Environmental Agencja Ochrony, który jest US agencja regulacyjna, która uchwyty problemów ochrony środowiska, i następnie rzeczywiste Nota prawna, która była wysłać do Volkswagena, zaledwie kilka dni temu. Więc EPA pisze, i ujawnia się teraz publicznie, wyrafinowane oprogramowanie Algorytm na pewne Pojazdy Volkswagen wykrywa gdy samochód jest w trakcie Oficjalne badania emisji i zamienia pełne emisji kontroluje się tylko w trakcie testu. Skuteczność tych zanieczyszczeń pojazdów Urządzenia kontroli emisji jest znacznie zmniejszona podczas wszystkich normalnej jazdy sytuacje. Powoduje to samochody, które spełniają Standardy w laboratorium lub testowania Stacja, ale w normalnej pracy emitują oxides-- azotu lub NOx-- z prędkością do 40 razy normy. Oprogramowanie wyprodukowany przez Volkswagena Jest to urządzenie cytatu, porażka, Zgodnie z definicją Czyste Air Act w USA. Idą na powiedzieć, że EPA i inna agencja odkrył urządzenie obniżające Oprogramowanie po niezależnej analizy przez naukowców z Zachodu Uniwersytet Virginia. Zanieczyszczeń NOx przyczynia się do dwutlenek azotu, ozon w warstwie przyziemnej, i drobne cząstki stałe. Narażenie na te Zanieczyszczenia jest związana z szerokiej gamy poważne skutki zdrowotne, w tym zwiększoną astmy Ataki i inne oddechowego Choroby, które mogą być na tyle poważne, wysłać ludzi do szpitala. Narażenie na działanie ozonu i cząstek stałych ma także wiąże się z przedwczesnym zgon z powodu układu oddechowego związane lub układu krążenia związane efekty. Dzieci, osoby starsze, osoby z preegzystując choroby układu oddechowego są szczególnie narażone na ryzyko wpływ na zdrowie tych zanieczyszczeń. Wystarczy to znaczy, że to dość poważne. I przejdźmy do czytania jeszcze jeden fragment a następnie będziemy spojrzeć na implikacje bazowe o tym w związku z samochodu. W szczególności, Volkswagen wyprodukowany i zainstalowany Oprogramowanie w tak zwanych sterowanie elektroniczne module-- lub ECM-- od te pojazdy, które wykrywane gdy pojazd jest testowane pod kątem zgodność z normami emisji spalin EPA. Na podstawie różnych wejść włączając w pozycja kierownicy pojazdu prędkość, czas trwania silnika Operacja, oraz ciśnienia atmosferycznego, Wejścia te właśnie śledzone parametry federalnego procedury badania dla badanie emisji do certyfikacji EPA celów. Podczas badania emisji EPA, oprogramowanie pojazdów ECM prowadził oprogramowanie, które produkowane Wyniki emisji zgodne. We wszystkich innych czasach oprogramowanie ECM pojazdu prowadził odrębną drogę kalibracja co zmniejszyło Skuteczność z Cały system kontroli emisji, szczególnie selektywne katalityczne zmniejszenie Lean NOx trap-- które zobaczymy się w jednej chwili. W wyniku emisji NOx zwiększyła się o współczynnik od 10 do 40 razy powyżej poziomów zgodnych EPA W zależności od rodzaju cyklu napędowego. Więc co to naprawdę oznacza, a Kod źródłowy dla funkcjonowania oprogramowania na Volkswagena nie ma zostały jeszcze ujawnione publicznie, jest to, że w praktyce, w tym równoznaczne jest gdzieś wewnątrz kodu Volkswagena. Jeśli są testowane, a jeśli w samochodzie wykryje pewne czynniki środowiskowe jak kierownicy Stanowisko lub ruch lub jego samochodu brak lub dowolną liczbę innych czynników które są obecnie hipoteza być częścią tej formuły, po prostu włączyć Pełna kontrola emisji. Innymi słowy, rozpoczyna emitujące mniej zanieczyszczeń. Inaczej, w każdej innej sytuacji gdy nie jest wykrywana jako w laboratorium, po prostu nie. I tak można uprościć to do bardziej betonu pseudokod z czymś jak to. Jeżeli koła obracają ale Kierownica nie jest, sugestywne że samochód jest na niektórych rodzaj wirującego cylindra ale w jakimś magazyn testowany, wtedy zachowywać jak EPA będzie Cię lubić. W przeciwnym razie nie. Warto więc spojrzeć w krótkim filmie, który przygląda się, jakie są konsekwencje Są to w rzeczywistości mechaniczny. [ODTWARZANIE] -Last Piątek EPA zapowiedziała, że ​​niektóre Samochody Volkswagen Audi wykonane między 2009 W tym roku były przy użyciu tak zwane urządzenie spowalniające aby ominąć przepisy dotyczące emisji zaprojektowane tak, aby zachować czyste powietrze. Ale co to dokładnie oznacza? Cóż, nowoczesne wozy mają dziesiątki komputerów wewnątrz nich. A niektóre z tych komputerów pomóc koordynować funkcje silnika do optymalnej wydajność przy jednoczesnym zapewnieniu że nie ma zbyt dużo śmieci wychodzi z rury wydechowej. Oni rzeczywiście pracuje w ten sposób już od kilku dziesięcioleci. Zasadniczo, każda część silnika nowoczesnego samochodu ma czujnik lub regulator na nim, i tych komputerów wczytywanie danych są tysiące razy na sekundę korekty parzenia jak stosunek paliwa do powietrza że idzie do cylindrów. To oszustwo Volkswagen i Audi modele są diesle, i diesle mają jeden naprawdę ważne komputera kontrolowanych parametrów, co jest ilość spalonego paliwa będzie w spalinach. Teraz to brzmi źle. Nie brzmi jak nie chcesz niespalone paliwo będzie w spalinach. Ale w przypadku połączenia diesel, masz coś nazywany pułapkę NOx, które to urządzenie absorbuje i pułapki tlenków azotu które są zanieczyszczenia, które w przeciwnym razie przejdź do atmosfery. I efekt tego pułapkę NOx jest wzbogacony o niespalonego paliwa. Tak więc urządzenie spowalniające to specjalny program wewnątrz tych komputerów, które mogą uczynić go wygląda jak samochód spełnia emisji normy, nawet jeśli tak nie jest. Volkswagen miał problem na swoich rękach. Jego silniki wysokoprężne były znane uzyskania wielką oszczędność paliwa, ale pułapkę NOx działa tylko dobrze przy stosowaniu paliwa. Więc samochód wykryje, za pomocą tego urządzenia obniżające, gdy było uzyskanie emisji testy, to zużywają więcej paliwa, uczynić pracę dobrze pochłaniania tlenków azotu NOx, Emisja będzie dobrze. Ale wtedy można dostać się na drodze, urządzenie wyłącza się, spalasz mniej paliwa ale jesteś wprowadzenie aż 40 razy więcej zanieczyszczeń do atmosfery. Ale jak do cholery nie samochód wiem, że to było testowane na zgodność emisjami? EPA mówi, że to skomplikowane system, który sprawdził rzeczy jak pozycji koła kierownicy, prędkość, jak długo silnik był włączony, i nawet pod ciśnieniem atmosferycznym. Innymi słowy, tam nie sposób było to przypadkowe dlatego, że oprogramowanie było zaprojektowane bardzo starannie, aby wykryć oficjalne badanie emisji. To niektóre całkiem poważne oszustwo i to, dlaczego Volkswagen w takie poważne kłopoty. W rzeczywistości ich dyrektor, Martin Winterkorn, po prostu zrezygnował. Więc co się dzieje dalej? Cóż, jeśli jesteś jednym z pół miliona Jettas diesla, Beatles, Golfy, Passats, lub Audi A3S dokonane, Dobrą wiadomością jest to że samochód jest nadal bezpieczny do jazdy. Nie musisz się schował aż Volkswagen wystawia wycofania. Ale w pewnym momencie, że są prawdopodobnie będzie mieć aktualizacja oprogramowania wewnątrz samochodu. Kiedy tak się dzieje, może się mniej mil na zbiorniku. Prawnicy są już szykuje się do pozwów zbiorowych więc właściciele mogą dostać kompensowane w pewnym punkcie w czasie. Ale to nie będzie wydarzyć w najbliższym czasie. [Zakończyć odtwarzanie] David J. MALAN: Więc to rzeczywiście podnosi ciekawe większy obraz pytanie jak zaufać. Dobrze? Każdy z nas ma iPhone lub androidy lub coś w naszych kieszeniach najprawdopodobniej Te dni, czy laptopy na kolanach, które są uruchomione oprogramowanie wykonane Apple i Microsoft i kiście inne firmy. Ale skąd mamy wiedzieć, że to, co produkty te oprogramowania robią jest w rzeczywistości, co to Firmy twierdzą, że robią? Na przykład, kto jest do powiedzieć, że za każdym razem wykonać telefon na iPhone lub telefon Android lub podobne, że numer telefonu nie jest również są przesyłane do serwera niektóre spółki z powodu jakiegoś programu masz napisane, czy jest to robocze System się jak iOS czy Android, lub dlatego, że pobrałeś część trzecia aplikacja strona że w jakiś sposób jest słuchanie do wszystkiego piszesz lub wszystko, jesteś rzeczywiście mówi. Skąd wiesz, że kiedy chłopaki są uruchomione brzękiem Lub Złóż skompilować własne oprogramowanie w CS50, jak Czy jesteś właścicielem tej CS50 jest personel, W drodze biblioteki CS50, nie było zalogowaniu każdy Ciąg kiedykolwiek dostał lub w każdym calu, jaką kiedykolwiek dostał? Cóż, można z pewnością wyglądać w kodzie źródłowym coś jak biblioteki CS50, ty może spojrzeć na kodzie źródłowym dla systemu operacyjnego Linux działa na CS50 IDE. Ale niesamowite prezentacji otrzymał w 1984 roku otrzymuje Nagrodę Turinga przez bardzo znany informatyk znany as-- imieniu Ken Thompson, który otrzymał Nagrodę Turinga, który jest rodzajem komputera Science Nagroda Nobla, jeśli chcesz, za pracę na system operacyjny o nazwie Unix, który jest bardzo podobny duch do czego używamy, który jest Linux. I pytanie zapytał w swoim mowy przyjęcia, zasadniczo ustanawiająca ramy dla rok i lata dyskusji o zaufania i bezpieczeństwa, to było. W jakim stopniu jeden ufać stwierdzenie, że program-- kawałek z software-- kosztuje konie trojańskie? Być może ważniejsze jest, aby zaufać ludzie, którzy pisali oprogramowanie. A w rzeczywistości, mamy związane w rozmowie, że dał przyjmując tę ​​nagrodę w latach 80. na stronie CS50 jest Wykłady w ramach strony na dziś. Bo to, co zobaczysz, jest to, że on rzeczywiście daje dość prosty przykład, jak również kompilator jak Clang lub cokolwiek kompilatory inni stosowane w przeszłości, co jeśli osadzone w my kompilatora sami używają jest trochę, jeśli warunkiem, że w istocie mówi, jeśli zauważysz, że ten kod jest przy użyciu funkcja GetString lub GetInt Funkcja, śmiało włożyć tylne drzwi lub koń trojański tak, że ten program teraz ma kilka zer i te, które robią coś szkodliwego. Zalogowaniu wszystkie swoje klawiszy, przekazywanie tych danych do jakiegoś serwera, czy naprawdę nic. A co Ken Thompson dzieje się to zrobić w rozmowie jest, aby wykazać, że nawet w przypadku masz dostęp do źródła Kod z kompilatora, że złośliwie może tego robić, to nie ma znaczenia, ponieważ jest to kurczak i jaja rzeczywistość przeszłości wiele lat której kompilatory są używane do przygotowania się. Innymi słowy, w drodze powrotnej, gdy ktoś Napisałem już do pierwszego kompilatora. A potem, za każdym razem, że już aktualizowany kompilator, zmieniając jego kod źródłowy, dodanie funkcji i rekompilacji dla ludzi takich jak my w użyciu, dobrze, oni używają stare wersja kompilatora skompilować nowy wersja kompilatora. A jeśli spojrzeć w rozmowie, że dał, zobaczysz, że z powodu z tego błędnego koła, można rzeczywiście ma błędy lub Konie trojańskie wbudowane w oprogramowanie używamy. I nawet jeśli spojrzeć na Kod źródłowy dla tych programów, może nawet nie być oczywiste dlatego, że oszustwo jest rzeczywiście w jakiejś starszej wersji kompilator, że odkąd został wstrzykiwanie zagrożenie do naszego oprogramowania. Który jest tylko powiedzieć, że Naprawdę nie może i nie powinna Oprogramowanie zaufania działa na naszych laptopach lub komórkowe oraz dowolną liczbę miejsc. I rzeczywiście, w dalszej części niniejszego połowie po zaczniemy mówić o programowaniu WWW i zacząć budować aplikacji internetowych siebie, porozmawiamy o nich groźby i innych. Teraz można się zastanawiać, i zauważyłem, że nie było to malutkie Darth Vader w klipów Progu pokazywał tam o Volkswagenie. Gdyby nigdy nie widziałem, ja Pomyślałem, że trzeba rozjaśnić nastrój, bo to wszystko jest bardzo przygnębiające i przerażające. Będę patrzeć wstecz na Super Bowl 2011 kiedy handlowych przez Volkswagen-- i to prawie sprawia, że ​​sympatyczny again-- wyemitowany po raz pierwszy w telewizji. Jest to drugi klip 60 że myślę, że będziesz cieszyć. [ODTWARZANIE] [MUZYKA - motyw z "STAR WARS"] [Pies Barks] [Samochód zaczyna] [Zakończyć odtwarzanie] David J. MALAN: Tak. Ja tylko sprawdzam. Ten samochód jest na liście naruszeń. W porządku. Więc patrzymy na niektóre pseudocode chwilę temu. I tu jest większy fragment kodu pseudocode które widzieliśmy już kilka razy do tej pory. I użyjmy jest to okazja teraz do wprowadzenia nowego programowania Technika, że ​​zrobiliśmy zobacz algorytmicznie w zeszłym tygodniu, kiedy spojrzał na sortowanie przez scalanie. Ale niech sformalizowania go i zobacz, jak możemy używać go w rzeczywistym kodzie a następnie będziemy korzystać z tego Technika w dół drogi najbardziej prawdopodobnie rozwiązać niektóre inne problemy. Więc był to jeden z pierwszych programów mamy kiedyś napisał, choć w kodzie pseudokod. A co ten program pozwoliło nam zrobić kurs było znalezienie Mike Smith w książce telefonicznej. I zauważyć, w szczególności linii ośmiu i 11, który miał to oświadczenie udać. W rzeczywistości niektóre Języki, C między nimi faktycznie mają stwierdzenie, że jest dosłownie przejść do, który pozwala na przejść do konkretnej linii. To zwykle mile widziana, ponieważ może być bardzo łatwo nadużywane i można rozpocząć skoki swoje Program w każdym miejscu, w przeciwieństwie do stosowania tego rodzaju logika i przepływ sterowania które używaliśmy do tej pory z tak pętle i warunki i tym podobne. Ale możemy uprościć ten algorytm Pseudokod kodu w następujący sposób. Zamiast tego iteracyjny lub pętli podejście gdzie wracamy tam i tam iz powrotem do linii trzy, dlaczego nie możemy po prostu rodzaj punt i więcej ogólnie mówią zgodnie siedmiu i 10, wystarczy wymienić te dwa pary linii o, else if Smith jest wcześniej w książce będziesz szukaj Mike w Lewa połowa książki. Else if Smith jest później w Książka, szukać Mike prawa w połowie książki. I zauważyć już błędnego koła. Dobrze? Szukam Mike książka telefoniczna, a następnie I w końcu trafić może Linia siedem czy może linia 10 i moja instrukcja do siebie jest wyszukiwarka Mike'a w połowie książki telefonicznej. Cóż, jak mam szukać Mike? Jestem w środku szukając Mike, dlaczego ty rodzaj wysyłając mnie w kółko? Ale to jest OK, bo to, co jest dzieje się wielkości problemu jak napisano w linii 7 i 10? Nie jesteśmy po prostu mówiąc wyszukiwanie Mike'a, szukać Mike'a. Mamy specjalnie mówiąc, co? Szukaj go w lewej połowie prawa połowa, która jest skutecznie o połowę mniejszy od tego problemu. Więc to jest OK, że jesteśmy trochę angażowania się w tego błędnego koła, Ten okrągły argumentem, bo przynajmniej mamy czyniąc problem mniejsze. I w końcu mamy zamiar osiągnąć że tak zwany wariant podstawowy, gdzie mamy tylko jedną stronę lewy-- jak nasz wolontariusz w zeszłym tygodniu did-- mieliśmy jedną stronę w lewo i wtedy nie zachować poszukiwania Mike Smith bo jest albo na tej stronie czy on nie jest. Więc jak możemy realizować ten pomysł, to rodzaj błędnego koła w rzeczywistym kodzie? Cóż, możemy wykorzystać technikę który jest powszechnie znany jako rekursji. I widzieliśmy to w pseudokod na sortowanie przez scalanie w zeszłym tygodniu. Przypomnijmy, że był to pseudokod na sortowanie przez scalanie. Jest to z pewnością o wiele prostsze niż bąbelkowa lub wyboru lub Sortowanie przez wstawianie tylko pod względem prostoty z jaką można go wyrazić. Ale to dlatego, jesteśmy jakby kołowo mówiąc, szukać czegoś wyszukując go ponownie. Ale my szukając albo na lewą połowę lub prawa połowa a następnie w końcu jesteśmy połączenie w tym przypadku. Ale i tu, z te dwie linie sortowania, czy znów mamy to Pomysł rekursji. A konkretnie, co to znaczy, W kontekście algorytmu jest to, że algorytm jest rekurencyjne jeśli używa lub nazywa siebie. Albo w kategoriach C, funkcja jest recursive-- funkcję o nazwie foo jest rekurencyjna, jeśli foo, gdzieś w jego kodu źródłowego, wzywa samą funkcję foo. I to jest złe, jeśli wszystkie foo kiedykolwiek robi jest nazywać się ponownie i ponownie. Jest OK, jeśli foo w końcu zatrzymuje się, podobnie jak sortowanie przez scalanie, mówiąc, chwileczkę, Jeśli ten problem jest super niewielka, na przykład lub go znalazłem, którego jestem szukają, po prostu wrócić. Nie rekurencyjnie, nie cyklicznie nazywam się ponownie. A więc rzućmy okiem na jak może to rzeczywiście działa. Więc mam zamiar iść do przodu i otwarta się dwa przykłady kodu źródłowego tutaj. Z których jedna zwana sigma 0. I nie jest w ogóle rekurencyjny, ale rzućmy Sprawdź co czyni ten program. Mam okorowane wszystkich komentarze do niego, ale wszystkie kodu źródłowego na CS50 na strona ma komentarzy Jeśli Aby zapoznać się z nim później. I zróbmy parę rozsądku sprawdza się tutaj. Tak więc w górnej części tego kodu mamy to CS50.h. Co to zrobić? Dlaczego jest tutaj? W zakresie rozsądnej laika. Co to robi? Tak. PUBLICZNOŚCI: Tak, że funkcja GetInt działa. David J. MALAN: Tak, że funkcja GetInt działa. Ponieważ wewnątrz tego Plik, CS50.h, które zobaczymy niedługo w warunki jego kodu źródłowego, ma kilka funkcji declared-- GetInt, GetString, i grono wiele innych, a jeśli nie mamy naprawdę, że Dołącz linię, Clang kompilator nie jest będzie wiedział, że istnieje. I to samo dotyczy linii dwa, gdzie int jest zdefiniowana printf, która jest funkcją trzymamy za pomocą całkiem sporo. Teraz linia czterech wydaje się nieco Funky bo to tylko jedna wkładka. Jest tam średnik nie kręcone szelki, brak kodu wewnątrz niej. Ale to, co zrobił nazywamy to coś w tygodniach przeszłości? Tak. Więc prototyp. I dlaczego mamy Prototyp, który wydaje być trochę zbędne zazwyczaj dlatego, że zwykle zobacz funkcję ponownie później w pliku, prawda? Dlaczego więc have-- jesteś tylko drapanie głowy, ale ja go zabrać. Tak. PUBLICZNOŚCI: [niesłyszalne] Funkcja po głównym. David J. MALAN: Dokładnie. Tak, że kompilator zna ciebie ostatecznie zdefiniować lub realizacji że funkcja po głównym, prawdopodobnie. Więc Szczęk i najbardziej kompilatory są trochę głupi a oni tylko wiedzieć co im każesz. A jeśli chcesz używać funkcja o nazwie Sigma, lepiej uczyć kompilator co istnieje, to z góry. Teraz głównym sama, nawet choć jest kilka linii, mam nadzieję, że jest całkiem znajomo teraz. Jest tam zrobić, gdy w pętli którego celem w życiu tutaj podobno jest, aby uzyskać dodatnią liczbą całkowitą od użytkownika. I po prostu męczył go lub jej dopóki nie współpracują. Następnie w linii 16 mam ciekawa rozmowa. IntAnswer. Które z lewej strony boczna daje mi Int które mogą store-- nazywa Answer-- która będzie przechowywać, najwyraźniej, wartość zwracana sigma. Więc sigma jest tylko arbitralne, ale znaczące nazwisko że dałem do funkcji którego celem w życiu ma mieć jeden argument-- my go nazywamy N w tym case-- i po prostu wziąć sumę tego numeru oraz każda liczba dodatnia to mniejszy od niego. Więc jeśli mogę przekazać w liczbie 2 do sigma, chcę dodać 2 plus 1 oraz 0-- nie 0-- tak, że daje mi 3. Gdybym przejść w 3 do sigma, chcę posiada 3 plus 2 plus 1, która daje mi 6. I tak dalej. Więc po prostu dodaje się wszystkie numery mniej niż lub równe do niego. Teraz, tutaj jestem po prostu wydrukować odpowiedź. Więc jako szybki test dla pewności niech aby sigma 0-- dot ukośnik sigma 0-- i pozwól mi wpisać 2. I rzeczywiście uzyskać 3. Pozwól mi wpisać 3. I rzeczywiście dostać 6. A czy ktoś może do matematyki szybko, jeśli robię 50 co ja mam dostać? PUBLICZNOŚCI: [niesłyszalne]. David J. MALAN: No, nie. Ale 1275, który jest bardzo blisko. Więc to jest wynikiem robi 50 Plus 49 Plus 48 Plus 47 Plus 46 w dół do 1. Więc to wszystko sigma robi. Ale zobaczmy, jak mamy wprowadziły go teraz. Więc tutaj jest sama funkcja. I nie wydaje się mieć coś zrobić z rekursji jeszcze. W rzeczywistości, że używasz stara technika szkoła. Jestem inicjalizacji zmiennej o nazwie suma do zera, a potem mam foreloop tutaj, a ja deklarowania Int nazwie Ja, ustawienie jest równa 1-- choć mogę ustawić go równa zero, ale ponieważ robię dodatek, kogo to obchodzi, jeśli jest zero lub jeden. To będzie miało wpływu. Więc jestem iteracji tak długo, jak jest mniejsze lub równe M, która jest argument, który został przekazany w. A potem po prostu zachować zwiększając I. i wgląd pętli wszystko robię robi sumę Plus wynosi I. I to jest celowe. Nie chcę, żeby to zrobić, w tym Sprawa, jak sumy powiększonej plus. Chcę, aby faktycznie dodać aktualna wartość I która staje się coraz większe i większe i większe na bieżąco rejestruje. A potem wrócę sumę. A więc odpowiedź dostaje sumę wartości. A potem wydrukować. Więc jest szansa tutaj, jednak do rodzaju uproszczenie Ten kod koncepcyjnie i rodzaj ciosu jeden jest przeszkadza w kategoriach Prostota, mimo to zajmuje trochę czasu, aby posortować od docenić, dlaczego jest mocny w tych małych przykładów. Oto sigma jedno- tak Druga wersja tego kodu. Wszystko się szczycie jest identyczna tak że sama historia dotyczy, jak wcześniej. Ale teraz spójrzmy u Realizacja sigma, które Mam stopniała do zaledwie nich lines-- cztery linie kodu, tak naprawdę, plus parę nawiasy klamrowe i białe miejsca. Ale co ja robię? Gdy m jest mniejsze niż lub równe zero, muszę rodzaj obsługi że bardzo prosta sprawa. A jeśli podaj mi zero lub nic ujemna, która jest po prostu dziwne, Idę do arbitralnie ale konsekwentnie zwracają zero. Nie chcę tej rzeczy do dostać się jakimś dziwnym nieskończoności Pętla z powodu wartości ujemnej. Tak Mówię tylko, jeśli dasz mi zero lub mniej, wracam do zera. Ale to dobrze, bo to pojedyncza strona z książki telefonicznej Pozostaje. Jestem odgryza bardzo specyficzny problem i nie nazywając coś rekurencyjnie. Jednak w linii 31, co nie wydaje mi się robi? Nawiasy są tylko utrzymanie rzeczy, mam nadzieję, trochę jaśniejsze. Ale to wszystko robię to ja jestem powrót M-- co dajesz me-- oraz na Wartość M-- przykro, plus wartość sigma mw minus 1. Więc co to oznacza? Jeśli dasz mi numer 3 jako wejście, odpowiedź Chcę ostatecznie jest 6, ponieważ 3 plus 2 plus 1 daje mi 6. Ale jak myślę o jak ten kod działa? Gdy pierwszy raz zadzwonić sigma i przekazać wartości 3, to jakby powiedzieć, na kartce z papieru, oto wartość 3 a ja już przeszedł to jako sigma. 3 jest oczywiście mniejszy niż 0, co warunek IF nie ma zastosowania. Else robi. Więc co mam zrobić? Chcę wrócić m, co jest 3 plus sigma m minus 1. Więc daj mi śledzić to. Mam zamiar umieścić to kawałek papieru dół. A jaką wartość, być jasne, mam zamiar przejść w sigma w tym momencie w historii? Jaki numer? 2, prawda? 3 minus 1 to 2. Więc po prostu trzeba trochę skrawek papieru tutaj. Więc teraz sigma jest coraz nazywa ponownie. A ja celowo umieścić to w dół, bo to trochę jak wstrzymywanie że wersja historii bo teraz jestem skupiony na sygnał m minus 1. Tak było m 3 m minus 1 2. Więc tutaj jest 2, że już zostały przekazane. 2 nie jest oczywiście mniejsza niż 0 tak, że sprawa nie dotyczy. Jeszcze wrócę m, co jest w tym rzeczą plus sigma jakiej wartości? Więc jeśli sigma 1-- bo m jest teraz 2 tak 2 minus 1 to 1. Więc teraz mam tylko wartość 1. Olewam tylko numer 1 do sigma-- funkcji ani ja here-- tak 1 nie jest oczywiście mniej niż zero, nadal nie ma zastosowania. Else return 1 plus sigma czego? 0. Więc pozwól mi tylko pamiętam. Wrócę do tego później. Teraz mam zamiar iść do przodu i jot w dół liczby 0, ponieważ to mój argument lub parametr. Mam przeszedł numer 0 i wreszcie ten proces po prostu powtarzam ogłoszenie nauseum ustaje, ponieważ to, co mogę natychmiast zrobić, gdy widzę to 0? Wracam do zera. Więc teraz trzeba przewinąć historię. Jeśli teraz się cofnąć w czasie, co było ostatnią rzeczą, Zrobiłem jeśli były dosłownie przewijanie wideo? Jadę odebrać najnowsze 1 i które daje mi 1 plus 0 to 1. Jeśli trzymam przewijanie Opowieść, która będzie mi dać 2 plus działa to wartość, która wynosi 1. Więc to 3. A potem mam zamiar utrzymać przewijanie. Kiedy po raz pierwszy położył liczbę 3-- więc 3 plus 3 daje mi 6. A teraz, jeśli już przewinął w górę wideo do tego momentu, jest to bardzo Pierwsze pytanie, zapytałem. Po przekazaniu 3, co jest sigma z 3? Jest to w istocie 6, suma wszystkie te kawałki papieru. Więc jeśli to zajmuje trochę czasu, aby owinąć swój umysł się, że jest w porządku. Ale uważają, że to little-- niego był bardzo celowe, że ułożone te numery na szczycie siebie. To trochę jak o memory-- zapis w czasie, jak płuczki w filmie, że mogę rzeczywiście przewinąć w. I mamy zamiar wrócić do że metafora się tylko trochę. Ale po pierwsze, okazuje się, że jest dużo maniaków i zabawnych ludzi, Myślę, Google. Czy ktoś, kto jest bardzo dobre na googling umysłu wymyślanie na chwilę i pomóż mi szukać czegoś? Bardzo, bardzo niski klucz. Ktoś, kto nigdy nie jest pojawią się wcześniej, być może. OK. Tak? Chodź. Zejdź na dół. Jak masz na imię? SAM: Sam. David J. MALAN: Sam, chodź na dół. To samo. Miło cię poznać. Hej. Chodź. Więc wszystko, co potrzebujesz zrobić, jeśli można, Sam, oto Google. Można wyszukać rekursji termin? Nie psuj. A teraz let's-- tak. OK Kliknij, że. Lepiej kliknij to. Ach, rozumiem. Nie? OK. Więc zróbmy kilka innych. Nie tyle związane akademicko tutaj, ale czy kiedykolwiek wyszukiwane w Google anagram? SAM: Nie. David J. MALAN: OK. Szukaj anagram zamiast rekurencji. Jak się krzywo. Czy kiedykolwiek szukał krzywo? Teraz, ten jest trochę trudne do zobaczyć, ale mam nadzieję, że everything's-- OK. To tylko ty i ja ciesząc się tym. OK. Więc w końcu, to one's-- to trochę krzywo. Teraz zrobić beczkę. Wspaniały. W porządku. Wielkie podziękowania dla Sam. Proszę bardzo. Dzięki. Więc co się dzieje w ogóle z tych głupich przykładów? Tak naprawdę, pod maską Miliony Google linii kodu podobno jest kilka głupie JEŚLI Warunki, które są zasadniczo sprawdzenie czy użytkownik ma wpisaniu tej frazy, zrobić coś, co prawdopodobnie miało nieszablonowe czas do realizacji tylko amusing się w ten sposób. Ale to wszystko sprowadza dół pod wyciągiem. Ale, oczywiście, rekurencja więcej z geekier Przykładem wśród tych specjalnych sztuczek. A już na pewno nie ma innych, tam jak dobrze, że być może nawet nie odkrył jeszcze. Więc spójrz, lub rozważyć teraz następujący program, i na pewno chwycić dowolny z nich na swój sposób. Mam zamiar iść do przodu i otwarcie programu, który jest Spróbuję zamienić dwie wartości. Ale zanim pójdziemy tam, zróbmy to. Możemy dostać jeszcze jeden Wolontariat, myślę? Chciałbyś na ochotnika? Nie? Chodź na górę. Chodź na górę. W porządku. Tak więc nazwa jest co? LAUREN: Lauren. David J. MALAN: Lauren. Chodź, Lauren. Więc Lauren jest kwestionowane tutaj poniżej. Miło cię poznać. Więc Lauren tutaj ma przed jej dwóch pustych kubków. I mamy jakiś pomarańczowy sok i mleko i zamierzamy iść do przodu i wykonaj następujące czynności. Jesteśmy po prostu się do wypełnienia tego. Kilka uncji mleka tu i niech wypełnić trochę soku pomarańczowego tutaj. A przed wszystkim te publiczność, zamienić dwie wartości tych kubków. Umieść sok pomarańczowy w kubku mleka a mleko w kubku soku pomarańczowego. W jaki sposób można to zrobić u siebie w domu i miał dostęp do innych materiałów? LAUREN: Umieścić go w innym kubka. David J. MALAN: OK. Warto więc mieć tymczasowy zmienna, jeśli będzie. I idź teraz i wdrożyć Ta sama procedura zamiana. Tak dobrze. Włożyliśmy Dz.U. pod tymczasowy Zmienna, mleko w zmiennej OJ, a teraz zmienna tymczasowa w zmiennej mleka. OK. Więc bardzo dobrze zrobione do tej pory. Okazuje out-- utrzymują, że pomyślał przez chwilę. Tutaj, po prostu Geek IT się trochę, to byłby odpowiedni kod C że po prostu realizowane. Mieliśmy dwa wejścia, A i B, oba które musimy po prostu powiedzieć, dla uproszczenia są INT. I tutaj odnotować, jeśli chcę zamienić wartości dwóch zmiennych, A i B, my rzeczywiście potrzebujemy pośredników, A tymczasowa zmienna tymczasowa kubek, w którym wlać wartości tak, że mamy zastępczy dla niego. Ale kod jest dokładnie jak Lauren tutaj realizowane. Teraz, żeby dostać Trochę szalony, okazuje się, że można to zrobić bez tymczasowa zmienna. Aby to zrobić poprawnie, choć jedziemy musiał oszukiwać z jakąś chemią. Mamy tu jakieś dodatkowe puchary. Tak więc najbliższa rzecz, która wygląda jak mleka i wody perhaps-- lub mleko i OJ-- to mamy pewne wody, więc my wypełnimy ten jeden się z kilku uncji czystej wody. To chyba za dużo. Tak. To zdecydowanie za dużo. Trzymaj się jednej sekundy. A teraz mamy olej, który, o ile pamiętam od szkoły średniej klasy chemii, miejmy nadzieję, że nie miesza się z wodą. Ale to rodzaj jakby wygląda jak mleko i Dzienniku Urzędowym. Więc teraz, bez użycia tymczasowa zmienna, można zamienić te dwie wartości? Więc oleje idzie do filiżanki wody, Woda idzie do filiżanki oleju. LAUREN: Nie ma innych kubki? David J. MALAN: Żadne inne puchary. A ja nie mam właściwie przetestowane przed tym roku więc nie wiem, czy to będzie rzeczywiście działa chemicznie. To nie powinno się zdarzyć. Czy to działa? W porządku. Tak więc oddzielenie? Dobry. Teraz udało nam się uzyskać wody do drugiej filiżance. Smarter koncentratory chemii mógł prawdopodobnie to zrobić lepiej niż mnie. LAUREN: Woda jest na dole. David J. MALAN: The water--, że był co jest kluczowym ostatni raz to zrobiliśmy. Musisz to zrobić w odpowiedniej kolejności. Tak. Dobrze. Więc teraz mamy dwie filiżanki oleju. OK. Dobrze. Ale jeśli to chemicznie pracował niż ja-- LAUREN: To jest woda. David J. MALAN: To głównie z wody. W porządku. Ale to wciąż ten sam kubek, jak wcześniej. Więc wlać it-- spróbuj tam. OK. To jest dobre wykorzystanie czasu klasy dziś. OK. Więc teraz we-- miłe. Tak jakby. W porządku. Więc bardzo dobre. Dziękuję Lauren. Bardzo dobra robota. Więc po prostu dmuchnąć wasze umysły, a to może coś do zabawy, jeśli chcesz w CS50 ID, można bowiem zamienić dwie zmienne bez tymczasowego całkowitą. I to jest odpowiedni kod C. A jeśli pamiętacie z ostatniego Środa, wprowadziliśmy, gdy na krótko, kilka nowych operatorów w C i nie ktoś przypomnieć, co trochę marchewki Symbol to, że mały trójkątny Symbol z klawiatury reprezentuje? Co bitowe operatora? PUBLICZNOŚCI: EXOR. David J. MALAN: EXOR. Exclusive Or. Więc jeśli chcesz, tylko dla zabawy w do domu, dać aib dwóch arbitralne Wartości takie jak jakakolwiek eight-- i I wybierze wartość osiem bitów. Jeśli to zrobisz z 32 bitów, będziesz bardzo szybko się nudzą. Ale po prostu dać osiem bit Wartość to co, jeden lub dwa, i dać b podobnej wartości. A następnie z zastosowaniem definicji XOR z ostatniej środy, stosować ten kawałek po kawałku, każdy z te osiem bitów każdy z A i B, a następnie zrobić to dokładnie na tym kodzie. I to nie jest błędne, co tu widzisz na ekranie. To w istocie sprowadza się do trzech operacji XOR i jakoś magicznie a i b będą wymieniać pozycje bez utraty informacji. Więc sztuczka oleju i wody jest Najbliższy realny świat wcieleniem Mogłem pomyśleć, aby naśladować to. Ale to z pewnością łatwiej użyć zmiennej tymczasowej, jak w tym przypadku tutaj. I to też jest szansa powiedzieć, też tego rodzaju mikro optymalizacji, jako informatyk powiedziałbym, podczas gdy rodzaj zabawy się czym chwalić, jak to zrobiłeś to bez jak zamiana z dodatkową zmienną, to nie jest wszystko, co atrakcyjne. Ponieważ zaoszczędzić 32 bity, jak W przypadku rzeczywistej int nie jest wcale tak atrakcyjne W systemie, gdzie być może używasz dziesiątki megabajtów lub nawet więcej takich pamięci te dni. I rzeczywiście, gdy mamy do późniejszego zbioru problemów i wdrożyć czar sprawdzania i będziesz za zadanie zrobić z to za mało pamięci RAM i tak mało Czas, jak to możliwe na computer-- cię wciąż ma tydzień na realizację it-- będziesz have-- będziesz wyzwanie, aby zminimalizować te zasoby. I to jest naprawdę tylko okazja w tym semestrze gdzie można być zachęcani do golenia się nawet najlepszych wyników kosztuje inaczej. Więc what-- jak możemy Widać to w rzeczywistym kodzie? Pozwólcie mi iść do przodu teraz i otworzyć przykład że świadomie nazywa Nie Zamień ponieważ nie w istocie zamienić zmienne jak w rzeczywistości może się spodziewać. Warto więc przyjrzeć. Oto program, który ma CS50 Biblioteka dzieje, po prostu standardowe I / O. Teraz mamy prototyp swap się góry, które po prostu Oznacza to musi być określone później. A oto główne. I arbitralnie przypisano x i y, odpowiednio jedną i dwie wartości tylko dlatego, że są małe i łatwe do myślenia. A potem mam tylko kilka printfs gdzie mam testow. x oznacza 1 a y wynosi 2 to przypuszczalnie co te printfs powie. Więc nie ma magii tej pory. Potem mam zamiar ubiegać się wydrukować def, zamiana dot dot dot. Mam zamiar zadzwonić swap Funkcja, przekazując xi y. I załóżmy teraz, że Swap dokładnie jest realizowany jak to było przed chwilą o zmiennej czasowej. I tak twierdzić śmiało, zamienione. x jest teraz to, a y jest teraz. Ale plik, oczywiście, nazywa No Zamień. Więc rzeczywiście zobaczyć, co się dzieje. Jeśli mogę skompilować żadnego swapa, a następnie zrobić ./noswap, x oznacza 1, y 2. Zamiana zamienione. x oznacza 1, y wynosi 2. Więc to rzeczywiście wydaje się być wadliwy, nawet choć swap-- niech przewiń now-- realizowany jest dokładnie na Kod zaproponowałem przed chwilą. Tak więc nie będziemy się fantazyjne z rzeczy XOR do teraz. To też powinno działać jak z mlekiem i OJ, ale nie wydaje się działać. Więc zróbmy to jeszcze raz. Może po prostu nie działa to dobrze. Warto więc uruchomić No Zamień ponownie. Może ja-- nie. Więc to jest po prostu nie działa. Więc zróbmy mały test dla pewności. Pozwólcie mi iść do przodu tu swap i po prostu dodać, chwileczkę, a jest% i / n oraz niech plug-in wartości a. Bo naprawdę chcę aby zobaczyć, co się dzieje. I rzeczywiście, to jest technika debugowania że może być używany w godziny pracy lub w domu, już podobny do pierwszej połowy Dan Wideo Armendáriz w PSET3 w którym wprowadziliśmy druk def jak zalecana technika przynajmniej w prostych przypadkach. Pozwólcie mi iść do przodu i uruchomić make znowu, bez wymiany, ./noswap. Ciekawe. Tak więc zauważyć, co wydaje się być prawdziwe. x jest 1, y oznacza 2, a a oznacza 2, gdy b jest 1. Więc te dwa jakoś zamienili a X i Y nie są coraz zamienione. Więc być jasne, co się dzieje jest, tu mam xiy a te są zmienne lokalne w Zakres głównym, jestem przekazując x i y zamieniać. Teraz, swap, jako odrębnej funkcji, to zadzwoń do swoich argumentów lub jego parametry cokolwiek chce. Foo lub baru lub X lub Y lub A lub B. Wystarczy, aby wyjaśnić, że są one nie identyczne x i y per se, Powiedziałem, a i b. Ale moglibyśmy nazwać im cokolwiek chcemy. I tak to wygląda Swap jest przekazywana X-- AKA A-- i to przeszedł y-- AKA b jest. Jakoś te trzy linie są zamiana tych wartości dokładnie jak Laura zrobiła z mlekiem i Dzienniku Urzędowym. Ale kiedy wydrukować wartości, a i b są rzeczywiście zamienić, ale xi y mają żadnych zmian do nich. Przypomnijmy, że X i Y są tutaj. Tak więc widzimy, w tym poprzez Inną techniką, jak również. I to też jest technika osadzone w problemu ustawić trzy. Idziemy dalej i zrobić to w CS50 ID, jeśli jeszcze tego nie zrobiłeś. Na stronie mamy prawej mają tę kartę Debugger. A jeśli to otworzyć, jest jakaś tajemna informacje który jest rzucony na ciebie na początku. Miejmy jednak drażnić to poza naprawdę szybko. Tak jeden, widać zmiennych lokalnych. Okazuje się, że wbudowany w CS50 IDE, oraz wiele środowisk programistycznych więcej Ogólnie rzecz biorąc, jest debugger. Narzędzie, które pozwala na wizualizacji co się dzieje wewnątrz programu bez konieczności uciekania się do dodawania printfs i skompilowanie i uruchomienie i dodając printf i kompilowania i bieganie, które już w godzinach pracy lub domu, to prawdopodobnie się dość uciążliwe. Tak oto, za chwilę, że jesteśmy będzie zobaczyć w czasie rzeczywistym wartości naszych zmiennych lokalnych. Jesteśmy również będzie w stanie ustawić tak zwane wartości graniczne, które są szanse w moim programie, aby wstrzymać wykonanie w określonym wierszu kodu że jestem ciekaw. Dobrze? Programy te działają w ułamku sekundy. To miłe dla nas wolniejszych ludzi aby być w stanie wstrzymać, poświęć chwilę, zobaczyć co się dzieje wokół pewna linia kodu bez orki programu przez niego i wykończenie całości. Więc graniczne zamiaru pozwolić nam złamania i przerwy w określonym punkcie. Zadzwoń stos jest fantazyjny sposób mówiąc, jakie funkcje są obecnie nazywany w tym momencie. Głównym jest zawsze najpierw zadzwonić. Ale jeśli Główna nazywa Funkcja o nazwie Swap, my rzeczywiście będzie zobaczyć Wieża funkcji, które zostały zwany w odwrotnym porządku chronologicznym. Zobaczmy więc, że. Mam zamiar pomniejszyć. Mam zamiar wrócić do mojego kodu. I tylko dlatego, że chcę być pedantyczny tutaj, Mam zamiar iść do przodu, a następnie kliknij na lewo od linii pięć. I to tworzy czerwoną kropkę. I zauważyć na prawej stronie że debugger wie, hej, Powiedziałem tylko, że punkt przerwania na noswap.c linia pięć, specjalnie w tej linii kodu. Więc debugger wie, że zwróciły się po raz kolejny Prowadzę go zaprogramować pauzę wykonanie tam, a nie tylko działa całość super szybko. Więc teraz mam zamiar kliknij Debug Przycisk na samym szczycie IDE i że będzie wykonać następujące czynności. To będzie otworzyć początkowo nieco straszne patrząc drugi terminal window-- zdalne debugowanie z gospodarzem takich i such-- i wrócimy do tego, co wszystko, co oznacza niebawem. Ale co ważne teraz to, że czerwona kropka został trafiony, debugger celowo Przerwał execution-- Nie na tej linii per se, ale na pierwszy linia rzeczywistego kodu w tej funkcji. I dlatego linia siedem jest teraz podświetlone na żółto. A teraz rzućmy okiem po prawej stronie. Wygląda na to, domyślnie, tyle ładnie, x ma co wartość? 0. I y ma co wartość? Zero. I że należy się spodziewać w tym sensie, że x i y--, że żółty line-- ma jeszcze nie wykonane. Tak x nie powinien mieć wartość 1. To może mieć jakąkolwiek wartość, tak zwana wartość śmieci. I mamy szczęście, że jest to zera w tym punkcie, w istocie. Więc teraz jest tylko kilka Przyciski musimy dbać o podczas debugowania w ten sposób. Zauważcie, że mamy przycisk Odtwórz. A jeśli gramy lub uderzyć wznowić, to tylko będzie przebiegać przez reszta programu lub dopóki nie natrafi inny punkt przerwania. Ale już nie ustawić każdy inny wartości graniczne, więc jest to po prostu będzie prowadził do końca. Tego rodzaju porażek Celem wywiercenie. Zamiast więc, zależy mi na te ikony w prawo. A jeśli najedź im, jak powinieneś też, zobaczysz małe tips-- podpowiedzi. Ten jest krok nad. Teraz to nie oznacza pominięcia następujących linii kodu. To oznacza, że ​​wykonanie go i przejść do następnego, przejść do następnego, przejść do następnego. Innymi słowy, za pośrednictwem ten przycisk, mogę chodzić przez mój kod jeden krok na raz. Linia po linii, dosłownie. Teraz, po prawej że istnieje jeszcze jeden że zobaczymy za chwilę. Jest to tak zwane Krok w ikonę, która jest zamiar pozwolić mi nurkowania do innej funkcji. Ale zobaczmy to na chwilę. Więc mam zamiar kliknąć krok nad. A teraz zauważyć, jak klikam ten przycisk w prawym górnym rogu, miej oczy mniej więcej pod lokalny Zmienne i zobaczyć, co się dzieje z x. x jest teraz 1, ponieważ żółta linia, teraz wykonywane i mamy przeniósł się do linii 8. A za chwilę y powinna miejmy nadzieję stać się 2. Teraz nic, co ciekawe dzieje się na trochę. Wszystko to jest printf. I zauważyć, w moim terminalu wtórnego okno, widzę wyjście druku def. A teraz mam zrobić Decyzja jako programista. Mogę krok na tej linii Kod, wykonując go, ale nie coraz ciekawy, co jest w środku. Albo rzeczywiście mogę wejść do niego i wejść do środka z całości transakcji. Więc zróbmy to drugie. Pozwólcie mi iść do przodu, a następnie kliknij Nie Step Over ale krok w. Wskazówki, nagle zmiany okno aby podświetlić pierwszy linia kodu w swap. To linia 21. A teraz, co to niby jest, funky, jeśli spojrzeć tutaj, zgodnie z oczekiwaniami, przecinek b oznacza 1 i 2, odpowiednio. Dlaczego temp 32767? Przypominając, że temp, podobnie jak pusty kubek przed chwilą, deklaruje tu na linii 21. Dlaczego 32,000- Mam na myśli, dlaczego to tylko niektóre dziwne wartość? Tak? PUBLICZNOŚCI: To nie jest zainicjowany. David J. MALAN: Jest nie zostały zainicjowane. Więc nasz komputer zawsze posiada pamięć fizyczną. Zawsze ma fizycznej pamięci RAM. I zawsze Zero i jeden jest w środku, prawda? Ponieważ używamy naszych komputera przez cały dzień, używasz CS50 IDE lub serwery cały dzień. Tak, że RAM albo ma kilka zer lub ktoś lub kilka zer i jedynek. Bez względu na to, czy Nie jesteś korzystania z nich. Nie możesz po prostu puste miejsca, w którym chcesz bity. Są albo zer i jedynek. Tak więc okazuje się, że temp, ponieważ nie wcześniej zainicjowany tego jeszcze, mamy te 32 bity, ale nie mam zainicjalizowany jakichkolwiek znanych wartości. Więc co oni byli najbardziej Niedawno używane for-- tych 32 bits-- jesteśmy po prostu widząc artefakty niektóre poprzednia wykorzystanie tych szczególnych 32 bitów. Jak tylko kliknąć Krok ciągu jednak, uff, temperatura będzie się wartość 1. A jeśli to zrobię to jeszcze raz, a jest będzie podana wartość 2 a następnie b będzie mieć wartość 1. A więc to, co teraz jest miły w ten punkt w historii jest to, że debugger jest pokazując mi, bardzo powoli w moim własnym tempie, co stan wymiany jest. Zauważmy jednak, na górze tutaj, wypowiedzenia że stos wywołań faktycznie składa się z dwóch warstw do niego. Teraz ten, który jest zaznaczony jako Swap, gdy klikam na Main zamiast, zauważyć, jak zmienić zmienne lokalne dlatego, że deweloper może po prostu wskoczyć się i pójść do dowolnego innego zakresu. Więc nawet jeśli robimy wszystko pracować i poprawnie swapping A i B, jeśli pójdę tam iz powrotem pomiędzy swap w którym a oznacza 2 i b oznacza 1, Main, Główne zostały dotknięte jest w ogóle? Nie. Więc co jest na wynos tutaj? Cóż, okazuje się, że każdej chwili można wywołać funkcję jak swap, i przekazać ją argumenty, co jesteś przechodząc do funkcji swap w tym przypadku jest to kopia z tych argumentów. Tak więc, jeśli x i y oznaczają, odpowiednio, 32 bitów, co Zamień się to dwa nowe lokalne zmienne lub argumenty, nazwać i B-- ale te są arbitralne names-- ale wzór zer i te, w środku A i B są ułożone są identyczne z X i Y ale oni nie są samo co x i y. To tak jakby główna posiada na swojej kartce papieru numer 1 i 2 dla x i y, a następnie, gdy podaje, że kawałek papieru do wymiany, Zamień bardzo szybko dostaje własny długopis, spisuje 1 i 2, na swojej własnej arkusza papieru ręce kopię oryginalnego xy do Menem a następnie robi własny Rzecz z a i b. I to jest bardzo ważne, ponieważ ma to wpływ nieszablonowe za faktycznie pisania poprawnego kodu ponieważ wydaje się, że nie możemy zamienić dwie zmienne. Pisałem prawidłowej funkcji Zamień. Wdrożyliśmy go Lauren jako prawidłowe swap w rzeczywistości, ale najwyraźniej nic z tego sprawy, jeśli nie można rzeczywiście zamienić dwie wartości stałe. Więc musimy w inny sposób rzeczywiście się na to, i musi być w stanie faktycznie rozwiązać ten problem. I okazuje out-- i wrócimy z powrotem do tego konkretnego obrazu przed long-- to jest jeden sposób, że można wyciągnąć pamięci komputera. To tylko prostokąt. Można go wyciągnąć jakiekolwiek wiele sposobów, ale to wygodne wyciągnąć go jako prostokąt z następującego powodu. Mamy zamiar rozpocząć dzisiaj i nie tylko mówić o tzw stosie. A stos jest tylko fragment z RAM-- kawałek memory-- które funkcje mają dostęp kiedy nazywa się je. I tak okazuje się, że w na samym dole tego stosu jest gdzie wszystkie zmienne lokalne Main i org C org V i wszystkie rzeczy zamiar iść domyślnie. A jeśli Menem wzywa inne funkcje jak swap, dobrze, Zamień dostanie kolejny Pamięć warstwa nad nim. I tak, po prostu daje szybki pobieżne obraz tego, jeśli pójdę na here-- i pozwól mi lustro to na napowietrznych, jak well-- co naprawdę muszę, jeśli dbamy tylko o Dno tego obrazu na razie, jest to, że gdy uruchamiam program i Main jest wywoływana, Głównym otrzymuje kawałek RAM w komputerze, który jest w dolnej części tej tak zwanej stosu. I mam zamiar go wyciągnąć celowo jako kwadrat. Tak to jest jak 32 bitów lub czterech bajtów. A jeśli to główną funkcją ma zmienną x o wartości 1 i ma zmienną y o wartości 2, to jest jak przy tej skrawek pamięci Głównym nadano przez eksploatacji System i podzielenie go tak, że pierwsza zmienna lokalna idzie tutaj, drugi idzie tutaj, i to jest to. Gdy główny wzywa Zamień, Zamień dostaje swój własny kawałek pamięci że uda nam się wyciągnąć tak od systemu operacyjnego a to będzie mieć swój na podstawie własnych zmienne lokalne na naszej realizacji wcześniej ze zmiennymi lokalnymi oraz b, które początkowo uzyskać wartości 1 i 2. Ale potem, jak tylko Zamień kod wykonywany, Lauren naprawdę Zamienia Dz.U. i mleka, co się dzieje? Cóż, to 2 staje się 1, to 1 staje się 2, i, przy okazji, jest zmienna temperatura, że ​​to jest użył tego cały czas, że w końcu odchodzi. Ale to nie ma znaczenia ile pracy to zrobić w tej linii of-- w tym miejscu pamięci, x i y są całkowicie nienaruszona. Więc musimy jakiś sposób daje Zamień i funkcje podoba Sekret dostęp, jeśli chcesz, aby Funkcje like-- w pamięci jak xi y. Warto więc przyjrzeć się Przykładem, który pomaga Zobaczmy, co dokładnie było dzieje się to cały czas. Mam zamiar iść do przodu i otworzyć Porównaj Zero. I mam zamiar zamknąć nasz debugger, zamierzam aby zamknąć ten straszny patrząc wiadomość sprawiedliwych, mówi, czekaj, jesteś w środku debugowania. Mam zamiar ukryć tę zakładkę tutaj po prostu wrócić do prostoty. Więc nie martw się, jeśli GDB ginie. To po prostu oznacza, że ​​program ma było zamknąć, umyślnie w tym przypadku, przeze mnie. A teraz porównajcie Zero to robi. Używam CS50 W standardowej biblioteki I / O. Mam główną funkcję, która pierwsza mówi, coś powiedzieć, i dostaje ciąg. Potem mówi, to jeszcze raz i dostaje inny ciąg. I zauważyć, że te dwa ciągi są nazywane S i T, odpowiednio. A teraz ten program, porównajcie Zero, jego celem w życiu, to ma mi powiedzieć, ja wpisać to samo? I tak wracam do jednego tygodnia. Używam równy równego operatora który to operator jakości. Nie operator przypisania, operator równości. Jestem po prostu porównując S i T. Więc rzeczywiście iść naprzód i to zrobić. I mam zamiar iść do przodu i dokonać porównania Zero. Mam zamiar zrobić ./comparezero. I zamierzam iść dalej i powiedzieć coś tak, zróbmy mama małymi literami i jak o mamie dużymi literami. I oczywiście piszę różne rzeczy. W porządku. To należy się spodziewać. Przyjrzyjmy się jeszcze raz. Za każdym razem robić małe litery, małe litery. To wygląda bardzo identyczne do mnie. Wchodzić. OK. Może to po prostu dziwne, ponieważ to nie podoba mój gramatyki. Więc zróbmy MOM kapitałowej, Kapitał MOM, identyczne. Różne rzeczy. Więc dlaczego tak jest? Cóż, co się naprawdę dzieje na pod maską tutaj? Więc wróćmy nad tu tylko na chwilę i zastanowić się, co GetString jest rzeczywiście robi. Podczas rozmowy telefonicznej getString, że to, że funkcja sami napisali i to w jakiś sposób staje się sekwencja znaków od użytkownika. I załóżmy, że pierwszy Czas zadzwonić getString, że daje mi kawał pamięci, która wygląda tak. A jeśli wpisane we wszystkich małych liter m-o-M-- a co idzie za nim? Wystarczy szybkie kontrola poprawności. Backslash zero. Wiemy to. I pamiętam, że graliśmy wokół nazwą Zamila w i kilka innych nazw kiedy Rob został tu w poszukiwaniu na to, co dzieje się wewnątrz pamięci. Tak, że historia jest dokładnie to samo. To co GetString wraca do mnie. Teraz moje kodu przed chwilą przechowywane wartość zwracana getString w zmiennej o nazwie s. A potem drugi raz nazwał go, jest zapisana w zmienną t. Więc jeśli pójdę tutaj, muszę wyciągnąć tego lokalnego zmienna-- a ja na ogół będzie narysować łańcuch jako just-- że będziesz Nazywamy to S-- jako placyku tutaj. A teraz, w jaki sposób mama somehow-- do środka tej zmiennej s? Cóż, musimy wrócić do pierwszych zasad tutaj. Co jest GetString rzeczywiście powrocie? Tak więc okazuje się, że M-O-M backslash zera, a każda liczba innych ciągów znaków w pamięci, jak Zamila i Rob i Andy lub jakichkolwiek innych, są oczywiście w naszym RAM lub pamięci komputera. A twój RAM ma like-- masz jakiś koncert pamięci RAM, dwa koncerty pamięci RAM, lub miliard lub dwa miliard bajtów, a może nawet więcej tych dni. Więc załóżmy, dla dzisiejszych potrzeb, że to nie ma znaczenia, w jaki sposób zliczyć je, ale możemy zaliczyć każdy z tych miliardów lub dwóch miliardów lub cztery miliard bajtów. I niech po prostu arbitralnie powiedzieć, że jest to pierwszy kęs, drugi kęs, trzeci, czwarty. Ja celowo nie używając zera dla dzisiaj, ale wrócimy do tego. Tak więc, innymi słowy, jeśli jest to raz pierwszy używam programu, Ja tylko się szczęście, a pierwszy ukąszenie jest w jednym miejscu, a następnie dwa potem trzy niż cztery. A jeśli trzymałem rysunek, numer skrzynki dwa miliardy byłoby sposobem tutaj. Więc co myślisz, a następnie, GetString rzeczywiście powraca? To nie jest powrót M-O-M ukośnik zera per se, ponieważ to wyraźnie Nie zmieści się w okno, że mam wyciągnąć. Co jeszcze może getString rzeczywistości wracać wszystkie te tygodnie? Odpowiedź jest na wyżywienie gdzieś tutaj. Nie można dopasować M-O-M ukośnik zerowy, więc co może mieć sens, a nie? Jeśli miał być super mądry, wprowadzenie na tak zwanej inżynierii kapelusza co można wrócić? Jaka jest najmniejsza ilość informacji można powrócić, że nadal pozwalają znaleźć M-O-M w pamięci? Tak? PUBLICZNOŚCI: Jeden. David J. MALAN: Jeden. I dlaczego jeden? PUBLICZNOŚCI: Bo to powiedzieć masz gdzie iść [niesłyszalne]. David J. MALAN: Dokładnie. Jestem po prostu będzie zwrócić adres napisu, że mam zdobyć. Adres w tym Sprawa jest lokalizacja jednego. Więc co tak naprawdę jest przechowywany w S-- i każda zmienna łańcuchowa więc far-- właśnie było adres tego łańcucha. Tymczasem, jeśli zadzwonię GetString drugi raz i ja wpisać dosłownie ten sam thing-- M-O-M z lowercase-- M-O-M a inny odwrotny ukośnik zero, a teraz może mój programu działa już od jakiegoś czasu, więc może to wynosi 10, to położenie 11, to jest 12, to 13. Komputery wykorzystujące inny Pamięć z jakiegokolwiek powodu. Co teraz idzie w moim sekundę Zmienna w moim programie t? 10. Dokładnie. I tak, gdy spojrzymy na Kod źródłowy tego programu gdzie jestem po prostu stara porównać dwie wartości, jest s równe równe t, co jest oczywista odpowiedź człowiekiem? Po prostu nie ma, ponieważ 1 nie równa się 10. I tak, na tym polega szansa dla nas naprawdę po prostu wrócić do znowu pierwszy Zasady i myśleć o tym, dobrze, co się dzieje pod maską? Rozmawialiśmy o bity i bajty i pamięci, ale to jest rzeczywiście przydatne do zrozumienia dlatego, gdy dzwonisz getString, nawet jeśli uważamy, że jest powrót M-O-M lub mamę ciąg lub Andy lub Zamila lub podobne, technicznie to jest po prostu powrót adres tego kawałka pamięci. Ale to jest OK. Bo skąd mam wiedzieć gdzie kończy się ciąg? Jeśli mam podawać tylko początek? Cóż, odwrotny ukośnik zero, prawda? Tylko w czasie liniowym mogę print drukować z def M-O-M. I jak tylko widzę ukośnik zero, nie obchodzi mnie, gdzie zacząłem, Wiem już niejawnie gdzie muszę kończyć. I tak oznacza dziś beginning-- i pozwól mi to zrobić znacznie, bo my przeszedł wiele problemów do uzyskać te tutaj szkolenia wheels-- tak dzisiaj kółka zacząć puścić i ujawnić przynajmniej: [APPLAUSE] To było warte podróży do systemu TARGET to rano, tak? Tak now-- jest, jak się okazuje na zewnątrz, nie ma czegoś takiego jak łańcuch. String nie istnieje. Jest to synonim, że jakie mieliśmy Wnętrze biblioteki CS50. Odtąd mamy zamiar zacząć dzwonić s oraz t nie struny, ale gwiazdek char. A gwiazda char że będziesz odciąć przed długo. Ale to znaczy że nawet jeśli nadal za pomocą getString teraz, technicznie powinienem być mówiąc gwiazdę char i gwiazdę char. I okazuje się, co to gwiazda będzie oznaczać coś zwany wskaźnik lub adres. A w rzeczywistości, teaser za to, co nas czeka jest to 20 sekund klip z naszym przyjaciel Nick Parlante w Stanford który jakiś czas temu, spędzić śmieszna ilość czasu, jak najlepsze, co mogę powiedzieć, w jego kuchnia lub jego piwnicy, co claymation wprowadzenie do świata postać o imieniu Binky z którymi będzie być wprowadzone następnym razem do wskaźników. Więc tutaj jest podgląd tego, co nadchodzi. [ODTWARZANIE] Hej, Binky. Obudź się. Nadszedł czas na wskaźnik zabawy. -Co to? Dowiedz się o wskazówki? Och, cukierek. [Zakończyć odtwarzanie] David J. MALAN: I po tej notatce, zobaczymy w środę. W porządku. Kto jest taniec? Chodź. Kto jest taniec? Chcesz, żebym się zaczęło? Wezmę to się zaczęło. Woooo! LAUREN: Słodka fantazja Mojżesz.