DAVID Malan: Allt í lagi, velkominn aftur. Þetta er CS50. Þetta er upphaf viku sjö. Svo það hefur verið smá stund, þannig að ég hélt að við myndum taka vindbylur skoðunarferð um hvar við horfið og þar sem við erum nú að fara. Svo þetta hér gæti hafa valdið nokkrum angst í fyrstu. En vonandi, þú ert að byrja að aðlagast hvað þetta táknar hér - stjörnu fulltrúi músina, sem er bara hvað, hvað meira leikmaður? Svo það netfang. Svo er það heimilisfang eitthvað í minni. Og við byrjuðum að afhýða aftur lag a par af vika fyrir, eins og það GetString og aðrar slíkar aðgerðir allan þennan tíma hafa verið aftur heimilisföng hlutum í minni, eins og heimilisfang á fyrsta staf í sumir röð. Þannig að við kynntum líka valgrind, sem þú munt byrja að nota fyrir þetta vandamál stilla, sérstaklega fyrir næsta Vandamálið sett sem vel. Og valgrind gerir hvað fyrir okkur? Það stöðva fyrir leka minni og það einnig stöðva fyrir misnotkun af minni. Það getur, með nokkrum líkindum, uppgötva ef númerið þitt er að fara að snerta minni að það ætti einfaldlega ekki. Svo ekki endilega leka, en ef þú fara út fyrir mörk sum array, og þú keyrir í raun valgrind og valdið því að hegðun á meðan valgrind er í gangi í forritinu er gangi innan þess, munt þú fá skilaboð eins og þetta - "ógilt skrifa um stærð 4, "sem muna nokkra vikur þýddi síðan að ég hafði óvart eins og á einum int of langt út fyrir mörk fylki. Og svo þýðir stærð 4 hér stærð af viðkomandi int. Svo taka fullvissu í þeirri staðreynd að valgrind er framleiðsla, the snið af henni, er bara grimmilegur. Það er mjög erfitt að sjá í gegnum óreiðu fyrir fróðleik. Svo það sem við höfum gert hér er bara útdráttur sumir af þeim meira áhugaverðar línur. En ljóst að 80% af er valgrind framleiðsla er að fara til vera a hluti af a truflun. Bara leita að mynstrum eins og þessir - öryrki rétt, öryrki lesa, 40 bæti og sumir tala af blokkum eru örugglega glatað, leitarorð eins og þessi. Og það sem þú munt vonandi sjá er einhver konar ummerki um hvað hlutverk mistök er í raun inn Í þessu tilfelli hér, í hvaða línu númerið mitt var villa virðist? 26 í skrá sem kallast memory.c, sem var dæmi sem við vorum að spila með á þeim tíma. Svo það er sennilega ekki í malloc. Það var líklega í númerið mitt í staðinn. Þannig að við munum sjá þetta aftur og aftur áður en langur. Svo Scanf, þetta kom upp í par af myndum svona langt. Við sáum sscanf stuttlega. Það var eitthvað að tala um þú kafa inn í þínum undirbúningur fyrir próf. Og scanf er í raun það sem CS50 Bókasafnið er verið að nota undir hlutanum hetta fyrir alveg einhvern tíma í röð til að fá inntak frá notandanum. Til dæmis, ef ég að færa yfir á CS50 tæki hér, láta mig opna upp dæmi í dag sem heitir scanf-0.c Og það er frábær einfalt. Það er bara nokkrar línur af kóða. En það sýnir í raun hvernig GetInt hefur verið að vinna allan tíma. Í þessari áætlun hér, í línu 16. , Eftir því að ég staðfesti við int. Þannig að ekki ábendingum, ekkert dularfullur það, bara int. Þá í línu 17, hvetja ég notandi fyrir a tala, vinsamlegast. Þá í lok 18., ég nota scanf hér. Og ég tilgreint, góður af eins og printf, að ég von vitna Unquote prósent i. Sem prósent i, að sjálfsögðu, táknar við int. En taka eftir hvað annað rök til Scanf er. Hvernig myndir þú lýsa seinni rök eftir kommu? Hvað er það? Það er heimilisfang x. Svo er þetta að gagni vegna með því að veita scanf með heimilisfang x, hvað gerir að styrkja að virka að gera? Ekki bara fara þangað, en einnig að gera hvað? Gera breytingu á henni. Þar sem þú getur farið þangað, er það svoleiðis eins korti til stað í minni. Og svo lengi sem þú gefur scanf eða allir virka með svona korti, sem aðgerð getur farið þarna, og ekki aðeins líta á verðmæti, en það getur einnig breyta því gildi, sem er gagnlegt ef tilgangur í lífi Scanf er að skanna inntak frá notanda, sérstaklega frá lyklaborðinu. Og F táknar sniðinn, rétt eins og printf, f táknar forsniğinn band sem þú vilt prenta. Svo í stuttu máli, þetta lína 18. einfaldlega segir, reyna að lesa int frá notanda er lyklaborð og geyma það inni í x, á hvað tölu x gerist að lifa á. Og svo loks, lína 19 bara segir, takk fyrir int, í þessu tilfelli. Svo láta mig fara á undan og gera þetta. Svo gera scanf 0. Leyfðu mér að fara á undan og zoom inn Ég fer og hlaupa þetta með punktar rista scanf 0. Fjöldi, vinsamlegast? 50. Takk fyrir 50.. Svo það er alveg einfalt. Nú hvað er það að gera ekki? Það er ekki að gera í heild búnt af stöðva villa. Fyrir dæmi, ef ég vinna ekki, og ég ekki tegund í fjölda, en staðinn ég skrifa eitthvað eins og "halló" það er bara svo skrítið. Og svo einn af þeim hlutum sem CS50 Safnið hefur verið að gera fyrir okkur í sumar tími er að reprompting og reprompting. The retry setningu muna var í cs50.c, og það er ástæðan að GetInt í The CS50 bókasafn er í raun allt fullt af línum langur, vegna þess að við erum stöðva fyrir heimskur efni eins og this. Did the notandi að gefa ekki okkur, í raun er int? Gerði hann eða hún að gefa okkur eitthvað eins stafrófsröð bréf? Ef svo er, viljum við að uppgötva sem og æpa á hana. En það fá meira áhugavert í þessu næsta dæmi. Ef ég fer til Scanf-1.c, hvað er sá hlutur sem er í grundvallaratriðum breytt í Þessi næsta dæmi? Ég er að nota char *, auðvitað, í stað þess að heiltala. Svo er þetta áhugavert, því char *, muna, er í raun bara sama og band. Svo mér finnst eins og kannski er þetta frábær einföld framkvæmd GetString. En ég hef skrældar aftur lag af CS50 bókasafn, þannig að ég er kalla þetta char * núna. Svo skulum sjá hvar, ef einhvers staðar, við förum rangt. Line 17 - Ég segi aftur, vinsamlegast gefa mér eitthvað, í þessu tilfelli, a band. Og síðan í næstu línu, kalla ég scanf, aftur, gefur það snið númer, en í þetta prósent tíma s. Og þá í þetta sinn, ég gefur það biðminni. Nú taka, ég er ekki að nota The merkið. En hvers vegna er það líklega í lagi hér? Því það er biðminni þegar? Það er nú þegar bendillinn. Það er nú þegar tölu. Og við skulum þetta orð "rugla," láttu mig bara kalla það s, til dæmis, til að einfaldleiki. En ég hef kallað það biðminni því í almennt, í forritun, ef þú hafa a klumpur af minni, sem band í raun bara er, gætir þú kalla það biðminni. Það er staður til að geyma upplýsingar. Líkur á hlutum eins og YouTube, þegar þeir höggdeyfir, svo að segja, að þýðir bara að það er að sækja bita úr Netið og geyma þá í sveitarfélaga array, sveitarstjórn klumpur af minni svo að þú getur horft á það seinna án það skipstjóri eða hanga á þú meðan spila aftur. Þannig að það er vandamál hér þó, vegna þess að ég ætla að segja scanf, búast band frá notandanum. Hér er heimilisfang bútur af minni. Settu band þar. Hvers vegna er það bundið að gefa okkur vandræði, þó? Hvað er það? Er ég aðgang að að hluti af minni? Þú veist, ég veit það ekki. Vegna hefur biðminni verið forsniðin til nokkuð? Ekki raunverulega. Og svo er það það sem við höfum verið að hringja sorp gildi, sem er ekki formleg orð. Það þýðir bara að við höfum ekki hugmynd um hvað bits eru inni af þessum fjórum bytes sem Ég hef úthlutað sem biðminni. Ég hef ekki kallað malloc. Ég hef örugglega ekki kallað GetString. Svo hver veit hvað er í raun inni biðminni? Og enn segja scanf blindni, að fara þangað og setja hvað sem notandinn slegið. Svo er það líklegt til að valda í númerið okkar ef við keyra það? Líklega segfault. Kannski ekki, en sennilega segfault. Og ég segi kannski ekki vegna þess að stundum þú gerir, stundum þú færð ekki segfault. Stundum þú færð bara heppinn, en það er engu að síður að fara að vera padda í kerfi okkar. Svo láta mig fara á undan og taka saman þetta. Ég ætla að gera það gamla skólanum. Sem clang þjóta 0, scanf-1, scanf-1.c, Enter. Oops líka gamall skóli. Við skulum sjá. Hvar gerði ég farið? Ó, char * biðminni. Ó, þakka þér - Vista, OK - mjög gamall skóli. Allt í lagi, það er verið meðan. Svo ég hef bara vistað skrána eftir gera það tímabundið breyta smá stund síðan. Og nú hef ég tekið saman það handvirkt með Clang. Og nú ætla ég að fara á undan og hlaupa Scanf-1, Enter. String vinsamlegast. Ég tegund í "halló." Og nú, hér er þar, hreinskilnislega, printf getur er svolítið pirrandi. Það er í raun ekki að fara að segfault í þessu tilfelli. Printf er svolítið sérstakt því það er svo frábær algengt að meginatriðum printf er að gera okkur greiða og átta, það er ekki gild músina. Leyfðu mér að taka það á mig að bara prenta í sviga null, jafnvel þó það er ekki endilega það við sjálf ráð. Svo við getum í raun ekki auðveldlega valdið segfault við þetta, en greinilega þetta er ekki hegðun sem ég vildi. Svo er það einföld lausn? Jæja, í Scanf-2, láta mig leggja til að í stað þess að í raun bara að úthluta á char *, láttu mig vera a lítill betri um þetta og láta mig úthluta biðminni sem röð af 16 tákn. Svo ég get gert þetta á nokkra vegu. Ég gæti alveg notað malloc. En ég get farið aftur að viku tvö þegar Ég þurfti bara a heild búnt af stafir. Það er bara fylki. Svo láta mig endurskilgreina staðinn biðminni að vera fylki af 16 stöfum. Og nú, þegar ég fara biðminni í - og þetta er eitthvað sem við gerðum ekki tala um í viku tvö - en þú getur meðhöndla array sem þó það er heimilisfang. Tæknilega, eins og við höfum séð, þá eru þeir svolítið öðruvísi. En scanf mun ekki huga ef þú gefa það heiti fylki, vegna þess hvað Clang vilja gera fyrir okkur er fyrst og fremst meðhöndla nafn þess array sem er heimilisfang klumpur af 16 bæti. Svo er þetta betra. Þetta þýðir nú að ég get vonandi gera eftirfarandi. Leyfðu mér að súmma út í smá stund og gera það Scanf-2, unnin OK. Nú láta mig gera got skástrik scanf-2. String vinsamlegast. "Halló." Og það virtist virka í þetta sinn. En getur einhver leggja atburðarás þar sem það gæti ekki enn vinna? Já? Eitthvað lengri en 16 stafir. Og í raun, við getum verið svolítið nákvæmari. Eitthvað lengur þá 15 stafir, því virkilega að við þurfum að hafa í huga að við þurfum að sviga núll óbeint í lok band, sem er til hliðar scanf yfirleitt annast fyrir okkur. Svo láta mig gera eitthvað eins - Stundum getum við bara láta það svona. OK, þannig að við höfum nú völdum skiptingu kenna. Hvers vegna? Vegna þess að ég gafst meira en 15 stafir, og svo höfum við í raun snert minni sem ég reyndar ætti ekki að hafa. Svo er það virkilega lausnin hér? Jæja, hvað ef við þurfum lengri streng? Jæja, gerum við kannski 32 bæti. Jæja, hvað ef það er ekki nógu lengi? Hvað um 64 bæt? Hvað ef það er ekki nógu lengi? Hvað um 128 eða 200 bæt? Hvað er raunverulega lausnin hér í almenn mál, ef við vitum ekki í fram það sem notandinn er að fara að slá? Það er bara svona stór verk í rass, til að vera heiðarlegur, sem er ástæða þess að CS50 Safnið hefur nokkrar línur tugi af númer sem saman koma GetString streng á þann hátt sem við gerum ekki að vita fyrirfram hvað notandinn er að fara að slá. Einkum, ef þú lítur til baka á cs50.c frá tveimur vikum síðan, munt þú sjá að GetString þýðir í raun ekki nota scanf á þennan hátt. Frekar les það einn staf í einu. Vegna þess að einn ágætur hlutur óður lesa einn staf er við getum tryggja okkur alltaf hafa að minnsta kosti einn bleikju. Ég get bara lýst sem bleikju, og síðan taka þessir sannarlega barn skref til bara lesa einn staf í á á tími frá lyklaborðinu. Og þá, hvað þú munt sjá GetString gerir er í hvert skipti sem það rennur út af, segja, 16 bæti af minni, notar það malloc, eða bræðrungi þar af, til úthluta fleiri minni, afrita gamla minni í nýja, og þá skríða eftir, að fá einn staf í einu, og þegar það rennur út af því klumpur af minni, kastar það í burtu, grípur stærri klumpur af minni, afrit gamall í nýjum og endurtekur. Og það er sannarlega verk að raunverulega framkvæma eitthvað eins einfalt og fá inntak frá notanda. Svo þú getur notað scanf. Þú getur notað aðrar svipaðar aðgerðir. Og mikið af kennslubókum og á netinu dæmi gera, en þeir eru allir viðkvæm vandamál eins og þetta. Og að lokum, fá segfault er eins konar pirrandi. Það er ekki gott fyrir notandann. En í versta falli, hvað þýðir það setti grundvallaratriðum þinni kóða í hættu á að? Einhvers konar árás, hugsanlega. Við ræddum um eitt slíkt árás - barmafullur stafla. En almennt, ef þú hefur heimild til flæða biðminni, eins og við gerðum á Tveimur vikum síðan, með bara að skrifa meira en "halló" á mánudaginn, þú getur örugglega tekið yfir, hugsanlega, að tölva, eða að minnsta kosti að fá á gögnum sem ekki tilheyrir þér. Svo í stuttu máli, þetta er þess vegna sem við höfum þá þjálfun hjól. En nú, byrjum við að taka þá burt, eins og áætlanir okkar ekki lengur þörf, endilega, inntak frá notanda. En um er að ræða vandamál að stilla sex, inntak þitt mun koma frá a gríðarstór orðabók skrá með 150 sum stakur þúsund orð. Svo þú þarft ekki að hafa áhyggjur handahófskennt notandans inntak. Við munum gefa þér nokkrar ályktanir um að skrá. Einhverjar spurningar um ábendingum eða Scanf eða notandi inntak almennt? Allt í lagi, svo a fljótur líta svo á einn slóð efni frá tveimur vikum síðan. Og það var þetta hugmynd af strúktúr. Ekki það - þetta hugmyndinni um strúktúr sem var hvað? Hvað gerði strúktúr gert fyrir okkur? Skilgreina - leitt? Skilgreina breytu tegund. Svo raða á. Við erum í raun að sameina tvo hluti. Svo með typedef, muna að við getum lýsa tegund af okkar eigin, eins og samheiti, eins og band fyrir char *. En nota typedef og strúktúr, getum við búa sannarlega eigin gögn okkar mannvirki. Fyrir dæmi, ef ég fer aftur í gedit hér fyrir réttlátur a augnablik, og ég fara á undan og gera eitthvað eins og láta mig spara þetta sem, við skulum segja, structs.c tímabundið, ég er bara að fara að fara á undan og fela standardio.h, int helstu ógilt. Og svo hér, geri ráð fyrir að ég vil að skrifa forrit sem geymir margar nemendur frá mörgum hús, til dæmis. Svo það er eins registrarial Skráð af einhverju tagi. Þannig að ef ég þarf að nefna eina nemandi, ég gæti gert eitthvað eins char * nafn, og ég ætla að gera eitthvað eins og - reyndar, við skulum nota CS50 bókasafn fyrir aðeins augnablik til að gera þetta lítið einfaldari, þannig að við getum fengið lánað þá heilmikið af línum af kóða. Og við skulum bara halda það einfalt. Við munum halda það band, og nú GetString. Svo ég halda nú að ég hef geymt nafn einhvers nemanda, og hús sumir nemandi, einfaldlega með því að nota breytur eins og við gerðum og í viku eitt. En geri ráð fyrir Ég vil nú til að styðja margar nemendur. Allt í lagi, þannig að eðlishvöt mín eru að gera band viðfang2, fær GetString, band house2 fær GetString. Og þá þriðju nemandi okkar, skulum gera NAME3 GetString. Allt í lagi, þannig að þetta er vonandi sláandi þú sem konar heimskur, því þetta ferli er í raun aldrei að fara að enda, og það er bara að fara að gera númerið mitt líta verr og verri og verri. En við leyst þetta líka í viku tvö. Hvað var tiltölulega hreint lausn okkar þegar við höfðum margar breytur af sömu gögn gerð sem eru allar tengdar, en við vildum ekki þetta grimmilegur óreiðu af álíka heitir breytur? Hvað gerði við gerum í staðinn? Þannig að ég held að ég heyrði á nokkrum stöðum. Við höfðum fylki. Ef þú vilt mörg tilvik af eitthvað, hví ekki við að hreinsa þetta allt upp og bara segja, gefa mér array kallað nöfn? Og nú, við skulum harður kóða 3. Og þá gefa mér annað array kallað hús, og láta mig nú hart kóða 3.. Og ég hef gegnheill hreinsa upp óreiðu sem ég bjó bara. Nú hef ég enn harður á dulmáli 3, en jafnvel The 3 gæti virk koma frá notandi, eða argv, eða þess háttar. Svo er þetta nú þegar hreinni. En hvað er pirrandi um þetta er að nú, jafnvel þótt nafn er einhvern veginn grundvallaratriðum í tengslum við nemandans hús - það er nemandi sem ég virkilega langar til að tákna - Ég hef nú tvær fylki sem eru samsíða í þeim skilningi að þeir eru að sömu stærð og nöfn krappi 0 væntanlega kort í hús krappi 0, og nöfn krappi 1 kort til húsa krappi 1. Í öðrum orðum, að nemandi býr í að hús og hinn nemandi býr í hinu húsinu. En örugglega þetta gæti verið gert enn meira hreinlegur. Jæja, það er hægt, í raun. Og láta mig fara á undan og opna upp structs.h, og þú munt sjá þessa hugmynd hér. Takið eftir að ég hef notað typedef, eins og þú kennd við stund síðan að lýsa okkar eigin gögn tegund. En ég er líka að nota þetta annað leitarorð kallað strúktúr sem gefur mér nýja gögn uppbygging. Og þessi gögn uppbygging ég kröfu er að fara að hafa tvennt inni það - band nefndi, og a band heitir hús. Og nafn sem ég ætla að gefa til Þessi gögn uppbygging er að fara að vera kölluð nemandi. Ég gæti kalla það eitthvað sem ég vil, en þetta gera merkingu vit í mér í huga mínum. Svo nú, ef ég opna betri útgáfa af verkefninu sem ég byrjaði að skrifa þar, láta mig fletta að ofan. Og það er einhver fleiri línur af kóða hér, en láta mig leggja áherslu að stund á einn. Ég hef lýst fastann nemendur og harður dulmáli 3 fyrir nú. En nú, eftir því hvernig hreint númerið mitt byrjar að fá. Í samræmi 22, ég staðfesti array nemenda. Og eftir því að nemandinn er greinilega nú a gögn tegund. Vegna efst er af þessari skrá, taka Ég hef sett það haus skrá sem ég dró upp bara í smá stund síðan. Og það hausaskrár einfaldlega hafði Þessi skilgreining á nemanda. Svo nú hef ég búið til eigin sérsniðið mínum gögnum gerð sem höfundar C ár síðan ekki hugsa um fyrirfram. En ekkert vandamál. Ég get gert það sjálfur. Svo er þetta fylki heitir nemendur, hvert aðildarríki, sem er nemandi uppbyggingu. Og ég vil þrjár af þeim í fylkinu. Og nú, hvað þýðir restin af þessu forriti að gera? Ég þarf eitthvað svolítið handahófskennt. Svo frá netinu 24 og áfram, I iterate frá 0 til 3. Ég spyr þá notanda að nemandans nafn. Og þá er ég nota GetString eins og áður. Þá spyr ég um hús nemandans, og ég nota GetString eins og áður. En tilkynning - örlítið ný stykki af setningafræði - Ég get enn vísitölu til ég-th nemanda, en hvernig fæ ég á ákveðin gögn sviði inni í strúktúr? Jæja, hvað er greinilega ný stykki af setningafræði? Það er bara punktur rekstraraðila. Við höfum í raun ekki séð þetta áður. Þú hefur séð það í pset fimm ef þú hefur kafa í þegar við punktamynd skrá. En punktur þýðir bara inni þetta struct eða fleiri sviðum, gefa punkt nafn, eða gefa mér punktur hús. Það þýðir að fara inn að struct og fá þá einkum sviðum. Hvað þýðir restin af þessu forriti að gera? Það er ekki allt sem kynþokkafullur. Takið eftir að ég iterate frá 0 til 3 aftur, og ég skapa einfaldlega English setningu eins og svo og svo er í svo og svo hús, sem liggur í punktur nafni frá i-ta nemandi og þeirra hús eins vel. Og svo loks, nú munum við byrja að fá anal um þetta, nú þegar við erum þekkja hvað malloc og aðrar aðgerðir hafa verið gera allan þennan tíma. Hvers þarf ég að losa bæði nafn og hús, jafnvel þó að ég ekki kalla malloc? GetString gerði. Og það var óhrein lítið leyndarmál fyrir nokkrar vikur, en GetString hefur verið lekur minni allan setja öll önn svona langt. Og valgrand mun að lokum sýna okkur þetta. En það er ekki stór samningur, því að ég veit að ég get einfaldlega losa nafn og húsið, þótt tæknilega, til vera frábær, frábær öruggt, ætti ég að vera gera sumir villuprófun hér. Hvað eru eðlishvöt að segja þér? Hvað ætti ég að vera leita áður en ég losa hvað er band, aka sem char *? Ég ætti virkilega að skoða ef nemendur krappi ég punktur nafn ekki jafnt null. Þá verður allt í lagi að fara á undan og frjáls sem músina, og sama eða annan einn eins vel. Ef nemendur krappi ég punktur húsið er ekki jöfn null, þetta nú mun vernda gegn horninu ræða sem GetString skilar eitthvað eins null. Og við sáum í smá stund síðan, printf mun vernda okkur upp hér með bara að segja null, sem er að fara að líta undarlegt. En að minnsta kosti það mun ekki segfault, eins og við höfum séð. Jæja, láttu mig gera eitt annað hlutur hér. structs-0 er góður af a heimskur program því ég inn allar þessar upplýsingar, og þá það er glatað þegar forritið lýkur. En láta mig fara á undan og gera þetta. Leyfðu mér að gera í flugstöðinni gluggi svolítið stærri. Leyfðu mér að gera structs-1, sem er ný útgáfa af þessu. Ég zoom í smá. Og nú láta mig hlaupa punktur rista structs-1. Nemandans nafn - David Mather, við skulum gera Rob Kirkland, skulum gera Lauren Leverett. Hvað er áhugavert nú er tilkynning - og ég veit bara þetta vegna þess að Ég skrifaði forrit - það er skrá nú á núverandi minn skrá sem heitir students.csv. Sumir af þú might hafa séð þessir í hinum raunverulega heimi. Hvað er CSV skrá? Kommum gildi. Það er tegund af eins og fátækur maður er útgáfa af Excel skrá. Það er borð af línum og dálkum sem þú getur opnað í forriti eins og Excel, eða númer á Mac. Og ef ég opna þessa skrá hér á gedit, tilkynningu - og tölurnar eru ekki þarna. Það er bara gedit segja mér línu númer. Tilkynning á fyrstu línu í Skráin er Davíð og Mather. Næsta lína er Rob kommu Kirkland. Og þriðja línan er Lauren komma Leverett. Svo hvað hef ég búið til? Ég hef nú skrifað C forrit sem raun hægt að búa tafla sem hægt er að opna með program eins og Excel. Ekki allt sem neyða gögnum, en ef þú ert miklu stærri klumpur af gögn sem þú vilt í raun og veru að vinna og gera gröf og eins og, þetta er kannski ein leið til að búa þessi gögn. Þar að auki eru CSVs í raun frábær algengar bara til að geyma einfaldar gögn - Yahoo Finance, til dæmis, ef þú færð gengi hlutabréfa í gegnum þeirra svokallaða API er ókeypis þjónusta sem gerir þér kleift að fá núverandi upp-til-the-dagsetning lager vitna fyrir fyrirtæki, þeir gefa gögnin aftur í frábær einfalt CSV sniði. Svo hvernig did við gerum það? Jæja eftir, flest þessi forrit er nánast sú sama. En taka eftir niður hér, frekar en að prenta nemendur út, á línu 35 Onward, halda ég að ég er að safna því nemendur á disk, svo að vista skrá. Svo eftir ég ætla að lýsa yfir skrá * - nú, þetta er eins konar frávik í C. Fyrir hvað sem ástæða, skrá er öllum húfur, sem er ekki eins og flestar aðrar tegundir gagna í C. En þetta er innbyggt í gögn gerð, SKRÁ *. Og ég er að lýsa bendi til a skrá, er hvernig hægt er að hugsa um það. fopen þýðir opinn skrá. Hvaða skrá þú vilt opna? Ég vil opna skrá sem ég mun geðþótta kalla students.csv. Ég gat hringt að allt sem ég vil. Og þá taka giska. Hvað þýðir annað rök til fopen meina sennilega? Hægri, W fyrir skrifa, gæti vera r fyrir lesa. Það er fyrir auka ef þú langar að bæta röðum og ekki skrifa allt hlutur. En ég vil bara að búa til þessa skrá einu sinni, þannig að ég ætla að nota vitna Unquote w. Og ég veit að aðeins frá hafa lesið skjölin eða maðurinn síðu. Ef skráin er ekki núll - með öðrum orðum, ef ekkert fór úrskeiðis þarna - láta mig iterate yfir nemendur frá 0 til 3. Og nú eftir því að það er eitthvað alltaf svo örlítið öðruvísi um línu 41 hér. Það er ekki printf. Það er fprintf að skrá printf. Svo það er að fara að skrifa í skrá. Hvaða skrá? Sá sem bendi þú tilgreinir sem fyrsta rök. Þá erum við að tilgreina snið band. Þá erum við að skilgreina hvað strengur við viljum stinga inn í fyrsta prósent s, og þá annar breytu eða seinni prósent s. Þá erum við að loka skrá með fclose. En ég losa minni eins og áður, þó Ég ætti að fara aftur inn og bæta nokkrar athuganir for null. Og það er það. fopen, fprintf, fclose gefur mér hæfni til að búa til texta skrá. Nú munt þú sjá í mengi vandamál fimm, sem felur í sér myndir, munt þú vera með tvöfaldur skrá í staðinn. En í grundvallaratriðum er hugmyndin er sú sama, jafnvel þótt aðgerðir sem þú munt sjá eru svolítið öðruvísi. Svo vindbylur ferð, en þú munt fá allt of kunnuglegt við skrá I/O-- inntak og framleiðsla - með pset fimm. Og einhverjar spurningar um fyrstu grunnatriði hér? Já? Hvað ef þú ert að reyna að losa núll gildi? Ég tel, nema frjáls hefur fengið lítið meira notandi-vingjarnlegur, getur þú hugsanlega segfault. Liggur það null er slæmt vegna þess að ég er ekki trúa frjáls þreytandi að athuga fyrir þig, vegna þess að það myndi hugsanlega vera sóun tíma til þess að gera sig til allir í heiminum. Góð spurning, þó. Allt í lagi, svo af þessu tagi fær okkur fyrir áhugaverð efni. Þema setja vandamál fimm er réttar. Að minnsta kosti það er hluti á vandamálinu setja. Réttar vísar almennt til endurheimt upplýsingar sem kunna eða má ekki hafa verið eytt vísvitandi. Og svo ég hélt ég myndi gefa þér fljótur bragð af því sem er raunverulega að gerast á öllum í þetta sinn undir því hetta á tölvunni þinni. Fyrir dæmi, ef þú ert inni á þínum laptop eða skrifborð tölva á harður ökuferð, það er annað hvort vélbúnaðar tæki sem raunverulega spænir - það er hringlaga hlutum sem kallast fat sem líta eins og alveg það sem ég bara hafði upp á skjánum hér, þó þetta er sífellt gamla skólanum. Þetta er þriggja-og-a-helmingur-tomma harður ökuferð. Og þrjú og hálft tommu vísar á með af hlutur þegar þú setur það í tölvu. Margir af þú krakkar á fartölvur þinn núna hafa solid-ástand ökuferð, eða SSDs, sem hafa enga hreyfanlega hluti. Þeir eru meira eins og RAM og minna eins þessi vélrænni tæki. En hugmyndir eru enn á sama, vissulega eins og þeir tengjast til Heimadæmi fimm. Og ef þú hugsar um nú harður ökuferð táknar að vera hring, sem Ég teikna svona hér. Þegar þú býrð til skrá á tölvunni þinni, hvort sem það er SSD, eða í þetta mál, eldri skóli disknum, þessi skrá nær marga bita. Skulum segja að það er þetta 0 og 1, a heild búnt af 0s og 1s. Svo er þetta allt disknum mínum. Þetta er greinilega mjög stór skrá. Og það er að nota upp 0s og 1s á að hluti af líkamlegu fati. Jæja, hvað er að líkamleg hluti? Jæja, það kemur í ljós að á disknum, amk af þessu tagi, það er þessi litla segulmagnaðir agnir. Og þeir hafa í raun norður og suðurskautið þeim, þannig að ef þú snúa einn af þeim segulmagnaðir agnir Þannig gætir þú sagt að það er fulltrúi 1. Og ef það er á hvolfi suður til norður, gætir þú sagt að það er fulltrúi 0. Svo í alvöru líkamlega heimi, það er hvernig þú getur táknað eitthvað í tvöfaldur ástand 0 og 1. Svo er það allt skrá er. There 'a heild búnt af segulmagnaðir agnir sem eru með þessum hætti þeirra eða þessum hætti, skapa mynstur af 0s og 1s. En það kemur í ljós þegar þú vista skrána, sumir upplýsingar eru vistaðar sérstaklega. Þannig að þetta er lítið borð, möppu, svo að segja. Og ég ætla að kalla þennan dálk nafn, og Ég kalla þetta dálk stað. Og ég ætla að segja, ætla þetta er ný minn. Resume.doc mitt er geymt í staðsetning, við skulum segja 123. Ég fer alltaf fyrir þeim fjölda. En nægja að segja að alveg eins í RAM, getur þú taka a harður ökuferð það er gígabæti eða 200 gígabæta eða Terabyte og þú getur fjöldi öll bæti. Þú getur Númer klumpur af 8 bita. Þannig að við munum segja að þetta er staðsetning 123. Svo þessari möppu inni starfa minn Kerfið man að minn byrja aftur er á stað 123. En það verður áhugavert þegar þú eyðir skrá. Svo til dæmis - og sem betur fer, af the veröld hefur veiddur á þessu - hvað gerist þegar þú dregur skrá til þinn Mac OS ruslinu eða þinn Gluggakista Recycle Bin? Hver er tilgangurinn að gera það? Það er augljóslega að losna af the skrá, en hvað gerir athöfn að draga og sleppa í ruslið eða þinn Recycle Bin gera á tölvunni? Nákvæmlega ekkert, í raun. Það er bara eins og möppu. Það er sérstakt möppu, til að vera viss. En þýðir það að eyða í raun skrá? Jæja, nei, vegna þess að sum af þú sennilega hafa verið eins, ó fjandinn, það hafið þér ekki meina að gera það. Svo þú tvöfaldur smellur á Rugl eða Recycle Bin. Þú hefur pota í kring og þú hefur náð skráin bara með því að draga það út þaðan. Svo greinilega er það ekki endilega eyða því. OK, þú ert betri en það. Þú veist að bara draga það inn í Rusl eða Recycle Bin þýðir ekki þú ert að tæma ruslið. Svo þú ferð upp í valmyndinni og þú segir Empty Trash eða Empty Recycle Bin. Þá gerist það? Já, svo það er eytt meira svo. En allt sem gerist er þetta. The tölva gleymir hvar resume.doc var. En hvað hefur ekki breyst greinilega í myndinni? Bita, eru 0s og 1s sem ég kröfu á staðnum sumir líkamlegur þáttur vélbúnaður. Þeir eru enn þarna. Það er bara hefur tölva gleymt hvað þeir eru. Svo það er í raun leystur skrá er bita svo að þeir geti verið endurnýtt. En ekki fyrr en þú býrð fleiri skrár, og fleiri skrár, og fleiri skrár verða probabilistically, þá 0s og 1s, þessir segulmagnaðir agnir, fá endurnýta, hvolfi eða hægri hlið upp, aðrar skrár, 0s og 1s. Svo þú hefur þetta glugga tíma. Og það er ekki fyrirsjáanleg lengd, virkilega. Það fer eftir stærð harður drif og hversu margar skrár sem þú þarft og hversu fljótt þú að gera nýja. En það er þetta gluggi af tíma á sem þessi skrá er enn fullkomlega málskostnað. Svo ef þú notar alltaf forrit eins McAfee eða Norton til að reyna að endurheimta gögn, allt sem þeir eru að gera er að reyna að batna þessa svokölluðu möppu til reikna út hvar skráin var. Og stundum Norton og mun segja, skrá er 93% málskostnað. Jæja, hvað þýðir það? Það þýðir bara að sumir annar skrá tilviljun endaði með, segja, þessir bitar út af upprunalegri stærð þinni. Svo hvað er raunverulega að ræða í batna gögn? Jæja, ef þú hefur ekki eitthvað eins og Norton fyrirfram uppsett á tölvunni þinni, besta sem þú getur stundum gert er að líta á allt disknum leita mynstur bita. Og eitt af þeim málefnum sem setja vandamál fimm er að þú verður að leita á jafngildir disknum, réttar mynd af samningur glampi kort frá stafræna myndavél, leita fyrir 0s og 1s sem oftast með hár líkur, tákna byrja á JPEG mynd. Og þú krakkar geta batna þá ímynd af hrokafullur, ef ég sé þetta mynstur bitar á réttar mynd, með miklar líkur, sem markar upphafið að JPEG. Og ef ég sé sama mynstur aftur, sem markar sennilega upphaf annar JPEG, og annar JPEG, og annar JPEG. Og þetta er oftast hvernig gögn bati mun vinna. Hvað er gott um JPEG er þó skráarsnið sjálft er nokkuð flókin, í upphafi hvert svo skrá er í raun nokkuð að bera kennsl og einfalt, eins og þú munt sjá, ef þú hefur ekki nú þegar. Þannig að við skulum taka a loka líta neðan hetta sem að nákvæmlega hvað er verið gerast, og hvað þessir 0s og 1s eru, að gefa þér svolítið meira af samhengi fyrir þetta tiltekna verkefni. [Vídeó spilun] -Hvar tölvan geymir mest fastra gögnum sínum. Til að gera það, gögn fer frá RAM ásamt merki hugbúnaður sem segja á disknum hvernig á að geyma þessi gögn. The harður rafrásirnar Drive Þýða þá merki í spennu sveiflur. Þetta aftur á móti, stjórna harður ökuferð er hreyfanlega hluti, sumir af fáum hreyfanlega hluti eftir í nútíma tölva. Sumir af the merki stjórna mótor sem spænir málm-húðuð fat. Gögnin þín eru í raun geymdar á þessum fat. Önnur merki færa lesa / skrifa höfuð að lesa eða skrifa gögn á fat. Þessi vélar svo nákvæmar að mönnum hárið gat ekki einu sinni fara á milli höfuð og snúast fat. Samt virkar það allt á frábær hraða. [END vídeó spilun] DAVID Malan: Zoom í smá dýpra nú á hvað er reyndar á þeim fat. [Vídeó spilun] -Við skulum líta á hvað við bara sá í hægur hreyfing. Þegar stutt púls raforku er send til lesa / skrifa höfuð, ef selbiti á pínulitlum raf fyrir brot úr sekúndu. The segull skapar sviði, sem breytingar pólun örlítið, örlítið hluta af málmi agnir sem frakki hverja fati yfirborð. A mynstur röð af þessum pínulítill, innheimt-upp svæði á diskinum táknar einn hluti af gögn í tvöfaldur fjöldi notað af tölvum. Nú, ef núverandi er send ein leið gegnum the lesa / skrifa höfuð, svæðið er skautað í eina átt. Ef núverandi er sent í gagnstæða átt, að pólun er snúið. Hvernig þú fá gögn burt harða diskinn? Bara snúa ferlinu. Svo er það sem agnir á disknum að fá straum í lesa / skrifa höfuð færa. Setja saman milljónir þessir magnetized hluti og þú hefur got a skrá. Nú, stykki af einni skrá getur tvístrast um allan akstur er fat, góður af eins og óreiðu af pappír á borðinu. Svo heldur sérstakt auka skrá lag af hvar allt er. Ekki þú vilt þú hefðir eitthvað svoleiðis? [END vídeó spilun] DAVID Malan: OK, sennilega ekki. Svo hvernig margir af þú krakkar ólst upp með þetta? OK, svo það er færri og færri hendur á hverju ári. En ég er feginn að þú ert að minnsta kosti þekki með þeim, því þetta og okkar eigin bók demo, því miður, er að deyja mjög hægur dauði hér af þekkingu. En þetta er það sem ég, að minnsta kosti, til baka í menntaskóla, notaður notkun fyrir afrit. Og það var ótrúlegt, vegna þess að þú getur geymt 1,4 megabæti á þetta tiltekna diskur. Og þetta var hár þéttleiki útgáfa, eins og sést á HD, sem hefur þýðir fyrir HD vídeó í dag. Standard þéttleiki var 800 kílóbæti. Og áður voru 400-kílóbæti diskur. Og áður voru 5 og 1/4 tommu diska, sem voru sannarlega disklingi, og smá breiðari og hærri en þetta hér. En þú getur raunverulega sjá svokölluð diskling þáttur þessara diska. Og virkni, þá eru þeir í raun nokkuð svipað harður ökuferð af á kosti þessa tegund. Aftur, SSDs í nýrri tölvum vinna svolítið öðruvísi. En ef þú færir þessi litla málm flipann, þú getur raunverulega sjá a lítill fótspor, eða fati. Það er ekki úr málmi eins og þessi. Þessi er í raun einhvers ódýrari plastefni. Og þú getur konar wiggle það. Og þú hefur trully bara þurrka burt sumir fjölda bita eða segulmagnaðir agnir frá þessum diski. Svo sem betur fer, það er ekkert á það. Ef þessi hlutur er í leiðinni - og taka augun og þeir af náunga þínum - þú getur bara svona rífa þetta heild Vagina burt svona. En það er smá vor, svo að meðvitaðir um það með augunum. Svo nú þú ert sannarlega disklingi. Og hvað er merkilegt um þetta er að í eins mikið og þetta er smærri framsetning stærri harður ökuferð, eru þessir hlutir frábær, frábær einfalt. Ef þú klípa neðst af því, nú sem sem málmur sem er burt, og hýði þá opna, allt sem er er tvö stykki af fannst og svokallaða disklingi með stykki af málmur á inni. Og það fer helmingur Innihald diskur míns. Það fer annar helmingur af þeim. En það er allt sem var spuna inni um tölvuna þína í fyrra. Og aftur, að setja þetta í samhengi, hversu stór er mest af þínum harða diska þessa dagana? 500 gígabæta, a terabyte, kannski í A skrifborð tölva, 2 terabytes, 3 terabytes, 4 terabytes, ekki satt? Þetta er eitt megabæti, gefa eða taka, sem getur ekki einu sinni passa dæmigerður MP3 Aftur þessa dagana, eða sumir svipuð tónlist skrá. Svo smá minjagrip fyrir þig í dag, og einnig að hjálpa contextualize hvað við munum vera að taka sem sjálfsögðum hlut nú í vanda sett fimm. Svo þeir eru þínir til að halda. Svo láta mig umskipti þar verður eyða næsta pset eins vel. Þannig að við höfum nú sett þessa síðu til - ó, a par af tilkynningum fljótt. Á föstudaginn, ef þú vilt taka þátt CS50 í hádeginu, fara í venjulegum stað, cs50.net/rsvp. Og lokaverkefni - svo á kennsluáætlun, höfum við staða Lokaverkefni forskrift þegar. Átta sig á að það þýðir ekki að það er vegna sérstaklega fljótlega. Það er staða, virkilega, bara til að fá þú krakkar hugsa um það. Og reyndar, frábær veruleg hlutfall af þú verður að takast á við lokaverkefni á efni sem við hafa ekki einu sinni fengið í bekknum, en mun eins snemma og í næstu viku. Fyrirvara, þó að sérstakur kallar nokkrar mismunandi þættir sem lokaverkefni. Fyrsta, í nokkrar vikur, er Pre-proposal, ansi frjálslegur tölvupóst til TF þinn að segja honum eða hvað þú ert hugsa um fyrir verkefnið þitt, með engin skuldbinding. Tillagan verður einkum þín skuldbinding og sagði hér, þetta er það Mig langar til að gera fyrir verkefnið mitt. Hvað finnst þér? Of stór? Of lítið? Er það viðráðanleg? Og þú sérð sérstakur fyrir frekari upplýsingar. Tveimur vikum eftir að það er staða skýrslu, sem er á sama hátt frjálslegur email til TF þinn að segja hversu langt að baki þú ert í endanlegri þínum báru framkvæmd, fylgt eftir með The CS50 Hackathon sem allir er boðið, sem verður atburður frá 20:00 á einu kvöldi fyrr 7:00 AM næsta morgun. Pizza, sem ég kann að hafa getið í viku núll, að wil framreiddur á 09:00, Kínverska mat á 01:00. Og ef þú ert enn vakandi á 5:00, við munum taka þig á IHOP í morgunmat. Svo er Hackathon einn af the fleiri eftirminnilega reynslu í bekknum. Þá er framkvæmd vegna, og þá climactic CS50 Fair. Nánari upplýsingar um allar þessar í næstu vikur. En við skulum fara aftur til eitthvað gamla skólanum - aftur, fylki. Svo fylki var ágætur, vegna þess að það leysir vandamál eins og við sáum bara stund síðan við mannvirki nemenda fá smá úr böndunum ef við langar að hafa nemanda einn, nemandi tveir, nemandi þrír, nemandi punktur punktur punktur, sumir handahófi fjölda nemenda. Svo fylki, fyrir nokkrum vikum síðan, swooped í og leysa öll vandamál okkar á ekki vita fyrirfram hversu margir hlutir af einhvers konar við gætum vilt. Og við höfum séð að structs getur hjálpað okkur frekar skipuleggja kóðann okkar og halda eðli svipað breytur, eins og heiti og hús, saman, þannig að við hægt að meðhöndla þá eins og eina heild, inni þar af eru smærri verk. En fylki hafa ókosti. Hvað eru nokkrar af göllum við höfum komið upp með fylki svona langt? Hvað er það? Fast stærð - svo jafnvel þótt þú might að vera fær um að úthluta minni fyrir array, þegar þú veist hversu margir nemendur þú hefur, hversu margir stafir sem þú hefur frá notandanum, þegar þú hefur úthlutað array, hefur þú svona máluð sjálfur út í horn. Þar sem þú getur ekki setja nýja þætti í the miðja af óákveðinn greinir í ensku fylking. Þú getur ekki sett inn fleiri þætti í lok fylki. Really, þú þarft að grípa til að búa til heild nýr array, eins og við höfum rætt, afrita gamla í nýja. Og aftur, það er höfuðverk sem GetString fjallar fyrir þig. En aftur, getur þú ekki einu sinni setja eitthvað í the miðja af the array Ef hlutfall er ekki alveg fyllt. Til dæmis, ef þetta array hér til stærðar sex hefur aðeins fimm hluti í það, Jæja, þú bara tittur eitthvað á endanum. En hvað ef þú vilt setja eitthvað í miðjum array, jafnvel þó það gæti hafa Fimm af sex hlutum í það? Jæja, hvað gerði við gera þegar við höfðum öll af sjálfboðaliðum okkar onstage í vikur áður? Ef við vildum að setja einhvern hér, annaðhvort þetta fólk hvernig á að færa þetta hátt, eða þetta fólk hvernig á að færa þetta hátt, og það varð dýr. Að breytast fólks inni er array endaði bæta upp og kosta okkur tíma, þess vegna mikið af n veldi okkar gangi sinnum eins og Innsetningarröðun, fyrir dæmi, í versta tilfelli. Svo fylki eru frábær, en þú verður að vita fyrirfram hversu stór þú vilt þá. Svo allt í lagi, hér er lausn. Ef ég veit ekki fyrirfram hversu margir nemendur gæti ég hef, og ég veit einu sinni Ég ákveð, þó, ég er fastur við það margir nemendur, hví ekki ég bara alltaf úthluta tvisvar eins mikið pláss eins og ég gæti held ég þarf? Er það ekki sanngjarnt lausn? Raunhæft, ég held ekki að við erum að fara að þurfa meira en 50 rifa í fylki fyrir miðlungs stærð bekknum, þannig að við skulum bara umferð upp. Ég ætla að gera 100 rifa í fylking minn, bara svo að við getum ákveðið að fá fjöldi nemenda sem ég búist við að vera í einhverjum miðlungs stærð flokki. Svo hvers vegna ekki bara umferð upp og úthluta meira minni, yfirleitt, að fylki en þú heldur að þú gætir jafnvel þurft? Hvað er þetta einfalt ýtt úr stæði að þessi hugmynd? Þú ert bara að sóa minni. Bókstaflega hvert forrit sem þú skrifar þá er kannski að nota tvisvar sinnum eins mikið minni og þú þarft í raun og veru. Og það bara virkar ekki finnst eins og sérstaklega glæsilegur lausn. Ennfremur dregur það bara líkur á vandamálinu. Ef þú skyldir hafa vinsæll námskeið ein önn og þú ert 101 nemendur, program er enn grundvallaratriðum frammi fyrir sama mál. Svo sem betur fer, það er til lausn við Þessi auglýsing öll vandamál okkar í formi mannvirkja gögn sem eru flóknari en þær við höfum séð hingað til. Þetta, ég kröfu, er tengda listanum. Þetta er listi af tölum - 9, 17, 22, 26, og 34 - sem hafa verið tengd saman með því af því sem ég hef dregið eins örvum. Með öðrum orðum, ef ég vildi til að tákna fylki, ég gæti gert eitthvað eins og this. Og ég ætla að setja þetta á the kostnaður á aðeins augnablik. Ég gæti gert - halló, allt í lagi. Standa við. Ný tölva hér, skýr - allt í lagi. Svo ef ég hef þessar tölur í array - 9, 17, 22, 26, 24 - ekki endilega að skala. Allt í lagi, svo hér er array minn - oh my god. Allt í lagi, svo hér er array mitt. Oh my god. [Hlátur] DAVID Malan: þykjast. Það er of mikil vinna til að fara aftur og festa það, þannig að það - 26. Svo við höfum þetta fjölbreytta 9, 17, 22, 26, og 34. Fyrir þessir af þú getur séð vandræðaleg mistök sem ég gerði bara, þarna er hún. Svo ég halda því fram að þetta er mjög duglegur lausn. Ég hef úthlutað eins mörgum ints sem Ég þarf - Einn, tveir, þrír, fjórir, fimm, eða sex - og ég hef þá geymd Tölurnar inni þessu fylki. En geri ráð fyrir, þá vil ég að setja gildi eins og númer 8? Jæja, hvar er það að fara? Segjum Ég vil setja tala eins 20. Jæja, hvar er það að fara? Einhvers staðar í miðju, eða fjöldi 35 þarf að fara einhvers staðar á endanum. En ég er öll út af plássi. Og svo er þetta grundvallaratriði áskorun af fylki sem er eru lausnin. Ég hélt í smá stund síðan, GetString leysa þetta vandamál. Ef þú vilt setja inn sjöttu tölu í þessu fylki, það sem er að minnsta kosti einn lausn sem þú getur fallið aftur á fyrir viss, bara eins og við gerum með GetString? Hvað er það? Jæja, gera það stærra er auðveldara sagt en gert. Við getum ekki endilega að gera array stærri, en hvað getum við gert? Gera nýja array sem er stærri, af stærð 6, eða kannski stærð 10, ef við viljum til að fá undan hlutum, og þá afrita gamla array inn í nýja, og síðan losa gamla array. En hvað er í gangi tími nú af því ferli? Það er stór O n, vegna þess að afritun er að fara að kosta þig nokkrar einingar af tími, svo ekki svo tilvalið ef við þurfum að úthluta nýtt array, sem er að fara að neyta tvisvar eins mikið minni tímabundið. Afrita gamla í nýja - Ég meina, það er bara höfuðverkur, sem er, aftur, hvers vegna við skrifaði GetString fyrir þig. Svo hvað gætum við gert í staðinn? Jæja, hvað ef gögn uppbygging okkar reyndar hefur skort í það? Segjum að ég slaka markmiði mínu um að hafa samliggjandi klumpur af minni, þar 9 er við hliðina á 17, sem er við hliðina á 22, og svo framvegis. Og gera ráð fyrir að 9 geta verið yfir hér í RAM, og 17 má hérna í RAM, og 22 má hérna í vinnsluminni. Með öðrum orðum, þarf ég ekki að þeim jafnvel aftur til baka aftur. Ég hef bara einhvern veginn þræði nál í gegnum hvert af þessum tölum, eða hvert þessara hnúður, eins og við munum kalla ferhyrninga sem ég hef dregið þá, til muna hvernig til fá til the síðastur svo hnút frá fyrsta. Svo er það forritun reisa við höfum séð alveg nýlega, sem ég geta framkvæma þessi þráður, eða dregin hér, sem ég get hrinda í framkvæmd þeim örvarnar? Svo ábendingum, ekki satt? Ef ég úthluta ekki bara int, en þá er tengipunktur - og með því að hnút, ég meina bara ílát. Og sjónrænt, meina ég rétthyrningur. Svo hnút þarf greinilega að innihalda tvö gildi - The int sig, og þá gefið í skyn sem með the botn helmingur af the rétthyrningur, nóg pláss fyrir int. Svo bara að hugsa fram í tímann hér, hversu stór er þessi hnútur, þetta gámur ræðir? Hversu margir bæti fyrir int? Væntanlega 4, ef það er það sama og venjulega. Og þá hversu margir bæti fyrir músina? 4.. Svo er þetta gámur, eða þetta hnút, að fara að vera 8-bæti uppbyggingu. Ó, og það er skemmtileg tilviljun að við kynntum bara þessa hugmynd um A struct, eða C byggingu. Svo ég halda því fram að ég vil taka skref átt þetta flóknari framkvæmd lista af tölum, a tengd lista af tölum, þarf ég að gera lítið meira að hugsa upp að framan og lýsa ekki bara int, heldur strúktúr sem ég kalla, venjulega hér, hnút. Við gætum kallað það hvað sem við viljum, en tengipunktur er að fara að vera þema í fullt af því sem við byrjum að horfa á núna. Inni þess hnút er int n. Og þá er þetta setningafræði, lítið undarlegt við fyrstu sýn - struct hnút * næst. Jæja pictorially, hvað er það? Það er botn helmingur af rétthyrningur sem við sáum bara í smá stund síðan. En hvers vegna er ég að segja strúktúr hnút * öfugt við bara hnút *? Vegna þess að ef það bendi snúi á annan hnút, það er bara heimilisfang hnút. Það er í samræmi við það sem við höfum rætt um ábendingum svona langt. En hvers vegna, ef ég segist þessi uppbygging er kallaði hnút, þarf ég að segja strúktúr hnút inni hér? Einmitt. Það er tegund af heimskulegt raunveruleika C. The typedef, svo að segja, hefur ekki gerst enn. C er frábær bókstaflega. Það les kóðann þinn Top til botn, vinstri til hægri. Og þar til hann lendir að semíkommu á botn lína, ætli það ekki til sem gögn tegund? Hnút, vitna Unquote hnút. En vegna þess að fleiri fjölorður yfirlýsing ég gerði á fyrstu línu - typedef strúktúr hnút - því það kom fyrst, áður en hrokkið axlabönd, sem er tegund af eins og Pre-mennta Clang að þú vita hvað, gefa mér strúktúr kallað strúktúr hnút. Frankly, ég er ekki eins kalla það struct hnút, strúktúr hnút allt um númerið mitt. En ég ætla bara að nota það einu sinni, bara inni, þannig að ég get í raun búið til eins konar hringlaga tilvísun, ekki bendi til mín í sjálfu sér, en músina til annar Samsvarandi tegund. Svo kemur í ljós að á gögn uppbygging eins og þetta, það er nokkur starfsemi sem gæti áhugaverð fyrir okkur. Við gætum vilja til að setja í lista eins og þetta. Við gætum vilja til að eyða af lista eins og þetta. Við gætum vilja til að leita á lista fyrir a gildi, eða fleiri almennt, fara yfir. Og fara er bara fínt leið segja byrja á vinstri og færa alla leiðin til hægri. Og tilkynningu, jafnvel með þetta örlítið meira háþróuð gögn uppbygging, láta mig leggja til að við getum lánað sum hugmyndir síðustu tvær vikur og framkvæma aðgerð sem kallast leita svona. Það er að fara að skila satt eða rangar, sem gefur til kynna, já eða ekkert, n er á listanum. Seinni rök hennar er bendillinn á listann sjálft, þannig að bendi á hnút. Það eina sem ég ætla að gera þá er lýsa tímabundið breytu. Við munum kalla það PTR eftir venju, fyrir músina. Og ég tengt það jafn upphafið af listanum. Og nú eftir while lykkju. Svo lengi sem bendillinn er ekki jafn að núll, ég ætla að athuga. Er bendillinn arrow n jöfn N sem var samþykkt í? Og bíddu í eina mínútu - ný stykki af setningafræði. Hvað er ör allt í einu? Já? Einmitt. Svo þar fyrir nokkrum mínútum síðan, er notað við punktur merki að opna eitthvað inni í um struct, ef breytan þú hefur er ekki struct sjálft, en bendi á strúktúr, sem betur fer, a stykki af setningafræði sem lokum gerir innsæi skilningi. Örin þýðir að fylgja músina, eins örvar okkar meina venjulega pictorially, og fara á gagnasvæði inni. Svo er ör sama og punktur, en þú notar það þegar þú ert með músina. Svo bara til ágrip þá, ef n sviði inni í strúktúr sem heitir músina jafngildir jafngildir n, aftur satt. Annars, þessi lína hér - bendi jafngildir músina næst. Svo er það þetta að gera, tilkynning, er ef ég er núna að benda á strúktúr sem inniheldur 9, og 9 er ekki fjölda Ég er að leita að - ráð ég er að leita fyrir n jafngildir 50 - Ég ætla að uppfæra tímabundið músina mína að ekki benda á þennan hnút lengur, en bendillinn arrow næsta, sem er að fara að setja mig upp hér. Nú, áttaði ég er vindbylur kynning. Á miðvikudaginn munum við í raun að gera þetta með nokkrum mönnum og með sumir fleiri númer á hægari hraða. En átta sig, erum við nú að gera gögn okkar mannvirki flóknari þannig að okkar reiknirit getur fengið skilvirkari, sem er að fara að vera nauðsynlegur fyrir pset sex, þegar við hlöðum inn, aftur, þeir 150.000 orð, þarf heldur að gera það duglegur, og helst, búa til forrit sem keyrir fyrir notendur okkar ekki í línuleg, ekki í n veldi, en í föstu tíma, í hugsjón. Við munum sjá þig á miðvikudag. Ræðumaður: Á næstu CS50, David gleymir stöð mál sitt. DAVID Malan: Og það er hvernig þú sendir textaskilaboð með C. Hvað - [ÝMSIR textaskilaboð TILKYNNING Hljómar]