1 00:00:00,000 --> 00:00:11,200 2 00:00:11,200 --> 00:00:12,580 >> DAVID Malan: Dobre, vitaj späť. 3 00:00:12,580 --> 00:00:13,290 Toto je CS50. 4 00:00:13,290 --> 00:00:15,130 To je začiatok v týždni sedem. 5 00:00:15,130 --> 00:00:18,890 Takže je to nejaký čas, tak som si myslel, že by som sa víchrica turné, kde sme 6 00:00:18,890 --> 00:00:20,760 prestali a kde sme teraz bude. 7 00:00:20,760 --> 00:00:23,310 >> Takže to, čo tu môže mať spôsobilo nejaké úzkosti na prvom mieste. 8 00:00:23,310 --> 00:00:27,680 Ale dúfajme, že začínaš aklimatizovať, čo to znamená tu - 9 00:00:27,680 --> 00:00:32,670 hviezdička predstavuje ukazovateľ, ktorý je len to, čo vo viacerých laicky povedané? 10 00:00:32,670 --> 00:00:33,400 Takže je to adresa. 11 00:00:33,400 --> 00:00:35,490 >> Takže je to adresa niečo v pamäti. 12 00:00:35,490 --> 00:00:38,260 A začali sme Zlúpnite vrstvy Pred pár týždňami, veci ako 13 00:00:38,260 --> 00:00:41,800 GetString a iné takéto funkcie Celú tú dobu boli návratu 14 00:00:41,800 --> 00:00:46,010 Adresy vecí v pamäti, ako adresa prvého znaku 15 00:00:46,010 --> 00:00:46,990 niektoré sekvencie. 16 00:00:46,990 --> 00:00:50,360 >> Tak sme tiež predstavil Valgrind, ktoré začnete používať tohto problému 17 00:00:50,360 --> 00:00:53,380 nastaviť, a to najmä pre ďalší problém nastaviť rovnako. 18 00:00:53,380 --> 00:00:54,980 A valgrind čo robí pre nás? 19 00:00:54,980 --> 00:00:57,520 20 00:00:57,520 --> 00:01:01,020 Kontroluje úniky pamäte, a to kontroluje aj za zneužitie pamäti. 21 00:01:01,020 --> 00:01:05,890 >> Je možné, s určitou pravdepodobnosťou, zistiť, či Váš kód bude dotýkať pamäť 22 00:01:05,890 --> 00:01:07,100 že to jednoducho nemal. 23 00:01:07,100 --> 00:01:10,410 Takže nie nevyhnutne únik, ale ak presahujú hranice niektorých 24 00:01:10,410 --> 00:01:14,730 pole, a vy vlastne beží Valgrind a vyvolať takéto správanie pri 25 00:01:14,730 --> 00:01:17,870 valgrind beží v programe je bežiaci vo vnútri nej, dostanete 26 00:01:17,870 --> 00:01:21,460 správy, ako je táto - "neplatný písať veľkosť 4 ", čo pripomínajú pár 27 00:01:21,460 --> 00:01:25,880 týždne znamenalo, že som mal náhodou ako na jeden int príliš ďaleko 28 00:01:25,880 --> 00:01:27,250 za hranice poľa. 29 00:01:27,250 --> 00:01:30,790 A tak veľkosť 4 tu znamená veľkosť tejto konkrétnej int. 30 00:01:30,790 --> 00:01:35,260 >> Tak sa uistenia v tom, že Valgrind je výstup vo formáte tom, 31 00:01:35,260 --> 00:01:36,170 je jednoducho otrasné. 32 00:01:36,170 --> 00:01:40,180 Je to naozaj ťažké vidieť skrz neporiadok na zaujímavé informácie. 33 00:01:40,180 --> 00:01:42,910 Takže to, čo sme urobili tu je len ukážka niektoré z niekoľkých viac 34 00:01:42,910 --> 00:01:43,850 zaujímavé linky. 35 00:01:43,850 --> 00:01:46,760 Ale uvedomiť, že 80% je Valgrind Výstup bude trochu 36 00:01:46,760 --> 00:01:47,650 rozptýlenie. 37 00:01:47,650 --> 00:01:52,820 >> Stačí sa pozrieť na vzory, ako sú tieto - neplatné pravdu, neplatné čítať, 40 bajtov 38 00:01:52,820 --> 00:01:56,690 a určitý počet blokov sú určite stratil, kľúčové slová, ako je to. 39 00:01:56,690 --> 00:02:01,920 A čo budete vidieť snáď je nejaký druh stopy, akú funkciu 40 00:02:01,920 --> 00:02:03,340 chyba je vlastne palcov 41 00:02:03,340 --> 00:02:07,195 V tomto prípade je tu, v tom, čo rada môj kód bol zrejme chyba? 42 00:02:07,195 --> 00:02:09,729 43 00:02:09,729 --> 00:02:14,130 >> 26 v súbore nazvanom memory.c, ktorý bol príklad sme si hrali sa 44 00:02:14,130 --> 00:02:14,890 v tej dobe. 45 00:02:14,890 --> 00:02:16,460 Takže to asi nie v malloc. 46 00:02:16,460 --> 00:02:18,630 To bolo pravdepodobne v mojom kóde miesto. 47 00:02:18,630 --> 00:02:20,910 Tak uvidíme to ešte raz a onedlho znova. 48 00:02:20,910 --> 00:02:24,080 >> Takže scanf, to prišlo až v roku pár formulárov tak ďaleko. 49 00:02:24,080 --> 00:02:26,410 Videli sme sscanf krátko. 50 00:02:26,410 --> 00:02:28,330 To bolo niečo, čo rad ste skočil do vo vašej 51 00:02:28,330 --> 00:02:29,535 Prípravy na kvíz. 52 00:02:29,535 --> 00:02:33,130 A scanf je vlastne to, čo CS50 knižnica sa používa pod 53 00:02:33,130 --> 00:02:36,560 kapucňa pre docela nejaký čas, aby získať vstup od užívateľa. 54 00:02:36,560 --> 00:02:40,420 >> Napríklad, keď som prejsť na CS50 Spotrebič tu, dovoľte mi otvoriť 55 00:02:40,420 --> 00:02:45,315 Napríklad dnes sa tomu hovorí scanf-0.c A je super jednoduché. 56 00:02:45,315 --> 00:02:46,590 Je to len pár riadkov kódu. 57 00:02:46,590 --> 00:02:50,880 Ale je to naozaj ukazuje, ako GetInt pracuje celý čas. 58 00:02:50,880 --> 00:02:54,710 >> V tomto programe tu, v súlade 16 Všimnite si, že som deklarovať int. 59 00:02:54,710 --> 00:02:57,270 Takže žiadne ukazovatele, nič magického tam, len int. 60 00:02:57,270 --> 00:03:00,330 Potom v riadku 17, som výzvu užívateľ na číslo, prosím. 61 00:03:00,330 --> 00:03:02,930 Potom na konci roka 18, ja používam scanf tu. 62 00:03:02,930 --> 00:03:06,910 A ja uvedené, niečo ako printf, že som očakával citát 63 00:03:06,910 --> 00:03:08,110 koniec citátu percent i. 64 00:03:08,110 --> 00:03:10,920 >> Tak aj percentá,, samozrejme, označuje int. 65 00:03:10,920 --> 00:03:14,580 Nevšimnúť, čo druhý argument scanf je. 66 00:03:14,580 --> 00:03:17,350 Ako by ste opísali druhý Argument sa po čiarke? 67 00:03:17,350 --> 00:03:19,450 Čo je to? 68 00:03:19,450 --> 00:03:20,670 >> Je to adresa x. 69 00:03:20,670 --> 00:03:25,490 Čo je výhodné preto, že tým, že scanf s adresou X, čo 70 00:03:25,490 --> 00:03:29,560 ktorý zmocní túto funkciu robiť? 71 00:03:29,560 --> 00:03:33,010 Nielen tam, ale aj to, čo? 72 00:03:33,010 --> 00:03:34,060 >> Vykonajte zmenu na neho. 73 00:03:34,060 --> 00:03:38,080 Vzhľadom k tomu, môžete tam ísť, je to trochu ako mapy na miesto v pamäti. 74 00:03:38,080 --> 00:03:41,900 A tak dlho, ako si zaistiť scanf alebo nejaká funkcia sa také mapy, že 75 00:03:41,900 --> 00:03:45,840 funkcie môže tam ísť, a to nielen pozrite sa na hodnotu, ale tiež to môže 76 00:03:45,840 --> 00:03:49,670 zmena tejto hodnoty, čo je užitočné, ak zmysel života scanf je 77 00:03:49,670 --> 00:03:53,060 skenovanie vstup od užívateľa, a to konkrétne z klávesnice. 78 00:03:53,060 --> 00:03:57,830 A f označuje formátovaný, rovnako ako printf, f označuje formátovaný 79 00:03:57,830 --> 00:03:58,930 reťazec, ktorý chcete vytlačiť. 80 00:03:58,930 --> 00:04:04,430 >> Takže v skratke, táto linka 18 jednoducho hovorí, snažím čítať int od užívateľa 81 00:04:04,430 --> 00:04:10,420 klávesnice a uložiť do x, u čo sa stane, adresa x žiť na. 82 00:04:10,420 --> 00:04:14,860 A potom konečne, linka 19 len hovorí, vďaka za int, v tomto prípade. 83 00:04:14,860 --> 00:04:15,940 >> Tak ma nechaj ísť ďalej a robiť to. 84 00:04:15,940 --> 00:04:18,570 Tak, aby scanf 0. 85 00:04:18,570 --> 00:04:20,130 Nechaj ma ísť dopredu a zoom palcov 86 00:04:20,130 --> 00:04:22,960 Pôjdem a spustiť to s bodky lomítko scanf 0. 87 00:04:22,960 --> 00:04:24,020 Číslo, prosím? 88 00:04:24,020 --> 00:04:24,720 50. 89 00:04:24,720 --> 00:04:25,730 Vďaka za päťdesiat. 90 00:04:25,730 --> 00:04:27,270 Takže je to celkom jednoduché. 91 00:04:27,270 --> 00:04:28,160 >> Teraz, čo sa nerobí? 92 00:04:28,160 --> 00:04:29,940 Nie je to robí veľa z kontroly chýb. 93 00:04:29,940 --> 00:04:33,000 Napríklad, keď nebudem spolupracovať, a ja nemám zadanie čísla, ale 94 00:04:33,000 --> 00:04:37,860 Namiesto toho som napísať niečo ako "ahoj" to je proste divné. 95 00:04:37,860 --> 00:04:41,130 A tak jedna z vecí, CS50 Knižnica bola robí pre nás pre niektoré 96 00:04:41,130 --> 00:04:43,440 Čas je to, že reprompting a reprompting. 97 00:04:43,440 --> 00:04:49,320 >> Opakovanie frázy odvolanie bolo v cs50.c, a to je dôvod, prečo v GetInt 98 00:04:49,320 --> 00:04:51,670 knižnica CS50 je vlastne celá banda liniek dlho, pretože sme 99 00:04:51,670 --> 00:04:53,190 kontrola hlúpe veci, ako je tento. 100 00:04:53,190 --> 00:04:55,730 Vedeli užívateľ nedal us, v skutočnosti, int? 101 00:04:55,730 --> 00:04:57,910 Vedeli on alebo ona nám niečo ako písmeno z abecedy? 102 00:04:57,910 --> 00:05:01,410 Ak áno, chceme zistiť že a kričať na ne. 103 00:05:01,410 --> 00:05:03,915 >> Ale veci sa dostať oveľa zaujímavejšie V tomto ďalšom príklade. 104 00:05:03,915 --> 00:05:09,840 Keď idem do scanf-1.C, čo je ten vec, ktorá je zásadná zmena v 105 00:05:09,840 --> 00:05:11,135 Ďalší príklad? 106 00:05:11,135 --> 00:05:13,690 107 00:05:13,690 --> 00:05:16,010 Ja používam char *, samozrejme, miesto int. 108 00:05:16,010 --> 00:05:19,210 >> Tak to je zaujímavé, pretože char *, spomínam, je naozaj len 109 00:05:19,210 --> 00:05:20,190 to isté ako reťazec. 110 00:05:20,190 --> 00:05:23,840 Takže to vyzerá, možno to je super jednoduchá realizácia getString. 111 00:05:23,840 --> 00:05:26,010 Ale ja som zlúpnuť vrstvu na CS50 knižnice, takže som 112 00:05:26,010 --> 00:05:27,550 volanie tejto char * teraz. 113 00:05:27,550 --> 00:05:30,070 Takže poďme sa pozrieť, kde, ak kdekoľvek, ideme zle. 114 00:05:30,070 --> 00:05:30,840 >> Riadok 17 - 115 00:05:30,840 --> 00:05:33,950 By som znova, prosím, daj mi niečo, V tomto prípade, reťazec. 116 00:05:33,950 --> 00:05:37,940 A potom na ďalšom riadku, volám scanf, znovu dávať to formátovacie kód, 117 00:05:37,940 --> 00:05:39,310 ale tentoraz s percent. 118 00:05:39,310 --> 00:05:41,900 A potom tentoraz som dávať to buffer. 119 00:05:41,900 --> 00:05:43,550 >> Teraz nevšimol, nie som s použitím ampersand. 120 00:05:43,550 --> 00:05:47,120 Ale prečo je to, že pravdepodobne v poriadku tu? 121 00:05:47,120 --> 00:05:49,760 Pretože to, čo je vyrovnávacia pamäť už? 122 00:05:49,760 --> 00:05:50,770 Je to už ukazovateľ. 123 00:05:50,770 --> 00:05:51,650 Je to už adresu. 124 00:05:51,650 --> 00:05:54,510 >> A nech je to slovo "pliesť," dovoľte mi, aby som len zavolať, že je, napríklad, pre 125 00:05:54,510 --> 00:05:55,050 jednoduchosť. 126 00:05:55,050 --> 00:05:58,250 Ale ja som to nazval preto, že v bufferi Všeobecne platí, programovanie, ak máte 127 00:05:58,250 --> 00:06:02,130 kus pamäti, ktorý reťazec skutočne len je, že môžete hovoriť vyrovnávacej pamäte. 128 00:06:02,130 --> 00:06:04,460 Je to miesto pre ukladanie informácií. 129 00:06:04,460 --> 00:06:07,400 >> Podobne ako veci, ako je YouTube, keď oni ukladanie do vyrovnávacej pamäte, tak povediac, že 130 00:06:07,400 --> 00:06:10,270 len znamená, že je sťahovanie kúsky od internetu a ich ukladanie v 131 00:06:10,270 --> 00:06:14,160 miestnej polia, miestna kus pamäti, ktoré môžete sledovať ho neskôr bez 132 00:06:14,160 --> 00:06:16,830 je skákanie alebo visí na môžete počas prehrávania. 133 00:06:16,830 --> 00:06:20,930 >> Takže je tu problém aj keď, pretože Hovorím scanf očakávať, 134 00:06:20,930 --> 00:06:22,320 reťazec od užívateľa. 135 00:06:22,320 --> 00:06:24,410 Tu je adresa kus pamäte. 136 00:06:24,410 --> 00:06:26,180 Daj to retazec. 137 00:06:26,180 --> 00:06:31,230 Prečo tomu tak je viazaný dať nám problémy, aj keď? 138 00:06:31,230 --> 00:06:33,490 >> Čo je to? 139 00:06:33,490 --> 00:06:35,510 Smiem prístup že časť pamäte? 140 00:06:35,510 --> 00:06:36,250 Viete, ja neviem. 141 00:06:36,250 --> 00:06:39,210 Pretože má vyrovnávaciu pamäť bola inicializovaná k niečomu? 142 00:06:39,210 --> 00:06:39,820 Nie tak celkom. 143 00:06:39,820 --> 00:06:43,090 A tak to, čo sme boli volaní odpadky hodnota, ktorá 144 00:06:43,090 --> 00:06:44,040 nie je formálne slovo. 145 00:06:44,040 --> 00:06:49,200 Znamená to len, že nemáme potuchy, čo bitov sú vnútri zo štyroch bajtov 146 00:06:49,200 --> 00:06:51,240 Som vymedzila ako vyrovnávacia pamäť. 147 00:06:51,240 --> 00:06:52,450 >> Som nezavolal malloc. 148 00:06:52,450 --> 00:06:53,940 Určite som nezavolal GetString. 149 00:06:53,940 --> 00:06:56,380 Takže kto vie, čo je vlastne vnútornej vyrovnávacej pamäte? 150 00:06:56,380 --> 00:07:00,550 A predsa hovorí scanf naslepo, tam a dajte, čo užívateľ napísal. 151 00:07:00,550 --> 00:07:04,460 >> Takže to, čo je pravdepodobné, že spôsobí v našom kóde, ak sa ho spustiť? 152 00:07:04,460 --> 00:07:05,700 Pravdepodobne segfault. 153 00:07:05,700 --> 00:07:07,970 Možno nie, ale asi segfault. 154 00:07:07,970 --> 00:07:10,620 A ja hovorím, možno nie, pretože niekedy vy, niekedy 155 00:07:10,620 --> 00:07:11,380 nemusíte dostať segfault. 156 00:07:11,380 --> 00:07:14,280 Niekedy proste šťastie, ale to však bude 157 00:07:14,280 --> 00:07:15,340 chyba v našom program. 158 00:07:15,340 --> 00:07:17,060 >> Tak ma nechaj ísť do toho a zostaviť to. 159 00:07:17,060 --> 00:07:18,280 Chystám sa to urobiť zo starej školy spôsobom. 160 00:07:18,280 --> 00:07:23,825 Takže zvonenie pomlčka 0, scanf-1, scanf-1.c, Enter. 161 00:07:23,825 --> 00:07:24,720 Jejda, príliš starej školy. 162 00:07:24,720 --> 00:07:26,550 Poďme sa pozrieť. 163 00:07:26,550 --> 00:07:28,440 Kde som ísť? 164 00:07:28,440 --> 00:07:29,700 Oh, char * buffer. 165 00:07:29,700 --> 00:07:33,595 166 00:07:33,595 --> 00:07:35,130 Oh, ďakujem - 167 00:07:35,130 --> 00:07:36,930 Uložiť, OK - 168 00:07:36,930 --> 00:07:37,690 veľmi stará škola. 169 00:07:37,690 --> 00:07:38,900 Dobre, je to už nejaký čas. 170 00:07:38,900 --> 00:07:41,720 >> Tak som práve uložili súbor po by to dočasné 171 00:07:41,720 --> 00:07:42,700 zmeniť pred chvíľou. 172 00:07:42,700 --> 00:07:46,090 A teraz som si ju vydal ručne Clang. 173 00:07:46,090 --> 00:07:49,500 A teraz budem pokračovať a spustite scanf-1, Enter. 174 00:07:49,500 --> 00:07:50,290 String prosím. 175 00:07:50,290 --> 00:07:51,600 Budem písať v "ahoj". 176 00:07:51,600 --> 00:07:54,070 >> A teraz, práve tu, úprimne povedané, printf Môžete ich trochu nepríjemné. 177 00:07:54,070 --> 00:07:56,020 Nie je to vlastne bude segfault v tomto prípade. 178 00:07:56,020 --> 00:07:59,860 Printf je trochu zvláštne, pretože je to tak super, že bežne používané 179 00:07:59,860 --> 00:08:03,570 printf podstate robí nám láskavosť a realizácia, 180 00:08:03,570 --> 00:08:04,830 že to nie je platný ukazovateľ. 181 00:08:04,830 --> 00:08:09,080 Dovoľte mi, aby som to na seba len vytlačiť v zátvorkách null, a to aj 182 00:08:09,080 --> 00:08:13,340 aj keď to nie je nevyhnutne to, čo sme sami očakávali. 183 00:08:13,340 --> 00:08:16,940 >> Tak sme si to moc jednoducho vyvolať segfault s tým, ale je jasné, toto 184 00:08:16,940 --> 00:08:18,600 nie je správanie som chcel. 185 00:08:18,600 --> 00:08:19,800 Takže to, čo je jednoduché riešenie? 186 00:08:19,800 --> 00:08:25,650 No, scanf-2, dovoľte mi navrhnúť miesto vlastne len prideľovanie 187 00:08:25,650 --> 00:08:30,100 char *, nechaj ma byť trochu múdrejší to, a dovoľte mi, aby som prideliť vyrovnávacia pamäť 188 00:08:30,100 --> 00:08:32,940 ako postupnosť 16 znakov. 189 00:08:32,940 --> 00:08:34,200 >> Tak som si to v niekoľkých smeroch. 190 00:08:34,200 --> 00:08:35,610 Mohol by som absolútne použiť malloc. 191 00:08:35,610 --> 00:08:38,980 Ale môžem vrátiť do týždňa dvoch, kedy Len som potreboval veľa 192 00:08:38,980 --> 00:08:39,620 znakov. 193 00:08:39,620 --> 00:08:40,860 To je len polia. 194 00:08:40,860 --> 00:08:44,870 Takže dovoľte mi, aby som miesto predefinovať vyrovnávacej pamäti sa pole 16 znakov. 195 00:08:44,870 --> 00:08:47,340 >> A teraz, keď som sa prejsť buffer - 196 00:08:47,340 --> 00:08:49,940 a to je niečo, čo my nie hovoriť v týždni dve - 197 00:08:49,940 --> 00:08:53,730 ale môžete liečiť maticu ako keď je to adresa. 198 00:08:53,730 --> 00:08:56,390 Technicky vzaté, ako sme videli, sú trochu inak. 199 00:08:56,390 --> 00:09:01,290 Ale scanf nebude vadiť, keď si ju preniesť názov poľa, pretože to, čo 200 00:09:01,290 --> 00:09:05,030 Zvonenie urobí pre nás je v podstate liečbe názov tohto poľa ako 201 00:09:05,030 --> 00:09:08,280 adresa bloku 16 bajtov. 202 00:09:08,280 --> 00:09:09,550 >> Tak to je lepšie. 203 00:09:09,550 --> 00:09:12,110 To znamená, že teraz môžem snáď vykonajte nasledujúce kroky. 204 00:09:12,110 --> 00:09:16,800 Dovoľte mi, aby som sa vzdialite na chvíľu robiť, aby scanf-2, skompilovaný OK. 205 00:09:16,800 --> 00:09:19,390 Teraz mi dovoľte sa dostal lomítko scanf-2. 206 00:09:19,390 --> 00:09:22,430 String prosím. "Dobrý deň." A Zdalo sa, že tentoraz nevyšla. 207 00:09:22,430 --> 00:09:26,020 >> Ale môže niekto navrhnúť scenár , V ktorom sa nemusia ešte fungovať? 208 00:09:26,020 --> 00:09:28,550 Jo? 209 00:09:28,550 --> 00:09:30,640 Niečo dlhšie ako 16 znakov. 210 00:09:30,640 --> 00:09:32,020 A skutočne, môžeme byť trochu presnejšie. 211 00:09:32,020 --> 00:09:36,540 Niečo dlhší ako 15 znakov, pretože v skutočnosti musíme mať na pamäti, 212 00:09:36,540 --> 00:09:39,920 že musíme, že spätné lomítko nula implicitne na konci reťazca, 213 00:09:39,920 --> 00:09:42,950 ktorý je stranou scanf, typicky postarať sa o pre nás. 214 00:09:42,950 --> 00:09:46,210 >> Takže dovoľte mi, aby som niečo také - 215 00:09:46,210 --> 00:09:48,040 Niekedy sa môžeme len nechať to takto. 216 00:09:48,040 --> 00:09:50,630 OK, takže sme teraz vyvolané naše segmentation fault. 217 00:09:50,630 --> 00:09:51,000 Prečo? 218 00:09:51,000 --> 00:09:54,940 Pretože som napísal viac ako 15 postavy, a tak máme vlastne 219 00:09:54,940 --> 00:09:58,280 dotkol spomienka, že som vlastne nemal. 220 00:09:58,280 --> 00:10:00,180 >> Takže to, čo je naozaj Riešením? 221 00:10:00,180 --> 00:10:02,210 No, čo keď budeme potrebovať dlhší reťazec? 222 00:10:02,210 --> 00:10:03,960 No, možno, aby to 32 bajtov. 223 00:10:03,960 --> 00:10:05,160 No, a čo keď to nie je dosť dlho? 224 00:10:05,160 --> 00:10:06,040 Ako sa o 64 bytov? 225 00:10:06,040 --> 00:10:07,080 Čo keď to nie je dosť dlho? 226 00:10:07,080 --> 00:10:09,640 Ako asi 128 alebo 200 bajtov? 227 00:10:09,640 --> 00:10:12,660 Čo je naozaj riešenie tu všeobecný prípad, ak nebudeme vedieť, 228 00:10:12,660 --> 00:10:14,460 vopred, čo užívateľ bude písať? 229 00:10:14,460 --> 00:10:20,000 230 00:10:20,000 --> 00:10:23,050 >> Je to len niečo ako veľká bolesť v zadku, Aby som bol úprimný, čo je dôvod, prečo 231 00:10:23,050 --> 00:10:29,050 CS50 knižnica má niekoľko desiatok riadkov kód, ktorý spoločne realizovať 232 00:10:29,050 --> 00:10:32,390 GetString reťazec tak, že nemáme vedieť vopred, čo 233 00:10:32,390 --> 00:10:33,430 užívateľ bude písať. 234 00:10:33,430 --> 00:10:37,370 Najmä, keď sa pozriete späť na cs50.c pred dvoma týždňami, uvidíte 235 00:10:37,370 --> 00:10:40,480 že GetString vlastne robí nemožno použiť scanf týmto spôsobom. 236 00:10:40,480 --> 00:10:43,720 Skôr to prečíta jeden znak naraz. 237 00:10:43,720 --> 00:10:46,010 >> Pretože jedna pekná vec, o čítanie jedného znaku ich môžeme 238 00:10:46,010 --> 00:10:48,490 zabezpečiť, aby sa vždy mať aspoň jeden char. 239 00:10:48,490 --> 00:10:51,740 Môžem len vyhlásiť char, a potom sa Tieto skutočne krôčiky k práve 240 00:10:51,740 --> 00:10:54,380 čítať jeden znak na čas z klávesnice. 241 00:10:54,380 --> 00:10:58,240 A potom, čo uvidíte GetString robí, je zakaždým, keď sa vyčerpá, 242 00:10:58,240 --> 00:11:02,280 povedzme, 16 bajtov pamäti, používa malloc alebo bratanec, po ktorom 243 00:11:02,280 --> 00:11:06,810 alokovať viac pamäte, kopírovanie starý pamäte do nového, a potom plazil 244 00:11:06,810 --> 00:11:09,900 spolu, ako jeden znak v čase, a keď sa spustí z toho 245 00:11:09,900 --> 00:11:13,370 kus pamäti, hodí ho, drapáky väčší kus pamäti, kopíruje starý 246 00:11:13,370 --> 00:11:14,750 do nových a opakuje. 247 00:11:14,750 --> 00:11:18,480 A je to naozaj bolesť skutočne implementovať niečo tak jednoduchého ako 248 00:11:18,480 --> 00:11:19,710 ako vstup od užívateľa. 249 00:11:19,710 --> 00:11:21,090 >> Takže môžete použiť scanf. 250 00:11:21,090 --> 00:11:22,430 Môžete použiť aj iné podobné funkcie. 251 00:11:22,430 --> 00:11:25,420 A veľa učebníc a on-line Príklady robiť, ale všetci sú 252 00:11:25,420 --> 00:11:27,210 náchylné k problémom, ako je tento. 253 00:11:27,210 --> 00:11:29,550 A nakoniec, ako sa segfault je docela otravné. 254 00:11:29,550 --> 00:11:30,680 Nie je to dobré pre užívateľa. 255 00:11:30,680 --> 00:11:33,560 >> Ale v najhoršom prípade, čo robí je zásadne dať svoj 256 00:11:33,560 --> 00:11:37,160 kód hrozí? 257 00:11:37,160 --> 00:11:39,250 Nejaký druh útoku, potenciálne. 258 00:11:39,250 --> 00:11:41,680 Hovorili sme o jednom takom útoku - pretekaniu stack. 259 00:11:41,680 --> 00:11:44,660 Ale všeobecne, ak máte povolené pretečeniu vyrovnávacej pamäte, ako my 260 00:11:44,660 --> 00:11:48,070 Pred pár týždňami sa len písanie viac než "ahoj" na zásobníku, budete 261 00:11:48,070 --> 00:11:52,330 môže skutočne prevziať, prípadne, počítače, alebo aspoň sa na údaje, ktoré 262 00:11:52,330 --> 00:11:53,510 nepatrí k vám. 263 00:11:53,510 --> 00:11:55,970 >> Takže v skratke, to je dôvod, prečo sme týchto koliesok. 264 00:11:55,970 --> 00:11:59,090 Ale teraz, začneme si ich dať dole, ako naše programy už nepotrebujete, 265 00:11:59,090 --> 00:12:00,610 nutne, vstup od užívateľa. 266 00:12:00,610 --> 00:12:03,960 Ale v prípade problému nastaviť šesť, váš vstup bude pochádzať z veľkej 267 00:12:03,960 --> 00:12:07,520 slovník súbor s niektorými 150 nepárne tisíc slov. 268 00:12:07,520 --> 00:12:10,330 >> Takže nebudete musieť starať o užívateľa ľubovoľný vstup. 269 00:12:10,330 --> 00:12:13,720 Dáme vám niektoré predpoklady o tomto súbore. 270 00:12:13,720 --> 00:12:20,340 Akékoľvek otázky týkajúce sa ukazovateľov alebo scanf alebo vstup užívateľa všeobecne? 271 00:12:20,340 --> 00:12:24,450 >> Dobre, takže rýchly pohľad a potom na jednom koncové téma pred dvoma týždňami. 272 00:12:24,450 --> 00:12:28,590 A to bol tento pojem z struct. 273 00:12:28,590 --> 00:12:34,180 Nie, že by - táto predstava struct, čo bolo to, čo? 274 00:12:34,180 --> 00:12:35,430 Čo struct urobiť pre nás? 275 00:12:35,430 --> 00:12:39,280 276 00:12:39,280 --> 00:12:39,860 >> Definovať - 277 00:12:39,860 --> 00:12:41,710 Čože? 278 00:12:41,710 --> 00:12:42,820 Definovať premenné typu. 279 00:12:42,820 --> 00:12:44,410 Tak nejako. 280 00:12:44,410 --> 00:12:46,180 Sme vlastne kombináciou dvoch tém. 281 00:12:46,180 --> 00:12:49,510 Takže s typedef, pripomínajú, že môžeme deklarovať typ vlastné, rovnako ako 282 00:12:49,510 --> 00:12:51,500 synonymum ako reťazec pre char *. 283 00:12:51,500 --> 00:12:56,200 Ale s použitím typedef struct a môžeme vytvoriť skutočne vlastných dátových štruktúr. 284 00:12:56,200 --> 00:12:59,600 >> Napríklad, keď som sa vrátiť do gedit Tu len na chvíľu, a ja idem do toho 285 00:12:59,600 --> 00:13:08,230 a urobiť niečo ako, dovoľte mi, aby som ušetriť to ako, povedzme, structs.c 286 00:13:08,230 --> 00:13:10,840 dočasne, ja som jednoducho ísť ísť dopredu a patrí 287 00:13:10,840 --> 00:13:14,360 standardio.h, int main neplatné. 288 00:13:14,360 --> 00:13:18,960 A potom tu, predpokladám, že chcem napísať program, ktorý ukladá 289 00:13:18,960 --> 00:13:21,840 viac študentov z viacerých domy, napríklad. 290 00:13:21,840 --> 00:13:24,430 Je to ako registrarial databázy nejakého druhu. 291 00:13:24,430 --> 00:13:29,550 >> Takže keď budem potrebovať názov jedného študenta, som mohol urobiť niečo ako char * meno, 292 00:13:29,550 --> 00:13:31,570 a ja urobím niečo ako - 293 00:13:31,570 --> 00:13:34,410 skutočnosti, využime CS50 knižnicu len na chvíľu, aby sa tento 294 00:13:34,410 --> 00:13:38,380 trochu jednoduchšie, takže môžeme požičať tie desiatky riadkov kódu. 295 00:13:38,380 --> 00:13:39,340 A povedzme, aby to jednoduché. 296 00:13:39,340 --> 00:13:42,610 Budeme to reťazec, a teraz GetString. 297 00:13:42,610 --> 00:13:47,420 >> Takže tvrdím, teraz, keď som uložené meno nejakého študenta, a dom 298 00:13:47,420 --> 00:13:50,240 nejaký študent, jednoducho pomocou premenných ako my av prvom týždni. 299 00:13:50,240 --> 00:13:52,370 Ale čo by som chcel, aby podporovali viac študentov. 300 00:13:52,370 --> 00:13:58,460 Dobre, takže moja inštinkty sú k tomu string name2 dostane GetString, reťazec 301 00:13:58,460 --> 00:14:01,370 house2 dostane GetString. 302 00:14:01,370 --> 00:14:05,850 A potom naše tretie študent, poďme meno3 GetString. 303 00:14:05,850 --> 00:14:09,170 >> Dobre, takže je to snáď zarážajúce, vy ako druh hlúpy, 304 00:14:09,170 --> 00:14:11,580 pretože tento proces je v skutočnosti nikdy skončí, a je to len tak 305 00:14:11,580 --> 00:14:13,130 aby môj kód vyzerať horšie a horšie a horšie. 306 00:14:13,130 --> 00:14:14,810 Ale riešili sme to taky v týždni dva. 307 00:14:14,810 --> 00:14:19,450 Aké bolo naše relatívne čisté riešenie keď sme mali viac premenných 308 00:14:19,450 --> 00:14:23,580 rovnakého typu dát, ktoré sa všetky týkajú, ale Nechceli sme to tuhý neporiadok 309 00:14:23,580 --> 00:14:26,870 podobne pomenovaných premenných? 310 00:14:26,870 --> 00:14:30,060 Čo sme urobili namiesto? 311 00:14:30,060 --> 00:14:31,260 >> Takže myslím, že som počul niekoľko miest. 312 00:14:31,260 --> 00:14:32,590 Mali sme poľa. 313 00:14:32,590 --> 00:14:37,110 Ak chcete viac inštancií niečo, čo keby sme to všetko vyčistiť 314 00:14:37,110 --> 00:14:39,540 a len povedať, daj mi Pole s názvom mená? 315 00:14:39,540 --> 00:14:41,640 >> A teraz poďme pevný kód 3. 316 00:14:41,640 --> 00:14:44,450 A potom mi daj ešte rad volal domov, a dovoľte mi, aby som na 317 00:14:44,450 --> 00:14:45,800 teraz ťažko kód 3. 318 00:14:45,800 --> 00:14:49,220 A ja som masívne upratala neporiadok, ktorý som práve vytvorili. 319 00:14:49,220 --> 00:14:52,400 Teraz som stále pevne zakódované 3, ale aj 3 môže dynamicky pochádzajú z 320 00:14:52,400 --> 00:14:54,350 Užívateľ alebo argv, alebo podobne. 321 00:14:54,350 --> 00:14:55,720 Tak to už je čistejšie. 322 00:14:55,720 --> 00:15:00,100 >> Ale čo to nepríjemné na tom je, že Teraz, aj keď názov je akosi 323 00:15:00,100 --> 00:15:02,280 zásadne spojená s študenta dom - 324 00:15:02,280 --> 00:15:04,720 je to študent, ktorý naozaj chcú reprezentovať - 325 00:15:04,720 --> 00:15:08,080 Teraz mám dve polia, ktoré sú rovnobežné v tom zmysle, že sú 326 00:15:08,080 --> 00:15:13,930 rovnakej veľkosti a mená držiak 0 Pravdepodobne sa mapuje na domy držiaku 0, 327 00:15:13,930 --> 00:15:16,600 a mená držiak 1 mapy domov na držiak 1. 328 00:15:16,600 --> 00:15:19,280 Inými slovami, že študentské žije v ten dom, a že ostatní študenti 329 00:15:19,280 --> 00:15:20,530 žije v tomto druhom dome. 330 00:15:20,530 --> 00:15:23,720 Ale určite by to mohlo byť urobil ešte čistejšie. 331 00:15:23,720 --> 00:15:24,990 >> No, je to možné, v skutočnosti. 332 00:15:24,990 --> 00:15:28,730 A nechaj ma ísť dopredu a otvorte hore structs.h, a budete 333 00:15:28,730 --> 00:15:31,130 pozri tento nápad tu. 334 00:15:31,130 --> 00:15:34,905 Všimnite si, že som použil typedef, ako ste zmienil pred chvíľou deklarovať naše 335 00:15:34,905 --> 00:15:35,570 vlastný dátový typ. 336 00:15:35,570 --> 00:15:39,660 Ale ja som vždy používal túto iné kľúčové slovo tzv struct, ktorý mi dáva nový 337 00:15:39,660 --> 00:15:40,790 dátové štruktúry. 338 00:15:40,790 --> 00:15:43,980 >> A to dátová štruktúra Tvrdím sa deje mať dve veci vnútri 339 00:15:43,980 --> 00:15:47,060 to - reťazec s názvom meno a reťazec s názvom dom. 340 00:15:47,060 --> 00:15:49,820 A meno idem dať Táto dátová štruktúra bude 341 00:15:49,820 --> 00:15:51,005 byť nazývaný študentom. 342 00:15:51,005 --> 00:15:54,030 Mohol by som hovoriť, čo chcem, ale sémanticky, aby 343 00:15:54,030 --> 00:15:55,810 zmysel pre mňa, v mojej mysli. 344 00:15:55,810 --> 00:15:59,160 >> Takže teraz, keď otvorím lepšiu verziu programu som začal písať 345 00:15:59,160 --> 00:16:00,390 tam, dovoľte mi prejsť na začiatok. 346 00:16:00,390 --> 00:16:03,190 A je tu niekoľko ďalších riadkov kódu tu, ale dovoľte mi zamerať sa na 347 00:16:03,190 --> 00:16:04,160 v okamihu, keď na jedného. 348 00:16:04,160 --> 00:16:07,790 Ja som vyhlásil, konštantný zvané študentmi a pevne zakódované 3 teraz. 349 00:16:07,790 --> 00:16:11,110 Ale teraz, všimnite si, ako čisté môj kód začína dostať. 350 00:16:11,110 --> 00:16:15,030 >> V súlade 22 Prehlasujem, Rad študentov. 351 00:16:15,030 --> 00:16:18,760 A zistíte, že žiak je zrejme teraz dátový typ. 352 00:16:18,760 --> 00:16:23,360 Vzhľadom k tomu, v hornej časti tohto súboru, oznámenia Uviedol som, že hlavičkový súbor 353 00:16:23,360 --> 00:16:24,820 že som vytiahol pred chvíľou. 354 00:16:24,820 --> 00:16:28,820 A že hlavičkový súbor jednoducho musel táto definícia študenta. 355 00:16:28,820 --> 00:16:32,470 >> Takže teraz som vytvoril svoje vlastné údaje Typ že autori rokov C 356 00:16:32,470 --> 00:16:33,890 Pred nemyslel vopred. 357 00:16:33,890 --> 00:16:34,570 Ale žiadny problém. 358 00:16:34,570 --> 00:16:35,870 Môžem to urobiť sám. 359 00:16:35,870 --> 00:16:39,050 Tak toto je pole s názvom študenti, každý, ktorého členovia 360 00:16:39,050 --> 00:16:41,100 je študent štruktúru. 361 00:16:41,100 --> 00:16:44,270 A chcem, aby tri z nich v poli. 362 00:16:44,270 --> 00:16:46,030 >> A teraz, čo robí zvyšok tohto programu robiť? 363 00:16:46,030 --> 00:16:47,550 Potreboval som niečo trochu svojvoľné. 364 00:16:47,550 --> 00:16:51,450 Takže z on-line 24 vpred, Aj iterovat od 0 do 3. 365 00:16:51,450 --> 00:16:54,000 Potom som sa opýta užívateľa študenta menom. 366 00:16:54,000 --> 00:16:56,110 A potom som použiť getString ako predtým. 367 00:16:56,110 --> 00:16:59,410 Potom som požiadať o študenta domu, a používam getString ako predtým. 368 00:16:59,410 --> 00:17:01,780 >> Ale Pridelenie zmluvy - relatívne nový kus syntaxe - 369 00:17:01,780 --> 00:17:07,010 Stále indexu i-teho študenta, ale ako to mám dostať na konkrétnych údajov 370 00:17:07,010 --> 00:17:08,354 poľa vnútri struct? 371 00:17:08,354 --> 00:17:11,770 No, čo je zrejme nový kus syntaxe? 372 00:17:11,770 --> 00:17:13,339 Je to len operátor bodky. 373 00:17:13,339 --> 00:17:14,510 >> Sme naozaj videli predtým. 374 00:17:14,510 --> 00:17:17,819 Videli ste to v pset päť, ak ste skočil už s bitmapovými súbormi. 375 00:17:17,819 --> 00:17:22,372 Ale bodka znamená len vnútri tohto struct alebo viacerých polí, dať bodku 376 00:17:22,372 --> 00:17:24,510 názov, alebo mi dot dom. 377 00:17:24,510 --> 00:17:28,690 To znamená, že dovnútra na struct a dostať tie konkrétne oblasti. 378 00:17:28,690 --> 00:17:30,200 >> Čo zvyšok tohto programu urobiť? 379 00:17:30,200 --> 00:17:31,190 To nie je všetko, sexi. 380 00:17:31,190 --> 00:17:34,640 Všimnite si, že som prechádzať od 0 do 3 znova, a ja som jednoducho vytvoriť English 381 00:17:34,640 --> 00:17:40,500 frázy ako tak, a tak je v takej a taký dom, odovzdaním dot názov od 382 00:17:40,500 --> 00:17:43,320 i-tý študent a ich dom tiež. 383 00:17:43,320 --> 00:17:47,560 >> A potom konečne, teraz začneme dostať análny o tom, teraz, keď sme 384 00:17:47,560 --> 00:17:49,580 oboznámení s tým, čo malloc a ďalšie funkcie boli 385 00:17:49,580 --> 00:17:50,570 robil celú tú dobu. 386 00:17:50,570 --> 00:17:54,220 Prečo musím oslobodiť aj meno a dom, aj keď som 387 00:17:54,220 --> 00:17:56,960 nevolal malloc? 388 00:17:56,960 --> 00:17:58,020 >> GetString urobil. 389 00:17:58,020 --> 00:18:00,930 A to bolo malé špinavé tajomstvo pre niekoľko týždňov, ale má GetString 390 00:18:00,930 --> 00:18:03,530 bol únik pamäte v celej umiestniť všetky semester tak ďaleko. 391 00:18:03,530 --> 00:18:05,990 A konečne Valgrande ukazujú nám to. 392 00:18:05,990 --> 00:18:10,730 >> Ale nie je to veľký problém, pretože viem, že môžem jednoducho uvoľniť meno 393 00:18:10,730 --> 00:18:15,750 a dom, aj keď technicky, aby je super, super bezpečný, mal by som byť 394 00:18:15,750 --> 00:18:17,890 robiť nejaké kontroly chýb tu. 395 00:18:17,890 --> 00:18:19,040 Aké sú vaše inštinkty tí? 396 00:18:19,040 --> 00:18:22,480 Čo by som mal byť kontrola než som sa uvoľniť, čo je 397 00:18:22,480 --> 00:18:25,470 reťazec, ktorý aka char *? 398 00:18:25,470 --> 00:18:33,460 >> Mal som naozaj kontrolovať, či študenti držiak aj bodka názov nie 399 00:18:33,460 --> 00:18:34,840 rovná null. 400 00:18:34,840 --> 00:18:40,400 Potom to bude v poriadku ísť dopredu a zadarmo že ukazovateľ, a rovnaké alebo iné 401 00:18:40,400 --> 00:18:41,160 tiež jedným z nich. 402 00:18:41,160 --> 00:18:46,860 Ak študenti držiak aj bodka dom nie je rovný null, teraz bude chrániť 403 00:18:46,860 --> 00:18:52,520 o roh prípadu, v ktorom GetString vráti niečo ako null. 404 00:18:52,520 --> 00:18:57,310 A my sme videli pred chvíľou, printf bude chrániť nás tu len hovorím, 405 00:18:57,310 --> 00:18:58,990 null, ktorá bude vyzerať divne. 406 00:18:58,990 --> 00:19:02,340 Ale aspon to nebude segfault, ako sme videli. 407 00:19:02,340 --> 00:19:05,990 >> No, dovoľte mi urobiť jednu vec tu. struct-0 je trochu hlúpe programu 408 00:19:05,990 --> 00:19:09,700 pretože som zadať všetky tieto údaje, a potom je to raz stratil program končí. 409 00:19:09,700 --> 00:19:10,940 Ale nechajte ma ísť ďalej a robiť to. 410 00:19:10,940 --> 00:19:12,830 Dovoľte mi, aby som terminálu Okno trochu väčšie. 411 00:19:12,830 --> 00:19:17,000 Dovoľte mi, aby som Štruktúry-1, čo je nová verzia tohto. 412 00:19:17,000 --> 00:19:18,520 >> Budem priblížiť trochu. 413 00:19:18,520 --> 00:19:21,620 A teraz mi spustiť bodku lomítko struct-1. 414 00:19:21,620 --> 00:19:22,590 Meno študenta - 415 00:19:22,590 --> 00:19:31,500 David Mather, poďme robiť Rob Kirkland, poďme Lauren Leverett. 416 00:19:31,500 --> 00:19:33,650 Čo je zaujímavé, je teraz Pridelenie zmluvy - 417 00:19:33,650 --> 00:19:35,540 a ja len viem to, pretože Napísal som program - 418 00:19:35,540 --> 00:19:38,930 existuje súbor s na môj súčasný adresár s názvom students.csv. 419 00:19:38,930 --> 00:19:40,420 Niektorí z vás mohli vidieť nich v reálnom svete. 420 00:19:40,420 --> 00:19:42,980 >> Čo je to CSV súboru? 421 00:19:42,980 --> 00:19:44,170 Hodnôt oddelených čiarkou. 422 00:19:44,170 --> 00:19:46,670 Je to niečo ako chudobný človek je Verzia súboru programu Excel. 423 00:19:46,670 --> 00:19:50,580 Je to tabuľka riadkov a stĺpcov, ktoré môžete otvoriť v programe, ako je Excel, 424 00:19:50,580 --> 00:19:51,800 alebo čísla v počítači Mac. 425 00:19:51,800 --> 00:19:55,180 >> A keď otvorím tento súbor tu na gedit, Oznámenie o vyhlásení verejného obstarávania - a čísla tam nie sú. 426 00:19:55,180 --> 00:19:57,360 To je len gedit rozprávania mi čísla riadkov. 427 00:19:57,360 --> 00:19:59,740 Všimnite si na prvom riadku tohto Súbor je Dávid a Mather. 428 00:19:59,740 --> 00:20:01,450 Ďalší riadok je Rob čiarka Kirkland. 429 00:20:01,450 --> 00:20:04,170 A tretí riadok je Lauren čiarka Leverett. 430 00:20:04,170 --> 00:20:05,480 >> Takže to, čo som vytvoril? 431 00:20:05,480 --> 00:20:09,580 Ja som teraz napísal program v C, ktorý účinne môžu vytvárať tabuľky 432 00:20:09,580 --> 00:20:11,840 ktorý možno otvoriť v program, ako je Excel. 433 00:20:11,840 --> 00:20:15,520 Nie všetko, čo presvedčivý súbor dát, ale Ak máte oveľa väčšie kusy 434 00:20:15,520 --> 00:20:18,440 údaje, ktoré ste skutočne chcete manipulovať a robiť grafy a 435 00:20:18,440 --> 00:20:21,260 ako, to je asi jedna spôsob, ako vytvoriť tieto dáta. 436 00:20:21,260 --> 00:20:25,370 Navyše, CSVŠ sú skutočne výborný spoločné len pre ukladanie dát jednoduchých - 437 00:20:25,370 --> 00:20:28,940 Yahoo Finance, napríklad, ak sa dostanete Ceny akcií prostredníctvom svojich tzv 438 00:20:28,940 --> 00:20:33,180 API, bezplatná služba, ktorá vám umožní získať aktuálne up-to-aktuálne zásoby 439 00:20:33,180 --> 00:20:35,650 citácie pre podniky, ktoré aby údaje v roku 440 00:20:35,650 --> 00:20:37,800 Super jednoduchý formát CSV. 441 00:20:37,800 --> 00:20:39,380 >> Tak ako to urobíme? 442 00:20:39,380 --> 00:20:42,530 No nevšimol, väčšina z tohto programu je takmer rovnaké. 443 00:20:42,530 --> 00:20:46,870 Všimnime si ale tu dole, skôr než tlač Študenti von, na linke 35 444 00:20:46,870 --> 00:20:51,040 dopredu, tvrdím, že šetrím študenti na disk, takže ukladaní súboru. 445 00:20:51,040 --> 00:20:53,630 >> Tak zistíte som vyhlásil súbor * - 446 00:20:53,630 --> 00:20:57,260 Teraz, to je druh anomálie v C. Z nejakého dôvodu je súbor všetkých čiapky, 447 00:20:57,260 --> 00:21:00,690 ktorý nie je ako väčšina ostatných typov dát v C. Ale to je vstavaný 448 00:21:00,690 --> 00:21:02,320 dátový typ, FILE *. 449 00:21:02,320 --> 00:21:05,900 A ja deklarovať ukazovateľ na súbor, je to, ako si môžete myslieť, že. 450 00:21:05,900 --> 00:21:08,070 >> fopen prostriedky otvoriť. 451 00:21:08,070 --> 00:21:09,470 Jaky súbor, ktorý chcete otvoriť? 452 00:21:09,470 --> 00:21:12,620 Chcem otvoriť súbor, ktorý budem ľubovoľne volať students.csv. 453 00:21:12,620 --> 00:21:14,480 By som mohol zavolať, že niečo chcem. 454 00:21:14,480 --> 00:21:15,200 >> A potom so hádať. 455 00:21:15,200 --> 00:21:18,960 Čo druhý argument na fopen asi znamená? 456 00:21:18,960 --> 00:21:21,480 Jasne, w pre zápis, by byť r pre čítanie. 457 00:21:21,480 --> 00:21:24,120 Je tu pre append, ak Chcete pridať riadky a nie 458 00:21:24,120 --> 00:21:25,200 prepísať celú vec. 459 00:21:25,200 --> 00:21:28,005 >> Ale ja len chcem, aby tento súbor vytvoriť raz, takže budem používať citačné koniec citátu w. 460 00:21:28,005 --> 00:21:31,880 A viem, že len z prečítania dokumentácie, alebo manuálové stránky. 461 00:21:31,880 --> 00:21:35,100 Ak súbor nie je null - inými slovami, ak sa nič nepodarilo sa - 462 00:21:35,100 --> 00:21:37,820 dovoľte mi, aby som iterácii Študenti 0-3. 463 00:21:37,820 --> 00:21:40,410 >> A teraz zistíte, že je niečo niekedy tak trochu inak 464 00:21:40,410 --> 00:21:42,110 o linka 41 tu. 465 00:21:42,110 --> 00:21:42,960 Nie je to printf. 466 00:21:42,960 --> 00:21:46,530 Je to fprintf pre súbor printf. 467 00:21:46,530 --> 00:21:47,790 Takže to bude zapisovať do súboru. 468 00:21:47,790 --> 00:21:48,860 Ktorý súbor? 469 00:21:48,860 --> 00:21:53,630 , Ktorej ukazovateľ zadáte ako prvý argument. 470 00:21:53,630 --> 00:21:55,940 >> Potom sme sa určiť formátovací reťazec. 471 00:21:55,940 --> 00:21:59,660 Potom sme sa určiť, aký reťazec chceme pripojiť na prvý percent s, a 472 00:21:59,660 --> 00:22:04,320 potom ďalšie premenná alebo druhý percent s 473 00:22:04,320 --> 00:22:06,760 Potom sme zatvorte súbor s fclose. 474 00:22:06,760 --> 00:22:09,380 Potom som uvoľniť pamäť ako predtým, aj keď By som sa mal vrátiť a pridať 475 00:22:09,380 --> 00:22:10,540 Niektoré kontroly na NULL. 476 00:22:10,540 --> 00:22:12,090 >> A je to. 477 00:22:12,090 --> 00:22:16,960 fopen, fprintf, fclose mi dáva schopnosť vytvárať textové súbory. 478 00:22:16,960 --> 00:22:19,640 Teraz uvidíte v probléme päťsto, ktorá zahŕňa obrazy, budete používať 479 00:22:19,640 --> 00:22:20,990 binárne súbory namiesto. 480 00:22:20,990 --> 00:22:24,200 Ale podstatnejšie je, že myšlienka je rovnaká, aj keď funkcie, budete 481 00:22:24,200 --> 00:22:28,710 sú vidieť trochu inak. 482 00:22:28,710 --> 00:22:32,580 >> Takže víchrica turné, ale budete mať príliš oboznámení so súborom I/O-- 483 00:22:32,580 --> 00:22:34,960 vstup a výstup - s pset päť. 484 00:22:34,960 --> 00:22:38,607 A prípadné otázky počiatočné základy tu? 485 00:22:38,607 --> 00:22:39,857 Jo? 486 00:22:39,857 --> 00:22:41,880 487 00:22:41,880 --> 00:22:43,710 >> Čo keď sa pokúsite uvoľniť nulovú hodnotu? 488 00:22:43,710 --> 00:22:48,880 Verím, že ak sa dostal zadarmo trochu viac užívateľsky prívetivé, môžete 489 00:22:48,880 --> 00:22:49,890 potenciálne segfault. 490 00:22:49,890 --> 00:22:54,160 Absolvovanie ich null, je zlé, pretože ja nie verí zadarmo obťažuje skontrolovať, pre vás, 491 00:22:54,160 --> 00:22:57,330 , Pretože by mohli byť považované za odpady času na to urobiť sám pre 492 00:22:57,330 --> 00:22:59,022 všetci na svete. 493 00:22:59,022 --> 00:23:00,590 Dobrá otázka, hoci. 494 00:23:00,590 --> 00:23:04,300 >> Dobre, takže tento druh dostane nám zaujímavé tému. 495 00:23:04,300 --> 00:23:07,010 Téma problémového súboru päť je forenznú. 496 00:23:07,010 --> 00:23:08,420 Aspoň, že je to časť z problémového súbore. 497 00:23:08,420 --> 00:23:12,030 Forenzná všeobecne sa odkazuje na využitie informácií, ktoré môžu alebo 498 00:23:12,030 --> 00:23:14,110 nesmie boli odstránené zámerne. 499 00:23:14,110 --> 00:23:18,680 A tak som si myslel, že by som vám rýchlo chuť toho, čo sa skutočne deje na všetkých 500 00:23:18,680 --> 00:23:21,230 tentoraz pod kapucňa počítača. 501 00:23:21,230 --> 00:23:23,960 >> Napríklad, ak máte vo vnútri vášho notebook alebo stolný počítač, 502 00:23:23,960 --> 00:23:28,040 pevný disk, je to buď mechanické zariadenie, ktoré sa v skutočnosti točí - 503 00:23:28,040 --> 00:23:31,650 je tu kruhové veci zvanej misy ktoré vyzerajú celkom páči, čo som 504 00:23:31,650 --> 00:23:34,540 len mal na obrazovke tu, aj keď je to stále starej školy. 505 00:23:34,540 --> 00:23:37,370 Jedná sa o tri a pol palca pevný disk. 506 00:23:37,370 --> 00:23:40,070 A tri a pol palca odkazuje na sa na vec, keď ju nainštalovať 507 00:23:40,070 --> 00:23:40,890 v počítači. 508 00:23:40,890 --> 00:23:44,890 >> Mnoho z vás vo vašich notebookov teraz majú polovodičové disky alebo SSD, 509 00:23:44,890 --> 00:23:46,260 ktoré nemajú žiadne pohyblivé časti. 510 00:23:46,260 --> 00:23:49,170 Sú skôr ako RAM a menej ako táto mechanické zariadenia. 511 00:23:49,170 --> 00:23:51,450 Ale myšlienky sú stále rovnaké, iste, ktoré sa vzťahujú 512 00:23:51,450 --> 00:23:52,790 na problém nastaviť päť. 513 00:23:52,790 --> 00:23:57,400 >> A ak si myslíte, že teraz pevný disk predstavuje, že kruh, ktorý 514 00:23:57,400 --> 00:23:58,930 Budem kresliť ako toto. 515 00:23:58,930 --> 00:24:02,290 Keď vytvoríte súbor v počítači, či už je to SSD, alebo v 516 00:24:02,290 --> 00:24:06,610 V tomto prípade, starší školský pevný disk, tento súbor obsahuje viac bitov. 517 00:24:06,610 --> 00:24:10,510 Povedzme, že je to 0 a 1, celá partia 0s a 1s. 518 00:24:10,510 --> 00:24:11,660 Tak toto je môj celý pevný disk. 519 00:24:11,660 --> 00:24:13,225 To je zrejme celkom veľký súbor. 520 00:24:13,225 --> 00:24:18,080 A to je s použitím až 0s a 1s na to časť fyzickej tanieri. 521 00:24:18,080 --> 00:24:19,750 >> No, čo je to fyzická časť? 522 00:24:19,750 --> 00:24:25,310 No, ukázalo sa, že na pevnom disku, aspoň z tohto typu, že je 523 00:24:25,310 --> 00:24:27,340 Tieto malinké magnetické častice. 524 00:24:27,340 --> 00:24:32,630 A oni majú v zásade na sever a južné póly na ne, takže ak 525 00:24:32,630 --> 00:24:35,710 zase jeden z týchto magnetických častíc týmto spôsobom, dalo by sa povedať, že je to 526 00:24:35,710 --> 00:24:36,720 predstavuje 1. 527 00:24:36,720 --> 00:24:39,340 A či je to hore nohami na juh do sever, dalo by sa povedať, že je to 528 00:24:39,340 --> 00:24:40,390 predstavuje 0. 529 00:24:40,390 --> 00:24:43,660 >> Takže v skutočnom fyzickom svete, je to ako by ste mohli predstavovať niečo 530 00:24:43,660 --> 00:24:45,670 binárne stav 0 a 1.. 531 00:24:45,670 --> 00:24:46,720 Tak to je všetko, je súbor. 532 00:24:46,720 --> 00:24:49,300 Je tu celá partia magnetické častice, ktoré sú v ich týmto spôsobom, alebo 533 00:24:49,300 --> 00:24:51,920 Týmto spôsobom sa vytvára vzory na 0s a 1s. 534 00:24:51,920 --> 00:24:56,760 >> Ale to dopadá keď uložíte súbor, niektoré informácie je uložená oddelene. 535 00:24:56,760 --> 00:25:00,000 Takže to je stolík, adresár, aby som tak povedal. 536 00:25:00,000 --> 00:25:05,810 A ja budem nazývať názov stĺpca a Zavolám tomto stĺpci umiestnenia. 537 00:25:05,810 --> 00:25:08,850 >> A ja poviem, predpokladám, to je môj životopis. 538 00:25:08,850 --> 00:25:14,050 Môj resume.doc je uložený na umiestnenie, povedzme 123. 539 00:25:14,050 --> 00:25:15,390 Vždy som ísť na toto číslo. 540 00:25:15,390 --> 00:25:18,810 Ale stačí povedať, že rovnako ako v pamäti RAM, môžete si vziať pevný disk 541 00:25:18,810 --> 00:25:22,350 to je gigabyte alebo 200GB alebo terabyte a môžete 542 00:25:22,350 --> 00:25:23,750 počet všetkých bytov. 543 00:25:23,750 --> 00:25:26,480 Môžete očíslovať všetky kusy 8 bitov. 544 00:25:26,480 --> 00:25:29,030 >> Takže budeme hovoriť, že to je umiestnenie 123 |. 545 00:25:29,030 --> 00:25:32,070 Takže tento adresár vnútri svojho prevádzky Systém si pamätá, že moja 546 00:25:32,070 --> 00:25:34,250 životopis je na mieste 123. 547 00:25:34,250 --> 00:25:36,850 Ale to bude zaujímavé, keď Odstránenie súboru. 548 00:25:36,850 --> 00:25:37,820 >> Tak napríklad - 549 00:25:37,820 --> 00:25:40,790 a našťastie, väčšina sveta je chytil na to - čo sa stane, keď 550 00:25:40,790 --> 00:25:45,040 môžete pretiahnuť súbor do vášho Mac OS koša alebo vaše Windows Kôš? 551 00:25:45,040 --> 00:25:48,290 552 00:25:48,290 --> 00:25:50,510 Aký je účel to docieliť? 553 00:25:50,510 --> 00:25:53,860 Je to samozrejme, ako sa zbaviť súboru ale čo akt pretiahnutím 554 00:25:53,860 --> 00:25:57,550 pád do koša alebo sa obráťte na Kôš robiť na počítači? 555 00:25:57,550 --> 00:25:59,230 >> Absolútne nič, naozaj. 556 00:25:59,230 --> 00:26:00,320 Je to len ako zložky. 557 00:26:00,320 --> 00:26:01,800 Je to špeciálna zložka, to je isté. 558 00:26:01,800 --> 00:26:04,460 Ale to vlastne súbor zmazať? 559 00:26:04,460 --> 00:26:06,780 >> No, nie, pretože niektorí z vás asi boli ako, oh sakra, ty nie 560 00:26:06,780 --> 00:26:07,420 neznamená to urobiť. 561 00:26:07,420 --> 00:26:09,130 Takže dvakrát kliknete Kôš alebo Kôš. 562 00:26:09,130 --> 00:26:11,630 Si tropil okolo a vy ste späť súbor jednoduchým pretiahnutím 563 00:26:11,630 --> 00:26:12,110 odtiaľ. 564 00:26:12,110 --> 00:26:14,420 Tak jasne, že to nie nutne odstránenie. 565 00:26:14,420 --> 00:26:15,990 >> OK, ty si múdrejší než to. 566 00:26:15,990 --> 00:26:18,860 Viete, že práve jeho pretiahnutím do Kôš alebo Kôš, neznamená, 567 00:26:18,860 --> 00:26:19,930 ste vyprázdňovania koša. 568 00:26:19,930 --> 00:26:24,110 Takže idete do menu a hovoríte Empty Trash alebo Vysypať kôš. 569 00:26:24,110 --> 00:26:25,360 Potom, čo sa stane? 570 00:26:25,360 --> 00:26:29,070 571 00:26:29,070 --> 00:26:32,530 >> Jo, tak to je odstránený viac. 572 00:26:32,530 --> 00:26:37,660 Ale všetko, čo sa deje, je to. 573 00:26:37,660 --> 00:26:45,350 Počítač zabudne, kde resume.doc bolo. 574 00:26:45,350 --> 00:26:47,400 >> Ale to, čo sa nezmenila zrejme na obrázku? 575 00:26:47,400 --> 00:26:51,390 576 00:26:51,390 --> 00:26:55,570 Bity, 0s a 1s, že tvrdím, sú na mieste nejaké fyzické aspektu 577 00:26:55,570 --> 00:26:56,280 hardware. 578 00:26:56,280 --> 00:26:57,110 Sú tam stále. 579 00:26:57,110 --> 00:26:58,930 Je to len má počítač zabudol, čo oni sú. 580 00:26:58,930 --> 00:27:03,160 >> Takže je to v podstate oslobodil súbore bitov tak, aby mohli byť znovu použité. 581 00:27:03,160 --> 00:27:06,940 Ale nie, kým vytvoriť viac súborov, a ďalšie súbory a ďalšie súbory 582 00:27:06,940 --> 00:27:12,150 pravdepodobnostne, ktoré 0s a 1s, tieto magnetické častice, sa znova, 583 00:27:12,150 --> 00:27:16,220 nahor alebo pravej strany, aby pre iné súbory, 0s a 1s. 584 00:27:16,220 --> 00:27:17,980 >> Takže máte toto okno času. 585 00:27:17,980 --> 00:27:19,860 A to nie je z predvídateľné dĺžka, naozaj. 586 00:27:19,860 --> 00:27:22,240 Záleží na veľkosti pevného pohon a koľko súborov, ktoré máte a 587 00:27:22,240 --> 00:27:23,490 ako rýchlo si nové. 588 00:27:23,490 --> 00:27:27,050 Ale je to okno, počas ktoré tento súbor je stále dokonale 589 00:27:27,050 --> 00:27:27,770 nenahrádzajú. 590 00:27:27,770 --> 00:27:31,050 >> Takže ak ste niekedy použiť programy ako McAfee alebo Norton pokúsiť obnoviť 591 00:27:31,050 --> 00:27:35,680 údaje, všetky robia sa snažia získať túto tzv adresára na 592 00:27:35,680 --> 00:27:37,340 zistiť, kde váš súbor je. 593 00:27:37,340 --> 00:27:40,605 A niekedy Norton a budú hovoriť, súbor je 93% obnoviteľná. 594 00:27:40,605 --> 00:27:42,020 No, čo to znamená? 595 00:27:42,020 --> 00:27:45,690 To jednoducho znamená, že nejaký iný súbor zhodou okolností nakoniec skončil, povedzme, 596 00:27:45,690 --> 00:27:48,920 tie kúsky z vášho pôvodného súboru. 597 00:27:48,920 --> 00:27:51,950 >> Takže to, čo je v skutočnosti podieľa na obnovu dát? 598 00:27:51,950 --> 00:27:55,720 No, ak nemáte niečo ako Norton pre-nainštalované na vašom počítači, 599 00:27:55,720 --> 00:27:59,510 najlepšie, čo môžete urobiť, je pozerať sa niekedy na celý pevný disk hľadá 600 00:27:59,510 --> 00:28:00,510 vzory bitov. 601 00:28:00,510 --> 00:28:05,350 A jednou z tém problémového súboru päť je, že budete hľadať 602 00:28:05,350 --> 00:28:09,570 ekvivalent pevného disku, forenznú Obraz Compact Flash kartu z 603 00:28:09,570 --> 00:28:13,660 digitálny fotoaparát, hľadá 0s a 1s, ktoré zvyčajne s vysokou 604 00:28:13,660 --> 00:28:16,720 Pravdepodobnosť, predstavujú začiatok JPEG obraz. 605 00:28:16,720 --> 00:28:21,120 >> A vy môžete získať tieto snímky podľa za predpokladu, keď vidím tento model 606 00:28:21,120 --> 00:28:24,380 bitov na forenznú obraz s vysoká pravdepodobnosť, že označí 607 00:28:24,380 --> 00:28:25,650 začiatok vo formáte JPEG. 608 00:28:25,650 --> 00:28:29,520 A keď vidím rovnaký vzorec znovu, ktoré pravdepodobne začiatkom 609 00:28:29,520 --> 00:28:32,440 ďalšie JPEG, a ďalšie JPEG, JPEG a ďalšie. 610 00:28:32,440 --> 00:28:34,970 A zvyčajne je to ako obnova dát bude fungovať. 611 00:28:34,970 --> 00:28:37,870 Čo je pekné o JPEG je aj napriek tomu, formát súboru je sám o sebe trochu 612 00:28:37,870 --> 00:28:44,400 zložité, počiatok každé také Súbor je vlastne celkom identifikovateľný 613 00:28:44,400 --> 00:28:47,370 a jednoduché, ako uvidíte, ak ste tak už neurobili. 614 00:28:47,370 --> 00:28:50,270 >> Takže poďme sa bližšie pozrieť pod kapucňa, aby sa presne to, čo bolo 615 00:28:50,270 --> 00:28:53,360 deje, a čo to 0s a 1s sú, aby vám trochu viac 616 00:28:53,360 --> 00:28:55,330 kontext pre tento konkrétny úlohu. 617 00:28:55,330 --> 00:28:55,510 >> [PLAYBACK] 618 00:28:55,510 --> 00:28:58,700 >> -Kde je váš počítač ukladá väčšinu jeho trvalá dáta. 619 00:28:58,700 --> 00:29:03,390 K tomu, že údaje cestuje z RAM spoločne so softvérovými signály, ktoré hovoria, 620 00:29:03,390 --> 00:29:06,110 pevný disk, ako ukladať tieto dáta. 621 00:29:06,110 --> 00:29:09,410 Na pevnom disku obvody prekladať tieto signály do napätia 622 00:29:09,410 --> 00:29:10,870 výkyvy. 623 00:29:10,870 --> 00:29:14,970 Títo, podľa poradia, kontrola pevného disku pohyblivé časti, niektoré z mála 624 00:29:14,970 --> 00:29:17,910 pohyblivé časti zostali v modernej výpočtovej. 625 00:29:17,910 --> 00:29:22,130 >> Niektoré zo signálov ovládanie motora ktoré sa točí pokovovaná taniere. 626 00:29:22,130 --> 00:29:25,470 Vaše dáta sú v skutočnosti uložené na týchto mís. 627 00:29:25,470 --> 00:29:28,610 Ostatné signály presunúť čítanie / zápis hlavy na čítanie alebo 628 00:29:28,610 --> 00:29:30,710 zapisovať dáta na platniach. 629 00:29:30,710 --> 00:29:35,450 Toto zariadenie tak presné, že človek vlasy by neprešiel ani medzi 630 00:29:35,450 --> 00:29:37,280 hlavy a pradenie taniere. 631 00:29:37,280 --> 00:29:40,316 Napriek tomu, že všetko funguje v úžasnej rýchlosti. 632 00:29:40,316 --> 00:29:40,660 >> [END PLAYBACK] 633 00:29:40,660 --> 00:29:42,190 >> DAVID Malan: mierne priblíženie teraz hlbšie na to, čo je 634 00:29:42,190 --> 00:29:44,360 vlastne na týchto mís. 635 00:29:44,360 --> 00:29:44,720 >> [PLAYBACK] 636 00:29:44,720 --> 00:29:47,660 >> -Poďme sa pozrieť na to, čo sme práve videl ako v spomalenom filme. 637 00:29:47,660 --> 00:29:51,710 Keď krátky elektrický impulz je zaslaná čítacie / zapisovacie hlavy, ak preletí 638 00:29:51,710 --> 00:29:54,650 na malé elektromagnetické pre zlomok sekundy. 639 00:29:54,650 --> 00:29:58,970 Magnet vytvára polia, ktoré zmení polarita malý, malý 640 00:29:58,970 --> 00:30:02,850 časť kovových častíc, ktoré Srsť každý tanier povrch. 641 00:30:02,850 --> 00:30:05,940 >> Vzor rad z nich malý, platí-up oblasti na disku 642 00:30:05,940 --> 00:30:08,470 predstavuje jeden bit dáta v binárnej číslo 643 00:30:08,470 --> 00:30:10,530 používaný systém počítača. 644 00:30:10,530 --> 00:30:13,775 Teraz, v prípade, že prúd je zaslaná jedným zo spôsobov cez čítacie / zapisovacie hlavy plochu 645 00:30:13,775 --> 00:30:15,970 je polarizované v jednom smere. 646 00:30:15,970 --> 00:30:17,950 V prípade, že prúd je odoslaná do opačný smer, 647 00:30:17,950 --> 00:30:19,930 polarizácia je obrátené. 648 00:30:19,930 --> 00:30:22,370 >> Ako získať dáta z pevného disku? 649 00:30:22,370 --> 00:30:24,090 Len zvrátenie procesu. 650 00:30:24,090 --> 00:30:26,550 Tak, že je to, že častice na disku že sa prúd v 651 00:30:26,550 --> 00:30:27,960 čítacie / zapisovacie hlavy v pohybe. 652 00:30:27,960 --> 00:30:30,700 Dajte dohromady milióny týchto zmagnetizovanej segmenty, a 653 00:30:30,700 --> 00:30:32,160 máte súbor. 654 00:30:32,160 --> 00:30:36,060 >> Teraz môže kusov v jednom súbore byť roztrúsené po celom disku, 655 00:30:36,060 --> 00:30:39,970 misy, niečo ako ten neporiadok papierov na stole. 656 00:30:39,970 --> 00:30:43,500 Takže Špeciálne, extra súbor udržuje o tom, kde čo je. 657 00:30:43,500 --> 00:30:45,985 Vari Prajete si mali niečo takéto? 658 00:30:45,985 --> 00:30:46,470 >> [END PLAYBACK] 659 00:30:46,470 --> 00:30:47,820 >> DAVID Malan: OK, pravdepodobne nie. 660 00:30:47,820 --> 00:30:52,070 Tak koľko z vás Vyrastal s nimi? 661 00:30:52,070 --> 00:30:53,970 OK, tak je to menej a menej ruky každý rok. 662 00:30:53,970 --> 00:30:56,550 Ale som rád, že ste aspoň oboznámení s nimi, pretože to a naše vlastné 663 00:30:56,550 --> 00:31:00,520 Kniha demo, bohužiaľ, umierajú veľmi pomalej smrti tu známosti. 664 00:31:00,520 --> 00:31:04,010 >> Ale to je to, čo som, aspoň v roku vysokej školy, ktorý sa používa pre zálohovanie použitie. 665 00:31:04,010 --> 00:31:08,110 A bolo to úžasné, pretože mohol uložiť na 1,4 MB. 666 00:31:08,110 --> 00:31:08,930 Tento disk. 667 00:31:08,930 --> 00:31:12,260 A to bola vysoká hustota prevedenie, ako je uvedené v HD, ktorý má 668 00:31:12,260 --> 00:31:14,240 čo znamená skôr, než dnešné HD videa. 669 00:31:14,240 --> 00:31:16,400 >> Štandardná hustota bola 800kB. 670 00:31:16,400 --> 00:31:18,640 A ako to, že tam bolo 400 kilobyte disky. 671 00:31:18,640 --> 00:31:23,120 A ako to, že tam bolo 5 a 1/4 palcové disky, ktoré boli skutočne disketa, 672 00:31:23,120 --> 00:31:25,680 a trochu širšie a vyššie ako tieto veci tu. 673 00:31:25,680 --> 00:31:29,150 Ale môžete skutočne vidieť tzv floppy aspekt z týchto diskov. 674 00:31:29,150 --> 00:31:32,630 >> A funkčne, sú v skutočnosti dosť podobné pevných diskov na 675 00:31:32,630 --> 00:31:33,570 Aspoň to typ. 676 00:31:33,570 --> 00:31:37,270 Opäť SSD v novších počítačov pracovať trochu inak. 677 00:31:37,270 --> 00:31:41,530 Ale ak budete pohybovať, že malý kovový výstupok, môžete skutočne vidieť malý cookie, 678 00:31:41,530 --> 00:31:42,560 alebo tanier. 679 00:31:42,560 --> 00:31:43,830 >> Nie je to kov, ako je tento. 680 00:31:43,830 --> 00:31:46,000 Toto je vlastne nejaký lacnejší plast. 681 00:31:46,000 --> 00:31:46,750 A môžete trochu triasť IT. 682 00:31:46,750 --> 00:31:50,310 A ty si suka len zotrieť niektoré počet bitov alebo magnetických častíc 683 00:31:50,310 --> 00:31:51,220 z tohto disku. 684 00:31:51,220 --> 00:31:52,710 >> Takže našťastie, nič na ňom. 685 00:31:52,710 --> 00:31:55,790 Ak to, čo je v ceste - a pokrytie vaše oči a tí svojho suseda - 686 00:31:55,790 --> 00:31:58,865 môžete len tak vytiahnuť to Celý plášť off takhle. 687 00:31:58,865 --> 00:32:01,900 Ale je to trochu jar, a tak sa si vedomý, že na vlastné oči. 688 00:32:01,900 --> 00:32:03,620 Takže teraz máte naozaj disketu. 689 00:32:03,620 --> 00:32:07,090 >> A čo je pozoruhodné o tom je to do tej miery, ako je to 690 00:32:07,090 --> 00:32:10,830 malé zastúpenie väčšie pevný disk, tieto veci sú super, 691 00:32:10,830 --> 00:32:11,590 Super jednoduché. 692 00:32:11,590 --> 00:32:15,170 Ak zovrite spodnú neho teraz, že kovová vec je preč, a kôra 693 00:32:15,170 --> 00:32:20,990 je otvorené, všetko tam je, je dva kusy plsti a tzv diskety 694 00:32:20,990 --> 00:32:22,930 s kusom kovu na vnútornej strane. 695 00:32:22,930 --> 00:32:25,990 >> A tam ide polovica môjho disku je obsah. 696 00:32:25,990 --> 00:32:27,540 Tam ide ďalšia polovica z nich. 697 00:32:27,540 --> 00:32:31,375 Ale to je všetko, čo sa točí vnútri počítače v minulosti. 698 00:32:31,375 --> 00:32:35,220 699 00:32:35,220 --> 00:32:38,310 >> A opäť, aby to do súvislostí, aká veľká je najviac zo svojho 700 00:32:38,310 --> 00:32:39,560 pevné disky v týchto dňoch? 701 00:32:39,560 --> 00:32:41,960 702 00:32:41,960 --> 00:32:46,230 500 GB, terabajtových, možno počítač desktop, 2 TB, 3 703 00:32:46,230 --> 00:32:47,630 TB, 4 TB, nie? 704 00:32:47,630 --> 00:32:52,480 To je jeden megabajt, dávať alebo brať, ktoré ani vhodný typický MP3 705 00:32:52,480 --> 00:32:55,310 anymore v týchto dňoch, alebo niektoré podobné hudobný súbor. 706 00:32:55,310 --> 00:32:59,500 >> Tak trochu suvenír pre vás dnes, a tiež pomôcť súvislostí, čo 707 00:32:59,500 --> 00:33:03,570 budeme brať za samozrejmosť teraz v probléme päťsto. 708 00:33:03,570 --> 00:33:04,820 To sú len na vás, aby. 709 00:33:04,820 --> 00:33:07,340 710 00:33:07,340 --> 00:33:13,370 Dovoľte mi teda prechod, kde bude výdavky na ďalšie pset rovnako. 711 00:33:13,370 --> 00:33:18,470 Takže sme sa nastaviť túto stránku - ach, pár oznámenia rýchlo. 712 00:33:18,470 --> 00:33:21,730 >> Tento piatok, ak chcete pridať CS50 na obed, ísť na obvyklom mieste, 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp. 714 00:33:23,610 --> 00:33:25,100 A konečný projekt - 715 00:33:25,100 --> 00:33:28,520 takže podľa osnov, sme zaslali Záverečný projekt špecifikácia už. 716 00:33:28,520 --> 00:33:31,410 Uvedomujeme si, že to neznamená, je to spôsobené najmä čoskoro. 717 00:33:31,410 --> 00:33:33,990 Je vyslaný, naozaj, len preto, aby vy o tom premýšľať. 718 00:33:33,990 --> 00:33:37,620 A naozaj, super významný percento z vás bude riešiť 719 00:33:37,620 --> 00:33:40,780 záverečných prác na materiáli, ktorý sme sa ani nedostal na v triede, 720 00:33:40,780 --> 00:33:42,730 ale bude už budúci týždeň. 721 00:33:42,730 --> 00:33:45,530 >> Všimnite si však, že spec vyžaduje niekoľko rôznych zložiek 722 00:33:45,530 --> 00:33:46,190 záverečný projekt. 723 00:33:46,190 --> 00:33:49,590 Prvý z nich, v priebehu niekoľkých týždňov, je pre-návrh, celkom neformálne email 724 00:33:49,590 --> 00:33:52,760 Váš TF mu povedať, alebo to, čo ste premýšľať o tom, pre svoj projekt, s 725 00:33:52,760 --> 00:33:53,650 žiadny záväzok. 726 00:33:53,650 --> 00:33:56,710 Návrh bude váš konkrétny záväzok, povedal, tu je to, čo 727 00:33:56,710 --> 00:33:57,770 Chcel by som urobiť pre môj projekt. 728 00:33:57,770 --> 00:33:58,250 Čo si myslíte? 729 00:33:58,250 --> 00:33:58,650 Príliš veľké? 730 00:33:58,650 --> 00:33:59,145 Príliš malý? 731 00:33:59,145 --> 00:34:00,330 Je to zvládnuteľné? 732 00:34:00,330 --> 00:34:02,230 A vidíte, spec pre viac informácií. 733 00:34:02,230 --> 00:34:05,060 >> Pár týždňov po tom, čo je stav Správa, ktorá je podobne 734 00:34:05,060 --> 00:34:08,260 neformálne e-mail k vášmu TF povedať, ako pozadu ste v poslednom 735 00:34:08,260 --> 00:34:12,360 realizácie projektu, po ktorom nasleduje CS50 hackathon, ktoré každý 736 00:34:12,360 --> 00:34:17,520 je pozvaný, ktorá bude udalosť od 20:00 Na jeden večer až do 07:00 737 00:34:17,520 --> 00:34:19,150 AM budúci ráno. 738 00:34:19,150 --> 00:34:22,560 Pizza, ako som mohla uvedené v týždni nula, bude Wil podáva v 21:00, 739 00:34:22,560 --> 00:34:24,120 Čínske jedlo v 01:00. 740 00:34:24,120 --> 00:34:27,929 A ak ste ešte hore v 05:00, Vezmeme vás na IHOP na raňajky. 741 00:34:27,929 --> 00:34:31,310 >> Takže hackathon je jeden z viacerých nezabudnuteľné zážitky v triede. 742 00:34:31,310 --> 00:34:35,290 Potom prevedenie, čo sa prejavuje aj potom vrcholný CS50 veľtrhu. 743 00:34:35,290 --> 00:34:38,070 Viac informácií o všetkých týchto v najbližších týždňoch. 744 00:34:38,070 --> 00:34:40,739 >> Ale vráťme sa k niečomu old school - 745 00:34:40,739 --> 00:34:41,920 opäť, polia. 746 00:34:41,920 --> 00:34:45,040 Takže pole bolo pekné, pretože rieši problémy, ako sme videli len 747 00:34:45,040 --> 00:34:49,290 Pred chvíľou sa študentskými štruktúr ako sa trochu vymkla kontrole, keby sme 748 00:34:49,290 --> 00:34:52,405 chcete mať študent, jeden, študent, dva Študent tri, študent dot dot dot, 749 00:34:52,405 --> 00:34:54,400 niektoré ľubovoľný počet študentov. 750 00:34:54,400 --> 00:34:58,850 >> Takže poľa, pred niekoľkými týždňami, Priletel a vyriešiť všetky naše problémy, že nie 751 00:34:58,850 --> 00:35:03,340 vie vopred, koľko vecí niektorých typov by sme mohli chcieť. 752 00:35:03,340 --> 00:35:07,390 A my sme videli, že struct nám môže pomôcť ďalej organizovať náš kód a udržať 753 00:35:07,390 --> 00:35:11,660 koncepčne podobných premenných, ako je meno a dom, dohromady, aby sa 754 00:35:11,660 --> 00:35:15,570 Môžete s nimi zaobchádzať ako s jedným subjektom, vnútorné z ktorých sú menšie kúsky. 755 00:35:15,570 --> 00:35:17,810 >> Ale polia majú niektoré nevýhody. 756 00:35:17,810 --> 00:35:19,780 Aké sú niektoré nevýhody sme sa stretli 757 00:35:19,780 --> 00:35:22,320 s poľami tak ďaleko? 758 00:35:22,320 --> 00:35:23,450 Čo je to? 759 00:35:23,450 --> 00:35:28,130 Pevná veľkosť - takže aj keď si možno možné prideliť pamäť pre 760 00:35:28,130 --> 00:35:32,310 poľa, až budete vedieť, koľko študentov máte, koľko znakov máte 761 00:35:32,310 --> 00:35:35,460 od užívateľa, akonáhle ste pridelené pole, ste trochu maľoval 762 00:35:35,460 --> 00:35:36,740 si do kúta. 763 00:35:36,740 --> 00:35:40,600 >> Pretože nemôžete vložiť nové prvky do stredu poľa. 764 00:35:40,600 --> 00:35:43,660 Nemôžete vložiť viac prvkov na konci poľa. 765 00:35:43,660 --> 00:35:47,750 Naozaj, musíte sa uchýliť k vytvoreniu úplne nové pole, ako sme diskutovali, 766 00:35:47,750 --> 00:35:49,320 kopírovanie starého do nového. 767 00:35:49,320 --> 00:35:52,610 A opäť, že je bolesť hlavy, ktorá GetString sa zaoberá pre vás. 768 00:35:52,610 --> 00:35:56,170 >> Ale na druhú stranu, môžete si dokonca ani vložiť niečo do stredu poľa 769 00:35:56,170 --> 00:35:58,200 v prípade, že rýchlosť nie je celkom naplnený. 770 00:35:58,200 --> 00:36:03,010 Napríklad, ak je toto pole tu o veľkosti šesť má iba päť vecí v ňom, 771 00:36:03,010 --> 00:36:06,080 No, stačí pripnúť niečo na koniec. 772 00:36:06,080 --> 00:36:08,200 Ale čo keď chcete vložiť niečo do stredu 773 00:36:08,200 --> 00:36:11,280 pole, aj keď by to mohlo mať päť zo šiestich vecí v ňom? 774 00:36:11,280 --> 00:36:14,250 >> No, čo sme robili, keď sme mali všetci našich ľudských dobrovoľníkov na pódiu v 775 00:36:14,250 --> 00:36:15,110 týždňov minulosti? 776 00:36:15,110 --> 00:36:18,710 Ak by sme chceli dať niekoho tu, a to buď títo ľudia, ako presunúť 777 00:36:18,710 --> 00:36:22,540 spôsobom, alebo títo ľudia, ako presunúť spôsobom, a ktorý sa stal drahé. 778 00:36:22,540 --> 00:36:26,950 Presun ľudí vnútri Polia skončil sčítaním a kalkulácie 779 00:36:26,950 --> 00:36:31,240 nám čas, a preto mnoho z našich n štvorcový doby chodu ako vloženie druhu, pre 780 00:36:31,240 --> 00:36:32,550 inštancie, v najhoršom veci. 781 00:36:32,550 --> 00:36:36,520 Takže polia sú skvelé, ale musíte vopred vedieť, aký veľký chcete mať. 782 00:36:36,520 --> 00:36:38,030 >> Takže OK, tu je riešením. 783 00:36:38,030 --> 00:36:43,860 Ak nemám vedieť vopred, koľko Študenti by som mohol mať, a viem, že raz 784 00:36:43,860 --> 00:36:47,870 Rozhodol som sa, aj keď, som uviazol s tým mnoho študentov, prečo nie Vždy som si 785 00:36:47,870 --> 00:36:51,740 prideliť dvakrát toľko miesta ako som si myslieť, budem potrebovať? 786 00:36:51,740 --> 00:36:54,450 Nie je to rozumné riešenie? 787 00:36:54,450 --> 00:36:58,240 >> Realisticky, nemyslím si, že sme budete potrebovať viac než 50 sloty 788 00:36:58,240 --> 00:37:02,190 v poli pre strednej veľkostnej triedy, tak nech to jednoducho zohnať. 789 00:37:02,190 --> 00:37:07,040 Urobím 100 slotov v mojom poli, len takže rozhodne môžeme získať 790 00:37:07,040 --> 00:37:10,330 počet študentov očakávam, že byť v niektorých stredne veľké triedy. 791 00:37:10,330 --> 00:37:14,320 Tak prečo nie len zaokrúhliť nahor a prideliť viac pamäte, zvyčajne na poli 792 00:37:14,320 --> 00:37:16,290 než si myslíte, že budete ešte potrebovať? 793 00:37:16,290 --> 00:37:20,190 Čo je to jednoduchá pushback k tomuto nápadu? 794 00:37:20,190 --> 00:37:21,440 >> Vy ste len strácaš pamäť. 795 00:37:21,440 --> 00:37:25,350 Doslova každý program, ktorý potom napísať je potrebné používať dvakrát toľko pamäte, koľko 796 00:37:25,350 --> 00:37:26,680 budete skutočne potrebovať. 797 00:37:26,680 --> 00:37:28,990 A to jednoducho nemá pocit, obzvlášť elegantné riešenie. 798 00:37:28,990 --> 00:37:31,990 Okrem toho, že znižuje len pravdepodobnosť problému. 799 00:37:31,990 --> 00:37:35,300 Ak sa vám stalo, populárny kurz jeden semester a máte 101 800 00:37:35,300 --> 00:37:39,610 študentov, váš program je čoraz zásadne čelí rovnakému problému. 801 00:37:39,610 --> 00:37:44,280 >> Takže našťastie, je tu riešenie tento inzerát všetky naše problémy v podobe 802 00:37:44,280 --> 00:37:46,790 dátových štruktúr, ktoré sú zložitejšie, než tie, ktoré 803 00:37:46,790 --> 00:37:47,970 sme videli doteraz. 804 00:37:47,970 --> 00:37:50,530 To tvrdím, je prepojený zoznam. 805 00:37:50,530 --> 00:37:51,920 Toto je zoznam čísel - 806 00:37:51,920 --> 00:37:54,970 9, 17, 22, 26, a 34 - 807 00:37:54,970 --> 00:38:00,120 , Ktoré sú navzájom prepojené prostredníctvom z toho, čo som kresleny ako šípky. 808 00:38:00,120 --> 00:38:03,580 >> Inými slovami, keby som chcel reprezentovať pole, som mohol robiť 809 00:38:03,580 --> 00:38:04,910 niečo také. 810 00:38:04,910 --> 00:38:07,310 A ja dám to na strope za chvíľu. 811 00:38:07,310 --> 00:38:09,970 Čo som mohol urobiť - 812 00:38:09,970 --> 00:38:12,520 Dobrý deň, v pohode. 813 00:38:12,520 --> 00:38:14,470 Vydržte. 814 00:38:14,470 --> 00:38:17,360 Nový počítač tu, jasný - 815 00:38:17,360 --> 00:38:18,090 v pohode. 816 00:38:18,090 --> 00:38:21,730 >> Takže keď mám tieto čísla v poli - 817 00:38:21,730 --> 00:38:28,880 9, 17, 22, 26, 24 - 818 00:38:28,880 --> 00:38:30,530 nie nevyhnutne v mierke. 819 00:38:30,530 --> 00:38:33,730 Dobre, takže tu je moja poľa - 820 00:38:33,730 --> 00:38:34,980 ach môj bože. 821 00:38:34,980 --> 00:38:38,700 822 00:38:38,700 --> 00:38:40,395 Dobre, takže tu je moje pole. 823 00:38:40,395 --> 00:38:44,110 824 00:38:44,110 --> 00:38:45,050 Ach môj bože. 825 00:38:45,050 --> 00:38:48,820 >> [Smiech] 826 00:38:48,820 --> 00:38:49,440 >> DAVID Malan: Predstierať. 827 00:38:49,440 --> 00:38:52,330 Je to príliš veľa úsilia vrátiť a opraviť to, takže - 828 00:38:52,330 --> 00:38:54,290 26. 829 00:38:54,290 --> 00:38:57,650 Takže máme túto sériu 9, 17, 22, 26, a 34. 830 00:38:57,650 --> 00:39:00,260 Pre tých z vás, môžete vidieť chybou, som urobil, 831 00:39:00,260 --> 00:39:00,830 tu to je. 832 00:39:00,830 --> 00:39:04,490 >> Takže tvrdím, že je to veľmi efektívne riešenie. 833 00:39:04,490 --> 00:39:07,310 Som rozdelila mnohých ints ako Potrebujem - jeden, dva, tri, 834 00:39:07,310 --> 00:39:09,100 štyri, päť, alebo šesť - 835 00:39:09,100 --> 00:39:11,660 a ja som potom uložené na čísla Vnútri tohto poľa. 836 00:39:11,660 --> 00:39:15,220 Ale predpokladám, potom chcem vložiť hodnota ako číslo 8? 837 00:39:15,220 --> 00:39:16,100 No, ak to ide? 838 00:39:16,100 --> 00:39:18,530 Dajme tomu, že chcete vložiť číslo ako 20. 839 00:39:18,530 --> 00:39:19,790 No, ak to ide? 840 00:39:19,790 --> 00:39:23,160 Niekde uprostred, alebo č 35, musí ísť 841 00:39:23,160 --> 00:39:24,010 niekde na konci. 842 00:39:24,010 --> 00:39:25,320 Ale ja som všetko z vesmíru. 843 00:39:25,320 --> 00:39:29,120 >> A tak to je zásadnou výzvou polí, ktoré sú riešenie. 844 00:39:29,120 --> 00:39:32,280 Som tvrdil pred chvíľou, getString tento problém rieši. 845 00:39:32,280 --> 00:39:37,380 Ak chcete vložiť šestina číslo do tohto poľa, to, čo je aspoň jedna 846 00:39:37,380 --> 00:39:40,090 Riešenie môžete oprieť o isté, rovnako ako my s getString? 847 00:39:40,090 --> 00:39:44,340 848 00:39:44,340 --> 00:39:46,030 Čo je to? 849 00:39:46,030 --> 00:39:48,190 >> No, aby to väčšia je ľahšie povie, ako urobí. 850 00:39:48,190 --> 00:39:52,810 Nemôžeme nutne polia väčšie, ale čo môžeme robiť? 851 00:39:52,810 --> 00:39:56,570 Vytvorte nové pole, ktoré je väčšie, o veľkosti 6, alebo možná veľkosť 10, ak chceme 852 00:39:56,570 --> 00:40:00,490 dostať so pred vecami, potom skopírujte staré poľa do novej, a potom 853 00:40:00,490 --> 00:40:01,680 uvoľniť staré poľa. 854 00:40:01,680 --> 00:40:05,770 >> Ale čo je to doba chodu sa tohto procese? 855 00:40:05,770 --> 00:40:09,870 Je to veľký O n, pretože kopírovanie je to bude stáť nejaké jednotky 856 00:40:09,870 --> 00:40:13,480 čas, takže nie je tak ideálny, ak máme prideliť nové pole, ktoré sa deje 857 00:40:13,480 --> 00:40:15,610 konzumovať dvakrát toľko pamäte iba dočasne. 858 00:40:15,610 --> 00:40:16,660 Skopírujte starej do novej - 859 00:40:16,660 --> 00:40:18,800 Myslím, že je to len bolesť hlavy, ktorá je opäť dôvod, prečo sme písali 860 00:40:18,800 --> 00:40:19,920 GetString pre vás. 861 00:40:19,920 --> 00:40:21,380 >> Takže to, čo by sme mohli robiť namiesto toho? 862 00:40:21,380 --> 00:40:25,000 No, a čo keď naše dátová štruktúra v skutočnosti má medzery v ňom? 863 00:40:25,000 --> 00:40:30,790 Dajme tomu, že som si oddýchnuť svojho cieľa s súvislé kusy pamäti, kde 9 864 00:40:30,790 --> 00:40:34,500 sa nachádza priamo pri 17, ktorý je priamo pri 22, a tak ďalej. 865 00:40:34,500 --> 00:40:39,570 >> A predpokladám, že 9 môže byť tu v RAM a 17 môže byť tu v pamäti RAM, 866 00:40:39,570 --> 00:40:40,990 a 22 môže byť tu v RAM. 867 00:40:40,990 --> 00:40:43,610 Inými slovami, nepotrebujem je aj chrbtom k sebe ešte. 868 00:40:43,610 --> 00:40:47,850 Len musím nejako navliecť ihlu cez každú z týchto čísel, alebo každý 869 00:40:47,850 --> 00:40:51,010 z týchto uzlov, ako zavoláme obdĺžniky, ako som ich nakreslil, na 870 00:40:51,010 --> 00:40:55,670 Spomínam si, ako sa dostať na poslednú ako uzol z prvej. 871 00:40:55,670 --> 00:40:59,940 >> Takže to, čo je programová konštrukcia Videli sme celkom nedávno, s ktorými som 872 00:40:59,940 --> 00:41:03,030 môžu realizovať toto vlákno, alebo ťahané tu, s ktorými môžem 873 00:41:03,030 --> 00:41:05,430 vykonanie týchto šípok? 874 00:41:05,430 --> 00:41:06,500 Takže ukazovatele, nie? 875 00:41:06,500 --> 00:41:09,560 Keby som prideliť nielen int, ale uzol - a 876 00:41:09,560 --> 00:41:10,810 uzol, Chcem len povedať kontajnera. 877 00:41:10,810 --> 00:41:12,900 A vizuálne, myslím obdĺžnik. 878 00:41:12,900 --> 00:41:16,420 Takže uzol zrejme nutné obsahuje dve hodnoty - 879 00:41:16,420 --> 00:41:21,490 int sám, potom, ako vyplýva z Spodná polovica obdĺžnika, 880 00:41:21,490 --> 00:41:23,010 dostatok priestoru pre int. 881 00:41:23,010 --> 00:41:26,130 >> Takže stačí myslieť dopredu tu aký veľký je tento uzol, tento 882 00:41:26,130 --> 00:41:27,170 nádoba otázku? 883 00:41:27,170 --> 00:41:29,250 Koľko bajtov pre int? 884 00:41:29,250 --> 00:41:31,310 Pravdepodobne 4, ak je to ako obvykle. 885 00:41:31,310 --> 00:41:33,270 A potom, koľko bajtov pre ukazovatele? 886 00:41:33,270 --> 00:41:33,650 4. 887 00:41:33,650 --> 00:41:37,940 Takže ukážte tento obal alebo tento uzol je bude 8-byte štruktúry. 888 00:41:37,940 --> 00:41:41,760 Jo, a to je šťastná náhoda, že sme práve predstavil tento pojem 889 00:41:41,760 --> 00:41:44,400 struct alebo konštrukcie C. 890 00:41:44,400 --> 00:41:48,890 >> Takže tvrdím, že chcem urobiť krok k tejto sofistikovanejšie 891 00:41:48,890 --> 00:41:52,560 implementácie zoznamu čísiel, na spájať zoznam čísel, musím urobiť 892 00:41:52,560 --> 00:41:56,920 trochu viac premýšľať dopredu a vyhlásiť nielen int, ale struct 893 00:41:56,920 --> 00:41:58,620 že zavolám, konvenčne tu uzol. 894 00:41:58,620 --> 00:42:01,630 Mohli by sme hovoriť, čo chceme, ale uzol bude tematicky veľa 895 00:42:01,630 --> 00:42:03,560 z vecí, začneme hľadať teraz. 896 00:42:03,560 --> 00:42:06,480 >> Vnútri tohto uzla je int n 897 00:42:06,480 --> 00:42:09,350 A potom táto syntaxe, trochu divné na prvý pohľad - 898 00:42:09,350 --> 00:42:12,960 struct node * ďalšie. 899 00:42:12,960 --> 00:42:16,900 No obrazovo, čo to je? 900 00:42:16,900 --> 00:42:21,000 , Že je spodná polovica obdĺžnik, ktorý sme videli 901 00:42:21,000 --> 00:42:22,730 pred chvíľou. 902 00:42:22,730 --> 00:42:27,600 >> Ale prečo to hovorím struct uzol * ako protiľahlý k len uzla *? 903 00:42:27,600 --> 00:42:31,370 Vzhľadom k tomu, že ak ukazovateľ ukazuje na inom uzle, je to len 904 00:42:31,370 --> 00:42:32,760 adresa uzla. 905 00:42:32,760 --> 00:42:35,630 To je v súlade s tým, čo máme diskutovali o ukazovatele tak ďaleko. 906 00:42:35,630 --> 00:42:39,690 Ale prečo, keď tvrdím, je táto štruktúra tzv uzol, musím povedať, struct 907 00:42:39,690 --> 00:42:42,660 uzol tu vnútri? 908 00:42:42,660 --> 00:42:43,190 >> Presne tak. 909 00:42:43,190 --> 00:42:46,490 Je to akýsi stupídny reality C. Typedef, aby som tak povedal, nemá 910 00:42:46,490 --> 00:42:47,220 nestalo. 911 00:42:47,220 --> 00:42:48,510 C je super doslovný. 912 00:42:48,510 --> 00:42:51,050 To znie kódový vrchol na nadol, zľava doprava. 913 00:42:51,050 --> 00:42:54,930 A kým nenarazí, že bodkočiarku na Sčítané a podčiarknuté, hádaj čo nie 914 00:42:54,930 --> 00:42:57,590 existovať ako dátový typ? 915 00:42:57,590 --> 00:42:59,060 Uzol, citujem koniec citátu uzol. 916 00:42:59,060 --> 00:43:03,050 >> Ale pretože kompletnejší vyhlásenie som na prvom riadku - 917 00:43:03,050 --> 00:43:05,340 typedef struct uzol - 918 00:43:05,340 --> 00:43:08,790 , Pretože to bolo skôr, než Zložené zátvorky, to je niečo ako 919 00:43:08,790 --> 00:43:11,800 pre-vzdelávanie zvonenie to, že ste Viete čo, dajte mi struct 920 00:43:11,800 --> 00:43:13,570 tzv struct uzol. 921 00:43:13,570 --> 00:43:16,270 Úprimne povedané, nemám rád nazývať veci pravými struct uzol, uzol struct všetky 922 00:43:16,270 --> 00:43:17,090 po celom mojom kóde. 923 00:43:17,090 --> 00:43:20,660 Ale budem používať len raz, len vo vnútri, takže môžem efektívne 924 00:43:20,660 --> 00:43:25,010 vytvoriť akýsi cyklický odkaz, nie je ukazovateľ na seba sama o sebe, ale 925 00:43:25,010 --> 00:43:29,400 ukazovateľ na druhú rovnakého typu. 926 00:43:29,400 --> 00:43:32,330 >> Tak sa ukazuje, že na dátové štruktúry ako je toto, tam je málo 927 00:43:32,330 --> 00:43:34,470 operácie, ktoré by mohli byť zaujímať nás. 928 00:43:34,470 --> 00:43:37,460 Mohli by sme vložiť do zoznamu, ako je tento. 929 00:43:37,460 --> 00:43:39,850 Mohli by sme odstrániť zo zoznamu, ako je táto. 930 00:43:39,850 --> 00:43:43,490 Mohli by sme vyhľadávať v zozname pre hodnoty, alebo všeobecnejšie, traverz. 931 00:43:43,490 --> 00:43:46,410 A traverz je len fantázia spôsob hovorí začiatok na ľavej strane a presunúť všetky 932 00:43:46,410 --> 00:43:47,650 úplne doprava. 933 00:43:47,650 --> 00:43:52,640 >> A upozornenie, aj keď to o niečo viac sofistikované dátové štruktúry, nech 934 00:43:52,640 --> 00:43:56,510 ja navrhujem, aby sme si požičať niektoré z myšlienky v posledných dvoch týždňoch a 935 00:43:56,510 --> 00:43:58,410 implementovať funkciu s názvom hľadať takhle. 936 00:43:58,410 --> 00:44:01,360 Bude to vráti hodnotu true alebo false, čo znamená, áno, alebo 937 00:44:01,360 --> 00:44:03,390 no, n je v zozname. 938 00:44:03,390 --> 00:44:05,960 Druhým argumentom je ukazovateľ na samotný zoznam, aby 939 00:44:05,960 --> 00:44:07,920 ukazovateľ na uzol. 940 00:44:07,920 --> 00:44:10,350 >> Všetko, čo budem dovtedy robiť, je vyhlásiť, dočasné premenné. 941 00:44:10,350 --> 00:44:12,730 Nazveme to PTR konvencie, pre ukazovateľ. 942 00:44:12,730 --> 00:44:15,220 A ja priradiť je rovná na začiatku zoznamu. 943 00:44:15,220 --> 00:44:16,680 >> A teraz si všimnite while. 944 00:44:16,680 --> 00:44:20,640 Tak dlho, kým nie je ukazovateľ rovný na hodnotu null, idem skontrolovať. 945 00:44:20,640 --> 00:44:24,520 Je ukazovateľ šípka n rovné n, ktorý bol schválený v roku? 946 00:44:24,520 --> 00:44:26,410 A čakať minútu - nový kus syntaxe. 947 00:44:26,410 --> 00:44:29,324 Čo je šípka naraz? 948 00:44:29,324 --> 00:44:30,574 Jo? 949 00:44:30,574 --> 00:44:34,200 950 00:44:34,200 --> 00:44:34,810 >> Presne tak. 951 00:44:34,810 --> 00:44:38,860 Takže zatiaľ čo pred pár minútami sme použili tečkové notáciu pre prístup k čo 952 00:44:38,860 --> 00:44:43,080 vnútri struct, v prípade, že premenná ste nie struct 953 00:44:43,080 --> 00:44:47,420 sama o sebe, ale ukazovateľ na struct, našťastie kus syntax, ktorá 954 00:44:47,420 --> 00:44:48,620 Konečne je intuitívne zmysel. 955 00:44:48,620 --> 00:44:52,360 Šípka znamená nasledovať ukazovateľ, ako naše šípy zvyčajne znamená 956 00:44:52,360 --> 00:44:56,570 obrazovo a prejdite na Dátové pole vnútri. 957 00:44:56,570 --> 00:44:59,700 Takže šípka je to isté ako bodka, ale ho použiť, keď máte ukazovateľ. 958 00:44:59,700 --> 00:45:05,270 >> Tak len zhrnúť potom, v prípade, že pole n vnútri struct tzv ukazovateľ 959 00:45:05,270 --> 00:45:07,760 rovná sa rovná n, vráti hodnotu true. 960 00:45:07,760 --> 00:45:11,970 Inak tento riadok tu - ukazovateľ rovná ukazovateľ ďalšie. 961 00:45:11,970 --> 00:45:17,540 Takže čo to robí, oznámenia, ak je I V súčasnej dobe ukázal na struct 962 00:45:17,540 --> 00:45:21,430 obsahujúci 9 a 9 nie je číslo Hľadám - predpokladám, Hľadám 963 00:45:21,430 --> 00:45:22,830 pre n sa rovná 50 - 964 00:45:22,830 --> 00:45:25,930 Chystám sa aktualizovať dočasný ukazovateľ nehovoriac v tomto uzle 965 00:45:25,930 --> 00:45:31,190 už nie, ale ukazovateľ šípku vedľa, čo bude, aby ma tu. 966 00:45:31,190 --> 00:45:34,270 >> Teraz som si uvedomil, je víchrica úvod. 967 00:45:34,270 --> 00:45:37,380 V stredu budeme vlastne robiť to s niektorými ľuďmi a niektoré ďalšie 968 00:45:37,380 --> 00:45:38,900 Kód pomalším tempom. 969 00:45:38,900 --> 00:45:42,990 Ale uvedomiť, budeme teraz robiť naše dáta zložitejšie štruktúry, aby naše 970 00:45:42,990 --> 00:45:45,780 algoritmy môžu získať efektívnejšie, čo bude podmienkou pre 971 00:45:45,780 --> 00:45:50,500 pset šesť, keď načítame do opäť tí, 150.000 slov, ale je potrebné k tomu, aby 972 00:45:50,500 --> 00:45:55,650 efektívne, a ideálne, vytvárať program, ktorý beží pre našich užívateľov nie je 973 00:45:55,650 --> 00:46:00,460 lineárne, a to v n na druhú, ale v konštantný čas, v ideálu. 974 00:46:00,460 --> 00:46:02,300 >> Uvidíme sa v stredu. 975 00:46:02,300 --> 00:46:07,240 >> SPEAKER: Na ďalší CS50, David zabudne na svoje základné prípad. 976 00:46:07,240 --> 00:46:12,770 >> DAVID Malan: A to je, ako posielať textové správy s C. Co - 977 00:46:12,770 --> 00:46:14,020 >> [VARIOUS textovú správu Zvuky oznámení] 978 00:46:14,020 --> 00:46:19,734