[Powered by Google Translate] [Rozdział 4] [mniej wygodne] [Nate Hardison] [Harvard University] [To jest CS50.] [CS50.TV] Dobra, witamy z powrotem do sekcji. W tym tygodniu w dziale mamy zamiar zrobić kilka rzeczy. Jedziemy do pierwszego zestawu Problem podsumować 2, który jest zbiorem problemów Cezar i Vigenère. I wtedy będziemy nurkować w Quiz 0 recenzji i spędzić trochę czasu bieżnikowania co rozmawialiśmy o w każdym z wykładów tak daleko, a my też zrobić kilka problemów z poprzedniego roku quizy. W ten sposób macie dobry sposób na przygotowanie się do tego. Aby rozpocząć, mam uruchomiony się kilka dobrych rozwiązań do poprzedniego zestawu problemów, problem Set 2, do tej przestrzeni. Jeśli faceci wszyscy uderzyć ten link, i po kliknięciu na mój nazwę i kliknij na mojej pierwszej rewizji zobaczysz caesar.c, który jest dokładnie to, co patrzę. Porozmawiajmy o tym bardzo szybko. To jest tylko roztwór próbki. To niekoniecznie jest idealne rozwiązanie. Istnieje wiele różnych sposobów na napisanie tego ale jest kilka rzeczy, które chciałem, aby podświetlić które widziałem, jak byłem klasyfikacji, typowych błędów, które myślę, że Rozwiązanie to ma bardzo dobrą pracę obsługi. Pierwszy jest o jakiś komentarz nagłówka w górnej. Na liniach 1 do 7, aby zobaczyć szczegóły, Co dokładnie ten program robi. Dobry standard praktyka podczas pisania kodu C niezależnie od tego czy program jest zawarty w jednym pliku lub czy jest podzielona na wiele plików jest mieć jakiś orientowania komentarz na szczycie. Jest to również dla ludzi, którzy wychodzą i napisać kod w świecie rzeczywistym. To jest, gdzie oni umieścić informacje o prawach autorskich. Poniżej # zawiera. W linii 16 jest jeszcze to: # define, który wrócimy w tylko trochę. A następnie raz funkcja uruchamia raz główne starty, Ponieważ program został wszystkie zawarte w jednej funkcji Pierwszą rzeczą, która się dzieje i to jest bardzo idiomatyczne i typowy program C które ma w linii poleceń argumenty-jest to, że natychmiast sprawdza dla liczby argumentów, argc. Tutaj widzimy, że program oczekuje 2 argumenty dokładnie. Pamiętaj, że istnieje pierwszy argument, że to wyjątkowy to zawsze nazwa programu, który jest uruchomiony, nazwa pliku wykonywalnego. I tak, co to robi to uniemożliwia użytkownikowi uruchomienie programu z bardziej lub mniej argumentów. Powodem, dla którego chcesz sprawdzić, to od razu, ponieważ nie możemy faktycznie uzyskać dostęp do tej tablicy argv tu niezawodnie dopóki nie sprawdzane, aby zobaczyć, jak duże jest. Jednym z najczęstszych błędów widziałem było ludzie natychmiast iść i grab argv [1]. Oni chwycić kluczowy argument z tablicy i nie do i sprawdzić na nim, a potem robią test na argc oraz następnego testu, czy pierwszy argument rzeczywiście całkowitą w tym samym czasie, i to nie działa, ponieważ w przypadku, że nie istnieją żadne argumenty podane będziesz chwytając argument, że tam nie ma lub stara się złapać jeden, który nie ma. Inne duże rzeczy, które należy zauważyć, jest to, że zawsze chcesz wydrukować jakiś pomocny komunikat o błędzie do użytkownika, aby zorientować im. Jestem pewien, że masz wszystkie programy działają, gdy nagle się zawiesi, i masz ten śmieszny mały okno, które pojawia się i mówi: coś strasznie tajemniczy i być może daje się kod błędu lub coś takiego że nie ma sensu. To jest miejsce, gdzie naprawdę chcesz przekazać coś jako i skierowane do użytkownika, tak, że kiedy go uruchomić idą "Och," face palm. "Wiem dokładnie, co robić. Wiem jak to naprawić." Jeśli nie wypisuje komunikatu, a następnie kończy się rzeczywiście pozostawiając użytkownikowi przejść badania kodu źródłowego dowiedzieć się, co poszło źle. Jest też kilka razy, że będziesz korzystać z różnych kodów błędów. Tutaj mamy tylko używane jeden powiedzieć był błąd, wystąpił błąd, nie było błędu. Większe programy, często programy, które są wywoływane przez inne programy, powróci jakiś specjalnych kodów błędów w różnych scenariuszach programowo komunikować, czego w innym wypadku wystarczy użyć miłą wiadomość dla Polski. Cool. Ponieważ pracujemy w dół, można zobaczyć, że wyciągnąć klucz z. Testujemy czy klucz pasuje. Dostajemy wiadomość od użytkownika. Powodem, że robię to w pętli while to zrobić i jest to coś, omówimy w nieco, ale okazuje się, że jeśli kontrola typu D gdy pojawi się monit, że GetString na terminalu co faktycznie robi to wysyła specjalny charakter do programu. To się nazywa ELF lub znak końca pliku. I w tym przypadku, nasz łańcuch wiadomość będzie null, więc to nie było coś, sprawdziliśmy w problemu ustawić się. Ale jak iść dalej, teraz, że zaczęliśmy rozmawiać o wskaźniki i dynamicznej alokacji pamięci na stercie, sprawdzanie wartości null, gdy masz funkcję, która może zwróci wartość null jako wartość jest coś, że będziesz chciał się dostać w zwyczaju robić. To jest tutaj przede wszystkim do ilustracji. Ale kiedy widzą getString w przyszłości, więc od problemu Zestaw 4 dalej, będziemy chcieli, aby o tym pamiętać. Powtarzam, to nie problem dla Problemu Zestaw 3 albo ponieważ nie okrył go jeszcze jest. Wreszcie docieramy do tej części, gdzie dostać się do głównej pętli szyfrowania i istnieje kilka rzeczy się tu dzieje. Najpierw iterować cały ciąg wiadomości. Tutaj mamy zachował strlen połączenie w stanie, których liczba z was nie zauważył to świetny sposób, aby przejść jest. Okazuje się, w tym przypadku nie jest to również wspaniałe, częściowo dlatego, że mamy do modyfikowania treści samej wiadomości wewnątrz pętli for, więc jeśli mamy wiadomość, że znajduje się 10 znaków, Po raz pierwszy zaczynamy że dla pętli strlen powróci co? 10. Ale jeśli następnie zmodyfikować wiadomość, powiedzieć możemy modyfikować swoje 5 znak, i rzucać w znak \ 0 w 5. pozycji, w kolejnej iteracji strlen (komunikat) nie wróci to, co zrobił Pierwszy raz powtórzyć, ale to zamiast wrócić 5 bo rzucił w tym pustym terminatora a ciąg jego długość jest określona przez pozycję, że \ 0. W tym przypadku, jest to świetny sposób, aby przejść ponieważ jesteśmy modyfikując go w miejscu. Jednak można zauważyć, że jest to rzeczywiście zaskakująco proste do szyfrowania czy można dostać math prawidłowe. Wszystko, co niezbędne jest, aby sprawdzić, czy list, który patrzysz na jest wielkie i małe litery. Powodem musimy tylko sprawdzić to i nie mamy do sprawdzenia jest przypadek, ponieważ alpha jeśli litera nazwy, lub jeśli jest to małe to jest to zdecydowanie znak alfabetu, ponieważ nie mamy wielkie i małe cyfry. Inna sprawa, co robimy i to jest trochę skomplikowane- jest mamy zmodyfikowany standardowy szyfr Cezara formułę że daliśmy w specyfikacji zestaw problemów. Czym różni o to, że mamy odjąć w wielkiej stolicy sprawy, a następnie dodaliśmy kapitałowych w kopii na końcu. Wiem, niewielu z was zrobić to w kodzie. Czy ktoś z was to zrobić w swoich pismach? Ty to zrobiłeś. Czy możesz wyjaśnić, co to robi, Sahb? Odejmując go, bo zrobił mod zaraz po nim, trzeba się go, więc w ten sposób można dostać [kaszel] position. A następnie przez dodanie go później jesteś przesunięty na ten, który chcesz. Tak, dokładnie. Co Sahb powiedział, że kiedy chcemy dodać nasze przesłanie i nasz klucz razem , a następnie, że mod, mod, że NUM_LETTERS, jeśli nie dostosowują naszą wiadomość do odpowiedniego zakresu od 0 do 25 najpierw to możemy skończyć się naprawdę dziwny numer ponieważ wartości, że mamy do czynienia, kiedy patrzymy na wiadomości [I], kiedy patrzymy na-tego charakteru naszego zwykłego tekstu wiadomości Wartość jest gdzieś w zakresie 65 do 122 opiera się na wartościach ASCII litera A poprzez małą z. I tak, kiedy mod go 26 lub NUM_LETTERS, ponieważ to była nasza # define w prawym górnym rogu tu, że zamierza dać nam wartość znajduje się w zakresie 0 do 25, i musimy znaleźć sposób, aby następnie skalę, że z powrotem i zrobić to w odpowiednim zakresie ASCII. Najprostszym sposobem na to jest po prostu przeskalować wszystko w dół w zakresie od 0 do 25 na początku, a następnie przenieść wszystko z powrotem na końcu. Innym powszechnym błędem, że widziałem ludzi jest to, że do uruchomienia jeśli faktycznie nie zrobić tego od razu, skalowanie i dodać wiadomość i klucz razem i dodać je, powiedzmy, do char zmiennej, z tym problemu jest od wiadomości [i] jest stosunkowo duża liczba na początku- pamiętać, że to co najmniej 65, jeśli jest wielka litera- jeśli masz duży klucz, powiedzenia, coś jak 100, i dodać te 2 razem w podpisane char masz zamiar uzyskać przepełnienie. Będziesz uzyskać wartość, która jest większa niż 127, która jest największą wartością, która char zmienna może posiadać. Ponownie, to dlatego, że chcesz robić takie rzeczy na początku. Niektórzy ludzie mają wokół tej sprawy w ten czy inny i testowania aby zobaczyć, czy byłoby przepełnienie zanim to zrobi, ale w ten sposób radzi sobie z tym. , A następnie w tym roztworze, że wydrukowane na cały ciąg na końcu. Inne osoby wydrukowany znak na raz. Obie są niesamowite. W tym momencie, czy macie jakieś pytania, żadnych uwag na ten temat? Rzeczy, które lubisz, czego nie lubisz? Miałem pytanie. Może brakowało mi go w trakcie wyjaśnień, ale jak ten program pominąć przestrzenie do podłączenia do klucza długości tekstu? To jest po prostu szyfr Cezara. >> Och, przepraszam, tak. Tak, zobaczymy, że. W szyfru Cezara mamy wokół, że ponieważ tylko odwrócenie znaków. Mamy tylko obracać je, jakby były wielkie i małe litery. Macie całkiem dobrze o tym? Zapraszam do kopiowania tego domu, weź to, porównać go do tego, co wam napisałem. Zdecydowanie zachęcamy do wysyłania pytań o niego zbyt. I znowu sobie sprawę, że celem tutaj z Twoim problemem ustawia jest, aby nie wy napisać doskonały kodu dla swoich zbiorów problemowych. Jest to doświadczenie nauki. Tak. Powrót do zrobienia podczas pętli, jeżeli jest równy null, więc zerowy tylko nic nie znaczy, po prostu wciskamy Enter? Null jest specjalnym wartość wskaźnika, i używamy NULL, gdy chcemy powiedzieć mamy zmiennej wskaźnikowej, który jest skierowany do niczego. I tak zazwyczaj oznacza to, że ta zmienna, zmienna ta wiadomość jest pusta, i tutaj, ponieważ używamy CS50 specjalnego typu string, co jest CS50 typu string? Widziałeś, co to jest, kiedy David odsunął kaptur na wykład? To funky-to wskaźnik, prawda? Dobrze, tak. >> To char *. I tak naprawdę moglibyśmy zastąpić to tutaj z char * Wiadomość, i tak GetString funkcji, jeśli nie udało się w ciągu od użytkownika, Nie można analizować ciąg i jeden przypadek, w którym nie można analizować ciąg jest, jeśli użytkownik wpisze znak końca pliku, kontrola D która nie jest czymś normalny sposób, ale jeśli tak się stanie wówczas funkcja zwróci tę wartość null jako sposób na powiedzenie "Hej, nie miałem ciąg". Co by się stało, gdybyśmy nie umieścić wiadomość = null, które jest coś, czego nie robili jeszcze? Dlaczego miałoby to być problem? Bo wiem, że rozmawialiśmy trochę w wykładzie na temat wycieków pamięci. Tak, zróbmy to i zobaczmy, co się dzieje. Pytanie Bazylego było co się stanie, jeśli w rzeczywistości nie mają ten komunikat = null test? Miejmy przewinąć do góry. Macie może komentować to. Właściwie, ja zapisać go w wersji. Będzie to wersja 3. Co musisz zrobić, aby uruchomić ten program to musisz kliknąć tę ikonę adni tutaj i trzeba dodać argument do niego. Musisz dać mu kluczowy argument ponieważ chcemy przekazać w argumencie wiersza poleceń. Tutaj mam zamiar dać mu numer 3. Lubię 3. Teraz powiększanie powrotem, uruchomić program. Jest uruchomiony, kompilacji, budowania. Jedziemy. To czeka na monit. Jeśli wpisać coś jak hello-gdzie poszło? Och, mój program trwał zbyt długo biec. Byłem jawing zbyt długo. Tu idzie. Teraz wpisz w hello. Widzimy, że szyfruje odpowiednio. Teraz to, co się dzieje, gdy mamy szybką getString zwrócić NULL? Pamiętam, że my że naciśnięcie sterowania D w tym samym czasie. Będę przewijać się tutaj. Będziemy go uruchomić ponownie. Building. Nie idzie. Teraz, kiedy uderzy sterowania D Mam ten wiersz, który mówi opt/sandbox50/bin/run.sh, Segmentation fault. Czy widzieliście tego wcześniej? [Student] Dlaczego nie ma->> Przepraszam? [Student] Dlaczego nie ma rdzenia zrzutu w tym przypadku? Zrzutu jest-pytanie jest dlaczego nie ma zrzutu tutaj? Pytanie jest to, że może być, ale jest zrzutu plik który pobiera zapisane na twardym dysku. W tym przypadku mamy wyłączony zrzuty pamięci na serwerze roboczym tak, że nie mają ludzie seg niewysyłanie i budowanie ton wysypisk podstawowych. Ale można dostać. Zrzuca podstawowe są takie rzeczy, że często można wyłączyć, i czasem trzeba zrobić. Błąd segmentacji, aby odpowiedzieć na to pytanie, bazylia, mówi, że próbował uzyskać dostęp do wskaźnika że nie został ustawiony, aby wskazywały niczego. Zapamiętaj Binky w filmie, kiedy próbuje Binky przejść przejść wskaźnik, który nie jest skierowany do niczego? W tym przypadku myślę, że technicznie pointer wskazuje na coś. To wskazuje na null, która jest technicznie 0, ale, że określa się w segmencie, który nie jest dostępny przez program, więc masz winy segmentacji ponieważ nie masz dostępu do pamięci, która znajduje się w ważnym segmencie jak segmentu sterty lub segmentu stosu lub segmentu danych. Cool. Jeszcze jakieś pytania na temat Caesar? Idźmy dalej. Przyjrzyjmy Revision 2 bardzo szybko. To Vigenère. Tutaj w Vigenère będziemy chodzić przez ten jeden dość szybko, ponieważ, ponownie, Vigenère i Cezar są dość podobne. Comment nagłówek jest przed, # Define jest przed, aby uniknąć korzystania z tych magicznych liczb. Dobrą rzeczą jest to że chcemy, aby przejść do innego alfabetu, czy coś w tym stylu. Zamiast iść ręcznie zmienić wszystkie 26-tych w kodzie możemy zmienić na 27 lub usunąć go jeśli były przy użyciu różnych alfabetów różnych języków. Znowu mamy tę kontrolę liczenia argumentów, i naprawdę można prawie wziąć to jako szablon. Prawie każdy program piszesz powinien mieć- jeśli trwa argumentów wiersza poleceń-niektóre sekwencja linii że czyta się to na samym początku. To jeden z pierwszych testów normalności, które chcesz zrobić. Oto co udało nam się nam upewnić się, że keyword był ważny, a to kontrola drugiej, że to zrobiliśmy. Zauważcie, że oddziela to od argc i 2. Zauważ, że w tym przypadku jedna rzecz, że mieliśmy do czynienia był zamiast wykorzystania do i chcieliśmy potwierdzić cały ciąg, i aby to zrobić trzeba rzeczywiście iść znak po znaku na ciąg. Nie ma dobrego sposobu, aby połączyć coś na nim , ponieważ, nawet na przykład w wrócę 0 jeśli nie można analizować liczbę całkowitą, tak że nawet nie działa. Znowu miły komunikat informujący użytkownika, co dokładnie się stało. To tutaj, znowu, również obsłużyć przypadek, gdy użytkownik wpisze w D sterowania charakter losowy. A potem Charlotte miał pytanie wcześniej o tym, jak udało nam się przejść spacji w naszym łańcuchu tutaj. To było trochę podobne do tego, co zrobiliśmy z Myspace programu że my w sekcji, a sposób to działało jest to, że śledził kilka liter, które widziałem. Jak weszliśmy nad ciąg wiadomości, jak szliśmy przez znak po znaku, możemy śledzić indeks jako część naszej pętli for, a następnie również śledzone liczba liter, więc nie znaki specjalne, cyfry, nie-nie-białe znaki że widział w oddzielnej zmiennej. I wtedy to rozwiązanie modyfikuje klucz aby uzyskać rzeczywistą kluczową liczbą całkowitą, i robi, że w locie, tuż przed potem idzie do szyfrowania rzeczywisty charakter wiadomości. Istnieje kilka rozwiązań, które były doskonale zbyt wielkie które zmodyfikować klucz się podczas testowania dla klucza ważności. Oprócz upewniając się, że charakter i hasła został alfabetu również okazało, że do liczby całkowitej w zakresie 0 do 25, aby następnie przejść o to zrobić później w tej pętli for. Ponownie, można zobaczyć tutaj jest to naprawdę dokładnie ten sam kod że stosuje się w tym momencie Cezara. Robisz dokładnie to samo, więc rzeczywista Sztuką jest zastanawianie się jak zamienić słowo kluczowe w całkowitej. Jedna rzecz, że my tu, że jest trochę gęsty to powtórzono tę frazę, Myślę, że można nazwać to, 3 oddzielne razy na liniach 58, 59 i 61. Może ktoś wyjaśnić, co dokładnie to zdanie nie? Jest dostęp znak, jak powiedziałeś. Tak, to jest [niesłyszalne] znak w słowo kluczowe, a więc jest to liczba liter widziałem, bo jesteś tylko poruszające keyword raz widziałeś list, tak, że będzie skutecznie pominąć spacje i takie tam. Tak, dokładnie. A potem, gdy już widziałem puste słowa kluczowego po prostu mod więc cofnąć się. Dokładnie. To idealne wytłumaczenie. Co Kevin powiedział, jest to, że chcemy, aby indeks do hasła. Chcemy uzyskać num_letters_seen charakter, jeśli chcesz, ale jeśli num_letters_seen przekracza długość słowa kluczowego, sposób możemy wrócić do odpowiedniego zakresu jest używamy operatora mod skutecznie otacza. Na przykład, jak w skrócie, nasze słowo kluczowe jest boczek, i to jest 5 liter. Ale widzieliśmy 6 liter w naszej zwykły tekst w tym momencie i szyfrowane 6. Skończymy dostępu do num_letters_seen, które jest 6 mod długość hasła, 5 i tak będziemy mieć 1, a więc co zrobimy to my będziemy dostęp do pierwszego w środku charakter naszych słów kluczowych w tym punkcie. Wszystko w porządku, wszelkie pytania dotyczące Vigenère Zanim przejdziemy? Macie całkiem dobrze o tym? Cool, super. Chcę się upewnić, że chłopaki są coraz szansę zobaczyć kod które naszym zdaniem wygląda dobrze i ma szansę uczyć się od niego. To będzie ostatni będziemy używać spacji w chwili obecnej, i jedziemy do przejścia, a ja pójdę do cs50.net/lectures więc możemy zrobić trochę przeglądu quizu. Najlepszym sposobem, myślę zacząć robić quizu recenzję ma przyjść do tej strony wykładów, cs50.net/lectures, a pod każdym z działów tydzień, więc jeśli mogę się tu w tygodniu 0, Widzę, że mamy listę tematów, które zostały uwzględnione w tygodniu 0. Jeśli którykolwiek z tych tematów wydaje się obce dla Ciebie będziesz na pewno chcemy wrócić i przeszukać notatki wykładowe i ewentualnie nawet przejrzeć wykładów, oglądanie ich ponownie, jeśli chcesz aby czuć się za to, co się dzieje z każdym z tych tematów. Powiem dodatkowo ten rok jeden z chłodnych zasobów mamy Właśnie te spodenki, które stworzyliśmy, i jeśli spojrzeć w tygodniu 0, nie mamy wszystkich tematów, ale mamy sporo z nich, niektóre z nich trudniejsze, więc oglądając te spodenki ponownie Jest to dobry sposób, aby dostać się do prędkości. W szczególności mam zamiar umieścić w wtyczce do 3 na dole, bo ja te. Ale jeśli masz problemy z binarny, bity, sześciokątne, tego rodzaju rzeczy, binarny jest doskonałym miejscem, aby rozpocząć. ASCII jest kolejnym, który jest dobry, by zobaczyć też. Możesz nawet oglądać mnie w 1.5x prędkości jeśli mam zbyt wolny dla Ciebie. Od jego oceny, nie wahaj się tego zrobić. Wystarczy zacząć naprawdę szybko, mamy zamiar przejść przez kilka tych problemów quizu tylko szybko rezygnacji przez nich. Na przykład, spójrzmy na oryginał 16, że mam prawo się tu na forum. Mamy ten następującego obliczenia w formacie binarnym, i chcemy pokazać jakąkolwiek pracę. Dobra, mam zamiar dać to szansę. Wy powinien podążać z papieru, i zrobimy to bardzo szybko. Chcemy wykonać następujące obliczenia w formacie binarnym. Mam 00110010. I mam zamiar dodać do niego 00110010. Na matematyce geniuszy po wzdłuż w domu, ta jest skutecznie mnożąc przez 2. Zacznijmy. Będziemy śledzić ten sam algorytm dodawania, co robimy gdy dodamy liczb dziesiętnych razem. Naprawdę Jedyną różnicą jest to, że pętla powraca raz mamy 1 + 1 zamiast raz dojdziemy do 10. Jeśli zaczniemy od prawej, bardzo szybko, co jest pierwszą cyfrą? [Student] 0. >> [Nate H.] 0. Great, druga cyfra? [Student] 1. [Nate H.] Czy 1? 1 + 1 jest? [Student] 10. [Nate H.] Dokładnie, więc co to jest cyfra, że ​​piszę się u podnóża 2 te dodawane razem? [Student] 1, 0, lub 0, a następnie przenosić 1. [Nate H.] 0 i posiadać 1, dokładnie. Następna w kolejce jeden, Basil, teraz ty. Co trzeci? >> [Basil] 1. [Nate H.] 1, doskonały. Kevin? [Kevin] 0. >> [Nate H.] 0, Charlotte? [Charlotte] 0. >> [Nate H.] Tak, i co mam zrobić? [Student] 1. [Nate H.] I co mam zrobić? I wtedy nosić 1. Perfect, Sahb? >> [Sahb] Teraz masz 1. [Nate H.] I mogę zrobić coś tutaj? [Sahb] Następnie na następne masz 1 bo przeniesione 1. [Nate H.] Wielki, więc możemy zakończyć to. Cool. [Student] Czy 0 + 0 = 0? 0 + 0 = 0. 1 + 1, jak pan powiedział, jest 10, lub 1, 0, raczej. 10 jest błędne, bo do mnie 10 oznacza liczbę 10, i to jest dziwactwo jak mamy reprezentowanie go, kiedy będziemy pisać. Reprezentujemy numer 2 do 1, 0, i nr 10 jest nieco inna. Co jest miłe o binarnych jest to, że naprawdę nie jest to, że wiele przypadkach trzeba się nauczyć. Jest 0 + 0 = 0, 0 + 1 = 1, 1 + 1 jest 0, a następnie podejmuje się 1, a następnie można zobaczyć tutaj, na trzeciej kolumnie od prawej mieliśmy ten 1, 1 i 1. I 1 + 1 + 1 jest 1, i nosisz inny 1. Kiedy robisz binarny dodatek, całkiem proste. Zrobię jeszcze kilka z nich, aby sprawdzić siebie rozsądek przed wyjazdem, ponieważ jest to w prawdopodobnie coś, co zobaczymy na quiz. Teraz zróbmy to następny także. Zróbmy problemu 17. Zamierzamy przekształcić numer binarny na dziesiętny. Mam 10100111001. Zapamiętaj w binarnym wideo, które zrobiłem Szedłem przez kilka przykładów, i pokazał, jak wszystko działa, gdy robisz to w układzie dziesiętnym. Kiedy pracujesz w reprezentacji dziesiętnej Myślę, że jesteśmy w tym momencie w naszym życiu, tak biegła w nim, że jest to dość łatwe do tuszować mechanikę, jak to rzeczywiście działa. Ale żeby zrobić szybki zakręcić, jeśli mam numer 137 to naprawdę oznacza i ponownie, to w reprezentacji dziesiętnej- Numer 137 oznacza, że ​​w po przecinku mam 1 x 100 + 10 + 3 x 7 x 1. To wszystko jest pobyt na ekranie. A jeśli spojrzeć na te liczby tu, 100, 10 i 1, widać, że są one właściwie wszystkie moce 10. Mam 10 ², 10 ¹ i 10 do zera. Mamy podobną rodzaju rzeczy w formacie binarnym, wyjątkiem tego, że nasza baza, jak my to nazywamy, jest 2 zamiast 10. Te 10s, że napisałem tu na dole, to 10 ², 10 ¹, 10 do zera, 10 jest nasza baza, i wykładnikiem, 0, 1, lub 2, jest implikowane przez pozycję cyfry w liczbie, że piszesz. 1, jeśli spojrzymy na to, to 1 jest w 2. pozycji. 3 znajduje się w pozycji 1. i 7 jest w 0-szy pozycji. To, w jaki sposób uzyskać różne wykładniki poniżej dla naszych baz. Po tym wszystkim we'll-faktycznie, wiesz co? Zrobimy, skąd mój przycisk Cofnij iść? Nie idzie. Kocham to cofnąć rzeczy. Po tym myślę, że dla mnie przynajmniej Najprostszym sposobem, aby rozpocząć konwersję ilości binarny lub liczba szesnastkowa, gdzie podstawą jest 16 , a nie 10 lub 2 jest iść do przodu i pisać podstawy i wykładniki dla wszystkich liczb w mojej liczbę binarną na górze. Jeśli zaczniemy od lewej do prawej, raz, co jest raczej sprzeczne z intuicją, Ja przywrócić czarny tutaj mamy 2 do 0-te pozycji a następnie mamy 2 ¹, 2 ², i 2 do 3, 2 do 4, 2 do 5, 6, 7, 8, 9, i 10. Te numery pisałem obecnie są wszystkie wykładniki. Tylko napisałem baz tutaj w pierwszej 3 tylko dla przestrzeni. W tym momencie mam zamiar iść do przodu i jestem naprawdę zamiar wymazać rzeczy, które zrobiliśmy w postaci dziesiętnej, jeśli to jest w porządku. Masz wszystko zrozumiałam. Ci z Was, oglądając online na pewno będą w stanie cofnąć mnie, jeśli chcesz. Przełączenie z powrotem na wstrzykiwacz. Teraz, co możemy zrobić, jeśli faceci nie są całkowicie do prędkości swoimi uprawnieniami 2, to całkowicie cool. To się zdarza. Rozumiem. Miałem kiedyś rozmowę kwalifikacyjną, gdzie powiedziano mi, muszę znać wszystkie uprawnienia 2 się przez 2 do 30 miejsca. To nie była praca, co mam. W każdym razie, że chłopaki mogą iść do przodu i nie matematyka tutaj ale z binarnym to nie ma sensu, i ani nie ma sensu z dziesiętnym czy albo, się do matematyki, gdzie masz zer. Widać mam 0 tu, 0 o, 0 o, 0 o, 0 o, 0 tutaj. Dlaczego może nie ma sensu do faktycznego matematyki obliczyć odpowiednią moc 2 w tej pozycji? Dokładnie, jak Charlotte mówi, będzie to 0. Może także zaoszczędzić czas, jeśli obliczenia uprawnień 2 nie jest twoja mocna strona. W tym przypadku musimy tylko go obliczyć na 2 do 0, które jest-? [Student] 1. [H. Nate] 1, 2 do 3, który jest-? [Student] 8. >> [Nate H.] 8. 2 do 4? [Student] 2. Przykro mi, 1. [Nate H.] 2 do 4 jest 16, dokładnie. 2 do 5, Kevin? >> 32. [Nate H.] 32, 2 do 8? [Student] 32 x 8, 256. [Nate H.] Perfect. I 2 do 10? [Student] 1024. [Nate H.] Tak, 1024. Gdy mamy tych liczb możemy suma ich wszystkich. I to jest to naprawdę ważne, aby zrobić kilka rzeczy. Jednym z nich jest iść powoli i sprawdzić swoją pracę. Można powiedzieć, że jest 1 na końcu tej liczby więc powinienem pewno się nieparzystą liczbę jako mojego wyniku bo wszyscy inni to będzie jeszcze numery zważywszy, że jest to liczba binarna. Inną rzeczą do zrobienia jest, jeśli można dostać się do tego punktu na teście i napisałeś go tak daleko i masz mało czasu spojrzeć na liczbę punktów, że ten problem jest wart. Problem ten, jak widać, jeśli odwrócić z powrotem do mojego laptopa naprawdę szybko- problem ten jest warte 2 punkty, więc nie jest to coś w rodzaju dodatku należy przechodzić jeśli jesteś naprawdę na czasie. Ale będziemy wrócić do iPad, a my przez to przejść bardzo szybko. Lubię robić małe numery 1-ci ponieważ uważam, że łatwiej. Lubię 32 i 8, bo idą razem dość łatwo, a otrzymamy 50. 16 i 1 dostaje 17. Nie mamy 57, a następnie możemy zrobić resztę tego, więc może zrobić 57, 156. Chodź. Człowiek, dobrze, zobaczymy. Mieliśmy 57, 256 i 1024. W tym momencie, wolałbym po prostu przejść. Nie mam zielonego pojęcia. I oczywiście trzeba czytać w tej sprawie. 7, 6 i 4, dostaniesz 17. 1, 5, 5, 2, 13. Potem mamy 3, a następnie dostać 1. 1337. Easter egg, kto? Ktoś rozpozna ten numer? Chris rozpoznaje numer. Co to znaczy, Chris? [Chris] Leet. Leet, więc jeśli spojrzeć na to, wygląda Leet. Stuff Hacker. Uważaj na tego rodzaju rzeczy w perspektywie średnioterminowej oraz quiz, a raczej. Jeśli zauważysz tego rodzaju rzeczy, a ty zastanawiasz "Huh" że może faktycznie coś znaczyć. Nie wiem. David lubi wprowadzenie go w. Jest to dobry sposób na zdrowy rozsądek to sprawdzić. Jak dobrze, widzę, co się dzieje. To tydzień 0/Week 1 rzeczy. Jeśli mamy wrócić do naszego laptopa teraz, pomniejszyć, i kilka innych rzeczy. Jest ASCII, które robiliśmy dużo z zestawów problemowych. To pojęcie kapitału A. Co to jest naprawdę? Wiedząc to dziesiętna liczba całkowita. 65 jest to, co to jest odwzorowane w ASCII tabeli i właśnie dlatego, jak komputer zapisuje je, i tak byliśmy już uciec z faktycznie piśmie Kapitał postać i charakter małe w niektórych z tych rozwiązań i mechanizmów problemowych, które robiłeś. Kilka innych rzeczy. Mamy oświadczenia, wyrażeń logicznych, warunki, pętle, zmienne i nici. Ci wszyscy wydają się mieć sens w większości? Część z tej terminologii jest trochę funky czasami. Lubię myśleć, że oświadczenia, jak w większości coś, kończy się średnikiem. Oświadczenia takie jak x = 7, który określa zmienną, przypuszczalnie nazywa x = 7. Przypuszczalnie x jest typ, który może zapisać numer 7, więc jest to int lub ewentualnie float lub krótkie lub char, coś takiego. Wyrażenie logiczne jest przy użyciu tych podwójnych wynosi i huk jest równa lub nie równy, mniejszy, większy niż, mniejsza lub równa, wszystkie tego rodzaju rzeczy. Warunki są więc jeśli else. Chcę pamiętać, że nie może mieć innego bez odpowiadających jeśli. Podobnie, nie może mieć innego, jeśli nie odpowiada, jeśli. Pętle, przywołać 3 rodzaje pętli byliśmy młotkiem w ciebie przez kilka ostatnich odcinków i zestawów problemowych. Pracy nie zaś kiedy dostajesz wejściowych użytkownika, przy pętli while aż określonego warunku jest prawdziwa, a następnie za pomocą tych pętli, jeśli trzeba wiedzieć, które iteracji pętli jesteś obecnie na to, jak o tym myślę. Lub jeśli robisz dla każdego znaku w ciągu znaków Chcę coś zrobić, dla każdego elementu w tablicy Chcę coś zrobić, aby tego elementu. Tematy i wydarzenia. Te nie zostały objęte tak wyraźnie w C, ale pamiętaj, że od podstaw. Jest to pojęcie o różnych skryptów. To jest także to pojęcie transmitowały wydarzenie. Niektórzy ludzie nie używali nadawania w swoich projektach początkowo która jest całkowicie cool, ale są to 2 różne sposoby obchodzenia się większy problem tzw współbieżności, co jest jak masz programy do wykonania lub pozornie wykonania jednocześnie? Różne zadania uruchomione podczas innych zadań są również wyświetlane. W ten sposób system operacyjny wydaje się działać. Dlatego, chociaż na przykład Mam swoją przeglądarkę działa, można również włączyć Spotify i odtworzyć utwór. To więcej koncepcyjnego rzeczą do zrozumienia. Chciałbym spojrzeć na krótkich wątków jeśli chcesz dowiedzieć się więcej o tym. Zobaczymy, wierzę, że może być problem związany z jednym z nich. Ponownie, myślę wątki i wydarzenia nie są czymś, co omówimy w C tylko dlatego, że jest to znacznie trudniejsze niż w Scratch. Nie należy martwić się o to nie, ale na pewno rozumieją pojęć, zrozumieć, co się dzieje. Zanim przejdziemy dalej, wszelkie pytania na temat Tygodnia 0 materialne? Każdy czuje się całkiem dobrze? Zrozumieć zmienne i co zmienną jest? Idziemy dalej. Tydzień 1. Kilka rzeczy tutaj nie szczególnie objęte w przeglądzie quizu koniecznie i są również bardziej koncepcyjne rzeczy do przemyślenia. Pierwszym jest to, że pojęcie o tym, co kod źródłowy, kompilatory i kod obiektu są. Ktoś? Bazyli. Jest obiektem kodu to znaczy kod źródłowy, co należy umieścić brzękiem, i kod obiektu jest co dzyń stawia się tak, że komputer może odczytać program. Dokładnie. Kod źródłowy jest kod C, że faktycznie wpisz się. Kod obiektu to co masz z brzękiem. To 0s i 1s w tym formacie binarnym. Więc co się dzieje, gdy masz kilka plików obiektowych, powiedzieć, że jesteś kompilacji projektu lub programu, który używa wielu plików kodu źródłowego, które umownie otrzymują. rozszerzenie c. Dlatego mamy caesar.c, vigenère.c. Jeśli piszesz programy Java dać im rozszerzenia. Java. Programy Pythona mają rozszerzenie. Py często. Gdy masz kilka. Plików C, należy je skompilować. Clang wypluwa wszystkie te śmieci binarnego. Następnie, ponieważ chcesz tylko 1 program, masz łącze linkera wszystkie te pliki razem obiektu w 1 pliku wykonywalnego. To jest także to, co dzieje się, gdy używasz CS50 biblioteki, na przykład. Biblioteka CS50 jest zarówno to. Plik nagłówka h który można przeczytać, że # includecs50.h. A potem to także specjalny plik binarny biblioteki że został skompilowany to 0s i 1s, a-l flag, więc jeśli wrócimy do naszych pomieszczeń i mamy naprawdę szybko na to, co się tutaj dzieje, kiedy patrzymy na nasze polecenia dzyń, co mamy to jest nasz plik kod źródłowy tutaj. Są kilka flag kompilatora. I wtedy na samym końcu, te-l Link flagi w rzeczywiste pliki binarne dla tych 2 bibliotek, CS50 bibliotece, a następnie biblioteki matematycznej. Zrozumienie celów każdego typu plików ' w procesie kompilacji jest coś będziesz chciał być w stanie dać przynajmniej szczegółowy przegląd. Kod źródłowy jest cala Object kod wychodzi. Pliki kodu obiektowego połączyć razem, a otrzymasz piękny, plik wykonywalny. Cool. Jest to również, gdzie można uzyskać błędy w wielu punktach w procesie kompilacji. To tam, na przykład, jeśli wziąć tę flagę łączenia, CS50 flag i pominąć go w pomieszczeniach lub gdy używasz kodu, to gdzie dostaniesz błąd w fazie łączenia, i linker powiedzieć: "Hej, nazwałeś GetString funkcja że jest w CS50 biblioteki. " "Mówiłeś, że to było w CS50 bibliotece, a nie mogę znaleźć kodu do niego." To miejsce, gdzie należy połączyć go, a to jest osobny z błędu kompilatora ponieważ kompilator patrzy na składni i tego typu rzeczy. Dobrze jest wiedzieć, co się dzieje, kiedy. Inne rzeczy wiedzieć. Chciałbym powiedzieć, na pewno chcesz spojrzeć na krótki na Rzutowanie wykonane przez Jordan aby zrozumieć, co ints są pod maską, jakie znaki są pod maską. Kiedy mówimy o ASCII i naprawdę spojrzeć na ASCII tabeli co to robi daje nam pod kapturem wygląd w jaki sposób komputer faktycznie reprezentuje kapitał i cyfry 7 i przecinek i znak zapytania. Komputer posiada również specjalne sposoby reprezentowania numer 7 jako liczba całkowita. Posiada specjalny sposób reprezentują liczbę 7 jako liczba zmiennoprzecinkowa, a te są bardzo różne. Rzutowanie jest to, jak mówisz, że komputer "Hej, chcę konwertować z jednej reprezentacji na inną reprezentację. " Dlaczego nie spojrzeć na to. Chciałbym również spojrzeć na krótki na bibliotekach brakuje kompilatorów. Ci, Dyskusja na temat procesu kompilacji, co biblioteka jest, i idź na niektóre z tych pytań, które mogą Ci się zapytał. Pytania na temat Tygodnia 1 materiału? Czy są jakieś tematy, które wydają się w tutaj trudne chcesz okładka? Próbuję cios przez większość tych wcześniejszych tematów tak, że możemy dostać się do wskaźniki i zrobić trochę rekursji. Myśli? Coś na pokrycie? Czas na czekoladę może? Chłopaki pracują przez nią. Zamierzam zachować popijając kawę. Tydzień 2. Dobre, dobre połączenie. W Tygodniu 2 rozmawialiśmy trochę więcej o funkcjach. W pierwszych kilku zestawów problemów tak naprawdę nie pisać żadnych funkcji w ogóle inne niż która funkcja? [Student] Main. >> Main, dokładnie. I tak widziałem różne kostiumy, że główny nosi. Jest to, w którym to ma żadnych argumentów, i po prostu powiedzieć, pustkę w nawiasach, i wtedy ten drugi, gdzie chcesz odebrać argumenty linii poleceń, i jak widzieliśmy, że tam masz int argc i argv tablicę ciągów czy teraz, że mamy rzeczywiście narażone ciąg być char *, że jest mamy zamiar zacząć pisać go jako char * argv i następnie nawiasach. W zestawie 3 Problem, chłopaki widziałem kilka funkcji, i wprowadził kilka funkcji, rysowanie patrzeć, Scramble. Prototypy były napisane dla Ciebie. Co chciałem porozmawiać o tutaj z funkcji bardzo szybko to, że są 3 części do nich, kiedy tylko napisać funkcję. Musisz określić typ wartości funkcji. Musisz podać nazwę dla funkcji, a następnie trzeba określić Lista argumentów lub listy parametrów. Na przykład, jeśli miałbym napisać funkcję, aby podsumować kilka liczb całkowitych , a następnie wróć do mnie sumę, co byłoby moim typie reklamacji gdybym chciał podsumować liczby całkowite, a następnie zwrócić sumę? Następnie nazwa funkcji. Jeśli pójdę dalej i napisać na zielono, ta część jest typ zwracany. Ta część jest nazwa. A następnie w nawiasach Tu podam argumenty, często w skrócie args, czasami nazywany params dla parametrów. A jeśli masz, wystarczy podać jeden. Jeśli masz wiele oddzielić każdy przecinkiem. I dla każdego argumentu, który otrzymał 2 rzeczy, które są-Kevin? [Kevin] Musisz podać rodzaj i nazwę. A następnie imię i nazwisko to nazwa, że ​​masz zamiar używać odnieść się do tego argumentu w funkcji SUM, w funkcji, którą aktualnie pisze. Nie musisz się na przykład, jeśli mam zamiar Reasumując powiedzieć, tablica liczb całkowitych-we'll zrobić int tablicy, i dam sobie niektóre nawiasy klamrowe nie- potem, kiedy przekazać tablicę do funkcji SUMA I przekazać go na pierwszej pozycji na liście argumentów. Ale tablica, że ​​przechodzą w nie musi mieć arr nazw. Układ będzie, jak odnoszę się do tego argumentu w ciele funkcji. Inne rzeczy, które musimy wziąć pod uwagę, i to jest nieco inna od funkcji, ale myślę, że to ważny punkt, jest to, że w C kiedy piszę funkcji takich jak ta skąd mam wiedzieć, ile elementów znajduje się w tej tablicy? To jest trochę podchwytliwe pytanie. Rozmawialiśmy o tym trochę w zeszłotygodniowym sekcji. Skąd mam wiedzieć, liczbę elementów wewnątrz tablicy w C? Czy jest jakiś sposób? Okazuje się, że nie sposób się dowiedzieć. Musisz przekazać go osobno. Istnieje trik, który można zrobić jeśli jesteś w tej samej funkcji, w której tablica została uznana, i pracy z tablicy stosu. Ale to działa tylko jeśli jesteś w tej samej funkcji. Kiedy przekazać tablicę do innej funkcji lub, jeśli już zadeklarował tablicę i umieścić tę tablicę na stercie, użyłeś malloc  i tego rodzaju rzeczy, to wszystkie zakłady są wyłączone. Wtedy faktycznie musi przekazywać Specjalny argument lub inny parametr mówi ci, jak duża tablica jest. W tym przypadku, chciałbym użyć przecinka-Przepraszam, to będzie wyłączenie ekranu tu i chciałbym przekazać w innym argumentem  i nazywają to int len ​​na długości. Jedna rzecz, która może pochodzić z quizu prosi cię do zapisu lub wykonania szczególnego funkcję o nazwie coś. Jeśli nie daje prototyp, więc cała ta sprawa tutaj ten cały bałagan nazywa deklarację funkcji lub prototyp funkcji, jest to jedna z pierwszych rzeczy, które będziesz chciał do paznokci w dół, jeśli nie jest podana ci od razu na quiz. Inny trik nauczyłem jest to, że powiedzieć, że dają ci prototyp funkcji, a my mówimy, "Hej, masz to napisać". Wewnątrz nawiasów klamrowych, które masz na quiz jeśli zauważysz, że istnieje rodzaj powrotu i można zauważyć, że typ zwracany jest czymś innym niż pustką, co oznacza, że ​​funkcja nie zwraca nic, następnie jedna rzecz na pewno chcesz to zrobić, to napisać jakiś instrukcji return na końcu funkcji. Return, w tym przypadku, możemy umieścić puste, ponieważ chcemy, aby wypełnić puste. Ale to dostaje myślisz w odpowiedni sposób o tym, jak ja mam podejść do tego problemu? I przypomina ci, że będziemy musieli zwrócić wartość do wywołującego funkcji. Tak. >> [Student] Czy styl stosuje się, gdy piszemy kod na quizie? Takich jak wgniecenia i tego typu rzeczy? >> [Student] Tak. Nie, to nie tak dużo. Myślę, że dużo, to jest coś, będziemy wyjaśnienie na quizie, w dniu, ale zazwyczaj martwić # obejmuje i tego rodzaju rzeczy, to jest rodzaj zewnątrz. [Student] Czy trzeba komentować odręcznego kodu? Czy trzeba komentować odręcznego kodu? Komentując zawsze jest dobre, jeśli martwisz się o częściowej ulgi lub chcesz przekazać sens do równiarka. Ale, znowu, wyjaśnienia na quizie siebie na dzień quizu, ale nie wierzę, że będziesz zobowiązany napisać komentarz, nie. Zazwyczaj nie, ale na pewno coś takiego, gdzie można przekazać sens, jak "Hej, to jest tam, gdzie idę z nim." A czasami, które mogą pomóc z częściowym kredytu. Cool. Bazyli. [Basil] Jaka jest różnica między oświadczając, powiedzmy, int Lang w argumentach lub parametrów w porównaniu deklarowanie zmiennej w funkcji? Wow, kawa zszedł tchawicę. [Basil] Podoba które rzeczy chcemy umieścić w argumentach. Tak, to jest dobre pytanie. Jak wybrać, jakie rzeczy, które chcesz umieścić w argumentach wobec jakich rzeczy należy zrobić wewnątrz funkcji? W tym przypadku mamy włączone oba te jako argumenty ponieważ są one czymś, co każdy, kto ma zamiar używać funkcji SUMA musi określić te rzeczy. Funkcja suma, jak rozmawialiśmy, nie ma sposobu, by dowiedzieć jak duża tablica jest dostaje od swojego rozmówcy lub ktokolwiek jest za pomocą funkcji SUMA. To nie ma możliwości dowiedzenia się, jak duży, że tablica jest. Powodem mijamy na tej długości tu jako argument dlatego, że jest coś, co my w zasadzie mówi abonenta z funkcji, kto ma zamiar używać funkcji SUMA: "Hej, nie tylko trzeba dać nam tablicę z wskazówki, trzeba też powiedzieć, jak duża tablica dałeś nam jest. " [Basil] Ci będzie być zarówno argumenty wiersza poleceń? Nie, to są rzeczywiste argumenty, które chcesz przekazać do funkcji. Pozwól mi zrobić nową stronę tutaj. [Basil] Podoba imię minie- [Nate H.] Jeśli mam int main (void) i mam zamiar umieścić w 0 powrotu tu na dole, i powiedzieć, że chcesz wywołać funkcję SUMA. Chcę powiedzieć, int x = suma (); Aby skorzystać z funkcji suma muszę zdać zarówno tablicy, że chcę, aby podsumować i długość tablicy, więc, gdy jest to zakładając miałem tablicę wskazówki, że miałem int numbaz [] = 1, 2, 3, rodzaj użytkowania, który włamał się składni tam, to co chciałbym zrobić, to w sumie chciałbym przekazać w zarówno numbaz i numer 3 powiedzieć funkcji Sum "Dobra, tu jest tablica chcę żebyś Podsumowując". "Tu jest jego wielkość." Czy to ma sens? Czy to wyjaśniło Twoje pytanie? Pod wieloma względami to nie równolegle, co robimy z głównym kiedy mamy argumenty wiersza poleceń. Program jak Caesar szyfrowania, na przykład, że potrzebne Argumenty wiersza poleceń, nie będzie w stanie nic zrobić. Nie wiem, jak do szyfrowania, jeśli nie powiedzieć, to to, co kluczowe w użyciu lub, jeśli nie powiedzieć to, co łańcuch chciał zaszyfrować. Skłoniło do wejścia, to jest, gdy mamy 2 różne mechanizmy podejmowania wejście od użytkownika, na przy informacji od użytkownika. Na problem Ustaw 1 widzieliśmy to getInt, getString, GetFloat drogę zachęcania do wejścia, i że nazywa się przy użyciu standardowego strumienia wejściowego. To jest nieco inny. To coś, co można zrobić w tym samym czasie, w przeciwieństwie do po wywołaniu programu, po uruchomieniu program uruchomiony. Argumenty wiersza poleceń wszystkim określone są w momencie startu biegu programu. Byliśmy zmieszaniu obu tych. Kiedy używamy argumentów do funkcji, to jest podobnie jak argumenty wiersza polecenia do main. Jest to przy wywołaniu funkcji, musisz poinformować go co dokładnie potrzebuje w celu wykonywania swoich zadań. Inną dobrą rzeczą patrzeć i dam ci spojrzeć na to w swoim wolnym czasie, i został pokryty w quizie-było to pojęcie zakresu i zmienne lokalne porównaniu zmiennych globalnych. Czy zwracać uwagę na to. Teraz, gdy jesteśmy już na tej innej rzeczy, w Tygodniu 3 zaczęliśmy rozmawiać o wyszukiwanie i sortowanie. Wyszukiwanie i sortowania, przynajmniej CS50, jest bardzo wprowadzenie do niektórych z bardziej teoretycznych części informatyki. Problem poszukiwania, problem sortowania są duże, kanoniczne problemy. Jak znaleźć konkretny numer w tablicy miliardów liczb całkowitych? Jak znaleźć konkretnej nazwy wewnątrz książki telefonicznej która jest przechowywana na komputerze przenośnym? A więc wprowadzenie tego pojęcia asymptotycznych czasów przebiegu naprawdę oszacować, jak długo, jak ciężko to problemem są jak długo się do rozwiązania. W Uważam, 2011 w quizie jest problem, że myślę zasługi obejmujące bardzo szybko, co jest ta, problem 12. O nie, to Omega. Tutaj mówimy o najszybszym możliwym czasie wykonywania dla konkretnego algorytmu i najwolniejszy możliwy czas run. Ta Omega i O są tak naprawdę na skróty. Są skróty notacji za powiedzenie jak szybko, w przypadku możliwie najlepszy będzie nasz run algorytm, i jak wolno w przypadku najgorszym możliwym będzie nasz algorytm uruchomić? Zróbmy kilka z nich, a te zostały również objęte w notacji asymptotycznej na krótko, co gorąco polecam. Jackson zrobił naprawdę dobrą robotę. Z wyszukiwaniem binarnym, mówimy o binarnym wyszukiwanie jako algorytm, a my zazwyczaj o tym mówić w kategoriach jej wielkiego O. Co to jest duże O? Co to jest najwolniejszy możliwy czas pracy wyszukiwania binarnego? [Student] N ²? Zamknij Chyba podobny do tego. To dużo szybciej niż. [Student] Binary? >> Tak, binary search. [Student] To log n. Log n, więc co robi log n oznacza? Jest to o połowę każdej iteracji. Dokładnie, tak w przypadku najwolniejszego możliwym powiedzieć, jeśli masz posortowaną tablicę miliona liczb i liczby szukasz jest albo pierwszy element tablicy lub elementu ostatniego w tablicy. Pamiętaj, binarnie algorytm wyszukiwania działa patrząc na środkowym elemencie, zobaczyć, czy to mecz, który szukasz. Jeśli tak, to świetnie, że znalazłeś to. W przypadku możliwie najlepszy, jak szybko działa wyszukiwanie binarne? [Studenci] 1. 1, to jest stała czasowa, duże O z 1. Tak. [Student] Mam pytanie. Kiedy mówisz zaloguj n, to znaczy w odniesieniu do podstawy 2, prawda? Tak, tak, to jest inna sprawa. Mówimy n log, i myślę, kiedy byłem w szkole średniej I zawsze założyć, że log był podstawą 10. Tak, tak, tak, zaloguj 2 podstawa jest zazwyczaj co używamy. Znowu wraca do binarnego wyszukiwania, jeśli szukasz albo element na końcu lub na element początku ponieważ zaczynają się w środku, a potem wyrzucić zależności od tego, pół nie spełnia kryteriów, które szukasz, i przejść do następnej pół i pół następnego i pół następnego. Jeśli szukam największego elementu w tablicy liczb całkowitych mln Zamierzam go co najwyżej połowę dzienniku 1 mln razy zanim w końcu przetestować i zobaczyć, że element Szuka największa w lub najwyższy wskaźnik tablicy i że będzie log n, zaloguj 1 milion razy. Sortowanie bąbelkowe. Czy faceci pamiętam algorytmu sortowania bąbelkowego? Kevin, możesz dać mi szybko zakręcić, co się stało w algorytmie sortowania bąbelkowego? [Kevin] Zasadniczo to przechodzi wszystko w liście. Wygląda to na dwóch pierwszych. Jeśli pierwsza jest większa od drugiej it swapów nich. Następnie porównuje drugi i trzeci, to samo, swapy, trzecie i czwarte, w dół. Większe numery nastąpi do końca. I po pętli jednak wielu skończysz. Dokładnie, tak to, co powiedział, jest to, że Kevin będziemy obserwować większych liczb Bańka do końca tablicy. Na przykład, czy przeszkadza iść z nami przez ten przykład, jeśli jest to nasza tablica? [Kevin] Będziesz się 2 i 3. 3 jest większa niż 2, więc zamienić je. [Nate H.] Prawo, więc zamiana tych, a więc mamy 2, 3, 6, 4 i 9. [Kevin] Następnie porównać 3 i 6. 3 jest mniejsza niż 6, więc zostaw je, 6 i 4, można zamienić je, ponieważ 4 jest mniejsza niż 6. [Nate H.] Prawo, więc mam 2, 3, 4, 6, 9. [Kevin] A 9 jest większa niż 6, więc zostaw. I chcesz przejść z powrotem przez to ponownie. [Nate H.] Czy mogę zrobić w tym momencie? >> [Kevin] L. A dlaczego nie zrobiłem w tym momencie? Bo to wygląda jak moja tablica jest sortowana. Patrzę na niego. [Kevin] Przejdź przez nią ponownie i upewnij się, że nie ma więcej swapy zanim będzie można w pełni zatrzymać. Dokładnie, więc trzeba iść dalej przez i upewnij się, że nie istnieją żadne swapy że można zrobić w tym momencie. To był naprawdę szczęśliwy, jak pan powiedział, że skończyło się tylko o 1, aby przejść i mamy załatwione. Ale aby to zrobić w ogólnym przypadku będziemy rzeczywiście trzeba to zrobić w kółko. I faktycznie, to był przykład przypadku najlepszym możliwym jak widzieliśmy w problem. Widzieliśmy, że najlepsza sprawa N. Przeszliśmy przez tablicy 1 raz. Co jest najgorszym możliwym przypadku tego algorytmu? [Kevin] N ². A co to wygląda? Co by wygląd tablicy tak będzie wymagać czasu ² n? [Kevin] [niesłyszalne] posortowane. Dokładnie, więc gdybym miał tablicy 9, 7, 6, 5, 2, najpierw 9 by bańka całą drogę. Po 1 iteracji mielibyśmy 7, 6, 5, 2, 9. Następnie 7 będzie się pęcherzyków, 6, 5, 2, 7, 9, i tak dalej, i tak dalej. Musielibyśmy przejść całej tablicy n razy, i rzeczywiście można uzyskać nieco bardziej precyzyjna niż ta bo raz mamy przeniósł 9 się aż do ostatniej możliwej pozycji wiemy, że nie musimy się porównać z tym elementem ponownie. Gdy zaczynamy się pęcherzyków na 7 wiemy, że możemy zatrzymać po 7 jest tuż przed 9 skoro mamy już porównał 9 do niego. Jeśli zrobisz to w inteligentny sposób, że nie jest dobrze, myślę, że wiele czasu. Nie idziesz do porównania wszystkich możliwych kombinacji [niesłyszalne] za każdym razem przejść przez każdej iteracji. Ale nadal, gdy mówimy o tym górne możemy powiedzieć, że szukasz na n ² porównań przez całą drogę. Wróćmy, a ponieważ zaczynamy się trochę mało czasu Chciałbym powiedzieć, powinno się przejść przez resztę tej tabeli, wypełnić to wszystko. Pomyśl o przykładach. Pomyśl o konkretnych przykładach. To naprawdę przydatne i pomocne uwagi. Narysuj go. Jest to rodzaj tabeli, jak przejść przez w informatyce trzeba naprawdę zacząć wiedzieć te przez serce. Są to rodzaje pytań można uzyskać w wywiadach. Są różne rzeczy, które są dobre, by wiedzieć, i myślę o tych przypadkach krawędzi, naprawdę dowiedzieć się, jak myśleć o wiedząc, że na bańce sortować najgorszy możliwy tablicę sortować z tym jest taki, który znajduje się w odwrotnej kolejności. Wskaźniki. Porozmawiajmy trochę o wskaźniki. W ciągu ostatnich kilku minut mamy tutaj Wiem, że to jest coś, wraz z pliku I / O, który jest dość nowy. Kiedy mówimy o wskaźniki powód chcemy rozmawiać o wskaźniki Jest tak, ponieważ, gdy wszystko pracujemy w C jesteśmy naprawdę na poziomie dość niskim w porównaniu do większości nowoczesnych języków programowania. Jesteśmy rzeczywiście w stanie manipulować zmienne w pamięci, dowiedzieć się, gdzie są one faktycznie się w naszej pamięci. Kiedy już przeszli do podjęcia zajęcia systemu operacyjnego zobaczysz że jest znów rodzaj abstrakcji. To nie jest faktycznie prawdą. Mamy pamięci wirtualnej, która ukrywa te informacje od nas. Ale teraz można założyć, że gdy masz program, na przykład podczas uruchamiania uruchomić program-szyfr Cezara Będę przełączyć z powrotem do mojego iPada naprawdę szybko- , że na samym początku programu, jeśli masz, powiedzmy, 4 gigabajty pamięci RAM na komputerze przenośnym, dostaniesz uchylił ten kawałek, a my nazywamy to RAM. I rozpoczyna się w miejscu, mamy zamiar zadzwonić 0, i kończy się w miejscu, które będziemy nazywać 4 gigabajty. Naprawdę nie mogę napisać. Człowiek, który włamał. Gdy program wykonuje system operacyjny rzeźbi pamięć RAM, i określa różne segmenty dla różnych części programu, aby żyjemy Tu obszar ten jest swego rodzaju ziemi niczyjej. Kiedy iść trochę dalej tutaj masz rzeczywiście miejsce, gdzie Kod dla życia programu. Że rzeczywisty kod binarny, plik wykonywalny, faktycznie jest ładowany do pamięci podczas uruchamiania programu, a żyje w segmencie kodu. A jak Twój program wykonuje procesor wygląda na tym segmencie kodu dowiedzieć się, co to jest następna instrukcja? Jaki jest następny wiersz kodu muszę wykonać? Istnieje również segment danych, a to jest w przypadku gdy te stałe łańcuchowe przechowywana że używałeś. A potem dalej się tam to jest miejsce zwane sterty. Mamy dostęp do pamięci, tam za pomocą malloc, , a następnie w kierunku samej górze programu tam stos, i tam graliśmy w większości na początku. To nie jest w skali, ani nic. Wiele z tego jest bardzo zależne od maszyny, zależne od systemu operacyjnego, ale jest to stosunkowo jak rzeczy się pofragmentowane up. Po uruchomieniu programu i zadeklarować zmienną o nazwie x- Zamierzam wyciągnąć kolejne pole na dole, a to będzie RAM również. I zamierzam szukać. Będziemy rysować postrzępione linie, aby wskazać to tylko niewielka część pamięci RAM i nie wszyscy o tym jak wyciągnąć na szczycie. Jeśli oświadczam zmienną całkowitą o nazwie x, następnie co rzeczywiście się jest odwzorowaniem , które są przechowywane w tablicy symboli mojego programu który łączy X Nazwa tego regionu pamięci Narysowaliśmy tu między pionowymi kreskami. Jeśli mam linii kodu w moim programie, który mówi x = 7 procesor wie, "Och, dobrze, wiem, że żyje x w tym miejscu w pamięci." "Mam zamiar iść do przodu i napisać 7 tam." Jak to jest wiedzieć, co to jest miejsce w pamięci? Cóż, to wszystko zrobić w czasie kompilacji. Kompilator dba o przydzielenie gdzie każda ze zmiennych zamiar iść i utworzenie specjalnego mapowanie a raczej łączenie kropek między symbolem i dokąd zmierza, zmienna nazwisko i gdzie to się żyje w pamięci. Ale okazuje się, że rzeczywiście możemy uzyskać do niego dostęp w naszych programach, jak również. To dostaje ważne, gdy zaczynamy mówić o niektórych struktur danych, które jest pojęciem, które mamy zamiar wprowadzić później. Ale teraz, co można wiedzieć, jest to, że można utworzyć wskaźnik do tej lokalizacji, x. Na przykład, można utworzyć zmiennej wskaźnika. Kiedy tworzymy zmienną wskaźnika używamy notacji gwiazdy. W tym przypadku, to mówi, że zamierzam utworzyć wskaźnik do int. To typ, tak jak każdy inny. Dajemy mu zmienną jak y, a potem ustawić go równa adresu do adresu. W tym przypadku, możemy ustawić y zwrócić do x poprzez adres X, co robimy z tym ampersand, a następnie ruszyliśmy do punktu y do niego. Co to w zasadzie nie jest, jeśli przyjrzymy się naszej pamięci to tworzy oddzielną zmienną. To się nazywają to y, a kiedy ta linia kodu wykonuje to faktycznie zamierza stworzyć mały wskaźnik które zazwyczaj wyciągnąć jak strzała, i ustawia y wskazać x. Tak. [Student] Jeśli x jest już wskaźnik, możesz sobie zrobić int * y = x, zamiast do znaku handlowego? Tak. Jeśli x jest już wskaźnik, to można ustawić 2 wskaźniki równe do siebie, w tym przypadku y nie wskazuje na x, ale to wskazywać na cokolwiek x wskazuje na. Niestety, mamy czas. Co chciałbym powiedzieć w tym momencie, możemy mówić o tym w trybie offline, ale chciałbym powiedzieć, zacząć działać poprzez ten problem, nr 14. Można tam zobaczyć już trochę wypełnić dla ciebie. Można zobaczyć, że gdy ogłosimy 2 wskaźniki, int * x i y *, i pamiętać, że wskazując * obok zmiennej było coś, co zostało zrobione w zeszłym roku. Okazuje się, że to jest podobne do tego, co robimy w tym roku. To nie ma znaczenia, gdzie piszesz * kiedy deklarując wskaźnik. Ale mamy napisane * obok typu bo to bardzo jasno, że jesteś deklarowania zmiennej wskaźnika. Można zobaczyć, że deklarowania 2 wskaźników daje nam 2 pola. Tu, kiedy zbiór X równą malloc co to mówi, jest uchylenie pamięci w stercie. To małe pudełko tu, to koło, znajduje się na stercie. X jest z nią. Należy pamiętać, że y nie jest jeszcze wskazanie do niczego. Aby uzyskać pamięci, aby zapisać numer 42 w x będziemy używać notacji, co? [Student] * x = 42. Dokładnie, * x = 42. To oznacza, śledzić strzałkę i rzucić 42 tam. Tu, gdzie możemy ustawić Y i X mamy y wskazując na x. Ponownie, to jest właśnie to, co powiedział Kevin, gdzie możemy ustawić y równa x. Y nie wskazuje X. Raczej jest to, co wskazuje na to wskazuje na x oraz. I wreszcie w ostatnim polu są 2 możliwe rzeczy, które mogliśmy zrobić. Jeden to moglibyśmy powiedzieć * x = 13. Inna rzecz, można powiedzieć,-Alex, czy wiesz, co możemy zrobić tutaj? Można powiedzieć, * x = 13 or- [Student] Można powiedzieć, int cokolwiek. [Nate H.] Jeżeli zostały określone jako int Zmienna mogliśmy zrobić. Możemy też powiedzieć, * y = 13, ponieważ są one zarówno wskazując tym samym miejscu, więc możemy użyć zmiennej się tam dostać. Tak. >> [Student] Co to będzie wyglądać, jeśli tylko powiedzieć, int x jest 13? To byłoby zadeklarowanie nowej zmiennej o nazwie x, co nie działa. Musielibyśmy kolizji ponieważ zadeklarowane x jest wskaźnikiem tutaj. [Student] Jeśli po prostu musieliśmy to stwierdzenie samo w sobie, co to będzie wyglądać pod względem okręgu? Jeśli mielibyśmy x = 13 to będziemy mieć pole, a zamiast strzałki coming out of the box chcemy wyciągnąć go tylko jako 13. [Student] W polu. Okay. Dziękuję za oglądanie, i powodzenia na Quiz 0. [CS50.TV]