>> [Odtwarzanie muzyki]
>> DAVID J MALAN: Dobra, Witamy z powrotem do CS50.
Jest to początek dwóch tygodni.
Słowo od jednego z naszych przyjaciele na kampusie -
jeśli jesteś zainteresowany, prawdopodobnie, albo obecnie lub w jakimś przyszłym okresie
nawet, gdy bardziej komfortowe, nauczanie gimnazjalistów małe
coś o informatyce, zrobić głowę do tego adresu URL.
Są to w szczególności potrzeby teraz z nauczycieli, szczególnie, jeśli masz
miał kilka ekspozycji na informatyce.
>> Tak więc przypomnieć, że ostatni raz, wprowadziliśmy kilka typów danych w C, oraz
może już zaczął się twój brudne ręce z nich do tej pory
w problemie ustawione.
I mieliśmy char.
Tak więc w nieco technicznych, co jest char, jak znamy ją dzisiaj?
>> Więc to jest znak, ale niech Dokładniej teraz.
Co rozumiemy przez charakter lub indywidualne char?
Non-numeryczne znaków -
więc niekoniecznie.
Okazuje się, że nawet numery, nawet interpunkcyjne i litery są
przedstawiciele z tych danych typ znany jako char.
Więc to nie jest koniecznie w kolejności alfabetycznej.
Tak?
>> Więc to jest ASCII.
Więc jeśli uważasz, że powrót do tygodnia zera, gdy mieliśmy bajt wolontariuszy
przyjść i albo trzymać ręce w górę czy nie, oni reprezentowane bitów.
Ale wspólnie jako grupa ośmiu, stanowiły one bajt.
I wprowadziliśmy pojęcie ASCII w tym wykładzie, który po prostu jest
mapowanie między cyframi i literami.
I ASCII zastosowań, jak ci ludzie dorozumianych, osiem bitów
do reprezentacji znaku.
>> Więc w związku z tym jeżeli osiem bitów może każdy się na jednej z dwóch wartości -
zero lub jeden -
To znaczy, że były dwie możliwości dla tej osoby -
zero lub jeden -
dwie osoby, w tym dwa dla tego osób, dwa dla tego jednego.
Tak więc w sumie dwa razy dwa razy dwa razy dwa razy dwa -
więc dwa ósme w sumie.
Więc jest łączna liczba znaków 256 możliwe, że można
stanowią z ośmiu bitów.
>> Teraz, ci z was, którzy mówią Asian języki mogą wiedzieć, że jest więcej
znaki w świecie, niż tylko Jak i ze śniadaniem i Cs i Ds.
I rzeczywiście, ASCII nie wystarczyć wiele języków świata.
Ale o tym innym razem.
Na razie wiemy, że w C, jeśli chcesz do reprezentowania nas, kawałek
interpunkcja, lub po prostu coś character w przyrodzie, używamy char.
I to jest jeden bajt lub osiem bitów.
>> Jak o int?
Cóż, int jest liczbą całkowitą.
Ile bitów, jeśli przypomnieć, był liczbą całkowitą zwykle?
Przypomnijmy ktoś?
Więc jest to zazwyczaj 32.
To naprawdę zależy od komputera że używasz.
Ale w urządzeniu, w wielu komputery, to 32 bity lub cztery
bajty - osiem razy cztery.
I ints służą tylko do przechowywania numerów, albo negatywne,
dodatnia lub zero.
>> A jeśli masz 32 bitów i można tylko troska o liczb dodatnich, może
stadiony ktoś ile to możliwe liczbami całkowitymi mogą reprezentować z komputera
zera w górę?
Byłoby więc dwa do 32, która to mniej więcej czterech miliardów.
Więc te uprawnienia dwóch będą tematy powracające w informatyce.
Jak zobaczymy, że są bardzo wygodne pracować, nawet jeśli nie do końca
łatwe do matematyki w głowie.
>> Więc mówimy mniej więcej czterech miliardów.
Teraz, długo długo -
możesz rodzaju przypuszczenie.
To dłużej niż int.
Ile bitów?
Tak więc 64 bitów lub ośmiu bajtów.
To po prostu oznacza, że ​​można reprezentować jeszcze większe liczby, większe pozytywne lub
większe liczby ujemne.
>> A co unosić?
To zmiennoprzecinkowe wartość 32 bitów.
To tylko liczba rzeczywista, coś z przecinkiem.
Ale jeśli zamiast potrzebujesz więcej miejsca po przecinku lub chcesz
reprezentować większą liczbę z niektórymi frakcja po nim, można użyć
double, która jest 64 bitów.
>> Ale jest ciekawa wynos tutaj.
Tak więc, jeśli ints są ograniczone przez 32 bitów i nawet długie wyroby długie są ograniczone przez 64
bitów, że rodzaj nasuwa się pytanie, co, jeśli rzeczywiście chcesz się liczyć
wyższa niż 4000000000 do int?
Cóż, po prostu użyć long long.
Ale co jeśli chcesz liczyć wyższe niż dwa do 64, lub dać?
>> Teraz, to ogromna liczba.
Ale w końcu, to może faktycznie dbać o tego rodzaju wartości,
szczególnie jeśli korzystasz z bazy danych i zaczynają zbierać się dużo, dużo
i dużo danych i przypisanie wyjątkowy numery do każdego elementu danych.
Więc niby problem.
I podobnie, z zmiennoprzecinkowych wartości - pływaki lub dwuosobowe -
jeśli masz tylko skończoną liczbę bitów, ile łączna liczba mogłeś
może reprezentować?
>> Cóż, jest to mniej oczywiste, gdy obejmować dziesiętnego.
Ale to na pewno skończona.
Jeśli masz skończoną liczbę bitów, skończona liczba ludzi, skończony
ilość żarówek, z pewnością można stanowią jedynie skończoną liczbę
zmiennoprzecinkowych.
Ale ile liczb rzeczywistych jest ich na świecie?
Istnieje nieskończona.
Więc to jest trochę problem, bo nie mają nieskończoną ilość
pamięci lub pamięci RAM wewnątrz naszych komputerach.
Więc niektóre trudne rzeczy mogą się zdarzyć.
>> Więc idź naprzód i spróbować Wyrażając to tutaj.
Pozwólcie mi iść do przodu i otworzyć gedit.
Mam zamiar iść do przodu i zapisać plik nazywany "floats0.c" po prostu być
zgodne z przykładem, który jest dostępne w Internecie, jeśli chcesz.
I zamierzam iść do przodu i zdefiniować w następujący sposób -
Mam zamiar iść dalej i powiedzieć, int Głównym nieważne, jak często robimy.
>> A potem w tym programie, mam zamiar Oświadczam sobie pływaka, więc 32-bit
zmienna o nazwie f, arbitralnie.
A potem idę do przechowywania w nim Nie wiem, jedną dziesiątą, więc 0,1.
Więc idę do wyrażenia, że ​​jako jeden podzielone przez 10, który jest idealnie
uzasadnione w C.
>> A potem w drugiej linii, po prostu Aby wydrukować tę wartość.
Więc przypominam, że możemy użyć zaznajomieni printf.
Nie chcemy, aby użyć% i do wew.
Chcemy wykorzystać% f dla pływaka.
A potem mam zamiar zrobić odwrotny ukośnik n, zamknij cudzysłów, przecinek, f, średnik.
>> Tak tu jest mój program.
Jest już jeden błąd.
Czy ktoś, dla kogo ta kliknięciu już chcą wskazać co najmniej
jeden błąd zrobiłem?
Tak?
Tak.
Zapomniałam "# include" na top, ale objawem, który gdy próbuję
skompilować to będzie, że Kompilator będzie na mnie krzyczeć,
mówiąc niezdefiniowany symbol lub coś w tym celu.
Nie rozumiem czegoś jak printf.
>> Więc mam zamiar zrobić "# include ", Zapisz plik.
A teraz jest w lepszej formie.
Ale mam też zamiar zwrócić obecnie jeden nowy szczegół dziś.
Oprócz określenia miejsca Posiadacze takich jak% f% i% s, można
czasami wpływać na zachowanie tego symbolu zastępczego.
Na przykład, w przypadku szyby wskaż wartość, jeśli tylko chcesz
na wyświetlanie jednego miejsca dziesiętnego po Okres, mogę rzeczywiście zrobić 0.1f.
Tak więc, innymi słowy, że oddzielenie f i znak procent z 0,1, po prostu
mówi printf, możesz mieć cały Kilka liczb po przecinku
punkt dla mnie.
Ale chcę tylko zobaczyć jeden z nich.
>> Więc mam zamiar iść dalej teraz i oszczędzaj ten program, wejdź do mojego terminalu
okno, i mam zamiar iść do przodu i make 0 pływaka, wprowadź.
Widzę, że nieco tajemniczy wiersz zacznie więcej sensu jak my
drażnić go od siebie w tym tygodniu i następnym.
Teraz mam zamiar iść do przodu i uruchomić zera pływaka.
I, cholera.
>> Więc jest jeszcze jeden błąd tutaj z jakiegoś powodu.
Jestem pewien, że jedna dziesiąta lub jedna dzieli się przez 10, nie jest 0,0.
Może po prostu nie jestem patrząc w wystarczającej ilości cyfr.
Dlaczego więc nie mogę powiedzieć, dwa 0,2 zobaczyć dwa miejsc po przecinku, a nie tylko jeden.
Pozwól mi wrócić do mojego okna terminala tutaj i uderzył się kilka razy do
zobacz moją historię.
Rób unosić zera znowu, a następnie ponownie.
A teraz wprowadzić.
>> A teraz jestem całkiem pewien, że to jest złe.
I mógłbym zrobić trzy i cztery, a ja jestem prawdopodobnie będzie utrzymywać widząc zera.
Więc gdzie jest błąd?
Jeden podzielone przez 10 powinna wynosić 0,1.
Ktoś chce brać stab w jakich Podstawowym problemem jest to,?
Tak?
Oboje są liczbami całkowitymi.
Więc co?
Więc z jednej podzielonej przez 10, to to, co robię w arytmetyce.
I mam 0,1.
>> Tak.
I tak jest w istocie, że problem.
Jeśli wziąć liczbę całkowitą w komputerze i podzielić go przez inną liczbę całkowitą,
komputer domyślnie będzie Zakładam, że chcesz liczbę całkowitą.
Problem jednak, oczywiście, jest że 0,1 nie jest liczbą całkowitą.
To jest liczba rzeczywista.
A więc co robi komputer przez Domyślnie jest to po prostu wyrzuca
wszystko po przecinku.
Nie zaokrąglić w dół lub w górę per se.
To po prostu wyrzuca wszystko po przecinku.
A teraz to ma sens.
Bo teraz jesteśmy wyraźnie pozostało zero.
>> Ale chwileczkę.
Nie widzę int zero.
Jestem rzeczywiście widząc 0,00.
Więc w jaki sposób pogodzić to teraz?
Jeśli ktoś dzieli się przez 10 wynosi zero, ale jestem widząc 0,00, gdzie jest to miejsce
konwertowane z powrotem do liczby rzeczywistej?
Tak.
Dokładnie.
>> Tak się tu w wierszu pięć, kiedy faktycznie przechowywanie, że 0.1, która jest następnie
obcięty na zero, wewnątrz pływaka, to skutecznie równoważne
przechowywania nie go jako int, ale rzeczywiście, jak pływaka.
Co więcej, jestem następnie przy użyciu printf wyraźnie wydrukować tę liczbę do dwóch
miejsc po przecinku, mimo że może faktycznie nie być dowolny.
>> Więc to jest do bani, tak?
Podobno nie można zrobić matematyki, co najmniej na tym poziomie
precyzja, w komputerze.
Ale na pewno nie jest rozwiązaniem.
Co Najprostszą mogliśmy być może zrobić, choćby intuicyjnie, żeby
rozwiązać ten problem?
Tak?
Włącz liczb całkowitych do -
tak.
Nawet jeśli nie jestem pewien, co jest naprawdę dzieje się tutaj, jeśli
zasadniczo ma zrobić z nich zarówno jako wskazówki, dobrze, dlaczego nie mogę
sprawiają, że 10,0, co to 1.0, ponownie zapisać plik.
Pozwólcie mi iść z powrotem do Dno i rekompilacji.
Pozwól, że teraz ponownie uruchomić.
A tam -
teraz mam moją jedną dziesiątą reprezentowane 0,10.
>> Dobrze.
Tak, że nie jest źle.
I pozwól mi wskazać jeden inny sposób moglibyśmy rozwiązać ten.
Pozwól, że faktycznie toczą się w czasie kiedy mieliśmy to jeden
dziesiątą chwilą.
I pozwól mi iść do przodu i ponownie zapisać ten plik w pliku o innej nazwie, tylko do
mieć trochę kontrolny.
Więc to było w wersji jedno.
A teraz pozwól mi iść do przodu i zrobić jeszcze jedną wersję.
Nazwijmy tę wersję dwa zera indeksowane.
>> I mam zamiar zamiast robić to - wiesz co?
Dodawanie kropki zerowy działa w tym przypadku.
Ale załóżmy, że jeden z nich zmienne.
Podobno 10 były zmienne.
Innymi słowy, załóżmy, że nie mogłem tylko hard-code 0,0 na koniec
tego wyrażenia arytmetycznego.
Cóż, może faktycznie coś zrobić w nawiasach nazywa odlewania.
Mogę rzucić tę liczbę całkowitą 10 do pływaka, i mogę rzucić, że jedną z liczb całkowitych
unosić się, jak dobrze.
Następnie math, że zamierza zrobić jest skutecznie 1,0 podzielone przez 10,0,
wynik, który idzie wf, jak wcześniej.
Jeśli więc skompilować to jako make pływaków 2, a teraz pływa 2, mam same
odpowiedzi, jak również.
>> Więc jest to dość wymyślony przykład, rozwiązać ten problem
wprowadzając odlewu.
Ale na ogół, odlewanie będzie potężna rzecz, szczególnie dla
Problem ustawić dwa w ciągu tygodnia, kiedy chcesz przekonwertować jeden rodzaj danych, aby
drugiego, że na koniec dnia reprezentowane są w taki sam sposób.
Na koniec dnia, każdy pojedynczy rzeczą, rozmawialiśmy o tej pory jest
zaledwie ints pod maską.
A jeśli to zbyt niski poziom dla ty, to tylko numery
pod maską.
Nawet znaki znów przywołać od zera tygodni, są numery
pod maską.
>> To znaczy, można konwertować pomiędzy różne rodzaje numerów jeśli
oni są tylko bity.
Możemy konwertować pomiędzy numerami i litery, czy są po prostu
bitów, i odwrotnie.
I odlewania, w ten sposób jest mechanizm programowania, który pozwala na siłę
zmiana jednego typu danych na inny.
Niestety, nie jest, jak proste, jak może chciał.
>> Mam zamiar wrócić do pływaków 1, którym było prostsze i bardziej
proste jeden z 0,0 dodany do siebie.
I tak jak szybki Refresher, pozwól mi iść do przodu i ponownie skompilować
tego uczynić pływaków 2 -
Przepraszam, to jest uczynić pływaków 1.
A teraz uruchom pływaków 1.
A w dole, zawiadomienia że rzeczywiście dostać 0,1.
Tak, problem został rozwiązany.
>> Ale jeszcze nie teraz.
Jestem teraz będzie trochę ciekawy, i mam zamiar wrócić do mojego
printf i powiedziałeś, wiesz co?
Chciałbym potwierdzić, że jest naprawdę jedną dziesiątą.
I będę chciał to zobaczyć do, powiedzmy, pięć miejsc po przecinku.
To nie problem.
Zmienić dwa do pięciu, I ponownie skompilować z make.
I ponownie uruchomić go jak pływa 1.
Szukam dobre.
Moje testy sprawdzające może skończyć tam, ale Dostaję trochę bardziej ryzykowny.
Zamierzam zmienić 0,5 do 0,10.
Chcę zobaczyć 10 cyfr po miejsce po przecinku.
>> I zamierzam iść do przodu i ponownie skompilować to i ponownie płynie 1.
I rodzaj żalu po to przetestowane dalej, bo moja matematyka nie jest tak
skorygować już wydaje.
Ale zaraz, może to jest po prostu przypadkiem.
Być może komputer działa trochę dziwne.
Pozwólcie mi iść do przodu i robić 20 punktów po przecinku i upewnić się, że wiem,
jak zrobić matematykę.
Wiem, jak zaprogramować.
Marka pływaków 1, ponownie skompilować i cholery.
To jest bardzo, bardzo się daleko od znaku.
>> Więc co tu się dzieje?
Intuicyjnie, na podstawie naszych założeń wcześniej o wielkości typów danych,
co musi się dziać tutaj pod maską?
Tak?
Dokładnie.
Jeśli chcesz, to dużo precyzji i to kawał precyzji -
20 liczb po przecinku.
Nie można być może reprezentować dowolna ilość, chyba że masz
dowolna liczba bitów.
Ale my nie.
Dla pływaka, mamy tylko 32 bitów.
>> Tak więc, jeśli 32 bity mogą być przesuwane w sposób - tak jak naszych ludzi na, etap
ręce w górę lub w dół - w skończonej liczbie sposobów, nie tylko skończona liczba
liczb rzeczywistych można reprezentować z tych bitów.
I tak w końcu komputer będzie miał do
rozpocząć na skróty.
Komputer może ukryć te dane z nami na trochę czasu.
Ale jeśli zaczniemy szturchanie na liczby i szuka dalej i dalej na
końcowe cyfry w liczbie całkowitej, wtedy zaczynamy widzieć, że jest to
faktycznie zbliżenie Pomysł jednej dziesiątej.
>> I tak okazuje się, tragicznie, nie nieskończenie wiele liczb
nie możemy reprezentować właśnie w komputer, co najmniej o skończonej
liczba bitów, skończony ilość pamięci RAM.
Teraz niestety, czasami ma konsekwencje w świecie rzeczywistym.
Jeśli ludzie nie bardzo to doceniam lub rodzaj za pewnik fakt,
że ich komputer będzie po prostu robić to, co mówią to zrobić, i nie
rozumiem tych głównych szczegóły reprezentacyjne -
które, szczerze mówiąc, w niektórych językach są niewidocznymi dla użytkownika, w przeciwieństwie do C -
złe rzeczy mogą się zdarzyć.
>> I co ja myślałem, że my jest zrobić krok do tyłu.
I to jest o osiem minut video.
Jest emitowany kilka lat temu, i to daje wgląd w rzeczywistości, co może pójść
źle, gdy pod-doceniam to rodzaje informacji w bardzo nazbyt
prawdziwy świat.
Gdybyśmy mogli przyciemnić światła w ciągu kilku minut.
>> SPEAKER 1: Wracamy do inżynierii
katastrofy na Modern Marvels.
>> Komputery -
my wszyscy zaakceptowaliśmy często frustrujące problemy
że iść z nimi.
Robaki, wirusy i usterki oprogramowania to małe ceny do zapłaty za
convenience.
Ale w high-tech i high-speed wojskowych i program kosmiczny
aplikacje, najmniejszy problemowe można powiększać do katastrofy.
>> W dniu 4 czerwca 1996 roku naukowcy gotowi uruchomić bezzałogowy Ariane 5 rakiet.
To niósł satelitów naukowych zaprojektowany, aby dokładnie ustalić, jak
ziemskie pole magnetyczne oddziałuje z wiatrami słonecznymi.
Rakieta została zbudowana na europejski Agencja Kosmiczna i podniesiona z jego
Obiekt na wybrzeżu z Gujany Francuskiej.
>> JACK GANSSLE: Na około 37 sekund do lotu, po raz pierwszy zauważyłem,
coś się dzieje źle.
Dysze były skręcie w sposób, że naprawdę nie powinno.
Około 40 sekund do lotu, wyraźnie pojazd był w tarapatach.
I to jest, gdy się decyzja, aby je zniszczyć.
Ds. bezpieczeństwa zakres, z olbrzymie wnętrzności, nacisnął przycisk,
wysadzili rakiety, zanim mógł stanowić zagrożenie dla bezpieczeństwa publicznego.
>> SPEAKER 1: To był dziewiczy rejs z Ariane 5, oraz zniszczenia
odbyło się ze względu na wbudowany skazą w rakiety oprogramowania.
>> JACK GANSSLE: problem w Ariane było to, że liczba
że wymagane 64 bitów do wyrażenia.
I chcieli przekształcić w ilości 16-bitowym.
Zakładali, że liczba nigdy nie było będzie bardzo duża, że ​​większość
te cyfry w wersji 64-bitowej Numer były zera.
Byli w błędzie.
>> SPEAKER 1: niezdolność jednym programie Program do przyjęcia tego rodzaju
Numer generowany przez inny był u podstaw niepowodzenia.
Tworzenie oprogramowania stał się bardzo kosztowną częścią nowej technologii.
Ariane 4 rakiety były bardzo , więc w znacznej części oprogramowania
stworzony przez to również stosowany w Ariane 5.
>> PHILIP COYLE: Podstawowym problemem było że Ariane 5 był szybszy,
przyspieszyć szybciej.
I oprogramowanie nie miał stanowił, że.
>> SPEAKER 1: zniszczenie rakiety była ogromna katastrofa finansowa,
Wszystkie z powodu błędu oprogramowania minut.
Ale to nie był pierwszy raz dane Problemy konwersji był nękany nowoczesny
rocket technologii.
>> JACK GANSSLE: W 1991 roku, wraz z rozpoczęciem pierwszej wojny w Zatoce Perskiej, Patriot
Pocisk doświadczył podobnego rodzaju problemu konwersji liczb.
W wyniku tego, 28 amerykańskie żołnierze zabitych i ok. 100 rannych
kiedy Patriot, która miała w celu ochrony przed przychodzących kiełże,
nie udało się wystrzelić rakietę.
>> SPEAKER 1: Kiedy Irak najechał na Kuwejt, a Ameryka rozpoczęła w Pustynna Burza
na początku 1991 roku, baterie rakiet Patriot zostały wdrożone w celu ochrony Arabię ​​Saudyjską
i Izrael od irackiego Scud Ataki rakietowe.
Patriot jest US średniego zasięgu ziemia-powietrze systemowego firmy
Firma Raytheon.
>> THEODORE Postół: wielkość Patriot przechwytujących sam jest z grubsza
20-metrowy.
I waży około 2000 kilogramów.
I to przenosi głowicę około -
Myślę, że to około 150 funtów.
I sam jest głowica Wybuchowe, które ma
fragmenty wokół niego.
Obudowa głowicy ma działać jak śrut.
>> SPEAKER 1: Pociski są realizowane cztery za kontener i są transportowane
przez naczepą.
>> PHILIP COYLE: obrony przeciwrakietowej Patriot System wraca na
najmniej 20 lat.
Został zaprojektowany jako powietrze antyrakietowa
zestrzelić samoloty nieprzyjaciela.
W pierwszej wojny w Zatoce Perskiej, kiedy to wojna przyszedł, Army chciał go użyć
zestrzelić kiełże a nie samolotów.
Iracki lotnictwo nie było tak wielkim problemem.
Ale Army martwił kiełże.
I tak próbowali uaktualnić Patriot.
>> SPEAKER 1: Przechwytywanie się pocisk wroga podróżuje macha pięciu było
będzie wystarczająco trudne.
Ale kiedy Patriot został przewieziony do service, Army nie był świadomy
Iracka modyfikacja, że ​​się ich Kiełże prawie niemożliwe, aby uderzyć.
>> THEODORE Postół: Co się stało jest kiełże, które były
w najbliższych były niestabilne.
Byli chwieje.
Powodem tego było to Irakijczycy, w Aby uzyskać 600 km z
300-km-range missile, wziął waga z przodu głowicy.
Zrobili głowica lżejsze.
Więc teraz Patriot próbuje przyjść na Scud.
I przez większość czasu, przeważająca Większość czasu, to będzie po prostu
latać przez Scud.
>> SPEAKER 1: Gdy system Patriot Operatorzy zrealizowane Patriot brakowało
jej cel, oni zdetonowali Patriotów głowica, aby uniknąć możliwości
ofiar, czy to było dozwolone opadać na ziemię.
>> THEODORE Postół: To, co najbardziej ludzie widzieli, jak wielkie kule ognia na niebie
i źle jak przechwytuje z głowicami Scud.
>> SPEAKER 1: Chociaż w nocnym niebie Patriots okazał się sukcesem
niszcząc kiełże, w Dhahran tam może być żadnej pomyłki o jego
wydajność.
Nie, system Patriot radar stracił śledzenie przychodzących Scud i nigdy nie
uruchomił to usterka oprogramowania.
>> Było Izraelczycy, którzy po raz pierwszy odkryta że już system
było w tym większa różnica czasu się ze względu na zegarze
zawarte w systemie komputera.
>> JACK GANSSLE: Jakieś dwa tygodnie przed Tragedia w Dhahran, Izraelczycy
zgłoszone do Departamentu Obrony że system został straty czasu.
Po około ośmiu godzinach pracy, zauważyli, że system jest
staje się zauważalnie mniej dokładne.
Departament Obrony odpowiedział mówienie wszystkich baterii Patriot
aby nie pozostawić systemów od dłuższego czasu.
Nigdy nie powiedział, co dawno było.
Osiem godzin?
10 godzin?
1000 godzin?
Nikt nie wiedział.
>> SPEAKER 1: bateria Patriot stacjonuje w koszarach w Dhahran
i jego wady wewnętrzny zegar był na ponad 100 godzin w nocy
25 lutego.
>> JACK GANSSLE: To czas, aby śledzić dokładność około jednej dziesiątej sekundy.
Teraz, dziesiątą sekundy ciekawy numer, ponieważ nie może być
wyrażona w binarnym dokładnie, co oznacza, nie może być dokładnie wyrażony w
każdy nowoczesny komputer cyfrowy.
Trudno w to uwierzyć, ale wykorzystać to jako przykład.
Weźmy pod numer jedną trzecią.
Jedna trzecia nie może być wyrażona dziesiętnie dokładnie.
Jedna trzecia jest 0,333 dzieje on do nieskończoności.
Nie ma sposobu, aby to zrobić z absolutna dokładność po przecinku.
To jest dokładnie ten sam rodzaj problemu , które stało się w Patriot.
Już system ran, Najgorszy błąd czasu stał.
>> SPEAKER 1: Po 100 godzinach pracy, Błąd w czasie tylko
około jednej trzeciej sekundy.
Ale jeśli chodzi o kierowanie pocisk podróżuje macha pięciu, to powodowało
tracking error ponad 600 metrów.
Byłby to błąd krytyczny żołnierze w Dhahran.
>> THEODORE Postół: Co się stało Scud launch została wykryta wcześnie
satelity ostrzegawcze.
I wiedzieli, że Scud nadchodzi w ich ogólnym kierunku.
Nie wiem, gdzie to nastąpi.
>> SPEAKER 1: To teraz do radaru Składnik systemu Patriot
broniąc Dhahran znaleźć i utrzymać utwór z nadchodzącej pocisków wroga.
>> JACK GANSSLE: radar był bardzo inteligentny.
To rzeczywiście śledzić pozycję Scud i przewidzieć, gdzie to
prawdopodobnie będzie następnym razem radar wysłany impuls out.
To był nazywany bramą zakres.
>> THEODORE Postół: Wtedy po raz Patriot decyduje tyle czasu minęło, aby przejść
kopię i sprawdzić następny lokalizację Wykryty obiekt, to wraca.
Więc kiedy to wrócił do porządku miejsce, to potem nie widzi obiekt.
I to decyduje, że nie ma obiektu, to było fałszywe wykrywanie i
spada z toru.
>> SPEAKER 1: incoming Scud zniknął z ekranu radaru, a
sekundy później zatrzasnęła do koszar.
Scud zabił 28 i był ostatni zwolniony w trakcie pierwszej wojny w Zatoce.
Niestety, aktualizacja oprogramowania przybył w Dhahran następnego dnia.
Wada oprogramowania została ustalona, zamykając jeden rozdział w niespokojnych
Historia rakiet Patriot.
>> Patriot jest właściwie skrótem stopniowej Tracking Array
Intercept docelowych.
>> DAVID J MALAN: Dobrze, więc wytrzeźwienia przykład, aby się upewnić.
I na szczęście, to niższy poziom błędy nie są czymś, co my będziemy
zazwyczaj trzeba docenić, z pewnością nie z niektórych naszych
Najwcześniej programów.
Przeciwnie, większość błędów, które będziesz Spotkanie będzie logiczny charakter,
składniowe w naturze, zgodnie z którą Kod po prostu nie działa dobrze.
I wiesz, że to dość szybko.
>> Ale szczególnie gdy mamy do Koniec semestru, to będzie
staje się coraz bardziej z możliwością naprawdę trudno myśleć o budowie
z programów i podstawowych reprezentacja
Tam też danych.
Na przykład dowiemy się z MySQL, który jest popularny silnik bazy danych
że można używać z witryn do przechowywania danych na końcu tylnym.
I będziesz musiał zacząć decydować o Koniec semestru, nie tylko to, co
typy danych w tym kierunku, aby skorzystać z ale dokładnie to, ile bitów w użyciu,
czy chcesz zapisać daty jako daty i godziny, jak zawsze, a także
takie rzeczy jak duży chcesz unikalne identyfikatory, aby być, powiedzmy, użytkownicy
w bazie danych.
>> W rzeczywistości, jeśli niektórzy z was miał Facebook stanowi od dłuższego czasu,
i wiesz, jak uzyskać dostęp do identyfikatora użytkownika -
który czasami pojawia się w twoim URL profilu, o ile nie zostaną wybrane
nick do adresu URL, lub jeśli masz Używane Facebooka Graph API,
publicznie dostępne API przez które może poprosić Facebook dla danych surowych -
można zobaczyć, co numeryczny ID jest.
A kilka lat temu, Facebook zasadniczo musiał zmienić z pomocą
odpowiednik liczb całkowitych z użyciem długo długo, bo w czasie jak użytkownicy się
i iść i tworzyć wiele kont i fałszywe konta, nawet oni bardzo łatwo
byli w stanie wyczerpać coś jak 4 mld możliwa wartość jak int.
>> Tak bardziej na tych rodzajach spraw w dół ulicy, jak również.
Dobrze, żeby rzucał.
To był brak precyzji.
Kilka szybkich ogłoszeń.
Więc działy formalnie rozpocząć w najbliższy Niedziela, poniedziałek, wtorek.
Usłyszysz poprzez e-mail w tym tygodniu jak do przypisania.
I będziesz także tutaj w tym momencie, jak zmienić punkt, jeśli Twój
Plan się zmieniło lub twój poziom komfortu bardzo się zmieniła.
Tymczasem P-set jeden i jeden to hacker spowodowane ten czwartek z opcją do
przedłużyć ten termin za Specyfikacje do piątku
w sposób typowy.
>> Uświadom sobie, że zawarte z problemem specyfikacje określone są instrukcje dotyczące
jak korzystać z CS50 urządzenia należy, jak również niektóre CS50 konkretne narzędzia
jak stylu 50, który może dostarczyć z dynamicznie razie na
jakość swojego stylu kodu, a także sprawdzić 50, który może zapewnić Ci
dynamiczny feedback jak do swojej CODE za prawidłowość.
Wybacz, że jesteśmy nadal do prasowania z kilku załamań z kontroli 50.
Kilku kolegów z klasy, którzy nie zaczynają około cztery AM w piątek wieczorem, gdy
spec wzrosła od tego czasu zauważyliśmy kilka błędów, które pracują
dzięki i przepraszam za każdego, kto doświadczył niepotrzebnych frustracji.
Wina jest moja.
Ale będziemy śledzić na CS50 dyskutować, kiedy to został rozwiązany.
>> Więc słowo na ocenę siebie.
Więc to będzie tydzień lub dwa przed tobą zacząć, aby uzyskać opinię na temat zestawów problemowych
dlatego, że nie mają jeszcze fellow nauczania.
I nawet wtedy, zaczniemy oceniać Problem C ustawia przed my
wrócić i ocenić tak na zarysowania że masz bardziej istotne
Reakcje szybciej.
Ale w ogóle za program nauczania, CS50 zestawy zadań są oceniane razem
po cztery osie -
zakres, poprawność, design i styl.
>> Zakres będzie numer zazwyczaj od zera do pięciu, że
rejestruje, ile kawałek, który odgryzł.
Zazwyczaj, żeby to było pięć.
Ty przynajmniej próbowałem wszystkiego.
I zauważyć, że jest to czynnik mnożenia tak, że robi tylko część
set problem nie najlepszą strategią jest.
>> Tymczasem bardziej oczywiste jest Znaczenie poprawności -
właśnie jest program poprawne z przestrzegać specyfikacji?
To jest ważony celowo więcej stopniu niż pozostałe dwie osie, według
trzykrotnie, ponieważ zdajemy sobie sprawę, że zwykle masz zamiar spędzić
dużo więcej czasu ścigających kilka błędów, się kod do pracy, a następnie
są wcięcia i wybranie odpowiednie nazwy zmiennych i
itp., które jest na drugim końcu spektrum stylu.
>> To nie znaczy, że nie jest w stylu ważne i będziemy głosić ją na
czas zarówno w wykładach oraz w sekcjach.
Styl nawiązuje do estetyki o kodzie.
Czy wybrałeś oraz wymienieni zmienne , które są krótkie, ale nieco
opisowe?
Czy Twój kod wcięty jak widziałem w wykład oraz w sposób zgodny
w stylu 50?
>> Wreszcie jest projekt prawa tam w środku.
Design jest trudniejsze jeden umieścić palec na, ponieważ jest o wiele bardziej
subiektywna.
Ale to jest chyba najważniejsze trzy osie w zakresie pedagogicznym
wartości w czasie oraz, że będzie to Facet nauczycielskiej możliwość
dostarczy Ci jakościowej opinii.
Rzeczywiście w CS50 choć mamy te wzory i wyniki, na koniec
na dzień to bardzo świadomie Wiadra - bardzo małe wartości punktowe
od zera do trzech i zero, a pięć.
My nie staramy się wyciągnąć bardzo grube linie pomiędzy zestawami problemowych lub między
studentów, ale raczej skupić się jak możemy na jakościowych, rękopis
feedback, albo wpisane lub ustne z Twój szczególności fellow nauczania,
będzie można poznać dość dobrze.
>> Ale na ogół, są to ciężary że poszczególne osie mają.
Tymczasem zbyt, to warto mieć na myśl, że nie należy zakładać, że
trzy z pięciu jest 60%, a więc mniej więcej w przypadku braku.
Trzy celowo miało być rodzaj środku drogi dobre.
Jeśli otrzymujesz trójek w początku semestru, to
rzeczywiście ma być dobry miejscem, aby rozpocząć.
Jeśli otrzymujesz Dwójki, targi, tam na pewno trochę pracy, aby zapłacić trochę
więcej uwagi, aby skorzystać sekcji i godzin urzędowania.
>> Jeśli otrzymujesz czwórki i piątki, to świetnie.
Ale tak naprawdę, mamy nadzieję, że trajektorie wśród studentów - bardzo
indywidualnie dla każdego ucznia, ale wychodząc semestr tutaj w rodzaju
dwa do trzech zakresie, ale kończy tutaj w 4:56 zakresie.
To, co tak naprawdę szuka.
A my nie pamiętać, że delta Ci wykazują między zero tygodni i tydzień
12, gdy robię stopnie.
To nie ma znaczenia dla nas absolutnie, jak Ci fair na początku, jeśli Państwa
Trajektoria jest rzeczywiście w górę i silny.
>> Academic uczciwość - więc pozwól mi położyć się na moim bardziej poważny głos na chwilę.
Więc ten kurs ma rozróżnienie wysyłanie więcej studentów niż inne
w historii na planszy reklamowej, wierzę.
Mamy coś w rodzaju utraty liczyć na to punkt, jak często to się zdarza.
I to nie dlatego, że uczniowie w 50 to nic więcej niż ich nieuczciwy
koledzy gdzie indziej.
Ale sobie sprawę, też, że są bardzo dobre w wykrywaniu tego rodzaju rzeczy.
>> I to tę zaletę, że klasy informatyk w które
może i mamy porównanie wszystkich studentów Problem ustawia parami przed każdym
Inne, nie tylko w tym roku ale wszystkie poprzednie lata.
Mamy możliwość, podobnie jak uczniów w Klasa, Google i znaleźć kod
na stronach takich jak github i forach dyskusyjnych.
Nie ma absolutnie rozwiązania CS50-tych p-ustawia krąży tam.
Ale jeśli można je znaleźć, możemy ich znaleźć.
A wszystko to jest bardzo zautomatyzowany i łatwy i smutne dla nas, aby znaleźć.
>> Ale chcę podkreślić też, że Polityka akademicki Kursu jest uczciwość
Bardzo ma być bardzo Przeciwieństwem tego ducha.
Rzeczywiście, w tym roku mamy rephrased rzeczy w programie nauczania jest to, kropka
dot dot, bardziej szczegółowo w programie szkolenia.
Jednak nadrzędnym tematem w trakcie naprawdę jest się zasadne.
Zdajemy sobie sprawę, że istnieje znacząca Kwota pedagogiczne
Wartość współpracą, do pewnego stopnia, z kolegami z klasy, w której można
dwa albo trzy, albo więcej są stojąc przy tablicy
Whiteboarding, tak aby mówią, swoje pomysły -
wypisywanie Pseudokod na zdjęciach, diagramów, co powinno być, czy Mario
miałeś pisać to pierwsze w Pseudokod.
Co należy chciwy algorytm -
jak należy zachowywać się na Problem ustawia jeden?
>> I tak sobie sprawę, że zachowanie że zachęcamy jest bardzo
dużo w tym kierunku.
A w programie szkolenia, zobaczysz cała masa kul pod
rozsądne kategorii i nie uzasadnione kategoria, która pomaga nam pomóc
Ci owinąć swój umysł wokół których robimy zwrócić tę linię.
A w ogóle, przyzwoita zasada jest to, że jeśli jesteś stara się rozwiązać
jakiś błąd i twój przyjaciel lub kolega siedzi obok ciebie, to jest
uzasadnione, aby pokazać mu, lub jej Twój kod i powiedzieć, hej, możesz pomóc
mnie dowiedzieć się, co się dzieje nie tak tutaj?
>> Zazwyczaj nie objąć po przeciwnej stronie.
To nie jest poprawna odpowiedź dla swojego jest przyjaciel lub kolega tutaj, aby powiedzieć, oh,
wystarczy spojrzeć na kopalni i rysunek to się z tego.
To jest coś w rodzaju nieuzasadnione.
Ale o kogoś innego, inny mózg, inna para oczu patrzeć na
ekran lub spojrzenie na kodzie i powiedzieć, czy na pewno chcesz
mieć pętlę o?
Czy jesteś pewien, że chcesz że średnik tutaj?
Albo oh, że komunikat o błędzie oznacza to.
To są bardzo rozsądne i zachęcani zachowania.
>> Przypadki, w których ja nawiązywać do wcześniej sprowadzają się do tego, kiedy uczniowie są
późno w nocy co ubogich wyroku decyzje i poczty elektronicznej ich kodu
ktoś inny lub po prostu mówiąc, tutaj, to w Dropbox lub
Googling późno w nocy.
A więc zachęcam i błagam was, jeśli nie ma tych, nieuniknione
momenty stresu, jesteś lada przed upływem terminu, nie masz późno
dzień, ponieważ jest to, że już w piątek o punkt, napisz do kursu za głowy lub
się bezpośrednio.
Powiedzieć, słuchaj, jestem w moim Podaje punkt tutaj.
Miejmy rozmowę i rysunek.
Odwołanie się do sieci lub jakieś inne nie rozsądne zachowanie nie jest
rozwiązaniem, a zbyt wiele swoich koledzy nie są już tutaj, na
campus powodu tej złej wyroku.
Ale to jest bardzo łatwe do spódnicy tej linii.
>> I tu jest mały obraz dopingować można się z Reddit tak, że teraz
wszystko będzie OK.
>> Tak szybkim podsumowaniem, a następnie, z którym skończyliśmy.
Tak więc w zeszłym tygodniu, przypomnieć, że wprowadzimy warunki, nie w Scratch
ale w C tym razem.
I była jakaś nowa składnia, ale naprawdę nie ma nowych pomysłów per se.
Mieliśmy wyrażeń logicznych, że mogliśmy lub razem z dwóch pionowych
barów lub i wraz z dwoma Ampersands, mówiąc, że zarówno w lewo
i prawa muszą być prawdziwe aby to wykonać.
Potem mieliśmy przełączniki, które patrzyliśmy na krótko, ale proponuję, są naprawdę
po prostu inna składnia do osiągnięcia sam rodzaj bramki, jeśli wiesz, w
góry określić swoje sprawy będą.
>> Patrzyliśmy na pętli.
Dla pętli jest może najczęściej, lub co najmniej jeden, że ludzie
zwykle sięgnąć instynktownie.
Mimo, że wygląda trochę tajemnicze, zobaczysz wiele, wiele przykładów tego
Wkrótce, jak masz już pod koniec ubiegłego tygodnia.
Choć pętle może podobnie osiągnąć to samo.
Ale jeśli chcesz robić żadnych inkrementacji lub aktualizacji
zmiennej wartości, trzeba zrobić to ręcznie, niż więcej
do pętli przed pozwala.
A jeszcze do-while, który pozwala nam robić coś na
najmniej raz gdy coś inne jest prawdą.
A to jest szczególnie dobre dla programów lub do gier, gdzie chcesz
monitować użytkownika za coś co najmniej jeden raz.
A potem, jeśli on lub ona nie współpracuje możesz to zrobić
znowu i znowu.
>> Przy zmiennych tymczasem mieliśmy linii kodu, takich jak to, co może
się dwie linie.
Można zadeklarować nazwie int licznik, średnik.
Albo może po prostu zadeklarować i zdefiniować ją, że tak powiem.
Nadać jej wartość w tym samym czasie.
>> I wtedy wreszcie, rozmawialiśmy o funkcji.
I to był dobry przykład w poczucie, że to ilustruje
dwa typy funkcji.
Jednym z nich jest GetString (), która, ponownie, Pobiera ciąg od użytkownika.
Ale GetString () jest rodzaju ciekawe, o ile używaliśmy go,
bo my zawsze stosować go coś na lewej stronie
znak równości.
To znaczy, że getString () zwraca wartość.
Zwraca oczywiście ciąg.
A potem na lewej stronie, jesteśmy po prostu zapisywanie ten ciąg wewnątrz
zmienna o nazwie nazwa.
>> Jest to inaczej, w pewnym sensie, od printf bo printf, przynajmniej w naszym
Wykorzystanie tutaj, nie zwraca nic.
Tak na marginesie, to coś robi powrotnej.
Po prostu nie obchodzi mnie, co to jest.
Ale to nie ma co zwany efekt uboczny.
A co to jest efekt uboczny w każdy Sprawa widzieliśmy do tej pory?
Co printf zrobić?
Wypisuje coś na ekranie, Wyświetlacze tekstu lub numerów, czy coś
na ekranie.
A to tylko za efekt uboczny bo to naprawdę nie jest przekazanie
go do mnie.
To nie jest odpowiedź wewnątrz czarna skrzynka, że ​​mogę to
dotrzeć do i chwycić.
To się po prostu robi to na własną rękę, dużo jak Colton był podłączony do tego
czarna skrzynka w zeszłym tygodniu, a on w jakiś sposób magicznie rysował na tablicy
beze mnie faktycznie zaangażowany.
To byłoby efektem ubocznym.
Ale jeśli rzeczywiście miał dotrzeć z powrotem w tutaj i powiedzieć, oh, tutaj jest ciąg
od użytkownika, które mogłyby być zwracana wartość.
>> I do tej pory mamy tylko używane funkcje że inni ludzie pisali.
Ale rzeczywiście możemy zrobić te Różne rzeczy sami.
Więc mam zamiar iść do CS50 urządzenie ponownie.
Pozwól mi zamknąć kartę, że nie otwierać przed chwilą.
I pozwól mi iść do przodu i utwórz nowy plik.
I zamierzam iść do przodu i Nazywamy to jeden positive.c.
Tak, chcę zrobić coś z dodatnie tutaj.
Więc mam zamiar iść do przodu i robić int -
Przepraszam -
# Include.
Nie róbmy tego samego błąd jak wcześniej.
Int main (void), open kręcone nawiasów, zamknięty nawias kręcone.
>> A teraz chcę, aby wykonać następujące czynności.
Chcę napisać program, który podkreśla, że ​​użytkownik podaje
mnie dodatnia.
Więc nie ma GetPositiveInt funkcja w CS50 biblioteki.
Jest tylko getInt ().
Ale to jest OK, bo mam konstrukcje, z którymi można nakładać
trochę więcej ograniczeniem tej wartości.
Mógłby zrobić coś takiego.
>> Więc int n -
a jeśli piszesz dalej, po prostu sobie sprawę, Mam zamiar wrócić i
zmienić niektóre rzeczy w chwili -
tak int n równa getInt ().
I to się dzieje, aby umieścić int wewnątrz n.
I pozwól mi być bardziej opisowe.
Pozwól mi powiedzieć coś w stylu, że żądam dasz mi dodatnia.
>> Dobrze.
Więc tylko trochę instrukcji.
A teraz, co mogę zrobić?
Cóż, ja już wiem od mój prosty warunki lub oddziały, tak jak ja
miał na początku, mógłbym powiedzieć coś Jeśli jak N jest mniejsza lub równa
zero, to chcę coś zrobić itp., które nie jest korzystny.
I wtedy mogłem zrobić -
OK, ale naprawdę chcę aby ta int.
Więc mogę iść tu i mogłem rodzaju kopii tego i tiret tego.
A potem, OK.
Tak więc, jeśli n jest mniejsza lub równe zeru to zrobić.
>> Teraz, co oznacza, że ​​użytkownik nie współpracuje?
No, to mam zamiar pożyczyć to tutaj.
A potem idę tutaj i tu i tu.
Więc nie jest to wyraźnie rozwiązanie, prawda?
Bo nie ma końca.
Jeśli chcę, aby domagać się od użytkownika daje mnie dodatnia, mogę
rzeczywiście dostać int.
Mogę to sprawdzić w tym wew.
Ale chcę, aby to sprawdzić jeszcze raz i sprawdzić go ponownie i sprawdź ponownie.
Tak oczywiście, co jest lepsze konstruować, aby używać tutaj?
W porządku, więc jakiś pętli.
>> Więc mam zamiar pozbyć prawie wszystko.
I chcę, aby to int co najmniej raz.
Więc mam zamiar powiedzieć, zrobić -
i wrócę do a za chwilę -
teraz, czy co?
Mam zamiar zrobić int n dostaje getInt ().
OK.
Więc to jest bardzo dobre.
A teraz, jak często Chcę, aby to zrobić?
>> Powiem printf wewnątrz pętli więc mogę żądać znowu i znowu,
jeśli zajdzie taka potrzeba.
I co ja chcę tego natomiast stan zrobić?
Chcę zachować ten sposób a co to ma?
Tak.
N jest mniejsza lub równa zeru.
Więc już mamy znacznie czyścić ten kod up.
Mamy pożyczył bardzo prosta budowę - do-while.
I ukradli tylko ważne linie kodu, który zacząłem kopiowanie i
wklejanie, co nie było mądre.
I tak teraz mam zamiar rzeczywiście wklej to tutaj i po prostu to zrobić raz.
>> A teraz to, co chcę robić w bardzo koniec tego programu?
Powiem tylko coś prostego jak, dzięki za - i
Zrobię% i do int -
backslash n, przecinek, a następnie wtyczka w n, średnik.
>> Dobrze.
Zobaczmy więc, co się dzieje teraz kiedy uruchomić ten program.
Mam zamiar iść do przodu i robią pozytywne.
Cholera.
Kilka błędów.
Więc pozwól mi przejść z powrotem do pierwszego.
Nie działa poprzez nich do tyłu.
Praca przez nich z góry na dół bo oni i tylko kaskady
jedna rzecz się mylić.
Niejawna deklaracja getInt function ().
Tak.
Więc to nie wystarczyło.
I niby popełnili ten sam błąd, ale trochę inaczej tym razem.
Muszę to nie tylko stdio.h ale również cs50.h, który obejmuje
tak zwane deklaracje uzyskać int, który uczyć urządzenia, lub uczy
C, co getInt () jest.
>> Więc pozwól mi ponownie zapisać.
Mam zamiar ignorować inne błędy bo mam zamiar nadzieję, że są one
w jakiś sposób związana z błędem I już ustalone.
Więc pozwól mi iść do przodu i ponownie skompilować z pozytywnego, Enter.
Cholera.
Trzy błędy, ciągle.
Pozwól mi przejść do pierwszego.
Niewykorzystane zmienne n.
Nie widziałem tego wcześniej.
I to też jest trochę tajemnicze.
To wyjście kompilatora.
I co, że podświetlona linia tam - positive.c :9:13 -
mówi, to mówi w wierszu dziewiątym positive.c, na 13 postaci,
13 kolumny, to popełnił ten błąd.
>> A w szczególności, to mówi mnie niewykorzystana zmienna n.
Zobaczmy więc -
linia dziewięć.
Używam n w tym sensie, że Daję mu wartość.
Ale to, co kompilator nie podoba to że nie jestem pozornie go używać.
Ale chwileczkę, używam go.
W linii 11, używam go tutaj.
Ale jeśli przewijać dalej w positive.c :11 -
więc w linii 11, znak 12, kompilator mi mówi, wykorzystanie
nielegalnej identyfikator n.
>> Więc oznacza mam niezarejestrowanej nie określono go jako
zmienna o typie danych.
Ale chwileczkę.
Zrobiłem dokładnie to, że w linii dziewięciu.
Więc ktoś jest naprawdę mylić tutaj.
To albo ja, albo kompilator, ponieważ zgodnie dziewięciu znowu jestem deklarując
int n, i jestem przypisując mu zwrotu wartości getInt ().
Następnie używam tej zmiennej n w wierszu 11 oraz sprawdzenie, czy jego wartość jest mniejsza
lub równa zeru.
Ale to podobno jest zły i zepsuty, dlaczego?
Powiedz to jeszcze raz?
>> Ach, muszę oświadczyć, n przed wejściem do pętli.
Ale dlaczego?
To znaczy, że po prostu zaproponował nieco temu, że dobrze jest deklarować zmienne
wszystko na jednej linii, a następnie przypisać im jakąś wartość.
Zmienna globalna - wróćmy do tego pomysłu w chwilę.
Dlaczego chcesz mi postawić to poza pętli?
Jest.
Dokładnie.
>> Tak więc, choć, nieco sprzeczne z intuicją, pozwól mi podsumować.
Kiedy deklarujesz n wewnątrz z zasłaniać tam -
specjalnie wewnątrz te nawiasy klamrowe -
że zmienna n ma co zwany zakres -
niezwiązane z naszego systemu punktacji w Kurs - ale ma zakres, który jest
ograniczone do tych klamrach.
Innymi słowy, zwykle jeśli zadeklarować Zmienna wewnątrz zestawu
nawiasy klamrowe, że zmienna istnieje tylko wewnątrz tych klamrach.
Tak więc według tej logiki sam, chociaż Mam oświadczył n zgodnie dziewięciu, to
w zasadzie znika z zakresu, znika z pamięci, że tak powiem,
przez czas I hit linii 11.
Ponieważ linia 11, niestety, jest poza tymi klamrami.
>> Więc niestety nie może naprawić tego przez wracając do tego, co robiłem wcześniej.
Możecie na początku tego zrobić.
Ale co ty nie teraz robi się cyklicznie?
Nie jesteś oczywiście coraz int cyklicznie.
Tak więc możemy opuścić getInt (), a my powinien opuścić getInt () wewnątrz
pętla, ponieważ to, co chcemy męczyć użytkownika o nowo.
Ale to nie wystarcza, aby przejść do linii, powiedzmy, sześć.
Int n, średnik.
Nie dać mu jeszcze, ponieważ wartość nie musisz się jeszcze.
>> Ale teraz tu, uwaga - to byłoby bardzo łatwe błąd.
Nie chcę, aby cień mój poprzedni Deklaracja nr.
Chcę użyć n, że faktycznie istnieje.
I tak teraz w linii 10, Przypisać n wartości.
Ale w linii sześciu oświadczam, n.
A więc mogę lub nie mogę używać go w linii 12 teraz?
I może dlatego, między którymi kręcone szelki jest n oświadczył teraz?
Jeden tutaj na linii pięciu.
To jeden tutaj na linii 14.
Więc jeśli teraz pomniejszyć, zapisać ten plik, przejdź z powrotem do i uruchom make pozytywne, to
skompilowany ten czas.
Więc to już postęp.
Slash. . / Pozytywne, Enter.
>> Żądam, że możesz dać mi dodatnia.
Negative 1.
Negative 2.
Negative 3.
Zero.
One.
I dzięki za to, jest co teraz drukowane.
>> Pozwól mi spróbować czegoś innego, z ciekawości.
Jestem powiedziano nam, aby wprowadzić liczbę całkowitą.
Ale co, jeśli zamiast wpisać baranka?
Więc teraz zobaczyć różne polecenia -
ponowić próbę.
Ale nigdzie w kodzie nie piszę ponownie.
Więc gdzie, prawdopodobnie, jest to ponownie zapyta pochodzi, można by powiedzieć?
Tak, od getInt () sama.
Tak więc jedną z rzeczy, personel CS50 za robi dla Ciebie, przynajmniej w tych pierwszych kilku
tydzień, jest pisaliśmy pewną ilość błędu kontroli w celu zapewnienia, że ​​jeśli
nazywasz getInt (), to będzie co najmniej wrócić int od użytkownika.
Nie dostaniesz ciąg.
Nie dostaniesz char.
Nie dostaniesz coś zupełnie innym.
Dostaniesz int.
>> Teraz nie może być dodatni.
Nie mogą być ujemne.
Nie dajemy żadnych gwarancji wokół tego.
Ale będziemy męczyć użytkownika, aby ponowić próbę, spróbuj, spróbuj do czasu, gdy w rzeczywistości
współpracuje.
Podobnie, jeśli zrobić 1,23, że nie int jest.
Ale jeśli wpisze się w, powiedzmy, 50, które Daje mi to wartość, która chciałem.
>> Dobrze.
Więc nie jest źle.
Wszelkie pytania na temat tego, co właśnie zrobiłeś?
Kluczem wynos jest, aby nie być jasne, tyle pętli, które widzieliśmy
przed choć tak naprawdę nie mamy używane, ale kwestia zakresu, w którym
zmienne mogą być mogą być stosowane w ciągu jakiegoś określonego zakresu.
>> Dobra, daj mi adres sugestię wprowadzone wcześniej, że z
zmienna globalna.
Tak na marginesie, to okazuje się, że inny Rozwiązanie tego problemu, ale
zazwyczaj błędne rozwiązanie lub źle zaprojektowane rozwiązanie jest
zadeklarować zmienną jako co nazywa zmienna globalna.
Teraz jestem trochę naruszono moją definicję zakresu, ponieważ istnieje
nie nawiasy klamrowe na górze i na samym dole pliku.
Ale implikacja, że jest to, że teraz w linii czterech,
n jest zmienną globalną.
I jak sama nazwa wskazuje, jest to tylko dostępne wszędzie.
>> Scratch faktycznie ma te.
Jeśli użyto zmiennej, można przypomnieć, trzeba było wybrać, czy to na
to sprite lub wszystkich duszków.
Cóż, wszystkie duchy to tylko jaśniejsze sposób mówienia globalnym.
Tak?
Ach, bardzo dobre pytanie.
>> Tak więc przypomnieć, że w pierwszej wersji mojego kodu, kiedy nieprawidłowo
zadeklarowane i zdefiniowane n zgodne dziewięć -
I oświadczył to jako zmienna i dałem mu wartość z
operator przypisania -
to dało mi dwa błędy.
Jeden, że n nie jest używana, a dwa, że ​​w linii 11
to po prostu nie został uznany.
Więc pierwszy ja nie adres w czasie.
To nie jest ściśle error zadeklarować zmienna, ale nie używać go.
Ale jedną z rzeczy, które robiliśmy w CS50 urządzenie, celowo,
pedagogicznie, to mamy odpalił Oczekiwania kompilatora, aby
upewnić się, że robisz rzeczy, a nie tylko poprawnie, ale bardzo poprawnie.
>> Bo jeśli zadeklarowanie zmiennej jak n i nie używając go, lub wykorzystanie
poprawnie, a następnie co jest on tam robi?
To naprawdę nie ma sensu.
I to jest bardzo łatwe w czasie, jeśli nie konfiguracji własnego komputera w
w ten sposób, aby po prostu kod, który ma małe szczątki tutaj, resztki tam.
A potem miesiąc później spojrzeć wstecz i jesteś jak, dlaczego jest to linia
Kod nie?
A jeśli nie ma dobrego powodu, że nie korzystać ci lub swoich kolegów
w dół drogi, musiał potykam się nim wtedy.
>> Tak na marginesie, gdzie jest że pochodzi z?
Cóż, pamiętam, że za każdym razem, skompilować Program, wszystkie z tych rzeczy jest
są drukowane.
Więc wracamy do tego.
Ale znowu, uczynić to narzędzie, które automatyzuje proces kompilacji przez
działa rzeczywisty kompilator nazywa dzyń.
To coś, to w końcu zobaczyć, ma zrobić z debugowania w specjalny
Program nazywa debuggera.
Wiąże się to z optymalizacją Kod - więcej o tym w przyszłości.
Std = c99 -
oznacza to po prostu użyć wersji z 1999 roku C. C było wokół, nawet dłużej niż
, ale oni zrobili jakieś fajne Zmiany 10 plus lat temu.
>> A oto te właściwe.
Mówimy uczynić niczego, co uprzednio byłby ostrzegawczy
error zapobiegania studenta z kompilacji.
A środki ścienne zrobić dla cała masa rzeczy, nie
tak podobne do zmiennych.
I pozwól mi przejść do Koniec tego wiersza.
I to też w końcu dowiemy wrócić.
Jest to oczywiście nazwa Plik Jestem kompilacji.
To przypomina nazwę pliku Jestem wyprowadzanie jako nazwa
mojego runnable programu.
Ten-lcs50 tylko oznacza używać CS50 biblioteka, a wszelkie zer i jedynek, że
staff napisał i zebrane wcześniej w tym roku, integracji
ich do mojego programu.
>> A ktoś wie co-lm jest?
To jest biblioteka matematyczna, która jest tylko tam, nawet jeśli jesteś
nie robi żadnej matematyki.
To jest po prostu automatycznie, pod warunkiem, nam zrobić.
>> Cóż, pozwól mi zrobić jeszcze jeden przykład tu otwarcie nowego pliku.
I niech mi uratować ten jeden jako string.c.
Okazuje się, że gdy mówimy o danych Typy dzisiaj, jest jeszcze bardziej
dzieje się pod maską niż widzieliśmy do tej pory.
Więc pozwól mi szybko zrobić szybki program.
Dołącz stdio.h.
A ja z tym że.
I wiesz, nie pozwól mi zrobić sam błąd ponownie.
Dołącz cs50.h.
I pozwól mi iść do przodu teraz i zrobić int main (void).
>> A teraz po prostu chcę zrobić program że robi to - stwierdzenie ciąg
nazywane s, a otrzymasz ciąg od użytkownika.
I pozwól mi zrobić trochę instrukcje tutaj -
proszę dać mi łańcuch - tak Użytkownik wie, co robić.
A potem tu poniżej tego, Chcę, aby wykonać następujące czynności -
dla int i ma zero.
Ponownie, informatycy zazwyczaj rozpocząć odliczanie do zera, ale może
sprawiają, że jeden, jeśli naprawdę chcemy.
Teraz mam zamiar zrobić, i jest mniej niż długość łańcucha S.
Więc strlen -
S-T-R-L-E-N -
ponownie, to zwięzłe, ponieważ jest to łatwiejsze pisać, nawet jeśli jest to
trochę tajemnicze.
>> To jest funkcja, że ​​nie używałem wcześniej, ale dosłownie to robi -
wróć do mnie pod numer, który reprezentuje Długość łańcucha
że użytkownik wpisał.
Jeśli wpisane hello, że powróci pięć, ponieważ jest pięć
Litery w Halo.
Następnie, w każdej iteracji ta pętla, i Plus Plus.
Więc jeszcze raz, nawet jeśli standardowe budowy nie jesteś dość zbyt wygodne lub
zaznajomieni z nim jeszcze.
>> Ale teraz w każdej iteracji tej pętli, zauważyć, co mam zamiar zrobić.
Chcę iść do przodu i drukuj z pojedynczego znaku -
tak% c backslash n na nowej linii.
I wtedy, wiesz, co chcę zrobić?
Cokolwiek słowo że użytkownik wpisze w, jak cześć, Chcę wydrukować
H-E-L-L-O jeden znak w wierszu.
Innymi słowy, chcę, aby na Poszczególne znaki w ciągu znaków,
przy czym do tej pory ciąg ma tylko był ciąg znaków.
>> I okazuje się, mogę zrobić s, wspornikach i, nawiasu, zamknij
nawias, średnik.
I mam zrobić jeszcze jedną rzecz.
To jest w pliku o nazwie string.h że strlen jest zadeklarowana.
Więc jeśli chcę używać tej funkcji, I trzeba powiedzieć, że kompilator,
spodziewać się go używać.
Teraz pozwól mi iść do przodu i robić Program nazywa się ciągiem.
Dot, slash, string.
>> Proszę dać mi łańcuch.
Pójdę dalej i wpisz go.
Witam, wszystkie czapki, Enter.
A teraz uwaga mam to wydrukowane jeden znak po drugim.
Więc nowy szczegół jest to, że ciąg, Na koniec dnia, może być
uzyskać w drodze jego osoby znaków wprowadzając na plac
Zapis wspornik.
A to dlatego, że napis pod spodem Okap jest rzeczywiście sekwencję
znaków.
Ale co o nich jest schludny w pamięci komputera -
Mac, PC, cokolwiek to jest - są dosłownie z powrotem do tyłu do tyłu -
H-E-L-P-O -
na indywidualne, w sąsiedztwie bajtów w pamięci.
>> Więc jeśli chcesz, aby na ósme takie bajt, który w tej pętli byłoby
Uchwyt zero, jeden uchwyt, uchwyt dwa, Wspornik trzy, wspornik cztery -
, która jest zerowa indeksowane aż pięciu -
że wypisze H-E-L-L-O w oddzielnym wierszu.
>> Teraz, jako teaser, pozwól mi pokazać, różne rzeczy w końcu będziesz mieć
w stanie zrozumieć, co najmniej niektóre blisko patrząc.
Z jednej strony, to, co zawarte w dzisiejszym przykłady, jeśli chcesz, jest w rzeczywistości
jeden z pierwszych Jailbreaks dla iPhone.
Jailbreaking oznacza pękanie telefon , dzięki czemu można z niej korzystać na
inny nośnik lub install własnego oprogramowania.
I można zauważyć, to wygląda zupełnie tajemnicze, najbardziej prawdopodobne.
Ale spójrz na to.
IPhone najwyraźniej krakingu dla pętli, jeśli warunek, inny
stan, kilka funkcji nie widziałem.
>> I znowu, nie będzie w Prawdopodobnie pierwszy rzut oka
zrozumieć, jak to działa.
Ale wszystko, co jakby się za pewnik w naszym współczesnym życiu
w rzeczywistości prowadzi do zmniejszenia, nawet do kilku z tych podstaw byliśmy
ogląda.
Pozwólcie mi iść do przodu i otworzyć jeden inny program, holloway.c.
Więc to też jest coś, co powinno naprawdę nie wiem.
Nawet nikt z personelu lub mogłem prawdopodobnie dowiedzieć się tego, patrząc na
to dlatego, że to był czyjś kod , który został przedstawiony do tego, co
historycznie znany jako ukrywane C konkurs, w którym można napisać program
kompiluje i działa, ale jest tak cholernie tajemnicze żaden człowiek nie może zrozumieć, co
to będzie zrobić, aż faktycznie go uruchomić.
>> Więc rzeczywiście, jeśli spojrzeć na to kod, widzę przełącznika.
Widzę głównym.
Widzę te nawiasy kwadratowe sugerując pewnego rodzaju tablicy.
Czy ktoś chce się odgadnąć, co program ten faktycznie
czy jeśli uruchomię Holloway?
Tak.
OK.
Brawo.
Więc tylko personel i nie mogę zrozumieć się, co te rzeczy zrobić.
>> A teraz wreszcie, pozwól mi iść do przodu i otworzyć jeden inny program.
To one -
ponownie, zrobimy kod źródłowy dostępne online - ta właśnie
niby ładna dla oka.
Wszystko zrobili jest trafiony spacja trochę.
Ale to jest prawdziwy kod.
Więc jeśli uważasz, że jest ładna, jeśli faktycznie uruchomić to w wierszu polecenia,
w końcu zobaczysz, jak my może robić takie rzeczy.
>> Więc my zostawimy cię w tej notatce i do zobaczenia w środę.
>> [Odtwarzanie muzyki]
>> Głośnik 2: Na następnym CS50, TFS etap bunt.
>> SPEAKER 3: Tam jest.
Brać go!
>> [Odtwarzanie muzyki]