Głośnik 1: Witam wszystkich. Mamy zamiar zacząć. Myślę, że ludzie są nadal w toku być filtrowanie. Ale w interesie czasu, więc możemy Ci faceci z tutaj na czas, mamy zamiar rozpocząć. Tak więc zapraszamy do CS50 Quiz recenzji: 0. Dla tych z Was, którzy nie zdali sobie sprawę, jeszcze, masz pytanie w środę. Woo-hoo. Jeśli jeszcze nie rozpoczął studia lub nie wiedziałem, że ten jeszcze istnieje, Wcześniejsze testy i wszystkie informacje o quiz są na cs50.net/quizzes. Istnieje kilka bardzo dobrych rzeczy na nie, Wcześniejsze testy z ostatnich 10 lat, a także informacje o tym quizie i tematów które będą objęte. Więc zaczynajmy. Więc chłopaki mogą pamiętać, pierwszy dzień z klasy Dawida miał te lampy na. Więc w zasadzie wszystko, co wykracza na pod maską komputera jest wykonane w formacie binarnym. Binary oznacza to, co brzmi jak, 0 i 1 to. Posiada dwie wartości, które mogą być reprezentowane. Tak więc, podobnie jak w pierwszym dniu sekcji kiedy David włączone światła żarówki do reprezentowania na, lub 1, nasz komputer rozumie 0 jest binarny, jak i 1 jest, włączyć lub wyłączyć. Podstawy binarnych. Każde miejsce jest reprezentowany w bazie dwa. Więc dodać 2 do 0 do 1 do 2 aż do góry. Aby obliczyć, co jest twoje binarny dziesiętny, wystarczy postępować zgodnie z tego równania typu rzeczy. Jeśli masz 1 w jednym z tych miejsc, należy pomnożyć go przez co oprzeć to, dodaj go do góry i masz po przecinku. Tak to jest, jak liczyć do 5 w formacie binarnym. Podobnie jak to, co robiliśmy na Ostatnie zdjęcie, to jak byś stanowią od 1 do 5. Podobnie, tak jak można dodawać i odejmowanie w przecinku lub oparcie 10, lub naprawdę każda baza, można dodać na i odejmowanie w systemie binarnym. Dokładnie to, czego można się spodziewać po dodać dwa do góry, jeśli jest równa większej niż 1, nosisz 1, sprawiają, że 0, i czy dodanie w ten sposób, po prostu jak można się spodziewać z regularnym dziesiętny lub inny bazowej. Fajne. Tak jak mówiłem wcześniej, wszystko, przechodzi pod maską naszego komputera odbywa się w 0 i 1 to czy binarny. Jak więc wyrazić, na przykład, liter lub cyfr, lub znaków? A odpowiedź na to jest ASCII. ASCII jest mapowanie między znakami które normalnie zobaczyć w Język angielski jak jest, B, C jest, podkreślenia, myślniki i coś w tym stylu. I mapy, które do wartości ASCII. Wartość ASCII jest tylko numer, który może być rozumiane przez komputer. I tak jak można zrobić dodawanie i odejmowanie z numerami, możesz zrobić je z wartościami ASCII. Tak więc w tym przykładzie, jaki będzie to wydrukować? Tak, tak, tylko przestrzeń B C przestrzeń przestrzeń D. Gdzie moja mysz iść? Zauważyć można określić int na 65. A podczas drukowania, że ​​z pomocą procent C, będzie to interpretować, że jako znaków i wypisze A. Podobnie, można zadeklarować go jako char. A gdy go wydrukować z użyciem procent C, będzie to interpretować, że jako procent D. I tak jak można dodać Numer można dodawać znaki są Wartości ASCII, w tym przypadku. Więc trochę wskazówka dla wszystkich. 5, jako ciąg znaków, nie faktycznie równa 5. Więc jak możemy przekształcić łańcuch 5 z całkowitą 5? Jakieś pomysły? Tak. Więc jeśli mamy 5 jako ciąg, możemy odjąć 0. I że da nam 5. Podobnie, jeśli mamy 5 jako całkowitą, dodać, że do łańcucha 0. I to daje nam ciąg 5. Fajne. Teraz przypominam sobie z powrotem tam gdzie wykład jednego rozmawialiśmy o algorytmach. Jak więc naprawdę chcesz komputer robić ciekawe rzeczy? Wiesz, tylko dodawanie i odejmowanie numery i druk rzeczy obecnie nie jest że ekscytujące. Zwykle chcemy nasz komputer do wykonać jakiś algorytm. Coś nieco bardziej skomplikowane niż tylko prostej arytmetyki. Algorytm jest tylko zestaw krok po kroku z instrukcjami, jak wykonać pewne task-- tak jak przepis. Może pamiętasz pierwszy dzień Klasa, gdzie Dawid nam liczyć pokój ludzi i jak wiele osób były w pokoju. Możesz być używane do liczenia jeden po drugim. 1, 2, 3, 4. W tym przypadku algorytm czasu liniowego. Ale David przedstawił algorytm można policzyć ludzi w pokoju gdzie każdy wstaje, mówisz swoimi numer do innej osoby, należy dodać, że liczbę w górę, a jedna osoba siada. I powtórzyć. To jest jeden rodzaj algorytmu. Możemy analizować, jak efektywne an Algorytm oparty jest na to czas pracy. Ale porozmawiamy trochę Więcej o tym później. Więc wszystkie algorytmy mogą również być napisany w Pseudokod. Pseudokod jest tylko angielski jak Składnia do reprezentowania język programowania. Na przykład, jeśli chcemy zadać użytkownikowi odgadnąć mój ulubiony numer, my może mieć Pseudokod jako takiego. Uzyskaj użytkowników odgadnąć. Jeśli przypuszczenie jest poprawna, powiedz im, są poprawne, jeszcze powiedz im nie są one poprawne. I pseudokod jest sposób łatwo reprezentujących pomysł lub algorytm. Więc teraz może chcemy rzeczywiście napisać to w języku, że komputer mógłby zrozumienie. Więc możemy napisać nasz Pseudokod i interpretacji, że do kodu źródłowego. Do tej pory, należy stosować kod źródłowy do pewnej składni język programowania. I do tej pory, w CS50, mamy był używany głównie c. Więc może to być kod źródłowy C. Później, w trakcie, to noc przyjść w kontakt z innymi programowania w językach takich jak PHP. Lub jeśli nawet podjąć inne zajęcia, ci może zrobić, Java, Python, lub nawet OCML. Ale w naszym języku C programu, to jest jak możemy napisać kod źródłowy pseudokod, że algorytm Właśnie opisano wcześniej. Więc w jaki sposób komputer faktycznie Rozumiesz to? Tak jak mówiłem wcześniej, to tylko naprawdę rozumie zer i jedynek. Więc jak to się od źródła Kod do czegoś, co może być rozumieć? Cóż, mamy coś zwany kompilator. Jeśli pamiętacie widok większość swojego psets, miałeś jakiś program napisane w pliku kropka c. A następnie należy wpisać markę. Więc co się robi? Możesz wpisać markę skompilować Program ponieważ someone-- kto napisał swój zestaw p; prawdopodobnie David-- utworzony plik make. I to mówi się, aby wiedzieć, aby uruchomić kompilator, zwany dzyń, że wola następnie skompilować kod źródłowy do obiektu Kod, który jest zer i jedynek że komputer rozumie. Ale trochę później, pójdziemy więcej w głębokości około kompilatorów. Więc przypominam pset 0, where-- tak, masz pytanie? PUBLICZNOŚCI: [niesłyszalne]? 1 głośnik: Tak. Myślę, że rzeczywiście powinna być w trybie online. Tak. PUBLICZNOŚCI: Czy to jest jak [niesłyszalne]? Głośnik 1: Nie jest. Są na cs50.net/quizzes. PUBLICZNOŚCI: quizy Slash, slash 2013, slash 0, i po prostu klikać 2013 i quizy Quiz 0, przeglądu slajdów rozdział. 1 głośnik: Tak, więc jeśli chcecie, aby wyciągnij go i patrzeć na swoje własny komputer, to też dobrze. Powiedz to jeszcze raz. PUBLICZNOŚCI: [niesłyszalne]. 1 głośnik: Tak, [niesłyszalne] jest zmienna manekin. Och, tak? PUBLICZNOŚCI: [niesłyszalne]? Głośnik 1: Nie, strajki nie są na egzaminie. Niestety, jej pytanie było, było Strajki na egzaminie. I to nie jest. Więc pset 0, chłopaki powinni mieć wszystko wdrożone coś używając zera. I dowiedzieliśmy się podstawowe programowanie bloki przy użyciu podstaw. Warto więc spojrzeć na niektóre z tych bloków które składają się na program. Pierwszym z nich jest wyrażenie logiczne. Wyrażenia te są logiczne i 0-tych lub wszystko co ma dwie możliwe wartości. W tym przypadku, prawdziwe lub fałszywe, włączyć lub wyłączyć, i tak lub nie. Przykład prosty bardzo prosty program, który wykorzystuje Boolean Wyrażenie się tutaj. Tak aby do wyrażeń logicznych być przydatne, mamy operatorów logicznych. Są to napędy, które mogą być stosowane porównać pewne wartości. Więc mamy i czy nie równe, mniej niż lub równy lub większy niż równą lub mniejszą niż lub większe niż. Ale te podmioty nie są bardzo przydatne chyba, że ​​możemy połączyć je w warunki. Więc chłopaki mogą pamiętać od podstaw i od p określa, że ​​my miał warunki. Są one w istocie, jak widły w Logika programu, które wykonywana w zależności od tego, czy Warunek ten jest spełniony. Tak więc jednym z warunków, które mieliśmy używany wiele razy w tym kursie jest jeśli, jeszcze, jeśli, i warunki innego. Oto przykład, jak można użyć. Czy ktoś zna różnicę między tylko za pomocą instrukcji if wszystkich w dół wersetów if, else, wtedy i jeszcze łączy? Tak? PUBLICZNOŚCI: [niesłyszalne]. Głośnik 1: Dokładnie. Więc gdybym miał, jeśli w dół to sposób, nawet jeśli ten warunek zwrotu prawdziwe, to nadal testowanie kolejnych dwóch. Natomiast z innego-jeśli, w inny oświadczenie, jeśli jeden zwraca true, inni nie są testowane. Wszelkie pytania na ten temat? Fajne. Więc używać if-else o indziej oświadczenie, jeśli wiesz, że to może tylko jeden z tych przypadków. Wiemy więc, jeśli x jest mniejsze niż 0, to na pewno nie będzie większy niż 0. Następny, kolejny blok budynek że dowiedzieliśmy się pętle. Mamy trzy rodzaje pętli. Pętli, podczas pętli, i robić podczas pętli. I na ogół, kiedy siadasz do coś napisać, musisz się zdecydować który z trzech, którego chcesz użyć. Jak więc zdecydować, który z nich? Ogólnie używamy do pętli, jeśli wiemy, ile razy chcemy iteracji przez coś lub ile razy chcemy, aby wykonać zadanie. Używamy podczas pętli, jeśli potrzebujemy warunek, aby być prawdziwe, aby utrzymać funkcjonowanie. I używamy zrobić gdy bardzo podobne do jednocześnie, ale chcemy, aby nasz kod do uruchomienia w co najmniej jeden raz. Więc zrobić, gdy, co jest na wolę zawsze uruchamiać co najmniej jeden raz. Mając na uwadze, ze czas, to może nie działać w ogóle, jeśli warunek nie jest spełniony. Wszelkie pytania z tym? Tak więc struktura pętli. Macie wszystko widziałem tego. Zainicjować go. Masz jakiś warunek. Tak więc, na przykład, możemy zainicjować jak dla i jest równa 0. i mniej niż 10. A i ++. Bardzo prosty, że zrobiliśmy. Do pętli while, podobnie, masz mieć jakiś inicjalizacji jakiś stan, i jakaś aktualizacja. Więc możemy zrealizować naszej pętli również w pętli przy użyciu tego produktu. I podobnie z zadań podczas pętli, może mamy jakiś inicjalizacji, wykonać coś, zaktualizować go i następnie sprawdzić stan. Więc teraz funkcje. Stawiamy wszystko razem. Może chcemy napisać jakiś rodzaj funkcji. Wspólna funkcja to polubisz już, to głównym. Głównym jest funkcja. Ma typu zwrot, int. Ma nazwę funkcji, główne. I ma argumenty, argc i argv. Tak właśnie jest główną funkcją. Inne funkcje mogą już stosowane, printf-- printf jest function-- GetInt, toupper. Ale to się stało, że był realizowany dla nas jakieś biblioteki. Jeśli wy pamiętać w tym Ta biblioteka CS50.h lub Standard I / O bibliotece. Tak, pytanie? PUBLICZNOŚCI: Czy główny prostu nieodłączną c? Czy to po prostu rodzaj [niesłyszalne]? Głośnik 1: pytanie jeśli głównym jest nieodłączną c. I tak, wszystkie funkcje mają główną funkcję. Jest to rodzaj niezbędne do komputera wiedzieć, gdzie zacząć działania kodu. PUBLICZNOŚCI: więc nie [niesłyszalne]? 1 głośnik: Nie Jeszcze jakieś pytania? Fajne. Więc jak można użyć funkcji , który jest przeznaczony dla Ciebie, możesz również wyraź swoją funkcję. To jest funkcja, że ​​ktoś może Napisałem do obliczenia objętości o Q, na przykład. Jest to rodzaj powrotu tutaj, w tym przypadku int, nasza nazwa funkcji q i nasze lista parametrów. I pamiętać, że trzeba zapisać dane Typ parametru, który ma zostać korzystać albo funkcja nie wiedzieć, jakiego rodzaju Parametr należy akceptować. Tak więc, w tym przypadku, chcemy całkowitą od naszego wejścia. Więc czemu możemy użyć funkcji? Przede wszystkim, doskonały dla organizacji. Pomagają zerwać kod do więcej zorganizowane kawałki i zrobić czytelności. Uproszczenie. To jest dobre dla projektu. Kiedy czytasz kawałek kodu , a głównym zadaniem jest naprawdę, bardzo długo, to może być trudniej Powodem tego, co się dzieje. Więc jeśli rozbicie go na funkcje, może to być łatwiejsze do odczytania. I ponowne-zdolności. Jeśli masz kawałek kodu, który to jest nazwie lub uruchamiać wiele razy, zamiast przepisywania, że ​​kod 10 razy w swojej głównej funkcji, to polubisz chce go ponownie. A następnie za każdym razem trzeba użyć, że kawałek kodu, wywołania funkcji. Więc teraz, jeśli pamiętamy, z powrotem do zera, rozmawialiśmy także o kilku koncepcjach, z których jedna jest gwintów. Gwint jest pojęcie wielokrotności sekwencje kodu wykonanie w tym samym czasie. Więc wracam do pierwszego dnia w którym Dawid Ci ludzie liczą się liczby osób w pokoju. Zasadniczo, co się dzieje na to wszystko z was byli uruchomione osobne wątki. I te wątki razem przybywało dostać jakąś odpowiedź. Podobnie w Scratch, gdy masz liczne duchy, to polubisz mieć kota i psa. I będą one jednocześnie prowadzenie własnych skryptów. To jest przykład gwintów. Oraz inne, które to pojęcie wprowadzony w początku było wydarzenia. I wydarzenia są, gdy wiele części kod komunikować się ze sobą. Z początku, kiedy to był używany Kontrola transmisji i Kiedy Otrzymuj bloków. A także, w Problem Zestaw 4, widzieliśmy Trochę wydarzeń, jak również. Wy mogły stosować Biblioteka Gevent. I nie było funkcji waitForClick , w którym czekali dla użytkownika do kliknięcia. I click, w tym przypadku, będzie Impreza i czekać na kliknięcie jest Twój obsługi zdarzeń. A także, w całej wyświetlanie psets i pracy na swoim psets, ty mogła wchodzić w kontakt z niektóre z tych poleceń. To jest to, co wpisane w swoje okno terminalu lub cokolwiek okno , który pokazuje się na g edycję, zasadniczo, nawigacja komputer. Tak na przykład, LS wymienia Zawartość katalogu. Dodać do katalogu tworzy nowy folder. CD, zmiana katalogu. RM, usunąć, usuwa plik lub jakiś katalog. A następnie usunąć katalog usuwa katalog. PUBLICZNOŚCI: [niesłyszalne]? 1 głośnik: Tak, na pewno. Niestety, pytanie czy ty sugeruje wprowadzenie tego na ściągawki. To może pomóc. Jeśli masz pokój, można umieścić go na. To też po prostu na ogół wystarczająco dobre pamiętać, bo gdy go używać Może chcesz po prostu ma to na pamięć. Że twoje życie będzie o wiele łatwiej. Czy mogę odpowiedzieć na to pytanie? Więc teraz, rozmawialiśmy trochę krótko o bibliotekach. Ale dwa główne z nich, że byli używając tej pory są w trakcie standard I / O i CS50. Jakie rzeczy są wliczone w standardowej biblioteki I / O? Tak, do tej pory używaliśmy printf. W CS50, używaliśmy GetInt i GetString. I zdarza się typ danych ciąg również należy zgłaszać w tej bibliotece CS50. Porozmawiamy trochę bardziej w głębokości około jak biblioteki i jak one działają współdziałać z resztą kodu. Ale to są dwa główne z nich, że które wchodzą w kontakt z dotychczasowego Oczywiście. Typy. Są to warto pamiętać, jak wiele każdy rodzaj jest reprezentowany przez lub jak wiele bajtów każdy typu requires-- int, 4 bajty; char, 1 bajt. Pływak jest 4 bajty. Co to jest podwójne? PUBLICZNOŚCI: [niesłyszalne]. 1 głośnik: Tak, tak, pływak ale dwukrotnie rozmiar. Co o długo? PUBLICZNOŚCI: [niesłyszalne]. Głośnik 1: OK. Co to jest długo? PUBLICZNOŚCI: [niesłyszalne]. 1 głośnik: Tak, double int. Tak. PUBLICZNOŚCI: [niesłyszalne]. Głośnik 1: Długi [niesłyszalne]. A potem długo, długo to dwukrotnie. PUBLICZNOŚCI: Nie, nie. Długo jest tylko int. To zależy od architektury przed [niesłyszalne] i int mają ten sam rozmiar. [Niesłyszalne]. 1 głośnik: Tak długo i int są takie same. A potem długo, długo jest podwójnie int. Fajne. A następnie, jaki jest ostatni typ? PUBLICZNOŚCI: Pointer. 1 głośnik: Tak, tak, my nauczyliśmy Trochę o wskazówki. I niezależnie od tego, co jest wskaźnikiem wskazując to-- to może być gwiazdą char lub int star-- to zawsze 4 bajty dla wskaźnika. Pytania o to? Tak? PUBLICZNOŚCI: [niesłyszalne]? 1 głośnik: Tak długo, i int są sama w tym urządzeniu CS50. PUBLICZNOŚCI: urządzenia są całkowicie zamiennie. 1 głośnik: Tak. Więc potem długo długo podwójne int. PUBLICZNOŚCI: To jest 32-bitowy? Głośnik 1: 32 bit, tak. PUBLICZNOŚCI: Tak [niesłyszalne]? 1 głośnik: Tak, jeśli nie wyraźnie powiedzieć, ci należy przyjąć 32 bit. PUBLICZNOŚCI: To coś powiedzieć jak przy założeniu, Architektura podobne urządzenia. Dla 64 bit, tylko rzeczy, które Zmiany są długościami i wskaźnikami. Oboje [niesłyszalne]. 1 głośnik: Tak? PUBLICZNOŚCI: Pytanie. Tak więc w jednym z quizów praktyce prosi o unsigned int. Tak, jak by to określić z int [niesłyszalne]? Głośnik 1: niepodpisany w to również 4 bajty. Ale to, co jest inne o podpisane int i int? PUBLICZNOŚCI: [niesłyszalne]. Głośnik 1: Prawo. Można reprezentować wartości ujemne. Ale jak to zrobić? PUBLICZNOŚCI: [niesłyszalne]. 1 głośnik: Tak, to oszczędza 1 nieco do reprezentowania znak. Podpisał jeden bit, który ma reprezentuje znak. I właśnie to wszystko niepodpisany pozytywy. PUBLICZNOŚCI: OK. Więc można powiedzieć, że jest dwukrotnie dwukrotnie większy od pływaka? Głośnik 1: Pokój jest dwa razy rozmiar pływaka, tak. PUBLICZNOŚCI: W jaki sposób wskaźnik na długo, długo [niesłyszalne]? Głośnik 1: Więc pytanie jest w jaki sposób wskaźnik na długi long-- Jak to jest, gdy tylko cztery bajty Dawno jej 8 bajtów. Więc pamiętaj, co jest wskaźnikiem, zasadniczo w wartości bardzo bazowej. PUBLICZNOŚCI: [niesłyszalne]. 1 głośnik: Tak, tak, wskaźnik jest po prostu pamięć. Więc to nie ma znaczenia, jak dużo miejsca że wskaźnik wskazuje. Potrzebuje tylko 4 bajty, aby śledzić z tego miejsca pamięci. Jeszcze jakieś pytania? Fajne. Więc ostatnią rzeczą, jaką mają jest standardowe wyjście. Należy używać ich częściej na tyle, że można zapamiętać. Ale to jest, gdy używamy printf, na przykład. I mamy te symbole zastępcze, które nazywano kody Format. Więc procent c char, procent i do int, i możemy również użyć procent d. To samo. Jednakże, na ogół, że w CS50 spróbuj użyć procent i. Procent f dla pływaka. Procent ld długo i długo procent s dla łańcucha. Podobnie, używaliśmy kilka te sekwencje. Na przykład, backslash n dla nowej linii. To jest tylko dla kiedy formatowanie Twój kod do druku f. Tak? PUBLICZNOŚCI: Co to jest procent D? Głośnik 1: Więc pytanie jest to, co jest procent D? Procent d jest za wskazówki. Procent di procent i są takie same. PUBLICZNOŚCI: Jaka jest różnica między backslash n i backslash r? Głośnik 1: Więc pytanie jest, co jest Różnica między n i luzu luz r? Myślę backslash r jest-- PUBLICZNOŚCI: Więc po prostu oznacza, lewy ukośnik r powraca na początek linii bez faktycznie będzie nowej linii. Więc jeśli wydrukować backslash r i wróć do początku wiersza następnie wydrukować więcej rzeczy, zastąpisz rzeczy, które już na [Niesłyszalne]. Mając na uwadze, n rzeczywiście idzie do nowego linia i idzie do [niesłyszalne]. Głośnik 1: No, jakieś inne pytania? Wszystko w porządku. Zamierzam oddać go do Dana, który będzie w dalszym ciągu. [Aplauz] DAN: W porządku. Więc będę mówić o kolejnym szeroko Zakres pomysłów z klasy, które są Przedstawiciel tydzień około dwa i Początek trzy tygodnie rozpoczynając od z odlewu, który jest po prostu sposobem na leczenia wartość określonego typu, gdy Wartość innego typu. Więc możemy to zrobić ze znakami na ints, unosi się wskazówki i long long podwoić. Wszystko to może być stosowane jako sposoby leczenia jakąś wartość liczbową minus char, jak niektóre inne wartość numeryczna. Więc są pewne problemy z tym, z Oczywiście, która pojawia się, gdy rzucisz rzeczy, jak wypłyną na wskazówki. Więc to jest trochę dziwne. Mamy pływak, który jest 1.31. Mnożymy go przez 10000. A potem wydrukować go jako int. Co to wyjście? 10000 razy 1,31. Więc 13000, jest to, że przypuszczenie? PUBLICZNOŚCI: Myślę, że to 10,000. DAN: Więc jestem mnożąc go przez 10000 zanim ja oddając go. PUBLICZNOŚCI: Och. Nie będzie tam jeden 9 0 i niektóre numery? DAN: Możesz mieć jakieś dziwne cyfry. Więc dobrze, że to 1,3 10000. Więc to 13,000. I ten dodatkowy weird-- PUBLICZNOŚCI: 13100. DAN: 13100. Dziękuję, Rob. I ten dodatkowy weirdness-- to 9,9-- to tylko dlatego, że tego castingu skończyło się zaokrąglenie w dół, gdzie nie powinien mieć. Tak. PUBLICZNOŚCI: odlew dzieje po cokolwiek innego? DAN: Tak, bo mam to w druku, to Czy to mnożenie przed nim Czy to odlew. PUBLICZNOŚCI: [niesłyszalne]. DAN: Myślę, że to rzucić pierwszy, Tak, co byłoby 10000. Coś jeszcze? Fajne. Więc to jest 13099. Dlaczego tak się dzieje? Nieścisłości. Pływaki nie są doskonałe. Mogą reprezentować tylko numery do pewna liczba cyfr znaczących. Jeśli więc wydrukować sig na 8 figi ten pływak, mamy coś w rodzaju brzydki patrząc numer. A to dlatego, że nie można dokładnie 1.31 reprezentowana przez prosty Uprawnienia z dwóch w urządzeniu. Tak kończy się przy najbliżej przypuszczam, który kończy się jest trochę niski. Ma sens? OK. Teraz włącza się inny sposób robi instrukcje warunkowe, gdzie wszystkie dbamy o to pojedyncza zmienna. Zatem w tym szczególnym przykładzie mamy uzyskiwanie całkowitą od użytkownika. A następnie patrzymy na co to liczba całkowita jest. Przypuszczalnie jest to liczba od jednego do czterech. To, co mamy z prośbą o. Więc zrobić przełącznik nazwa zmiennej. Następnie skonfigurować przypadków możliwe wartości, to może być. Więc jednym przypadku, powiedzieć, że jest niski. I wtedy złamać się wydostać stanu przełącznika, nie poddawać się. W następnym case-- więc sprawa dwa i sprawa three-- jeśli jest to tylko przypadek dwa spada do Pierwsza linia kodu widzi, jak z przypadku trzy, aż widzi przerwę. Więc powód masz sprawę jeden z drukuj tylko dlatego, że jest niski tu mamy tę przerwę. Gdybym, powiedzmy, zignorował ten break-- gdybym rzucił ten breakaway-- by drukować na niskim poziomie i wówczas byłoby wydrukować środku, a następnie to przełamać. Więc przerwy są ważną częścią od warunków i przełączyć powinny być. Wszelkie sprawy, które nie są wyraźnie określone są obsługiwane przez domyślne Sprawa w przełączniku i powinny być oddane. PUBLICZNOŚCI: Tak 1, 2, 3, i 4 będzie n? DAN: Wartości N może być. Tak. Tak? PUBLICZNOŚCI: Więc kiedy masz że [niesłyszalne]? DAN: Będziesz drukować niskie, a następnie to wydrukować w srodku, i potem to przełamać. PUBLICZNOŚCI: Dlaczego to wydrukować średnim, jeśli [niesłyszalne]? DAN: Więc wszystko w ramach postępowania przed przerwa podlega. Więc sprawa jest pod jednym przypadku druku jeden, jak to jest po druku. Tak? PUBLICZNOŚCI: [niesłyszalne]? DAN: Więc ten numer jest po prostu szczególności wartość, że ta zmienna może, prawda? Czy to ma sens? Tak. PUBLICZNOŚCI: [niesłyszalne]? DAN: Tak, by drukować dwie sprawy średnim, a następnie złamać. PUBLICZNOŚCI: [niesłyszalne]? DAN: Myślę, że każdy? Jakie inne typy danych można przełączyć? PUBLICZNOŚCI: Można przełączać w stosunku do wszelkich typów danych. Ale to tylko oznacza niczego na znaki i ints i takie tam, bo jeśli wskaźnik przełączania że naprawdę nie ma sensu, przełączania obciążeń, jeśli nawet niech to zrobić, ponieważ zmiennoprzecinkowych precyzji, nie bardzo byłoby chcesz to zrobić tak. Tak bardzo dużo, a zaledwie ints znaki i takie tam. DAN: Tak, to jest, gdy masz wyraźne Wartości, które wiesz, myślę, że może być że przełącznik jest rzeczywiście użyteczne. Dobre? OK. Zakres to zakres, który oświadczył, Zmienna obejmuje. Tak więc w tym małym fragmencie kodu mam, byłoby pełne błędów. A powodem jest to int i oświadczył, I w ramach tego na pętli. A potem staram się odwoływać, że i na zewnątrz, że dla zakresu pętli. Więc w zasadzie, można myśleć o zakresie jak wszystko, co można zadeklarować z wewnątrz zestawu klamrach tylko istnieje w tych klamrach. A jeśli spróbujesz użyć tej zmiennej poza tymi klamrach, będziesz pojawia się błąd od kompilatora. Tak? PUBLICZNOŚCI: Więc ten nie działa? DAN: To nie działa tak. Struny. Ciąg char *. Są dokładnie takie same. Oni są po prostu wskaźnikami do znaków. I wszystkie łańcuchy, które masz powinny zakończyć z backslash zerowej, która jest po prostu Konwencja c. To się nazywa NULL terminatora. I NULL-- Kapitał N, kapitał U, kapitał L, kapitał ja-- nie jest taki sam, jak NULL terminatora. To jest wskazówka. To jest znak. Są one bardzo różne. Pamiętam. To będzie na quizie, prawdopodobnie. Nie widziałem w quizie. Tak? PUBLICZNOŚCI: Tak NULL jest, powiedzmy, wskaźnik? DAN: Tak. PUBLICZNOŚCI: Co robi [niesłyszalne]? DAN: Jeśli, powiedzmy, malloc jest wywoływana, gdy ci nie ma wystarczającej ilości pamięci, aby uzyskać niezależnie od wielkości prosisz, malloc zwróci NULL. To jest, w zasadzie, gdy funkcja jest powinien powrócić wskaźnik, można należy sprawdzić na NULL, ponieważ NULL jest całkiem dobre- to, rodzaj, wartość śmieci. To w miarę zera wskaźniki iść. Zawsze, gdy wywołanie funkcji, która zwraca wskaźnik. Będziesz chcą sprawdzić się pewien, że ten wskaźnik nie jest NULL ponieważ NULL jest bardzo powszechne. To coś w rodzaju powrotu śmieci. Więc jeśli coś nie poszło dobrze, tylko zwróci NULL zamiast. PUBLICZNOŚCI: [niesłyszalne]? DAN: Tak, i to jest to. PUBLICZNOŚCI: [niesłyszalne]? DAN: Zaklęcie to jak to. To terminator NULL. To małe litery N-U-L-L, jeśli jesteś pisowni go. PUBLICZNOŚCI: A ja po prostu poszedłem powrotem i przetestowane. A jeśli spróbujesz umieścić zmiennoprzecinkowych wartość do przełącznika, to będzie krzyczeć na ciebie mówiąc, stwierdzenie wymaga wyrażenia z całkowitą typu. DAN: Proszę bardzo. Ale tak, co znowu było pytanie? PUBLICZNOŚCI: [niesłyszalne]? DAN: Więc kapitał N, kapitał U, kapitał L, L jest kapitał rzeczywisty c rzeczą. Jest i będzie wskaźnik NULL traktować tylko jako takie. Że nigdy nie spróbować i pisowni NULL i widać żadnych znaków inny sposób niż ten. Tak? PUBLICZNOŚCI: Więc wracając do char max lub coś w notatkach, prawda uosabiają samą funkcję jako [niesłyszalne]? PUBLICZNOŚCI: Więc to dotyczy powrót char max z getchar, lub co to jest? PUBLICZNOŚCI: Tak. PUBLICZNOŚCI: Tak, tak ogólnie termin dla tych wszystkich rzeczy są wartości wskaźnikowe. Tak jak powrót int max od GetInt i char max z getchar, to powinien być jak, dobrze, jeśli te rzeczy wracają do nas, coś poszło nie tak. Dla wskaźników, po prostu zdarzy się, że Wartość ta, że ​​każdy wartownik Zgadza się. I to jest rzecz, powrót , gdy coś pójdzie nie tak. Tak char max co używamy reprezentować coś jak NULL lub getchar. PUBLICZNOŚCI: Więc jeśli badania getchar, można po prostu umieścić NULL? Czy to coś zmienia? DAN: Nie można po prostu sprawdzić NULL. Trzeba by sprawdzić char max bo Wartość zwracana z funkcji jest nie charakter wskaźnika. Tak? PUBLICZNOŚCI: To pytanie zadaje na długość łańcucha. Robi to na znak null? DAN: Nie I to jest rzeczywiście, jak długość ciągu że ma zaprzestać ponieważ przechodzi Twoja tablica znaków, aż widzi znak NULL. A potem to jak wszyscy Dobra, skończyłem. PUBLICZNOŚCI: [niesłyszalne] pięć? DAN: Witaj będzie pięć. Tak. Więc tablice są ciągłe bloki pamięci. Mają natychmiastowy dostęp mówiąc Nazwa tablicy, a następnie, w nawiasach szelki, niezależnie Indeks chcesz iść do, oni indeksowane od zera przez długość tablicy minus 1. A oni zadeklarowane przez typ rzeczą, którą przechowujemy w Tablica, nazwa tablicy, a następnie bez względu na rozmiar jest z tej tablicy. Więc to jest tablica char długości sześć, że ma następujące wartości. Tak? PUBLICZNOŚCI: [niesłyszalne]? DAN: Tak. PUBLICZNOŚCI: [niesłyszalne]? DAN: Jeśli masz to, co się dzieje do tablicy już. Tak można określić to, zamiast jak powiedzmy, char, bez względu na nazwę swojego tablica jest puste nawiasy równa kręcone przygotuj H przecinek przecinek L E L przecinek przecinkami O przecinek znak null i nawias klamrowy. , Który również działa jako deklaracja. PUBLICZNOŚCI: [niesłyszalne]? DAN: Wtedy musisz mieć rozmiar już. PUBLICZNOŚCI: [niesłyszalne]? DAN: Tak. W porządku. Argumenty wiersza poleceń są sposobem uzyskanie danych od użytkownika, co argumenty do głównej. Głównym przyjmuje dwa argumenty. Liczba argumentów, który jest przeszedł wzdłuż linii poleceń i Ilustracja ciąg lub ciąg tablicy wszystkich argumentów. Tak więc, jeśli, na przykład, o nazwie funkcji, takich jak kropka z 1 miejsca, 2 miejsca, trzy, argc będzie 4. I argv 0 będzie kropka z. Argv1 wynosi 1. argv2 będzie 2. argv3 byłoby 3, w tym konkretnym przypadku. Tak? PUBLICZNOŚCI: [niesłyszalne]? DAN: ostatni element w tablicy bo tablica jest długość argc Plus jeden z argB, ostatni element jest wskaźnikiem NULL. To argc Plus 1. Tak więc w przypadku, że po prostu powiedział, to będzie argv 0 jest kropka na zewnątrz. argv 1 to 1. argv2 to 2. argv 3 3. argv 4, który jest większy niż argc będzie NULL. I to jest wskaźnik NULL. Tak. A to dlatego, że łańcuch jest gwiazdkowy char jest wskaźnik. Musi więc być tego samego typu. Tak? PUBLICZNOŚCI: Dwa pytania. Tak jeden, jaka jest różnica między to i GetString inne niż jeden typ w silniku użytkownika? A dwa, to jest przechowywane w Twoja ostatnia pamięć? Więc jak, GetString byłoby być [niesłyszalne]? DAN: Gdzie to jest zapisane? Nie wiem, gdzie jest przechowywany. PUBLICZNOŚCI: Tak, rzeczywiście, wiesz, jak każdy funkcjonować nazywasz to argumenty przechowywane na stosie? Więc argc i argv są argumenty do głównego i są w stos, czy naprawdę tuż powyżej, co myślisz, jak początek stosu. Jaka była druga część pytania? PUBLICZNOŚCI: Więc co jest [niesłyszalne]? DAN: Tak, to jest po prostu inny sposób uzyskiwania danych od użytkownika. Ten jest nieco bardziej wydajny i to bardziej poręczne dla skryptów bo ciebie może po prostu przekazywać argumenty do głównego Funkcja zamiast czekać dla użytkowników, jeśli nie ma żadnych użytkowników. PUBLICZNOŚCI: I tak, dostać ciągi byłby [niesłyszalne]. To przechowywać rzeczy potrzebujesz. DAN: Tak? PUBLICZNOŚCI: [niesłyszalne]? DAN: Tak, argv 0 obejmuje zawsze kropka slash z wywołania funkcji. Tak? PUBLICZNOŚCI: [niesłyszalne]? DAN Tak każdy z argumentów są zakończył się w charakter, ponieważ NULL są ciągami. PUBLICZNOŚCI: [niesłyszalne]? DAN: Tak, argv argc jest wskaźnikiem NULL. PUBLICZNOŚCI: [niesłyszalne]? DAN: O tak. Tak, przepraszam. PUBLICZNOŚCI: Tak [niesłyszalne]? DAN: Więc pytanie jest, jeśli miał linia poleceń kropka slash kropkę z 1, 2, byłoby liczba linii poleceń Argumenty są dwa lub trzy byłoby? PUBLICZNOŚCI: Myślę, że tak nie jest znaczenia. Staram się powiedzieć, oh, nie przechodzą wszelkie argumenty wiersza poleceń, gdy Oczywiście, o nazwie funkcji. Więc staram się wokalnie wykluczyć Funkcja z wiersza poleceń argumenty, nawet jeśli jest to zawarte w argv. DAN: Ale czy to na test-- yeah--, a także, jeśli coś powiedzieć jak argc jest równe 3, jesteś w bezpiecznej sytuacji. Tak? PUBLICZNOŚCI: [niesłyszalne]? DAN: Myślę, że jeśli zamiast nazywać to w nawiasach argv argC i smyczkowych ale zachowali te same rodzaje i właśnie dzwonił im coś innego, jak oraz b, to jeszcze działa? I to nadal działa, byś tylko-- Zamiast stosowania argc-- chcesz używać i b. Tak? PUBLICZNOŚCI: [niesłyszalne]? DAN: Więc jest pytanie GetString będzie przechowywać pamięć na stercie bo GetString jest char *. Przechowuje pamięć na stercie, ponieważ wzywa teraz malloc ciągu faktyczna Realizacja getString. Dobra, dalej. Bezpieczeństwo. Więc być naprawdę bezpieczne, nie można powoływać się na jeden i nie można pozwolić dostęp do dowolnego jednego swoich danych, dlatego każdy buduje swoje maszyny, własne systemy operacyjne, wszystkie ich programy od podstaw, i oczywiście nie podłączać do innych urządzeń za pośrednictwem Internetu. Tak więc komputery są niepewne. Oni naprawdę są. Musimy ufać innym ludziom. I idea bezpieczeństwa jest to, że jesteś próbując ograniczać ilość zaufanie, że trzeba. , A jednym ze sposobów to zrobić jest przez kryptografii. Kryptografia jest, zasadniczo, mamy tajemnic. Czasami musimy przejść nasze tajemnice razem przez, powiedzmy, internet lub innych rzeczy. I nie chcemy ludzi poznać te tajemnice. Więc szyfrować nasze sekrety w sposób Mamy nadzieję, że nikt nie może dowiedzieć się. Więc used-- poprzez trakcie tego class-- rzeczy, jak szyfr Cezara i [Niesłyszalne], które są bardzo, bardzo niezabezpieczone sposoby szyfrowania rzeczy. Są proste, aby dowiedzieć się, co oni i jakie są twoje sekrety są. Prawdziwy świat zużywa znacznie więcej skomplikowane systemy szyfrowania. I nie będzie w o wiele więcej niż to. Debugowanie. GDB jest najlepszy. Idę podkreślić to jeszcze raz. Używać GDB cały czas każdy czas masz problem. Polecenia, które są użyteczne są GDB złamać, które można przejść albo linię Numer, nazwa funkcji, w zasadzie gdzie w kodzie chcesz zatrzymać, i być w stanie przejąć kontrolę. Drukuj trwa zmienną i drukuje cokolwiek to jest, że zmienna punkt w swoim wykonaniu. Następny przenosi swoje wykonanie po jednym kroku. I krok kroki wewnątrz funkcji w swoim wykonaniu. Inne rzeczy są prowadzone, co jest, jak faktycznie uruchomić kod. Nadal podejmuje wszelkie kroki niezbędne aby dostać się do następnego punktu przerwania. I wiele, wiele innych. Szukać ich. Są świetne. Tak? PUBLICZNOŚCI: [niesłyszalne]? DAN: Tak, co jest debugger. Więc debugger to program, który umożliwia debugowanie programu. To nie jest program, który wyszukuje błędy w Ci jednak, że byłoby świetnie. I ostatnio dla mnie to jest wyszukiwanie. Więc rodzajów wyszukiwania, które rozmawialiśmy informacje w tej klasie są wyszukiwanie liniowe, która jest po prostu, że można patrzeć przez każdego element przestrzeni poszukiwań jeden elementem w czasie, aż znajdziesz co szukasz lub aż do koniec swojej przestrzeni poszukiwań, w którym wskazać można powiedzieć, że nie można znaleźć Element, który szukasz. I to trwa w najlepsze stałego czasu, co 0 o 1 i w najgorszym liniowego Czas, który wynosi 0 n. Przeszukiwanie binarne, które musi Elementy podłe. Idziesz do połowy swoich elementów, sprawdzić, czy element szukasz jest większa lub mniejsza niż element że jesteś w środku. Jest to większy, można powiedzieć, że dno z wyszukiwania przestrzeń jest Twój Obecna lokalizacja, w środku, i ponownie uruchomić proces. Jeśli jest to mniejsza, wyglądasz powiedzieć że do-- Tak, o co chodzi? PUBLICZNOŚCI: [niesłyszalne]? DAN: Tak. Każdy rodzaj sortowania, które zostało prowadzone w Klasa jest uczciwa gra w badaniu. [Śmiech] DAN: A fakt, że nie mieli zrobić to za zestaw problemów, to sprawiedliwe gry do testów. PUBLICZNOŚCI: Czy możemy przejść nad nim jak to-- DAN: To będzie już koniec. Głośnik 2: Kod rzeczywisty dla [Niesłyszalne] jest study.cs50.net. Więc jeśli spojrzeć na problem praktyce w stronę scalania sortowania study.cs50.net istnieje kod wykonawcze do scalania rodzaju. Więc nie masz do wykonania to się dzisiaj. Ale upewnij się, że rozumiesz to raczej niż tylko zapamiętanie go. PUBLICZNOŚCI: [niesłyszalne]? Głośnik 2: strona seryjnej sortowania na study.cs50.net, jest praktyką Problem, który po kliknięciu przez Problem, na samym końcu jest Rozwiązanie, które jest scalanie implementacja sortowania. Ale upewnij się, że rozumiem zamiast po prostu go na pamięć lub kopiując go. PUBLICZNOŚCI: I całkowicie poprawny Problem do egzaminu będzie coś tu jest lista. Co ta lista wyglądać po jeden etap pozycje rodzaju lub wstawiania sortowania lub cokolwiek. Jeden pełny iteracji listy. Więc nawet jeśli nie kończy się konieczności Kod do niego, trzeba go zrozumieć wystarczy wiedzieć, jak to się dzieje do modyfikacji tej tablicy. DAN: To jest to dla mnie. [Aplauz] LUCAS: Hej wszystkim. Nazywam się Lucas. Mam zamiar porozmawiać o rekursji, wszystko sortuje, że nauczyliśmy się i Trochę wszystkich wskaźników. OK? Więc przede wszystkim, rekurencja. Co to znaczy, że Funkcja rekurencyjna? PUBLICZNOŚCI: nazywa siebie. LUCAS: OK, nazywa się tak. Tak jak ten obraz, na przykład. To tak jak na zdjęciu w środku o obrazie i tak dalej. Tak na przykład, można have-- jako Dan który mówił o poszukiwaniu binarnym. Jednym ze sposobów, w którym binarne wyszukiwania jest rekurencyjna jest fakt, że jesteś próbuje znaleźć numer. Więc idź do środka. A następnie sprawdzić, czy numery w lewo i w prawo. A następnie, jeśli okaże się że numer jest będzie po lewej stronie, to samo coś jak robi wyszukiwanie jeszcze raz, ale tylko po lewej stronie na liście. Tak to jest, jak się wydaje jak to jest rekurencyjna. To dlatego macie rekurencyjna roztwór do seryjnej rodzaju. OK, więc tutaj jest przykład. Więc powiedzmy, że chcę, aby wybrać wszystkie numery od 1 do n. Mogę zrozumieć, że suma n liczba n jest n Plus minus 1 do 1. Ale potem, jeśli patrzę na n minus 1 plus n minus 2 plus 1, to samo coś jak numery podsumowujących do n minus 1. Więc mogę powiedzieć, sumę równą sumie równa n plus suma n minus 1. Czy to ma sens? I ja również miałby coś innego nazwie bazowym, który jest suma liczb do zero będzie wynosić zero. Tak szybko, jak dostać się do liczby zero, przestać liczyć. Czy to ma sens? Więc oto przykład jak Mogę realizować to. Więc mam tę funkcję w niektórych. Że bierze całkowitą n. Więc ja najpierw sprawdzić, czy n jest mniejsza lub równa zeru. Więc jeśli jest to mniejsza lub równa zeru, to powrócić do zera, co jest naszym bazowym. W przeciwnym razie, można po prostu wrócić n Plus Suma z liczby jeden do jednego n minus. Ma sens? OK. Więc oto jak to wygląda. Masz sumę 2 równa 2 plus suma 1. A niektórzy z 1 jest 1 plus Suma 0, który wynosi 0. Ma sens? Więc jeśli spojrzymy na stos swoje Program jest to, na co wygląda. Po pierwsze, mamy główną funkcję. A następnie główna funkcja zwana suma 2. A następnie suma 2 jest powiedzieć, oh, suma 2 plus 2 równa się suma jednego. Więc dodać sumę 1 do stosu. I suma 1 zamierza zadzwonić sumę 0, który również zostanie dodany w stos. , A następnie każda z nich są te, które na drugim wrócić przed druga z nich może nie poddawać się. Tak na przykład, tutaj, suma 0, pierwsze, zamierza powrócić 0. A następnie wybrać kwotę 1. Następnie suma 1 będzie powrót 1 do kwoty 2. I wreszcie, suma 2 wybiera 3 powrót do głównego. Czy to ma sens? To naprawdę ważne, aby zrozumieć, w jaki sposób Stos działa i spróbować zobaczyć, czy to ma sens. OK, więc sortowanie. Więc dlaczego jest sortowanie ważne, Przede wszystkim? Dlaczego powinniśmy dbać? Każdy, kto? Daj mi przykład? Tak? PUBLICZNOŚCI: [niesłyszalne]. Lucas: Tak, OK. Więc można szukać bardziej efektywnie. To jest dobry sposób. Tak więc, na przykład, mamy dużo rzeczy, tak naprawdę, w naszym życiu, że są klasyfikowane. Na przykład, słowniki. To bardzo ważne, aby mieć wszystko słowa w jakiejś kolejności, że może uzyskać dostęp łatwo. Więc to, co mówi. Można wyszukiwać bardziej efektywnie. Pomyśl o tym, jak trudno byłoby mieć Słownik, w którym słowa są w losowego. Musisz patrzeć, dość dużo, każde słowo, aż znajdziesz Słowo, które szukasz. Jeśli używasz Facebooka także, gdy patrzysz na swoich przyjaciół, jesteś zobaczymy, że Facebook umieszczania bliżej przyjaciela na górze te , że nie, że dużo rozmawiać. Jeśli przejść całą drogę na dół Twoja przyjaciółka, masz zamiar zobaczyć ludzi, że prawdopodobnie nawet nie pamiętaj, że masz przyjaciół z. A to dlatego, że na Facebooku rodzaju znajomych w oparciu o jak blisko jest do nich. Więc organizacji danych. Również Pokemon. Więc widać, że wszystkie Pokemony mają numery. I to jak łatwo sposób dostępu do danych. PUBLICZNOŚCI: Dostęp Pokemon. LUCAS: Tak. PUBLICZNOŚCI: [niesłyszalne]. LUCAS: Tak. OK, więc wybór sortowania. Wybór sortowania będzie wybrać Najmniejszy nieposortowane wartość każdej listy Czas w każdej iteracji. To trochę tak jak w rodzaju, co robisz w twojej głowie, gdy próbujesz sortować listę na rękę. Zasadniczo, wszystko co musisz zrobić to spojrzeć dla najmniejszego numeru. Można umieścić go na liście sortowane. A następnie szukać następna najmniejsza liczba. A potem dalej robić to i tak dalej. Tak więc wybór jest w zasadzie można sortować za każdym razem wybrać najmniejszy Wartość nieposortowane. Umieścić na końcu posortowane element listy. I robić to. Warto więc szybko zobaczyć, co to wygląda. Więc tutaj jest klasyfikowane i nieposortowane listy. Więc dla sortowane z listy, jest początkowo pusty. A potem mam zamiar wybrać Najmniej tutaj, co 2. Więc mam numer 2 i umieścić w przód listy. A potem patrzę następna najmniejsza Element, który jest 3. Więc umieścić go na końcu od sortowanej listy. A potem robić to. Uważam, 4 i umieścić go na końcu. Znajdź 5 i umieścić go na końcu. I zastanowić się, jak te wszystkie razy, że Mówię, umieścić go na koniec jest, w zasadzie, zamiana dwóch wartości. OK? A następnie ostatni, po prostu jeszcze jeden element. Tak to już posortowane. OK, więc wprowadzenie sortowania. Wstawiania sortowania będziesz mieć również że rzeczą po sortowane i nieposortowane listy. Jedyną rzeczą jest to, że za każdym razem, dodajesz element do sortowane lista, wystarczy wybrać element, który jest przed listy niesegregowanych. A następnie masz zamiar znaleźć co Stanowisko powinno być sortowane element listy. Zobaczmy, co to jest tak to więcej sensu. Więc początkowo, na przykład, próbuję wstawić numer trzy w sortowane część listy. Więc lista nie ma nic. Więc może po prostu umieścić numer 3. Teraz chcę dodać numer 5 do sortowane część listy. Więc patrzę na numer 5. Zauważyłem, że to większy niż 3. Tak, wiem, że to musi być po 3. Włożyłem więc 3 i 5. Następnie chcę wstawić numer 2. Zauważyłem, że liczba 2 jest rzeczywiście mógł to zarówno 3 i 5. Więc faktycznie umieścić to wszystko Sposób na początku listy. Więc muszę, rodzaj, przesunąć wszystkie Elementy na liście sortowane, więc może zrobić miejsce dla liczby 2. Wtedy widzę numer 6. Widzę, że powinno być po 5. Więc ja ją tam umieścić. I w końcu, patrzę na numer 4. I zauważyłem, że powinny się pomiędzy 3 i 5. , A następnie umieścić go tam i przesunięcie Wszystkie pozostałe elementy. Ma sens? Bubble Sort. Więc sortowanie bąbelkowe jest w zasadzie to, co masz będzie do-- nazywamy to bańka sortowania, ponieważ można przejść przez list-- to faktycznie lepiej, gdyby po prostu pokazać lubisz to-- i masz zamiar porównać sąsiednie numery. I masz zamiar zamienić ich pozycji, jeśli nie są one w odpowiedniej kolejności. Więc w zasadzie, co się stało się tu, na przykład, masz 8 i 6. Wiesz, że ich kolejność będzie faktycznie 6 i 5, prawda? Więc masz zamiar zamienić zleceń. Wtedy widzę, 8 i 4 tutaj. I zrobić to samo. I znowu zamienić. I wreszcie, 2 i 8. Ja też je zamienić. To się nazywa Bubble Sortuj ponieważ po każda z tych iteracji właściwie Najwięcej na liście dostaje wszystko aż do końca listy. Czy to ma sens? Ponieważ utrzymuje zamiana go przesunąć się w prawo. OK, więc jest to druga iteracja. Byłoby to samo. Zrobię jedną partycję wymiany i to ostatnie. I że nie ma swapy i lista jest sortowana. Więc w Bubble Sort, możemy w zasadzie trzymać przejście przez listy i zamiana rzeczy, dopóki nie zauważy, że nie zrobiłem wszelkie swapy robić iteracji, które Oznacza to, że lista jest już posortowana. Ma sens? Porozmawiajmy trochę o czas pracy. Więc wy pamiętać Big O, Omega i Theta? Tak? OK, co to jest Big O, przede wszystkim? PUBLICZNOŚCI: [niesłyszalne]. Lucas: Tak, to się nazywa najgorszym przypadku czas pracy, co oznacza po prostu, że jest to ile można oczekiwać program podjąć, aby uruchomić. Jak w warunkach of-- w tym case-- n. Liczba elementów w lista w najgorszym przypadku. Jak, w najgorszym możliwym przypadku. Tak na bańki Sort, na przykład mamy Big O n placu. Dlaczego mamy to? Dlaczego Bubble Sortuj Big O n kwadrat? PUBLICZNOŚCI: [niesłyszalne]. Lucas: Tak, tak, w najgorszym przypadku będzie że będę musiał zrobić n iteracji. Tak więc każdy z iteracji zamierza doprowadzenia wielkości elementu do końca wykazu. Więc w najgorszym przypadku jest to, że mam zrobić to coś n razy. I dla każdego z tych czasów, muszę zrobić n swapy bo muszę porównać każda z dwóch elementów. Więc dlatego to n do kwadratu bo to n razy n. Następnie wybór sortowania jest również brak placu , ponieważ dla każdej iteracji, muszę spojrzeć na każdego elementu na liście. A następnie znaleźć najmniejszy, co oznacza, że ​​muszę patrzeć przez n elementów. A ja mam to zrobić n razy, ponieważ Muszę zaznaczyć wszystkie n elementów. Wstawiania rodzaj placu jest również brak ponieważ w najgorszym wypadku będzie być, jeden, muszę włożyć liczby n, prawda? Tak, już wiem, że będę mieć n iteracji. Ale dla każdego z tych numerów, gdybym miał spojrzeć na wszystkich liczb w sortowane listy i umieścić ją całą drogę z przodu, że kwadrat będzie n ponieważ będzie ponownie n n razy. Ma sens? Co o omega? PUBLICZNOŚCI: [niesłyszalne]. LUCAS: To najlepszy scenariusz. Tak to jest jak, w wielu czasach dla sortowania, Najlepszy scenariusz kiedy lista jest już posortowana. Tak naprawdę nie ma nic robić. Bubble Sort ma najlepsze scenariusz n. Czy wiecie dlaczego? PUBLICZNOŚCI: [niesłyszalne]. Lucas: Tak, jeśli śledzić czy porcja danych miał żadnych swapów lub Nie, jeśli masz coś jak ustawienie prawdziwe, czy nie było iteracji, jeżeli Lista jest już posortowane, w zasadzie, co się wydarzy to będę spróbuj zamienić każde dwa sąsiednie elementy. Idę zobaczyć, że nie ma swap. A ja po prostu wrócić od razu. Więc oznacza to, że po prostu musiałem przejść przez liście jednym czasie. Tak to wygląda, bo n w n elementów. Dlaczego wybór sortowania n do kwadratu? Tak, nawet jeśli lista jest posortowana, na każde powtórzenie wyboru rodzaju, że trzeba wybrać najmniejszy element. To znaczy, że mam się patrzeć na wszystkich elementach w nieposortowane listy i znaleźć minimum dla każdej iteracji. Czy to ma sens? I wprowadzenie miecz n, ponieważ w tak, że staram się włożyć numery i wszystkie numery, kiedy spróbuj je włożyć, widzę, że znajdują się w prawidłowym położeniu. Nie muszę iść sprawdzić wszystkie inne numery na liście sortowane. Więc dlatego to będzie brak. Ma sens? I to, co jest theta? PUBLICZNOŚCI: [niesłyszalne]. LUCAS: Co, przepraszam? Powiedz to jeszcze raz. PUBLICZNOŚCI: [niesłyszalne]. LUCAS: Dokładnie. Więc widać, że tylko wybór przechowywane w seryjnej sortowania mają Thetas. A to dlatego, że masz tylko theta jeśli zarówno duże O i omega są takie same. OK. I wreszcie połączyć sortowania w dzienniku n. A potem, jak Dan mówił, Merge sort jest jakby ten sam sposób, zrobić wyszukiwanie binarne. Więc masz listę. I masz zamiar przeciąć na pół. A następnie je wyciąć w mniejszych części. A następnie je połączyć. Wy pamiętajcie, że tak? OK, jak mówił. OK, wskaźniki. Tak więc to, co jest wskaźnikiem? PUBLICZNOŚCI: [niesłyszalne]. LUCAS: adres. OK. Wiem, że David pokazuje kilka filmy Binky i rzeczy wskazujące siebie. Ale lubię myśleć o wskaźniki jedynie jako adres. Więc jest to zmienna, która będzie do przechowywania adresu. Tak, to jest po prostu to specjalna zmienna czyli cztery bajty. Pamiętaj, że do niczego się wskaźnik zawsze cztery bajty dla naszej 32-bit Urządzenie to przypadek urządzenia. I to właśnie ma miejsce zmiennej w jej wnętrzu. OK, więc jest to pamięć, w zasadzie. Więc każdy blok pamięci ma rzeczywiście Etykieta, która jest adres Pamięć slotty. To znaczy, że mogę mieć wskaźnik, wskazujący każdy z tych adresów. Więc dlatego użyjemy wskaźników jest jeśli mam pamiętać lokalizację które jest specyficzne dla zmiennej pamięci. A wy pamiętać, że jeden z tych, przypadków było, jeśli mam funkcji jeśli mam rzeczywiście chcą się Swap dla liczb rzeczywistych, faktycznie trzeba wysłać wskaźnik. Nie zmienna. Czy chłopaki pamiętać, że? Różnica between-- jaka jest nazwa? Rozmowa wartości i wywołanie przez odniesienie, prawda? OK, tak. Tak nazywamy wartością. Po prostu wyślij do zmiennej funkcjonować jesteś po prostu wysyłając wartość. Więc faktycznie wysyłanie Kopia zmiennej. I Twój program nie obchodzi o tym, czy sama zmienna faktycznie tworzy kopię. I rozmów przez odniesienia oznacza, że Jestem rzeczywiście przesłanie kopii wskaźnika do tej zmiennej. Więc oznacza to, że wyślę Lokalizacja tej zmiennej. Więc wyczuć Mam lokalizację zmienna, gdy zgłoszę funkcja ze wskaźnikami, jestem w stanie właściwie zmiany danych, które było w głównym. Ma sens? Chociaż wskaźnik jest kopia, wskaźnik nadal ma prawdziwy adres zmienne, które chcę zmienić. Ma sens? Więc tworzenie wskaźników. Pamiętaj, wskaźnik zawsze typ, który to wskazuje do i gwiazdy. A następnie umieścić nazwę. Więc pamiętaj, że zawsze, gdy masz co gwiazda, to jak wskaźnik do że bez względu na zmienne wpisz że masz. Więc w gwiazdę, na przykład, jest wskaźnik i całkowitą. A potem gwiazda char jest wskaźnik char gwiazda i tak dalej. Tak? PUBLICZNOŚCI: Co zrobić, jeśli mamy wskaźnik do n zagra x. Wiem, że tworzy wskaźnik do x. Czy to również oświadczyć x liczby całkowitej? LUCAS: OK, więc kiedy mówisz n gwiazda X, nie tworzymy wskaźnik do zmiennej x. Tworząc wskaźnik o nazwie x. PUBLICZNOŚCI: [niesłyszalne]. LUCAS: Więc kiedy mówię n gwiazda X, jestem mówiąc: hej, w pamięci, mam zamiar jeden z tych trzech pól. I mam zamiar powiedzieć, że będzie x, który jest będzie wskaźnik. I coś ciekawego o wskaźniki jest to, że mają one 4 bajty na komputerze 32-bitowym. A powodem tego jest, ponieważ 4 bajty są 32-bitowe. I maszyny, które są w rzeczywistości 64 bitów Wskaźniki mają adresy że są długie 64 bity. Tak, to po prostu oznacza, że ​​wielkość Adresy w urządzeniu jest inna. Więc Odwoływanie i wyłuskania. Istnieją dwa podmioty, które faceci powinni pamiętać. Pierwszy to Ampersand. Drugi jest gwiazdą. Nie należy się martwić o to, że gwiazdy i STAR, ponieważ pamiętam, że w tym przypadku, masz n gwiazdę. To jak wszystkiego razem. Nie ma miejsca na gwiazda n. Więc oznacza to, że jest to rodzaj. Pamiętaj, że gdy masz gwiazda zmienna, jesteś mówić o rodzaju. Gdy masz tylko gwiazdę, a następnie Nazwa zmiennej, to znaczy, że jesteś dereferencji wskaźnika, który Oznacza to, że patrzysz na wskaźnik, znalezienie adresu to wskazując, będzie ten adres, i patrząc na ilekroć tam masz. Więc mówię moim uczniom, że gdy masz gwiazda, warto pomyśleć, że jest to skrót od treści. Więc jeśli masz wskaźnik i Czy Star wskaźnik, to Zawartość wskaźnika. Więc idź do tego, co to jest, wskazując na i spojrzeć na stałej zawartości. Oraz handlowego i jest taka sama rzecz jak adres. Więc jeśli mam zmienną A-- jak, niech powiedzieć, że zrobiłem int równa 3-- jeśli chcę znaleźć adres, który zmienna pamięci, mogę zrobić handlowe i. Więc jest to adres. Ma sens? Więc oto przykład. To brakuje int int b i c. Tak więc int równa 3 oznacza, że Mam zamiar udać się do pamięci. I mam zamiar znaleźć gniazdo i umieścić numer 3 tutaj. A następnie int b równa 4. Mam zamiar zrobić to samo. Przejdź do pamięci i umieścić szereg 4, w jednym z pól. I int równa 5. Znaleźć inne pole i umieścić numer 5. Więc co to jest linia robi? n gwiazda pa równa ampersand a. Więc przede wszystkim n gwiazda rocznie. Co on robi? PUBLICZNOŚCI: [niesłyszalne]. Lucas: Tak, tak, n gwiazda pa, po pierwsze, deklaruje wskaźnik o nazwie pa. A potem to przypisanie wartości że wskaźnik jest adres. Więc handlowe i. Następnie, jeśli to zrobię gwiazda pb, co to jest gwiazda pb? Och, przepraszam. Jest również brakuje. n gwiazda pb. To znaczy gwiazda pc. Tak mi przykro. To samo. Ale teraz jestem dobry ar tworząc wskaźnik do B, a następnie wskaźnik do C. Tak? PUBLICZNOŚCI: [niesłyszalne]? LUCAS: Tak. Więc jeśli się do pamięci i przejść do Pole to jest oznaczenie dla pa, jesteś rzeczywiście będzie zobacz adresu. OK? Tak? PUBLICZNOŚCI: [niesłyszalne]? Lucas: Tak, wskaźnik jest adres. Nigdy nie zapominaj o tym. To jest jak najbardziej istotne część o wskazówki. Jest przechowywania i adres w pewnej zmiennej. Coś jeszcze? Jeszcze jakieś pytania? OK. Tak, wskaźniki i tablice. Pamiętaj, że gdy zrobić int tablicy 3, w zasadzie, co robię to ja, rodzaj z, deklarując w wskaźnika. Więc tablica jest trochę jak wskaźnik do szczególne miejsce w pamięci, w którym przydzielone trzy sloty dla liczb całkowitych. Czy to ma sens? Więc kiedy mam int tablicy 3, co mam robi, w zasadzie, jest stworzenie trzech Szczeliny w pamięci. Więc po prostu znaleźć trzy gniazda w pamięci. Więc jeśli tak, to, tablicy, to gwiazda Oznacza, zawartość tablicy, co oznacza, że ​​usunięcie wskaźnika, idę w tym miejscu, że to wskazując, i umieścić numer jeden. A następnie, jeśli to zrobię tablicę STAR plus 1, to samo, co robi tablicę wsporniki jeden, co oznacza po prostu idę do miejsce, że to wskazuje na. A potem plus 1 marki mi przesunąć się o jedną pozycję. Więc idę do tej pozycji, w rzeczywistości, i umieścić numer dwa. I w końcu, kiedy nie Tablica plus 2, pójdę tam, gdzie wskazujące tablicowej, która na. A następnie przenieść do bloków pamięci. A następnie umieścić numer trzy tutaj. Tak? PUBLICZNOŚCI: Więc tablica jest po prostu gwiazda mówiąc, że pierwszy punkt. I można dodać 1, tylko dlatego, jesteśmy tylko bardzo odwołującego, że pierwszy adres. LUCAS: Tak. Dlaczego, na przykład, powiedzieć tablicę 0, tablica 1 i tablica 2? Mówię, dlaczego robisz 0, 1, 2, 3, zamiast z 1, 2, 3? Jednym z powodów jest to, jeden, komputer Programiści wolą zacząć licząc od 0. Dwa to, ponieważ kiedy robisz tablicę 0, to samo, co robi tablicę Plus 0, co oznacza, idę do że stanowisko, a ja nie pominąć żadnych bloków pamięci. Więc nie poruszać żadnych bloków pamięci. Tak? PUBLICZNOŚCI: [niesłyszalne]? LUCAS: Więc ona pyta, co jest Różnica pomiędzy robi to albo robi malloc. Jedną z różnic jest to, że int tablica 3 jest tworzenie Tablica na stos. A kiedy ja malloc, to tworzy na stercie. Czy to ma sens? Więc w jaki sposób malloc rzeczywiście działa? Dlaczego więc nawet trzeba używać malloc? Twój rodzaj kompilatora figur z wszystkich zmienne, które zadeklarowane. I tworzy przestrzeń dla wszystkich z nich w stosie. Więc wszystkie swoje zmienne będą być gdzieś w stosie. Więc tutaj jest zmienne środowiskowe. Więc w zasadzie, miejsca dla tych zmiennych w pamięci jest przeznaczona na kompilacji. Więc oznacza to, że komputer ma znać wszystkich tych zmiennych wcześniej. Nie musisz wiedzieć, jakie wartości masz zamiar umieścić w nich. Ale to musi wiedzieć, jak ile pamięci trzeba. Ale teraz powiedzmy, że, na przykład, tworzysz tablicę lub przy ciąg znaków, który bierzesz od użytkownika. Nie wiem, jak długo ciąg dzieje się, na przykład. Więc nie wiem dokładnie ile bloki pamięci przydzielić, prawda? Więc to nie ma sensu można powiedzieć, umieścić 100 znaków. I co wtedy, gdy użytkownik pisze 150? Idziesz do przykręcenia. Więc w zasadzie, nie może być pewien, jak ilość pamięci należy przydzielić podczas kompilacji programu. Po prostu wiem, że na prowadzonym czasie. Więc dlatego masz kupę. Tak kupa będzie mieć pamięć że jesteś w trakcie przydzielania czas trwania biegu programu. Więc w zasadzie, kiedy nie malloc, co robisz jest przydzielania pamięci na czas, co oznacza, że ​​jesteś Decydując prawo w tym momencie, że ci Należy mieć tej pamięci. Tak to jest, gdy masz ich przyznawanie. Czy to ma sens? Więc pamiętaj, stos ma zmienne , które są tworzone na kompilacji. I wtedy kupa ma zmienne które są tworzone, jak przejść z malloc, na przykład. PUBLICZNOŚCI: [niesłyszalne]? LUCAS: Więc GetString jest Zadzwonię do malloc. Pozwól mi mówić o malloc i Wytłumaczę getString. Malloc jest tak samo w alokacji pamięci. Więc to będzie przydzielić pamięci na stercie. I to się zwracają wskaźnik do jeżeli pamięci przeznaczono na. Więc kiedy do-- tu na example-- n Wskaźnik gwiazda. A następnie wskaźnik wynosi malloc rozmiar razy calowych 10. Tworzę wskaźnik. A potem ja to wskaźnik do przypisywania Wartość wskaźnika że malloc daje mi. Więc pytam malloc można przydzielić miejsca dla 10 liczb całkowitych. To jest to, co mówi. I malloc daje mnie wskaźnika do tego miejsca. Ma sens? OK. I I GetString jest, w zasadzie, robi zadzwoń do malloc więc można przydzielić pamięci w trakcie wykonywania. Zawsze pamiętaj, aby sprawdzić, czy wartości null ponieważ malloc będzie zwróci null jeśli nie może przydzielić pamięci. Powiedzmy, że prosisz o śmieszne ilość pamięci. Komputer nie będzie w stanie przeznaczyć tyle. Tak właśnie dzieje się malloc do zwróci null. Więc zawsze pamiętać, aby sprawdzić, czy wskazówka, że ​​masz z malloc jest zerowy lub nie, bo jeśli tak, to polubisz być dereferencji wskaźnika i powodując uszkodzeń ubocznych. I wreszcie, nie zapomnij Twój wolnej pamięci. Malloc jest tworzenie pamięci na stercie. I trzeba zwolnić pamięć zanim program się kończy. OK, to wszystko dla mnie. Niestety, Rob. Dzięki. [Aplauz] LUCAS: Jakieś ostatnie pytania przed Rob przychodzi? Nie? Tak? PUBLICZNOŚCI: Nie widziałem ten Internecie. Czy wysłał go jeszcze? LUCAS: Myślę, że Dave jest przesłać go szybko. Dave: To będzie pisał. LUCAS: To będzie w Internecie. PUBLICZNOŚCI: To zależy. LUCAS: To jest? OK. Tak? PUBLICZNOŚCI: [niesłyszalne]? Lucas: Tak, należy zwolnić wszystkich pamięci, która jest umieszczana w stercie. PUBLICZNOŚCI: [niesłyszalne]? LUCAS: Tak. Za każdym razem, że masz malloc kultury, trzeba mieć kulturę wolnego Po zatrzymaniu za pomocą tej zmiennej. Więc malloc i wolne są zawsze razem. Ich najlepszymi przyjaciółmi. Tak. Rob? ROB: Pójdę szybko. A także film będzie znosić. Mam mikrofon na. OK, więc tydzień pięć rzeczy. Pierwszą rzeczą, jaką mamy, jest stos. Tak więc należy pamiętać, że jest tylko jeden stos ramki na aktywnym wywołania funkcji. Zobaczymy, że w sekundę. A także pamiętać, co naprawdę idzie w każdej ramce stosu będą lokalne zmienne z naszych funkcji, argumenty, które są przekazywane do naszego Funkcje, wraz z parą inne rzeczy, które tak naprawdę nie trzeba się martwić. Więc oto przykładowy program, gdzie, Ogłoszenie, głównym jest printfing powrót wartość foo 4. foo jest tylko zamiar wrócić wartość 6 bar 4 przecinkami. I bar będzie ustawić niektóre lokalne Zmienna n równa się 4 razy 6. A następnie powrócić n. Więc spójrzmy na stosie przez Rzeczywista powtórzenie tego programu. Więc nie ma na dole naszego stosu. Pamiętaj, że stos rośnie. Tak na dole stosu naszego, że posiada ramki stosu dla głównej. Po uruchomieniu programu, głównym zawsze będzie wynosić Dno naszego stosu. I to, co jest wewnątrz naszego stos ramki na główną? Tak więc mimo, że nie istnieją żadne lokalne zmiennych do głównej, tak jak powiedziałem wcześniej, mamy argc i rgv zajmowania miejsca wewnątrz głównej ramki stosu. Więc teraz jest głównym będzie wywołać funkcję foo. I oznacza, że ​​foo będzie uzyskać własną ramkę stosu. Tak więc teraz jesteśmy w środku bla funkcji. I co musi iść w Foo ramki stosu? Cóż, bla ma n argumentów. A n jest równe 4, ponieważ to, co Głównym argumentem jest przepuszczenie jak Foo. Więc teraz foo będzie wywołać bar. Co to jest bar będzie miał w środku jego 'ramki stosu? Posiada 4 x równe y równej sześciu. To nie wszystko, że będziemy mieć w ramce stosu, ponieważ bar ma także lokalną zmienną n. Oraz n będziemy równy 24. Więc teraz bar powróci n. Tak bar wraca 24 do bla ramki stosu. A ponieważ bar jest teraz wraca, że Oznacza jesteśmy popping ramkę stosu za wyłączone z komina. Więc wszystkie pamięci, które były bar stosując jest ze stosu. Teraz zamierza także foo 24 powrót do głównego. Więc teraz, że foo jest powrót, pamięć że bla używał w swoich " ramki stosu jest również zniknął. A teraz, głównym będzie printf. Więc jest to tylko kolejny printf funkcja. Kiedy wzywamy printf, to będzie kolejna ramka stosu dla printf Wywołanie funkcji. Co my przechodząc printf? To, co się dzieje, aby przejść na jego ramce stosu. Przynajmniej, przekazujemy że procent i interpretacja odwrotnego ukośnika n i Argument 24. To może mieć więcej to ramka stosu jeśli printf dzieje się przy użyciu niektórych zmienne lokalne. Nie wiemy. Ale wszystko idzie w printf-tych stos ramki. To będzie wykonać printf. Następnie printf zrobił. Powróci. Wreszcie głównym odbywa. Głównym powróci. A następnie nasz program jest zrobione. Tak? PUBLICZNOŚCI: Widzisz [niesłyszalne] argumenty [niesłyszalne] parametry? ROB: Tak istnieje subtelna różnica między argumentów i parametrów. I rzeczywiście, w powszechnym mówić, ludzie mają tendencję po prostu wymieszać je cały czas. Ale parametry są formalne Nazwa rzeczy. Więc argc i argv są Parametry do głównej. Argumenty są co faktycznie przekazać w jak tych parametrów. Tak więc, gdy zgłoszę foo z 4, 4 jest argument ja przechodząc. I n parametrów, wewnątrz bla, nabiera wartości 4 od 4 był argument. PUBLICZNOŚCI: [niesłyszalne]? ROB: n jest zmienną lokalną do baru. n jest nadal lokalne do foo, ale jest to parametr do foo. To nie jest zmienna lokalna. Tak? PUBLICZNOŚCI: [niesłyszalne]? ROB: Dzwonię foo i bar powrót cokolwiek kreskowych zyski. PUBLICZNOŚCI: [niesłyszalne]? ROB: Tak, po prostu zobaczyć, wielokrotnego stos klatek. Tak? PUBLICZNOŚCI: Dlaczego nazwano foo przed printf? ROB: Dlaczego foo wezwany przed printf? Więc mogłem mieć, zamiast zrobić coś jak int x równa się foo z 4 a następnie drukowane x. Ale zamiast tego, że w połączeniu z funkcji zadzwoń do argumentu printf. Ale zauważ, że nie możemy w rzeczywistości wykonać połączenie do printf Dopóki dowiedzieć się, co jest bla z 4. Więc idziemy do oceny tego. I tylko raz, że zrobił zamiar wrócić i ocenić to. Tak? PUBLICZNOŚCI: Ponieważ zarówno baru [niesłyszalne] wartość, to dlaczego nie mamy [niesłyszalne]? ROB: powinny być one całkowicie int. Że nie został złapany na wielokrotne przejścia. Tak powinno być int bar i int bla, ponieważ oba te wracają liczby całkowite. Nieważne jest tylko wtedy, gdy oni nie dzieje powrót wartości rzeczywistych. Tak? PUBLICZNOŚCI: Gdybyś miał linię powyżej powrót, [niesłyszalne]? ROB: linia nad powrotem? PUBLICZNOŚCI: Tak. Jak jeśli nie printf i [niesłyszalne], to wydrukować dwa razy? ROB: Więc wewnątrz foo? Gdybyśmy mieli printf tutaj? PUBLICZNOŚCI: Tak. ROB: Jeśli więc miał prawo printf tu, to wydrukować raz. Od wzywamy foo raz w prawo tu, wtedy będziemy hit printf. Następnie zadzwonimy poprzeczkę. A następnie będzie bla powrócić. I to jest to. Mamy tylko kiedykolwiek spotkać printf raz. Tak? PUBLICZNOŚCI: [niesłyszalne] printf wywołanie foo ponieważ jesteśmy pierwszym wywołanie printf a następnie przekazujemy argumenty. ROB: Tak w teorii, nie jest printf wywołanie foo? Więc nie ma. Tylko zamówienia, które c będzie wykonywania tych rzeczy jest, zanim możemy wywołania funkcji, wszystkie argumenty do funkcji muszą być całkowicie ocenione. Więc jest to całkowicie oceniane? Tak, to tylko ciąg. To właśnie wartość. Następnie musimy całkowicie ocenę tego produktu. Gdy to nastąpi, obecnie wszystkie Jego argumenty są oceniane. A teraz możemy zadzwoń do printf. Tak? PUBLICZNOŚCI: Jedno pytanie. Jeśli masz funkcję void, musi masz powrotny średnik? ROB: Nie średnik powrót jeśli masz funkcję void. OK. Teraz niektóre sterty rzeczy. Tak kupa jest jak jedziemy do czynienia z dynamicznego zarządzania pamięcią. I to bezpośrednio z kontrastów Pakiet, który nazwalibyśmy automatyczne zarządzanie pamięcią. Więc na stosie, nie trzeba się naprawdę do czynienia z how zmiennych lokalnych są pchane i zdejmowana wszystko te ramki stosu i wszystkie rzeczy. Nie musisz się o to martwić. To jest automatyczne. Tak kupa jest instrukcja. I [niesłyszalne] pochodzi z tych funkcji malloc i free. Więc tutaj jest inny program. Wszystko co robimy jest mallocing całkowitą. Jesteśmy przechowywanie go w gwiazdkowym x. Oczywiście, musimy sprawdzić aby sprawdzić, czy x jest null. Wtedy będziemy po prostu ustawić co x wskazuje na 50. Drukuj to, co x wskazuje, print x, a następnie wolne x. Tak jak to jest w rzeczywistości będzie wyglądać jeśli spojrzymy na nasze stosu i sterty? Więc zacznijmy jeszcze raz. Dno naszym stos, jak poprzednio. Pamiętaj, że cię kupa bezpośrednio sprzeciwia się stos? Więc będziemy mieć Najwięcej naszych sterty tam. Tak na dole naszego stosu, mamy ramki stosu dla naszego głównego. Ma miejsca na argc, argv, a my teraz lokalną zmienną x, która int jest gwiazda. Więc idziemy do iteracji w ramach tego programu. Pierwszą rzeczą, jaką mamy, jest wywołanie malloc. Więc robimy wywołanie malloc. Malloc jest funkcją. To będzie dostać ramkę stosu. Co my przechodząc do malloc? Że idzie do środka ramki stosu. Mijamy rozmiaru n, która jest 4. Tak, że przechodzi do malloc. Co malloc zrobić? To chwyta nam trochę miejsca na stercie. Więc mamy zamiar udać się do sterty. I mamy zamiar chwycić 4 bajty z hałdy. Więc po prostu dać, że arbitralne adres. 0x123 Wystarczy udawać, że jest adres, który jest na stercie. Tak więc to, co jest wewnątrz, że faktycznie obszar pamięci o adresie Ox123? Śmieci. Więc nie mamy nic w nim przechowywane. Tak daleko, jak wiemy, to może być cokolwiek. Nie należy zakładać, że jest zerem. Jest to prawdopodobnie najbardziej nie zera. Więc teraz malloc zwraca. A co zrobimy, gdy powraca malloc? Ustalamy, co to zwraca. Stawiamy x równe co to wraca. Więc co to jest powrót? To powrót 0x123 ponieważ jest adres bloku pamięci, która to tylko przydzielone na stercie. Więc wrócić 0x123 x jest teraz będzie ustawiony równa 0x123, które obrazowo, my często rysować jako x ma rzeczywisty strzałka skierowana do tego bloku. Ale x jest po prostu przechowywanie tego adresu. Teraz musimy sprawdzić, czy x jest null. To nie jest wartość null. Udajemy, że malloc udało. Teraz gwiazda x jest równa 50. Tak wspomina to znaczy gwiazda przejść do tego adresu. Więc 0x123 Zamierzamy przejść do tego adresu. Czeka nas więc, że tam. Co robimy pod tym adresem? Jesteśmy przechowywania 50. Więc po tej linii, to jest co rzeczy będą wyglądać. Więc teraz to już nie śmieci tam. Teraz wiemy, że jest, że 50 szczególności adres, ponieważ możemy ustawić go na to. OK? Więc teraz mamy zamiar wydrukować f. Więc najpierw będziemy drukować gwiazda X. Więc co jest gwiazda x? Ponownie, gwiazda x oznacza iść do rzeczą, że x wskazuje. Więc x jest przechowywanie 0x123 Go do tego. Dostajemy 50. Więc wydrukować f to. A to oznacza, że ​​będzie drukować 50. A następnie, że wraca. A potem mamy drugi printf. Jesteśmy teraz procent p. Jeśli nie widziałeś, to , jak można wydrukować wskaźnik. Więc mamy procent i, procent f oraz wszystkich już nich. Więc procent p, wydrukować wskaźnik. Więc x jest wskaźnikiem. Więc jeśli mamy zamiar drukować x sobie, mamy do drukowania, co faktycznie jest w środku x, który jest 0x123 więc pierwszy print f będzie drukować 50. Drugi druk f będzie wydrukować 0x123 Tak? PUBLICZNOŚCI: Używasz procent x, aby wydrukować wskaźnik? ROB: Więc używasz procent x, aby wydrukować wskaźnik? Tak można, ale procent x jest tylko, ogólnie, na jak jeśli masz jakiś całkowitą i chcesz wydrukować to w systemie szesnastkowym. To jest po prostu, jak to zrobić. Natomiast procent d byłoby wydrukować jako przecinku. Że były mamy procent d. I jest tylko liczbą całkowitą. p jest w szczególności procent dla wskaźników. Więc x jest wskaźnikiem. Chcemy wykorzystać procent str. Ale procent x może pracować. Tak? PUBLICZNOŚCI: [niesłyszalne]? ROB: Tak. Przynajmniej na to call-- więc nie obejmują go w tutaj. Ale te dwa argumenty muszą wewnątrz tej ramki stosu razem ze wszystkimi zmiennymi lokalnymi printf dzieje się przy użyciu. A potem następne wywołanie printf teraz wewnątrz ramki stosu jest printf procent p backslash n i niezależnie Wartość x wynosi, co 0x123. Tak? PUBLICZNOŚCI: [niesłyszalne]? ROB: To będzie coś wydrukować , który wygląda tak. PUBLICZNOŚCI: [niesłyszalne]. ROB: Tak to wydrukuje ją w postaci adresu. To wygląda jak adres. Tak? PUBLICZNOŚCI: [niesłyszalne]? ROB: Dlaczego nie? PUBLICZNOŚCI: [niesłyszalne]? ROB: Dlaczego jest to wskaźnik 4 bajty? Tak więc istnieje cała masa z 0 jest przed tym. Więc to naprawdę 0x0000000123. W systemie 64-bitowym, nie byłoby cała masa więcej zer. Tak? PUBLICZNOŚCI: [niesłyszalne]. ROB: Więc najpierw printf będzie print-- PUBLICZNOŚCI: [niesłyszalne]. ROB: Tak, to będzie drukować co x wskazuje. Gwiazda mówi, co to jest co wskazuje. Chwycić go. Więc co to jest wskazując? 50. Chwycić go. To jest to, co mamy zamiar drukować. Mając na uwadze, następnej, jesteśmy tylko drukowanie x sobie. Co jest w środku f? 0x123. OK. A potem, w końcu, mamy wolne. Co my przechodząc uwolnić? Mijamy x. I rzeczywiście, że wyświetlany czas to w ramce stosu. Więc my przekazujemy wartość 0x123 uwolnić. Więc teraz za darmo wie, wszystko w porządku, Muszę iść do sterty i za darmo, że pamięć. To już nie używa, co jest pod adresem 0x123. Tak wolny będzie zwolnić że ze sterty. Teraz nasza kupa jest pusta. Nie mamy żadnych wycieków pamięci. Teraz za darmo powróci. Zauważmy, że x jest nadal 0x123. Ale to nie jest teraz ważne pamięci. Nie powinno być już wyłuskiwania x. Tak? PUBLICZNOŚCI: Czy powrót 0 zbędny? ROB: Czy returen 0 zbędne? Tak. Właśnie, że nie, bo umieścić mamy powrót jeden dla powietrza. Więc jak to jest, tak, pozwala to powrót 0. Tak? PUBLICZNOŚCI: [niesłyszalne]? ROB: Tak po wolnych x, co się stanie, jeśli staramy się nieprawidłowego wskaźnika? Jest możliwe, że nic się nie uda. Jest możliwe, że będziemy jeszcze dostać 50. Jest to możliwe, również, że pamięć jest obecnie wykorzystywane do czegoś innego. Więc jest to niezdefiniowane zachowanie. I nieokreślone coś znaczy może się zdarzyć. Tak? PUBLICZNOŚCI: [niesłyszalne]? ROB: Nie, więc jeśli przydzielić x na coś innego. Więc jeśli tu powiedzieliśmy x jest równa malloc coś else-- malloc rozmiar event-- następnie, że przy bloku pamięci nie jest wolny. I mamy oficjalnie stracił. Że jest wyciek pamięci. Straciliśmy wszystkie nazwy do tego bloku pamięci. Tak więc nie ma mowy, że może nigdy uwolnić go. OK, a następnie powrót 0 oznacza zrobić. W porządku, więc przepełnienie stosu. Co to za pomysł tutaj? Więc pamiętaj, kupa spada. Stos idzie w górę. Więc to był przykład z wykładu, Myślę, gdzie głównym jest po prostu będzie wywołać tę funkcję foo, która zamierza nazywać się rekursywnie nad i na nowo. Więc stos klatek będą działa dokładnie tak samo. Więc mamy zamiar rozpocząć z głównym w dolnej ramie stosu. Wtedy głównym będzie wywołać foo, które dostanie ramkę stosu. Wtedy foo będzie wywołać foo ponownie, co będzie się kolejna ramka stosu. I znowu, i znowu, i znowu, i znowu, aż w końcu, prowadzimy na stercie. Tak to jest, jak się przepełnienie stosu. I w tym momencie seg winy. Albo tak naprawdę seg winy przed ten punkt, ale tak. PUBLICZNOŚCI: Czy zrzutu pamięci same, jak winy seg? ROB: Tak zobaczysz segmentacji Rdzeń wina po cenach dumpingowych. Masz zrzut kiedy Ci seg winy. I to jak wysypisko wszystkich zawartość bieżącej pamięci tak że można spróbować zidentyfikować dlaczego SEG nic zarzucić. Tak? PUBLICZNOŚCI: [niesłyszalne]? ROB: Tak więc środki błędów segmentacji jest przepełnienie stosu. Więc nie koniecznie. Błąd segmentacji oznacza, że ​​jesteś wzruszające pamięci w sposób nie powinno być. Tak więc jednym ze sposobów, że dzieje się, gdy Ci przepełnienie stosu, zaczynamy dotykać pamięć w sposób, który nie powinien być. Tak? PUBLICZNOŚCI: [niesłyszalne]? ROB: Więc wewnątrz nieskończonej pętli. Jak to jest jak rekurencyjnego nieskończoności pętli i tak mamy kolejny stos ramki każdym razem. Ale wewnątrz regularne nieskończony, podczas jedno- dobrze, niech nawet nie drukować F-- coś zrobić. Cokolwiek. Nie zamierzamy się być coraz kolejna ramka stosu. Jesteśmy po prostu się zachować zapętlenie na tej jednej instrukcji. Stos nie rośnie. To fakt, że każdy rekurencyjna połączenie daje nam ramkę stosu. Dlatego mamy przepełnienie stosu. Tak? PUBLICZNOŚCI: Więc jeśli mówi się dostać pętla, a następnie [niesłyszalne]? ROB: Tak, jeśli wewnątrz pętli while było printf, nadal byłoby nie SEG wina. Ja po prostu nie chce mylić rzeczy. Byłoby pętli. Można dostać jeden stos ramki dla printf. Następnie printf zwróci. Wtedy bym ponownie pętlę. Można dostać jeden stos ramki dla printf. To powrót. Pojedyncze ramki stosu. Tak nie dostaniesz to nieskończona piętrzą się ramki stosu. PUBLICZNOŚCI: [niesłyszalne]? ROB: Tak. Tak to się dzieje, przepełnienie stosu ponieważ żaden z nich wywołania foo wracają. Więc jeśli wrócimy, to byłoby rozpocząć utraty ramek stosu. I wtedy nie będzie przepełnienie stosu. I dlatego trzeba sprawę podstawową dla własnych funkcji. Tak? PUBLICZNOŚCI: Czy rozmiar i potencjał stack na stercie samym do wszystkie programy? ROB: Mniej więcej. Jest potencjalna powierzchnia stosu i stos sama dla wszystkich programów? Mniej więcej. Istnieją pewne randomizacji do gdzie stosu i zaczyna gdzie stos zaczyna. Jeśli zdarzy się, że całe mnóstwo zmienne globalne i rzeczy, to polubisz zabrać z jakiegoś miejsca dla sterty. W systemie 64-bitowym, to praktycznie ma nieskończoną pamięć. Jest tylko tyle. Między 32 bitów i 64 bitów, to Jest znacząca różnica. Masz zamiar dostać dużo więcej stosu i sterty na przestrzeni 64-bitowej systemu, ponieważ nie tylko więcej adresów, które mogą korzystać. Ale na indywidualnym systemie, to będzie w przybliżeniu takie same ilości stosu i przestrzeni kupa. Wszystko w porządku. Więc ostatnią rzeczą jest kompilacja. Tak więc należy wiedzieć na ten proces. Są cztery duże kroki. Więc pierwsza powinna być łatwe do zapamiętania. Wstępne przetwarzanie. Ma przedrostek pre w nim. Więc to jest przed wszystkim innym. Rzeczą do zapamiętania jest to, że hash. Więc hash hash zawiera definiuje i w każdym z nich. Te są wstępnie procesor dyrektyw. Są to rzeczy, że pre-procesor zajmuje. Więc co pre-procesor zrobić? To naprawdę głupie rzeczy. Wszystko to jest w stanie z nich są Kopiowanie i wycinanie i wklejanie operacje. Więc hash zawiera standardowe i0 dot godz. Co to robi? To chwytając standardowych dot i0 h pliku i wklejenie go do góry wszędzie tam, gdzie jest napisane hash zawiera średnia i0 kropka godz. I każdy hash określić, że mamy widziałem, co to robi? Jego kopiowanie wartości tego skrótu zdefiniowane jest zdefiniowany jako i wklejanie, że wszędzie tam, gdzie używasz wartości. Tak naprawdę nie tylko preprocesora Operacje na bazie prostego tekstu. Nie robi nic inteligentnego. Więc wszystko jest bardziej skomplikowane. Więc teraz, że preprocesor jest zrobić, faktycznie kompilacji. Więc co kompilacji oznacza? Jesteśmy teraz dzieje z kodu c do kodu montażowej. Tak? PUBLICZNOŚCI: [niesłyszalne]? ROB: Tak, złapaliśmy, że. Więc kompilacji. Jedziemy od c do zespołu. Więc to jest rzeczywista zmiana języka. Kompilacja się oznacza przejście z na wyższy poziom języka niższy poziom języka. I C jest językiem wysokiego poziomu w stosunku do zespołu. Co to jest zespół? Jego instrukcje, które są, dość dużo, wykonane dla procesora. Ale komputer nadal nie nie rozumiem montaż. Rozumie tylko zer i jedynek. Tak więc następny etap montażu, co prowadzi nas od tych instrukcji, które Twój procesor rozumie i właściwie tłumaczy je, aby te jedynki i zera. Tak C do montażu na system dwójkowy. Ale nie mam jeszcze plik wykonywalny. Więc myślę o bibliotece CS50. Mamy ci z binarnego na Biblioteka ta CS50, który ma GetString i GetInt i to wszystko. Ale CS50 library-- w i itself-- nie jest wykonywalny. Nie ma główną funkcję. To tylko kilka z binarny które można użyć. Więc powiązanie jest jak zebranie wszystkich tych różnych plików binarnych do rzeczywistego pliku wykonywalnego. Jeden, że można wpisać kropka w kropkę z slash. Tak to jest jak plik, który napisał, - bez względu na program, jest-- Cezara kropka c. Ale teraz zostały zestawione w dół do pliku binarnego. Więc Ceaser kropka o. I to jest nasz CS50 biblioteki binarne. A oni są połączone w jednym pliku wykonywalnym. Tak? PUBLICZNOŚCI: [niesłyszalne]? ROB: Więc po pierwsze to, pamiętam, hash to jest rzeczywiście Etap wstępnego procesora. Ale to osobna. Jeśli nie używasz żadnych funkcji, które są poza swoim jednym pliku, a następnie, nie, nie trzeba łączyć wszystko ponieważ masz wszystko. Powiedział, że printf jest związana w. Jeśli kiedykolwiek używać printf, że coś , który musi być związany dlatego, że nie napisał, że. I rzeczywiście, printf automatycznie połączone w. Wiesz, jak w wierszu poleceń lub gdy Wpisuje się, widać, że mają kreska l CS50, która ma związek w bibliotece CS50? Printf, i takie, że będzie być związany automatycznie. Wszelkie inne pytania, na cokolwiek? PUBLICZNOŚCI: [niesłyszalne]? ROB: Łączenie? Mamy całą masę różnych plików binarnych. Ten przykład jest kanoniczna że używamy jest biblioteka CS50. Zebraliśmy i podawany w binarny dla tej biblioteki CS50. Chcesz korzystać getString w programie. Więc idź i używać getString. Ale bez mojego kodu binarnego dla GetString, podczas kompilowania kodu w dół, nie można faktycznie uruchomić swój Program ponieważ GetString String jest nie są jeszcze w pełni zdefiniowane. To tylko wtedy, gdy odwołuje się w moim dwójkowy że zawiera getString że teraz wszystko Dobra, może faktycznie wykonać getString. Mój plik jest kompletny. I mogę uruchomić tego. Tak? PUBLICZNOŚCI: Czy powiązanie konwersji binarny do wykonywalnego? Więc nawet jeśli nie mają innego biblioteki, nie to i tak będzie konieczne tłumaczenie [niesłyszalne]? ROB: Tak wykonywalny jest nadal w systemie binarnym. To właśnie połączenie w całość pęczek plików binarnych. PUBLICZNOŚCI: Dziękuję bardzo. ROB: Nie ma problemu. Jeszcze jakieś pytania? W przeciwnym razie, mamy wszystko ustawione. Wszystko w porządku. Dzięki. [Aplauz] PUBLICZNOŚCI: Dziękuję. ROB: Tak.