[MUZYKA] David J. MALAN: W porządku. To CS50 i to jest początek tygodnia 2. I będziesz przypomnieć, że ponad w ciągu ostatnich kilku tygodni, byliśmy wprowadzenie komputera nauka i kolei, programowanie. I zaczęliśmy historię drodze Scratch, że język graficzny z MIT Media Lab. A potem ostatnio W zeszłym tygodniu, jak my wprowadzenie higher-- A Język niższego poziomu znany jak C, coś, co jest czysto tekstowe. I rzeczywiście, ostatni raz zbadane w tym kontekście szereg pojęć. To, przypomnijmy, był bardzo Pierwszy program przyjrzeliśmy. A ten program, po prostu, wypisuje "Hello, World". Ale jest tak wiele pozornie magiczne dzieje. Jest to #include z tych nawiasach kątowych. Jest int. Nie (void). Jest nawiasy, nawiasy klamrowe, średniki, a więc znacznie więcej. A więc przypomnieć, że wprowadziliśmy Scratch abyśmy mogli najlepiej, patrz przeszłość że składnia, rzeczy, które naprawdę nie jest wszystko to intelektualnie ciekawe, ale na początku jest absolutnie nieco kłopotliwe owinąć wokół umysł. I rzeczywiście, jedną z najbardziej powszechnych rzeczy w klasie programowania na początku, zwłaszcza dla tych mniej wygodny, ma się sfrustrowany i wyzwolony przez pewien składniowych Błędy nie wspominając błędy logiczne. I tak wśród naszych celów Dzisiaj, w rzeczywistości, będzie być wyposażyć niektóre Techniki rozwiązywania problemów na jaki aby lepiej rozwiązywać problemy się w postaci debugowania. I będziesz przypomnieć także, że środowisko, które wprowadziliśmy Ostatni raz był nazywany CS50 IDE. Jest to oprogramowanie oparte na sieci Web, które umożliwia programowanie w chmurze, by tak rzec, zachowując wszystkie swoje Plików razem, jak znów będzie dziś. I przypominam, że mamy revisited te tematy tutaj wśród nich funkcje i pętle, oraz Zmienne i wyrażenia logiczne, i warunki. A właściwie kilka bardziej, że my tłumaczone ze świata Scratch w świecie C. Ale zasadnicza budowa bloki, by tak rzec, były naprawdę ciągle to samo w zeszłym tygodniu. W rzeczywistości, tak naprawdę miał inna kawałek układanki, jeśli będzie. Zamiast tego fioletowy zapisz blok, możemy zamiast nie printf, który jest Ta funkcja w C, które Umożliwia drukowanie coś i sformatować ją na ekranie. Wprowadziliśmy CS50 Biblioteka, gdzie mają teraz do dyspozycji get_char, i get_int i get_string, i kilka innych funkcji, dobrze, za pomocą której można uzyskać wejście od użytkownika własnej klawiatury. I my również przyjrzał się rzeczy jak these- bool i char, i double, float, int, long_long ciąg. I nie ma nawet inne typy danych w C Innymi słowy, jeśli deklarują zmienna do przechowywania jakąś wartość, lub podczas realizacji funkcji która zwraca jakąś wartość, można określić, jakie typ wartości, która jest. Czy jest ciągiem znaków, jak ciąg znaków? Czy jest to liczba, jak na liczbę całkowitą? Czy to zmiennoprzecinkowe Wartość lub podobne? Więc w C, w odróżnieniu od podstaw, tak naprawdę zaczął określić, jakiego rodzaju dane wracaliśmy lub używanie. Ale, oczywiście, również wpadł pewne fundamentalne ograniczenia informatyki. A w szczególności Ten język C, przypomnijmy że przyjrzeliśmy się całkowitą przepełnienie, rzeczywistość że jeśli masz tylko skończoną ilość pamięci lub konkretnie liczbą skończoną bitów, można liczyć tylko tak wysoko. I tak patrzyliśmy na ten przykład tutaj przy czym licznik w samolocie, Właściwie, jeśli działa na tyle długo, by przepełnienia i doprowadzić do oprogramowania rzeczywiste fizyczne potencjalny błąd. Przyglądaliśmy się także pływające Punkt nieścisłości, rzeczywistość że tylko skończoną liczbą bitów, czy jest to 32 lub 64, można określić tylko tyle numerów po kropce dziesiętnej, po którym zaczynają się nieprecyzyjne. Tak na przykład, jedna trzecia w Świat tu, w naszym ludzkim świecie, Wiemy tylko, po prostu nieskończona liczba 3S po przecinku. Ale komputer nie może niekoniecznie stanowią nieskończoną liczbę numerów jeśli tylko pozwoli to jakiś ograniczona ilość informacji. Więc nie tylko my się z wami wyposażyć z większą mocą w kategoriach w jaki sposób można wyrazić siebie w klawiatura w zakresie programowania, również ograniczone, co rzeczywiście można zrobić. I rzeczywiście, błędy i błędy mogą wynikać z tego rodzaju problemów. I rzeczywiście, wśród tematów dziś będą tematy takie jak debugowania i rzeczywiście patrząc pod maską w jaki zostały wprowadzone rzeczy ostatniego tygodnia są faktycznie realizowane tak aby lepiej zrozumieć zarówno możliwości i ograniczenia języka jak C A w rzeczywistości, będziemy obierać powrotem warstw z najprostszych struktury danych, coś, co nazywa tablicą, która Scratch dzieje się nazywać "listy". To trochę różne w tym kontekście. A potem będziemy również wprowadzać jedną z Pierwszy z naszych problemów specyficznych domen W CS50, świat kryptografii, sztuka kodowania lub szyfrowania informacji, dzięki czemu które można wysyłać grypsy i dekodowania grypsy między dwiema osobami, A i B. Więc zanim przejścia do tego nowego świata, spróbujmy wyposażyć niektóre techniki, z którymi można wyeliminować lub zmniejszenie co najmniej niektórych z frustracji że prawdopodobnie napotkał nad samym tylko ubiegłym tygodniu. W rzeczywistości, przed wami są such-- niektóre Twoje pierwsze problemy w C i kursy są, jeśli jesteś podobny do mnie, po raz pierwszy spróbować wpisać się program, nawet jeśli myślisz logicznie Program jest bardzo prosty, można bardzo dobrze uderzyć w mur, a kompilator nie będzie współpracować. Wykonanie lub Clang nie będzie rzeczywiście zrobić swoje rozkazy. I dlaczego może to być? Cóż, rzućmy okiem na, być może, prosty program. Mam zamiar iść do przodu i zapisać to w plik o nazwie buggy0.c umyślnie, bo wiem, że go być wadliwy z wyprzedzeniem. Ale nie może zrozumieć, że jeśli ten Jest to pierwszy albo drugi albo trzeci program że jestem naprawdę co ja. Więc mam zamiar iść do przodu i wpisz się, int main (void). A potem wewnątrz moich nawiasy, bardzo zaznajomiony ( "Hello, world-- backslash, n ") - i średnik. Uratowałem plik. Teraz mam zamiar iść w dół moim oknie terminala i rodzaj make buggy0, bo, znowu, nazwa pliku jest dziś buggy0.c. Więc make buggy0, Enter. I, och, Boże, pamiętam z ostatniej chwili komunikatów o błędach, które nie jest dobrą rzeczą. Więc nie ma wyjścia jest dobrą rzeczą. Ale tu mam jasno pewna liczba błędów. Tak więc w pierwszym wierszu wyjścia po wpisaniu dokonać buggy0, przypomnijmy, Wyjście jest dość rozwlekły Clang jest. Pod maską, CS50 IDE jest skonfigurowany wykorzystać całą masę Opcje z tym kompilator tak, że nie masz myśleć o nich. I to wszystko, że pierwsza linia oznacza, że ​​zaczyna się od Clang. Ale po tym, problemy zaczynają się pojawiać. Buggy0.c na linii 3, charakteru 5, nie jest duży, czerwony błąd. Co to jest? Pośrednio deklarowania funkcji biblioteki printf z typu int (const char *, ...) [-Werror]. Mam na myśli, to bardzo szybko staje się bardzo zaawansowanych. I z pewnością, w pierwszym oka, nie bylibyśmy oczekiwać, aby zrozumieć Całość tej wiadomości. I tak jeden z lekcji do dziś się dzieje będzie starać się zauważyć wzory lub podobnych rzeczy, błędów może mieć spotykane w przeszłości. Warto więc odciąć tylko te słowa, które wyglądają znajomo. Duży, czerwony Błąd jest wyraźnie symboliczne, że coś jest nie tak. pośrednio deklarowania Biblioteka funkcji printf. Więc nawet jeśli nie do końca rozumiem, co niejawnie deklarowania funkcji biblioteki środków, z pewnością problem odnosi się do printf jakoś. A źródłem tego problemu Ma to związek z deklarując ją. Deklarowanie funkcją jest podając je po raz pierwszy. I użyliśmy terminologię w ubiegłym tygodniu deklarowania prototypów funkcji, albo w jednej linii na górnej swojej własny plik lub w tak zwanym pliku nagłówka. Iw jaki plik nie mówimy w zeszłym tygodniu, że printf jest cytat, koniec cytatu, oświadczył? W jaki plik jest prototyp? Więc jeśli pamiętamy, pierwszą rzeczą I wpisane, prawie każdy program ostatnia time-- i przypadkowo przed chwilą rozpoczął wpisując myself-- był ten jeden here-- hash-- #include