DAVID Malan: V redu, dobrodošli nazaj. To je CS50. To je začetek sedem teden. Torej, to je bilo hkrati, tako da sem mislil, da bova se tornado turnejo, kjer smo končali in kje smo zdaj dogaja. Torej bi to stvar tukaj imajo povzročilo kar nekaj angst na prvi. Ampak upam, da ste se začeli aklimatizirati, kaj to pomeni tukaj - zvezda predstavlja kazalec, ki je samo tisto, kar je v pogojih, ki so navadnega je? Torej je naslov. Torej je naslov nekaj v spomin. In smo začeli Odlepite plasti Pred nekaj tedni, se take stvari GetString in druge takšne funkcije Ves ta čas so se vračajo Naslovi stvari v spominu, kot naslov prvega znaka v nekateri zaporedje. Tako smo uvedli tudi valgrind, ki boste začeli uporabljati za ta problem nastaviti, zlasti za naslednji Problem nastaviti tudi. In valgrind počne kaj za nas? Preveri za spomin razpoka, in preverja tudi zaradi zlorabe spomina. Prav tako lahko z določeno stopnjo verjetnosti, odkriti, če je kodo se bo dotaknil spomin da preprosto ne bi smeli. Torej ni nujno, da pušča, če pa vas presegajo meje nekaterih matrika, in jo dejansko vodijo valgrind in povzroči, da je vedenje, medtem ko valgrind teče v svojem programu, je teče notri, boste dobili sporočila, kot je ta - "neveljavna pisati o velikost 4 ", ki je spomniti nekaj tedni je pomenilo, da sem imel po nesreči rad na eni notr predaleč preko meja matrike. In tako velikost 4 tukaj pomeni velikost te posebne int. Torej bo zagotovilo v dejstvu, da izhodna valgrind je, oblika tega, je prav krute. To je res težko videti skozi nered Za zanimivih informacij. Torej, kaj smo storili tukaj je samo odlomek nekaj nekaj več atraktivne proge. Ampak zavedati, da 80% valgrind je Izhod se bo malo moteča. Samo iščejo vzorce, kot ti - neveljavna pravico, neveljavna brati, 40 zlogov in nekaj več blokov so definitivno izgubljen, ključne besede, kot to. In kaj boste videli, upajmo, nekaj vrsta sledu o tem, kaj deluje napaka je pravzaprav noter V tem primeru je tukaj, v kakšnem linija moja koda je bila napaka očitno? 26 v datoteki z imenom memory.c, ki je bil Primer smo se igrali z v času. Torej, to verjetno ni v funkcije malloc. Verjetno je bila v moji kodi namesto tega. Torej bomo to še enkrat videti in spet kmalu. Torej scanf, to je v Nekaj ​​oblik doslej. Videli smo sscanf kratko. Bilo je nekaj več boste vrgli v vašem Priprave na kviz. In scanf je pravzaprav tisto, kar CS50 Knjižnica je bila uporabo pod senčilo za kar nekaj časa, da bi da se vnos od uporabnika. Na primer, če sem preiti na CS50 Aparat sem, naj odprejo Primer je danes, da se imenuje scanf-0.c In to je zelo preprosta. To je le nekaj vrstic kode. Ampak to kaže, kako zelo getInt je bilo delo vseh tem trenutku. V tem programu tu, v liniji 16 , Obvestilo, da izjavljam int. Torej nobenih kazalcev, nič magičnega tam, samo int. Nato pa v skladu 17, sem hitro uporabnik za več, prosim. Potem je konec 18., uporabljam scanf tukaj. In jaz določeno, nekako kot printf, da sem pričakoval ponudbo konec citata i odstotka. Torej odstotkov i seveda označuje int. Opazil kaj drugega Trditev, da je scanf. Kako bi opisali drugi Argument za vejico? Kaj je to? To je naslov x. Torej je to koristno, ker z zagotavljanjem scanf z naslovom x, kaj , ki ga pooblasti to funkcijo, da naredim? Ne samo tja, ampak tudi kaj storil? Narediti spremembo do nje. Ker lahko greš tja, to je nekako kot zemljevid z lokacijo v pomnilniku. In tako dolgo, kot vam zagotavljajo scanf, ali vsaka funkcija s tako zemljevidu, da Funkcija lahko tja, in ne le pogled na vrednosti, lahko pa se tudi spremenite to vrednost, kar je uporabno, če namen v življenju scanf je skeniranje vnosa od uporabnika, zlasti od tipkovnice. In f označuje oblikovano, tako kot printf, f označuje oblikovano niz, ki ga želite natisniti. Torej na kratko, ta vrstica 18 preprosto pravi, poskusite prebrati int od uporabnika Tipkovnica in ga shranite znotraj x, pri glede na naslov x zgodi, da živijo na. In potem končno, vrstica 19 samo pravi, hvala za notr, v tem primeru. Naj gredo naprej in to. Zato poskrbite, scanf 0. Dovolite mi, da gredo naprej in povečate palca Jaz bom šel in zaženete ta z pike poševnica scanf 0. Številko, prosim? 50. Hvala za 50 let. Tako da je čisto preprosta. Zdaj, kaj se ne dela? To se ne počne cel kup za preverjanje napak. Na primer, če ne bom sodeloval, in jaz ne tip v številu, ampak namesto tega sem nekaj podobnega "zdravo," pišejo to je nekako čudno. In tako je ena od stvari CS50 Knjižnica je delal za nas, za nekatere Čas je, da reprompting in reprompting. Ponovno stavek odpoklic je bil v cs50.c, in to je razlog, da getInt v Knjižnica CS50 je pravzaprav celotna kup dolgih progah, ker smo preverjanje za neumne stvari, kot je ta. Ali si ne bi nas, v resnici, int? Ali on ali ona nam kaj kot črka? Če je tako, smo želeli odkriti da in kričati na njih. Vendar se stvari bolj zanimivo V naslednjem primeru. Če grem na scanf-1.c, kar je ena stvar, ki je bistveno spremenila to naslednji primer? Jaz sem z uporabo char *, seveda, namesto int. Torej, to je zanimivo, ker char * spomnim, je res samo ista stvar kot niz. Tako se zdi, kot morda je to super enostavno izvajanje GetString. Ampak sem odlušči plast v knjižnici CS50, zato sem kliče ta char * zdaj. Torej, da vidimo, če se uporablja povsod, gremo narobe. Line 17 - Ponavljam, prosim dajte mi nekaj, v tem primeru niz. In nato v naslednji vrstici, kličem scanf, še enkrat, kar daje kodo format, Tokrat odstotkov s. In potem je to čas, sem ji daje rezerve. Zdaj opazil, da sem ne uporabljate Znak za. Toda zakaj je to verjetno v redu tukaj? Ker kaj je buffer že? To je že kazalec. To je že naslov. In da je ta beseda "zmesti," naj me Samo to je klic, na primer, za preprostost. Ampak sem pozval, da omili, saj v splošno, načrtovanja, če imate kos pomnilnika, ki je niz res samo se, morda si to buffer klic. To je mesto za shranjevanje podatkov. Podobne stvari, kot so YouTube, ko oni buffering, tako rekoč, da samo pomeni, da je prenos bitov od interneta in jih shranite v lokalni matrika, lokalna kos pomnilnika, tako da si lahko ogledate pozneje brez ga preskoči ali visi na ste med predvajanjem. Torej je tukaj problem, čeprav, ker sem povedal scanf, pričakujejo Niz od uporabnika. Tukaj je naslov kos pomnilnika. Dal tam, da niz. Zakaj je to vezano dati nas težave, čeprav? Kaj je to? Smem dostop tisti del spomina? Veš, ne vem. Ker je pufer inicializiran na kaj? Ni res. In tako da je tisto, kar smo se kliče smeti vrednost, ki ni uradna beseda. To samo pomeni, da nimamo pojma, kaj bitov so znotraj štirih bajtov, ki Imam dodeljena kot buffer. Nisem se imenuje malloc. Sem definitivno ni poklical GetString. Torej, kdo ve, kaj je dejansko znotraj pufra? In še povedal scanf slepo, tja in dal vse, kar uporabnik natipkan. Torej, kaj bi lahko povzročilo v našem kodo, če jo vodijo? Verjetno segfault. Morda ne, ampak verjetno segfault. In rečem morda ne zato, ker včasih ti, včasih ne boste dobili segfault. Včasih si imel srečo, ampak pa je kljub temu bo bug v našem programu. Naj gredo naprej in sestavi to. Jaz bom pa stara šola način narediti. Torej Jek dash 0, scanf-1, scanf-1.c, Enter. Ups, tudi stara šola. Poglejmo. Kaj sem naredil? Oh, char * buffer. Oh, hvala - Shrani, OK - Zelo stara šola. V redu, to je bilo hkrati. Tako sem pravkar shranili datoteko po tako, da začasno spremeniti trenutek nazaj. In zdaj sem ga pripravljeni ročno z Jek. In zdaj bom šel naprej in vodijo scanf-1, Enter. Niz prosim. Bom tip v "zdravo". In zdaj, tukaj, kjer odkrito, printf Lahko je malo nadležno. To je dejansko ne bo segfault v tem primeru. Printf je malo poseben, ker to je tako zelo pogosto uporablja, da v bistvu printf počne nam uslugo in realizacije, To ni veljaven kazalec. Dovolite mi, da se ob sebi, da samo tiskanje v oklepaju nična, čeprav čeprav to ni nujno tisto, kar smo sami pričakovali. Torej, ne moremo zares preprosto izzvati segfault s tem, vendar je jasno to ni vedenje sem želel. Torej, kaj je preprosta rešitev? No, v scanf-2, naj predlaga namesto da bi dejansko le dodeljevanja char * Naj se malo pametnejši o to, in mi dodeliti pomnilnika kot zaporedje 16 znakov. Tako da sem lahko to storite v nekaj načinov. Jaz bi absolutno uporabljati malloc. Ampak jaz lahko vrnete na dva tedna, ko je Potreboval sem cel kup znakov. To je samo polje. Naj namesto ponovno buffer da je niz 16 znakov. In zdaj, ko grem mimo buffer v - in to je nekaj, kar ni govoriti v dveh tednu - vendar pa lahko zdravljenje matriko kot čeprav je naslov. Tehnično, kot smo videli, oni malo drugačen. Vendar scanf ne bo motilo, če ga prenese ime array, ker tisto, kar Jek bo naredil za nas v bistvu zdravljenje ime te matrike kot naslov kos 16 bajtov. Torej, to je bolje. To pomeni, da zdaj ne morem upajmo naredite naslednje. Naj se pomanjšati za trenutek in storiti, da scanf-2, ki se zbirajo v redu. Zdaj mi pa dobil poševnica scanf-2. Niz prosim. "Zdravo." In zdelo, da dela ta čas. Vendar pa lahko nekdo predlaga scenarij , v katerem se ne bi še vedno deluje? Ja? Nekaj ​​več kot 16 znakov. In dejansko, smo lahko malo bolj natančno. Nekaj ​​več časa kot 15 znakov, saj res moramo imeti v mislih da moramo to backslash nič implicitno na koncu niza, , ki je poleg scanf bo praviloma skrbijo za nas. Torej, kaj mi kaj takega - Včasih smo lahko samo pustite tako. OK, tako da smo sedaj povzročil naša segmentacije krivda. Zakaj? Ker sem tipkal na več kot 15. znakov, zato smo jih dejansko dotaknil spomin, da sem dejansko ne bi smeli imeti. Torej, kaj je res rešitev tukaj? No, kaj pa če smo morali daljši niz? No, morda bi bilo 32 bajtov. No, kaj pa če to ni dovolj dolgo? Kako približno 64 bitov? Kaj pa, če to ni dovolj dolgo? Kako približno 128 ali 200 bajtov? Kaj je res rešitev tukaj v splošno velja, če ne vemo, v vnaprej, kaj si bo tip? To je nekako velik trn v peti, če sem iskren, zaradi česar CS50 knjižnica ima nekaj deset vrstic Koda, ki skupaj izvajajo GetString niz, na način, da ne bomo vedeti vnaprej, kaj Uporabnik se dogaja na vrsto. Še posebej, če se ozremo na cs50.c pred dvema tednoma, boste videli da GetString resnici počne Ne uporabljajte scanf na ta način. Namesto, prebere en znak naenkrat. Ker je ena lepa stvar branje en znak je, da smo lahko zagotoviti, da bomo vedno vsaj en sloj. Jaz lahko samo ugotovi, char, in nato vzemite ti resnično otroške korake, da samo prebral en znak ob Čas od tipkovnice. In potem, kaj boste videli GetString pa je vsakič, ko zmanjka, recimo, 16 bitov pomnilnika, ki jih uporablja malloc ali njegov bratranec, da dodeliti več pomnilnika, kopiranje stara spomin na novo, nato pa plazenje skupaj, dobili en znak naenkrat, in ko zmanjka da kos pomnilnika, ga vrže proč, grabeži večji kos pomnilnika, kopira stare v nove in ponovitev. In to je resnično bolečino, da dejansko izvajati nekaj tako preprostega, kot pridobivanje vnosa od uporabnika. Tako da lahko uporabite scanf. Lahko uporabite druge podobne funkcije. In veliko učbenikov in na spletu primerov res, ampak oni so vse dovzetni za probleme, kot je ta. In na koncu, pridobivanje segfault je nekako nadležno. To ni dobro za uporabnika. Ampak v najslabšem primeru, kaj je bistveno Put Your koda grozi? Nekakšen napad, potencialno. Pogovarjali smo se o enem takem napadu - zvrhano kup. Ampak na splošno, če ste dovoljeno overflow buffer, kot smo Pred nekaj tedni, s samo pisno več kot "zdravo" na kupu, si lahko dejansko prevzel, potencialno računalnik, ali vsaj dobili na podatke, ki ne pripada tebi. Torej na kratko, to je, zakaj imamo ta kolesa usposabljanja. Ampak zdaj smo začeli, da jih vzlet, kot naši programi ne potrebujejo več, nujno, vhod od uporabnika. Vendar pa v primeru težav iz šest, vaš prispevek bo prišel iz velike slovar datoteka z 150 nekaterimi ak tisoč besed. Tako vam ne bo treba skrbeti za uporabnikov samovoljno vhod. Mi vam bo dala nekaj predpostavk O tej datoteki. Vsa vprašanja glede nasvetov ali scanf ali uporabnik vložek na splošno? Vse je v redu, tako da hiter pogled, potem v enem zamujala temo iz pred dvema tednoma. In da je bil ta pojem struct. Ali ni to - to pojem struct, ki je bil kaj? Kaj struct naredil za nas? Določite - žal? Določite vrsto spremenljivke. Tako nekako. Mi smo dejansko združuje dve temi. Torej s typedef, opozarjajo, da smo lahko razglasi vrsto naših, kot sinonim, kot niz za char *. Vendar z uporabo typedef in struct, smo lahko ustvariti resnično lastne podatkovne strukture. Na primer, če grem nazaj v gedit tu le za trenutek, in sem šel naprej in narediti nekaj takega, mi prihranili To so, recimo, structs.c začasno, grem da gredo naprej in vključi standardio.h, int main neveljavne. In potem je tukaj, domnevam, da želim napisati program, ki shranjuje več študentov iz več hiše, npr. Tako da je kot registrarial baza neke vrste. Torej, če rabim ime enega študenta, sem lahko naredite nekaj takega char * ime, in bom naredil nekaj podobnega - pravzaprav, kaj je uporabo knjižnice CS50 le za trenutek, da bi to malo lažje, tako da bomo lahko sposodim tiste ducate vrstic kode. In kaj je samo keep it simple. Mi bomo še naprej, da niz in zdaj GetString. Tako da sem zdaj trdijo, da sem shranili ime nekega študenta, in hišo nekateri študent, preprosto uporabo spremenljivk kot smo v enem tednu. Recimo jaz zdaj želim podpirati več študentov. V redu, torej moj instinkt, da naredimo Niz ime2, dobi GetString, niz house2 dobi GetString. In potem je naš tretji študent, Naredimo name3 GetString. Vse je v redu, tako da je to, upajmo presenetljiv ste kot vrste neumen, ker je ta postopek zelo nikoli bo konec, in to je šele tekoč da moja koda videti slabše in slabše in slabše. Vendar smo to rešili tudi v dva tedna. Kakšna je bila naša relativno čista rešitev ko smo imeli več spremenljivk isto vrsto podatkov, ki so med seboj povezani, vendar nismo želeli te krute nered za podobno poimenovanih spremenljivk? Kaj smo storili namesto tega? Zato mislim, da sem slišal nekaj mest. Imeli smo niz. Če želite več primerkov kaj, zakaj ne bi čisto vse to gor in samo reči, da me je matrika se imenuje imena? In za zdaj, kaj je trdo kodo 3. In mi je potem dal še en niz imenovano hiše, in naj mi za zdaj težko koda 3. In sem močno očistiti nered, ki sem ga pravkar ustvarili. Zdaj pa sem še vedno težko kodirane 3, ampak tudi 3. lahko dinamično prihajajo iz uporabnika ali argv ali podobno. Torej, to je že čistejši. Ampak kaj je moteč pri tem je, da Zdaj, čeprav ime je nekako bistveno povezana z študentske hiša - je študent, da sem res želeli predstaviti - Sedaj imam dva polja, ki so vzporedne v smislu, da oni enake velikosti in imena konzola 0 predvidoma zemljevide hiše razred 0, in imena bracket 1 zemljevidov do hiš nosilec 1. Z drugimi besedami, da študent živi v da je hiša, in da drugi študent živi v tej drugi hiši. Ampak zagotovo bi to lahko bilo Še bolj pa čisto. No, lahko, v resnici. In mi gredo naprej in odprite up structs.h, in boste glej to idejo tukaj. Obvestilo, da Uporabil sem typedef, kot ti Omenil trenutek nazaj k izjavi naše lastni podatkovni tip. Ampak jaz sem tudi s tem drugo ključno besedo imenovano struct, ki mi daje novo struktura podatkov. In ta struktura podatki Trdim se dogaja da imajo dvoje znotraj je - niz se imenuje ime in Niz se imenuje hiša. In ime bom dal ta struktura podatkov se dogaja da se imenuje študent. Jaz bi ga poklical kar hočem, vendar pomensko da občutek, da me v mojih mislih. Torej, zdaj, če sem odprla boljšo različico programa sem začel pisati tam, naj se pomaknite na vrhu. In tu je še nekaj vrstic kode tukaj, ampak naj se osredotoči na Trenutek na ena. Sem prijavljeni konstantno imenovane študente in težko kodirane 3 za zdaj. Toda zdaj, opazili, kako čista moja koda se začne, da bi dobili. V vrstico 22, izjavljam, matrika študentov. In opazili, da je študent očitno Zdaj podatkovni tip. Ker je na vrhu te datoteke, opazili Sem vključen da glavo datoteke da sem potegnil ravno pred nekaj trenutki. In da je glava datoteke preprosto je Ta definicija študenta. Torej, zdaj, ki sem jih ustvaril svoje lastne podatke po meri Tip, da so avtorji C letih Pred ni misliti vnaprej. Ampak ni problema. Lahko naredim sam. Torej, to je niz imenujemo študentov, vsaka od katerega člani je študent struktura. In hočem tri tistih v matriki. In zdaj, kaj pa ostalo tega programa narediti? Potreboval sem nekaj malo samovoljno. Torej iz spletnega 24 dalje, Ponovil bom od 0 do 3. Nato sem vprašal uporabnika za študenta ime. In potem sem uporabo GetString kot prej. Potem sem prosil za študenta hiši, in jaz raba GetString kot prej. Ampak obvestilo - malo novo kos sintakse - Ne morem še indeks i-tega študenta, ampak kako pridem na specifičnih podatkov polje znotraj struct? No, kaj je očitno nov del sintakse? To je samo izvajalec pika. Mi smo v resnici ne videl pred tem. Videl si jo v pset petih če ste končal v že s bitnih datotek. Toda pika pomeni samo znotraj tega struct ali več polj, daje piko ime, ali pa me pika hišo. To pomeni, da gre v notranjosti struct in dobili tiste posamezna področja. Kaj pa preostali del tega programa narediti? To pa še ni vse, da je seksi. Obvestilo, da sem spet ponoviti od 0 do 3, in sem preprosto ustvarite Angleški Stavek kot tako in tako v kot in taka hiša, ki poteka v dot imena iz i-študent in njihovi Hiša, kot dobro. In potem končno, zdaj bomo začeli, da bi dobili analni o tem, zdaj, ko smo seznanjeni s tem, kaj malloc in druge funkcije so bile delal ves ta čas. Zakaj moram sprostiti tako ime in hiša, čeprav sem ni poklical malloc? GetString storil. In to je bilo umazano malo skrivnost nekaj tednov, vendar pa ima GetString bili pušča spomin vsem dajo vse semester doslej. In valgrand bo končno razkrivajo to, da nas. Ampak to ni nič takega, ker vem, da sem lahko preprosto osvoboditi ime in hiša, čeprav tehnično, da je super, super varno, bi moral biti delaš nekaj preverjanje napak tukaj. Kaj so vaše instinkt vam pove? Kaj bi moral biti preverjanje za preden sem se sprostila, kar je Niz, ki alias char *? Jaz bi res preverjanje, če študente Nosilec i pika ime ne enaka null. Potem bo vse v redu, da gredo naprej in brez da kazalec in isti ali drugi kot eno dobro. Če študent nosilec i pika hiša ni enak null, bo to zdaj zaščitili proti primeru kota, v katerem GetString vrne nekaj podobnega nična. In smo videli pred nekaj trenutki, printf bo nas ščitijo tu gor ga samo pravim null, ki bo videti čudno. Ampak vsaj ne bo segfault, kot smo videli. No, naj stori eno stvar tukaj. konstrukti-0 je nekako neumno programa ker sem vnesete vse te podatke, nato pa to je izgubljen, ko se program konča. Ampak naj gredo naprej in to. Naj terminal Okno malo večji. Naj konstrukti-1, ki je nova različica tega. Bom povečate malo. In zdaj mi teče piko poševnica konstrukti-1. Ime študenta - David Mather, kaj je naredil Rob Kirkland, Naredimo Lauren Leverett. Zanimivo je zdaj Obvestilo - in vem samo to, ker Napisal sem program - tam je slika zdaj na moj trenutni Imenik imenuje students.csv. Nekateri ste morda videli ti v resničnem svetu. Kaj je datoteka CSV? Ločene z vejico vrednosti. To je nekako tako kot revež je različica Excelove datoteke. To je tabela vrstic in stolpcev, ki lahko odprete v programu, kot je Excel, ali številke na Macu. In če to datoteko odprem tukaj na gedit, Obvestilo - in številke niso tam. To je samo Gedit povedal mi številke vrstic. Obvestilo o prvi vrsti je to Datoteka je David in Mather. Naslednja vrstica je Rob vejica Kirkland. In tretji vrstici je Lauren vejica Leverett. Torej, kaj sem ustvaril? Jaz sem zdaj napisal program C, ki dejansko lahko ustvari preglednic da je mogoče odpreti v program, kot so Excel. Ni vse tako prepričljiv niz podatkov, vendar Če imate veliko večje kose Podatki, ki jih dejansko želijo manipulirati in da grafov in všeč, je to morda ena način za ustvarjanje teh podatkov. Poleg tega CSVs so dejansko zelo pogosti samo za shranjevanje podatkov, preprost - Yahoo Finance, na primer, če dobiš borzne tečaje preko njihove tako imenovane API, brezplačna storitev, ki vam omogoča trenutnega up-to-najnovejše parka kotacije za podjetja, ki jih dati podatke nazaj v super enostavna CSV formatu. Torej, kako bomo to naredili? No opazili, večina ta program je skoraj enaka. Opazil sem dol, namesto print študenti ven, on line 35 naprej, trdim, da hranim študenti na disku, tako varčevanje datoteko. Torej, opazil sem razglasitvi FILE * - Zdaj, to je neke vrste nepravilnost v C. Za katerega koli razloga, FILE vsi pokrovčki, kar ni tako kot večina drugih podatkovnih tipov v C. To pa je vgrajen vrsta podatkov, FILE *. In jaz razglasitvi kazalec na datoteko, je, kako si lahko zamislite, da. fopen pomeni odprto datoteko. Kaj datoteka ne želite odpreti? Želim odpreti datoteko, da bom samovoljno pokličite students.csv. Jaz bi lahko rekli, da karkoli želim. In potem ugibati. Kaj drugi argument za fopen verjetno pomenilo? Pravica, w za odpis, lahko je r za branje. Tam je za append če želite dodati vrstice in ne prepiše vso stvar. Ampak samo želim ustvariti to datoteko enkrat, tako da bom uporabiti quote citata w. In vem, da je le od tega, da se glasi dokumentacijo, ali stran človek. Če datoteka ni nič - z drugimi besedami, če nič šel tja narobe - Naj Ponovil preko študenti 0-3. In sedaj opazili, da je nekaj kdaj tako nekoliko drugačna O line 41 tukaj. To ni printf. To je ovrednotenj za datoteke printf. Tako se dogaja, da pisati v datoteko. Katere datoteke? Tisti, katerega kazalec podate kot prvi argument. Potem smo določite oblikovnega niza. Potem smo opredeliti, kaj niz želimo plug za prvo odstotkov sekund, in nato pa še spremenljiva ali Drugi odstotkov s. Nato zapremo datoteko z fclose. Kot sem osvobodil spomin kot prej, čeprav Moral bi iti nazaj in dodajte nekateri pregledi za nično. In to je to. fopen, ovrednotenj, fclose mi daje Sposobnost, da ustvarite besedilne datoteke. Zdaj boste videli na problem nizu petih, ki vključuje slike, boste uporabljali binarne datoteke namesto tega. Ampak bistveno pa je, ideja je ista, čeprav funkcije, ki jih boste videti je malo drugačen. Torej tornado turnejo, vendar boste dobili vse preveč seznanjeni z datoteko I/O-- vhod in izhod - s pset pet. In vsa vprašanja o začetne osnove tukaj? Ja? Kaj pa, če boste poskušali osvoboditi ničelno vrednost? Verjamem, razen če je prost gotten malo bolj prijazen, lahko potencialno segfault. Mimo je null je slabo, ker jaz ne Menim brezplačno moti, da preverite za vas, ker bi to lahko bilo odpadki časa za to, da se naredi za vsi na svetu. Dobro vprašanje, čeprav. Vse je v redu, tako da je ta vrsta dobi nam zanimivo temo. Tema problem niz pet je forenziki. Vsaj to, da je del na problem niza. Forenziki so na splošno nanaša na obnovitev podatkov, ki lahko ali ne smejo izbrisati namerno. In tako sem mislil, da sem vam hitro okus, kaj se v resnici dogaja vse tokrat pod Pokrov računalnika. Na primer, če imate znotraj vašega prenosni računalnik ali vaš namizni računalnik trdega diska, je bodisi mehansko Naprava, ki se dejansko vrti - tam je krožne stvari imenovane plošče , ki izgledajo precej všeč, kar sem ravnokar na zaslonu tukaj, čeprav To je vse bolj stara šola. To je tri in pol palčni trdi disk. In tri in pol cm nanaša na z dne stvar, ko jo namestite v računalniku. Mnogi od vas fantje v svojih prenosnih računalnikov zdaj imajo SSD diske ali SSD, ki nimajo gibljivih delov. Oni so bolj kot RAM in manj kot te mehanske naprave. Toda ideje so še vedno enaka, Vsekakor se nanašajo da problem nastaviti pet. In če pomislite zdaj trdi disk predstavlja čemer krog, ki Pritegnil bom takole tukaj. Ko ustvarite datoteko na vašem računalniku, ali je SSD, ali V tem primeru starejša šola trdega diska, da datoteka vsebuje več bitov. Recimo, da je to 0 in 1, cel kup 0s in 1s. Torej je to moja celotna trdi disk. To je očitno precej velika datoteka. In to je porabil 0s in 1s v tistem Del fizičnega krožnik. No, kaj je to fizično del? No, izkazalo se je, da je na trdem disku, vsaj te vrste, obstaja Ti mali magnetni delci. In v bistvu so imeli proti severu in južni pol do njih, tako da, če ste pa enega od teh magnetnih delcev Na ta način, bi lahko rekli, da je to predstavlja 1. In če je obrnjena proti jugu do severno, bi lahko rekli, da je to predstavlja 0. Torej, v realnem fizičnem svetu, to je kako si lahko predstavljajo nekaj v binarni stanje 0 in 1. Tako, da je vse datoteka. Obstaja cel kup magnetno Delci, ki so njihova ta način, ali Na ta način ustvarjajo vzorci v 0s in 1s. Izkaže pa se, ko shranite datoteko, nekateri podatki so shranjeni ločeno. Torej je to malo miza imenik, tako rekoč. In poklical bom to ime stolpca, in Poklical bom to mesto stolpca. In jaz bom rekel, domnevam to je moj življenjepis. Moj resume.doc je shranjena na lokacijo, recimo 123. Vedno sem šel za to številko. Ampak je dovolj reči, da tako kot v RAM, si lahko trdi disk to je gigabajt ali 200 gigabajtov ali terabajt, in lahko Število vseh bajtov. Lahko oštevilčiti vse kose 8 bitov. Tako bomo rekli, da je to je lokacija 123. Torej ta imenik znotraj mojega delovanja Sistem si zapomni, da je moja spet je na lokaciji 123. Vendar pa postane zanimivo, ko datoteko izbrišete. Tako na primer - in na srečo je večina sveta ima ujeli na to - kaj se zgodi, ko povlečete datoteko na računalniku Mac OS Smetnjak ali vaš Windows Recycle Bin? Kaj je namen s tem? To je očitno, da se znebite datoteke, ampak kaj dejanje povlečete in spustite v svoj koš ali vaš Koš storiti na računalniku? Popolnoma nič, res. To je tako kot v mapo. To je posebno mapo, da se prepričate. Vendar pa je dejansko izbrisati datoteko? No, no, saj nekateri od vas verjetno so bili, kot so, oh prekleto, niste pomeni, da to storim. Tako da dvokliknete Smeti ali koš. Ste podrezal okoli in si opomogla datoteka samo, da ga povlečete od tam. Torej je jasno, da to ni nujno izbris. OK, ti si pametnejši od tega. Saj veš, da samo, da ga povlečete v Smeti ali koš ne pomeni, ste praznjenje koša. Torej, greš v meni, in rečeš Empty Trash ali Empty Recycle Bin. Kaj se zgodi potem? Ja, tako je črta bolj. Ampak vse to zgodi, je to. Računalnik pozabi, kjer resume.doc bilo. Toda tisto, kar očitno ni spremenilo na sliki? Bitov, 0s in 1s da Trdim, so na mestu nekaj fizičnega vidika strojne opreme. Oni so še vedno tam. To je le računalnik pozabili, kaj so. Torej je v bistvu osvobojena datoteka je bitov, tako da jih je mogoče ponovno uporabiti. Vendar ne, dokler ne boste ustvarili več datotek, in več datotek in še več datotek bo verjetnostno tisti 0 in 1s, ti magnetni delci, se ponovno uporabi, glavo ali desno stranjo navzgor za druge datoteke, 0s in 1s. Torej imate to okno časa. In to ne v predvidljivi dolžina, res. To je odvisno od velikosti vašega trdega disk in koliko datotek imate in kako hitro si lahko nove. Vendar pa je to okno v času trajanja ki jih ta datoteka je še vedno popolnoma povrnejo. Torej, če ste že kdaj uporabljati programe, kot so McAfee ali Norton, da bi poskušali izterjati Podatki, vsi počnejo poskuša izterja to tako imenovano imenik za ugotoviti, kje je bila tvoja slika. In včasih Norton in reči, Datoteka je 93% povrnejo. No, kaj to pomeni? To samo pomeni, da so nekatere druge datoteke naključju končal z, recimo, ti delci iz vaše izvirne datoteke. Torej, kaj je dejansko vsebovala pri izterjavi podatkov? No, če nimate kaj takega Norton vnaprej nameščen na računalniku, Največ kar lahko včasih narediti je pogledati na celoten trdi disk išče vzorci bitov. In ena od tem, o problematičnem niz pet je, da si bo poiskal enakovredno trdega diska, forenzični Podoba Compact Flash kartico iz digitalni fotoaparat, ki iščejo 0s in 1s, ki običajno, z visoko Verjetnost, predstavljajo začetek za slike JPEG. In vidva lahko izterja tiste slike, ki jih ob predpostavki, če vidim ta vzorec bitov na forenzične podobo, s velika verjetnost, da znamke začetek JPEG. In če bom spet videl isti vzorec, to verjetno pomeni začetek drugo JPEG in drugo JPEG, JPEG in drugo. In to tipično kako regres bo delovala. Kaj je lepo o JPEG je, čeprav sam format je nekoliko kompleks, začetek vsak primer Datoteka je pravzaprav precej prepoznaven in preprosto, kot boste videli, Če ste že ni. Torej, kaj je pobliže pod njim napa, da je točno kaj je bilo dogaja, in kaj ti 0s in 1s so, da vam malo več okvir za ta izziv. [Predvajanje videa] Kje računalnik shranjuje najbolj njenih stalnih podatkov. Da bi to dosegli, podatki potuje od RAM-a skupaj s programskimi signali, ki pripovedujejo trdi disk za hrambo teh podatkov. Pogonski vezja trdi translate te signale v napetosti nihanja. Ti pa, nadzor trdega diska je gibljivih delov, nekateri izmed redkih gibljivi deli ostanejo na svojem sodoben računalnik. Nekatere od krmilnih signalov motor ki se vrti metal obložene plošče. Vaši podatki dejansko shranjeni na te plošče. Drugi signali premakniti branja / pisanja glave za branje ali napišite podatke o pladnjih. Ta stroj tako natančne, da človek dlaka ni mogel niti mimo med Vodje in predenje krožnikov. Kljub temu, da vse skupaj deluje na grozen hitrosti. [END predvajanje videa] DAVID Malan: Povečaj malo globlje zdaj, kaj je dejansko o teh plošče. [Predvajanje videa] -Poglejmo, kaj smo samo videl v počasnem posnetku. Ko je kratek impulz električne energije pošlje branje / pisanje glave, če prezrcali na drobne elektromagnetnih za delček sekunde. Magnet ustvarja na polju, ki Spremembe polarnost drobna, drobna del kovinski delci, ki Dlaka vsak krožnik površino. Vzorec serija teh drobnih, področja zaračuna-up na disku predstavlja eno malo Podatki v binarno število Sistem, ki ga uporabljajo računalnike. Zdaj, če je trenutna poslal v eno smer z bralno / pisalna glava, območje je polarizirana v eni smeri. Če je trenutna pošlje nasprotni smeri, polarizacija se obrne. Kako prideš do podatkov na trdem disku? Le obraten proces. Torej je delci na disku da se trenutno v branje / pisanje glava premika. Skupaj milijone teh magnetizirani segmente, in imaš datoteko. Sedaj lahko koščki eno datoteko razkropljeni po vsem pogon je plošče, nekako kot nered referatov na vaši mizi. Torej posebna dodatna datoteka beleži o tem, kje vse je. Se ti ne želiš, da bi nekaj takega? [END predvajanje videa] DAVID Malan: OK, verjetno ne. Koliko od vas fantje odraščal z njimi? OK, tako da je vedno manj vsako leto roke. Ampak jaz sem vesel, da si vsaj seznanjeni z njimi, ker je to in naše Knjiga demo, na žalost umirajo zelo počasno smrt tukaj domačnosti. Ampak to je tisto, kar sem vsaj nazaj srednja šola, ki se uporablja uporaba za varnostne kopije. In bilo je neverjetno, ker ste lahko shranite 1,4 megabajtov na To zlasti disk. In to je bila različica visoke gostote, kakor je navedeno v HD, ki ima torej pred današnjim videoposnetkov HD. Standardna bila gostota 800 kilobajtov. In pred tem ni bilo 400-kilobajt diskov. Pred tem pa je bilo 5 in 1/4 palčne diske, ki so bili zares nemaren, in malo širša in višja od teh stvari tukaj. Vendar pa lahko dejansko videli tako imenovani floppy vidik teh diskov. In funkcionalno, oni dejansko Precej podobno trde diske na Vsaj ta tip. Še enkrat, SSD diski v novejših računalnikih Malo delujejo drugače. Ampak, če boste premaknili malo kovinski jeziček, lahko dejansko videli malo piškotek, ali krožnik. To ni kovine, kot je ta. Ta je dejansko nekaj cenejša plastike. In lahko nekako jo Mrdanje. In ste trully samo obrisati nekaj Število bitov ali magnetnih delcev iz tega diska. Torej, na srečo, ni nič na njem. Če je to stvar, ki je na poti - in pokrivajo vaše oči in tisti vašega soseda - lahko nekako to uspe celoti plašč off tako. Ampak tam je malo pomlad, zato bodite zaveda, da s svojimi očmi. Torej, sedaj imate resnično disketo. In kaj je izjemna o tem je, da v kolikor je to mali predstavitev večji trdi disk, te stvari so super, super enostavno. Če ste ščepec dna je zdaj, da metal stvar je off, in lupine da so odprte, vse, kar je, je dva kosa klobučevine in ti disketo s kosa kovine na notranji strani. In tam gre polovica vsebina mojega diska. Tu gre druga polovica. Ampak to je vse, kar je bilo predenje notranjosti računalnika v minulih dni. In spet, da te v perspektivo, kako velik je večino svojega trde diske v teh dneh? 500 gigabajtov terabajt in morda v namizni računalnik, 2 TB, 3 terabajtov, 4 TB, kajne? To je ena megabajt, Vzemi ali pusti, ki ne more niti fit tipično MP3 anymore teh dneh, ali nekateri podobno glasbo. Tako malo spominek za vas danes, in tudi za pomoč contextualize kaj bomo ob samoumevnega zdaj problem nastaviti pet. Torej, to so tvoje, da obdržite. Torej, kaj mi prehod, kjer bo porabi naslednjo pset kot dobro. Torej smo zdaj postavljena te strani - oh, Nekaj ​​objav hitro. Ta petek, če bi želeli pridružiti CS50 za kosilo, pojdite na običajnem mestu, cs50.net/rsvp. In končni projekt - tako po predmetniku, smo objavili končna specifikacija projekt že. Zavedam se, da to ne pomeni, to je posledica predvsem kmalu. To je objavil, res, samo da bi dobili vi razmišljate o tem. In res, super pomembna Odstotek vas bo reševanje končni projekti materiala, ki ga celo ni prišel v razred, ampak bo že prihodnji teden. Obvestilo, čeprav je, da spec zahteva nekaj različnih komponent končni projekt. Prvič, v nekaj tednih, je predhodnega predloga, precej športna email vaš TF mu povedati, ali kaj ste razmišljanje o za vaš projekt, s brez vezave. Predlog bo vaša zlasti zaveza, rekoč tukaj, to je tisto, Rad bi naredil za moj projekt. Kaj menite? Prevelik? Premajhen? Je obvladljiv? In vidite spec za več podrobnosti. Nekaj ​​tednov po tem, da je stanje Poročilo, ki je podobno priložnostno email na vaš TF povedati, kako daleč ste v vaš končni izvajanje projekta, ki mu sledi CS50 Hackathon, za katere vsi je pozvala, ki bo dogodek iz 20:00 v enem večeru pa do 07:00 AM naslednje jutro. Pica, kot sem že omenil, lahko v tednu nič, se wil služil na 09:00, Kitajsko hrano ob 01:00. In če ste še budni ob 5:00 AM, vam bom k IHOP za zajtrk. Torej Hackathon je eden izmed več nepozabna doživetja v razredu. Potem izvajanja je posledica, in potem klimatskih CS50 sejem. Več podrobnosti o vseh teh V prihodnjih tednih. Ampak vrnimo se nečesa stara šola - spet matrika. Torej matrika je bilo lepo, saj rešuje težave, kot smo videli samo pred nekaj trenutki s študentskimi strukturami dobili malo iz nadzora, če bomo želijo imeti študent enega, dva študenta, študent tri, študent dot dot dot, nekaj poljubnega števila študentov. Torej nizi, pred nekaj tedni, poletelo v in rešil vse naše težave, ki ni vedo vnaprej, koliko stvari neke vrste lahko želimo. In smo videli, da lahko konstrukti nam pomagajo nadalje organizirati našo kodo in vodi konceptualno podobne spremenljivke, kot so ime in hiše skupaj, tako da smo jih lahko obravnava kot en subjekt, znotraj ki so manjše koščke. Vendar nizi imajo nekaj slabosti. Katere so nekatere slabosti smo naleteli z nizi tako daleč? Kaj je to? Fiksna velikost - tako, čeprav boste morda mogli dodeliti pomnilnika za matrika, ko veš, koliko študentov imate, koliko znakov ste od uporabnika, ko ste dodeljeni matrika, ki ste nekako naslikal sami v kotu. Ker ne morete dodati nove elemente v sredini polja. Ne morete vstaviti več elementov Na koncu matrike. Res, boste morali zateči k ustvarjanju Popolnoma nova matrika, kot smo razpravljali, kopiranje starega v novo. In spet, da je glavobol, da GetString ukvarja z za vas. Ampak še enkrat, ne moreš celo vstavite nekaj v sredini polja če se obrestna mera ni povsem napolnjena. Na primer, če je ta niz tukaj velikosti šest ima samo pet stvari v njem, No, lahko le dodaste vas nekaj na koncu. Kaj pa, če želite vstaviti nekaj v sredini matrika, čeprav gre morda pet od šestih stvari v njem? No, kaj smo počeli, ko smo imeli vsi naših ljudi prostovoljcev na odru v tedne mimo? Če bi želeli postaviti nekoga tukaj, bodisi ti ljudje, kako se premakniti to Tako ali ti ljudje, kako se premakniti to pot, ki je postala draga. Premikanje ljudi znotraj matrika končal sešteva in stanejo nam časa, zato veliko naših n kvadrat voznih časov, kot so vstavljanje vrste, za na primer, v najslabšem primeru. Torej, nizi so super, ampak moraš vnaprej vedo, kako velik jih želite. Torej OK, tukaj je rešitev. Če ne vem vnaprej, koliko študenti Morda imam in vem, da enkrat Sem se odločil, čeprav sem zaljubljen s tem veliko študentov, zakaj ne sem vedno dodeli dvakrat toliko prostora kot sem morda mislim, da potrebujem? Je, da ni primerna rešitev? Realno, jaz ne mislim, da smo bodo potrebovali več kot 50 slotov v matriki za srednje velikostnem razredu je, zato naj samo zaokroži navzgor. Poskrbel bom, 100 rež na mojem paleto, samo tako da bomo lahko zagotovo dobili Število študentov pričakujem, da bom se v nekaterih srednje-velikostnem razredu. Torej, zakaj ne samo zaokrožiti in dodeliti več pomnilnika, tipično za matriko kot mislite, da bi sploh potrebujemo? Kaj je to preprosto pushback na to idejo? Ste samo zapravljaš spomin. Dobesedno vsak program, ki ga pišete, nato je morda z dvakrat toliko pomnilnika, kot ste dejansko potrebujete. In da le ne počutim kot še posebej elegantna rešitev. Poleg tega je to samo zmanjša Verjetnost problem. Če se zgodi, da imajo ljudski tečaj en semester in imate 101 študentov, vaš program je še vedno bistveno soočajo z isto težavo. Torej, na srečo, obstaja rešitev za Ta oglas vsi naši problemi v obliki podatkovnih struktur, ki so bolj zapleten, kot tiste, smo videli doslej. To Trdim, je povezani seznam. To je seznam številk - 9, 17, 22, 26 in 34 - , ki so med seboj povezani s pomočjo česa sem sestavljen kot puščice. Z drugimi besedami, če sem hotel, da zastopa matrika, lahko naredim kaj takega. In jaz bom dal to v zgornjem čez nekaj trenutkov. To lahko storim - Pozdravljeni, v redu. Stati. Nova računalniška tukaj, jasno - Vse je v redu. Torej, če sem te številke v polju - 9, 17, 22, 26, 24 - ni nujno, da v merilu. Vse je v redu, tako da tukaj je moj polje - O, moj bog. Vse je v redu, tako da tukaj je moj polje. Oh, moj bog. [SMEH] DAVID Malan: Pretvarjaj se. To je preveč truda, da se vrnete in da popraviti, tako da - 26. Torej imamo ta niz 9, 17, 22, 26, in 34. Za tiste, ki ste lahko videli neprijetno napako sem ravnokar, tam je. Zato trdim, da je to zelo učinkovita rešitev. Sem dodeli toliko kot ints Rabim - Ena, dva, tri, štiri, pet ali šest - in sem nato shranjeni številke znotraj tega polja. Recimo, potem hočem vstaviti vrednost, kot je število 8? No, če ne gre? Recimo, da želite vstaviti več kot 20. No, če ne gre? Nekje na sredini, ali številko 35 je šel nekje na koncu. Ampak jaz sem vse ven iz prostora. In tudi to je temeljni izziv od polj, ki so rešitev ne. Sem trdil pred nekaj trenutki, GetString reši ta problem. Če želite vstaviti šesti številko v tem polju, je vsaj ena Rešitev, ki jo lahko pade nazaj na za prepričani, tako kot mi z GetString? Kaj je to? No, da bo večji je lažje reči kot narediti. Ne moremo nujno, da array večji, ampak kaj lahko storimo? Naredite nov niz, ki je večji, velikosti 6, ali morda velikost 10, če hočemo da se pred stvarmi, in nato kopirajte stara matrika v novo in nato sprostiti staro paleto. Toda kaj, ko teče Zdaj tega procesa? To je velik O n, saj kopiranje bo stalo nekaj enot čas, tako da ni tako idealno, če moramo dodeli nov niz, ki se dogaja porabijo dvakrat toliko pomnilnik začasno. Kopiranje stare v novo - Mislim, da je samo glavobol, ki je, še enkrat, zakaj smo pisali GetString za vas. Torej, kaj lahko storimo namesto tega? No, kaj pa če je naša podatkovna struktura dejansko ima vrzeli v njej? Recimo, da sem se sprostite svoj cilj, da sosednje kose pomnilnika, kjer 9 Tik 17, ki je tik do 22, in tako naprej. In domnevam, da se lahko 9. biti tukaj v RAM, 17 pa jih je mogoče tukaj preveč v RAM, in se 22 lahko tukaj preveč v RAM. Z drugimi besedami, jaz jih ne potrebujete celo nazaj na več nazaj. Pravkar sem se nekako nit iglo skozi vsako od teh številk, ali vsak teh vozlišč, saj bomo klic pravokotniki, kot sem jih vlečeni, do Spominjam se, kako priti do zadnjega kot vozlišče od prvega. Torej, kaj je programski konstrukt smo videli še pred kratkim, s katerim sem mogoče izvajati, da se niti, ali sestavi tukaj, s katerim sem lahko izvajanje te puščice? Torej kazalci, kajne? Če sem dodeliti ne le int, vendar vozlišče - in vozlišče, pravkar sem pomeni posodo. In vizualno, mislim pravokotnik. Torej očitno potrebuje vozlišče vsebuje dve vrednosti - int sama, nato pa, kot je vsebovano v spodnja polovica pravokotnika dovolj prostora za notr. Torej samo razmišljanje naprej tukaj, kako velik je ta vozel, to posoda vprašanje? Koliko bajtov za notr? Verjetno 4, če je Enako kot običajno. In potem, koliko zlogov Za kazalca? 4. Torej je to zabojnik, ali je to vozlišče, je bo 8 bajtov strukturo. Oh, in da je srečno naključje, da smo pravkar uvedla ta pojem struct, ali struktura C. Torej trdim, da želim narediti korak proti tem bolj prefinjene Izvajanje seznama števil, ki povezani seznam številk, moram narediti Malo več razmišljanja spredaj in izjavi, ne le int, ampak Struct da bom poklical, konvencionalno tukaj vozlišče. Lahko bi ga poklical vse, kar si želite, vendar vozlišče se bo tematsko veliko od stvari, ki smo začeli gledaš zdaj. Znotraj tega vozlišča je int n. In potem je ta sintaksa, malo čudno na prvi pogled - struct vozlišče * naslednji. No slikovno, kaj je to? To je spodnja polovica pravokotnik, da smo videli pred nekaj trenutki. Ampak zakaj govorim struct vozlišče * v nasprotju s samo vozlišče *? Ker če da kazalec kaže na drugem vozlišču, to je samo naslov vozlišča. To je v skladu s tem, kar smo jih Doslej razpravljali o kazalca. Ampak zakaj, če trdim, ta struktura je imenuje vozlišče, moram reči Struct Vozel tu notri? Točno tako. To je neke vrste neumna realnosti C. Typedef, tako rekoč nima še ni zgodilo. C je super dobesedno. Glasi svojo kodo vrha do spodaj, z leve proti desni. In dokler ne pade, da podpičje na Bottom line, ugani kaj ne obstajati kot podatkovni tip? Vozlišče quote citata vozlišče. Ampak zaradi bolj verbose Izjava sem v prvi vrstici - typedef struct vozlišče - ker je bilo prej, preden zavitih oklepajih, to je nekakšen pred izobraževanjem Jek, da si veš kaj, daj mi Struct imenovano struct vozlišče. Odkrito povedano, ne maram kliče stvari struct vozlišče, vozlišče struct vse skozi mojo kodo. Ampak bom jo uporabite le enkrat, samo v notranjosti, tako da bom lahko učinkovito ustvariti vrste krožne reference, ne kazalec, da sam po sebi, ampak kazalec na drugo enak tip. Tako se izkaže, da na strukturo podatkov kot je ta, da je malo operacije, ki bi lahko v interesu nas. Bomo morda želite vstaviti v seznamu kot je ta. Mi morda želeli izbrisati s seznama, kot je ta. Mi bi želeli poiskati seznam za vrednost, ali bolj na splošno, prečno. In prečno je samo fancy način pravi začetek na levi in ​​premakniti vse pot v desno. In obvestilo, tudi s tem nekoliko bolj sofisticirane podatkovne strukture, naj jaz predlagam, da bomo lahko sposodimo od ideje v zadnjih dveh tednih in izvajati funkcijo imenovano iskanje takole. To se dogaja, da se vrnete res ali false, kar kaže, da ali no, n je na seznamu. Njena Drugi argument je kazalec na seznam same, tako kazalec na vozlišče. Vse bom naredil, potem je razglasila začasna spremenljivka. Mi bomo to imenujemo PTR po dogovoru Za kazalec. In sem ji dodelite enako začetek seznama. In zdaj opazil while zanko. Dokler kazalec ni enako na nič, grem preveriti. Je kazalec arrow n enak n, ki je bil sprejet leta? In počakajte minuto - nov kos sintakse. Kaj je puščica naenkrat? Ja? Točno tako. Torej, ker se je pred nekaj minutami smo uporabili dot zapis za dostop do nekaj notranjost struct, če je spremenljivka ki ste jih ni struct , pač kazalec na struct, na srečo, kos sintakse, ki končno omogoča intuitivno smiselno. Puščica pomeni, da sledijo kazalcem tako kot naši puščice običajno pomeni slikovno in pojdite na Polje notri podatki. Torej puščica je ista stvar kot piko, toda ga uporabite, ko imate kazalec. Torej, nato povzeti, če n polje znotraj struct imenovan kazalec enaka enaka n, vrne true. Drugače pa je ta linija tukaj - kazalec enak kazalec naslednji. Torej, kaj to počne, obvestilo, je, če sem sem trenutno kaže na struct ki vsebuje 9 in 9 ni več Iščem - domnevam, iščem za n enak 50 - Bom posodobiti svoj začasni kazalec da ne bodo kazali na tem vozlišču več, vendar kazalec puščico, ki se dogaja, da me tukaj. Zdaj sem spoznal, je tornado uvod. V sredo bomo dejansko to z nekaterimi ljudmi in še več koda počasneje. Ampak zavedati, da smo zdaj kar naše podatke strukture bolj zapletene, tako da naši algoritmi lahko dobite bolj učinkovito, kar se bo pogoj za pset šest, ko smo naložite, še enkrat, tisti, 150.000 besed, vendar je treba to storiti učinkovito, in v najboljšem primeru, ustvarite Program, ki teče na naši uporabniki ne linearna, ne n kvadrat, vendar Časovna konstanta v idealno. Se vidimo v sredo. SPEAKER: Na naslednjem CS50, David pozabi svojo osnovno zadevo. DAVID Malan: In to je, kako boste poslali besedilna sporočila s C. Kaj - [RAZNO besedilno sporočilo OBVESTILO SOUNDS]