[Powered by Google Translate] DAVID J. Malan: Dobrze. To CS50, i to jest koniec drugiego tygodnia. Jeśli spodziewasz się być głodny w tym czasie jutro, wiem, że będziemy zwołać jako małe grupy, jutro, w czwartek 13:15. Jest to adres URL tutaj, jeśli chcesz RSVP. Przestrzeń jest ograniczona, więc proszę wybaczyć, jeśli formularz został wypełniony przez czas to wypełnić. Innym URL jednak, że mogą być interesujące jest to. Więc tylko o miesiąc, kurs ma być udostępnione wszystko szerzej przez edx, poprzez który ludzie w Internecie, będzie w stanie podążać, angażują się w trakcie dość aktywnie, w rzeczywistości. Będą przy użyciu urządzenia i CS50 CS50 dyskutować i większość różnych narzędzi, które już zostały przy użyciu tego semestru. A jedną z inicjatyw chcielibyśmy podjąć jako eksperyment w tym roku jest zobaczyć, jak wiele treści można tłumaczyć na inny w mowie i języków. Więc jeśli możesz mieć zainteresowanie uczestnictwem w tym projekcie, na podstawie której będziemy dostarczać angielskiego transkrypcje i napisy do Kursu wykłady i szorty i seminariów oraz sekcje i podobne - jeśli mówić płynnie lub pisać płynnie jakiś inny język, chcielibyśmy miłość do zaangażowania się w ten projekt, w którym można wziąć na jeden lub więcej Filmy, tłumacząc je na język znasz bardzo dobrze. Aby dać ci poczucie interfejsu, jest to internetowy interfejs użytkownika że będziemy używać, które będą tworzyć głównie UI takiego. To było mi nauczanie niektórych Halloween temu. A z prawej strony tam w czarnym obok tych stempli czasowych, zobaczysz różne rzeczy, które wyszły z moich ust, że dnia. A potem pod nim, będziesz w stanie przetłumaczyć na inny język. Dokładnie to, co jest między odwzorowania, w tym przypadku, angielskim i, powiedzmy, hiszpański. Więc to jest rzeczywiście bardzo łatwy w obsłudze narzędzie. Można przewijać do przodu i bardzo łatwo za pomocą skrótów klawiaturowych. Więc jeśli chcesz wziąć udział w tym eksperymencie i mają swoje słowa zobaczyć i przeczytać o potencjalnie tysięcy ludzi tam, proszę się czuć wolne do udziału. Teraz jedno słowo na temat kociaka od poniedziałku, bo wysłaliśmy zbyt straszne wiadomości. Sobie sprawę, że w godzinach pracy, jak i działy sugerować sugerować, konstrukcja jest oczywiście bardzo się studenci współpracę i mówić do pracy poprzez zestawy problemowych i problemy ze sobą. I naprawdę linia prostu sprowadza się do, ponownie, praca, którą ostatecznie powinni złożyć powinny być własne. I tak to jest, szczerze mówiąc - w godzinach pracy urzędu, jest to całkowicie normalny - jest to całkowicie do przewidzenia, nawet - do rozmów z niektórymi przyjaciele obok ciebie. Jeśli on lub ona ma problemy z jakimś tematem, a jesteś jak, oh, dobrze niech mi dać wgląd jakiegoś wiersza kodu, który napisałem. To dobrze. To się zdarza. I to jest bardzo sprzyja, jak sądzę, z procesem uczenia się. Gdzie linia znowu dostaje kciuki jest, gdy głowa jest przechylona na rodzaj tutaj zbyt wielu sekund lub minut na które naprawdę mają tylko było okazją do odblokowania swojego znajomego. A już na pewno, kiedy wszystko się wymieniane za pośrednictwem poczty elektronicznej i i Dropbox jak, tam jest linia. Tak więc na wszelkie sposoby, czuć się komfortowo i skłania go do rozmów z przyjaciółmi i koledzy o psets i więcej. I po prostu zrozumieć, że to, co ostatecznie złożyć powinien być naprawdę Produkt swojego dzieła, a nie ktoś inny. Więc w tym samym duchu uroczych stworzeń, możesz być znam tego gościa tutaj. Więc to jest piekielnie cheesy film z lat temu. Ktoś tu widział Spaceballs? Dobrze. Tak dobry numer tutaj. Więc to jest nasz cudownie akademicki sposób wprowadzania dziś ostatecznie Pojęcie kryptografii. I tak jedna z domen problemów specyficznych dla Pset 2, która będzie późno jutro, jest nurkowanie w świat kryptografii, które to sztuka szyfrowania lub kodowania danych. I to w końcu odnosi się do świata bezpieczeństwa. Teraz bezpieczeństwo dla większości nas jest w formie mechanizmów dość prozaicznych. Każdy z nas ma nazwy użytkowników i hasła. I każdy z nas ma bardzo złe nazwy użytkownika i hasła, najprawdopodobniej. Jeśli hasło jest takie samo na wielu stronach internetowych, że chyba nie najlepszy pomysł, jak omówimy do końca semestru. Jeśli hasło jest napisane na karteczki - nie żart - na Twoim monitor, to też nie zawsze jest najlepszy projekt, ale dość powszechne zjawiskiem. A jeśli nie używasz szyfrowania do szyfrowania haseł, są one szczególnie narażone. Więc jeśli uważasz, że jest bardzo mądry przez posiadające ukryte słowo udokumentować gdzieś na dysku twardym, który ma wszystkie hasła, ale on w folderze, że nikt nie będzie szukać w, to też nie jest bardzo bezpieczny mechanizm. I co z tego pset 2 wprowadzi to jest sztuka i kryptografii kodowania informacji, aby takie rzeczy jak hasła są tym bardziej bezpieczne. Tak, aby motywować ten bardzo rzeczywistych problemów z bardzo nie w świecie rzeczywistym scenariusz, pozwól mi przedstawić Państwu jeden z naszych ulubionych klipów tutaj z tego movie, Spaceballs. [PLAYBACK VIDEO] Kask, to diabeł, co tu się dzieje? Co robisz z moją córką? -Pozwól mi przedstawić genialny młody chirurg plastyczny, dr Philip Schlotkin, największy człowiek nosa w całym Wszechświat i Beverly Hills. -Wasza Wysokość. Nos praca? Nie rozumiem. Ona już miała nosa. To było słodkie 16 obecnie. -Nie, to nie jest to co myślisz. Jest o wiele, wiele gorzej. Jeśli nie dasz mi kombinację do kurtyny powietrznej, dr Schlotkin woli dać córkę jej stary nos. -Nie! Skąd to masz? -Wszystko w porządku. Powiem. Powiem. -Nie, tatusiu, nie. Nie musi. -Masz rację, moja droga. Tęsknię nowy nos. Ale nie powiem im kombinację nie wiem co. -Bardzo dobrze. Dr Schlotkin, czy twój najgorszy. -Z przyjemnością. -Nie! Czekaj, czekaj. Powiem. Powiem. -Wiedziałem, że to działa. Dobra, daj mi go. -Jest połączenie. -One. -One. -Two. -Two. -Two. -Trzy -Trzy. -Trzy. -Four. -Four. -Four. -Five -Pięć. -Pięć. Zatem połączenie, jest jeden, dwa, trzy, cztery, pięć. To najgłupsza połączenie, jaki słyszałem w życiu. To rodzaj rzeczy idiota miałby na jego bagażu. -Dziękuję, Wasza Wysokość. -Co zrobiłeś? -I odwrócił się od ściany. -Nie, nie. Wyłączono cały film. -I musi być naciśnięty niewłaściwy przycisk. -Cóż, umieścić go z powrotem. Umieść ten film ponownie. -Tak jest, sir. Tak, sir. -Chodźmy, Erna. Przyjdź, Gretchen. Oczywiście wiesz, że nadal mam do wystawienia rachunku za to. -No, to zadziałało? Gdzie jest brama? -Udało się, sir. Mamy połączenie. -Świetnie. Teraz możemy wziąć każdy ostatni powiew świeżego powietrza z planety Druidia. Co jest kombinacja? -Raz, dwa, trzy, cztery, pięć. -Raz, dwa, trzy, cztery, pięć? -Tak. -To niesamowite. Mam taką samą kombinację na mój bagaż. Przygotuj Spaceball 1 do natychmiastowego wyjazdu. -Tak jest, sir. -I zmienić kombinację na mój bagaż. -Ow! [END ODTWARZANIE VIDEO] DAVID J. Malan: niesamowity film powinien teraz wszystko zobaczyć. Więc kontekst jest tutaj z niepewnych danych pochodzi okazję szyfruje je i wspiąć go. A więc, na przykład, jest przykładem zaszyfrowanej wiadomości. To rzeczywiście coś mówi w języku angielskim. Ale to nie jest oczywiście całkowicie oczywiste. A my zatoczyła koło dzisiaj odciąć co ta tajemnica Wiadomość o to. Ale w prawdziwym świecie komputerów, rzeczy, nawet nie wyglądają jak mogą być zwroty angielskie. Na przykład, jest to, co można znaleźć w standardowym systemie Linux lub Mac lub Komputer Unix w pliku, który był kiedyś nazywany plik haseł. Obecnie, to zostały przeniesione do innych miejsc. Ale jeśli spojrzeć na właściwym miejscu w systemie, zobaczysz nie tylko swoje nazwa użytkownika lub innych osób w systemie, ale zobaczysz szyfrowana wersja ich hasłem. Rzeczywiście, tam krypta słowo sugeruje, że następujące rzeczy jest szyfrowane. I ta seria pozornie przypadkowych liter i znaków i numerów oraz itd. mogą być odszyfrowane tylko ogólnie znając jakąś tajemnicę - tajne słowo, tajny numer. I tak rzeczywiście, sztuka kryptografii ostatecznie sprowadza się do zaufania niektórych sortowania i coś wiedzieć, że ktoś inny nie. Będziemy badać to w nieco bardziej szczegółowo dziś iw Pset przyjść. A teraz słowo na pass / fail. Tak szczególnie, jak niektórzy z was zanurkował PSET 1, urządzenia, i bardzo nowy świat dla siebie, uświadomiłem sobie, że frustracje i splątanie i tylko trudności techniczne należy się spodziewać. Szczególnie przy pierwszym pset, gdzie jest tak wiele nowych, dopiero się zaznajomieni z ls i cd i wszystkich tych tajemniczych poleceń w nowym środowisku. I to jest niezależne od rzeczywistego materiału i programowania siebie. Więc sobie sprawę też, że z pewnością istnieją godziny pracy, które istnieją jako struktura wsparcia. Sekcje rozpocząć tę niedzielę nadchodzi. Ale co najważniejsze, jeśli czujesz się po prostu, że nie jest świat dla ciebie, uświadomić sobie, że to naprawdę nie wystarczy czasu. I gdyby nie to, za możliwość lat temu dla mnie podejmowania klasę pass / fail, szczerze mówiąc, nigdy bym nawet nie postawił stopy w klasie. I można to zmienić, aż, powiedzmy, piąty poniedziałek kursu. Więc jeśli jesteś na skraju teraz uświadomić sobie, że zamiast głowy na jakiś inny Wody w ogóle, czy na pewno rozważyć tylko zmiana do pass / fail. Ponownie, nie jest tak naprawdę ta kultura tutaj na Harvardzie podejmowania rzeczy pass / fail ponieważ każdy naprawdę chce osiągnąć lub nadwyżką. Ale szczerze mówiąc, jest to wspaniały sposób na spróbowanie czegoś, że nie może być znane. I będziesz kończy się robi w większości przypadków dość drobnych, może dużo do zaskoczenia. Iw bardziej konkretny sposób, co myślę pass / fail ogólnie robi, zwłaszcza jak może masz doświadczenie z Pset 0, jeśli umieściliśmy w 10 godzin, 15 godzin, 25 godzin w niektórych PSET - a ty jesteś po prostu walić Twoja głowa o ścianę, i robi się bardzo późno w nocy, ale ty podjął Pset jak 90% w sposób, wiesz, po prostu nie może dowiedzieć się, jedno - pass / fail naprawdę ma przewagę off klasy jak to, gdzie można sortować z radością powiedzieć, dobrze, wiem, że nie jest doskonały. Ale pracował mój tyłek w tej sprawie. Jestem całkiem zadowolony z którym zakończył się. Oraz że spełni oczekiwania na pass / fail. Więc nie miej to na uwadze. Dobrze. Tak więc ci z was, którzy walczyli do korzystania z Harward bezprzewodowy wiedzieć że jest CS50 SSID, Wi-Fi, który krąży może mieć więcej szczęścia dla. Jest to trochę ironiczne, że hasło to - jeśli chcesz, aby spróbować podłączania do lepszych prędkości i daj nam znać, czy to nie lepsze - jeden, dwa, trzy, cztery, pięć, aż do ośmiu ponieważ osiem jest bardziej bezpieczne niż pięć. Więc jeśli potrzebujesz Wi-Fi hasła, łączyć się bezprzewodowo CS50 tutaj. Jeden, dwa, trzy, cztery, pięć, sześć, siedem, osiem. I post na CS50 Porozmawiaj jeśli jeszcze sporadyczne problemy z łącznością, i damy z uprawnień, które należy wiedzieć o tym miejscu. Dobrze. Więc szybkie teaser, zwłaszcza dla tych z was, którzy to chłopcy czy dziewczęta fan wszystkim Apple, rzeczy. What I wykopali z kilku lat wstecz był ten plik tutaj, ilock.c, tylko do rodzaj bardziej konkretne i bardziej skomplikowane niektóre z bardziej podstawowym C Programy byliśmy pisania. Więc otworzyłem ten plik, ilock.c. Jest on dostępny na stronie wykładów na dziś. Na lewej stronie, widać długą listę funkcji. Więc człowiek, który napisał to napisał się wiele funkcji, więcej niż tylko main. Kiedyś całą masę bibliotek tutaj. A jeśli zaczniemy przewijanie, co to właściwie jest to bardzo po pierwsze, uważam, crack do oryginalnego iPhone. Kiedy chciał jailbreak oryginalny iPhone, co oznacza untether go z AT & T i faktycznie zainstalować specjalne oprogramowanie na nim i robić rzeczy że Apple nie chce ludziom robić - Cóż, ktoś wziął czas, aby dowiedzieć się dokładnie, w jaki sposób mogą wykorzystać wady oprogramowania, błędy, błędy, w oprogramowaniu Apple. I w ten sposób narodził ilock.c. Że jeśli on skompilowany na komputerze i zainstalować go na tym iPhone był podłączony do komputera poprzez, powiedzmy, kablem USB, nie daje administracyjne lub uprawnienia administratora na iPhone i pozwala zrobić bardzo dużo cokolwiek chcesz. I tak nie było to fascynujące kotka i myszkę pomiędzy Apple i reszta świata, w szczególności jak oni, jak wiele firm, spróbuj zablokować ich rzeczy w dół, tak że można tylko z nim zrobić, co zamierzają. Ale dzięki takimi ludźmi i ich zrozumienie niskopoziomowych szczegóły i, w tym przypadku, programowania C i wiele znanych konstrukcji że zaczęliśmy grać z, jesteś w stanie naprawdę wykorzystać sprzętu w sposób widać krój i niekoniecznie jakiś podmiot prawny. Tak na przykład, nie mam pojęcia, co to wszystko robi. Ale getVersion brzmi całkiem proste. I wygląda na to, że jest to funkcja, która ta osoba napisała. Weź jakąś liczbę całkowitą jako argument, nie zwraca nic, ale wydaje się pętli z pętli for tutaj i jeśli stanie, jeśli warunek, złamać, i jakoś dotyczy numery wersji. Jeśli będziemy przewijać - choć wiele z tych słów kluczowych będą nowe, a tam Mnóstwo funkcji tutaj nigdy nie widziałem i może nie zawsze patrz na kurs w semestrze - Na koniec dnia, to takie same zasady i logikę, że byli gry z do tej pory. Więc to jest zbyt stary, by złamać iPhone 3s lub 4s lub wkrótce 5s te dni, ale wiem, że to wszystko jest bardzo wiele pochodzi z tego świata, że ​​mamy zanurkował. Weźmy spojrzeć na przykład trochę bardziej proste. Ten jeden, tylko po to żeby podgrzać z niektórych składni, a także niektóre inne dane typu, że rozmawialiśmy o, ale nie bardzo widać w C. Jest to więc Plik o nazwie positive1.c. I na komentarze na górze, to tylko wymaga, użytkownik dostarczyć liczba dodatnia. Więc jest to przykład do-while, który jest miły dla użytkownika interaktywne programy, gdzie trzeba poinformować użytkownika coś zrobić. A jeśli oni nie współpracują, można krzyczeć na nich lub odrzucić ich wejście. Sprawa w punkcie, mam zamiar zrobić linie 19 poprzez 24, tak długo jak użytkownik posiada nie daje mi liczbę dodatnią. Teraz to tu szczegółowo na linii 18, dlaczego Oświadczam n wyżej cała ta Konstrukcja, w przeciwieństwie do pętli obok linii 22, gdzie faktycznie dbają, aby n? Tak? [Niesłyszalne] DAVID J. Malan: Tak, więc to kwestia zakresu. A w perspektywie laika, co to zakres odnosi się do? Tak? [Niesłyszalne] DAVID J. Malan: Czy możesz mówić trochę głośniej? SPEAKER 1: Gdzie można uzyskać dostęp do konkretnej zmiennej. DAVID J. Malan: Perfect. Gdzie można uzyskać dostęp do konkretnej zmiennej. I ogólnie, zasada jest dotychczas, że zakres niektórych zmienna jest zdefiniowana przez ostatnie klamrowych nawiasach, że widziałem. I tak w tym przypadku, jeśli popełnił błąd deklarując n na linii 22, że linia będzie działać. Chciałbym uzyskać int, i chciałbym umieścić go w tej zmiennej N w wierszu 22. Ale która linia kodu będzie teraz nie wiem, co mówię? Tak więc 25, i okazało się, 24, jak również, w tym przypadku z powodu, że nie mieści się z klamrami. Więc tylko trochę uciążliwe, ale bardzo łatwo rozwiązać, wystarczy oświadczenie Zmienna poza samej funkcji. Teraz zobaczymy później dzisiaj, można pójść o krok dalej. I można było nawet dostać trochę leniwy - a to nie może być zalecane, w ogóle - ale można nawet dostać leniwy i umieścić zmienną globalnie, że tak powiem, nie wewnątrz funkcję, a wewnątrz pętli, lecz w samym pliku poza z wszystkich funkcji, które zostały napisane, jak ja tutaj, na linii 15. Ale generalnie jest to mile widziana. Ale realizacji jest to rozwiązanie czasem do innych problemów, jak będzie w końcu zobaczyć. Więc teraz, zostawimy to tak. Ale zobaczymy, czy możemy przepisać to po prostu zacząć wyrażanie siebie trochę inaczej. Więc ten program, żeby było jasne, to positive1. Pozwólcie mi iść do przodu i tutaj w moim oknie terminala dokonać positive1, Enter. Kompiluje, okay. Zamierzam uruchomić positive1 wciskamy Enter. Żądam, aby dać mi dodatnia. Powiem -1. To nie działa. 0, 99, który wydaje się działać. Może nie najbardziej rygorystyczny test. Ale przynajmniej jest to ładne Sprawdzanie poprawności, że jesteśmy na właściwej drodze. Więc teraz pozwól mi iść do przodu i otworzyć wersję dwa tego. A co to jest inna już? Realizuje to samo. Ale co się wyskoczyć jak wyraźnie innego tym razem? Tak, tak to bool na zielono. Gedit podkreślił to słowo kluczowe w zielonym znanej jako bool, który jest typu. Nie przychodzi wbudowana w wszystkich wersjach C trzeba to określonej biblioteki. W naszym przypadku, to obejmowały CS50 biblioteki tak, że mają dostęp do bool. Ale w wierszu 18, wydaje się mieć wartość logiczną nazywający wdzięczny. Można więc nazwałem to coś. Ale zadzwoniłem to wdzięczny tylko rodzaj przekazać jakieś znaczenie semantyczne. Więc początkowo na linii 18, jestem wdzięczna, ponieważ najwyraźniej nie Wartość logiczna wdzięczny jest inicjowany na false w linii 18. I wtedy wydaje się to, co zrobiłem tutaj w linii 21 przez 23 to ja właśnie rodzaj przepisany moją logikę. Więc nie funkcjonalnie inna. Ale teraz przewodem 22, i sprawdzenia, czy użytkownik int przewyższa pod 0, a następnie po prostu zmienić wartość wdzięczny prawda. I dlaczego mam to zrobić? Ponieważ w linii 25, zdaje się, mam zamiar sprawdzić warunek. Zrobić pętlę przy wdzięczny jest fałszywe. Tak więc proponuje to jako alternatywa dla wersji jeden, ponieważ jest to co najmniej nieco bardziej intuicyjne, może. Jest to trochę bardziej zakorzeniona w języku angielskim. Więc wykonaj następujące czynności, podczas gdy nie są wdzięczni lub podczas wdzięczny jest fałszywe. I tym razem też, jak się zdaje, nie obchodzi się pamiętać, co użytkownik wpisze ponieważ w ogłoszeniu nie ma zmiennej n. Więc rzeczywiście, I - little white lie tam. Funkcjonalnie program jest nieco inny raz mamy do dna to dlatego, że ja nie pamiętając, co n jest. Ale chciałem też tu wykazać, że choć widzieliśmy getInt i GetString używane na prawej stronie znaku równości dotychczas aby pamiętamy wartość, technicznie, to nie jest absolutnie konieczne. Jeśli z jakiegoś powodu po prostu nie obchodzi, aby zapisać wartość, po prostu chcesz sprawdzić wartość zauważyć, że możemy po prostu napisać to jako getInt otwarty paren, blisko paren. Ta funkcja będzie zwracać wartość, jak już mówili. To będzie oddać int. I tak, jeśli psychicznie myśli takiej sytuacji, kiedy wpisać 99, getInt zwraca liczbę 99. I tak koncepcyjnie, to tak, że mój kod były faktycznie to. Więc jeśli 99 jest rzeczywiście większa niż 0, to wdzięczny staje się prawdziwe. Następnie linia 25 realizuje ooh, skończyliśmy, bo jestem teraz wdzięczny. A w linii 26, po prostu powiedzieć, dzięki za dodatnią liczbę całkowitą, cokolwiek to stało się. Teraz zróbmy niewielki syntaktyczne cukru tutaj, że tak powiem. Zobaczmy, czy uda nam się oczyścić tę linię 25 z tym trzecim i ostatnim wariancji w positive3. Więc zauważyć tylko różnicą jest to, co się teraz linia kodu? Tak, więc 25. I nie byli naprawdę widziałem tej sztuczki jeszcze. Ale widzieliśmy wykrzyknik w poniedziałek, co oznacza co? Więc nie, lub zaprzeczenie. Więc weź wartość logiczną i przerzucić jej wartość. True staje się fałszywe. Fałsz staje się prawdą. Więc to, chciałbym zaproponować, jest nawet trochę bardziej intuicyjny od sposobu pisania kodu bo jeszcze zainicjować wdzięczny false. I nadal wykonaj następujące czynności. Ustawić wdzięczny prawdziwe, gdy nadejdzie czas. Ale teraz możesz naprawdę tylko przetłumaczyć ten kod werbalnie lewej do prawej, jednocześnie nie wdzięczny. Ponieważ bang, lub wykrzyknik, oznacza pojęcie, nie tak podczas nie wdzięczny. Więc jeszcze raz, że nie wprowadzono żadnych nowych pojęć per se. Rozmawialiśmy o logicznych z powrotem, gdy graliśmy z Scratch. Ale teraz możemy zrealizować tylko zacząć pisać nasz kod w wiele różnych sposobów. Tak zwłaszcza w pset1, jeśli jesteś rodzaju walczą dowiedzieć drogę do napisać program, kursy, masz szczęście, bo nie będzie żadnego szereg rozwiązań, które mogą się zdarzyć na. Na przykład, to tylko trzy dla nawet najprostszych programów. Dobrze. A teraz przypomnieć w poniedziałek, wyszliśmy na tej notatce ze zwracanych wartości. Tak więc po raz pierwszy, że napisał program, który nie tylko miał main, ma też swoją własną funkcję niestandardową, że napisałem tutaj. Tak więc w linii 31 poprzez 34, I zostały wdrożone funkcji modułu. To nie jest skomplikowane. To tylko razy w razy, w tym przypadku. Ale, co ważne jest to, że biorę wejście w formie i Wracam wyjście w formie razy po razy w. Więc teraz mam możliwość, podobnie jak kiedyś w printf sam, aby zadzwonić Funkcja ta poprzez wywołanie funkcji modułu. A funkcja kostka zajmuje trochę wejście. A funkcja zwraca jakąś kostka wyjście. I tak dla kontrastu, po prostu zrobił coś printf. Nie zwraca niczego, że zależało - choć, jak na bok, to nie zwraca wartości. Po prostu ogólnie zignorować. Printf po prostu zrobił coś. To miał efekt uboczny drukowania na ekranie. Natomiast tutaj mamy funkcję modułu, który faktycznie zwraca coś. Więc to jest generalnie - dla tych, znane z tego, że jest to dość prosty pomysł. Ale dla tych mniej zaznajomieni z tej idei przekazując wejść i coraz tylne wyjścia, spróbujmy po prostu coś super proste. Czy ktoś zbliża się komfortowo na scenie krótko? Musisz być wygodne, z aparatem na ciebie, jak również. Tak. Dobra, jak masz na imię? KEN: Ken. DAVID J. Malan: Ken. Dobrze, Ken. Chodź na górę. Więc Ken będzie funkcją rodzaju o. I idziemy do przodu i to zrobić. Chodźmy trochę fantazji. Miło Pana poznać. Witamy na środek sceny. Dobrze. Załóżmy, naciśnij ten przycisk tutaj. Dobrze. Więc tutaj masz nowoczesną tablicy. A co ja jestem jest główną funkcją, na przykład. I nie masz iPad w ręku. Naprawdę nie pamiętam, jak - no, faktycznie, nie można powiedzieć, że. I naprawdę nie ma dobrego pisma. I tak w związku z tym, chcę, aby wydrukować coś na ekranie dla mnie. Więc ja jako główny program. I mam zamiar mieć cię powiedzieć, pisząc go w moim podstaw kurczaka i następnie przechodzi ci wejście. Tak głupie, choć to ćwiczenie jest pojęcie funkcji i wywołanie Funkcja i powrotu funkcji tak naprawdę sprowadza się do tego. Jestem głównym. Właśnie napisał printf ("coś") na ekranie. Używam tego programu. I jak tylko printf jest wywoływana, to przyjmuje jeden argument - lub jeden parametr, czasami - między cudzysłów. O to, że argument. Jestem przekazaniem go do Kena. Teraz on jest czarna skrzynka napisane niektóre kilka lat temu, że z pozoru tylko wie, jak wydrukować rzeczy na ekranie. Więc wykonać. To nie jest złe. Tak, bardzo dobrze. Więc teraz Ken odbywa wykonania. Będzie musiał oddać mi wszystko z powrotem? Więc to nie widzieliśmy do tej pory. Ponownie, printf nie faktycznie zwraca liczbę. Ale będziemy ignorować faktu, że do teraz, bo nigdy nie używałem go. Więc to jest to dla Kena. I teraz główny wraca do wykonania - Głównym przejmuje kontrolę, ponieważ program ponownie tej linii kodu printf, odbywa się wykonywanie. A my go o naszej drodze wykonującego wszelkie inne linie są tam. Dobrze. Więc teraz spróbujmy nieco inny przykład. I tym razem tutaj, niech najpierw wyczyścić ekran tutaj. I tym razem, zrobimy cubing funkcję. Ale tym razem, spodziewam wartość wyjściową. Więc idź naprzód i to zrobić. Więc teraz mam linii kodu, który mówi x cube = (x). Czyli let's - linii kodu, przypominam, wygląda tak. x cube = (x). Więc jak to będzie działać? Więc idź naprzód i dać biały ekran ponownie. I mam zamiar napisać teraz w dół od wartości x, które w tej chwili w czas dzieje się, powiedzmy, 2, keep it simple. Więc napisałem na kartce papieru, wartość 2, który jest moim x wartość. I oddać go do Kena. KEN: A ja po prostu napisz odpowiedź? DAVID J. Malan: Tak, po prostu napisać odpowiedź. Okay. A teraz musi zwrócić mi coś. So - perfect. Miło Segue. Więc teraz wręcza mnie wartości 8, w tym przypadku. I co ja mam z tym zrobić? Cóż, faktycznie, zobaczymy. Pobierz to prawo. Co ja mam z tym zrobić? Teraz mam zamiar wziąć tę wartość i faktycznie przechowywać go w tych same bity w pamięci. Ale zauważ, że jestem rodzaju walczy tutaj. Jestem trochę zdezorientowany, bo nie wiem od czego właściwie zapisu wartości x? Bo to, co właśnie zrobić to fizycznie ręka Ken kawałek papieru , który miał wartość 2, która została x. I rzeczywiście, to jest dokładnie to, co się dzieje. Okazuje się, że podczas wywoływania funkcji i przechodzą w argumencie jak "Hello World" lub przekazać w argumencie jak 2, ogólnie, jesteś przekazując kopię tego argumentu. I tak jak ja zapisałem numer 2 tu i wręczył go Ken, które muszą oznacza to, że mam jeszcze kopię 2 wartości gdzieś. Bo rzeczywiście, teraz, że stałam się z powrotem na wartość 8, trzeba cofnąć się w RAM i rzeczywiście napisać 8, gdzie kiedyś miałem numer 2. Tak wizualnie zapamiętać pojęcia przechodząc dosłownie Kopiowanie wartości. Ken nie jego sprawa, ręce mnie coś - w tym przypadku, wartość jak 8. I wtedy coś zrobić z tą wartością, jeśli Aby zachować go wokół. Więc to wszystko będzie zbyt dobrze przed długi. Dziękuję bardzo za ten pokaz tutaj, Ken. Dobrze. Bardzo dobrze zrobione. Zobaczmy więc, jak to w końcu odnosi się do niektórych funkcji nazywa to robiliśmy tutaj. Więc pozwól mi iść dalej i doprowadzić nas z powrotem do cubing przykład tutaj. I zauważ, że jeśli chcemy zacząć biorąc to dalej, idziemy aby mieć na uwadze, że liczba x, który jest przekazywany w tutaj jest inny od tego, co w rzeczywistości jest przekazywane do funkcji. Więc jeszcze raz, to przekazywane przez kopię będzie się dość związany z tematem za chwilę. Warto więc spojrzeć na coś, co nie do końca działa prawo jeszcze. Mam zamiar iść do przodu i otworzyć trzeci przykład buggy, które jest wadliwy przez naturę. I to się nazywa buggy3 i realizuje funkcję swap. Więc tutaj mamy główną funkcją, która x i y arbitralnie inicjowane 1 i 2, odpowiednio. Mogliśmy korzystać getInt, ale po prostu potrzebujesz prostego ćwiczenia. Więc to jest zakodowane jako 1 i 2. W liniach 21 i 22, ale najwyraźniej wydrukować xiy, po jednej w wierszu. Następnie, w linii 23, ja jestem twierdzić zamiana tych wartości, kropka, kropka, kropka. I najwyraźniej wywołać funkcję w wierszu 24 o nazwie Swap która pobiera dwa argumenty. Jest całkowicie legit dla funkcji do podjęcia dwa argumenty. Widzieliśmy printf to zrobić już. Więc Swap najwyraźniej ma X i Y. I jak sama nazwa wskazuje, to mam nadzieję, że to będzie zamienić te dwie wartości. Więc mam prawo na linii 25, zamienione. I przedruk xiy przy założeniu, że oni rzeczywiście zamienione. Ale gdybym rzeczywiście uruchomić ten program - pozwól mi otworzyć okno terminala. Pozwól mi buggy3. Jak sama nazwa wskazuje, to nie skończy się dobrze. Bo kiedy naciśnij Enter, zauważysz, że x jest 1. y 2. I na koniec jeszcze programu, wciąż w rzeczywistości sama. Tak więc na podstawie demonstracji już teraz z Kenem, co się właściwie dzieje? Cóż, nurkować w tej funkcji swap. To super krótki. To tylko kilka linijek kodu długi. Ale co jest podstawowym problemem w oparciu o prostą opowieść tutaj z Kenem? Dlaczego Swap łamane? [Niesłyszalne] Dokładnie. Więc jesteśmy przechowywania do kopii, nie sama zmienna. Innymi słowy, swap najwyraźniej przyjmuje dwa argumenty, int. I to dowolnie nazywane i b. A tutaj, mam przeszedł w xiy, które są odpowiednio 1 i 2. Ale nie jestem dosłownie przechodzącą w x. Nie mówię dosłownie przechodzącą w y. Olewam kopię x oraz kopię y. To tak, jakby prawie tak, jakby skopiowane i wklejone do wymiany wartości, które chcesz to faktycznie manipulować. Więc jeśli to jest w przypadku, gdy program, rozpoczęcie wykonywania linia 35, potem 36 - kiedy się do linii 37, w tym momencie w historii, co to jest wartość? W tym momencie w historii, linia 37, jaka jest wartość w tym momencie? Tak powinno być tylko 1. Zgadza się? Ponieważ x został przekazany jako pierwszy argument. I ta funkcja po prostu arbitralnie woła swojego pierwszego argumentu. Podobnie jest y, drugi argument. I to jest po prostu arbitralnie wywołanie sekund b. argumentów. Teraz ta dychotomia jest rzeczywiście dość prosto wytłumaczyć. Pomyśl o tym. Nikt z nas nie spotkał się z osobą, która napisała printf. Więc na pewno, on nie ma pojęcia, co nasze zmienne 30 lat później idą zostać wywołana. Więc nie musi być rozróżnienie co nazywasz zmienne Funkcje piszesz i co nazywasz zmienne w funkcji jesteś telefonicznie lub za pomocą. Więc innymi słowy, napisałem moje zmienne jako X i Y. Ale jeśli ktoś napisał funkcję wymiany, on czy ona na pewno nie wiem, co moje zmienne będą tzw. Więc sobie sprawę, że to właśnie dlatego masz ten dualizm nazw. Technicznie, mógłby zrobić to przez przypadek. Ale oni nadal być przekazywane w formie kopii. Byłoby to po prostu czysty przypadek estetycznie jeśli tej osoby która napisała Swap użył tych samych nazw. Dobrze. Tak więc w tym momencie w historii, wiersz 37, jest 1. b oznacza 2. I teraz mam postępować, aby zamienić je. Otóż ​​po pierwsze, pozwól mi faktycznie to zrobić znacznie prościej. I nie wiem, co te trzy linie kodu robią. Pozwól mi to zrobić. b dostaje. dostaje b. Gotowe. Dlaczego to jest złamane, logicznie? To rodzaj intuicyjnego rzeczy, prawda? Więc staje się b. Oraz b staje. Ale problemem jest to, że jak tylko linia 37 wykonuje, co jest wartość i B? Sama, 1. Dlatego, że niszczona, by tak rzec, zmieniłeś b, aby dorównać. Więc raz linia 37 zostanie wykonany, to świetnie. Masz teraz dwa egzemplarze nr 1 wewnątrz tej funkcji. Więc wtedy, kiedy mówisz w linii 38, ma b, dobrze, że jesteś trochę pijany. Bo jesteś po prostu przypisanie 1 do 1. Masz trochę stracił wartość, której zależało. Tak w wersji oryginalnej z tym zauważyć, co zrobiłem. I zamiast tego mieliśmy trzecią linię kodu, która wyglądała jak ten. Oświadczam zmiennej tymczasowej - tmp jest bardzo często nazwa do zmiennej tymczasowej. To int ponieważ musi pasować to, co chcę zrobić kopię. Przechowywać kopię wewnętrznej tmp. Więc raz linia 37 została wykonana, Wartość jest - szybkie sanity check - 1. Wartość b oznacza 2. A wartość tmp jest 1. Więc teraz wykonać linię 38. Więc raz Linia 38 wykonuje, nabiera wartości b. I B był 2. Tak jest teraz 2. Więc w tym momencie w historii, jest 2, b oznacza 2, i tmp jest 1. Więc teraz logicznie, możemy po prostu TMP plop jego wartość do b. I gotowe. Więc mamy rozwiązać ten problem. Niestety, kiedy uruchomić ten program w tej formie, w rzeczywistości nie zamieniać żadnych wartości. Ale żeby było jasne, to dlaczego? Naprawiłem logiczny problemu z przed chwilą. Ale znowu, jeśli uruchomić ten program, x i y pozostaną niezmienione do końca roku wykonywania programu. [Niesłyszalne] DAVID J. Malan: Więc nie wrócił nic. Tak, że to prawda. Ale okazuje się, że jest trochę problemem tutaj, bo do tej pory, Jedyne, co udało się nam wrócić to jedno. I to jest ograniczenie C. Można jedynie wrócić naprawdę jedną wartość, w tym przypadku, jestem trochę zakleszczony tutaj bo mogłem zwracać nową wartość x lub może wrócić Nowa wartość y. Ale chcę, zarówno z powrotem. Więc wracając nie proste rozwiązanie jest tutaj. Ale problem zasadniczo brzmi: dlaczego? Co my właściwie zamienione? i b. Ale i b są kopie xiy, co oznacza, że ​​po prostu nie wszystko pracować - po prostu spędziliśmy jak trzy minuty mówisz swapu funkcja i wszystkie trzy z tych zmiennych. I to jest wspaniałe, prawidłowa w izolacji. Ale i zakres b tylko jest w tych liniach tutaj. Więc jak dla pętli, jeśli deklarują liczbę całkowitą i wewnątrz za loop - podobnie, jeśli deklarując ib wewnątrz funkcji, która napisałeś, są one ważne tylko wewnątrz tej funkcji. Co oznacza, że ​​jak tylko zamiana odbywa realizacji i idziemy z linii 24 do Linia 25, X i Y są zmianie. Właśnie straciliśmy dużo czasu zamiana kopii zmiennych. Okazuje się, że rozwiązanie to jest rzeczywiście nieoczywisty. To nie jest zupełnie wystarczające do zwracania wartości ponieważ możemy zwrócić tylko jedną wartość. I naprawdę chcesz zamienić zarówno xiy jednocześnie. Więc mamy zamiar wrócić do tego. Ale teraz, świadomości, że problem zasadniczo wynika z faktu, że A i B są kopie. I są w swoim zakresie. Cóż, spróbujmy rozwiązać to w jakiś sposób. Pozwól, że faktycznie przewijania tu i otworzyć się, powiedzmy, wariant czwarty tego, buggy4. I co z tego? To jest podobne, ale prostsze problemem patrzeć zanim podejmiemy ukłucie w rozwiązania. Program ten nazywa się przyrost. I to najwyraźniej inicjuje integer x 1 na linii 18. I potem ubiegać x jest 1. I potem ubiegać inkrementacji, kropka, kropka, kropka. I następnie wywołać przyrost. Ale potem w liniach 22 i 23, I twierdzą, że został zwiększony. Żądam x jest teraz cokolwiek to jest, 2 prawdopodobnie. Ale ten program jest wadliwy. W czym problem? Tak? [Niesłyszalne] DAVID J. Malan: Dokładnie. Więc x uznano oczywiście na linii 18. To jest w nawiasach klamrowych nawiasach Main. Tak prosta odpowiedź o to, że dobrze, x istnieje tutaj. Nie ma w linii 32. Więc ten program rzeczywiście nawet nie skompilować. Kompilator, gdy próbuję kompilowanie tego kodu, będzie na mnie wrzeszczeć o jakiejś nielegalnej identyfikator, czy coś w tej sprawie. W rzeczywistości, spróbujmy. Jest to marka buggy4. Jest. Korzystanie z nielegalnego x identyfikator w linii 32. I faktycznie, bądźmy bardziej wyraźne tu dziś tak, że jest to przydatne w godziny pracy i w domu. Zauważ, że jest to trochę tajemniczo napisane. Ale fakt, że Clang ma krzyczeli na nas, mówiąc: buggy4.c: 32:5, jest rzeczywiście przydatne. Oznacza to, że błąd jest w linii 32 na pozycji znaku pięciu. Tak więc jeden, dwa, trzy, cztery, pięć. To jest, w tym, gdzie problem. A także, aby pamiętać o godzinach pracy oraz w domu, jestem szczęśliwy tutaj. Mam jeden błąd. To będzie stosunkowo łatwe do naprawienia. Ale jeśli masz cały ekran pełne przeważającymi komunikatów o błędach, znowu, sobie sprawę, że najniżej jeden może być tylko przejawem najwyższego z nich. Więc zawsze ścigać się błędy z góry na dół. Ponieważ nie może być po prostu łańcuchowe efekt sugeruje ci sposób mają więcej problemów, niż faktycznie zrobić. Więc w jaki sposób możemy to naprawić, jeśli moim celem jest przyrost wartości x? Co to jest? Okay. Więc możemy x globalny. Weźmy na skrót, że ostrzegał wcześniej. Ale do cholery, po prostu trzeba szybko naprawić. Więc powiedzmy, int x tutaj. To sprawia, że ​​x globalny. Więc teraz główny ma do niej dostęp. I przyrost ma do niej dostęp. A więc pozwól mi iść do przodu i skompilować to teraz. Producent buggy4, Enter. Wydaje się skompilować teraz. Uciekajmy buggy4, i to zdaje się rzeczywiście pracują. Teraz jest to jedna z tych rzeczy - rób jak mówię, a nie tak jak ja, jak ja właśnie skończyliśmy. Bo w ogóle, nasze programy są dostanie wiele bardziej interesujące i znacznie dłużej niż to. A jeśli Twoje rozwiązanie problemów życiowych jest tylko ah, umieścić wszystkie zmienne na początku pliku, bardzo szybko zrobić programy dostać piekielnie trudne do zarządzania. Coraz trudniej wymyślić nowych nazw zmiennych. Coraz trudniej zrozumieć, co zmienna co robi. I tak na ogół, nie jest dobrym rozwiązaniem. Więc zróbmy to lepiej. Nie chcemy użyć zmiennej globalnej tutaj. Chcę, aby zwiększyć wartość x. Więc mogłem oczywiście - na końcu dnia, to jest rodzaj głupie historii, ponieważ po prostu to zrobić. Ale gdybym nie wiedział o tego operatora, bo nie wolno było zmienić go w głównym sama, jak inaczej mogłaby wdrożyć Ken tu, to czas nie do sześcianu, ale do przyrostu? Jak zmienić ten tutaj? Tak. [Niesłyszalne] DAVID J. Malan: Dobra, dobra. Więc dlaczego nie mogę przejść w X? A potem, zamiast odesłać go, dlaczego nie mogę po prostu zrobić zwrot x + 1? Teraz, kilka rzeczy trzeba zmienić tutaj. Jestem na dobrej drodze. Co jeszcze muszę się uszczypnąć? Ktoś inny. Tak? [Niesłyszalne] DAVID J. Malan: trzeba zmienić typ wartości przyrostu ponieważ nie jest nieważne. Pustka oznacza nic nie jest zwracane. Ale wyraźnie, teraz jest. Więc musi to zmienić na int być zgodne z tym, co Jestem rzeczywiście wraca. Teraz jest jeszcze coś innego buggy tutaj. Tak? [Niesłyszalne] DAVID J. Malan: Więc muszę zwiększyć x? [Niesłyszalne] DAVID J. Malan: Ah, więc muszę zdać x. Więc muszę to zrobić tutaj. Więc prototyp, muszę to zmienić tutaj. Więc to musi być int. To musi stać się - hmm. I rzeczywiście błąd tutaj. Chodźmy naprawić ten jeden pierwszy. Jakie powinny to być w rzeczywistości? Więc to musi być int coś. To może być x. Ale szczerze mówiąc, jeśli zaczniesz wzywając wszystkie swoje zmienne x, to dostanie coraz mniej jasne, który jest który. Więc po prostu arbitralnie wybrać inną konwencję nazewnictwa dla mojej funkcje pomocnicze, funkcje piszę. Będziemy nazywać. Albo możemy nazwać - nazwijmy to even_number się jeszcze bardziej wyraźne. Więc mam do zwrotu tego, co liczba jest plus 1. A teraz muszę zmienić jedną rzecz tutaj i jeden Inna sprawa, tutaj. Co trzeba zmienić na linii 21 po raz pierwszy? Muszę przypisać ją do x. Więc nie mogę po prostu zadzwonić x przyrost. I trzeba pamiętać, odpowiedź, zmieniając wartość x na lewej stronie. I mimo, że x jest teraz na lewo i prawo, że jest całkowicie w porządku, bo z prawej strony zostanie wykonany pierwszy wtedy dostaje koleś w lewo rzecz używana, x w tym przypadku. I wtedy wreszcie, jest to łatwo naprawić teraz. Powinno to tylko mecz, co jest na dole. Int liczba. Dobrze. Więc cała masa zmian dla funkcji naprawdę głupie. Ale przedstawiciel rzeczy, że będziemy coraz częściej chcą robić. Więc upewnij buggy4. I już nie przejmował się gdzieś. O mój Boże. Pięć błędy w jakieś sześć-line programu. Więc co jest nie tak na linii 18, znak 5? Dobrze. Więc muszę zadeklarować to int. Dobrze. Zobaczmy więc, całą masę innych błędów. O mój Boże. 19, 18, 21. Ale znowu, po prostu wyczyścić ekran - L kontrola tutaj - a następnie uruchom ponownie Clang. Więc pięć problemów jest rzeczywiście tak, że jeden. Więc teraz niech uruchomić buggy4, Enter. Uff. x jest zwiększane w pełnym zakresie. Dobrze. Wszelkie pytania na temat przyrostu liczby? Tak? SPEAKER 2: Dlaczego jest tak, że można po prostu zmienić x do liczby w zmiennej nazwę i będzie to wiem, co masz na myśli? DAVID J. Malan: Dobre pytanie. Jak to jest, że mogę po prostu zmienić x do liczby, a program będzie wiedział, od razu? Więc jeszcze raz, pomyśl o tym, jak ten abstrakcji. Więc jeśli jestem głównym i Ken jest pierwotne, szczerze mówiąc, nie obchodzi mnie co Ken nazywa swój iPad. Nie obchodzi mnie, co on nazywa coś, co ma związek z jego wykonania z tej funkcji. Więc to jest szczegółów wdrażania, że ​​ja, główny, nie musimy się martwić. I tak po prostu zmienić go konsekwentnie wewnątrz funkcji, numer tutaj i numer tutaj, to wszystko trwa tak długo, jak przebudować. Jest to coś w rodzaju, jeśli myślisz o - wielu z nas, tych z kierowcy licencje, którzy byli napędzane, lub jeśli już nawet przejechał w samochodzie - większość z nas nie ma pojęcia, jak działa samochód, pod maską. I dosłownie, jeśli otworzyć maskę, większość z nas - w tym ja - nie będziemy wiedzieć, co tak naprawdę mamy do czynienia. Trochę jak można czuć się z rzeczy, jak to teraz. Ale tak naprawdę nie musisz się martwić, jak samochód działa. Nie musisz się martwić, co wszystkich prętów i tłoków i kabli wewnątrz z Samochód faktycznie robi. Więc coś, co nazywasz tłok nie ma znaczenia tu w tym przypadku. Sam pomysł. Tak? [Niesłyszalne] DAVID J. Malan: Jeśli było więcej zastosowań zmiennego momentu xa temu Ci, programista, musiałby zmienić je wszędzie. Lub można dosłownie robić pliku, Menu, a następnie Znajdź / Zamień, coś takiego. Ale będziesz musiał dokonać tych zmian samodzielnie. Trzeba być konsekwentnym. [Niesłyszalne] DAVID J. Malan: określonej kolejności, tak jak tutaj? Jeśli to był int inny numer? Tak. Tak aby ważne podczas wywoływania funkcji. Więc jeśli wołały przyrost o czymś przecinek coś istnieje bezpośrednie odwzorowanie. Pierwsza zmienna, co się nazywa, jest egzemplarz pierwszy Argument tutaj. Sorry, to nie powinno być nawias. Drugi argument, linie się z drugim. Tak aby, tak, ma znaczenie. Dobrze. Przykro mi, że wziął długą drogę do tam dostać. Inne pytania? Dobrze. Zobaczmy więc, jeśli nie możemy namalować obraz tego, co się faktycznie dzieje tutaj pod maską, tak powiem. Więc to jest prostokąt może reprezentować pamięć komputera. Więc nawet jeśli nie masz pojęcia, jak działa pamięć RAM i jak działa, co najmniej Zakładamy, że masz bukiety to te dni. Masz megabajtów niego. Masz gigabajtów niego. I wiemy, że od zera tydzień bajt jest tylko to, co? 8 bitów. Dobra, więc 8 zer i jedynek. Więc jeśli twój komputer ma koncert pamięci RAM, na dwóch koncertach RAM te dni, masz Miliard lub 2 miliardów bajtów pamięci, czyli około 8 mld 16000000000 bity, wewnątrz komputera. Teraz w przeciwieństwie do małego przykład Woolly Willy, to nie cząstki magnetyczne zazwyczaj więcej. Coraz częściej w laptopach co najmniej, to Dyski SSD, SSD, że tylko nie mają ruchomych części. To wszystko jest elektroniczne. To wszystko opiera się elektryczności. Tak, że, chociaż tego prostokąta tak reprezentujący jeden lub dwa gigabajty pamięci, że masz. Więc to jest fragment pamięci. Teraz świat informatyki ma jakby oddzielone kawałki pamięci, aby robić różne rzeczy. Tak na przykład, jeśli jest to komputera RAM - jak sugeruje prostokąt tam - okazuje się, że zgodnie z konwencją, w górnej części pamięci RAM, więc mówić, jest na ogół to, co nazywa fragment tekstu. To są zer i jedynek, które zostały zebrane. Kiedy więc szukałem pod maską, co a.out jest, wszystkie do zer i jedynek - Po uruchomieniu programu, te zera i jedynki są ładowane z dysku twardego jazdy do czegoś, co nazywa RAM. I w pamięci RAM, są narażone na górze. Teraz tymczasem masz inne rzeczy. Zainicjowane dane niezainicjowane dane. Te dwa pokosy pamięci odnoszą się do zmiennych globalnych, które nie często używać. Ale czasami, jeśli nie, to w końcu się tam również. Potem jest kilka innych rzeczy. Zmienne środowiskowe, których nie będziemy spędzać wiele czasu na. Ale wtedy dwie ważne rzeczy, że wróci cały ten semestr, stosu i sterty. Tak więc większość z pamięci komputera jest zarezerwowane podczas uruchamiania programu coś takiego jak stos i coś, co nazywa się sterty. A my nie będziemy mówić o kupie dzisiaj, ale będziemy mówić o stos. A stos ma wyczarować wizualnego jak jadalni Korytka posiłek w Mather House, lub gdziekolwiek się znajdziesz, gdzie jadalnia personel oczyścić je codziennie. One stosu je z podłogi na górę. I podobnie w pamięci, nie jest to pomysł na wprowadzenie czegoś na stosu, kładąc coś na stosie, stawiając coś na stosie. A co mamy na myśli? Cóż, powiększyć tylko połowę niższej tego obrazu, komputer'S RAM, zaproponować następujące. Okazuje się, że po uruchomieniu programu jak a.out lub hello, co Program jest to, że napisałeś, znowu te zera i jedynki są ładowane z dysku twardego - co jest długoterminowe przechowywanie, pozostaje tam nawet kiedy wyciągnąć wtyczkę - załadowane do pamięci RAM. RAM jest szybsza niż dyski twarde. Jest mniejszy niż dyski twarde. Ale to, gdzie programy żyć kiedy używasz ich. Więc kliknij dwukrotnie program na komputerze Mac lub PC - jest ładowany z dysku twardego do pamięci RAM. Tak szybko, jak to jest ładowany do pamięci RAM, zer i jedynek iść na szczycie drogi, tzw segmentu tekstu. Ale potem, jak tylko program faktycznie uruchamia główną funkcja. I główny, jak widzieliśmy, często zmiennych lokalnych. I ma wskazówki i smyczki i znaków i podobne. Więc, gdy Twój program, które zostały napisane lub program, który masz podwójnym kliknięciu używane pewne zmienne wewnątrz main, kończy się na dolnym rogu stos pamięci, że tak powiem. Teraz bardziej konkretnie, co to właściwie znaczy? To po prostu oznacza, że ​​jeśli mieliśmy ponumerować rzeczy - jeśli mieliśmy liczba bajtów pamięci RAM w komputerze, należy zauważyć, że to może być bajt zerowy numer. Może to być liczba bajtów jeden, dwa, trzy, cztery, pięć, sześć, wszystkie aż do jak - 2 miliardy będzie aż tam na górze. Więc innymi słowy, gdy mówimy o pamięci RAM lub pamięci w kategoriach bajtów, to oznacza tylko, że ktoś zdecydował, co do liczby wszystkich te fragmenty pamięci. Więc kiedy trzeba 32 bitów dla int, lub potrzebujesz 8 bitów dla char, gdzie nie kończy się w pamięci? Oraz koncepcyjnie, po prostu kończy się w dolnej części tego rzecz zwana stos. Ale co ciekawe, teraz jest, gdy głównym wywołuje funkcję. Załóżmy, że funkcję o nazwie foo, tylko arbitralne nazwy. , Co się dzieje w głównym jest dole stosu pamięci. Foo teraz kładzie się na górze głównej w pamięci. Więc wszelkie zmienne lokalne, że foo jest skończyć rodzaju koncepcyjnie powyżej tych w main. Jeśli foo wywołuje inną funkcję o nazwie bar, zmienne te kończą się tutaj. Jeśli pasek zwraca coś innego, tutaj, tutaj, tutaj. Więc co jest ciekawe o uruchomieniu programu jest to, że podczas wywoływania funkcji, i jak te funkcje wywoływać funkcje, i jak te funkcje wywoływać funkcje, można zbudować ten stos funkcji w pamięci. I tylko raz w deklaracji funkcji pan zacząć tę pamięć. Tak więc jednym z najprostszych sposobów na brak pamięci w programie komputerowym jest Napisać funkcje, które nigdy nie wróci. Tak na przykład, niech wykazywać nawet z celowo buggy program. Pozwólcie mi iść do przodu i nie # include , int main (void). I mam zamiar zrobić, gdy (2> 1), które prawdopodobnie nigdy nie będzie zmienić na nas. I pozwól mi iść do przodu i robić teraz printf. Właściwie, to będzie mniej wizualnie ciekawe. Zróbmy to. Dla int (i = 0; i> 0). Zróbmy ten błąd, i + +. I nie printf tutaj. Przećwiczmy co głosił. Rzućmy metody tutaj. Chorus nieważne, a powiemy int. A ja powiem, printf - oh, zróbmy to bardziej interesujące. Niech nie faktycznie wydrukować cokolwiek. Zróbmy to. Chorus (i). Dobrze. Więc to jest buggy bo dlaczego? I zmyślam, jak przejść, bo program nie właściwie nic zainteresowania. Ale to nie cel jest. Celem jest napisanie programu, którego główną funkcją co robi, najwyraźniej? Zadzwoń sam. I rzeczywiście, nie potrzebujemy pętli. Powiedzmy nawet uprościć to tylko tak, aby nie stracić z oczu naprawdę fundamentalny błąd. Główne połączenia chór śpiewać jakiś refren. Potem zrobiłem coś głupiego, i miałem rozmowę chorus chorus bo zakłada ktoś zamierza wdrożyć go może. A teraz to nie będzie skompilować jeszcze. Muszę zrobić co? Potrzebuję prototypu, pamiętam. Więc muszę mieć tu refren void (int i);. Więc teraz, jeśli pójdę na dół - faktycznie, użyjmy większe okno. Idziemy do przodu i zrobić refren. Idziemy do przodu i zrobić refren. Korzystanie z niezidentyfikowanym rozgrywającego i. Och, to było głupie. Nie musimy argument. Zróbmy to. Szkoda, że ​​zaczął w ten sposób. Byłoby o wiele łatwiej program do pisania. Więc tam. A teraz chodźmy do mojego okna terminala, re-run dzyń. I jedziemy. To był bardzo szybki. Co właściwie się stało, chociaż? Cóż, teraz mogę dodać linię wydruku, dzięki czemu możemy zobaczyć. Więc pozwól mi powiedzieć, printf, powiedzmy, że jestem tutaj. Dobra, nie ma zmiennych, zostawimy to tak. Pozwól mi ponownie uruchomić make. Pozwól, że re-run refren. I chodź. Dalej. Tak na marginesie, dlaczego nie rozbił się jeszcze? Segmentation fault się super szybko przed. [Niesłyszalne] DAVID J. Malan: Dokładnie. Więc na to potrzeba czasu, aby wydrukować. To po prostu ma więcej pracy komputera części. I tam jest. Segmentation fault. Więc zauważyć, jak szybko uruchamiane programy. Jeśli nie masz nic, drukowanie super szybki. Ale wciąż mam ten błąd segmentacji, ponieważ to, co się dzieje? Cóż, jeśli myślisz o tym, jak pamięć komputera jest określone, to dzieje się głównym. Ale tu - Nazwijmy ten chór, i nazwijmy to refren. A teraz, jeśli mam zrobić moje estetykę rację, to jest po prostu powiedzieć refren, refren, refren, refren, refren, refren, refren, nauseum ad. I w końcu, co się stało? Jeśli duży obraz dosłownie to, co właśnie się dzieje koncepcyjnie? Przekroczeń stosu sterty. Albo, co gorsza, po prostu wszystko, w tym przekroczenia segmencie tekst, który jest do zer i jedynek, które stanowią program. W skrócie, to jest po prostu super, super źle. Zgadza się? Program został gwałtownie się spod kontroli. Używasz sposób więcej pamięci niż zamierzony wszystko z powodu głupiego błąd, w tym przypadku. Lub w tym przypadku, bardzo świadomie zrobić funkcja wywołująca sama. Teraz nie jest tak źle. Funkcje połączeń się rzeczywiście ma wielką moc kiedy używasz go poprawnie. Nie używałem go poprawnie tutaj. Więc to nie jest tak źle. Ale fakt, że w zasadzie nigdy nie przestać nazywać siebie jest podstawowym osłabienie tu tego programu. Więc gdzie jedziemy z tym wszystkim? Cóż, co się naprawdę dzieje? Kiedy wywołujemy funkcję przyrostu, jak robiliśmy w tych przykładach, Mam wartość takich jak 1, że przechodzą w. Mijam w kopii numer jeden. Więc dodaje się dzieje. Więc chodźmy do przykładu inkrementacji. A ten facet rację tutaj. Tak tu jest, co się rzeczywiście dzieje. Gdy zadzwoniłem przyrost, i przechodzą w X, co obrazowo tutaj dzieje jest to - jeśli mają wartość 1 przechowywane tutaj, a ja rzeczywiście wywołać przyrost, który teraz nazywa chóru - Tak, to rzuca mi się tutaj. Więc nazwijmy ten przyrost. I nie wiem, co to następna funkcja będzie. Więc co się właściwie dzieje, jest tu gdzieś w main, mam kawałek pamięci, która przechowuje liczbę 1. Kiedy dzwonię do przyrostu, używam innego fragmentu pamięci, ale teraz mieć kopię 1. Kiedy zwiększyć tę wartość, to staje 2 - strasznie napisany ekran tutaj. Ale wtedy, co się dzieje, jak tylko powróci przyrostu? Ta pamięć tylko zostanie przekazana z powrotem do systemu operacyjnego, co oznacza, że ​​wszystkie zrobiłeś nic przydać. Która została pierwotnie zawarta w głównym jest nadal faktycznie istnieje. Więc gdzie jedziemy z tym? Cóż, okazuje się, że w pamięci masz to z powrotem do tyłu sekwencję bajtów, które można umieścić rzeczy w. I okazuje się, że mamy już coś, że polega na nakładaniu rzeczy z powrotem do tyłu do tyłu do tyłu. Co to jest ciąg, w oparciu o jeden tydzień, a teraz tydzień dwa? Więc jest to tylko zbiór znaków. Okazuje się zatem, jak można umieścić numery w pamięci, podobnie można umieścić znaki w pamięci. A kiedy zaczniemy znaków układają się w pamięci z powrotem do tyłu do tyłu, aby wstecz, okazuje się, że przy użyciu najprostszych rzeczy jak dla pętli lub pętla, możemy iteracyjne - od lewej do prawej w ciągu znaków w ciągu - i zacznij masować je do różnych znaków w ogóle. Może stać B. B może stać C. Tak więc ostatecznie, możemy Angielski zdanie, że rzeczywiście ma sens i konwersji każdego z tych litery po jednym na raz przechodząc przez nasz komputer pamięci pozostawione prawo faktycznie zaszyfrować. Więc weźmy naszą pięciominutową przerwę, a kiedy wrócił, dowiemy rozpocząć ten proces kodowania informacji. Dobrze. Więc zanim nurkowania w pewnym kryptografii i te rzeczy nazywane tablicami, pozwól mi przerwa na wszelkie pytania, bo czuję, że naprawdę rodzaj pomieszania niektóre te tematy. Więc naprawić teraz, jeśli można. Więc po prostu mówił o wartościach. Rozmawialiśmy o argumenty. I rozmawialiśmy o tym pojęciu, które wrócimy w najbliższych tygodniach przyjść, przeglądania pamięci, jak całą masę tych stosie tace, że tak powiem. Z dołu na górę, tak, że każdy podajnik pobiera umieścić na stosie reprezentuje Funkcja, która jest obecnie tzw. Masz pytanie? Więc jak - pozwól mi spytać pytanie. Ciągle psuje, ale teraz it's - you've wszystko widział na twarzy chłopca. Więc wracamy do tego. Więc pozwól mi zadać pytanie tutaj. Pozwól uprościć ten z powrotem do tego co było wcześniej niektóre z naszych wcześniejszych Q & A. A fakt, że przyrost ma otwarty nawias, int liczba, zamknięte nawias. Co int liczba reprezentuje? [Niesłyszalne] DAVID J. Malan: argument. Dobrze, ale co to argument? [Niesłyszalne] DAVID J. Malan: Przepraszam, co to jest? SPEAKER 3: Coś przechodzą w. DAVID J. Malan: Dobra. Więc coś, co możesz przekazać w. I bardziej ogólnie, to tylko wejście. Jeśli piszesz funkcję i że funkcja jest celem w życiu jest do zrobienia coś innego za każdym razem, kiedy go używać, to tylko w ten sposób Aby tak się stało bardzo wydaje się, aby zapewnić to, że dane wejściowe może zrobić coś innego z tego wejścia za każdym razem. Więc trzeba określić dwie rzeczy, gdy funkcja ma wejścia. Musisz określić nazwę, którą chcesz nadać tego wejścia, czysto własnej wygody, aby można było odnieść się do niej w funkcji, którą Sam piszesz, jak ja tutaj, w linii 32. Ale trzeba także określić jego typ, ponieważ C jest językiem programowania że po prostu wymaga że jeśli chcesz zmienną, musisz powiedzieć komputerowi, co typ danych to jest, w dużej mierze tak, że wie ile bitów przeznaczyć dla tej zmiennej. Bo może to być sześć - Przepraszam, że nie będzie sześć. Może być 16. Może być 8. 32 może być nawet 64. Ale komputer musi wiedzieć. Teraz int na lewej stronie przedstawia natomiast co? [Niesłyszalne] DAVID J. Malan: Co to jest? [Niesłyszalne] David J. Malan: typu funkcji, a w szczególności, typ jego wyjścia. Racja. Tak więc o ile rzeczy w nawiasie reprezentuje jego wkład, jeśli istnieją, rzeczą, aby po lewej stronie przedstawia dane wyjściowe. I w tym przypadku, przyrost podobno zwraca int. I tak int jest typ zwracany tej funkcji. Co to znaczy wrócić? Dosłownie użyć zwrotu słowa kluczowego. A jeśli to, co wracają do prawej hasła jest liczbą całkowitą, to jest rzeczywiście zgodny z tym, co obiecał. Nie można było zrobić coś takiego - hello, world - bo to jest ciąg. Oczywiście nie jest liczbą całkowitą. Tak w skrócie, ciężar jest naprawdę na nas, programista, być szczegółowe, jak do tego, co mamy do powrotu i wtedy faktycznie go o jego zwrot. A potem zrobić ciut bardziej jasne kontekst - tam jest znowu. Kontekst - niespodzianka w najbliższych chwilę. Kontekst tu teraz jest, że pamięć komputera jest, ponownie, gigabyte, dwa gigabajty, cokolwiek. Może jest więcej. Może jest mniej. Ale komputer widzi ją jako posiadające różne sekcje. Coś się tam. Coś innego idzie tam. Różnych rzeczy idzie w środku. A dzisiaj, po prostu opowiadać tę historię. Ale wrócimy do tego w czasie. Na razie tylko kawałek pamięci naprawdę dbają o to fragment tekstu dlatego, że po prostu reprezentuje zer i jedynek że Clang działo wyprowadzać. Więc kiedy uruchomić polecenie na klawiaturze jak a.out, lub podwójnie kliknij ikonę na Mac OS lub Windows, program jest ładowany z dysku twardego jechać do pamięci RAM. I to jest koleś na górze komputera RAM, że tak powiem. Teraz w międzyczasie, jak program zostanie uruchomiony i głównym jest wywoływana w program, który napisałem lub program Microsoft lub Apple napisał, każde z jej zmienne lokalne kończy się tam na dnie pamięci komputera. Ale jeśli głównym wywołuje inną funkcję, która sama ma zmienne lub argumenty, kończy się nad nim. A jeśli ta funkcja wywołuje coś, kończy się nad nim, powyższego, powyżej. I tylko raz funkcja jest wykonywana wykonującego stos tac, tak mówić, zaczynają się coraz niżej. I to właśnie wtedy, w skrócie, wyjaśnia, dlaczego, kiedy zadzwonić cube - lub zadzwonić przyrost - jesteś przejazdem w kopii wartości. I co to oznacza obrazowo jest, że jesteś dosłownie pisać nr 1 w innej części pamięci, zmianę, że 1 do 2, w przypadku przyrost - lub do 8, w przypadku modułu - i, że pamięć dala rzucania natychmiast przyrostu lub sześcianu funkcja zwraca. Pytanie. [Niesłyszalne] DAVID J. Malan: Gdzie - zmienne globalne przechowywane są w co Obecnie nazywa się na założone dane lub niezainicjowanych danych. Różnica jest, jeśli masz zmienną globalną, i przypisać go natychmiast wartość przy znaku równości, to kończy się na górze tam. A jeśli po prostu powiedzieć, int x średnik bez wartości, kończy się nieco niższy w pamięci RAM, po prostu konwencji. Inne pytania. Dobrze. Więc ten obraz będzie wracać, ponieważ mamy mocniejsze, co możemy zrobić, z komputerem. Ale teraz, zróbmy krótki wstęp do kryptografii, specyficzny rodzaj Kryptografia to nie rozwiąże wszystkich problemów świata, ale nie rozwiązuje niektóre z nich. W tej sprawie, mamy coś, co nazywa tajny klucz kryptograficzny. I tajne kryptografii klucza, jak sama nazwa wskazuje, pochodzi jego bezpieczeństwo z tajemnicy. Tak na przykład, jeśli jesteś z powrotem w szkole, a ty przechodząc mały sekret list miłosny do chłopaka czy dziewczyny jesteś na zgniatanie - jeśli chciał przekazać, że przez publiczność, to pewnie nie napisze takie notatki w języku angielskim lub cokolwiek jest językiem ojczystym, a raczej ty może zaszyfrować. Albo może po prostu wysłać im wiadomość tekstową tych dni. Ale może rzeczywiście przekazać im uwagę w całej klasie. I zrobić to bezpiecznie, w taki sposób, że przyjaciele i nauczyciel nie wiesz co piszesz, może pochodzić z dość proste algorytm - młody choć może być - wystarczy wspiąć słowa. Więc zamiast pisać, można napisać B. Zamiast B, można napisać C. Zamiast C, D można dodać, i tak dalej. Albo można wymyślić bardziej wyrafinowane tłumaczenia listów do różnych pism. Ale połów jest chłopcem czy dziewczynką, do którego wysyłasz tę notatkę musi coś wiedzieć. Która jest, co, oczywiście? Podoba Ci się to, co twój sekret jest. Podoba Ci się, co to jest mapowanie między AS i B i CS i DS? Czy jest to po prostu dodanie jednego, że tak powiem, do każdej z liter, aby przejść z A do B, B do C? Czy jest to bardziej skomplikowane niż to? Więc ty i twój zmiażdżyć trzeba mieć tę tajną informację. Ale jest rodzaj Catch-22 tutaj. Jeśli jest to pierwszy raz masz ten list miłosny przez klasy, w jaki sposób ten chłopak lub dziewczyna będzie wiedzieć, co tajne nawet jest? Tak tajny klucz szyfrujący nie rozwiązuje wszystkich problemów świata. I jest rzeczywiście związek, że będziemy wracać do kierunku semestru end. Podobnie ma nikt z nas prawdopodobnie nigdy wysłane - Podobnie, w większości nie wiemy, że ktoś pracuje, na przykład, na Amazon.com. A jednak wielu z nas prawdopodobnie kupił rzeczy w Amazon.com. A my nauczono aby zakładać, że e-commerce transakcje są bezpieczne. Zgadza się? URL prawdopodobnie mówi https. Jest może trochę głupie ikona kłódki gdzieś. Istnieje pewien rodzaj kryptografii zabezpieczania informacji o karcie kredytowej między tobą i Amazon.com. A jednak, jeśli kryptografia obejmuje wiedząc jakąś tajemnicę, a jeszcze nie mam znam nikogo w Amazon, a ja na pewno nie zorganizował żadnego rodzaju Tajemnica z kimś z Amazonii, jak jest komputer lub moja przeglądarka to robi? Cóż, okazuje się, że to inne rodzaje kryptografii łącznie, które rozwiązują że problem. Ale na dziś, będziemy koncentrować się na proste, gdzie można zorganizować w awansować znać jakąś tajemnicę, jak plus 1 lub jakiegoś mapowania pomiędzy AS i pensjonatów. A proces ten obejmuje zwykle kryptografii. Masz jakiś zwykły tekst, przedstawiony tu w lewo. Go uruchomić przez jakiś algorytm lub procedury na szyfrowanie. Może to po prostu staje się B, B C. I wtedy staje się to skończyć Cipher tekstu. Tymczasem, po zapłaceniu zgniatać otrzymuje tajną notatkę, on lub ona musi następnie odszyfrować ogólnie cofania że algorytm tak, aby kopię zwykłego tekstu. Teraz istnieją fizyczne inkarnacje to. Na przykład, jest to mały sekret pierścień dekoder. I jest to pierścień w tym sensie, że są dwie tarcze tutaj. Na zewnętrznym obwodzie tej rzeczy, nie litery A do Z, chociaż są one w przypadkowej kolejności. A w środku, jest rzeczywiście niektóre numery, takie, że z tego ring, można trochę skręcić na zewnątrz, ale nie w środku, aby wyrównać numery z literami. A w klipie jesteś o patrz - niektóre z nich można spotkać 24/7 wokół Bożego Narodzenia z filmu o nazwie Christmas Story. Zobaczysz, że było tak mało Ralphie pragnie dowiedzieć się, co trochę sierota TAJNE Annie była dla niego, które zostały przekazane, Myślę, że w tworzą numerycznych wiadomości na seryjnym skrzynki. I trzeba było zgromadzić wszystkie małe karty dołączone w polu zbóż. Trzeba było wysłać je do środka Miałeś wrócić tajny pierścień dekoder, tak, że można w końcu zrozumieć co mapowanie między liter i cyfr, lub litery i litery. Więc dam ci ten krótki klip z Christmas Story motywować Pset 2 i nasza dyskusja, w jednej chwili, z tablic. Mamy tu więc Ralphie. [PLAYBACK VIDEO] -Be wiadomo wszem i wobec, że Ralph Parker zostaje mianowany członkiem Little Orphan Annie Tajnej Kręgu i ma prawo do wszystkich zaszczyty i korzyści występujące w tym zakresie. Podpisany, Little Orphan Annie. Kontrasygnaty, Pierre Andre! Atramentem! Nagrody i korzyści, już w wieku dziewięciu lat. Chodź, przejdźmy się z tym. Nie potrzebuję All That Jazz o przemytników i piratów. -Słuchaj jutro na przygodę kończącej Czarne Pirate Ship. Teraz nadszedł czas na tajne wiadomości Annie dla Ciebie członków z The Secret Circle. Pamiętaj, dzieci, tylko członkowie Secret Circle Annie może dekodować TAJNE Annie. Pamiętaj, Annie zależy od Ciebie. Ustaw swoje szpilki do B2. Oto wiadomość. 12, 11 - -Jestem w moim pierwszym posiedzeniu tajnym. -14, 11, 18, 16 - -Pierre był w świetnej dziś głosu. Mógłbym powiedzieć, że dzisiejsza wiadomość była bardzo ważna. -3, 25. To 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 prywatność i dekodowania. Aha, B. poszedłem dalej. E. Pierwsze słowo to będzie. S. przychodzi łatwiej. U. -Oh, come on, Ralphie. Muszę już iść. -Będę mieć rację w dół, ma. -Gee świst. -T, O. Koniecznie. Upewnij się, że co? Co było mało Orphan Annie próbuje powiedzieć? Upewnij się, że co? -Ralphie! Randy ma iść. Czy możesz wyjść? -W porządku, mamo. Zaraz się. -I był coraz bliżej. Napięcie było straszne. Co to było? Los planety może się zawiesić w bilansie. -Ralphie! Randy ma iść. -Ja się od razu, na litość boską. -Gee, prawie. Moje palce przeleciał. Mój umysł był pułapką stali. Każda pora wibruje. To było niemal oczywiste. Tak, tak, tak, tak. -Pamiętaj, aby pić Ovaltine. Ovaltine? Crummy handlowych? Sukinsyn. [END ODTWARZANIE VIDEO] DAVID J. Malan: Więc nie mamy kryptografii. Tak jak w komputerze, możemy pójść o realizacji lub reprezentujących takie rzeczy? Cóż, musimy sposób wyrażania siebie trochę bardziej elastyczny niż nasze zmienne dotąd pozwoliły. Mieliśmy wskazówki. Mieliśmy znaki. Mieliśmy pływaków i dwuosobowe i kilka innych. Ale to są pojedyncze dzieła z pamięci, że tak naprawdę nie pozwalają nam wyrazić rzeczy, jak słów i zdań i zwrotów. Rzeczywiście, mamy nazywa takie rzeczy sznurki. Ale obiecał, że jest to tak naprawdę tylko uproszczenie w CS50 Biblioteka że mamy zamiar obrać z powrotem. A więc zacznijmy to zrobić tutaj. Pozwólcie mi iść do przodu i otworzyć plik - wszystkie pliki są dostępne jak zwykle online - nazywa array.c rozwiązać problem niezwiązany strun ale maluje zdjęcie tu w jaki sposób możemy wykorzystać coś, co nazywa tablicę. Tablica jest typu. To jest typ zmiennej, rodzaju, który posiada kilka mniejszych typów danych wewnątrz niego z powrotem do tyłu do tyłu do tyłu. Tak na przykład, jeśli chcemy napisać mały program, który daje ci quiz, średnio na kurs, jak 50, który ma dwa quizy, mógłbyś łatwo napisać ten program - na podstawie nawet niektóre z zeszłotygodniowego materiału - używając getInt i kilka zmiennych. Int quiz1, int quiz2, i to całkiem proste. To jest być może 10, 20 linii kodu, Max, realizację programu, który pyta użytkownika dla dwóch wyników quizu, a następnie oblicza ich średnią, dodając je razem, dzieląc przez dwa, i drukowania wyników. Moglibyśmy prawdopodobnie zrobić dość łatwo teraz po pewną liczbę minut. Ale problemem jest to, że załóżmy, że 50 miał trzy quizy lub cztery. Załóżmy, że chcesz użyć tego samego programu dla klasy, która miała tygodniowy quizów. Pomyśl o klasie, która co tydzień quizy. Jeśli jest tak jak 16 lub tak tygodni w semestrze, teraz masz 16 zmiennych - int quiz1, int quiz2, int quiz3, int quiz4. Jak tylko zaczniesz widzieć tę nadmiarowość, to kopiowanie i wklejanie kodu, należy zacząć, aby ci szkoda że nie było lepszego sposobu. I na szczęście, bo z tablic, jest. Więc zróbmy to. Po pierwsze, pozwól mi przedstawić bardzo prostą rzecz, że nie już używana do tej pory, ale zobaczysz go okazjonalnie w kodzie. To jest to, co zwykle nazywa się stała. Więc to jest stała w tym sensie, że wartość ta nie zmienia. Konwencja człowieka przy tworzeniu stałej jest wykorzystać cały kapitał litery, po prostu tak, że tak naprawdę wyróżnia się w kodzie. I specjalne słowo, że używasz w C # jest zdefiniować. Więc jeśli mówisz, # define, a następnie spację, a następnie wyraz, który chcesz użyć do Stała nazwa, a następnie wartość stałą. Więc uprzedzenia, to jest różne od przypisując coś do zmiennej. Nie ma znaku równości. Nie ma średnik. To, co się powszechnie znana jako dyrektywa preprocesora, ale o że kolejny raz. Na razie, to tworzy niezmienny nazwie których rzeczywista wartość QUIZZES Wartość liczbowa jest 2. Więc wszędzie widzisz quizy, konkursy, quizy, całej tej sprawy, to tylko numer 2. Teraz, gdy patrzę na głównym teraz zobaczmy, jak to działa. Po pierwsze, to wygląda trochę tajemniczy. Ale to wszystko rzeczy z tydzień jeden. Zapytaj użytkownika o klasach. W jaki sposób możemy to zrobić? Cóż, w wierszu 22 - to jest naprawdę soczyste część - Oświadczam, pływaka, ale nie tylko pojedyncze float. Jestem deklarując raczej tablicę wartości zmiennoprzecinkowych. Że zmienna będzie się nazywać gatunki, jak sugeruje tutaj. Ale tylko kawałek nowej składni, a następnie są te nawiasy kwadratowe, fakt Powiedziałem, że gatunki, pływak, a następnie otworzyć wspornik a następnie numer. Wskazówka, jeśli jest to stała, to jest tak, jak to zrobiliśmy. Oznacza to, że komputer hej, daj mi dwa pływaki i niech wspólnie zadzwonić ich gatunki. Jest to w przeciwieństwie do bardziej żmudne takiego. Spławik grade1, float grade2, i tak dalej. Więc tablica pozwala nam na realizację tego pomysłu, ale znacznie mniej messily w taki sposób, że możemy napisać jedną linię kodu, zamiast, powiedzmy, 16 dla 16 Semestr tygodni. Więc nie chcą ciężko kod 2, bo jeśli myślisz o tym teraz logicznie - załóżmy następny rok CS50 zmiany 3 quizy zamiast. I miałem numer 2 tutaj. Miałem numer 2 tutaj. Miałem numer 2 tutaj. Miałem numer 2 tutaj. To staje się bardzo uciążliwe i bardzo łatwo zepsuć i przypadkowo zmienić jedna wartość do 3 i przegapić jakieś inne wartości 2. Więc mam zamiar zamiast streszczenie to dalej i wykorzystać tę stałą, że z jego nazwa wskazuje, nigdy się nie zmienia. A teraz, bez względu na to, czy mamy w tym roku różne quizy lub następnego, I tylko zmienić go w jednym miejscu, tu na górze. Więc to wszystko jest stała. Tymczasem nowe pojęciowy cechą jest to, że z układu. Więc nawiasy kwadratowe mi to wiele pływaków i pozwala mi zbiorowo Nazywamy je gatunki tutaj. Więc teraz zobaczmy, co mam zamiar zrobić. Tu, w linii 24 jest początkiem pętli for. To naprawdę nic szczególnego. To jest po prostu za pomocą quizów zamiast liczby zakodowane. Ale nie ma nic intelektualnie inaczej tam od zeszłego tygodnia. To tylko printf. Więc printf ("liczba quizu% dz% d"), bo po prostu chcę wydrukować dać mi quizu numer jeden z dwóch i dwóch na dwa. Więc to jest czysto estetyczny rzeczą. Ale interesujący jest teraz w wierszu 27. W celu wypełnienia w jednej z dwóch zastępczych w zmiennoprzecinkowych wartość, ponownie użyć nawiasów kwadratowych. W tym przypadku, używam i. bo to dla pętli rozpoczął się i wyrównał jakie wartości, najwyraźniej? 0. Tak więc w pierwszym iteracji tej pętli, to jest chociaż Napisałem to w kodzie. Lecz na drugiej iteracji tej pętli, to jest chociaż Napisałem to w moim kodu. Ale fakt, że używam zmienną jest doskonały, ponieważ, jak sama nazwa sugeruje, to zmieniając jej wartość na każdej iteracji. Więc jestem wypełnienie tej tablicy jedno miejsce w czasie. Co oznacza ta tablica wygląda? Cóż, powód narysowałem to super proste prostokąt na ekranie o Zanim było tego powodu. Tablica jest tylko fragment pamięci następuje kolejny kawałek pamięci, następnie inną ilość pamięci, i tak dalej. Więc jeśli moja tablica ma rozmiar 2, w tym przypadku tutaj, wszystko będę robić przez wpisując w moich wyników quizu, jak tutaj. Mam 100 na ten jeden. A potem dostałam 99 na ten jeden. Wtedy ta pamięć może nawet nie być stosowane, ponieważ mam tylko pytanie Komputer dla tablicy o rozmiarze 2. Te kwadraty są nadal. Zgadza się? Masz jeszcze dwa gigabajty pamięci RAM, nawet jeśli jesteś tylko prosząc o dwa pływaki. Więc idea tablic jest to, że komputer po prostu ma kawałek pamięci a następnie rozdziela mniejsze kawałki z powrotem do tyłu do tyłu do tyłu. A więc to wszystko, tablica jest. To ciągły fragment pamięci, wewnątrz którego można umieścić rzeczy. Teraz to się stanie wtedy zrobić tylko trochę nudne arytmetyki. Gdybym przewiń tutaj, to jest tam gdzie następnie iteracyjne nad tablicy. I pochodzą z sumowania wszystkich wartości w tablicy. A następnie użyć funkcja ROUND tu faktycznie Podsumowując podzielona przez quizy. Ale pozwól mi machać ręką na to jako rodzaj dość arytmetyki do teraz. Ale wszystko, co robi dla mnie ostatecznie jest obliczenie średnią. Więc najpierw quizu oraz sekunda quiz, podzielić przez 2, a następnie drukowanie go jako int. Ale niech teraz przejście do innego przykładu nazwie string1, który maluje podobny obraz, ale ciągi używane. Pozwól mi iść dalej i uprościć ten na chwilę. I odpuść wcięcie teraz. Wskazówka w linii 19 w tym przykładzie, mam ciąg od użytkownika. Zauważmy jednak, co mam robić w następnej linii 22 dalej. Jestem rzeczywiście Iterowanie od i do - i to jest nowy trick - strlen, długość łańcucha. Jest to funkcja, która pochodzi z C, że jeśli przekazana ciąg, to mówi Ci, ile znaków jest w tym ciągu. To wszystko. Fakt, że jest to strlen zamiast długości łańcucha to tylko dlatego, że jest bardziej zwięzłe. 30 lat temu, ludzie lubią pisać rzeczy tak zwięźle, jak to możliwe. Więc trzymam tę konwencję tutaj. i + + po prostu oznacza, inkrementacja i w każdej iteracji. A teraz to zauważyć, co jest naprawdę interesujące. Tak więc w wierszu 24, mówię komputer, daj mi znak, osiem bity, i nazywają to c. Ale co to jest to na prawej stronie mówi? W języku angielskim, co to przedstawia? [Niesłyszalne] DAVID J. Malan: Dokładnie. Daj mi pierwszy znak w tablicy. Lub, bardziej ogólnie, daj mi i-tego znaku w tablicy. I uświadomić sobie, że to ważne teraz, że jako naukowcy komputerowych, jesteśmy faktycznie licząc od 0. Nie masz swobodę teraz zacząć robić. Teraz masz się zachowywać zgodnie z oczekiwaniami i komputera liczyć od zera, ponieważ [0] będzie pierwszy znak w ciągu. [1] będzie sekundy. [2] będzie trzecie i tak dalej. Więc ten program, jeśli go skompilować - to znów, string1. Tak zrobić string1. A teraz biegnę string1 w moim oknie terminala. To oczekiwanie na wejście, więc mam zamiar napisać, powiedzmy, Dawida. Enter. A teraz wypisuje DAVID wszystko na różnych liniach, ponieważ zauważyć to, co robię. Jestem drukowania jeden znak na raz. Teraz nie będziemy wchodzić w szczegóły, dziś na ten temat. Ale przed chwilą usunięty tej kontroli tutaj. Okazuje się, że jeśli użytkownik zachowuje się niegrzecznie, kontradyktoryjności, lub po prostu mylić, rzeczywiście można nie dać ciąg jakiejś długości. Jeśli trafisz na niewłaściwy klawisz na klawiaturze, możesz dać żaden łańcuch w ogóle. Lub jeśli jesteś złośliwy, możesz spróbować wkleić w gigabajt w wartym esej wypełnić ten ciąg. A jeśli komputer działa z pamięci, okazuje się, że będziemy wrócić tę szczególną wartość o nazwie null. Więc teraz, po prostu wiem, że istnieje wartość ta nazywana zerowy że Pozwoli nam to sprawdzić, kiedy jesteśmy z pamięci, między innymi. Ale jeśli mogę otworzyć teraz ciąg2, zauważają różnicę. Zauważają różnicę tutaj ciąg2. Ciąg2, to dla pętli jest trochę inaczej. Pozwól usunąć wartości null tak, że możemy mówić o tych, innym razem. Ale co innego w pętli for i tym razem? A ja mogę wrócić do poprzedniego przykładu. Więc to jest wersja dwa. To jest jedna wersja. Raz, dwa, raz dwa. Więc strlen połączenie jest gdzie? Jest w pierwszej części pętli for. Wszelkie myśli, dlaczego to robię? Tak. [Niesłyszalne] DAVID J. Malan: Więc nie wywołać funkcję za każdym razem. Dokładnie. Przypomnijmy dla pętli, że są super proste po rodzaju Rozumiem, że jest inicjalizacja, stan i update. Problem jest, że dzieje się na każde warunki iteracji pętli. A więc w tym przykładzie, co jest złego w tym, , że to jest mój stan? Dzwonisz strlen znowu i znowu i znowu. Ale kiedy już wpisane w David, długość tego ciągu wynosi pięć. I to nie zmieni się w każdej iteracji pętli, ponieważ ciąg nadal-D-V-I-D. Więc jest to aluzja do tego, co dzieje się coraz ważniejsza idea znana jako decyzji projektowych, gdzie - po prostu nie że komputer robić niepotrzebnej pracy. Teraz, tak jak zapowiedzią Pset 2, PSET 2 w standardowej wersji jest będzie wyzwanie do rzeczywiście wdrożyć pewną liczbę cyfr, niektóre liczba algorytmów szyfrowania, tak aby można zarówno szyfrowania i deszyfrowania tajne wiadomości, podobnie jak jeden Ralphie nie dekodowane. W edycji hakerów z Pset 2, będziemy iść trochę dalej. Zamierzamy przekazać Ci plik z rzeczywistego systemu komputerowego, który zawiera cała masa nazw użytkowników i haseł zaszyfrowanych rzeczywistych i wyzwanie za wydanie hacker będzie złamać tych haseł i Rysunek co kryptograficznej lub co sekret został użyty do rzeczywistości wygenerowania tych haseł. A my zrobimy to za pomocą nowej funkcji tu C, że dam po prostu demo, znany jako argumentów wiersza polecenia. Okazuje się, jak niektórzy z was mogą zobaczyć w sekcji lub w podręcznikach, główny nie zawsze muszą być unieważnione w nawiasach. Okazuje się, że głównym można zapisać w ten sposób, z dwoma argumentami, argc i argv, gdzie argc jest liczba słów, które po wpisaniu nazwa programu na linii poleceń. A argv jest rzeczywiste słowa. I jak nawiasy kwadratowe tam sugerują, argv jest najwyraźniej tablicą. To będzie ciąg po sznurku po sznurku w pamięci. Więc co będziemy w stanie zrobić, począwszy Pset 2, jest coś takiego. Jeśli zrobię argv1, który jest przykładem wrócimy do w poniedziałek, i uruchom to należy zauważyć, że nie wydaje się, aby zrobić coś jeszcze. To po prostu wypisuje swoją nazwę. Ale jeśli powiem klasa goodbye, zauważ, że ten program najwyraźniej przechodzi nad każdym z wyrazów, które zostały wpisane w wierszu polecenia. I środki, dzięki którym zyskamy dostęp do słów, które użytkownik ma wpisane w wierszu polecenia jest zmiana głównego, zaczynając w ten weekend, z int main (void) int main (argc, argv). I w ten sposób będzie urodzony argumentów wiersza poleceń. A kiedy się naprawdę wyrafinowane na to, że będziesz w stanie napisać naprawdę trippy programy, takie jak ten tutaj, co wykracza poza niektóre funkcjonalności robiliśmy dotychczas, ale wszystkie bardzo silny. Będziemy więc zostaw to na ekranie. I zobaczymy w poniedziałek.