>> [MUZYKA GRA]
David J. MALAN: Wszystko w porządku.
Jest CS50, a to jest początek tygodnia dwóch.
Zacznijmy więc już dziś z błędu.
Błąd, oczywiście, błąd w programie,
i dostaniesz bardzo zaznajomieni z tej koncepcji
jeśli nigdy nie zaprogramowany wcześniej. pset0 i teraz pset1.
Ale rozważmy coś trochę proste na początku.
Ten program tutaj, że wyrzucił wraz z góry
i twierdzą, że powinno to wydrukować 10 gwiazd na ekranie za pomocą printf,
ale to najwyraźniej buggy w jakiś sposób.
>> Biorąc pod uwagę, że specyfikacja należy wydrukować 10 gwiazdek,
jednak nie widać, co będzie ubiegać się błąd?
Tak?
Więc jest to poza jednym błędem, a co masz na myśli?
OK.
Doskonałe.
Więc mamy określony rozpocząć wartość zero dla i,
i jakie określono wartość n wynosi 10, ale używaliśmy mniejsza niż lub równa.
A to dlatego, że dwa znaków, a nie tylko jeden symbol,
jak w książce z matematyki, jest to, że nie masz
Sposób wyrażania jeden odpowiednik znaków.
>> To znaczy, że mniej niż ale jeśli zaczynasz liczenie od zera,
ale liczy się aż się przez i równy 10,
jesteś oczywiście będzie liczyć 11 rzeczy, w sumie.
I tak masz zamiar wydrukować 11 gwiazd.
Więc co może być rozwiązaniem tego problemu?
Tak?
>> Więc po prostu ustawić mniej niż lub równa prostu mniej niż
a tam, ja twierdzą, być może Innym rozwiązaniem zbyt.
Co może jeszcze zrobić?
Tak?
>> A więc do wyrównywania jej do 1, a pozostawić mniejsza niż lub równa.
I szczerze mówiąc chciałbym ubiegać że w przypadku typowego człowieka,
to jest chyba prostsze.
Rozpocząć odliczanie od 1 i liczyć do 10.
W zasadzie to, co masz na myśli.
>> Ale rzeczywistość jest w programowania, jak widzieliśmy,
informatycy i programiści zwykle zaczynają liczenie od zera.
I tak to jest w porządku, gdy można się do tego przyzwyczaić.
Twój stan będzie na ogół być czymś mniej niż.
Więc po prostu logiczne błąd, że mogliśmy teraz
naprawić i ostatecznie rekompilacji to i dostać tylko 10.
>> Cóż, jak o tym błędzie tutaj?
Tutaj znowu, ja twierdzą, że mam Celem drukowania 10 stars--
Ten jeden na linię czasu, ale tak nie jest.
Proponujemy to, co przed Poprawka jest, co to
wydrukować wizualnie gdybym skompilować i uruchomić ten program o tym sądzisz?
Tak?
>> Gwiazdkowy.
Więc wszystkie gwiazdy na tej samej linii, co słyszałem,
a następnie znak nowego wiersza.
Warto więc spróbować.
Tak zrobić buggy-1, wprowadź, i widzę polecenia clang
że rozmawialiśmy o ostatnim czasie.
./buggy-1, a nawet widzę wszystkie 10 gwiazdek na tej samej linii, choć twierdzą,
w moim opisie tylko komentarz na szczycie Kod, który chciałem zrobić jeden na
linia.
Ale wygląda to dobrze.
>> Teraz linia 15 wygląda jak jestem drukowania gwiazdę, a następnie linia 16
wygląda na to, że jestem drukowanie nowego wiersza,
i są one zarówno wcięty tak Jestem wewnątrz pętli wyraźnie.
Więc nie powinienem robić gwiazdę, nowy linia, gwiazda, nowa linia, gwiazda, nowa linia?
Tak?
>> Tak, jak w przeciwieństwie do języka Python, jeśli znasz,
wcięcia nie znaczenia do komputera.
To ma znaczenie tylko dla ludzi.
Tak więc, podczas gdy tutaj mam wymyślonych linii 15 i 16--, że wygląda pięknie,
ale komputer nie obchodzi.
Komputer dba o faktycznie posiadające nawiasy klamrowe
wokół tych linii kodu.
>> Tak, że to jest tak jak w clear-- Scratch-- że tych dwóch linii kodu
powinna zostać wykonana.
Jak jeden z tych żółtym Scratch puzzle sztuk znowu i znowu i znowu.
>> Więc teraz, jeśli ponowne uruchomienie tego program-- ./buggy-2-- Hm.
Mam błąd teraz.
Co ja o tym zapomnieć?
Tak, więc nie skompilować.
Tak zrobić buggy-2.
Nie ma takiego pliku, bo nie faktycznie kompilacji drugą wersję.
Więc teraz ciekawa nierejestrowana nie zmienna-- 2.
Robimy 1.
Dodać do buggy-1-- ./buggy-1-- i teraz każdy z nich znajduje się na tej samej linii.
>> Teraz nie jest wyjątkiem to ma moją twierdzą
że trzeba te nawiasy klamrowe.
Gdy jest to faktycznie OK-- jeśli masz Zauważyłem w sekcji lub textbooks--
pominąć nawiasy klamrowe?
Tak?
>> Dokładnie.
Gdy jest tylko jeden linii kodu, które Cię
chcesz być związane z pętli, jak w naszym pierwszym przykładzie.
Jest to całkowicie zgodne z prawem pominąć nawiasy klamrowe
tak jak swego rodzaju udogodnienie z kompilatora do Ciebie.
Tak?
Dobre pytanie.
Byłoby to uznać za błąd styl?
Chcemy promote-- jak CS50 Podręcznik stylu, URL, dla których
w pset1-- które zawsze używać nawiasów klamrowych.
Z pewnością, jeśli jesteś nowy w programowaniu.
W rzeczywistości jest to, że nie jesteśmy zamiar zakazać wam
od robienia tego udogodnienia.
Ale jeśli tylko się do huśtania się rzeczy,
absolutnie po prostu zawsze używać kręcone szelki, aż pojawi się zawiesić ją.
Dobre pytanie.
>> Wszystko w porządku.
Tak, że to był błąd.
Przynajmniej w coś dość prosty.
A jednak można, że ​​to jest dość prymitywny, prawda?
Jest to rodzaj pierwszego tygodnia patrzenia na języku
jak można znaleźć się w nim błędy.
Ale rzeczywistość to faktycznie reprezentatywna
niektórych dość przerażających problemów , które mogą pojawić się w realnym świecie.
>> Tak, niektórzy z was mogą przypomnieć jeśli się tech wiadomości,
lub może nawet złapać wiatr w lutym tego
z tego ostatniego roku, że Apple miał się trochę błąd w obu iOS,
system operacyjny na ich telefony, a także
Mac OS systemu operacyjnego na swoich komputerach stacjonarnych i przenośnych.
I zobaczyłem takie nagłówki, jak to.
A następnie, Apple obiecał naprawić ten błąd,
i bardzo szybko zrobił to naprawić w iOS, ale ostatecznie stała się w systemie Mac OS
oraz.
>> Teraz żaden z tych tytułów sam naprawdę ujawniają, co było zasadniczym problemem,
ale błąd został ostatecznie zmniejszony do błąd w SSL, Secure Sockets Layer.
I długie opowiadanie, to oprogramowanie
że nasze i innych przeglądarek Oprogramowanie wykorzystywane do tego, co?
>> Gdybym powiedział, że SSL jest zaangażowany, gdy ci
odwiedź adres URL zaczyna się od https, co to może być związane z SSL?
Szyfrowania.
Będziemy więc mówić o to w najbliższych dniach.
Szyfrowania, sztuka kodowania informacji.
>> Ale krótko mówiąc, Apple jakiś czas temu, że popełnił błąd
w ich realizacji SSL, na oprogramowanie, które ostatecznie realizuje
Adresy URL, takie jak HTTPS lub max Połączenia tam.
Wynik, który jest to, że Połączenia może potencjalnie
zostać przechwycone.
A Twoje połączenia były niekoniecznie kodowane
jeśli miał złe facet pomiędzy ty i witryny docelowej, którzy
wiedział, jak to wykorzystać.
>> Teraz ostatecznie wysłane Jabłko za to w końcu naprawić,
i opis ich poprawki było to.
Bezpieczny transport nie zatwierdza Autentyczność połączenia.
Problem został rozwiązany przez przywrócenie brakujących kroki sprawdzania poprawności.
>> Więc to jest bardzo ręcznie faliste wyjaśnienie o po prostu, że nie przejmował się.
Tam jest dosłownie jeden linii kodu, który był wadliwy
w ich realizacji i SSL Jeśli w trybie online i szukaj tego
rzeczywiście można znaleźć Kod oryginalnego źródła.
Na przykład, jest to zrzut ekranu z tylko część dość dużego pliku,
ale to prawdopodobnie zwana funkcja Sprawdzić wymianę kluczy SSL serwera znak.
A to trwa kilka argumenty i wejścia.
I nie zamierzamy się skupić za dużo tam minutia,
ale jeśli skupić się na kodzie wewnątrz tego najwyższego function-- niech
powiększyć, że.
Może już podejrzewać co błędu może
być, nawet jeśli nie masz pojęcia ostatecznie to, czego szukasz na.
Jest rodzajem anomalii tutaj, co jest co?
>> Tak, ja naprawdę nie lubię Spojrzenie z dwóch goto nie.
Szczerze mówiąc, nie wiem, co goto nie oznacza, ale o dwa z nich
z powrotem do tyłu.
Że po prostu rodzaj ściera mnie intelektualnie w niewłaściwy sposób,
i rzeczywiście, gdybyśmy powiększyć tylko tych linii, to jest C.
>> Tak więc dużo kodu Apple sama jest napisany w języku C,
i to podobno jest naprawdę equivalent--
nie do tego ładna wcięcia wersja, ale jeśli uznają fakt,
że nie ma nawiasy klamrowe, co Apple naprawdę napisał był kod, który wygląda
tak.
Tak już pomniejszony i po prostu stałe wcięcie w sensie
, że jeśli nie ma nawiasów klamrowych, że drugie goto nie to na żółto
zamierza wykonać nie wiem co.
To nie jest związane z jeśli stan nad nim.
>> Więc nawet raz nie, jeśli nie dość zrozumieć, co to może być może
się robi, wiem, że każdy z nich conditions-- każda z tych linii
jest bardzo ważnym etapem W procesie sprawdzania
jeśli dane są w rzeczywistości zaszyfrowane.
Więc pomijając jeden z nich kroki, nie najlepszy pomysł.
>> Ale dlatego, że mamy w tym Drugi goto nie w kolorze żółtym,
i dlatego, kiedy już rodzaj estetycznie
przesuń go w lewo, gdzie go logicznego jest w danym momencie, co
to oznacza dla linii kodu poniżej tego drugiego goto
nie można pomyśleć?
To zawsze będzie pominięty.
Więc GOTOS są ogólnie mile widziana powodów nie będziemy naprawdę iść do,
i rzeczywiście w CS50 nie wydają uczyć to goto,
ale można to goto nie w ten sposób, to go skoku
do innej części kodu.
>> Innymi słowy przeskoczyć ta ostatnia linia w ogóle,
a więc wynik ten głupie proste, że to tylko pomyłka
Wynik chyba kogoś kopiowanie i wklejanie jednej zbyt
wiele razy, że cała bezpieczeństwo iOS i Mac OS
było narażone na przechwycenie przez złych facetów już od jakiegoś czasu.
, Aż w końcu stała to firmy Apple.
>> Teraz, jeśli niektórzy z was są w rzeczywistości działa stare wersje iOS lub Mac OS,
można przejść do gotofail.com które jest na stronie internetowej, że ktoś skonfigurować
na zasadzie określenia programowo
jeśli Twój komputer jest nadal zagrożone.
I szczerze mówiąc, jeśli jest, to chyba dobry pomysł
zaktualizować swój telefon lub Mac w tym momencie.
Ale nie tylko świadectwem, jak aprecjacja tych niższym poziomie
szczegóły i dość proste pomysły mogą naprawdę
przekładają się na decyzje i problemy, które
affected-- w tym case-- miliony ludzi.
>> Teraz słowo o administracji.
Sekcja rozpocznie najbliższą niedzielę.
Otrzymasz e-mail przez Weekend o sekcji, w którym momencie
Proces resectioning rozpocznie się, jeśli masz
zrealizowane masz teraz niektóre nowe konflikty.
Tak dzieje się co roku, a my zmieści się w nadchodzących dniach.
>> Biuro hours-- zrobić utrzymać oko na tym harmonogramie tutaj.
Zmienia się trochę w tym tygodniu, Szczególnie czas rozpoczęcia
i miejsce, więc skonsultować że przed wyruszeniem do godzin pracy biura
każdy z następnych czterech dni.
A teraz słowo o ocenę, szczególnie podczas nurkowania w błąd
ustawia jeden i poza nią.
>> Tak ze specyfikacją, Są to na ogół
osie, wzdłuż której oceniamy swoją pracę.
Zakres odnosi się do tego, co Kod stopniu swoje narzędzia
funkcje wymagane według naszych specyfikacji.
Innymi słowy, jak duża część zestaw kawałek skończyłeś ukąsić.
Czy zrobić jedną trzecią z nich, połowę, 100% z niego.
Nawet jeśli to nie jest prawidłowe, ile nie spróbujesz?
Tak, że oddaje poziom wysiłku i kwoty
do której odgryzł Usterka Seta.
>> Correctness-- ten, do jakim stopniu, to kod
zgodne z naszymi specyfikacje i wolne od błędów.
Tak to działa poprawnie?
Jeśli damy mu jakieś wejście, to robi daje nam wyjście, że oczekujemy?
Zamiary teraz jest to przede Szczególnie te, jakościowe
lub te, które wymagają ludzkiego osądu.
I rzeczywiście, to dlaczego mamy pracowników tak wielu kolegów nauczania i oczywiście
asystenci.
W jakim stopniu jest Twój Kod napisany dobrze?
>> I znowu jest to bardzo ocena jakościowa
że będzie z wami na dwukierunkowo w nadchodzących tygodniach.
Tak, że kiedy nie dostać tylko liczbowe wyniki, ale także
pisemne wyniki lub wpisane informacje zwrotne, lub pisemne informacje zwrotne w angielskich słów.
To, co użyjemy do kierowania ku rzeczywiście pisanie lepszego kodu.
W wykładzie i sekcji, postaramy wskazać out-- tak często jak my can--
co sprawia, że ​​nie tylko program prawidłowe i funkcjonalnie dobre,
ale także dobrze zaprojektowany.
Najbardziej skuteczne może być lub nawet najpiękniejsza może być.
>> Która prowadzi nas do stylu.
Styl ostatecznie jest estetyczny wyrok.
Wybraliście dobry nazwy zmiennych?
Czy wcięty kod poprawnie?
To wygląda dobrze, i dlatego, jest to łatwe dla drugiego człowieka
do zapoznania się z odpowiednią jego poprawność.
>> Generalnie na programie nauczania, to strzeli te rzeczy na skali pięciopunktowej.
I niech mi wbijać domu punkt że trzech jest rzeczywiście dobry.
Bardzo szybko do ludzi zacząć robić arytmetyki.
Kiedy się trzy z pięć na poprawność jakiegoś Pset
i myślą, cholera, mam zamiar do 60% która jest zasadniczo D lub E.
>> To nie jest sposób, w jaki myślę o tych liczbach.
Trzy jest rzeczywiście dobre, a co my generalnie spodziewać na początku
terminu jest to, że jeśli się Pęczek three's-- może kilka
targów, kilka fours-- lub kilka dwójek, kilka fours--
to dobre miejsce, aby rozpocząć.
I tak długo, jak widzimy, trend wzrostowy z czasem
jesteś w szczególnie dobrym miejscu.
>> Wzór używamy do jest w istocie rzeczy masa
to na programie nauczania, co oznacza po prostu, że my
daje większą wagę do poprawności.
Bo to bardzo często prawidłowość że zajmuje najwięcej czasu.
Zaufaj mi teraz.
Będziesz find-- przynajmniej w jednym pset-- że ci
spędzają 90% swojego czasu pracuje na 10% problemu.
>> I wszystko jakby działa z wyjątkiem jednego lub dwóch błędów,
i są to błędy, które utrzymać się późno w nocy.
To są te, które rodzaj ucieczki cię.
Ale po spanie na nim, godziny pracy lub uczestniczenia
lub zadawać pytania on-line, jest kiedy dojdziesz do tego 100% bramki,
i dlatego waga poprawności najbardziej.
Zaprojektuj trochę mniej, a styl trochę mniej.
Ale należy mind-- stylu jest chyba najprostszym
z nich, aby ukąsić jak na przewodniku.
>> I teraz, bardziej poważne Uwaga na uczciwości akademickiej.
CS50 ma niestety rozróżnienie jest największym producentem reklam Zarządu
przypadki niemal co roku historycznie.
To nie jest, ponieważ studenci oszukują w CS50 więcej niż jakakolwiek inną klasę
ale dlatego, że przez charakter pracy, Fakt, że znajduje się elektroniczny
Fakt, że patrzymy na to, i Fakt, że są informatycy,
Mogę powiedzieć, że są jeszcze bardzo dobry w wykrywaniu go.
>> Więc co to oznacza w ujęciu realnym?
Tak więc, na programie nauczania, Kurs jest filozofia
naprawdę nie sprowadzają się być rozsądne.
Jest to granica między robi swoją pracę na własną rękę
i coraz trochę rozsądne pomoc od znajomego,
a wręcz robi to pracy dla przyjaciel, lub wysyłając mu swój kod
tak, że on lub ona może po prostu podjęcia lub pożyczyć go prawo.
I że przecina linię że zasysane klasy.
>> Zobacz, program nauczania ostatecznie na linii
że zwracamy za rozsądne i nieracjonalne zachowanie,
ale to naprawdę nie gotować aż do istoty
swojej pracy potrzeby być własne w końcu.
Teraz z tym powiedział, jest heurystyczna.
Bo jak można imagine-- od godzin pracy biura i wizualizacje
i filmy mamy przedstawiono zatem far-- CS50
jest rzeczywiście przeznaczona do współpracy, jak oraz spółdzielni i jako społeczne
jak to możliwe.
Jak wspólne, jak to jest rygorystyczny.
>> Ale z tym powiedział, heurystyczna, jak zobaczysz w programie nauczania,
jest to, że jeśli masz jakiś problem.
Masz jakiś błąd w kodzie, że ci nie można rozwiązać, jest to uzasadnione dla Ciebie
pokazać swój kod do kogoś innego.
Przyjaciel nawet w klasie, przyjaciel siedzi obok ciebie w godzinach pracy urzędu,
lub członek personelu.
Ale nie może pokazać swój kod do Ciebie.
>> Innymi słowy odpowiedzi do question--
Muszę help-- nie oh, tu jest mój kod.
Spójrz na to i wywnioskować z niego to, co będzie.
Teraz, oczywiście, nie sposób wyraźnie do gry
to system, w którym pokażę ci mój kod przed o pytanie.
Pokażesz mi swój kod przed o pytanie.
Ale zobaczę program nauczania dla drobniejsze szczegóły, gdzie ta linia jest.
>> Tylko teraz namalować obraz i podziel sposób jak najbardziej transparentny
gdzie znajdują się w ostatnich latach jest to liczba przypadków Ogłoszenie Zarządu
że CS50 został odwiedzony przez W ciągu ostatnich siedmiu lat.
14 przypadków to najnowsza upadku.
W odniesieniu do uczniów zaangażowanych, to było jakieś dziwne studentów 20
w ostatni upadek.
Było szczytowa 33 studentów kilka lat temu.
Wiele z nich to niestety nie jest już tutaj na kampusie.
>> Studenci zaangażowani w procentach Klasa historycznie w zakresie od 0%
5,3%, co jest tylko powiedzieć jest corocznie wyzwaniem.
I do tego celu, co chcemy zrobić, to przekazać jeden
że dd-- tylko FYI-- porównać na sprawiedliwość dla tych studentów, którzy
są po linii odpowiednio.
Robimy porównać wszystkie aktualne wysłanych przeciwko wszystkich ostatnich misjach
z ostatnich lat.
>> Wiemy też, jak to google wokół i znaleźć repozytoria kodu
online, fora dyskusyjne online, miejscach pracy online.
Jeśli student może go znaleźć, możemy z pewnością uważają, że tak jak my niestety nie.
Więc to, co zobaczysz w programie nauczania choć jest to klauzula żal.
Z pewnością mogę docenić, a my wszyscy ma
Pracownicy zrobiwszy przebieg jak ten lub ten sam z czasem
na pewno wiesz, jak to jest, gdy życie staje na drodze, gdy masz
niektóre późno w nocy deadline-- Nie tylko w tej klasie
ale another-- gdy jesteś całkowicie wyczerpany, zestresowany,
mają nadmierną liczbę innych rzeczy do zrobienia.
Będziesz się w pewnym momencie w Życie na pewno źle, być może późno
Decyzja noc.
>> Więc na programie nauczania, nie jest to klauzula,
takie, że jeśli w ciągu 72 godzin dokonywania jakiś biedny decyzja, masz do niej
i dotrzeć do mnie i jeden z szefów kursu w
i będziemy mieć rozmowę.
Będziemy obsługiwać rzeczy wewnętrznie w nadziei
o to coraz więcej Chwilę nauczania lub lekcji życia,
a nie coś z szczególnie drastyczne konsekwencje
jak można zobaczyć na tych wykresach tutaj.
>> Więc to jest bardzo poważny ton.
Zatrzymajmy się na zaledwie kilka sekundy przerwy napięcie.
>> [MUZYKA GRA]
>> David J. MALAN: Dobra, tak, jak to było na segue?
Do dzisiejszych głównych tematów.
Pierwszy z nich jest abstrakcją.
Innym który będzie reprezentacja danych, które szczerze mówiąc
jest bardzo suchy sposób powiedzieć, jak możemy go o rozwiązywaniu problemów i myślenia
o rozwiązywaniu problemów?
Więc widzieliście w Scratch i masz widział może już w pset1 z C
że nie tylko mogą korzystać Funkcje, takie jak printf,
że inne osoby w lat przeszłości pisał dla Ciebie.
Możesz również pisać własne funkcje.
>> I mimo, że może nie mieć zrobić to w C, i szczerze mówiąc w pset1
naprawdę nie trzeba pisać własna funkcja ponieważ problem--
, podczas gdy być może trudne w Pierwszy glance-- zobaczysz
ostatecznie może być rozwiązany z nie wszystkie, że wiele linii kodu.
Ale powiedział, że w zakresie z pisania własnych funkcji,
sobie sprawę, że C nie daje Ci taką możliwość.
>> Mam zamiar iść w dzisiejszym kodu źródłowego, , który jest dostępny już w Internecie,
i mam zamiar iść do przodu i otwarte się program o nazwie funkcja 0.C,
w funkcji zerowej zobaczymy kilka rzeczy.
W pierwszej linii od 18 do 23 jest moim głównym zadaniem.
A teraz, zaczynamy czytać Kod, że nie piszesz w locie,
lecz pisałem wcześniej lub że w błąd ustawić
może otrzymać konieczności zostało napisane wcześniej.
Dobrym sposobem, aby rozpocząć czytanie cudzego kodu
jest szukanie głównej funkcji.
Dowiedzieć się, gdzie ten wpis Chodzi o uruchomienie programu,
a następnie go logicznie stamtąd.
>> Więc ten program podobno drukuje Twoje imię następuje dwukropek.
Następnie używamy getString Z biblioteki CS50
aby uzyskać ciąg, lub słowo lub frazę przez użytkownika za pomocą klawiatury.
A jeszcze ta rzeczą tutaj-- PrintName.
>> Teraz nie jest PrintName funkcja, która pochodzi z C
To nie jest w standardzie io.h.
To nie jest w CS50.h.
To raczej w tym samym pliku.
Zauważ, jeśli przewijać a bit-- linie 25 do 27--
to jest po prostu ładny sposób komentowania Twój kod za pomocą gwiazdy i ukośniki.
Jest to multi-line skomentować, i to jest właśnie
mój opis w błękicie co ta funkcja robi.
>> Ponieważ w linii 28 do 31, Napisałem bardzo prostą funkcję
którego nazwa jest PrintName.
Ile trwa argumenty można by powiedzieć?
Więc jeden argument-- bo jest jeden Argument wymienione w nawiasach.
Typ, który jest String.
To znaczy PrintName jest jak tego czarnej skrzynki
Funkcja, która wykonuje lub jako wejście ciąg.
>> I nazwa tego String Nazwa będzie wygodnie.
Nie jest, nie na północ, ale nazwa.
Więc co PrintName zrobić?
To miłe, proste.
Tak jak jednej linii kodu dla printf, ale najwyraźniej to
drukuje "Witaj," tak i tak.
Gdzie tak i tak pochodzi od argumentu.
>> Teraz nie jest to ogromna innowacja tutaj.
Naprawdę, mam wziąć program, który mógł, zostały napisane w jednej linii kodu
poprzez umieszczenie tego tutaj, i zmienił go na coś
która obejmuje niektóre sześć lub siedem lub tak linii kodu w dół tutaj.
>> Ale to praktykowanie zwana zasada abstrakcji.
Rodzaj enkapsulacji wewnątrz nowy Funkcja, która ma nazwę i lepiej
jeszcze, że nazwa dosłownie mówi to, co robi.
To znaczy, że nie jest printf-- szczególnie opisowe.
Jeśli chcę, aby utworzyć kawałek układanki, lub gdybym
Aby utworzyć funkcję że drukuje czyjeś imię,
Piękno robi jest to, że mogę faktycznie
dać tej funkcji nazwę , który opisuje to, co robi.
>> Teraz zajmuje się wejście, które Ja arbitralnie nazwie nazwa,
ale to też jest cudownie opisowe zamiast trochę
generic jak S. i nieważne, teraz, po prostu oznacza,
że ta funkcja nie wręczyć mnie nic.
To nie jest tak, że getString dosłownie ręce mnie ciąg
tak jak my z kawałków papieru z kolegami w zeszłym tygodniu,
ale raczej ma tylko efekt uboczny.
Wypisuje coś na ekranie.
>> A więc na końcu dnia, jeżeli robią funkcja-0, ./function-0,
zobaczymy, że pyta o moje imię.
Wpisuję David, i to typy z moim nazwiskiem.
Jeśli zrobić to ponownie z Robem, to będzie powiedzieć "cześć, Rob."
Tak prosty pomysł, ale może ekstrapolacji z tego psychicznie
że programy się trochę bardziej skomplikowane,
i chcesz napisać kawałek Kod i wezwanie, które code-- Invoke
że code-- przez niektóre opisowe nazwij jak PrintName,
C ma pozwolić nam taką możliwość.
>> Oto kolejny prosty przykład.
Na przykład, jeżeli otworzy plik od dziś nazywa return.c,
zauważyć, co zrobiłem tutaj.
Większość z tej funkcji głównej jest printf.
Pierwszy raz arbitralnie zainicjować zmienna o nazwie x do liczby 2.
Następnie wydrukować "x jest teraz % I "przekazując wartości x.
Więc ja tylko mówię, co to jest.
>> Teraz jestem po prostu śmiało twierdząc z printf.
Jestem wytwarzającego kostki że wartość x, a ja jestem robi to przez wywołanie funkcji
zwana kostka mijania w X jako argument,
, a następnie zapisać dane wyjściowe W tej samej zmiennej x.
Więc jestem przebijania wartość x.
Jestem nadrzędnymi wartość x z co
Wynikiem wywoływania funkcja ta kostka jest.
A potem po prostu wydrukować niektóre puszyste rzeczy tutaj, mówiąc to, co zrobiłem.
>> Więc co to jest kostka?
Zauważ, co jest fundamentalnie inny tutaj.
Dałem funkcji Nazwa, jak wcześniej.
Mam podano nazwę argumentu.
Tym razem nazywa się n zamiast nazwy, ale mogę nazwać to coś chcę.
Jest to jednak różne.
To coś na lewo.
Wcześniej to było to, co kluczowe?
Chłopcy.
Teraz jest to oczywiście int.
>> Więc co może zabrać?
Natomiast void oznacza rodzaj nicość, i tak było.
PrintName zwróciło nic.
To nie coś, ale nie oddać mnie
coś, co mógłbym umieścić na lewa strona od znaku równości
jak robiłem tutaj na linii 22.
>> Więc jeśli powiem w sprawie linii 30, co sugeruje, że prawdopodobnie
o tym, co dla mnie robi kostka?
Tak?
Zwraca liczbę całkowitą.
Więc ręce mnie, dla instancji, kawałek papieru
na której napisał odpowiedź.
2 pokrojone w kostkę, pokrojone w kostkę lub 3 lub 4 cubed-- cokolwiek przekazany,
i jak zaimplementować to?
Cóż, po prostu n razy n razy n to jak mogę kostka wartość.
Więc jeszcze raz, bardzo proste pomysł, ale poglądowe
teraz jak możemy napisać funkcje że rzeczywiście miał nas
wartości, które mogą być interesujące.
>> Spójrzmy na jeden ostatni przykład o nazwie funkcja jeden.
W tym przykładzie, zaczyna aby uzyskać bardziej atrakcyjne.
Więc w funkcji jednego, to program-- anons ostatecznie
zwraca funkcja nazywa GetPositiveInt.
GetPositiveInt nie funkcja w bibliotece CS50,
ale zdecydowaliśmy, że chciałby on istnieć.
>> Jeśli więc przewijać później w pliku, zauważyć, jak poszedłem na temat realizacji
uzyskać pozytywną int, a ja powiedzieć, że jest bardziej atrakcyjne
bo to jest przyzwoity liczba linii kodu.
To nie jest po prostu głupie mały program zabawki.
To faktycznie ma jakieś sprawdzanie błędów i robić coś bardziej pożytecznego.
>> Więc jeśli nie widziałeś solucja filmy, które zostały osadzone w pset1,
że jest to typ pętli w C, w duchu podobnym
do rodzaju rzeczy Scratch może zrobić.
A czy mówi to zrobić.
Wydrukuj to.
Następnie iść do przodu i uzyskać n-- uzyskać int i przechowywać go w N,
i mieć to robić znowu i znowu i ponownie, tak długo, jak liczba N jest mniejsza od jedności.
>> Tak więc brak będzie mniejsza niż jedna tylko wtedy, gdy człowiek nie współpracuje.
Jeśli on lub ona jest wpisanie w 0 lub -1 lub -50,
Ta pętla jest zamiar utrzymać wykonywania w kółko.
I ostatecznie zauważyć, że po prostu zwraca wartość.
Więc teraz mamy funkcję że byłem miło
jeśli CS50 będzie wdrożyć w CS50.h i CS50.c dla Ciebie,
ale tutaj możemy teraz zaimplementować to sami.
>> Ale dwie uwagi na temat niektórych kluczowych informacji.
Jedno- dlaczego Oświadczam int n, myślisz, on line 29
zamiast po prostu robi to tutaj, który jest
bardziej zgodne z co zrobiliśmy w zeszłym tygodniu?
Tak?
Dobra myśl.
Więc gdybyśmy go umieścić tutaj, to tak, jakbyśmy
zachować deklarując go ponownie i ponownie.
Które samo w sobie jest problematyczne nie per se
ponieważ musimy tylko Wartość raz, a następnie
mamy zamiar uzyskać nowy tak.
Ale dobra myśl.
Tak?
>> Zamknij.
Tak, bo już zadeklarowane n na linia 29 na zewnątrz pętli
jest dostępny w całym Cała ta funkcja.
Nie, bo na inne funkcje n jest nadal wewnątrz tych kręconych
szelki tutaj.
Więc-- pewno.
>> Dokładnie.
Więc to jest jeszcze bardziej do rzeczy.
Gdybyśmy zamiast oświadczył n tu na linii 32,
jest to problematyczne, ponieważ odgadnięcia gdzie indziej muszę do niego dostęp?
W linii 34 i prosta zasada jest
że można używać tylko zmienne wewnątrz ostatnich klamrach
, w którym oświadczył, że.
>> Niestety, linia 34 Linia jest za późno,
bo ja już zamknięte nawias klamrowy na linii 33
odpowiadający nawias klamrowy na linii 30.
A więc jest to sposób na powiedzenie że ta zmienna int jest objęty zakresem,
że tak powiem, tylko wewnątrz tych klamrach.
To nie istnieje poza nimi.
>> Tak naprawdę, jeśli mogę to zrobić źle, niech zapisać kod
jak to błędnie napisane jest--.
Pozwólcie mi iść do przodu i rób Funkcja-1 i notice-- błędów.
Korzystanie z nielegalnej identyfikator n na linii 35, która jest tutaj.
A jeśli przewijać w górę dalej, jeszcze jeden.
Korzystanie z nierejestrowana Identyfikator n na linii 34.
>> Więc kompilator, Clang, zauważyć, że jest to po prostu
nie występuje, chociaż wyraźnie, że tam jest wizualnie.
Tak prosta poprawka deklaruje go tam.
>> Teraz pozwól mi przejść do początku pliku.
Co wyskakuje na ciebie jest trochę inaczej
od rzeczy patrzyliśmy na ostatnim tygodniu?
Nie tylko nie mam nazwy, nie tylko Mam niektóre ostre obejmuje do góry,
Mam coś, co ja dzwoniąc prototyp.
Teraz to wygląda strasznie podobny do tego, co właśnie przed chwilą widziałem na linii 27.
>> Warto więc wywnioskować z inna komunikat o błędzie, dlaczego zrobiłem to.
Pozwólcie mi iść do przodu i usunąć te linie nie.
I tak nic nie wiedzą o prototypie.
Remake tego pliku.
Dodać funkcję jednego.
A teraz, cholera, cztery błędy.
Załóżmy, przewiń do pierwszego.
>> Niejawna deklaracja funkcji uzyskać pozytywną int jest nieważny w C99.
C99 oznacza po prostu 1999 wersji języka
C, który jest to, co mamy rzeczywiście używany.
Więc co to oznacza?
Cóż C-- a dokładniej C compilers-- są programy całkiem głupi.
Wiedzą tylko, co masz powiedział im, i to
faktycznie tematyczny z ostatniego tygodnia.
>> Problemem jest to, że jeśli pójdę o wdrażaniu nazwę tutaj,
i wywołać funkcję o nazwie GetPositiveInt tutaj na linii 20,
że technicznie nie ma funkcji istnieje aż 27 linii kompilator widzi.
Niestety, kompilator robi rzeczy góry, w dół, w lewo, w prawo,
tak dlatego, że nie widział Realizacja GetPositiveInt,
ale widzi próby używać go tutaj,
to po prostu będzie bail-- krzyczeć na Ci z błędem message-- może
tajemnicze, a nie w rzeczywistości skompilować plik.
>> Tak więc tak zwane prototyp się tutaj jest wprawdzie zbędna.
Dosłownie, poszedłem na dół i kopiowane i wkleić to, i umieścić go tutaj.
Void byłoby bardziej właściwe, więc będziesz dosłownie skopiować i wkleić go w ten czas.
I dosłownie kopiować i wklejać go.
Naprawdę tak jak miękiszu chleba.
>> Trochę wskazówką dla kompilatora.
Nie wiem co to robi jeszcze, ale ja obiecuję wam
że będzie występować w końcu.
I dlatego w tym line-- Linia 16-- kończy się średnikiem.
Jest zwolnionych przez design.
Tak?
>> Jeśli nie odwołuje się do biblioteki do do-- och, dobre pytanie.
Ostry zawiera inkluzje pliku nagłówka.
Muszą być: powinno prawie być zawsze na samym szczycie
pliku dla similar-- dla dokładnie z tego samego powodu, tak.
Ponieważ w standardzie io.h to dosłownie linia
w ten sposób, ale z printf tekstów, a z jego argumentami i jego typ zwracany.
I tak przez to się robi ostry tu, co ty jesteś dosłownie robi
jest kopiowanie i wklejanie zawartości ktoś inny napisał do góry.
Co cluing swój kod w celu Fakt, że te funkcje nie istnieją.
Tak?
>> Absolutnie.
Tak, bardzo mądry i prawidłowe rozwiązaniem byłoby, wiesz co?
Nie wiem, co Prototyp jest, ale wiem,
jeśli dobrze rozumiem, że C jest po prostu głupi i rethinks góry do dołu.
No dajmy jej to, co chce.
Skończmy ten kod, wklej go góry, a teraz wcisnąć Głównym dół.
To też nie rozwiązuje problemu.
>> Ale można bardzo łatwo wymyślić Scenariusz, w którym trzeba zadzwonić B,
a może B oddzwania do A. jest coś, co nazywa rekurencja,
i wrócimy do tego.
I może być lub może nie być dobrym rzecz, ale na pewno można
złamać tego rozwiązania.
>> I co więcej, chciałbym twierdzą, stylistycznie,
zwłaszcza, gdy swoje programy się tak długo i tak długo,
to jest po prostu bardzo wygodne umieścić na wierzchu głównego
bo to, co najbardziej Programiści będą zależy.
A więc jest to trochę czystsze, zapewne, aby zrobić to tak,
I zrobił to pierwotnie Nawet z prototypem
choć wygląda trochę zwolnionych na pierwszy rzut oka.
Tak?
Niestety, można powiedzieć, że coraz głośniej?
>> Jeśli zmienisz lokalizacje realizacja i prototyp?
Więc to jest dobre pytanie.
Jeśli to ponownie zadeklarować dół tutaj, zobaczmy, co się stanie.
Więc jeśli mogę umieścić to w dół tutaj, mówisz.
Och, przepraszam.
Głośniej?
Jeszcze głośniej.
O, dobre pytanie.
To utratę funkcji?
Wiesz, po tych wszystkich latach, nigdy nie umieścić prototyp później.
Więc robią funkcyjny-1 po robić.
>> [Mamrocząc]
David J. MALAN: Och, czekaj.
Musimy jeszcze włożyć wszystko do góry.
Więc zróbmy to tutaj, czy jestem rozumiejąc poprawnie na pytanie.
Kładę wszystko, w tym Prototyp nad głównym,
ale Kładę prototyp poniżej wykonania.
>> Więc jeśli zrobię jeden, jestem coraz Powrót error-- niewykorzystane zmiennej n.
Och, nie.
Dziękujemy.
Zobaczmy, pozbędziemy się tego.
To inny błąd, więc niech to zignorować.
Zróbmy to naprawdę szybko przerobić.
>> OK, więc dane nie argumentem wykorzystywane przez format string
n-- oh, to dlatego, Zmieniłem na nich tutaj.
Dobrze wiemy, co odpowiedź będzie to-- dobrze, jedziemy.
Ach, dziękuję za pozytywne.
Dobrze, będzie naprawić ten kod after-- zignorować ten szczególny błąd
ponieważ was-- działa to odpowiedź.
>> Więc nie nadpisać , co właśnie zrobił.
Podejrzewam, kompilator jest napisane w taki sposób,
że ignoruje swój prototyp ponieważ organizm, że tak powiem,
z funkcja ma już wdrożono wyżej.
Musiałbym rzeczywiście skonsultować Instrukcja kompilatora
zrozumieć, czy jest jakaś inna implikacja, ale na pierwszy rzut oka
po prostu stara i eksperymentowanie, wydaje się, że nie ma wpływu.
Dobre pytanie.
>> Warto więc posunąć się naprzód teraz, przesuwając od efektów ubocznych, które
to funkcje, które robią coś wizualnie na ekranie z printf,
ale nie zwraca wartości.
I funkcji, które mają zwrot Wartości takie jak właśnie widzieliśmy kilka.
Widzieliśmy już to pojęcie zakresu, i zobaczymy to jeszcze raz i jeszcze raz.
Ale teraz znowu użyj regułę
że zmienna może być stosowany tylko wewnątrz niedawno otwarty
i zamknięte nawiasy klamrowe jak my widział w tym konkretnym przykładzie.
>> A jak zauważył, jest ability--
można rozwiązać niektóre z tych problemów przez wprowadzenie zmiennej globalnej
na samym początku pliku.
Jednak w większości przypadków my boczyć na tym,
i rzeczywiście nawet nie udać do tego roztworu do teraz.
Więc na razie, jest to, że na wynos zmienne mają tę ideę zakresu.
>> Ale teraz spójrzmy na inny suchy sposób rzeczywiście patrząc
na niektóre dość ciekawe szczegóły realizacji.
Jak możemy reprezentować informacji.
I już wyglądało na to W pierwszym tygodniu klasy.
Patrząc na pliki binarne, a przypominając sobie o przecinku.
>> Ale pamiętam z ostatniego tygodnia, że ​​C ma Różne typy danych i bukiety więcej,
Ale najbardziej przydatne z nich teraz może być to.
Char, lub postaci, która się dzieje jako jeden bajt lub osiem bitów całkowite.
A to znaczy, że wielkość z char jest tylko jeden bajt.
Bajt osiem bitów, więc oznacza to, że możemy reprezentować ile znaków.
Ile liter lub Znaki na klawiaturze
jeśli mamy jeden bajt lub osiem bitów.
Pomyśl o tydzień zera.
Jeśli masz osiem bitów, ile suma wartości
można reprezentować w wzory z zer i jedynek?
Jedno- więcej.
Więc jeśli ty ogółem 256 zaczynały się od zera.
Więc jeśli masz osiem bits-- Jeśli więc mieliśmy nasze żarówki binarne się tu ponownie,
możemy zamienić na żarówki i wyłącza każdy z 256 unikalnych wzorów.
>> Teraz jest problematyczne.
Nie tyle dla języka angielskiego i Języki romans, ale z pewnością
kiedy wprowadzać do przykład języki azjatyckie, które
mają znacznie więcej symboli niż jak 26 liter alfabetu.
Faktycznie może potrzebować więcej niż jednego bitu.
I na szczęście w ostatnich latach społeczeństwo
przyjęte standardy, które używają innych więcej niż jeden bajt za opłatą.
>> Ale teraz w C, domyślnie jest tylko jeden bajt lub osiem bitów.
Całkowitą, w międzyczasie, jest cztery bajtów, inaczej znany jako 32 bitów.
Co oznacza, że ​​to, co znajduje się największa Numer można reprezentować przy wew
podobno?
Z miliard.
Więc to cztery miliardy mniej więcej.
2 do 32th mocy, jeśli zakładamy żadnych negatywnych numery
i po prostu korzystać wszystkie pozytywne numery, to cztery miliardy
lub dać możliwości.
Pływak, w międzyczasie, jest inny rodzaj od typu danych w C to wciąż numer,
ale jest to liczba rzeczywista.
Coś z przecinkiem.
I okazuje się, że C wykorzystuje również cztery bajty
reprezentować liczby rzeczywiste.
>> Niestety, jak wiele pływających wartości punktowe są tam w świecie?
Ile prawdziwe liczby są tam?
Istnieje nieskończona numer, a dla tej sprawy
istnieje nieskończenie wiele liczb całkowitych.
Więc jesteśmy już trochę kopania sobie dziurę tutaj.
Przy czym najwyraźniej w computers-- na Najmniej programy napisane w C na them--
można liczyć tylko tak wysoka jak cztery miliardy lub dać,
i zmiennoprzecinkowych może tylko pozornie
jakieś skończoną ilość precyzją.
Tylko tyle cyfr po ich punkt dziesiętny.
>> Ponieważ, oczywiście, o ile masz tylko 32 bitów,
Nie wiem, w jaki sposób mamy zamiar go o stanowiących prawdziwą numbers-- prawdopodobnie
z różnych rodzajów wzorów.
Ale na pewno jest skończona Liczba takich wzorców
tak i tu jest problem.
>> Teraz możemy uniknąć problemu lekko.
Jeśli nie korzystasz z pływaka, można użyć podwójnego
w C, co daje osiem bajtów, które jest bardziej możliwe wzory zer
i jedynek.
Ale to jeszcze skończony, który będzie się problematyczne, jeśli piszesz oprogramowanie
dla grafiki lub fantazji wzory matematyczne.
Więc może rzeczywiście chcesz liczyć się większy.
Długo long-- głupio named-- jest ośmiu bajtów lub 64 bitów,
i jest dwa razy dłuższy od int, i to przez długi liczby całkowitej.
>> Zabawa fact-- jeśli int jest cztery bajty, jak długo jest długo w C zazwyczaj?
Również cztery bajty, ale długo, długo jest osiem bajtów,
a to ze względów historycznych.
>> Ale teraz na wynos jest tak, że dane mają
być reprezentowane w computer-- który jest fizyczne urządzenie z prądu,
to ogólnie jazdy te zera i ones--
z ograniczonej ilości precyzją.
Więc w czym problem, a następnie?
>> Dobrze, że jest problem z całkowitą przepełnienia.
Nie tylko w C, ale w komputerów w ogóle.
Na przykład, jeżeli Bajt jest wart bit--
jeśli tak, to wszystkie osiem bit-- z których są numerem jeden.
Co to jest numer reprezentujący jeśli założymy
to wszystkie pozytywne wartości w systemie binarnym?
>> 255, i to nie jest 256, ponieważ zero to najniższy numer.
Tak więc 255 jest najwyższa jeden, ale problem
jest przypuszczać, że chciałem przyrost wartości tej zmiennej, która
jest za pomocą ośmiu bitów, razem jeśli chcę ją zwiększyć.
>> Cóż, jak tylko dodać jeden wszystkim w tych,
można chyba wyobrazić visually-- tylko jak niosący jedną używając decimals--
coś się przepływ w lewo.
I rzeczywiście, jeśli dodać numer jednego z tym, co się dzieje w układzie binarnym
jest to, że przelewa się z powrotem do zera.
>> Więc jeśli tylko nie use-- int, ale jeden bajt liczyć liczb całkowitych
w programie, przez default-- jak najszybciej można dostać się do 250, 251, 252, 253, 254,
255-- 0 przychodzi po 255, które prawdopodobnie nie to, co jest
użytkownik będzie spodziewać.
>> Teraz zaś w świat liczb zmiennoprzecinkowych, masz też podobny problem.
Nie tyle z największą number-- mimo to wciąż problem.
Ale z ilością precyzją że można reprezentować.
Warto więc spojrzeć na ten przykład tutaj również z dzisiejszej źródłowego code--
unosić-0.c.
>> I zauważyć, że to bardzo prosty program, który
najwyraźniej powinien wydrukować, co wartość?
Co pan postawić to będzie drukować chociaż jest trochę nowej składni
tutaj?
Więc mam nadzieję, że 0.1.
Tak więc równoważne jednej dziesiątej bo robię 1 podzielone przez 10.
Jestem przechowywania odpowiedź w zmiennej o nazwie f.
Że zmienna jest typu float, które jest kluczowe właśnie proponowany istniał.
>> Nie widziałem tego wcześniej, ale jest to rodzaj schludny sposób w printf
Aby określić liczbę cyfr można chcą zobaczyć po przecinku.
Więc to po prostu oznacza, notacja że tutaj jest symbolem zastępczym.
To dla zmiennoprzecinkowych wartość, a tak przy okazji,
pokazać go z miejsca po przecinku z jedna liczba po przecinku.
Więc to jest liczba cyfr znaczących,
że tak powiem, że warto.
>> Więc pozwól mi iść do przodu i robić się unosić-0, ./float-0,
i najwyraźniej 1 podzielone przez 10 wynosi 0,0.
Teraz, dlaczego to jest?
>> Cóż znowu, komputer bierze mi dosłownie, a ja napisałem 1
i mam napisane 10 i zgadywać, co Zakłada to typ danych dla tych dwóch
wartości?
Int, jest to technicznie coś trochę innego.
To zwykle długo, ale to ostatecznie wartość całki.
Nie wartością zmiennoprzecinkową.
>> To znaczy, że jeśli ten Int i jest to int
Problemem jest to, że komputer nie mają zdolności
do nawet zapisać ten punkt dziesiętny.
Więc kiedy robisz 1 podzielone o 10 za pomocą liczb całkowitych
zarówno w liczniku i mianownik, odpowiedź powinna być 0,1.
Ale computer-- ponieważ to są integers--
nie wie, co zrobić z 0,1.
>> Więc co to jest wyraźnie robi?
To jest po prostu rzuca ją, i co widzę ostatecznie
0.0 tylko dlatego, że twierdził, że printf pokaż mi jednego miejsca po przecinku.
Ale problemem jest to, że jeśli podzielić liczbę całkowitą przez liczbę całkowitą,
będziesz get-- z definicji z C-- liczbę całkowitą.
I to nie zrobi coś miło i wygodnie
jak okrągłe to do Najbliższy górę lub w dół.
To będzie obciąć wszystko po przecinku.
>> Więc po prostu intuicyjnie, co pewnie naprawić?
Co Najprostszą tutaj?
Tak?
Dokładnie.
Dlaczego nie możemy po prostu traktować je jako skutecznie zmiennoprzecinkowych
zamieniając je w pływaki lub dwuosobowe.
A teraz, jeśli robią pływaki-0, lub jeśli skompilować pływaków-1,
który jest identyczny co właśnie zaproponował.
A teraz mam pace-0, teraz dostanę 0,1.
>> Teraz jest to niesamowite.
Ale teraz mam zamiar zrobić coś trochę innego.
Jestem ciekaw, co jest naprawdę dzieje pod maską,
i mam zamiar wydrukować ten się do 28 miejsc po przecinku.
Chcę, aby naprawdę zobaczyć 0.1000-- infinite--
[Niesłyszalne] 27 zerami po tej 0,1.
>> No zobaczymy, czy to , co rzeczywiście dostać.
Dodać 0 pływający-sam plik.
./floats-0.
Miejmy powiększyć dramatycznej odpowiedzi.
Przez cały ten czas, już myśli 1 podzielone przez 10 to 10%, lub 0,1.
To nie jest.
Przynajmniej o ile Komputer jest zaniepokojony.
>> Teraz why-- OK, to jest kompletna kłamstwo 1 podzielone przez 10 wynosi 0,1.
Ale nie jest to why-- dania na wynos dziś.
Więc dlaczego komputer myśleć, w przeciwieństwie do każdego z nas w pokoju,
1, który jest podzielony przez 10 faktycznie, że szalony wartość?
Co komputer robi podobno?
Co to jest?
>> To nie jest przepełnienie, per se.
Przepełnienie jest zazwyczaj, gdy owinąć wokół wartości.
To jest ten problem z niedokładności w wartości zmiennoprzecinkowej
gdzie masz tylko 32 lub może nawet 64 bit.
Ale jeśli jest nieskończona liczba rzeczywistym numbers--
numery z kropkami i na pewno numery thereafter--
nie może reprezentować wszystkie z nich.
Więc komputer dał nam najbliższa
wartości może reprezentować przy użyciu tego wiele bitów do wartości faktycznie chcę,
który wynosi 0,1.
>> Niestety, jeśli zacząć robić matematyki, albo
rozpocząć z udziałem tego rodzaju pływające Wartości punktowe w ważnej programs--
oprogramowanie finansowe, wojskowy software-- coś
gdzie percepcja jest chyba dość ważne.
I rozpocząć dodawanie Numery takie jak ten, i zacząć
działa, że ​​oprogramowanie z naprawdę dużych nakładów
lub na wiele godzin lub partii dni lub wiele lat,
te malutkie błędy z pewnością można dodać w czasie.
>> Teraz, jak na bok, jeśli kiedykolwiek widziałem Superman 3 lub biurowe
a może pamiętacie jak ci faceci ukradli
dużo pieniędzy z komputera przy użyciu pływających wartości punktowe
i dodanie trochę Resztki, miejmy nadzieję, że film
teraz ma więcej sensu.
To jest to, co było nawiązując w tym filmie.
Fakt, że większość firmy nie będzie wyglądać
Po pewnej liczbie miejsc po przecinku,
ale to są ułamki centów.
Więc zacząć dodawać je, zacząć zarabiać dużo pieniędzy
na koncie bankowym.
Więc to biurowe wyjaśnił.
>> Teraz niestety poza Powierzchnie biurowe, istnieje
niepokojące są pewne legalnie i znaczące wpływy
tych rodzajów podstawowe decyzje projektowe,
i rzeczywiście jedną z przyczyn używamy C w trakcie
jest tak, że naprawdę masz tę ziemię do zrozumienia, jak działają komputery,
jak działa program, a nie brać niczego za pewnik.
>> I rzeczywiście, niestety, nawet z że fundamentalne zrozumienie,
my, ludzie popełniają błędy.
I co ja pomyślałem, że podzielę się to osiem minut film tutaj brane
z Współczesne cuda odcinka, który jest pokaż edukacyjna na jak to wszystko działa
że maluje dwa zdjęcia od kiedy niewłaściwe użycie
i zrozumienie zmiennoprzecinkowych
doprowadziły do ​​niektórych znacząca niefortunne wyniki.
Rzućmy okiem.
[ODTWARZANIE]
-Mamy Teraz wrócić do "Inżynierii Katastrofy "na Modern Marvels.
Komputery.
My wszyscy przychodzą do zaakceptowania frustrujące problemy, które często
dostaliśmy z them-- błędów, wirusów i glitches-- oprogramowanie dla małych cenach
kosztami dla wygody.
Ale w wysokiej technologii i wysokiej prędkości Zastosowania wojskowe i programu kosmicznego,
Najmniejszy błąd może być powiększony do katastrofy.
>> W dniu 4 czerwca 1996 roku, naukowcy przygotowany uruchomienie bezzałogowy rakiety Ariane 5.
To niósł naukowe Satelity zaprojektowany
ustalić dokładnie, jak Pole magnetyczne Ziemi współdziała
z wiatrów słonecznych.
Rakieta została zbudowana na Europejska Agencja Kosmiczna,
i podniósł się ze swojego zakładu na wybrzeżu Gujany Francuskiej.
>> -at Około 37 sekund do lotu, po raz pierwszy
Zauważyłem coś się dzieje źle.
Że dysze zostały skręcie w sposób naprawdę nie powinno.
Około 40 sekundach lotu, wyraźnie pojazd miał kłopoty,
i to jest, gdy się Decyzja, by go zniszczyć.
Zakres oficer bezpieczeństwa, z ogromne wnętrzności, wciśnięty przycisk
i wysadzili rakiety zanim mogłem stanowić zagrożenie dla bezpieczeństwa publicznego.
>> -To Było panieńskie rejs na Ariane 5,
i jego zniszczenie trwało miejsce ze względu na wadę
osadzone w oprogramowaniu rakiety.
-The Problem na Ariane to, że nie
to ilość wymagana 64 bity, aby wyrazić,
i chcieli przekształcić go do 16-bitowa.
Zakłada się, że ich liczby nigdy nie będzie bardzo duża.
Że większość z tych cyfr w 64-bitowy numer były zerami.
Byli w błędzie.
>> -The Niezdolność jednego program do zaakceptowania
rodzaj liczby generowane przez inny był u podstaw niepowodzenia.
Rozwoju oprogramowania stał bardzo kosztowna część nowej technologii.
Rakieta Ariane miał 4 była bardzo udana.
Tyle oprogramowania utworzonego na jest także stosowany w Ariane 5.
>> -The Podstawowy problem było to, że Ariane 5.
Został faster-- przyspieszone szybciej i oprogramowanie nie stanowiło to.
>> -The Zniszczenie rakiety była ogromna katastrofa finansowa.
Wszystko z powodu błędu oprogramowania minut.
Ale to nie był pierwszy Problemy w czasie konwersji danych
był nękany nowoczesną technologię rakietową.
>> -in 1991 z początku pierwszej wojny w Zatoce Perskiej,
rakietowej Patriot doświadczył podobnego rodzaju
problem konwersji numer.
Iw rezultacie 28 ludzie-- 28 Amerykańska soldiers-- zginęło,
i około stu innych rannych.
Kiedy Patriot, która miała ochrona przed przychodzących kiełże,
nie udało się wystrzelić rakietę.
>> -Gdy Irak zaatakował Kuwejt, i Amerykę rozpoczęła Pustynna Burza na początku 1991 roku,
Baterie rakiet Patriot zostały rozmieszczone ochrona Arabię ​​Saudyjską i Izrael
z irackich ataków rakietowych Scud.
Patriot jest US średniego zasięgu ziemia-powietrze systemu
produkowany przez firmę Raytheon.
>> -Rozmiar Patriot interceptor itself--
to jest o około 20 metrów długości, i waży około 2000 kilogramów.
I niesie głowicę około, Myślę, że mniej więcej 150 funtów.
A sama głowica jest wysoka wybuchowy, co
zawiera fragmenty wokół niego.
Tak więc obudowa głowicy ma zaprojektowany, aby działać jak śrut.
>> -The Pociski są realizowane cztery na pojemniku,
i są transportowane przez naczepy.
>> -The System anty-rakietowej Patriot sięga co najmniej 20 lat.
Pierwotnie był on przeznaczony jako pocisk obrony powietrznej
zestrzelić samoloty wroga.
W pierwszej wojnie w Zatoce Perskiej gdy przyszedł na tę wojnę,
Armia chciała użyć go do zestrzelić kiełże, a nie samoloty.
Air Force był iracki nie tyle problem,
ale armia martwi kiełże.
I tak starali się uaktualnić Patriot.
>> -Intercepting Wroga pocisk porusza się Mach 5
miał być dość trudne.
Ale kiedy Patriot został przewieziony do eksploatacji,
Armia nie była świadoma Modyfikacja, że ​​iracki
przedstawili swoje kiełże prawie można go.
>> Co się stało, że jest kiełże wchodzili były niestabilne.
Byli chwiejne.
Powodem tego był Iraqis-- W celu uzyskania 600 km na
o zasięgu 300 kilometrów missile-- trwało masy z przodu głowicy,
i głowica wykonane zapalniczki.
Więc teraz Patriot próbuje się w Scud i większość time--
Zdecydowana większość time-- to tylko latać przez Scud.
>> -Po Operatorów systemu Patriot realizowane Patriot przegapić swój cel,
one zdetonowane Patriot w głowicę aby uniknąć ewentualnych wypadków czy to
pozwolono opaść do podłoża.
>> -To Było to, co większość ludzi widziało jak wielkie kule ognia na niebie,
i źle rozumiane jako przechwytuje z głowic Scud.
>> -Mimo W nocne niebo, Patriotów wydają się być skutecznie niszczą
Kiełże na Dhahran mogą istnieć nie pomyłka o jego wydajności.
Istnieje system radarowy Patriota za stracił utwór przychodzących Scud
i nigdy nie rozpoczął z powodu do wada oprogramowania.
>> To było Izraelczyków, którzy po raz pierwszy odkryta że dłuższy system jest włączony,
większa rozbieżność czas stał.
Ze względu na tryb osadzony w komputerze systemu.
>> -O Dwa tygodnie przed Tragedia w Dhahran,
Izraelczycy zgłaszane Departament Obrony
że system został straty czasu.
Po około osiem godzin z rzędu, zauważyli
system ten jest coraz znacznie mniej dokładne.
W odpowiedzi Departament Obrony mówi wszystko baterii Patriot
aby nie pozostawić systemów od dłuższego czasu.
Nigdy nie powiedział, co było dawno.
8 godzin, 10 godzin, tysiąc godzin.
Nikt nie wiedział.
>> -The Baterii Patriot stacjonujących w koszarach
w Dhahran i jego wadliwa wewnętrzny Zegar Minęło ponad 100 godzin
w nocy z 25 lutego.
>> -it Śledzone czas z dokładnością około jednej dziesiątej sekundy.
Teraz dziesiątej sekundy Numer jest ciekawa
ponieważ nie może być wyrażona binarnie dokładnie, co
oznacza, że ​​nie może być dokładnie wyrażony w każdym nowoczesnym komputerze cyfrowym.
Trudno w to uwierzyć, ale używać jako przykład.
>> Weźmy liczbę jedną trzecią.
Jedna trzecia nie może być wyrażoną w postaci dziesiętnej dokładnie.
Jedna trzecia jest 0.333 dzieje się na nieskończoność.
Nie ma sposobu, aby to zrobić z Dokładność bezwzględna w przecinku.
To jest dokładnie ten rodzaj problemu , które stało się w Patriot.
Już układ pobiegłszy gorszy błąd czas stał.
>> -Po 100 godzinach pracy, Błąd w czasie tylko około jednej trzeciej
sekundy.
Jednak w warunkach kierowania pocisk porusza się Mach 5,
Wynikało to w śledzeniu Błąd z ponad 600 metrów.
Byłoby to błąd krytyczny dla żołnierzy w Dhahran.
>> Co stało się uruchomienie Scud było wykryte przez satelity wczesnego ostrzegania,
i wiedzieli Scud nadchodzi w ich ogólnym kierunku.
Nie wiem, gdzie to nastąpi.
To było teraz do radaru Składnik systemu Patriot
Broniąca Dhahran zlokalizować i zachować utwór z nadchodzącego wroga pocisków.
>> -The Radar był bardzo inteligentny.
To faktycznie utwór Stanowisko Scud
i przewidzieć, gdzie Prawdopodobnie będzie to
Następnym razem Radar wysłany impuls z.
Które nazwano brama zakres.
>> -Potem Raz Patriot ma wystarczająco dużo czasu, decyduje
przeszedł wrócić i sprawdzić następny Lokalizacja tego wykrytego obiektu
wraca.
Tak więc, gdy wrócił do złego miejsce, to wtedy nie widzi obiektu.
I decyduje, że nie było celem.
Że było fałszywe wykrywanie i spada z toru.
>> -The Przychodzące Scud zniknął z ekranu radaru,
i sekundy później, to uderzył w koszarach.
Scud zabił 28.
Był to ostatni zwolniony podczas pierwszej wojny w Zatoce Perskiej.
Niestety, zaktualizowane oprogramowanie przybył o świcie następnego dnia.
Usterka oprogramowania miał zostały ustalone, zamykanie
jeden rozdział w kłopoty Historia rakiet Patriot.
>> [KONIEC ODTWARZANIE]
>> David J. MALAN: To jest to dla CS50.
Do zobaczenia w środę.
>> [MUZYKA GRA]