[Powered by Google Translate] DAVID J. Malan: Dobrze, to jest CS50, a to jest
Początek tygodnia dwóch.
Dziękuję.
Zacznijmy tutaj z rozmowy telefonicznej.
Mam zamiar wybrać 617-Bug-CS50.
CS50: To CS50.
Dla Chłopca Shuttle, naciśnij 1.
Aby zacząć od początku, naciśnij 9.
DAVID J. Malan: Tak powiedział do chłopca Shuttle, naciśnij 1.
Więc będziemy naciśnij 1.
CS50: Jakie jest twoje pochodzenie?
Dla quad, naciśnij 1.
Mather, naciśnij 2.
Boylston, naciśnij 3.
Lamont, naciśnij 4.
Mem Hall, naciśnij 5.
Aby zacząć od początku, naciśnij 0.
DAVID J. Malan: Będziemy naciśnij 1 dla quad.
CS50: Następny transport pozostawia to bardzo minut w godz 1:10, a
potem na 13:20, 13:30, 1:40 PM.
To CS50.
>> DAVID J. Malan: Więc to jest jego głos CS50.
I jest przykładem rodzaju ostatecznych projektów, na
Przykładowo, można odgryźć kierunku
koniec semestru.
Na przykład, że istnieje shuttleboy.cs50.net -
faktycznie projekt, który pierwszy napisał po zażyciu CS51
kiedy byłem licencjackich.
I inspiracją było tu wtedy, wszystko, co mieli było
drukowane rozkłady autobus, i nie było
Pojęcie szuka rzeczy online.
I tak jakby gołębica w jeden weekend, przelewa się przez
drukowane harmonogram i przeniesiony do programu komputerowego.
W tym czasie program komputerowy się być napisane
w C. I faktycznie prowadził ją przez Boy wpisanie na transfer
miga zapyta jak robiliśmy do tej pory.
Jednak w ciągu roku, to przekształciła błyskawicznej
wiadomości bot.
To ewoluował ostatnio do tej strony internetowej, na
SMS narzędzie, jak również do tego narzędzia opartego głosu.
I to ma wskazywać na różnego rodzaju rzeczy, które można
zrobić dla siebie przez koniec semestru.
>> Na przykład tam, wersja SMS Boy Shuttle dzieje
działać w następujący sposób.
Jeśli na telefonie komórkowym, należy wysłać wiadomość tekstową do 41411 i
następnie wysłać specjalny sboy symbol, dla Chłopca błyskawicznego
następnie przez A i B, gdzie A jest pochodzenia i B jest
destination -
na przykład, Boylston Przestrzeń Quad -
co należy odzyskać w ciągu kilku sekund jest tekst
Wiadomość od Boy Shuttle informacją kiedy dokładnie
Następnych kilka wahadłowce są, od tego momentu, że będzie
pkt B.
I to jest bardziej ogólny przykład tego, co jest znane jako
przy użyciu interfejsu API.
>> Tak na przykład, to tutaj jest tylko shuttleboy.cs50.net,
Rzeczywista internetową wcielenie tego.
Ale dane, które podkreśla ten i inne aplikacje, które CS50
opracował są narażone na wszystkich tutaj w postaci
interfejsów API, interfejs programowania aplikacji.
A to tylko fantazyjny sposób na powiedzenie, że ludzie, jak my na
Internet i inne, które przez pewien czas tworzenia
oprogramowanie, które można wykorzystać w celu chwyć danych z nas i
następnie budować własne aplikacje na górze
z tego zestawu danych.
Tak na przykład, ta strona Boy transfer API tutaj, co
dzieje się w CS50 instrukcji, zasadniczo dokumentami
w jaki sposób można przejść o pytając CS50 serwerów danych.
Na przykład, jeśli jesteś zaznajomiony z plików CSV, przecinek
oddziela wartości, to tylko rodzaj szybkie i brudne
Excel-jak pliki.
Więc możesz zapytać Boy wahadłowych dla wszystkich danych na wszystkich
Domy i ich współrzędne GPS, a dostaniesz
powrót do zasady, że jak arkusz kalkulacyjny
można następnie wczytać do programu własnego, a następnie
generować wyniki, podobnie jak sam Boy Shuttle
dzieje się robi.
Dla tych bardziej znanych, bardziej nowoczesnych reprezentacji danych
m.in. JSON, JavaScript Object Notation.
Coś wróci do ciebie w kierunku
koniec semestru.
>> Ale znowu, jest to tylko jeden z kilku własnych API CS50 jest.
I ekscytującą rzeczą jest teraz, w tych dniach, Facebook i
Twitter i Google i prawie każdy popularny strona z
tam ma jakieś API, co oznacza, że ​​jeśli czytasz
dokumentacja na ich stronie internetowej, możesz zapisać się do
konto, można rozpocząć pisanie oprogramowania na szczycie
niezależnie od narzędzi i danych, które firma nie przewiduje.
I tak jeden z naszych współbraci nauczania kilka lat temu
napisał wersję Mac to.
Więc w linku pt Mac tutaj na górze po lewej stronie, można rzeczywiście
pobrać widget Mac OS, który działa na własnym komputerze Mac, aby zrobić
się te same rzeczy.
Więc to wszystko o budowanie na szczycie zbiorów danych jak te.
Ale o tym pod koniec semestru.
>> Więc nurkowania w bardzo szybko do błędów, po prostu rodzaj uzyskać
rzeczy rozgrzany dzisiaj, i wracam na niektórych
rzeczy przyjrzeliśmy ostatniego tygodnia.
W szczególności, pozwól mi iść do przodu i pociągnąć w górę, powiedzmy,
ten przykład tutaj.
Buggy1.c ten jest dostępny na stronie internetowej kursu gdybyś
jak go ściągnąć i rozglądamy siebie.
Ale bądźmy przybliżyć tutaj w tym programie dość krótkim, a tylko
super szybkie podsumowanie niektórych podstawowych elementów budynku, które
naprawdę będą tylko rozpocząć przyjmowanie za pewnik.
>> Więc niebieskiego rzeczy, w wierszach od 1 do 9, to tylko
Pytania softball.
Więc to tylko komentarze.
Oni nie mają funkcjonalnego znaczenia.
Ale są komentarze w tym sensie, że są one zauważa, że
I ludzkiej, do siebie, tak wykonane, że w i po wykład
wykład, faktycznie mogę sobie przypomnieć, co ten program
nie bez konieczności czytania przez niego linia po linii i
odtwarzając historię w moim umyśle.
Ponadto, jeśli ten program oddać komuś innemu, jak
ty, to znacznie bardziej przejrzyste dla ciebie, bo komentarzy takich jak ten,
, co jest w rzeczywistości sposób programu, lub w co najmniej
Program ma być robi.
Czy to jest prawidłowe, to inna sprawa zupełnie.
Teraz, w C, z komentarzami wielowierszowych, przypomnieć, że na linii
tutaj jest magiczny symbol, / *.
Oznacza to, tutaj jest początek komentarza.
I nic innego się nie liczy, aż dojdziesz do końca terminator
co * /, przeciwnie.
Tak więc fakt, że mam 80-kilka dziwnych gwiazd tutaj od
od lewej do prawej jest naprawdę tylko estetyczny szczegół.
Nie ma znaczenia funkcjonalnego.
>> Teraz jak o linii 11?
Co to zrobić w laika?
Co to jest?
PUBLICZNOŚCI: Zawiera normy.
DAVID J. Malan: OK, dobrze.
Więc to zawiera stdio.h biblioteki.
Więc co to oznacza?
Cóż, wewnątrz tego pliku stdio.h, jest cała masa
deklaracje funkcji -
to jest kod, który ktoś inny napisał.
A doskonałym przykładem funkcji, która jest zadeklarowana w
stdio.h jest -
których ulubionym przez teraz?
Printf więc, jednym z najczęstszych używać, oczywiście
na początku, z tej biblioteki jest.
Jeśli wykluczyć tego wiersza kodu Clang będzie krzyczeć
na mnie coś o użyciu nielegalnej symbol.
Coś jest chyba niewypowiedziane słowo kluczowe, ponieważ
nie poinformowały kompilator co printf wygląda
lubię, chyba że to ten wiersz.
A bardziej na ziemię, tak naprawdę, co to jest linia mówi
otworzyć ten plik, stdio.h, gdziekolwiek to jest na serwerze
dysk twardy lub urządzenie w dysk twardy i kopiuj-wklej to
tam do mojego pliku, bez mojej
konieczności zrobić ręcznie.
>> Teraz, kiedy mamy tu do main, niedługo zaczniemy
oprócz tego, co drażni int i co nieważne jest.
Ale teraz spójrzmy na trzech linii
w ciągu 15 do 17.
To tu, jak twierdzą, buggy.
Linia 7 w moje komentarze mówi "Gdyby wydrukować 10
gwiazdki ale nie. "Dlaczego to nie drukuje, w rzeczywistości,
10 takie gwiazdy?
PUBLICZNOŚCI: [niesłyszalne].
DAVID J. Malan: Dokładnie.
Więc zauważyć, że zaczynamy liczyć od 0.
I to jest rzeczywiście konwencja w programowaniu i
informatyka bardziej ogólnie, zaczyna liczyć
od 0 zamiast 1.
I to tak naprawdę wynika z faktu, że dla
przykład, gdy osiem osób się na etapie, kiedy
nikt nie podniesienie ręki, byli
wszystkie zera skutecznie.
A więc jest to po prostu rodzaj konwencji komputera tak,
w związku z tym, w celu rozpoczęcia zliczania od 0.
Jeśli to najniższy numer można reprezentować w formacie binarnym.
>> Więc zaczęliśmy inicjowanie I do 0.
Musimy ustawić i równa 0.
Ale potem popełnił ten błąd tutaj, mówiąc i jest mniejsza lub
równa 10.
Ale jeśli myślisz, że dzięki, jeśli zaczynają się od 0, a następnie przejść
do 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, i w rzeczywistości będzie mi
wydrukowanie 11 gwiazd na ekranie, bo już wzrosły
się i wynosi 10.
Tak łatwo naprawić tutaj to jest co?
PUBLICZNOŚCI: [niesłyszalne].
DAVID J. Malan: Wystarczy zmienić na mniej niż.
Jeśli naprawdę chcesz, możesz to zrobić.
Ale w ogóle, że jest mile widziana.
I tak zaczyna się liczyć od 0 jest po prostu coś, co powinno
zazwyczaj przyzwyczaić.
Teraz, co o tej całej konstrukcji w sobie i od siebie?
Ta linia 15 demarks pętli for.
Więc dla nie jest funkcją.
To tylko stwierdzenie.
To zapętlenie konstruują, jak widzieliśmy w Scratch.
I ma trzy części.
Należy zauważyć, że nie jest w pierwszą część
lewo od średnika.
Jest część środkowa pomiędzy dwoma średnikami.
I potem jest prawa ręka w prawo
drugiego średnikiem.
Teraz, pierwszy z nich robi co?
PUBLICZNOŚCI: [niesłyszalne].
DAVID J. Malan: Powrót tam?
Tak?
PUBLICZNOŚCI: Inicjalizacja.
>> DAVID J. Malan: Inicjalizacja.
Więc co to znaczy?
Mamy zadeklarowane zmienną o nazwie i.
To jest typu int, bo już określony int.
A ja inicjowanie I do wartości 0.
Więc co to naprawdę mówi?
To skutecznie mówić do komputera Hej, daj mi wystarczy
pamięci, mało pamięci RAM, aby dopasować liczbę, a następnie umieścić
liczba 0 w tym fragmencie pamięci RAM.
I jak na bok, jak duży jest int zazwyczaj, przynajmniej w
z urządzenia?
PUBLICZNOŚCI: 32 bit.
DAVID J. Malan: 32 bitów.
To znaczy, że da mi 32 bitów, inaczej znany jako 4 bajty,
i umieścić w nim wartość 0, co jest dość łatwe, ponieważ
To oznacza tylko ustawić wszystkie bity na 0.
>> Więc teraz, że druga część jest tutaj warunek.
I stan, jak sama nazwa wskazuje, jest to, co jest zaznaczone
znowu i znowu i znowu, czy to prawda czy fałsz.
Więc to jest po prostu mówiąc wykonaj następujące linie kodu -
czyli linia 16, bo to tylko jeden wcięty
pod -
i tak długo, jak jest poniżej 10.
I po każdej iteracji dzięki tej pętli, wykonaj
inkrementacja, którym jest w tym przypadku i + +.
Obecnie, nie musi być I + +.
I może być -.
Ale jeśli nie to, co się dzieje zachowanie
się z tego programu?
PUBLICZNOŚCI: To będzie pętla nieskończona.
DAVID J. Malan: To będzie coś w rodzaju nieskończonej pętli,
chyba, że ​​miał szczęście, po negatywnej 2 miliardy lub tak.
Może wszystko się owinąć wokół, tylko przez naturę skończoności
liczba bitów, które zostały przeznaczone na int.
Ale to na pewno będzie o wiele więcej niż iteracji i 10
na pewno więcej niż 11 razy tutaj.
>> A teraz, jak na bok, uświadomić sobie, że i + + oraz i -
są tak naprawdę syntaktyczne cukru.
To tylko skrótowe oznaczenie co jest trochę bardziej
wyraźnie zapisane w sposób następujący:
i = i + 1.
Który jest identyczny i + +.
To po prostu rodzaj wygląda ładniej powiedzieć i + +.
To jest bardziej zwięzłe, bardziej czytelny.
I tak większość ludzi, że zamiast.
Ale jest funkcjonalnie identyczne
co właśnie zobaczył.
Tak w skrócie, szybkie poprawki tutaj jest po prostu powiedzieć iteracyjne i.
od 0 aż do mniej niż 10.
I wtedy rzeczywiście dostać 10 gwiazdek.
>> Warto więc spróbować.
Pozwól mi otworzyć terminal na dole.
Pozwól mi iść do katalogu, że jest to widok
I zamierzam go skompilować ręcznie Clang do teraz.
I mam zamiar skompilować to jako buggy1.c, Enter.
A teraz buggy1, dlaczego nie ma takiego pliku lub katalogu
nazywa buggy1?
PUBLICZNOŚCI: [niesłyszalne].
DAVID J. Malan: Tak.
Więc to jest rzeczywiście o nazwie a.out.
Więc przypomnieć, czy po prostu uruchomić dzyń, gdzie Clang jest
kompilator, i nie podasz nazwę chcesz
dać do swojego programu, to będzie domyślnie a.out.
Tak naprawdę, jeśli mam zrobić ls -
oops.
A Ja nie - na czarno-biały problem niektórych
jesteś w obliczu został naprawiony.
Ale pozwól mi to zrobić.
Nie mamy a.out na lewej stronie tam.
Musimy więc uruchomić a.out zamiast buggy1.
>> Więc pozwól mi iść do przodu i robić.
. / A.out, Enter.
I najwyraźniej nie co zrobić?
PUBLICZNOŚCI: Zapisz.
DAVID J. Malan: Zapisz moje akta.
Tak, że można łatwo rozwiązać poprzez uderzenie S sterowania, lub będzie
Plik, Zapisz, jak w większości programów.
Puść mnie tu, wyczyścić ekran, uruchom go ponownie.
I jest jeszcze bug.
Więc co się dzieje -
PUBLICZNOŚCI: Nie skompilować.
DAVID J. Malan: Ah, dobrze.
Nie miałem go skompilować.
Jak idiota, ja patrząc na kod, aby zobaczyć co się stało.
Więc buggy1.c dzyń, teraz a.out.
I uff, zapisane.
>> Tak to wygląda trochę brzydki, bo nie ma nowa linia
wszędzie w programie.
Ale znowu, to tylko estetyczny szczegół.
A przynajmniej jeśli liczyć te obecnie, powinniśmy
teraz zobaczyć 10 takich gwiazd.
No, a co z tym drugim przykładzie rozgrzewki?
Więc w buggy2, twierdzę, że ta wersja też będzie drukować
10 gwiazd, po jednej w wierszu.
Więc tym razem, mam znak nowej linii, tak aby
rzeczy trochę ładniejsza.
Ale zamiast tego, co dostaję to.
Więc pozwól mi zrobić buggy2.c dzyń, Enter.
Teraz to znowu nazwie a.out.
Enter.
Widzę tylko jedną nową linię, tylko bardzo ostatnio nowy wiersz
porusza moje polecenia do następnego wiersza.
A jednak wyraźnie byłem drukowania *, to nowy wiersz,
*, To nowa linia.
Ale co jest bug tutaj?
Tak?
PUBLICZNOŚCI: [niesłyszalne].
>> DAVID J. Malan: Dokładnie.
Tak więc w przeciwieństwie do niektórych języków, takich jak Python, gdzie wcięcia
faktycznie ma znaczenie funkcjonalne, w
język jak C -
jak zobaczymy, PHP, JavaScript -
wcięcie jest naprawdę tylko dla dobra ludzi ".
Tak więc fakt, że mam wcięcie linii 16 i 17 wygląda świetnie,
, ale nie ma tu znaczenie funkcjonalne.
Jeśli chcę obie linie do wykonania w ramach w
pętla, to muszę je ująć w nawiasy klamrowe to robi.
Możesz tylko wyciąć ten róg i pominąć klamrach
co to za sprawa?
PUBLICZNOŚCI: Tylko jedna linia.
DAVID J. Malan: Tylko jedna linia.
Więc to jest po prostu rodzaj miłej rodzaju szczegółów składni tak, że
nie tracić czasu na pisanie trzy linie, z których dwa są
nawiasy klamrowe, tylko napisać ani jednej linijki kodu.
Ale jeśli masz dwie lub więcej linii, my
rzeczywiście trzeba to zrobić.
>> Więc teraz pozwól mi zapisać to.
Pozwólcie mi iść do przodu i ponownie uruchomić Clang.
Pozwól mi powtórzona a.out, a teraz mam je jeden na wiersz.
Teraz znów jest a.out rodzaju głupi nazwy programu.
Jak mogę dzyń faktycznie dać mi nazwę pliku
to jest bardziej przyjazny dla użytkownika, jak buggy2 sama?
Trochę jaśniej?
PUBLICZNOŚCI: [niesłyszalne].
DAVID J. Malan: OK, więc można rzeczywiście podjąć bardzo
łatwy w obsłudze i po prostu napisać skrót zrobić buggy2.
Nie określić. C w tym przypadku, i naciśnij klawisz Enter.
A co robi, to się kompiluje buggy2.c dla mnie przez
prosząc Clang to zrobić.
Konkretnie, wywołuje dzyń, uruchamia dzyń użyciu sposób więcej
Argumenty wiersza poleceń lub przełączniki, niż rzeczywiście potrzebujesz.
W czasie, wrócimy do tego, co tych wszystkich różnych
zagadkowe dzielone wyrażenia oznacza.
Ale teraz, to po prostu oszczędność mi kłopotu z
mając do zapamiętania i wpisywania wszystkie te
różne dzielone wyrażenia.
I odwrotnie nim ostatecznie jest
że teraz mam buggy2.
Jeśli chcę zrobić to ręcznie, choć,
może zamiast to zrobić -
dzyń-o buggy2 a następnie buggy2.c.
I że podobnie będzie mi plik o nazwie buggy2.
>> Tak w skrócie, Clang jest kompilator.
Marka jest tylko łatwy w obsłudze narzędzie, które będziemy używać więcej
i więcej, po prostu dlatego, że zaczyna
uproszczenia rzeczy dla nas.
I wracamy 0 wreszcie.
Na razie, tylko dlatego, ale zaczniemy drażni, że część
dzisiaj i na środę.
Wszelkie pytania dotyczące któregokolwiek z tego?
Tak?
PUBLICZNOŚCI: [niesłyszalne]
ls w cudzysłów tam?
DAVID J. Malan: OK.
Kiedy wpisałem ls w cudzysłowie, który został mi robi trochę magii
za kulisami, aby naprawić błąd.
Zapomniałem, jakbyśmy mówili wielu z was na
tablice dyskusyjne, uwagi -
zrobimy to teraz - sudo yum-y aktualizację appliance50.
Ups, że jest wpisany w prawo.
Urządzenie jest tak jak system operacyjny.
To działa ten system operacyjny o nazwie Fedora.
A teraz z powodu mojego wolnego połączenia internetowego, mam
bardzo ladne to.
Tak działa sudo yum aktualizację, jak wam zrobić w
set problem, zasadniczo jak działa automatyczne aktualizacje
w systemie Mac OS lub Windows.
I przyczyną działa to na samym początku
set problem jest, ponieważ kiedy stworzył urządzenie, I
pomieszane, a ja przypadkowo wykonane wszystkie programy wyglądają
czarno na czarnym ekranie, dlatego nie widzisz ich
domyślnie.
Ale najnowsza wersja urządzenia załatwia problem.
A ja naprawić podczas przerwy raz mam internet
łączność.
>> Więc cytaty po prostu ukrywa mój błąd, bardzo dyskretnie,
widocznie.
Inne pytania?
Tak?
PUBLICZNOŚCI: Gdzie robi się wzięło?
[Niesłyszalne]
DAVID J. Malan: Dobre pytanie.
Gdzie się bierze?
Linux jest program, który od wielu lat, długo
przed CS50.
I jest dostarczany z systemem operacyjnym, jak Fedory.
Nie pochodzi z CS50 biblioteki.
W rzeczywistości, tylko rzeczy, które pochodzą z biblioteki CS50
do tej pory, że widzieliśmy, są GetString, getInt, wszystkie
Pobierz te funkcje, a łańcuch słowo, a dla niektórych
stopniu słowo bool.
Ale będziemy drażnić, że oprócz kiedy nurkować w CS50
samo urządzenie.
>> Tak tak, jeszcze jedno pytanie tutaj.
PUBLICZNOŚCI: Kiedy powiedział make i buggy, w jaki sposób
komputer wie [niesłyszalne]?
DAVID J. Malan: Dobre pytanie.
Więc kiedy tylko uruchomić make buggy1 lub dokonać buggy2, jak
czyni wiedzieć?
Tak domyślnie, jeśli wpiszesz się buggy1, marki szuka
Plik o nazwie buggy1.c.
A następnie wykonuje odpowiednie polecenia dzyń,
tym samym nadpisując plik wyjściowy domyślnej nazwie a.out.
W rzeczywistości, jeśli spojrzymy na to, co zrobić, co -
niech zakończyć to.
Jeśli spojrzymy na to, co się faktycznie robi, aby buggy2,
jest już aktualne.
Więc pozwól mi usunąć polecenia rm,
Program pisałem wcześniej.
Wpisanie Y-E-S w celu potwierdzenia, że ​​chcę, aby ją usunąć.
Jeśli teraz robią, zauważ, że w tej branży bardzo długo,
tam to jest ostatnia rzecz, o,-o buggy2.
Wszystko robi make przechodzi ten argument, że tak powiem, do
Dzyń, tak że nie trzeba wpisywać go sobie.
>> W porządku, więc szybkie para administracyjnych
Anonse.
Tak na sekcje, które oficjalnie rozpoczęło się tak
Niedziela, zawsze będziesz chciał wnieść, jeśli
masz, laptopa.
Jeśli nie masz laptopa, nie dotrzeć do mnie przez
spada mi email.
I dowiemy się przepływ pracy.
Co zazwyczaj znajdziesz w sekcji jest to, że są one częścią
koncepcyjnego, część praktyczną.
Będziemy szczegółowo użyj sekcji pytań, część
w tygodniu zestaw problem, przejść przez niektóre
koncepcyjny materiał z wykładu.
I to wszystko w bieżącym zestawie problemu.
A my też nurkować w niektóre działania praktyczne, czasami
które będą musiały być złożone, czasem
które nie.
Na przykład, w tym pierwszy tydzień, są one przeznaczone, tak jak
rozgrzewka ćwiczenia.
A przekonasz się, że te problemy są tak naprawdę tylko to.
Są to być dość małe, ale nie koniecznie
trywialne programy do pisania, które niekoniecznie
emocjonujące same w sobie, ale są dobrą okazją do
ćwiczyć ze składnią, z nowymi funkcjami, w zaciszu
punkt, gdzie masz kilka swoich kolegów przedstawić jako
dobrze jako TF.
>> A co będziemy robić w czasie jest użyć narzędzia o nazwie CS50 Spaces,
przy czym zamiast używania CS50 Appliance, będziesz
zamiast iść do strony internetowej w przeglądarce, w którym będzie można
napisać kod w oknie przeglądarki podczas sekcji.
A potem, jeśli zdecydują się, twój kolega nauczanie może następnie pokazać
cokolwiek to jest, piszesz na ekranie w przeglądarce
okna do przodu klasy, lub, czy anonimowo
publicznie, tak że może on następnie pieszo przez z
koledzy, co zrobiłeś dobrze, co nie zrobiłeś dobrze.
I znowu, pewni wszystko można ładnie anonimowe.
Ale to będzie miła okazja dla bardziej
interaktywność niż coś wykładu pozwala.
>> W międzyczasie, będziemy mieli te rzeczy nazywane Super
działy, które są obowiązkowe, ale są otwarte dla wszystkich w
klasy, dzięki czemu można zrobić więcej zbiorczo dla
Problem ustawione.
Oto harmonogram.
To jest również umieszczona na stronie głównej w cs50.net.
Zauważ, że nie będzie specyficzna hacker
jeden jutro po południu.
I będziemy filmować jednego dziś, a jeden jutro i po tych
online w ciągu 24 godzin.
Więc nie, jeśli nie można zrobić żadnej z tych czasów, aby się martwić.
I znowu, harmonogram jest teraz w cs50.net.
>> W zakresie cięcia się, należy zdobyć
e-mail z instrukcjami, aby przejść do kursu głównej znaleźć
z sekcji.
Jeśli życie się zmieniło i trzeba zmienić sekcję,
nie stanowi problemu.
Wróć do tej samej zawartości, cs50.net/section, pojedynczej,
i będziesz wypełnić podobną formę, tak aby można
następnie podać swoje preferencje.
I będziemy śledzić przez tydzień w końcu do tego, co możemy
pomieścić.
W zeszłym tygodniu, przypominam, że zaproponował użycie CS50 dyskutować,
Kurs jest narzędziem dyskusja, w wykładzie.
Więc mieliśmy 40 pytań, które były zadawane i
odpowiedź podczas wykładu.
Więc wydawało się dobrze, więc będziemy kontynuować
próbuje to zrobić.
Jeśli w trakcie wykładu, nie tylko poczuć komfortowe podnoszenie
Twoja ręka, a nie problem.
Idź do cs50.net/discuss, pisać tam, a jeden z naszych nauczania
Stypendyści będą albo odebrać je w formie elektronicznej lub podnieść ich
ręka w Twoim imieniu anonimowo zapytać, w zależności
od charakteru pytanie.
Oraz w odniesieniu do razie, będzie ogólnie psets
zwrócone w ciągu tygodnia.
Bo to zajmuje trochę czasu na sekcje w celu osiągnięcia
Równowaga, pierwszy zbior, 0 i 1, będzie trochę
opóźnione rzeczy ustatkować.
Ale stay tuned, że w najbliższych tygodniach.
>> W porządku, więc założę na moje poważne
głos na chwilę.
Więc to jest rzeczywiście ciekawy klimat się
o tej dyskusji, co z wszystkie innymi
dzieje się na terenie kampusu z nimi związane.
Ale CS50 pewnością miał swoją historię tej szczególnej
temat, w zakresie, w każdym roku, to oczywiście, dla wielu
roku, AD-Boards przybliżeniu 3% klasy.
To ostatni rok, 2011, CS50 Ad-wsiadł 35 uczniów.
To nie jest, jak sądzę, ze względu na brak przejrzystości.
Sobie sprawę, że w trakcie jego nauczania, jest strona
oświadczenie wyjaśniające, gdzie linie są.
To samo stwierdzenie jest powtarzany na każdym z
Problem przedstawia na pierwszej stronie.
>> Tak wspominam to dzisiaj tak naprawdę do
ludzie Świadoma tego.
I próbowaliśmy różnych rzeczy.
I co myślałem, że my dzisiaj jest tylko przez chwilę
faktycznie spojrzeć na niektóre z ostatnich spraw, które pojawią się.
Zamiast trzymać je jako brudne tajemnice, właściwie
wskazać, co uczniowie zrobili i jak wykryliśmy
to i naprawdę to, co jest dla nadrzędną motywacją
nawet o tym rozmawiać.
Więc z tym powiedział, linia zasadniczo jest to -
za program nauczania, jesteś mile widziany, zachęcamy do
rozmawiać z kolegami.
To cały sens posiadania ich współpracy
godziny urzędowania w Annenberg i zachęcanie ludzi do
Ostateczny projekt do współpracy.
Ale linia wytyczona jest, gdy przychodzi czas, aby faktycznie napisać
Twoje ostateczne rozwiązanie.
Mówiąc po angielsku, całkowicie w porządku, mówiąc w pseudokodzie,
całkowicie w porządku.
Wysyłanie kolegą swoją PSET, pozwalając im spojrzeć na
ekran jak ręce kontynuować wpisywanie
na linii, jak również.
Nie patrzeć w programie nauczania dla poszczególnych linii.
>> Ale tylko do namalowania obrazu, jak to jest niestety
rzeczywistość, uświadomić sobie, że istnieją strony internetowe, które obecnie nie
mają rozwiązania z tej klasy i wiele innych grup.
Fakt, że ty lub około 3% z was wie, że istnieje
Oznacza to, że wiemy, że to istnieje.
Fakt, że istnieją strony internetowe, jak to, w którym
można zapłacić komuś faktycznie swoje zestawy problemowe - to było
rzeczywisty przypadek, że przyszedł w zeszłym roku.
Jest to strona o nazwie odesk.com.
I Tim nazwisko osoby o zamieszczenie na który
tej stronie i poprosił kogoś zrobić jego Pset 7 w
tym konkretnym przypadku.
Cóż, jest bardzo odesk.com Google-stanie, i my też jesteśmy
bardzo dobry w Googling.
Tutaj też znajdują się strony - i ten jest raczej
okropna, szczerze mówiąc.
[Śmiech]
DAVID J. Malan: Zabawne o tej stronie jest, jeśli
przeczytać O stronę, mówią o swoich korporacyjnych
obsługa klienta kultura i jaki jest ich numer jeden
priorytetem, aby upewnić się, że przydziały dostać
odwrócił się na czas.
>> Ale z całą powagą, ponownie, na fakt, że te strony
istnieje, uświadomiliśmy sobie, że też są świadomi
tego rodzaju stron.
I dać poczucie tego, co tworzy to generalnie
wykonuje, na ogół nie ma wielkich afer, w których ludzie
współpracują na każdym rodzaju masową skalę, ale raczej
to te nocnych chwile słabości, gdy masz tak
wiele do zrobienia, jest 04:00, jesteś wyczerpany, a
myślisz sobie, dobrze, niech mi tylko spojrzeć na moją
współlokator męskie lub mój przyjaciel kod lub jak.
I przejawy to niestety wiąże Studenta
Składania coś takiego i składania student B
coś w tym, co z pewnością w komputerze
Klasa nauka, jest niezwykle prosty dla informatyków
do wykrycia, z oprogramowaniem.
Jest to kolejny wspólny paradygmat, gdzie masz coś w rodzaju
pracował u boku kogoś, może mówić w
Angielski, dobrze, pseudokod.
Ale potem przychodzi czas, aby faktycznie przesłać, a psets
tylko dostać wymieniane za pośrednictwem poczty elektronicznej lub Dropbox lub podobnych.
Jednak w celu uczynienia go mniej oczywiste, że jest to
co się stało, to jest to, co jest przekazywane.
To też nie potknąć się dobrze napisane kawałki robi
oprogramowanie jak mamy faktycznie wykryć
tego rodzaju rzeczy.
I rzeczywiście, to, co możemy zrobić, to uruchomić program, który porównuje wszystkie
Tegoroczne wnioski przeciwko wszystkim przeszłość tegorocznej
Zgłoszenia, przed wszystkim, co znajduje się na
Internet, przeciwko każdej stronie pracy tam.
To wszystko jest bardzo zautomatyzowane.
I tak naprawdę to zrobić w wielkiej uczciwości do 97% osób, które
naprawdę działa ich osłów off w tym i innych
Klasy i wprowadzenie wszystkich tych wysiłków, tak aby praca
ostatecznie przedstawić jest ich własne.
I mogę iść na wieki.
>> To tylko garść zeszłorocznych przypadków.
Kilka uczniów przekazywane te pliki identycznie dla Pset 2,
pset 3, pset 4, pset 5, pset 6, pset 9.
W tym przypadku, to Quiz 0 i w ubiegłym roku, w którym dwa
Uczniowie składać identycznie to zdanie wśród wielu
inni, "Żądanie typu -" kropka, kropka, kropka.
Tak więc nawet w klasie 600 zrobiliśmy to wykryć
na złożone quizy.
Tak w skrócie, to - szczerze mówiąc, Nienawidzę tego rodzaju
rozmowę - ale to jest naprawdę świadomego wysiłku
w tym roku, aby spróbować obniżyć tę liczbę.
Bo mimo, że mówią, że te różne rzeczy, co
roku, myślę, że rzeczywistość mieszkał które na nią za mało
więcej sekund niż zwykle, a właściwie tylko wskazanie
że to, co może wydawać się, eh, nie taki układ dużym, co najmniej
wracam do tej szczególnej chwili, zarówno w sprawiedliwości, aby
siebie i do swoich kolegów tutaj.
Więc jeśli kiedykolwiek jakieś pytania co do tego, gdzie linia
jest, proszę po prostu dotrzeć do mnie osobiście.
Ale odpowiedź jest zawsze, całkowicie zestresowani
last minute, gotówka w późnym dni.
Lub jeśli jest to kwestia nie mając żadnych późnych dni,
szczerze, napisz do mnie osobiście.
Dowiemy coś.
Proszę nie wkładać swój czas tutaj na Harvardzie na ryzyko.
>> Teraz, że powinniśmy rozjaśnić nastrój, więc
zawiera to jako następnego slajdu.
[Śmiech]
DAVID J. Malan: Ta strona była świetna.
I rzeczywiście trochę się rozprasza.
Jest taki jeden.
A potem ten był niesamowity.
Ok, więc myślę o tym kociakiem późno w nocy przy podejmowaniu
tych decyzji.
W porządku, więc powrót do więcej zabawy i mniej poważne rzeczy, jak
warunki.
>> W porządku, więc rozmawialiśmy krótko o nich.
To jest coś, to jest to chyba dość dobrze zaznajomieni z
Świat Scratch.
A w świecie Scratch, mamy taką potrzebę czasem
iść zrobić widły w drodze.
Albo zrobić to czy tamto czy to coś innego tutaj.
I kiedy chcesz to zrobić, możemy użyć w C teraz, to jeśli
else konstruować.
A potem mamy tutaj wyrażeń logicznych.
Na przykład, wyrażenia logiczne tutaj możemy OR
je razem, w tym sensie, że mamy ten warunek OR
warunek.
Możemy i je razem, w tym sensie, że chcemy
sprawdzić ten warunek, oraz że stan.
I tu mamy instrukcji switch teraz, co nie jest tak
składniowo podobne do takich warunków, ale
pozwala nam na odpowiednik if, else if, else if, else
Jeśli, jak i, po prostu przez przypadek wyliczanie ich przypadku
przez każdego przypadku.
Więc widzieliśmy te ostatni raz.
A potem zaczęliśmy dotyka rzeczy jak pętle.
Widzieliśmy jeden z nich po prostu chwilą.
Ale są te inne pętle.
>> Na przykład, tym tutaj.
Tak while (warunek), zrobić to ponownie i ponownie.
Więc zasadniczo, co wydaje się być inaczej między tym
dla pętli i ta pętla a tu?
To na tej pętli i pętla while.
Tak?
Co to jest?
PUBLICZNOŚCI: [niesłyszalne].
DAVID J. Malan: Dobrze.
Tak więc mając na uwadze do warunku pętli, jest wyraźnie
więcej składni.
Jest to inicjalizacja, jest ta aktualizacja.
W pętli while, jest tylko ten warunek.
Tak więc wydaje się, że jest to trochę pominięto w porównaniu do
pętli abonenckiej, co oznacza, że ​​jeśli chcemy mieć zmienne i chcemy
mieć inkrementacja, faktycznie trzeba
zrobić to sami.
>> Więc pozwól mi iść do przodu i otworzyć gedit.
Pozwól mi przełączyć na urządzenie.
I niech po prostu zrobić szybki mały przykład, że
Jednym z nich różni się od innych.
A w mojej głowie tutaj, powinienem powiedzieć jedną rzecz.
I wyraźnie wymienione nazwisko Tima.
Tim był rzeczywiście ktoś, że student próbował znaleźć zrobić
odrabianiu lekcji dla nich.
Nie mieliśmy w tym szczególnym Tima sekcji.
Więc uświadomić sobie, abym nie ujawniono studenta, to nie był studentem.
To był przypadkowy człowiek w internecie robi rzeczy
przez pełnomocnika w roku ubiegłym.
Tak więc okazuje się, że też.
Więc w tym przypadku tutaj, pozwól mi iść do przodu i
otworzyć nowy plik.
Plik, Nowy.
To daje mi kartę tutaj.
Pozwólcie mi iść do przodu i zapisać go jako loop.c.
Pozwól mi iść i kliknij Zapisz.
A potem na dół, idziemy do przodu i zacząć pisać
# Include.
Pozwól mi powiększyć
Teraz zrobimy int main (void).
Teraz pozwól mi iść dalej i zrobić for (int i = 0; i <
oh, 10, i + +).
I teraz mam zamiar iść do przodu i są drukowane na gwiazdkę, że
robiliśmy wcześniej.
A następnie pod koniec tego programu, po prostu będzie
wydrukować nowy wiersz, po prostu tak, że moje polecenia
nie wygląda cały bałagan.
powrót 0.
Wydaje syntaktycznie poprawne?
Tak daleko.
Zobaczmy więc.
>> Więc pozwól mi pomniejszyć, idź do mojego okna terminala.
I pozwól mi iść dalej i uruchomić pętlę, bo nazwał to
loop.c. rzeczą
Więc zrób pętlę.
Wydaje się skompilować OK.
Pozwól uruchomić pętlę, a teraz Enter.
I wydaje się, że drukowane 10 gwiazd.
Więc po prostu przekonwertować to do pętli while i zobaczyć, co
rodzaju kwestiach się potknąć.
Więc zamiast tego, pozwól mi iść tutaj i powiedzieć, a ja to
mniej niż 10 -
pozwól mi pozbyć pętli for.
OK, więc mamy kilka problemów już.
Tak więc stan jest taki sam, ale jestem oczywiście brakuje
inicjalizacji.
Jestem brakuje inkrementacja.
Więc co należy kompilator może mi powiedzieć, kiedy próbuję
skompilować ten program?
Tak?
PUBLICZNOŚCI: [niesłyszalne].
>> DAVID J. Malan: Dobrze.
Więc to będzie powiedzieć coś nierejestrowanej - w tym
przypadku zmiennej i.
I rzeczywiście, korzystanie z nielegalnej identyfikator i.
I tak to jest, w przeciwieństwie do języków takich jak PHP i
Python i Ruby, z którym niektórzy z was mogą znać,
, gdzie można po prostu rodzaj startu za pomocą zmiennych
chcąc nie chcąc i nie trzeba się martwić o ich zgłaszania
wyraźnie zawsze.
W C i językach takich jak Java i C + +, trzeba być
bardzo wyraźne.
A jeśli chcesz zmienną o nazwie i, musisz mi powiedzieć,
jakie zmienną jest.
Więc będziemy musieli to naprawić w następujący sposób.
Będę musiał przejść tutaj i wpisz int i, w związku z
I zadeklarowały zmienną o nazwie i.
Teraz, mam opuścić jeden krok.
Ja oczywiście nie zainicjowany, ale zobaczymy, czy to w
najmniej Clang marki przestań narzekać.
Więc pozwól mi przerobić ten program.
>> Dobra, teraz to tylko narzekać
z innego powodu.
"Zmienna" i "jest niezainicjowana stosowany tutaj." W porządku, więc
to dość wyraźne.
Zainicjowany po prostu oznacza ustawienie go równy wartości.
I nie zrobisz, więc pozwól mi spróbować równa 0.
Teraz spróbujmy jeszcze raz i ponownie uruchomić Clang.
Zestawione ten czas.
I mam zamiar go uruchomić.
Ale wielka stara pętla nieskończona, bo robiłem
inicjalizacji, zrobiłem stan, ale nigdy nie robiłem
każdy rodzaj inkrementacja.
Więc jak mogę zrobić Inkrementowanie?
Cóż, w pętli while, to czuje się jak będę mieć
to zrobić wewnątrz pętli, ponieważ podobnie jak pierwszy
tygodniowo przykłady robi pętle, jak z
skarpetki i samo-liczenia, co mieliśmy do zrobienia
coś na samym końcu, jak wrócić do następnej linii.
Co zrobić, jeśli iść dalej i zrobić to i + + tutaj?
Niech nawet nie skompilować.
Złap mnie już.
Co jest źle?
PUBLICZNOŚCI: [niesłyszalne].
>> DAVID J. Malan: Więc to na pewno nie jest int.
To ja.
I nawiasy klamrowe, tak jak wcześniej,
wcięcia nie wystarczy.
Więc teraz mam to budować.
Tak więc, i jest mniejsze niż 10, należy wydrukować gwiazdę,
potem inkrementacja i.
A sposób, podczas gdy prace pętli jest to, że tak szybko, jak trafisz
dolnej pętli, która w tym przypadku przewód 10 wygląda,
to będzie powrót do linii 6, w którym momencie
warunek ten zostanie ponownie sprawdzane.
I jeśli jest wciąż mniej niż 10, zrobimy linie 8 i
potem 9, potem trafiliśmy 10, i wrócić do 6, raz
ponownie i po raz kolejny, tak długo, jak jest poniżej 10.
Więc ponownie uruchomić się tutaj.
>> Okay, mamy opracowane w porządku.
Pozwól, że re-run pętli.
A teraz to faktycznie wydaje się działać.
Więc plusy i minusy tutaj?
Cóż, do tej pory nie ma tam właściwie cała plo -
so cute.
Dobrze, że był - ach, to był wypadek.
Dobra, wróćmy do pętli for.
Więc na pętli są ładne, bo są bardzo wyraźne.
I mimo, że są trochę niezgrabne do napisania, to
bardzo mocny i pozwala zrobić
wiele rzeczy na raz.
Podczas okrążenia nie wydają się mieć ogromną ilość wartości tylko
jeszcze, bo czuję, że po prostu trzeba zrobić więcej pracy.
Musimy umieścić inicjalizacji tu,
aktualizować i tutaj, a musimy pamiętać, aby zrobić to wszystko.
Więc zobaczymy w czasie okrążenia, podczas gdy faktycznie pożyczyć
się do niemal różnych kontekstach, różnych danych
struktury, jak list i tabel hash, rzeczy, my się do
w połowie semestru.
Ale teraz wiem, że to jest trzeci typ znany jako do-
while.
I widzieliśmy to krótko.
I to może być bardzo pomocna w PSET 1.
Każdym razem, gdy chcesz coś zrobić, a potem sprawdzić, czy
użytkownik współpracował, a jeśli nie, to jeszcze raz, do-
while nadaje się do tego rodzaju logiki.
Ponieważ jako zamówienia z góry do dołu, o sugeruje
nie dosłownie oznacza to zrobić.
I zrobić to po raz kolejny, co może być?
Może to znaczy, wzywającą getInt lub getString a następnie
sprawdzając wartość getInt lub getString i krzyczy
na użytkownika, jeżeli nie współpracowała, prosząc ich
znowu i znowu i znowu.
W którym chcesz zrobić coś raz,
następnie sprawdzić jakiś warunek.
>> Warto więc spróbować.
Pozwól, że faktycznie to zmienić teraz do-while pętli.
I mam zamiar iść do przodu i wykonaj następujące czynności.
Więc wykonaj następujące czynności.
Zróbmy int i getInt = (), ale niech najpierw powiedzieć użytkownikowi
co robić.
Więc trochę inny.
"Daj mi int".
Więc będę używać printf za to.
I teraz mam zamiar iść w dół, a ja zamierzam to zrobić
a ja to, powiedzmy, powyżej -
Zobaczmy, i jest, powiedzmy, mniej niż 0 lub i jest
większy niż 10.
Innymi słowy, chcę liczbę od 1 do 9, po prostu
arbitralnie.
Więc używam łączny wyrażenie logiczne, żeby
mieć pewność, że jest mniejszy niż 0 i większa od 10, w którym
sprawa będzie zrobić pętlę tutaj ponownie.
Więc znowu, to zrobić -
a i jest mniejszy niż 0 i i jest większa od 10.
>> Więc teraz idziemy do przodu i zrobić to raz zrobiliśmy to.
Zróbmy szybki test normalności.
printf ("Dzięki, i jest% d", i).
Więc to prosty program pyta użytkownika o int,
zapewnia, że ​​to w ramach jakiegoś przedziału od 1 do 9 włącznie,
a następnie dzięki instrukcji, przypominając im, co tylko
wpisany, po prostu jak małe kontroli rozsądku.
Ale zobaczymy, czy to działa w sposób zamierzony.
Puść mnie głową na dół i ponownie uruchomić zrobić pętlę.
Hmm.
"Korzystanie z nielegalnego identyfikatora 'ja'". To dziwne.
Myślałem, że mamy rozwiązać to.
Sam objaw ale inny kod.
Tak?
PUBLICZNOŚCI: [niesłyszalne] wewnątrz dwóch, mamy do
[Niesłyszalne].
>> DAVID J. Malan: Dokładnie.
Więc to naprawdę prowadzi nas do tematu znanego jako zakres.
Okazuje się, że C, ponownie, to naprawdę można dostać się dosłownie.
I jeśli coś jak to zrobić, gdzie można zadeklarować int
a następnie przypisać mu pewną wartość, ale trzeba, że ​​we wnętrzu
Para klamrowych, co C robi to zakłada się, że
chce tylko te 32 bity, znane jako i istnienie w
Kontekst tych klamrach, w ramach linii
6 do 9. Więc jest zadeklarowana i jest przypisany
Wartość w wierszu 8, ale tak szybko, jak się na zewnątrz
Linia 9 poniżej nawiasem klamrowym, i nie jest już w
Zakres, że tak powiem.
S-O-C-E-P. Nie jest już w odpowiednim kontekście.
Więc teraz nie ma i, więc to tak, jakbyśmy nie mieli nawet
oświadczył to w ogóle.
>> Więc co jest fix potem na coś takiego, jeśli
Powodem jest, że zostaną zgłoszone w ciągu nawiasy, które
jest najwyraźniej źle?
Tutaj?
PUBLICZNOŚCI: [niesłyszalne].
DAVID J. Malan: Tak.
Więc możemy zainicjować go na zewnątrz.
Więc pozwól mi iść dalej i usunąć części oświadczenie, w myśl
I określić rodzaj i pozwól mi to zrobić tutaj.
Tak więc w wierszu 5, teraz mówi: "Daj mi int." Zadzwoń do mnie to.
Zawiadomienie w linii 9, ja nie chcę tego robić, bo
mają już 32 bity.
Nie chcę, aby zapytać, czy komputer
różne 32 bity.
Chcę korzystać z tych samych 32 bitów.
A teraz, ponieważ jest zadeklarowana w wierszu 5, nadal legit
go używać w linii 11 i linii 12.
>> Więc pozwól mi spróbować przebudować to i zobacz
jeśli Clang przestaje krzyczeć.
zrobić pętlę.
Więc teraz to jest "niejawna deklaracja funkcji
"GetInt 'jest nieprawidłowy w C99." Co to jest?
Tak?
PUBLICZNOŚCI: [niesłyszalne].
DAVID J. Malan: Tak.
Więc teraz, że jestem rzeczywiście przy getInt, to nie jest coś,
że po prostu przychodzi z C. pochodzi z CS50.
Musimy więc to tutaj.
I pozwól mi wrócić do polecenia down
tutaj i ponownie uruchomić make.
Ok, w końcu.
Teraz mamy rozwiązany, że i drugi błąd.
Chciałbym teraz uruchomić pętlę i zobaczyć co się dzieje.
"Daj mi int." Daję mu 11.
Dam mu -1.
Dam mu foo.
Dam mu 5.
A teraz to rzeczywiście działa.
Ale szybka zmianie z powodów tutaj.
Dlaczego to powiedzieć, spróbuj jeden z tych razy, ale daj mi
int pozostałe trzy razy?
Dlaczego jest to zachowanie inaczej?
PUBLICZNOŚCI: Dał mu łańcuch.
DAVID J. Malan: Przepraszam?
PUBLICZNOŚCI: Dałeś mu łańcuch.
DAVID J. Malan: Tak.
Więc dał mu łańcuch w tej trzeciej próbie,
gdy wpisałem foo.
Foo jest string.
To oczywiście nie int.
A sposób, w jaki CS50 wdrożyła getInt jest to, że
nie sprawdzić, czy coś jest nie mniejsza niż 0 lub większa niż 10
dla ciebie, bo jak wiemy z góry, jaki rodzaj
int chcesz?
Ale możemy minimalnie sprawdzić dla ciebie, nie instrukcji przynajmniej
wpisz liczbę całkowitą?
A jeśli nie, możemy krzyczeć na użytkownika, wpisując polecenie "ponów" na
ekran.
>> Więc teraz mamy program, który jest zapętlenie. Okay.
Teraz, które z nich jest swego rodzaju lepszej konstrukcji?
Tak to jest, gdy wszystko zaczyna się trochę bałagan,
Fakt, że trzeba pamiętać, aby zadeklarować zmienną tutaj
jeśli chcesz go używać wewnątrz niektórych
nawiasy klamrowe i na zewnątrz.
Ale nawet jeśli to wygląda dość tajemniczy w pierwszym
spojrzenie, tylko raz, pamiętam prostą logikę.
Aby korzystać z niczego w C, czy jest to funkcja lub
jest zmienna, trzeba umieścić go, czy to funkcja
w jakiejś bibliotece, musisz to zgłosić.
Ale teraz musisz być bardzo świadomy tego, że
jesteś deklarując go w odpowiednim zakresie.
Nie jesteś wprowadzenie go zbyt mocno wewnątrz nawiasów.
>> Więc pozwól mi rzeczywiście wycofać.
Jeśli wrócimy do naszej np. z wcześniej i idę
powrotem na int, int i = 0; i <10; i + +, a ja
printf zrobić gwiazdy, takie jak to, a następnie zamknij nawias, a teraz
printf i jest teraz -
zgodnie z tą samą logiką, co stanie się, gdy próbuję
skompilować ten program?
PUBLICZNOŚCI: Nieprawidłowy identyfikator.
DAVID J. Malan: Więc jest to kolejny nieprawidłowy identyfikator,
niezgłoszonych identyfikator.
Teraz powód jest trochę inny.
Jest oczywiście nawiasy klamrowe nie tutaj, ale sama
pomysł, sama historia z zakresu zastosowania.
Jeśli zadeklarowana zmienna jak ja wewnątrz
dla pętli, nawet jeśli nie zostały wyraźnie napisane kręcone
szelki, myśleć o nich jako psychicznie wciąż jest tam, gdzie
przypadek i jest ważna tylko wewnątrz pętli for.
To nie jest ważne, gdy dojdziesz do następnej linii, które w
sprawa ta jest obecnie 10.
Więc kilka kwestie zakresu i jak.
Wszystko w porządku, jakieś pytania?
>> W porządku, więc jest to rodzaj trywialnym programem mało,
drukowanie tylko małe gwiazdki.
Ale zobaczmy, czy pamiętasz tę piosenkę tutaj.
To niezwykle irytujące piosenki dzieci, by śpiewać
autobus szkolny i jak.
Ale to, co miłe jest to, że ma tę cykliczność,
przy czym jest to "99 butelek piwa na ścianie,
99 butelek piwa.
Weź jeden w dół, mijamy go wokół, 98 butelek piwa na
ściana. "I wtedy piosenka powtarza 97, potem 96, a następnie
95, potem 94, aż w dół do 0, jeśli rzeczywiście to dostaliśmy
daleko w autobusie.
Więc to jest ładny program, do rodzaju narzędzia, ponieważ my
Boże, jeśli można po prostu wdrożyć to z kilku
linii kodu, można wypluć cały tekst do tego
Piosenka bardzo szybko.
Ale po drodze, możemy zacząć teraz odciąć niektóre
tych podstawowych konstrukcji pętli, a teraz również
wprowadzenie funkcji, które możemy napisać sami, zwracają wartości
że mijamy się.
Ale po pierwsze, dlaczego nie pójść dalej i wziąć nasze pięć minut
złamać tutaj?
A kiedy wrócimy, będziemy śpiewać tę piosenkę.
>> Dobrze, więc jesteśmy z powrotem.
I kiedy mówię teraz będziemy śpiewać tę piosenkę, to znaczy,
programowo, a nie ustnie.
Mamy tu więc beer1.c, który jest jednym realizacja tego
szczególności piosenka.
I żeby było jasne, dla tych, co nie znają
ta sprawa wygląda, pozwól mi iść do przodu
i uczynić beer1, Enter.
Teraz pozwól mi biegać beer1 i co zobaczymy - ile butelek
piwa czy będzie?
Będę pisać w 99, jak mówi piosenka.
Enter.
A teraz, jeśli przewijać -
oops - jeśli mamy przejść przez to wszystko, zobaczymy, że
to rzeczywiście śpiewają całą piosenkę.
Chwileczkę.
Mój pasek przewijania jest trochę pokręcić.
Użyjmy większe okno.
Więc beer1, 99, nie idziemy.
Mamy tu więc całą piosenkę, śpiewaną dużo szybciej
komputer nie mógł być przez nas.
Więc zauważyć jednak, cykliczny charakter tutaj.
Mówi 99, a potem 99, potem "wziąć jeden w dół, przesuń go
okolice ", a następnie 98.
A teraz to powtarza w kółko.
>> Więc to jest rzeczywiście doskonała okazja dla pewnego rodzaju
zapętlenie konstruować.
Zauważ, że jestem rodzaju cięcia róg tutaj.
Zauważ, że mówię "98 butelek piwa na ścianie,
97 butelek piwa na ścianie ", a to było tak
że kiedy dotrzemy do jednej butelki piwa, nie mam
martwić się gramatyki angielskiej.
Ale możemy także naprawić przy odrobinie jeśli
stan, być może.
Jeżeli liczba ta jest w liczbie pojedynczej, śmiało powiedzieć, "butelka",
inaczej, jeśli jest w liczbie mnogiej, np. "butelki".
Ale teraz jestem całkowicie cięcia że rożny.
Zobaczmy więc, co my tu mamy.
Więc mamy kilka uwag na górze.
Jestem w tym te dwie biblioteki, jak
my często było.
A teraz pozwól mi przejść do pierwszego
rzeczywiste linii kodu.
Linia 17 rozpoczyna main.
Linia 21 i 20 ma ile butelek piwa czy będzie?
A potem zadzwonić getInt.
A teraz mam trochę kontroli rozsądku.
>> Więc to jest konwencja, że ​​będziemy teraz rozpocząć przyjęcie do
bardziej rygorystycznie sprawdzać wprowadzane przez użytkownika.
Czasami po prostu nie chce skłonić je ponownie
i znowu, i znowu.
Jeśli użytkownik śruby i nie współpracuje, w porządku.
Zamknij, a po prostu nie radzić sobie z nimi.
A więc to, co ja tu robię.
Jeśli n jest mniejsza niż 1, jestem po prostu krzyczeć na użytkownika,
"Przykro mi, że nie ma sensu." A potem mam zamiar
arbitralnie powrót 1.
Więc jeszcze raz, jest to tylko konwencja, aby się przyzwyczaić.
Na razie, weź to na wiarę.
Ale do tej pory, zawsze byliśmy powrotu 0, ponieważ
mówiliśmy powrotu 0 oznacza co?
PUBLICZNOŚCI: Sukces.
DAVID J. Malan: Sukces, to wszystko.
Więc teraz, że mamy w końcu zaczynają myśleć o
sukcesy - nie-
innymi słowy, przypadki, warunki narożnych błąd -
teraz mam nieograniczoną podaż, lub przynajmniej cztery miliardy
możliwych rzeczy, które mogą pójść źle w moich programach.
I mogę zacząć przypisanie im indywidualnych numerów.
Teraz zazwyczaj wystarczy po prostu wrócić
coś innego niż 0.
Więc będziemy po prostu wrócić 1 teraz.
Ale powód do powrotu 1 jest to, że jak najszybciej powrócić
1, chyba, co dzieje się w pozostałej części programu?
Się zatrzyma.
To jest to.
Tak więc fakt, że wracam 1 jest skutecznie
zwarcie tego programu tak, że wykonanie
nic poniżej linii 27 będzie nadal wykonywany.
Gdy tylko główne zwrotu, jest to, że.
>> W porządku, więc jeśli użytkownik nie współpracują i docieramy linii 30
bo wpisane w słusznej ilości, tu jest mój
wykonanie tej piosenki.
Więc najpierw wydrukować znak nowej linii, tylko dla
estetyka.
Mam teraz na pętli.
I zauważyć robię rzeczy w nieco
w innym kierunku.
Nie mam zrobić mniejszy, nie mam zrobić + +.
Mogę zamiast powiedzieć zainicjowania zmiennej i, ustawić go równa
n, liczba użytkownik wpisze w, a następnie wykonaj następujące czynności, aby
długo, jak jest większe niż 0, i -
Gdy skończysz jeden iteracji tej pętli.
Tak więc możemy liczyć w dół za pomocą pętli for, jak również.
Teraz, to jest dość dużo tygodni jeden rzeczy teraz, z printf.
So print "% d butelek piwa na ścianie." Print "% d
butelki piwa. "" Weź jeden w dół, mijamy go wokół. "Drukuj
"% D butelek piwa na ścianie." Więc to jeszcze d%, ale
zauważyć, że argument printf się zmienia.
Po przecinku, to ja, bo chcę powiedzieć 99.
Po tym przecinkiem, I ja, bo chcę powiedzieć 99.
Po tym przecinkiem, mam i - 1, bo chcę powiedzieć 98 w
Ten pierwszej iteracji, i tak dalej.
A teraz tu, mam tylko jakąś głupią małą uwagę.
A potem linia 42, wracam 0 konwencjonalnie, co oznacza, że
wszystko jest w porządku.
>> Więc co, jeśli goofed?
Jakie mogą być częstym błędem tutaj być?
A co, jeśli przypadkowo powiedział dobrze, chcę się liczyć
w dół do 0, chcę 0 butelek piwa na ścianie?
Więc powiedzieć, że jest większa niż lub równa 0.
Co będzie objawem, że widzę teraz, gdybym przekompilować
beer1 i go uruchomić?
PUBLICZNOŚCI: Negative.
DAVID J. Malan: Tak, to pójdzie negatywna.
To się po jeden błąd, bardzo
Częstym błędem zrobić.
Miejmy rzeczywiście wrócić do okna terminala i to zrobić
tutaj, więc możemy zobaczyć więcej na raz.
Enter, 99 butelek piwa.
Blisko, ale poszliśmy nigdy tak lekko za daleko.
Śpiewaliśmy piosenkę za daleko w dół, tak, że możemy teraz trafić
liczba ujemna.
Więc to nie za bardzo działa.
>> W porządku, więc możemy łatwo naprawić poprzez powrót do
tak to było kiedyś.
Ale co to są pewne możliwości teraz
poprawa?
Cóż, pozwól otworzyć beer2.c i przejdź tutaj i wziąć
spójrz na tej wersji.
Co jest pierwszą rzeczą, która wyskakuje na ciebie jak inaczej
w tej wersji tutaj?
PUBLICZNOŚCI: [niesłyszalne].
DAVID J. Malan: Tak, tak, i nie więcej, bo doszło do
mnie wiesz co, pytam użytkownika o n, a następnie jestem
ustawienie i równa n, a następnie ja zmienia i, ale nigdy nie jestem
dotykając n ponownie.
Więc co do cholery było punktem Ciebie przydzielenie innego 32
bity nazywane po prostu tak, że można mieć inną zmienną?
Więc w tym przypadku, tak jakby uznał, że zbędne
cechą projektu.
I mam teraz powiedzieć natomiast n jest większe niż 0, przejdź
wyprzedzeniem i wydrukować tę samą piosenkę, mijając n do printf jako
Drugi argument, a n - 1 jako drugi argument tutaj.
A następnie na każdej iteracji tej pętli, śmiało i po prostu
zmniejszamy n sam.
Teraz, funkcjonalnie, to program
będzie identyczna.
Jeśli wpisać 99, n rozpoczyna się 99.
I ubytek, ubytek, ubytek, ubytek.
Mam zamiar dostać się aż do "Jedna butelka piwa na
ściana, jedna butelka piwa.
Weź jeden w dół, mijamy go wokół.
0 butelek piwa na ścianie. "Koniec, bo ja
uzyskać stan prawidłowy.
Jest większa niż 0.
Nie popełnij tego błędu.
>> Więc co jest lepsze, w wersji jedno lub wersja dwa?
Słyszałem kilka szemrania za dwa.
Dlaczego dwa?
Co to jest?
PUBLICZNOŚCI: [niesłyszalne].
DAVID J. Malan: Oh, w porządku.
Więc nie będzie schodzić poniżej 0, ale pamiętaj, że w wersji pierwszej,
Oryginalny poprawna wersja nie schodzić poniżej 0 albo.
Więc pamiętaj, że jest to właściwa wersja.
Więc przynajmniej porównać dwie poprawne wersje.
Co jest argumentem na rzecz wersji
dwie są, mmm, lepiej?
Tak?
PUBLICZNOŚCI: Używa mniej miejsca.
DAVID J. Malan: Okay, więc zajmuje mniej miejsca, prawda?
Mając na uwadze, wersja używana 32 bitów dla n, a potem jeszcze
32 bitów dla I.
Wersji tylko dwa wykorzystuje 32 bitów do n, tak że
wydaje się być na plus.
Inne myśli?
Czy ktoś chce się spierać za jeden?
Tak?
PUBLICZNOŚCI: Musisz użyć dodatkowej linii kodu dla n -.
>> DAVID J. Malan: Dobra, na pewno.
Więc to jest fair.
Więc to po prostu, przynajmniej dla mnie -
To znaczy, to naprawdę czuje się trochę Messier, że
Nie można sortować z hermetyzacji wszystkie moje logiki w jednym
piękna linia, dla pętli, jak dla pętli może.
Tutaj, rodzaj muszą halsie na tej n -
na końcu pętli, ponieważ
jest logicznie konieczne.
Ale to rodzaj ściera mnie w zły sposób, po prostu dlatego, że
wydaje się oddzielony od logiki tutaj, nawet jeśli
ponownie, jest to konieczne.
Inne myśli?
Tak?
PUBLICZNOŚCI: [niesłyszalne].
>> DAVID J. Malan: Tak.
Więc co, jeśli zamiast na końcu utworu, chciał
wydrukować ponownie nazwę piosenki?
Like "Dzięki za grę 99 butelek piwa", czy coś
głupi sposób?
Ale chodzi o to, że chcieliśmy dostęp do pierwotnej wartości.
Fakt, że już zmutowane lub zmienione na każdym n
iteracji i dlatego zniszczyli jego oryginalnej wartości
Oznacza to po prostu nie mogę tego zrobić na końcu.
Teraz, prawdopodobnie, wyraźnie nie chce robić
że w tym programie.
Więc kogo to obchodzi?
Ale to jest bardzo ważny punkt.
I szczerze mówiąc, nie ma naprawdę nikt
prawo odpowiedzieć tutaj.
Oboje są równie poprawne.
Mogłem się przekonać, w obu kierunkach.
Muszę powiedzieć, że w ogóle jest to dobra zasada, jeśli
poprosił użytkownika o pewną wartość i przechowywane w zmiennej
jak n, tak jakby na zasadzie, to chyba dobry
zachować to wokół.
Oraz wszelkie dane, które chcesz zmutować ponownie i ponownie, po prostu
dać sobie kopię tej zmiennej, po prostu tak, że
ma dostęp do oryginału.
Spędzasz 32 więcej bitów, ale w rzeczywistości jest to
komputer, jak, dwa gigabajty pamięci RAM, te dni,
i jesteśmy spierając 32 bitów?
Naprawdę nie jest taki duży problem.
A nawet na tym urządzeniu tutaj, z pół gig lub
gigabajt pamięci RAM, 32 bitów kontra 64 bity,
nie taka wielka sprawa.
Oczywiście dzisiaj, to będzie tak przytłoczony wielkością
samego programu, który ma być kilkaset
kilobajtów, jeśli nie kilka megabajtów, te dni.
>> Więc uzasadnione obawy, nikt nie właściwą odpowiedź.
Ale przynajmniej są to myśli, które powinny zacząć
przejść przez twój umysł?
Ponieważ w Pset 0, mimo że tak naprawdę tylko oczekiwać
poprawności, lub przynajmniej zrzeczenia różne błędy, które
jakie mogą się pojawić, jak iść naprzód, projekt jest
będzie to kolejny kluczowy aspekt, zarówno pisanie kodu
a także nasze oceny kod.
I tak przynajmniej zastanowi się takie rzeczy.
I tylko dlatego, coś działa, nie oznacza, że ​​jest dobre,
nie znaczy, że jest dobrze zaprojektowane.
I to jest jedna z rzeczy, stypendystom nauczanie i
zestawy problemów pomoże nam dokuczać udział w czasie.
>> A co, powiedzmy, ta wersja tutaj?
Pozwól mi zrobić coś sexy tu za chwilę.
Pozwól mi najpierw pozbyć się tego.
A teraz naprawić ten problem gramatyczny.
Więc w tej wersji, chcę naprawić gramatykę tak, że
zamiast po prostu powiedzieć nawiasach s, jak "butelki"
lub "butelki" -
Nie chcę, aby wyciąć ten róg -
Chcę również dynamicznie wydrukować słowa "butelki"
lub "butelka", w ten sposób za pomocą tych% s zastępcze dziś.
Więc trzeba sprawdzić, co jest warunkowo wartość i.
A jeśli jest to 1, chcę powiedzieć, "butelka", a jeśli jest to coś
indziej, chcę powiedzieć "butelki". Więc spróbujmy to zrobić.
Więc jeśli i == 1, pozwól mi iść do przodu i deklarują -
Potrzebuję ciąg, więc pozwól mi zrobić ciąg s1, bo to
Pierwszy ciąg zależy mi teraz.
Mam zamiar powiedzieć "butelki". A potem zobaczymy, string
s2 - i postaram się wyjaśnić, gdzie będę za chwilę -
"Butelki". Więc przypomnieć, że w tej piosence, musimy być w stanie
aby wydrukować rzeczy, dwa różne słowa potencjalnie.
Więc jeśli spojrzymy tutaj zauważyć, że gdy mamy do
przykład ten tutaj ", dwie butelki piwa na ścianie,
dwie butelki piwa, weź jeden w dół, mijamy go around ", chcę,
to czwarta linia do teraz powiedzieć "jedną butelkę piwa na
ściana ". Więc muszę podjąć decyzję, chcę powiedzieć" butelki "lub
"Butelka"? Więc wracam do arbitralnie powiedzieć, dobrze,
Idę teraz zadeklarować zmienną s1, ciąg
jeden, który dostanie podłączony tutaj i również tutaj,
bo te słowa są zawsze identyczne, tylko ze względu
charakter utworu.
I mam zamiar zadzwonić s2 cokolwiek słowo chcę
końcu pojawi się tutaj.
Teraz, dosłownie 99 razy na 100, to będzie
sama w obu przypadkach, ponieważ 3 mnoga, 2 jest
liczba mnoga, 4 jest w liczbie mnogiej.
Ale w tym przypadku na rogu, gdzie dostać się do 2 i 1, lub
nawet 1 i 0, potrzebuję tej logiki.
Więc muszę spędzić trochę czasu w moim kodu coraz to prawo.
Więc jeśli mogę to zrobić, jeśli i == 1, a następnie ustaw s1 równe "butelki"
i S2 "równy" butelki, ponieważ będzie to na 1
butelki i to będzie dla 0 butelek.
I to tutaj, co to przedstawia?
Żeby było jasne.
To jest tylko komentarz.
Więc fakt, że można mieć jednego wiersza oznacza komentarz
może wypowiedzieć swój kod tak, ale inny wspólny
paradygmat, zbyt, jest to, że jeśli masz super-krótkie zdanie, które
chcesz umieścić siebie i to jest po prostu bardziej czytelne umieścić
się na samym końcu linii kodu można
absolutnie zrobić coś takiego.
>> Więc co teraz, czy mogę to zrobić? Else if i nie jest równa 1.
Więc huk równa -
Wykrzyknik jest znany jako "Bang".
Więc huk = 1.
Więc jeśli nie jest równa 1, to co mam, a nie chcę zrobić?
Cóż, pierwsze słowo, chcę być, co?
Więc ciąg 1 powinno być "butelki" dla butelek mnogiej,
a następnie będzie to liczba mnoga "butelki", a także, na razie.
I zobaczymy, czy to rzeczywiście ma nas do
gdzie chcemy się udać.
Tak więc jeśli przewiń tutaj zauważyć, że jestem podłączając
Nie tylko ja, ale s1.
Ja podłączając i i S1.
, A następnie na dół, mi minus 1, który jest taki sam, jak
wcześniej, ale S2.
Innymi słowy, chcę angielskie słowo, aby zmienić w oparciu
na tej logiki.
Teraz jest już pewne problemy w tym kodzie.
Co jest złamane już z bramy tutaj?
Tak?
PUBLICZNOŚCI: [niesłyszalne].
>> DAVID J. Malan: Dokładnie.
Więc już naruszone lekcję zakresie.
Tak już zadeklarowane s1 i s2, ale zrobiłem go wewnątrz
nawiasy klamrowe, co oznacza tak, to kod będzie działał do
do linii 42, ale jak tylko uderzyć linii 43, wiecie co nie
już nie istnieje?
No, wiecie, co jest już w zasięgu - ani s1 lub s2.
Więc musimy to naprawić.
Więc pozwól mi usunąć deklaracje.
I zostawię nazwy zmiennych i usunąć to tutaj
i usunąć to tutaj.
A w tym, co tak naprawdę linie powinny zadeklarować te rzeczy?
PUBLICZNOŚCI: [niesłyszalne].
DAVID J. Malan: Tak, więc prawdopodobnie
aż tu, 33-owski.
Więc s1 smyczkowych i łańcuch s2.
I okazuje się, mogę to zrobić.
Jeśli deklarując dwie zmienne tego samego typu,
rzeczywiście można po prostu użyć przecinka i zrobić w C. Wszystkie
Dobra, więc teraz mam dwie zmienne -
S1 i S2.
Jestem przypisując im wartości w tych
Warunki tutaj lub tutaj.
A potem używam je poniżej.
Jak dobrze jest to teraz zadziała?
>> Cóż, to jeszcze trochę buggy, ale niech przynajmniej zobaczyć
jak daleko dotarłeś.
Więc pozwól mi iść dalej i zrobić beer3.
Czy to beer3?
Tak, to jest beer3.
A teraz pozwól mi iść do przodu i uruchamiania beer3.
399 99.
Prawdopodobnie możemy pominąć większość z nich.
A tu, popatrz na to.
"Jedna butelka piwa na ścianie, jedna butelka piwa, podejmują
jeden w dół, mijamy go wokół, 0 butelek piwa na ścianie. "
Ale ja chciałbym zwrócić waszą uwagę tylko połowę roztworu.
Rodzaj wkręca się tutaj.
Tak więc wydaje się, że sprawy narożne powstają, gdy i równa co
dwie wartości?
WIDOWNIA: 2, 1.
DAVID J. Malan: 2 i 1.
To nie 1, a nie 1.
To naprawdę tylko te dwie ostatnie zwrotki tej pieśni.
Więc co mam zamiast tego chcesz?
Tak więc wydaje się, że złapał przypadek jeśli i jest == do 1,
Następnie pierwsze słowo to "butelka", ale drugie słowo
to "butelki". Ale tu, chcę zmienić to za == 2.
A jeśli tak jest, to co chcę
Pierwsze słowo, być?
PUBLICZNOŚCI: "Butelki".
DAVID J. Malan: "Butelki", więc dla dwóch butelek.
A potem to słowo tutaj powinno być -
PUBLICZNOŚCI: "Butelka".
DAVID J. Malan: "Butelka", w liczbie pojedynczej.
>> Dobrze, niech go pomniejszyć, wróć tutaj, aby ponownie uruchomić,
re-run beer3, typ 99 ponownie.
Ok, "Segmentation fault (core dumped)."
Co zrobiłem źle?
PUBLICZNOŚCI: Nie ma wartości [niesłyszalne].
DAVID J. Malan: Ah, doskonały punkt.
Dobra, więc co jest nie tak tutaj?
Więc segmentation fault, a my faktycznie żeby zobaczyć
to kilka razy w przyszłości, świadomie.
Ale teraz, co to właściwie znaczy?
Segmentation fault prawie zawsze oznacza, że ​​masz
jakoś próbował uzyskać dostęp do pamięci, RAM w komputerze,
, że nie jest właścicielem, które nie zostały faktycznie poprosił
system operacyjny dla.
Więc w tym przypadku należy zwrócić uwagę, co zrobiłem, co jest
błędne w mojej logice.
Mam przypisane S1 i S2 wartości jeśli i równa 1.
Ja również zrobić, że jeśli i jest równe 2.
Ale nie zrobiłem go w nieskończonej ilości innych
możliwości -
w szczególności, 3 lub 4 lub kropka, kropka, kropka, 99.
Więc jednym rozwiązaniem tego problemu może być tylko Chodźmy
mają inny stan.
I pozwól mi iść tu i powiedzieć s1 wynosi -
co powinno być tutaj?
PUBLICZNOŚCI: [niesłyszalne].
>> DAVID J. Malan: "Butelki", ponieważ we wspólnej sprawie,
to jest po prostu tak samo.
Więc taniej ofertę, koniec cytatu, "butelki". Więc dla mnogiej
butelek, a następnie tu, do butelek mnogiej.
Ok, więc teraz pozwól mi wrócić do mojego oknie terminala
przekompilować, ponownie go uruchomić.
99.
Uff.
I zróbmy szybki test normalności.
Technicznie, że chcemy czytać wszystko to, aby upewnić
są poprawne, ale spójrzmy na
Najmniej znane winowajcami.
3 butelki, 2 butelki, 2 butelki, 1
butelka, 1 butelka, 0 butelek.
Zdaje się, że co najmniej ustalone to teraz.
Ale jest haczyk tutaj jest to, co Bóg jest straszny bałagan
tylko do rozwiązania głupi
jedna postać gramatyczna szczegół.
Więc jest rodzajem powodu, że cięcia tego narożnika
wcześniej, bo to po prostu całkowicie irytujące mieć do
napisać tyle kodu.
Ale okazuje się, że jest nieco bardziej eleganckie sposoby
wyrażając dokładnie to samo.
I możemy zrobić to w następujący sposób.
>> Pozwól mi zostawić to na ekranie przez chwilę, a
wprowadzić coś zwanego operatora trójskładnikowych.
To jest rodzaj jednolinijkowych, które właśnie po to, by nasze
Mieszka trochę bardziej seksownego, jak obiecałem.
I mam zamiar to zrobić w następujący sposób.
Daj mi ciąg nazwie s1, i niech mnie
przypisać to w następujący sposób.
(I == 1)?
"Butelka", inaczej "butelki". String s2 ma (i == 2)?
"Butelka", inaczej "butelki".
Więc co wtedy jest różnica tutaj?
Te dwa wiersze kodu, twierdzę, może
wymienić cały ten bałagan.
Więc ja nazywam to bałagan, tylko dlatego, że to niby ja ściera
niewłaściwy sposób, że jest tak wiele linii kodu.
Nie tak.
To nie jest zły projekt.
Podoba, to jest całkowicie poprawne i idealnie czysty.
Ale kodowanie staje nudne, jeśli masz wyrazić siebie tak,
cholera specjalnie znowu i znowu i znowu prosta
scenariusz jak ten.
Więc C ma pewne skróty, jak ten.
Więc to w istocie mówi zadeklarować ciąg nazwie s1 oraz
przypisać go albo ten lub wartość to wartość jeśli i jest == -
Przepraszam, powinienem powiedzieć to jaśniej.
Zadeklaruj zmienną s1, przypisać mu tę wartość, jeśli to prawda.
W przeciwnym razie, przypisać mu tę wartość.
Tak więc inaczej mówiąc, jest to rodzaj Jednowierszowy drodze
mówiąc, jeśli inny, ale robi zadanie po drodze.
Więc jeśli jest 1, a następnie iść do przodu i nazywają to "butelkę". I
wtedy ten inny, nazywamy to "butelki". Tymczasem, S2,
Drugie słowo, że musimy określić, czy i jest równe 2, dowiemy
ustawić s2 do "butelki". W przeciwnym razie ustaw ją na "butelki". A co
oznacza to, że teraz to mogę przejść przez to i usunąć wszystkie
te linie kodu.
I kiedy mówię, trochę śmiesznie, że to jest teraz
seksownego, jest bardziej seksownego w rodzaju stylistycznej sensie.
Fakt, że funkcjonalnie, ten kod faktycznie się
zrobić dokładnie to samo.
I choć może to wyglądać dość tajemniczy w pierwszym
rzut oka, bo nie widziałem tego konstruktu wcześniej, że
twierdzą, że to ostatecznie będzie dużo więcej
czytelny i tak o wiele łatwiej my ludzie do rodzaju
zrozumieć, bo teraz można tylko przeczytać
Kod wszystko na jednej linii.
Jest wciąż w duchu podobnym do jeśli, gdzie jest to
stan i to jest to, co jest wewnątrz, czy i ta
jest to, co znajduje się wewnątrz innego.
Ale możemy zrobić to po prostu znacznie bardziej elegancko.
>> I jeśli teraz wrócić do mojego terminala, po usunięcia wszystkich
z tych wierszy i zastąpiła je tylko tych dwóch,
przekompilować ponownie uruchom butelki piwa z 99, zawiadomienie, że moje
Gramatyka jest w rzeczywistości nadal poprawne.
Więc jeszcze raz, coś zacząć.
2 butelki piwa, 1 butelka piwa.
Wygląda dobrze.
Tak.
Więc nie mamy o wiele więcej rozwiązań zwięzłe.
Więc to też, jak można dostać się bardziej komfortowo z C, nie
koniecznie z pierwszego lub nawet Pset sekundę, ale
sobie sprawę, że te konstrukcje pozwala nam robić rzeczy nigdy
bardziej elegancko.
Teraz zróbmy jedną rzecz tutaj.
Pozwólcie mi iść do przodu i otworzyć return1.c.
Teraz zacznijmy rozwiązać kolejny problem w sposób, który
pozwala nam napisać bardziej wyrafinowany kod.
>> Tak tu jest prosty mały program, którego celem w życiu
jest przyrost wartości.
I faktycznie, weźmy się o krok.
Pozwól mi to zrobić ręcznie.
Pozwól mi zrobić to i int main (void).
I niech mnie nazywają to increment.c.
I co chcesz zrobić?
Mam zamiar iść do przodu i powiedzieć coś w stylu -
będziemy łączyć się z numerami same -
int x.
Więc int x dostaje 2 printf x jest% d, nowa linia, x.
Więc piszę szybko, ale jakby znajome rzeczy teraz.
Potem zrobię x + +.
Potem idę do wydrukowania tego samego zdanie ponownie.
A potem mam zamiar wrócić 0 tylko, aby zamknąć program.
W porządku, więc jest to program, który
zwiększa liczbę.
To pierwszy zamiar zainicjować coś do 2, a następnie jest
zamierza zwiększyć ją i wydrukować go ponownie.
>> Więc uruchom przyrost, niezwykle prosty program.
Ale załóżmy, że teraz chcę kostka wartość, więc nie
coś nieco arbitralne.
I właściwie chcesz robić x dostaje kostkę to.
Mogłem więc wykorzystać to, co się nazywa funkcję pow, ale ja nie
bardzo wiem, gdzie to jest jeszcze.
Więc mam zamiar to zrobić w staromodny sposób.
x razy to równa x razy x razy x.
Więc jestem cubing wartość, mnożąc je przez siebie ponownie
i znowu, i znowu, tak, że mamy władzę
3 w tym przypadku.
Więc teraz numery powinienem wydrukować powinno być, jak zobaczymy
tutaj - aby przyrost, więc jest to rzeczywiście nie bardzo zwiększamy
więcej, ale zostawimy nazwę sam -
2, a następnie 8.
Teraz, mamy początki okazję do udoskonalenia
tu, przy czym ta cubing rzeczą mnożąc liczbę
sama sama sama czuje się jak to może być
przydatne w funkcji, podobnie jak ktoś zdecydował
lat temu - wiesz, trochę przydatne, gdy jeden z nas siada
printf i pisze tak, że reszta świata może go używać,
dlaczego nie możemy usiąść i napisać funkcję o nazwie cube
że robi to cubing za nas więc nie trzeba ręcznie
wdrożenie pojęcia cubing wartości tutaj?
>> Tak prosty przykład, ale idziemy do przodu i to jest tak korzystać
okazja do napisania własnej funkcji.
Tak więc do tej pory, mamy tylko używane głównym i użyliśmy innego
funkcje ludzi, ale nie napisali sami.
Tak więc zaczynamy.
Mam zamiar iść do przodu i napisać funkcję o nazwie sześcian.
A ja będę musiał podjąć wejście.
Więc jego wkład będzie liczbą całkowitą.
A co to robić?
To będzie zadeklarować int wyjście razy = input input
Wejście razy.
A potem to się zwróci ten wynik.
I wtedy muszą być szczegółowe teraz.
Ta funkcja będzie zwracać int.
Więc czym jest to, jak chcesz pisać własne funkcje.
Najpierw zdecydować, co jest nazwą pliku
Funkcja będzie.
I generalnie, coś wyjaśniający jest dobre, więc będę
Nazywamy to sześcian.
Następnie trzeba określić, co to będzie wracać, co
jego produkcja będzie.
I nie mamy, że wiele opcji jeszcze.
Int, char, float, bool, string.
Na razie mam zamiar trzymać się z int, bo chcę go
zwraca liczbę całkowitą.
Następnie trzeba określić, co jej wejść, jeśli w ogóle, są.
A jeśli kostka pobiera argument, bierze coś pomiędzy
nawiasów, trzeba dać, że argument nazwę tak, aby
można nazwać to coś jak jesteś wykonawczych lub zapisu
ta funkcja, i trzeba dać mu typu, które w tym
Sprawa ma być int.
Tak w skrócie, kostka jest funkcją, która pobiera liczbę całkowitą
jako wejście i zwraca liczbę całkowitą jako wyjścia.
>> Więc co zrobić z tym wejściem?
Cóż, w wierszu 14, oświadczam zmienną wyjścia, a ja
przypisać mu wartość, razy razy wejście sygnału wejściowego.
A potem powrót wyjście.
Więc jak mam to wykorzystać potem?
Co mam zmienić te podświetlone znaki na linii
7 jest, jak myślisz?
PUBLICZNOŚCI: [niesłyszalne].
DAVID J. Malan: Tak, więc kostka x.
Tak więc x jest zmienną, która oznacza, że ​​posiada pewną wartość.
Na szczęście jest typu INTEGER.
A ponieważ x jest int, co oznacza, że ​​można przekazać go w kostkę.
I mimo, że jestem przesłanianie wartość x z wartością
x, kostki, jak to miało miejsce do tej pory, za każdym razem po
mają znak równości i linii kodu, stuff na prawo
zostanie wykonany, a następnie zostaje przypisany do
wartość po lewej stronie.
Więc kolejność operacji jest jak mamy nadzieję.
Tak to działa?
Cóż, pozwól mi iść na dół.
Pozwól mi otworzyć moje okno terminala.
Pozwól mi robią przyrost, Enter.
"Ukryty deklaracja funkcji" kostki "jest nieważne
C99. "Tak na marginesie, C99 nawiązuje do języka C, jak to było
zdefiniowane w 1999 r., co było aktualizacja na wersji z
1989, który jest aktualizacja od oryginału.
Więc to wszystko znaczy.
>> Więc co to znaczy, że "niejawna deklaracja
funkcja "kostka" jest nieważne? "To właśnie tu.
Jest tam w linii 12.
PUBLICZNOŚCI: [niesłyszalne].
DAVID J. Malan: Co to jest?
PUBLICZNOŚCI: To nie przed.
DAVID J. Malan: To nie przed.
Więc to jest sprawa.
C jest głupie, czy kompilatory C są głupie.
Oni naprawdę tylko to, co powiesz im zrobić.
I, w szczególności, tylko czytać górę Kod do dołu,
od lewej do prawej.
Więc jeśli kompilator Clang, odczytuje kod, linia 1, to
domyśla się, jak to zrobić.
O, tutaj jest głównym.
Okay, niech śmiało zadeklarować zmienną x.
Pozwólcie mi drukować coś.
Linia 7, co do cholery jest kostka?
To nie jest zadeklarowane w stdio.h.
Nie pochodzi z C. Nie mam pojęcia, co robić.
I tak właśnie Clang bails i kończy z tym komunikatem o błędzie.
Więc możemy to naprawić w kilka sposobów.
Możemy uczyć dzyń co kostka jest po prostu przeniesienie gdzie
deklaracja jest.
Więc cięte i wklejony na szczycie głównej.
Sobie sprawę, że tylko dlatego, że nie jest już głównym pierwsze, to
nadal wykonywana domyślnie.
Main jest głównym.
Jest to nazwa funkcji domyślnie.
To nie ma znaczenia, gdzie to jest w pliku.
Ale przynajmniej teraz Clang widział kostkę przed użyciem.
Zobaczmy więc, czy Clang jest szczęśliwszy teraz.
Producent przyrostu, to nie skompilować ten czas.
>> Pozwólcie mi biegać przyrost.
I rzeczywiście, wydaje się, że działa.
Teraz można wymyślić scenariuszy gdzie ostatecznie
to nie jest możliwe, aby umieścić wszystkie funkcje
ponad wszelkie inne funkcje.
Będziesz utknąć w tej nieskończonej pętli w rzeczywistości,
gdzie ten facet chce być tutaj, ale to
facet musi tam być.
Tak, że nie zawsze działa.
Więc na szczęście, C ma bardziej eleganckie rozwiązanie.
Mam zamiar umieścić ten tył gdzie to było, tylko dlatego, że
wolą, jako zasady, że zawsze będzie głównym
na górze, bo to jest po prostu miło jest zobaczyć, co ten program
ma domyślnie.
I co ja zrobię tu jest stwierdzenie, co nazywa
prototyp.
Mam zamiar ponownie deklaruję funkcję kostki przez dosłownie
kopiowanie i wklejanie.
Właściwie, to nie dosłownie.
Tak dosłownie kopiując i wklejając linię 15
się powyżej linii 6.
To nie ma znaczenia, co linia ta kończy się na.
To dzieje się na linii 4.
Ale to nie musi być przed main.
Ale zauważyć różnicę.
Linia 4 kończy się średnikiem, co oznacza, hej,
Dzyń, daję słowo, że istnieje funkcja
zwany sześcian, że trwa int i zwraca int.
Ale ja nie zamierzam ci powiedzieć, co to jest.
Wystarczy wiedzieć, że obiecuję ci powiedzieć ostatecznie.
I rzeczywiście, teraz to jest w porządku, że to jest na dole.
>> Tak więc jest to na ogół lepsze, ponieważ wtedy w górnej
Twój plik, można po prostu wyklepać, szybkiego ognia, jedna linia
każda, co nazwy swoich funkcji to, co ich
Wejścia są, jakie są ich wyniki są.
I być bardziej jasne, wejście na ogół oznacza argument lub
parametr, synonimami.
Wyjście oznacza wartość zwracaną, co robi
ręka z powrotem do mnie.
Tak więc w tej sprawie, kostki uznano na górze, ale
określone, inaczej znany jako realizowane, na dole.
Więc teraz wróćmy tu i ponownie uruchomić to.
Więc teraz pozwól mi iść do przodu i ponownie uruchomić make, ponownie uruchomić przyrost.
A teraz wydaje się działać dobrze.
Tak więc możemy śmiało i czynnik poza czymś
piwo przykład do czwartej wersji.
Więc pozwól mi przejść tutaj.
I zauważyć, że rodzaj wziął tę lekcję do serca właśnie teraz.
Fakt, że śpiewała tę samą zwrotkę ponownie i
znowu i znowu, ta sama linia refren w piosence, filcu
lubię Dlaczego nie czynnikiem obecnie do funkcji?
I rzeczywiście, to powinien być jeden z motywów.
Poza tym, że ktoś inny na świecie, który może zostać
użyć funkcji kostki -
To dobry powód, aby uwzględniać coś i napisz
własna funkcja niestandardowa -
jeśli jest kawałek kodu w programie, że po prostu sprawia, że
koncepcyjne poczucie, że jesteś rodzaju chcą dać
name - jak w tym przypadku, chóru -
Następnie można dodać, że podobnie jak w oddzielnych funkcji.
Nie musisz pisać wszystko, co w głównym, jeśli tylko
czuje cleaner oddzielić je i nadać mu nazwę.
>> Więc w tym przypadku tutaj zauważyć, że mam komentarza na szczycie
ta funkcja po prostu śpiewa o
określone liczby butelek.
Zauważcie, że nie ma potrzeby wywoływania tych
rzeczy, wejścia i wyjścia.
W rzeczywistości, tym razem po prostu zadzwonił do mojego B Wejście do butelki.
I tutaj odnotować, void sugeruje co?
Że chorus -
PUBLICZNOŚCI: Nie zwrócić.
DAVID J. Malan: nie zwraca wartości.
I rzeczywiście, funkcje nie muszą zwracać wartości.
Oni po prostu mogą coś zrobić.
Mogą mieć tak zwanych efektów ubocznych, które w tym
Sprawa jest po prostu cała masa drukowania na ekranie.
Więc zauważyć, że ten kod tu, dosłownie ukradł
w poprzednim przykładzie.
Jedyną różnicą jest to, a nie za pomocą I, jak my
zmienna, Obecnie używam b jako mojego zmiennej.
Więc mam b tu, mam tu b, mam b
minus 1 tutaj.
Ale kod jest dokładnie taka sama.
Ale tak, aby pokazać, w jaki sposób możemy teraz korzystać z tego, pozwól mi odejść
dalej i faktycznie zmienić to być na pętli.
for (int i = n; i> n; i -).
>> Więc ukradli, że z naszego poprzedniego przykładu.
Wcześniej, to w wierszu 37, że zacząłem
śpiew ten przykry piosenkę.
Ale zamiast tego, jestem po prostu będzie teraz zadzwonić chór i.
Gotowe.
Więc teraz, w każdej iteracji tej pętli, nazywam to inne
Funkcja, chorus, że zdarzyło mi się pisać.
To nie zostało napisane przez kogoś innego, rok temu.
Ale refren, tymczasem wykorzystuje printf do drukowania
z tych czterech linii.
Ale fakt, że dzwonię chór ponownie w
pętli oznacza, że ​​mam zamiar dostać, na samym końcu,
dokładnie ten sam utwór, jak mam do tej pory.
Tak w skrócie, teraz, gdy patrzę na mojego kodu, choć
funkcjonalnie jest to równoznaczne, zauważ, że jest to
zaczyna się jeszcze bardziej czytelne.
I nie wiem dokładnie, jak getInt
jest realizowany.
Szczerze mówiąc, nie wiem, jak refren jest zaimplementowana.
Ale to nie ma dla mnie znaczenia.
Nie obchodzi mnie to, bo teraz mogę w pewnym sensie, jako człowiek, przeczytaj
to od góry do dołu.
A ponieważ funkcje te są nazywane zgodnie z tym, co
nie, mój kod jest coraz bardziej czytelny.
I jak nasze programy uzyskać znacznie bardziej skomplikowane -
przez koniec semestru, będziesz pisać setek linii
kodu w językach takich jak PHP i JavaScript i podobne -
przekonasz się, że to o wiele łatwiejsze niż śledzić
co zrobiłeś.
A kiedy rozpocznie współpracę z przyjaciółmi lub
partnerów lub współpracowników, będziesz w stanie napisać dużo więcej
masywne programy zaczynając wykonywać te podstawowe
bloki.
>> Więc z tym powiedział, dlaczego nie nazwać to dzień?
I będziemy widzieć w środę.
[Aplauz]