1 00:00:00,000 --> 00:00:02,270 [Powered by Google Translate] [Tydzień 2, ciąg dalszy] 2 00:00:02,270 --> 00:00:04,220 [David J. Malan, Harvard University] 3 00:00:04,220 --> 00:00:06,880 [To jest CS50. - CS50.TV] 4 00:00:06,880 --> 00:00:10,990 Dobrze. To CS50, i jest to koniec 2 tygodniu. 5 00:00:10,990 --> 00:00:14,410 Jeśli spodziewasz się być głodny w tym czasie jutro, 6 00:00:14,410 --> 00:00:18,620 wiem, że mamy zamiar zwołać jako małe grupy, jutro, w czwartek 13:15. 7 00:00:18,620 --> 00:00:21,360 Jest to adres URL tutaj, jeśli chcesz RSVP. 8 00:00:21,360 --> 00:00:26,740 Przestrzeń jest ograniczona, więc proszę wybaczyć, jeśli formularz został wypełniony przez czas to wypełnić. 9 00:00:26,740 --> 00:00:29,300 Innym URL, jednak, że mogą być interesujące jest to. 10 00:00:29,300 --> 00:00:32,369 W prawie za miesiąc, kurs zostanie udostępniona 11 00:00:32,369 --> 00:00:36,890 wszystkie szerzej poprzez EDX, poprzez które w Internecie ludzie będą mogły podążać, 12 00:00:36,890 --> 00:00:39,380 angażować się w trakcie dość aktywnie, w rzeczywistości. 13 00:00:39,380 --> 00:00:42,270 Będą przy użyciu urządzenia i CS50 CS50 Omów 14 00:00:42,270 --> 00:00:45,490 i większość z różnych narzędzi, które już zostały za pomocą tego semestru. 15 00:00:45,490 --> 00:00:48,710 A jedną z inicjatyw chcielibyśmy podjąć jako eksperyment w tym roku 16 00:00:48,710 --> 00:00:51,930 jest zobaczyć, jak wiele treści można tłumaczyć 17 00:00:51,930 --> 00:00:53,960 do innych języków mówionych i pisanych. 18 00:00:53,960 --> 00:00:57,500 Więc jeśli możesz mieć zainteresowanie uczestnictwem w tym projekcie 19 00:00:57,500 --> 00:01:02,270 czym będziemy dostarczać angielskiego transkrypcje i napisy na kurs w wykładach 20 00:01:02,270 --> 00:01:05,450 i szorty i seminaria oraz sekcje i podobne, 21 00:01:05,450 --> 00:01:08,200 jeśli mówić płynnie lub pisać płynnie jakiś inny język, 22 00:01:08,200 --> 00:01:12,290 chcielibyśmy zaangażować się w ten projekt, za pomocą którego można wziąć na jeden lub więcej filmów, 23 00:01:12,290 --> 00:01:15,200 tłumacząc je na język znasz bardzo dobrze. 24 00:01:15,200 --> 00:01:18,700 >> Aby dać ci poczucie interfejsu, jest to internetowy interfejs użytkownika 25 00:01:18,700 --> 00:01:22,090 że będziemy używać, które będą tworzyć głównie UI takiego. 26 00:01:22,090 --> 00:01:24,290 To było mi nauczanie niektórych Halloween temu 27 00:01:24,290 --> 00:01:27,390 i na prawej stronie tam w czarnym obok tych stempli czasowych, 28 00:01:27,390 --> 00:01:31,210 zobaczysz różne rzeczy, które wyszły z moich ust, że dzień, 29 00:01:31,210 --> 00:01:34,850 a pod nim będziesz w stanie przetłumaczyć na inny język 30 00:01:34,850 --> 00:01:38,690 dokładnie to, co jest między mapping, w tym przypadku Polski i, powiedzmy, hiszpański. 31 00:01:38,690 --> 00:01:40,440 Więc to jest rzeczywiście bardzo łatwy w obsłudze narzędzie. 32 00:01:40,440 --> 00:01:43,370 Można przewijać do przodu i bardzo łatwo za pomocą skrótów klawiaturowych. 33 00:01:43,370 --> 00:01:47,490 Więc jeśli chcesz wziąć udział w tym eksperymencie i mają twoje słowa zobaczyć i przeczytać 34 00:01:47,490 --> 00:01:51,850 przez potencjalnie tysięcy ludzi tam, proszę uprzejmie uczestniczyć. 35 00:01:51,850 --> 00:01:54,350 Jedno słowo o kociaka od poniedziałku. 36 00:01:54,350 --> 00:02:00,350 Lest wysłaliśmy zbyt straszną wiadomość, zdają sobie sprawę, że w godzinach pracy sugerują 37 00:02:00,350 --> 00:02:03,300 oraz sekcje sugerują, konstrukcja jest oczywiście bardzo 38 00:02:03,300 --> 00:02:07,360 się, że uczniowie współpracują i mówić do pracy za pośrednictwem zestawów problemowych 39 00:02:07,360 --> 00:02:11,260 i problemy razem, i naprawdę linia tylko sprowadza się do, 40 00:02:11,260 --> 00:02:16,010 ponownie, praca, którą ostatecznie należy przedłożyć własny. 41 00:02:16,010 --> 00:02:18,860 I tak szczerze mówiąc, w godzinach pracy urzędu, jest to całkowicie normalne, 42 00:02:18,860 --> 00:02:22,240 jest to całkowicie się spodziewać nawet do rozmowy z pewnym znajomym obok. 43 00:02:22,240 --> 00:02:24,370 >> Jeśli on lub ona ma problemy z jakimś tematem i jesteś jak, 44 00:02:24,370 --> 00:02:27,940 "Och, dobrze, dam ci dostrzec pewnego wiersza kodu, który napisał, że" jest w porządku, 45 00:02:27,940 --> 00:02:31,250 tak się dzieje, i to bardzo sprzyja, jak sądzę, z procesem uczenia się. 46 00:02:31,250 --> 00:02:36,750 Gdzie linia zostaje przekreślony jest gdy głowa jest pochylona nad rodzajem tutaj zbyt wielu sekund 47 00:02:36,750 --> 00:02:41,160 lub minuty za to naprawdę właśnie zostały odblokowanie okazja dla znajomego, 48 00:02:41,160 --> 00:02:44,160 a już na pewno, kiedy wszystko się wymieniane za pośrednictwem poczty elektronicznej i Dropbox i tym podobnych, 49 00:02:44,160 --> 00:02:45,640 tam też jest linia. 50 00:02:45,640 --> 00:02:48,620 Więc za wszelką cenę czuć się komfortowo i skłania go do rozmów z przyjaciółmi 51 00:02:48,620 --> 00:02:52,810 i koledzy o psets i więcej i po prostu zrozumieć, że to, co ostatecznie złożyć 52 00:02:52,810 --> 00:02:57,340 naprawdę powinny być produktem swojego dzieła, a nie ktoś inny. 53 00:02:57,340 --> 00:03:00,490 I tak jeden z domeny specyficznych problemów pset2, 54 00:03:00,490 --> 00:03:04,740 który wyjdzie późno jutro, jest nurkowanie w świat kryptografii 55 00:03:04,740 --> 00:03:08,970 co to sztuka szyfrowania lub kodowania informacji, 56 00:03:08,970 --> 00:03:12,600 i to ostatecznie dotyczy świata bezpieczeństwa. 57 00:03:12,600 --> 00:03:16,560 Teraz, bezpieczeństwa dla większości z nas jest w formie mechanizmów dość prozaicznych. 58 00:03:16,560 --> 00:03:19,050 Każdy z nas ma nazwy użytkownika i hasła, 59 00:03:19,050 --> 00:03:23,450 i każdy z nas ma bardzo złe nazwy użytkownika i hasła, najprawdopodobniej. 60 00:03:23,450 --> 00:03:28,240 >> Jeśli hasło jest takie samo na wielu stronach internetowych, że prawdopodobnie nie jest najlepszym pomysłem, 61 00:03:28,240 --> 00:03:30,070 jak omówimy kierunku semestru końca. 62 00:03:30,070 --> 00:03:34,720 Jeśli hasło jest napisane na karteczki - nie żart - na monitorze, 63 00:03:34,720 --> 00:03:38,350 że zbyt niekoniecznie jest najlepszy projekt, ale dość częstym zjawiskiem. 64 00:03:38,350 --> 00:03:42,470 A jeśli nie używasz szyfrowania do szyfrowania haseł, 65 00:03:42,470 --> 00:03:44,210 są one szczególnie narażone. 66 00:03:44,210 --> 00:03:47,270 Więc jeśli uważasz, że jest bardzo mądry poprzez ukryty dokument Word 67 00:03:47,270 --> 00:03:49,910 gdzieś na dysku twardym, który zawiera wszystkie hasła 68 00:03:49,910 --> 00:03:53,670 ale to jest w folderze, że nikt nie będzie szukać w, to też nie jest bardzo bezpieczny mechanizm. 69 00:03:53,670 --> 00:03:56,990 I co z tego pset2 wprowadzi to sztuka kryptografii 70 00:03:56,990 --> 00:04:02,010 i kodowania informacji, aby takie rzeczy jak hasła są bardziej bezpieczne. 71 00:04:02,010 --> 00:04:05,790 Kontekst jest to, że z niepewnych danych 72 00:04:05,790 --> 00:04:07,930 jest możliwość zaszyfrowania go i wspiąć go. 73 00:04:07,930 --> 00:04:11,470 A więc, na przykład, jest przykładem zaszyfrowanej wiadomości. 74 00:04:11,470 --> 00:04:14,700 To rzeczywiście coś mówi w języku angielskim, ale to wyraźnie nie całkowicie oczywiste. 75 00:04:14,700 --> 00:04:18,279 A my zatoczyła koło dzisiaj odciąć co ta tajemnica wiadomość tutaj jest. 76 00:04:18,279 --> 00:04:23,490 Ale w prawdziwym świecie komputerów, rzeczy, nawet nie wyglądają jak mogą one być zwroty angielskie. 77 00:04:23,490 --> 00:04:28,430 Na przykład, jest to, co można znaleźć w standardowym systemie Linux lub Mac lub UNIX komputera 78 00:04:28,430 --> 00:04:32,070 w pliku, który był kiedyś, dawno nazywane pliku haseł. 79 00:04:32,070 --> 00:04:34,200 >> Obecnie został przeniesiony do innych miejsc. 80 00:04:34,200 --> 00:04:39,210 Ale jeśli spojrzeć na właściwym miejscu w systemie, pojawi się nie tylko swoją nazwę użytkownika 81 00:04:39,210 --> 00:04:43,400 lub innych osób w systemie, ale zobaczysz zaszyfrowaną wersję swojego hasła. 82 00:04:43,400 --> 00:04:47,980 Rzeczywiście, tam krypta słowo sugeruje, że następujące rzeczy jest szyfrowane, 83 00:04:47,980 --> 00:04:52,680 i ta seria pozornie przypadkowych liter i cyfr i znaków itd. 84 00:04:52,680 --> 00:04:56,480 można odszyfrować tylko ogólnie znając jakąś tajemnicę - 85 00:04:56,480 --> 00:04:58,840 tajne słowo, tajny numer - 86 00:04:58,840 --> 00:05:03,160 i tak rzeczywiście, sztuka kryptografii ostatecznie sprowadza się do zaufania jakiegoś 87 00:05:03,160 --> 00:05:05,650 i wiedząc, że ktoś czegoś nie robi. 88 00:05:05,650 --> 00:05:10,090 Więc będziemy badać to w nieco bardziej szczegółowo dziś iw Pset przyjść. 89 00:05:10,090 --> 00:05:12,200 A teraz słowo na pass / fail. 90 00:05:12,200 --> 00:05:15,360 Zwłaszcza że niektórzy z was zanurkował pset1, urządzenia, 91 00:05:15,360 --> 00:05:19,080 i bardzo nowy świat dla siebie, uświadomić sobie, że frustracja i zamęt 92 00:05:19,080 --> 00:05:21,700 i tylko trudności techniczne są bardzo należy się spodziewać, 93 00:05:21,700 --> 00:05:24,180 zwłaszcza z pierwszym PSET, gdzie jest tak wiele nowych, 94 00:05:24,180 --> 00:05:27,730 tylko zapoznania się z ls i cd i wszystkie te tajemnicze polecenia 95 00:05:27,730 --> 00:05:33,050 i nowe otoczenie, a to jest niezależne od rzeczywistego materiału i programowania siebie. 96 00:05:33,050 --> 00:05:36,940 Więc sobie sprawę też, że z pewnością istnieją godziny pracy, które istnieją jako konstrukcji nośnej. 97 00:05:36,940 --> 00:05:38,880 >> Sekcje rozpocząć tę niedzielę nadchodzi. 98 00:05:38,880 --> 00:05:42,960 Ale co najważniejsze, jeśli czujesz się po prostu, że to nie jest świat dla ciebie, 99 00:05:42,960 --> 00:05:44,710 sobie sprawę, że to naprawdę nie wystarczy czasu. 100 00:05:44,710 --> 00:05:48,600 I gdyby nie to, za możliwość lat temu dla mnie podejmowania przepustkę klasy / nie, 101 00:05:48,600 --> 00:05:50,990 Szczerze, nigdy bym nawet postawił nogę w klasie. 102 00:05:50,990 --> 00:05:53,690 I można to zmienić, aż, powiedzmy, piąty poniedziałek kursu, 103 00:05:53,690 --> 00:05:58,280 więc jeśli jesteś na skraju teraz uświadomić sobie, że zamiast głowy w niektórych innych wodach całkowicie, 104 00:05:58,280 --> 00:06:01,260 należy z pewnością rozważyć tylko zmiana do pass / fail. 105 00:06:01,260 --> 00:06:04,570 Ponownie, nie jest tak naprawdę ta kultura tutaj na Harvardzie podejmowania rzeczy pass / fail 106 00:06:04,570 --> 00:06:08,670 ponieważ każdy naprawdę chce osiągnąć lub nadwyżką, 107 00:06:08,670 --> 00:06:11,130 ale szczerze mówiąc, jest to wspaniały sposób próbuje coś 108 00:06:11,130 --> 00:06:16,720 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, 109 00:06:16,720 --> 00:06:18,210 być może nawet do zaskoczenia. 110 00:06:18,210 --> 00:06:20,980 Iw bardziej konkretny sposób, co myślę pass / fail ogólnie robi, 111 00:06:20,980 --> 00:06:22,940 zwłaszcza jak może masz doświadczenie z pset0, 112 00:06:22,940 --> 00:06:26,560 jeśli umieścisz w 10 godzin, 15 godzin, 25 godzin do jakiegoś Pset 113 00:06:26,560 --> 00:06:29,920 i jesteś po prostu walić głową w ścianę i robi się bardzo późno w nocy 114 00:06:29,920 --> 00:06:33,950 ale ty podjął Pset 90% drogi i po prostu nie mogę zrozumieć jednej rzeczy, 115 00:06:33,950 --> 00:06:36,520 pass / fail naprawdę ma przewagę od klasy, jak ta, 116 00:06:36,520 --> 00:06:39,100 gdzie można sortować z radością powiedzieć: "Dobra, wiem, że nie jest doskonały, 117 00:06:39,100 --> 00:06:42,350 ale pracował mój tyłek na tym, że jestem bardzo zadowolony z którym zakończył się " 118 00:06:42,350 --> 00:06:44,850 oraz że spełni oczekiwania na pass / fail. 119 00:06:44,850 --> 00:06:47,540 Więc nie miej to na uwadze. Dobrze. 120 00:06:47,540 --> 00:06:50,520 >> Tak więc ci z was, którzy walczyli do korzystania z Harward Wi-Fi, 121 00:06:50,520 --> 00:06:54,780 wiem, że jest CS50 SSID, Wi-Fi, pływających wokół 122 00:06:54,780 --> 00:06:56,490 że możesz mieć więcej szczęścia dla. 123 00:06:56,490 --> 00:07:00,130 Jest to trochę ironiczne, że hasło do tego, jeśli chcesz spróbować połączyć się z tym 124 00:07:00,130 --> 00:07:08,350 dla lepszych prędkości - i daj nam znać, czy to nie lepsze - to 12345, aż do 8 125 00:07:08,350 --> 00:07:10,910 bo 8 jest bardziej bezpieczny niż 5. 126 00:07:10,910 --> 00:07:16,910 Więc jeśli potrzebujesz Wi-Fi hasła, łączyć się bezprzewodowo CS50 tutaj, 12345678, 127 00:07:16,910 --> 00:07:20,380 i post na CS50 Porozmawiaj jeśli jeszcze sporadyczne problemy z łącznością, 128 00:07:20,380 --> 00:07:25,420 i damy z uprawnień, które należy wiedzieć o tym miejscu. Dobrze. 129 00:07:25,420 --> 00:07:32,230 Więc szybkie teaser, zwłaszcza dla tych z was, którzy to chłopcy czy dziewczęta fan wszelkiego Apple, rzeczy. 130 00:07:32,230 --> 00:07:37,460 What I wykopali z kilku lat wstecz był ten plik tutaj, iUnlock.c, 131 00:07:37,460 --> 00:07:39,930 tylko trochę bardziej konkretne i bardziej złożone 132 00:07:39,930 --> 00:07:42,560 niektóre z bardziej podstawowych programów w C, który został nam pisania. 133 00:07:42,560 --> 00:07:46,910 Więc otworzyłem ten plik, iUnlock.c. Jest on dostępny na stronie Wykład na dziś. 134 00:07:46,910 --> 00:07:49,810 Z lewej strony widać długą listę funkcji. 135 00:07:49,810 --> 00:07:53,230 Więc człowiek, który napisał to napisał dużo funkcji, więcej niż tylko main. 136 00:07:53,230 --> 00:07:57,340 Kiedyś całą masę bibliotek tutaj, a jeśli zaczniemy przewijanie, 137 00:07:57,340 --> 00:08:04,890 co to właściwie jest to pierwszy, uważam, crack do oryginalnego iPhone. 138 00:08:04,890 --> 00:08:09,830 >> Kiedy chciał jailbreak oryginalny iPhone, co oznacza untether go z AT & T 139 00:08:09,830 --> 00:08:13,710 i faktycznie zainstalować specjalne oprogramowanie na nim i robić rzeczy, które Apple nie chce ludziom robić, 140 00:08:13,710 --> 00:08:18,480 ktoś wziął czas, aby dowiedzieć się dokładnie, w jaki sposób mogą wykorzystać błędy oprogramowania, 141 00:08:18,480 --> 00:08:22,690 błędy, błędy, w oprogramowaniu firmy Apple, a więc urodził iUnlock.c-- 142 00:08:22,690 --> 00:08:26,760 że jeśli on skompilowany na komputerze i zainstalować go na iPhone 143 00:08:26,760 --> 00:08:29,430 , który został podłączony do komputera poprzez, powiedzmy, kablem USB, 144 00:08:29,430 --> 00:08:32,450 To daje administracyjne lub uprawnienia administratora na iPhone 145 00:08:32,450 --> 00:08:34,620 i niech to zrobić bardzo dużo, co chcesz. 146 00:08:34,620 --> 00:08:36,400 I tak nie było to fascynujące kotka i myszkę 147 00:08:36,400 --> 00:08:39,340 pomiędzy Apple a resztą świata, w szczególności, ponieważ, podobnie jak wiele firm, 148 00:08:39,340 --> 00:08:43,350 próbują zablokować ich rzeczy w dół, tak że można tylko z nim zrobić, co zamierzają. 149 00:08:43,350 --> 00:08:47,360 Ale dzięki takimi ludźmi i zrozumienia szczegółów niskopoziomowych - 150 00:08:47,360 --> 00:08:50,830 iw tym przypadku programowania C - i wiele znanych konstrukcji 151 00:08:50,830 --> 00:08:55,280 że zaczęliśmy grać z, jesteś w stanie naprawdę wykorzystać sprzęt 152 00:08:55,280 --> 00:08:59,250 w sposób, z potrzebami i niekoniecznie jakiś podmiot prawny. 153 00:08:59,250 --> 00:09:01,600 Tak na przykład, nie mam pojęcia, co to wszystko robi, 154 00:09:01,600 --> 00:09:03,580 ale getVersion brzmi całkiem proste, 155 00:09:03,580 --> 00:09:05,710 i wygląda na to, że jest to funkcja, która ta osoba napisała. 156 00:09:05,710 --> 00:09:09,250 To trwa jakieś liczby całkowitej jako argumentu, nie zwraca nic, 157 00:09:09,250 --> 00:09:13,710 ale wydaje się pętli z pętli for tutaj i jeśli warunek, jeśli przerwie stanu, 158 00:09:13,710 --> 00:09:16,770 i jakoś odnosi się do numerów wersji jeśli przewiń w dół 159 00:09:16,770 --> 00:09:19,650 choć wiele z tych słów kluczowych będą nowe. 160 00:09:19,650 --> 00:09:22,590 I jest mnóstwo funkcji tutaj nigdy nie widziałem i nie mogą kiedykolwiek zobaczyć 161 00:09:22,590 --> 00:09:24,350 ciągu semestru. 162 00:09:24,350 --> 00:09:29,160 >> Na koniec dnia, to takie same zasady i logikę, że graliśmy z tak daleko. 163 00:09:29,160 --> 00:09:34,340 Więc to jest zbyt stary, by złamać iPhone 3s lub 4s lub wkrótce 5s tych dni, 164 00:09:34,340 --> 00:09:38,830 ale wiem, że to wszystko jest bardzo wiele pochodzi z tego świata, że ​​mamy zanurkował. 165 00:09:38,830 --> 00:09:42,280 Rzućmy okiem na przykład trochę bardziej prosty: 166 00:09:42,280 --> 00:09:46,260 ten, po prostu, żeby rozgrzać z pewnym składni, a także innego rodzaju danych 167 00:09:46,260 --> 00:09:48,910 że rozmawialiśmy o, ale nie bardzo widać w C. 168 00:09:48,910 --> 00:09:53,670 Jest to plik o nazwie positive1.c, a za komentarze na górze, 169 00:09:53,670 --> 00:09:56,070 to po prostu wymaga, aby użytkownik zapewnić liczbę dodatnią. 170 00:09:56,070 --> 00:09:59,910 Więc jest to przykład do-while, który jest miły dla użytkowników interaktywnych programów 171 00:09:59,910 --> 00:10:02,070 gdzie trzeba poinformować użytkownika coś zrobić, 172 00:10:02,070 --> 00:10:05,530 a jeśli nie współpracują krzyczysz na nich lub odrzucić swój wkład. 173 00:10:05,530 --> 00:10:10,480 Sprawa w punkcie: Mam zamiar zrobić linie 19 do 24 174 00:10:10,480 --> 00:10:14,620 tak długo jak użytkownik nie dał mi liczbę dodatnią. 175 00:10:14,620 --> 00:10:21,340 Ten szczegół tutaj na linii 18, dlaczego Oświadczam n powyżej tej całej pętli konstruowania 176 00:10:21,340 --> 00:10:26,870 w przeciwieństwie do prawej, gdzie faktycznie dbają, aby uzyskać n obok linii 22? Tak. 177 00:10:26,870 --> 00:10:29,330 [Animacja] Scope. >> Tak, więc to kwestia zakresu. 178 00:10:29,330 --> 00:10:31,770 A w laika, co to zakres odnosi się do? 179 00:10:34,880 --> 00:10:41,560 Tak. >> [Niesłyszalne reakcja studentów] >> Czy możesz mówić trochę głośniej? 180 00:10:41,560 --> 00:10:45,440 [Uczeń] Gdzie można uzyskać dostęp do tej zmiennej. >> Perfect. 181 00:10:45,440 --> 00:10:47,610 Gdzie można uzyskać dostęp do konkretnej zmiennej. 182 00:10:47,610 --> 00:10:50,990 I ogólnie, zasada jest dotychczas, że zakres niektórych zmiennej 183 00:10:50,990 --> 00:10:56,140 jest zdefiniowany przez ostatnich klamrowych nawiasach które widziałem. 184 00:10:56,140 --> 00:11:03,070 >> I tak w tym przypadku, jeśli popełnił błąd deklarując n na linii 22, że linia będzie działać. 185 00:11:03,070 --> 00:11:10,840 Chciałbym uzyskać int, i chciałbym umieścić go w tej zmiennej n w wierszu 22, 186 00:11:10,840 --> 00:11:17,060 ale która linia kodu będzie teraz nie wiem, co mówię? >> [Uczeń] 25. 187 00:11:17,060 --> 00:11:23,840 [Malan] 25, a okazuje się, 24, jak również dlatego, że w tym przypadku to nie wchodzi w nawiasy klamrowe. 188 00:11:23,840 --> 00:11:28,550 Więc tylko trochę uciążliwe, ale bardzo łatwo rozwiązać, po prostu deklarując zmienną 189 00:11:28,550 --> 00:11:30,700 poza samej funkcji. 190 00:11:30,700 --> 00:11:32,760 Zobaczymy później, dziś można pójść o krok dalej 191 00:11:32,760 --> 00:11:34,940 a może nawet trochę leniwy. 192 00:11:34,940 --> 00:11:39,660 I nie jest to zalecane w ogóle, ale można nawet dostać leniwy 193 00:11:39,660 --> 00:11:44,150 i umieścić zmienną globalnie, że tak powiem, nie wewnątrz funkcji, nie znajduje się wewnątrz pętli, 194 00:11:44,150 --> 00:11:49,800 ale w samym pliku, poza wszystkimi funkcjami napisałeś, jak ja tutaj, na linii 15. 195 00:11:49,800 --> 00:11:55,220 Jest to na ogół dezaprobatą, ale realizacji jest to rozwiązanie innych problemów, czasami, 196 00:11:55,220 --> 00:11:56,910 jak będziemy w końcu zobaczyć. 197 00:11:56,910 --> 00:11:59,500 Więc teraz zostawimy to tak, ale zobaczymy, czy możemy przepisać to 198 00:11:59,500 --> 00:12:02,360 tylko zacząć wyrażania sobie trochę inaczej. 199 00:12:02,360 --> 00:12:05,550 Ten program, żeby było jasne, to positive1. 200 00:12:05,550 --> 00:12:11,980 Pozwólcie mi iść do przodu i tutaj w moim oknie terminala dokonać positive1, Enter. 201 00:12:11,980 --> 00:12:15,080 Kompiluje dobrze. Zamierzam uruchomić positive1 wciskamy Enter. 202 00:12:15,080 --> 00:12:19,250 Żądam, aby dać mi dodatnia. Powiem -1. To nie działa. 203 00:12:19,250 --> 00:12:22,340 0, 99. To wydaje się działać. 204 00:12:22,340 --> 00:12:25,310 Może nie najbardziej rygorystyczny test, ale przynajmniej jest to ładne Sprawdzanie poprawności 205 00:12:25,310 --> 00:12:27,100 że jesteśmy na właściwej drodze. 206 00:12:27,100 --> 00:12:29,570 >> Więc teraz pozwól mi iść do przodu i otworzyć wersję 2 z tym, 207 00:12:29,570 --> 00:12:32,800 i to, co już jest inna? 208 00:12:32,800 --> 00:12:39,030 Realizuje to samo, ale co wyskoczyć jak wyraźnie innego tym razem? 209 00:12:40,790 --> 00:12:47,090 Ten bool na zielono. To jest podświetlony na zielono, to kluczowym znany jako bool, która jest typu. 210 00:12:47,090 --> 00:12:50,510 Nie przychodzi wbudowana w wszystkich wersji C. 211 00:12:50,510 --> 00:12:52,650 Trzeba uwzględniać szczegółowe biblioteki. 212 00:12:52,650 --> 00:12:56,460 W naszym przypadku, to obejmowały CS50 biblioteki tak, że mamy dostęp do bool. 213 00:12:56,460 --> 00:12:59,860 Ale w wierszu 18, wydaje się mieć wartość logiczną nazywający wdzięczny. 214 00:12:59,860 --> 00:13:02,190 Mógłbym nazwał to nic, ale nazwałem to wdzięczny 215 00:13:02,190 --> 00:13:04,750 tylko rodzaj przekazać jakieś znaczenie semantyczne. 216 00:13:04,750 --> 00:13:07,700 Więc początkowo na linii 18, nie jestem najwyraźniej wdzięczny 217 00:13:07,700 --> 00:13:12,230 ponieważ wartość logiczna wdzięczny jest inicjowany na false w linii 18. 218 00:13:12,230 --> 00:13:16,500 I wtedy wydaje się to, co zrobiłem tutaj w linii 21 przez 23 219 00:13:16,500 --> 00:13:19,200 I już jest po prostu rodzaj przepisany moją logikę. 220 00:13:19,200 --> 00:13:26,100 Więc nie funkcjonalnie różne, ale w linii 22 teraz sprawdzić, czy int użytkownik dostarczył 221 00:13:26,100 --> 00:13:31,360 jest większa niż 0, a następnie po prostu zmienić wartość wdzięczny prawda. 222 00:13:31,360 --> 00:13:35,590 I dlaczego mam to zrobić? Ponieważ w linii 25, najwyraźniej mam zamiar sprawdzić warunek. 223 00:13:35,590 --> 00:13:39,760 Zrobić pętlę przy wdzięczny jest fałszywe. 224 00:13:39,760 --> 00:13:42,960 Więc zaproponowałem to jako alternatywa dla wersji 1 225 00:13:42,960 --> 00:13:47,050 bo to przynajmniej trochę bardziej intuicyjne być może, że to trochę bardziej zakorzeniona w języku angielskim. 226 00:13:47,050 --> 00:13:51,980 Więc wykonaj następujące czynności podczas gdy nie jesteś wdzięczny lub podczas wdzięczny jest fałszywe. 227 00:13:51,980 --> 00:13:56,220 I tym razem też mi się zdaje, nie obchodzi się pamiętać, co użytkownik wpisze w 228 00:13:56,220 --> 00:14:00,050 ponieważ zawiadomienia nie ma zmiennej n, więc faktycznie, mały biały leżą tam. 229 00:14:00,050 --> 00:14:03,290 >> Funkcjonalnie program jest nieco inny raz mamy do końca tego 230 00:14:03,290 --> 00:14:04,960 bo ja nie pamiętając, co n jest. 231 00:14:04,960 --> 00:14:09,120 Ale chciałem też tu wykazać, że choć widzieliśmy getInt 232 00:14:09,120 --> 00:14:13,780 i GetString używane na prawej stronie znaku równości dotąd 233 00:14:13,780 --> 00:14:17,310 tak, że pamiętamy wartość, technicznie, to nie jest absolutnie konieczne. 234 00:14:17,310 --> 00:14:20,290 Jeśli z jakiegoś powodu po prostu nie obchodzi, aby zapisać wartość, 235 00:14:20,290 --> 00:14:25,540 po prostu chcesz sprawdzić wartość zauważyć, że możemy po prostu napisać to jako getInt, 236 00:14:25,540 --> 00:14:27,320 open paren, blisko paren. 237 00:14:27,320 --> 00:14:30,570 Ta funkcja będzie zwracać wartość, jak już mówili. 238 00:14:30,570 --> 00:14:32,220 To będzie oddać int. 239 00:14:32,220 --> 00:14:34,460 I tak, jeśli psychicznie myśli takiej sytuacji, 240 00:14:34,460 --> 00:14:38,190 po wpisaniu w 99, getInt zwraca liczbę 99, 241 00:14:38,190 --> 00:14:41,840 i tak koncepcyjnie, to tak, że mój kod były faktycznie to. 242 00:14:41,840 --> 00:14:45,950 Więc jeśli 99 jest rzeczywiście większa niż 0, a następnie staje się prawdą, wdzięczny, 243 00:14:45,950 --> 00:14:50,810 Następnie linia 25 realizuje ooh, skończyliśmy, bo jestem teraz wdzięczny, 244 00:14:50,810 --> 00:14:53,970 w linii 26, po prostu powiedzieć: "Dzięki za dodatnią liczbę całkowitą!" 245 00:14:53,970 --> 00:14:55,960 cokolwiek to stało się. 246 00:14:55,960 --> 00:14:59,140 Teraz zróbmy niewielki syntaktyczne cukru tutaj, że tak powiem. 247 00:14:59,140 --> 00:15:04,670 Zobaczmy, czy uda nam się oczyścić tę linię 25 w tym wariancie trzecim i ostatnim w positive3. 248 00:15:04,670 --> 00:15:13,600 >> Zauważ tylko różnicą jest to, co się teraz linia kodu? >> [Uczeń] 25. >> [Malan] Tak, 25. 249 00:15:13,600 --> 00:15:17,680 I nie byli naprawdę widziałem tej sztuczki jeszcze, ale widziałem wykrzyknik w poniedziałek, 250 00:15:17,680 --> 00:15:21,070 co oznacza co? >> [Uczeń] Nie. Nie >> lub zaprzeczeniem. 251 00:15:21,070 --> 00:15:23,510 Więc weź wartość logiczną i przerzucić jej wartość. 252 00:15:23,510 --> 00:15:25,810 True staje się fałszywe, fałszywe staje się prawdziwe. 253 00:15:25,810 --> 00:15:30,420 Więc to, chciałbym zaproponować, jest nawet trochę bardziej intuicyjny sposób pisania kodu 254 00:15:30,420 --> 00:15:33,430 bo jeszcze zainicjować wdzięczny false, nadal wykonaj następujące czynności, 255 00:15:33,430 --> 00:15:36,010 Ustawić wdzięczny prawdziwe, gdy nadejdzie czas, 256 00:15:36,010 --> 00:15:40,880 ale teraz można naprawdę tylko przetłumaczyć ten kod werbalnie lewej do prawej, 257 00:15:40,880 --> 00:15:45,630 while (wdzięczny!), bo punkt huk lub wykrzyknikiem oznacza pojęcie nie 258 00:15:45,630 --> 00:15:47,580 więc gdy nie wdzięczny. 259 00:15:47,580 --> 00:15:49,900 Więc jeszcze raz, że nie wprowadzono żadnych nowych pojęć per se. 260 00:15:49,900 --> 00:15:53,730 Rozmawialiśmy o logicznych z powrotem, gdy graliśmy z Scratch, 261 00:15:53,730 --> 00:15:56,720 ale uświadomić sobie, teraz możemy po prostu zacząć pisać nasz kod na wiele różnych sposobów. 262 00:15:56,720 --> 00:16:01,060 Tak zwłaszcza w pset1 jeśli jesteś rodzaju walczy, aby dowiedzieć się sposób pisać jakiś program, 263 00:16:01,060 --> 00:16:04,340 kursy są masz szczęście, bo może być dowolna ilość rozwiązań 264 00:16:04,340 --> 00:16:06,110 , które mogą się zdarzyć na. 265 00:16:06,110 --> 00:16:10,500 Na przykład, jest to tylko 3 do nawet najprostszych programów. Dobrze. 266 00:16:10,500 --> 00:16:14,200 A teraz przypominam poniedziałek wyszliśmy na tej notatce ze zwracanych wartości. 267 00:16:14,200 --> 00:16:18,450 Tak więc po raz pierwszy napisaliśmy program, który nie tylko miał main; 268 00:16:18,450 --> 00:16:22,550 ma też swoją własną funkcję niestandardową, że napisałem tutaj. 269 00:16:22,550 --> 00:16:26,810 Tak więc w linii 31 przez 34 I zostały wdrożone funkcji modułu. 270 00:16:26,810 --> 00:16:30,240 To nie jest skomplikowane. To jest po prostu * a * w tym przypadku. 271 00:16:30,240 --> 00:16:34,750 Ale, co ważne jest to, że biorę wkład w postaci 272 00:16:34,750 --> 00:16:39,180 i wracam wyjście w postaci * a *. 273 00:16:39,180 --> 00:16:43,560 Więc teraz mam możliwość, podobnie jak kiedyś z prinf sam, 274 00:16:43,560 --> 00:16:47,240 do wywołania tej funkcji poprzez wywołanie funkcji modułu. 275 00:16:47,240 --> 00:16:51,970 >> A funkcja kostka ma pewien wkład, a funkcja zwraca jakąś kostka wyjście. 276 00:16:51,970 --> 00:16:56,960 Natomiast printf właśnie zrobił coś. 277 00:16:56,960 --> 00:17:00,840 Nie zwraca niczego, że zależało, choć jak na bok to nie zwraca wartości; 278 00:17:00,840 --> 00:17:03,110 po prostu generalnie ignorować. 279 00:17:03,110 --> 00:17:06,510 Printf po prostu zrobił coś. To miał efekt uboczny drukowania na ekranie. 280 00:17:06,510 --> 00:17:11,770 Natomiast tutaj mamy funkcję modułu, który faktycznie zwraca coś. 281 00:17:11,770 --> 00:17:15,520 Więc dla tych, znane z tego, że jest to dość prosta idea. 282 00:17:15,520 --> 00:17:19,640 Ale dla tych mniej zaznajomieni z tej idei przekazując wejść i powrót wyjścia, 283 00:17:19,640 --> 00:17:21,950 spróbujmy po prostu coś super proste. 284 00:17:21,950 --> 00:17:25,490 Czy ktoś zbliża się komfortowo na scenie krótko? 285 00:17:25,490 --> 00:17:28,040 Musisz być wygodne, z aparatem na Ciebie. Tak? Okay. 286 00:17:28,040 --> 00:17:31,240 Jak masz na imię? >> [Uczeń] Ken. >> Ken. Dobrze. Ken, chodź na górę. 287 00:17:31,240 --> 00:17:35,050 Ken będzie funkcją rodzaju o. 288 00:17:35,050 --> 00:17:38,720 Idziemy naprzód i to zrobić. Chodźmy trochę fantazji. 289 00:17:38,720 --> 00:17:42,260 Miło Pana poznać. Witamy na środek sceny. Dobrze. 290 00:17:42,260 --> 00:17:46,640 Załóżmy, naciśnij ten przycisk tutaj. Dobrze. 291 00:17:46,640 --> 00:17:49,820 Więc tutaj masz nowoczesną tablica, 292 00:17:49,820 --> 00:17:53,470 i to, co jest głównym am funkcji, na przykład, 293 00:17:53,470 --> 00:17:56,460 i nie mam iPada w ręku. 294 00:17:56,460 --> 00:17:59,710 >> Naprawdę nie pamiętam, jak się - Cóż, nie mogę powiedzieć. 295 00:17:59,710 --> 00:18:02,480 I naprawdę nie ma dobrego pisma, 296 00:18:02,480 --> 00:18:05,520 a więc dlatego chcę, aby wydrukować coś na ekranie dla mnie. 297 00:18:05,520 --> 00:18:12,040 Ja jako główny program, a ja będę musiał to mówisz 298 00:18:12,040 --> 00:18:16,720 pisząc to w moim podstaw kurczaka, a następnie przekazując wam wejście. 299 00:18:16,720 --> 00:18:20,400 Tak głupie, choć tego ćwiczenia jest pojęcie funkcji i wywołanie funkcji 300 00:18:20,400 --> 00:18:22,400 i powrót funkcji naprawdę sprowadza się do tego. 301 00:18:22,400 --> 00:18:26,260 Jestem głównym, właśnie napisane printf, cytuję-koniec cytatu coś na ekranie, 302 00:18:26,260 --> 00:18:29,110 Używam tego programu, a jak tylko printf pobiera nazywany, 303 00:18:29,110 --> 00:18:32,880 to ma jeden argument lub jeden parametr czasem między cudzysłów. 304 00:18:32,880 --> 00:18:35,880 O to, że argument. Jestem przekazaniem go do Kena. 305 00:18:35,880 --> 00:18:39,020 Jest czarna skrzynka napisane niektóre kilka lat temu 306 00:18:39,020 --> 00:18:41,510 że najwyraźniej wie, jak wydrukować rzeczy na ekranie. 307 00:18:41,510 --> 00:18:43,150 Więc wykonać. 308 00:18:49,280 --> 00:18:51,280 To nie jest złe. Bardzo dobrze. 309 00:18:51,280 --> 00:18:55,510 Więc teraz Ken odbywa wykonania. Będzie musiał oddać mi wszystko z powrotem? 310 00:18:55,510 --> 00:18:57,470 Nie to, że widzieliśmy do tej pory. 311 00:18:57,470 --> 00:19:00,460 Ponownie, printf nie faktycznie zwracać liczbę, ale będziemy ignorować, że do teraz 312 00:19:00,460 --> 00:19:03,470 ponieważ nigdy nie używałem go. Więc to jest to dla Kena. 313 00:19:03,470 --> 00:19:08,580 I tak teraz głównym przejmuje kontrolę program ponownie 314 00:19:08,580 --> 00:19:11,060 ponieważ linia kodu, printf, odbywa wykonania. 315 00:19:11,060 --> 00:19:14,050 A my go o naszej drodze, wykonując wszelkie inne linie są tam. 316 00:19:14,050 --> 00:19:17,320 Więc teraz spróbujmy nieco inny przykład. 317 00:19:17,320 --> 00:19:24,940 Tym razem tutaj niech najpierw wyczyścić ekran, tym razem zrobimy cubing funkcji 318 00:19:24,940 --> 00:19:27,080 ale tym razem, spodziewam wartość wyjściową. 319 00:19:27,080 --> 00:19:29,180 >> Więc idź naprzód i to zrobić. 320 00:19:29,180 --> 00:19:35,790 Teraz mam linii kodu, który mówi x dostaje kostkę x. 321 00:19:41,370 --> 00:19:46,370 Linii kodu, recall, wygląda następująco: x = kostka (x); 322 00:19:46,370 --> 00:19:50,930 Więc jak to będzie działać? Idziemy naprzód i daje biały ekran ponownie. 323 00:19:50,930 --> 00:19:54,070 Mam zamiar napisać teraz wartość x, 324 00:19:54,070 --> 00:20:01,400 , które w tym momencie dzieje się, powiedzmy, 2 do keep it simple. 325 00:20:01,400 --> 00:20:06,150 Napisałem na kartce papieru, wartość 2, który jest moim x wartość. 326 00:20:06,150 --> 00:20:10,920 I oddać go do Kena. >> A ja po prostu napisać odpowiedź? >> Tak, po prostu napisać odpowiedź. 327 00:20:12,760 --> 00:20:18,940 Okay. A teraz musi zwrócić mi coś. Perfect. Miło Segue. 328 00:20:18,940 --> 00:20:23,120 Więc teraz wręcza mnie wartość 8 w tym przypadku, i co mam z nim zrobić? 329 00:20:23,120 --> 00:20:28,250 Właściwie - zobaczmy, uzyskać to prawo. Co ja mam z tym zrobić? 330 00:20:28,250 --> 00:20:33,440 Teraz mam zamiar wziąć tę wartość i faktycznie przechowywać go w tych samych bitów w pamięci. 331 00:20:33,440 --> 00:20:35,170 Zauważmy jednak, że jestem trochę walczy tutaj. 332 00:20:35,170 --> 00:20:38,210 Jestem trochę zdezorientowany, bo nie wiem od czego właściwie zapisu wartości x, 333 00:20:38,210 --> 00:20:43,150 bo to, co właśnie zrobić to fizycznie ręka Ken kawałek papieru, który miał wartość 2, 334 00:20:43,150 --> 00:20:46,590 co było x, a nawet, że to właśnie to, co się stało. 335 00:20:46,590 --> 00:20:50,210 Tak więc okazuje się, że podczas wywoływania funkcji i przechodzą w argumencie 336 00:20:50,210 --> 00:20:53,290 jak hello, world lub przechodzą w argumencie jak 2, 337 00:20:53,290 --> 00:20:57,110 ogólnie jesteś przejazdem w kopii tego argumentu. 338 00:20:57,110 --> 00:21:00,730 I tak jak ja zapisałem numer 2 tu i wręczył go Ken, 339 00:21:00,730 --> 00:21:04,720 musi to oznaczać, że wciąż mam kopię gdzieś wartości 2 340 00:21:04,720 --> 00:21:08,890 bo rzeczywiście, teraz, że stałam się z powrotem na wartość 8, trzeba cofnąć się w pamięci RAM 341 00:21:08,890 --> 00:21:12,130 i rzeczywiście napisać 8, gdzie kiedyś miałem numer 2. 342 00:21:12,130 --> 00:21:16,950 Tak wizualnie, pamiętam tego pojęcia przechodząc dosłownie kopię wartości. 343 00:21:16,950 --> 00:21:20,780 >> Ken nie jego sprawa, ręce mnie coś - w tym przypadku wartość takich jak 8 - 344 00:21:20,780 --> 00:21:24,980 i wtedy coś zrobić z tą wartością, jeśli chcę zachować go wokół. 345 00:21:24,980 --> 00:21:29,650 Więc to wszystko wróci się zbyt dobrze przed długi. 346 00:21:29,650 --> 00:21:34,920 Dziękuję bardzo za ten pokaz tutaj, Ken. [Oklaski] 347 00:21:34,920 --> 00:21:36,920 Bardzo dobrze zrobione. 348 00:21:36,920 --> 00:21:42,690 Zobaczmy, w jaki sposób ostatecznie dotyczy niektórych funkcji wywołującej, że robiliśmy tutaj. 349 00:21:42,690 --> 00:21:47,910 Pozwól mi iść dalej i doprowadzić nas z powrotem do cubing przykład tutaj. 350 00:21:47,910 --> 00:21:53,300 Zauważ, że jeśli chcemy zacząć biorąc to dalej, 351 00:21:53,300 --> 00:21:57,570 będziemy musieli mieć na uwadze fakt, że liczba x, który jest przekazywany w tutaj 352 00:21:57,570 --> 00:22:01,530 różni się od tego, co w rzeczywistości jest przekazywane do funkcji. 353 00:22:01,530 --> 00:22:05,880 Więc jeszcze raz, to przechodzą przez kopię będzie się dość związany z tematem za chwilę. 354 00:22:05,880 --> 00:22:09,580 Rzućmy okiem na coś, co nie do końca działa prawo jeszcze. 355 00:22:09,580 --> 00:22:13,250 Mam zamiar iść do przodu i otworzyć trzeci przykład buggy, który jest wadliwy z natury, 356 00:22:13,250 --> 00:22:18,550 i to się nazywa buggy3 i implementuje funkcję swap. 357 00:22:18,550 --> 00:22:25,110 Mamy tu funkcję głównego X i Y jest inicjowane arbitralnie 1 i 2, odpowiednio. 358 00:22:25,110 --> 00:22:27,700 Mogliśmy korzystać getInt, ale po prostu potrzebujesz prostego ćwiczenia, 359 00:22:27,700 --> 00:22:30,170 więc jest to zakodowane jako 1 i 2. 360 00:22:30,170 --> 00:22:35,340 W liniach 21 i 22, ale najwyraźniej wydrukować xiy, 1 na linię. 361 00:22:35,340 --> 00:22:39,720 Następnie na linii 23, ja jestem twierdzić zamiana tych wartości, kropka, kropka, kropka. 362 00:22:39,720 --> 00:22:44,170 I najwyraźniej wywołać funkcję w wierszu 24 zwany swap trwa 2 argumenty. 363 00:22:44,170 --> 00:22:48,300 Jest całkowicie legit dla funkcji do podjęcia 2 argumenty. Widzieliśmy printf to zrobić już. 364 00:22:48,300 --> 00:22:51,830 >> Więc Swap najwyraźniej bierze xiy, i jak sama nazwa wskazuje, 365 00:22:51,830 --> 00:22:54,670 Mam nadzieję, że to będzie do wymiany tych 2 wartości. 366 00:22:54,670 --> 00:23:00,090 Więc mam prawo na linii 25 "wymieniłem!" i przedruk xiy 367 00:23:00,090 --> 00:23:03,070 przy założeniu, że oni rzeczywiście zamienione. 368 00:23:03,070 --> 00:23:06,080 Ale gdybym rzeczywiście uruchomić ten program - pozwól mi otworzyć okno terminala, 369 00:23:06,080 --> 00:23:09,860 pozwól mi buggy3 - jak sama nazwa wskazuje, to nie skończy się dobrze 370 00:23:09,860 --> 00:23:15,770 bo kiedy naciśnij Enter, zauważysz, że x to 1, y 2, 371 00:23:15,770 --> 00:23:19,420 i jeszcze na końcu programu, są one nadal w rzeczywistości sama. 372 00:23:19,420 --> 00:23:22,960 Tak więc na podstawie demonstracji już teraz z Kenem, co się właściwie dzieje? 373 00:23:22,960 --> 00:23:28,710 Miejmy nurkowania w tej funkcji swap. To super krótki. To tylko kilka linijek kodu długi. 374 00:23:28,710 --> 00:23:34,520 Ale co jest podstawowym problemem w oparciu o zwykłą opowieścią tutaj z Kenem? 375 00:23:34,520 --> 00:23:36,670 Dlaczego Swap łamane? 376 00:23:36,670 --> 00:23:39,660 [Uczeń] Jesteś przechowywania do kopii, a nie zmiennej. 377 00:23:39,660 --> 00:23:43,980 Dokładnie. Jesteśmy przechowywania do kopii, nie sama zmienna. 378 00:23:43,980 --> 00:23:47,170 Innymi słowy, swap najwyraźniej ma 2 argumenty, int, 379 00:23:47,170 --> 00:23:49,370 i jest nazywany arbitralnie i B 380 00:23:49,370 --> 00:23:54,420 i tu mam przekazany xiy, które są odpowiednio 1 i 2, 381 00:23:54,420 --> 00:23:58,770 ale nie jestem dosłownie przechodzącą w X, nie mam dosłownie przechodzi w Y, 382 00:23:58,770 --> 00:24:01,450 Olewam kopię x oraz kopię y. 383 00:24:01,450 --> 00:24:04,510 To prawie tak, jakby skopiowane i wklejone do swapu 384 00:24:04,510 --> 00:24:07,810 wartości, które chcesz, aby faktycznie manipulować. 385 00:24:07,810 --> 00:24:14,480 Więc jeśli to jest w przypadku, gdy uruchomienie programu realizacji linii 35 i 36, 386 00:24:14,480 --> 00:24:18,650 kiedy się do linii 37, w tym momencie w historii, co to jest wartość? 387 00:24:21,040 --> 00:24:25,050 W tym momencie w historii, linia 37, jaka jest wartość w tym momencie? >> [Uczeń] 1. 388 00:24:25,050 --> 00:24:29,280 [Malan] Powinno być tylko 1, w prawo, ponieważ x został przekazany jako pierwszy argument, 389 00:24:29,280 --> 00:24:33,080 i ta funkcja po prostu arbitralnie woła swój pierwszy argument jest. 390 00:24:33,080 --> 00:24:38,200 Podobnie jest y do drugiego argumentu, a to jest po prostu arbitralnie wywołanie sekund b. argumentów. 391 00:24:38,200 --> 00:24:40,990 >> Ta dychotomia jest rzeczywiście dość prosto wytłumaczyć. Pomyśl o tym. 392 00:24:40,990 --> 00:24:43,320 Nikt z nas nie spotkał się z osobą, która napisała printf, 393 00:24:43,320 --> 00:24:50,770 więc na pewno, on nie ma pojęcia, co nasze zmienne 30 lat później będą tzw. 394 00:24:50,770 --> 00:24:56,650 Więc nie musi być rozróżnienie co nazywasz zmienne w funkcji piszesz 395 00:24:56,650 --> 00:25:02,080 i to, co nazywasz zmienne w funkcji dzwonisz lub używanie. 396 00:25:02,080 --> 00:25:05,340 Więc innymi słowy, napisałem moje zmienne, x i y, 397 00:25:05,340 --> 00:25:08,890 ale jeśli ktoś napisał funkcję wymiany, on na pewno nie wiesz 398 00:25:08,890 --> 00:25:10,690 co moje zmienne zostaną powołani, 399 00:25:10,690 --> 00:25:13,830 więc sobie sprawę, że to właśnie dlatego masz ten dualizm nazw. 400 00:25:13,830 --> 00:25:16,750 Technicznie, mógłby zrobić to przez przypadek, 401 00:25:16,750 --> 00:25:20,080 ale nadal są one być przekazane jako kopie. 402 00:25:20,080 --> 00:25:23,650 Byłoby to po prostu czysty przypadek estetycznie jeśli osoba która napisała swapa 403 00:25:23,650 --> 00:25:26,150 użył tych samych nazw. 404 00:25:26,150 --> 00:25:32,370 Więc w tym momencie w historii, linia 37, to 1, b jest 2, a teraz mam postępować, aby zamienić je. 405 00:25:32,370 --> 00:25:34,900 Po pierwsze, pozwól mi faktycznie to zrobić znacznie prościej. 406 00:25:34,900 --> 00:25:36,690 Nie wiem, co te 3 linie kodu robią. 407 00:25:36,690 --> 00:25:41,210 Pozwól mi to zrobić: b = a; = b; zrobione. 408 00:25:41,210 --> 00:25:44,690 Dlaczego to jest złamane, logicznie? 409 00:25:46,490 --> 00:25:48,900 To rodzaj intuicyjnego rzeczy, prawda? 410 00:25:48,900 --> 00:25:52,560 Więc staje się B i B staje się, 411 00:25:52,560 --> 00:25:57,730 ale problemem jest to, że jak tylko linia 37 wykonuje, co jest wartością A i B? 412 00:25:57,730 --> 00:26:03,410 Same, 1, bo jesteście niszczona, by tak rzec, zmieniłeś b, aby dorównać. 413 00:26:03,410 --> 00:26:08,890 Więc raz linia 37 została wykonana, to świetnie, teraz masz 2 kopie numeru 1 414 00:26:08,890 --> 00:26:13,350 wewnątrz tej funkcji, więc wtedy, kiedy mówisz w linii 38 = b, 415 00:26:13,350 --> 00:26:17,640 jesteś trochę przykręcić, bo jesteś po prostu przypisanie 1 do 1. 416 00:26:17,640 --> 00:26:20,580 Masz trochę stracił wartość, której zależało. 417 00:26:20,580 --> 00:26:23,220 Tak w wersji oryginalnej z tym zauważyć, co zrobiłem. 418 00:26:23,220 --> 00:26:26,850 I zamiast tego mieliśmy trzecią linię kodu, która wyglądała jak ten. 419 00:26:26,850 --> 00:26:28,580 Oświadczam zmiennej tymczasowej. 420 00:26:28,580 --> 00:26:32,170 >> Tmp jest bardzo ogólna nazwa zmiennej tymczasowej i jest int 421 00:26:32,170 --> 00:26:34,580 ponieważ musi dopasować to, co chcę zrobić kopię. 422 00:26:34,580 --> 00:26:39,770 Przechowywać kopię wewnętrznej tmp, więc po linii 37 został wykonany, 423 00:26:39,770 --> 00:26:45,860 wartość jest - szybkie sprawdzenie poprawności - 1, wartość b wynosi 2, 424 00:26:45,860 --> 00:26:48,970 a wartość tmp także 1. 425 00:26:48,970 --> 00:26:52,060 Więc teraz wykonać linię 38. 426 00:26:52,060 --> 00:27:00,540 Po linii 38 wykonuje, nabiera wartości b. Oraz b to 2, więc jest teraz 2. 427 00:27:00,540 --> 00:27:05,210 Więc w tym momencie w historii, jest 2, b jest 2 i tmp jest 1, 428 00:27:05,210 --> 00:27:11,060 tak teraz logicznie, możemy po prostu TMP plop jego wartość do b i skończymy. 429 00:27:11,060 --> 00:27:12,800 Więc mamy rozwiązać ten problem. 430 00:27:12,800 --> 00:27:17,720 Niestety, kiedy uruchomić ten program w tej formie, w rzeczywistości nie zamieniać żadnych wartości. 431 00:27:17,720 --> 00:27:20,100 Ale żeby było jasne, to dlaczego? 432 00:27:23,660 --> 00:27:26,450 Naprawiłem logiczny problemu z przed chwilą, 433 00:27:26,450 --> 00:27:31,020 ale znowu, jeśli uruchomić ten program, x i y pozostają bez zmian 434 00:27:31,020 --> 00:27:33,310 do końca wykonywania programu. 435 00:27:33,310 --> 00:27:37,220 [Niesłyszalne comment studentów] >> My nie zwróciło nic, więc to prawda. 436 00:27:37,220 --> 00:27:39,670 Ale okazuje się, że jest trochę problemem tutaj, bo do tej pory, 437 00:27:39,670 --> 00:27:44,170 Jedyne co udało mi się wrócić to jedno, a to ograniczenie C. 438 00:27:44,170 --> 00:27:49,070 Możesz tylko wrócić naprawdę jedną wartość, w tym przypadku jestem rodzaj zakleszczony tutaj 439 00:27:49,070 --> 00:27:53,310 bo mogłem zwracać nową wartość x lub mogę zwrócić nową wartość y, 440 00:27:53,310 --> 00:27:55,190 ale chcę, zarówno z powrotem. 441 00:27:55,190 --> 00:27:58,650 Więc wracając nie proste rozwiązanie jest tutaj. 442 00:27:58,650 --> 00:28:01,710 Ale problem zasadniczo brzmi: dlaczego? Co my właściwie zamienione? 443 00:28:01,710 --> 00:28:04,190 [Uczeń] i b. >> Ib. 444 00:28:04,190 --> 00:28:08,230 Ale i b są kopie xiy, co oznacza, że ​​po prostu nie wszystko w tej pracy, 445 00:28:08,230 --> 00:28:11,650 po prostu spędziliśmy 3 minut rozmowy o funkcji wymiany i wszystkie 3 z tych zmiennych, 446 00:28:11,650 --> 00:28:15,420 i to jest wspaniałe, idealnie poprawne w izolacji, 447 00:28:15,420 --> 00:28:20,740 ale i zakres b tylko jest w tych liniach tutaj. 448 00:28:20,740 --> 00:28:24,790 >> Więc jak dla pętli, jeśli deklarują liczbę całkowitą i wewnątrz pętli for 449 00:28:24,790 --> 00:28:28,760 Podobnie, jeśli jesteś deklarowania i b wewnątrz funkcji, które zostały napisane, 450 00:28:28,760 --> 00:28:33,320 są ważne tylko wewnątrz tej funkcji, co oznacza, że ​​gdy tylko wymiany dokonuje realizacji 451 00:28:33,320 --> 00:28:38,470 i przejść z linii 24 do linii 25, X i Y są zmianie. 452 00:28:38,470 --> 00:28:42,790 Właśnie straciliśmy dużo czasu zamiana kopii zmiennych. 453 00:28:42,790 --> 00:28:47,010 Okazuje się, że rozwiązanie to jest rzeczywiście nieoczywisty. 454 00:28:47,010 --> 00:28:50,670 To nie jest zupełnie wystarczające do zwracania wartości, ponieważ możemy zwrócić tylko 1 wartości 455 00:28:50,670 --> 00:28:53,470 i bardzo chce zamienić X i Y w tym samym czasie, 456 00:28:53,470 --> 00:28:55,210 więc będziemy musieli wrócić do tego. 457 00:28:55,210 --> 00:29:01,020 Ale teraz, świadomości, że problem zasadniczo wynika z faktu, że A i B są kopie 458 00:29:01,020 --> 00:29:03,630 i są w swoim zakresie. 459 00:29:03,630 --> 00:29:05,050 Spróbujmy rozwiązać to w jakiś sposób. 460 00:29:05,050 --> 00:29:11,250 Pozwól, że faktycznie przewijania tu i otworzyć się, powiedzmy, czwarty wariant tego, buggy4. 461 00:29:11,250 --> 00:29:13,370 Co na ten temat? 462 00:29:13,370 --> 00:29:17,810 To jest podobne, ale prostsze problemem patrzeć zanim podejmiemy ukłucie na rozwiązanie go. 463 00:29:17,810 --> 00:29:24,190 Program ten nazywa przyrostu i najwyraźniej inicjalizuje x liczbę całkowitą 1 do 18, w linii. 464 00:29:24,190 --> 00:29:28,150 I potem ubiegać x to 1, I potem ubiegać "Zwiększanie ..." 465 00:29:28,150 --> 00:29:33,730 I następnie wywołać przyrost, ale w liniach 22 i 23, I twierdzą, że został zwiększony, 466 00:29:33,730 --> 00:29:40,220 Żądam x jest teraz cokolwiek to jest - 2, zapewne - ale ten program jest wadliwy. 467 00:29:40,220 --> 00:29:42,610 W czym problem? 468 00:29:43,440 --> 00:29:50,160 Tak. >> [Niesłyszalne reakcja studentów] >> Dokładnie. 469 00:29:50,160 --> 00:29:52,490 Więc x zostało uznane, oczywiście, na linii 18. 470 00:29:52,490 --> 00:29:54,700 To jest w nawiasach klamrowych nawiasach Main. 471 00:29:54,700 --> 00:29:58,440 Więc prostą odpowiedzią jest to, że podczas gdy x istnieje tu 472 00:29:58,440 --> 00:30:03,930 nie istnieje w linii 32, więc ten program rzeczywiście nawet nie skompilować. 473 00:30:03,930 --> 00:30:07,940 Kompilator przy próbie kompilacji tego kodu będzie na mnie wrzeszczeć 474 00:30:07,940 --> 00:30:14,100 o jakiejś nielegalnej identyfikator, czy coś w tej sprawie. W rzeczywistości, spróbujmy. 475 00:30:14,100 --> 00:30:18,470 Jest to marka buggy4. Jest. 476 00:30:18,470 --> 00:30:22,110 Korzystanie z nierejestrowaną identyfikator "X" w linii 32. 477 00:30:22,110 --> 00:30:25,580 I faktycznie, bądźmy bardziej wyraźne tu dziś tak, że jest to przydatne 478 00:30:25,580 --> 00:30:27,580 w godzinach pracy i w domu. 479 00:30:27,580 --> 00:30:29,300 >> Zauważ, że jest to trochę tajemniczo napisane. 480 00:30:29,300 --> 00:30:37,270 Ale fakt, że Clang ma krzyczeli na nas, mówiąc buggy4.c: 32:5, jest rzeczywiście przydatne. 481 00:30:37,270 --> 00:30:42,050 Oznacza to, że błąd jest w linii 32 na pozycji znaku 5. 482 00:30:42,050 --> 00:30:46,700 Tak 1, 2, 3, 4, 5. To jest, w tym, gdzie problem. 483 00:30:46,700 --> 00:30:49,790 A także, zbyt, należy pamiętać o godzinach pracy oraz w domu, jestem szczęśliwy tutaj. 484 00:30:49,790 --> 00:30:52,990 Mam jeden błąd. To będzie stosunkowo łatwe do naprawienia. 485 00:30:52,990 --> 00:30:55,990 Ale jeśli masz cały ekran pełne przeważającymi komunikatów o błędach, 486 00:30:55,990 --> 00:31:00,330 ponownie sprawę, że najniższy z nich może być tylko przejawem najwyższego jeden. 487 00:31:00,330 --> 00:31:03,450 Więc zawsze ścigać się błędy z góry na dół 488 00:31:03,450 --> 00:31:05,820 bo nie może być po prostu efekt łańcuch 489 00:31:05,820 --> 00:31:09,240 sugeruje, że masz sposób więcej problemów, niż faktycznie zrobić. 490 00:31:09,240 --> 00:31:15,150 Więc w jaki sposób możemy to naprawić, jeśli moim celem jest przyrost wartości x? >> [Uczeń] Make x globalny. 491 00:31:15,150 --> 00:31:17,060 Okay, więc możemy x globalny. 492 00:31:17,060 --> 00:31:20,480 Weźmy na skrót, że ostrzegał wcześniej, ale do cholery, po prostu musimy szybko naprawić, 493 00:31:20,480 --> 00:31:25,730 tak po prostu powiedzieć, int x tutaj. To sprawia, że ​​x globalny. 494 00:31:25,730 --> 00:31:31,800 Więc teraz główny ma do niego dostęp i przyrost ma do niego dostęp, 495 00:31:31,800 --> 00:31:34,110 więc pozwól mi iść do przodu i skompilować to teraz. 496 00:31:34,110 --> 00:31:37,630 Producent buggy4, Enter. Wydaje się skompilować teraz. 497 00:31:37,630 --> 00:31:41,230 Uciekajmy buggy4. I wydaje się faktycznie pracują. 498 00:31:41,230 --> 00:31:45,150 Jest to jedna z tych rzeczy, która jest zrobić tak jak mówię, nie tak jak ja, 499 00:31:45,150 --> 00:31:47,010 jak już tylko zrobić tutaj, bo w ogóle, 500 00:31:47,010 --> 00:31:50,440 nasze programy mają zamiar stać się o wiele bardziej interesujące i znacznie dłużej, 501 00:31:50,440 --> 00:31:56,390 i jeśli rozwiązanie życiowych problemów jest po prostu umieścić wszystkie zmienne na początku pliku, 502 00:31:56,390 --> 00:31:59,690 bardzo szybko, nie programy dostać piekielnie trudne do zarządzania. 503 00:31:59,690 --> 00:32:02,190 Coraz trudniej wymyślić nowych nazw zmiennych, 504 00:32:02,190 --> 00:32:05,240 coraz trudniej zrozumieć, co zmienna co robi, 505 00:32:05,240 --> 00:32:08,460 i tak na ogół, nie jest dobrym rozwiązaniem. 506 00:32:08,460 --> 00:32:10,030 Więc zróbmy to lepiej. 507 00:32:10,030 --> 00:32:12,160 Nie chcemy użyć zmiennej globalnej tutaj. 508 00:32:12,160 --> 00:32:16,240 >> Chcę, aby zwiększyć wartość x, więc mogłem oczywiście - 509 00:32:16,240 --> 00:32:18,670 na końcu dnia, to jest rodzaj głupie historii, ponieważ właśnie w tym celu - 510 00:32:18,670 --> 00:32:24,450 ale gdybym nie wiedział o tym operatora lub nie wolno mi było go zmienić na main samej 511 00:32:24,450 --> 00:32:30,730 jak inaczej mogłaby wdrożyć Ken tu tym razem nie do kostki, ale do przyrostu? 512 00:32:31,380 --> 00:32:33,190 Jak zmienić ten tutaj? Tak. 513 00:32:33,190 --> 00:32:38,480 [Uczeń] Przełęcz w x, a następnie powrót [niesłyszalne] >> Dobrze. 514 00:32:38,480 --> 00:32:41,900 Więc dlaczego nie mogę przejść w X, a następnie zamiast zwrotu, 515 00:32:41,900 --> 00:32:44,870 dlaczego nie mogę po prostu wracają x + 1. 516 00:32:44,870 --> 00:32:47,710 Kilka rzeczy trzeba zmienić tutaj. Jestem na dobrej drodze. 517 00:32:47,710 --> 00:32:49,770 Co jeszcze muszę się uszczypnąć? Ktoś inny. Tak. 518 00:32:49,770 --> 00:32:51,740 [Niesłyszalne odpowiedź uczeń] 519 00:32:51,740 --> 00:32:54,730 Muszę zmienić typ wartości przyrostu, ponieważ nie jest nieważne. 520 00:32:54,730 --> 00:32:57,780 Nic nie oznacza nieważny jest zwracana, ale teraz wyraźnie to jest, 521 00:32:57,780 --> 00:32:59,830 więc musi to zmienić - >> [uczeń] int. 522 00:32:59,830 --> 00:33:02,740 int być zgodne z tym, co ja właściwie powrotu. 523 00:33:02,740 --> 00:33:05,180 Teraz jest jeszcze coś innego buggy tutaj. Tak. 524 00:33:05,180 --> 00:33:08,400 [Niesłyszalne reakcja studentów] >> [Malan] Więc muszę zwiększyć x? 525 00:33:08,400 --> 00:33:12,080 [Niesłyszalne reakcja studentów] >> [Malan] Ach, więc trzeba przekazać x. 526 00:33:12,080 --> 00:33:16,660 Więc muszę to zrobić tutaj. >> [Niesłyszalne comment uczeń] 527 00:33:16,660 --> 00:33:20,050 [Malan] Więc prototyp, muszę to zmienić tutaj. 528 00:33:20,050 --> 00:33:22,930 Więc to musi być int, to musi stać się - 529 00:33:22,930 --> 00:33:25,620 Hmm, faktycznie mają błąd tutaj. Chodźmy naprawić ten jeden pierwszy. 530 00:33:25,620 --> 00:33:29,590 Jakie powinny to być w rzeczywistości? To musi być coś, int. 531 00:33:29,590 --> 00:33:32,700 To może być x, ale szczerze mówiąc, jeśli zaczniesz wzywając wszystkie swoje zmienne x, 532 00:33:32,700 --> 00:33:35,390 to dostanie mniej jasne, który jest który. 533 00:33:35,390 --> 00:33:39,560 >> Więc po prostu arbitralnie wybrać inną konwencję nazewnictwa dla mojej funkcji pomocniczych, 534 00:33:39,560 --> 00:33:41,940 funkcje piszę. Nazwijmy to, czy możemy to nazwać - 535 00:33:41,940 --> 00:33:45,010 Nazwijmy to liczba się jeszcze bardziej wyraźne. 536 00:33:45,010 --> 00:33:47,560 Więc mam do zwrotu tego, co liczba jest plus 1, 537 00:33:47,560 --> 00:33:50,740 i teraz muszę zmienić 1 inne rzeczy tu i jedna rzecz tutaj. 538 00:33:50,740 --> 00:33:54,350 Co trzeba zmienić na linii 21 po raz pierwszy? >> [Niesłyszalne odpowiedź uczeń] 539 00:33:54,350 --> 00:33:57,610 [Malan] muszę przypisać ją do x. Nie mogę po prostu zadzwonić przyrost (x). 540 00:33:57,610 --> 00:34:01,960 I trzeba pamiętać, odpowiedź, zmieniając wartość x na lewej stronie. 541 00:34:01,960 --> 00:34:04,680 I mimo, że x jest teraz na lewo i prawo, że jest całkowicie w porządku 542 00:34:04,680 --> 00:34:08,860 ponieważ prawa strona zostanie zrealizowane w pierwszej kolejności, a następnie dostaje koleś do rzeczy po lewej - 543 00:34:08,860 --> 00:34:10,600 x w tym przypadku. 544 00:34:10,600 --> 00:34:12,159 I wtedy wreszcie, jest to łatwo naprawić teraz. 545 00:34:12,159 --> 00:34:17,230 Powinno to tylko mecz, co jest na dole, int numer. 546 00:34:17,230 --> 00:34:20,570 Więc cała masa zmian dla funkcji naprawdę głupi 547 00:34:20,570 --> 00:34:24,420 ale przedstawiciel rzeczy, że będziemy coraz bardziej chcą zrobić. 548 00:34:24,420 --> 00:34:27,090 Więc upewnij buggy4. I już nie przejmował się gdzieś. 549 00:34:27,090 --> 00:34:30,139 Och, mój Boże. Pięć błędów w 6-linii programu. 550 00:34:30,139 --> 00:34:35,690 Więc co jest nie tak na linii 18, znak 5? 551 00:34:35,690 --> 00:34:39,610 Więc muszę zadeklarować to, int. 552 00:34:39,610 --> 00:34:41,920 Zobaczmy. Istnieje cała masa innych błędów. 553 00:34:41,920 --> 00:34:47,010 Och, mój Boże - 19, 18, 21 - ale znowu, po prostu wyczyścić ekran, L sterowania tutaj 554 00:34:47,010 --> 00:34:49,380 i ponownie dzyń. 555 00:34:49,380 --> 00:34:51,340 Więc 5 problemy jest rzeczywiście tak, że 1. 556 00:34:51,340 --> 00:34:57,520 Więc teraz niech uruchomić buggy4, Enter. Uff, x został zwiększony poprawnie. 557 00:34:57,520 --> 00:35:02,720 Dobrze. Wszelkie pytania na temat przyrostu liczby? Tak. 558 00:35:02,720 --> 00:35:09,870 [Niesłyszalne pytanie studenta] >> Dobre pytanie. 559 00:35:09,870 --> 00:35:14,220 Jak to jest, że mogę po prostu zmienić x do liczby, a program od razu wiedzieć? 560 00:35:14,220 --> 00:35:16,200 >> Ponownie, myśleć o tym jak tej abstrakcji. 561 00:35:16,200 --> 00:35:21,600 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. 562 00:35:21,600 --> 00:35:26,570 Nie obchodzi mnie, co on nazywa coś, co ma związek z jego realizacji tej funkcjonalności. 563 00:35:26,570 --> 00:35:33,340 Jest to szczegół, że wdrożenie, main, nie musimy się martwić. 564 00:35:33,340 --> 00:35:38,250 I tak po prostu zmienić go konsekwentnie wewnątrz funkcji - numer tutaj i numer tutaj - 565 00:35:38,250 --> 00:35:40,960 to wszystko trwa tak długo, jak przebudować. 566 00:35:40,960 --> 00:35:44,180 Jest to coś w rodzaju, jeśli myślisz o wielu z nas, tych z prawa jazdy 567 00:35:44,180 --> 00:35:46,770 który przejechał lub jeśli już nawet przejechał w samochodzie, 568 00:35:46,770 --> 00:35:50,950 większość z nas nie ma pojęcia, jak działa samochód, pod maską. 569 00:35:50,950 --> 00:35:54,970 I dosłownie, jeśli otworzyć maskę, większość z nas - w tym ja - 570 00:35:54,970 --> 00:35:56,940 nie będziemy wiedzieć, co tak naprawdę mamy do czynienia, 571 00:35:56,940 --> 00:35:59,220 trochę jak można czuć się z rzeczy, jak to teraz. 572 00:35:59,220 --> 00:36:01,480 Ale tak naprawdę nie musisz się martwić, jak samochód działa, 573 00:36:01,480 --> 00:36:05,970 nie mamy do opieki, co wszystkich prętów i tłoków i kabli wewnątrz samochodu 574 00:36:05,970 --> 00:36:08,160 rzeczywiście robi. 575 00:36:08,160 --> 00:36:12,770 Więc coś, co nazywasz tłok nie ma znaczenia w tym przypadku. Sam pomysł. 576 00:36:12,770 --> 00:36:25,300 Tak. >> [Niesłyszalne pytanie uczeń] 577 00:36:25,300 --> 00:36:29,180 Jeśli jest więcej zastosowań zmiennego momentu xa temu 578 00:36:29,180 --> 00:36:32,150 Ci, programista, musiałby zmienić je wszędzie. 579 00:36:32,150 --> 00:36:36,600 Lub można dosłownie robić pliku, Menu, a następnie Znajdź, Zamień - coś takiego - 580 00:36:36,600 --> 00:36:39,170 ale będziesz musiał dokonać tych zmian samodzielnie. 581 00:36:39,170 --> 00:36:47,450 Trzeba być konsekwentnym. >> [Uczeń] Jeśli istnieje wiele zmiennych [niesłyszalne] 582 00:36:47,450 --> 00:36:53,100 Określonej kolejności, tak jak tutaj, czy to int inny numer? >> [Uczeń] Correct. 583 00:36:53,100 --> 00:36:56,590 [Malan] Tak. Zamów liczy kiedy wywołanie funkcji. 584 00:36:56,590 --> 00:37:00,050 >> Więc jeśli wołały przyrost o czymś przecinek coś 585 00:37:00,050 --> 00:37:01,680 istnieje bezpośrednie odwzorowanie. 586 00:37:01,680 --> 00:37:05,690 Pierwsza zmienna, co się nazywa, jest egzemplarz pierwszego argumentu tutaj. 587 00:37:05,690 --> 00:37:07,760 Przepraszam. Nie powinno być nawiasów. 588 00:37:07,760 --> 00:37:11,490 Drugi argument, linie się z drugim. Tak aby, tak, ma znaczenie. Dobrze. 589 00:37:11,490 --> 00:37:17,020 Przepraszam. Wziąłem długą drogę, aby się tam dostać. Inne pytania? Dobrze. 590 00:37:17,020 --> 00:37:20,610 Zobaczmy więc, jeśli nie możemy namalować obraz tego, co się faktycznie dzieje 591 00:37:20,610 --> 00:37:23,090 pod maską, tak powiem. 592 00:37:23,090 --> 00:37:26,640 Jest to prostokąt, który może reprezentować pamięć komputera. 593 00:37:26,640 --> 00:37:30,970 Nawet jeśli nie masz pojęcia, jak działa pamięć i jak działa RAM, 594 00:37:30,970 --> 00:37:33,940 przynajmniej zakładać, że masz bukiety to te dni. 595 00:37:33,940 --> 00:37:36,280 Masz megabajtów nim, masz gigabajty to, 596 00:37:36,280 --> 00:37:40,870 i wiemy, że od tygodni 0 bajt jest tylko to, co? >> [Uczeń] 8 bitów. 597 00:37:40,870 --> 00:37:42,950 8 bitów, tak? Więc 8 zer i 1. 598 00:37:42,950 --> 00:37:45,880 Więc jeśli twój komputer ma koncert pamięci RAM, 2 koncerty RAM te dni, 599 00:37:45,880 --> 00:37:55,030 masz miliardów 2 miliardów bajtów pamięci, czyli około 8 miliardów i 16 miliardów bitów 600 00:37:55,030 --> 00:37:56,890 wewnątrz komputera. 601 00:37:56,890 --> 00:38:00,590 W przeciwieństwie do np. małego Willy Wooly, to nie cząstki magnetyczne zazwyczaj więcej. 602 00:38:00,590 --> 00:38:04,450 W coraz większym stopniu - w laptopach przynajmniej - to Dyski SSD, SSD, 603 00:38:04,450 --> 00:38:08,580 że po prostu nie mają żadnych ruchomych części. To wszystko jest elektroniczne. To wszystko jest oparte na energii elektrycznej. 604 00:38:08,580 --> 00:38:14,060 Więc myślę o tym, jak po prostu prostokąt reprezentujący 1 lub 2 GB pamięci, które masz. 605 00:38:14,060 --> 00:38:16,020 >> Więc to jest fragment pamięci. 606 00:38:16,020 --> 00:38:19,830 Świat nauki komputerowego jakby oddzielone 607 00:38:19,830 --> 00:38:22,950 kawałki pamięci do różnych rzeczy. 608 00:38:22,950 --> 00:38:27,190 Na przykład, jeśli jest zainstalowana w komputerze pamięci RAM, jak sugeruje prostokąta, 609 00:38:27,190 --> 00:38:31,130 Okazuje się, że zgodnie z konwencją, w górnej części pamięci RAM, by tak rzec, 610 00:38:31,130 --> 00:38:33,660 jest na ogół to, co nazywa fragment tekstu. 611 00:38:33,660 --> 00:38:36,740 Są 0s i 1s, które zostały skompilowane. 612 00:38:36,740 --> 00:38:39,020 Kiedy więc szukałem pod maską, co a.out jest 613 00:38:39,020 --> 00:38:41,980 wszystkie te 0s i 1s, po uruchomieniu programu, 614 00:38:41,980 --> 00:38:46,290 tych 0s i 1s są ładowane z dysku twardego do czegoś, co nazywa RAM, 615 00:38:46,290 --> 00:38:49,320 i w pamięci RAM są one narażone na górze. 616 00:38:49,320 --> 00:38:52,770 Tymczasem masz inne rzeczy: zainicjować danych odinicjować danych. 617 00:38:52,770 --> 00:38:57,510 Te 2 pokosy pamięci odnoszą się do zmiennych globalnych, które nie często korzystają 618 00:38:57,510 --> 00:39:00,760 ale czasami, jeśli nie, to w końcu się tam również. 619 00:39:00,760 --> 00:39:04,260 Potem jest kilka innych rzeczy: zmienne środowiskowe, których nie będziemy spędzać dużo czasu, 620 00:39:04,260 --> 00:39:06,860 ale potem 2 ważne rzeczy, które będą wracać w całym semestrze, 621 00:39:06,860 --> 00:39:08,550 stosu i sterty. 622 00:39:08,550 --> 00:39:12,210 Tak więc większość z pamięci komputera jest zarezerwowane podczas uruchamiania programu 623 00:39:12,210 --> 00:39:15,370 czegoś zwany stos i coś, co nazywa się sterty. 624 00:39:15,370 --> 00:39:18,840 Nie będziemy mówić o kupie dzisiaj, ale będziemy rozmawiać o stos. 625 00:39:18,840 --> 00:39:24,600 Stos ma wyczarować wizualny z tac jadalni posiłek w Mather Domu 626 00:39:24,600 --> 00:39:28,110 lub gdziekolwiek się znajdziesz, gdzie personel jadalnia oczyścić je na co dzień, 627 00:39:28,110 --> 00:39:30,180 one stosu je z podłogi, na górę, 628 00:39:30,180 --> 00:39:34,550 i podobnie, w pamięci, jest to pomysł wprowadzenie coś w stos, 629 00:39:34,550 --> 00:39:36,860 wprowadzenie czegoś na stos, stawiając coś na stosie. 630 00:39:36,860 --> 00:39:38,240 A co mamy na myśli? 631 00:39:38,240 --> 00:39:41,860 >> Miejmy powiększyć tylko na dolnej połowie tego obrazu, komputera RAM, 632 00:39:41,860 --> 00:39:44,330 zaproponować następujące. 633 00:39:44,330 --> 00:39:48,170 Okazuje się, że po uruchomieniu programu jak a.out lub Hello - 634 00:39:48,170 --> 00:39:50,100 niezależnie od programu, które zostały napisane - 635 00:39:50,100 --> 00:39:54,020 znowu te 0s i 1s są ładowane z dysku twardego, która jest długotrwałe składowanie, 636 00:39:54,020 --> 00:39:57,230 pozostaje tam nawet kiedy wyciągnąć wtyczkę, ładowane do pamięci RAM. 637 00:39:57,230 --> 00:40:00,610 RAM jest szybsza niż dyski twarde - jest mniejszy niż dyski twarde - 638 00:40:00,610 --> 00:40:03,300 ale gdzie programy żyć kiedy używasz ich. 639 00:40:03,300 --> 00:40:08,230 Więc kliknij dwukrotnie program na komputerze Mac lub PC, to jest ładowany z dysku twardego do pamięci RAM. 640 00:40:08,230 --> 00:40:11,520 Tak szybko, jak to jest ładowany do pamięci RAM, 0s i 1s Idź na szczycie drogi, 641 00:40:11,520 --> 00:40:16,610 tzw segmentu tekstu, ale, gdy w rzeczywistości program uruchamia, 642 00:40:16,610 --> 00:40:21,360 Główna funkcja nazywa, i główny, jak widzieliśmy, często zmiennych lokalnych, 643 00:40:21,360 --> 00:40:24,870 i ma wskazówki i smyczki i znaków i podobne. 644 00:40:24,870 --> 00:40:29,180 Więc, gdy Twój program, które zostały napisane lub program, który dwukrotnym kliknięciu 645 00:40:29,180 --> 00:40:32,970 niektóre zmienne używane wewnątrz głównej, 646 00:40:32,970 --> 00:40:37,240 kończy się na dole stosu pamięci, że tak powiem. 647 00:40:37,240 --> 00:40:39,410 Bardziej konkretnie, co to właściwie znaczy? 648 00:40:39,410 --> 00:40:48,450 To po prostu oznacza, że ​​jeśli mieliśmy liczba bajtów pamięci RAM w komputerze, 649 00:40:48,450 --> 00:40:55,750 zauważyć, że to może być bajt numer 0, to może być bajt numer 1, 2, 3, 4, 5, 6, 650 00:40:55,750 --> 00:41:01,480 wszystko aż do 2 miliardów byłoby aż tam na górze. 651 00:41:01,480 --> 00:41:05,880 Więc innymi słowy, gdy mówimy o pamięci RAM lub pamięci w kategoriach bajtach 652 00:41:05,880 --> 00:41:11,500 to po prostu oznacza, że ​​ktoś zdecydował, co do liczby każdego z tych fragmentów pamięci. 653 00:41:11,500 --> 00:41:16,650 Więc kiedy trzeba 32 bity int lub potrzebujesz 8 bitów dla char, 654 00:41:16,650 --> 00:41:18,840 gdzie kończą się w pamięci? 655 00:41:18,840 --> 00:41:22,350 >> Koncepcyjnie, po prostu kończy się w dolnej części tego rzecz zwaną stos. 656 00:41:22,350 --> 00:41:25,870 Ale co ciekawe, teraz jest, gdy głównym zwraca funkcja - 657 00:41:25,870 --> 00:41:28,750 Przypuszczam funkcji o nazwie foo, tylko dowolną nazwę - 658 00:41:28,750 --> 00:41:32,330 , co się dzieje w głównym jest dole stosu pamięci; 659 00:41:32,330 --> 00:41:35,680 foo teraz jest umieszczany na górze głównej w pamięci. 660 00:41:35,680 --> 00:41:40,990 Więc wszelkie zmienne lokalne, że foo jest skończyć rodzaju koncepcyjnie oprócz tych w menu głównym. 661 00:41:40,990 --> 00:41:47,070 Jeśli foo wywołuje inną funkcję o nazwie bar, zmienne te kończą się tutaj. 662 00:41:47,070 --> 00:41:50,120 Jeśli pasek zwraca coś innego, tutaj, tutaj, tutaj. 663 00:41:50,120 --> 00:41:53,830 Więc co jest ciekawe o uruchomieniu programu jest to, że podczas wywoływania funkcji 664 00:41:53,830 --> 00:41:57,750 i jak te funkcje wywoływać funkcje i jak te funkcje wywoływać funkcje, 665 00:41:57,750 --> 00:42:01,470 można zbudować ten stos funkcji w pamięci. 666 00:42:01,470 --> 00:42:06,890 I tylko raz w deklaracji funkcji pan zacząć tę pamięć. 667 00:42:06,890 --> 00:42:10,860 Tak więc jednym z najprostszych sposobów na brak pamięci w programie komputerowym 668 00:42:10,860 --> 00:42:14,360 jest napisanie funkcji, które nigdy nie wróci. 669 00:42:14,360 --> 00:42:18,900 Tak na przykład, niech wykazać jak najwięcej z programu celowego buggy. 670 00:42:18,900 --> 00:42:22,230 Pozwólcie mi iść do przodu i nie # include, 671 00:42:22,230 --> 00:42:25,000 int main (void) 672 00:42:25,000 --> 00:42:32,940 i mam zamiar zrobić, gdy (2> 1), które prawdopodobnie nigdy nie zmienię na nas, 673 00:42:32,940 --> 00:42:37,560 i pozwól mi iść do przodu i robić teraz printf. 674 00:42:37,560 --> 00:42:40,700 Właściwie, to będzie mniej wizualnie ciekawe. Zróbmy to. 675 00:42:40,700 --> 00:42:50,240 Dla int i = 0; i> 0 - zróbmy ten błąd - i + +. 676 00:42:50,240 --> 00:42:52,720 I nie printf tutaj. Przećwiczmy co głosił. 677 00:42:52,720 --> 00:43:00,190 Rzućmy metody tu refren nieważne, a powiemy int i, 678 00:43:00,190 --> 00:43:06,830 a ja powiem printf - nie, zróbmy to bardziej interesujące. 679 00:43:06,830 --> 00:43:15,790 Niech nie faktycznie wydrukować cokolwiek. Zróbmy tak: chorus (i). 680 00:43:15,790 --> 00:43:20,390 Dobrze. Więc to jest buggy bo dlaczego? 681 00:43:20,390 --> 00:43:23,380 I zmyślam, jak przejść, bo program nie właściwie nic interesów. 682 00:43:23,380 --> 00:43:25,320 >> Ale to nie cel jest. 683 00:43:25,320 --> 00:43:29,630 Celem jest napisanie programu, którego główną funkcją co robi, najwyraźniej? 684 00:43:30,720 --> 00:43:32,860 Zadzwoń sam. I rzeczywiście, nie potrzebujemy pętli. 685 00:43:32,860 --> 00:43:37,200 Powiedzmy nawet uprościć to tylko tak, aby nie stracić z oczu naprawdę błędu podstawowego. 686 00:43:37,200 --> 00:43:39,640 Główne połączenia chór śpiewać jakiś refren, 687 00:43:39,640 --> 00:43:41,440 potem zrobiłem coś głupiego i miałem rozmowę chóru Chorus 688 00:43:41,440 --> 00:43:43,760 bo zakłada ktoś zamierza wdrożyć go może, 689 00:43:43,760 --> 00:43:47,210 a teraz to nie będzie skompilować jeszcze. Muszę zrobić co? 690 00:43:47,210 --> 00:43:49,970 Potrzebuję prototypu, pamiętam. 691 00:43:49,970 --> 00:43:56,110 Więc muszę mieć tu refren void (int i); 692 00:43:56,110 --> 00:43:59,210 Więc teraz, jeśli pójdę na dół - faktycznie, użyjmy większe okno. 693 00:43:59,210 --> 00:44:01,980 Idziemy do przodu i zrobić refren. 694 00:44:01,980 --> 00:44:06,490 Idziemy do przodu i zrobić refren. 695 00:44:06,490 --> 00:44:08,370 Korzystanie z nielegalnego identyfikatora i. 696 00:44:08,370 --> 00:44:12,500 Och, to było głupie. Nie musimy argument. Zróbmy to. 697 00:44:12,500 --> 00:44:16,370 Szkoda, że ​​nie zaczęli w ten sposób. Byłoby o wiele łatwiej program do pisania. 698 00:44:16,370 --> 00:44:25,590 There. A teraz chodźmy do mojego okna terminala, uruchom ponownie dzyń, a tu proszę. 699 00:44:25,590 --> 00:44:28,460 To był bardzo szybki. 700 00:44:28,460 --> 00:44:31,150 Co właściwie się stało, chociaż? 701 00:44:31,150 --> 00:44:33,730 Cóż, teraz mogę dodać linię wydruku, dzięki czemu możemy zobaczyć. 702 00:44:33,730 --> 00:44:43,490 Pozwólcie mi powiedzieć, printf ("Jestem tutaj") - nie zmienne. Zostawimy go tak. 703 00:44:43,490 --> 00:44:47,480 Pozwól mi ponownie uruchomić make. Pozwól, że powtórka refrenu. 704 00:44:47,480 --> 00:44:57,380 I ... spokój. Dalej. 705 00:44:57,380 --> 00:44:59,930 Tak na marginesie, dlaczego nie rozbił się jeszcze? 706 00:44:59,930 --> 00:45:02,080 Segmentation fault się super szybko przed. 707 00:45:02,080 --> 00:45:06,570 [Niesłyszalne reakcja studentów] >> Dokładnie. Więc na to potrzeba czasu, aby wydrukować, prawda? 708 00:45:06,570 --> 00:45:08,610 To po prostu ma więcej pracy komputera części. 709 00:45:08,610 --> 00:45:10,620 I oto jest: Segmentation fault. 710 00:45:10,620 --> 00:45:12,340 >> Więc zauważyć, jak szybko uruchamiane programy. 711 00:45:12,340 --> 00:45:14,130 Jeśli nie masz nic, drukowanie super szybki. 712 00:45:14,130 --> 00:45:18,770 Ale wciąż mam ten błąd segmentacji, ponieważ to, co się dzieje? 713 00:45:18,770 --> 00:45:21,210 Jeśli myślisz o tym, jak pamięć komputera jest określone, 714 00:45:21,210 --> 00:45:28,740 to akurat jest głównym, ale tutaj niech po prostu nazywają to refren i nazwijmy ten refren. 715 00:45:28,740 --> 00:45:34,550 A teraz, jeśli mam zrobić moje estetykę rację, to jest po prostu powiedzieć refren, refren, refren, 716 00:45:34,550 --> 00:45:40,550 refren, refren, refren, refren, nauseum ogłoszenie, i ostatecznie, co się stało? 717 00:45:40,550 --> 00:45:45,630 Jeśli duże zdjęcie, dosłownie, jest to, co się dzieje, koncepcyjnie? 718 00:45:46,520 --> 00:45:48,630 Przekroczeń stosu sterty. 719 00:45:48,630 --> 00:45:51,940 Albo, co gorsza, po prostu wszystko, w tym przekroczenia segmentu tekstu, 720 00:45:51,940 --> 00:45:54,590 który jest 0s i 1s które reprezentują program. 721 00:45:54,590 --> 00:45:57,080 W skrócie, to jest po prostu super, super źle. 722 00:45:57,080 --> 00:45:58,830 Program został gwałtownie się spod kontroli. 723 00:45:58,830 --> 00:46:01,220 Używasz sposób więcej pamięci niż zamierzony 724 00:46:01,220 --> 00:46:03,960 wszystko z powodu głupiego błędu w tym przypadku, 725 00:46:03,960 --> 00:46:08,040 lub w tym przypadku odbywa się świadomie bardzo się funkcji wywoływania. 726 00:46:08,040 --> 00:46:09,500 Teraz, to nie jest źle. 727 00:46:09,500 --> 00:46:13,800 Funkcje połączeń się rzeczywiście ma wielką moc, gdy jest stosowany prawidłowo. 728 00:46:13,800 --> 00:46:15,800 Nie używałem go poprawnie tutaj. 729 00:46:15,800 --> 00:46:19,780 Więc to nie jest tak źle, ale fakt, że w zasadzie nigdy nie przestać nazywać siebie 730 00:46:19,780 --> 00:46:23,520 jest podstawową słabością tutaj tego programu. 731 00:46:23,520 --> 00:46:26,400 Więc gdzie jedziemy z tym wszystkim? Co naprawdę się dzieje? 732 00:46:26,400 --> 00:46:30,340 Kiedy wywołujemy funkcję przyrostu jak robiliśmy w tych przykładach, 733 00:46:30,340 --> 00:46:33,420 Mam wartość takich jak 1, że przechodzą w. 734 00:46:33,420 --> 00:46:37,570 Mijam w kopii numer 1, więc dodaje się dzieje. 735 00:46:37,570 --> 00:46:44,240 Chodźmy do przykładu inkrementacji, ten facet rację tutaj. 736 00:46:44,240 --> 00:46:46,870 Oto, co się rzeczywiście dzieje. 737 00:46:46,870 --> 00:46:53,400 Kiedy dzwonię do przyrostu i przekazać w x, obrazowo, co tu się dzieje to jest. 738 00:46:53,400 --> 00:46:59,520 >> Jeśli mam wartość 1 przechowywane tutaj i faktycznie wywołać przyrost, 739 00:46:59,520 --> 00:47:04,330 który nazywa się teraz chór - iPad rzuca mnie tutaj. 740 00:47:04,330 --> 00:47:09,760 Nazwijmy ten przyrost, a my nie wiemy, co to obok funkcji będzie. 741 00:47:09,760 --> 00:47:14,840 Więc co się właściwie dzieje, jest tu gdzieś w main mam kawał pamięci 742 00:47:14,840 --> 00:47:17,000 , które przechowuje numer 1. 743 00:47:17,000 --> 00:47:19,380 Kiedy dzwonię do przyrostu, używam innego fragmentu pamięci, 744 00:47:19,380 --> 00:47:21,230 ale teraz mam kopię 1. 745 00:47:21,230 --> 00:47:26,660 Kiedy zwiększyć tę wartość, staje się to 2, 746 00:47:26,660 --> 00:47:30,560 ale co się dzieje, jak tylko powróci przyrostu? 747 00:47:30,560 --> 00:47:33,630 Ta pamięć tylko zostanie przekazana z powrotem do systemu operacyjnego, 748 00:47:33,630 --> 00:47:37,450 co oznacza, że ​​wszystko, co zrobiłeś to nic przydać. 749 00:47:37,450 --> 00:47:43,120 1, który został pierwotnie zawarte w głównym jest nadal faktycznie istnieje. 750 00:47:43,120 --> 00:47:44,890 Więc gdzie jedziemy z tym? 751 00:47:44,890 --> 00:47:49,770 Okazuje się, że w pamięci masz ten back-to-back sekwencję bajtów 752 00:47:49,770 --> 00:47:53,050 które można umieścić rzeczy, i okazuje się, że mamy już coś 753 00:47:53,050 --> 00:47:55,390 który obejmuje oddanie rzeczy z powrotem do tyłu do tyłu do tyłu. 754 00:47:55,390 --> 00:47:59,860 Co to jest ciąg w oparciu o tydzień 1 tydzień 2 i teraz? 755 00:48:00,020 --> 00:48:01,980 To jest po prostu zbiorem znaków. 756 00:48:01,980 --> 00:48:04,310 Okazuje się po prostu, jak można umieścić numery w pamięci, 757 00:48:04,310 --> 00:48:06,990 podobnie można umieścić znaki w pamięci. 758 00:48:06,990 --> 00:48:10,530 A kiedy zaczniemy znaków układają się w pamięci z powrotem do tyłu do tyłu do tyłu, 759 00:48:10,530 --> 00:48:13,620 Okazuje się, że przy użyciu najprostszych rzeczy, jak na pętli lub pętli while, 760 00:48:13,620 --> 00:48:17,170 możemy iteracyjne od lewej do prawej w ciągu znaków w ciągu 761 00:48:17,170 --> 00:48:20,600 i zacznij masować je do różnych znaków łącznie - 762 00:48:20,600 --> 00:48:23,370 może się B, B może się C - 763 00:48:23,370 --> 00:48:27,780 sposób, że ostatecznie możemy angielski zdanie, że rzeczywiście ma sens 764 00:48:27,780 --> 00:48:30,310 oraz każdy z tych konwersji liter pojedynczo 765 00:48:30,310 --> 00:48:34,400 przechodząc przez naszych pamięci komputera od lewej do prawej, aby faktycznie zaszyfrować. 766 00:48:34,400 --> 00:48:35,810 Więc weźmy naszą pięciominutową przerwę, 767 00:48:35,810 --> 00:48:40,730 i kiedy wróci, zaczniemy ten proces kodowania informacji. 768 00:48:42,020 --> 00:48:43,520 >> Dobrze. 769 00:48:43,520 --> 00:48:48,070 Zanim zagłębimy się w pewnym kryptografii i te rzeczy nazywane tablicami, 770 00:48:48,070 --> 00:48:51,470 pozwól mi zatrzymać się na wszelkie pytania, bo czuję, że naprawdę rodzaj pomieszania 771 00:48:51,470 --> 00:48:54,080 niektóre z tych tematów. Więc naprawić teraz, jeśli można. 772 00:48:54,080 --> 00:48:58,700 Właśnie rozmawialiśmy o wartości zwracanych, rozmawialiśmy o argumentach, 773 00:48:58,700 --> 00:49:03,250 i rozmawialiśmy o tym pojęciu, które wrócimy w najbliższych tygodniach, 774 00:49:03,250 --> 00:49:08,720 przeglądania pamięci, jak całą masę tych ułożonych tacach, by tak rzec, 775 00:49:08,720 --> 00:49:12,660 z dołu na górę, tak, że każdy podajnik pobiera umieścić na stosie 776 00:49:12,660 --> 00:49:16,530 oznacza funkcję, która jest obecnie nazywa. 777 00:49:17,900 --> 00:49:20,260 Masz pytanie? 778 00:49:20,260 --> 00:49:22,640 Pozwól mi zadać pytanie tutaj. 779 00:49:22,640 --> 00:49:27,890 Pozwól uprościć ten z powrotem do tego co było wcześniej niektóre z naszych wcześniejszych Q & A. 780 00:49:27,890 --> 00:49:35,570 Fakt, że przyrost ma otwarty nawias, int numer, zamknięty nawias - 781 00:49:35,570 --> 00:49:39,110 co to int liczba reprezentuje? 782 00:49:39,110 --> 00:49:42,790 [Uczeń] argument. >> Argument. Okay. Ale co jest argument? 783 00:49:42,790 --> 00:49:46,370 [Niesłyszalne reakcja studentów] >> Co to jest? >> [Uczeń] Coś, co możesz przekazać w. 784 00:49:46,370 --> 00:49:49,940 Ok, więc coś, co możesz przekazać w. I bardziej ogólnie, to tylko wejście. 785 00:49:49,940 --> 00:49:52,450 Jeśli chcesz napisać funkcję i że funkcja jest cel w życiu 786 00:49:52,450 --> 00:49:55,770 jest robić coś innego za każdym razem, kiedy go używać, 787 00:49:55,770 --> 00:50:00,110 to jedynym sposobem aby tak się stało naprawdę wydaje się do dostarczenia jej wejścia 788 00:50:00,110 --> 00:50:03,510 tak, że można zrobić coś innego z tego wejścia za każdym razem. 789 00:50:03,510 --> 00:50:06,650 >> Więc trzeba określić dwie rzeczy, gdy funkcja przyjmuje wejście. 790 00:50:06,650 --> 00:50:09,590 Musisz określić nazwę, którą chcesz nadać tym wejściem 791 00:50:09,590 --> 00:50:12,700 wyłącznie dla własnej wygody, aby można było się do niego 792 00:50:12,700 --> 00:50:16,540 w funkcji, że sam piszesz, jak ja tutaj, w linii 32. 793 00:50:16,540 --> 00:50:20,800 Ale trzeba także określić jego typ, ponieważ C jest językiem programowania 794 00:50:20,800 --> 00:50:25,940 że po prostu wymaga, że ​​jeśli chcesz zmienną, musisz powiedzieć komputerowi, co typ danych to jest, 795 00:50:25,940 --> 00:50:30,200 w dużej mierze dlatego, że wie, ile bitów przydzielić dla tej zmiennej 796 00:50:30,200 --> 00:50:33,020 bo to może być 6 - przepraszam, że nie będzie 6. 797 00:50:33,020 --> 00:50:37,080 16 może być, może być 8, 32 może być nawet 64, 798 00:50:37,080 --> 00:50:39,130 ale komputer musi wiedzieć. 799 00:50:39,130 --> 00:50:43,180 Teraz, int na lewej stronie, co oznacza, przeciwnie? 800 00:50:46,350 --> 00:50:48,850 [Niesłyszalne reakcja studentów] >> Co to jest? >> [Uczeń] Rodzaj funkcji. 801 00:50:48,850 --> 00:50:53,610 Rodzaj funkcji, a w szczególności, rodzaj jego wyjścia. Racja. 802 00:50:53,610 --> 00:50:57,380 Tak więc, podczas gdy w rzeczy nawiasach reprezentuje wejście jego ewentualne 803 00:50:57,380 --> 00:50:59,660 rzeczą, aby po lewej stronie przedstawia dane wyjściowe. 804 00:50:59,660 --> 00:51:03,530 I w tym przypadku, przyrost podobno zwraca int, 805 00:51:03,530 --> 00:51:07,690 i tak jest typu int powrót tej funkcji. 806 00:51:07,690 --> 00:51:09,340 Co to znaczy wrócić? 807 00:51:09,340 --> 00:51:15,090 Dosłownie, użyć słowa kluczowego, a następnie powrót jeśli to, co wracają 808 00:51:15,090 --> 00:51:18,600 z prawej słowa kluczowego jest liczbą całkowitą, 809 00:51:18,600 --> 00:51:21,660 wtedy to jest rzeczywiście zgodny z tym, co obiecał. 810 00:51:21,660 --> 00:51:26,410 Nie można było zrobić coś takiego - Witaj, świecie - bo to jest ciąg. 811 00:51:26,410 --> 00:51:28,860 >> Oczywiście, nie jest całkowita. 812 00:51:28,860 --> 00:51:33,140 Tak w skrócie, ciężar jest naprawdę na nas, programista, za szczególne 813 00:51:33,140 --> 00:51:37,770 do tego, co mamy do powrotu i wtedy faktycznie go o jego zwrot. 814 00:51:37,770 --> 00:51:43,440 Kontekst tu teraz jest, że pamięć komputera jest gigabyte, 2 GB - 815 00:51:43,440 --> 00:51:45,920 cokolwiek - być może więcej, może to jest mniej, 816 00:51:45,920 --> 00:51:49,050 ale komputer widzi ją jako posiadające różne sekcje. 817 00:51:49,050 --> 00:51:51,200 Coś się tam, coś innego idzie się tam, 818 00:51:51,200 --> 00:51:54,290 różne rzeczy idzie w środku, a dziś po prostu opowiadać tę historię, 819 00:51:54,290 --> 00:51:56,340 ale wrócimy do tego w czasie. 820 00:51:56,340 --> 00:51:59,980 Na razie tylko kawałek pamięci naprawdę dbają o to fragment tekstu 821 00:51:59,980 --> 00:52:03,360 dlatego, że po prostu reprezentuje 0s i 1s, że brzęk jest przesyłany. 822 00:52:03,360 --> 00:52:06,050 Więc kiedy uruchomić polecenie na klawiaturze jak a.out 823 00:52:06,050 --> 00:52:09,110 lub kliknij dwukrotnie ikonę na Mac OS lub Windows, 824 00:52:09,110 --> 00:52:11,880 Twój program jest ładowany z dysku twardego do pamięci RAM 825 00:52:11,880 --> 00:52:16,330 i to koleś na górze komputera RAM, że tak powiem. 826 00:52:16,330 --> 00:52:20,450 Tymczasem, jak program zostanie uruchomiony i głównym jest wywoływana 827 00:52:20,450 --> 00:52:23,640 w programie napisał lub program Microsoft lub Apple napisał 828 00:52:23,640 --> 00:52:27,860 wszystkich swoich zmiennych lokalnych kończy się tam na dnie pamięci komputera. 829 00:52:27,860 --> 00:52:33,230 Ale jeśli główne połączenia inna funkcja, która sama ma zmiennych lub argumentów, kończą się nad nim. 830 00:52:33,230 --> 00:52:36,680 A jeśli ta funkcja wywołuje coś, kończy się nad nim, nad nim, nad nim. 831 00:52:36,680 --> 00:52:41,460 >> I tylko raz funkcja jest wykonywana wykonującego stos tac, by tak rzec, 832 00:52:41,460 --> 00:52:43,240 zaczynają się niżej i niżej. 833 00:52:43,240 --> 00:52:48,250 I to właśnie wtedy, w skrócie, wyjaśnia, dlaczego podczas rozmowy kostkę 834 00:52:48,250 --> 00:52:51,550 lub zadzwonić przyrost, jesteś przekazując kopię wartości. 835 00:52:51,550 --> 00:52:55,520 I co to oznacza obrazowo jest, że jesteś dosłownie piśmie numer 1 836 00:52:55,520 --> 00:53:00,460 w drugiej części pamięci, które zmienia się od 1 do 2 przypadku przyrostu 837 00:53:00,460 --> 00:53:04,820 lub do 8, w przypadku, a następnie moduł pamięci od tego rzucania 838 00:53:04,820 --> 00:53:09,140 jak tylko zwiększać lub funkcja powraca sześciennych. Pytanie. 839 00:53:09,140 --> 00:53:12,900 [Uczeń] Gdzie są zmienne globalne przechowywane? 840 00:53:12,900 --> 00:53:18,100 Zmienne globalne są przechowywane, co obecnie nazywa się na założone dane lub niezainicjowanych danych, 841 00:53:18,100 --> 00:53:21,920 różnica jest, jeśli masz zmienną globalną i przypisać go natychmiast wartość 842 00:53:21,920 --> 00:53:24,640 ze znaku równości, to kończy się na górze tam, 843 00:53:24,640 --> 00:53:29,200 i jeśli tylko powiedzieć, int x; bez wartości, kończy się nieco niższy w pamięci RAM 844 00:53:29,200 --> 00:53:31,710 po prostu przez konwencję. 845 00:53:31,710 --> 00:53:34,940 Inne pytania? Dobrze. 846 00:53:34,940 --> 00:53:37,340 Więc ten obraz będzie wracać, ponieważ mamy mocniejszy 847 00:53:37,340 --> 00:53:39,170 z tym, co możemy zrobić z komputerem, 848 00:53:39,170 --> 00:53:42,720 ale teraz, zróbmy krótkie intro do kryptografii 849 00:53:42,720 --> 00:53:46,080 specyficzny rodzaj kryptografii, że nie rozwiąże wszystkich problemów świata 850 00:53:46,080 --> 00:53:47,720 , ale nie rozwiązuje niektóre z nich. 851 00:53:47,720 --> 00:53:51,700 W tej sprawie, mamy coś, co nazywa secret-kryptografii. 852 00:53:51,700 --> 00:53:56,410 Secret-klucz kryptograficzny, jak sama nazwa wskazuje, pochodzi z jego bezpieczeństwo tajemnicy. 853 00:53:56,410 --> 00:54:00,690 >> Na przykład, jeśli jesteś z powrotem w szkole i mijały trochę list miłosny sekret 854 00:54:00,690 --> 00:54:04,850 dla chłopca lub dziewczynki pan kruszenia się, jeśli chcesz przekazać tę notatkę przez publiczność, 855 00:54:04,850 --> 00:54:08,380 prawdopodobnie nie napisałby takiej noty w języku angielskim lub cokolwiek jest językiem ojczystym. 856 00:54:08,380 --> 00:54:13,340 Przeciwnie, można zaszyfrować lub może po prostu wysłać im wiadomość tekstową tych dni. 857 00:54:13,340 --> 00:54:15,460 Ale może rzeczywiście przekazać im uwagę w całej klasie. 858 00:54:15,460 --> 00:54:18,700 I zrobić to bezpiecznie w taki sposób, że Twoi przyjaciele i nauczycieli 859 00:54:18,700 --> 00:54:22,650 nie wiesz co piszesz, możesz wymyślić algorytm dość prosty, 860 00:54:22,650 --> 00:54:25,920 młody, choć może być, po prostu wspiąć słowa. 861 00:54:25,920 --> 00:54:28,130 Więc zamiast pisać można napisać b, 862 00:54:28,130 --> 00:54:30,220 zamiast b można napisać c, 863 00:54:30,220 --> 00:54:32,140 zamiast C można napisać D, i tak dalej. 864 00:54:32,140 --> 00:54:34,360 Albo można wymyślić bardziej wyrafinowane tłumaczenia 865 00:54:34,360 --> 00:54:36,720 listów do różnych pism. 866 00:54:36,720 --> 00:54:39,740 Ale połów jest chłopcem czy dziewczynką, do którego wysyłasz tę notatkę 867 00:54:39,740 --> 00:54:45,020 musi wiedzieć coś, co jest co, oczywiście? >> [Uczeń] Co wysyłasz. 868 00:54:45,020 --> 00:54:49,720 Co twój sekret jest, jak co to jest mapowanie między A i B i C jest i D's. 869 00:54:49,720 --> 00:54:54,650 Czy jest to po prostu dodanie 1 do każdej z liter, aby przejść od A do B, B do C? 870 00:54:54,650 --> 00:54:56,670 Czy jest to bardziej skomplikowane niż to? 871 00:54:56,670 --> 00:55:01,540 >> Więc ty i twój zmiażdżyć trzeba mieć tę tajnych informacji, 872 00:55:01,540 --> 00:55:03,190 ale jest rodzajem Catch-22 tutaj. 873 00:55:03,190 --> 00:55:06,830 Jeśli jest to pierwszy raz masz ten list miłosny za pomocą klasy, 874 00:55:06,830 --> 00:55:10,720 jak to jest, że chłopak lub dziewczyna będzie wiedzieć, co jeszcze jest tajne? 875 00:55:10,720 --> 00:55:13,930 Tak tajny klucz szyfrujący nie rozwiąże wszystkich problemów świata, 876 00:55:13,930 --> 00:55:16,320 i tam rzeczywiście związek tutaj, że wrócimy do kierunku semestru końca. 877 00:55:16,320 --> 00:55:25,110 Podobnie nie większość z nas wie, że ktoś pracuje, na przykład, na Amazon.com, 878 00:55:25,110 --> 00:55:28,190 a przecież wielu z nas prawdopodobnie kupił rzeczy w Amazon.com, 879 00:55:28,190 --> 00:55:31,990 i nauczono zakładać, że te e-commerce transakcje są bezpieczne. 880 00:55:31,990 --> 00:55:36,470 URL prawdopodobnie mówi https, jest być może trochę głupie ikona kłódki gdzieś, 881 00:55:36,470 --> 00:55:39,930 istnieje jakiś rodzaj kryptografii zabezpieczania informacji o karcie kredytowej 882 00:55:39,930 --> 00:55:42,160 między tobą i Amazon.com. 883 00:55:42,160 --> 00:55:45,430 I jeszcze, czy kryptografii wymaga znajomości jakąś tajemnicę 884 00:55:45,430 --> 00:55:48,620 i jeszcze nie znam nikogo w Amazon, a ja na pewno nie ułożone jakiejkolwiek tajemnicy 885 00:55:48,620 --> 00:55:52,710 z kimś z Amazonii, to jak komputer lub moja przeglądarka to robi? 886 00:55:52,710 --> 00:55:55,720 Okazuje się, że to inne rodzaje kryptografii w ogóle, że rozwiązania tego problemu. 887 00:55:55,720 --> 00:55:57,670 Ale na dziś skupimy się na prostym jeden 888 00:55:57,670 --> 00:56:00,290 gdzie można zorganizować z góry wiedzieć, jakąś tajemnicę 889 00:56:00,290 --> 00:56:03,760 jak 1 lub jakiegoś mapowania między tych i b-tych. 890 00:56:03,760 --> 00:56:05,840 A proces ten obejmuje zwykle kryptografii. 891 00:56:05,840 --> 00:56:08,620 Masz jakiś zwykły tekst, przedstawiony tu w lewo, 892 00:56:08,620 --> 00:56:12,930 go uruchomić przez jakiś algorytm lub procedury do szyfrowania to - 893 00:56:12,930 --> 00:56:15,100 Może to po prostu staje się b, b staje się c - 894 00:56:15,100 --> 00:56:17,490 i skończyć z szyfrogramu. 895 00:56:17,490 --> 00:56:20,380 Tymczasem, po zapłaceniu zgniatać otrzymuje tę tajną notatkę, 896 00:56:20,380 --> 00:56:24,200 on lub ona musi następnie odszyfrować ogólnie odwrócenie tego algorytmu 897 00:56:24,200 --> 00:56:27,190 tak, aby uzyskać z powrotem na zwykły tekst. 898 00:56:27,190 --> 00:56:28,960 Istnieją fizyczne inkarnacje to. 899 00:56:28,960 --> 00:56:31,680 >> Na przykład, to jest trochę pierścień dekoder tajne, 900 00:56:31,680 --> 00:56:35,110 i jest to pierścień w tym sensie, że są dwie tarcze tutaj. 901 00:56:35,110 --> 00:56:38,490 Na zewnętrznym obwodzie tej rzeczy, nie litery A do Z, 902 00:56:38,490 --> 00:56:40,340 chociaż są one w kolejności losowej, 903 00:56:40,340 --> 00:56:42,880 i od wewnątrz, jest rzeczywiście niektóre numery 904 00:56:42,880 --> 00:56:46,620 takie, że z tego pierścienia można rodzaj kolei na zewnątrz, ale nie wewnątrz 905 00:56:46,620 --> 00:56:49,140 aby wyrównać numery z literami. 906 00:56:49,140 --> 00:56:53,020 Z filmu o nazwie Christmas Story, zobaczysz, że niewiele Ralphie 907 00:56:53,020 --> 00:56:58,000 był tak chętny do dowiedzieć się, co tajne przesłanie Małego Orphan Annie była dla niego 908 00:56:58,000 --> 00:57:02,570 które zostały przekazane, to że, w postaci komunikatów numerycznych na polu zbóż 909 00:57:02,570 --> 00:57:07,220 i trzeba było zgromadzić wszystkie małe karty dołączone w polu zbóż, 910 00:57:07,220 --> 00:57:09,770 trzeba było wysłać je, trzeba było wrócić do tajnego pierścienia dekodującego 911 00:57:09,770 --> 00:57:13,910 tak, że można w końcu dowiedzieć się, co jest między mapping liter i cyfr 912 00:57:13,910 --> 00:57:15,550 lub litery i litery. 913 00:57:15,550 --> 00:57:19,520 Jak w komputerze możemy przejść o implementowaniu lub reprezentujący takie rzeczy? 914 00:57:19,520 --> 00:57:22,560 Musimy znaleźć sposób wyrażania siebie trochę bardziej elastycznie 915 00:57:22,560 --> 00:57:25,080 niż nasze zmienne dotąd pozwoliły. 916 00:57:25,080 --> 00:57:29,000 Mieliśmy wskazówki, mieliśmy znaki, mieliśmy pływaków i dwuosobowymi i kilka innych, 917 00:57:29,000 --> 00:57:34,200 ale to są pojedyncze dzieła z pamięci, że tak naprawdę nie pozwalają nam wyrazić rzeczy 918 00:57:34,200 --> 00:57:36,440 jak słów i zdań i zwrotów. 919 00:57:36,440 --> 00:57:38,630 Rzeczywiście, mamy takie rzeczy nazywa się ciągi 920 00:57:38,630 --> 00:57:42,660 ale obiecuję, że jest to tak naprawdę tylko uproszczenie w CS50 bibliotece 921 00:57:42,660 --> 00:57:45,540 że mamy zamiar obrać z powrotem. 922 00:57:45,540 --> 00:57:47,500 A więc zacznijmy to zrobić tutaj. 923 00:57:47,500 --> 00:57:49,840 Pozwólcie mi iść do przodu i otworzyć plik - 924 00:57:49,840 --> 00:57:54,100 wszystkie pliki są dostępne, jak zwykle, online - tzw array.c 925 00:57:54,100 --> 00:57:58,960 rozwiązać problem niezwiązany strun ale maluje obraz tutaj 926 00:57:58,960 --> 00:58:01,520 jak możemy użyć czegoś o nazwie tablica. 927 00:58:01,520 --> 00:58:04,050 >> Tablica jest typu. 928 00:58:04,050 --> 00:58:10,730 To jest typ zmiennej z wszelkiego rodzaju, które ma wiele mniejszych typów danych wewnątrz niej 929 00:58:10,730 --> 00:58:12,680 z powrotem do tyłu do tyłu do tyłu. 930 00:58:12,680 --> 00:58:16,980 Tak na przykład, jeśli chcemy napisać mały program, który daje swoją średnią quizu 931 00:58:16,980 --> 00:58:19,780 na kurs, jak 50, który ma 2 quizy, 932 00:58:19,780 --> 00:58:23,450 można bardzo łatwo napisać program oparty nawet na niektóre z zeszłotygodniowego materiału 933 00:58:23,450 --> 00:58:28,830 używając getInt i kilka zmiennych: int quiz1, int quiz2. 934 00:58:28,830 --> 00:58:30,550 I jest to całkiem proste. 935 00:58:30,550 --> 00:58:33,500 To jest być może 10, 20 linii kodu max do wykonania programu 936 00:58:33,500 --> 00:58:38,940 który prosi użytkownika o 2 wyników quizu, a następnie oblicza ich średnią 937 00:58:38,940 --> 00:58:42,020 przez dodanie ich do siebie, podzielenie przez 2, a następnie drukowanie wyników. 938 00:58:42,020 --> 00:58:46,400 Moglibyśmy prawdopodobnie zrobić dość łatwo teraz po pewnej liczbie minut. 939 00:58:46,400 --> 00:58:49,450 Ale problemem jest to, że załóżmy, że 50 miał 3 lub 4 quizy. 940 00:58:49,450 --> 00:58:52,830 Załóżmy, że chcesz użyć tego samego programu dla klasy, która miała tygodniowy quizy. 941 00:58:52,830 --> 00:58:55,100 Pomyśl o klasie, która co tydzień quizy. 942 00:58:55,100 --> 00:58:58,840 Jeśli jest 16 lub tak tygodni w semestrze, teraz masz 16 zmiennych: 943 00:58:58,840 --> 00:59:03,030 int quiz1, int quiz2, int quiz3, int quiz4. 944 00:59:03,030 --> 00:59:06,870 Jak tylko zaczniesz widzieć tę nadmiarowość, to kopiowanie i wklejanie kodu, 945 00:59:06,870 --> 00:59:09,810 powinna rozpocząć się chcesz było lepszy sposób. 946 00:59:09,810 --> 00:59:13,610 I na szczęście, bo tablic nie ma. Więc zróbmy to. 947 00:59:13,610 --> 00:59:16,700 Po pierwsze, pozwól mi przedstawić bardzo prostą rzecz, że nie już używana do tej pory, 948 00:59:16,700 --> 00:59:18,820 ale zobaczysz go okazjonalnie w kodzie. 949 00:59:18,820 --> 00:59:21,270 >> To jest to, co zwykle nazywa się stała. 950 00:59:21,270 --> 00:59:24,410 Więc to jest stała w tym sensie, że wartość ta nie zmienia. 951 00:59:24,410 --> 00:59:26,450 Konwencja człowieka przy tworzeniu stałej 952 00:59:26,450 --> 00:59:30,420 jest użycie wszystkich liter po prostu tak, że naprawdę wyróżnia się w kodzie, 953 00:59:30,420 --> 00:59:34,270 i specjalne słowo, że używasz w C # jest zdefiniować. 954 00:59:34,270 --> 00:59:39,970 Tak więc możemy powiedzieć, # define, a następnie spację, a następnie wyraz, który chcesz użyć nazwy stałej 955 00:59:39,970 --> 00:59:41,730 i wartość stałej. 956 00:59:41,730 --> 00:59:44,710 Wskazówka ta różni się od przypisywania coś do zmiennej. 957 00:59:44,710 --> 00:59:46,430 Nie ma znaku równości, nie ma średnika. 958 00:59:46,430 --> 00:59:49,140 To, co się powszechnie znana jako dyrektywa preprocesora, 959 00:59:49,140 --> 00:59:50,840 ale o tym innym razem. 960 00:59:50,840 --> 00:59:56,350 Na razie, to tworzy niezmienną wartość o nazwie QUIZZES 961 00:59:56,350 --> 00:59:58,290 których rzeczywista wartość numeryczna jest 2. 962 00:59:58,290 --> 01:00:02,180 Więc wszędzie widzisz quizy, konkursy, quizy, w całym tym pliku, 963 01:00:02,180 --> 01:00:04,230 To tylko numer 2. 964 01:00:04,230 --> 01:00:06,550 Gdy patrzę na głównym teraz zobaczmy, jak to działa. 965 01:00:06,550 --> 01:00:09,770 Pierwszy wygląda dość tajemniczy, ale to wszystko rzeczy z tygodnia 1. 966 01:00:09,770 --> 01:00:12,210 Zapytaj użytkownika o klasach. W jaki sposób możemy to zrobić? 967 01:00:12,210 --> 01:00:17,350 W linii 22 - to jest naprawdę soczyste część - Oświadczam pływaka 968 01:00:17,350 --> 01:00:23,240 ale nie tylko pojedyncze float. Jestem deklarując raczej tablicę wartości zmiennoprzecinkowych. 969 01:00:23,240 --> 01:00:27,700 Że zmienna będzie się nazywać gatunki, jak sugeruje tutaj, 970 01:00:27,700 --> 01:00:31,420 ale tylko kawałek nowej składni, a następnie są te nawiasy kwadratowe. 971 01:00:31,420 --> 01:00:37,280 Fakt, że mówiłem klasy pływak i otwórz uchwyt i następnie numer - 972 01:00:37,280 --> 01:00:40,980 wypowiedzenia, jeżeli jest to stała ta jest tak jak zrobiliśmy to - 973 01:00:40,980 --> 01:00:46,840 oznacza to, "Hey komputer, daj mi 2 pływaków i niech wspólnie nazywać ich gatunki." 974 01:00:46,840 --> 01:00:51,780 >> Jest to w przeciwieństwie do bardziej żmudne tak: pływak grade1; 975 01:00:51,780 --> 01:00:54,580 unosić grade2, i tak dalej. 976 01:00:54,580 --> 01:00:58,310 Więc tablica pozwala nam na realizację tego pomysłu, ale znacznie mniej messily, 977 01:00:58,310 --> 01:01:04,560 w taki sposób, że może się zapisu 1 linia zamiast, na przykład, 16 do 16 tygodni semestru. 978 01:01:04,560 --> 01:01:09,060 Nie chciałem, aby trudno kodu 2, bo jeśli myślisz o tym teraz logicznie, 979 01:01:09,060 --> 01:01:12,560 Przypuszczam następny rok CS50 zmiany 3 quizy zamiast 980 01:01:12,560 --> 01:01:15,010 i miałem numer 2 tutaj, miałem numer 2 tutaj 981 01:01:15,010 --> 01:01:17,210 Miałem numer 2 tutaj, numer 2 tutaj. 982 01:01:17,210 --> 01:01:19,890 To staje się bardzo uciążliwe i bardzo łatwo zepsuć 983 01:01:19,890 --> 01:01:26,550 i przypadkowo zmienić 1 wartość 3 i przegapić jakieś inne wartości 2. 984 01:01:26,550 --> 01:01:30,660 Więc mam zamiar zamiast streszczenie to się i korzystać z tego, że stała, 985 01:01:30,660 --> 01:01:32,520 Jak sama nazwa wskazuje, nigdy nie zmienia. 986 01:01:32,520 --> 01:01:35,870 A teraz nie ma znaczenia czy mamy różne testy w tym roku lub następnym, 987 01:01:35,870 --> 01:01:39,380 Muszę tylko zmienić go w jednym miejscu, tu na górze. 988 01:01:39,380 --> 01:01:41,230 Więc to wszystko jest stała. 989 01:01:41,230 --> 01:01:47,100 Tymczasem nowe pojęciowy cechą jest to, że z układu. 990 01:01:47,100 --> 01:01:55,030 Więc nawiasy kwadratowe mi to wiele pływaków i pozwala mi zbiorczo nazywamy je gatunki tutaj. 991 01:01:55,030 --> 01:01:56,720 Więc teraz zobaczmy, co mam zamiar zrobić. 992 01:01:56,720 --> 01:01:59,220 Tu, w linii 24 jest początkiem pętli for. 993 01:01:59,220 --> 01:02:03,380 >> To naprawdę nic szczególnego. To jest po prostu za pomocą QUIZZES zamiast liczby zakodowane. 994 01:02:03,380 --> 01:02:06,740 Ale nie ma nic intelektualnie inaczej tam od zeszłego tygodnia. 995 01:02:06,740 --> 01:02:11,650 To tylko printf, więc printf ("Quiz #% d% d:") 996 01:02:11,650 --> 01:02:16,670 bo ja po prostu chcę, aby wydrukować dać mi quizu numer 1 2 a następnie 2 z 2. 997 01:02:16,670 --> 01:02:18,480 Więc to jest czysto estetyczną rzeczą. 998 01:02:18,480 --> 01:02:21,000 Ale interesujący jest teraz w wierszu 27. 999 01:02:21,000 --> 01:02:27,840 W celu wypełnienia w jednej z dwóch zastępcze o wartości zmiennoprzecinkową 1000 01:02:27,840 --> 01:02:29,640 ponownie użyć nawiasów kwadratowych. 1001 01:02:29,640 --> 01:02:35,170 W tym przypadku, używam i. bo to dla pętli rozpoczął się i równa, co wartość, najwyraźniej? 1002 01:02:35,170 --> 01:02:36,670 [Uczeń] 0. >> [Malan] 0. 1003 01:02:36,670 --> 01:02:40,990 Więc w pierwszej iteracji tej pętli, to jest tak, jakbym napisał to w kodzie, 1004 01:02:40,990 --> 01:02:46,310 ale na drugiej iteracji tej pętli, to jest tak, jakbym napisał to w moim kodu. 1005 01:02:46,310 --> 01:02:49,970 Ale fakt, że używam zmienną jest idealny, ponieważ, jak sama nazwa wskazuje, 1006 01:02:49,970 --> 01:02:52,600 to zmieniając jej wartość na każdej iteracji, 1007 01:02:52,600 --> 01:02:55,900 więc jestem wypełnienie tej tablicy jedno miejsce w czasie. 1008 01:02:55,900 --> 01:02:57,380 Co oznacza ta tablica wygląda? 1009 01:02:57,380 --> 01:03:01,570 Powodem zwróciłem super proste prostokąt na ekranie tutaj wcześniej był z tego powodu. 1010 01:03:01,570 --> 01:03:05,590 Tablica jest tylko fragment pamięci następuje kolejny kawałek pamięci 1011 01:03:05,590 --> 01:03:08,570 następnie inną ilość pamięci itd.. 1012 01:03:08,570 --> 01:03:13,120 Więc jeśli moja tablica ma rozmiar 2 w tym przypadku tutaj, wszystko będę robić 1013 01:03:13,120 --> 01:03:20,200 wpisując w moich wyników quizu jak tutaj - mam 100 na ten jeden, a potem mam 99 na ten jeden - 1014 01:03:20,200 --> 01:03:24,970 wtedy ta pamięć może nawet nie być stosowane, ponieważ mam tylko pytanie z komputera 1015 01:03:24,970 --> 01:03:26,840 dla tablicy o rozmiarze 2. 1016 01:03:26,840 --> 01:03:28,600 Te place wciąż tam są, prawda? 1017 01:03:28,600 --> 01:03:32,670 Masz jeszcze 2 GB pamięci RAM, nawet jeśli jesteś tylko z prośbą o 2 pływaków. 1018 01:03:32,670 --> 01:03:36,840 Więc idea tablic jest to, że komputer po prostu ma kawałek pamięci 1019 01:03:36,840 --> 01:03:41,340 a następnie rozdziela mniejsze kawałki z powrotem do tyłu do tyłu do tyłu. 1020 01:03:41,340 --> 01:03:43,310 A więc to wszystko, tablica jest. 1021 01:03:43,310 --> 01:03:47,350 >> To ciągły fragment pamięci wewnątrz których można umieścić rzeczy. 1022 01:03:47,350 --> 01:03:50,700 Dzieje się tak, aby potem zrobić tylko trochę nudne arytmetyki. 1023 01:03:50,700 --> 01:03:54,640 Gdybym przewiń tutaj, to jest tam gdzie następnie iteracyjne nad tablicy. 1024 01:03:54,640 --> 01:03:58,020 I pochodzą z sumowania wszystkich wartości w tablicy, 1025 01:03:58,020 --> 01:04:02,470 a następnie użyć funkcja ROUND tu faktycznie suma podzielona przez quizy. 1026 01:04:02,470 --> 01:04:06,320 Ale pozwól mi machać ręką na to jako rodzaj dość arytmetyki do teraz. 1027 01:04:06,320 --> 01:04:08,370 Ale wszystko, co robi dla mnie ostatecznie jest obliczenie średnią. 1028 01:04:08,370 --> 01:04:13,580 Więc najpierw quizu oraz sekund quizu podzielona przez 2, a następnie wydrukować go jako int. 1029 01:04:13,580 --> 01:04:17,280 Ale niech teraz przejście do innego przykładu nazwie string1, 1030 01:04:17,280 --> 01:04:20,700 który maluje podobny obraz, ale ciągi używane. 1031 01:04:20,700 --> 01:04:23,940 Pozwól mi iść dalej i uprościć ten na chwilę. 1032 01:04:23,940 --> 01:04:27,090 Wybacz wcięcie teraz. 1033 01:04:27,090 --> 01:04:30,870 Wskazówka w linii 19 w tym przykładzie, mam ciąg od użytkownika. 1034 01:04:30,870 --> 01:04:34,640 Zauważmy jednak, co mam robić w następnej linii 22 dalej. 1035 01:04:34,640 --> 01:04:41,250 Jestem rzeczywiście Iterowanie od i do - i to jest nowy trick - strlen, długość łańcucha. 1036 01:04:41,250 --> 01:04:44,880 Jest to funkcja, która pochodzi z C, że jeśli przekazana ciąg, 1037 01:04:44,880 --> 01:04:47,730 mówi, jak wiele znaków w tym ciągu. To wszystko. 1038 01:04:47,730 --> 01:04:51,550 A fakt, że jest to strlen zamiast długości łańcucha to tylko dlatego, że jest bardziej zwięzłe. 1039 01:04:51,550 --> 01:04:55,100 Trzydzieści lat temu, ludzie lubią pisać rzeczy tak zwięźle, jak to możliwe, 1040 01:04:55,100 --> 01:04:57,630 więc trzymam tę konwencję tutaj. 1041 01:04:57,630 --> 01:05:00,660 i + + po prostu oznacza, inkrementacja i w każdej iteracji. 1042 01:05:00,660 --> 01:05:02,990 A teraz to zauważyć, co jest naprawdę interesujące. 1043 01:05:02,990 --> 01:05:09,180 W linii 24, mówię, "Komputer, daj mi znak, 8 bitów, i nazywają to c". 1044 01:05:09,180 --> 01:05:12,630 Ale co to jest to na prawej stronie mówi? 1045 01:05:13,490 --> 01:05:16,530 W języku angielskim, co to przedstawia? 1046 01:05:16,530 --> 01:05:18,730 [Uczeń] Pierwszy znak w tablicy. 1047 01:05:18,730 --> 01:05:20,790 Dokładnie. Daj mi pierwszy znak w tablicy. 1048 01:05:20,790 --> 01:05:24,090 Lub, bardziej ogólnie, daj mi znak Ith w tablicy. 1049 01:05:24,090 --> 01:05:26,100 I uświadomić sobie, że to ważne teraz, jak informatycy, 1050 01:05:26,100 --> 01:05:27,890 Jesteśmy rzeczywiście licząc od 0. 1051 01:05:27,890 --> 01:05:29,720 >> Nie masz swobodę teraz zacząć robić. 1052 01:05:29,720 --> 01:05:34,160 Teraz masz się zachowywać zgodnie z oczekiwaniami i komputera liczyć od 0 1053 01:05:34,160 --> 01:05:38,180 ponieważ [0] będzie pierwszy znak w ciągu, 1054 01:05:38,180 --> 01:05:42,150 [1] będzie drugi, [2] będzie trzecie i tak dalej. 1055 01:05:42,150 --> 01:05:49,720 Więc ten program, jeśli go skompilować, to znowu string1, więc upewnij string1, 1056 01:05:49,720 --> 01:05:54,670 i teraz mam uruchomić string1 w moim oknie terminala. 1057 01:05:54,670 --> 01:05:58,330 To oczekiwanie na wejście, więc mam zamiar pisać w Dawida, Enter 1058 01:05:58,330 --> 01:06:02,540 a teraz drukuje Dawidowi wszystko na różnych liniach, ponieważ zawiadomienie to, co robię. 1059 01:06:02,540 --> 01:06:05,820 Jestem drukowania jeden znak na raz. 1060 01:06:05,820 --> 01:06:10,100 Nie będziemy wchodzić w szczegóły już dziś na ten temat, ale usunięte przed chwilą tego sprawdzenia tutaj. 1061 01:06:10,100 --> 01:06:15,480 Okazuje się, że jeśli użytkownik zachowuje się niegrzecznie, kontradyktoryjności, lub po prostu mylić, 1062 01:06:15,480 --> 01:06:20,210 rzeczywiście można nie dać ciąg jakiejś długości. 1063 01:06:20,210 --> 01:06:22,860 Jeśli trafisz na niewłaściwy klawisz na klawiaturze, może nie dają znaków w ogóle, 1064 01:06:22,860 --> 01:06:26,950 lub jeśli jesteś złośliwy, możesz spróbować wkleić w gigabajt w wartym eseju 1065 01:06:26,950 --> 01:06:29,290 wypełnić ten ciąg, a jeśli komputer działa z pamięci, 1066 01:06:29,290 --> 01:06:32,710 okazuje się, że mamy zamiar wrócić tę szczególną wartość o nazwie NULL. 1067 01:06:32,710 --> 01:06:35,580 Więc teraz, po prostu wiem, że istnieje wartość ta nazywana NULL 1068 01:06:35,580 --> 01:06:39,580 który pozwoli nam sprawdzić, kiedy jesteśmy z pamięci, między innymi. 1069 01:06:39,580 --> 01:06:45,630 Ale jeśli mogę otworzyć teraz ciąg2, zauważają różnicę. 1070 01:06:45,630 --> 01:06:48,210 Zauważają różnicę tutaj ciąg2. 1071 01:06:48,210 --> 01:06:51,340 Ciąg2, to dla pętli jest trochę inaczej. 1072 01:06:51,340 --> 01:06:55,010 >> Pozwól usunąć wartości null tak, że możemy mówić o tych, innym razem. 1073 01:06:55,010 --> 01:06:57,800 Czym różni się dla pętli i tym razem? 1074 01:06:59,620 --> 01:07:01,670 Mogę wrócić do poprzedniego przykładu. 1075 01:07:01,670 --> 01:07:08,580 Więc to jest wersja 2, jest to wersja 1. 1, 2. 1076 01:07:08,580 --> 01:07:11,980 1, 2. 1077 01:07:13,520 --> 01:07:16,660 Strlen połączenie jest gdzie? 1078 01:07:16,660 --> 01:07:18,860 Jest w pierwszej części pętli for. 1079 01:07:18,860 --> 01:07:21,830 Wszelkie myśli, dlaczego to robię? Tak. 1080 01:07:21,830 --> 01:07:24,560 [Uczeń] Więc nie wywołać funkcję za każdym razem. 1081 01:07:24,560 --> 01:07:26,440 [Malan] Więc nie wywołać funkcję za każdym razem. Dokładnie. 1082 01:07:26,440 --> 01:07:28,300 Przypomnijmy dla pętli, że są super proste 1083 01:07:28,300 --> 01:07:31,770 gdy rodzaj zrozumienia, że ​​jest to inicjalizacja, warunek i update. 1084 01:07:31,770 --> 01:07:34,750 Problem jest, że stan się dzieje na każdej iteracji pętli. 1085 01:07:34,750 --> 01:07:40,010 A więc w tym przykładzie, co jest złego w tym, że to jest mój stan? 1086 01:07:40,010 --> 01:07:41,830 [Uczeń] Dzwonisz strlen. 1087 01:07:41,830 --> 01:07:44,340 [Malan] Dzwonisz strlen znowu i znowu i znowu. 1088 01:07:44,340 --> 01:07:47,410 Ale kiedy już wpisane w Dawida, długość tego ciągu jest 5, 1089 01:07:47,410 --> 01:07:49,650 i to nie zmieni się w każdej iteracji pętli 1090 01:07:49,650 --> 01:07:51,670 ponieważ ciąg nadal-D-V-I-D. 1091 01:07:51,670 --> 01:07:55,320 Więc jest to aluzja do tego, co się staje się coraz ważniejszym pomysłem 1092 01:07:55,320 --> 01:08:00,410 znany jako decyzji projektowych, gdzie po prostu nie sprawiają, że komputer robić niepotrzebnej pracy. 1093 01:08:00,410 --> 01:08:03,920 >> Podobnie jak zapowiedzią pset2, pset2 w standardowej wersji 1094 01:08:03,920 --> 01:08:07,030 będzie wyzwanie do rzeczywiście wdrożyć pewną liczbę cyfr, 1095 01:08:07,030 --> 01:08:10,410 pewna liczba algorytmów szyfrowania, tak, że można zarówno szyfrować 1096 01:08:10,410 --> 01:08:13,840 i komunikaty odszyfrować tajne dużo jak jeden Ralphie nie dekodowane. 1097 01:08:13,840 --> 01:08:16,810 W edycji hakerów z pset2, będziemy iść trochę dalej. 1098 01:08:16,810 --> 01:08:19,649 Zamierzamy przekazać Ci plik z rzeczywistego systemu komputerowego 1099 01:08:19,649 --> 01:08:23,479 , który zawiera całą masę nazw użytkowników i haseł zaszyfrowanych faktycznym, 1100 01:08:23,479 --> 01:08:26,939 i wyzwanie dla hakerów edycji będzie do łamania tych haseł 1101 01:08:26,939 --> 01:08:33,200 i dowiedzieć się, co kryptografia czy co tajemnica została użyta do faktycznie wytwarzać tych haseł. 1102 01:08:33,200 --> 01:08:36,109 A my zrobimy to za pomocą nowej funkcji tutaj o C 1103 01:08:36,109 --> 01:08:40,630 że dam ci tylko demo znany jako argumentów wiersza polecenia. 1104 01:08:40,630 --> 01:08:44,229 Okazuje się, jak niektórzy z was mogą zobaczyć w sekcji lub w podręcznikach, 1105 01:08:44,229 --> 01:08:48,260 główny nie zawsze muszą być unieważnione w nawiasach. 1106 01:08:48,260 --> 01:08:52,430 Okazuje się, że głównym można zapisać w ten sposób, z dwoma argumentami, 1107 01:08:52,430 --> 01:08:56,870 argc i argv, gdzie argc jest liczba słów 1108 01:08:56,870 --> 01:09:00,020 , że po wpisaniu nazwy programu na linii poleceń 1109 01:09:00,020 --> 01:09:03,420 a argv jest rzeczywiste słowa. 1110 01:09:03,420 --> 01:09:07,540 I jak nawiasy kwadratowe tam sugerują, argv jest najwyraźniej tablicą. 1111 01:09:07,540 --> 01:09:12,210 To będzie ciąg po sznurku po sznurku w pamięci. 1112 01:09:12,210 --> 01:09:16,010 >> Więc co będziemy w stanie zrobić zaczynając Pset 2 jest coś takiego. 1113 01:09:16,010 --> 01:09:21,350 Jeśli zrobię argv1, który jest przykładem wrócimy do w poniedziałek, i uruchomić go, 1114 01:09:21,350 --> 01:09:23,370 zauważyć, że nie wydaje się, aby zrobić coś jeszcze. 1115 01:09:23,370 --> 01:09:25,490 To po prostu wypisuje swoją nazwę. 1116 01:09:25,490 --> 01:09:31,479 Ale jeśli powiem klasa goodbye, zauważ, że ten program najwyraźniej przechodzi 1117 01:09:31,479 --> 01:09:35,479 nad każdym z wyrazów, które zostały wpisane w wierszu polecenia. 1118 01:09:35,479 --> 01:09:41,630 I środki, dzięki którym zyskamy dostęp do słów, które użytkownik wpisał w wierszu polecenia 1119 01:09:41,630 --> 01:09:49,160 jest zmiana głównego wyjścia w ten weekend od int main (void) int main (argc, argv) 1120 01:09:49,160 --> 01:09:52,050 , a tym samym będzie urodzony argumenty wiersza poleceń. 1121 01:09:52,050 --> 01:09:57,100 A kiedy się naprawdę wyrafinowane na to, że będziesz w stanie napisać naprawdę Trippy programy 1122 01:09:57,100 --> 01:09:59,610 takich jak ten tutaj, co wykracza poza 1123 01:09:59,610 --> 01:10:03,940 niektóre funkcjonalności robiliśmy dotychczas, ale wszystkie bardzo silny. 1124 01:10:03,940 --> 01:10:08,950 >> Będziemy więc zostaw to na ekranie, i zobaczymy w poniedziałek. 1125 01:10:17,570 --> 01:10:20,000 >> [CS50.TV]