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