1 00:00:00,000 --> 00:00:11,200 2 00:00:11,200 --> 00:00:12,580 >> DAVID Malan: U redu, dobrodošao natrag. 3 00:00:12,580 --> 00:00:13,290 Ovo je CS50. 4 00:00:13,290 --> 00:00:15,130 Ovo je početak tjedna sedam. 5 00:00:15,130 --> 00:00:18,890 Dakle, to je bio neko vrijeme, pa sam pomislio da bih se u vihoru obilazak gdje smo 6 00:00:18,890 --> 00:00:20,760 stali, a gdje smo sada idemo. 7 00:00:20,760 --> 00:00:23,310 >> Dakle, ova stvar ovdje može imati izazvalo neke tjeskobe na prvom mjestu. 8 00:00:23,310 --> 00:00:27,680 No, nadamo se, da ste na početku aklimatizirati se što to označava ovdje - 9 00:00:27,680 --> 00:00:32,670 star predstavlja pokazivač, koji je samo ono, u više laik uvjete? 10 00:00:32,670 --> 00:00:33,400 Tako da je adresa. 11 00:00:33,400 --> 00:00:35,490 >> Dakle, to je adresa nešto u sjećanju. 12 00:00:35,490 --> 00:00:38,260 I počeli smo guliti natrag slojeve Prije nekoliko tjedana, stvari se sviđa 13 00:00:38,260 --> 00:00:41,800 GetString i druge takve funkcije sve ovo vrijeme su se vraćaju 14 00:00:41,800 --> 00:00:46,010 Adrese stvari u sjećanju, kao što su adresu prvi znak u 15 00:00:46,010 --> 00:00:46,990 neki slijed. 16 00:00:46,990 --> 00:00:50,360 >> Dakle, mi također predstavio Valgrind, koji vi ćete početi koristiti za ovaj problem 17 00:00:50,360 --> 00:00:53,380 postavljanje, osobito za sljedeći Problem postavljena kao dobro. 18 00:00:53,380 --> 00:00:54,980 I Valgrind što radi za nas? 19 00:00:54,980 --> 00:00:57,520 20 00:00:57,520 --> 00:01:01,020 Ona provjerava za pamćenje pukotina, i to Također provjerava za zloporabu memorije. 21 00:01:01,020 --> 00:01:05,890 >> To može, s nekom vjerojatnošću, otkriti ako vaš broj će se dotaknuti memorije 22 00:01:05,890 --> 00:01:07,100 da se jednostavno ne trebaju. 23 00:01:07,100 --> 00:01:10,410 Dakle, ne nužno curenja, ali ako vas ići izvan granica pojedinih 24 00:01:10,410 --> 00:01:14,730 polje, a vi zapravo pokrenuti Valgrind i poticati takvo ponašanje, a 25 00:01:14,730 --> 00:01:17,870 Valgrind je pokrenut u svoj program je prikazivati ​​unutar nje, da ćete dobiti 26 00:01:17,870 --> 00:01:21,460 poruke poput ove: - "nevažeća pisati o veličine 4 ", koji je, prisjetimo nekoliko 27 00:01:21,460 --> 00:01:25,880 tjedana značilo da sam imao slučajno željeli na jednom int predaleko 28 00:01:25,880 --> 00:01:27,250 izvan granica niza. 29 00:01:27,250 --> 00:01:30,790 I tako veličine 4 ovdje znači veličinu od tog int. 30 00:01:30,790 --> 00:01:35,260 >> Tako se sigurnost u činjenici da Valgrind je izlaz, format njega, 31 00:01:35,260 --> 00:01:36,170 samo je grozno. 32 00:01:36,170 --> 00:01:40,180 To je stvarno teško vidjeti kroz nered za zanimljivih informacija. 33 00:01:40,180 --> 00:01:42,910 Dakle, ono što smo učinili ovdje je samo izvadak Neki od nekoliko više 34 00:01:42,910 --> 00:01:43,850 zanimljive linije. 35 00:01:43,850 --> 00:01:46,760 Ali shvatite da je 80% Valgrind-a Izlaz će biti malo 36 00:01:46,760 --> 00:01:47,650 distrakcija. 37 00:01:47,650 --> 00:01:52,820 >> Dovoljno je tražiti uzorke poput ovih - nevažeća pravo, nevažeća pročitati, 40 bajtova 38 00:01:52,820 --> 00:01:56,690 a neki broj blokova su definitivno izgubili, ključne riječi kao što je to. 39 00:01:56,690 --> 00:02:01,920 A ono što ćete vidjeti nadamo se neki vrsta tragu onoga što funkcionira 40 00:02:01,920 --> 00:02:03,340 pogreška je zapravo u. 41 00:02:03,340 --> 00:02:07,195 U ovom slučaju ovdje, u ono linija moj broj je očito pogreška? 42 00:02:07,195 --> 00:02:09,729 43 00:02:09,729 --> 00:02:14,130 >> 26 u datoteci pod nazivom memory.c, što je Primjer smo igrali s 44 00:02:14,130 --> 00:02:14,890 u tom trenutku. 45 00:02:14,890 --> 00:02:16,460 Tako da je vjerojatno nije u malloc. 46 00:02:16,460 --> 00:02:18,630 To je vjerojatno bio u mom kodu umjesto. 47 00:02:18,630 --> 00:02:20,910 Tako ćemo to opet vidjeti i opet ne zadugo. 48 00:02:20,910 --> 00:02:24,080 >> Dakle scanf, ovaj je došao u par formi do sada. 49 00:02:24,080 --> 00:02:26,410 Vidjeli smo sscanf kratko. 50 00:02:26,410 --> 00:02:28,330 To je nešto što broj što zaronio u svoj 51 00:02:28,330 --> 00:02:29,535 Pripreme za kviz. 52 00:02:29,535 --> 00:02:33,130 I scanf je zapravo ono CS50 Knjižnica je koristio ispod 53 00:02:33,130 --> 00:02:36,560 napa za neko vrijeme kako bi da se informacije od korisnika. 54 00:02:36,560 --> 00:02:40,420 >> Na primjer, ako sam premjestiti na CS50 Aparat ovdje, neka mi se otvaraju 55 00:02:40,420 --> 00:02:45,315 Primjer je danas da se zove scanf-0.c I to je super jednostavna. 56 00:02:45,315 --> 00:02:46,590 To je samo nekoliko linija koda. 57 00:02:46,590 --> 00:02:50,880 Ali to pokazuje koliko je uistinu getInt je radio sve ovo vrijeme. 58 00:02:50,880 --> 00:02:54,710 >> U ovom programu ovdje, u liniji 16 , Obavijest da sam proglasiti int. 59 00:02:54,710 --> 00:02:57,270 Dakle, ništa ne upućuje čarobno postoji, samo int. 60 00:02:57,270 --> 00:03:00,330 Tada je u skladu 17, sam zatražiti Korisnik za broj, molim vas. 61 00:03:00,330 --> 00:03:02,930 Onda je krajem 18., ja koristiti scanf ovdje. 62 00:03:02,930 --> 00:03:06,910 I sam je navedeno, vrsta kao printf, da sam očekivao citat 63 00:03:06,910 --> 00:03:08,110 završen citat postotku ja. 64 00:03:08,110 --> 00:03:10,920 >> Tako sam odsto, naravno, označava int. 65 00:03:10,920 --> 00:03:14,580 Ali primijetiti što drugi Argument da je scanf. 66 00:03:14,580 --> 00:03:17,350 Kako bi ste opisali drugi Argument iza zareza? 67 00:03:17,350 --> 00:03:19,450 Što je to? 68 00:03:19,450 --> 00:03:20,670 >> To je adresa x. 69 00:03:20,670 --> 00:03:25,490 Dakle, ovo je korisno jer pružanjem scanf s adresom x, što se 70 00:03:25,490 --> 00:03:29,560 koji osnažiti tu funkciju učiniti? 71 00:03:29,560 --> 00:03:33,010 Ne samo tamo, već i to što? 72 00:03:33,010 --> 00:03:34,060 >> Napravite promjenu u njemu. 73 00:03:34,060 --> 00:03:38,080 Budući da možete otići tamo, to je vrsta kao karte na mjesto u memoriji. 74 00:03:38,080 --> 00:03:41,900 I tako dugo dok vam pružiti scanf, ili bilo funkciju s takvim karti, te 75 00:03:41,900 --> 00:03:45,840 funkcija može otići tamo, a ne samo pogledajte vrijednosti, ali to također može 76 00:03:45,840 --> 00:03:49,670 promijeniti tu vrijednost, što je korisno ako svrha u životu je da se scanf 77 00:03:49,670 --> 00:03:53,060 skeniranje informacije od korisnika, posebno od tipkovnice. 78 00:03:53,060 --> 00:03:57,830 I f označava formatiran, baš kao i printf, f označava formatirani 79 00:03:57,830 --> 00:03:58,930 niz koji želite ispisati. 80 00:03:58,930 --> 00:04:04,430 >> Dakle, ukratko, ovaj redak 18 jednostavno kaže, pokušati pročitati int iz korisničkog 81 00:04:04,430 --> 00:04:10,420 Tipkovnica i pohraniti unutar x, na sve što se događa adresa x živjeti kod. 82 00:04:10,420 --> 00:04:14,860 I onda na kraju, linija 19 samo kaže, hvala na int, u ovom slučaju. 83 00:04:14,860 --> 00:04:15,940 >> Zato mi dopustite da ići naprijed i učiniti to. 84 00:04:15,940 --> 00:04:18,570 Tako bi scanf 0. 85 00:04:18,570 --> 00:04:20,130 Dopustite mi da ide naprijed i zumiranje u. 86 00:04:20,130 --> 00:04:22,960 Idem i pokrenuti ovu s točkice slash scanf 0. 87 00:04:22,960 --> 00:04:24,020 Broj, molim te? 88 00:04:24,020 --> 00:04:24,720 50. 89 00:04:24,720 --> 00:04:25,730 Hvala na 50 godina. 90 00:04:25,730 --> 00:04:27,270 Dakle, to je vrlo jednostavna. 91 00:04:27,270 --> 00:04:28,160 >> Sada ono što se ne radi? 92 00:04:28,160 --> 00:04:29,940 To se ne radi cijela hrpa od provjere pogreške. 93 00:04:29,940 --> 00:04:33,000 Na primjer, ako ja ne surađuju, i ne upisati broj, ali 94 00:04:33,000 --> 00:04:37,860 umjesto da napišem nešto poput "Hello" to je samo vrsta čudno. 95 00:04:37,860 --> 00:04:41,130 I tako jedna od stvari CS50 Knjižnica je bio događaj za nas za neke 96 00:04:41,130 --> 00:04:43,440 Vrijeme je da reprompting i reprompting. 97 00:04:43,440 --> 00:04:49,320 >> Ponovno frazu opoziv bio u cs50.c, i to je razlog da je u getInt 98 00:04:49,320 --> 00:04:51,670 CS50 knjižnica je zapravo cijela Gomila linije duge, jer smo 99 00:04:51,670 --> 00:04:53,190 provjera za glupe stvari kao što je ovaj. 100 00:04:53,190 --> 00:04:55,730 Je li korisnik ne daju nas, u stvari, int? 101 00:04:55,730 --> 00:04:57,910 Je li on ili ona daje nam nešto kao abecednim slovom? 102 00:04:57,910 --> 00:05:01,410 Ako je tako, želimo otkriti da i vikati na njih. 103 00:05:01,410 --> 00:05:03,915 >> No, stvari postaju još zanimljivije u ovom sljedećem primjeru. 104 00:05:03,915 --> 00:05:09,840 Ako idem u scanf-1c, što je jedna stvar koja je iz temelja promijenila u 105 00:05:09,840 --> 00:05:11,135 Sljedeći primjer je ovo? 106 00:05:11,135 --> 00:05:13,690 107 00:05:13,690 --> 00:05:16,010 Ja sam koristeći char *, dakako, umjesto int. 108 00:05:16,010 --> 00:05:19,210 >> Dakle, ovo je zanimljivo, jer char *, Podsjetimo, je zapravo samo 109 00:05:19,210 --> 00:05:20,190 ista stvar kao string. 110 00:05:20,190 --> 00:05:23,840 Tako se osjeća kao možda i ovo je super jednostavna provedba GetString. 111 00:05:23,840 --> 00:05:26,010 Ali sam oguljen sloj od CS50 knjižnici, pa sam 112 00:05:26,010 --> 00:05:27,550 nazivajući ovu char * sada. 113 00:05:27,550 --> 00:05:30,070 Pa da vidimo gdje je, ako je bilo, možemo pogriješiti. 114 00:05:30,070 --> 00:05:30,840 >> Line 17 - 115 00:05:30,840 --> 00:05:33,950 I opet kažem, molim vas dajte mi nešto, u ovom slučaju, string. 116 00:05:33,950 --> 00:05:37,940 A onda u sljedećem retku, zovem scanf, opet, dajući mu oblik kodnog, 117 00:05:37,940 --> 00:05:39,310 ali to je vrijeme posto. 118 00:05:39,310 --> 00:05:41,900 A onda ovaj put, sam dajući joj tampon. 119 00:05:41,900 --> 00:05:43,550 >> Sada primijetiti, ja ne koristim znak za str. 120 00:05:43,550 --> 00:05:47,120 Ali zašto je to vjerojatno u redu ovdje? 121 00:05:47,120 --> 00:05:49,760 Jer, što je već tampon? 122 00:05:49,760 --> 00:05:50,770 Već je pointer. 123 00:05:50,770 --> 00:05:51,650 To je već adresa. 124 00:05:51,650 --> 00:05:54,510 >> I neka je ova riječ "zbuniti," pusti me Samo ga zovu s, primjerice, za 125 00:05:54,510 --> 00:05:55,050 jednostavnosti. 126 00:05:55,050 --> 00:05:58,250 Ali ja sam to nazvao tampon jer je u Općenito, u programiranju, ako imate 127 00:05:58,250 --> 00:06:02,130 komad memorije, što string stvarno samo je, možda ga zovu tampon. 128 00:06:02,130 --> 00:06:04,460 To je mjesto za pohranu informacija. 129 00:06:04,460 --> 00:06:07,400 >> Slično kao i stvari kao što su YouTube, kada oni buffering, da tako kažem, da je 130 00:06:07,400 --> 00:06:10,270 Samo znači da je skidanje bita iz internetu te ih pohranite u 131 00:06:10,270 --> 00:06:14,160 lokalnim polje, lokalna komad memorije, tako da ga možete gledati kasnije bez 132 00:06:14,160 --> 00:06:16,830 to preskakanje ili visi na ste tijekom reprodukcije. 133 00:06:16,830 --> 00:06:20,930 >> Dakle, postoji problem ovdje ipak, jer ja govorim scanf, očekujem 134 00:06:20,930 --> 00:06:22,320 string od korisnika. 135 00:06:22,320 --> 00:06:24,410 Evo adresa komad memorije. 136 00:06:24,410 --> 00:06:26,180 Stavite taj string tamo. 137 00:06:26,180 --> 00:06:31,230 Zašto je da je opkoljen daju nas problem, iako? 138 00:06:31,230 --> 00:06:33,490 >> Što je to? 139 00:06:33,490 --> 00:06:35,510 Smijem li pristupiti da je dio memorije? 140 00:06:35,510 --> 00:06:36,250 Znate, ja ne znam. 141 00:06:36,250 --> 00:06:39,210 Budući da je tampon inicijaliziralo na što? 142 00:06:39,210 --> 00:06:39,820 Ne zapravo. 143 00:06:39,820 --> 00:06:43,090 I to je ono što smo pozivom smeće vrijednost, koja 144 00:06:43,090 --> 00:06:44,040 nije formalno riječi. 145 00:06:44,040 --> 00:06:49,200 To samo znači da nemamo pojma što bita su unutar četiri bajtova koji 146 00:06:49,200 --> 00:06:51,240 Ja sam izdvojila kao tampon. 147 00:06:51,240 --> 00:06:52,450 >> Ja nisam nazvao malloc. 148 00:06:52,450 --> 00:06:53,940 Ja sam svakako ne zove GetString. 149 00:06:53,940 --> 00:06:56,380 Dakle, tko zna što je zapravo unutar tampon? 150 00:06:56,380 --> 00:07:00,550 A ipak govori scanf naslijepo, otići tamo i staviti sve što korisnik upisali. 151 00:07:00,550 --> 00:07:04,460 >> Dakle, što je vjerojatno da će izazvati u našem kodu, ako smo ga pokrenuti? 152 00:07:04,460 --> 00:07:05,700 Vjerojatno segfault. 153 00:07:05,700 --> 00:07:07,970 Možda i nije, ali vjerojatno segfault. 154 00:07:07,970 --> 00:07:10,620 I kažem možda i ne, jer ponekad što učiniti, ponekad 155 00:07:10,620 --> 00:07:11,380 da ne dobijete segfault. 156 00:07:11,380 --> 00:07:14,280 Ponekad jednostavno imali sreće, ali ipak će biti 157 00:07:14,280 --> 00:07:15,340 bug u našem programu. 158 00:07:15,340 --> 00:07:17,060 >> Zato mi dopustite da ići naprijed i sastaviti to. 159 00:07:17,060 --> 00:07:18,280 Ja ću učiniti da stara škola smjer. 160 00:07:18,280 --> 00:07:23,825 Tako jeka crtica 0, scanf-1, scanf-1c, Enter. 161 00:07:23,825 --> 00:07:24,720 Ups, previše stara škola. 162 00:07:24,720 --> 00:07:26,550 Idemo vidjeti. 163 00:07:26,550 --> 00:07:28,440 Gdje sam? 164 00:07:28,440 --> 00:07:29,700 Oh, char * tampon. 165 00:07:29,700 --> 00:07:33,595 166 00:07:33,595 --> 00:07:35,130 Oh, hvala ti - 167 00:07:35,130 --> 00:07:36,930 Spremi, OK - 168 00:07:36,930 --> 00:07:37,690 vrlo stara škola. 169 00:07:37,690 --> 00:07:38,900 U redu, to je bio neko vrijeme. 170 00:07:38,900 --> 00:07:41,720 >> Pa upravo sam spremili datoteku nakon odluka da se privremeno 171 00:07:41,720 --> 00:07:42,700 promijeniti trenutak prije. 172 00:07:42,700 --> 00:07:46,090 I sad sam ga sastavio Ručno jeka. 173 00:07:46,090 --> 00:07:49,500 A sada ću ići naprijed i pokrenuti scanf-1, Enter. 174 00:07:49,500 --> 00:07:50,290 Gudački molimo. 175 00:07:50,290 --> 00:07:51,600 Ja ću upisati "Hello". 176 00:07:51,600 --> 00:07:54,070 >> A sada, evo gdje je, iskreno, printf Možete je malo neugodno. 177 00:07:54,070 --> 00:07:56,020 Nije zapravo ide segfault u ovom slučaju. 178 00:07:56,020 --> 00:07:59,860 Printf je malo posebna jer to je tako super uobičajeno da 179 00:07:59,860 --> 00:08:03,570 printf suštini se radi nam milost i realizirati, 180 00:08:03,570 --> 00:08:04,830 to nije valjana pointer. 181 00:08:04,830 --> 00:08:09,080 Dopustite mi ga uzeti na sebe samo za ispis u zagradi null, čak 182 00:08:09,080 --> 00:08:13,340 iako to nije nužno ono što mi sami očekivali. 183 00:08:13,340 --> 00:08:16,940 >> Dakle, ne možemo uistinu jednostavno izazivati segfault s tim, ali to očito 184 00:08:16,940 --> 00:08:18,600 Nije ponašanje sam htjela. 185 00:08:18,600 --> 00:08:19,800 Dakle, ono što je jednostavno rješenje? 186 00:08:19,800 --> 00:08:25,650 Pa, u scanf-2, neka mi predlažemo da umjesto da zapravo samo dodjele 187 00:08:25,650 --> 00:08:30,100 char *, neka mi bude malo pametniji o ovo, i neka mi izdvojiti tampon 188 00:08:30,100 --> 00:08:32,940 kao niz od 16 znakova. 189 00:08:32,940 --> 00:08:34,200 >> Dakle, ja mogu to učiniti na nekoliko načina. 190 00:08:34,200 --> 00:08:35,610 Ja apsolutno mogu koristiti malloc. 191 00:08:35,610 --> 00:08:38,980 Ali ja mogu vratiti u tjedan dva, kada Trebala mi je cijela hrpa 192 00:08:38,980 --> 00:08:39,620 likovi. 193 00:08:39,620 --> 00:08:40,860 To je samo polje. 194 00:08:40,860 --> 00:08:44,870 Pa neka mi umjesto redefinirati tampon da se niz od 16 znakova. 195 00:08:44,870 --> 00:08:47,340 >> A sada, kada sam prođe u tampon - 196 00:08:47,340 --> 00:08:49,940 i to je nešto što se nije govoriti o dva u tjednu - 197 00:08:49,940 --> 00:08:53,730 ali se može liječiti niz kao iako je adresa. 198 00:08:53,730 --> 00:08:56,390 Tehnički gledano, kao što smo vidjeli, oni su malo drugačiji. 199 00:08:56,390 --> 00:09:01,290 Ali scanf neće imati ništa protiv ako to prođe naziv niza, jer je ono 200 00:09:01,290 --> 00:09:05,030 Dong će učiniti za nas je bitno liječenje ime tog polja kao 201 00:09:05,030 --> 00:09:08,280 adresa s blokom od 16 bajtova. 202 00:09:08,280 --> 00:09:09,550 >> Dakle, to je bolje. 203 00:09:09,550 --> 00:09:12,110 To znači da sada mogu nadamo učiniti sljedeće. 204 00:09:12,110 --> 00:09:16,800 Dopustite mi povećali za trenutak i to bi scanf-2, sastavio OK. 205 00:09:16,800 --> 00:09:19,390 Sada neka mi to dobio crtu scanf-2. 206 00:09:19,390 --> 00:09:22,430 Gudački molimo. "Zdravo." I to Činilo se da rade ovaj put. 207 00:09:22,430 --> 00:09:26,020 >> No, može netko predložiti scenarij u kojoj se još uvijek ne bi mogli raditi? 208 00:09:26,020 --> 00:09:28,550 Da? 209 00:09:28,550 --> 00:09:30,640 Nešto više od 16 znakova. 210 00:09:30,640 --> 00:09:32,020 I zapravo, možemo biti malo precizniji. 211 00:09:32,020 --> 00:09:36,540 Nešto duže od 15 znakova, jer stvarno moramo imati na umu 212 00:09:36,540 --> 00:09:39,920 da mi je potrebno da se crticu nula implicitno na kraju niza, 213 00:09:39,920 --> 00:09:42,950 što je na stranu scanf će obično brinuti za nas. 214 00:09:42,950 --> 00:09:46,210 >> Pa neka mi napraviti nešto slično - 215 00:09:46,210 --> 00:09:48,040 Ponekad mi samo možemo ostavite kao što je to. 216 00:09:48,040 --> 00:09:50,630 U redu, tako da smo sada izazvana naš segmentacije kriv. 217 00:09:50,630 --> 00:09:51,000 Zašto? 218 00:09:51,000 --> 00:09:54,940 Zato što sam upisali u više od 15 likovi, pa mi smo zapravo 219 00:09:54,940 --> 00:09:58,280 dotakla memorije da sam zapravo ne bi trebali imati. 220 00:09:58,280 --> 00:10:00,180 >> Dakle, ono što je stvarno rješenje ovdje? 221 00:10:00,180 --> 00:10:02,210 Pa, što ako nam je potrebno duže string? 222 00:10:02,210 --> 00:10:03,960 Pa, mi bi ga možda 32 bajtova. 223 00:10:03,960 --> 00:10:05,160 Pa, što ako to nije dovoljno dugo? 224 00:10:05,160 --> 00:10:06,040 Kako oko 64 bajtova? 225 00:10:06,040 --> 00:10:07,080 Što ako to nije dovoljno dugo? 226 00:10:07,080 --> 00:10:09,640 Kako oko 128 ili 200 bajtova? 227 00:10:09,640 --> 00:10:12,660 Ono što je stvarno rješenje ovdje u opći slučaj, ako ne znamo u 228 00:10:12,660 --> 00:10:14,460 unaprijed što će korisnik upisati? 229 00:10:14,460 --> 00:10:20,000 230 00:10:20,000 --> 00:10:23,050 >> To je samo vrsta velikom boli u dupe, da budem iskren, što je razlog zašto 231 00:10:23,050 --> 00:10:29,050 CS50 knjižnica ima nekoliko desetaka redaka kod koji zajednički provode 232 00:10:29,050 --> 00:10:32,390 GetString string na način da mi ne Morate znati unaprijed što 233 00:10:32,390 --> 00:10:33,430 korisnik će se upisati. 234 00:10:33,430 --> 00:10:37,370 Konkretno, ako se osvrnuti na cs50.c od prije dva tjedna, vidjet ćete 235 00:10:37,370 --> 00:10:40,480 da GetString zapravo Ne koristite scanf na ovaj način. 236 00:10:40,480 --> 00:10:43,720 Umjesto toga, on navodi jedan znak u isto vrijeme. 237 00:10:43,720 --> 00:10:46,010 >> Jer jedna lijepa stvar o čitanje jednog znaka je možemo 238 00:10:46,010 --> 00:10:48,490 se jamči da uvijek ima barem jedan znak. 239 00:10:48,490 --> 00:10:51,740 Ja samo mogu deklarirati char, a zatim se ti doista dječji koraci na samo 240 00:10:51,740 --> 00:10:54,380 pročitao jedan lik u po Vrijeme na tipkovnici. 241 00:10:54,380 --> 00:10:58,240 A onda, što ćete vidjeti GetString radi se svaki put kad ga ponestane, 242 00:10:58,240 --> 00:11:02,280 recimo, 16 bajtova memorije, koristi malloc ili rođak toga, na 243 00:11:02,280 --> 00:11:06,810 izdvojiti više memorije, kopiranje stara memorije u novo, a zatim puzi 244 00:11:06,810 --> 00:11:09,900 zajedno, uzimajući jedno slovo u isto vrijeme, i kada se radi iz toga 245 00:11:09,900 --> 00:11:13,370 komad memorije, to baca daleko, zgrabi veći komad memorije, kopira stara 246 00:11:13,370 --> 00:11:14,750 u nove, i ponavlja. 247 00:11:14,750 --> 00:11:18,480 I to je doista boli da zapravo provesti nešto kao jednostavan kao 248 00:11:18,480 --> 00:11:19,710 dobivanja informacije od korisnika. 249 00:11:19,710 --> 00:11:21,090 >> Dakle, možete koristiti scanf. 250 00:11:21,090 --> 00:11:22,430 Možete koristiti i druge slične funkcije. 251 00:11:22,430 --> 00:11:25,420 I puno udžbenika i online primjeri učiniti, ali oni su sve 252 00:11:25,420 --> 00:11:27,210 podložnijima problemima kao što je ovaj. 253 00:11:27,210 --> 00:11:29,550 I u konačnici, uzimajući segfault je vrsta neugodno. 254 00:11:29,550 --> 00:11:30,680 To nije dobro za korisnika. 255 00:11:30,680 --> 00:11:33,560 >> No, u najgorem slučaju, što se on bitno staviti svoj 256 00:11:33,560 --> 00:11:37,160 Kod prijeti? 257 00:11:37,160 --> 00:11:39,250 Neka vrsta napada, potencijalno. 258 00:11:39,250 --> 00:11:41,680 Razgovarali smo o jednom takvom napadu - preplavljen snop. 259 00:11:41,680 --> 00:11:44,660 Ali općenito, ako ste dozvoljeno prelijevanja spremnika, kao što smo učinili 260 00:11:44,660 --> 00:11:48,070 Prije nekoliko tjedana, sa samo pisanje više od "Hello", na dimnjak, što 261 00:11:48,070 --> 00:11:52,330 doista može preuzeti, potencijalno, računalo, ili barem na podacima koji 262 00:11:52,330 --> 00:11:53,510 ne pripada vama. 263 00:11:53,510 --> 00:11:55,970 >> Dakle, ukratko, to je razlog zašto smo ti trening kotača. 264 00:11:55,970 --> 00:11:59,090 Ali sada, počinjemo ih skinu, kao naši programi više ne treba, 265 00:11:59,090 --> 00:12:00,610 nužno, ulaz od korisnika. 266 00:12:00,610 --> 00:12:03,960 No, u slučaju problema postavili šest, Vaš unos će doći iz ogromne 267 00:12:03,960 --> 00:12:07,520 rječnik datoteku s 150 neki ak tisuća riječi. 268 00:12:07,520 --> 00:12:10,330 >> Tako nećete morati brinuti o Korisnik je proizvoljna ulaz. 269 00:12:10,330 --> 00:12:13,720 Mi ćemo vam dati neke pretpostavke O toj datoteci. 270 00:12:13,720 --> 00:12:20,340 Bilo kakva pitanja na pokazivače ili scanf ili korisnički unos u cjelini? 271 00:12:20,340 --> 00:12:24,450 >> U redu, a zatim brzi pogled na jednu prateći temu od prije dva tjedna. 272 00:12:24,450 --> 00:12:28,590 I to je to pojam struct. 273 00:12:28,590 --> 00:12:34,180 Nije to - taj pojam struct, što je ono? 274 00:12:34,180 --> 00:12:35,430 Što je rekonstruirati učiniti za nas? 275 00:12:35,430 --> 00:12:39,280 276 00:12:39,280 --> 00:12:39,860 >> Definirajte - 277 00:12:39,860 --> 00:12:41,710 žao? 278 00:12:41,710 --> 00:12:42,820 Definirajte varijablu tip. 279 00:12:42,820 --> 00:12:44,410 Dakle, na neki način. 280 00:12:44,410 --> 00:12:46,180 Mi zapravo kombinirajući dvije teme. 281 00:12:46,180 --> 00:12:49,510 Tako je s typedef, podsjetiti da možemo proglasiti neku vrstu vlastite, kao što su 282 00:12:49,510 --> 00:12:51,500 sinonim, kao i niza za char *. 283 00:12:51,500 --> 00:12:56,200 No, pomoću typedef struct i, možemo stvoriti doista vlastite strukture podataka. 284 00:12:56,200 --> 00:12:59,600 >> Na primjer, ako idem natrag u gedit ovdje samo na trenutak, a ja ići naprijed 285 00:12:59,600 --> 00:13:08,230 i učiniti nešto slično, neka mi spasiti ovo kao, recimo, structs.c 286 00:13:08,230 --> 00:13:10,840 privremeno, samo ću ići naprijed i uključuju 287 00:13:10,840 --> 00:13:14,360 standardio.h, int main nevažeće. 288 00:13:14,360 --> 00:13:18,960 A onda je ovdje, pretpostavljam da želim napisati program koji pohranjuje 289 00:13:18,960 --> 00:13:21,840 više studenata iz više Kuće, primjerice. 290 00:13:21,840 --> 00:13:24,430 Pa to je kao registrarial baza podataka o nekom vrstom. 291 00:13:24,430 --> 00:13:29,550 >> Dakle, ako trebam ime jednog studenta, sam Možda nešto kao char * ime, 292 00:13:29,550 --> 00:13:31,570 i ja ću učiniti nešto slično - 293 00:13:31,570 --> 00:13:34,410 zapravo, neka je koristiti CS50 knjižnicu samo na trenutak kako bi ovaj 294 00:13:34,410 --> 00:13:38,380 Malo jednostavnije, tako da možemo posuditi one desetke linija koda. 295 00:13:38,380 --> 00:13:39,340 I neka je samo neka bude jednostavan. 296 00:13:39,340 --> 00:13:42,610 Mi ćemo ga zadržati string, a sada GetString. 297 00:13:42,610 --> 00:13:47,420 >> Dakle, ja tvrdim sad da sam pohranjeni ime nekog studenta, i kuću 298 00:13:47,420 --> 00:13:50,240 neki student, jednostavno pomoću varijable kao što smo učinili iu jednom tjednu. 299 00:13:50,240 --> 00:13:52,370 Ali pretpostavimo da sam sada žele podržati više studenata. 300 00:13:52,370 --> 00:13:58,460 U redu, tako da moji instinkti učiniti string NAME2, dobiva GetString, string 301 00:13:58,460 --> 00:14:01,370 house2 dobiva GetString. 302 00:14:01,370 --> 00:14:05,850 I onda naš treći student, idemo napraviti NAME3 GetString. 303 00:14:05,850 --> 00:14:09,170 >> U redu, tako da je ovo nadamo markantnim ti kao glupo, 304 00:14:09,170 --> 00:14:11,580 jer taj postupak je stvarno nikada ide do kraja, i to samo ide na 305 00:14:11,580 --> 00:14:13,130 bi moj broj izgleda još gore i gore i gore. 306 00:14:13,130 --> 00:14:14,810 Ali smo riješili ovo previše u tjedan dva. 307 00:14:14,810 --> 00:14:19,450 Ono što je naša relativno čisto rješenje kada smo imali više varijabli 308 00:14:19,450 --> 00:14:23,580 Isti tip podataka koji su svi povezani, ali nismo željeli ovaj grozan nered 309 00:14:23,580 --> 00:14:26,870 Slično od navedenih varijabli? 310 00:14:26,870 --> 00:14:30,060 Što smo to učinili umjesto toga? 311 00:14:30,060 --> 00:14:31,260 >> Dakle, mislim da sam čuo nekoliko mjesta. 312 00:14:31,260 --> 00:14:32,590 Imali smo niz. 313 00:14:32,590 --> 00:14:37,110 Ako želite više instanci nešto, zašto ne bismo počistiti sve ovo 314 00:14:37,110 --> 00:14:39,540 i samo reći, mi daju Niz zove imena? 315 00:14:39,540 --> 00:14:41,640 >> A za sada, neka je teško tri koda. 316 00:14:41,640 --> 00:14:44,450 I onda mi još niz zove kuće, a mi ćemo za 317 00:14:44,450 --> 00:14:45,800 Teško je sada broj 3. 318 00:14:45,800 --> 00:14:49,220 I sam sam očistio masivno nered koji sam stvorio. 319 00:14:49,220 --> 00:14:52,400 Sada, ja sam još uvijek teško kodirano 3, ali čak i 3 dinamički mogao doći iz 320 00:14:52,400 --> 00:14:54,350 korisnik ili se argv ili slično. 321 00:14:54,350 --> 00:14:55,720 Dakle, ovo je već čišći. 322 00:14:55,720 --> 00:15:00,100 >> No, ono što je neugodno o tome da Sada, iako je ime nekako 323 00:15:00,100 --> 00:15:02,280 prvenstveno povezana s studenta kuća - 324 00:15:02,280 --> 00:15:04,720 to je student koji sam stvarno želim predstaviti - 325 00:15:04,720 --> 00:15:08,080 Ja sada imam dva polja koja su paralelne u smislu da su oni 326 00:15:08,080 --> 00:15:13,930 iste veličine i imena nosač 0 Vjerojatno mapira kuća zagrada 0, 327 00:15:13,930 --> 00:15:16,600 i imena zagrada 1 maps kućama nosač 1. 328 00:15:16,600 --> 00:15:19,280 Drugim riječima, da je učenik živi u da je kuća, i to drugi student 329 00:15:19,280 --> 00:15:20,530 živi u toj drugoj kući. 330 00:15:20,530 --> 00:15:23,720 Ali sigurno bi to moglo biti obaviti čak i više čisto. 331 00:15:23,720 --> 00:15:24,990 >> Pa, što mogu, u stvari. 332 00:15:24,990 --> 00:15:28,730 I neka mi ići naprijed i otvorite do structs.h, a vi ćete 333 00:15:28,730 --> 00:15:31,130 vidi ovu ideju ovdje. 334 00:15:31,130 --> 00:15:34,905 Obavijest da sam koristiti typedef, kao i vi aludirao na trenutak prije proglasiti našem 335 00:15:34,905 --> 00:15:35,570 vlastita vrsta podataka. 336 00:15:35,570 --> 00:15:39,660 Ali ja sam također koriste ovu drugu ključnu riječ zove struct koji mi daje novi 337 00:15:39,660 --> 00:15:40,790 struktura podataka. 338 00:15:40,790 --> 00:15:43,980 >> A to struktura podataka Tvrdim ide imati dvije stvari unutar 339 00:15:43,980 --> 00:15:47,060 to - string zove ime i string zove kući. 340 00:15:47,060 --> 00:15:49,820 I ime ću dati ova struktura podataka ide 341 00:15:49,820 --> 00:15:51,005 da se zove student. 342 00:15:51,005 --> 00:15:54,030 Mogao bih to nazvao što želim, ali to bi semantički 343 00:15:54,030 --> 00:15:55,810 osjećaj da me u mom umu. 344 00:15:55,810 --> 00:15:59,160 >> Pa sad, ako sam otvoriti bolju verziju od programa sam počeo pisati 345 00:15:59,160 --> 00:16:00,390 ima, neka mi dođite do vrha. 346 00:16:00,390 --> 00:16:03,190 A tu je još nekoliko linija koda ovdje, ali dopustite mi da se usredotoče na 347 00:16:03,190 --> 00:16:04,160 Trenutak na jedan. 348 00:16:04,160 --> 00:16:07,790 Ja sam proglasio konstantu zvanu studente i teško kodirano 3 za sada. 349 00:16:07,790 --> 00:16:11,110 Ali sada, primijetiti kako se čisti moj broj počinje dobivati. 350 00:16:11,110 --> 00:16:15,030 >> U skladu 22, izjavljujem Niz studenata. 351 00:16:15,030 --> 00:16:18,760 I primijetiti da učenik očito Sada vrsta podataka. 352 00:16:18,760 --> 00:16:23,360 Jer je na vrhu ove datoteke, primijetiti Uključio sam taj header datoteku 353 00:16:23,360 --> 00:16:24,820 da sam izvukao se samo trenutak prije. 354 00:16:24,820 --> 00:16:28,820 I to header file jednostavno je ova definicija o studentu. 355 00:16:28,820 --> 00:16:32,470 >> Pa sad, ja sam stvorio svoje vlastite prilagođene podatke Vrsta da su autori C godina 356 00:16:32,470 --> 00:16:33,890 Prije nije misliti unaprijed. 357 00:16:33,890 --> 00:16:34,570 No, nema problema. 358 00:16:34,570 --> 00:16:35,870 Mogu to sam. 359 00:16:35,870 --> 00:16:39,050 Dakle, ovo je niz naziva učenika, svaki od čiji su članovi 360 00:16:39,050 --> 00:16:41,100 je student struktura. 361 00:16:41,100 --> 00:16:44,270 I želim tri osobe u polju. 362 00:16:44,270 --> 00:16:46,030 >> A sada, što se ostatak tog programa učiniti? 363 00:16:46,030 --> 00:16:47,550 Trebao sam nešto malo proizvoljan. 364 00:16:47,550 --> 00:16:51,450 Dakle, od 24 pa nadalje online, I iteraciju od 0 do 3. 365 00:16:51,450 --> 00:16:54,000 I onda pitati korisnika za studenta ime. 366 00:16:54,000 --> 00:16:56,110 A onda sam koristiti GetString kao i prije. 367 00:16:56,110 --> 00:16:59,410 Tada sam pitati za studenta kući, i ja koristiti GetString kao i prije. 368 00:16:59,410 --> 00:17:01,780 >> Ali Obavijest - nešto novo komad sintaksi - 369 00:17:01,780 --> 00:17:07,010 Ne mogu još uvijek indeksa na i-tog studenta, ali kako sam se na određene podatke 370 00:17:07,010 --> 00:17:08,354 Polje unutar struct? 371 00:17:08,354 --> 00:17:11,770 Pa, ono što je očito Novi komad sintakse? 372 00:17:11,770 --> 00:17:13,339 To je samo točka operatora. 373 00:17:13,339 --> 00:17:14,510 >> Nismo stvarno ovo vidio. 374 00:17:14,510 --> 00:17:17,819 Vi ste to vidjeli u pset pet, ako ste zaronio u već s bitmap datoteke. 375 00:17:17,819 --> 00:17:22,372 Ali dot samo znači unutar ove rekonstruirati ili više polja, daju točku 376 00:17:22,372 --> 00:17:24,510 Naziv, ili mi dati dot kuću. 377 00:17:24,510 --> 00:17:28,690 To znači ići unutar struct i dobiti tih pojedina polja. 378 00:17:28,690 --> 00:17:30,200 >> Što ostatak ovog programa učiniti? 379 00:17:30,200 --> 00:17:31,190 To nije sve što je sexy. 380 00:17:31,190 --> 00:17:34,640 Obavijest da sam ponoviti 0-3 opet, i ja jednostavno stvoriti Engleski 381 00:17:34,640 --> 00:17:40,500 fraze poput, tako i tako je to i takva kuća, prolazeći u dot ime iz 382 00:17:40,500 --> 00:17:43,320 I-og studentica i njihovih Kuća kao dobro. 383 00:17:43,320 --> 00:17:47,560 >> I onda na kraju, sad ćemo početi da se analni o tome, sada kad smo 384 00:17:47,560 --> 00:17:49,580 upoznati s onim što malloc i ostale funkcije su 385 00:17:49,580 --> 00:17:50,570 za to vrijeme radi. 386 00:17:50,570 --> 00:17:54,220 Zašto se moram osloboditi i ime i kuća, iako sam 387 00:17:54,220 --> 00:17:56,960 ne poziva malloc? 388 00:17:56,960 --> 00:17:58,020 >> GetString učinio. 389 00:17:58,020 --> 00:18:00,930 I to je prljava mala tajna nekoliko tjedana, ali ima GetString 390 00:18:00,930 --> 00:18:03,530 je curi memorije cijelom mjesto sve semestar do sada. 391 00:18:03,530 --> 00:18:05,990 I valgrand će napokon otkrivaju nam to. 392 00:18:05,990 --> 00:18:10,730 >> No, to nije velika stvar, jer znam da sam jednostavno mogu osloboditi ime 393 00:18:10,730 --> 00:18:15,750 i kuća, iako je tehnički, da biti super, super siguran, ja bi trebao biti 394 00:18:15,750 --> 00:18:17,890 radiš neke provjere pogreške ovdje. 395 00:18:17,890 --> 00:18:19,040 Što su vaši instinkti vam govorim? 396 00:18:19,040 --> 00:18:22,480 Što bih trebao biti provjera za prije nego što sam osloboditi onoga što je 397 00:18:22,480 --> 00:18:25,470 string, aka koji char *? 398 00:18:25,470 --> 00:18:33,460 >> Stvarno bi trebao biti ček ako učenici Nosač ja dot ime ne 399 00:18:33,460 --> 00:18:34,840 jednako null. 400 00:18:34,840 --> 00:18:40,400 Tada ćete biti u redu da ide naprijed i bez da je pokazivač, a isto tako i druge 401 00:18:40,400 --> 00:18:41,160 jednom, kao. 402 00:18:41,160 --> 00:18:46,860 Ako studenata nosač ja dot kuća nije jednak null, ovo sada će štititi 403 00:18:46,860 --> 00:18:52,520 protiv kutu slučaju u kojem je GetString vraća nešto poput null. 404 00:18:52,520 --> 00:18:57,310 A vidjeli smo malo prije, printf će štite nas ovdje je samo rekao 405 00:18:57,310 --> 00:18:58,990 null, koji će izgledati čudno. 406 00:18:58,990 --> 00:19:02,340 Ali barem to neće segfault, kao što smo vidjeli. 407 00:19:02,340 --> 00:19:05,990 >> Pa, neka mi učiniti jednu drugu stvar ovdje. tvorevina-0 je vrsta glupog programa 408 00:19:05,990 --> 00:19:09,700 jer sam unijeti sve ove podatke, a zatim to je izgubila nakon završetka programa. 409 00:19:09,700 --> 00:19:10,940 No, dopustite mi da ići naprijed i učiniti. 410 00:19:10,940 --> 00:19:12,830 Dopustite mi da se terminal Prozor malo veći. 411 00:19:12,830 --> 00:19:17,000 Dopustite mi da tvorevina-1, koji se je nova verzija toga. 412 00:19:17,000 --> 00:19:18,520 >> Ja ću povećavanje malo. 413 00:19:18,520 --> 00:19:21,620 I sad neka mi pokrenuti točku slash tvorevina-1. 414 00:19:21,620 --> 00:19:22,590 Studentska ime - 415 00:19:22,590 --> 00:19:31,500 David Mather, idemo napraviti Rob Kirkland, idemo napraviti Lauren Leverett. 416 00:19:31,500 --> 00:19:33,650 Ono što je zanimljivo je sada obavijest - 417 00:19:33,650 --> 00:19:35,540 a ja samo znam to jer Napisao sam program - 418 00:19:35,540 --> 00:19:38,930 postoji datoteka sada na moj tekući katalog zove students.csv. 419 00:19:38,930 --> 00:19:40,420 Neki od vas možda su vidjeli to u stvarnom svijetu. 420 00:19:40,420 --> 00:19:42,980 >> Što je CSV? 421 00:19:42,980 --> 00:19:44,170 Razdvojene zarezom. 422 00:19:44,170 --> 00:19:46,670 To je vrsta kao siromah verzija programa Excel datoteke. 423 00:19:46,670 --> 00:19:50,580 To je stol od redaka i stupaca koji možete otvoriti u programu Excel kao što su, 424 00:19:50,580 --> 00:19:51,800 Brojevi ili na Macu. 425 00:19:51,800 --> 00:19:55,180 >> A ako sam otvoriti ovu datoteku ovdje na gedit, Obavijest - a brojevi nisu tu. 426 00:19:55,180 --> 00:19:57,360 To je samo priča gedit ja brojeve linija. 427 00:19:57,360 --> 00:19:59,740 Primijetiti na prvoj liniji ovu datoteka je David i Mather. 428 00:19:59,740 --> 00:20:01,450 Sljedeći linija je Rob zarezom Kirkland. 429 00:20:01,450 --> 00:20:04,170 I treća linija je Lauren Leverett zarezom. 430 00:20:04,170 --> 00:20:05,480 >> Dakle, ono što sam stvorio? 431 00:20:05,480 --> 00:20:09,580 Sada sam napisao C program koji učinkovito može generirati tablice 432 00:20:09,580 --> 00:20:11,840 koja se može otvoriti u Program kao što je Excel. 433 00:20:11,840 --> 00:20:15,520 Ne tako uvjerljiv skup podataka, ali Ako imate puno veće komade 434 00:20:15,520 --> 00:20:18,440 Podaci koje ste zapravo žele manipulirati i napraviti grafikone i 435 00:20:18,440 --> 00:20:21,260 sviđa, to je možda jedan način za stvaranje tih podataka. 436 00:20:21,260 --> 00:20:25,370 Štoviše, CSVs su zapravo super česta samo za pohranu podataka jednostavne - 437 00:20:25,370 --> 00:20:28,940 Yahoo Finance, primjerice, ako se burzovne kotacije preko svoje tzv 438 00:20:28,940 --> 00:20:33,180 API, besplatan servis koji vam omogućuje dobiti tekuće up-to-date-stock 439 00:20:33,180 --> 00:20:35,650 citati za tvrtke, oni dati podatke natrag u 440 00:20:35,650 --> 00:20:37,800 super jednostavna CSV format. 441 00:20:37,800 --> 00:20:39,380 >> Pa kako ćemo to učiniti? 442 00:20:39,380 --> 00:20:42,530 Pa primijetiti, većina ih ovaj program gotovo isti. 443 00:20:42,530 --> 00:20:46,870 No primijetite ovdje dolje, umjesto ispisa studenti vani, na liniji 35 444 00:20:46,870 --> 00:20:51,040 nadalje, ja tvrdim da sam spas studenata na disku, tako da štedi datoteku. 445 00:20:51,040 --> 00:20:53,630 >> Dakle, primijetite sam proglašenja datoteke * - 446 00:20:53,630 --> 00:20:57,260 Sada, to je vrsta anomalije u C. Iz nekog razloga, SLIKA je sve kape, 447 00:20:57,260 --> 00:21:00,690 što nije kao većina drugih tipova podataka u C. No, to je ugrađeni 448 00:21:00,690 --> 00:21:02,320 Tip podataka, SLIKA *. 449 00:21:02,320 --> 00:21:05,900 I ja sam deklariranje pokazivač na datoteku, Tako možete misliti kako. 450 00:21:05,900 --> 00:21:08,070 >> fopen znači otvoren datoteku. 451 00:21:08,070 --> 00:21:09,470 Što file želite otvoriti? 452 00:21:09,470 --> 00:21:12,620 Želim otvoriti datoteku da ću samovoljno nazovite students.csv. 453 00:21:12,620 --> 00:21:14,480 Ja mogu nazvati taj što želim. 454 00:21:14,480 --> 00:21:15,200 >> A onda uzeti pogodak. 455 00:21:15,200 --> 00:21:18,960 Što drugi argument se fopen vjerojatno znači? 456 00:21:18,960 --> 00:21:21,480 Točno, w za pisati, mogla r se za čitanje. 457 00:21:21,480 --> 00:21:24,120 Tu je za dodavanjem ako želite dodati retke, a ne 458 00:21:24,120 --> 00:21:25,200 prepisati cijelu stvar. 459 00:21:25,200 --> 00:21:28,005 >> Ali ja samo želim napraviti ovu datoteku odjednom, tako da ću koristiti citat završen citat w. 460 00:21:28,005 --> 00:21:31,880 I znam da je samo iz Čitaju dokumentacije, odnosno čovjek stranica. 461 00:21:31,880 --> 00:21:35,100 Ako datoteka nije null - drugim riječima, ako ništa pošlo po zlu postoji - 462 00:21:35,100 --> 00:21:37,820 neka mi ponoviti tijekom učenici 0-3. 463 00:21:37,820 --> 00:21:40,410 >> I sad primjetiti da postoji nešto uvijek je tako malo drugačije 464 00:21:40,410 --> 00:21:42,110 O line 41 ovdje. 465 00:21:42,110 --> 00:21:42,960 Nije printf. 466 00:21:42,960 --> 00:21:46,530 To je fprintf za datoteku printf. 467 00:21:46,530 --> 00:21:47,790 Dakle, to će pisati u datoteku. 468 00:21:47,790 --> 00:21:48,860 Koja datoteka? 469 00:21:48,860 --> 00:21:53,630 Onaj čije je pointer ste naveli kao prvi argument. 470 00:21:53,630 --> 00:21:55,940 >> Zatim smo naveli niz formata. 471 00:21:55,940 --> 00:21:59,660 Tada ćemo odrediti što želimo string plug-in za prvi posto s, a 472 00:21:59,660 --> 00:22:04,320 zatim još jedan varijabilni ili Drugi posto s. 473 00:22:04,320 --> 00:22:06,760 Onda smo zatvoriti datoteku s fclose. 474 00:22:06,760 --> 00:22:09,380 Nego sam osloboditi memoriju kao i prije, iako Trebao bih se vratiti i dodavati 475 00:22:09,380 --> 00:22:10,540 neki provjerava null. 476 00:22:10,540 --> 00:22:12,090 >> I to je to. 477 00:22:12,090 --> 00:22:16,960 fopen, fprintf, fclose mi daje Sposobnost za stvaranje tekstualne datoteke. 478 00:22:16,960 --> 00:22:19,640 Sada, što ćete vidjeti u pet set problema, koja uključuje slike, koristit ćete 479 00:22:19,640 --> 00:22:20,990 binarne datoteke umjesto. 480 00:22:20,990 --> 00:22:24,200 No, iz temelja, ideja je ista, iako funkcije ćete 481 00:22:24,200 --> 00:22:28,710 vidim su malo drugačiji. 482 00:22:28,710 --> 00:22:32,580 >> Dakle vihor turneje, ali će doći sve previše upoznat s datoteku I/O-- 483 00:22:32,580 --> 00:22:34,960 ulaz i izlaz - s pset pet. 484 00:22:34,960 --> 00:22:38,607 A bilo kakva pitanja o početne osnove ovdje? 485 00:22:38,607 --> 00:22:39,857 Da? 486 00:22:39,857 --> 00:22:41,880 487 00:22:41,880 --> 00:22:43,710 >> Što ako pokušate osloboditi null vrijednosti? 488 00:22:43,710 --> 00:22:48,880 Ja vjerujem, ako je stečen besplatno Malo više user-friendly, možete 489 00:22:48,880 --> 00:22:49,890 potencijalno segfault. 490 00:22:49,890 --> 00:22:54,160 Prolazeći to anulirati je loše, jer ja ne Vjerujem besplatno smeta to ček za vas, 491 00:22:54,160 --> 00:22:57,330 jer bi potencijalno biti otpad vremena za to učiniti za sebe 492 00:22:57,330 --> 00:22:59,022 svatko u svijetu. 493 00:22:59,022 --> 00:23:00,590 Dobro pitanje, ipak. 494 00:23:00,590 --> 00:23:04,300 >> U redu, tako da je ova vrsta dobiva nas zanimljiva tema. 495 00:23:04,300 --> 00:23:07,010 Tema skupa problema pet je forenzika. 496 00:23:07,010 --> 00:23:08,420 Barem to je dio od problema setu. 497 00:23:08,420 --> 00:23:12,030 Forenzike općenito se odnosi na Oporavak podataka koji mogu ili 498 00:23:12,030 --> 00:23:14,110 Ne može se izbrisati namjerno. 499 00:23:14,110 --> 00:23:18,680 I tako sam mislio bih vam dati brzi okus onoga što se stvarno događa svima 500 00:23:18,680 --> 00:23:21,230 ovaj put ispod napa vašeg računala. 501 00:23:21,230 --> 00:23:23,960 >> Na primjer, ako imate unutar vašeg prijenosno računalo ili vaše stolno računalo 502 00:23:23,960 --> 00:23:28,040 hard disk, to je bilo mehaničkih uređaj koji zapravo vrti - 503 00:23:28,040 --> 00:23:31,650 postoji kružni stvari nazivaju plate da je sasvim izgledaju što sam 504 00:23:31,650 --> 00:23:34,540 Samo je gore na zaslonu ovdje, iako to je sve stara škola. 505 00:23:34,540 --> 00:23:37,370 To je tri i pol inča hard disk. 506 00:23:37,370 --> 00:23:40,070 A tri i pol inča odnosi se na s mjesta na stvar kada ga instalirati 507 00:23:40,070 --> 00:23:40,890 u računalu. 508 00:23:40,890 --> 00:23:44,890 >> Mnogi od vas dečki u svojim prijenosnim računalima sada imaju SSD diskove ili SSD-ovi, 509 00:23:44,890 --> 00:23:46,260 koji nema pokretnih dijelova. 510 00:23:46,260 --> 00:23:49,170 Oni su više kao RAM-a, a manje kao ovi mehanički uređaji. 511 00:23:49,170 --> 00:23:51,450 Ali ideje su još uvijek isti, svakako su vezane 512 00:23:51,450 --> 00:23:52,790 Problem bi postavili pet. 513 00:23:52,790 --> 00:23:57,400 >> A ako mislite o tome sada tvrdi disk predstavlja kao krug, koji 514 00:23:57,400 --> 00:23:58,930 Ja ću privući ovako ovdje. 515 00:23:58,930 --> 00:24:02,290 Kada stvorite datoteku na vašem računalu, bilo da je SSD, ili u 516 00:24:02,290 --> 00:24:06,610 ovaj slučaj, stariji škola tvrdi disk, da je datoteka se sastoji od više bitova. 517 00:24:06,610 --> 00:24:10,510 Recimo da je to 0 i 1, cijela hrpa 0s i 1s. 518 00:24:10,510 --> 00:24:11,660 Dakle, ovo je moj cijeli hard disk. 519 00:24:11,660 --> 00:24:13,225 To je očito prilično velika datoteka. 520 00:24:13,225 --> 00:24:18,080 I ona se koristi do 1s i 0s u to dio fizičkog pladnju. 521 00:24:18,080 --> 00:24:19,750 >> Pa, što je to fizički dio? 522 00:24:19,750 --> 00:24:25,310 Pa, ispada da na tvrdom disku, barem ove vrste, postoji 523 00:24:25,310 --> 00:24:27,340 ta malena magnetske čestice. 524 00:24:27,340 --> 00:24:32,630 I oni u suštini imaju sjever i Južni pol do njih, tako da ako ste 525 00:24:32,630 --> 00:24:35,710 uključite jedan od tih magnetskih čestica Na taj način, moglo bi se reći da je 526 00:24:35,710 --> 00:24:36,720 predstavlja jedan. 527 00:24:36,720 --> 00:24:39,340 A ako je to naopako jug sjever, moglo bi se reći da je 528 00:24:39,340 --> 00:24:40,390 što predstavlja 0. 529 00:24:40,390 --> 00:24:43,660 >> Dakle, u stvarnom fizičkom svijetu, to je kako bi moglo predstavljati nešto u 530 00:24:43,660 --> 00:24:45,670 binarno stanje 0 i 1. 531 00:24:45,670 --> 00:24:46,720 Dakle, to je sve što je datoteka. 532 00:24:46,720 --> 00:24:49,300 Postoji cijela hrpa magnetska čestice koje su im na ovaj način ili 533 00:24:49,300 --> 00:24:51,920 Na taj način, stvarajući uzorke od 1s i 0s. 534 00:24:51,920 --> 00:24:56,760 >> No, ispostavilo se kada spremite datoteku, neki podaci se spremaju zasebno. 535 00:24:56,760 --> 00:25:00,000 Dakle, ovo je mali stol, katalog, da se tako izrazim. 536 00:25:00,000 --> 00:25:05,810 I zvat ću ovaj naziv stupca, a Nazvat ću ovo mjesto stupca. 537 00:25:05,810 --> 00:25:08,850 >> A ja ću reći, pretpostavimo ovo je moj životopis. 538 00:25:08,850 --> 00:25:14,050 Moj resume.doc je pohranjena na Mjesto, recimo 123. 539 00:25:14,050 --> 00:25:15,390 Ja uvijek ići za tim brojem. 540 00:25:15,390 --> 00:25:18,810 No, dovoljno je reći da je baš kao u RAM-u, možete uzeti hard disk 541 00:25:18,810 --> 00:25:22,350 to je gigabajt ili 200 gigabajta ili terabajta, a možete 542 00:25:22,350 --> 00:25:23,750 broj svih bajtova. 543 00:25:23,750 --> 00:25:26,480 Možete prebrojiti sve komade 8 bitova. 544 00:25:26,480 --> 00:25:29,030 >> Dakle, mi ćemo reći da je to Mjesto je 123. 545 00:25:29,030 --> 00:25:32,070 Dakle, ovaj katalog unutar mog poslovanja Sustav se sjeća da je moja 546 00:25:32,070 --> 00:25:34,250 ponovo je na mjestu 123. 547 00:25:34,250 --> 00:25:36,850 Ali to biti interesantno kad izbrišete datoteku. 548 00:25:36,850 --> 00:25:37,820 >> Tako, primjerice - 549 00:25:37,820 --> 00:25:40,790 i hvala bogu, većina svijeta ima uhvaćen na to - što se događa kada 550 00:25:40,790 --> 00:25:45,040 povlačite datoteku na svoj Mac OS smeće ili vaš Windows koš za smeće? 551 00:25:45,040 --> 00:25:48,290 552 00:25:48,290 --> 00:25:50,510 Koja je svrha da radiš? 553 00:25:50,510 --> 00:25:53,860 Očito je da biste dobili osloboditi od datoteka, ali što to čin povučete i 554 00:25:53,860 --> 00:25:57,550 padaju u vaš smeće ili vaš Koš za smeće učiniti na računalu? 555 00:25:57,550 --> 00:25:59,230 >> Apsolutno ništa, stvarno. 556 00:25:59,230 --> 00:26:00,320 To je baš kao i mape. 557 00:26:00,320 --> 00:26:01,800 To je posebna mapu, kako bi bili sigurni. 558 00:26:01,800 --> 00:26:04,460 No, to zapravo izbrisati datoteku? 559 00:26:04,460 --> 00:26:06,780 >> Pa, ne, jer su neki od vas vjerojatno su bili kao, oh damn, nisi 560 00:26:06,780 --> 00:26:07,420 znači za to. 561 00:26:07,420 --> 00:26:09,130 Dakle, dva puta kliknuti Trash ili koš za smeće. 562 00:26:09,130 --> 00:26:11,630 Vi ste poked oko i što ste oporavio file jednostavno povlačenjem 563 00:26:11,630 --> 00:26:12,110 od tamo. 564 00:26:12,110 --> 00:26:14,420 Dakle, jasno, to nije nužno brisanja. 565 00:26:14,420 --> 00:26:15,990 >> OK, ti si pametniji od toga. 566 00:26:15,990 --> 00:26:18,860 Vi znate da je samo ga povučete u Trash ili koš za smeće ne znači 567 00:26:18,860 --> 00:26:19,930 god pražnjenja otpada. 568 00:26:19,930 --> 00:26:24,110 Tako da se popne na izborniku, a ti kažeš Isprazni smeće ili Empty Recycle Bin. 569 00:26:24,110 --> 00:26:25,360 Zatim što se događa? 570 00:26:25,360 --> 00:26:29,070 571 00:26:29,070 --> 00:26:32,530 >> Da, tako da se briše više. 572 00:26:32,530 --> 00:26:37,660 No, sve što se događa je to. 573 00:26:37,660 --> 00:26:45,350 Računalo zaboravio gdje je resume.doc je. 574 00:26:45,350 --> 00:26:47,400 >> No, ono što se nije promijenilo očito na slici? 575 00:26:47,400 --> 00:26:51,390 576 00:26:51,390 --> 00:26:55,570 U bita, 1s i 0s da Tvrdim su na mjestu nekog fizičkog aspekta 577 00:26:55,570 --> 00:26:56,280 hardvera. 578 00:26:56,280 --> 00:26:57,110 Oni su još uvijek tamo. 579 00:26:57,110 --> 00:26:58,930 To je samo računalo ima zaboravili što su oni. 580 00:26:58,930 --> 00:27:03,160 >> Dakle, to je u biti oslobođen file-a dijelove, tako da se mogu ponovno koristiti. 581 00:27:03,160 --> 00:27:06,940 Ali ne dok ste stvoriti više datoteka, i više datoteka, i više datoteka će 582 00:27:06,940 --> 00:27:12,150 probabilistically, one 1s i 0s, one magnetske čestice, se ponovno koristiti, 583 00:27:12,150 --> 00:27:16,220 upside ili desnoj strani gore, za druga slika, 1s i 0s. 584 00:27:16,220 --> 00:27:17,980 >> Tako ste ovaj prozor vremena. 585 00:27:17,980 --> 00:27:19,860 I to ne od predvidljiva Duljina, stvarno. 586 00:27:19,860 --> 00:27:22,240 To ovisi o veličini tvrdog pogon i koliko slika imate i 587 00:27:22,240 --> 00:27:23,490 kako brzo možete napraviti nove. 588 00:27:23,490 --> 00:27:27,050 No, tu je ovaj prozor tijekom vremena koja datoteka je još uvijek savršeno 589 00:27:27,050 --> 00:27:27,770 nadoknadiva. 590 00:27:27,770 --> 00:27:31,050 >> Dakle, ako ste ikada koristiti programe kao što su McAfee ili Norton pokušati oporaviti 591 00:27:31,050 --> 00:27:35,680 Podaci, sve što radite je pokušava oporaviti ovu tzv telefonski imenik 592 00:27:35,680 --> 00:27:37,340 shvatiti gdje vam je turpija. 593 00:27:37,340 --> 00:27:40,605 A ponekad i Norton će reći, datoteka je 93% povrat. 594 00:27:40,605 --> 00:27:42,020 Pa, što to znači? 595 00:27:42,020 --> 00:27:45,690 To samo znači da su neki drugi file slučajno završio pomoću, recimo, 596 00:27:45,690 --> 00:27:48,920 one bitova iz izvorne datoteke. 597 00:27:48,920 --> 00:27:51,950 >> Dakle, što zapravo uključeni u oporavlja podatke? 598 00:27:51,950 --> 00:27:55,720 Pa, ako nemate nešto poput Norton pre-instaliran na vašem računalu, 599 00:27:55,720 --> 00:27:59,510 Najbolje što možete učiniti je ponekad izgleda na cijeli hard disk u potrazi za 600 00:27:59,510 --> 00:28:00,510 obrasci bitova. 601 00:28:00,510 --> 00:28:05,350 A jedna od tema skupa problema pet je da će tražiti 602 00:28:05,350 --> 00:28:09,570 protuvrijednosti od tvrdog diska, forenzičke slika Compact Flash karticu od 603 00:28:09,570 --> 00:28:13,660 digitalni fotoaparat, tražeći 0s i 1s koji obično, s visokim 604 00:28:13,660 --> 00:28:16,720 Vjerojatnost, predstavljaju početak JPEG slike. 605 00:28:16,720 --> 00:28:21,120 >> I vi možete oporaviti one slike koje pretpostavku, ako vidim ovaj uzorak 606 00:28:21,120 --> 00:28:24,380 bita na forenzičkoj slike, s velika vjerojatnost, koji obilježava 607 00:28:24,380 --> 00:28:25,650 početak JPEG. 608 00:28:25,650 --> 00:28:29,520 A ako vidim isti uzorak opet, koja vjerojatno označava početak 609 00:28:29,520 --> 00:28:32,440 još jedna JPEG, a drugi JPEG, JPEG i drugi. 610 00:28:32,440 --> 00:28:34,970 A to je obično kako data recovery će raditi. 611 00:28:34,970 --> 00:28:37,870 Što je lijepo o JPEG je, iako format sama je nešto 612 00:28:37,870 --> 00:28:44,400 kompleksu, početak svaki takav Datoteka je zapravo prilično identificirati 613 00:28:44,400 --> 00:28:47,370 i jednostavno, kao što ćete vidjeti, ako ste već nije. 614 00:28:47,370 --> 00:28:50,270 >> Tako ćemo se bliži pogled ispod napa kao da točno ono što je bio 615 00:28:50,270 --> 00:28:53,360 događa, i što je to 1s i 0s su, da vam malo više 616 00:28:53,360 --> 00:28:55,330 Kontekst za ovaj izazov. 617 00:28:55,330 --> 00:28:55,510 >> [Video reprodukciju] 618 00:28:55,510 --> 00:28:58,700 >> -Gdje je vaše računalo pohranjuje najčešće njegovih stalnih podataka. 619 00:28:58,700 --> 00:29:03,390 Da biste to postigli, podaci putuje iz RAM-a zajedno sa softverskim signale koji govore 620 00:29:03,390 --> 00:29:06,110 Kako tvrdi disk za pohranu tih podataka. 621 00:29:06,110 --> 00:29:09,410 Tvrde krugova vožnje prevođenje ti signali u naponu 622 00:29:09,410 --> 00:29:10,870 kolebanja. 623 00:29:10,870 --> 00:29:14,970 To je, pak, kontroliraju tvrdi disk-a pokretni dijelovi, neke od rijetkih 624 00:29:14,970 --> 00:29:17,910 pokretni dijelovi ostali u moderne računalo. 625 00:29:17,910 --> 00:29:22,130 >> Neki od signala kontrolirati motor koji se vrti metal-obložene plate. 626 00:29:22,130 --> 00:29:25,470 Vaši podaci zapravo je pohranjena na tim plate. 627 00:29:25,470 --> 00:29:28,610 Ostali signali presele čitanja / pisanja glava za čitanje ili 628 00:29:28,610 --> 00:29:30,710 pisati podatke na plate. 629 00:29:30,710 --> 00:29:35,450 Ovo strojevima toliko precizna da je ljudski kosa nije ni mogao proći između 630 00:29:35,450 --> 00:29:37,280 glave i predenje plate. 631 00:29:37,280 --> 00:29:40,316 Ipak, sve to djeluje na nevjerojatan brzinama. 632 00:29:40,316 --> 00:29:40,660 >> [END video reprodukciju] 633 00:29:40,660 --> 00:29:42,190 >> DAVID Malan: Zumiraj malo dublje sada na ono što je 634 00:29:42,190 --> 00:29:44,360 zapravo na tim plate. 635 00:29:44,360 --> 00:29:44,720 >> [Video reprodukciju] 636 00:29:44,720 --> 00:29:47,660 >> -Pogledajmo što smo upravo Vidio usporeno. 637 00:29:47,660 --> 00:29:51,710 Kad kratki impuls struje je poslan na čitanje / pisanje glavu, ako se okreće 638 00:29:51,710 --> 00:29:54,650 na maleni elektromagnetski za djelić sekunde. 639 00:29:54,650 --> 00:29:58,970 Magnet stvara njivi mijenja polaritet maleni, maleni 640 00:29:58,970 --> 00:30:02,850 Dio metalnih čestica koje dlaka svaki plitica površine. 641 00:30:02,850 --> 00:30:05,940 >> Uzorak niz tih sićušnih, naplaćuje-up područja na disku 642 00:30:05,940 --> 00:30:08,470 predstavlja jedan malo podatke u binarnom broju 643 00:30:08,470 --> 00:30:10,530 Sustav se koristi od strane računala. 644 00:30:10,530 --> 00:30:13,775 Sada, ako je trenutni je poslan jedan način kroz čitanje / pisanje glavu, područje 645 00:30:13,775 --> 00:30:15,970 je polarizirano u jednom smjeru. 646 00:30:15,970 --> 00:30:17,950 Ako struja se šalje suprotnom smjeru, 647 00:30:17,950 --> 00:30:19,930 polarizacija i obrnuto. 648 00:30:19,930 --> 00:30:22,370 >> Kako ste dobili podatke s tvrdog diska? 649 00:30:22,370 --> 00:30:24,090 Samo obrnuti proces. 650 00:30:24,090 --> 00:30:26,550 Dakle, to su čestice na disku da se struja u 651 00:30:26,550 --> 00:30:27,960 čitanje / pisanje glavu kreće. 652 00:30:27,960 --> 00:30:30,700 Stavite zajedno milijune njih magnetizirana segmentima, i 653 00:30:30,700 --> 00:30:32,160 imaš datoteku. 654 00:30:32,160 --> 00:30:36,060 >> Sada, komada jednu datoteku može se raspršili diljem disk-a 655 00:30:36,060 --> 00:30:39,970 pladnjevi, vrsta kao što je nered radova na vašem stolu. 656 00:30:39,970 --> 00:30:43,500 Dakle, posebna extra file prati mjesta gdje se sve nalazi. 657 00:30:43,500 --> 00:30:45,985 Ne želite li imali tako nešto? 658 00:30:45,985 --> 00:30:46,470 >> [END video reprodukciju] 659 00:30:46,470 --> 00:30:47,820 >> DAVID Malan: OK, vjerojatno ne. 660 00:30:47,820 --> 00:30:52,070 Pa kako mnogi od vas dečki Odrastao je s tim? 661 00:30:52,070 --> 00:30:53,970 U redu, tako da je sve manje i manje Ruke svake godine. 662 00:30:53,970 --> 00:30:56,550 Ali drago mi je da si barem upoznati s njima, jer je to i naš vlastiti 663 00:30:56,550 --> 00:31:00,520 Knjiga demo, nažalost, umiru vrlo polagano odumiranje ovdje poznatosti. 664 00:31:00,520 --> 00:31:04,010 >> Ali to je ono što sam, barem, još u srednju školu, koriste se koristiti za backup. 665 00:31:04,010 --> 00:31:08,110 I to je nevjerojatno, jer može pohraniti 1,4 megabajta na 666 00:31:08,110 --> 00:31:08,930 ovaj disk. 667 00:31:08,930 --> 00:31:12,260 A to je velika gustoća verziju, kako je naznačeno u HD, koji je 668 00:31:12,260 --> 00:31:14,240 što znači prije današnje HD videa. 669 00:31:14,240 --> 00:31:16,400 >> Standardna gustoća je 800 kilobajta. 670 00:31:16,400 --> 00:31:18,640 I prije toga, bilo 400-kilobajta diskova. 671 00:31:18,640 --> 00:31:23,120 I prije toga, bilo je 5 i 1/4 inčne diskove, koji su doista floppy, 672 00:31:23,120 --> 00:31:25,680 i malo širi i viši od ovih stvari ovdje. 673 00:31:25,680 --> 00:31:29,150 No, što zapravo može vidjeti takozvani floppy aspekt ovih diskova. 674 00:31:29,150 --> 00:31:32,630 >> I funkcionalno, oni su zapravo prilično sličan tvrdih diskova na 675 00:31:32,630 --> 00:31:33,570 Barem ovaj tip. 676 00:31:33,570 --> 00:31:37,270 Opet, SSD-ovi u novijim računalima rade malo drugačije. 677 00:31:37,270 --> 00:31:41,530 Ali, ako se preselite tu malu metalnu karticu, zapravo možete vidjeti malo kolačić, 678 00:31:41,530 --> 00:31:42,560 ili pladanj. 679 00:31:42,560 --> 00:31:43,830 >> To nije metal poput ove. 680 00:31:43,830 --> 00:31:46,000 Ovaj je zapravo neka jeftinija plastični materijal. 681 00:31:46,000 --> 00:31:46,750 A možete ga vrsta mrdati. 682 00:31:46,750 --> 00:31:50,310 I uistinu sam samo obrisao neke broj bitova ili magnetskim česticama 683 00:31:50,310 --> 00:31:51,220 iz ovog diska. 684 00:31:51,220 --> 00:31:52,710 >> Dakle, srećom, nema ništa na njemu. 685 00:31:52,710 --> 00:31:55,790 Ako ta stvar je na putu - i pokriti oči i one svoje susjede - 686 00:31:55,790 --> 00:31:58,865 možete samo vrsta povući ovu Cijeli plašt off kao što je to. 687 00:31:58,865 --> 00:32:01,900 No, tu je malo proljeće, tako da se svjestan da je svojim očima. 688 00:32:01,900 --> 00:32:03,620 Tako sada imate uistinu disketu. 689 00:32:03,620 --> 00:32:07,090 >> A što je izvanredan o tome je da u koliko je to 690 00:32:07,090 --> 00:32:10,830 mali zastupljenost veća tvrdi disk, ove stvari su super, 691 00:32:10,830 --> 00:32:11,590 super jednostavna. 692 00:32:11,590 --> 00:32:15,170 Ako ste stiskati dno tome, sad da da je metal što je off, i oguliti 693 00:32:15,170 --> 00:32:20,990 ih otvoriti, sve su samo dva komada osjećao i tzv diskete 694 00:32:20,990 --> 00:32:22,930 s komadom metala iznutra. 695 00:32:22,930 --> 00:32:25,990 >> I tu ide polovica mojim diskom sadržaja. 696 00:32:25,990 --> 00:32:27,540 Ode još jedna polovica od njih. 697 00:32:27,540 --> 00:32:31,375 No, to je sve što mi se vrtjelo u vašeg računala u prošlost. 698 00:32:31,375 --> 00:32:35,220 699 00:32:35,220 --> 00:32:38,310 >> I opet, staviti to u perspektivu, koliko je velik većinu svog 700 00:32:38,310 --> 00:32:39,560 Teško vozi ovih dana? 701 00:32:39,560 --> 00:32:41,960 702 00:32:41,960 --> 00:32:46,230 500 gigabajta, terabajta, možda u Stolno računalo, 2 terabajta, 3 703 00:32:46,230 --> 00:32:47,630 terabajta, 4 terabajta, zar ne? 704 00:32:47,630 --> 00:32:52,480 Ovo je jedan megabajt, dati ili uzeti, koje se ne mogu ni stati tipičan MP3 705 00:32:52,480 --> 00:32:55,310 više ovih dana, ili neki Sličan glazbene datoteke. 706 00:32:55,310 --> 00:32:59,500 >> Dakle, malo suvenir za vas danas, a Također će vam pomoći kontekstualizirati što 707 00:32:59,500 --> 00:33:03,570 ćemo biti uzimanje zdravo za gotovo Sada je u problemu postavili pet. 708 00:33:03,570 --> 00:33:04,820 Dakle, to su tvoje zadržati. 709 00:33:04,820 --> 00:33:07,340 710 00:33:07,340 --> 00:33:13,370 Pa neka mi prijelaz na kojem će se trošenja sljedeći pset kao dobro. 711 00:33:13,370 --> 00:33:18,470 Dakle, sada smo postavili ovu stranicu za - Oh, Nekoliko najavama brzo. 712 00:33:18,470 --> 00:33:21,730 >> Ovaj petak, ako bih se pridružiti CS50 za ručak, otići na uobičajenom mjestu, 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp. 714 00:33:23,610 --> 00:33:25,100 I zadnji projekt - 715 00:33:25,100 --> 00:33:28,520 pa po nastavnom planu, mi smo objavili konačni projekt specifikacije već. 716 00:33:28,520 --> 00:33:31,410 Shvatite da to ne znači to je zbog osobito brzo. 717 00:33:31,410 --> 00:33:33,990 To je odgovoreno, uistinu, samo da bi dobili vi mislili o tome. 718 00:33:33,990 --> 00:33:37,620 I doista, super značajne Postotak od vas će biti rješavanje 719 00:33:37,620 --> 00:33:40,780 Konačni projekti o materijalu koji smo nisu ni došli do u klasi, 720 00:33:40,780 --> 00:33:42,730 , ali će se već sljedeći tjedan. 721 00:33:42,730 --> 00:33:45,530 >> Obavijest, međutim, da je spec poziva na nekoliko različitih komponenti 722 00:33:45,530 --> 00:33:46,190 Konačni projekt. 723 00:33:46,190 --> 00:33:49,590 Prvi, u nekoliko tjedana, je pre-prijedlog, prilično ležerna e-mail 724 00:33:49,590 --> 00:33:52,760 Vaš TF mu reći ili što ste razmišljam o tome za svoj projekt, s 725 00:33:52,760 --> 00:33:53,650 bez obveze. 726 00:33:53,650 --> 00:33:56,710 Prijedlog će biti vaš Konkretno predanost, govoreći, ovdje, to je ono što 727 00:33:56,710 --> 00:33:57,770 Ja bih to učiniti za moj projekt. 728 00:33:57,770 --> 00:33:58,250 Što mislite? 729 00:33:58,250 --> 00:33:58,650 Prevelika? 730 00:33:58,650 --> 00:33:59,145 Premala? 731 00:33:59,145 --> 00:34:00,330 Je li upravljati? 732 00:34:00,330 --> 00:34:02,230 A vidite spec. za više detalja. 733 00:34:02,230 --> 00:34:05,060 >> Nekoliko tjedana nakon toga je status Izvješće, što je na sličan način 734 00:34:05,060 --> 00:34:08,260 povremeni e-mail na svoj TF reći koliko daleko iza ste u svoj konačni 735 00:34:08,260 --> 00:34:12,360 provedbe projekta, nakon čega slijedi CS50 Hackathon u kojoj su svi 736 00:34:12,360 --> 00:34:17,520 je pozvao, koji će se događaj iz 20:00 Na jednoj večeri do 07:00 737 00:34:17,520 --> 00:34:19,150 AM sljedećeg jutra. 738 00:34:19,150 --> 00:34:22,560 Pizza, kao što sam spomenuo možda u tjedan dana nuli, wil biti posluženi u 21:00, 739 00:34:22,560 --> 00:34:24,120 Kineske hrane na 01:00. 740 00:34:24,120 --> 00:34:27,929 A ako ste još uvijek budni, na 05:00, mi ćemo vas odvesti na IHOP za doručak. 741 00:34:27,929 --> 00:34:31,310 >> Dakle Hackathon je jedan od više nezaboravnih iskustava u razredu. 742 00:34:31,310 --> 00:34:35,290 Tada je zbog implementacije i onda vrhunac CS50 sajam. 743 00:34:35,290 --> 00:34:38,070 Više detalja o svim tim u tjednima koji dolaze. 744 00:34:38,070 --> 00:34:40,739 >> No, vratimo se na nešto stara škola - 745 00:34:40,739 --> 00:34:41,920 opet, niz. 746 00:34:41,920 --> 00:34:45,040 Dakle, niz je lijepo, jer to rješava Problemi kao što smo vidjeli samo 747 00:34:45,040 --> 00:34:49,290 maloprije sa studentskim strukturama uzimajući malo izvan kontrole, ako smo 748 00:34:49,290 --> 00:34:52,405 Želite imati jednog studenta, student dva, Student tri, student dot dot dot, 749 00:34:52,405 --> 00:34:54,400 neka proizvoljna broj studenata. 750 00:34:54,400 --> 00:34:58,850 >> Dakle polja, prije nekoliko tjedana, obrušio se u i riješiti sve naše probleme od ne 751 00:34:58,850 --> 00:35:03,340 znajući unaprijed koliko stvari neke vrste možda bismo željeli. 752 00:35:03,340 --> 00:35:07,390 A vidjeli smo da je tvorevina, može nam pomoći dodatno organizirati naš kod i zadržati 753 00:35:07,390 --> 00:35:11,660 konceptualno slični varijable, kao što su Ime i kuća, zajedno, tako da mi 754 00:35:11,660 --> 00:35:15,570 može tretirati ih kao jednu cjelinu, unutar od kojih su manji komadi. 755 00:35:15,570 --> 00:35:17,810 >> Ali nizovi imaju neke nedostatke. 756 00:35:17,810 --> 00:35:19,780 Koji su neki od nedostataka smo naišli 757 00:35:19,780 --> 00:35:22,320 s polja do sada? 758 00:35:22,320 --> 00:35:23,450 Što je to? 759 00:35:23,450 --> 00:35:28,130 Fiksna veličina - pa čak možda moći alocirati memoriju za 760 00:35:28,130 --> 00:35:32,310 polje, jednom kada znate koliko je studenata imate, koliko znakova imate 761 00:35:32,310 --> 00:35:35,460 od korisnika, nakon što ste dodijeljeno polje, da ste vrsta naslikao 762 00:35:35,460 --> 00:35:36,740 se u kut. 763 00:35:36,740 --> 00:35:40,600 >> Budući da ne možete umetnuti nove elemente u sredini polja. 764 00:35:40,600 --> 00:35:43,660 Vi ne možete staviti više elemenata na kraju niza. 765 00:35:43,660 --> 00:35:47,750 Stvarno, morate posegnuti za kreiranje cijeli novi niz, kao što smo razgovarali, 766 00:35:47,750 --> 00:35:49,320 kopiranjem stare u novu. 767 00:35:49,320 --> 00:35:52,610 I opet, to je glavobolja koja GetString bavi za vas. 768 00:35:52,610 --> 00:35:56,170 >> Ali opet, ne mogu ni umetanje nešto u sredini polja 769 00:35:56,170 --> 00:35:58,200 ako je stopa nije u potpunosti ispunjena. 770 00:35:58,200 --> 00:36:03,010 Na primjer, ako se to polje ovdje na veličinu šest ima samo pet stvari u njoj, 771 00:36:03,010 --> 00:36:06,080 dobro, možete se i samo tack nešto na kraju. 772 00:36:06,080 --> 00:36:08,200 No, što ako nešto želite umetnuti u sredini 773 00:36:08,200 --> 00:36:11,280 polje, iako bi to moglo imati pet od šest stvari u njemu? 774 00:36:11,280 --> 00:36:14,250 >> Pa, što smo radili kad smo imali sve naših ljudskih volontera na pozornici u 775 00:36:14,250 --> 00:36:15,110 Posljednjih tjedana? 776 00:36:15,110 --> 00:36:18,710 Ako smo htjeli staviti nekoga ovdje, bilo ti ljudi kako bi ova 777 00:36:18,710 --> 00:36:22,540 način, ili ti ljudi kako bi ova način, te da je postao skuplji. 778 00:36:22,540 --> 00:36:26,950 Prebacivanja ljudi unutar Niz završio zbrajanjem i troškova 779 00:36:26,950 --> 00:36:31,240 Vrijeme nam je, dakle puno naša n na kvadrat prikazivati ​​puta kao umetanja vrste, za 780 00:36:31,240 --> 00:36:32,550 Primjerice, u najgorem slučaju. 781 00:36:32,550 --> 00:36:36,520 Dakle polja su veliki, ali morate unaprijed znati koliko je velika ste ih žele. 782 00:36:36,520 --> 00:36:38,030 >> Pa OK, ovdje je rješenje. 783 00:36:38,030 --> 00:36:43,860 Ako ne znam unaprijed koliko je Ja studenti mogli imati, a znam kada 784 00:36:43,860 --> 00:36:47,870 Odlučio sam, ipak, ja sam zapeo s tim mnoge studente, zašto ne sam uvijek 785 00:36:47,870 --> 00:36:51,740 izdvojiti dvostruko više prostora kao što sam mogao da mi treba? 786 00:36:51,740 --> 00:36:54,450 Nije li to razumno rješenje? 787 00:36:54,450 --> 00:36:58,240 >> Realno, ja ne mislim da smo mi Trebat će više od 50 mjesta 788 00:36:58,240 --> 00:37:02,190 u niz za srednje velike klase, pa neka je samo zaokružiti. 789 00:37:02,190 --> 00:37:07,040 Ja ću napraviti 100 mjesta u mom polju, jednostavno tako da smo definitivno mogu dobiti 790 00:37:07,040 --> 00:37:10,330 broj studenata očekujem da ću biti u nekom srednje veličine klase. 791 00:37:10,330 --> 00:37:14,320 Pa zašto ne samo zaokružiti i dodijeliti više memorije, obično, za niz 792 00:37:14,320 --> 00:37:16,290 nego što mislite da bi čak moglo trebati? 793 00:37:16,290 --> 00:37:20,190 Što je ovaj jednostavan pushback na tu ideju? 794 00:37:20,190 --> 00:37:21,440 >> Ti si gubit pamćenje. 795 00:37:21,440 --> 00:37:25,350 Doslovno svaki program pišeš onda je možda pomoću dvostruko više memorije 796 00:37:25,350 --> 00:37:26,680 što je zapravo potrebno. 797 00:37:26,680 --> 00:37:28,990 A to jednostavno ne osjeća kao Posebno elegantno rješenje. 798 00:37:28,990 --> 00:37:31,990 Štoviše, to samo smanjuje vjerojatnost problema. 799 00:37:31,990 --> 00:37:35,300 Ako vam se dogoditi da imaju popularne tečaj jedan semestar, a imate 101 800 00:37:35,300 --> 00:37:39,610 učenika, vaš program je još uvijek temeljno okrenut isti problem. 801 00:37:39,610 --> 00:37:44,280 >> Dakle, srećom, postoji rješenje za ovaj oglas svi naši problemi u obliku 802 00:37:44,280 --> 00:37:46,790 od strukture podataka koje su složeniji od onih 803 00:37:46,790 --> 00:37:47,970 smo vidjeli do sada. 804 00:37:47,970 --> 00:37:50,530 Ovaj, ja tvrdim, je linked list. 805 00:37:50,530 --> 00:37:51,920 Ovo je popis brojeva - 806 00:37:51,920 --> 00:37:54,970 9, 17, 22, 26, i 34 - 807 00:37:54,970 --> 00:38:00,120 koje su međusobno povezane putem od onoga što sam nacrtana kao strijela. 808 00:38:00,120 --> 00:38:03,580 >> Drugim riječima, ako sam htjela da predstavljaju polje, što sam mogao učiniti 809 00:38:03,580 --> 00:38:04,910 nešto poput ovoga. 810 00:38:04,910 --> 00:38:07,310 I ja ću staviti ovo na pretek u samo trenutak. 811 00:38:07,310 --> 00:38:09,970 Ja mogao učiniti - 812 00:38:09,970 --> 00:38:12,520 Pozdrav, u redu. 813 00:38:12,520 --> 00:38:14,470 Stand by. 814 00:38:14,470 --> 00:38:17,360 Novi računalni ovdje, jasna - 815 00:38:17,360 --> 00:38:18,090 U redu. 816 00:38:18,090 --> 00:38:21,730 >> Dakle, ako sam te brojeve u nizu - 817 00:38:21,730 --> 00:38:28,880 9, 17, 22, 26, 24 - 818 00:38:28,880 --> 00:38:30,530 ne nužno na ljestvici. 819 00:38:30,530 --> 00:38:33,730 U redu, ovdje je moj polje - 820 00:38:33,730 --> 00:38:34,980 O, moj Bože. 821 00:38:34,980 --> 00:38:38,700 822 00:38:38,700 --> 00:38:40,395 U redu, ovdje je moja polja. 823 00:38:40,395 --> 00:38:44,110 824 00:38:44,110 --> 00:38:45,050 O, moj Bože. 825 00:38:45,050 --> 00:38:48,820 >> [Smijeh] 826 00:38:48,820 --> 00:38:49,440 >> DAVID Malan: pretvarati. 827 00:38:49,440 --> 00:38:52,330 To je previše truda da se vrati i popraviti, tako da - 828 00:38:52,330 --> 00:38:54,290 26. 829 00:38:54,290 --> 00:38:57,650 Dakle, imamo niz 9, 17, 22, 26, i 34 godine. 830 00:38:57,650 --> 00:39:00,260 Za one od vas može vidjeti neugodno pogreška Upravo sam napravio, 831 00:39:00,260 --> 00:39:00,830 to je to. 832 00:39:00,830 --> 00:39:04,490 >> Dakle, ja tvrdim da je to vrlo učinkovito rješenje. 833 00:39:04,490 --> 00:39:07,310 Ja sam dodijeljeno onoliko Ints što Moram - jedan, dva, tri, 834 00:39:07,310 --> 00:39:09,100 četiri, pet ili šest - 835 00:39:09,100 --> 00:39:11,660 a ja sam tada pohranjuju brojevi unutar tog polja. 836 00:39:11,660 --> 00:39:15,220 No, pretpostavimo, onda, želim umetnuti vrijednost kao broj 8? 837 00:39:15,220 --> 00:39:16,100 Pa, gdje to ide? 838 00:39:16,100 --> 00:39:18,530 Pretpostavimo da želite umetnuti broj kao što je 20. 839 00:39:18,530 --> 00:39:19,790 Pa, gdje to ide? 840 00:39:19,790 --> 00:39:23,160 Negdje u sredini, ili broj 35 mora otići 841 00:39:23,160 --> 00:39:24,010 negdje na kraju. 842 00:39:24,010 --> 00:39:25,320 Ali ja sam sve više mjesta. 843 00:39:25,320 --> 00:39:29,120 >> I tako to je temeljni izazov matrica koja se nalaze rješenje. 844 00:39:29,120 --> 00:39:32,280 Ja tvrdio maloprije, GetString rješava taj problem. 845 00:39:32,280 --> 00:39:37,380 Ako želite umetnuti i šesti broj u ovom polju, što je barem jedan 846 00:39:37,380 --> 00:39:40,090 Rješenje možete se vratiti na sigurno, baš kao što radimo s GetString? 847 00:39:40,090 --> 00:39:44,340 848 00:39:44,340 --> 00:39:46,030 Što je to? 849 00:39:46,030 --> 00:39:48,190 >> Pa, to bi se veća lakše reći nego učiniti. 850 00:39:48,190 --> 00:39:52,810 Mi ne nužno može napraviti niz veća, ali ono što možemo učiniti? 851 00:39:52,810 --> 00:39:56,570 Napravite novi niz koji je veći od veličine, 6, ili možda veličine 10, ako želimo 852 00:39:56,570 --> 00:40:00,490 da se ispred stvari, a zatim kopirati stara polja u novi, a zatim 853 00:40:00,490 --> 00:40:01,680 osloboditi starog niz. 854 00:40:01,680 --> 00:40:05,770 >> No, ono što je trajanje Sada tog procesa? 855 00:40:05,770 --> 00:40:09,870 To je velika O n, jer kopiranje će vas koštati nekih jedinica 856 00:40:09,870 --> 00:40:13,480 vrijeme, tako da nije tako idealno ako moramo izdvojiti novi niz, što se događa 857 00:40:13,480 --> 00:40:15,610 konzumirati dvostruko više memorije privremeno. 858 00:40:15,610 --> 00:40:16,660 Kopirajte stare u novu - 859 00:40:16,660 --> 00:40:18,800 Mislim, to je samo glavobolja, koje je, opet, zašto smo pisali 860 00:40:18,800 --> 00:40:19,920 GetString za vas. 861 00:40:19,920 --> 00:40:21,380 >> Pa što bismo mogli učiniti umjesto toga? 862 00:40:21,380 --> 00:40:25,000 Pa, što ako naša struktura podataka zapravo ima rupe u njoj? 863 00:40:25,000 --> 00:40:30,790 Pretpostavimo da sam se opustiti moj cilj ima susjedni blokovi memorije, gdje 9 864 00:40:30,790 --> 00:40:34,500 je tik do 17, što je tik do 22., i tako dalje. 865 00:40:34,500 --> 00:40:39,570 >> I pretpostavimo da je 9. može biti više ovdje u RAM-a, a 17 može biti ovdje u RAM, 866 00:40:39,570 --> 00:40:40,990 i 22 mogu biti ovdje u RAM. 867 00:40:40,990 --> 00:40:43,610 Drugim riječima, mi ih ne trebamo i natrag na leđa više. 868 00:40:43,610 --> 00:40:47,850 Upravo sam se nekako nit iglu kroz svaki od ovih brojeva, ili svaki 869 00:40:47,850 --> 00:40:51,010 od tih čvorova, kao što ćemo nazvati pravokutnika kao što sam ih izvučeni, na 870 00:40:51,010 --> 00:40:55,670 sjetite se kako doći do posljednja kao čvor od prvog. 871 00:40:55,670 --> 00:40:59,940 >> Dakle, ono što je programiranje izgradnju Vidjeli smo se nedavno s kojima sam 872 00:40:59,940 --> 00:41:03,030 mogu provesti taj konac, ili izvučeni ovdje, s kojima mogu 873 00:41:03,030 --> 00:41:05,430 primijeni te strelice? 874 00:41:05,430 --> 00:41:06,500 Dakle naputke, zar ne? 875 00:41:06,500 --> 00:41:09,560 Ako sam izdvojiti ne samo int, ali čvor - i 876 00:41:09,560 --> 00:41:10,810 čvora, ja samo znači kontejner. 877 00:41:10,810 --> 00:41:12,900 I vizualno, mislim pravokutnik. 878 00:41:12,900 --> 00:41:16,420 Dakle čvor očito treba da sadrži dvije vrijednosti - 879 00:41:16,420 --> 00:41:21,490 int sama, a onda, kao implicira donji dio pravokutnika, 880 00:41:21,490 --> 00:41:23,010 dovoljno mjesta za int. 881 00:41:23,010 --> 00:41:26,130 >> Dakle, samo naprijed razmišljanja ovdje, koliko je velik ovaj čvor, ova 882 00:41:26,130 --> 00:41:27,170 Spremnik je u pitanju? 883 00:41:27,170 --> 00:41:29,250 Koliko bajta za int? 884 00:41:29,250 --> 00:41:31,310 Vjerojatno 4, ako je to isto kao i obično. 885 00:41:31,310 --> 00:41:33,270 I onda koliko bajtova za pokazivač? 886 00:41:33,270 --> 00:41:33,650 4. 887 00:41:33,650 --> 00:41:37,940 Dakle, ovaj kontejner ili ovaj čvor, je će biti 8-byte struktura. 888 00:41:37,940 --> 00:41:41,760 Oh, i da je sretna slučajnost da Upravo smo uveli taj pojam 889 00:41:41,760 --> 00:41:44,400 rekonstruirati ili C strukturu. 890 00:41:44,400 --> 00:41:48,890 >> Dakle, ja tvrdim da želim da se korak Prema ovom sofisticiraniji 891 00:41:48,890 --> 00:41:52,560 Provedba popisa brojeva, u povezani popis brojeva, što trebam učiniti 892 00:41:52,560 --> 00:41:56,920 malo više razmišljanja unaprijed i izjavljujem nije samo int, ali je rekonstruirati 893 00:41:56,920 --> 00:41:58,620 da ću nazvati, konvencionalno Ovdje, čvor. 894 00:41:58,620 --> 00:42:01,630 Mogli bismo ga nazvati što god želimo, ali čvora će biti tematska u puno 895 00:42:01,630 --> 00:42:03,560 od stvari koje smo započeli gledajući sada. 896 00:42:03,560 --> 00:42:06,480 >> Unutar tog čvora je int n. 897 00:42:06,480 --> 00:42:09,350 I onda to sintakse, malo čudno na prvi pogled - 898 00:42:09,350 --> 00:42:12,960 struct čvor * next. 899 00:42:12,960 --> 00:42:16,900 Pa slikovito, što je to? 900 00:42:16,900 --> 00:42:21,000 To je dno polovica pravokutnik koji smo vidjeli 901 00:42:21,000 --> 00:42:22,730 Samo trenutak prije. 902 00:42:22,730 --> 00:42:27,600 >> Ali zašto sam ja rekao struct čvor * za razliku od samo čvor *? 903 00:42:27,600 --> 00:42:31,370 Jer ako je to pointer pokazuje , na drugom čvoru, to je samo 904 00:42:31,370 --> 00:42:32,760 adresa čvor. 905 00:42:32,760 --> 00:42:35,630 To je u skladu s onim što imamo Raspravlja se o pokazivače do sada. 906 00:42:35,630 --> 00:42:39,690 Ali zašto, ako ja tvrdim ova struktura je čvora zove, moram reći struct 907 00:42:39,690 --> 00:42:42,660 čvora unutar ovog? 908 00:42:42,660 --> 00:42:43,190 >> Točno. 909 00:42:43,190 --> 00:42:46,490 To je neka vrsta glupog stvarnosti C. Typedef, da se tako izrazim, nije 910 00:42:46,490 --> 00:42:47,220 još dogodilo. 911 00:42:47,220 --> 00:42:48,510 C je super doslovna. 912 00:42:48,510 --> 00:42:51,050 Ona čita svoj kod na vrh dna, s lijeva na desno. 913 00:42:51,050 --> 00:42:54,930 I dok ne udari taj zarez na Dno crta, pogodite što ne 914 00:42:54,930 --> 00:42:57,590 postojati kao vrstu podataka? 915 00:42:57,590 --> 00:42:59,060 Čvora, citat završen citat čvor. 916 00:42:59,060 --> 00:43:03,050 >> No, zbog mnogo opširnije Izjava sam na prvoj liniji - 917 00:43:03,050 --> 00:43:05,340 typedef struct node - 918 00:43:05,340 --> 00:43:08,790 jer to je bilo prije, prije vitičastim zagradama, to je nešto kao 919 00:43:08,790 --> 00:43:11,800 pre-edukaciju Dong da, da Znaš što, daj mi struct 920 00:43:11,800 --> 00:43:13,570 zove struct čvor. 921 00:43:13,570 --> 00:43:16,270 Iskreno, ja ne bih zovete stvari struct čvor, struct čvor sve 922 00:43:16,270 --> 00:43:17,090 tijekom mog koda. 923 00:43:17,090 --> 00:43:20,660 Ali ja ću ga koristiti samo jednom, samo unutar, tako da mogu učinkovito 924 00:43:20,660 --> 00:43:25,010 stvoriti neku vrstu kružne reference, ne kazaljka na sebi i po sebi, ali 925 00:43:25,010 --> 00:43:29,400 pokazivača u drugu identična putovanja. 926 00:43:29,400 --> 00:43:32,330 >> Tako ispada da je na strukturu podataka ovako, postoji nekoliko 927 00:43:32,330 --> 00:43:34,470 Operacije koje bi mogle biti od interesa za nas. 928 00:43:34,470 --> 00:43:37,460 Mi možda želite umetnuti u popisu kao što je ovaj. 929 00:43:37,460 --> 00:43:39,850 Mi možda želite izbrisati s popisa kao što je ovaj. 930 00:43:39,850 --> 00:43:43,490 Mi možda želite pretraživati ​​popis za Vrijednost, ili općenitije, poprijeko. 931 00:43:43,490 --> 00:43:46,410 I poprijeko je samo fancy način govoreći početka na lijevo i premjestiti sve 932 00:43:46,410 --> 00:43:47,650 smjer u desno. 933 00:43:47,650 --> 00:43:52,640 >> I obavijest, čak i uz to nešto više sofisticiran struktura podataka, neka 934 00:43:52,640 --> 00:43:56,510 ja predlažem da možemo posuditi neke od ideje u protekla dva tjedna i 935 00:43:56,510 --> 00:43:58,410 implementirati funkciju pod nazivom Usporedite kao što je ovaj. 936 00:43:58,410 --> 00:44:01,360 To će vratiti true ili lažna, što ukazuje, da ili 937 00:44:01,360 --> 00:44:03,390 ne, n je na popisu. 938 00:44:03,390 --> 00:44:05,960 Njegov drugi argument je pokazivač na popis same, tako 939 00:44:05,960 --> 00:44:07,920 pokazivač na čvor. 940 00:44:07,920 --> 00:44:10,350 >> Sve ću onda učiniti je proglasiti privremena varijabla. 941 00:44:10,350 --> 00:44:12,730 Zvat ćemo je ptr po konvenciji, za pointer. 942 00:44:12,730 --> 00:44:15,220 I sam je odrediti jednaka početak popisa. 943 00:44:15,220 --> 00:44:16,680 >> A sada primijetiti petlju dok. 944 00:44:16,680 --> 00:44:20,640 Tako dugo dok kazaljka nije jednak na nulu, idem provjeriti. 945 00:44:20,640 --> 00:44:24,520 Je pokazivača strelica n jednaka n koji je donesen u? 946 00:44:24,520 --> 00:44:26,410 I čekati minutu - Novi komad sintakse. 947 00:44:26,410 --> 00:44:29,324 Što je strijela odjednom? 948 00:44:29,324 --> 00:44:30,574 Da? 949 00:44:30,574 --> 00:44:34,200 950 00:44:34,200 --> 00:44:34,810 >> Točno. 951 00:44:34,810 --> 00:44:38,860 Dakle, dok je prije nekoliko minuta, koristili smo dot oznake za pristup nešto 952 00:44:38,860 --> 00:44:43,080 unutar A rekonstruirati ako je varijabla ste ne struct 953 00:44:43,080 --> 00:44:47,420 sama, ali pointer na struct, Srećom, dio sintakse koje 954 00:44:47,420 --> 00:44:48,620 konačno čini intuitivan osjećaj. 955 00:44:48,620 --> 00:44:52,360 Strelica znači slijediti pokazivač, kao i naši strelice obično znači 956 00:44:52,360 --> 00:44:56,570 slikovno, i ići na podatkovno polje unutra. 957 00:44:56,570 --> 00:44:59,700 Dakle strelica ista stvar kao točke, ali što ga koristiti kada imate pokazivač. 958 00:44:59,700 --> 00:45:05,270 >> Dakle, samo da ponovim onda, ako n Polje unutar struct zove pokazivač 959 00:45:05,270 --> 00:45:07,760 jednako jednako n, povratak istina. 960 00:45:07,760 --> 00:45:11,970 Inače, ova linija ovdje - pointer jednako pokazivač sljedećeg. 961 00:45:11,970 --> 00:45:17,540 Pa što se to radi, obavijest, ako je sam trenutno sam pokazujući na struct 962 00:45:17,540 --> 00:45:21,430 koji sadrži 9, i 9 nije broj Tražim - Pretpostavljam tražim 963 00:45:21,430 --> 00:45:22,830 za n jednak 50 - 964 00:45:22,830 --> 00:45:25,930 Ja ću ažurirati moj privremeni pokazivač ne ukazuju na ovom čvoru 965 00:45:25,930 --> 00:45:31,190 više, ali pokazivač strelicu pored, koji ide mi stavi ovdje. 966 00:45:31,190 --> 00:45:34,270 >> Sada sam shvatio je nevrijeme Uvođenje. 967 00:45:34,270 --> 00:45:37,380 U srijedu, mi zapravo ćete to učiniti s nekim ljudima i još 968 00:45:37,380 --> 00:45:38,900 Kod sporijim tempom. 969 00:45:38,900 --> 00:45:42,990 Ali shvatite, sada smo izradu naših podataka struktura složenija, tako da su naši 970 00:45:42,990 --> 00:45:45,780 algoritmi mogu dobiti učinkovitiji, koji će biti uvjet za 971 00:45:45,780 --> 00:45:50,500 pset šest, kad smo učitavanje u, opet, onima 150.000 riječi, ali je potrebno da to učinite 972 00:45:50,500 --> 00:45:55,650 učinkovito, i idealno, stvoriti Program koji traje naši korisnici ne 973 00:45:55,650 --> 00:46:00,460 linearno, ne n kvadrat, ali u stalno vrijeme, u idealnom. 974 00:46:00,460 --> 00:46:02,300 >> Vidimo se u srijedu. 975 00:46:02,300 --> 00:46:07,240 >> ZVUČNI: Na sljedećem CS50, David zaboravi svoj osnovni scenarij. 976 00:46:07,240 --> 00:46:12,770 >> DAVID Malan: I to je kako šaljete tekstualne poruke s C. Ono - 977 00:46:12,770 --> 00:46:14,020 >> [RAZNI tekstualnu poruku Zvukova obavijest] 978 00:46:14,020 --> 00:46:19,734