1 00:00:00,000 --> 00:00:11,200 2 00:00:11,200 --> 00:00:12,580 >> DAVID MALAN: Dobrze, witamy z powrotem. 3 00:00:12,580 --> 00:00:13,290 To CS50. 4 00:00:13,290 --> 00:00:15,130 To jest początek tygodnia siedem. 5 00:00:15,130 --> 00:00:18,890 Więc to był czas, więc myślałem, że bym podjąć wicher wycieczkę gdzie 6 00:00:18,890 --> 00:00:20,760 skończył i gdzie jesteśmy teraz dzieje. 7 00:00:20,760 --> 00:00:23,310 >> Więc to, co tutaj może mieć wywołało niepokój w pierwszym. 8 00:00:23,310 --> 00:00:27,680 Ale miejmy nadzieję, że zaczynasz zaaklimatyzować się, co to oznacza tutaj - 9 00:00:27,680 --> 00:00:32,670 Standard stanowi wskaźnik, który jest tylko to, co w więcej laika? 10 00:00:32,670 --> 00:00:33,400 Więc to jest adres. 11 00:00:33,400 --> 00:00:35,490 >> Więc jest to adres coś w pamięci. 12 00:00:35,490 --> 00:00:38,260 I zaczęliśmy się odwinąć warstwy Kilka tygodni temu, rzeczy takie jak 13 00:00:38,260 --> 00:00:41,800 GetString i inne takie funkcje przez cały ten czas były powrocie 14 00:00:41,800 --> 00:00:46,010 Adresy rzeczy w pamięci, podobnie jak adres pierwszego znaku 15 00:00:46,010 --> 00:00:46,990 niektórych sekwencji. 16 00:00:46,990 --> 00:00:50,360 >> Więc my też wprowadzone Valgrind, które zaczniesz korzystać z tego problemu 17 00:00:50,360 --> 00:00:53,380 ustaw, w szczególności dla następnego Problem ustawić również. 18 00:00:53,380 --> 00:00:54,980 I valgrind co robi dla nas? 19 00:00:54,980 --> 00:00:57,520 20 00:00:57,520 --> 00:01:01,020 Sprawdza, czy nie ma wycieków pamięci, a to także sprawdza nadużycia pamięci. 21 00:01:01,020 --> 00:01:05,890 >> To może, z pewnym prawdopodobieństwem, wykryć, czy Twój kod będzie dotykać pamięci 22 00:01:05,890 --> 00:01:07,100 że po prostu nie powinno. 23 00:01:07,100 --> 00:01:10,410 Więc niekoniecznie przeciek, ale jeśli wykracza poza granice niektórych 24 00:01:10,410 --> 00:01:14,730 array, a faktycznie uruchomić valgrind i wywoływać takie zachowanie podczas 25 00:01:14,730 --> 00:01:17,870 valgrind działa w programie jest działa w jej wnętrzu, dostaniesz 26 00:01:17,870 --> 00:01:21,460 wiadomości takie jak ta - "nieprawidłowy zapis rozmiar 4 ", który, przypominam kilka 27 00:01:21,460 --> 00:01:25,880 tydzień temu oznaczało, że musiałem przypadkowo jak na jednym zbyt int 28 00:01:25,880 --> 00:01:27,250 poza granice tablicy. 29 00:01:27,250 --> 00:01:30,790 A więc rozmiar 4 oznacza tutaj rozmiar tego konkretnego int. 30 00:01:30,790 --> 00:01:35,260 >> Więc wziąć pewność w tym, że valgrind wyjście, format nim, 31 00:01:35,260 --> 00:01:36,170 jest po prostu okropna. 32 00:01:36,170 --> 00:01:40,180 To naprawdę trudne, aby zobaczyć przez bałagan do ciekawych informacji. 33 00:01:40,180 --> 00:01:42,910 Więc co zrobiliśmy tutaj jest tylko fragment niektóre z kilku więcej 34 00:01:42,910 --> 00:01:43,850 ciekawe linie. 35 00:01:43,850 --> 00:01:46,760 Ale świadomość, że 80% z tych valgrind Wyjście będzie nieco 36 00:01:46,760 --> 00:01:47,650 roztargnienie. 37 00:01:47,650 --> 00:01:52,820 >> Wystarczy spojrzeć na kierunkach takich jak te - nieważne prawo, nieważne czytać, 40 bajtów 38 00:01:52,820 --> 00:01:56,690 a niektóre liczba bloków są zdecydowanie utracone, słowa kluczowe, takie jak to. 39 00:01:56,690 --> 00:02:01,920 A co można mam nadzieję zobaczyć pewne rodzaj śladu co funkcjonować 40 00:02:01,920 --> 00:02:03,340 błąd jest rzeczywiście w. 41 00:02:03,340 --> 00:02:07,195 W tej sprawie, w jakim linia Kod był mój błąd widocznie? 42 00:02:07,195 --> 00:02:09,729 43 00:02:09,729 --> 00:02:14,130 >> 26 w pliku o nazwie memory.c, co było przykład graliśmy z 44 00:02:14,130 --> 00:02:14,890 w tym czasie. 45 00:02:14,890 --> 00:02:16,460 Więc to chyba nie w malloc. 46 00:02:16,460 --> 00:02:18,630 To było prawdopodobnie w kodzie, zamiast. 47 00:02:18,630 --> 00:02:20,910 Więc zobaczymy, to jeszcze raz i znowu niedługo. 48 00:02:20,910 --> 00:02:24,080 >> Więc scanf, ten wpadł w Kilka form dotychczas. 49 00:02:24,080 --> 00:02:26,410 Widzieliśmy sscanf krótko. 50 00:02:26,410 --> 00:02:28,330 To coś liczba Ci zanurkował w telefonie 51 00:02:28,330 --> 00:02:29,535 przygotowania do quizu. 52 00:02:29,535 --> 00:02:33,130 I scanf jest rzeczywiście to, co CS50 Biblioteka został przy użyciu pod 53 00:02:33,130 --> 00:02:36,560 kaptur od dłuższego czasu w celu , aby uzyskać informacje od użytkownika. 54 00:02:36,560 --> 00:02:40,420 >> Na przykład, jeśli przejście na CS50 Urządzenie tutaj, pozwól mi otworzyć 55 00:02:40,420 --> 00:02:45,315 Przykład dziś to się nazywa scanf-0.c I to jest bardzo proste. 56 00:02:45,315 --> 00:02:46,590 To tylko kilka linii kodu. 57 00:02:46,590 --> 00:02:50,880 Ale to pokazuje, naprawdę jak getInt pracuje cały ten czas. 58 00:02:50,880 --> 00:02:54,710 >> W tym programie tu, w linii 16 Zauważ, że oświadczam, int. 59 00:02:54,710 --> 00:02:57,270 Tak więc nie ma wskazówek, nic magicznego tam, po prostu int. 60 00:02:57,270 --> 00:03:00,330 Następnie w linii 17, I zapyta Użytkownik dla wielu, proszę. 61 00:03:00,330 --> 00:03:02,930 Następnie pod koniec 18, używam scanf tutaj. 62 00:03:02,930 --> 00:03:06,910 I określić, trochę jak printf, że czekam na wycenę 63 00:03:06,910 --> 00:03:08,110 cytatu procent i.. 64 00:03:08,110 --> 00:03:10,920 >> Tak więc procent i, oczywiście, oznacza int. 65 00:03:10,920 --> 00:03:14,580 Zauważmy jednak, co drugi argument scanf jest. 66 00:03:14,580 --> 00:03:17,350 Jak opisałbyś sekund Argument po przecinku? 67 00:03:17,350 --> 00:03:19,450 Co to jest? 68 00:03:19,450 --> 00:03:20,670 >> To adres x. 69 00:03:20,670 --> 00:03:25,490 Więc to jest przydatne, ponieważ poprzez dostarczanie scanfa z adresem X, co czyni 70 00:03:25,490 --> 00:03:29,560 które upoważniają tę funkcję do zrobienia? 71 00:03:29,560 --> 00:03:33,010 Nie tylko tam, ale także zrobić co? 72 00:03:33,010 --> 00:03:34,060 >> Wprowadzić zmiany do niego. 73 00:03:34,060 --> 00:03:38,080 Bo można tam pojechać, to rodzaj jak mapa do lokalizacji w pamięci. 74 00:03:38,080 --> 00:03:41,900 I tak długo, jak zapewnić scanf lub Każda funkcja z taką mapę, to 75 00:03:41,900 --> 00:03:45,840 Funkcja może tam pojechać, i nie tylko spojrzeć na wartości, ale może również 76 00:03:45,840 --> 00:03:49,670 zmienić tę wartość, co jest przydatne w przypadku celem w życiu jest do scanf 77 00:03:49,670 --> 00:03:53,060 skanowania danych od użytkownika, w szczególności z klawiatury. 78 00:03:53,060 --> 00:03:57,830 I f oznacza sformatowany, tak jak printf, f oznacza sformatowany 79 00:03:57,830 --> 00:03:58,930 Ciąg, który chcesz wydrukować. 80 00:03:58,930 --> 00:04:04,430 >> Tak w skrócie, to 18 linii po prostu mówi, próby odczytu int z instrukcji 81 00:04:04,430 --> 00:04:10,420 klawiatury i przechowywać go w środku x, w bez względu na adres x zdarza się żyć w. 82 00:04:10,420 --> 00:04:14,860 I wtedy wreszcie, wiersz 19 mówi tylko, dzięki za int, w tym przypadku. 83 00:04:14,860 --> 00:04:15,940 >> Więc pozwól mi iść dalej i zrobić to. 84 00:04:15,940 --> 00:04:18,570 Tak zrobić scanf 0. 85 00:04:18,570 --> 00:04:20,130 Pozwólcie mi iść do przodu i powiększyć obraz 86 00:04:20,130 --> 00:04:22,960 Pójdę i uruchomić to z dots slash scanf 0. 87 00:04:22,960 --> 00:04:24,020 Numer, proszę? 88 00:04:24,020 --> 00:04:24,720 50. 89 00:04:24,720 --> 00:04:25,730 Dzięki za 50. 90 00:04:25,730 --> 00:04:27,270 Więc jest to bardzo proste. 91 00:04:27,270 --> 00:04:28,160 >> Teraz nie jest to, co robi? 92 00:04:28,160 --> 00:04:29,940 To nie robi całą masę od sprawdzania błędów. 93 00:04:29,940 --> 00:04:33,000 Na przykład, jeśli nie współpracują, i nie mam wpisać numer, ale 94 00:04:33,000 --> 00:04:37,860 zamiast napisać coś w stylu "hello" to tylko jakieś dziwne. 95 00:04:37,860 --> 00:04:41,130 I tak, jedną z rzeczy, CS50 biblioteka została robi dla nas dla niektórych 96 00:04:41,130 --> 00:04:43,440 czasu jest to, że reprompting i reprompting. 97 00:04:43,440 --> 00:04:49,320 >> Spróbuj przypomnieć zdanie było w cs50.c, i to jest powodem, że getInt w 98 00:04:49,320 --> 00:04:51,670 Biblioteka CS50 jest właściwie cały Kilka linii długich, ponieważ jesteśmy 99 00:04:51,670 --> 00:04:53,190 sprawdzanie głupich rzeczy, jak ta. 100 00:04:53,190 --> 00:04:55,730 Nie dają użytkownikowi nas, w rzeczywistości, Int.? 101 00:04:55,730 --> 00:04:57,910 Czy on lub ona dać nam coś jak alfabetycznej liście? 102 00:04:57,910 --> 00:05:01,410 Jeśli tak, chcemy wykrywać że i krzyczeć na nich. 103 00:05:01,410 --> 00:05:03,915 >> Ale robi się ciekawiej w tym przykładzie. 104 00:05:03,915 --> 00:05:09,840 Jeśli pójdę do scanf-1c, co jest jednym rzecz, która jest zasadniczo zmieniło w 105 00:05:09,840 --> 00:05:11,135 to następny przykład? 106 00:05:11,135 --> 00:05:13,690 107 00:05:13,690 --> 00:05:16,010 Używam char *, oczywiście, zamiast int. 108 00:05:16,010 --> 00:05:19,210 >> Więc to jest ciekawe, bo char *, przypominam, jest tak naprawdę 109 00:05:19,210 --> 00:05:20,190 samo jak łańcuch. 110 00:05:20,190 --> 00:05:23,840 Więc jest to jak może to jest super prosta realizacja GetString. 111 00:05:23,840 --> 00:05:26,010 Ale już obrane z powrotem warstwę z CS50 bibliotece, więc jestem 112 00:05:26,010 --> 00:05:27,550 wywołanie tej char * teraz. 113 00:05:27,550 --> 00:05:30,070 Zobaczmy więc, gdzie, jeśli w dowolnym miejscu, my się nie udać. 114 00:05:30,070 --> 00:05:30,840 >> Linia 17 - 115 00:05:30,840 --> 00:05:33,950 I jeszcze powiedzieć, proszę mi dać coś, w tym przypadku, łańcuch. 116 00:05:33,950 --> 00:05:37,940 A potem, w następnej linii, wzywam scanf, ponownie, nadając mu kod formatu, 117 00:05:37,940 --> 00:05:39,310 ale to s procent czasu. 118 00:05:39,310 --> 00:05:41,900 I wtedy ten czas, jestem dając to bufor. 119 00:05:41,900 --> 00:05:43,550 >> Zauważcie, nie używam Ampersand. 120 00:05:43,550 --> 00:05:47,120 Ale dlaczego jest to, że prawdopodobnie OK tutaj? 121 00:05:47,120 --> 00:05:49,760 Bo to, co jest bufor już? 122 00:05:49,760 --> 00:05:50,770 To już wskaźnik. 123 00:05:50,770 --> 00:05:51,650 To już adres. 124 00:05:51,650 --> 00:05:54,510 >> I niech to słowo "mylić", pozwól mi po prostu nazwać to s, na przykład, na 125 00:05:54,510 --> 00:05:55,050 prostota. 126 00:05:55,050 --> 00:05:58,250 Ale ja nazywa to bufor, bo w ogólnego, w programowaniu, jeśli masz 127 00:05:58,250 --> 00:06:02,130 fragment pamięci, który ciąg naprawdę po prostu jest, można nazwać to bufor. 128 00:06:02,130 --> 00:06:04,460 Jest to miejsce do przechowywania informacji. 129 00:06:04,460 --> 00:06:07,400 >> Podobne do rzeczy, takich jak YouTube, kiedy oni buforowanie, by tak rzec, że 130 00:06:07,400 --> 00:06:10,270 Oznacza to po prostu pobierając bity z internetu i przechowywanie ich w 131 00:06:10,270 --> 00:06:14,160 local tablica, lokalne fragment pamięci tak że można oglądać je później bez 132 00:06:14,160 --> 00:06:16,830 to pomijanie lub wiszące ci podczas odtwarzania. 133 00:06:16,830 --> 00:06:20,930 >> Więc nie ma problemu tutaj chociaż, bo mówię scanf, spodziewać 134 00:06:20,930 --> 00:06:22,320 ciąg od użytkownika. 135 00:06:22,320 --> 00:06:24,410 Oto adres fragment pamięci. 136 00:06:24,410 --> 00:06:26,180 Umieść ten ciąg tam. 137 00:06:26,180 --> 00:06:31,230 Dlaczego jest to, że związany dać nam kłopoty, choć? 138 00:06:31,230 --> 00:06:33,490 >> Co to jest? 139 00:06:33,490 --> 00:06:35,510 Czy mogę uzyskać dostęp do że część pamięci? 140 00:06:35,510 --> 00:06:36,250 Wiesz, nie wiem. 141 00:06:36,250 --> 00:06:39,210 Ponieważ jest bufor został zainicjowany do niczego? 142 00:06:39,210 --> 00:06:39,820 Nie bardzo. 143 00:06:39,820 --> 00:06:43,090 I tak to jest to, co my już dzwoni wartość śmieci, które 144 00:06:43,090 --> 00:06:44,040 nie jest formalny wyraz. 145 00:06:44,040 --> 00:06:49,200 To po prostu oznacza, że ​​nie mamy pojęcia, co bity są w środku z czterech bajtów 146 00:06:49,200 --> 00:06:51,240 I przyznajemy jako bufor. 147 00:06:51,240 --> 00:06:52,450 >> I nie nazywa malloc. 148 00:06:52,450 --> 00:06:53,940 Ja na pewno nie nazywa GetString. 149 00:06:53,940 --> 00:06:56,380 Więc kto wie, co jest w rzeczywistości wewnątrz bufora? 150 00:06:56,380 --> 00:07:00,550 A jednak mówi scanf ślepo, tam i umieścić co użytkownik wpisał. 151 00:07:00,550 --> 00:07:04,460 >> Więc co może powodować w naszym kodzie, jeśli go uruchomić? 152 00:07:04,460 --> 00:07:05,700 Prawdopodobnie wysypać. 153 00:07:05,700 --> 00:07:07,970 Może nie, ale prawdopodobnie wysypać. 154 00:07:07,970 --> 00:07:10,620 A ja mówię nie, bo czasami może ty, czasami 155 00:07:10,620 --> 00:07:11,380 nie dostaniesz wysypać. 156 00:07:11,380 --> 00:07:14,280 Czasami po prostu miał szczęście, ale to jednak będzie 157 00:07:14,280 --> 00:07:15,340 błąd w naszym programie. 158 00:07:15,340 --> 00:07:17,060 >> Więc pozwól mi iść dalej i skompilować. 159 00:07:17,060 --> 00:07:18,280 Mam zamiar zrobić to stary sposób szkoła. 160 00:07:18,280 --> 00:07:23,825 Więc kreska dzyń 0, scanf-1, scanf-1.c, Enter. 161 00:07:23,825 --> 00:07:24,720 Ups, too old school. 162 00:07:24,720 --> 00:07:26,550 Zobaczymy. 163 00:07:26,550 --> 00:07:28,440 Gdzie pójdę? 164 00:07:28,440 --> 00:07:29,700 Oh, bufor * char. 165 00:07:29,700 --> 00:07:33,595 166 00:07:33,595 --> 00:07:35,130 Och, dziękuję - 167 00:07:35,130 --> 00:07:36,930 Zapisz, OK - 168 00:07:36,930 --> 00:07:37,690 bardzo stara szkoła. 169 00:07:37,690 --> 00:07:38,900 W porządku, to był czas. 170 00:07:38,900 --> 00:07:41,720 >> Tak już po prostu zapisany plik po co, że tymczasowe 171 00:07:41,720 --> 00:07:42,700 zmienić chwilą. 172 00:07:42,700 --> 00:07:46,090 I teraz mam skompilowane go ręcznie z Clang. 173 00:07:46,090 --> 00:07:49,500 A teraz mam zamiar iść do przodu i uruchomić scanf-1, Enter. 174 00:07:49,500 --> 00:07:50,290 String proszę. 175 00:07:50,290 --> 00:07:51,600 Będę pisać w "hello". 176 00:07:51,600 --> 00:07:54,070 >> A teraz, tutaj, gdzie, szczerze mówiąc, printf może to trochę irytujące. 177 00:07:54,070 --> 00:07:56,020 To nie jest rzeczywiście będzie segfault w tym przypadku. 178 00:07:56,020 --> 00:07:59,860 Printf jest trochę wyjątkowy, bo to jest tak bardzo powszechnie stosowane, że 179 00:07:59,860 --> 00:08:03,570 zasadniczo printf robi nam przysługę i realizacji, 180 00:08:03,570 --> 00:08:04,830 Nie ważne, że wskaźnik jest. 181 00:08:04,830 --> 00:08:09,080 Pozwól mi wziąć to na siebie, po prostu wydrukować w nawiasach wartości null, nawet 182 00:08:09,080 --> 00:08:13,340 choć nie jest to koniecznie, co sami z oczekiwaniami. 183 00:08:13,340 --> 00:08:16,940 >> Tak naprawdę nie możemy łatwo wywołać wysypać się z tego, ale wyraźnie to 184 00:08:16,940 --> 00:08:18,600 nie jest zachowanie chciałem. 185 00:08:18,600 --> 00:08:19,800 Więc co jest proste rozwiązanie? 186 00:08:19,800 --> 00:08:25,650 Cóż, w scanf-2, pozwól mi zaproponować zamiast właściwie tylko przydzielenie 187 00:08:25,650 --> 00:08:30,100 char *, pozwól mi być trochę mądrzejszy o to i daj mi przydzielić bufor 188 00:08:30,100 --> 00:08:32,940 jako ciąg 16 znaków. 189 00:08:32,940 --> 00:08:34,200 >> Więc można zrobić to w kilka sposobów. 190 00:08:34,200 --> 00:08:35,610 Mogę absolutnie używać malloc. 191 00:08:35,610 --> 00:08:38,980 Ale mogę wrócić do tygodnia dwóch, gdy Potrzebne mi całą masę 192 00:08:38,980 --> 00:08:39,620 znaków. 193 00:08:39,620 --> 00:08:40,860 To tylko tablica. 194 00:08:40,860 --> 00:08:44,870 Więc pozwól mi zamiast przedefiniować bufor się tablica z 16 znaków. 195 00:08:44,870 --> 00:08:47,340 >> A teraz, kiedy mijam bufor w - 196 00:08:47,340 --> 00:08:49,940 i to jest coś, czego nie zrobił mówić w drugim tygodniu - 197 00:08:49,940 --> 00:08:53,730 ale można traktować tablicę jako choć to adres. 198 00:08:53,730 --> 00:08:56,390 Technicznie, jak widzieliśmy, są one trochę inaczej. 199 00:08:56,390 --> 00:09:01,290 Ale scanf nie przeszkadza jeśli przekazana Nazwa tablicy, bo to, co 200 00:09:01,290 --> 00:09:05,030 Szczęk zrobi dla nas, jest w istocie traktować nazwę tej tablicy jako 201 00:09:05,030 --> 00:09:08,280 adres fragmencie 16 bajtów. 202 00:09:08,280 --> 00:09:09,550 >> Więc to jest lepiej. 203 00:09:09,550 --> 00:09:12,110 Oznacza to, że teraz mam nadzieję, że mogę wykonaj następujące czynności. 204 00:09:12,110 --> 00:09:16,800 Pozwól mi oddalić się na chwilę i robią scanf-2, skompilowany OK. 205 00:09:16,800 --> 00:09:19,390 Teraz pozwól mi nie dostaje slash scanf-2. 206 00:09:19,390 --> 00:09:22,430 String proszę. "Hello". I to wydawało się do pracy i tym razem. 207 00:09:22,430 --> 00:09:26,020 >> Ale może ktoś zaproponować scenariusz , w którym nie może nadal działać? 208 00:09:26,020 --> 00:09:28,550 Tak? 209 00:09:28,550 --> 00:09:30,640 Coś więcej niż 16 znaków. 210 00:09:30,640 --> 00:09:32,020 I rzeczywiście, możemy być trochę bardziej precyzyjne. 211 00:09:32,020 --> 00:09:36,540 Coś dłuższy niż 15 znaków, bo naprawdę musimy pamiętać, 212 00:09:36,540 --> 00:09:39,920 że musimy, że backslash zera pośrednio na końcu łańcucha, 213 00:09:39,920 --> 00:09:42,950 co jest poza scanf zazwyczaj dbać o nas. 214 00:09:42,950 --> 00:09:46,210 >> Więc pozwól mi zrobić coś takiego - 215 00:09:46,210 --> 00:09:48,040 czasami po prostu może zostawić go tak. 216 00:09:48,040 --> 00:09:50,630 OK, więc mamy teraz wywołane nasza wina segmentacja. 217 00:09:50,630 --> 00:09:51,000 Dlaczego? 218 00:09:51,000 --> 00:09:54,940 Bo wpisane do ponad 15 znaków, a więc mamy naprawdę 219 00:09:54,940 --> 00:09:58,280 dotknął pamięci, że rzeczywiście nie powinien mieć. 220 00:09:58,280 --> 00:10:00,180 >> Więc co tak naprawdę rozwiązanie tutaj? 221 00:10:00,180 --> 00:10:02,210 A co, jeśli potrzebujemy dłuższy ciąg? 222 00:10:02,210 --> 00:10:03,960 Cóż, być może zrobi to 32 bajtów. 223 00:10:03,960 --> 00:10:05,160 A co, jeśli to nie jest wystarczająco długi? 224 00:10:05,160 --> 00:10:06,040 Jak około 64 bajtów? 225 00:10:06,040 --> 00:10:07,080 A co, jeśli to nie jest wystarczająco długi? 226 00:10:07,080 --> 00:10:09,640 Jak około 128 lub 200 bajtów? 227 00:10:09,640 --> 00:10:12,660 Co tak naprawdę jest rozwiązaniem tutaj ogólnym przypadku, jeśli nie wiemy, w 228 00:10:12,660 --> 00:10:14,460 naprzód, co użytkownik będzie wpisać? 229 00:10:14,460 --> 00:10:20,000 230 00:10:20,000 --> 00:10:23,050 >> To tylko rodzaj wielkim bólem w dupie, Szczerze mówiąc, dlatego 231 00:10:23,050 --> 00:10:29,050 CS50 biblioteka ma kilka linii tuzin Kod, który wspólnie realizować 232 00:10:29,050 --> 00:10:32,390 GetString ciąg w sposób, że nie trzeba z góry wiedzieć, co 233 00:10:32,390 --> 00:10:33,430 Użytkownik ma wpisać. 234 00:10:33,430 --> 00:10:37,370 W szczególności, jeśli spojrzeć na cs50.c z dwa tygodnie temu, zobaczysz 235 00:10:37,370 --> 00:10:40,480 że GetString faktycznie robi nie używać scanf w ten sposób. 236 00:10:40,480 --> 00:10:43,720 Raczej, odczytuje jeden znak na raz. 237 00:10:43,720 --> 00:10:46,010 >> Ponieważ jeden Zaletą czytając jeden znak jest to możliwe 238 00:10:46,010 --> 00:10:48,490 gwarantuje się, aby zawsze mieć co najmniej jeden char. 239 00:10:48,490 --> 00:10:51,740 Mogę tylko zadeklarować char, a następnie naprawdę te kroki tylko dziecko 240 00:10:51,740 --> 00:10:54,380 Przeczytaj o jeden znak w co razem z klawiatury. 241 00:10:54,380 --> 00:10:58,240 A potem, co zobaczysz GetString robi to za każdym razem skończy się, 242 00:10:58,240 --> 00:11:02,280 powiedzmy, 16 bajtów pamięci, wykorzystuje malloc lub jej kuzyn, do 243 00:11:02,280 --> 00:11:06,810 przydzielić więcej pamięci, kopiowanie starych pamięci do indeksowania nowych, a następnie 244 00:11:06,810 --> 00:11:09,900 razem, coraz jeden znak na raz, a kiedy skończy się, że 245 00:11:09,900 --> 00:11:13,370 fragment pamięci, rzuca ją, chwyta większy fragment pamięci, kopiuje stary 246 00:11:13,370 --> 00:11:14,750 do nowych i powtórzeń. 247 00:11:14,750 --> 00:11:18,480 I to jest naprawdę ból rzeczywiście zaimplementować coś tak proste, jak 248 00:11:18,480 --> 00:11:19,710 się wkład ze strony użytkownika. 249 00:11:19,710 --> 00:11:21,090 >> Więc można użyć scanf. 250 00:11:21,090 --> 00:11:22,430 Można stosować inne podobne funkcje. 251 00:11:22,430 --> 00:11:25,420 I wiele podręczników i online przykłady zrobić, ale oni wszyscy 252 00:11:25,420 --> 00:11:27,210 narażone na problemy takie jak ten. 253 00:11:27,210 --> 00:11:29,550 I w końcu, coraz segfault jest trochę denerwujące. 254 00:11:29,550 --> 00:11:30,680 To nie jest dobre dla użytkownika. 255 00:11:30,680 --> 00:11:33,560 >> A w najgorszym przypadku, co czyni to zasadniczo połóż 256 00:11:33,560 --> 00:11:37,160 Kod na ryzyko? 257 00:11:37,160 --> 00:11:39,250 Jakiś rodzaj ataku, potencjalnie. 258 00:11:39,250 --> 00:11:41,680 Rozmawialiśmy o jednym takim ataku - przepełnienia stosu. 259 00:11:41,680 --> 00:11:44,660 Ale w ogóle, jeśli wolno przepełnienie bufora, tak jak my 260 00:11:44,660 --> 00:11:48,070 Kilka tygodni temu, ze tylko pisanie więcej niż "hello" na stosie, to 261 00:11:48,070 --> 00:11:52,330 rzeczywiście może przejąć, potencjalnie, Komputer, lub przynajmniej na dane, które 262 00:11:52,330 --> 00:11:53,510 nie należy do Ciebie. 263 00:11:53,510 --> 00:11:55,970 >> Tak w skrócie, to dlaczego mamy te kółka. 264 00:11:55,970 --> 00:11:59,090 Ale teraz, zaczynamy je zdjąć, jak nasze programy nie są już potrzebne, 265 00:11:59,090 --> 00:12:00,610 Niekoniecznie, wejście od użytkownika. 266 00:12:00,610 --> 00:12:03,960 Ale w przypadku problemu ustawić sześć, Twój wkład będzie pochodzić z ogromnym 267 00:12:03,960 --> 00:12:07,520 plik słownika z 150 niektórych dziwne tysiąc słów. 268 00:12:07,520 --> 00:12:10,330 >> Więc nie musisz się martwić o Użytkownik ma arbitralne wejście. 269 00:12:10,330 --> 00:12:13,720 Będziemy Ci pewne założenia o tym pliku. 270 00:12:13,720 --> 00:12:20,340 Wszelkie pytania na temat wskaźników lub scanf lub wprowadzane przez użytkownika w ogóle? 271 00:12:20,340 --> 00:12:24,450 >> W porządku, więc szybkie spojrzenie, a następnie w jednej ciągnąc wątek z dwa tygodnie temu. 272 00:12:24,450 --> 00:12:28,590 I to było to pojęcie struktury. 273 00:12:28,590 --> 00:12:34,180 Nie dlatego, że - to pojęcie struct, co było, co? 274 00:12:34,180 --> 00:12:35,430 Co struct dla nas zrobić? 275 00:12:35,430 --> 00:12:39,280 276 00:12:39,280 --> 00:12:39,860 >> Zdefiniuj - 277 00:12:39,860 --> 00:12:41,710 Przepraszam? 278 00:12:41,710 --> 00:12:42,820 Zdefiniuj typ zmiennej. 279 00:12:42,820 --> 00:12:44,410 Tak jakby. 280 00:12:44,410 --> 00:12:46,180 Jesteśmy naprawdę połączenie dwóch tematów. 281 00:12:46,180 --> 00:12:49,510 Więc z typedef, przypominam, że możemy zadeklarować typ własne, jak 282 00:12:49,510 --> 00:12:51,500 synonimem, jak napis na char *. 283 00:12:51,500 --> 00:12:56,200 Ale za pomocą typedef i struct, możemy stworzyć prawdziwie własnych struktur danych. 284 00:12:56,200 --> 00:12:59,600 >> Na przykład, jeśli wrócę do gedit tu tylko na chwilę, a ja śmiało 285 00:12:59,600 --> 00:13:08,230 i zrobić coś, chciałbym zapisać to jak, powiedzmy, structs.c 286 00:13:08,230 --> 00:13:10,840 czasowo, mam zamiar iść do przodu i to 287 00:13:10,840 --> 00:13:14,360 standardio.h, int main void. 288 00:13:14,360 --> 00:13:18,960 A potem tutaj, załóżmy, że chcę napisać program, który przechowuje 289 00:13:18,960 --> 00:13:21,840 wielu studentów z różnych domy, na przykład. 290 00:13:21,840 --> 00:13:24,430 Tak to jest jak registrarial Baza danych pewnego rodzaju. 291 00:13:24,430 --> 00:13:29,550 >> Więc jeśli trzeba nazwisko jednego studenta, I może zrobić coś jak char * name, 292 00:13:29,550 --> 00:13:31,570 i zrobię coś takiego - 293 00:13:31,570 --> 00:13:34,410 faktycznie, użyjmy CS50 biblioteki na chwilę, aby to 294 00:13:34,410 --> 00:13:38,380 trochę prostsze, więc możemy pożyczyć te dziesiątki linii kodu. 295 00:13:38,380 --> 00:13:39,340 I niech po prostu keep it simple. 296 00:13:39,340 --> 00:13:42,610 Będziemy to ciąg, i teraz GetString. 297 00:13:42,610 --> 00:13:47,420 >> Więc twierdzą teraz, że mam zapisane nazwisko jakiegoś studenta, a domem 298 00:13:47,420 --> 00:13:50,240 niektórych studentów, po prostu za pomocą zmiennych tak jak my w tygodniu jeden. 299 00:13:50,240 --> 00:13:52,370 Ale przypuśćmy, że teraz chcą wspierać wielu studentów. 300 00:13:52,370 --> 00:13:58,460 W porządku, więc moje instynkty są do zrobienia Ciąg name2, dostaje GetString, ciąg 301 00:13:58,460 --> 00:14:01,370 house2 dostaje GetString. 302 00:14:01,370 --> 00:14:05,850 A potem nasz trzeci uczeń, zróbmy NAME3 GetString. 303 00:14:05,850 --> 00:14:09,170 >> W porządku, więc mam nadzieję, że jest to uderzające Ty jako głupie, 304 00:14:09,170 --> 00:14:11,580 , ponieważ proces ten jest bardzo nigdy się skończy, a to po prostu będzie 305 00:14:11,580 --> 00:14:13,130 aby mój kod wygląda gorzej i coraz gorzej. 306 00:14:13,130 --> 00:14:14,810 Ale rozwiązaliśmy to też w drugim tygodniu. 307 00:14:14,810 --> 00:14:19,450 Jaki był nasz stosunkowo czyste rozwiązanie kiedy mieliśmy wielu zmiennych 308 00:14:19,450 --> 00:14:23,580 samego typu, które są związane, ale nie chcemy tego okropne bałagan 309 00:14:23,580 --> 00:14:26,870 z podobnie nazwanych zmiennych? 310 00:14:26,870 --> 00:14:30,060 Co możemy zrobić w zamian? 311 00:14:30,060 --> 00:14:31,260 >> Więc myślę, że słyszałem kilka miejsc. 312 00:14:31,260 --> 00:14:32,590 Mieliśmy tablicę. 313 00:14:32,590 --> 00:14:37,110 Jeśli chcesz wiele wystąpień coś, czemu nie możemy oczyścić to wszystko 314 00:14:37,110 --> 00:14:39,540 się i po prostu powiedzieć, daj mi array nazwie nazwy? 315 00:14:39,540 --> 00:14:41,640 >> A teraz, niech ciężko 3 kodu. 316 00:14:41,640 --> 00:14:44,450 A potem dał mi kolejną tablicę zwane domy, i niech mnie 317 00:14:44,450 --> 00:14:45,800 teraz trudno kod 3. 318 00:14:45,800 --> 00:14:49,220 A ja masowo posprzątać bałagan, że po prostu stworzony. 319 00:14:49,220 --> 00:14:52,400 Teraz, mam wciąż trudno kodowane 3, ale nawet 3 może dynamicznie pochodzą z 320 00:14:52,400 --> 00:14:54,350 Użytkownik lub argv lub tym podobne. 321 00:14:54,350 --> 00:14:55,720 Tak to już jest czystsze. 322 00:14:55,720 --> 00:15:00,100 >> Ale to, co jest irytujące jest to, że teraz, choć nazwa jest w jakiś sposób 323 00:15:00,100 --> 00:15:02,280 zasadniczo związane dom studenta - 324 00:15:02,280 --> 00:15:04,720 to student, że naprawdę chcą reprezentować - 325 00:15:04,720 --> 00:15:08,080 Mam teraz dwie tablice, które są równoległe w tym sensie, że są one 326 00:15:08,080 --> 00:15:13,930 Uchwyt sam rozmiar i nazwy 0 przypuszczalnie mapy do wspornika domy 0, 327 00:15:13,930 --> 00:15:16,600 i nazwy Uchwyt 1 mapy do domów wspornik 1. 328 00:15:16,600 --> 00:15:19,280 Innymi słowy, że studenckie życie w że dom, i że inne uczeń 329 00:15:19,280 --> 00:15:20,530 mieszka w tym drugim domu. 330 00:15:20,530 --> 00:15:23,720 Ale na pewno może to być zrobić jeszcze bardziej czysto. 331 00:15:23,720 --> 00:15:24,990 >> Cóż, może w rzeczywistości. 332 00:15:24,990 --> 00:15:28,730 I pozwól mi iść do przodu i otworzyć up structs.h, i będziesz 333 00:15:28,730 --> 00:15:31,130 zobacz ten pomysł tutaj. 334 00:15:31,130 --> 00:15:34,905 Zauważmy, że użyłem typedef, jak ty wspomniał chwilę temu uznaniu naszej 335 00:15:34,905 --> 00:15:35,570 własny typ danych. 336 00:15:35,570 --> 00:15:39,660 Ale jestem również za pomocą tego inne słowa kluczowe nazywa struct które daje mi nowe 337 00:15:39,660 --> 00:15:40,790 Struktura danych. 338 00:15:40,790 --> 00:15:43,980 >> I to struktura danych Twierdzę będzie mieć dwie rzeczy wewnątrz 339 00:15:43,980 --> 00:15:47,060 it - ciąg nazwie name, i ciąg zwany dom. 340 00:15:47,060 --> 00:15:49,820 A imię mam zamiar dać to struktura danych będzie 341 00:15:49,820 --> 00:15:51,005 na miano ucznia. 342 00:15:51,005 --> 00:15:54,030 Mogę nazwać to na co mam ochotę, ale semantycznie zrobić 343 00:15:54,030 --> 00:15:55,810 sens dla mnie w mojej głowie. 344 00:15:55,810 --> 00:15:59,160 >> Więc teraz, jeśli otworzy lepszą wersję programu zacząłem pisać 345 00:15:59,160 --> 00:16:00,390 tam, pozwól mi przejść do góry. 346 00:16:00,390 --> 00:16:03,190 I jest jeszcze kilka linii kodu tutaj, ale pozwól mi skupić się na 347 00:16:03,190 --> 00:16:04,160 Moment na jednego. 348 00:16:04,160 --> 00:16:07,790 I już ogłoszony stale zwane studentów i trudno kodowane 3 teraz. 349 00:16:07,790 --> 00:16:11,110 Ale teraz, zauważyć, jak czyste mój kod zaczyna się dostać. 350 00:16:11,110 --> 00:16:15,030 >> W linii 22, oświadczam array studentów. 351 00:16:15,030 --> 00:16:18,760 I zauważyć, że uczeń jest najwyraźniej teraz typ danych. 352 00:16:18,760 --> 00:16:23,360 Ponieważ na początku tego pliku, zawiadomienia Podaję ten plik nagłówka 353 00:16:23,360 --> 00:16:24,820 że zatrzymał się przed chwilą. 354 00:16:24,820 --> 00:16:28,820 I że plik po prostu miał nagłówek ta definicja studenta. 355 00:16:28,820 --> 00:16:32,470 >> Więc teraz, stworzyłem swoje własne dane typ, że autorzy roku C 356 00:16:32,470 --> 00:16:33,890 temu nie sądziłem, że z wyprzedzeniem. 357 00:16:33,890 --> 00:16:34,570 Ale nie ma problemu. 358 00:16:34,570 --> 00:16:35,870 Mogę zrobić to sam. 359 00:16:35,870 --> 00:16:39,050 Więc to jest tablica o nazwie studentów, każdy z jej członków 360 00:16:39,050 --> 00:16:41,100 jest struktura studentów. 361 00:16:41,100 --> 00:16:44,270 A ja chcę te trzy w tablicy. 362 00:16:44,270 --> 00:16:46,030 >> A teraz, co robi reszta tego programu zrobić? 363 00:16:46,030 --> 00:16:47,550 Potrzebowałem czegoś niepożądanego. 364 00:16:47,550 --> 00:16:51,450 Tak więc od teraz 24 począwszy, I iteracji od 0 do 3. 365 00:16:51,450 --> 00:16:54,000 I następnie prosi użytkownika o nazwisko studenta. 366 00:16:54,000 --> 00:16:56,110 A potem używam GetString jak wcześniej. 367 00:16:56,110 --> 00:16:59,410 Następnie proszę o domu studenta, i używam GetString jak wcześniej. 368 00:16:59,410 --> 00:17:01,780 >> Ale uwaga - nieco nowy Kawałek składni - 369 00:17:01,780 --> 00:17:07,010 I może jeszcze wskaźnik do i-tego ucznia, ale w jaki sposób dostać się do konkretnych danych 370 00:17:07,010 --> 00:17:08,354 wewnątrz pola tej struktury? 371 00:17:08,354 --> 00:17:11,770 No, co jest najwyraźniej nowy kawałek składni? 372 00:17:11,770 --> 00:17:13,339 To jest po prostu operator kropki. 373 00:17:13,339 --> 00:17:14,510 >> Nie Naprawdę widziałem tego wcześniej. 374 00:17:14,510 --> 00:17:17,819 Widziałeś go w Pset pięć Jeśli zanurkował w już z plików bitmapowych. 375 00:17:17,819 --> 00:17:22,372 Ale kropka oznacza tylko wewnątrz tego struct lub wiele pól, dać kropkę 376 00:17:22,372 --> 00:17:24,510 Nazwa, lub dać mi dot dom. 377 00:17:24,510 --> 00:17:28,690 Oznacza to, że do środka tej struktury i dostać te poszczególne pola. 378 00:17:28,690 --> 00:17:30,200 >> Co reszta tego programu zrobić? 379 00:17:30,200 --> 00:17:31,190 To nie wszystko, że sexy. 380 00:17:31,190 --> 00:17:34,640 Należy zauważyć, że iteracyjne od 0 do 3 Również a ja po prostu stworzyć English 381 00:17:34,640 --> 00:17:40,500 Zwrot jak tak i tak jest w taki a taki dom, przekazując dot nazwy od 382 00:17:40,500 --> 00:17:43,320 i-studentów i ich dom również. 383 00:17:43,320 --> 00:17:47,560 >> I wtedy wreszcie, teraz zaczniemy dostać anal o tym, że teraz jesteśmy 384 00:17:47,560 --> 00:17:49,580 zna co malloc i inne funkcje zostały 385 00:17:49,580 --> 00:17:50,570 robi cały ten czas. 386 00:17:50,570 --> 00:17:54,220 Dlaczego muszę uwolnić zarówno nazwę i dom, mimo że 387 00:17:54,220 --> 00:17:56,960 nie wywołać malloc? 388 00:17:56,960 --> 00:17:58,020 >> GetString zrobił. 389 00:17:58,020 --> 00:18:00,930 I to był brudny mały sekret dla kilka tygodni, ale GetString ma 390 00:18:00,930 --> 00:18:03,530 był wyciek pamięci na całym umieścić wszystkie semestr do tej pory. 391 00:18:03,530 --> 00:18:05,990 I Valgrand ostatecznie ujawnić to do nas. 392 00:18:05,990 --> 00:18:10,730 >> Ale nie jest to wielka sprawa, bo wiem, , że można po prostu zwolnić nazwę 393 00:18:10,730 --> 00:18:15,750 i dom, choć technicznie, do jest super, super bezpieczne, powinien być 394 00:18:15,750 --> 00:18:17,890 robi jakiś błąd sprawdzenia tutaj. 395 00:18:17,890 --> 00:18:19,040 Co twój instynkt mówi ci? 396 00:18:19,040 --> 00:18:22,480 Co mam być sprawdzanie przed I uwolnić to, co jest 397 00:18:22,480 --> 00:18:25,470 ciąg, aka, które char *? 398 00:18:25,470 --> 00:18:33,460 >> Mam naprawdę być sprawdzenie, czy uczniowie Uchwyt i nazwa dot nie 399 00:18:33,460 --> 00:18:34,840 równa null. 400 00:18:34,840 --> 00:18:40,400 Wtedy to będzie OK, aby przejść dalej i za darmo , że wskaźnik, i takie same lub inne 401 00:18:40,400 --> 00:18:41,160 równie dobrze. 402 00:18:41,160 --> 00:18:46,860 Jeśli uczniowie wspornik i kropka dom nie jest równa wartości null, to teraz będą chronić 403 00:18:46,860 --> 00:18:52,520 w stosunku do przypadku, w którym rogu GetString zwraca coś null. 404 00:18:52,520 --> 00:18:57,310 I widzieliśmy przed chwilą, printf będzie chronią nas tu tylko, że 405 00:18:57,310 --> 00:18:58,990 null, która będzie wyglądać dziwnie. 406 00:18:58,990 --> 00:19:02,340 Ale przynajmniej nie będzie wysypać, jak już widzieliśmy. 407 00:19:02,340 --> 00:19:05,990 >> Cóż, pozwól mi zrobić jedną rzecz tutaj. structury-0 to rodzaj głupiego programu 408 00:19:05,990 --> 00:19:09,700 bo wprowadzić wszystkie te dane, a następnie to porażka po zakończeniu programu. 409 00:19:09,700 --> 00:19:10,940 Ale pozwól mi iść dalej i zrobić to. 410 00:19:10,940 --> 00:19:12,830 Pozwól, że terminal Okno nieco większe. 411 00:19:12,830 --> 00:19:17,000 Pozwól mi elemencie-1, które jest nowa wersja tego. 412 00:19:17,000 --> 00:19:18,520 >> Będę powiększyć trochę. 413 00:19:18,520 --> 00:19:21,620 A teraz pozwól mi uruchomić kropkę slash elemencie-1. 414 00:19:21,620 --> 00:19:22,590 Nazwa Studenta - 415 00:19:22,590 --> 00:19:31,500 David Mather, zróbmy Rob Kirkland, zróbmy Lauren Leverett. 416 00:19:31,500 --> 00:19:33,650 Co ciekawe, to uwaga - 417 00:19:33,650 --> 00:19:35,540 i wiem tylko to, ponieważ Napisałem program - 418 00:19:35,540 --> 00:19:38,930 Plik jest teraz na mój obecny katalog o nazwie students.csv. 419 00:19:38,930 --> 00:19:40,420 Niektórzy z was mogą nie widziałem te w realnym świecie. 420 00:19:40,420 --> 00:19:42,980 >> Co to jest plik CSV? 421 00:19:42,980 --> 00:19:44,170 Oddzielone przecinkami wartości. 422 00:19:44,170 --> 00:19:46,670 To trochę tak jak biednych wersja pliku Excel. 423 00:19:46,670 --> 00:19:50,580 To stół z wierszy i kolumn, które można otworzyć w programie, takich jak Excel, 424 00:19:50,580 --> 00:19:51,800 lub numerów na komputerze Mac. 425 00:19:51,800 --> 00:19:55,180 >> A jeśli mogę otworzyć ten plik tutaj na gedit, Ogłoszenie - i numery nie są. 426 00:19:55,180 --> 00:19:57,360 To tylko gedit mówi mnie numery linii. 427 00:19:57,360 --> 00:19:59,740 Zwróć uwagę na pierwszej linii tego plik jest David i Mather. 428 00:19:59,740 --> 00:20:01,450 Następna linia jest Rob przecinek Kirkland. 429 00:20:01,450 --> 00:20:04,170 I trzecia linia jest Lauren przecinek Leverett. 430 00:20:04,170 --> 00:20:05,480 >> Więc co ja stworzony? 431 00:20:05,480 --> 00:20:09,580 I już teraz napisany program w C, który skutecznie może generować arkusze kalkulacyjne 432 00:20:09,580 --> 00:20:11,840 które można otworzyć w program jak Excel. 433 00:20:11,840 --> 00:20:15,520 Nie wszystko, co atrakcyjne zestaw danych, ale jeśli masz dużo większe kawałki 434 00:20:15,520 --> 00:20:18,440 dane, które rzeczywiście chcą manipulowania i zrobić wykresy i 435 00:20:18,440 --> 00:20:21,260 podoba, jest to chyba jeden sposób tworzenia tych danych. 436 00:20:21,260 --> 00:20:25,370 Co więcej, pliki CSV są rzeczywiście bardzo powszechne tylko do przechowywania prostych danych - 437 00:20:25,370 --> 00:20:28,940 Yahoo Finance, na przykład, jeśli masz notowania akcji poprzez ich tzw 438 00:20:28,940 --> 00:20:33,180 API, bezpłatna usługa, która pozwala uzyskać aktualny up-to-aktualne akcji 439 00:20:33,180 --> 00:20:35,650 cytaty dla firm, ich przekazania tych danych w 440 00:20:35,650 --> 00:20:37,800 super prosty w formacie CSV. 441 00:20:37,800 --> 00:20:39,380 >> Więc jak to zrobić? 442 00:20:39,380 --> 00:20:42,530 Cóż zauważyć, większość z tego programu-tych prawie takie same. 443 00:20:42,530 --> 00:20:46,870 Jednak zauważyć tu, a nie do druku uczniom uwagę, na linii 35 444 00:20:46,870 --> 00:20:51,040 naprzód, I twierdzą, że mam oszczędności studentów na dysku, więc zapisanie pliku. 445 00:20:51,040 --> 00:20:53,630 >> Więc zauważyć jestem uznającej plikach * - 446 00:20:53,630 --> 00:20:57,260 teraz, jest to rodzaj anomalii w C. Z jakiegoś powodu, FILE to wszystkie czapki, 447 00:20:57,260 --> 00:21:00,690 co nie jest jak większość innych typów danych w C. Ale to jest wbudowany 448 00:21:00,690 --> 00:21:02,320 Typ danych, * FILE. 449 00:21:02,320 --> 00:21:05,900 A ja deklarując wskaźnik do pliku, jest to, jak można myśleć, że. 450 00:21:05,900 --> 00:21:08,070 >> fopen oznacza otwarty plik. 451 00:21:08,070 --> 00:21:09,470 Co plik chcesz otworzyć? 452 00:21:09,470 --> 00:21:12,620 Chcę otworzyć plik, który będę arbitralnie nazywają students.csv. 453 00:21:12,620 --> 00:21:14,480 Mogę nazwać to co zechcę. 454 00:21:14,480 --> 00:21:15,200 >> A potem zgadywać. 455 00:21:15,200 --> 00:21:18,960 Co robi drugi argument do fopen prawdopodobnie na myśli? 456 00:21:18,960 --> 00:21:21,480 Prawo, w do zapisu, może być r do odczytu. 457 00:21:21,480 --> 00:21:24,120 Jest dla dołączania jeśli Aby dodać wiersze, a nie 458 00:21:24,120 --> 00:21:25,200 nadpisać całość. 459 00:21:25,200 --> 00:21:28,005 >> Ale ja po prostu chcę, aby utworzyć ten plik raz, więc użyję cytatu cytatu w. 460 00:21:28,005 --> 00:21:31,880 I wiem, że tylko od odczytu po dokumentacja, lub strona man. 461 00:21:31,880 --> 00:21:35,100 Jeśli plik nie jest zerowy - innymi słowy, jeśli nic się nie udało tam - 462 00:21:35,100 --> 00:21:37,820 pozwól mi iteracji studenci od 0 do 3. 463 00:21:37,820 --> 00:21:40,410 >> A teraz zauważył, że coś bardzo nieznacznie różni 464 00:21:40,410 --> 00:21:42,110 o linii 41 tutaj. 465 00:21:42,110 --> 00:21:42,960 To nie jest printf. 466 00:21:42,960 --> 00:21:46,530 To fprintf do pliku printf. 467 00:21:46,530 --> 00:21:47,790 Tak to się zapisać do pliku. 468 00:21:47,790 --> 00:21:48,860 Który plik? 469 00:21:48,860 --> 00:21:53,630 Jeden, którego wskaźnik określić jako pierwszy argument. 470 00:21:53,630 --> 00:21:55,940 >> Następnie określić ciąg formatu. 471 00:21:55,940 --> 00:21:59,660 Następnie określamy, co chcemy, aby ciąg wtyczka w pierwszy s procent, a 472 00:21:59,660 --> 00:22:04,320 następnie innej zmiennej lub sekunda s proc. 473 00:22:04,320 --> 00:22:06,760 Następnie zamykamy plik z fclose. 474 00:22:06,760 --> 00:22:09,380 Niż I uwolnić pamięć jak wcześniej, choć Powinienem wrócić i dodać 475 00:22:09,380 --> 00:22:10,540 niektóre sprawdza null. 476 00:22:10,540 --> 00:22:12,090 >> I to jest to. 477 00:22:12,090 --> 00:22:16,960 fopen, fprintf, fclose daje mi Zdolność do tworzenia plików tekstowych. 478 00:22:16,960 --> 00:22:19,640 Teraz zobaczysz w zestawie problemu pięciu, która obejmuje obrazy, będziesz używać 479 00:22:19,640 --> 00:22:20,990 pliki binarne zamiast. 480 00:22:20,990 --> 00:22:24,200 Ale zasadniczo chodzi o to samo, mimo poprawnego będziesz 481 00:22:24,200 --> 00:22:28,710 zobaczyć to trochę inaczej. 482 00:22:28,710 --> 00:22:32,580 >> Więc wycieczka wicher, ale dostaniesz zbyt zaznajomieni z pliku I/O-- 483 00:22:32,580 --> 00:22:34,960 wejście i wyjście - z Pset pięć. 484 00:22:34,960 --> 00:22:38,607 A wszelkie pytania dotyczące Początkowe podstawy tutaj? 485 00:22:38,607 --> 00:22:39,857 Tak? 486 00:22:39,857 --> 00:22:41,880 487 00:22:41,880 --> 00:22:43,710 >> Co jeśli spróbujesz uwolnić wartość null? 488 00:22:43,710 --> 00:22:48,880 Wierzę, chyba wolne ma zdobyć trochę bardziej przyjazny dla użytkownika, można 489 00:22:48,880 --> 00:22:49,890 potencjalnie wysypać. 490 00:22:49,890 --> 00:22:54,160 Podanie to wartość null jest złe, bo nie mam uwierzyć darmo przeszkadza, by sprawdzić dla was, 491 00:22:54,160 --> 00:22:57,330 bo to potencjalnie odpady czasu na to, aby zrobić się na 492 00:22:57,330 --> 00:22:59,022 każdy na świecie. 493 00:22:59,022 --> 00:23:00,590 Dobre pytanie, choć. 494 00:23:00,590 --> 00:23:04,300 >> W porządku, więc tego rodzaju ma nam ciekawy temat. 495 00:23:04,300 --> 00:23:07,010 Tematem zbioru problemowego pięć jest kryminalistyki. 496 00:23:07,010 --> 00:23:08,420 Przynajmniej to jest część zestawu problemów. 497 00:23:08,420 --> 00:23:12,030 Forensics ogólnie odnosi się do odzyskiwanie informacji, które mogą, 498 00:23:12,030 --> 00:23:14,110 może nie zostały usunięte celowo. 499 00:23:14,110 --> 00:23:18,680 I tak myślałem, że daje szybkie Smak tego, co naprawdę dzieje się wszystko 500 00:23:18,680 --> 00:23:21,230 tym razem pod kaptur z komputera. 501 00:23:21,230 --> 00:23:23,960 >> Na przykład, jeśli masz w środku waszego laptop lub komputer stacjonarny 502 00:23:23,960 --> 00:23:28,040 dysk twardy, to albo mechaniczne Urządzenie, które w rzeczywistości kręci - 503 00:23:28,040 --> 00:23:31,650 jest okrągłe rzeczy zwane talerze , które wyglądają zupełnie jak co 504 00:23:31,650 --> 00:23:34,540 właśnie miałem na ekranie tutaj, choć to jest coraz bardziej stara szkoła. 505 00:23:34,540 --> 00:23:37,370 To jest trzy i pół cala dysk twardy. 506 00:23:37,370 --> 00:23:40,070 I trzy i pół cala nawiązuje z się z rzeczy, gdy go zainstalować 507 00:23:40,070 --> 00:23:40,890 w komputerze. 508 00:23:40,890 --> 00:23:44,890 >> Wielu z Was w swoich laptopach teraz mają dyski półprzewodnikowe lub SSD, 509 00:23:44,890 --> 00:23:46,260 które nie mają ruchomych części. 510 00:23:46,260 --> 00:23:49,170 Są bardziej jak pamięci RAM i mniej jak Te urządzenia mechaniczne. 511 00:23:49,170 --> 00:23:51,450 Ale idee są wciąż takie same, z pewnością odnoszą się one 512 00:23:51,450 --> 00:23:52,790 do problemu ustawić pięć. 513 00:23:52,790 --> 00:23:57,400 >> A jeśli myślisz o teraz dysk twardy reprezentuje jako koło, które 514 00:23:57,400 --> 00:23:58,930 Będę rysować jak to tutaj. 515 00:23:58,930 --> 00:24:02,290 Podczas tworzenia pliku na komputerze, czy to SSD, lub w 516 00:24:02,290 --> 00:24:06,610 W tym przypadku starszy szkoła dysk twardy, że plik zawiera wiele bitów. 517 00:24:06,610 --> 00:24:10,510 Powiedzmy, że jest to 0 i 1, cała masa 0s i 1s. 518 00:24:10,510 --> 00:24:11,660 Więc to jest mój cały dysk twardy. 519 00:24:11,660 --> 00:24:13,225 To jest podobno dość duży plik. 520 00:24:13,225 --> 00:24:18,080 I korzysta się 0s i 1s na które część fizycznej płyty. 521 00:24:18,080 --> 00:24:19,750 >> Cóż, to, co jest, że fizyczna część? 522 00:24:19,750 --> 00:24:25,310 Cóż, okazuje się, że na dysku twardym, przynajmniej tego typu, jest 523 00:24:25,310 --> 00:24:27,340 te maleńkie cząstki magnetyczne. 524 00:24:27,340 --> 00:24:32,630 I oni mają zasadniczo na północ i południe, słupy do nich tak, że jeśli 525 00:24:32,630 --> 00:24:35,710 skręcić w jedną z tych cząstek magnetycznych w ten sposób, można powiedzieć, że jest to 526 00:24:35,710 --> 00:24:36,720 stanowi 1. 527 00:24:36,720 --> 00:24:39,340 A jeśli to jest do góry nogami, na południe do na północ, można powiedzieć, że jest to 528 00:24:39,340 --> 00:24:40,390 co stanowi 0. 529 00:24:40,390 --> 00:24:43,660 >> Tak więc w rzeczywistym świecie fizycznym, to jak można przedstawiać coś w 530 00:24:43,660 --> 00:24:45,670 Stan binarny z 0 i 1. 531 00:24:45,670 --> 00:24:46,720 Więc to wszystko pliku. 532 00:24:46,720 --> 00:24:49,300 Jest cała masa magnetyczna cząstki, które są w ten sposób lub ich 533 00:24:49,300 --> 00:24:51,920 W ten sposób stanie tworzenia od 0s i 1s. 534 00:24:51,920 --> 00:24:56,760 >> Ale okazuje się, po zapisaniu pliku, niektóre informacje są zapisywane osobno. 535 00:24:56,760 --> 00:25:00,000 Więc to jest mały stolik, katalog, że tak powiem. 536 00:25:00,000 --> 00:25:05,810 A ja nazwać nazwę kolumny, a Zadzwonię do tej lokalizacji kolumny. 537 00:25:05,810 --> 00:25:08,850 >> A ja powiem, przypuszczam to jest mój życiorys. 538 00:25:08,850 --> 00:25:14,050 Mój resume.doc jest przechowywany w lokalizacja, powiedzmy 123. 539 00:25:14,050 --> 00:25:15,390 I zawsze iść do tej liczby. 540 00:25:15,390 --> 00:25:18,810 Ale wystarczy powiedzieć, że tak jak w pamięci RAM, można wziąć dysk twardy 541 00:25:18,810 --> 00:25:22,350 to gigabyte lub 200 GB lub terabajt, i można 542 00:25:22,350 --> 00:25:23,750 liczba wszystkich bajtów. 543 00:25:23,750 --> 00:25:26,480 Można policzyć wszystkie kawałki 8 bitów. 544 00:25:26,480 --> 00:25:29,030 >> Będziemy więc powiedzieć, że ten jest 123 miejsce. 545 00:25:29,030 --> 00:25:32,070 Więc to wewnątrz katalogu mojej pracy System pamięta, że ​​my 546 00:25:32,070 --> 00:25:34,250 CV jest na miejscu 123. 547 00:25:34,250 --> 00:25:36,850 Ale robi się ciekawie, gdy można usunąć plik. 548 00:25:36,850 --> 00:25:37,820 >> Tak na przykład - 549 00:25:37,820 --> 00:25:40,790 i na szczęście, większość świata ma złapany na to - to, co się dzieje, gdy 550 00:25:40,790 --> 00:25:45,040 przeciągnij plik do Kosza systemu Mac OS czy Twój system Windows Kosz? 551 00:25:45,040 --> 00:25:48,290 552 00:25:48,290 --> 00:25:50,510 Co jest celem robi? 553 00:25:50,510 --> 00:25:53,860 To oczywiście pozbyć się pliku, ale co to akt przeciąganie i 554 00:25:53,860 --> 00:25:57,550 spada do kosza lub twój Recycle Bin zrobić na komputerze? 555 00:25:57,550 --> 00:25:59,230 >> Absolutnie nic, naprawdę. 556 00:25:59,230 --> 00:26:00,320 To tak, jak w folderze. 557 00:26:00,320 --> 00:26:01,800 Jest specjalnym folderze, aby się upewnić. 558 00:26:01,800 --> 00:26:04,460 Ale czy to faktycznie usunąć plik? 559 00:26:04,460 --> 00:26:06,780 >> No, no, bo niektórzy z was zapewne były podobne, oh cholera, ty nie 560 00:26:06,780 --> 00:26:07,420 tego zrobić. 561 00:26:07,420 --> 00:26:09,130 Więc kliknij dwukrotnie Trash lub Kosz. 562 00:26:09,130 --> 00:26:11,630 Masz grzebali i masz odzyskane plik po prostu przeciągając je 563 00:26:11,630 --> 00:26:12,110 stamtąd. 564 00:26:12,110 --> 00:26:14,420 Tak wyraźnie, że to nie koniecznie usunięcie go. 565 00:26:14,420 --> 00:26:15,990 >> OK, jesteś mądrzejsza. 566 00:26:15,990 --> 00:26:18,860 Wiesz, że po prostu przeciągając go do Recycle Bin Trash lub nie oznacza 567 00:26:18,860 --> 00:26:19,930 jesteś opróżniania kosza. 568 00:26:19,930 --> 00:26:24,110 Więc idź do menu, a ty mówisz, Empty Trash lub Opróżnij Kosz. 569 00:26:24,110 --> 00:26:25,360 Więc co się dzieje? 570 00:26:25,360 --> 00:26:29,070 571 00:26:29,070 --> 00:26:32,530 >> Tak, tak, to jest usuwany bardziej. 572 00:26:32,530 --> 00:26:37,660 Ale wszystko, co się dzieje, jest to. 573 00:26:37,660 --> 00:26:45,350 Komputer zapomina, gdzie resume.doc było. 574 00:26:45,350 --> 00:26:47,400 >> Ale to, co pozornie nie zmieniło na zdjęciu? 575 00:26:47,400 --> 00:26:51,390 576 00:26:51,390 --> 00:26:55,570 Bity, 0s i 1s, że zastrzeżenia są na miejscu jakiegoś fizycznego aspektu 577 00:26:55,570 --> 00:26:56,280 hardware. 578 00:26:56,280 --> 00:26:57,110 Są tam jeszcze. 579 00:26:57,110 --> 00:26:58,930 To jest po prostu komputer ma zapomniał, czym one są. 580 00:26:58,930 --> 00:27:03,160 >> Więc to w zasadzie zwolniona file-tych bitów tak, że mogą być ponownie wykorzystane. 581 00:27:03,160 --> 00:27:06,940 Ale nie aż do tworzenia nowych plików, i więcej plików, a pliki będą 582 00:27:06,940 --> 00:27:12,150 probabilistycznie, te 0s i 1s, te cząstki magnetyczne, ponownie wykorzystane, 583 00:27:12,150 --> 00:27:16,220 upside lub prawej strony w górę, na innych plików, 0s i 1s. 584 00:27:16,220 --> 00:27:17,980 >> Więc trzeba to okno czasu. 585 00:27:17,980 --> 00:27:19,860 I to nie z przewidywalnym Długość, naprawdę. 586 00:27:19,860 --> 00:27:22,240 To zależy od wielkości dysku twardego, jazdy i ile masz i plików 587 00:27:22,240 --> 00:27:23,490 jak szybko zrobić nowe. 588 00:27:23,490 --> 00:27:27,050 Ale jest to okno, w czasie którym plik jest nadal doskonale 589 00:27:27,050 --> 00:27:27,770 zwrotowi. 590 00:27:27,770 --> 00:27:31,050 >> Więc jeśli kiedykolwiek korzystać z programów takich jak McAfee lub Norton, aby spróbować odzyskać 591 00:27:31,050 --> 00:27:35,680 dane, wszystko robią próbuje odzyskać to tzw katalog na 592 00:27:35,680 --> 00:27:37,340 dowiedzieć się, gdzie plik był. 593 00:27:37,340 --> 00:27:40,605 A czasami Norton i powie, plik jest 93% do odzysku. 594 00:27:40,605 --> 00:27:42,020 No, co to oznacza? 595 00:27:42,020 --> 00:27:45,690 To po prostu oznacza, że ​​jakiś inny plik przypadkowo skończyło się, powiedzmy, 596 00:27:45,690 --> 00:27:48,920 te kawałki ze swojego oryginalnego pliku. 597 00:27:48,920 --> 00:27:51,950 >> Więc co jest faktycznie zaangażowany odzyskiwanie danych? 598 00:27:51,950 --> 00:27:55,720 Cóż, jeśli nie ma czegoś takiego Norton wstępnie zainstalowany na komputerze, 599 00:27:55,720 --> 00:27:59,510 Najlepsze co możesz zrobić, to patrzeć czasem na cały dysk twardy szukać 600 00:27:59,510 --> 00:28:00,510 wzory bitów. 601 00:28:00,510 --> 00:28:05,350 I jeden z tematów zestaw problemów pięć jest to, że można sprawdzić 602 00:28:05,350 --> 00:28:09,570 odpowiednik dysku twardego, forensic Obraz Compact Flash Card od 603 00:28:09,570 --> 00:28:13,660 aparat cyfrowy, szukając 0s i 1s, że zazwyczaj, z wysokiej 604 00:28:13,660 --> 00:28:16,720 Prawdopodobieństwo, reprezentują początek obraz JPEG. 605 00:28:16,720 --> 00:28:21,120 >> A wy może odzyskać te obrazy, zakładając, gdy widzę ten wzór 606 00:28:21,120 --> 00:28:24,380 bitów na obraz, z sądowej wysokie prawdopodobieństwo, że znaki 607 00:28:24,380 --> 00:28:25,650 początek JPEG. 608 00:28:25,650 --> 00:28:29,520 A jeśli widzę ten sam wzór ponownie, że prawdopodobnie oznacza początek 609 00:28:29,520 --> 00:28:32,440 kolejny JPEG, a drugi JPEG, a inny JPEG. 610 00:28:32,440 --> 00:28:34,970 I to jest, jak zwykle odzyskiwanie danych będzie działać. 611 00:28:34,970 --> 00:28:37,870 Co jest ładne o JPEG jest nawet Format pliku sam w sobie jest nieco 612 00:28:37,870 --> 00:28:44,400 złożone, początek każdy taki plik jest rzeczywiście dość rozpoznawalne 613 00:28:44,400 --> 00:28:47,370 i proste, jak widać, jeśli nie już. 614 00:28:47,370 --> 00:28:50,270 >> Warto więc przyjrzeć się bliżej pod spodem kaptur, aby dokładnie to, co było 615 00:28:50,270 --> 00:28:53,360 dzieje i co to 0s i 1s to, aby dać trochę więcej 616 00:28:53,360 --> 00:28:55,330 kontekst dla tego konkretnego zadania. 617 00:28:55,330 --> 00:28:55,510 >> [PLAYBACK VIDEO] 618 00:28:55,510 --> 00:28:58,700 >> -Jeżeli komputer przechowuje najbardziej swoich stałych danych. 619 00:28:58,700 --> 00:29:03,390 Aby to zrobić, dane podróżuje z RAM wraz z sygnałami oprogramowania, które mówią 620 00:29:03,390 --> 00:29:06,110 dysk twardy, jak przechowywać te dane. 621 00:29:06,110 --> 00:29:09,410 Układy napędowe twarde tłumaczyć te sygnały do ​​napięcia 622 00:29:09,410 --> 00:29:10,870 wahania. 623 00:29:10,870 --> 00:29:14,970 To, z kolei, sterowanie dysku twardego ruchomych części, niektóre z niewielu 624 00:29:14,970 --> 00:29:17,910 ruchomych części pozostawione w nowoczesny komputer. 625 00:29:17,910 --> 00:29:22,130 >> Niektóre z tych sygnałów steruje silnikiem który obraca talerze pokryte metalem. 626 00:29:22,130 --> 00:29:25,470 Twoje dane są właściwie przechowywane na tych talerzach. 627 00:29:25,470 --> 00:29:28,610 Inne sygnały przejść do odczytu / zapisu głowice do odczytu lub 628 00:29:28,610 --> 00:29:30,710 zapisu danych na talerzach. 629 00:29:30,710 --> 00:29:35,450 To maszyny tak precyzyjne, że człowiek włosy nie może nawet przejść między 630 00:29:35,450 --> 00:29:37,280 głowice i talerze wirujące. 631 00:29:37,280 --> 00:29:40,316 A jednak, to wszystko działa na wspaniałe prędkościach. 632 00:29:40,316 --> 00:29:40,660 >> [END PLAYBACK VIDEO] 633 00:29:40,660 --> 00:29:42,190 >> DAVID MALAN: Zoom in little głębiej teraz na to, co 634 00:29:42,190 --> 00:29:44,360 faktycznie na tych talerzach. 635 00:29:44,360 --> 00:29:44,720 >> [PLAYBACK VIDEO] 636 00:29:44,720 --> 00:29:47,660 >> -Spójrzmy na to, co tylko widział w zwolnionym tempie. 637 00:29:47,660 --> 00:29:51,710 Po krótki impuls elektryczny jest wysyłane do głowicy odczytu / zapisu, gdy odwraca 638 00:29:51,710 --> 00:29:54,650 na małej elektromagnetycznych dla ułamek sekundy. 639 00:29:54,650 --> 00:29:58,970 Magnes wytwarza pole, które zmiany polaryzacji z tiny, tiny 640 00:29:58,970 --> 00:30:02,850 Część cząstek metalu, które płaszcz każdej powierzchni talerza. 641 00:30:02,850 --> 00:30:05,940 >> Wzór seria z nich małe, opłata-up obszary na dysku 642 00:30:05,940 --> 00:30:08,470 oznacza jeden bit Dane na liczbę binarną 643 00:30:08,470 --> 00:30:10,530 System używany przez komputery. 644 00:30:10,530 --> 00:30:13,775 Teraz, gdy prąd jest przesyłany w jedną stronę przez głowicę odczytu / zapisu, obszar 645 00:30:13,775 --> 00:30:15,970 jest spolaryzowane w jednym kierunku. 646 00:30:15,970 --> 00:30:17,950 Jeśli prąd jest przesyłany w przeciwnym kierunku, 647 00:30:17,950 --> 00:30:19,930 polaryzacja jest odwrotna. 648 00:30:19,930 --> 00:30:22,370 >> Jak uzyskać dane z dysku twardego? 649 00:30:22,370 --> 00:30:24,090 Wystarczy odwrócić proces. 650 00:30:24,090 --> 00:30:26,550 Więc to cząstki na dysku że dostać prąd 651 00:30:26,550 --> 00:30:27,960 głowicy odczytu / zapisu ruchu. 652 00:30:27,960 --> 00:30:30,700 Ułożyła miliony nich Segmenty i namagnesowane 653 00:30:30,700 --> 00:30:32,160 masz plik. 654 00:30:32,160 --> 00:30:36,060 >> Teraz kawałki jednego pliku może być rozrzucone po całym dysku-tych 655 00:30:36,060 --> 00:30:39,970 talerze, trochę jak bałagan z papierami na biurku. 656 00:30:39,970 --> 00:30:43,500 Więc specjalny dodatkowy plik śledzi , gdzie wszystko jest. 657 00:30:43,500 --> 00:30:45,985 Czy nie chciałbyś mieć coś takiego? 658 00:30:45,985 --> 00:30:46,470 >> [END PLAYBACK VIDEO] 659 00:30:46,470 --> 00:30:47,820 >> DAVID MALAN: OK, chyba nie. 660 00:30:47,820 --> 00:30:52,070 Tak jak wielu z was Wychowałem się z nich? 661 00:30:52,070 --> 00:30:53,970 OK, więc to jest coraz mniej ręce każdego roku. 662 00:30:53,970 --> 00:30:56,550 Ale cieszę się, że jesteś co najmniej zaznajomiony z nimi, bo to i nasza 663 00:30:56,550 --> 00:31:00,520 demo książki, niestety, umierają bardzo powolną śmierć tu znajomości. 664 00:31:00,520 --> 00:31:04,010 >> Ale to jest to, co ja, co najmniej, z powrotem w liceum, używane wykorzystanie do tworzenia kopii zapasowych. 665 00:31:04,010 --> 00:31:08,110 I to było niesamowite, bo może przechowywać 1,4 megabajtów na 666 00:31:08,110 --> 00:31:08,930 ten konkretny dysk. 667 00:31:08,930 --> 00:31:12,260 A było to wersja wysoka gęstość, jak pokazano na HD, który ma 668 00:31:12,260 --> 00:31:14,240 czyli przed dzisiejszych filmów HD. 669 00:31:14,240 --> 00:31:16,400 >> Średnia gęstość 800 kilobajtów. 670 00:31:16,400 --> 00:31:18,640 A wcześniej, nie było 400 kilobajtów dyski. 671 00:31:18,640 --> 00:31:23,120 A wcześniej, było 5 i 1/4 calowe dyski, które były naprawdę floppy, 672 00:31:23,120 --> 00:31:25,680 i nieco szerszy i wyższy niż tych rzeczy tutaj. 673 00:31:25,680 --> 00:31:29,150 Ale rzeczywiście można zobaczyć tzw floppy aspektem tych dyskach. 674 00:31:29,150 --> 00:31:32,630 >> I funkcjonalnie, są rzeczywiście bardzo podobne do dysków twardych o co 675 00:31:32,630 --> 00:31:33,570 najmniej tego typu. 676 00:31:33,570 --> 00:31:37,270 Ponownie, dyski SSD w nowszych komputerach działa trochę inaczej. 677 00:31:37,270 --> 00:31:41,530 Jeśli jednak przenieść ten mały metalowy zaczep, rzeczywiście można zobaczyć trochę cookie, 678 00:31:41,530 --> 00:31:42,560 lub tacy. 679 00:31:42,560 --> 00:31:43,830 >> To nie jest metalem jak ten. 680 00:31:43,830 --> 00:31:46,000 Ten jest rzeczywiście trochę tańsze tworzywo sztuczne. 681 00:31:46,000 --> 00:31:46,750 I można trochę poruszać nim. 682 00:31:46,750 --> 00:31:50,310 A ty trully tylko zetrzeć niektóre Ilość bitów lub cząstek magnetycznych 683 00:31:50,310 --> 00:31:51,220 z tego dysku. 684 00:31:51,220 --> 00:31:52,710 >> Więc na szczęście, nie ma nic na jej temat. 685 00:31:52,710 --> 00:31:55,790 Jeśli to, co znajduje się na drodze - a pokrycie oczy i te z sąsiadem - 686 00:31:55,790 --> 00:31:58,865 można po prostu rodzaj ciągnąć tego Cały off osłona tak. 687 00:31:58,865 --> 00:32:01,900 Ale jest trochę wiosny, więc być świadomi, że na własne oczy. 688 00:32:01,900 --> 00:32:03,620 Więc teraz trzeba rzetelnie dyskietkę. 689 00:32:03,620 --> 00:32:07,090 >> I co o tym niezwykłym jest to, że w tak samo, jak to jest 690 00:32:07,090 --> 00:32:10,830 małą skalę reprezentacja większe dysk twardy, te rzeczy są super, 691 00:32:10,830 --> 00:32:11,590 super proste. 692 00:32:11,590 --> 00:32:15,170 Jeśli szczypta dno to, że teraz że rzeczą metalu jest off, i skórki 693 00:32:15,170 --> 00:32:20,990 je otwarte, wszystko jest to dwa kawałki filcu i tzw Dyskietka 694 00:32:20,990 --> 00:32:22,930 z kawałkiem metalu w środku. 695 00:32:22,930 --> 00:32:25,990 >> I tam jest połowa Treść mojego dysku. 696 00:32:25,990 --> 00:32:27,540 Tam idzie kolejny połowa z nich. 697 00:32:27,540 --> 00:32:31,375 Ale to wszystko, co było w środku przędzenia komputera w przeszłości. 698 00:32:31,375 --> 00:32:35,220 699 00:32:35,220 --> 00:32:38,310 >> I znowu, aby umieścić to w perspektywie, jak duży jest większość swojego 700 00:32:38,310 --> 00:32:39,560 Dyski twarde w tych dniach? 701 00:32:39,560 --> 00:32:41,960 702 00:32:41,960 --> 00:32:46,230 500 GB, terabajt, może w Komputer stacjonarny, 2 TB, 3 703 00:32:46,230 --> 00:32:47,630 TB, 4 terabajty, prawda? 704 00:32:47,630 --> 00:32:52,480 Jest to jeden megabajt, lub dać, których nie można nawet zmieścić typowy MP3 705 00:32:52,480 --> 00:32:55,310 anymore te dni, lub kilka Podobny plik muzyczny. 706 00:32:55,310 --> 00:32:59,500 >> Więc trochę pamiątka dla Ciebie dzisiaj i także pomóc contextualize co 707 00:32:59,500 --> 00:33:03,570 będziemy brać za pewnik teraz problemu ustawić pięć. 708 00:33:03,570 --> 00:33:04,820 To są twoje utrzymanie. 709 00:33:04,820 --> 00:33:07,340 710 00:33:07,340 --> 00:33:13,370 Więc pozwól mi przejście do miejsca, gdzie będzie wydając kolejną PSET również. 711 00:33:13,370 --> 00:33:18,470 Więc my teraz ustawić aktualizacja - oh, Kilka ogłoszeń szybko. 712 00:33:18,470 --> 00:33:21,730 >> W ten piątek, jeśli chciałbyś dołączyć CS50 na obiad, pójść do zwykłego miejsca, 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp. 714 00:33:23,610 --> 00:33:25,100 I ostateczny projekt - 715 00:33:25,100 --> 00:33:28,520 tak na programie nauczania, jakie zamieścił ostateczna specyfikacja projektu już. 716 00:33:28,520 --> 00:33:31,410 Sobie sprawę, że to nie oznacza, to z powodu szczególnie szybko. 717 00:33:31,410 --> 00:33:33,990 To pisał, naprawdę, tak aby uzyskać wy o tym myśleć. 718 00:33:33,990 --> 00:33:37,620 I rzeczywiście, bardzo istotne procent z was będą walki 719 00:33:37,620 --> 00:33:40,780 Ostateczne projekty dotyczące materiału, który możemy nawet nie dostał się w klasie, 720 00:33:40,780 --> 00:33:42,730 ale będzie już w przyszłym tygodniu. 721 00:33:42,730 --> 00:33:45,530 >> Zauważmy jednak, że specyfikacja wymaga kilka różnych składników 722 00:33:45,530 --> 00:33:46,190 projekt końcowy. 723 00:33:46,190 --> 00:33:49,590 Najpierw, w ciągu kilku tygodni, jest pre-propozycja, dość przypadkowy adres: 724 00:33:49,590 --> 00:33:52,760 Twój TF mu powiedzieć lub co masz myśląc o dla twojego projektu, z 725 00:33:52,760 --> 00:33:53,650 bez zobowiązań. 726 00:33:53,650 --> 00:33:56,710 Wniosek będzie Twój szczególności zaangażowanie, mówiąc o, to co 727 00:33:56,710 --> 00:33:57,770 Chciałbym zrobić dla mojego projektu. 728 00:33:57,770 --> 00:33:58,250 Co o tym sądzisz? 729 00:33:58,250 --> 00:33:58,650 Zbyt duże? 730 00:33:58,650 --> 00:33:59,145 Zbyt małe? 731 00:33:59,145 --> 00:34:00,330 Czy to jest do opanowania? 732 00:34:00,330 --> 00:34:02,230 I widzisz spec więcej szczegółów. 733 00:34:02,230 --> 00:34:05,060 >> Kilka tygodni po tym, że jest stan Raport, który jest podobnie 734 00:34:05,060 --> 00:34:08,260 dorywczo email do TF powiedzieć, jak daleko w tyle jesteś w final 735 00:34:08,260 --> 00:34:12,360 Realizacja projektu, a następnie CS50 hackathon do którego każdy 736 00:34:12,360 --> 00:34:17,520 jest zaproszenie, które będzie wydarzeniem z 20:00 na jeden wieczór aż do 07:00 737 00:34:17,520 --> 00:34:19,150 Rano następnego dnia rano. 738 00:34:19,150 --> 00:34:22,560 Pizza, a może już wspomniałem w tygodniu zero, wil być serwowane w 21:00, 739 00:34:22,560 --> 00:34:24,120 Chińskie jedzenie na 01:00. 740 00:34:24,120 --> 00:34:27,929 A jeśli nadal nie śpisz na 05:00, weźmiemy cię do IHOP na śniadanie. 741 00:34:27,929 --> 00:34:31,310 >> Tak hackathon jest jednym z bardziej pamiętnych doświadczeń w klasie. 742 00:34:31,310 --> 00:34:35,290 Wtedy realizacja wynika, i następnie szczytowy CS50 Fair. 743 00:34:35,290 --> 00:34:38,070 Więcej szczegółów na temat wszystkich tych w najbliższych tygodniach. 744 00:34:38,070 --> 00:34:40,739 >> Ale wróćmy do czegoś old school - 745 00:34:40,739 --> 00:34:41,920 ponownie, array. 746 00:34:41,920 --> 00:34:45,040 Więc tablica była miła, bo to rozwiązuje problemy jak widzieliśmy tylko 747 00:34:45,040 --> 00:34:49,290 chwilą ze struktur studenckich się nieco spod kontroli, jeśli 748 00:34:49,290 --> 00:34:52,405 chcą mieć jeden, student studentowi dwa, Student trzy, student dot dot dot, 749 00:34:52,405 --> 00:34:54,400 niektóre arbitralne liczba studentów. 750 00:34:54,400 --> 00:34:58,850 >> Więc tablic, kilka tygodni temu, spadały w i rozwiązać wszystkie nasze problemy z nie 751 00:34:58,850 --> 00:35:03,340 wiedząc z góry, jak wiele rzeczy jakiegoś rodzaju może chcemy. 752 00:35:03,340 --> 00:35:07,390 I widzieliśmy, że elemencie może nam pomóc ponadto zorganizować naszego kodu i zachować 753 00:35:07,390 --> 00:35:11,660 koncepcyjnie podobnych zmiennych, takich jak imię i dom, razem, tak że 754 00:35:11,660 --> 00:35:15,570 Można traktować je jako jedną całość, wewnątrz których istnieje mniejsze kawałki. 755 00:35:15,570 --> 00:35:17,810 >> Ale tablice mają pewne wady. 756 00:35:17,810 --> 00:35:19,780 Jakie są wady ale wystąpił 757 00:35:19,780 --> 00:35:22,320 z tablicami do tej pory? 758 00:35:22,320 --> 00:35:23,450 Co to jest? 759 00:35:23,450 --> 00:35:28,130 Stały rozmiar - tak, nawet jeśli może być w stanie przydzielić pamięci dla 760 00:35:28,130 --> 00:35:32,310 array, gdy wiesz, ilu uczniów masz, ile znaków trzeba 761 00:35:32,310 --> 00:35:35,460 od użytkownika, kiedy już przyznane array, ty niby malowane 762 00:35:35,460 --> 00:35:36,740 się w rogu. 763 00:35:36,740 --> 00:35:40,600 >> Ponieważ nie można wstawić nowe elementy w środku tablicy. 764 00:35:40,600 --> 00:35:43,660 Nie można wstawić więcej elementów na koniec tablicy. 765 00:35:43,660 --> 00:35:47,750 Naprawdę, trzeba uciekać się do stworzenia Cała nowa tablica, jak już wspomniano, 766 00:35:47,750 --> 00:35:49,320 kopiowanie starych do nowych. 767 00:35:49,320 --> 00:35:52,610 I znowu, że jest ból głowy GetString oferty ze dla Ciebie. 768 00:35:52,610 --> 00:35:56,170 >> Ale znowu, nie można nawet włożyć coś w środku tablicy 769 00:35:56,170 --> 00:35:58,200 jeśli stawka nie jest całkowicie wypełniona. 770 00:35:58,200 --> 00:36:03,010 Na przykład, jeśli ta tablica o wielkości sześć ma tylko pięć rzeczy w nim, 771 00:36:03,010 --> 00:36:06,080 Cóż, może po prostu tack coś na koniec. 772 00:36:06,080 --> 00:36:08,200 Ale co jeśli chcesz wstawić coś w środku 773 00:36:08,200 --> 00:36:11,280 array, chociaż może to mieć pięć z sześciu rzeczy w nim? 774 00:36:11,280 --> 00:36:14,250 >> No i co zrobić, gdy mieliśmy wszystko naszych ochotników na scenie w 775 00:36:14,250 --> 00:36:15,110 tydzień przeszłości? 776 00:36:15,110 --> 00:36:18,710 Jeśli chcemy, aby umieścić tu kogoś, albo ci ludzie, jak przenieść ten 777 00:36:18,710 --> 00:36:22,540 sposób, lub te osoby, jak przenieść ten sposób, i które się kosztowne. 778 00:36:22,540 --> 00:36:26,950 Przemieszczanie się ludzi wewnątrz array skończył sumowaniu i kosztów 779 00:36:26,950 --> 00:36:31,240 nam czas, a więc dużo nasz n do kwadratu czasy działania jak sortowanie wstawiania do 780 00:36:31,240 --> 00:36:32,550 Przykładowo, w najgorszym przypadku. 781 00:36:32,550 --> 00:36:36,520 Więc tablice są świetne, ale trzeba z góry wiedzieć, jak duży chcesz. 782 00:36:36,520 --> 00:36:38,030 >> Więc OK, tu jest rozwiązanie. 783 00:36:38,030 --> 00:36:43,860 Jeśli nie wiesz z góry, ile studentów może mam i wiem, że raz 784 00:36:43,860 --> 00:36:47,870 I zdecydować, choć utknąłem z tym wielu studentów, dlaczego nie mogę po prostu zawsze 785 00:36:47,870 --> 00:36:51,740 przeznaczyć dwa razy więcej przestrzeni jak można myślę, że potrzebuję? 786 00:36:51,740 --> 00:36:54,450 Czy nie jest to rozsądne rozwiązanie? 787 00:36:54,450 --> 00:36:58,240 >> Realistycznie, nie sądzę, że jesteśmy będzie potrzebował więcej niż 50 gniazd 788 00:36:58,240 --> 00:37:02,190 w tablicy dla średniej wielkości klas, więc po prostu zaokrąglić w górę. 789 00:37:02,190 --> 00:37:07,040 Zrobię 100 gniazd w mojej tablicy, po prostu tak, że możemy na pewno się 790 00:37:07,040 --> 00:37:10,330 Liczba studentów I spodziewać się być w jakimś średniej wielkości klasy. 791 00:37:10,330 --> 00:37:14,320 Więc dlaczego nie po prostu zaokrąglić w górę i przeznaczyć więcej pamięci, zazwyczaj, na tablicy 792 00:37:14,320 --> 00:37:16,290 niż myślisz, może nawet trzeba? 793 00:37:16,290 --> 00:37:20,190 Co to jest proste pushback do tego pomysłu? 794 00:37:20,190 --> 00:37:21,440 >> Jesteś po prostu tracić pamięć. 795 00:37:21,440 --> 00:37:25,350 Dosłownie każdy program można napisać, a następnie jest być może za pomocą dwa razy więcej pamięci jako 796 00:37:25,350 --> 00:37:26,680 rzeczywiście trzeba. 797 00:37:26,680 --> 00:37:28,990 A to po prostu nie ma ochoty szczególnie eleganckie rozwiązanie. 798 00:37:28,990 --> 00:37:31,990 Co więcej, tylko zmniejsza Prawdopodobieństwo wystąpienia problemu. 799 00:37:31,990 --> 00:37:35,300 Jeśli zdarzy się, że popularny kurs jeden semestr i masz 101 800 00:37:35,300 --> 00:37:39,610 studentów, program jest nadal zasadniczo stoi ten sam problem. 801 00:37:39,610 --> 00:37:44,280 >> Więc na szczęście, jest rozwiązaniem Ogłoszenie wszystkie nasze problemy w postaci 802 00:37:44,280 --> 00:37:46,790 struktury danych, które są bardziej skomplikowane niż te, które 803 00:37:46,790 --> 00:37:47,970 jakie widziałem do tej pory. 804 00:37:47,970 --> 00:37:50,530 To, jak twierdzą, jest linked list. 805 00:37:50,530 --> 00:37:51,920 To jest lista numerów - 806 00:37:51,920 --> 00:37:54,970 9, 17, 22, 26, i 34 - 807 00:37:54,970 --> 00:38:00,120 , które zostały połączone ze sobą w drodze z tego, co już rysowane jako strzałki. 808 00:38:00,120 --> 00:38:03,580 >> Innymi słowy, jeśli chcę do reprezentowania array, co mogłem zrobić 809 00:38:03,580 --> 00:38:04,910 coś takiego. 810 00:38:04,910 --> 00:38:07,310 I włożę to na napowietrznych za chwilę. 811 00:38:07,310 --> 00:38:09,970 Mogłem zrobić - 812 00:38:09,970 --> 00:38:12,520 witam, wszystko w porządku. 813 00:38:12,520 --> 00:38:14,470 Stand by. 814 00:38:14,470 --> 00:38:17,360 Nowy komputer tutaj jasne - 815 00:38:17,360 --> 00:38:18,090 Dobrze. 816 00:38:18,090 --> 00:38:21,730 >> Więc jeśli mam te liczby w tablicy - 817 00:38:21,730 --> 00:38:28,880 9, 17, 22, 26, 24 - 818 00:38:28,880 --> 00:38:30,530 niekoniecznie w skali. 819 00:38:30,530 --> 00:38:33,730 W porządku, więc tutaj jest mój array - 820 00:38:33,730 --> 00:38:34,980 oh my god. 821 00:38:34,980 --> 00:38:38,700 822 00:38:38,700 --> 00:38:40,395 W porządku, więc tutaj jest mój tablicy. 823 00:38:40,395 --> 00:38:44,110 824 00:38:44,110 --> 00:38:45,050 O mój Boże. 825 00:38:45,050 --> 00:38:48,820 >> [Śmiech] 826 00:38:48,820 --> 00:38:49,440 >> DAVID MALAN: Pretend. 827 00:38:49,440 --> 00:38:52,330 To zbyt wiele wysiłku, aby wrócić i naprawić, więc nie - 828 00:38:52,330 --> 00:38:54,290 26. 829 00:38:54,290 --> 00:38:57,650 Mamy więc tę tablicę 9, 17, 22, 26 i 34. 830 00:38:57,650 --> 00:39:00,260 Dla tych z Was może zobaczyć żenujący błąd Zrobiłem, 831 00:39:00,260 --> 00:39:00,830 tam jest. 832 00:39:00,830 --> 00:39:04,490 >> So I twierdzą, że jest to bardzo wydajne rozwiązanie. 833 00:39:04,490 --> 00:39:07,310 Mam przydzielone tyle liczb całkowitych jak Muszę - Raz, dwa, trzy, 834 00:39:07,310 --> 00:39:09,100 cztery, pięć lub sześć - 835 00:39:09,100 --> 00:39:11,660 a ja następnie przechowywane numery wewnątrz tej tablicy. 836 00:39:11,660 --> 00:39:15,220 Ale załóżmy, to chcę, aby wstawić wartość jak numer 8? 837 00:39:15,220 --> 00:39:16,100 No, gdzie się udać? 838 00:39:16,100 --> 00:39:18,530 Załóżmy, że chcę, aby wstawić liczba jak 20. 839 00:39:18,530 --> 00:39:19,790 No, gdzie się udać? 840 00:39:19,790 --> 00:39:23,160 Gdzieś tam w środku, lub numer 35 musi iść 841 00:39:23,160 --> 00:39:24,010 gdzieś na końcu. 842 00:39:24,010 --> 00:39:25,320 Ale ja jestem z kosmosu. 843 00:39:25,320 --> 00:39:29,120 >> I tak to jest fundamentalnym wyzwaniem tablic, które nie są rozwiązaniem. 844 00:39:29,120 --> 00:39:32,280 I twierdził chwilą GetString rozwiązuje ten problem. 845 00:39:32,280 --> 00:39:37,380 Jeśli chcesz wstawić numer szósty do tego układu, co jest co najmniej jeden 846 00:39:37,380 --> 00:39:40,090 Rozwiązanie można polegać na na pewno, tak jak my z GetString? 847 00:39:40,090 --> 00:39:44,340 848 00:39:44,340 --> 00:39:46,030 Co to jest? 849 00:39:46,030 --> 00:39:48,190 >> Cóż, sprawiają, że większe jest łatwiej powiedzieć niż zrobić. 850 00:39:48,190 --> 00:39:52,810 Nie możemy zawsze zrobić tablicę większe, ale co możemy zrobić? 851 00:39:52,810 --> 00:39:56,570 Sprawdź nową tablicę, która jest większa, wielkości 6, a może rozmiar 10, jeśli chcemy 852 00:39:56,570 --> 00:40:00,490 się wyprzedzić rzeczy, a następnie skopiować stara tablica na nowy, a następnie 853 00:40:00,490 --> 00:40:01,680 uwolnić starą tablicę. 854 00:40:01,680 --> 00:40:05,770 >> Ale co to jest czas pracy teraz z tego procesu? 855 00:40:05,770 --> 00:40:09,870 Jest duży O n, ponieważ kopiowanie będzie kosztować kilka jednostek 856 00:40:09,870 --> 00:40:13,480 czas, więc nie jest tak idealne, jeśli mamy do przydzielić nową tablicę, która ma zamiar 857 00:40:13,480 --> 00:40:15,610 spożywać dwa razy tyle pamięci tymczasowo. 858 00:40:15,610 --> 00:40:16,660 Skopiuj stary na nowe - 859 00:40:16,660 --> 00:40:18,800 Mam na myśli, że to tylko ból głowy, który jest, ponownie, dlaczego napisał 860 00:40:18,800 --> 00:40:19,920 GetString dla Ciebie. 861 00:40:19,920 --> 00:40:21,380 >> Więc co możemy zrobić w zamian? 862 00:40:21,380 --> 00:40:25,000 A co, jeśli nasza struktura danych rzeczywiście ma w nim luki? 863 00:40:25,000 --> 00:40:30,790 Załóżmy, że mam odpocząć mój cel posiadania sąsiadujące fragmenty pamięci, gdzie 9 864 00:40:30,790 --> 00:40:34,500 jest tuż obok 17, która jest obok 22, i tak dalej. 865 00:40:34,500 --> 00:40:39,570 >> I przypuszczam, że 9 może być tutaj w RAM i 17 może być tutaj w pamięci RAM, 866 00:40:39,570 --> 00:40:40,990 i 22 może być tutaj w pamięci RAM. 867 00:40:40,990 --> 00:40:43,610 Innymi słowy, nie trzeba ich nawet z powrotem do tyłu już. 868 00:40:43,610 --> 00:40:47,850 Muszę jakoś nawlec igłę przez każdy z tych numerów, lub każde 869 00:40:47,850 --> 00:40:51,010 tych węzłów, jak będziemy nazywać prostokąty, jak ja ich, ciągnione 870 00:40:51,010 --> 00:40:55,670 pamiętam, jak dostać się do ostatniego taki węzeł od początku. 871 00:40:55,670 --> 00:40:59,940 >> Więc co jest konstrukcja programistyczna widzieliśmy całkiem niedawno, z którymi się 872 00:40:59,940 --> 00:41:03,030 może realizować ten wątek, lub Sporządzono tutaj, z którym mogę 873 00:41:03,030 --> 00:41:05,430 wprowadzić te strzałki? 874 00:41:05,430 --> 00:41:06,500 Tak więc wskaźniki, prawda? 875 00:41:06,500 --> 00:41:09,560 Gdybym nie przeznaczyć tylko Int., ale węzeł - i 876 00:41:09,560 --> 00:41:10,810 węzeł, po prostu oznacza pojemnik. 877 00:41:10,810 --> 00:41:12,900 I wizualnie, to znaczy prostokąt. 878 00:41:12,900 --> 00:41:16,420 Więc najwyraźniej potrzebuje węzła zawiera dwie wartości - 879 00:41:16,420 --> 00:41:21,490 Int. się, a następnie, jak sugeruje Dolna połowa prostokąta 880 00:41:21,490 --> 00:41:23,010 wystarczająco dużo miejsca na int. 881 00:41:23,010 --> 00:41:26,130 >> Tak właśnie myśli przed tutaj, jak duży jest ten węzeł, to 882 00:41:26,130 --> 00:41:27,170 Pojemnik na pytanie? 883 00:41:27,170 --> 00:41:29,250 Ile bajtów na int? 884 00:41:29,250 --> 00:41:31,310 Przypuszczalnie 4, jeśli jest to tak samo jak zwykle. 885 00:41:31,310 --> 00:41:33,270 A potem, jak wiele bajtów dla wskaźnika? 886 00:41:33,270 --> 00:41:33,650 4. 887 00:41:33,650 --> 00:41:37,940 Więc ten pojemnik, lub węzeł, jest będzie 8-bajtowy struktura. 888 00:41:37,940 --> 00:41:41,760 Oh, i to szczęśliwy zbieg okoliczności, że właśnie wprowadził to pojęcie 889 00:41:41,760 --> 00:41:44,400 struct lub struktura C. 890 00:41:44,400 --> 00:41:48,890 >> Więc twierdzenie, że chcę zrobić krok wobec tego bardziej wyrafinowane 891 00:41:48,890 --> 00:41:52,560 Wdrożenie listy numerów, o powiązana lista numerów, trzeba zrobić 892 00:41:52,560 --> 00:41:56,920 trochę więcej myślenia i do przodu deklarują nie tylko int, ale struct 893 00:41:56,920 --> 00:41:58,620 że zadzwonię, umownie tutaj, węzeł. 894 00:41:58,620 --> 00:42:01,630 Moglibyśmy nazwać to co chcemy, ale Węzeł będzie w wielu tematycznych 895 00:42:01,630 --> 00:42:03,560 z rzeczy zacząć patrzeć na teraz. 896 00:42:03,560 --> 00:42:06,480 >> Wewnątrz tego węzła jest int n. 897 00:42:06,480 --> 00:42:09,350 A potem ta składnia, trochę dziwne na pierwszy rzut oka - 898 00:42:09,350 --> 00:42:12,960 struct node * next. 899 00:42:12,960 --> 00:42:16,900 Cóż obrazowo, co to jest? 900 00:42:16,900 --> 00:42:21,000 To jest dolna połowa Prostokąt widzieliśmy 901 00:42:21,000 --> 00:42:22,730 przed chwilą. 902 00:42:22,730 --> 00:42:27,600 >> Ale dlaczego ja mówię węzeł struct * a nie tylko węzeł *? 903 00:42:27,600 --> 00:42:31,370 Bo jeśli wskaźnik wskazuje w innym węźle, to tylko 904 00:42:31,370 --> 00:42:32,760 adres węzła. 905 00:42:32,760 --> 00:42:35,630 To jest zgodne z tym, co mamy dyskutowali o wskazówki do tej pory. 906 00:42:35,630 --> 00:42:39,690 Ale dlaczego, jeśli twierdzą, struktura ta jest zwany węzeł, muszę powiedzieć, struct 907 00:42:39,690 --> 00:42:42,660 węzeł w środku tutaj? 908 00:42:42,660 --> 00:42:43,190 >> Dokładnie. 909 00:42:43,190 --> 00:42:46,490 To trochę głupie rzeczywistości C. Typedef, że tak powiem, nie ma 910 00:42:46,490 --> 00:42:47,220 zdarzyło się jeszcze. 911 00:42:47,220 --> 00:42:48,510 C jest super dosłowne. 912 00:42:48,510 --> 00:42:51,050 Czyta górna kod do dołu, od lewej do prawej. 913 00:42:51,050 --> 00:42:54,930 I dopóki nie natrafi na ten średnik Najważniejsze, zgadnij co nie 914 00:42:54,930 --> 00:42:57,590 istnieć jako typ? 915 00:42:57,590 --> 00:42:59,060 Węzeł, cytuję węzeł cytatu. 916 00:42:59,060 --> 00:43:03,050 >> Ale ze względu na więcej komunikatów deklaracja ja na pierwszej linii - 917 00:43:03,050 --> 00:43:05,340 typedef struct node - 918 00:43:05,340 --> 00:43:08,790 dlatego, że był pierwszy, przed nawiasy klamrowe, że jest coś w rodzaju 919 00:43:08,790 --> 00:43:11,800 pre-kształcenie Szczęk, że jesteś wiesz co, daj mi struct 920 00:43:11,800 --> 00:43:13,570 nazywa węzła struct. 921 00:43:13,570 --> 00:43:16,270 Szczerze mówiąc, nie lubię rzeczy, nazywając struct node, struct node wszystko 922 00:43:16,270 --> 00:43:17,090 w całym kodzie. 923 00:43:17,090 --> 00:43:20,660 Ale będę używać go tylko raz, tylko w środku, tak, że mogę skutecznie 924 00:43:20,660 --> 00:43:25,010 stworzyć coś w rodzaju odwołania cyklicznego, nie wskaźnik do siebie per se, ale 925 00:43:25,010 --> 00:43:29,400 wskaźnik do innego identyczny typ. 926 00:43:29,400 --> 00:43:32,330 >> Okazuje się, że w strukturze danych tak, jest kilka 927 00:43:32,330 --> 00:43:34,470 operacje, które mogą być interesujące dla nas. 928 00:43:34,470 --> 00:43:37,460 Możemy być wstawiony w liście, jak ta. 929 00:43:37,460 --> 00:43:39,850 Możemy usunąć z listy, jak ten. 930 00:43:39,850 --> 00:43:43,490 Może Chcemy sprawdzić listę dla wartość, lub bardziej ogólnie, trawers. 931 00:43:43,490 --> 00:43:46,410 I trawers jest tylko fantazyjny sposób mówiąc, początek po lewej i przesunąć wszystkie 932 00:43:46,410 --> 00:43:47,650 sposób prawo. 933 00:43:47,650 --> 00:43:52,640 >> I zauważ, nawet z tym nieco więcej wyrafinowane struktury danych, niech 934 00:43:52,640 --> 00:43:56,510 ja proponuje, że możemy pożyczyć idee ostatnich dwóch tygodni i 935 00:43:56,510 --> 00:43:58,410 realizacji funkcji o nazwie sprawdzić jak ten. 936 00:43:58,410 --> 00:44:01,360 To będzie prawdziwe lub powrót false, wskazując, tak czy 937 00:44:01,360 --> 00:44:03,390 Nie dotyczy to w tym wykazie. 938 00:44:03,390 --> 00:44:05,960 Drugim argumentem jest wskaźnik z listy, w tak 939 00:44:05,960 --> 00:44:07,920 wskaźnik do węzła. 940 00:44:07,920 --> 00:44:10,350 >> Wszystko mam zamiar to zrobić, to zadeklarować zmienna tymczasowa. 941 00:44:10,350 --> 00:44:12,730 Nazwijmy to ptr umownie dla wskaźnika. 942 00:44:12,730 --> 00:44:15,220 I przypisać to równe początek listy. 943 00:44:15,220 --> 00:44:16,680 >> A teraz uwaga pętli while. 944 00:44:16,680 --> 00:44:20,640 Tak długo, jak wskaźnik nie jest równy null, mam zamiar sprawdzić. 945 00:44:20,640 --> 00:44:24,520 Jest strzałka wskaźnik n równa n, która została uchwalona w? 946 00:44:24,520 --> 00:44:26,410 I czekać minut - nowe Kawałek składni. 947 00:44:26,410 --> 00:44:29,324 Co to jest strzałka nagle? 948 00:44:29,324 --> 00:44:30,574 Tak? 949 00:44:30,574 --> 00:44:34,200 950 00:44:34,200 --> 00:44:34,810 >> Dokładnie. 951 00:44:34,810 --> 00:44:38,860 Tak więc, podczas gdy kilka minut temu, używaliśmy notacji dot dostęp do czegoś 952 00:44:38,860 --> 00:44:43,080 wewnątrz tej struktury, jeśli zmienna Nie masz struct jest 953 00:44:43,080 --> 00:44:47,420 sam w sobie, ale wskaźnik do struktury, szczęście, że element składni 954 00:44:47,420 --> 00:44:48,620 wreszcie sens intuicyjny. 955 00:44:48,620 --> 00:44:52,360 Strzałka oznacza śledzenie wskaźnika, jak zwykle na myśli nasze strzały 956 00:44:52,360 --> 00:44:56,570 obrazowo, i przejść na wewnątrz pola danych. 957 00:44:56,570 --> 00:44:59,700 Więc strzałka jest to samo jak kropka, ale go używać, gdy masz wskaźnik. 958 00:44:59,700 --> 00:45:05,270 >> Przypomnę więc tylko wtedy, gdy pole n wewnątrz struktury o nazwie wskaźnik 959 00:45:05,270 --> 00:45:07,760 równa jest równa n, zwraca true. 960 00:45:07,760 --> 00:45:11,970 W przeciwnym razie, ta linia tutaj - wskaźnik wynosi wskaźnik next. 961 00:45:11,970 --> 00:45:17,540 Więc co to robi, zawiadomienia, to jeśli Obecnie wskazuje na struktury 962 00:45:17,540 --> 00:45:21,430 zawierający 9 i 9 nie liczba jest Szuka - przypuszczać, szukam 963 00:45:21,430 --> 00:45:22,830 dla n wynosi 50 - 964 00:45:22,830 --> 00:45:25,930 Mam zamiar zaktualizować tymczasowy wskaźnik aby nie wskazywać na tym węźle 965 00:45:25,930 --> 00:45:31,190 więcej, ale wskaźnik strzałkę obok, który ma zamiar umieścić mnie tutaj. 966 00:45:31,190 --> 00:45:34,270 >> Teraz zdałem sobie sprawę, to trąba powietrzna Wprowadzenie. 967 00:45:34,270 --> 00:45:37,380 W środę, my rzeczywiście to zrobić z niektórych ludzi, a niektóre więcej 968 00:45:37,380 --> 00:45:38,900 Kod w wolniejszym tempie. 969 00:45:38,900 --> 00:45:42,990 Ale sobie sprawę, jesteśmy teraz, aby nasze dane struktury bardziej złożone, tak aby nasi 970 00:45:42,990 --> 00:45:45,780 Algorytmy mogą uzyskać bardziej efektywne, co będzie warunkiem 971 00:45:45,780 --> 00:45:50,500 pset sześć, gdy wczytać się ponownie, tym 150.000 słowa, ale trzeba zrobić 972 00:45:50,500 --> 00:45:55,650 skutecznie, a najlepiej, stworzyć program, który działa na nie nasi użytkownicy 973 00:45:55,650 --> 00:46:00,460 liniowego, nie n kwadratu, ale stały czas, w ideale. 974 00:46:00,460 --> 00:46:02,300 >> Do zobaczenia w środę. 975 00:46:02,300 --> 00:46:07,240 >> Głośnik: Na następnym CS50, David zapomina o jego sprawy podstawowej. 976 00:46:07,240 --> 00:46:12,770 >> DAVID MALAN: I w ten sposób wyślesz wiadomości tekstowych z C. Co - 977 00:46:12,770 --> 00:46:14,020 >> [RÓŻNE wiadomość tekstową ZAWIADOMIENIE SOUNDS] 978 00:46:14,020 --> 00:46:19,734