SPEAKER 1: W porządku. Witamy z powrotem. To jest Tydzień Dwa CS50 i mamy dotychczas funkcji, ale był używany w dużym stopniu wziąć je za pewnik. Użyliśmy printf, która ma Efektem ubocznym drukowania rzeczy na ekranie. Użyliśmy get-int, dostać unosić. Ale co, jeśli rzeczywiście chcemy stworzyć własne funkcje, jak niektóre może już się rozpoczęły zrobić dla zestawu Problem One, choć nie absolutnie konieczne? Cóż, idziemy do przodu i ponownie, że Problem zadaje użytkownikowi na Nazwa i drukowanie ich na coś ekran, ale starają się uwzględniać się niektóre o wspólności, że mamy widać w naszym kodzie tej pory. Więc mam tu na myśli następujące. Mam zamiar iść do przodu i tworzyć Nowy program, wystarczy zadzwonić to hello.c jak zwykle. Mam zamiar iść do przodu i dać sobie zawierają standardowe io.h na górze. Zamierzam też dać sobie preemptively CS50 biblioteki, tak aby I nie daj się krzyknął przez kompilator. A teraz mam zamiar iść do przodu i zadeklarować int, główny, nieważne. A potem tu, to tam, gdzie chcę rozpocząć outsourcingu funkcji do inna funkcja, że ​​ja sam jestem zamiar napisać, ale to nie obecnie istnieje. Na przykład, załóżmy, że chcę napisać funkcję, która pozwala mi wydrukować Witaj, przecinek, i następnie niektóre nazwa użytkownika. Zamiast kontynuować zrobić printf hello,% s, nie byłoby miło, gdyby było po prostu nazywa funkcja nie printf ale nazwa print? Tak więc, innymi słowy, że chce móc napisać program, który robi trochę coś takiego. Po pierwsze, mam zamiar powiedzieć printf Państwa Nazwa, co skłania użytkownika do daj mi swoje imię, a następnie jestem zamierza wykorzystać znane s string do Oświadczam ciąg. Daj mi zmienną typu string, Nazywamy to s, i przechowywać w które wyniku wywołania uzyskać ciąg. Ale teraz w tydzień ostatnich, musiałbym nieco mozolnego zrobić hello,% s / n. A to znaczy, widzieliśmy to przykład kilka razy, i to trywialny przykład, ponieważ jest tylko jeden linii kodu, więc to naprawdę nie jest big deal zachować wpisując ponownie. Ale załóżmy, że ta linia kodu rzeczywiście stawały się ciężarem, a nie jedna linia kodu jest, ale to 10 linii kodu kilka tygodni od teraz, i jesteś po prostu zmęczenia kopiowania i wklejania lub przepisywania tego samego kodu. Czy nie byłoby miło, zamiast robić printf hello,% s, i tak dalej, Czy nie byłoby miło, gdyby były tylko Funkcja o nazwie print, że nazwa przyjmuje argument - innymi słowy, zajmuje wejście - i średnik. Tak, że funkcja, prawda Bądź miły, jeżeli istnieje? Wtedy nie będę musiał martwić się o co printf to, co% s, a wszystkie te zawiłości, które są nie wszystko, co ciekawe. Są one użyteczne. Więc nazwa print, niestety, nie było wynaleziony jakiś 40 Plus lat temu. Nikt nie pomyślał, aby napisać. Ale to piękno ma język programowania, tak jak w Scratch można zdefiniować własne bloki, więc w C i najbardziej każdy język, prawda zdefiniować własne funkcje, może zdefiniować własne funkcje. Więc nawet jeśli mamy głównie przez automatycznie za darmo, możemy zadeklarować nasze własne funkcje. Więc mam zamiar zrobić trochę miejsca tutaj do góry, i mam zamiar zadeklarować moje własna funkcja, która będzie wyglądać trochę dziwne, ale w pierwszym wrócimy powrót do tego niedługo. I powiem nieważne, co wskazanie tej funkcji nie coś, ma efekt uboczny, ale nie zwraca mi coś w sam sposób uzyskać int lub uzyskać ciąg sam robi. I mam zamiar dać tej funkcji wymienić nazwy wydruku i mam zamiar określić, że ten facet ma zamiar wziąć ciąg, i mam zamiar zadzwonić, że Nazwa ciągu. Mogę nazwać to na co mam ochotę, ale chce mój kod na własny dokumentowania. Innymi słowy, jeśli jedna z miały otwórz ten plik i go przeczytać, mógłbyś rodzaj wywnioskować z nazwy, które Wejście jaką rolę miało grać. A teraz poniżej, mam zamiar otworzyć nawias klamrowy i zamknięty nawias klamrowy, i tak zauważysz I już po same wzór na linii cztery przez siedem, jak Śledzę na dobry tydzień powiększonej teraz między, powiedzmy, linii dziewięciu i 14, które tworzą główną. Innymi słowy, należy wydrukować nazwę jest inna funkcja. Teraz, kompilator nie będzie wiedzieć nazwać tę rzecz automatycznie bo dosłownie wymyślił, ale to wiem jeszcze zadzwonić głównym automatycznie, a następnie oczywiście w linia 13, wzywam własną funkcję. A ponieważ ja oświadczył, że funkcja się na linii czterech przed głównymi, to będzie uczyć kompilator co cytat cytatu, "nazwa print" Oznacza to, i to, co powinna zrobić. Więc jestem jakby dając mu nowe, niestandardowe zablokować w kontekście, powiedzmy, Scratch. Więc tutaj, mogę umieścić, że bardzo często lub powtarzające wzór kodu trzymam pisania w klasie, printf % S hello,% s / n ", - co chcę umieścić tutaj? S? Tak, chcę, aby umieścić nazwisko w tym kontekście. Więc zauważyć trochę dychotomii tutaj. Ponieważ jestem deklarując własną funkcję i ja nieco arbitralnie nazwie drukować nazwę, a ponieważ mam podano w nawiasach, że ta Funkcja przyjmuje jeden argument, typ który jest string - więc jest to słowo lub zwrot lub coś w tym stylu - i Dzwonię, że nazwy argumentu, że Oznacza to, jedyną zmienną, która jest w Zakres, że tak powiem, to nazwa. S istnieje tylko między tym, co dwa nawiasy klamrowe, oczywiście? No naprawdę, podobnie jak linii 10 przez 14, tak samo jak w poniedziałek, nie można używać S, ale co mogę zrobić, to przekazać S pod nazwą wydruku. Wydrukuj nazwa tak się dać to alias, synonimów, pseudonim, nazywając to imię, a teraz używania go w tej pozycji. Więc teraz chciałbym zapisać to, pomniejszyć. Pozwólcie mi iść do przodu i robić cześć. Wygląda dobrze. Nie wypluć żadnych błędów. . / Hello Enter. Jak się nazywam? David. I cześć David. Tak więc nie wszystko, co ciekawe, ale po prostu, że teraz. Teraz masz ten sam składnik jak my w Scratch do zrobić własne funkcje. Ale jest trochę haczyka. Załóżmy, że tak naprawdę nie myśli to przez i rzeczywiście bez naprawdę myśli o tym napisał że funkcja tutaj. Czuje się całkowicie uzasadnione. W Scratch nie istnieje pojęcie z lokalizacją w skryptach. Możesz umieścić jeden tu, jeden tu, jeden tutaj, a to może zacząć wyglądać trochę bałagan, jeśli nie położyć go porządnie, ale tak nie jest znaczenia, gdzie fizycznie skryptów się na ekranie. Niestety w C - i to jest w przeciwieństwie do w językach takich jak Java i Python i inne, które możesz znać z - niestety w C, aby nie znaczenia, bo co to watch wydarzy się teraz. Funkcja domyślnie, że będzie do wykonania jest oczywiście głównym. Main będzie zadzwonić nazwę druku na linia osiem, ale niestety, kompilator nie wie nawet, że nazwa druku istnieje, dopóki nie dotrze do linii 11, co niestety jest będzie za późno. Więc robią komentarzy. A teraz, cholera, dwa błędy generowane. Więc teraz chciałbym przejść do bardzo po pierwsze, jak zawsze powinniśmy robić, a Zauważ, że to na mnie krzyczeć, "Niejawna deklaracja funkcji wydrukować imię. " Więc widziałem tę wiadomość przed, niejawna deklaracja funkcji. Kiedy widzieliśmy ten rodzaj błędu? Kiedy nie to biblioteka. Jeśli zapomniałeś cs50.h i chciałbym uzyskać krzyknął do uzyskać ciąg lub uzyskać int. Jednak w tym przypadku, ta funkcja druku nazwa nie jest w bibliotece, prawda? Jest to dosłownie w tym pliku, więc co tak naprawdę chodzi? No niestety w C, przejście tak bardzo dosłownie, że jeśli chcą funkcję o nazwie nazwa wydruku istnieje, trzeba albo wprowadzić które działają na samej górze kod tak, że jest dostępna w celu obniżenia funkcje, ale szczerze mówiąc, to staje się byle szybko. Osobiście lubię kładąc główny pierwszy bo to jest bardzo jasne, co to Program ma na pierwszy rzut oka. A Plus, można dostać się do dziwnej rogu przypadki, w których, jeśli x chce zadzwonić y, ale y mogą nazwać x, po prostu fizycznie nie może faktycznie umieścić jeden nad drugim. Okazuje się jednak, w C, może się rozwiązać ten problem w bardzo prosty sposób. Mam zamiar umieścić trochę miejsca tu, a ja po prostu się zapobiegawczo, choć nieco nadmiarowo, nauczy kompilator, że istnieje funkcja nazywa nazwę druku, która przyjmuje ciąg znaków, i mam zamiar zadzwonić to nazwać średnik. Tak to się teraz w kolejce cztery, które nie widział, jest deklaracja z nazwy wydruku funkcji, ale to tylko Obietnica, że ​​funkcja ta będzie ostatecznie określone, w końcu być realizowane. To teraz mogę zostawić w spokoju, bo teraz jest to definicja, realizacja, rodzaj ostatniej mili realizacji tego dana funkcja. Tak szczerze, że to głupie, to irytujące, , ale w ten sposób C, a to ponieważ zajmuje się bardzo dosłownie i, jak komputer szczerze powinien, tylko nie dokładnie to, co możesz powiedzieć, że do zrobić i tak, że kolejność jest ważna. Miejcie to na uwadze, i jeszcze raz, zacząć zawiadomienia powtarzaniu wzorów. Kursy to będzie, jeśli nie mają już zaczynają napotkać komunikaty tak, że na pierwszy rzut oka wydaje całkowicie tajemnicze, ale jeśli zaczniesz szukać tych kluczowych słów jak "Niejawna deklaracja," wspomina funkcja w tym przypadku - i szczerze mówiąc, to czasem nawet się trochę zielono symbol marchewka, który mówi, gdzie problem prawdopodobnie jest - możesz zacząć pracować na swój sposób poprzez jeszcze niewidoczne komunikaty o błędach. Wszelkie pytania na temat pisania własna funkcja w ten sposób? Zróbmy coś, co jest trochę bardziej przekonujące. Zamiast po prostu zrobić coś, co ma Efektem ubocznym drukowania, pozwól mi odejść dalej i zapisać nowy plik, a my będziemy Nazywamy to positive.c, choć to będzie trochę inaczej w porównaniu do ostatniej chwili. I tym razem, chcę, aby ponownie wprowadzić ostatni raz w positive.C przykład, który jest zmuszają użytkownika uzyskując mnie dodatnia. Ale musiałem użyć dostać int ostatni. Czy nie byłoby miło, gdyby nie było Funkcja o nazwie uzyskać pozytywną int , że mogę po prostu zlecić to kawałek funkcjonalności? Więc różnica polega my będziemy wdrożenia uzyskać pozytywną int, ale w przeciwieństwie do Nazwa druku które wystąpiły działania niepożądane - to nie wrócił do mnie jak coś liczba lub ciąg - uzyskać pozytywną int jest, oczywiście, będzie wrócić, mam nadzieję, pozytywny int. Więc zróbmy to. Dołącz cs50.h, zawierać standardowe io.h. Int main pustkę. A teraz tutaj, mam zamiar iść do przodu i powiedzmy, int, nazywamy to n, jest równa uzyskać pozytywną int. I jak uzyskać int już istnieje ponieważ pracownicy to napisał, mam zamiar założyć na chwilę, że dostać pozytywne int istnieje, a teraz mam zamiar pójść dalej i powiedzieć, printf, dzięki za% i / n ", n. Więc teraz, jeśli mogę skompilować ten program, co będzie się działo w moim terminalu Okno w dolnej części ekranu? Będę prawdopodobnie się, że sam błąd jak wcześniej. Więc spróbujmy. Bądź pozytywny. I znowu, niejawna deklaracja funkcji, uzyskać pozytywną int. Tak więc możemy rozwiązać ten problem w kilka sposobów. Zamierzam zachować proste i po prostu umieścić moje oświadczenie tutaj i uzyskać pozytywne int. Muszę tak zwany podpisem. Podpis tylko odnosi do estetyki Pierwsza linia programu. Więc co należy uzyskać pozytywne int powrót? Więc int. Chodzi mi najlepiej, to powróci coś pozytywnego int, ale to nie istnieje. Nie widziałem, że wśród naszych danych typy, więc mamy do czynienia z Fakt, że mamy bardzo mało typy danych do pracy. Ale możemy powrócić int i tylko Wierzymy, że będzie ona dodatnia. To będzie się nazywać uzyskać pozytywną int. A teraz, jak o swoich argumentów? Czy to odbiera żadnych danych? Czy potrzebujesz żadnych danych? Więc to nie musi wiedzieć w nic zaliczki. Pobierz ciąg nie, dostać int nie. Printf nie - to musi mieć jakiś Wejście przeszedł w tym - i nazwa print potrzebne jakieś wejście, ale się pozytywne int nie. Więc mam zamiar wyraźnie powiedzieć pustkę kompilatora. Pustka jest brak czegokolwiek innego. Więc nic nie oznacza nieważności dzieje wewnątrz z tych nawiasach, średnik. I teraz w głębi pliku - i ponownie, jestem po prostu rodzaj anal o wprowadzenie głównym u góry, które jest dobra praktyka, ponieważ ten sposób, w dowolnym momencie lub kogoś innego otwiera plik, funkcjonalność jest właśnie tam. Można nurkować od punktu wyjścia. Więc teraz będę powielać tego, uzyskać pozytywną int pustkę, ale nie jestem uderzy średnik teraz. Zamierzam otworzyć nawiasy klamrowe, i teraz muszę pożyczyć kilka pomysłów od poniedziałku. Tak jak pamiętam, że zrobił coś jak wykonać następujące czynności podczas coś, co było prawdą. I co mam zrobić? Zrobiłem coś takiego dać mnie dodatnia, trochę zachęty. Można używać żadnych słów, które chcę. A potem użyłem co? Int n równa się dostać int, żadne argumenty do niej. I zauważyć różnicę. Po wywołaniu funkcji, gdy używasz funkcja, nie umieścić w próżni. To zrobić tylko, że podczas deklarowania Funkcja, ucząc kompilator, co należy się spodziewać. Więc nie trzeba umieścić unieważnić tam samemu. A teraz to, co mój stan? Również, n nie jest równa pozytywne, ale to tylko pseudo-code. Więc jak mam wyrazić to czyściej? Tak więc mniejsza lub równa zeru. Więc znowu, zauważyć można zrobić mniejsza lub równa. Mimo to dwa oddzielne symbole, można to zrobić na klawiatura jako takie. Ale wciąż jest błąd, który I wkręca się ostatnio zbyt. Muszę oświadczyć - dokładnie. Muszę oświadczyć n zewnątrz z pętli. Więc muszę umieścić n tutaj, a ja nie chcesz ponownie zgłosić go tutaj bo mam nową zmienną. Chcę tylko, aby przypisać wartość tutaj. I teraz nie jestem dość zrobić tutaj. Niech mi przed siebie i udawać, że jestem skończony. Bądź pozytywny, a teraz nowe error. Kontrola osiągnie koniec non-void funkcja. Tak więc nowy komunikat o błędzie, ale jeśli rodzaj z odciąć każdego słowy prawdopodobnie aluzja do tego, co się stało. Kontrolować. Kontrola oznacza po prostu do porządku operacji w programie. Komputer znajduje się w kontroli i coś poszło nie tak. Tak więc dochodzi do końca non-void funkcja. Jaka funkcja jest najwyraźniej dotyczy? Jaka funkcja nie jest nieważne? Więc pozytywny int, i trochę mylące, że dobrze, jest to rodzaj pustki. Ma specyfikację pustki dla jego argumenty, ale jego produkcja będzie być n typu. Więc słowo po lewej stronie jest tzw. typ zwracany. Słowo wewnątrz tutaj jest na zero lub więcej argumentów że funkcja przyjmuje. Więc co muszę zrobić? W tym momencie w moim kodu, linia 21, w którym miga prompt to, że pozytywnie int wewnątrz zmiennej o nazwie n. Jak mogę go oddać do main? Dosłownie. Powrót średnik n. Więc tak jak Colton wrócił kawałek papieru z odpowiedzią na mnie przez upuszczenie że kawałek papieru w małej czarnej pudełko na stole, do tego w Kod, dosłownie po prostu napisz, powrót n, i to tak, jakby były Colton wręczając mi coś fizycznego pleców. W tym przypadku, co się dzieje, to dostać pozytywne int będzie do przekazania z powrotem co zapewne pozytywnie całkowita do kogo? Skąd ta wartość skończyć? Które kończy się w tej zmiennej, N, i potem kontynuować linii dziewięciu. Tak więc, innymi słowy, aby z operacje, program ten zaczyna wykonania, a kompilator sobie sprawę, oh, chcesz bibliotekę? Puść mnie chwycić, co jest w środku tego. Oh, chcesz standardowej biblioteki IO? Puść mnie chwycić, co jest w środku tego. Co mówią do siebie kompilator gdy trafi linia cztery? Oh, obiecałeś do wdrożenia Funkcja o nazwie uzyskać pozytywny, ale Wrócimy do tego później, coś w tym kierunku. Int main void oznacza po prostu tu jest wnętrzności mojego programu. Linia siedem jest tylko nawias klamrowy. Linia osiem mówi, po lewej stronie, podać me 32 bitów dla liczby całkowitej, nazywają to n. Po prawej stronie, to mówiąc uzyskać pozytywną int. Teraz przerwa niech ta historia, ponieważ teraz I nie ruszać, mój kursor w dół. Mój kursor teraz idzie w dół tutaj, bo teraz uzyskać pozytywne int wykonuje. Int n jest zadeklarowany. Wykonaj następujące czynności. Printf daje mi całkowitą dodatnią. Get int od użytkownika, należy go przechowywać w N, i może to zrobić ponownie. Pętla ta oznacza, że ​​ten kod może wykonać w górę iw dół, jak to jeszcze raz i ponownie, ale gdy użytkownik Wreszcie współpracuje i daje mi pozytywne int, I hit linii 21, w którym momencie Numer zostanie wydany, a który należy podkreślić teraz? Dziewięć. Kontrola, że ​​tak powiem, zwraca do linii dziewięć. To linia, która jest obecnie odpowiedzialna za. Więc to, co się dzieje wszystko tym razem pod maską, ale kiedy używaliśmy funkcji jak printf lub nawet uzyskać ciąg, że ktoś inny napisał dla Ciebie, kontrola była przekazana off do cudzego linii kodu by linia po linii. To jest po prostu nie mogliśmy go zobaczyć, a my może naprawdę nie przedstawiają go w tym program, ponieważ jest to w jakiś inny plik na dysku twardym wiemy o nas. Więc właściwie skompilować i uruchomieniu tego teraz. Bądź pozytywny. Kompilacja, to postęp. . / Pozytywne. Daj mi dodatnia. Bądźmy trudne. Negative 1. Zero. Dajmy mu 50. Dzięki za 50, a więc kontroli Obecnie powrócił. Wszelkie pytania, a następnie, na które? Tak? [Niesłyszalne]. Powiedz jeszcze raz. O, dobre pytanie. Tak więc można zauważyć paralelę tutaj Jestem rodzaju cięcia kąt na. W linii 12, mówię, uzyskać pozytywną int zwraca int, ale przez to samo logika, teraz się rozumieć, że w linia sześć, mówię, że główne powraca int, ale to, co nigdy nie my miał w jednym z naszych programów? Nigdy nie mieliśmy wzmianki ten klucz powrót słowo. Tak więc okazuje się, że w C, co najmniej wersja tego, że używamy wykonane w 1999 roku, pod względem technicznym, to jest dzieje się automatycznie. Zawsze można realizować program i ty realizacji funkcji o nazwie main, że funkcja zwróci zero przez domyślnie, jeśli nie mówią inaczej, i zero tylko konwencja. Świat zwraca zero tym samym wskazuje, że wszystko jest dobrze, skutecznie zostawiając nas z czterech miliardów możliwych rzeczy, które mogą pójść nie tak tak, że jeśli wrócimy jednego, że może oznaczać kod, który oznacza to coś poszło nie tak. Możemy wrócić dwa, co oznacza, to inna rzecz, poszło źle. Możemy wrócić czterech miliardów, które oznacza to inna rzecz, poszło źle. A jeśli teraz myśleć o własnych PC lub Mac, można przypomnieć, że czasami można dostać tajemnicze komunikaty o błędach z oprogramowaniem, że jesteś przy użyciu, a czasem ma ludzkie przyjazny opis, ale nie często kod lub numer na ekranie? Jeśli to nie przychodzi do głowy, tylko miej oko na to. To jest zwykle to, co je Kody na myśli. Są one zawarte w programie Microsoft Word, a inne programy tak, że jeśli plik zgłoś błąd w firmie, można powiedz im, oh, mam numer błędu 45. A niektóre z powrotem programista w firmie może wyglądać, że w jego lub jej kod i powiedzieć, oh, to dlatego, że zrobiłem ten błąd i dlatego użytkownik dostał tę wiadomość. Ale szczerze mówiąc, to tylko trochę rozpraszać i mało uciążliwe stwierdzić, że, przynajmniej na naszym Pierwsze programy, więc mamy było pominięcie go. Ale przez cały ten czas każdy z Twoich Funkcje główne potajemnie miał tego linia automatycznie dodana dla Ciebie przez kompilator, tylko na mocy konwencji zaoszczędzić trochę czasu. [Niesłyszalne]. Nie ma potrzeby, aby umieścić go w głównym. To dobrze. Trzeba włączyć go, jeśli były realizacji funkcji takich jak ta. W przeciwnym razie funkcja płaskie obecnie nie działa. Ale w głównym, to nie jest konieczne. W tydzień lub dwa, zaczniemy się do tego zwyczaju raz chcemy rozpocząć sygnalizując błędy. Bardzo dobre pytanie. Tak szybkie werbalne wspomnieć, że przerwa w piątek, że nie będzie obiad per se, ale będziemy na kolacji z niektórych studentów i pracowników. Jeśli chcesz do nas dołączyć, prosimy wolne, aby przejść do cs50.net/rsvp. 18:00 w piątek. Przestrzeń jest, jak zawsze, ograniczone, ale my będziemy nadal robi to na prawie raz w tygodniu, jeśli przestrzeń skończy się w tym tygodniu. Więc cliffhanger, że skończyliśmy na Poniedziałek był, że może faktycznie strings być indeksowane na, co oznacza po prostu cię może dostać się do pierwszego znaku, Drugi znak, trzeci znak i tak dalej, ponieważ można skutecznie, że z ciągu, podobnie jak witam, jak jest w tym przypadku pięć Litery wewnątrz pudełka. I można dostać w każdym z tych Składnia pola z tym, co nam zrobił przedstawić w poniedziałek? Te nawiasy kwadratowe na klawiaturze. To po prostu znaczy iść do miejsca zerowego. Zaczynamy odliczanie od zera, więc uchwyt zera oznacza H, łącznik jeden oznacza, e, i tak dalej. I tak cały czas, gdy byliśmy za pomocą łańcuchów i wpisując "hello" i "Świat" i inne rzeczy na Ekran, to był przechowywany w polach takich jak ten. I zgadywać. Co każde pole reprezentuje fizycznie wewnątrz komputera? [Niesłyszalne]. Sorry? Znaki. Więc postać, na pewno w przypadku ciągów, a postać jest po prostu osiem bitów lub jeden bajt. Więc prawdopodobnie są przynajmniej niejasno znane z tego, że Twój komputer ma pamięć. Posiada dwa rodzaje pamięci, co najmniej. Jednym z nich jest dysk twardy, gdzie można zapisać takie tam na stałe, a to zazwyczaj duże, więc można mieć filmy i muzyka, i tak dalej. Wtedy masz inny typ pamięci zwany RAM, R-M, Random Access Pamięć, i jest to typ pamięci , które stosuje się, gdy komputer jest działa, ale jeśli straci moc lub twój umiera baterii, wszystko, co jest zapisane w pamięci RAM znika w przypadku utraty zasilania w ogóle, ponieważ nie jest trwałe. Zazwyczaj mają te dni, Koncert z nim, dwa koncerty, a może więcej. I odwrotnie RAM jest to, że wiele dużo, dużo szybciej niż dysk twardy lub nawet półprzewodnikowe dyski te dni, ale zwykle droższe więc masz mniej. Tak naprawdę dzisiejsza rozmowa dotyczy do pamięci RAM, to pamięć, istnieje tylko wtedy, gdy nie ma mocy są wprowadzane do komputera. Tak więc po wpisaniu w H-E-L-L-O, Enter na klawiatury H będzie w jednym bajt pamięci RAM, E będzie w kolejny bajt pamięci RAM, jak Pozostała część słowa. Tak więc przypomnieć, co byliśmy w stanie zrobić ostatni raz to było. Pozwólcie mi iść do przodu i otworzyć plik które nazwaliśmy string.c i przypomnieć że wyglądało to trochę coś takiego. Pozwól, że rzeczywiście wycofać i zmienić to dokładnie jak to wyglądało, Długość ciąg s. Więc spójrz na program tutaj. We obejmują CS50 bibliotekę tak że możemy użyć uzyskać ciąg. We zawierają standardowe io.h więc możemy użyć printf. Dlaczego my to string.h? To był nowy w poniedziałek. Więc chcieliśmy długość ciągu. Str leng. Ludzie postanowili lat temu, niech po prostu być zwięzłe. Zamiast nazywać to "długość ciągu" nazwijmy to "str leng" i niech postać świata, który obecnie, i tak to jest co dostajemy dostęp do z string.h. To jest znane. To jest znane. To jest znane. To jest trochę nowych. W wierszu 22 - i wrócimy do tego, ale teraz wiem - i może tylko wiedzieć to z konieczności zapoznać się z dokumentacją lub jeśli wiedziałeś C już - Czasami można uzyskać ciąg śruba się. Jeśli użytkownik jest naprawdę kontradyktoryjności lub niechętne do współpracy, a on lub ona po prostu nie nic pisać na klawiaturze lub typy tak dużo, że na klawiaturze to przytłacza pamięci komputera, teoretycznie uzyskać ciąg może wrócić coś innego niż ciąg znaków. Może zwrócić szczególną nazwie wartości NULL wielkimi literami, N-U-L-L, a to tylko tak zwana wartość sentinel. To oznacza, że ​​szczególną wartość coś złego się stało w tym przypadku. To jest brak napisu. Więc wartość null Jestem sprawdzanie po prostu tak, że Krótko mówiąc, str dł. i inne funkcje, które pochodzą z C, jeśli oczekują ciąg, ale przekazać je brak ciągu, jeśli przechodzą im NULL, komputer lub program po prostu upaść wprost. Będzie to powiesić. Będzie rzucać jakiś komunikat o błędzie. Złe rzeczy się wydarzy. Dlatego, mimo że jest to nadal nie dobrze zdefiniowane - będzie to więcej sensu w tygodniu lub dwa - w linii 22, to jest po prostu Przykładem samodzielnego sprawdzania błędów obronnej tylko w przypadku, raz z milion coś pójdzie nie tak, na najmniej mój program nie będzie katastrofy. Więc jeśli s nie równa się coś złego, Mam to w pętli, i to było gdzie mieliśmy, że inne nowy kawałek składni. Mam dla pętli iteracji od zero, do czasu trwania S. I to tutaj, byłem drukowania s Uchwyt i, ale dlaczego używam C% wszystkich Nagle zamiast% s nawet jeśli s jest ciągiem? To znak, prawda? S jest ciągiem, ale coś wspornik s, s uchwyt i gdzie jest zero lub jeden lub dwa, to jednostka znaków w ciągu, a więc dla że printf musi być poinformowany, że to rzeczywiście postać się spodziewać. A potem przypominam sobie, co to zrobił Program rzeczywiście zrobić? Wydrukowano go w kolumnach. Tak, dokładnie. To po prostu drukowane słowo, które wpisuję w kolumna, jeden znak w wierszu. Zobaczmy więc, jeszcze raz. Tak zrobić łańcuch. Zestawione OK. . / String. Pozwól mi wpisać H-E-L-L-O, Enter i naprawdę rozumiem, po jednym w wierszu. Więc pozwól mi zrobić jedną optymalizację tutaj. Jeśli myślisz o tym, zwłaszcza jeśli już zaprogramowane wcześniej, istnieje prawdopodobnie nieefektywność w linii 24. Innymi słowy, to nie koniecznie najlepszy projekt. Proste, przynajmniej raz Ciebie pamiętam, co str leng jest, ale to robi coś głupiego potencjalnie. Co może być tego przyczyna? [Niesłyszalne]. Dokładnie. To sprawdzanie długości s za każdym razem, chociaż H-E-L-L-O jest zawsze będzie się pięć znaków. Za każdym razem, za pośrednictwem tej pętli, pięć nie zmienia. I może być zwiększany i, ale to, co ma długość s na każdy iteracji tej pętli? To jest pięć, to pięć, to pięć, a jeszcze jestem jednak pytaniem, to pytanie jeszcze raz i jeszcze raz i jeszcze raz. Teraz szczerze, że komputer jest tak cholernie szybko, nikt nie zauważy Różnica w tym przypadku, ale tego rodzaju złych decyzji projektowych może zacząć dodać, jeśli kompilator sam nie stara się rozwiązać ten problem dla Ciebie, które Zazwyczaj nie będzie w czasie najmniej w urządzenia. Więc mam zamiar to zrobić. Mam zamiar dodać przecinek po moja pierwsza zmienna, i. Mam zamiar dać sobie inną zmienna, nazywając go n, tak by Konwencja numerów, a następnie jestem zamiar przypisać n wartość ciągu Długość tych. A potem mam zamiar zmienić mój stan się, co? Mam zamiar zmienić mój stan się podczas gdy jest mniejsza niż N. Więc teraz, ile razy mam sprawdzenie długości S? Raz, ale to jest OK, by sprawdzić i. przed n znowu i znowu, bo teraz te wartości nie są rzeczywiście się zmienia. Teraz na razie, po prostu wiem, że w każdej chwili wywołania funkcji, jest trochę nad głową, nie wystarczy, aby zniechęcić naprawdę od zawsze przy użyciu funkcji, ale pewnością, gdy istnieje linia kodu tak - i linie dostanie ciekawsze niedługo - gdzie istnieje możliwość, że, jeśli wpisz ten kod, jak wiele razy będzie wykonywał? Zaczniesz widzieć w czasie tej wydajność programów może rzeczywiście zmienić. W rzeczywistości, jeden z problemu ustawia mamy wykonane w poprzednich latach wiąże realizacji, jak może pamiętacie z tydzień zero, sprawdzania pisowni, ale sprawdzanie pisowni, który jest zaprojektowany, aby wspierać Słownik 150.000 Plus Słowa, które dajemy wam. Trzeba by napisać kod, który ładuje te słowa do pamięci RAM, więc do pudełka, jak widzieliśmy na ekranie na chwilę temu, a następnie jak najszybciej można, trzeba być w stanie odpowiedzieć na Kwestia formy, jest to słowo błędnie? Czy to słowo błędnie? Czy to słowo błędnie? A w czymś takim, co mamy wykonane w latach przeszłość włączeniu go, choć na opt-in dobrowolności, Konkurs rodzaju, przy czym studentów, którzy używają mniej pamięci RAM i mniej czas, mniej cykli procesora, w końcu pęcherzyków do góry trochę liderów i ranking, który kładziemy na Kurs jest strona główna, jak mamy wykonane w latach poprzednich. Więc znowu, całkowicie opcjonalny, ale to przemawia do możliwości projektowych , które są przed nami raz zaczniemy budowanie szczycie niektóre z nich podstawowe cegiełki. Więc pozwól mi wrócić do tego schematu dla tylko chwila i ujawniają niewiele coś więcej. To rzeczywiście jest łańcuch, i podjęliśmy Zaletą kilku bibliotekach średnia io.h który ma - Printf. Printf, między innymi. cs50.h, które dostać int i uzyskać ciąg i tak dalej, string.h, które miał str Leng. Ale okazuje się, że jest jeszcze inny. Szczerze mówiąc, jest tam wiele, wiele nagłówka pliki, które deklarują funkcji dla bibliotek, ale ctype.h jest faktycznie będzie nieco korzystne, ponieważ mam zamiar iść do przodu i realizować jeden inny program tutaj. Pozwólcie mi iść do przodu i otworzyć coś Pisałem wcześniej o nazwie capitalize.c i rzućmy Zobacz, jak to działa. Zauważ, że używam, w tej wersji z niego, trzy znajome plików. Zauważ, że w linii 18, jestem coraz linię tekstu. Wskazówki w linii 21, twierdząc, że jestem Poniższy kod będzie wykorzystać s, co użytkownik wpisze , i jak mam robić? Cóż, zabieram - lekcja z ostatniej chwili - Jestem deklarowania i i n i iteracji ciągu znaków w ciągu. A potem to, co jest ten blok Kod w linii 24 przez 27 robi w laika? Mała litera powrotem. Dokładnie. Jeśli s uchwyt i - jeśli to i- charakter S, która jest specyficzna char w ciąg, jest większa niż lub równa małe i - Przypomnijmy, że podwójne ampersanda oznacza i - i ten sam znak, s uchwyt i jest mniejsza lub równa małe litery Z, to oznacza, że ​​to b lub lub c lub dot, dot, dot, lub z, co oznacza, to jest małe. Co chcę zrobić w tym przypadku? Cóż, można to zrobić nieco tajemniczo, ale niech dokuczać to apart. Mam zamiar zadzwonić do printf, drukuje% c bo chcę wydrukować to znaków na ekranie. Jestem wtedy zajmie s wspornika Ja, i-ty znak w S, a następnie, dlaczego ja robię tę sztuczkę tutaj, małe minusa kapitałem? Co to jest, że da mnie, mówiąc ogólnie? [Niesłyszalne]. Dokładnie. Naprawdę nie pamiętam - to było 65 dla kapitału A. I naprawdę nie pamiętam, co małe jest, ale nie ważne. Komputer wie. Więc mówiąc, małe minusa kapitału, to dziwne być odjęcie jednego char od drugiego, ale jakie są znaki, pod maską? Są tylko numery. Tak więc bez względu na te numery są, niech komputer pamięta go zamiast mnie człowiek. Tak małe ujemny kapitał jest da mi różnicy. Zdarza się, 32, i które byłyby w przypadku małych liter b i kapitału B i tak dalej. To pozostaje spójna, na szczęście. Więc jestem w zasadzie mówiąc, wziąć litery, które należy odjąć od średnia różnica, a i skutecznie zmienia s uchwyt z małe litery, oczywiście, wielkie litery, bez my naprawdę konieczności myślenia o czy pamiętać, jakie były te numery Rozmawialiśmy o po osiem wolontariusze wpadł na scenę? Teraz Tymczasem, w innym, jeśli nie jest małe litery, jak określono przez linię 24, po prostu go wydrukować. Chcę tylko dotknąć znaków, które były faktycznie początkowo małe. Zobaczmy więc, ta. Należy wykorzystać. Zestawione, OK. . / Wykorzystać. I pozwól mi wpisać H-E-L-L-O małymi literami, Enter. I zauważyć, że to jest konwertowany pod wielkimi literami. Pozwól mi zrobić to ponownie inny wyraz. Jak o D-A-V-I-D z pierwszym D kapitalizowane jako nazwa jest zazwyczaj? Wprowadź. Zauważ, że to nadal poprawne. To po prostu wyprowadzane że najpierw D bez zmian poprzez które jeszcze budowy. Tak więc należy pamiętać, a następnie, Kilka rzeczy tutaj. One, jeśli kiedykolwiek chcesz sprawdzić dwa warunki na raz, można i ich razem, jak przewidywaliśmy. Możesz porównać znaki w ten sposób i znaków, jak skutecznie leczyć numery, ale szczerze mówiąc, to jest tak cholernie tajemnicze Nigdy nie będę pamiętać jak wymyślić to od podstaw bez uzasadnienia przez to na dość trochę czasu. Czy nie byłoby miło, gdyby ktoś tam napisał funkcję o nazwie jest obniżenia, które mogą odpowiedzieć na mnie prawdziwą lub false, ta postać jest małe? No na szczęście, kto napisał ctype.h zrobił dokładnie to. Puść mnie tutaj i dodawać ctype dla c rodzaje, a teraz pozwól mi zejść tutaj i przepisać ten wiersz w następujący sposób. Więc jeśli to się nazywa jest niższa, I twierdzą, s Uchwyt i, następnie idę do usunięcia te dwie linie w ogóle. Więc teraz ktoś inny, mam nadzieję, napisał wywoływana funkcja jest niższa, i to Okazuje się, że nie i że zadeklarowane to wewnątrz ctype.h. A teraz mam zamiar opuścić linię 27 sam mam zamiar opuścić linię 31 sam, ale zauważ, jak wiele mam zaostrzyło mój kod. To teraz czystsze. To mniej trudne do przeglądania bo teraz funkcję, ponadto jest tak pięknie nazwał ją po prostu robi to, co mówi. Więc teraz mam zamiar zapisać to. Idę, aby pomniejszyć. I tak jak w Scratch można mieć Boolean, wartość logiczną true lub fałszywe, to jest dokładnie to, co jest niższe skutecznie zyski. Pozwól mi skompilować. Pozwól, że re-run. A teraz spróbujmy to jeszcze raz, H-E-L-P-O, Enter. To jest bardzo dobre. I spróbuj jeszcze raz, upewnij się, że nie nakręcić coś. To jest aktywowane jako dobrze. Ale to nie jest wystarczająco dobre, ponieważ Inna sprawa, że ​​ja nigdy nie będę pamiętam, chyba że działa przez to bardzo ostrożnie na, powiedzmy, papier jest to cholernie linii. Czy nie byłoby miło, gdyby nie było Funkcja nazywa się górna? Okazuje się, że jest w ctype.h również. Mam zamiar iść do przodu i wpisz - pozwól mi przynieść tę linię z powrotem. Zamiast tego tutaj, pozwól mi iść do przodu i powiedzieć, zastępować w% c Wynik wywołanie tej funkcji Górna na i-tym znaku s. A teraz zauważyć, że coraz mało zrównoważony. Muszę śledzić, ile nawiasy mam otwarte i zamknięte. Więc teraz to nawet sprzątaczka. Teraz ten program jest coraz lepiej i lepiej zaprojektowane prawdopodobnie dlatego, że jest dużo, dużo bardziej czytelny, ale to no niech poprawić. Należy wykorzystać. . / Wykorzystać. H-E-L-L-O. Przyjrzyjmy się jeszcze raz, D--V-I-D. OK, więc nadal jesteśmy w pretty good shape. Ale teraz do górnej. Proponuję jeszcze jedna wyrafinowanie mogliśmy zrobić, że będzie bardzo ładne, że naprawdę może dokręcić do tego kodu i naprawdę dają nam pięć z pięciu do projektowania, na przykład. Co byłoby miło, aby pozbyć? Cóż, wygląda jak cholernie długi ten blok kod jest po prostu zrobić coś prostego. Teraz, jak na bok, jak można mieć zobaczyć w sekcji to obok super- weekend, nie jest ściśle konieczne nawiasy klamrowe, gdy tylko jedno linii kodu, mimo że proponowany trzymając je tak, że to sprawia, że ​​wiele bardziej jasne, jak w Scratch w kształcie litery U bloków, co jest w środku oddziału. Ale czy nie byłoby miło, gdyby do górnej, gdy z uwagi na jego wejście, zwrócił się do wielkie, jeśli nie jest, i co być wspaniałe w przeciwnym przypadku, jeśli to już wielkie litery? Wystarczy przekazać je poprzez i zostawić ją w spokoju. Więc może to nie robi. Mógłbym spróbować i po prostu nadzieję, że to, że nie, ale niech mnie wprowadzić jedną rzecz. Zamiast korzystania z wbudowanego terminala okno w dół tutaj przypomnieć, że ta ikona kwadratu black daje większe okno terminala, że ​​mogę pełna ekranie, jeśli chcę? Tak więc okazuje się, że są jakby dziwnie nazwany, ale nie te rzeczy nazywane strony man, strony podręcznika, w skrócie, mężczyzna i mogę do nich dostęp Człowiek wpisując - co chcę wpisać? Człowiek do cholewki. A teraz uwaga, jeśli istnieje funkcjonować wewnątrz komputera, w W tym przypadku urządzenie, które jest po prostu system operacyjny Linux, to będzie dać mi trochę tajemnicze zestaw wyjście, ale przekonasz się, że na czas to zawsze jest sformatowany prawie same więc zacząć się do tego przyzwyczaić. Wskazówka na górze do górnej i podobno jest taka sama dokumentacja dla obniżenia. Kto napisał to było cięcie niektórych narożniki i umieścić to wszystko na jednej stronie. Celem tych rzeczy "w życie jest do konwersji List do wielkości liter. Zauważ, że w Synopsis, strona man uczy mnie, co plik mam zawierać używać tej rzeczy. To daje mi podpisy dla nich funkcje, obie z nich, nawet choć teraz tylko dbają o jednym. Oto teraz opis. Do górnej przekształca nas c na wielkie litery, jeśli to możliwe. Jeszcze nie tak pouczające, ale niech mi teraz poszukaj w wartości zwracanej, rzeczy , które jest zwracane. Więc wróciliśmy jest to wartość zamienione litery lub c, jeśli przekształcenie nie jest możliwe. Co to jest c? Oryginalny charakter. Oryginalny charakter i wiemy że znów będzie do streszczenie, a kto to napisał funkcja po prostu uznał, że wejście się do górnej i dolnej jest tylko arbitralnie się nazywać c. Mogli nazwał go najbardziej wszystko chcą, ale ciągle go proste jak w.. Tak już konsultowany na stronie man. To zdanie przekonuje mnie, że jeśli to nie jest mała litera, to będzie po prostu oddaj mi c, która jest perfect, które oznacza, że ​​mogę pozbyć się mój inny warunek. Więc pozwól mi wrócić do gedit i teraz pozwól mi to zrobić. Mam zamiar skopiować mój printf. Mam zamiar iść do przodu i prawo wewnątrz do druku pętli, że obecnie, a otrzymasz pozbyć się tego całego jeśli konstrukt. Czy nie jest to zły pomysł, i to było bardzo bardzo poprawne i zgodne z Wszystko, co głosił, ale nie tylko jest to konieczne. Jak najszybciej zrealizować niektóre biblioteki funkcja istnieje, że ktoś inny napisał, czy może w innym miejscu napisał plik, można go używać i bardzo początku do zaostrzenia kod. I kiedy mówię takie rzeczy jak dobrym stylu, Fakt, że ta osoba nazwie funkcjonować do górnej lub wcześniej jest niższy jest cudownie przydatne, ponieważ są bardzo opisowe. Nie chcesz, aby zadzwonić do funkcji x i y, z, które mają dużo, dużo mniej sens. Wszelkie pytania na temat tej serii usprawnień? Więc wystarczy powiedzieć, jednego z dania na wynos jest nawet własnego problemu set - może set problemem jeden, ale pewnością P zestaw dwóch i dalej, nawet kiedy są poprawne niekoniecznie oznacza, że ​​są idealne tylko jeszcze ani szczególnie dobrze zaprojektowane. Które znajduje się w drugiej osi zacząć myśleć o tym. Więc to było w środku napis z Twoich pamięci komputera, ale jeśli masz cała masa znaków jak H-E-L-L-O wewnątrz pamięci RAM, i załóżmy że w swoim programie wywołać uzyskać ciąg wiele razy tak, że zadzwoń uzyskać ciąg raz, to zadzwoń uzyskać ciąg ponownie. Cóż, co się stało się w czasie? Innymi słowy, jeśli masz linię Kod, choć z kontekstu, jak string s dostaje - zróbmy to. String name równa uzyskać ciąg. Więc załóżmy, że linia kodu jest przeznaczona poprosić użytkownika o jego nazwisko. To następna linia kodu ma zapytać łatwy do jej szkoły i to następna linia, i tak dalej. Załóżmy, że mamy prosić użytkownika do drugiego i inny, a drugi ciąg. Zamierzają zatrzymać w pamięci w tym samym czasie. Nie ma clobber inne. Szkoła nie jest zastąpienie innych. Ale gdzie oni wszyscy kończy się w pamięci? Cóż, jeśli zaczniemy rysować na ekranie, które możemy wykorzystać tę rzecz tu jak tablicy, jeśli ten czarny prostokąt reprezentuje komputer-tych pamięci, mam zamiar arbitralnie zacząć dzieląc je na małe kwadraty, z których każdy reprezentuje jeden bajt pamięci. Szczerze mówiąc, jeśli masz gigabajt pamięci RAM te dni, masz miliard bajtów pamięci w komputerze, więc mld z tych kwadratów. Więc wystarczy powiedzieć, to naprawdę nie jest w skali. Ale możemy zachować rysunek wszystkie te wyraźnie nie w skali kwadratów, a to łącznie stanowi mojej pamięci komputera. Teraz tylko zrobię kropka, kropka, kropka. Więc innymi słowy, kiedy wyświetlał Użytkownik z get ciąg dać mi łańcuch, co się dzieje? Jeśli użytkownik wpisze w "hello", który kończy w H-E-L-L-O. Załóżmy jednak, że Następnie użytkownik typy w - Właściwie to nie powinienem tego robić witam, ponieważ pytamy za ich nazw. Więc wróćmy, czy mogę to zrobić. Więc jeśli typ w D-A-V-I-D dla mojego imienia, ale przypominam, że druga linia Kod został uzyskać ciąg ponownie aby ich szkoły. Gdzie to jest słowo, które użytkownik typy w zamiar iść dalej? Cóż, może to się udać do H-A-R-V-A-R-D. Dlatego, mimo że mam wyciągnąć go w dwóch rzędach, to tylko cała masa bajtów w pliku pamięci RAM komputera. Nie ma teraz problem, bo teraz, czy jestem przy użyciu pamięci RAM w tym bardzo rozsądne ale jakby naiwny sposób, co można najwyraźniej nie rozróżnia? W przypadku, gdy jeden zaczyna się i gdzie jedno kończy, prawda? Są swego rodzaju rozmycia razem. Tak więc okazuje się, że komputer nie to zrobić. Pozwól mi faktycznie przewijania do tyłu w czasie o Kilka znaków, a zamiast Harvardzie będzie bezpośrednio po nazwie użytkownika, użytkownik w rzeczywistości pobiera, za sceny, znak specjalny dodany przez komputer dla niego. / 0, inaczej znany jako NUL irytująco nazwie N-U-L, nie N-U-L-L, ale piszę to jak / 0. To jest po prostu wszystkie bity zerowe jest marker w między pierwszym słowem, które użytkownik-tych wpisane i sekundy. Więc Harvard rzeczywiście teraz kończy się w tej kolejności znaków i jeszcze jedno / 0. Tak więc, innymi słowy, poprzez te Wartości wskaźnikowe, osiem sąsiadujących zera bity, możesz teraz zacząć rozróżniać jeden znak od drugiego. Więc cały ten czas, co było "cześć" jest faktycznie "hello" z / 0, a tymczasem, że może bardzo dobrze być trochę więcej RAM wewnątrz komputera. Pozwól mi zrobić jedną rzecz teraz. Okazuje się, że wszystkie z tych kwadratów byliśmy rysunku, są one, tak, struny, ale bardziej ogólnie, te rzeczy są tablice. Tablica jest po prostu kawałek pamięci to z powrotem do tyłu, aby z powrotem do tyłu, i zazwyczaj używać tablicy w drodze tego zapisu kwadratowego uchwytu. Więc idziemy zobaczyć te trochę w czasie, ale pozwól mi iść do przodu i otworzyć się, nazwijmy to grupy wiekowe. I zauważyć, co możemy zrobić z te same sztuczki, małe nieco bardziej składnia tutaj. Tak więc w wierszu 17 tego programu - faktycznie, pozwól mi najpierw uruchomić program , dzięki czemu możemy zobaczyć, co to coś robi. Zadzwonię zrobić wieki skompilować program. . Wieku /. Ile osób w pokoju? Nazwijmy to trzy. Wiek pierwszej osoby? 18, 19 i 20. A teraz trochę śmiesznie, po prostu dokonały program że epoki te trzy osoby. Więc jest wyraźnie okazja dla zabawy arytmetyki tutaj. Na szczęście, matematyka jest prawidłowe. 18 udał się do 19, 19 poszedł do 20 i tak dalej. Ale co tak naprawdę znaczy być ilustracyjny o to, jak jesteśmy przechowywania wieku tych trzech ludzi. Pozwól mi przybliżyć, co jest tu dzieje. Więc po pierwsze, te pierwsze kilka linii powinna być coraz całkiem znajomo. Jestem po prostu pyta użytkownika o liczba osób w pokoju. Następnie używam uzyskać int i zrobić, gdy do zrobić to znowu i znowu i znowu. Widzieliśmy, że wzór wcześniej, ale Linia 27 jest nowy i całkiem przydatne i będzie coraz bardziej przydatne. Zauważ, że co innego w linii 27 jest to, że wydaje się być stwierdzenie int o nazwie wiek, ale czekać. To nie tylko int wieku. Jest te nawiasy kwadratowe, wewnątrz, który jest N. Tak więc wspornik N w tym kontekście, nie wewnątrz printf tutaj, ale w tym wyłącznie linii 27, ta linia jest mówiąc: daj mi n wskazówki, z których każda jest typu int. Więc to jest wiadro, by tak rzec, z, W tym przypadku, trzy liczby całkowite z powrotem do z powrotem do tyłu, tak, że skutecznie mają trzy zmienne. Alternatywą, jest jasne, byłoby to. Gdybym chciał najpierw studenta wiek, może to zrobić. Gdybym chciał sekund studenta wiek może to zrobić. Gdybym chciał trzecia studenta wiek, może to zrobić. I broń Boże musimy wszyscy są wiek w tym pokoju - To znaczy, jest to kawał egzemplarza, wklej jeszcze raz i jeszcze raz i jeszcze raz. A Plus raz skompilować ten program, czy inny student wchodzi na out z tych drzwi, teraz mój numer zmiennych jest nieprawidłowy. Więc co jest ładne o tablicy jest tylko zaczniesz czuć się kopiowanie i wklejanie, kursy są to nie jest najlepszym rozwiązaniem. Tablica jest dynamiczny potencjalnie. Nie wiem z góry, ile osób będą w pokoju, ale wiem, że muszę na północ od nich, i będę dowiedzieć się, n, gdy nadejdzie czas. Ten wiersz kodu oznacza teraz, daj mi fragment pamięci, który wygląda tak w którym liczba skrzynek na ekranie jest całkowicie zależne od n, że użytkownik wpisze w. Więc teraz reszta tego programu jest rzeczywiście bardzo podobny do tego, co po prostu nie z postaciami. Zauważ, mam dla pętli począwszy od linii 30. Więc zaraz po mam tablicę, I iteracji od y jest równa zero na do n. Mam tylko to pouczające printf Komunikat po prostu mówiąc, daj mi wiek osoby #% i, tak, numer jeden, numer dwa, numer trzy. I dlaczego mam to zrobić? Szczerze mówiąc, ludzie wolą liczyć od jednego On Up natomiast informatyków, zera w górę. informatycy nie będą korzystać z tego rodzaju programu, więc jesteśmy będzie po prostu zacząć odliczanie w jednym, jak normalni ludzie. A teraz, w linii 33, zauważyć nieznacznie inny element składni. I-tym wieku w zmiennej typu array dostanie int. A teraz na koniec, to dopiero arytmetyka tutaj. Postanowiłem w osobnej pętli do żądania jakiś czas mija, a teraz w tym osobna pętla, linie te wykonać. Za rok, osoba i będzie i lat, ale zauważ, to nie jest zmiennej i. To jest teraz% i do int. I zauważ, jako pierwszy zastępczy, I wtyczka w I plus 1, więc liczymy jak normalny człowiek. I wtedy dla wartości ich życia, dla i. lat, I wziąć wieku wspornik i - i dlaczego robię plus jeden tutaj? Oni właśnie wieku. To mój głupi wybór programów. Oni po prostu w wieku jednego roku. Mogę wpisać w dowolnej ilości tego I rzeczywiście chcą tam. Więc co tak naprawdę wszystko Znaczenie tutaj? Cóż, pozwól mi faktycznie przewijania tutaj i malować obraz z tego, co nas czeka. Co będziemy robić z naszym następnym Set Problem Two jest para się świat kryptografii. Więc to jest ciąg znaków, więc Kolejność wielu znaków, a co to mówi? To nie jest w wersji online ze slajdów. Więc twierdzenie, że to równa się to, głupia reklama od wielu lat temu, że w rzeczywistości może przywołać jeden z jego pochodzenia. Tak więc jest to przykład szyfrowanie czy kryptografii. Okazuje się, że jeśli chcesz rzeczywiście wysłać informacje lub akcje Informacje z kimś bezpiecznie jak wiadomości jak ta, można wyścig litery. Ale zazwyczaj, słowa są nie kodowany losowo. Są one przesuwane w jakiś sposób zmienił w jakiś sposób tak, że - oops. To zabawne spoiler na następny raz. Więc można odwzorować to, co jest pozornie O zauważyć, że linie się B. kapitalizacja mądry. Najwyraźniej r staje się e. Najwyraźniej F-H-E-R staje S-U-R-E. Tak okazuje się, że to mapowanie, w ta sprawa jest całkiem głupi mapowanie czy ktoś zdobione? To jest coś, co nazywa Rot 13, Obrót 13. To najgłupsza szyfrowania mechanizmy, ponieważ dosłownie dodaje 13 do każdej z liter, głupi w tym sensie, że jeśli tylko mają trochę wolnego czasu na rękach i ołówek, lub po prostu, że to przez w głowie, możesz spróbować wszystkie możliwe dodatki - jeden, dwa, trzy, kropka, kropka, kropka, 25 to po prostu obracać cały alfabet, i w końcu, będzie można dowiedzieć się, co ta wiadomość jest. Więc jeśli zrobił coś takiego w klasy szkoły przekazując wiadomości do najlepszym przyjacielem, jeśli grade school nauczyciel po prostu przeczytać wiadomości i brute zmuszeni rozwiązanie, można zdobyć Odpowiedz przez to. Teraz oczywiście, w świecie rzeczywistym, kryptografia jest bardziej wyrafinowane. To jest fragment tekstu z System komputerowy, który nazwy użytkownika i Hasła, jak prawie wszystkie nasze uwagi i to właśnie hasło może wyglądać, jeśli jest przechowywany na twardym jechać, ale w postaci zaszyfrowanej. To nie jest tylko rotacja liter jest Jest B, a B jest C. Jest znacznie bardziej wyrafinowany, ale korzysta , co jest powszechnie znane jako tajnego klucza kryptografia. To zdjęcie mówi następujące historia z kilkoma ikonami. Po lewej stronie, mamy to, co zadzwonimy zwykły tekst. W świecie kryptografii, zwykły Tekst jest tylko oryginalna wiadomość w języku angielskim lub francuskim lub w jakimkolwiek języku. Jeśli chcesz zaszyfrować, miniemy to obrazowo przez kłódkę, więc niektóre rodzaj algorytmu, niektóre funkcje lub programu, że ktoś napisał że szyfruje litery miejmy nadzieję bardziej skomplikowanej niż tylko dodanie 13 w każdym z nich. Co masz z tego procesu w middle tam nazywa zaszyfrowane. Więc niby sexy słowa. To po prostu oznacza, że ​​jest szyfrowany wersja zwykłego tekstu. I tylko wtedy, gdy ten sam sekret, 13 lub minus 13, czy jesteś w stanie odszyfrować wiadomość tak. Więc problemu ustawić dwa, wśród rzeczy zrobisz, jeśli w Hacker Edition, trzeba będzie napisać kod złamania tych haseł, zastanawianie się, co to było i jak były one szyfrowane, chociaż robimy dać trochę prowadzenie wzdłuż drogi. W wersji Standard Edition, wprowadzamy Kilka cyfr, szyfrowanie mechanizmy, jeden o nazwie Cezar, jeden nazywa Vigenere, że są jeszcze rotacyjne szyfry gdzie staje coś, B staje się czymś, ale trzeba to zrobić programowo bo rzeczywiście będzie tajemnicą Klucz zaangażowane która jest zazwyczaj numer lub słowo kluczowe, które tylko nadawca i odbiorca są Komunikaty powinny zrozumieć. Teraz, to faktycznie ma wcieleń w świecie rzeczywistym. To, na przykład, jest mało sierocy Secret pierścień Annie dekoder, i może rzeczywiście realizować te Szyfry - obrotowa Staje się czymś, B staje się coś - z parą kół, jedna na zewnątrz, jeden w środku takie, że jeśli obrót kółka lub Pierścień, rzeczywiście można wyrównać listów z różnych liter, się tajny kod. I tak jak cliffhanger na dzisiaj, to, co myślałem, że wystarczy trochę cofnięcie się, że po włączeniu telewizora w dniu 24 grudnia, można oglądać film ad nauseum 24 godzin z rzędu. Ale na dzisiaj, będę go otworzyć tutaj i daje nam zaledwie dwie minuty pedagogicznie istotne Christmas Story z trochę faceta o imieniu Ralphie. [PLAYBACK VIDEO] -Być wiadomo wszem i wobec, że Ralph Parker zostaje mianowany członkiem Little Orphan Annie tajemnicy okrąg i ma prawo do wszystkich zaszczyty i korzyści występujących z nimi. -Podpis, Mały Orphan Annie. Podpisanych, Pierre Andre atramentem. Nagrody i korzyści już w wieku dziewięciu lat. [Krzyczy na Radio] Chodź, zabierzmy się za to. I nie trzeba cały ten jazz o przemytnicy i piraci. -Słuchaj jutro dla zawieranie przygoda black statek piracki. Teraz nadszedł czas na Tajemnicy Annie Wiadomość dla Ciebie członków tajnego koła. Pamiętaj, dzieci. Tylko członkowie Secret Circle Annie może dekodować tajne wiadomości Annie. Pamiętaj, Annie jest w zależności od Ciebie. Ustaw pineski do B2. Oto wiadomość. 12, 11, 2 - -Jestem w moim pierwszym posiedzeniu tajnym. -25, 14, 11, 18, 16 - -Pierre był w wielkiej dziś głosu. Widziałem, że dzisiejszy komunikat było naprawdę ważne. -3, 25. To jest wiadomość od Annie siebie. Pamiętaj, nie mów nikomu. -90 Sekund później, jestem w jedynym pokoju w domu, w którym chłopiec z dziewięciu może siedzieć w zaciszu i dekodowania. Aha, B. poszedłem dalej. E. Pierwsze słowo jest "być". S. Dochodził łatwiej. U. 25. To R. -Chodź, Ralphie. Muszę iść. -I 'll być w prawo w dół, Ma. Gee świst. -T. O. Upewnij się. Upewnij się, że co? Jaki był mały Orphan Annie chce powiedzieć? Upewnij się, że co? -Ralphie, Randy musi odejść. Czy możesz wyjść? -Wszystko w porządku, mamo. Zaraz będę się. -I było coraz bliżej do teraz. Napięcie było straszne. Co to było? Los planety może wisi na włosku. -Ralphie, Randy muszę iść. -I 'll być prosto do płakać. -Już prawie. Moje palce poleciał. Mój umysł był pułapką stali. Każda pora wibruje. To było niemal oczywiste. Tak, tak, tak, tak, tak. -Pamiętaj, aby pić Ovaltine. Ovaltine? Kiepska handlowych? Sukinsyn. [END PLAYBACK VIDEO] SPEAKER 1: To jest CS50, i że Problem będzie Set Two. Do zobaczenia w przyszłym tygodniu. Głośnik 2: Na następny CS50, to się stanie. SPEAKER 1: Więc jeden temat nie mamy spojrzał na tak daleko jest że wśród wskaźników funkcji. Teraz jest tylko wskaźnik funkcji adres publiczny funkcja, ale podobnie jak - syn -