[Powered by Google Translate] [Tydzień 2, ciąg dalszy] [David J. Malan, Harvard University] [To jest CS50. - CS50.TV] Dobrze. To CS50, i jest to koniec 2 tygodniu. Jeśli spodziewasz się być głodny w tym czasie jutro, wiem, że mamy zamiar 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. W prawie za miesiąc, kurs zostanie udostępniona wszystkie szerzej poprzez EDX, poprzez które w Internecie ludzie będą mogły podążać, angażować się w trakcie dość aktywnie, w rzeczywistości. Będą przy użyciu urządzenia i CS50 CS50 Omów i większość z różnych narzędzi, które już zostały za pomocą tego semestru. A jedną z inicjatyw chcielibyśmy podjąć jako eksperyment w tym roku jest zobaczyć, jak wiele treści można tłumaczyć do innych języków mówionych i pisanych. Więc jeśli możesz mieć zainteresowanie uczestnictwem w tym projekcie czym będziemy dostarczać angielskiego transkrypcje i napisy na kurs w wykładach i szorty i seminaria oraz sekcje i podobne, jeśli mówić płynnie lub pisać płynnie jakiś inny język, chcielibyśmy zaangażować się w ten projekt, za pomocą którego można wziąć na jeden lub więcej filmów, 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 i na prawej stronie tam w czarnym obok tych stempli czasowych, zobaczysz różne rzeczy, które wyszły z moich ust, że dzień, a pod nim będziesz w stanie przetłumaczyć na inny język dokładnie to, co jest między mapping, w tym przypadku Polski 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ą twoje słowa zobaczyć i przeczytać przez potencjalnie tysięcy ludzi tam, proszę uprzejmie uczestniczyć. Jedno słowo o kociaka od poniedziałku. Lest wysłaliśmy zbyt straszną wiadomość, zdają sobie sprawę, że w godzinach pracy sugerują oraz sekcje sugerują, konstrukcja jest oczywiście bardzo się, że uczniowie współpracują i mówić do pracy za pośrednictwem zestawów problemowych i problemy razem, i naprawdę linia tylko sprowadza się do, ponownie, praca, którą ostatecznie należy przedłożyć własny. I tak szczerze mówiąc, w godzinach pracy urzędu, jest to całkowicie normalne, jest to całkowicie się spodziewać nawet do rozmowy z pewnym znajomym obok. Jeśli on lub ona ma problemy z jakimś tematem i jesteś jak, "Och, dobrze, dam ci dostrzec pewnego wiersza kodu, który napisał, że" jest w porządku, tak się dzieje, i to bardzo sprzyja, jak sądzę, z procesem uczenia się. Gdzie linia zostaje przekreślony jest gdy głowa jest pochylona nad rodzajem tutaj zbyt wielu sekund lub minuty za to naprawdę właśnie zostały odblokowanie okazja dla znajomego, a już na pewno, kiedy wszystko się wymieniane za pośrednictwem poczty elektronicznej i Dropbox i tym podobnych, tam też jest linia. Więc za wszelką cenę 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ć naprawdę powinny być produktem swojego dzieła, a nie ktoś inny. I tak jeden z domeny specyficznych problemów pset2, który wyjdzie późno jutro, jest nurkowanie w świat kryptografii co to sztuka szyfrowania lub kodowania informacji, i to ostatecznie dotyczy świata bezpieczeństwa. Teraz, bezpieczeństwa dla większości z nas jest w formie mechanizmów dość prozaicznych. Każdy z nas ma nazwy użytkownika 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 prawdopodobnie nie jest najlepszym pomysłem, jak omówimy kierunku semestru końca. Jeśli hasło jest napisane na karteczki - nie żart - na monitorze, że zbyt niekoniecznie jest najlepszy projekt, ale dość częstym 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 poprzez ukryty dokument Word gdzieś na dysku twardym, który zawiera wszystkie hasła ale to jest w folderze, że nikt nie będzie szukać w, to też nie jest bardzo bezpieczny mechanizm. I co z tego pset2 wprowadzi to sztuka kryptografii i kodowania informacji, aby takie rzeczy jak hasła są bardziej bezpieczne. Kontekst jest to, że z niepewnych danych jest możliwość zaszyfrowania go 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 wyraźnie nie całkowicie oczywiste. A my zatoczyła koło dzisiaj odciąć co ta tajemnica wiadomość tutaj jest. Ale w prawdziwym świecie komputerów, rzeczy, nawet nie wyglądają jak mogą one być zwroty angielskie. Na przykład, jest to, co można znaleźć w standardowym systemie Linux lub Mac lub UNIX komputera w pliku, który był kiedyś, dawno nazywane pliku haseł. Obecnie został przeniesiony do innych miejsc. Ale jeśli spojrzeć na właściwym miejscu w systemie, pojawi się nie tylko swoją nazwę użytkownika lub innych osób w systemie, ale zobaczysz zaszyfrowaną wersję swojego hasła. Rzeczywiście, tam krypta słowo sugeruje, że następujące rzeczy jest szyfrowane, i ta seria pozornie przypadkowych liter i cyfr i znaków itd. można odszyfrować tylko ogólnie znając jakąś tajemnicę - tajne słowo, tajny numer - i tak rzeczywiście, sztuka kryptografii ostatecznie sprowadza się do zaufania jakiegoś i wiedząc, że ktoś czegoś nie robi. Więc będziemy badać to w nieco bardziej szczegółowo dziś iw Pset przyjść. A teraz słowo na pass / fail. Zwłaszcza że niektórzy z was zanurkował pset1, urządzenia, i bardzo nowy świat dla siebie, uświadomić sobie, że frustracja i zamęt i tylko trudności techniczne są bardzo należy się spodziewać, zwłaszcza z pierwszym PSET, gdzie jest tak wiele nowych, tylko zapoznania się z ls i cd i wszystkie te tajemnicze polecenia i nowe otoczenie, a 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 konstrukcji nośnej. Sekcje rozpocząć tę niedzielę nadchodzi. Ale co najważniejsze, jeśli czujesz się po prostu, że to nie jest świat dla ciebie, sobie sprawę, że to naprawdę nie wystarczy czasu. I gdyby nie to, za możliwość lat temu dla mnie podejmowania przepustkę klasy / nie, Szczerze, nigdy bym nawet postawił nogę 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 w niektórych innych wodach całkowicie, należy z pewnością 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 próbuje coś które mogą nie być zaznajomieni z tobą, a ty w końcu robić, w większości przypadków, całkiem w porządku, być może nawet do zaskoczenia. Iw bardziej konkretny sposób, co myślę pass / fail ogólnie robi, zwłaszcza jak może masz doświadczenie z pset0, jeśli umieścisz w 10 godzin, 15 godzin, 25 godzin do jakiegoś Pset i jesteś po prostu walić głową w ścianę i robi się bardzo późno w nocy ale ty podjął Pset 90% drogi i po prostu nie mogę zrozumieć jednej rzeczy, pass / fail naprawdę ma przewagę od klasy, jak ta, gdzie można sortować z radością powiedzieć: "Dobra, wiem, że nie jest doskonały, ale pracował mój tyłek na tym, że jestem bardzo 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 Wi-Fi, wiem, że jest CS50 SSID, Wi-Fi, pływających wokół że możesz mieć więcej szczęścia dla. Jest to trochę ironiczne, że hasło do tego, jeśli chcesz spróbować połączyć się z tym dla lepszych prędkości - i daj nam znać, czy to nie lepsze - to 12345, aż do 8 bo 8 jest bardziej bezpieczny niż 5. Więc jeśli potrzebujesz Wi-Fi hasła, łączyć się bezprzewodowo CS50 tutaj, 12345678, 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 wszelkiego Apple, rzeczy. What I wykopali z kilku lat wstecz był ten plik tutaj, iUnlock.c, tylko trochę bardziej konkretne i bardziej złożone niektóre z bardziej podstawowych programów w C, który został nam pisania. Więc otworzyłem ten plik, iUnlock.c. Jest on dostępny na stronie Wykład na dziś. Z lewej strony widać długą listę funkcji. Więc człowiek, który napisał to napisał dużo funkcji, więcej niż tylko main. Kiedyś całą masę bibliotek tutaj, a jeśli zaczniemy przewijanie, co to właściwie jest to pierwszy, 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, które Apple nie chce ludziom robić, ktoś wziął czas, aby dowiedzieć się dokładnie, w jaki sposób mogą wykorzystać błędy oprogramowania, błędy, błędy, w oprogramowaniu firmy Apple, a więc urodził iUnlock.c-- że jeśli on skompilowany na komputerze i zainstalować go na iPhone , który został podłączony do komputera poprzez, powiedzmy, kablem USB, To daje administracyjne lub uprawnienia administratora na iPhone i niech to zrobić bardzo dużo, co chcesz. I tak nie było to fascynujące kotka i myszkę pomiędzy Apple a resztą świata, w szczególności, ponieważ, podobnie jak wiele firm, próbują zablokować ich rzeczy w dół, tak że można tylko z nim zrobić, co zamierzają. Ale dzięki takimi ludźmi i zrozumienia szczegółów niskopoziomowych - iw tym przypadku programowania C - i wiele znanych konstrukcji że zaczęliśmy grać z, jesteś w stanie naprawdę wykorzystać sprzęt w sposób, z potrzebami 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. To trwa jakieś liczby całkowitej jako argumentu, nie zwraca nic, ale wydaje się pętli z pętli for tutaj i jeśli warunek, jeśli przerwie stanu, i jakoś odnosi się do numerów wersji jeśli przewiń w dół choć wiele z tych słów kluczowych będą nowe. I jest mnóstwo funkcji tutaj nigdy nie widziałem i nie mogą kiedykolwiek zobaczyć ciągu semestru. Na koniec dnia, to takie same zasady i logikę, że graliśmy z tak daleko. Więc to jest zbyt stary, by złamać iPhone 3s lub 4s lub wkrótce 5s tych dni, ale wiem, że to wszystko jest bardzo wiele pochodzi z tego świata, że ​​mamy zanurkował. Rzućmy okiem na przykład trochę bardziej prosty: ten, po prostu, żeby rozgrzać z pewnym składni, a także innego rodzaju danych że rozmawialiśmy o, ale nie bardzo widać w C. Jest to plik o nazwie positive1.c, a za komentarze na górze, to po prostu wymaga, aby użytkownik zapewnić liczbę dodatnią. Więc jest to przykład do-while, który jest miły dla użytkowników interaktywnych programów gdzie trzeba poinformować użytkownika coś zrobić, a jeśli nie współpracują krzyczysz na nich lub odrzucić swój wkład. Sprawa w punkcie: Mam zamiar zrobić linie 19 do 24 tak długo jak użytkownik nie dał mi liczbę dodatnią. Ten szczegół tutaj na linii 18, dlaczego Oświadczam n powyżej tej całej pętli konstruowania w przeciwieństwie do prawej, gdzie faktycznie dbają, aby uzyskać n obok linii 22? Tak. [Animacja] Scope. >> Tak, więc to kwestia zakresu. A w laika, co to zakres odnosi się do? Tak. >> [Niesłyszalne reakcja studentów] >> Czy możesz mówić trochę głośniej? [Uczeń] Gdzie można uzyskać dostęp do tej zmiennej. >> Perfect. Gdzie można uzyskać dostęp do konkretnej zmiennej. I ogólnie, zasada jest dotychczas, że zakres niektórych zmiennej jest zdefiniowany przez ostatnich klamrowych nawiasach które 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ę? >> [Uczeń] 25. [Malan] 25, a okazuje się, 24, jak również dlatego, że w tym przypadku to nie wchodzi w nawiasy klamrowe. Więc tylko trochę uciążliwe, ale bardzo łatwo rozwiązać, po prostu deklarując zmienną poza samej funkcji. Zobaczymy później, dziś można pójść o krok dalej a może nawet trochę leniwy. I nie jest to zalecane w ogóle, ale można nawet dostać leniwy i umieścić zmienną globalnie, że tak powiem, nie wewnątrz funkcji, nie znajduje się wewnątrz pętli, ale w samym pliku, poza wszystkimi funkcjami napisałeś, jak ja tutaj, na linii 15. Jest to na ogół dezaprobatą, ale realizacji jest to rozwiązanie innych problemów, czasami, jak będziemy w końcu zobaczyć. Więc teraz zostawimy to tak, ale zobaczymy, czy możemy przepisać to tylko zacząć wyrażania sobie trochę inaczej. Ten program, żeby było jasne, to positive1. Pozwólcie mi iść do przodu i tutaj w moim oknie terminala dokonać positive1, Enter. Kompiluje dobrze. Zamierzam uruchomić positive1 wciskamy Enter. Żądam, aby dać mi dodatnia. Powiem -1. To nie działa. 0, 99. To 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ę 2 z tym, i to, co już jest inna? Realizuje to samo, ale co wyskoczyć jak wyraźnie innego tym razem? Ten bool na zielono. To jest podświetlony na zielono, to kluczowym znany jako bool, która jest typu. Nie przychodzi wbudowana w wszystkich wersji C. Trzeba uwzględniać szczegółowe biblioteki. W naszym przypadku, to obejmowały CS50 biblioteki tak, że mamy dostęp do bool. Ale w wierszu 18, wydaje się mieć wartość logiczną nazywający wdzięczny. Mógłbym nazwał to nic, ale nazwałem to wdzięczny tylko rodzaj przekazać jakieś znaczenie semantyczne. Więc początkowo na linii 18, nie jestem najwyraźniej wdzięczny ponieważ 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 I już jest po prostu rodzaj przepisany moją logikę. Więc nie funkcjonalnie różne, ale w linii 22 teraz sprawdzić, czy int użytkownik dostarczył jest większa niż 0, a następnie po prostu zmienić wartość wdzięczny prawda. I dlaczego mam to zrobić? Ponieważ w linii 25, najwyraźniej mam zamiar sprawdzić warunek. Zrobić pętlę przy wdzięczny jest fałszywe. Więc zaproponowałem to jako alternatywa dla wersji 1 bo to przynajmniej trochę bardziej intuicyjne być może, że to trochę bardziej zakorzeniona w języku angielskim. Więc wykonaj następujące czynności podczas gdy nie jesteś wdzięczny lub podczas wdzięczny jest fałszywe. I tym razem też mi się zdaje, nie obchodzi się pamiętać, co użytkownik wpisze w ponieważ zawiadomienia nie ma zmiennej n, więc faktycznie, mały biały leżą tam. Funkcjonalnie program jest nieco inny raz mamy do końca tego bo 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 dotąd tak, że 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, open 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, po wpisaniu w 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, a następnie staje się prawdą, wdzięczny, Następnie linia 25 realizuje ooh, skończyliśmy, bo jestem teraz wdzięczny, 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 w tym wariancie trzecim i ostatnim w positive3. Zauważ tylko różnicą jest to, co się teraz linia kodu? >> [Uczeń] 25. >> [Malan] Tak, 25. I nie byli naprawdę widziałem tej sztuczki jeszcze, ale widziałem wykrzyknik w poniedziałek, co oznacza co? >> [Uczeń] Nie. Nie >> lub zaprzeczeniem. Więc weź wartość logiczną i przerzucić jej wartość. True staje się fałszywe, fałszywe staje się prawdziwe. Więc to, chciałbym zaproponować, jest nawet trochę bardziej intuicyjny sposób pisania kodu bo jeszcze zainicjować wdzięczny false, nadal wykonaj następujące czynności, Ustawić wdzięczny prawdziwe, gdy nadejdzie czas, ale teraz można naprawdę tylko przetłumaczyć ten kod werbalnie lewej do prawej, while (wdzięczny!), bo punkt huk lub wykrzyknikiem oznacza pojęcie nie więc gdy 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 uświadomić sobie, teraz możemy po prostu zacząć pisać nasz kod na wiele różnych sposobów. Tak zwłaszcza w pset1 jeśli jesteś rodzaju walczy, aby dowiedzieć się sposób pisać jakiś program, kursy są masz szczęście, bo może być dowolna ilość rozwiązań , które mogą się zdarzyć na. Na przykład, jest to tylko 3 do nawet najprostszych programów. Dobrze. A teraz przypominam poniedziałek wyszliśmy na tej notatce ze zwracanych wartości. Tak więc po raz pierwszy napisaliśmy program, który nie tylko miał main; ma też swoją własną funkcję niestandardową, że napisałem tutaj. Tak więc w linii 31 przez 34 I zostały wdrożone funkcji modułu. To nie jest skomplikowane. To jest po prostu * a * w tym przypadku. Ale, co ważne jest to, że biorę wkład w postaci i wracam wyjście w postaci * a *. Więc teraz mam możliwość, podobnie jak kiedyś z prinf sam, do wywołania tej funkcji poprzez wywołanie funkcji modułu. A funkcja kostka ma pewien wkład, a funkcja zwraca jakąś kostka wyjście. Natomiast printf właśnie zrobił coś. Nie zwraca niczego, że zależało, choć jak na bok to nie zwraca wartości; po prostu generalnie ignorować. 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 dla tych, znane z tego, że jest to dość prosta idea. Ale dla tych mniej zaznajomieni z tej idei przekazując wejść i powrót 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. Tak? Okay. Jak masz na imię? >> [Uczeń] Ken. >> Ken. Dobrze. Ken, chodź na górę. Ken będzie funkcją rodzaju o. Idziemy naprzód 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ą tablica, i to, co jest głównym am funkcji, na przykład, i nie mam iPada w ręku. Naprawdę nie pamiętam, jak się - Cóż, nie mogę powiedzieć. I naprawdę nie ma dobrego pisma, a więc dlatego chcę, aby wydrukować coś na ekranie dla mnie. Ja jako główny program, a ja będę musiał to mówisz pisząc to w moim podstaw kurczaka, a następnie przekazując wam wejście. Tak głupie, choć tego ćwiczenia jest pojęcie funkcji i wywołanie funkcji i powrót funkcji naprawdę sprowadza się do tego. Jestem głównym, właśnie napisane printf, cytuję-koniec cytatu coś na ekranie, Używam tego programu, a jak tylko printf pobiera nazywany, to ma jeden argument lub jeden parametr czasem między cudzysłów. O to, że argument. Jestem przekazaniem go do Kena. Jest czarna skrzynka napisane niektóre kilka lat temu że najwyraźniej wie, jak wydrukować rzeczy na ekranie. Więc wykonać. To nie jest złe. Bardzo dobrze. Więc teraz Ken odbywa wykonania. Będzie musiał oddać mi wszystko z powrotem? Nie to, że widzieliśmy do tej pory. Ponownie, printf nie faktycznie zwracać liczbę, ale będziemy ignorować, że do teraz ponieważ nigdy nie używałem go. Więc to jest to dla Kena. I tak teraz głównym przejmuje kontrolę program ponownie ponieważ linia kodu, printf, odbywa wykonania. A my go o naszej drodze, wykonując wszelkie inne linie są tam. Więc teraz spróbujmy nieco inny przykład. Tym razem tutaj niech najpierw wyczyścić ekran, tym razem zrobimy cubing funkcji ale tym razem, spodziewam wartość wyjściową. Więc idź naprzód i to zrobić. Teraz mam linii kodu, który mówi x dostaje kostkę x. Linii kodu, recall, wygląda następująco: x = kostka (x); Więc jak to będzie działać? Idziemy naprzód i daje biały ekran ponownie. Mam zamiar napisać teraz wartość x, , które w tym momencie dzieje się, powiedzmy, 2 do keep it simple. Napisałem na kartce papieru, wartość 2, który jest moim x wartość. I oddać go do Kena. >> A ja po prostu napisać odpowiedź? >> Tak, po prostu napisać odpowiedź. Okay. A teraz musi zwrócić mi coś. Perfect. Miło Segue. Więc teraz wręcza mnie wartość 8 w tym przypadku, i co mam z nim zrobić? Właściwie - zobaczmy, uzyskać to prawo. Co ja mam z tym zrobić? Teraz mam zamiar wziąć tę wartość i faktycznie przechowywać go w tych samych bitów w pamięci. Zauważmy jednak, że jestem trochę 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, co było x, a nawet, że to właśnie to, co się stało. Tak więc okazuje się, że podczas wywoływania funkcji i przechodzą w argumencie jak hello, world lub przechodzą w argumencie jak 2, ogólnie jesteś przejazdem w kopii tego argumentu. I tak jak ja zapisałem numer 2 tu i wręczył go Ken, musi to oznaczać, że wciąż mam kopię gdzieś wartości 2 bo rzeczywiście, teraz, że stałam się z powrotem na wartość 8, trzeba cofnąć się w pamięci RAM i rzeczywiście napisać 8, gdzie kiedyś miałem numer 2. Tak wizualnie, pamiętam tego pojęcia przechodząc dosłownie kopię wartości. Ken nie jego sprawa, ręce mnie coś - w tym przypadku wartość takich jak 8 - i wtedy coś zrobić z tą wartością, jeśli chcę zachować go wokół. Więc to wszystko wróci się zbyt dobrze przed długi. Dziękuję bardzo za ten pokaz tutaj, Ken. [Oklaski] Bardzo dobrze zrobione. Zobaczmy, w jaki sposób ostatecznie dotyczy niektórych funkcji wywołującej, że robiliśmy tutaj. Pozwól mi iść dalej i doprowadzić nas z powrotem do cubing przykład tutaj. Zauważ, że jeśli chcemy zacząć biorąc to dalej, będziemy musieli mieć na uwadze fakt, że liczba x, który jest przekazywany w tutaj różni się od tego, co w rzeczywistości jest przekazywane do funkcji. Więc jeszcze raz, to przechodzą przez kopię będzie się dość związany z tematem za chwilę. Rzućmy okiem na coś, co nie do końca działa prawo jeszcze. Mam zamiar iść do przodu i otworzyć trzeci przykład buggy, który jest wadliwy z natury, i to się nazywa buggy3 i implementuje funkcję swap. Mamy tu funkcję głównego X i Y jest inicjowane arbitralnie 1 i 2, odpowiednio. Mogliśmy korzystać getInt, ale po prostu potrzebujesz prostego ćwiczenia, więc jest to zakodowane jako 1 i 2. W liniach 21 i 22, ale najwyraźniej wydrukować xiy, 1 na linię. Następnie na linii 23, ja jestem twierdzić zamiana tych wartości, kropka, kropka, kropka. I najwyraźniej wywołać funkcję w wierszu 24 zwany swap trwa 2 argumenty. Jest całkowicie legit dla funkcji do podjęcia 2 argumenty. Widzieliśmy printf to zrobić już. Więc Swap najwyraźniej bierze xiy, i jak sama nazwa wskazuje, Mam nadzieję, że to będzie do wymiany tych 2 wartości. Więc mam prawo na linii 25 "wymieniłem!" 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 to 1, y 2, i jeszcze na końcu programu, są one nadal w rzeczywistości sama. Tak więc na podstawie demonstracji już teraz z Kenem, co się właściwie dzieje? Miejmy nurkowania w tej funkcji swap. To super krótki. To tylko kilka linijek kodu długi. Ale co jest podstawowym problemem w oparciu o zwykłą opowieścią tutaj z Kenem? Dlaczego Swap łamane? [Uczeń] Jesteś przechowywania do kopii, a nie zmiennej. Dokładnie. Jesteśmy przechowywania do kopii, nie sama zmienna. Innymi słowy, swap najwyraźniej ma 2 argumenty, int, i jest nazywany arbitralnie i B i tu mam przekazany xiy, które są odpowiednio 1 i 2, ale nie jestem dosłownie przechodzącą w X, nie mam dosłownie przechodzi w Y, Olewam kopię x oraz kopię y. To prawie tak, jakby skopiowane i wklejone do swapu wartości, które chcesz, aby faktycznie manipulować. Więc jeśli to jest w przypadku, gdy uruchomienie programu realizacji linii 35 i 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? >> [Uczeń] 1. [Malan] Powinno być tylko 1, w prawo, ponieważ x został przekazany jako pierwszy argument, i ta funkcja po prostu arbitralnie woła swój pierwszy argument jest. Podobnie jest y do drugiego argumentu, a to jest po prostu arbitralnie wywołanie sekund b. argumentów. 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 będą tzw. Więc nie musi być rozróżnienie co nazywasz zmienne w funkcji piszesz i to, co nazywasz zmienne w funkcji dzwonisz lub używanie. Więc innymi słowy, napisałem moje zmienne, x i y, ale jeśli ktoś napisał funkcję wymiany, on na pewno nie wiesz co moje zmienne zostaną powołani, więc sobie sprawę, że to właśnie dlatego masz ten dualizm nazw. Technicznie, mógłby zrobić to przez przypadek, ale nadal są one być przekazane jako kopie. Byłoby to po prostu czysty przypadek estetycznie jeśli osoba która napisała swapa użył tych samych nazw. Więc w tym momencie w historii, linia 37, to 1, b jest 2, a teraz mam postępować, aby zamienić je. Po pierwsze, pozwól mi faktycznie to zrobić znacznie prościej. Nie wiem, co te 3 linie kodu robią. Pozwól mi to zrobić: b = a; = b; zrobione. Dlaczego to jest złamane, logicznie? To rodzaj intuicyjnego rzeczy, prawda? Więc staje się B i B staje się, ale problemem jest to, że jak tylko linia 37 wykonuje, co jest wartością A i B? Same, 1, bo jesteście niszczona, by tak rzec, zmieniłeś b, aby dorównać. Więc raz linia 37 została wykonana, to świetnie, teraz masz 2 kopie numeru 1 wewnątrz tej funkcji, więc wtedy, kiedy mówisz w linii 38 = b, jesteś trochę przykręcić, 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 ogólna nazwa zmiennej tymczasowej i jest int ponieważ musi dopasować to, co chcę zrobić kopię. Przechowywać kopię wewnętrznej tmp, więc po linii 37 został wykonany, wartość jest - szybkie sprawdzenie poprawności - 1, wartość b wynosi 2, a wartość tmp także 1. Więc teraz wykonać linię 38. Po linii 38 wykonuje, nabiera wartości b. Oraz b to 2, więc jest teraz 2. Więc w tym momencie w historii, jest 2, b jest 2 i tmp jest 1, tak teraz logicznie, możemy po prostu TMP plop jego wartość do b i skończymy. 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 pozostają bez zmian do końca wykonywania programu. [Niesłyszalne comment studentów] >> My nie zwróciło nic, więc to prawda. Ale okazuje się, że jest trochę problemem tutaj, bo do tej pory, Jedyne co udało mi się wrócić to jedno, a to ograniczenie C. Możesz tylko wrócić naprawdę jedną wartość, w tym przypadku jestem rodzaj zakleszczony tutaj bo mogłem zwracać nową wartość x lub mogę zwrócić nową 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? [Uczeń] i b. >> Ib. Ale i b są kopie xiy, co oznacza, że ​​po prostu nie wszystko w tej pracy, po prostu spędziliśmy 3 minut rozmowy o funkcji wymiany i wszystkie 3 z tych zmiennych, i to jest wspaniałe, idealnie poprawne 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 pętli for Podobnie, jeśli jesteś deklarowania i b wewnątrz funkcji, które zostały napisane, są ważne tylko wewnątrz tej funkcji, co oznacza, że ​​gdy tylko wymiany dokonuje realizacji i przejść z linii 24 do linii 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 1 wartości i bardzo chce zamienić X i Y w tym samym czasie, więc będziemy musieli 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. Spróbujmy rozwiązać to w jakiś sposób. Pozwól, że faktycznie przewijania tu i otworzyć się, powiedzmy, czwarty wariant tego, buggy4. Co na ten temat? To jest podobne, ale prostsze problemem patrzeć zanim podejmiemy ukłucie na rozwiązanie go. Program ten nazywa przyrostu i najwyraźniej inicjalizuje x liczbę całkowitą 1 do 18, w linii. I potem ubiegać x to 1, I potem ubiegać "Zwiększanie ..." I następnie wywołać przyrost, ale w liniach 22 i 23, I twierdzą, że został zwiększony, Żądam x jest teraz cokolwiek to jest - 2, zapewne - ale ten program jest wadliwy. W czym problem? Tak. >> [Niesłyszalne reakcja studentów] >> Dokładnie. Więc x zostało uznane, oczywiście, na linii 18. To jest w nawiasach klamrowych nawiasach Main. Więc prostą odpowiedzią jest to, że podczas gdy x istnieje tu nie istnieje w linii 32, więc ten program rzeczywiście nawet nie skompilować. Kompilator przy próbie kompilacji 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 nierejestrowaną identyfikator "X" w linii 32. I faktycznie, bądźmy bardziej wyraźne tu dziś tak, że jest to przydatne w godzinach 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 5. Tak 1, 2, 3, 4, 5. To jest, w tym, gdzie problem. A także, zbyt, należy 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, ponownie sprawę, że najniższy z nich może być tylko przejawem najwyższego jeden. Więc zawsze ścigać się błędy z góry na dół bo nie może być po prostu efekt łańcuch sugeruje, że masz sposób 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? >> [Uczeń] Make x globalny. Okay, więc możemy x globalny. Weźmy na skrót, że ostrzegał wcześniej, ale do cholery, po prostu musimy szybko naprawić, tak po prostu powiedzieć, int x tutaj. To sprawia, że ​​x globalny. Więc teraz główny ma do niego dostęp i przyrost ma do niego dostęp, więc pozwól mi iść do przodu i skompilować to teraz. Producent buggy4, Enter. Wydaje się skompilować teraz. Uciekajmy buggy4. I wydaje się faktycznie pracują. Jest to jedna z tych rzeczy, która jest zrobić tak jak mówię, nie tak jak ja, jak już tylko zrobić tutaj, bo w ogóle, nasze programy mają zamiar stać się o wiele bardziej interesujące i znacznie dłużej, i jeśli rozwiązanie życiowych problemów jest po prostu umieścić wszystkie zmienne na początku pliku, bardzo szybko, nie 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ż właśnie w tym celu - ale gdybym nie wiedział o tym operatora lub nie wolno mi było go zmienić na main samej jak inaczej mogłaby wdrożyć Ken tu tym razem nie do kostki, ale do przyrostu? Jak zmienić ten tutaj? Tak. [Uczeń] Przełęcz w x, a następnie powrót [niesłyszalne] >> Dobrze. Więc dlaczego nie mogę przejść w X, a następnie zamiast zwrotu, dlaczego nie mogę po prostu wracają x + 1. Kilka rzeczy trzeba zmienić tutaj. Jestem na dobrej drodze. Co jeszcze muszę się uszczypnąć? Ktoś inny. Tak. [Niesłyszalne odpowiedź uczeń] Muszę zmienić typ wartości przyrostu, ponieważ nie jest nieważne. Nic nie oznacza nieważny jest zwracana, ale teraz wyraźnie to jest, więc musi to zmienić - >> [uczeń] int. int być zgodne z tym, co ja właściwie powrotu. Teraz jest jeszcze coś innego buggy tutaj. Tak. [Niesłyszalne reakcja studentów] >> [Malan] Więc muszę zwiększyć x? [Niesłyszalne reakcja studentów] >> [Malan] Ach, więc trzeba przekazać x. Więc muszę to zrobić tutaj. >> [Niesłyszalne comment uczeń] [Malan] Więc prototyp, muszę to zmienić tutaj. Więc to musi być int, to musi stać się - Hmm, faktycznie mają błąd tutaj. Chodźmy naprawić ten jeden pierwszy. Jakie powinny to być w rzeczywistości? To musi być coś, int. To może być x, ale szczerze mówiąc, jeśli zaczniesz wzywając wszystkie swoje zmienne x, to dostanie mniej jasne, który jest który. Więc po prostu arbitralnie wybrać inną konwencję nazewnictwa dla mojej funkcji pomocniczych, funkcje piszę. Nazwijmy to, czy możemy to nazwać - Nazwijmy to liczba się jeszcze bardziej wyraźne. Więc mam do zwrotu tego, co liczba jest plus 1, i teraz muszę zmienić 1 inne rzeczy tu i jedna rzecz tutaj. Co trzeba zmienić na linii 21 po raz pierwszy? >> [Niesłyszalne odpowiedź uczeń] [Malan] muszę przypisać ją do x. Nie mogę po prostu zadzwonić przyrost (x). 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 ponieważ prawa strona zostanie zrealizowane w pierwszej kolejności, a następnie dostaje koleś do rzeczy po lewej - x w tym przypadku. I wtedy wreszcie, jest to łatwo naprawić teraz. Powinno to tylko mecz, co jest na dole, int numer. Więc cała masa zmian dla funkcji naprawdę głupi ale przedstawiciel rzeczy, że będziemy coraz bardziej chcą zrobić. Więc upewnij buggy4. I już nie przejmował się gdzieś. Och, mój Boże. Pięć błędów w 6-linii programu. Więc co jest nie tak na linii 18, znak 5? Więc muszę zadeklarować to, int. Zobaczmy. Istnieje cała masa innych błędów. Och, mój Boże - 19, 18, 21 - ale znowu, po prostu wyczyścić ekran, L sterowania tutaj i ponownie dzyń. Więc 5 problemy jest rzeczywiście tak, że 1. Więc teraz niech uruchomić buggy4, Enter. Uff, x został zwiększony poprawnie. Dobrze. Wszelkie pytania na temat przyrostu liczby? Tak. [Niesłyszalne pytanie studenta] >> Dobre pytanie. Jak to jest, że mogę po prostu zmienić x do liczby, a program od razu wiedzieć? Ponownie, myśleć o tym jak tej abstrakcji. Więc jeśli jestem głównym i Ken jest przyrost, szczerze mówiąc, nie obchodzi mnie to, co Ken nazywa swój iPad. Nie obchodzi mnie, co on nazywa coś, co ma związek z jego realizacji tej funkcjonalności. Jest to szczegół, że wdrożenie, main, 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 prawa jazdy który przejechał 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 mamy do opieki, co wszystkich prętów i tłoków i kabli wewnątrz samochodu rzeczywiście robi. Więc coś, co nazywasz tłok nie ma znaczenia w tym przypadku. Sam pomysł. Tak. >> [Niesłyszalne pytanie uczeń] Jeśli jest 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. >> [Uczeń] Jeśli istnieje wiele zmiennych [niesłyszalne] Określonej kolejności, tak jak tutaj, czy to int inny numer? >> [Uczeń] Correct. [Malan] Tak. Zamów liczy kiedy wywołanie funkcji. Więc jeśli wołały przyrost o czymś przecinek coś istnieje bezpośrednie odwzorowanie. Pierwsza zmienna, co się nazywa, jest egzemplarz pierwszego argumentu tutaj. Przepraszam. Nie powinno być nawiasów. Drugi argument, linie się z drugim. Tak aby, tak, ma znaczenie. Dobrze. Przepraszam. Wziąłem długą drogę, aby się tam dostać. Inne pytania? Dobrze. Zobaczmy więc, jeśli nie możemy namalować obraz tego, co się faktycznie dzieje pod maską, tak powiem. Jest to prostokąt, który może reprezentować pamięć komputera. Nawet jeśli nie masz pojęcia, jak działa pamięć i jak działa RAM, przynajmniej zakładać, że masz bukiety to te dni. Masz megabajtów nim, masz gigabajty to, i wiemy, że od tygodni 0 bajt jest tylko to, co? >> [Uczeń] 8 bitów. 8 bitów, tak? Więc 8 zer i 1. Więc jeśli twój komputer ma koncert pamięci RAM, 2 koncerty RAM te dni, masz miliardów 2 miliardów bajtów pamięci, czyli około 8 miliardów i 16 miliardów bitów wewnątrz komputera. W przeciwieństwie do np. małego Willy Wooly, to nie cząstki magnetyczne zazwyczaj więcej. W coraz większym stopniu - w laptopach przynajmniej - to Dyski SSD, SSD, że po prostu nie mają żadnych ruchomych części. To wszystko jest elektroniczne. To wszystko jest oparte na energii elektrycznej. Więc myślę o tym, jak po prostu prostokąt reprezentujący 1 lub 2 GB pamięci, które masz. Więc to jest fragment pamięci. Świat nauki komputerowego jakby oddzielone kawałki pamięci do różnych rzeczy. Na przykład, jeśli jest zainstalowana w komputerze pamięci RAM, jak sugeruje prostokąta, Okazuje się, że zgodnie z konwencją, w górnej części pamięci RAM, by tak rzec, jest na ogół to, co nazywa fragment tekstu. Są 0s i 1s, które zostały skompilowane. Kiedy więc szukałem pod maską, co a.out jest wszystkie te 0s i 1s, po uruchomieniu programu, tych 0s i 1s są ładowane z dysku twardego do czegoś, co nazywa RAM, i w pamięci RAM są one narażone na górze. Tymczasem masz inne rzeczy: zainicjować danych odinicjować danych. Te 2 pokosy pamięci odnoszą się do zmiennych globalnych, które nie często korzystają 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ć dużo czasu, ale potem 2 ważne rzeczy, które będą wracać w całym semestrze, stosu i sterty. Tak więc większość z pamięci komputera jest zarezerwowane podczas uruchamiania programu czegoś zwany stos i coś, co nazywa się sterty. Nie będziemy mówić o kupie dzisiaj, ale będziemy rozmawiać o stos. Stos ma wyczarować wizualny z tac jadalni posiłek w Mather Domu lub gdziekolwiek się znajdziesz, gdzie personel jadalnia oczyścić je na co dzień, one stosu je z podłogi, na górę, i podobnie, w pamięci, jest to pomysł wprowadzenie coś w stos, wprowadzenie czegoś na stos, stawiając coś na stosie. A co mamy na myśli? Miejmy powiększyć tylko na dolnej połowie tego obrazu, komputera RAM, zaproponować następujące. Okazuje się, że po uruchomieniu programu jak a.out lub Hello - niezależnie od programu, które zostały napisane - znowu te 0s i 1s są ładowane z dysku twardego, która jest długotrwałe składowanie, pozostaje tam nawet kiedy wyciągnąć wtyczkę, ładowane do pamięci RAM. RAM jest szybsza niż dyski twarde - jest mniejszy niż dyski twarde - ale gdzie programy żyć kiedy używasz ich. Więc kliknij dwukrotnie program na komputerze Mac lub PC, to jest ładowany z dysku twardego do pamięci RAM. Tak szybko, jak to jest ładowany do pamięci RAM, 0s i 1s Idź na szczycie drogi, tzw segmentu tekstu, ale, gdy w rzeczywistości program uruchamia, Główna funkcja nazywa, 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 dwukrotnym kliknięciu niektóre zmienne używane wewnątrz głównej, kończy się na dole stosu pamięci, że tak powiem. Bardziej konkretnie, co to właściwie znaczy? To po prostu oznacza, że ​​jeśli mieliśmy liczba bajtów pamięci RAM w komputerze, zauważyć, że to może być bajt numer 0, to może być bajt numer 1, 2, 3, 4, 5, 6, wszystko aż do 2 miliardów byłoby aż tam na górze. Więc innymi słowy, gdy mówimy o pamięci RAM lub pamięci w kategoriach bajtach to po prostu oznacza, że ​​ktoś zdecydował, co do liczby każdego z tych fragmentów pamięci. Więc kiedy trzeba 32 bity int lub potrzebujesz 8 bitów dla char, gdzie kończą się w pamięci? Koncepcyjnie, po prostu kończy się w dolnej części tego rzecz zwaną stos. Ale co ciekawe, teraz jest, gdy głównym zwraca funkcja - Przypuszczam funkcji o nazwie foo, tylko dowolną nazwę - , co się dzieje w głównym jest dole stosu pamięci; foo teraz jest umieszczany na górze głównej w pamięci. Więc wszelkie zmienne lokalne, że foo jest skończyć rodzaju koncepcyjnie oprócz tych w menu głównym. 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 napisanie funkcji, które nigdy nie wróci. Tak na przykład, niech wykazać jak najwięcej z programu celowego buggy. Pozwólcie mi iść do przodu i nie # include, int main (void) i mam zamiar zrobić, gdy (2> 1), które prawdopodobnie nigdy nie 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 tu refren nieważne, a powiemy int i, a ja powiem printf - nie, zróbmy to bardziej interesujące. Niech nie faktycznie wydrukować cokolwiek. Zróbmy tak: chorus (i). Dobrze. Więc to jest buggy bo dlaczego? I zmyślam, jak przejść, bo program nie właściwie nic interesów. 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ę błędu podstawowego. Główne połączenia chór śpiewać jakiś refren, potem zrobiłem coś głupiego i miałem rozmowę chóru 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 nielegalnego identyfikatora i. Och, to było głupie. Nie musimy argument. Zróbmy to. Szkoda, że ​​nie zaczęli w ten sposób. Byłoby o wiele łatwiej program do pisania. There. A teraz chodźmy do mojego okna terminala, uruchom ponownie dzyń, a tu proszę. To był bardzo szybki. Co właściwie się stało, chociaż? Cóż, teraz mogę dodać linię wydruku, dzięki czemu możemy zobaczyć. Pozwólcie mi powiedzieć, printf ("Jestem tutaj") - nie zmienne. Zostawimy go tak. Pozwól mi ponownie uruchomić make. Pozwól, że powtórka refrenu. I ... spokój. Dalej. Tak na marginesie, dlaczego nie rozbił się jeszcze? Segmentation fault się super szybko przed. [Niesłyszalne reakcja studentów] >> Dokładnie. Więc na to potrzeba czasu, aby wydrukować, prawda? To po prostu ma więcej pracy komputera części. I oto 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? Jeśli myślisz o tym, jak pamięć komputera jest określone, to akurat jest głównym, ale tutaj niech po prostu nazywają to refren i nazwijmy ten refren. A teraz, jeśli mam zrobić moje estetykę rację, to jest po prostu powiedzieć refren, refren, refren, refren, refren, refren, refren, nauseum ogłoszenie, i ostatecznie, co się stało? Jeśli duże zdjęcie, dosłownie, jest to, co się dzieje, koncepcyjnie? Przekroczeń stosu sterty. Albo, co gorsza, po prostu wszystko, w tym przekroczenia segmentu tekstu, który jest 0s i 1s które reprezentują program. W skrócie, to jest po prostu super, super źle. Program został gwałtownie się spod kontroli. Używasz sposób więcej pamięci niż zamierzony wszystko z powodu głupiego błędu w tym przypadku, lub w tym przypadku odbywa się świadomie bardzo się funkcji wywoływania. Teraz, to nie jest źle. Funkcje połączeń się rzeczywiście ma wielką moc, gdy jest stosowany prawidłowo. 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 podstawową słabością tutaj tego programu. Więc gdzie jedziemy z tym wszystkim? Co naprawdę się 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 1, więc dodaje się dzieje. Chodźmy do przykładu inkrementacji, ten facet rację tutaj. Oto, co się rzeczywiście dzieje. Kiedy dzwonię do przyrostu i przekazać w x, obrazowo, co tu się dzieje to jest. Jeśli mam wartość 1 przechowywane tutaj i faktycznie wywołać przyrost, który nazywa się teraz chór - iPad rzuca mnie tutaj. Nazwijmy ten przyrost, a my nie wiemy, co to obok funkcji będzie. Więc co się właściwie dzieje, jest tu gdzieś w main mam kawał pamięci , które przechowuje numer 1. Kiedy dzwonię do przyrostu, używam innego fragmentu pamięci, ale teraz mam kopię 1. Kiedy zwiększyć tę wartość, staje się to 2, ale co się dzieje, jak tylko powróci przyrostu? Ta pamięć tylko zostanie przekazana z powrotem do systemu operacyjnego, co oznacza, że ​​wszystko, co zrobiłeś to nic przydać. 1, który został pierwotnie zawarte w głównym jest nadal faktycznie istnieje. Więc gdzie jedziemy z tym? Okazuje się, że w pamięci masz ten back-to-back sekwencję bajtów które można umieścić rzeczy, i okazuje się, że mamy już coś który obejmuje oddanie rzeczy z powrotem do tyłu do tyłu do tyłu. Co to jest ciąg w oparciu o tydzień 1 tydzień 2 i teraz? To jest po prostu zbiorem znaków. Okazuje się po prostu, 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 do tyłu, Okazuje się, że przy użyciu najprostszych rzeczy, jak na pętli lub pętli while, możemy iteracyjne od lewej do prawej w ciągu znaków w ciągu i zacznij masować je do różnych znaków łącznie - może się B, B może się C - sposób, że ostatecznie możemy angielski zdanie, że rzeczywiście ma sens oraz każdy z tych konwersji liter pojedynczo przechodząc przez naszych pamięci komputera od lewej do prawej, aby faktycznie zaszyfrować. Więc weźmy naszą pięciominutową przerwę, i kiedy wróci, zaczniemy ten proces kodowania informacji. Dobrze. Zanim zagłębimy się w pewnym kryptografii i te rzeczy nazywane tablicami, pozwól mi zatrzymać się na wszelkie pytania, bo czuję, że naprawdę rodzaj pomieszania niektóre z tych tematów. Więc naprawić teraz, jeśli można. Właśnie rozmawialiśmy o wartości zwracanych, rozmawialiśmy o argumentach, i rozmawialiśmy o tym pojęciu, które wrócimy w najbliższych tygodniach, przeglądania pamięci, jak całą masę tych ułożonych tacach, by tak rzec, z dołu na górę, tak, że każdy podajnik pobiera umieścić na stosie oznacza funkcję, która jest obecnie nazywa. Masz pytanie? 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. Fakt, że przyrost ma otwarty nawias, int numer, zamknięty nawias - co to int liczba reprezentuje? [Uczeń] argument. >> Argument. Okay. Ale co jest argument? [Niesłyszalne reakcja studentów] >> Co to jest? >> [Uczeń] Coś, co możesz przekazać w. Ok, więc coś, co możesz przekazać w. I bardziej ogólnie, to tylko wejście. Jeśli chcesz napisać funkcję i że funkcja jest cel w życiu jest robić coś innego za każdym razem, kiedy go używać, to jedynym sposobem aby tak się stało naprawdę wydaje się do dostarczenia jej wejścia tak, że można zrobić coś innego z tego wejścia za każdym razem. Więc trzeba określić dwie rzeczy, gdy funkcja przyjmuje wejście. Musisz określić nazwę, którą chcesz nadać tym wejściem wyłącznie dla własnej wygody, aby można było się do niego w funkcji, że 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 dlatego, że wie, ile bitów przydzielić dla tej zmiennej bo to może być 6 - przepraszam, że nie będzie 6. 16 może być, może być 8, 32 może być nawet 64, ale komputer musi wiedzieć. Teraz, int na lewej stronie, co oznacza, przeciwnie? [Niesłyszalne reakcja studentów] >> Co to jest? >> [Uczeń] Rodzaj funkcji. Rodzaj funkcji, a w szczególności, rodzaj jego wyjścia. Racja. Tak więc, podczas gdy w rzeczy nawiasach reprezentuje wejście jego ewentualne rzeczą, aby po lewej stronie przedstawia dane wyjściowe. I w tym przypadku, przyrost podobno zwraca int, i tak jest typu int powrót tej funkcji. Co to znaczy wrócić? Dosłownie, użyć słowa kluczowego, a następnie powrót jeśli to, co wracają z prawej słowa kluczowego jest liczbą całkowitą, wtedy to jest rzeczywiście zgodny z tym, co obiecał. Nie można było zrobić coś takiego - Witaj, świecie - bo to jest ciąg. Oczywiście, nie jest całkowita. Tak w skrócie, ciężar jest naprawdę na nas, programista, za szczególne do tego, co mamy do powrotu i wtedy faktycznie go o jego zwrot. Kontekst tu teraz jest, że pamięć komputera jest gigabyte, 2 GB - cokolwiek - być może więcej, może to jest mniej, ale komputer widzi ją jako posiadające różne sekcje. Coś się tam, coś innego idzie się tam, różne rzeczy idzie w środku, a dziś 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 0s i 1s, że brzęk jest przesyłany. Więc kiedy uruchomić polecenie na klawiaturze jak a.out lub kliknij dwukrotnie ikonę na Mac OS lub Windows, Twój program jest ładowany z dysku twardego do pamięci RAM i to koleś na górze komputera RAM, że tak powiem. Tymczasem, jak program zostanie uruchomiony i głównym jest wywoływana w programie napisał lub program Microsoft lub Apple napisał wszystkich swoich zmiennych lokalnych kończy się tam na dnie pamięci komputera. Ale jeśli główne połączenia inna funkcja, która sama ma zmiennych lub argumentów, kończą się nad nim. A jeśli ta funkcja wywołuje coś, kończy się nad nim, nad nim, nad nim. I tylko raz funkcja jest wykonywana wykonującego stos tac, by tak rzec, zaczynają się niżej i niżej. I to właśnie wtedy, w skrócie, wyjaśnia, dlaczego podczas rozmowy kostkę lub zadzwonić przyrost, jesteś przekazując kopię wartości. I co to oznacza obrazowo jest, że jesteś dosłownie piśmie numer 1 w drugiej części pamięci, które zmienia się od 1 do 2 przypadku przyrostu lub do 8, w przypadku, a następnie moduł pamięci od tego rzucania jak tylko zwiększać lub funkcja powraca sześciennych. Pytanie. [Uczeń] Gdzie są zmienne globalne przechowywane? Zmienne globalne są przechowywane, 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ść ze znaku równości, to kończy się na górze tam, i jeśli tylko powiedzieć, int x; bez wartości, kończy się nieco niższy w pamięci RAM po prostu przez konwencję. Inne pytania? Dobrze. Więc ten obraz będzie wracać, ponieważ mamy mocniejszy z tym, co możemy zrobić z komputerem, ale teraz, zróbmy krótkie intro do kryptografii specyficzny rodzaj kryptografii, że nie rozwiąże wszystkich problemów świata , ale nie rozwiązuje niektóre z nich. W tej sprawie, mamy coś, co nazywa secret-kryptografii. Secret-klucz kryptograficzny, jak sama nazwa wskazuje, pochodzi z jego bezpieczeństwo tajemnicy. Na przykład, jeśli jesteś z powrotem w szkole i mijały trochę list miłosny sekret dla chłopca lub dziewczynki pan kruszenia się, jeśli chcesz przekazać tę notatkę przez publiczność, prawdopodobnie nie napisałby takiej noty w języku angielskim lub cokolwiek jest językiem ojczystym. Przeciwnie, można zaszyfrować lub 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 Twoi przyjaciele i nauczycieli nie wiesz co piszesz, możesz wymyślić algorytm dość prosty, młody, choć może być, po prostu wspiąć słowa. Więc zamiast pisać można napisać b, zamiast b można napisać c, zamiast C można napisać D, 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 wiedzieć coś, co jest co, oczywiście? >> [Uczeń] Co wysyłasz. Co twój sekret jest, jak co to jest mapowanie między A i B i C jest i D's. Czy jest to po prostu dodanie 1 do każdej z liter, aby przejść od 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ę tajnych informacji, ale jest rodzajem Catch-22 tutaj. Jeśli jest to pierwszy raz masz ten list miłosny za pomocą klasy, jak to jest, że chłopak lub dziewczyna będzie wiedzieć, co jeszcze jest tajne? Tak tajny klucz szyfrujący nie rozwiąże wszystkich problemów świata, i tam rzeczywiście związek tutaj, że wrócimy do kierunku semestru końca. Podobnie nie większość z nas wie, że ktoś pracuje, na przykład, na Amazon.com, a przecież wielu z nas prawdopodobnie kupił rzeczy w Amazon.com, i nauczono zakładać, że te e-commerce transakcje są bezpieczne. URL prawdopodobnie mówi https, jest być może trochę głupie ikona kłódki gdzieś, istnieje jakiś rodzaj kryptografii zabezpieczania informacji o karcie kredytowej między tobą i Amazon.com. I jeszcze, czy kryptografii wymaga znajomości jakąś tajemnicę i jeszcze nie znam nikogo w Amazon, a ja na pewno nie ułożone jakiejkolwiek tajemnicy z kimś z Amazonii, to jak komputer lub moja przeglądarka to robi? Okazuje się, że to inne rodzaje kryptografii w ogóle, że rozwiązania tego problemu. Ale na dziś skupimy się na prostym jeden gdzie można zorganizować z góry wiedzieć, jakąś tajemnicę jak 1 lub jakiegoś mapowania między tych i b-tych. A proces ten obejmuje zwykle kryptografii. Masz jakiś zwykły tekst, przedstawiony tu w lewo, go uruchomić przez jakiś algorytm lub procedury do szyfrowania to - Może to po prostu staje się b, b staje się c - i skończyć z szyfrogramu. Tymczasem, po zapłaceniu zgniatać otrzymuje tę tajną notatkę, on lub ona musi następnie odszyfrować ogólnie odwrócenie tego algorytmu tak, aby uzyskać z powrotem na zwykły tekst. Istnieją fizyczne inkarnacje to. Na przykład, to jest trochę pierścień dekoder tajne, 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 kolejności losowej, i od wewnątrz, jest rzeczywiście niektóre numery takie, że z tego pierścienia można rodzaj kolei na zewnątrz, ale nie wewnątrz aby wyrównać numery z literami. Z filmu o nazwie Christmas Story, zobaczysz, że niewiele Ralphie był tak chętny do dowiedzieć się, co tajne przesłanie Małego Orphan Annie była dla niego które zostały przekazane, to że, w postaci komunikatów numerycznych na polu zbóż i trzeba było zgromadzić wszystkie małe karty dołączone w polu zbóż, trzeba było wysłać je, trzeba było wrócić do tajnego pierścienia dekodującego tak, że można w końcu dowiedzieć się, co jest między mapping liter i cyfr lub litery i litery. Jak w komputerze możemy przejść o implementowaniu lub reprezentujący takie rzeczy? Musimy znaleźć sposób wyrażania siebie trochę bardziej elastycznie niż nasze zmienne dotąd pozwoliły. Mieliśmy wskazówki, mieliśmy znaki, mieliśmy pływaków i dwuosobowymi 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 takie rzeczy nazywa się ciągi ale obiecuję, że jest to tak naprawdę tylko uproszczenie w CS50 bibliotece ż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 - tzw array.c rozwiązać problem niezwiązany strun ale maluje obraz tutaj jak możemy użyć czegoś o nazwie tablica. Tablica jest typu. To jest typ zmiennej z wszelkiego rodzaju, które ma wiele mniejszych typów danych wewnątrz niej 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 swoją średnią quizu na kurs, jak 50, który ma 2 quizy, można bardzo łatwo napisać program oparty nawet na niektóre z zeszłotygodniowego materiału używając getInt i kilka zmiennych: int quiz1, int quiz2. I jest to całkiem proste. To jest być może 10, 20 linii kodu max do wykonania programu który prosi użytkownika o 2 wyników quizu, a następnie oblicza ich średnią przez dodanie ich do siebie, podzielenie przez 2, a następnie drukowanie wyników. Moglibyśmy prawdopodobnie zrobić dość łatwo teraz po pewnej liczbie minut. Ale problemem jest to, że załóżmy, że 50 miał 3 lub 4 quizy. Załóżmy, że chcesz użyć tego samego programu dla klasy, która miała tygodniowy quizy. Pomyśl o klasie, która co tydzień quizy. Jeśli jest 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, powinna rozpocząć się chcesz było lepszy sposób. I na szczęście, bo tablic nie ma. 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 użycie wszystkich liter po prostu tak, że naprawdę wyróżnia się w kodzie, i specjalne słowo, że używasz w C # jest zdefiniować. Tak więc możemy powiedzieć, # define, a następnie spację, a następnie wyraz, który chcesz użyć nazwy stałej i wartość stałej. Wskazówka ta różni się od przypisywania coś do zmiennej. Nie ma znaku równości, nie ma średnika. To, co się powszechnie znana jako dyrektywa preprocesora, ale o tym innym razem. Na razie, to tworzy niezmienną wartość o nazwie QUIZZES których rzeczywista wartość numeryczna jest 2. Więc wszędzie widzisz quizy, konkursy, quizy, w całym tym pliku, To tylko numer 2. Gdy patrzę na głównym teraz zobaczmy, jak to działa. Pierwszy wygląda dość tajemniczy, ale to wszystko rzeczy z tygodnia 1. Zapytaj użytkownika o klasach. W jaki sposób możemy to zrobić? W linii 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, że mówiłem klasy pływak i otwórz uchwyt i następnie numer - wypowiedzenia, jeżeli jest to stała ta jest tak jak zrobiliśmy to - oznacza to, "Hey komputer, daj mi 2 pływaków i niech wspólnie nazywać ich gatunki." Jest to w przeciwieństwie do bardziej żmudne tak: pływak grade1; unosić grade2, i tak dalej. Więc tablica pozwala nam na realizację tego pomysłu, ale znacznie mniej messily, w taki sposób, że może się zapisu 1 linia zamiast, na przykład, 16 do 16 tygodni semestru. Nie chciałem, aby trudno kodu 2, bo jeśli myślisz o tym teraz logicznie, Przypuszczam następny rok CS50 zmiany 3 quizy zamiast i miałem numer 2 tutaj, miałem numer 2 tutaj Miałem numer 2 tutaj, numer 2 tutaj. To staje się bardzo uciążliwe i bardzo łatwo zepsuć i przypadkowo zmienić 1 wartość 3 i przegapić jakieś inne wartości 2. Więc mam zamiar zamiast streszczenie to się i korzystać z tego, że stała, Jak sama nazwa wskazuje, nigdy nie zmienia. A teraz nie ma znaczenia czy mamy różne testy w tym roku lub następnym, Muszę 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 zbiorczo 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ą QUIZZES zamiast liczby zakodowane. Ale nie ma nic intelektualnie inaczej tam od zeszłego tygodnia. To tylko printf, więc printf ("Quiz #% d% d:") bo ja po prostu chcę, aby wydrukować dać mi quizu numer 1 2 a następnie 2 z 2. Więc to jest czysto estetyczną rzeczą. Ale interesujący jest teraz w wierszu 27. W celu wypełnienia w jednej z dwóch zastępcze o wartości zmiennoprzecinkową ponownie użyć nawiasów kwadratowych. W tym przypadku, używam i. bo to dla pętli rozpoczął się i równa, co wartość, najwyraźniej? [Uczeń] 0. >> [Malan] 0. Więc w pierwszej iteracji tej pętli, to jest tak, jakbym napisał to w kodzie, ale na drugiej iteracji tej pętli, to jest tak, jakbym napisał to w moim kodu. Ale fakt, że używam zmienną jest idealny, ponieważ, jak sama nazwa wskazuje, 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? Powodem zwróciłem super proste prostokąt na ekranie tutaj wcześniej był z tego powodu. Tablica jest tylko fragment pamięci następuje kolejny kawałek pamięci następnie inną ilość pamięci itd.. Więc jeśli moja tablica ma rozmiar 2 w tym przypadku tutaj, wszystko będę robić wpisując w moich wyników quizu jak tutaj - mam 100 na ten jeden, a potem mam 99 na ten jeden - wtedy ta pamięć może nawet nie być stosowane, ponieważ mam tylko pytanie z komputera dla tablicy o rozmiarze 2. Te place wciąż tam są, prawda? Masz jeszcze 2 GB pamięci RAM, nawet jeśli jesteś tylko z prośbą o 2 pływaków. 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órych można umieścić rzeczy. Dzieje się tak, aby potem 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 suma 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 sekund quizu podzielona przez 2, a następnie wydrukować 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ę. Wybacz 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, mówi, jak wiele znaków w tym ciągu. To wszystko. A fakt, że jest to strlen zamiast długości łańcucha to tylko dlatego, że jest bardziej zwięzłe. Trzydzieści 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. W linii 24, mówię, "Komputer, daj mi znak, 8 bitów, i nazywają to c". Ale co to jest to na prawej stronie mówi? W języku angielskim, co to przedstawia? [Uczeń] Pierwszy znak w tablicy. Dokładnie. Daj mi pierwszy znak w tablicy. Lub, bardziej ogólnie, daj mi znak Ith w tablicy. I uświadomić sobie, że to ważne teraz, jak informatycy, Jesteśmy rzeczywiście licząc od 0. Nie masz swobodę teraz zacząć robić. Teraz masz się zachowywać zgodnie z oczekiwaniami i komputera liczyć od 0 ponieważ [0] będzie pierwszy znak w ciągu, [1] będzie drugi, [2] będzie trzecie i tak dalej. Więc ten program, jeśli go skompilować, to znowu string1, więc upewnij string1, i teraz mam uruchomić string1 w moim oknie terminala. To oczekiwanie na wejście, więc mam zamiar pisać w Dawida, Enter a teraz drukuje Dawidowi wszystko na różnych liniach, ponieważ zawiadomienie to, co robię. Jestem drukowania jeden znak na raz. Nie będziemy wchodzić w szczegóły już dziś na ten temat, ale usunięte przed chwilą tego sprawdzenia 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że nie dają znaków w ogóle, lub jeśli jesteś złośliwy, możesz spróbować wkleić w gigabajt w wartym eseju wypełnić ten ciąg, a jeśli komputer działa z pamięci, okazuje się, że mamy zamiar wrócić tę szczególną wartość o nazwie NULL. Więc teraz, po prostu wiem, że istnieje wartość ta nazywana NULL który pozwoli nam 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. Czym różni się dla pętli i tym razem? Mogę wrócić do poprzedniego przykładu. Więc to jest wersja 2, jest to wersja 1. 1, 2. 1, 2. Strlen połączenie jest gdzie? Jest w pierwszej części pętli for. Wszelkie myśli, dlaczego to robię? Tak. [Uczeń] Więc nie wywołać funkcję za każdym razem. [Malan] Więc nie wywołać funkcję za każdym razem. Dokładnie. Przypomnijmy dla pętli, że są super proste gdy rodzaj zrozumienia, że ​​jest to inicjalizacja, warunek i update. Problem jest, że stan się dzieje na każdej iteracji pętli. A więc w tym przykładzie, co jest złego w tym, że to jest mój stan? [Uczeń] Dzwonisz strlen. [Malan] Dzwonisz strlen znowu i znowu i znowu. Ale kiedy już wpisane w Dawida, długość tego ciągu jest 5, 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 się staje się coraz ważniejszym pomysłem znany jako decyzji projektowych, gdzie po prostu nie sprawiają, że komputer robić niepotrzebnej pracy. Podobnie jak zapowiedzią pset2, pset2 w standardowej wersji będzie wyzwanie do rzeczywiście wdrożyć pewną liczbę cyfr, pewna liczba algorytmów szyfrowania, tak, że można zarówno szyfrować i komunikaty odszyfrować tajne dużo jak jeden Ralphie nie dekodowane. W edycji hakerów z pset2, będziemy iść trochę dalej. Zamierzamy przekazać Ci plik z rzeczywistego systemu komputerowego , który zawiera całą masę nazw użytkowników i haseł zaszyfrowanych faktycznym, i wyzwanie dla hakerów edycji będzie do łamania tych haseł i dowiedzieć się, co kryptografia czy co tajemnica została użyta do faktycznie wytwarzać tych haseł. A my zrobimy to za pomocą nowej funkcji tutaj o C że dam ci tylko 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 , że po wpisaniu nazwy 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ć zaczynając Pset 2 jest coś takiego. Jeśli zrobię argv1, który jest przykładem wrócimy do w poniedziałek, i uruchomić go, 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 wpisał w wierszu polecenia jest zmiana głównego wyjścia w ten weekend od int main (void) int main (argc, argv) , a tym samym będzie urodzony argumenty wiersza poleceń. A kiedy się naprawdę wyrafinowane na to, że będziesz w stanie napisać naprawdę Trippy programy takich 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. [CS50.TV]