DAVID Malan: Olgu, tere tulemast tagasi. See on CS50. See on algus nädalal seitse. Nii et see on olnud mõnda aega, nii et ma arvasin, et me võtma tuulispask tour, kus me pooleli jäi, ja kui me nüüd minema. Nii et see asi siin võib-olla tekitanud angst alguses. Aga loodetavasti hakkad aklimatiseeruda, mida see tähistab siin - star esindavad pointer, mis on just see, et rohkem üldarusaadavat mõttes? Nii et see on aadress. Nii et see on aadress, midagi mälestuseks. Ja hakkasime koor tagasi kihid Paar nädalat tagasi, asjad GetString ja muid selliseid funktsioone kõik see aeg on tagasi aadressid asju mälu, nagu aadress esimene märk mõned jada. Nii me ka kasutusele valgrind, mis hakkate kasutama seda probleemi seada, eelkõige järgmise probleem määrata samuti. Ja valgrind mida teeb meie jaoks? Ta kontrollib mälu lekib, ja see kontrollib ka kuritarvitamise mälu. See võib teatud tõenäosusega, avastada, kui Sinu kood läheb puudutada mälu et see lihtsalt ei peaks. Nii ei pruugi leke, kuid kui te ületavad piire mõned massiiv, ja sa tegelikult kulgema valgrind ja esile, et käitumine, kui valgrind töötab oma programmi töötab sees on, saad sõnumeid nagu see - "vigane kirjutame suurus 4 ", mis meenutavad paar nädalat tagasi tähendas, et olin kogemata nagu ühel int liiga kaugele piiridest väljapoole massiivi. Ja nii suurus 4 tähendab siin suurus et erilist int. Nii, et võta kindlustunnet selles, et valgrind väljund, vormistati see, on lihtsalt jõle. See on tõesti raske läbi näha segadus jaoks huvitavat informatsiooni. Niisiis, mida me oleme teinud siin on lihtsalt väljavõte mõned veel paar huvitav read. Aga mõistan, et 80% valgrind poolt toodang saab olema natuke tähelepanu kõrvale. Lihtsalt otsida mustreid, nagu need - kehtetu õigus, kehtetuks lugeda, 40 baiti ja mõned plokkide arv on kindlasti kadunud, märksõnad niimoodi. Ja mida sa loodetavasti näha, on mõned mingi jälg missugust ülesannet viga on tegelikult sisse Selles asjas, millises reas minu kood oli viga ilmselt? 26 faili nimega memory.c, mis oli Näiteks me mängisime koos ajal. Nii et see on tõenäoliselt ei malloc. See oli ilmselt minu koodi asemel. Nii me näeme, see uuesti ja uuesti enne pikk. Nii scanf, see tuli sisse paar vorme siiani. Nägime sscanf lühidalt. See oli midagi, mitmed sa sukeldus oma ettevalmistusi tegema. Ja scanf on tegelikult see, mis CS50 Raamatukogu on kasutanud all kapuuts juba mõnda aega, et saada sisend kasutaja. Näiteks, kui ma minna üle CS50 Seadme siin, lubage mul avada Näiteks täna, et kutsutakse scanf-0.c Ja see on super lihtne. See on lihtsalt paar rida koodi. Aga see näitab tegelikult, kuidas getInt on töötanud kogu see aeg. Selles programmis siin, joon 16 , Teate, et ma kuulutada int. Seega ei ole viiteid, midagi maagilist seal, lihtsalt int. Siis joon 17, I kiire kasutaja number, palun. Siis lõpus 18, ma saan kasutada scanf siin. Ja ma täpsustada, selline nagu printf, et ma ootan quote lõppeb protsenti i. Nii protsenti i muidugi tähistab int. Aga teate, mis teises argument scanf on. Kuidas te kirjeldaksite teine argument pärast koma? Mis see on? See on aadress, x. Nii et see on kasulik, sest andes scanf koos aadressiga x, mida see et anda see funktsioon teha? Mitte lihtsalt sinna minna, kuid ka seda, mida? Tee muudatusest. Sest sa ei lähe sinna, see on omamoodi nagu kaardi asukohta mälus. Ja nii kaua, kui te pakkuda scanf või iga funktsioon selline kaart, mis funktsiooni saab sinna minna, ja mitte ainult pilk väärtus, kuid see võib ka muutma seda väärtust, mis on kasulik, kui eesmärk elus on scanf on skaneerida kasutajalt konkreetselt alates klaviatuurist. Ja f tähistab vormindatud, just nagu printf, f tähistab vormindatud string, mida soovite printida. Nii lühike, see liin 18 lihtsalt ütleb, proovige lugeda int alates kasutaja klaviatuur ja hoidke seda sees x juures mis iganes aadress x juhtub elama. Ja siis lõpuks, liin 19 lihtsalt ütleb, tänu int, käesolevas asjas. Nii et lubage mul minna ja teha seda. Nii et scanf 0. Lubage mul minna ja suumimiseks Ma lähen ja käivitada seda dots kärpida scanf 0. Number, palun? 50. Täname 50. Nii et see on üsna lihtne. Nüüd sellest, mis on ta ei tee? See ei tee terve hunnik vigade kontroll. Näiteks, kui ma ei tee koostööd, ja ma ei kirjuta number, kuid selle asemel ma kirjutada midagi "tere" see on lihtsalt mingi imelik. Ja nii üks asju CS50 raamatukogu on teinud meie jaoks mingil aeg on see, et reprompting ja reprompting. Uuesti fraas tagasikutsumine cs50.c, ja see on põhjus, et getInt sisse CS50 raamatukogu on tegelikult kogu hunnik rida pikk, sest me oleme kontrollimine loll värk niimoodi. Kas kasutaja ei anna meile tegelikult int? Kas ta annab meile midagi nagu tähestiku täht? Kui jah, me tahame, et avastada mis ja karju neile. Aga asjad huvitavamaks Järgmises näites. Kui ma lähen scanf-1.c, mis on üks asi, mis on fundamentaalselt muutunud Järgmises näites? Ma kasutan char * muidugi asemel int. Nii et see on huvitav, sest char * mäletan, on tegelikult lihtsalt sama asi nagu string. Niisiis tundub, nagu võib-olla on see super lihtne rakendamine getString. Aga ma olen kooritud tagasi kiht Euroopa CS50 raamatukogu, nii et ma olen kutsudes seda char * nüüd. Vaatame siis, kui pool, me valesti minna. Line 17 - Ma ütlen veelkord, palun anna mulle midagi, sel juhul string. Ja siis järgmisel real, kutsun scanf, uuesti, andes vormi kood, kuid seekord protsenti s. Ja siis see aeg, ma olen annab see puhver. Nüüd teate, ma ei kasuta ampersand. Aga miks on see, et ilmselt OK siin? Sest see, mis on puhver juba? See on juba pointer. See on juba aadress. Ja olgem see sõna "segadusse," andke mulle lihtsalt nimetame seda s näiteks jaoks lihtsus. Aga ma kutsusin ta puhverdada sest üldiselt, programmeerimine, kui teil on tüki mälu, mis string tõesti lihtsalt on, siis võite helistada see puhver. See on koht, et salvestada teavet. Sarnased asjad nagu YouTube, kui nad puhverdusvõime, nii rääkida, et lihtsalt tähendab see allalaadimine bitti Internet ja ladustamiseks neid kohaliku massiivi kohaliku tüki mälu, nii et saab vaadata seda hiljem ilma see vahele või riputamise te mängides tagasi. Nii et seal on probleem küll, sest Ma ütlen scanf oodata string kasutaja. Siin on aadress tüki mälu. Pane see string seal. Miks see nii on köidetud anda meile probleeme, kuigi? Mis see on? Kas ma tohin kasutada et osa mälu? Tead, ma ei tea. Sest on puhver on vormindatud midagi? Mitte eriti. Ja nii see on, mida me oleme oodanud prügi väärtus, mis ei ole ametlik sõna. See lihtsalt tähendab, et me ei tea, mis bitti on sees neli baiti, et Olen eraldatakse puhver. Ma pole kutsutud malloc. Olen kindlasti ei kutsunud getString. Nii et kes teab, mis on tegelikult sees puhver? Ja veel ütlen scanf pimesi minna ja panna mida iganes kasutaja sisestatud. Niisiis, mida võib põhjustada meie koodi kui me käivitada? Tõenäoliselt segfault. Võib-olla mitte, kuid ilmselt segfault. Ja ma ütlen, võib-olla mitte, sest mõnikord sa teed, mõnikord sa ei saa segfault. Mõnikord lihtsalt veab, kuid see on siiski saab olema bug meie programmis. Nii et lubage mul minna ja koostab selle. Ma lähen tegema seda vana kooli viis. Nii rõkkama kriips 0, scanf-1, scanf-1.c, Enter. Oih, liiga vana kool. Vaatame. Kust ma minna? Oh, char * puhver. Oh, tänan teid - Salvesta OK - väga vana kool. Olgu, see on olnud mõnda aega. Nii et ma olen lihtsalt salvestatud fail pärast tegemine, et ajutine muuta hetk tagasi. Ja nüüd olen koostanud see käsitsi rõkkama. Ja nüüd ma lähen edasi minna ja käivitada scanf-1, Enter. String palun. Ma kirjuta "tere." Ja nüüd, siin, kus ausalt öeldes printf võimalik on natuke tüütu. See ei ole tegelikult läheb segfault käesolevas asjas. Printf on natuke eriline, sest see on nii super levinud, et sisuliselt printf teeb meile teene ja realiseerimisel, see ei ole kehtiv pointer. Võtan ta pärast ise lihtsalt printida välja sulgudes null, isegi kuigi see ei pruugi olla see, mida me end oodata. Nii et me ei saa tõesti kergesti esile segfault seda, kuid selgelt seda ei ole käitumine tahtsin. Mis on lihtne lahendus? Noh, scanf-2, andke mulle ettepaneku, et asemel tegelikult lihtsalt eraldada char * Lubage mul olla natuke targemaks umbes seda ja las ma buhvritele jadana 16 tähemärki. Ma võin seda teha paar võimalust. Ma võiks täiesti kasutada malloc. Aga ma ei saa minna tagasi nädal kaks kui Ma lihtsalt vaja terve hunnik tähemärki. See on lihtsalt massiivi. Nii et lubage mul selle asemel uuesti puhver olema massiiv 16 tähemärki. Ja nüüd, kui ma edasi puhver - ja see on midagi, mida me ei rääkida nädalal kaks - kuid saab ravida massiivi kuigi see on aadress. Tehniliselt nagu me oleme näinud, et nad on natuke erinev. Aga scanf ei pahanda, kui te kaotate seda nimi massiivi, sest mida Rõkkama teeme meie jaoks on sisuliselt ravida nime, et massiivi aadress patakas 16 baiti. Nii et see on parem. See tähendab, et nüüd, ma saan loodetavasti tehke järgmist. Lubage mul välja suumida hetkeks ja ei tee scanf-2, mis on koostatud OK. Nüüd lubage mul ei saanud kaldkriipsuga scanf-2. String palun. "Tere." Ja see Tundus, et töö selle aja jooksul. Aga kas keegi ettepaneku stsenaarium milles see ei pruugi veel tööd? Jah? Midagi pikem kui 16 tähemärki. Ja tegelikult, me võime olla veidi täpsem. Midagi enam kui 15 tähemärki, sest tegelikult me ​​peame meeles pidama, et meil on vaja, et Kenoviiva null kaudselt lõpus stringi, mis on kõrvale scanf tavaliselt hoolitsevad meie eest. Nii et lubage mul teha midagi sellist - mõnikord me lihtsalt jätke see niimoodi. OK, nii et me oleme nüüd indutseeritud meie killustatust süü. Miks? Sest ma kirjutada rohkem kui 15 märki ja seega oleme tegelikult puudutanud mälu, et ma tegelikult ei tohiks olla. Mis siis tegelikult lahendus siin? Noh, mis siis, kui meil on vaja enam string? Noh, me võib-olla teeb see 32 baiti. Noh, mis siis, kui see ei ole piisavalt pikk? Kuidas 64 baiti? Mis siis, kui see ei ole piisavalt pikk? Kuidas 128 või 200 baiti? Mis tegelikult on lahendus siin Üldjuhul, kui me ei tea ette, mida kasutaja saab sisestada? See on lihtsalt selline suur valu on perse, Kui aus olla, mistõttu CS50 raamatukogu on mõnikümmend rida kood, mis ühiselt rakendada GetString string nii, et me ei on ette teada, mida kasutaja saab sisestada. Eriti siis, kui te vaatate tagasi cs50.c kaks nädalat tagasi, näete et getString tegelikult teeb mitte kasutama scanf niimoodi. Pigem loeb üks märk korraga. Sest üks tore asi lugedes üks märk, et me ei saa tagama end alati olema vähemalt üks märk. Ma ei saa lihtsalt kuulutada char, ja seejärel need tõeliselt beebi samme lihtsalt loe üks tegelane juures aeg klaviatuuril. Ja siis, mida te näete getString kas on iga kord, kui see saab otsa, ütleme, 16 baiti mälu, kasutab ta malloc või sugulane, ning et eraldada rohkem mälu, kopeerides vana mälu uude ja siis indekseerimise mööda, kuidas ühe märgi korraga, ja kui see saab otsa, et tüki mälu, viskab selle ära, greiferid suurem patakas mälu, kopeerib vana uutesse ja kordub. Ja see on tõesti valu tegelikult ellu midagi nii lihtne saada sisend kasutaja. Nii saad kasutada scanf. Võite kasutada ka muid samalaadseid funktsioone. Ja palju õpikuid ja internetis näidetest, kuid nad on kõik haavatavad probleeme niimoodi. Ja lõpuks, saada segfault on selline tüütu. See ei ole hea kasutaja. Kuid halvimal juhul, mis ei see põhimõtteliselt pane kood ohus? Mingi rünnaku potentsiaalselt. Rääkisime üks selline rünnak - täis stack. Aga üldiselt, kui olete lubatud ülevoolu puhver, nagu me tegime Paar nädalat tagasi, vaid kirjalikult rohkem kui "tere" on virnas, siis võib tõepoolest võtta üle, potentsiaalselt arvuti, või vähemalt saada on andmeid, et ei kuulu teile. Nii lühike, see on põhjus, miks meil on need abirattad. Aga nüüd me hakkame võtma need ära, nagu meie programme enam ei vaja, tingimata, panus kasutaja. Aga juhul, kui probleem seatud kuus, Teie panus on pärit suur sõnastik faili 150 mõned veider tuhat sõna. Nii et sa ei pea muretsema kasutaja suvalise sisendi. Me anname teile mõned eeldused umbes, et faili. Kõik küsimused on viiteid või scanf või kasutaja sisend üldiselt? Olgu, nii pilgu seejärel üks tagumisel teema kaks nädalat tagasi. Ja see oli see mõiste struktuure. Mitte, et - see mõiste vatseti, mis oli mis? Mida struct teha meie jaoks? Määrake - Vabandust? Määrake muutuja tüüp. Nii omamoodi. Me tegelikult ühendab kahte teemat. Nii typedef, meelde tuletada, et me ei kuulutada tüüpi meie ise, nagu sünonüüm, nagu stringi char *. Kuid kasutades typedef ja struktuure, saame luua tõeliselt oma andmestruktuurid. Näiteks, kui ma lähen tagasi gedit siin üks hetk ja ma minna ja teha midagi sellist, lubage mul päästa see on, oletame, structs.c ajutiselt, ma lihtsalt läheb minna ja sisaldama standardio.h, int main tühine. Ja siis siin, oletame, et ma tahan Kirjutada programm, mis salvestab mitu õpilast mitmest maja, näiteks. Nii et see on nagu registrarial andmebaasi mingisugune. Nii et kui mul on vaja nime üks õpilane, ma võiks teha midagi sellist char * nimi, ja ma teen midagi sellist - tegelikult, olgem kasutada CS50 raamatukogu hetkeks, et muuta see veidi lihtsam, nii et me saame laenata need kümned rida koodi. Ja olgem lihtsalt hoida lihtsa. Hoiame seda string, ja nüüd getString. Nii et ma väita nüüd, et ma olen salvestatud nimi Mõne õpilase ja maja mõned üliõpilane, lihtsalt kasutades muutujaid nagu me tegime ja nädalal üks. Aga arvan, et ma nüüd tahan, et toetada mitu õpilast. Olgu, mu instinktid on teha string NAME2 saab getString, string house2 saab getString. Ja siis meie kolmas õpilane, Teeme NAME3 getString. Olgu, see on loodetavasti silmatorkav sa nagu mingi loll, sest see protsess on tõesti kunagi lõppeb, ja see lihtsalt läheb teha oma kood koledamaks ja aina hullemaks ja hullemaks. Aga me lahendada see liiga nädalal kaks. Mis oli meie suhteliselt puhas lahendus kui meil oli mitu muutujate sama andmetüüp, mis on kõik seotud, kuid me ei taha, et see metsik segadus samalaadselt nimega muutujaid? Mida me teeme selle asemel? Nii et ma arvan, et ma kuulsin mõned kohad. Meil oli massiivi. Kui soovite Rohkete midagi, miks me ei puhasta see kõik up ja lihtsalt öelda, anna mulle massiivi nimetatakse nimed? Ja nüüd, lähme kõva kood 3. Ja siis anna mulle veel array kutsutud maja ja lase mind nüüd kõva kood 3. Ja ma olen tohutult koristada jama, et ma lihtsalt loodud. Nüüd, ma olen ikka kõva kodeeritud 3, kuid isegi 3 võib dünaamiliselt pärit kasutaja või argv vms. Nii et see on juba puhtam. Aga mis on tüütu on see, et nüüd, kuigi nimi on kuidagi tugevalt seotud üliõpilase maja - see on üliõpilane, et ma tõesti tahan kujutada - Mul on nüüd kaks massiivid, mis on paralleelne selles mõttes, et nad on sama suurus ja nimed sulg 0 arvatavasti kaardid maja sulg 0, ja nimed sulg 1 kaardid majade sulg 1. Teisisõnu, et õppija elab et maja, ja et teise õpilase elab teises majas. Aga kindlasti võiks see olla teha isegi puhtamalt. Noh, see võib tegelikult. Ja lubage mul minna ja avada üles structs.h ja sa vaata seda ideed siin. Pange tähele, et olen kasutanud typedef, nagu te vihjas hetk tagasi kuulutada meie enda andmete liiki. Aga ma olen ka kasutades teisi märksõna nimetatakse struct mis annab mulle uue andmestruktuur. Ja see andmestruktuur Väidan läheb on kaks asja sees see - string kutsus nime ja string nimega maja. Ja nimi ma annan see andmestruktuur läheb mida nimetatakse üliõpilane. Ma võiksin nimetada seda, mida tahan, kuid see semantiliselt teha mõtet mulle minu meelest. Nüüd, kui ma avada parem versioon Programmi hakkasin kirjalikult seal, lubage mul algusse kerimiseks. Ja seal on mõned rohkem rida koodi siin, kuid lubage mul keskenduda jaoks Praegu on üks. Olen kuulutatud pidev nn õpilased ja kõva kodeeritud 3 nüüd. Aga nüüd, pange tähele, kuidas puhas minu kood hakkab saama. Kooskõlas 22. Kinnitan massiivi õpilastele. Ja teate, et õpilane on ilmselt nüüd andmetüübi. Sest ülaosas seda faili märgata Lisasin, et päisefailist et ma tõmmata hetk tagasi. Ja et päisefailist lihtsalt tuli Selle mõiste üliõpilane. Nüüd, ma olen loonud oma enda kohandatud andmed tüüp, et autorid C aastat tagasi ei mõtle ette. Aga mingit probleemi. Ma ei tee seda ise. Nii et see on massiiv nimega õpilased, iga, mille liikmed on üliõpilane struktuur. Ja ma tahan, kolm neist massiivist. Ja nüüd, mida teeb ülejäänud Selle programmi teha? Mul oli vaja midagi veidi meelevaldne. Nii online 24 aastast Ma korrata 0-3. Ma siis paluda kasutajal jaoks õpilase nime. Ja siis ma kasutan getString nagu enne. Siis ma küsida õpilase maja, ja ma kasutan getString nagu enne. Aga teate - veidi uus tükk süntaks - Ma ei saa ikka indeks i-nda üliõpilane, aga kuidas ma saan kell konkreetsed andmed valdkonna sees struct? Nii, mis on ilmselt uus tükk süntaks? See on lihtsalt dot operaator. Me tõesti ei näinud seda enne. Sa oled näinud seda pset viis kui olete sukeldus juba koos bitmap faili. Aga dot tähendab lihtsalt sees käesoleva struct või mitut valdkonda, annavad dot nimi või mulle dot maja. See tähendab, minna sees struct ja saada need eri valdkondi. Mis ülejäänud seda programmi teha? See pole veel kõik, et seksikas. Pange tähele, et ma korrata 0-3 uuesti, ja ma lihtsalt luua English fraas nagu nii ja nii on selline ja nagu maja, mis kulgeb dot nime i-nda õpilaste ja nende maja samuti. Ja siis lõpuks, nüüd hakkame saada anal sellest nüüd, kui me oleme tuttav milline malloc ja muud funktsioonid on teeme kõik see aeg. Miks mul on vaba nii nimi ja maja, kuigi ma ei helistanud malloc? GetString tegi. Ja see oli väike räpane saladus mitu nädalat, kuid getString on välja lekib mälu üle pange kõik semester siiani. Ja valgrand lõpuks näitavad seda meile. Aga see ei ole suur asi, sest ma tean, et ma lihtsalt vabastada nimi ja maja, kuigi tehniliselt, et olema super, super ohutu, ma peaks olema teeme mõned veakontrollifunktsioon siin. Mida oma instinkte ütlen sulle? Mida ma peaksin olema kontrollimiseks enne kui ma vaba, mis on string, aka mis char *? Ma peaks tegelikult kontrollida, kas õpilased sulg i dot nimi ei võrdne null. Siis tulen OK minna ja tasuta et pointer, ja sama või muu üks samuti. Kui õpilased sulg i dot maja ei ole võrdne null, see nüüd kaitseb vastu nurga puhul, kus GetString tagastab midagi null. Ja me nägime hetk tagasi printf tahe kaitsta meid siia lihtsalt öeldes null, mis läheb otsima imelik. Aga vähemalt see ei segfault, Nagu me oleme näinud. Noh, lubage mul teha veel üks asi siin. structs-0 on selline loll programm sest ma sisestan kõik andmed, ja siis see on kadunud, kui programm lõpeb. Aga lubage mul minna ja seda teha. Lubage mul teha terminal aken natuke suurem. Lubage mul teha structs-1, mis on uus versioon sellest. Ma suumida natuke. Ja nüüd andke mulle joosta dot kaldkriips structs-1. Student nimi - David Ema, teeme Rob Kirkland, Teeme Lauren Leverett. Mis on huvitav on nüüd teade - ja ma tean vaid seda, sest Kirjutasin programmi - seal on fail nüüd minu praegune kataloog nimega students.csv. Mõned võite näinud neid reaalses maailmas. Mis CSV faili? Komadega eraldatud väärtused. See on omamoodi nagu vaese mehe versiooni Exceli faili. See tabel ridade ja veergude saate avada programmis nagu Excel, või numbrid Mac. Ja kui ma seda faili avada siin gedit, Hanketeade - ja numbrid ei ole seal. See on lihtsalt gedit ütlen mulle rida numbreid. Teatis esimene rida selles fail on David ja Ema. Järgmine rida on Rob koma Kirkland. Ja kolmas liin on Lauren koma Leverett. Niisiis, mida ma olen loonud? Olen nüüd kirjutatud C programm, mis tõhusalt suudab luua tabeleid mis saab avada programmi nagu Excel. Mitte kõik, mis mõjuvad andmekogum, kuid kui teil on palju suurem tükkideks andmed, mida sa tegelikult tahad manipuleerida ja teha graafikuid ja meeldib, see on ilmselt üks viis luua, et andmeid. Lisaks CSV-des võib tegelikult super ühine lihtsalt ladustamiseks lihtne andmed - Yahoo Finance, näiteks, kui sa saad börsikursid kaudu oma nn API, tasuta teenus, mis võimaldab teil saada praegune up-to-the-date laos hinnapakkumisi ettevõtteid, nad anda andmed tagasi super lihtne CSV formaadis. Niisiis, kuidas me seda teeme? Noh teate, kõige selle programmi peaaegu sama. Aga teate siia, mitte print üliõpilasi, on line 35 aastast, ma väita, et ma hoian õpilased kettale, nii faili salvestamisel. Nii märkate Teatan FILE * - nüüd, see on omamoodi anomaalia C. Mingil põhjusel, FAIL on kõik mütsid, mis ei ole nagu enamik teisi andmetüüpe aastal C. Aga see on sisseehitatud andmetüüp, FILE *. Ja ma kuulutab kursor faili on see, kuidas sa ei mõtle seda. fopen tähendab avatud faili. Mis faili sa tahad avada? Ma tahan, et avada faili, et ma omavoliliselt helistada students.csv. Ma võiks helistada, et midagi ma tahan. Ja siis võtta arvan. Mis teine ​​argument et fopen ilmselt tähendab? Õigus, w kirjutada, võiks olema r read. Seal jaoks lisab, kui te soovite lisada ridu ja ei kirjutada kogu asi. Aga ma tahan, et luua seda pilti üks kord, nii et ma kasutada quote lõppeb w. Ja ma tean, et ainult lugenud dokumentatsiooni või mees lehele. Kui fail ei ole null - teisisõnu, Kui midagi läks valesti seal - lubage mul korrata üle üliõpilased 0-3. Ja nüüd teate, et midagi Ainult veidi umbes line 41 siin. See ei ole printf. See fprintf faili printf. Nii see läheb kirjutada faili. Mis fail? Üks kelle pointer saab määrata kui esimene argument. Siis määrata stringi. Siis me täpsustada, mida string tahame pistik esimest protsenti s ja siis teine ​​muutuja või Teise protsenti s. Siis sulgege fail kirjutamisel. Kui ma vaba mälu kui enne, kuigi Ma peaks minema tagasi ja lisada mõned kontrollid null. Ja ongi kõik. fopen, fprintf, kirjutamisel annab mulle võime luua tekstifaile. Nüüd näete lahendamist viis, mis hõlmab pilte, saate kasutada binaarfailidele asemel. Aga põhimõtteliselt, idee on sama, kuigi funktsioone teid vaata on natuke erinev. Nii tuulispask tour, kuid sa saad liigagi tuttav faili I/O-- sisend ja väljund - koos pset viis. Ja küsimusi esialgne põhitõdesid siin? Jah? Mis siis, kui sa püüad vaba null väärtus? Ma usun, kui vaba on saanud veidi kasutajasõbralikum, saate potentsiaalselt segfault. Söötmine see tühjaks on halb, sest ma ei usu vaba häirib, et kontrollida teie sest see võiks potentsiaalselt olla jäätmete aega, et seda teha ise kõik maailmas. Hea küsimus, kuigi. Olgu, selline muutub meil huvitav teema. Teema lahendamist viis on ekspertiisi. Vähemalt see on osa Probleemi komplekti. Kohtumeditsiini üldiselt viitab taastamiseks teavet, mis võib või ei tohi olla kustutatud tahtlikult. Ja nii ma mõtlesin, et ma annan sulle kiire maitse, mis tegelikult toimub kõik seekord all kapuuts arvuti. Näiteks, kui sul on sees oma sülearvuti või lauaarvuti kõvaketas, see on kas mehaaniline seade, mis tegelikult keerleb - seal on ümmarguse asju nimetatakse Vaagnad mis näevad välja üsna meeldib, mida ma oli just ekraanile, tõsi küll, Järjest enam on see vana kooli. See on kolme ja poole-tollise kõvakettale. Ja kolm ja pool tolli viitab kohta koos asja, kui sa seda installida arvutis. Paljud kutid oma sülearvutid nüüd on solid-state drives või SSDs, mis ei ole liikuvaid osi. Nad on rohkem nagu RAM ja vähem nagu need mehaanilised seadmed. Aga ideed on ikka sama, kindlasti kui need on seotud et probleem määratud viis. Ja kui sa mõtled nüüd kõvaketas esindab on ring, mis Ma joonistan niimoodi siin. Kui loote oma arvutist, kas see on SSD, või Sel juhul vanemad kooli kõvaketas, et fail sisaldab mitut bitti. Ütleme, et see on see 0 ja 1, terve hunnik 0. ja 1s. Nii et see on kogu mu kõvaketas. See on ilmselt päris suur fail. Ja ta kasutab kuni 0. ja 1s sel osa füüsilise vaagen. Noh, mis see on füüsiline osa? Noh, selgub, et kõvaketas, vähemalt seda tüüpi, seal need pisikesed magnet osakesi. Ja nad peavad sisuliselt põhja-ja lõunapoolusel neile, et kui te omakorda üks neist magnetilisi osakesi Sel viisil, võite öelda, et see on moodustab 1. Ja kui see on tagurpidi lõunasse põhja, siis võiks öelda, et see on esindavad 0. Nii reaalses füüsilises maailmas, mis on kuidas sa võiksid kujutada midagi binaarne seisu 0 ja 1. Nii et kõik on fail. Seal on terve hunnik magnet osakesed, mis on nende sel viisil või Sel moel, luues mustreid on 0. ja 1s. Aga selgub, salvestage fail, mõned andmed salvestatakse eraldi. Nii et see on veidi lauda kataloog, nii rääkida. Ja ma helistan selle veeru nimi ja Ma helistan selle veeru asukoht. Ja ma ütlen, arvan see on minu CV. Minu resume.doc hoitakse asukohta, ütleme 123. Ma alati minna, et number. Aga piisab, kui öelda, et nii nagu RAM, saate kõvaketta see on gigabyte või 200 GB või terabaidise ja te võite number kõik baiti. Võite nummerdada kõik tükkideks 8 bitti. Nii et me ütleme, et see on asukoht 123. Nii et see kataloog sees minu operatsioonisüsteemi süsteem mäletab, et minu CV on asukohast 123. Aga see läheb huvitavamaks, kui kustutate faili. Nii näiteks - ja õnneks enamik maailma on püütud peale seda - mis juhtub siis, kui lohistada fail oma Mac OS Prügikast või oma Windows Recycle Bin? Mis eesmärgil seda tehes? See on ilmselt vabaneda faili Aga mida see akt lohistades ja kukutades oma prügikasti või oma Prügikast teha arvutis? Absoluutselt mitte midagi, tõesti. See on nagu kausta. See on eraldi kausta, et olla kindel. Aga see tegelikult faili kustutada? Ei, sest mõned teist ilmselt olnud nagu, oh damn, sa ei teinud seda tähendab seda tegema. Nii te topeltklõps Trash või prügikasti. Sa oled torkasid ümber ja olete tagasi fail lihtsalt lohistades sealt. Nii selgelt, et see ei ole tingimata kustutamist. OK, sa oled targem. Sa tead, et lihtsalt tõmmates see Trash või prügikasti ei tähenda sa tühjendamist prügikasti. Nii et sa minna kuni menüü ja te ütlete Tühjenda prügikast või Empty Recycle Bin. Mis siis juhtub? Jah, nii see on jäetud rohkem. Aga kõik, mis juhtub on see. Arvuti unustab, kus resume.doc oli. Aga mida ei ole muutunud ilmselt pildil? Bitti 0. ja 1s, et ma väita, on kohapeal mõne füüsiline aspekt riistvara. Nad on ikka veel seal. See on lihtsalt arvuti on unustanud, mida nad on. Nii see on sisuliselt vabanenud faili bitti, nii et neid saab uuesti kasutada. Aga mitte enne, kui sa luua rohkem faile, ja rohkem faile, ja rohkem faile tahe tõenäosuslikult neid 0. ja 1s, neid magnetilisi osakesi, saada uuesti, tagurpidi või õigetpidi jaoks muid faile, 0. ja 1s. Nii et teil on see aken aeg. Ja see ei ole prognoositavate pikkus, tõesti. See sõltub suurusest oma raske sõita ja kui palju faile, mida ja kui kiiresti sa teha uued. Aga seal on see aken ajal mis et fail on ikka täiesti hüvitata. Nii et kui te kunagi kasutada programme nagu McAfee või Norton proovida taastada andmed, kõik nad teevad üritab tagasi see nn kataloogi aru saada, kus teie fail oli. Ja mõnikord Norton ja ütlevad, fail on 93% hüvitata. Noh, mida see tähendab? See tähendab lihtsalt seda, et mõne teise faili juhuslikult sattus kasutades, ütleme, need bitti välja oma algse faili. Niisiis, mis on tegelikult seotud andmete taastamise? Noh, kui sa ei ole midagi Norton eelnevalt arvutisse installitud, Parim, mida saate mõnikord tegema, on vaadata juures kogu kõvaketta otsivad mustrid bitti. Ja üks teemasid lahendamist viis on see, et sa otsida samaväärne kõvaketas kohtuekspertiisi Pilt kompaktne välklamp kaardi digikaamera, otsides 0. ja 1s, mis tavaliselt, kõrge Tõenäoliselt moodustavad algus JPEG. Ja te saate taastada need pildid, mida oletades, kui ma näen, see muster bitti kohtuekspertiisi pilt, suur tõenäosus, mis tähistab algust JPEG. Ja kui ma näen sama muster jälle et ilmselt algus, teine ​​JPEG, ja teine JPEG ja teine ​​JPEG. Ja see on tavaliselt kuidas andmete taastamise töötab. Mis on ilus umbes JPEG on isegi vormingus ise on mõnevõrra keeruline, alguses iga selline fail on tegelikult üsna äratuntavad ja lihtne, nagu te näete, kui oled seda juba teinud. Võtame lähemalt all kapuuts, mis täpselt, mida on olnud toimub ja mida need 0. ja 1s on, et anda teile natuke rohkem seoses selle konkreetse väljakutse. [VIDEO PLAYBACK] Kus teie arvuti salvestab kõige tema alaline andmed. Selleks, et andmed liiguvad RAM koos tarkvara signaale, mis ütlevad kõvaketas, kuidas säilitada, et andmed. Kõvaketas lülitused tõlkida need signaali pinge kõikumisi. Need omakorda kontrollida kõvaketta liikuvaid osi, mõned vähesed liikuvad osad jäänud kaasaegne arvuti. Mõned signaalid kontrollida mootor mis keerleb metalliga kaetud Vaagnad. Teie andmed on tegelikult salvestatud Nende Vaagnad. Muud signaalid liikuda lugeda / kirjutada pead lugema või kirjutada andmeid Vaagnad. See masin nii täpsed, et inimeste juuksed ei suutnud isegi vahel edastatavaid peade ja ketramine Vaagnad. Kuid see kõik töötab kohutav kiirusel. [END VIDEO PLAYBACK] DAVID Malan: suurendada vähe sügavam nüüd mis tegelikult on need Vaagnad. [VIDEO PLAYBACK] -Vaatame, mida me lihtsalt nägin aegluubis. Kui lühike pulss on elektri saadetakse lugeda / kirjutada pea, kui Peegeldab on väike elektromagnetiline eest sekundi murdosa jooksul. Magnet tekitab valdkonnas, mis muutused polaarsust tilluke, pisike osa metalli osakesi, mis mantel iga taldrik pind. Mustri rida neid pisikesi, laetud aladel kettal moodustab ühe natuke andmete binaarne number süsteem, mida kasutavad arvutid. Nüüd, kui praegune saadetakse üks viis läbi lugeda / kirjutada pea, ala polarisatsioon ühes suunas. Kui vool on saadetud vastupidises suunas, polarisatsiooni pöörata. Kuidas sa saad andmed kõvakettalt kustutama? Just vastupidine protsess. Nii et see on osakesed kettal et saada voolu lugeda / kirjutada pea liigub. Pane kokku miljoneid need magnetiseeritud segmentide sul on fail. Nüüd tükki ühe faili võib hajutatud üle kogu ketta Vaagnad selline nagu jama pabereid laual. Nii eriline pildi fail jälgib kohta, kus kõik on. Kas sa ei soovi sa olid midagi sellist? [END VIDEO PLAYBACK] DAVID Malan: OK, ilmselt mitte. Niisiis, kuidas paljud kutid Kasvasin üles koos nendega? OK, nii et see on vähem ja vähem käed igal aastal. Aga ma olen õnnelik, et sa oled vähemalt tuttav nendega, sest see ja meie enda raamat demo kahjuks surevad väga aeglane surm siin tundmine. Aga see on see, mida ma vähemalt tagasi keskkoolis, kasutatud kasutamise varukoopiaid. Ja see oli hämmastav, sest sa võib salvestada 1,4 megabaiti kohta see konkreetne disk. Ja see oli suur tihedus versioon mida näitab HD, mis on st enne tänast HD videod. Standard tihedus oli 800 kilobaiti. Ja enne seda oli 400 kilobaiti kettaid. Ja enne seda oli 5 ja 1/4 tollised veljed, mis olid tõeliselt floppy, ja veidi laiem ja pikem kui need asjad siin. Aga tegelikult võite näha nn floppy aspekt need kettad. Ja funktsionaalselt on nad tegelikult üsna sarnane kõvakettad juures Vähemalt seda tüüpi. Jällegi SSDs uuemad arvutid töö natuke teistmoodi. Aga kui sa liikuda, et väike metallist tab, tegelikult võite näha veidi küpsist, või vaagen. See ei ole metallist, nagu see üks. See üks on tegelikult mõned odavam plastist. Ja te saate objekti kõigutama ta. Ja olete trully lihtsalt maha pühkida mõned bittide arvu või magnetilisi osakesi selle kettale. Nii õnneks ei ole midagi selle kohta. Kui see asi on, kuidas - ja katta silmad ja teie naaber - võid lihtsalt omamoodi tõmmake see terve mantel maha niimoodi. Aga seal on vähe kevadel, et olla teadlikud, et teie silmad. Nüüd olete tõesti floppy disk. Ja mis on tähelepanuväärne selle on see, et nii palju kui see on väikesemahulise esindatus suurem kõvaketas, need asjad on super, super lihtne. Kui teil näputäis põhjas see, et nüüd, et metallist asi on välja lülitatud, ja koor neid avada, kõik on olemas on kaks tükki vilt ja nn diskett tükk metalli sees. Ja seal läheb pool minu ketta sisu. Seal läheb veel pool neist. Aga see on kõik, mis oli ketramine sees arvuti sisse Läinud. Ja jälle panna see perspektiivi, kui suur on enamiku oma kõvakettad nendel päevadel? 500 gigabaiti terabaidise, võibolla lauaarvuti, 2 TB, 3 TB, 4 TB, eks? See on üks megabait, anda või võtta, mis isegi ei sobi tüüpiline MP3 enam nendel päevadel, või mõned sarnane muusikafaili. Nii väike meene teile täna, ja Samuti aitavad contextualize mida saadame võttes iseenesestmõistetavana nüüd probleem määrata viis. Nii et need on sinu hoida. Nii et lubage mul minna, kus saab kulutada järgmise pset samuti. Nii et me oleme nüüd seatud see lehekülg - oh, paar kuulutused kiiresti. Sel reedel, kui soovite liituda CS50 Lõunaks minna tavaline koht, cs50.net/rsvp. Ja lõplik projekt - nii ühe õppekava oleme postitatud lõplik projekt spetsifikatsioon juba. Mõistma, et see ei tähenda, see on tingitud eriti kiiresti. See on postitatud, tõesti, lihtsalt saada kutid mõelda seda. Ja tõepoolest, super oluline protsent siis võidelda lõplik projektide materjalist, mida me pole isegi õppinud klassis, kuid tahe juba järgmisel nädalal. Teate küll, et spec nõuab mõned eri osade lõplik projekt. Esiteks, mõne nädala pärast on eelpakkumist, päris juhuslik kiri oma TF talle öelda või mida sa oled mõelda oma projekti, mille ei Commitment. Ettepanek on teie pühendumust, öeldes, siin on see, mida Ma tahaks teha oma projekti. Mis sa arvad? Liiga suur? Liiga väike? Kas see kontrollitav? Ja näed spec rohkem üksikasju. Paar nädalat pärast seda on olukord aruanne, mis on sarnaselt casual Kirjuta oma TF öelda, kuidas kaugele olete oma lõpliku projekti rakendamiseks, millele järgneb CS50 hackathon kus kõigil on kutsutud, mis on sündmuse 20:00 ühel õhtul kuni 7:00 AM järgmisel hommikul. Pizza, nagu ma mainisin nädal null, wil serveeritakse 09:00, Hiina toit on 01:00. Ja kui sa oled ikka ärkvel 05:00, me teid IHOPi hommikusöögiks. Nii hackathon on üks rohkem meeldejääv kogemusi klassis. Siis rakendamisel arvestatakse, ja siis climactic CS50 Fair. Rohkem infot kõigi nende aastal lähinädalatel. Aga lähme tagasi millegi vana kooli - jälle massiivi. Nii array oli tore, sest see lahendab probleemidele nagu me nägime vaid hetk tagasi õpilaste struktuurid saada natuke kontrolli alt, kui me tahad olla üliõpilane üks üliõpilane kaks, üliõpilane kolm, üliõpilane dot dot dot mingi suvaline arv õpilasi. Nii massiivid, paar nädalat tagasi, swooped ja lahendada kõik meie probleemid ei teades ette, kui palju asju teatud tüüpi me tahta. Ja me oleme näinud, et structs aitab meil Lisaks sellele korraldab meie kood ja hoida kontseptuaalselt sarnased muutujad, nagu nimi ja maja koos, nii et me ravib neid ühe üksuse sees mida on väiksemateks tükkideks. Aga massiivid mõned puudused. Millised on mõned puudused oleme kokku puutunud massiivid siiani? Mis see on? Kindla suurusega - nii, kuigi sa võiksid võimalik mälu eraldada massiiv, kui sa tead, kui palju õpilasi sul on, kui palju märke, mida kasutaja, kui olete eraldatud massiiv, sa oled omamoodi värvitud ise nurka. Sest sa ei saa lisada uusi elemente keskele massiivi. Sa ei saa lisada rohkem elemente lõpus massiivi. Tõesti, sa pead kasutama luua täiesti uue massiivi, nagu me oleme arutanud, kopeerides vana uude. Ja veel, see on peavalu, mis GetString tegeleb teile. Aga jälle, sa ei saa isegi sisestada midagi keskele massiivi kui intressimäär ei ole täielikult täidetud. Näiteks, kui see array siin suuruse kuus on ainult viis asju see, Noh, sa võiksid lihtsalt tack midagi peale lõpuni. Aga mis siis, kui soovite lisada midagi keskele massiiv, kuigi see võib olla viis kuuest asjad on? Noh, mida me teeme, kui meil oli kõik meie Vabatahtlikel laval in nädalat varem? Kui me tahtsime panna keegi siin, kas need inimesed, kuidas liikuda selles viis, või need inimesed, kuidas liikuda selles Nii, ja mis sai kallis. Suunates inimesi sees array sattus liitmise ja maksumus meile aega, seega palju meie n ruudus töötab korda nagu sisestamise sorteerida jaoks Näiteks kõige halvemal juhul. Nii massiivid on suurepärane, kuid sa pead ette teada, kui suur sa tahad neid. Nii OK, siin on lahendus. Kui ma ei tea ette, kui palju üliõpilased ma võib-olla, ja ma tean, et kui Ma otsustada, kuigi ma olen ummikus, et paljud õpilased, miks ei ma lihtsalt alati eraldada kaks korda nii palju ruumi kui ma oleks vist vaja? Kas see ei ole mõistlik lahendus? Reaalselt, ma ei usu, et me oleme läheb vaja rohkem kui 50 pesa array jaoks keskmise suurusklassi niiet lihtsalt ümardada. Ma teen 100 slots minu array, lihtsalt nii et me saame kindlasti saada Õpilaste arv I oodata olla mõnes keskmise suurusklassi. Nii et miks mitte lihtsalt ümardada ja eraldama rohkem mälu jaoks tavaliselt massiivi kui te arvate, et teil võib isegi vaja on? Mis see on lihtne pushback selle mõte? Sa lihtsalt raiskad mälu. Sõna otseses mõttes iga programmi sa kirjutad siis on võib-olla kasutades kaks korda rohkem mälu kui mida sa tegelikult vajad. Ja see lihtsalt ei tunne eriti elegantne lahendus. Pealegi, see lihtsalt vähendab tõenäosus probleem. Kui juhtub, et on populaarne kursus ühe semestri ja teil on 101 üliõpilased, teie programm on veel põhimõtteliselt silmitsi sama probleemi. Nii Õnneks on lahendus Selle reklaami kõik meie probleemid kujul andmete struktuurid, mis on keerulisemad kui need, oleme näinud siiani. See, ma väita, on seotud nimekirja. See on nimekiri numbrid - 9, 17, 22, 26 ja 34 - mis on omavahel ühendatud nii mida ma joonistada nooli. Teisisõnu, kui ma tahtsin, et esindada massiiv, mida ma võiks teha midagi sellist. Ja ma panen selle õhuliini vaid hetk. Ma võiks teha - tere, eks. Oodake. Uus arvuti siin selge - Hea küll. Nii et kui mul on need numbrid array - 9, 17, 22, 26, 24 - ei pruugi skaalal. Olgu, siin on minu array - oh my god. Olgu, siin on minu massiivi. Oh my god. [Naer] DAVID Malan: Teeskle. See on liiga palju vaeva, et minna tagasi ning kinnitada, et nii on - 26. Nii et meil on see massiiv 9, 17, 22, 26, ja 34. Neile näete piinlik viga ma lihtsalt tehtud, siin see on. Nii et ma väita, et see on väga tõhus lahendus. Olen eraldatud nii palju ints nagu Mul on vaja - üks, kaks, kolm, neli, viis või kuus - ja ma olen siis salvestatud numbrid sees see massiiv. Aga oletame, siis ma tahan, et sisestada väärtus nagu number 8? Noh, kus see kadus? Oletame, ma tahan lisada näiteks 20. Noh, kus see kadus? Kusagil keskel, või number 35 on minna kusagil lõpus. Aga ma olen kõik välja ruumi. Ja nii see on peamine väljakutse massiivid, mis on lahendus. Ma väitsid hetk tagasi getString lahendab selle probleemi. Kui soovite lisada kuues number sellesse massiiv, mis on vähemalt üks lahendus saab toetuda kindel, nagu me teeme getString? Mis see on? Noh, oleks suurem on kergem öelda kui teha. Me ei saa tingimata teha massiivi suurem, kuid see, mida me saame teha? Tee uus massiiv, mis on suurem, suurus 6, või ehk suurus 10, kui me tahame saada edasi asju, ja siis kopeeri vana massiivi uude ja seejärel tasuta vana massiivi. Aga mis on sõiduaega nüüd selle protsessi? See on suur O n, sest kopeerimise läheb maksma teile mõned üksused aega, nii et ei ole nii ideaalne, kui meil eraldama uue massiivi, mis läheb tarbida kaks korda nii palju mälu ajutiselt. Kopeeri vana uutesse - Ma mõtlen, et see on lihtsalt peavalu, mis on jällegi miks me kirjutasime GetString teile. Niisiis, milline võiks teeme selle asemel? Noh, mis siis, kui meie andmestruktuur tegelikult on lüngad on? Oletame, et ma lõõgastuda minu eesmärk, mille külgnevas tükkideks mälu, kus 9 on kohe 17, mis on kõrval 22, ja nii edasi. Ja arvan, et 9 saab üle siin RAM ja 17 saab siin RAM, ja 22 saab siin RAM. Teisisõnu, ma ei vaja neid isegi seljad enam. Ma pean kuidagi niit nõela läbi kõik need numbrid, või iga sõlmed, nagu me helistame ruudustiku Olen viinud nad, et mäleta, kuidas saada viimane selline sõlm alates esimesest. Mis on programmeerimine ehitada oleme näinud üsna hiljuti, kellega ma saab rakendada, et niit, või tõdeda, kellega ma ei rakendada need nooled? Nii viiteid, eks? Kui ma eraldada mitte ainult int, kuid sõlm - ja sõlm, ma lihtsalt tähendab konteiner. Ja visuaalselt, ma mõtlen ristkülik. Nii sõlme ilmselt vajab sisaldab kaks väärtust - int ise, ja siis, kui sellele viitab põhja pool ristküliku piisavalt ruumi int. Nii lihtsalt mõtlemine siin kui suur on see sõlm, see konteineri? Mitu baiti int? Arvatavasti 4, kui see on sama nagu tavaliselt. Ja siis, kui palju baite jaoks pointer? 4. Nii pakendit või seda sõlme, on saab olema 8 baidi struktuur. Oh, ja see on õnnelik juhus, et me lihtsalt sisse see mõiste struct või C struktuuri. Nii et ma väita, et ma tahan, et astuda samm suunas see keerukamaid rakendamise numbrite loendi, seotud numbrite loendi, mida ma pean tegema veidi mõtlemist, kuni ees ja deklareerima mitte ainult int, kuid struct et ma helistan harilikult siin, sõlme. Me võiksime seda nimetada midagi tahame, kuid sõlm saab olema temaatiliselt palju asjad, mida me hakata otsima nüüd. Toas et sõlm on int n. Ja siis see süntaks, veidi imelik esmapilgul - struct tipp * järgmine. Noh piltlikult, mis see on? See on põhja pool ristkülik, mida me nägime hetk tagasi. Aga miks ma öelda struct tipp * mitte lihtsalt sõlme *? Sest, kui kursor on suunaga teises sõlme, see on lihtsalt aadress sõlme. See on kooskõlas sellega, mida me oleme arutlesid suunanäitajaks siiani. Aga miks, kui ma väidavad, et see struktuur on nimetatakse sõlm, ma pean ütlema, struct sõlm sees siin? Täpselt. See on omamoodi loll tegelikkus C. Typedef niiöelda, ei ole veel juhtunud. C on super sõnasõnaline. Ta loeb oma kood ülevalt alla, vasakult paremale. Ja kuni see tabab, et semikooloniga Alumine rida, arvan, mida ei eksisteerida andmetüüp? Sõlme, tsitaat lõppeb sõlme. Aga kuna rohkem verbose deklaratsiooni tegin esimesel real - typedef struct tipp - sest et tulid, enne looksulg, see on omamoodi nagu eelnevalt harida rõkkama, et sa Tead, mulle struct nimetatakse struct sõlme. Ausalt, ma ei meeldi kutsudes asjad struct sõlme, struct sõlme kõik kogu mu koodi. Aga ma kasutama seda ainult üks kord, vaid sees, nii et ma ei saa tõhusalt luua omamoodi ringviite, ei kursor ise per se, kuid kursor teise sama tüüpi. Nii selgub, et on andmestruktuur nagu see, seal on vähe toimingud, mis võiksid olla meid huvitab. Me võiksite sisestada arvesse nimekiri niimoodi. Meil võite kustutada loendist niimoodi. Me võiksite otsida nimekirja väärtus, või üldisemalt, Traverse. Ja Traverse on lihtsalt fancy viis öeldes alguse vasakult ja liigutada kõik tee paremale. Ja teate, isegi see veidi rohkem keerukamaid andmete struktuuri, andke mulle ettepaneku, et me saame laenata ideed viimase kahe nädala jooksul ja rakendada funktsioon nimega otsida niimoodi. Ta läheb tagasi true või vale, märkides, jah või ei, n on nimekirjas. Tema teine ​​argument on viit nimekirja ise, kursor sõlme. Ma lähen siis teha, on tunnistada ajutise muutuja. Me nimetame seda ptr Kokkuleppeliselt jaoks pointer. Ja ma määrata see võrdub loetelu alguses. Ja nüüd teate samas silmus. Nii kaua, kui kursor ei ole võrdne tühjaks, ma lähen, et kontrollida. Kas pointer nool n võrdne n, mis võeti vastu? Ja oodake minut - uus tükk süntaks. Mis on nool äkki? Jah? Täpselt. Nii et mõned minutid tagasi, me kasutasime dot märke juurde midagi seest struktuure, kui muutuja olete ei struct ise, kuid kursor struktuure, õnneks tükk süntaks et lõpuks muudab intuitiivne tunne. Nool tähendab, et jälgida pointer, nagu meie nooled tavaliselt tähendab piltlikult, ja minna Andmeväljal sees. Nii nool on sama asi nagu täpp, kuid sa seda kasutada, kui teil on pointer. Nii lihtsalt sulgege siis, kui n valdkonnas sees struct nimetatakse pointer võrdub võrdub n, tagastab true. Muidu see joon siin - pointer võrdub osuti edasi. Niisiis, mida see teeb, teate, on see, kui ma olen praegu osutavad struct sisaldab 9 ja 9 ei ole number Ma otsin - arvan, et ma otsin n on võrdne 50 - Ma lähen uuendada oma ajutise pointer mitte juhtida seda sõlme enam, kuid osuti noolt, mis läheb pani mind siia. Nüüd sain aru, on keeristorm sissejuhatus. Kolmapäeval, me tegelikult seda teha mõned inimesed ja mõned veel kood aeglasemas tempos. Aga aru saama, et me nüüd teeme oma andmed struktuurid keerulisemaks, nii et meie algoritme saab tõhusamaks, mis saab olema eelduseks pset kuus, kui me koormus jälle need 150.000 sõnad, kuid pead tegema nii tõhusalt, ja ideaalis luua programm, mis töötab meie kasutajatele ei lineaarne, mitte n ruuduga, kuid pidev aega, ideaalne. Näeme kolmapäeval. Ettekandja: Järgmisel CS50, David unustab oma tugipunkti. DAVID Malan: Ja see, kuidas te saadate sõnumid C. Mida - [ERI SMS: TEADE SOUNDS]