>> 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]