DAVID Malan: U redu, dobrodošao natrag. Ovo je CS50. Ovo je početak tjedna sedam. Dakle, to je bio neko vrijeme, pa sam pomislio da bih se u vihoru obilazak gdje smo stali, a gdje smo sada idemo. Dakle, ova stvar ovdje može imati izazvalo neke tjeskobe na prvom mjestu. No, nadamo se, da ste na početku aklimatizirati se što to označava ovdje - star predstavlja pokazivač, koji je samo ono, u više laik uvjete? Tako da je adresa. Dakle, to je adresa nešto u sjećanju. I počeli smo guliti natrag slojeve Prije nekoliko tjedana, stvari se sviđa GetString i druge takve funkcije sve ovo vrijeme su se vraćaju Adrese stvari u sjećanju, kao što su adresu prvi znak u neki slijed. Dakle, mi također predstavio Valgrind, koji vi ćete početi koristiti za ovaj problem postavljanje, osobito za sljedeći Problem postavljena kao dobro. I Valgrind što radi za nas? Ona provjerava za pamćenje pukotina, i to Također provjerava za zloporabu memorije. To može, s nekom vjerojatnošću, otkriti ako vaš broj će se dotaknuti memorije da se jednostavno ne trebaju. Dakle, ne nužno curenja, ali ako vas ići izvan granica pojedinih polje, a vi zapravo pokrenuti Valgrind i poticati takvo ponašanje, a Valgrind je pokrenut u svoj program je prikazivati ​​unutar nje, da ćete dobiti poruke poput ove: - "nevažeća pisati o veličine 4 ", koji je, prisjetimo nekoliko tjedana značilo da sam imao slučajno željeli na jednom int predaleko izvan granica niza. I tako veličine 4 ovdje znači veličinu od tog int. Tako se sigurnost u činjenici da Valgrind je izlaz, format njega, samo je grozno. To je stvarno teško vidjeti kroz nered za zanimljivih informacija. Dakle, ono što smo učinili ovdje je samo izvadak Neki od nekoliko više zanimljive linije. Ali shvatite da je 80% Valgrind-a Izlaz će biti malo distrakcija. Dovoljno je tražiti uzorke poput ovih - nevažeća pravo, nevažeća pročitati, 40 bajtova a neki broj blokova su definitivno izgubili, ključne riječi kao što je to. A ono što ćete vidjeti nadamo se neki vrsta tragu onoga što funkcionira pogreška je zapravo u. U ovom slučaju ovdje, u ono linija moj broj je očito pogreška? 26 u datoteci pod nazivom memory.c, što je Primjer smo igrali s u tom trenutku. Tako da je vjerojatno nije u malloc. To je vjerojatno bio u mom kodu umjesto. Tako ćemo to opet vidjeti i opet ne zadugo. Dakle scanf, ovaj je došao u par formi do sada. Vidjeli smo sscanf kratko. To je nešto što broj što zaronio u svoj Pripreme za kviz. I scanf je zapravo ono CS50 Knjižnica je koristio ispod napa za neko vrijeme kako bi da se informacije od korisnika. Na primjer, ako sam premjestiti na CS50 Aparat ovdje, neka mi se otvaraju Primjer je danas da se zove scanf-0.c I to je super jednostavna. To je samo nekoliko linija koda. Ali to pokazuje koliko je uistinu getInt je radio sve ovo vrijeme. U ovom programu ovdje, u liniji 16 , Obavijest da sam proglasiti int. Dakle, ništa ne upućuje čarobno postoji, samo int. Tada je u skladu 17, sam zatražiti Korisnik za broj, molim vas. Onda je krajem 18., ja koristiti scanf ovdje. I sam je navedeno, vrsta kao printf, da sam očekivao citat završen citat postotku ja. Tako sam odsto, naravno, označava int. Ali primijetiti što drugi Argument da je scanf. Kako bi ste opisali drugi Argument iza zareza? Što je to? To je adresa x. Dakle, ovo je korisno jer pružanjem scanf s adresom x, što se koji osnažiti tu funkciju učiniti? Ne samo tamo, već i to što? Napravite promjenu u njemu. Budući da možete otići tamo, to je vrsta kao karte na mjesto u memoriji. I tako dugo dok vam pružiti scanf, ili bilo funkciju s takvim karti, te funkcija može otići tamo, a ne samo pogledajte vrijednosti, ali to također može promijeniti tu vrijednost, što je korisno ako svrha u životu je da se scanf skeniranje informacije od korisnika, posebno od tipkovnice. I f označava formatiran, baš kao i printf, f označava formatirani niz koji želite ispisati. Dakle, ukratko, ovaj redak 18 jednostavno kaže, pokušati pročitati int iz korisničkog Tipkovnica i pohraniti unutar x, na sve što se događa adresa x živjeti kod. I onda na kraju, linija 19 samo kaže, hvala na int, u ovom slučaju. Zato mi dopustite da ići naprijed i učiniti to. Tako bi scanf 0. Dopustite mi da ide naprijed i zumiranje u. Idem i pokrenuti ovu s točkice slash scanf 0. Broj, molim te? 50. Hvala na 50 godina. Dakle, to je vrlo jednostavna. Sada ono što se ne radi? To se ne radi cijela hrpa od provjere pogreške. Na primjer, ako ja ne surađuju, i ne upisati broj, ali umjesto da napišem nešto poput "Hello" to je samo vrsta čudno. I tako jedna od stvari CS50 Knjižnica je bio događaj za nas za neke Vrijeme je da reprompting i reprompting. Ponovno frazu opoziv bio u cs50.c, i to je razlog da je u getInt CS50 knjižnica je zapravo cijela Gomila linije duge, jer smo provjera za glupe stvari kao što je ovaj. Je li korisnik ne daju nas, u stvari, int? Je li on ili ona daje nam nešto kao abecednim slovom? Ako je tako, želimo otkriti da i vikati na njih. No, stvari postaju još zanimljivije u ovom sljedećem primjeru. Ako idem u scanf-1c, što je jedna stvar koja je iz temelja promijenila u Sljedeći primjer je ovo? Ja sam koristeći char *, dakako, umjesto int. Dakle, ovo je zanimljivo, jer char *, Podsjetimo, je zapravo samo ista stvar kao string. Tako se osjeća kao možda i ovo je super jednostavna provedba GetString. Ali sam oguljen sloj od CS50 knjižnici, pa sam nazivajući ovu char * sada. Pa da vidimo gdje je, ako je bilo, možemo pogriješiti. Line 17 - I opet kažem, molim vas dajte mi nešto, u ovom slučaju, string. A onda u sljedećem retku, zovem scanf, opet, dajući mu oblik kodnog, ali to je vrijeme posto. A onda ovaj put, sam dajući joj tampon. Sada primijetiti, ja ne koristim znak za str. Ali zašto je to vjerojatno u redu ovdje? Jer, što je već tampon? Već je pointer. To je već adresa. I neka je ova riječ "zbuniti," pusti me Samo ga zovu s, primjerice, za jednostavnosti. Ali ja sam to nazvao tampon jer je u Općenito, u programiranju, ako imate komad memorije, što string stvarno samo je, možda ga zovu tampon. To je mjesto za pohranu informacija. Slično kao i stvari kao što su YouTube, kada oni buffering, da tako kažem, da je Samo znači da je skidanje bita iz internetu te ih pohranite u lokalnim polje, lokalna komad memorije, tako da ga možete gledati kasnije bez to preskakanje ili visi na ste tijekom reprodukcije. Dakle, postoji problem ovdje ipak, jer ja govorim scanf, očekujem string od korisnika. Evo adresa komad memorije. Stavite taj string tamo. Zašto je da je opkoljen daju nas problem, iako? Što je to? Smijem li pristupiti da je dio memorije? Znate, ja ne znam. Budući da je tampon inicijaliziralo na što? Ne zapravo. I to je ono što smo pozivom smeće vrijednost, koja nije formalno riječi. To samo znači da nemamo pojma što bita su unutar četiri bajtova koji Ja sam izdvojila kao tampon. Ja nisam nazvao malloc. Ja sam svakako ne zove GetString. Dakle, tko zna što je zapravo unutar tampon? A ipak govori scanf naslijepo, otići tamo i staviti sve što korisnik upisali. Dakle, što je vjerojatno da će izazvati u našem kodu, ako smo ga pokrenuti? Vjerojatno segfault. Možda i nije, ali vjerojatno segfault. I kažem možda i ne, jer ponekad što učiniti, ponekad da ne dobijete segfault. Ponekad jednostavno imali sreće, ali ipak će biti bug u našem programu. Zato mi dopustite da ići naprijed i sastaviti to. Ja ću učiniti da stara škola smjer. Tako jeka crtica 0, scanf-1, scanf-1c, Enter. Ups, previše stara škola. Idemo vidjeti. Gdje sam? Oh, char * tampon. Oh, hvala ti - Spremi, OK - vrlo stara škola. U redu, to je bio neko vrijeme. Pa upravo sam spremili datoteku nakon odluka da se privremeno promijeniti trenutak prije. I sad sam ga sastavio Ručno jeka. A sada ću ići naprijed i pokrenuti scanf-1, Enter. Gudački molimo. Ja ću upisati "Hello". A sada, evo gdje je, iskreno, printf Možete je malo neugodno. Nije zapravo ide segfault u ovom slučaju. Printf je malo posebna jer to je tako super uobičajeno da printf suštini se radi nam milost i realizirati, to nije valjana pointer. Dopustite mi ga uzeti na sebe samo za ispis u zagradi null, čak iako to nije nužno ono što mi sami očekivali. Dakle, ne možemo uistinu jednostavno izazivati segfault s tim, ali to očito Nije ponašanje sam htjela. Dakle, ono što je jednostavno rješenje? Pa, u scanf-2, neka mi predlažemo da umjesto da zapravo samo dodjele char *, neka mi bude malo pametniji o ovo, i neka mi izdvojiti tampon kao niz od 16 znakova. Dakle, ja mogu to učiniti na nekoliko načina. Ja apsolutno mogu koristiti malloc. Ali ja mogu vratiti u tjedan dva, kada Trebala mi je cijela hrpa likovi. To je samo polje. Pa neka mi umjesto redefinirati tampon da se niz od 16 znakova. A sada, kada sam prođe u tampon - i to je nešto što se nije govoriti o dva u tjednu - ali se može liječiti niz kao iako je adresa. Tehnički gledano, kao što smo vidjeli, oni su malo drugačiji. Ali scanf neće imati ništa protiv ako to prođe naziv niza, jer je ono Dong će učiniti za nas je bitno liječenje ime tog polja kao adresa s blokom od 16 bajtova. Dakle, to je bolje. To znači da sada mogu nadamo učiniti sljedeće. Dopustite mi povećali za trenutak i to bi scanf-2, sastavio OK. Sada neka mi to dobio crtu scanf-2. Gudački molimo. "Zdravo." I to Činilo se da rade ovaj put. No, može netko predložiti scenarij u kojoj se još uvijek ne bi mogli raditi? Da? Nešto više od 16 znakova. I zapravo, možemo biti malo precizniji. Nešto duže od 15 znakova, jer stvarno moramo imati na umu da mi je potrebno da se crticu nula implicitno na kraju niza, što je na stranu scanf će obično brinuti za nas. Pa neka mi napraviti nešto slično - Ponekad mi samo možemo ostavite kao što je to. U redu, tako da smo sada izazvana naš segmentacije kriv. Zašto? Zato što sam upisali u više od 15 likovi, pa mi smo zapravo dotakla memorije da sam zapravo ne bi trebali imati. Dakle, ono što je stvarno rješenje ovdje? Pa, što ako nam je potrebno duže string? Pa, mi bi ga možda 32 bajtova. Pa, što ako to nije dovoljno dugo? Kako oko 64 bajtova? Što ako to nije dovoljno dugo? Kako oko 128 ili 200 bajtova? Ono što je stvarno rješenje ovdje u opći slučaj, ako ne znamo u unaprijed što će korisnik upisati? To je samo vrsta velikom boli u dupe, da budem iskren, što je razlog zašto CS50 knjižnica ima nekoliko desetaka redaka kod koji zajednički provode GetString string na način da mi ne Morate znati unaprijed što korisnik će se upisati. Konkretno, ako se osvrnuti na cs50.c od prije dva tjedna, vidjet ćete da GetString zapravo Ne koristite scanf na ovaj način. Umjesto toga, on navodi jedan znak u isto vrijeme. Jer jedna lijepa stvar o čitanje jednog znaka je možemo se jamči da uvijek ima barem jedan znak. Ja samo mogu deklarirati char, a zatim se ti doista dječji koraci na samo pročitao jedan lik u po Vrijeme na tipkovnici. A onda, što ćete vidjeti GetString radi se svaki put kad ga ponestane, recimo, 16 bajtova memorije, koristi malloc ili rođak toga, na izdvojiti više memorije, kopiranje stara memorije u novo, a zatim puzi zajedno, uzimajući jedno slovo u isto vrijeme, i kada se radi iz toga komad memorije, to baca daleko, zgrabi veći komad memorije, kopira stara u nove, i ponavlja. I to je doista boli da zapravo provesti nešto kao jednostavan kao dobivanja informacije od korisnika. Dakle, možete koristiti scanf. Možete koristiti i druge slične funkcije. I puno udžbenika i online primjeri učiniti, ali oni su sve podložnijima problemima kao što je ovaj. I u konačnici, uzimajući segfault je vrsta neugodno. To nije dobro za korisnika. No, u najgorem slučaju, što se on bitno staviti svoj Kod prijeti? Neka vrsta napada, potencijalno. Razgovarali smo o jednom takvom napadu - preplavljen snop. Ali općenito, ako ste dozvoljeno prelijevanja spremnika, kao što smo učinili Prije nekoliko tjedana, sa samo pisanje više od "Hello", na dimnjak, što doista može preuzeti, potencijalno, računalo, ili barem na podacima koji ne pripada vama. Dakle, ukratko, to je razlog zašto smo ti trening kotača. Ali sada, počinjemo ih skinu, kao naši programi više ne treba, nužno, ulaz od korisnika. No, u slučaju problema postavili šest, Vaš unos će doći iz ogromne rječnik datoteku s 150 neki ak tisuća riječi. Tako nećete morati brinuti o Korisnik je proizvoljna ulaz. Mi ćemo vam dati neke pretpostavke O toj datoteci. Bilo kakva pitanja na pokazivače ili scanf ili korisnički unos u cjelini? U redu, a zatim brzi pogled na jednu prateći temu od prije dva tjedna. I to je to pojam struct. Nije to - taj pojam struct, što je ono? Što je rekonstruirati učiniti za nas? Definirajte - žao? Definirajte varijablu tip. Dakle, na neki način. Mi zapravo kombinirajući dvije teme. Tako je s typedef, podsjetiti da možemo proglasiti neku vrstu vlastite, kao što su sinonim, kao i niza za char *. No, pomoću typedef struct i, možemo stvoriti doista vlastite strukture podataka. Na primjer, ako idem natrag u gedit ovdje samo na trenutak, a ja ići naprijed i učiniti nešto slično, neka mi spasiti ovo kao, recimo, structs.c privremeno, samo ću ići naprijed i uključuju standardio.h, int main nevažeće. A onda je ovdje, pretpostavljam da želim napisati program koji pohranjuje više studenata iz više Kuće, primjerice. Pa to je kao registrarial baza podataka o nekom vrstom. Dakle, ako trebam ime jednog studenta, sam Možda nešto kao char * ime, i ja ću učiniti nešto slično - zapravo, neka je koristiti CS50 knjižnicu samo na trenutak kako bi ovaj Malo jednostavnije, tako da možemo posuditi one desetke linija koda. I neka je samo neka bude jednostavan. Mi ćemo ga zadržati string, a sada GetString. Dakle, ja tvrdim sad da sam pohranjeni ime nekog studenta, i kuću neki student, jednostavno pomoću varijable kao što smo učinili iu jednom tjednu. Ali pretpostavimo da sam sada žele podržati više studenata. U redu, tako da moji instinkti učiniti string NAME2, dobiva GetString, string house2 dobiva GetString. I onda naš treći student, idemo napraviti NAME3 GetString. U redu, tako da je ovo nadamo markantnim ti kao glupo, jer taj postupak je stvarno nikada ide do kraja, i to samo ide na bi moj broj izgleda još gore i gore i gore. Ali smo riješili ovo previše u tjedan dva. Ono što je naša relativno čisto rješenje kada smo imali više varijabli Isti tip podataka koji su svi povezani, ali nismo željeli ovaj grozan nered Slično od navedenih varijabli? Što smo to učinili umjesto toga? Dakle, mislim da sam čuo nekoliko mjesta. Imali smo niz. Ako želite više instanci nešto, zašto ne bismo počistiti sve ovo i samo reći, mi daju Niz zove imena? A za sada, neka je teško tri koda. I onda mi još niz zove kuće, a mi ćemo za Teško je sada broj 3. I sam sam očistio masivno nered koji sam stvorio. Sada, ja sam još uvijek teško kodirano 3, ali čak i 3 dinamički mogao doći iz korisnik ili se argv ili slično. Dakle, ovo je već čišći. No, ono što je neugodno o tome da Sada, iako je ime nekako prvenstveno povezana s studenta kuća - to je student koji sam stvarno želim predstaviti - Ja sada imam dva polja koja su paralelne u smislu da su oni iste veličine i imena nosač 0 Vjerojatno mapira kuća zagrada 0, i imena zagrada 1 maps kućama nosač 1. Drugim riječima, da je učenik živi u da je kuća, i to drugi student živi u toj drugoj kući. Ali sigurno bi to moglo biti obaviti čak i više čisto. Pa, što mogu, u stvari. I neka mi ići naprijed i otvorite do structs.h, a vi ćete vidi ovu ideju ovdje. Obavijest da sam koristiti typedef, kao i vi aludirao na trenutak prije proglasiti našem vlastita vrsta podataka. Ali ja sam također koriste ovu drugu ključnu riječ zove struct koji mi daje novi struktura podataka. A to struktura podataka Tvrdim ide imati dvije stvari unutar to - string zove ime i string zove kući. I ime ću dati ova struktura podataka ide da se zove student. Mogao bih to nazvao što želim, ali to bi semantički osjećaj da me u mom umu. Pa sad, ako sam otvoriti bolju verziju od programa sam počeo pisati ima, neka mi dođite do vrha. A tu je još nekoliko linija koda ovdje, ali dopustite mi da se usredotoče na Trenutak na jedan. Ja sam proglasio konstantu zvanu studente i teško kodirano 3 za sada. Ali sada, primijetiti kako se čisti moj broj počinje dobivati. U skladu 22, izjavljujem Niz studenata. I primijetiti da učenik očito Sada vrsta podataka. Jer je na vrhu ove datoteke, primijetiti Uključio sam taj header datoteku da sam izvukao se samo trenutak prije. I to header file jednostavno je ova definicija o studentu. Pa sad, ja sam stvorio svoje vlastite prilagođene podatke Vrsta da su autori C godina Prije nije misliti unaprijed. No, nema problema. Mogu to sam. Dakle, ovo je niz naziva učenika, svaki od čiji su članovi je student struktura. I želim tri osobe u polju. A sada, što se ostatak tog programa učiniti? Trebao sam nešto malo proizvoljan. Dakle, od 24 pa nadalje online, I iteraciju od 0 do 3. I onda pitati korisnika za studenta ime. A onda sam koristiti GetString kao i prije. Tada sam pitati za studenta kući, i ja koristiti GetString kao i prije. Ali Obavijest - nešto novo komad sintaksi - Ne mogu još uvijek indeksa na i-tog studenta, ali kako sam se na određene podatke Polje unutar struct? Pa, ono što je očito Novi komad sintakse? To je samo točka operatora. Nismo stvarno ovo vidio. Vi ste to vidjeli u pset pet, ako ste zaronio u već s bitmap datoteke. Ali dot samo znači unutar ove rekonstruirati ili više polja, daju točku Naziv, ili mi dati dot kuću. To znači ići unutar struct i dobiti tih pojedina polja. Što ostatak ovog programa učiniti? To nije sve što je sexy. Obavijest da sam ponoviti 0-3 opet, i ja jednostavno stvoriti Engleski fraze poput, tako i tako je to i takva kuća, prolazeći u dot ime iz I-og studentica i njihovih Kuća kao dobro. I onda na kraju, sad ćemo početi da se analni o tome, sada kad smo upoznati s onim što malloc i ostale funkcije su za to vrijeme radi. Zašto se moram osloboditi i ime i kuća, iako sam ne poziva malloc? GetString učinio. I to je prljava mala tajna nekoliko tjedana, ali ima GetString je curi memorije cijelom mjesto sve semestar do sada. I valgrand će napokon otkrivaju nam to. No, to nije velika stvar, jer znam da sam jednostavno mogu osloboditi ime i kuća, iako je tehnički, da biti super, super siguran, ja bi trebao biti radiš neke provjere pogreške ovdje. Što su vaši instinkti vam govorim? Što bih trebao biti provjera za prije nego što sam osloboditi onoga što je string, aka koji char *? Stvarno bi trebao biti ček ako učenici Nosač ja dot ime ne jednako null. Tada ćete biti u redu da ide naprijed i bez da je pokazivač, a isto tako i druge jednom, kao. Ako studenata nosač ja dot kuća nije jednak null, ovo sada će štititi protiv kutu slučaju u kojem je GetString vraća nešto poput null. A vidjeli smo malo prije, printf će štite nas ovdje je samo rekao null, koji će izgledati čudno. Ali barem to neće segfault, kao što smo vidjeli. Pa, neka mi učiniti jednu drugu stvar ovdje. tvorevina-0 je vrsta glupog programa jer sam unijeti sve ove podatke, a zatim to je izgubila nakon završetka programa. No, dopustite mi da ići naprijed i učiniti. Dopustite mi da se terminal Prozor malo veći. Dopustite mi da tvorevina-1, koji se je nova verzija toga. Ja ću povećavanje malo. I sad neka mi pokrenuti točku slash tvorevina-1. Studentska ime - David Mather, idemo napraviti Rob Kirkland, idemo napraviti Lauren Leverett. Ono što je zanimljivo je sada obavijest - a ja samo znam to jer Napisao sam program - postoji datoteka sada na moj tekući katalog zove students.csv. Neki od vas možda su vidjeli to u stvarnom svijetu. Što je CSV? Razdvojene zarezom. To je vrsta kao siromah verzija programa Excel datoteke. To je stol od redaka i stupaca koji možete otvoriti u programu Excel kao što su, Brojevi ili na Macu. A ako sam otvoriti ovu datoteku ovdje na gedit, Obavijest - a brojevi nisu tu. To je samo priča gedit ja brojeve linija. Primijetiti na prvoj liniji ovu datoteka je David i Mather. Sljedeći linija je Rob zarezom Kirkland. I treća linija je Lauren Leverett zarezom. Dakle, ono što sam stvorio? Sada sam napisao C program koji učinkovito može generirati tablice koja se može otvoriti u Program kao što je Excel. Ne tako uvjerljiv skup podataka, ali Ako imate puno veće komade Podaci koje ste zapravo žele manipulirati i napraviti grafikone i sviđa, to je možda jedan način za stvaranje tih podataka. Štoviše, CSVs su zapravo super česta samo za pohranu podataka jednostavne - Yahoo Finance, primjerice, ako se burzovne kotacije preko svoje tzv API, besplatan servis koji vam omogućuje dobiti tekuće up-to-date-stock citati za tvrtke, oni dati podatke natrag u super jednostavna CSV format. Pa kako ćemo to učiniti? Pa primijetiti, većina ih ovaj program gotovo isti. No primijetite ovdje dolje, umjesto ispisa studenti vani, na liniji 35 nadalje, ja tvrdim da sam spas studenata na disku, tako da štedi datoteku. Dakle, primijetite sam proglašenja datoteke * - Sada, to je vrsta anomalije u C. Iz nekog razloga, SLIKA je sve kape, što nije kao većina drugih tipova podataka u C. No, to je ugrađeni Tip podataka, SLIKA *. I ja sam deklariranje pokazivač na datoteku, Tako možete misliti kako. fopen znači otvoren datoteku. Što file želite otvoriti? Želim otvoriti datoteku da ću samovoljno nazovite students.csv. Ja mogu nazvati taj što želim. A onda uzeti pogodak. Što drugi argument se fopen vjerojatno znači? Točno, w za pisati, mogla r se za čitanje. Tu je za dodavanjem ako želite dodati retke, a ne prepisati cijelu stvar. Ali ja samo želim napraviti ovu datoteku odjednom, tako da ću koristiti citat završen citat w. I znam da je samo iz Čitaju dokumentacije, odnosno čovjek stranica. Ako datoteka nije null - drugim riječima, ako ništa pošlo po zlu postoji - neka mi ponoviti tijekom učenici 0-3. I sad primjetiti da postoji nešto uvijek je tako malo drugačije O line 41 ovdje. Nije printf. To je fprintf za datoteku printf. Dakle, to će pisati u datoteku. Koja datoteka? Onaj čije je pointer ste naveli kao prvi argument. Zatim smo naveli niz formata. Tada ćemo odrediti što želimo string plug-in za prvi posto s, a zatim još jedan varijabilni ili Drugi posto s. Onda smo zatvoriti datoteku s fclose. Nego sam osloboditi memoriju kao i prije, iako Trebao bih se vratiti i dodavati neki provjerava null. I to je to. fopen, fprintf, fclose mi daje Sposobnost za stvaranje tekstualne datoteke. Sada, što ćete vidjeti u pet set problema, koja uključuje slike, koristit ćete binarne datoteke umjesto. No, iz temelja, ideja je ista, iako funkcije ćete vidim su malo drugačiji. Dakle vihor turneje, ali će doći sve previše upoznat s datoteku I/O-- ulaz i izlaz - s pset pet. A bilo kakva pitanja o početne osnove ovdje? Da? Što ako pokušate osloboditi null vrijednosti? Ja vjerujem, ako je stečen besplatno Malo više user-friendly, možete potencijalno segfault. Prolazeći to anulirati je loše, jer ja ne Vjerujem besplatno smeta to ček za vas, jer bi potencijalno biti otpad vremena za to učiniti za sebe svatko u svijetu. Dobro pitanje, ipak. U redu, tako da je ova vrsta dobiva nas zanimljiva tema. Tema skupa problema pet je forenzika. Barem to je dio od problema setu. Forenzike općenito se odnosi na Oporavak podataka koji mogu ili Ne može se izbrisati namjerno. I tako sam mislio bih vam dati brzi okus onoga što se stvarno događa svima ovaj put ispod napa vašeg računala. Na primjer, ako imate unutar vašeg prijenosno računalo ili vaše stolno računalo hard disk, to je bilo mehaničkih uređaj koji zapravo vrti - postoji kružni stvari nazivaju plate da je sasvim izgledaju što sam Samo je gore na zaslonu ovdje, iako to je sve stara škola. To je tri i pol inča hard disk. A tri i pol inča odnosi se na s mjesta na stvar kada ga instalirati u računalu. Mnogi od vas dečki u svojim prijenosnim računalima sada imaju SSD diskove ili SSD-ovi, koji nema pokretnih dijelova. Oni su više kao RAM-a, a manje kao ovi mehanički uređaji. Ali ideje su još uvijek isti, svakako su vezane Problem bi postavili pet. A ako mislite o tome sada tvrdi disk predstavlja kao krug, koji Ja ću privući ovako ovdje. Kada stvorite datoteku na vašem računalu, bilo da je SSD, ili u ovaj slučaj, stariji škola tvrdi disk, da je datoteka se sastoji od više bitova. Recimo da je to 0 i 1, cijela hrpa 0s i 1s. Dakle, ovo je moj cijeli hard disk. To je očito prilično velika datoteka. I ona se koristi do 1s i 0s u to dio fizičkog pladnju. Pa, što je to fizički dio? Pa, ispada da na tvrdom disku, barem ove vrste, postoji ta malena magnetske čestice. I oni u suštini imaju sjever i Južni pol do njih, tako da ako ste uključite jedan od tih magnetskih čestica Na taj način, moglo bi se reći da je predstavlja jedan. A ako je to naopako jug sjever, moglo bi se reći da je što predstavlja 0. Dakle, u stvarnom fizičkom svijetu, to je kako bi moglo predstavljati nešto u binarno stanje 0 i 1. Dakle, to je sve što je datoteka. Postoji cijela hrpa magnetska čestice koje su im na ovaj način ili Na taj način, stvarajući uzorke od 1s i 0s. No, ispostavilo se kada spremite datoteku, neki podaci se spremaju zasebno. Dakle, ovo je mali stol, katalog, da se tako izrazim. I zvat ću ovaj naziv stupca, a Nazvat ću ovo mjesto stupca. A ja ću reći, pretpostavimo ovo je moj životopis. Moj resume.doc je pohranjena na Mjesto, recimo 123. Ja uvijek ići za tim brojem. No, dovoljno je reći da je baš kao u RAM-u, možete uzeti hard disk to je gigabajt ili 200 gigabajta ili terabajta, a možete broj svih bajtova. Možete prebrojiti sve komade 8 bitova. Dakle, mi ćemo reći da je to Mjesto je 123. Dakle, ovaj katalog unutar mog poslovanja Sustav se sjeća da je moja ponovo je na mjestu 123. Ali to biti interesantno kad izbrišete datoteku. Tako, primjerice - i hvala bogu, većina svijeta ima uhvaćen na to - što se događa kada povlačite datoteku na svoj Mac OS smeće ili vaš Windows koš za smeće? Koja je svrha da radiš? Očito je da biste dobili osloboditi od datoteka, ali što to čin povučete i padaju u vaš smeće ili vaš Koš za smeće učiniti na računalu? Apsolutno ništa, stvarno. To je baš kao i mape. To je posebna mapu, kako bi bili sigurni. No, to zapravo izbrisati datoteku? Pa, ne, jer su neki od vas vjerojatno su bili kao, oh damn, nisi znači za to. Dakle, dva puta kliknuti Trash ili koš za smeće. Vi ste poked oko i što ste oporavio file jednostavno povlačenjem od tamo. Dakle, jasno, to nije nužno brisanja. OK, ti si pametniji od toga. Vi znate da je samo ga povučete u Trash ili koš za smeće ne znači god pražnjenja otpada. Tako da se popne na izborniku, a ti kažeš Isprazni smeće ili Empty Recycle Bin. Zatim što se događa? Da, tako da se briše više. No, sve što se događa je to. Računalo zaboravio gdje je resume.doc je. No, ono što se nije promijenilo očito na slici? U bita, 1s i 0s da Tvrdim su na mjestu nekog fizičkog aspekta hardvera. Oni su još uvijek tamo. To je samo računalo ima zaboravili što su oni. Dakle, to je u biti oslobođen file-a dijelove, tako da se mogu ponovno koristiti. Ali ne dok ste stvoriti više datoteka, i više datoteka, i više datoteka će probabilistically, one 1s i 0s, one magnetske čestice, se ponovno koristiti, upside ili desnoj strani gore, za druga slika, 1s i 0s. Tako ste ovaj prozor vremena. I to ne od predvidljiva Duljina, stvarno. To ovisi o veličini tvrdog pogon i koliko slika imate i kako brzo možete napraviti nove. No, tu je ovaj prozor tijekom vremena koja datoteka je još uvijek savršeno nadoknadiva. Dakle, ako ste ikada koristiti programe kao što su McAfee ili Norton pokušati oporaviti Podaci, sve što radite je pokušava oporaviti ovu tzv telefonski imenik shvatiti gdje vam je turpija. A ponekad i Norton će reći, datoteka je 93% povrat. Pa, što to znači? To samo znači da su neki drugi file slučajno završio pomoću, recimo, one bitova iz izvorne datoteke. Dakle, što zapravo uključeni u oporavlja podatke? Pa, ako nemate nešto poput Norton pre-instaliran na vašem računalu, Najbolje što možete učiniti je ponekad izgleda na cijeli hard disk u potrazi za obrasci bitova. A jedna od tema skupa problema pet je da će tražiti protuvrijednosti od tvrdog diska, forenzičke slika Compact Flash karticu od digitalni fotoaparat, tražeći 0s i 1s koji obično, s visokim Vjerojatnost, predstavljaju početak JPEG slike. I vi možete oporaviti one slike koje pretpostavku, ako vidim ovaj uzorak bita na forenzičkoj slike, s velika vjerojatnost, koji obilježava početak JPEG. A ako vidim isti uzorak opet, koja vjerojatno označava početak još jedna JPEG, a drugi JPEG, JPEG i drugi. A to je obično kako data recovery će raditi. Što je lijepo o JPEG je, iako format sama je nešto kompleksu, početak svaki takav Datoteka je zapravo prilično identificirati i jednostavno, kao što ćete vidjeti, ako ste već nije. Tako ćemo se bliži pogled ispod napa kao da točno ono što je bio događa, i što je to 1s i 0s su, da vam malo više Kontekst za ovaj izazov. [Video reprodukciju] -Gdje je vaše računalo pohranjuje najčešće njegovih stalnih podataka. Da biste to postigli, podaci putuje iz RAM-a zajedno sa softverskim signale koji govore Kako tvrdi disk za pohranu tih podataka. Tvrde krugova vožnje prevođenje ti signali u naponu kolebanja. To je, pak, kontroliraju tvrdi disk-a pokretni dijelovi, neke od rijetkih pokretni dijelovi ostali u moderne računalo. Neki od signala kontrolirati motor koji se vrti metal-obložene plate. Vaši podaci zapravo je pohranjena na tim plate. Ostali signali presele čitanja / pisanja glava za čitanje ili pisati podatke na plate. Ovo strojevima toliko precizna da je ljudski kosa nije ni mogao proći između glave i predenje plate. Ipak, sve to djeluje na nevjerojatan brzinama. [END video reprodukciju] DAVID Malan: Zumiraj malo dublje sada na ono što je zapravo na tim plate. [Video reprodukciju] -Pogledajmo što smo upravo Vidio usporeno. Kad kratki impuls struje je poslan na čitanje / pisanje glavu, ako se okreće na maleni elektromagnetski za djelić sekunde. Magnet stvara njivi mijenja polaritet maleni, maleni Dio metalnih čestica koje dlaka svaki plitica površine. Uzorak niz tih sićušnih, naplaćuje-up područja na disku predstavlja jedan malo podatke u binarnom broju Sustav se koristi od strane računala. Sada, ako je trenutni je poslan jedan način kroz čitanje / pisanje glavu, područje je polarizirano u jednom smjeru. Ako struja se šalje suprotnom smjeru, polarizacija i obrnuto. Kako ste dobili podatke s tvrdog diska? Samo obrnuti proces. Dakle, to su čestice na disku da se struja u čitanje / pisanje glavu kreće. Stavite zajedno milijune njih magnetizirana segmentima, i imaš datoteku. Sada, komada jednu datoteku može se raspršili diljem disk-a pladnjevi, vrsta kao što je nered radova na vašem stolu. Dakle, posebna extra file prati mjesta gdje se sve nalazi. Ne želite li imali tako nešto? [END video reprodukciju] DAVID Malan: OK, vjerojatno ne. Pa kako mnogi od vas dečki Odrastao je s tim? U redu, tako da je sve manje i manje Ruke svake godine. Ali drago mi je da si barem upoznati s njima, jer je to i naš vlastiti Knjiga demo, nažalost, umiru vrlo polagano odumiranje ovdje poznatosti. Ali to je ono što sam, barem, još u srednju školu, koriste se koristiti za backup. I to je nevjerojatno, jer može pohraniti 1,4 megabajta na ovaj disk. A to je velika gustoća verziju, kako je naznačeno u HD, koji je što znači prije današnje HD videa. Standardna gustoća je 800 kilobajta. I prije toga, bilo 400-kilobajta diskova. I prije toga, bilo je 5 i 1/4 inčne diskove, koji su doista floppy, i malo širi i viši od ovih stvari ovdje. No, što zapravo može vidjeti takozvani floppy aspekt ovih diskova. I funkcionalno, oni su zapravo prilično sličan tvrdih diskova na Barem ovaj tip. Opet, SSD-ovi u novijim računalima rade malo drugačije. Ali, ako se preselite tu malu metalnu karticu, zapravo možete vidjeti malo kolačić, ili pladanj. To nije metal poput ove. Ovaj je zapravo neka jeftinija plastični materijal. A možete ga vrsta mrdati. I uistinu sam samo obrisao neke broj bitova ili magnetskim česticama iz ovog diska. Dakle, srećom, nema ništa na njemu. Ako ta stvar je na putu - i pokriti oči i one svoje susjede - možete samo vrsta povući ovu Cijeli plašt off kao što je to. No, tu je malo proljeće, tako da se svjestan da je svojim očima. Tako sada imate uistinu disketu. A što je izvanredan o tome je da u koliko je to mali zastupljenost veća tvrdi disk, ove stvari su super, super jednostavna. Ako ste stiskati dno tome, sad da da je metal što je off, i oguliti ih otvoriti, sve su samo dva komada osjećao i tzv diskete s komadom metala iznutra. I tu ide polovica mojim diskom sadržaja. Ode još jedna polovica od njih. No, to je sve što mi se vrtjelo u vašeg računala u prošlost. I opet, staviti to u perspektivu, koliko je velik većinu svog Teško vozi ovih dana? 500 gigabajta, terabajta, možda u Stolno računalo, 2 terabajta, 3 terabajta, 4 terabajta, zar ne? Ovo je jedan megabajt, dati ili uzeti, koje se ne mogu ni stati tipičan MP3 više ovih dana, ili neki Sličan glazbene datoteke. Dakle, malo suvenir za vas danas, a Također će vam pomoći kontekstualizirati što ćemo biti uzimanje zdravo za gotovo Sada je u problemu postavili pet. Dakle, to su tvoje zadržati. Pa neka mi prijelaz na kojem će se trošenja sljedeći pset kao dobro. Dakle, sada smo postavili ovu stranicu za - Oh, Nekoliko najavama brzo. Ovaj petak, ako bih se pridružiti CS50 za ručak, otići na uobičajenom mjestu, cs50.net/rsvp. I zadnji projekt - pa po nastavnom planu, mi smo objavili konačni projekt specifikacije već. Shvatite da to ne znači to je zbog osobito brzo. To je odgovoreno, uistinu, samo da bi dobili vi mislili o tome. I doista, super značajne Postotak od vas će biti rješavanje Konačni projekti o materijalu koji smo nisu ni došli do u klasi, , ali će se već sljedeći tjedan. Obavijest, međutim, da je spec poziva na nekoliko različitih komponenti Konačni projekt. Prvi, u nekoliko tjedana, je pre-prijedlog, prilično ležerna e-mail Vaš TF mu reći ili što ste razmišljam o tome za svoj projekt, s bez obveze. Prijedlog će biti vaš Konkretno predanost, govoreći, ovdje, to je ono što Ja bih to učiniti za moj projekt. Što mislite? Prevelika? Premala? Je li upravljati? A vidite spec. za više detalja. Nekoliko tjedana nakon toga je status Izvješće, što je na sličan način povremeni e-mail na svoj TF reći koliko daleko iza ste u svoj konačni provedbe projekta, nakon čega slijedi CS50 Hackathon u kojoj su svi je pozvao, koji će se događaj iz 20:00 Na jednoj večeri do 07:00 AM sljedećeg jutra. Pizza, kao što sam spomenuo možda u tjedan dana nuli, wil biti posluženi u 21:00, Kineske hrane na 01:00. A ako ste još uvijek budni, na 05:00, mi ćemo vas odvesti na IHOP za doručak. Dakle Hackathon je jedan od više nezaboravnih iskustava u razredu. Tada je zbog implementacije i onda vrhunac CS50 sajam. Više detalja o svim tim u tjednima koji dolaze. No, vratimo se na nešto stara škola - opet, niz. Dakle, niz je lijepo, jer to rješava Problemi kao što smo vidjeli samo maloprije sa studentskim strukturama uzimajući malo izvan kontrole, ako smo Želite imati jednog studenta, student dva, Student tri, student dot dot dot, neka proizvoljna broj studenata. Dakle polja, prije nekoliko tjedana, obrušio se u i riješiti sve naše probleme od ne znajući unaprijed koliko stvari neke vrste možda bismo željeli. A vidjeli smo da je tvorevina, može nam pomoći dodatno organizirati naš kod i zadržati konceptualno slični varijable, kao što su Ime i kuća, zajedno, tako da mi može tretirati ih kao jednu cjelinu, unutar od kojih su manji komadi. Ali nizovi imaju neke nedostatke. Koji su neki od nedostataka smo naišli s polja do sada? Što je to? Fiksna veličina - pa čak možda moći alocirati memoriju za polje, jednom kada znate koliko je studenata imate, koliko znakova imate od korisnika, nakon što ste dodijeljeno polje, da ste vrsta naslikao se u kut. Budući da ne možete umetnuti nove elemente u sredini polja. Vi ne možete staviti više elemenata na kraju niza. Stvarno, morate posegnuti za kreiranje cijeli novi niz, kao što smo razgovarali, kopiranjem stare u novu. I opet, to je glavobolja koja GetString bavi za vas. Ali opet, ne mogu ni umetanje nešto u sredini polja ako je stopa nije u potpunosti ispunjena. Na primjer, ako se to polje ovdje na veličinu šest ima samo pet stvari u njoj, dobro, možete se i samo tack nešto na kraju. No, što ako nešto želite umetnuti u sredini polje, iako bi to moglo imati pet od šest stvari u njemu? Pa, što smo radili kad smo imali sve naših ljudskih volontera na pozornici u Posljednjih tjedana? Ako smo htjeli staviti nekoga ovdje, bilo ti ljudi kako bi ova način, ili ti ljudi kako bi ova način, te da je postao skuplji. Prebacivanja ljudi unutar Niz završio zbrajanjem i troškova Vrijeme nam je, dakle puno naša n na kvadrat prikazivati ​​puta kao umetanja vrste, za Primjerice, u najgorem slučaju. Dakle polja su veliki, ali morate unaprijed znati koliko je velika ste ih žele. Pa OK, ovdje je rješenje. Ako ne znam unaprijed koliko je Ja studenti mogli imati, a znam kada Odlučio sam, ipak, ja sam zapeo s tim mnoge studente, zašto ne sam uvijek izdvojiti dvostruko više prostora kao što sam mogao da mi treba? Nije li to razumno rješenje? Realno, ja ne mislim da smo mi Trebat će više od 50 mjesta u niz za srednje velike klase, pa neka je samo zaokružiti. Ja ću napraviti 100 mjesta u mom polju, jednostavno tako da smo definitivno mogu dobiti broj studenata očekujem da ću biti u nekom srednje veličine klase. Pa zašto ne samo zaokružiti i dodijeliti više memorije, obično, za niz nego što mislite da bi čak moglo trebati? Što je ovaj jednostavan pushback na tu ideju? Ti si gubit pamćenje. Doslovno svaki program pišeš onda je možda pomoću dvostruko više memorije što je zapravo potrebno. A to jednostavno ne osjeća kao Posebno elegantno rješenje. Štoviše, to samo smanjuje vjerojatnost problema. Ako vam se dogoditi da imaju popularne tečaj jedan semestar, a imate 101 učenika, vaš program je još uvijek temeljno okrenut isti problem. Dakle, srećom, postoji rješenje za ovaj oglas svi naši problemi u obliku od strukture podataka koje su složeniji od onih smo vidjeli do sada. Ovaj, ja tvrdim, je linked list. Ovo je popis brojeva - 9, 17, 22, 26, i 34 - koje su međusobno povezane putem od onoga što sam nacrtana kao strijela. Drugim riječima, ako sam htjela da predstavljaju polje, što sam mogao učiniti nešto poput ovoga. I ja ću staviti ovo na pretek u samo trenutak. Ja mogao učiniti - Pozdrav, u redu. Stand by. Novi računalni ovdje, jasna - U redu. Dakle, ako sam te brojeve u nizu - 9, 17, 22, 26, 24 - ne nužno na ljestvici. U redu, ovdje je moj polje - O, moj Bože. U redu, ovdje je moja polja. O, moj Bože. [Smijeh] DAVID Malan: pretvarati. To je previše truda da se vrati i popraviti, tako da - 26. Dakle, imamo niz 9, 17, 22, 26, i 34 godine. Za one od vas može vidjeti neugodno pogreška Upravo sam napravio, to je to. Dakle, ja tvrdim da je to vrlo učinkovito rješenje. Ja sam dodijeljeno onoliko Ints što Moram - jedan, dva, tri, četiri, pet ili šest - a ja sam tada pohranjuju brojevi unutar tog polja. No, pretpostavimo, onda, želim umetnuti vrijednost kao broj 8? Pa, gdje to ide? Pretpostavimo da želite umetnuti broj kao što je 20. Pa, gdje to ide? Negdje u sredini, ili broj 35 mora otići negdje na kraju. Ali ja sam sve više mjesta. I tako to je temeljni izazov matrica koja se nalaze rješenje. Ja tvrdio maloprije, GetString rješava taj problem. Ako želite umetnuti i šesti broj u ovom polju, što je barem jedan Rješenje možete se vratiti na sigurno, baš kao što radimo s GetString? Što je to? Pa, to bi se veća lakše reći nego učiniti. Mi ne nužno može napraviti niz veća, ali ono što možemo učiniti? Napravite novi niz koji je veći od veličine, 6, ili možda veličine 10, ako želimo da se ispred stvari, a zatim kopirati stara polja u novi, a zatim osloboditi starog niz. No, ono što je trajanje Sada tog procesa? To je velika O n, jer kopiranje će vas koštati nekih jedinica vrijeme, tako da nije tako idealno ako moramo izdvojiti novi niz, što se događa konzumirati dvostruko više memorije privremeno. Kopirajte stare u novu - Mislim, to je samo glavobolja, koje je, opet, zašto smo pisali GetString za vas. Pa što bismo mogli učiniti umjesto toga? Pa, što ako naša struktura podataka zapravo ima rupe u njoj? Pretpostavimo da sam se opustiti moj cilj ima susjedni blokovi memorije, gdje 9 je tik do 17, što je tik do 22., i tako dalje. I pretpostavimo da je 9. može biti više ovdje u RAM-a, a 17 može biti ovdje u RAM, i 22 mogu biti ovdje u RAM. Drugim riječima, mi ih ne trebamo i natrag na leđa više. Upravo sam se nekako nit iglu kroz svaki od ovih brojeva, ili svaki od tih čvorova, kao što ćemo nazvati pravokutnika kao što sam ih izvučeni, na sjetite se kako doći do posljednja kao čvor od prvog. Dakle, ono što je programiranje izgradnju Vidjeli smo se nedavno s kojima sam mogu provesti taj konac, ili izvučeni ovdje, s kojima mogu primijeni te strelice? Dakle naputke, zar ne? Ako sam izdvojiti ne samo int, ali čvor - i čvora, ja samo znači kontejner. I vizualno, mislim pravokutnik. Dakle čvor očito treba da sadrži dvije vrijednosti - int sama, a onda, kao implicira donji dio pravokutnika, dovoljno mjesta za int. Dakle, samo naprijed razmišljanja ovdje, koliko je velik ovaj čvor, ova Spremnik je u pitanju? Koliko bajta za int? Vjerojatno 4, ako je to isto kao i obično. I onda koliko bajtova za pokazivač? 4. Dakle, ovaj kontejner ili ovaj čvor, je će biti 8-byte struktura. Oh, i da je sretna slučajnost da Upravo smo uveli taj pojam rekonstruirati ili C strukturu. Dakle, ja tvrdim da želim da se korak Prema ovom sofisticiraniji Provedba popisa brojeva, u povezani popis brojeva, što trebam učiniti malo više razmišljanja unaprijed i izjavljujem nije samo int, ali je rekonstruirati da ću nazvati, konvencionalno Ovdje, čvor. Mogli bismo ga nazvati što god želimo, ali čvora će biti tematska u puno od stvari koje smo započeli gledajući sada. Unutar tog čvora je int n. I onda to sintakse, malo čudno na prvi pogled - struct čvor * next. Pa slikovito, što je to? To je dno polovica pravokutnik koji smo vidjeli Samo trenutak prije. Ali zašto sam ja rekao struct čvor * za razliku od samo čvor *? Jer ako je to pointer pokazuje , na drugom čvoru, to je samo adresa čvor. To je u skladu s onim što imamo Raspravlja se o pokazivače do sada. Ali zašto, ako ja tvrdim ova struktura je čvora zove, moram reći struct čvora unutar ovog? Točno. To je neka vrsta glupog stvarnosti C. Typedef, da se tako izrazim, nije još dogodilo. C je super doslovna. Ona čita svoj kod na vrh dna, s lijeva na desno. I dok ne udari taj zarez na Dno crta, pogodite što ne postojati kao vrstu podataka? Čvora, citat završen citat čvor. No, zbog mnogo opširnije Izjava sam na prvoj liniji - typedef struct node - jer to je bilo prije, prije vitičastim zagradama, to je nešto kao pre-edukaciju Dong da, da Znaš što, daj mi struct zove struct čvor. Iskreno, ja ne bih zovete stvari struct čvor, struct čvor sve tijekom mog koda. Ali ja ću ga koristiti samo jednom, samo unutar, tako da mogu učinkovito stvoriti neku vrstu kružne reference, ne kazaljka na sebi i po sebi, ali pokazivača u drugu identična putovanja. Tako ispada da je na strukturu podataka ovako, postoji nekoliko Operacije koje bi mogle biti od interesa za nas. Mi možda želite umetnuti u popisu kao što je ovaj. Mi možda želite izbrisati s popisa kao što je ovaj. Mi možda želite pretraživati ​​popis za Vrijednost, ili općenitije, poprijeko. I poprijeko je samo fancy način govoreći početka na lijevo i premjestiti sve smjer u desno. I obavijest, čak i uz to nešto više sofisticiran struktura podataka, neka ja predlažem da možemo posuditi neke od ideje u protekla dva tjedna i implementirati funkciju pod nazivom Usporedite kao što je ovaj. To će vratiti true ili lažna, što ukazuje, da ili ne, n je na popisu. Njegov drugi argument je pokazivač na popis same, tako pokazivač na čvor. Sve ću onda učiniti je proglasiti privremena varijabla. Zvat ćemo je ptr po konvenciji, za pointer. I sam je odrediti jednaka početak popisa. A sada primijetiti petlju dok. Tako dugo dok kazaljka nije jednak na nulu, idem provjeriti. Je pokazivača strelica n jednaka n koji je donesen u? I čekati minutu - Novi komad sintakse. Što je strijela odjednom? Da? Točno. Dakle, dok je prije nekoliko minuta, koristili smo dot oznake za pristup nešto unutar A rekonstruirati ako je varijabla ste ne struct sama, ali pointer na struct, Srećom, dio sintakse koje konačno čini intuitivan osjećaj. Strelica znači slijediti pokazivač, kao i naši strelice obično znači slikovno, i ići na podatkovno polje unutra. Dakle strelica ista stvar kao točke, ali što ga koristiti kada imate pokazivač. Dakle, samo da ponovim onda, ako n Polje unutar struct zove pokazivač jednako jednako n, povratak istina. Inače, ova linija ovdje - pointer jednako pokazivač sljedećeg. Pa što se to radi, obavijest, ako je sam trenutno sam pokazujući na struct koji sadrži 9, i 9 nije broj Tražim - Pretpostavljam tražim za n jednak 50 - Ja ću ažurirati moj privremeni pokazivač ne ukazuju na ovom čvoru više, ali pokazivač strelicu pored, koji ide mi stavi ovdje. Sada sam shvatio je nevrijeme Uvođenje. U srijedu, mi zapravo ćete to učiniti s nekim ljudima i još Kod sporijim tempom. Ali shvatite, sada smo izradu naših podataka struktura složenija, tako da su naši algoritmi mogu dobiti učinkovitiji, koji će biti uvjet za pset šest, kad smo učitavanje u, opet, onima 150.000 riječi, ali je potrebno da to učinite učinkovito, i idealno, stvoriti Program koji traje naši korisnici ne linearno, ne n kvadrat, ali u stalno vrijeme, u idealnom. Vidimo se u srijedu. ZVUČNI: Na sljedećem CS50, David zaboravi svoj osnovni scenarij. DAVID Malan: I to je kako šaljete tekstualne poruke s C. Ono - [RAZNI tekstualnu poruku Zvukova obavijest]