DAVID J MALAN: Wszystkie Dobra, więc to jest CS50. I jest to wyraźnie w piątek. I to jest koniec tygodnia. Więc może pamiętacie, że skończyliśmy, Ostatnim razem, z cliffhanger rodzajów. W którym możemy wystawiać kłamstwo, że nie względu na to, co już nauczył rośnie w górę, 1 podzielone przez 10 nie jest w Fakt, 0,1 lub 0,100 lub 0,10000. W rzeczywistości, jeśli skompilować to Program, jak to było wczoraj, z, sprawiają, niedokładności, a następnie zrobić kropkę, slash, brak precyzji, dowiedzieliśmy się, że to, co jest 1 podzielone przez 10 rzeczywiście jest. Więc to nie jest tak naprawdę całkiem inaczej. Ale to robi aluzję na niektóre podstawowym ograniczeniem komputerów. I rzeczywiście, wśród rzeczy będziemy robić dziś jest przyjrzeć się, dlaczego to ma się stało, jakie konsekwencje ma to, jak ludzkość nie powiodła się uchwycić to w jakiś bardzo poważne situations-- wynik z których jest dość tragiczna i expensive-- a także przyjrzeć się, w jaki sposób może rzeczywiście bronić wobec tego rodzaju ograniczeń. Tak intuicyjnie, być może, dlaczego jest 1 dzieli się przez 10, zgodnie z moim komputerem tutaj nie tylko 1/10, 0,10? Tak. Co myślisz? PUBLICZNOŚCI członkowskie: podstawa jest inna? DAVID J MALAN: Co takiego jest? Och, podstawa jest inna? Więc nie do końca. To rzeczywiście więcej fundamentalne znaczenie dla sprzętu. Inne myśli? Tak. PUBLICZNOŚCI PAŃSTWO: Oni stanowią numery inaczej? DAVID J MALAN: Tak they-- prawo. Stanowią one numery inaczej. Niedokładnie, najwyraźniej. Tak, że jest-- Cóż, inaczej od czego? Lub od kogo? Od nas? PUBLICZNOŚCI PAŃSTWO: Tak. Nie używać po przecinku system [niesłyszalne]. DAVID J MALAN: OK. Więc w tym sensie, że nie korzystać z systemu dziesiętnego. Pod maską, wszystko jest, rzeczywiście, binarny, i to jest związane, w rzeczywistości. Ale to jeszcze prostsze wyjaśnienie niż to. Tak. PUBLICZNOŚCI PAŃSTWO: Oni tylko mają tak wiele bitów. Można je przechowywać tylko do pewnego stopniu, jak z miejscami po przecinku. DAVID J MALAN: Tak. To jest to, co naprawdę się na niego. Okazuje się, że komputery zwykle, zawsze będzie tylko użyć pewnej ilości informacji do reprezentowania coś. Dobrze? Po tym wszystkim, mamy tylko stałą Ilość miejsca na dysku twardym. Mamy tylko stałą kwotę pamięci RAM lub pamięci komputera. A jeśli masz tylko stała kwota, o czymś, na pewno nie można rzeczywiście liczyć do nieskończoności lub numeru. Ty, rodzaju, muszą wybierać, jaki zakres wartości masz zamiar wspierać. I tak na przykład, za tydzień lub dwa temu, kiedy rozmawialiśmy o kodzie ASCII, i rozmawialiśmy o 8 bitów, lub bajt, że tak powiem, najwięcej mogliśmy stanowią 8 bitów to co? 255. I możemy reprezentować 256 łączne wartości ale nie, jeśli spędzamy jedną z nich na 0-- No, ale jeśli spędzić jeden z nich na 0, to największa liczba Jest, oczywiście, 255. Tak więc okazuje się, że jest to w przypadku również w tym kontekście. Zaczęliśmy rozmawiać, po raz ostatni, o liczb zmiennoprzecinkowych, które różni się od liczby całkowite w że mają dziesiętny i, miejmy nadzieję, niektóre numery Po tym, ale też. Komputer jest tylko zazwyczaj dzieje w użyciu 32 bitów, może 64 bity do reprezentowania wartość zmiennoprzecinkową. Więc mimo, że wyrosłem uczenia się matematyki i wiedząc, które koniecznie musisz nieskończenie wiele liczb po przecinku, a nie jeśli masz pamięć skończony. Ty, rodzaj, trzeba zaokrąglić, lub wybierać, które numery idziesz do reprezentowania. I tak można myśleć, w pewnym sensie, co jest w komputerze najbliżej zbliżenie do wartości 1/10, że można go dostać, z zaledwie 32 lub więcej bitów. I to nie jest tylko 1/10. Na przykład, jeśli mogę to zmienić, aby 1/3, co naszym zdaniem jest jeszcze prostsze. Więc 1 dzieli się przez 3. Pozwól mi zapisać plik. Pozwólcie mi iść do przodu i przekompilować. I pozwól mi go ponownie uruchomić. Tutaj też, jak widać, 1/3 nie jest 0.3 a następnie nieskończona liczba 3-tych potem. Musisz to niedokładności na końcu. Więc my, ludzie są prawidłowe, a co nauczyłeś się jest w rzeczywistości, poprawne, ale my lada przed pewnymi ograniczeniami. I to, co myślałem my dzisiaj zrobić, to zacząć patrząc na, Szczerze mówiąc, Tragiczne skutki tego czasem, kiedy ludzkość nie dość realizacji do tej rzeczywistości i tych ograniczeń. I zobaczymy serię winiet z History Channel, które ma przyjrzeć się, jak rzeczy poszło nie tak. Jest to około 8 minut, i wrócimy po tym i przyjrzeć się dokładnie, co jeszcze może się nie udać. Jeśli możemy przyciemnić lights-- [ODTWARZANIE] -Computers, My wszyscy przychodzą do zaakceptowania Problemy te często frustrujące, że iść z nimi. Robaki, wirusy i oprogramowanie usterki są małe ceny zapłacić za wygodę. Ale w high-tech i szybki zastosowania militarne i programu kosmicznego, najmniejszy problem może być powiększony do katastrofy. W dniu 4 czerwca 1996 roku, naukowcy przygotowane uruchomienie bezzałogowego rakiety Ariane 5. To niósł naukowe Satelity zaprojektowane ustalić dokładnie, w jaki sposób Pole magnetyczne oddziałuje Ziemi wiatrami słonecznymi. Rakieta została zbudowana na Europejska Agencja Kosmiczna i podniósł się ze swojego zakładu na wybrzeżu Gujany Francuskiej. -I Około 30 sekund w lot, po raz pierwszy Zauważyłem coś się dzieje źle. Że dysze były obrotowe w sposób naprawdę nie powinny. Około 40 sekundach lotu, wyraźnie pojazd był w tarapatach, i to jest, gdy się decyzja, aby je zniszczyć. Urzędnik bezpieczeństwa Zakres z ogromne wnętrzności naciśnięciu przycisku, wysadzili rakiety, zanim mógł stanowić zagrożenie dla bezpieczeństwa publicznego. -To Było panieńskie Podróż z Ariane 5, i jego zniszczenie wziął miejsce ze względu na wadę wbudowane w oprogramowanie rakiety. -The Problemem na Ariane to, że nie było wiele, że wymagane 64 bity, aby wyrazić, i chciał konwertować to do liczby 16 bitów. Zakłada się, że ich liczby nigdy nie będzie bardzo duża, że większość z tych cyfr numer 0 64 bit były użytkownika. Byli w błędzie. -The Niezdolność jednego program do zaakceptowania rodzaj liczby generowane przez inna była u podstaw upadku. Rozwój oprogramowania stał się bardzo kosztowna część nowej technologii. Rakieta Ariane 4 był bardzo sukces, tak oprogramowania stworzone przez to także stosowane na Ariane 5. -The Podstawowym problemem było, że Ariane 5 był szybszy, przyspieszone szybciej. I oprogramowanie nie miał stanowiły, że. -The Zniszczenie rakiety była ogromna katastrofa finansowa, wszystkim z powodu błędu oprogramowania minut. Ale to nie był pierwszy Problemy konwersji danych Czas był nękany nowoczesną technologię rakietową. -w 1991, przy starcie z pierwszej wojny w Zatoce Perskiej, Patriota pocisk doświadczył podobnego rodzaju problem konwersji numeru. W wyniku tego, 28 osób, 28 amerykańskich żołnierzy zginęło, a około 100 rannych, gdy Patriot, która miała w celu ochrony przed przychodzących scuds, nie udało się wystrzelić pocisk. -Kiedy Irak najechał na Kuwejt i Ameryka Pustynna Burza rozpoczęła się na początku 1991 roku, Baterie rakiet Patriot zostały rozmieszczone chronić Arabię ​​Saudyjską i Izrael z irackich rakiet Scud ataków. Patriota to US, średniego zasięgu ziemia-powietrze systemu produkowane przez firmę Raytheon. -Rozmiar Kolektora Patriot, Sam, to jest o, około 20 stóp długości. I waży około 2000 funtów. A to niesie głowicę z about-- Myślę, że to mniej więcej 150 funtów. I głowica, Sam, Jest to wysokiej wybuchowe, fragmenty, które ma wokół niego. Obudowa głowicy ma zaprojektowane, aby działać jak śrut. -The Pociski są prowadzone, 4 na pojemniku, i transportowane są z naczepą. -The Rakiet Patriot anty System sięga co najmniej 20 lat. Pierwotnie był on przeznaczony jako rakiety obrony powietrznej zestrzelić samoloty wroga. W pierwszej wojny w Zatoce Perskiej, kiedy pojawiła się ta wojna, Armia chciała użyć go do zestrzelić scuds, a nie samoloty. Sił w Iraku nie było tak wielkim problemem, ale armia martwi scuds. I tak starali się uaktualnić Patriot. -Intercepting Wroga pocisk porusza się mecz pięciu miał być wystarczająco trudne. Ale gdy Patriot został przewieziony do eksploatacji, Armia nie była świadoma Iracki modyfikacji, które wykonane ich scuds prawie niemożliwe, aby uderzyć. -Co Się stało, jest scuds, że wchodzili, były niestabilne, były chwieje. Wynika to z tego, był Irakijczyków, w celu uzyskać 600 kilometrów na zakres 300 km przeciwrakietowej, wziął ciężar na przedniej głowicy i wykonana głowica lżejsze. Więc teraz, Patriota próbuje się w SCUD, a większość przypadków zdecydowana większość z czas, to tylko latać przez SCUD. -Po Operatorów systemów Patriot sobie sprawę, że Patriot przegapić swój cel, oni zdetonowali głowicę Patriota, w aby uniknąć ewentualnych ofiar czy to pozwolono upaść na ziemię. -To Było to, co większość ludzi widziałem, te wielkie kule ognia na niebie, i źle rozumiane jako przechwytuje z głowicami Scud. Chociaż w nocy niebo, Patrioci pojawiła być skutecznie niszcząc scuds, w Dhahran, nie może być pomyłka o jego wydajności. Nie, system radarowy Patriota jest straciłem przychodzących Scud, i nigdy nie rozpoczęła, z powodu usterek oprogramowania. To było Izraelczyków, którzy po raz pierwszy odkryta że już system był on, im większa jest różnica czasu stała, w związku z zegarem osadzony w komputerze systemu. -O Na 2 tygodnie przed tragedia w Dhahran, Izraelczycy zgłaszane Departament Obrony, że system tracił czasu, że po około 8 godzin pracy, zauważyli, że system był staje się zauważalnie mniej dokładne. Departament Obrony odpowiedział informując wszystkich baterii Patriot aby nie pozostawić systemy od dłuższego czasu. Nigdy nie powiedział, co było dawno. 8 godzin? 10 godzin? 1000 godzin? Nikt nie wiedział. -The Baterii Patriot stacjonował w koszarach w Dhahran i jego wadliwe wewnętrzne Zegar, był na ponad 100 godzin w nocy z 25 lutego. -To Śledzone czas z dokładnością około 1/10 sekundy. Teraz 1/10 sekundy jest ciekawy numer ponieważ nie może być wyrażona w formacie binarnym, dokładnie. Co oznacza, że ​​nie może być wyrażone, dokładnie, w każdym nowoczesnym komputerze cyfrowym. Trudno w to uwierzyć, ale używać jako przykład. Weźmy liczbę, 1/3. 1/3 nie może być wyrażona w postaci dziesiętnej, dokładnie. 1/3 jest 0,333 dzieje w nieskończoność. Nie ma sposobu, aby to zrobić, z dokładność w przecinku. To jest dokładnie ten sam rodzaj Problem, że stało się w Patriot. Im dłużej system prowadził The gorszy błąd czas stał. -Po 100 godzin pracy, błąd w czasie tylko około 1/3 sekundy. Jednak jeśli chodzi o ukierunkowanych na pocisk porusza się = 5, to spowodowało śledzenia Błąd ponad 600 metrów. Byłby to błąd krytyczny dla żołnierzy w Dhahran. Co się stało, to uruchomienie Scud było wykryte przez satelity wczesnego ostrzegania, i one nowe, że Scud było przychodzi w swoim ogólnym kierunku. Nie wiem, gdzie to nastąpi. -To Było teraz do radaru elementem systemu Patriot, broniąc Dhahran, aby znaleźć i utrzymać utwór z nadchodzącego wroga pociskiem. -The Radar był bardzo inteligentny. To rzeczywiście śledzić pozycja Scud a następnie przewidzieć, gdzie to prawdopodobnie byłoby, następnym razem radar wysłany impuls się. To był nazywany bramą zakres. -Więc Po Patriot decyduje mało czasu ma przeszedł wrócić i sprawdzić następny lokalizacja dla tego wykrytego obiektu, wraca. Więc kiedy wróciłem do złego miejsce, to wtedy nie widzi obiektu i postanawia, że ​​nie ma Celem było to fałszywe wykrywanie, i spada utwór. Przychodzące Scud zniknął z ekranu radaru, i sekund później go uderzył w koszarach. Scud zabił 28 i był to ostatni jeden zwolniony w czasie wojny Pierwszy w Zatoce Perskiej. Niestety, zaktualizowane oprogramowanie Dhahran przybył następnego dnia. Błąd oprogramowania miał było stałe, zamknięcie jeden rozdział w niespokojnych Historia rakiet Patriot. [Zakończyć odtwarzanie] DAVID J MALAN: Będziemy więc przyjrzeć się niektóre podobne ograniczenia tylko trochę. Ale najpierw niech Przejście do kilku FYI to. Więc jedno- ten weekend, nie będzie Super sekcje, które mają za zadanie wyprzeć regularnie zaplanowane odcinki, które rozpocznie się w tygodniu stąd. Spójrz na stronie internetowej CS50 jest Więcej informacji na temat tych. Będą one również być filmowane i transmitowane żyć dla osób niezdolnych do udziału. Problem 1 jest ustawiony na strona już tego szkolenia, a my spojrzeć na że tylko trochę. I godziny pracy też, odbędzie umieszczać od poniedziałku do czwartku. Więc to był najbardziej kanoniczna Program przyjrzeliśmy się ostatni raz. To jak najprostsza Program można pisać w C, a nawet, że jest trochę śmiałe twierdzenie. Dobrze? Ponieważ istnieje wiele jakby złożoność tego. Więc rzućmy okiem na co niektóre z tych elementów były i spróbować zapewnić mentalny model, jak tych najprostszych programów pracować, a następnie zaczniemy patrząc na rzeczy coraz bardziej złożone. Tak więc ta linia tutaj, podświetlone teraz w kolorze żółtym, co miał powiedzieć, ostatni raz, że to nie dla nas? Jaki jest cel służy? Każdy z dalej wstecz? Tak. PUBLICZNOŚCI PAŃSTWO: [niesłyszalne] DAVID J MALAN: Dobra. Więc to daje dostęp na polecenia, lub niech nazywają je funkcje, że ktoś inny napisał, że są zadeklarowane, że tak powiem, w innym pliku. Więc zobaczymy dokładnie to, co .h plików jest kontra pliku .c, w końcu. Ale teraz, po prostu wiem, że printf np jest jedną z funkcji, które zostały zadeklarowana w innym pliku, gdzieś indziej na dysku twardym chmurze, że pozwala nam na dostęp do printf i używać go bez konieczności narastającymi że koło siebie. Tymczasem głównym. Jaki był analogowy głównego, w zeszłym tygodniu? Tak. PUBLICZNOŚCI PAŃSTWO: Zielona flaga kliknięciu. DAVID J MALAN: Tak. Scratch-tych, kiedy zielona flaga kliknięciu. To jak puzzle które rozpoczyna od rzeczy. I tak podobnie uczynił świat postanowił kilka lat temu, że w C, i kilka innych języków, jeśli chcesz napisać program, Twoja pierwsza funkcja ma się nazywać, głównym. I to ma wyglądać tak. Ale wrócimy, innym razem, na co, int, i nieważne, znaczy w tym kontekście. Na razie nawiasy klamrowe są mili jakby Scratch jest kawałek układanki kształtu że oddaje pewną liczbę linii. A wśród na liniach tutaj, tutaj jest ten jeden. printf jest funkcją, której celem w życie jest do drukowania sformatowany ciąg. A tak sformatowane, mam na myśli ciebie można podłączyć wartości zastępczych, i można określić, ile po przecinku punktów, ile liczb do wydrukowania po przecinku dziesiętnym i tym podobne. I printf, oczywiście, ma jedną lub więcej, argumenty lub parametry, zwie prościej jako wejścia. Więc printf, jak wiele funkcje, ma wejść. A te wejścia są objął przez dwa nawiasach tutaj. I wewnątrz nich jest jedno wejście. Jest to ciąg znaków, jak już nazwał go, która jest po prostu ciągiem znaków, jak słowo lub frazę lub całości Esej nawet w cudzysłowy. A to, co się dzieje, aby wpłynąć na Zachowanie printf, ponieważ, oczywiście, to tylko ogólny Funkcja drukowania. To nie będzie wiedział, co do drukowania, chyba, że ​​to powiesz. A potem, niektóre minucje. Co możemy powiedzieć, że to dziwne, sekwencja symboli jest? Tak. PUBLICZNOŚCI PAŃSTWO: Nowa linia. DAVID J MALAN: Nowa linia. Tak więc okazuje się, że nie można po prostu hit, wejść, kiedy piszesz program. Generalnie, kompilator będzie się trochę mylić, co masz na myśli. Raczej trzeba dosłownie powiedzieć, daj mi nową linię tutaj. I tak / n jest to, co na ogół zadzwoń znak escape. Więc n, dla nowej linii. I kompilator wie że gdy widzi / N powinna ona w rzeczywistości powodować komputer Ostatecznie lub printf, w tym przypadku, wydrukować rzeczywisty Nowy linia, jak uderzanie, wejść, klawisz na klawiaturze. I wreszcie, co nie powiedzieć ten kawałek jest dla składni? Co przedstawia? Tak. PUBLICZNOŚCI PAŃSTWO: [niesłyszalne] DAVID J MALAN: To jest po prostu Koniec linii. Koniec z rachunku. I uświadomić sobie, że nie robimy umieścić je wszędzie. Z pewnością nie je umieścić Na końcach każdego wiersza. Na przykład, nie ma nikt na Pierwsza linia, nie ma nic na linii z, głównym, nie ma żadnego po nawiasy, ale musisz zacząć, aby zobaczyć i uzyskać zna, gdzie jest wymagana. I to prawie zawsze po funkcji zadzwoń lub oświadczenie, niektóre działania że jesteś rzeczywiście biorąc. I wiem teraz, zwłaszcza jeśli wśród tych, mniej wygodne, są to rodzaje głupich rzeczy że będzie koniec przypadkowo uderzając Twoja głowa w ścianę nad. Ponieważ będziesz logicznie pewnie w jakimś problemem już rozwiązany dla problemu zestaw, a to cholerstwo się nie sporządza lub nawet uruchomić. I tak często, na początku, to będzie być dlatego, że brakowało nawias, lub nieodebranych średnik. I tak po prostu być świadoma z tych rodzajów rzeczy, i nie dajcie się sfrustrowany je, ponieważ bardzo szybko robi to stać się stary kapelusz. Ale to jest bardzo łatwo dostać się udaremnione na początku, w wyniku. Więc teraz, rzućmy okiem na jak linia ta jest rzeczywiście działa a następnie spojrzeć na lekko bardziej skomplikowany. Więc mamy ponad Tutaj Zdolność do rysowania na ekranie. I załóżmy, że to jest mój ekran komputera, ale piszę, cześć programu, a ja nie wdrożyły, printf. Ktoś wprowadził, printf. Kto chciałby twierdzić, Wdrożyliśmy printf? Jeśli możemy? Dobra, jak masz na imię? UCZEŃ 1: [? Kopal. ?] DAVID J MALAN: Copal, chodź na górę. Chodź na górę. W porządku. Tak więc mamy tu pewne identyfikatory, od zrobimy małą grę tego. A my będziemy cię nazywać, printf. A jeśli chcesz, aby tu przyjechać, co właśnie narysowany na ekranie, to po prostu nie ma mnie, to. W porządku, więc, witam mam na imię, printf, jeśli chcesz umieścić, że w dniu. W porządku. I czy można go stanowiska przez ekran komputera tak, jakby to funkcja, która przyszedł z tym systemem komputerowym. A twój cel w życiu jest faktycznie coś wydrukować. Ale podobnie jak w programie mamy właśnie miał na ekranie, tutaj, będziemy musieli faktycznie daje pewne wejście. I tak, w przypadku mojego wejścia, tutaj, jest najwyraźniej, co jest przekazywane do printf, niech rodzaj wyśmiewać go w ten sposób. Zamierzam dosłownie pisać na kawałek papieru, "Witaj, świecie" backslash N. I żeby było jasne, co Właśnie wyciągnąć na tej kartce papieru, wygląda to tak. Więc kiedy uruchomić ten program, a to żółta linia kodu zostanie wykonany, to tak, jakby I programu Witaj, jestem podając pewne wejście od do funkcji że ktoś inny napisał. A jeśli ciebie palcem, może rzeczywiście, palcem, rysowanie na ekranie, co to ty zostały wydane, efekt ostatecznie jest zobaczyć dokładnie, że na ekranie. I trochę przypadek rogu tutaj. I dobrze, że nie powinniśmy zobaczyć the, nowa linia, w tym momencie. Błędem byłoby dla Ciebie jawnie narysować znak nowej linii. Ale jeśli mieliśmy pisanie słowa na Ekran, to kończy się poniżej. Więc dziękuję bardzo, ale trzymać tu tylko na jedną chwilę. Teraz potrzebuję innego Wolontariat, gdybyśmy mogli, że będzie musiał odgrywać rolę of-- To tylko ludzi z orkiestrą teraz. Jak about-- OK. Dokładnie tutaj. Chodź na górę. Jak masz na imię? UCZEŃ 2: [? Ivay. ?] DAVID J MALAN: Słucham? UCZEŃ 2: [? Ivay. ?] DAVID J MALAN: Ethan, chodź na górę. Nie? Ja się że źle, nawet po to powiedział dwa razy? Chodź na górę. Trudno usłyszeć tutaj. OK. I przykro mi, jak masz na imię? UCZEŃ 2: [? Ivay. ?] [? DAVID J MALAN: Ivay. ?] OK. Na razie, jeśli nie umysł, jesteś getString. UCZEŃ 2: OK. Chłodny. DAVID J MALAN: Więc jeśli chcesz stanąć tu na chwilę, rzućmy okiem na lekko bardziej skomplikowany program, który teraz ma trzy linie kodu. Tak więc mamy jeden, podać swoją nazwę za pomocą printf; dwa, wezwanie do getString, następnie przez przypisanie do zmienna o nazwie, łańcuch s, i nazywa s; a potem jeszcze wywołanie, printf, ale tym razem z dwoma wejściami. Więc mamy już zrobione stan imię i nazwisko, a raczej mamy już wykonane połączenia printf. Więc mam zamiar napisać, Podaj swoje imię. A tak, to co mam zamiar przekazać, printf, za chwilę, jest po prostu to. Więc jeśli chcesz iść do przodu i wyciągnąć to na ekranie, to jest twój wkład teraz. W porządku. I zapomnieć ciąg, teraz mamy nasza linia kodu tutaj. Więc, GetString, musimy rzeczywiście nazwać, getString. Więc twój cel w życiu jest po prostu chodzić się do orkiestry, jeśli można, i uzyskać czyjeś imię. Ale niech ci dać coś umieścić go na. Jeśli chcesz, idź do przodu i uzyskać ciąg, czyjąś nazwę na tym kawałek papieru, jeśli można. W porządku. I zobaczymy, za chwilę, którego imię dostajemy. Tymczasem, co mam zamiar mają gotowe, jest puste fragment papieru, w którym mam zamiar do przechowywania niezależnie od wartości tego jest, że GetString wraca do mnie, Ja, jako zmienna ciąg nazywa, s. W porządku. Więc co tu mamy? Nik. W porządku. Mamy więc nazwę NIK tutaj. Więc to jest to, co dosłownie został zwrócony do mnie, że tak powiem, przez getString. I teraz, zamierzam wykonać w lewej tego słowa, w których po prostu skopiować w dół, dla dzisiejszych potrzeb, Nik. Więc teraz mam zmienną nazywa, s, przechowywania nazwę NIK. Ja już wręczone printf, poprzedni argumentem. Ale w naszej trzeciej i ostatniej linii Kod, tak naprawdę trzeba ręcznie printf coś trochę different-- "Witaj% s" odwrotny ukośnik n. I tak ostatnia linia idę do send-- ostatnią rzeczą jestem zamiar napisać teraz w dół, jest to. Tak więc dwie linie kodu, lub raczej ostatniej linii kodu, wzywa do dwóch inputs-- Jeden, i dwa, to. Jeśli więc nasza funkcja printf mogą teraz je jako wejście, pozwól mi wyczyścić ekran dla Ciebie. Właściwie nie, można iść dalej. Zostawimy go, ponieważ to jest w tym samym programie. Powinniśmy zobaczyć, witam, Nik. W porządku. Więc to było sporo skakać przez obręcze, aby, po prostu napisać, podać wymienić, a cześć, Nik. Ale ta prosta idea przekazywania wiadomości, przemijania wejściowych i wyjściowych odbioru, jest dokładnie model będziemy mieć nawet najbardziej skomplikowanych funkcji. Więc dziękuję wam obu. Mamy piękny stres Piłka tu dla Ciebie. I dziękuję, że do naszego getString i printf wolontariuszy podobne. Dziękuję. W porządku. Dziękuję wam obu. Więc rozmawialiśmy o do tej pory, głównie o strunach. I okazuje się, że C może faktycznie zrozumieć kilka różnych typów danych. W rzeczywistości, rzućmy spojrzeć na te tutaj. Więc C, a wiele języków, zrozumieć rzeczy zwanych znaków. Char jest na ogół jeden bajt lub osiem bitów. I reprezentuje jeden znak, jak litera A lub kapitału Litera A lub mała litera A, lub wykrzyknik, lub dowolny znak, że można wpisać na klawiatury, a czasami nawet więcej. Mamy też zdarzyć, aby zobaczyć pływaków. Pływak jest, ogólnie, 32-bitowa wartość, lub cztery bajty ponieważ jeszcze jeden bajt wynosi osiem bitów. Więc pływak jest wartością zmiennoprzecinkową, coś z przecinkiem. I rzeczywiście, to co film mówił o tym, kiedy mówili o zmiennym wartości punktowe, niektóre stałą liczbę bitów wykorzystywane do reprezentowania liczbę rzeczywistą. Ale jest też rzeczy zwane dwuosobowe. Istnieją one w Javie, jeśli już podjęte APC, oraz podwójne, jak sama nazwa na szczęście wskazuje, jest dwa razy większe od pływaka. To wciąż liczba rzeczywista, po prostu ma więcej bitów z którymi się coraz bardziej precyzyjne, lub zapisać nawet większe liczby. int jest łatwe. Rozmawialiśmy o tym ostatnio. To jest po prostu liczbą całkowitą. I to na ogół 32 bity lub cztery bajty. I tak, jeśli masz, zobaczmy teraz, 32 bits-- i zrobiliśmy to w tygodniu 0, nigdy tak briefly-- jeśli masz 32 bitów, co jest największym Numer można reprezentować jako liczba całkowita? Daj albo bierz? To jak 4 mld euro, i to tylko wtedy, gdy jesteśmy reprezentujący tylko liczby dodatnie. Jeśli masz 32 bity, a chcesz reprezentują liczby ujemne, jak również, Twoja oferta jest zasadniczo negatywne 2 mld do 2 mld pozytywna. Ale ogólnie, zaczniemy przy 0 udać się do 4 mld euro. Nie musisz wiedzieć dokładnie, ale możemy zobaczyć, w rzeczywistości, jeśli tylko otworzyć mały kalkulator, tutaj. Mogę zrobić 2 do 32, a to jest dokładnie, jak duże, jak wiele wartości można reprezentują, z 32 bitów. I to mniej więcej 4 mld. Więc będziemy trzymać widząc ten numer w kilku różnych miejscach. Ale jeśli trzeba dłużej numery niż, Okazuje się tam coś, co nazywa się długo długo. I długo długo zazwyczaj 64 bity, które oznacza, że ​​jest o rząd wielkości nawet większy niż int. Więc nie mogę nawet wymawia największym Numer że można reprezentować, ale jest znacznie większy. Teraz tak na marginesie, historycznie, jeśli int ma 32 bity, i długo długo jest 64 bitów, jak duży jest długa, nie długo, długo? Można by pomyśleć, że to dłużej niż int ale być może mniej niż długi długi długi, ale to naprawdę zależy. I tak okazuje się jedną z frustracji też z pisania kodu w niektórych systemach, jest to, że nie wszystkie z tych typów danych mają wstępnie zdefiniowane wartości. Czasem jest to wiele bitów. Czasami jest to, że wiele bitów. Więc tak naprawdę trzeba wiedzieć, czasem, jaki sprzęt używasz oprogramowania na. Na szczęście, inne języki i inne typy danych, które już istnieją, pozwalają być bardziej precyzyjny. Cóż, widzieliśmy ciąg, i widzieliśmy bool też ale okazuje się, przyjdą tylko z biblioteki CS50. Więc tych, którzy nie są budowane w C, a nie Ci, są w tym pliku o nazwie CS50.h, że będziesz w końcu Zerwać warstw. Ale na razie, są one po prostu inne typy danych. Bool jest prawdziwe lub fałszywe, i ciąg jest ciągiem znaków, jak słowa. Teraz printf, widzieliśmy, ma zastępcze,% s jest jeden. I może być w stanie, do teraz, wywnioskować z tych innych przykładów, jak można mieć zastępczy dla różnych rodzajów danych. Na przykład, zgadywać, jeśli Ciebie chciał wydrukować pojedynczy char użyciu printf, symbol zastępczy jest prawdopodobnie% c. A jeśli chcesz się wypisuje Liczba całkowita z zastępczym,% i. % lld jest długa długa wartość dziesiętna, ale długo, długo, tak że mapy do tego. A następnie% f dla pływających Wartość punktu lub podwójne, więc czasami są one ponownie wykorzystane w różnych kontekstach. Więc zobaczymy i używać niektóre z nich w czasie. I printf i inne funkcje również sekwencje wspierać innych " a czasami to konieczne. Więc odwrotny ukośnik n to nowa linia. Backslash t, ma nikogo chcą wziąć ukłucie? PUBLICZNOŚCI PAŃSTWO: Tab. DAVID J MALAN: Tab. Więc jeśli naprawdę chcesz aby wydrukować kartę, nie stałą liczbę miejsc, ale rzeczywiste znak tabulacji, nie trafisz, Zakładka, klawisz na klawiaturze, na ogół, faktycznie zrobić ukośnika t. Backslash cudzysłów, dlaczego miałbym kiedykolwiek chcesz tego? Dobrze? Dlaczego nie mogę po prostu typ A cudzysłów na klawiaturze? PUBLICZNOŚCI PAŃSTWO: Ponieważ w przeciwnym razie, to jest będzie myślał, że to koniec od jak twój wydruku [? tekst. ?] DAVID J MALAN: Dokładnie. Pamiętaj, że z naszym printf przykłady, kiedy mijały do ​​printf na wejściu, z lewej strony tego łańcucha wejściowego a na prawo od tego wejścia wiosna, oczywiście, był to podwójny cudzysłów. Jeśli własne wejście ma podwójne cytat w środku, że komputer może potencjalnie się mylić, co do, robi to podwójny cudzysłów należą w środku? Czy należysz do lewej jeden? Czy należysz do prawej jeden? I tak, jeśli chcesz zrobić to bardzo jasne, ty interpretacja odwrotnego ukośnika podwójny cudzysłów, tak, że uciekł, by tak rzec, i to nie pomylili czegoś innego. I jest kilka innych tutaj, backslash r, pojedyncze cudzysłowy, 0, które możemy zobaczyć w czasie, jak również. A teraz, co z funkcji? Więc działań, które możemy podjąć tej pory w tym języku, C, dobrze, widzieliśmy, printf, oczywiście, a wszystko z innymi na ekranie, tutaj, że będziemy używać dla Kursu kilka pierwszych kilka tygodni, się, gdy biblioteka CS50. I o wiele łatwiejsze w C, rzeczywiście dostać dane wprowadzone przez użytkownika. Okazuje się, że w C, a szczerze mówiąc w kilku językach, to jest prawdziwy ból w szyi, aby zrobić coś prostego, jak skłonić użytkownika na klawiaturze, na jego wejściu. I tak te funkcje sprawiają, że łatwiej. I to również błąd sprawdzanie całej, tak, że kiedy Przypomnijmy w środę, my ten, ponownie, ostrzeżenie, kiedy nie współpracował, i wpisane słowo, zamiast numeru? Zrobiliśmy podnoszenia ciężkich wcześnie aby upewnić się, że użytkownik współpracuje. Ale to tylko trening Koła, które będziemy w końcu, i szybko zdjąć. Przypomnę więc, a następnie, rzućmy okiem, podobnie jak zrobiliśmy to z podstaw, na pewne kanoniczne konstrukcje w C Ma to na celu, sortowanie z, być trąba wycieczka, po prostu tak, że masz odniesienie i że widziałem rzeczy w pierwszej kolejności. Ale potem przyjrzymy się rzeczywistym kodowania korzystać z niektórych z tych bloków. Tak więc podobnie jak w Scratch, kiedy mieliśmy oświadczenia podoba, powiedzieć lub poczekaj, w C, mamy funkcje oraz, jak printf. Jeśli chcemy wyrazić stan w C, to jest podobne, w duchu, do tego kawałek układanki, który wyglądało to na początku. Jednak zamiast tego Dosłownie po prostu napisz, jeśli. A potem, w nawiasach, możemy postawić warunek, w przypadku, gdy warunek jest co będziesz zadzwonić, znowu, wyrażenie logiczne. I znowu, jest to rodzaj Pseudokod. I w rzeczywistości jest // komentarz. To tylko angielskie słowa do siebie. Ale to jest ogólna struktura, w razie, w stanie. Ale zobaczymy betonu Przykłady w chwilę. Jeśli chcesz mieć dwukierunkowa rozwidleniu dróg, tak jak to zrobiliśmy z naszym wolontariuszem na Środa, możesz mieć, else if. A jeśli chcesz mieć jedną trzecią i stan końcowy, lub domyślna sytuacja, można mieć tylko blok jeszcze nie. I podobnie, z wyrażeń logicznych, można, a, je razem. I zobaczyliśmy w środę, że to nie jest jeden ampersand, to dwa, z przyczyn niższego szczebla, które my w końcu zobaczyć i bawić się. Albo-ing rzeczy razem jest 2 pionowe paski. Na klawiaturze amerykańskiej, w tym Jest ogólnie klucz z klawiszem Shift powyżej Kluczem swoje Enter lub Return. Potem jest tych rzeczy, które użyjemy może raz lub dwa razy. Są to funkcjonalne równoważne co można zrobić z, jeśli else if, else if else, budowy, ale nazywa się przełącznik. Wyglądają one bardzo różne, ale będziesz zobacz w niektórych z naszego kodu dystrybucji, dla przyszłego zestawu problemów, najprawdopodobniej że czasem po prostu ładniejsza Sposób wyrażania całość kilka warunków, bez konieczności dużo nawiasy i dużo nawiasów i wgniecenia. Ale nam nie więcej energii niż mamy już. A teraz pętle. A ten, przyjrzymy przy nieco wolniej. Ale potem, zaczniemy ich używać, szczególnie dla tych, którzy już znają. To jest kanoniczny sposób, jeśli niewiarygodnie arcane sposób, aby napisać pętli w C Teraz pętla w Scratch było całkiem proste. Masz, na zawsze, blok. Masz, powtarzać, blok z tylko numer trzeba wpisać. I z, na pętli, można realizacji obu tych pomysłów, ale jest to trochę bardziej techniczny. Ale szczerze mówiąc, jest to również stosunkowo proste. Gdy wiesz, kolejność operacje, dosłownie są po prostu będzie podłączyć wartości i powiedzieć komputerowi, co robić. Tak oto przykład. Jest to pętla, dość wystarczy, liczy się z jednej liczby się przez drugiego. I po prostu spoglądając na to, nawet jeśli bez wcześniejszego doświadczenia z ten język, jaki numer to prawdopodobnie rozpocznie odliczanie? OK, 0. I zgaduję, że to dlatego, że Ciebie zobaczyć, że nie jest int i ja, który jest zmienny. Jest ustawiony na 0. A później, wygląda na to, przekazujemy printf, wartość. I rzeczywiście, zrobiłem trochę literówkę tutaj. Ale to łatwo naprawić. Dodam w, I tutaj. Mamy teraz printf samopoczucie przeszedł tę wartość zastępczy. A co się liczy w górę przez? PUBLICZNOŚCI: 50. 50. 49. DAVID J MALAN: 49. Więc 50, na pierwszy rzut oka, wydaje się słuszne. Ale, jak się okazuje, będzie nasz stan, który trzymamy kontroli. I mamy zamiar raz zatrzymać I już nie jest mniejsza niż 50. Więc to pętla, przeciwnie, powinna wykonanie, tak długo, jak jest mniej niż 50. Ale jak tylko będzie to 50 lub 51, lub, co gorsza, powinien automatycznie. W porządku. Więc co tak naprawdę dzieje się tutaj? Tak to jest na porządku Operacje na pętli. Jeden, masz tzw inicjalizacji. Ta żółta podświetlony fragment kod jest wykonywany po pierwsze, i ma taki skutek, że za Środa, można sobie wyobrazić. To tworzy zmienną i i go sklepy w tej zmiennej wartość 0. Więc jest 0 w tym momencie w historii. Następną rzeczą, że dzieje się w tej konstrukcji, Warunkiem jest, że zostanie sprawdzone. Więc sprawdzić natychmiast, i jest mniejsza niż 50? I oczywiście, odpowiedź teraz jest, to z pewnością tak. Tak, dlatego, że jest 0, a to jest na pewno mniej niż 50. Następnie, co się dzieje, jest to, że linia kodu zostanie wykonany. I rzeczywiście, jeśli jest wielokrotnością linie kodu w tych klamrach, wszyscy się wykonywane jedna po drugiej. I w efekcie tutaj jest najwyraźniej, aby wydrukować I numer, który będzie 0, a następnie 1, a następnie 2. Ale dlaczego? Dlaczego to się zwiększany? Cóż, czwarta rzecz, zdarza się, że tej składni zostanie wykonany, po średnikiem. i ++ jest skróconym sposobem na powiedzenie; przyjąć wartość i, i dodać 1 do niego; a następnie następnym razem, dodać 1 do niego; i następnym razem, dodać 1 do niej. Jeśli więc wracamy, co się wydarzy obok jest ja nie zamierzam zainicjować kiedykolwiek ponownie. Jeśli Ciągle inicjalizacji i 0, w tym przykładzie nigdy nie skończy, bo Chciałbym być zatrzymany na 0. Ale to, co ma się wydarzyć jest że warunek ten zostanie zaznaczone, linia kodu dostanie wykonana, I będzie zwiększana, warunek ten zostanie zaznaczone, kod zostanie wykonany. I przechowywane na rowerze ponownie, i znowu, i znowu, dopóki i ++ wywołuje wartość 50. Warunkiem następnie mówi, 50 mniej niż 50? Odpowiedź, oczywiście, nie jest i więc cały kod zatrzymuje wykonanie. A jeśli masz więcej kodu na ekranie na dole, to co dzieje się dalej. To wyskakuje z tych klamrach i nadal drukować więcej po tym. Więc żart teraz, od Foxtrot, że będziesz być może teraz rozumiem. To zawsze jest zabawne. To jak chichotów rodzaj przenikać, i wtedy zdajesz sobie sprawę, że nie powinno być śmieje humoru tak. Ale istnieją pewne wynos tutaj, pedagogicznie, też. Tak więc okazuje się, że jestem brakuje kawałek składni, lub foxtrot pod brakuje kawałek składni tutaj. Czego brakuje, że mieliśmy każdy inny przykład dotychczasowych? Wróć, to tam, więc to jest coś innego, że wrócimy do wkrótce. Czego brakuje, chociaż? Tak. PUBLICZNOŚCI członkowskie: inicjalizacja [niesłyszalne]. DAVID J MALAN: OK. O tak. Tak właściwie, to jest-- Cóż, i licznik jest inicjowany w górze, a raczej, oświadczył się powyżej. Tak więc jest to kolejny sposób to zrobić. Ale nie w jednej linii, że to ważne, choć. Jak się tutaj? PUBLICZNOŚCI PAŃSTWO: Czy to nawiasy klamrowe? DAVID J MALAN: Tak. Więc nawiasy klamrowe brakuje. Ale ten kod, to znaczy, do ich kredytu, jest w rzeczywistości, składniowo poprawny. Okazuje się, że tego nie zrobisz potrzebne nawiasy klamrowe jeśli masz tylko jeden wiersz kodu chcesz wykonać wewnątrz pętli. Teraz zawsze, w klasie, w wszystkie nasze kodu dystrybucji, zawierać nawiasy klamrowe tak, tak dla jasności. Ale sobie sprawę, że w podręcznikach i przykłady na forum, można bardzo dobrze zobaczyć kręcone szelki brakuje kiedyś. I to jest OK, jeśli to, co są wcięte i przeznaczone jest tylko jedna linia kodu, a nie wiele linii kodu, potencjalnie. W porządku. Więc związane z emisją brak precyzji, jest problem z przelewem, w tym sensie, że podobny są liczbami całkowitymi mają limity nich jak zmiennoprzecinkowych? W świecie zmiennoprzecinkowych wartości, możemy być tak dokładne, tylko, po czym, czasami złe rzeczy mogą się zdarzyć, a nasze programy mogą być buggy i błędów. Teraz nawet z liczb całkowitych, może pojawią się problemy. Teraz liczbą całkowitą nie mają numery punkt dziesiętny lub po nim. To tylko liczby naturalne, zwykle. Więc co może pójść nie tak z int? Jeśli używam int do liczyć, co może pójść źle? Wydaje się o wiele prostsze. Tak. PUBLICZNOŚCI użytkownika: Jeśli Numer dostaje [niesłyszalne] DAVID J MALAN: Tak. Co zrobić, jeśli nie liczyć tak wysokie, że Ciebie Nie potrafię wyrazić, że bardzo duża liczba. Dobrze? W pewnym momencie, będziesz przekracza granice o wartości 32-bitowej lub 64-bitowej wartości. Teraz znowu, nie jestem pewien, jak wymówić wartość 64-bitową, ale wiem, że w 32-bitowej liczby całkowitej, największą wartość może być, jeśli to tylko pozytywne wartości, jest mniej więcej 4 mld. Więc jeśli staram się liczyć do 5 mld euro, coś się wydarzy. Ale zobaczmy, co w rzeczywistości może się zdarzyć. W świecie całkowitej przepełnienie, w którym, w pewnym sensie, przepełnienie również zdolności całkowitą, co może się zdarzyć? Więc tutaj jest liczba binarna, jest powrotem do 0. To wszystko 1, a placeholder'y tam są potęgi 2, tak to jest binarny. Tak więc są to 8, 1 bit na ekranie. A jeśli przypomnieć sobie lub Ci szybko do matematyki, jaka wartość jest reprezentowany tutaj z tych ośmiu 1 bitów? 255. I nawet jeśli nie byli pewni, z matematyki, można zrobić to na zewnątrz. Albo może po prostu rodzaj rozumu przez to, Chwileczkę, czy jestem co stanowi wartość 8 bitową, a ja mam 256 możliwych wartości, a pierwszy z nich oznacza 0, Wiem tylko, że Największym będzie 255, i to właśnie ta może być. Więc przypuszczam, staram się dodać 1 do tej wartości. Co zrobić w klasie Szkoła przy dodawaniu 1, i to tak naprawdę nie pasuje, bo musisz nosić 1? Co to jest liczba ta będzie stać się po dodaniu 1? To stanie się 0. Dobrze? Bo gdybyś miał więcej bits-- i będę spróbować, rodzaj, wpisz go here-- gdybyśmy mieli więcej bitów, co może zrobić tu dodać 1, a następnie, że mamy to. Ups. Musielibyśmy 1 bitowego całą drogę tutaj. Jednak, jeśli jest to ograniczone wartości, to jest tylko 8 bitów, i to jest z góry określony przez komputer 1 to skutecznie, że nie istnieje. To po prostu rodzaj spada z klifu. I tak, jeśli dodać 1 do 255, co wartość pan podobno dostać? 0. I tak numerów przypadkowo, i być może, w sposób niezamierzony, kończy się owijając się wokół tak. Więc co może być implikacją tego? Cóż, jest kilka różnych rzeczy. Tak jeden, to jednak w końcu wygląda jak 0, nieumyślnie, ale można trochę zobaczyć, nawet w świecie rzeczywistym, na lepsze lub na gorsze, przejawy tej idei limitu. Na przykład, każdy z was, którzy kiedykolwiek grał LEGO Star Wars, Czy ktoś się z wiedzą maksymalna liczba monet można zebrać w Lego Star Wars? Zgadywać na podstawie wiodące dzisiejsze pytania. Jest większy niż 256 lub 255. Jest to 4 mld. Tak więc okazuje się, oraz istnieje kilka people-- niektóre googling potwierdziła ostatnia night-- dostał 4 mld złotych monet, lub cokolwiek, w Lego Star Wars. Choć zdaje się, nie ma sposób oszukać grę, jest to błąd lub funkcja, która pozwala ci tylko naliczane wiele, wiele punktów. Ale największa Wartość, według w tym zrzucie ekranu z kimś I znaleźć w Internecie, to rzeczywiście, 4 mld. Teraz to dlaczego? To właśnie 4 miliardów, Prawdopodobnie dlatego, że ktoś postanowił, kto pisał tę grę, że mogą zrobić 4 miliardy, coś, coś, coś, jak wartości kładę się z kalkulatora wcześniej, ale to tylko trochę czystsze dla ludzi powiedzieć maksymalną liczbę z coins-- lub ćwiekami, jak nazywają them--, że Ciebie może zbierać to 4 mld. A więc, dlaczego tak jest? Jak to gra LEGO realizacji licznik który jest śledząc liczba monet masz? Oni używają, co? PUBLICZNOŚCI PAŃSTWO: Zatrzymuje licząc po 4 mld. DAVID J MALAN: Zatrzymuje licząc po 4 mld euro, co oznacza, że ​​może wywnioskować, jako programista, że są prawdopodobnie za pomocą 32-bitowej liczby całkowitej. Jak programista dosłownie wpisane, int, w swoim kodzie, i to jest typ zmiennej, oni używają do przechowywania czyjś kod. Więc nie ma innych objawów z tego rodzaju ograniczeń. Więc nie grałem to game-- a ja czytania historii w celu potwierdzenia, jak much-- ale w Oryginalna wersja Cywilizacji, gdzie Ci podobno współdziałają ze sobą i mogą prowadzić wojnę i mieć spokój, Gandhi miał być jednym z najspokojniejszych znaków, tak jak ja rozumiem, w pierwszym wersja Cywilizacji. I rzeczywiście, w skali od 1 do 10, jego agresywność był tylko jeden. Więc nigdy tak lekko agresywne, najwyraźniej. Ale w pewnym momencie, można podobno zainstalowanie demokracji w geografii. A jeśli zainstalowania demokracji do swojej wersji gry, to Twój poziom agresji idzie w dół. To jest dobra rzecz. Ludzie są bardziej spokojne najwyraźniej, w tej sytuacji. Ale widocznie ktoś zrobił nie mają, w razie, stan w oryginalnej wersji kodu. Tak więc poziom agresji Gandhiego wyszedł z pozytywna 1, minus 2, na negatywną 1, ale gra nie zrozumieć liczby ujemne. Więc co się stało, było agresji Gandhiego Poziom poszedł od 1, 0, 1 do negatywnej, którym skutkowały owijanie wokół bycia najbardziej agresywny charakter w grze, o wartości 255, w skali od 1 do 10. I od tego czasu nie było więcej inkarnacje tej grze, i oni przechowywać go jako rodzaj Easter egg, Gandhi jest najwyraźniej tak strasznie agresywny. Ale to było wynikiem bardzo prosty błąd programowania w tym bardzo wczesnej wersji gry. Teraz bardziej niepokojąco, więcej Niedawno, Boeing 787 zostało udokumentowane jako mające błąd, nie rodzaj urządzenia Ci szczególnie chcą mieć błąd. A objawy, że będę czytać tu, z artykułu w Internecie, był to model 787 samolot który był zasilany w sposób ciągły do 248 dni, może stracić wszystko prądu zmiennego AC, energii elektrycznej, ze względu na Generator jednostki sterujące, GCUs jednocześnie wchodzenia w tryb awaryjny. Więc to było ostrzeżenie wydane gdy problem ten został odkryty. Stan ten jest spowodowany licznikiem oprogramowania wewnętrzna do GCUs, więc liczbą całkowitą lub zmienne, że wyleje się po 248 dni ciągłej mocy. Boeing w procesie opracowanie aktualizacji oprogramowania GCU, że usunie stanu niebezpiecznego. Tak więc podobnie jak pocisku Scenariusz, w którym mieli jakieś zmiennej że liczyłem, i liczenia, i liczenia, ale stopniowo przepełnione granice jego możliwości, podobnie uczynił ten cholerny samolot mają zmienną przepełnienia po dość czasu biegania. I tak aż język-w-policzek pracy wokół tego problemu jest naprawdę, restart, samolot każdego 247 dni, tak, że pamięć zostaje wycierane a zmienna wraca do 0. Ale sobie sprawę, że jest to bardzo duża wcielenie oprogramowania, ale przede wszystkim, jak słyszymy o Apple systemów operacyjnych będzie w samochodach, i samo prowadzenie samochodu z Google, a dowolna liczba wcieleń oprogramowania w naszym codziennym życiu, telewizory i zegarki, i więcej, sobie sprawę, zostali otoczeni przez oprogramowanie, wszystko, co jest napisane przez nas, ludzi. A jak my wszyscy wkrótce odkrywają, to bardzo proste i bardzo typowe popełniać błędy podczas pisania oprogramowania. A jeśli nie je złapać, złe rzeczy mogą się zdarzyć. Teraz czasem, niektóre śmieszne rzeczy może się zdarzyć, lub przynajmniej czasem wiedzieć, aby spodziewać się zło. Tak 0 podzielona przez 0, ze stopniem szkoła, jest na ogół złe. To nieokreślone. I okazuje out-- i zobaczmy, czy mój mikrofon może odebrać to up-- że Apple miał trochę zabawy z tym niedawno. Więc mam tutaj iPhone. Mam zamiar porozmawiać z Siri i poprosić ją, dać mi odpowiedź na 0 podzielony przez 0. Co jest 0 podzielona przez 0? Siri: Wyobraź sobie, że masz 0 ciasteczka i podzielić je równo między 0 znajomymi. Ile ciasteczka ma każda osoba dostać? Widzieć? To nie ma sensu. I Cookie Monster jest smutny że nie ma ciasteczka. I jesteś smutny, że nie masz jeszcze żadnych znajomych. DAVID J MALAN: To trochę nieprzyjemny. Więc to jest to, co właśnie powiedział, że nie. To nieokreślone, to nie jest zdefiniowane, I rzeczywiście, wiele języków programowania lub, naprawdę, kompilatory wykrywać, kiedy, w programie, spróbuj podzielić 0 przez 0. Więcej zabawy, niż to jest jednak to, że najwyraźniej, Cookie Monster jest na Twitterze te dni. A on odpowiedział na to, z tym, co jest absolutnie urocze. Ale rzućmy okiem na kilka innych konstrukcji, a następnie umieścić niektóre z tych Kod w użyciu, w dobrych sposobów. Tak więc okazuje się, oprócz pętli, nie coś, co nazywa pętli while, że wygląda inaczej i jest realizowane trochę differently-- i my w końcu zobaczyć examples-- ale w pewnym sensie, to jest prostsze, ponieważ to nie pozwala przygotować i aktualizuje się w granicach od pętli. Nadal można wdrożyć. Więc można zrobić dokładnie te same rzeczy z pętli while, jak w pętli for, ale składnia, ultimately-- jak będziesz w końcu see-- będzie inna. Jest nawet robić podczas pętli, która w rzeczywistości jest trochę inaczej, w tym podczas gdy dla pętli i pętla while zawsze sprawdzić ich stan pierwsze, jeśli można przeczytać w tym rzecz, od góry do dołu, to niby wygląda to będzie sprawdzić, że to stan ostatnia, bo to naprawdę ostatnia linia kodu. I rzeczywiście, że będzie przydatna w niektórych programach, które piszą, jeśli chcesz tylko ślepo coś zrobić i ostatecznie sprawdzić stan. To nie musi być złe. Jeśli chcemy zmiennych, możemy zrobić on na kilka różnych sposobów. I zobaczyliśmy w Foxtrot kreskówki, jeden sposób to zrobić, gdzie można zadeklarować zmienną, jak int licznik średnikiem, a następnie later-- może następnym linia, może 10 linie later-- faktycznie go zainicjować. Więc te 2 linie kodu zadeklarować zmienną typu int i nazywają to licznik, więc daje mi na tyle bitów trzymać int. A potem w końcu, stawia wartość 0 do tej zmiennej. Organizuje się on w 0 i 1 wzór, który znamy z ostatniego tygodnia, oznacza liczbę znamy jako 0. Albo mówiąc, można to zrobić o wiele bardziej zwięźle, tak jak to. Teraz mamy także Możliwość wywoływać funkcje. I rzeczywiście, tu jest linia 2 Program, lub jego fragment, które pozwala nam właściwie napisać kod, który dostaje komunikat z user-- dużo jak nasz wolontariusz chwilę ago-- magazynowania wynik w zmienna nazywa nazwa, i then-- tak jak z naszym wolontariuszem z printf-- wypisuje wartości przekazując w dwóch argumentów łańcuch, a następnie przez zmienną nazywa, nazwa, sam. Warto więc przyjrzeć, zanim wracamy do Mario tam, na kilka teraz, tego przykładów. Mam zamiar iść do przodu i otwarta się, powiedzmy, funkcja-0.c. I jak zawsze, ten kod jest dostępny na stronie internetowej kursu, w dzięki czemu można grać razem na domu i patrzeć na nią później. Ale tu jest program w to istotą, z linii 17 do 22. Program główny, gdzie jest Program zawsze będzie zacząć. Program ten, jak widać, się dzieje wydrukować swoje nazwisko, okrężnicy. Jest to zamiar zadzwonić getString, tak jak zrobiliśmy to z naszych wolontariuszy. A potem, to jest interesujące, to się nazywają PrintName. Okazuje się, że przez cały ten czas, nie Wydaje się, że funkcja nazywa PrintName. Która drukuje czyjeś imię. Nie trzeba używać printf od yesteryear, nie PrintName. Ale to jest mylące ponieważ PrintName nie pochodzą z C. Ludzie nie wymyślać jakieś 40 czy 50 lat temu, Zrobiłem, zamiast. I rzeczywiście, jeśli przewijać się dalej, uprzedzenia Jak mogę napisać własny Funkcje w C będziemy w końcu wyjaśnić, dlaczego wciąż powtarzają, nieważne, w kilku miejscach, ale na dzień dzisiejszy, niech wystarczy spojrzeć na nazwy. W linii 24, jeśli chcesz stworzyć własną funkcję, dosłownie napisać Nazwa funkcji. Wybrałem PrintName. W nawiasach, to następnie określić, jakie rodzaje wejść i ilu Funkcja ta ma podjąć. W tym przypadku, chcę zrobić 1 zmienna o nazwie, nazwa, i to będzie od typ, string, więc to będzie być jakiś ciąg znaków. A potem, to program-- podobnie jak w Scratch, można mieć niestandardową puzzle pieces-- będzie miał ten zwyczaj zachowania. To się nazywają printf przechodząc, witam, zastępczy, i wtedy to się podłączyć w co nazywa się użytkownik. Więc to jest przykład tego, co informatykiem będzie połączenie abstrakcji lub funkcjonalne rozkładu, które są po prostu fantazyjne sposoby z saying-- jest, jeśli podoba Ci się ten pomysł na wysokim poziomie, jak chcę funkcjonalność drukuje czyjeś imię, absolutnie masz może dosłownie napisać printf a następnie przechodzą w argumentach, które chcesz, a program będzie działał, jak to ma od środy. Ale możesz zacząć abstrakcyjne się pojęcie drukowania nazwy. Możesz nadać mu nazwę, jak PrintName, a to Jest to idea warstw z tygodnia 0. Odtąd, ja i nie musisz wiedzieć lub opieki, jak PrintName jest realizowany. Tak używa printf, może to nie, kto wie, co wykorzystuje? Kogo to obchodzi? Teraz mówię tu, a nie tutaj. I rzeczywiście, jak nasze programy się bardziej zaawansowane i wyrafinowane, mamy zamiar utrzymać biorąc za pewnik że istnieje mniejsze kawałki poziom puzzle. Bo my je napisał lub ktoś inny tego nie zrobił, więc które możemy następnie zbudować na nich. Rzućmy okiem na to wariant funkcjonować jeden. Więc ten jeden trochę bardziej zaawansowane, ale okazuje się, że w bibliotece CS50, w jest tylko funkcją GetInt. Nie sądziliśmy, lata temu, aby zaimplementować funkcję GetPositiveInt. I to jest trochę denerwujące, bo jeśli Jesteście pisząc program w którym chcesz uzyskać pozytywny całkowitą od użytkownika, można absolutnie użyć GetInt. I można absolutnie skontaktować się z stan i może pętla jeśli int jest większa niż 0 i krzyczeć na użytkownika jeśli on lub ona nie daje Ci liczbą dodatnią. Ale zbudujmy ten Budynek blokuje się, a, zwyczaj kawałek Scratch, jeśli będzie. Mam zamiar mieć program tutaj, że ostatecznie, ja Chcesz być w stanie zadzwonić GetPositiveInt, a ja chcę być w stanie wydrukować cokolwiek to int jest. Ale to jest oderwane od teraz. To właśnie ze względu na wysoki poziom Nazwa, która mówi, co robi, co jest wspaniałe, bo to bardzo intuicyjne teraz czytać. A jeśli ja obchodzi mnie, co jest pod spodem kaptur, pozwól mi przewinąć w dół. I to jest trochę przytłaczający Po pierwsze, szczególnie jeśli jest to twój pierwszy program, ale rzućmy okiem. Już nie mówię, nieważne, ponieważ okazuje się funkcje podobnie jak getString, może zwracają wartość do mnie. Nie tylko mają do drukowania na ekranie, mogą one przekazać mi coś w zamian. I podczas gdy przed PrintName, Nie trzeba z powrotem nic. Potrzebowałem efekt uboczny coś, co pokazuje się na ekranie, ale ja nie potrzebuję człowieka przekazać mi coś w zamian. Tutaj, z GetPositiveInt, jak z GetInt, Chcę zostać przekazany coś w zamian. Więc mówię nie, nieważne, na linii 23, ale int, która mówi, funkcja ta że piszę, nazywa GetPositiveInt będzie wręczyć mi liczbę całkowitą, a nie nic, Nie nieważne. Tymczasem zajmie nie Wejścia, więc już, rodzaj, odwrócić je. Nie dam GetPositiveInt dowolny wejście, chcę dać mi swoją moc. A potem co się dzieje teraz? Więc oto jak mogę zadeklarować zmienną. Zrobiłem to na zewnątrz pętli, ze względów będziemy w końcu zobaczyć, ale to po prostu daje mi 32 bitów nazywa, n, i mam wstępnie ustalenia ich przechowywania całkowitą. A oto, że zrobić, gdy konstrukt, i dlatego jest to przydatne. Dosłownie to zrobić, zaś n jest mniejszy niż 1. Zobaczmy więc, co się dzieje. I wydrukować, proszę daje mi pozytywnego int. I wtedy pojawia się int, przy użyciu CS50 na działać i przechowywane w n. A potem, co linia kodu prawdopodobnie zostanie wykonany następny, logiczny? Która linia numer? Tak, więc 31. Nie wiesz tego, dopóki nie został poinformowany lub rodzaj wywnioskować to, ale to prawda. To idzie od góry do dołu a następnie powtarza. Więc jeśli mam wpisane powiedzmy, liczby ujemny 1, n jest mniejszy niż ujemna 1? Tak. Ponieważ negatywne 1 jest mniejsza niż 1. Więc co się stanie? Mam zamiar to zrobić podczas gdy n jest mniejsze niż 1, więc mam zamiar wrócić do linii 28. I każdy time-- i niech uruchomić this-- aby funkcja 1 go skompilować, a teraz dot funkcję 1 slash. Gdybym wpisać ujemną 1, to będzie trzymać na mnie krzyczeć dopóki nie współpracują, ponieważ każdy z moich wejść wynosi mniej niż 1 i, jeśli jest, gdy mniej niż 1, Mam zamiar robić to. Jeśli w końcu nadaje jej numer, jak 50, na szczęście, to mówi, dzięki za 50. Czemu? Ponieważ, jak tylko n jest nie mniejsza niż 1, przestaję utknięcie w tej pętli, i to nowe słowo kluczowe dzisiaj, powrotu, dosłownie robi. Więc ja właśnie realizowany, w sposób Poczucie, odpowiednik getString, gdzie jestem oddając się kto używa mnie, jakąś wartość. Nie muszą być ciąg, to int. Tak więc proste, szybkie Przykładem, ale będziesz wkrótce zobaczyć niektóre bardziej wyrafinowane wersje martwych. W rzeczywistości, rzućmy okiem na jeden numeryczny, który nazywa return.c. A ten jest naprawdę trochę prostsze. Tak więc celem tego programu w life-- niech skompilować i uruchomić go, więc dokonać zwrotu, kropka ukośnik, return-- Ogłoszenie program po prostu kostki wartość 2. To dość głupie, trudno Kod, nie potrzeba żadnych nakładów, ale ma wykazać innym Funkcja pisałem ja. Więc, mam uznany za Zmienna o nazwie x, typu int, równa liczbie 2, całkowicie arbitralne. To tylko niektóre puszyste drukowania. Mówi x jest teraz, tak i takie, organizowania kostek dot dot dot. A magia jest najwyraźniej w linii 21. Dzwonię funkcję o nazwie, sześcian, Jestem wręczając mu kartkę papieru z numerem 2, napisane na nim, i jaką wartość, matematycznie, chcę się z niego? Podobnie jak testow? 8. Dobrze? Chcę, 2 pokrojone w kostkę z powrotem, od 2 do moc 3, więc 8 powrotem. Więc gdzie realizowany jest kostka? Cóż, zawiadomienie to realizowane tutaj. I tak jak wcześniej, logicznie, mimo, że składnia jest prawdopodobnie bardzo nowe dla wielu z was, Chcę tę funkcję wręczyć mi kartkę papier z int na nim. Więc mam int, na Nazwa jest arbitralnie, ale dogodnie nazywa kostki. Wejście do niej, to n wpisz całkowitą, więc to jak mogę przekazać liczby 2 na arkuszu papieru. A potem okazuje się, C wsporniki matematyka, więc nie ma czasu dla x, po prostu użyć gwiazdki mnożenia. I to zwraca n razy n razy n, która jest po prostu wartość kostkę. Więc gdzie jedziemy z tym wszystkim? To na pewno wicher wycieczki, pewni, że w super sekcji i problemu ustawić 1, będziesz szedł przez to wszystko jeszcze bardziej. I problemem ustaw 1, będziemy przechodzić z graficznym świata Scratch na coś więcej linii poleceń w C. Ale będziemy czerpać inspiracje z tego tutaj gry z przeszłości, w którym za pomocą C i standardową edycję zestaw p będziesz realizować piramidę Mario. A w wydaniu hakerów z zestaw p, jeśli tak zdecydujesz się wybrać, będzie realizować nieco bardziej wyzwanie piramidę z dwoma szczytami. Będziesz także wdrożenia w skali algorytm, algorytm zachłanny. Okazuje się tam kilka ciekawych logika Za procesem działa stacja kasjera i faktycznie wręczając ktoś z powrotem zmiany. Jest to algorytm, który jest dość proste, że może nawet zrozumieć intuicyjnie, kiedy pierwszy raz przeczytałem it-- zdając sobie sprawę, że to, co zawsze zrobić w każdej chwili dałem komuś jakąś Pieniądze back--, który pozwala na zawsze zminimalizowanie liczby notatki papieru lub metalu monety że jesteś przekazanie z powrotem do użytkownika. I to, oczywiście, jest zwięzła bo jeśli idziesz do CVS czy etażerka, nie chcesz być uczynku cała masa tych, lub cała masa grosze. Chcesz najmniejsza monety, prawdopodobnie możliwe. Wreszcie, będziesz również zostać zakwestionowane babrać się w świecie wody i rzeczywiście dostać uznanie do mapowania między prędkości przepływu, od lubią, woda pod prysznicem, po prostu, ile wody jest używany. A w niej aluzja, będzie ten klip tutaj, które będziemy kończy się na zaledwie 60 sekund, które maluje obraz niskiego przepływu głowice prysznicowe. [ODTWARZANIE] -W porządku. Mam tu wszystko. Mam Cyclone z serii F, Hydra, Jetflow, Sztokholm Supersteam, to nazwę. -A Co polecacie? -Czego szukasz? -Power Człowiekiem. Moc. -Jak Silkwood. -To Dla promieniowania. -To prawda. -Teraz Co to jest? -To Commando 450. Nie sprzedaję tego. -Ale To jest to, co chcemy. Jest to komando 450. -Nie Wierzysz mi. Jest używany tylko w cyrku. To dla słoni. -I'll Nic płacić. -Co O Jerry? -On Nie mógł sobie z tym poradzić. Jest delikatna. O tak. [Zakończyć odtwarzanie] DAVID J MALAN: Wszystko w porządku. To, czy dla CS50. Do zobaczenia w przyszłym tygodniu. Głośnik 1: [? Scully?] [? Ian?] w zakresie tego projektu outro, co ty faceci wymyślić? GŁOŚNIK 2: Cóż, daliśmy że wiele myśli, i uważamy, że najlepszym sposobem to-- GŁOŚNIK 3: Mogę? 2 głośnik: Tak. Na wszelkie sposoby, faktycznie. GŁOŚNIK 3: Więc myślę, że możemy podsumować nasz pomysł dla Outros z jednej word-- nic. DAVID J MALAN: Nic? GŁOŚNIK 3: Nic. DAVID J MALAN: Co to oznacza? GŁOŚNIK 3: outros są o niczym. GŁOŚNIK 2: Cóż, mam na myśli, filozofii, To znaczy, nic nie jest zawsze coś. Głośnik 1: Więc what's-- co jest przesłanką? GŁOŚNIK 3: Tak to jest jak życie. OK. Co robiłeś dzisiaj? DAVID J MALAN: Wstałem, miał śniadanie, i przyszedł do pracy. GŁOŚNIK 3: To outro. GŁOŚNIK 2: Ale, mam na myśli, nie powinien coś się z nim na the-- GŁOŚNIK 3: Nie, nie, nie, nie. Nic się nie dzieje. Głośnik 1: Więc dlaczego oglądamy? GŁOŚNIK 3: Bo jest to outro dla CS50. DAVID J MALAN: Jeszcze nie.