David MALAN: Ang lahat ng mga karapatan, maligayang pagdating pabalik. Ito ay CS50. Ito ang simula ng pitong linggo. Kaya ito Matagal na, kaya naisip ko na kami ay kumuha ng isang ipoipo tour ng kung saan namin tumigil at kung saan namin ngayon ng pagpunta. Kaya bagay na ito dito ay maaaring may sanhi angst ng ilan sa unang. Ngunit sana, ikaw ay nagsisimula sa mahirati sa klima sa kung ano ito Nagpapahiwatig dito - star na kumakatawan sa isang pointer, na siyang lamang kung ano, sa mga tuntunin lego pa ni? Kaya ito ay isang address. Kaya ito ang address ng isang bagay sa memorya. At nagsimula kaming mag-alis ng balat sa likod ng mga layer isang pares ng mga linggo na ang nakaraan, mga bagay na gusto GetString at iba pang mga pag-andar gaya lahat ng oras na ito ay nai-pagbabalik address ng mga bagay sa memory, tulad ng address ng unang character in ilang sequence. Kaya rin naming ipinakilala valgrind, na ikaw ay magsisimulang upang gamitin para sa problemang ito set, lalo na para sa susunod na problema set pati na rin. At valgrind kung ano ang ipinapakita para sa amin? Ito sumusuri para sa paglabas memory, at ito din sumusuri para sa pang-aabuso ng memorya. Maaari itong, may ilang mga bagay na maaaring mangyari, kung nakakita iyong code ay pagpunta sa pindutin ang memorya na lang ito dapat hindi. Kaya hindi kinakailangang isang tumagas, ngunit kung pumunta sa ibayo ng hangganan ng ilang array, at ikaw talaga tumakbo valgrind at mang-upat na pag-uugali habang valgrind ay tumatakbo sa iyong programa ay tumatakbo sa loob nito, makakakuha ka ng mga mensahe tulad nito - "Di-wasto ang sumulat ng laki 4, "kung saan, isipin ang isang pares ng mga linggo na ang nakaraan nilalayong na ako ay nagkaroon aksidenteng gusto sa isang int masyadong malayo lagpas sa mga hangganan ng isang array. At kaya laki 4 nangangahulugan dito ang laki ng partikular na int. Kaya tumagal ng muling pagtiyak sa ang katunayan na ang valgrind ng output, ang format ng mga ito, lamang ang mabangis. Ito ay talagang mahirap upang makita sa pamamagitan ng gulo para sa mga kawili-wiling impormasyon. Kaya kung ano ang ginawa namin dito lamang ang sipi ang ilan sa mga pares ng mga karagdagang kagiliw-giliw na mga linya. Ngunit mapagtanto na 80% ng valgrind ni output ay pagpunta sa maging isang bit ng isang kaguluhan ng isip. Hanapin lamang para sa mga pattern tulad ng mga ito - Di-wasto ang karapatan, hindi wastong basahin, 40 bytes at ilang bilang ng mga bloke ay siguradong nawala, mga keyword tulad na. At kung ano ang makikita mo sana ay makita ang ilang mga uri ng trace ng kung ano ang gumana pagkakamali ay talagang in Sa kasong ito dito, sa kung ano ang linya ng ang aking code ay ang error sa malas? 26 sa isang file na tinatawag na memory.c, na noon ay mga halimbawa kami ay naglalaro na may sa oras. Kaya marahil ito ay hindi sa malloc. Ito ay marahil sa aking code sa halip. Kaya naming makita ito muli at muli bago ang haba. Kaya scanf, ito ay dumating up sa isang pares ng mga form kaya sa ngayon. Nakakita kami sscanf daglian. Ito ay isang bagay ng isang bilang ng mga dived ka sa sa iyong paghahanda para sa pagsusulit. At scanf ay ang tunay na mga CS50 aklatan ay ginagamit sa ilalim ng hood para sa lubos ng ilang oras sa pagkakasunud-sunod upang makakuha ng input mula sa user. Halimbawa, kung ilipat ko sa ibabaw ng mga CS50 appliance dito, hayaan mo akong magbukas ng isang Halimbawa ngayon na tinatawag na scanf-0.c At ito ay napaka-simple. Ito ay lamang ng ilang linya ng code. Ngunit ito ay nagpapakita kung paano talaga getInt ay na nagtatrabaho sa lahat ng oras na ito. Sa programang ito dito, sa linya 16 , Notice na idedeklara ako sa isang int. Kaya walang pointer, walang nakapagtataka doon, lamang sa isang int. Pagkatapos, sa linya 17, ako ang prompt gumagamit para sa isang numero, mangyaring. Pagkatapos, sa huli 18, gagamitin ko ang scanf dito. At ako tinukoy, uri ng tulad ng printf, na ako umaasang quote magpanipi i porsiyento. Kaya porsiyento i, siyempre, Nagpapahiwatig ng isang int. Ngunit mapansin kung ano ang pangalawang argumento sa scanf ay. Paano mo ilarawan ang pangalawang argumento pagkatapos ng comma? Ano iyon? Ito ang address ng x. Kaya ito ay kapaki-pakinabang dahil sa pamamagitan ng pagbibigay scanf may address ng x, ano ang ibig na bigyang kapangyarihan na pagpapaandar upang gawin? Hindi lamang pumunta doon, ngunit din gawin kung ano? Gumawa ng isang pagbabago sa mga ito. Dahil maaari kang pumunta doon, ito ay isang uri ng tulad ng isang mapa sa isang lokasyon sa memorya. At kaya hangga't magbigay sa iyo scanf, o anumang mga function na may tulad na isang mapa, na function na ay maaaring pumunta doon, at hindi lamang tumingin sa ang halaga, ngunit maaari din ito palitan na halaga, na kung saan ay kapaki-pakinabang kung sa layunin sa buhay ng scanf ay upang i-scan ang input mula sa user, partikular mula sa keyboard. At f ang Nagpapahiwatig na-format, tulad ng printf, f ang Nagpapahiwatig ng isang format na string na nais mong i-print. Kaya sa maikling, ito linya 18 lang sabi, subukan na basahin sa isang int mula sa gumagamit keyboard at mag-imbak ito sa loob ng x, sa kahit anong address x mangyayari sa mabuhay sa. At pagkatapos ay bilang wakas, line 19 lang sabi, salamat para sa int, sa kasong ito. Kaya ipaalam sa akin sige at gawin ito. Kaya gumawa scanf 0. Hayaan akong sige at mag-zoom in Kukunin ko pumunta at patakbuhin ito sa tuldok iwa scanf 0. Numero, pakiusap? 50. Salamat para sa 50. Kaya ito ay medyo simple. Ngayon kung ano ang hindi ito ginagawa? Hindi ito ginagawa ng isang buong buwig ng error checking. Halimbawa, kung hindi ako makikipagtulungan, at hindi ko type sa isang numero, ngunit sa halip akong magsulat ng isang bagay tulad ng "kumusta," ito lamang ay uri ng kakaiba. At kaya ang isa sa mga bagay na ang CS50 library ay ginagawa para sa amin para sa ilang mga ang tagal na reprompting at reprompting. Ang retry isipin ang parirala ay nasa cs50.c, at iyon ang dahilan na getInt sa ang CS50 library ay talagang isang buong tungkos ng mga linya ang haba, dahil kami naghahanap ng mga bagay-bagay bobo na katulad nito. Ang ibig user ang hindi nagbibigay sa sa amin, sa katunayan, isang int? Ang ibig niya bigyan kami ng isang bagay tulad ng isang alpabetikong letra? Kung gayon, nais naming detect na at sumigaw sa kanila. Ngunit ang mga bagay na makakuha ng mas maraming mga kagiliw-giliw sa susunod na halimbawa. Kung pumunta ako sa scanf-1.c, ano ang isa bagay na nagbago sa panimula sa ito susunod na halimbawa? Gumagamit ako ng pansamantalang trabaho *, siyempre, sa halip ng int. Kaya ito ay kagiliw-giliw na, dahil pansamantalang trabaho *, pagkuhang muli, ay talagang lamang ang parehong bagay bilang string. Kaya ito nararamdaman tulad marahil ito ay isang napakabilis simpleng pagpapatupad ng GetString. Ngunit ko na peeled likod ng layer ng CS50 library, kaya ako pagtawag na ito pansamantalang trabaho * ngayon. Kaya natin makita kung saan, kung saanman, pumunta kami mali. Line 17 - Kong muli sabihin, mangyaring akong bigyan ng isang bagay, sa kasong ito, ang isang string. At pagkatapos ay sa susunod na linya, tumawag ako scanf, muli, na nagbibigay ito ng isang format ng code, subalit oras na ito s porsiyento. At pagkatapos ng oras na ito, ako nagbibigay ito buffer. Ngayon mapansin, hindi ko ginagamit ang ampersand. Ngunit kung bakit ay marahil na OK dito? Dahil kung ano ang buffer pa? Ito ay mayroon ng isang pointer. Ito ay mayroon ng isang address. At sabihin ang salitang ito "lituhin," ipaalam sa akin tumawag lamang ito s, halimbawa, para sa pagiging simple. Ngunit ko na tinatawag na ito buffer dahil sa pangkalahatan, sa programming, kung mayroon kang isang tipak ng memorya, na isang string talaga lamang ay, maaari mong tawagan ito ng buffer. Ito ay isang lugar upang mag-imbak ng impormasyon. Katulad ng mga bagay tulad ng YouTube, kapag sila buffering, kaya na magsalita, na Nangangahulugan lamang ito ay pag-download ng mga piraso mula sa sa internet at pag-iimbak ng mga ito sa isang lokal na array, isang lokal na tipak ng memory kaya na mapapanood mo ito sa ibang pagkakataon nang ito laktaw o nagha-hang sa ka habang nagpe-play muli. Kaya mayroong isang problema dito kahit na, dahil ako na nagsasabi sa scanf, asahan ang string mula sa user. Narito ang address ng isang tipak ng memory. Ilagay ang string na doon. Bakit bound na bigyan amin problema, bagaman? Ano iyan? Pinapayagan ba akong i-access na bahagi ng memorya? Alam mo, hindi ko alam. Dahil si buffer na-initialize sa anumang bagay? Hindi talaga. At kaya kung ano ang aming na-pagtawag isang basura halaga, na ay hindi isang pormal na salita. Ito lamang ay nangangahulugan na wala kaming ideya kung ano ang mga piraso ay sa loob ng apat na bytes Ko na inilaan bilang buffer. Hindi ko pa na tinatawag malloc. Tiyak ko na hindi tinatawag GetString. Kaya kung sino ang nakakaalam kung ano ang aktwal na sa loob ng buffer? At sinasabi pa scanf nang walang taros, pumunta doon at inilagay ang anumang mga user na-type. Kaya kung ano ay malamang na maging sanhi ng sa aming mga code kung namin patakbuhin ito? Malamang isang segfault. Siguro hindi, ngunit marahil isang segfault. At sinasabi ko siguro dahil hindi minsan gawin mo, paminsan-minsan hindi mo makakuha ng isang segfault. Minsan mo lang makakuha ng masuwerteng, ngunit gayunman ito ay pagpunta sa maging isang bug sa aming programa. Kaya ipaalam sa akin sige at sumulat ng libro na ito. Pupunta ako sa gawin ito sa lumang paraan ng paaralan. Kaya kalatungin gitling 0, scanf-1, scanf-1.c, ang Enter. Oops, masyadong luma paaralan. Tayo'y makita. Saan ako pupunta? Oh, pansamantalang trabaho * buffer. Oh, salamat sa iyo - I-save, OK - napaka old school. Ang lahat ng mga karapatan, ito Matagal na. Kaya lang ako nai-save ang file pagkatapos ng paggawa na pansamantalang baguhin ng ilang sandali ang nakalipas. At ngayon ko pa inipon ito manu-manong na may kalatungin. At ngayon pupuntahan ko sige at magpatakbo ng scanf-1, ang Enter. String mangyaring. Kukunin ko i-type sa "kumusta." At ngayon, narito kung saan, lantaran, printf Maaari ay isang maliit na nakakainis. Hindi ito aktwal na pagpunta sa segfault sa kasong ito. Printf ay isang maliit na espesyal dahil ito kaya super karaniwang ginagamit na mahalagang printf ay ginagawa amin ng isang pabor at napagtatanto, hindi iyon isang wastong pointer. Hayaan akong dalhin ito sa sarili ko lang i-print out sa mga panaklong null, kahit bagaman ito ay hindi kinakailangan kung ano namin ang aming sarili sa inaasahan. Kaya hindi namin maaaring talagang madali magbuod isang segfault may ito, ngunit malinaw na ito ay hindi ang pag-uugali Nais kong. Kaya kung ano ang mga simpleng solusyon? Well, sa scanf-2, hayaan mo akong magpanukala na sa halip ng mga aktwal na lamang paglaan ng isang pansamantalang trabaho *, hayaan mo akong maging isang maliit na mas matalinong tungkol sa ito, at ipaalam sa akin magtalaga ng buffer bilang isang pagkakasunod-sunod ng 16 karakter. Kaya ang maaari kong gawin ito sa ilang mga paraan. Maaari ko talagang gamitin ang malloc. Ngunit maaari ba akong bumalik sa dalawang linggo kapag Ko lang kailangan ang maramihang mga character. Ito lamang ay isang array. Kaya ipaalam sa akin sa halip muling tukuyin buffer upang maging isang array ng 16 mga character. At ngayon, kapag pumasa ako sa buffer - at ito ay isang bagay na ginawa namin hindi makipag-usap tungkol sa dalawang linggo - ngunit maaari mong ituring ang isang array bilang bagaman ito ay isang address. Technically, bilang nasaksihan namin, ang mga ito ay Medyo naiiba. Ngunit scanf hindi tututol kung pumasa ka ito ang pangalan ng isang array, dahil kung ano Kalatungin ay gagawin para sa atin ay mahalagang tratuhin ang mga pangalan ng array na bilang address ng tipak ng 16 bytes. Kaya ito ay mas mahusay. Ito ay nangangahulugan na ngayon maaari ko sana gawin ang mga sumusunod. Hayaan akong mag-zoom out para sa isang sandali at gawin gumawa scanf-2, pinagsama-sama ang OK. Ngayon ipaalam sa akin huwag Nakakuha slash scanf-2. String mangyaring. "Hello." At ito tila gumagana oras na ito. Ngunit maaari isang tao ipanukala ang isang sitwasyong kung saan hindi pa rin ito maaaring gumana? Oo? Isang bagay na mas mahaba sa 16 character. At talagang, maaari naming maging medyo mas tumpak. Isang bagay na mas mahaba sa 15 character, dahil ba talagang kailangan namin upang panatilihin sa isip na kailangan namin na backslash zero nang kataon lamang sa dulo ng string, na kung saan ay isang bukod scanf kalooban karaniwan alagaan para sa amin. Kaya ipaalam sa akin gawin ang isang bagay tulad ng - minsan lang namin makakaya iwanan ito tulad na. OK, kaya na namin ngayon ang sapilitan ang aming segmentation fault. Bakit? Dahil ako nai-type sa higit sa 15 mga character, at kaya na namin talaga hinawakan memory na ako talaga hindi dapat magkaroon. Kaya kung ano talaga ang solusyon dito? Well, kung ano kung kailangan namin ng mas mahabang string? Well, siguro namin gawin itong 32 bytes. Well, paano kung hindi iyon sapat ang haba? Paano ang tungkol sa 64 bytes? Paano kung hindi iyon sapat ang haba? Paano ang tungkol sa 128 o 200 bytes? Ano ba talagang ay ang solusyon dito sa pangkalahatang mga kaso, kung hindi namin alam sa advance kung ano ang user pupuntahan type? Ito ay lamang uri ng isang malaking sakit sa puwit, upang maging matapat, na kung saan ay kung bakit ang CS50 library ay may ilang mga linya dosenang code na sama-sama ipatupad GetString string sa isang paraan na ginagawa namin hindi kailangang alam nang maaga kung ano ang user ay pagpunta sa i-type. Sa partikular, kung tumingin ka pabalik sa cs50.c mula sa dalawang linggo ang nakalipas, makikita mo ang GetString na talagang gumagana hindi gumamit scanf sa ganitong paraan. Sa halip, ito bumabasa ng isang character sa isang pagkakataon. Dahil ang isang magaling na bagay tungkol sa pagbabasa sa isang character ay aming makakaya ginagarantiya ng ating sarili na laging may hindi bababa sa isang pansamantalang trabaho. Maaari ko lang magpahayag ng isang pansamantalang trabaho, at pagkatapos gumawa mga tunay na sanggol hakbang na ito upang lamang basahin ang isang character sa sa isang oras mula sa keyboard. At pagkatapos ay, kung ano ang makikita mo ang GetString ibig ay sa tuwing ito ay naubusan ng, sabihin nating, 16 byte ng memorya, ginagamit nito malloc, o isang pinsan hinggil dito, upang magtalaga ng higit pang memory, pagkopya sa lumang memory papunta sa bago, at pagkatapos ay pag-crawl kasama, sa pagkuha ng isang character sa isang pagkakataon, at kapag ito ay naubusan ng na tipak ng memory, throws ito ang layo, grabs isang mas malaking tipak ng memory, kinokopya lumang sa bago, at umuulit. At ito ay tunay na isang sakit na talaga ipatupad ang isang bagay na simple bilang pagkuha ng input mula sa isang user. Kaya maaari mong gamitin ang scanf. Maaari mong gamitin ang iba pang mga katulad na pag-andar. At may maraming mga aklat-aralin at mga online na halimbawa gawin, ngunit ang mga ito ay ang lahat ng mahina laban sa mga problema tulad nito. At sa huli, nagsisimula ng segfault ay uri ng nakakainis. Ito ay hindi mabuti para sa mga gumagamit. Ngunit sa pinakamasama kaso, kung ano ang ibig ito sa panimula ilagay ang iyong mga code nanganganib na? Ang ilang mga uri ng pag-atake, potensyal na. Usapan natin ang tungkol sa isa tulad atake - umaapaw ng stack. Ngunit sa pangkalahatan, kung ikaw ay papayagang apaw buffer ng, tulad ng ginawa namin isang dalawang linggo ang nakalipas, sa pamamagitan lamang ng pagsusulat higit sa "halo" sa stack, mo Maaari katunayan pumalit, potensyal, isang computer, o hindi bababa sa makakuha ng mga data na ay hindi nabibilang sa iyo. Kaya sa maikling salita, ito ang dahilan kung bakit mayroon kaming mga pagsasanay wheels. Ngunit ngayon, magsisimula kami upang gumawa ng mga ito off, bilang aming mga programa sa hindi na kailangan, kinakailangan, input mula sa user. Ngunit sa kaso ng mga problema itakda anim, iyong input ay darating mula sa isang malaking diksyunaryo file na may ilang 150 kakaiba libong mga salita. Kaya hindi mo na kailangang mag-alala tungkol sa di-makatwirang pag-input ng user. Kami ay magbibigay sa iyo ng ilang mga pagpapalagay tungkol sa file na iyon. Ang anumang mga katanungan sa payo o scanf o input ng user sa pangkalahatan? Ang lahat ng mga karapatan, sa gayon ang isang mabilis na pagtingin pagkatapos sa isa trailing topic mula sa dalawang linggo na ang nakaraan. At iyon ay ang pagkaunawa ng isang struct. Hindi na - ito paniwala ng isang struct, na noon ay kung ano? Ano ang sinabi struct gawin para sa amin? Tukuyin - paumanhin? Tukuyin ang isang variable na uri. Kaya-uri-uriin ng. Talaga kami ng pagsasama-sama ng dalawang mga paksa. Kaya may typedef, isipin ang na aming makakaya magpahayag ng isang uri ng ating sariling, tulad ng isang kasingkahulugan, tulad ng string para sa pansamantalang trabaho *. Ngunit gamit ang typedef at struct, aming makakaya lumikha ng tunay ang aming sariling mga istraktura ng data. Halimbawa, kung pumunta ako pabalik sa gedit dito para sa sandali lamang, at pumunta ako nang maaga at gawin ang isang bagay tulad ng, hayaan mo akong i-save ang ito bilang, sabihin nating, structs.c pansamantala, lang ako pupunta upang sige at isama standardio.h, int pangunahing walang bisa. At pagkatapos ay i-in dito, ipagpalagay na nais ko magsulat ng isang programa na nag-iimbak maraming mga mag-aaral mula sa maraming bahay, halimbawa. Kaya ito ay tulad ng isang registrarial database ng ilang mga pag-uuri. Kaya kung kailangan ko ang pangalan ng isa mag-aaral, ko maaaring gawin ang isang bagay tulad ng pansamantalang trabaho * pangalan, at kailangan kong gawin ang isang bagay tulad ng - talaga, gamitin natin ang CS50 library para lamang ng ilang sandali upang gawin ang isang medyo simple, upang maaari naming humiram mga dose-dosenang mga linya ng code. At sabihin lamang panatilihin itong simple. Susubukan naming panatilihin itong string, at ngayon GetString. Kaya inaangkin ko na ngayon ko na naka-imbak sa pangalan ng ilang mga mag-aaral, at ang bahay ng ilang mag-aaral, simpleng paggamit variable tulad ng ginawa namin at sa linggo isa. Ngunit ipagpalagay ko ngayon ay nais upang suportahan ang maraming mag-aaral. Ang lahat ng mga karapatan, sa gayon ang aking mga instincts ay upang gawin string NAME2, nakakakuha GetString, string house2 nakakakuha GetString. At pagkatapos ay ang aming third-aaral, sabihin gawin NAME3 GetString. Ang lahat ng mga karapatan, kaya ito ay kitang-kita na sana iyo bilang uri ng bobo, dahil ang prosesong ito ay talagang hindi kailanman pagpunta sa magtapos, at lamang ito ng pagpunta sa mapapalitaw ang aking mga code hitsura mas masahol pa at mas masahol at mas masahol pa. Ngunit kami malulutas ito masyadong sa dalawang linggo. Ano ang aming mga relatibong malinis na solusyon kapag nagkaroon kami ng maraming mga variable ng parehong uri ng data na may kaugnayan sa lahat, ngunit hindi namin ginawa gusto ito mabangis gulo katulad ng mga variable na may pangalang? Ano ang ginagawa namin sa halip? Kaya sa tingin ko Narinig ko ang ilang mga lugar. Nagkaroon kami ng isang array. Kung nais mong maramihang mga kaso ng isang bagay, bakit hindi namin linisin ang lahat up lang at sabihin, magbigay sa akin array na tinatawag na mga pangalan? At sa ngayon, sabihin na hard code 3. At pagkatapos ay bigyan ako ng isa pang array na tinatawag na mga bahay, at ipaalam sa akin para ngayon mahirap code 3. At massively ko na nalinis up ang Nagkamali na ko lang ginawa. Ngayon, pa rin ako ng hard code 3, ngunit kahit 3 mga dynamic na maaaring nanggaling mula sa gumagamit, o argv, o mga katulad. Kaya ito ay mas malinis. Ngunit kung ano ang tungkol sa mga nakakainis na ito ay na ngayon, kahit na isang pangalan ay sa paanuman sa panimula naka-link sa bahay ng mag-aaral - ito ay isang mag-aaral na ko talaga nais upang kumatawan - Ako ay mayroon na ngayong dalawang array na parallel sa kamalayan na ang mga ito ay parehong sukat, at mga pangalan ng bracket 0 siguro mga mapa sa bahay bracket 0, at mga pangalan ng bracket 1 mapa sa bahay bracket 1. Sa madaling salita, mag-aaral na ang mga buhay sa na bahay, at na ang ibang mag-aaral sa buhay na ang ibang bahay. Ngunit tiyak na ito ay maaaring maging mga tapos kahit na higit pa nang malinis. Well, kaya nito, sa katunayan. At ipaalam sa akin sige at buksan up structs.h, at bibigyan ka tingnan ang ideya dito. Pansinin na na nagamit ko typedef, bilang ka alluded sa isang sandali ang nakalipas na idedeklara ang aming sariling data uri. Ngunit din ako gamit ang ibang mga keyword tinatawag struct kung saan ay nagbibigay sa akin ng isang bagong istraktura ng data. At ang data na istraktura inaangkin ko ay pagpunta upang magkaroon ng dalawang mga bagay sa loob ng ito - isang string na tinatawag na pangalan, at isang string na tinatawag na bahay. At ang pangalan ng pupuntahan ko ibigay sa ang data na istraktura ay pagpunta na tinatawag na mag-aaral. Kaya kong tumawag ito anumang nais ko, ngunit ito magkakahulugang gumawa kahulugan sa akin sa aking isip. Kaya ngayon, kung ko bang buksan up ng isang mas mahusay na bersyon ng programa ko nagsimula pagsulat doon, ipaalam sa akin mag-scroll sa tuktok. At mayroong ilang mga karagdagang linya ng code dito, ngunit hayaan mo akong tumuon para sa sa sandaling ito sa isa. Ko na ipinahayag ng isang pare-pareho ang tinatawag na mag-aaral at hard code 3 para sa ngayon. Ngunit ngayon, pansinin kung paano malinis ang aking code ay nagsisimula upang makakuha ng. Sa line 22, ako idedeklara hanay ng mga mag-aaral. At mapapansin na ang mag-aaral ay tila ngayon ay isang uri ng data. Dahil sa tuktok ng file na ito, mapansin Nagsama ako ng header na file na aking nakuha up sandali lamang ang nakalipas. At header na file pa lang ay nagkaroon ang kahulugan ng isang mag-aaral. Kaya ngayon, lumikha ako ng aking sariling pasadyang data uri na ang mga may-akda ng C taon ang nakalipas ay hindi isipin nang maaga. Pero walang problema. Ang maaari kong gawin itong aking sarili. Kaya ito ay isang array na tinatawag na mga mag-aaral, bawat isa sa ang mga miyembro ay isang mag-aaral na kaayusan. At gusto ko ang tatlo sa mga sa array. At ngayon, kung ano ang natitira sa ng programang ito gawin? Kailangan ko ng isang bagay na medyo arbitrary. Kaya mula sa mga online 24 pasulong, Ako umulit 0-3. Pagkatapos kong tanungin ang user para sa Pangalan ng mag-aaral. At pagkatapos kong gamitin GetString tulad ng dati. Pagkatapos hilingin ko para sa bahay ng mag-aaral, at gagamitin ko GetString tulad ng dati. Ngunit notice - bahagyang bagong piraso ng syntax - Maaari ko pa rin bang i-index ang i-th mag-aaral, ngunit paano ko makuha sa tukoy na data patlang sa loob ng struct? Well, kung ano ang tila ang bagong piraso ng syntax? Ito ay lamang ang tuldok operator. Hindi kami talaga nakita ito bago. Nakita mo ito sa pset limang kung ikaw dived sa na may bitmap file. Ngunit tuldok lang ang ibig sabihin nito sa loob ng mga ito struct o maramihang mga patlang, bigyan tuldok pangalan, o ninyo akong bigyan tuldok bahay. Nangangahulugan iyon na pumunta sa loob ng struct at makakuha ng mga partikular na mga patlang. Ano ang ginagawa ang mga natitira sa programang ito gawin? Ito ay hindi lahat na sexy. Pansinin na ako umulit 0-3 muli, at ako lumikha lamang ng isang Ingles parirala tulad nang sa gayon at sa gayon ay sa tulad at tulad ng bahay, pagpasa sa tuldok pangalan mula ang i-th mag-aaral at ang kanilang mga bahay pati na rin. At pagkatapos ay bilang wakas, ngayon ay magsisimula kami upang makakuha anal tungkol dito, ngayon na kami ay pamilyar sa kung ano ang malloc at iba pang mga pag-andar na- paggawa ng lahat oras na ito. Bakit ako kailangang mag-magbakante parehong pangalan at bahay, kahit na ako Hindi tumawag malloc? GetString ginawa. At iyon ay ang marumi kaunti lihim para sa ilang mga linggo, ngunit may GetString Na-tagas memory lahat ng dako ng ilagay ang lahat ng semestre kaya sa ngayon. At valgrand kalooban sa wakas ibunyag ito sa amin. Ngunit ito ay hindi isang malaking pakikitungo, dahil alam ko na ako lang ang magbakante pangalan at ang bahay, kahit na technically, upang maging sobrang, sobrang safe, ang dapat kong maging paggawa ng ilang error check dito. Ano ang iyong mga instincts na nagsasabi sa iyo? Ano ang dapat kong i-check para sa bago magbakante ko kung ano ay isang string, aka kung saan ang isang pansamantalang trabaho *? Dapat ko talagang ma-check kung ang mga mag-aaral bracket pangalan i tuldok ay hindi katumbas null. Pagkatapos ay magkakaroon ito maging ang OK upang sige at ng libreng na pointer, at pareho o ang iba pang mga isa pati na rin. Kung mag-aaral bracket i tuldok bahay ay hindi katumbas ng null, ito ngayon ay maprotektahan laban sa mga sulok kaso kung saan GetString nagbabalik ng isang bagay tulad ng null. At nakita namin ng ilang sandali ang nakalipas, printf kalooban protektahan sa amin up dito lamang sa pamamagitan ng sinasabi null, na kung saan ay pagpunta sa hitsura kakaiba. Ngunit hindi bababa sa hindi ito segfault, tulad ng nakita natin. Well, ipaalam sa akin gawin ang isa iba pang mga bagay dito. structs-0 ay uri ng isang ugok programa dahil ipasok ko ang lahat ng data na ito, at pagkatapos ay ito ay nawala sa sandaling ang programa ay nagtatapos. Ngunit ipaalam sa akin sige at gawin ito. Hayaan akong gumawa ng terminal window ng kaunti mas malaking. Hayaan akong gumawa structs-1, na ay isang bagong bersyon ng mga ito. Magtatagal ako mag-zoom sa ilang sandali. At ngayon hayaan mo akong tumakbo tuldok iwa structs-1. Pangalan ng mag-aaral - David Mather, sabihin gawin Rob Kirkland, sabihin gawin Lauren Leverett. Ano ang mga kagiliw-giliw na ngayon ay notice - at ako lamang alam ito dahil Ako ay nagsulat sa programa - mayroong isang file na ngayon sa aking kasalukuyang direktoryo na tinatawag na students.csv. Ang ilan sa iyo ay maaaring nakakita mga sa tunay na mundo. Ano ang isang CSV file? Pinaghihiwalay ng kuwit ang mga halaga. Ito ay uri ng tulad ng isang mahinang tao bersyon ng isang Excel file. Ito ay isang talaan ng mga hilera at mga hanay na maaari mong buksan sa isang programa tulad ng Excel, o Number sa Mac. At kung ako buksan ang file na ito dito sa gedit, paunawa - at ang mga numero ay hindi doon. Na lamang na nagsasabi sa gedit sa akin mga numero ng linya. Pansinin sa unang linya ng ito file ay David at Mather. Ang susunod na linya ay Rob kuwit Kirkland. At ang ikatlong linya ay Lauren comma Leverett. Kaya kung ano ang aking nilikha? Ngayon ko na isinulat ng isang C programa na Maaari epektibong makabuo ng mga spreadsheet na pwedeng buksan sa isang programa tulad ng Excel. Hindi lahat ng nakahihimok na isang hanay ng data, ngunit kung ikaw ay may mas malaking chunks ng data na iyong aktwal na nais upang manipulahin at gumawa ng mga graph at ang i, ito ay marahil isa paraan upang lumikha ng data na iyon. Dagdag pa rito, CSVs ay aktwal na super common para lamang sa pag-iimbak ng data simple - Yahoo Finance, halimbawa, kung ikaw ay makakuha stock quote sa pamamagitan ng kanilang tinaguriang API, ang libreng serbisyo na nagbibigay-daan sa iyo makakuha ng kasalukuyang up-to-the-date stock quote para sa mga kumpanya, sila bigyan ang data pabalik sa sobrang simple CSV na format. Kaya kung paano ginawa namin iyon? Well mapansin, karamihan sa mga programang ito ni halos pareho. Ngunit mapansin pababa dito, sa halip na pag-print ang mga mag-aaral sa labas, sa linya 35 pasulong, inaangkin ko na ako ang pag-save mag-aaral na disk, kaya pag-save ng file. Kaya mapansin ako deklarasyon ng FILE * - ngayon, ito ang uri ng isang anomalya sa C. Para sa anumang dahilan, FILE ang lahat ng caps, na kung saan ay hindi tulad ng karamihan sa iba pang mga uri ng data sa C. Ngunit ito ay isang built-in data uri, FILE *. At ako deklarasyon ng pointer sa isang file, ay kung paano maaari mong isipin na. fopen nangangahulugan open file. Ano ang file na nais mong buksan? Gusto kong magbukas ng isang file na kalooban ko mang tumawag students.csv. Kaya kong tumawag sa anumang bagay na gusto ko. At pagkatapos gumawa ng isang hula. Ano ang ipinapakita ng pangalawang argumento sa fopen marahil ibig sabihin nito? Kanan, w para sa write, ng dati maging r para read. Mayroong para sa Magkabit kung gustong idagdag hilera at hindi patungan ang buong bagay. Ngunit ko lang nais na lumikha ng file na ito sabay-sabay, kaya makikita ko bang gamitin ang quote magpanipi w. At alam ko na lamang mula sa pagkakaroon ng basahin ang babasahin, o mga tao na pahina. Kung ang file ay hindi null - sa ibang salita, kung walang nangyaring mali doon - hayaan mo akong umulit sa ibabaw ng mga mag-aaral 0-3. At ngayon mapansin mayroong isang bagay kailanman kaya bahagyang naiiba tungkol sa 41 linya dito. Ito ay hindi printf. Ito ay fprintf para sa file printf. Kaya ito ay pagpunta sa sumulat sa file na. Aling mga file? Ang isa na ang pointer tinukoy mo bilang ang unang argumento. Pagkatapos naming tukuyin ang isang format na string. Pagkatapos naming tukuyin kung ano string gusto naming plug in sa unang mga porsiyento, at pagkatapos ng isa pang variable o ang pangalawang s porsiyento. Pagkatapos naming isara ang file na may fclose. Kaysa magbakante ko ang memory tulad ng dati, bagaman Ang dapat kong bumalik sa at magdagdag ilan sa mga pagsusuri para sa null. At na ito. fopen, fprintf, fclose ay nagbibigay sa akin ang kakayahan upang lumikha ng mga file na teksto. Ngayon, makakakita ka ng problema sa hanay ng limang, na kung saan ay nagsasangkot ng mga imahe, ikaw ay gumagamit ng binary file sa halip. Ngunit sa panimula, ang ideya ay pareho, kahit na ang mga function bibigyan ka makita ay Medyo naiiba. Kaya ipoipo tour, ngunit makakakuha ka ng lahat ng masyadong pamilyar sa file I/O-- input at output - may pset limang. At anumang mga katanungan tungkol sa paunang pangunahing kaalaman dito? Oo? Paano kapag sinubukan mong mag-magbakante isang null halaga? Naniniwala akong, maliban kung libre na nakuha ng isang maliit na mas user-friendly, maaari mong potensyal na segfault. Pasadong ito ay walang bisa dahil sa hindi magandang gawin ko hindi Naniniwala libreng bothers upang suriin para sa iyo, dahil ito ay potensyal na maging isang basura ng oras para sa mga ito upang gawin ang kanyang sarili para sa lahat ng tao sa mundo. Magandang katanungan, bagaman. Ang lahat ng mga karapatan, kaya ito uri ng makakakuha sa amin sa isang kawili-wiling paksa. Ang tema ng problema set lima ay forensics. Hindi bababa sa na ang isang bahagi ng problema sa set. Forensics sa pangkalahatan ay tumutukoy sa pagbawi ng impormasyon na maaari o hindi maaaring natanggal kusa. At kaya naisip ko na gusto kong bigyan ka ng isang mabilis lasa ng kung ano ang talagang pagpunta sa lahat oras na ito sa ilalim ng hood ng iyong computer. Halimbawa, kung mayroon ka sa loob ng iyong laptop o sa iyong desktop computer ng isang hard drive, ito ay alinman sa isang mekanikal aparato na talagang spins - may paikot na bagay na tinatawag na platters na hitsura medyo gusto ko kung ano ang lamang ay nagkaroon ng hanggang sa screen dito, bagaman ito ay nagiging lumang paaralan. Ito ay isang tatlong-at-a-half-inch hard drive. At tatlong at kalahating pulgada ay tumutukoy sa may mga bagay na kapag nag-install mo ito sa isang computer. Marami sa mga ka guys sa iyong mga laptop ngayon may solid-estado drive, o SSDs, na may na walang paglipat ng mga bahagi. Ang mga ito ay higit na katulad ng RAM at mas mababa tulad ng mga mekanikal na aparato. Ngunit ang mga ideya ay pa rin ang parehong, tiyak na bilang ng mga ito upang itakda ang problema limang. At kung sa tingin mo tungkol sa ngayon ng isang hard drive Kinakatawan ng pagiging isang bilog, na Kukunin ko gumuhit ganito dito. Kapag lumikha ka ng isang file sa iyong computer, maging ito man ay isang SSD, o sa kasong ito, ang isang mas lumang paaralan hard drive, file na binubuo ng maramihang mga piraso. Sabihin natin na ito ang 0 at 1, ang maramihang mga 0s at 1s. Kaya ito ay ang aking buong hard drive. Ito ay tila isang medyo malaki file. At ito ay gumagamit ng up ng 0s at 1s sa na bahagi ng pisikal na platter. Well, ano ang pisikal na bahagi? Well, ito lumiliko out na sa isang hard drive, hindi bababa sa na may ganitong uri, mayroong mga maliliit na maliit na magnetic particle. At sila ay mahalagang mayroon hilaga at south pole sa kanila, upang kung ikaw i-on ang isa sa mga magnetic particle sa ganitong paraan, maaari mong sabihin na ito kumakatawan sa isang 1. At kung ito ay baligtad sa timog hilaga, maaari mong sabihin na ito kumakatawan sa isang 0. Kaya sa tunay na pisikal na mundo, na paano maaari mong kumatawan ng isang bagay sa binary estado ng 0 at 1. Kaya na ang lahat ng mga file ay isang. Mayroong ang maramihang mga magnetic particle na ito ang kanilang paraan o sa ganitong paraan, paglikha ng mga pattern ng 0s at 1s. Ngunit ito lumiliko out kapag nag-save ka ng file, ilang impormasyon ay naka-save nang hiwalay. Kaya ito ay isang maliit na mesa, isang direktoryo, kaya na magsalita. At Tatawag ako ang hanay na ito pangalan, at Tatawag ako ang hanay na lokasyon. At pupuntahan ko sabihin, ipagpalagay ito ang aking resume. Aking resume.doc ay naka-imbak sa lokasyon, sabihin nating 123. Ako palaging pumunta para sa na numero. Ngunit magkasiya ito upang sabihin na lang bang sa RAM, maaari kang kumuha ng hard drive na ang isang gigabyte o 200 gigabytes o isang terabyte, at maaari mong bilang ang lahat ng mga bytes. Maaari mong numero ang lahat ng chunks ng 8 bits. Kaya naming sabihin na ito ay 123 lokasyon. Kaya direktoryong ito sa loob ng aking mga operating Naaalala ng sistema na ang aking resume ay sa 123 lokasyon. Ngunit ito ay makakakuha ng kawili-wiling kapag tinanggal mo ang isang file. Kaya halimbawa - at thankfully, karamihan ng mundo ay nahuli sa ito - kung ano ang mangyayari kapag i-drag mo ang isang file sa iyong Basura Mac OS o iyong Windows Recycle Bin? Ano ang layunin ng paggawa na? Ito ay malinaw naman upang makakuha ng mapupuksa ang mga file, ngunit kung ano ang ipinapakita ng kilos ng pag-drag at pag-drop sa iyong Basurahan o ang iyong Recycle Bin gawin sa isang computer? Talagang wala, talaga. Ito ay tulad ng isang folder. Ito ay isang espesyal na folder, upang maging sigurado. Ngunit ang ibig talagang tanggalin ang file? Well, walang, dahil ang ilan sa iyo marahil naging tulad ng, oh mapahamak, ikaw ay hindi ibig sabihin upang gawin iyon. Kaya mong i-double click ang Basurahan o Recycle Bin. Nag-poked sa paligid at na-recover ang mga file sa pamamagitan lamang ng pag-drag nito sa labas ng doon. Kaya malinaw, ito ay hindi kinakailangang pagtanggal nito. OK, ikaw ay mas madunong kaysa sa na. Alam mo na lamang ng pag-drag ito papunta sa Basurahan o Recycle Bin ay hindi nangangahulugan na ka tinatanggalan ng laman ang basurahan. Kaya kang pumunta ng hanggang sa ang menu, at sasabihin sa iyo Walang laman na Basura o Empty Recycle Bin. Pagkatapos, anong mangyayari? Oo, sa gayon ito ay tinanggal na mas kaya. Ngunit lahat ng iyon ay mangyayari ito. Ang computer na kung saan forgets resume.doc noon. Ngunit kung ano ay hindi nagbago sa malas sa larawan? Ang bits, ang 0s at 1s na sinasabi ko ay sa site ng ilang mga pisikal na aspeto ng ang hardware. Ang mga ito ay pa rin doon. Ito ay lamang ang computer ay may nakalimutan kung ano sila. Kaya mahalagang ito ay napalaya ng file bit sa gayon ay maaari silang ma-reused. Ngunit hindi hanggang sa lumikha ka ng higit pang mga file, at higit pang mga file, at higit pang mga file kalooban probabilistically, mga 0s at 1s, mga magnetic particle, makapag-reused, nakabaligtad o kanang bahagi up, para sa iba pang mga file, 0s at 1s. Kaya mayroon kang ang window na ito ng panahon. At ito ay hindi na predictable haba, talaga. Ito ay depende sa laki ng iyong hard biyahe at kung gaano karaming mga file na mayroon ka at kung paano mabilis na gumawa ka ng mga bago. Ngunit mayroong window na ito ng oras sa panahon ng na file na isa pa ring ganap na ganap maibabalik muli. Kaya kung sakaling gamitin ang mga programa tulad ng McAfee o Norton upang subukan upang mabawi ang data, ang lahat ng kanilang ginagawa ay sinusubukang i- mabawi ito tinaguriang direktoryo upang maisip kung saan ang iyong mga file ay. At minsan ay Norton at sasabihin, file ay 93% makuha. Well, ano ang na ibig sabihin nito? Iyon ay nangangahulugan lamang na ang ilang mga iba pang mga file coincidentally napunta paggamit, sabihin nating, mga bits out sa iyong orihinal na file. Kaya kung ano ay aktwal na kasangkot sa pagbawi ng data? Well, kung wala kang isang bagay tulad ng Norton pre-install sa iyong computer, ang pinakamahusay na maaari mong gawin kung minsan ay tumingin sa buong hard drive naghahanap para sa pattern ng mga piraso. At ang isa sa mga tema ng problema set lima ay na kayo ay maghanap sa katumbas ng isang hard drive, isang forensic imahe ng isang compact flash card mula sa isang digital camera, naghahanap para sa 0s at 1s na karaniwang, na may mataas na bagay na maaaring mangyari, ay kumakatawan sa magsimula ng isang imahe JPEG. At ka guys ay maaaring mabawi ang mga larawang iyon sa pamamagitan ng ipagpalagay, kung makikita ko ang pattern na ito ng bits sa forensic imahe, na may mataas na posibilidad, na nagmamarka sa simula ng isang JPEG. At kung makita ko ang mga parehong pattern muli, na marahil ay nagmamarka ng simula ng isa pang JPEG, at isa pa JPEG, at isa pang JPEG. At ito ay karaniwang kung paano data pagbawi gagana. Ano ang maganda tungkol sa mga JPEG ay kahit na ang format ng file mismo ay medyo complex, simula ng bawat tulad file ay talagang walang kinikilingan na makikilalang at simple, bilang nang nakikita mo, kung ikaw ay hindi pa. Kaya natin ng malapitan hitsura sa ilalim ang hood bilang sa kung ano mismo ang nangyaring pagpunta sa, at kung ano ang mga 0s at 1s ay, upang bigyan ka ng isang bit higit pa sa isang konteksto para sa partikular na hamon. [Video playback] -Kung saan ang iyong PC nag-iimbak ng pinaka- ng kanyang permanenteng data. Upang gawin na, ang data mula sa paglalakbay RAM kasama ang software na signal na sabihin ang hard drive kung paano i-imbak ang data na iyon. Ang mahirap circuits biyahe isalin mga signal sa boltahe pagbabagu-bago. Ang mga ito, siya namang, kontrolin ang hard drive ni paglipat ng mga bahagi, ang ilan sa mga ilang paglipat ng mga bahagi naiwan sa modernong computer. Ang ilan sa mga signal na kontrolin ang isang motor na spins metal-pinahiran platters. Ang iyong data ay aktwal na naka-imbak sa mga platters. Iba pang mga signal ilipat ang basahin / isulat ulo upang basahin o magsulat ng data sa platters. Ito makinarya kaya tumpak na ang isang tao buhok ay hindi kahit na pumasa sa pagitan ng mga ulo at Umiikot na platters. Ngunit, ang lahat ng ito ay gumagana sa mga bilis ng nakakikilabot. [END-playback ng video] David MALAN: Mag-zoom in ng kaunti mas malalim na ngayon sa kung ano ang talaga sa mga platters. [Video playback] -Tingnan natin kung ano ang aming lamang Nakita sa mabagal na kilos. Kapag ang isang maikling pulso ng koryente ay ipinadala sa basahin / isulat ang ulo, kung flips sa isang maliit na maliit electromagnetic para sa isang bahagi ng isang segundo. Ang pang-akit ay lumilikha ng isang patlang, na mga pagbabago sa polarity ng isang maliit na maliit, maliit na maliit bahagi ng metal particle na sako bawat platter ibabaw. Ang isang pattern serye ng mga maliliit na, nasingil-up na lugar sa disk ay kumakatawan sa isang solong bit ng data sa mga numero ng binary system na ginagamit ng mga computer. Ngayon, kung ang kasalukuyang ay nagpadala ng isang paraan sa pamamagitan ng read / write head, ang lugar na ay polarized sa isa direksyon. Kung ang kasalukuyang ay ipinadala sa tapat na direksyon, ang polariseysyon ay baligtad. Paano makakakuha ka ng data off ang hard disk? Lamang baligtarin ang proseso. Kaya ito ang mga particle sa disk na makuha ang kasalukuyang sa basahin / isulat ang ulo gumagalaw. Ilagay ang sama-sama ng milyun-milyong mga magnetized segment, at mayroon ka ng isang file. Ngayon, ang mga piraso ng isang solong file maaari ay nakakalat sa lahat sa ibabaw ng isang biyahe ni platters, uri ng tulad ng gulo ng mga papeles sa iyong mesa. Kaya isang espesyal na file dagdag Sinusubaybayan ng kung saan lahat ng bagay ay. Huwag na nais mong kayo ay nagkaroon ng isang bagay tulad na? [END-playback ng video] David MALAN: OK, marahil hindi. Kaya kung gaano karaming ng ka guys lumago up sa mga ito? OK, kaya mas kaunting at mas kaunting mga kamay sa bawat taon. Ngunit Natutuwa akong ikaw ay hindi bababa sa pamilyar sa kanila, sapagkat ito at ang aming sariling aklat demo, sadly, ang mga namamatay na isang napaka- pabagalin kamatayan dito ng pagpapalagayang-loob. Ngunit ito ay kung ano ang ko, hindi bababa sa, pabalik sa mataas na paaralan, ginamit na paggamit para sa pag-backup. At ito ay kamangha-manghang, dahil ikaw maaaring iimbak 1.4 megabytes sa ang partikular na disk. At ito ay ang mataas na bersyon density, tulad ng ipinahiwatig ng HD, na mayroong ibig sabihin bago HD video ngayon. Standard density ay 800 kilobytes. At bago na, mayroong 400-kilobyte mga disk. At bago na, mayroong 5 at 1/4 inch disk, na kung saan ay tunay na tumbahin, at isang maliit na mas malawak at taller kaysa sa mga bagay na ito dito. Ngunit maaari ka talaga makita ang mga tinaguriang tumbahin aspeto ng mga disk. At pagtakbo, ang mga ito ay aktwal na medyo katulad sa hard drive ng sa hindi bababa sa ganitong uri. Muli, SSDs sa mas bagong computer gumana medyo naiiba. Ngunit kung ililipat mo na ang maliit na tab metal, Maaari mo talaga makita ang isang maliit na cookie, o pinggan. Ito ay hindi metal tulad ng isang ito. Isa na ito ay aktwal na ang ilang mga mas mura plastic na materyal. At maaari mong uri ng pagkakawag ito. At trully mo na lang wiped off ang ilang mga bilang ng bits o magnetic particle mula sa disk. Kaya thankfully, wala sa mga ito. Kung bagay na nasa mga paraan - at takpan ang iyong mga mata at doon sa iyong kapwa - Maaari mo lamang uri ng hilahin ito buong upak off tulad na. Subalit mayroong isang maliit na spring, kaya maging kamalayan ng na kasama ng iyong mga mata. Kaya ngayon ikaw ay tunay na isang tumbahin disk. At kung ano ang tungkol sa kahanga-hangang ito ay na in bilang magkano ang bilang na ito ay isang maliit na-scale na representasyon ng isang mas malaking hard drive, ang mga bagay na ito ay sukdulang, sobrang simple. Kung kurutin sa ilalim ng ito, ngayon na metal na bagay ay off, at alisan ng balat buksan ang mga ito, ang lahat ng mayroon ang dalawang piraso ng nadama at ng tinatawag na disk tumbahin may isang piraso ng metal sa loob. At doon napupunta kalahati ng ang aking mga laman ng disk. May napupunta isa pang kalahati ng mga ito. Ngunit iyon lamang ang lahat ng iyon ay Umiikot na loob ng iyong computer sa nakalipas na panahon. At muli, upang ilagay ito sa pananaw, gaano kalaki ang karamihan sa iyong matapang na nag-mamaneho nang mga araw na ito? 500 gigabytes, isang terabyte, marahil sa isang desktop computer, 2 terabytes, 3 terabytes, 4 terabytes, tama? Ito ay isa megabyte, bigyan o kumuha, na hindi maaaring kahit na umaangkop sa isang tipikal na MP3 ngayon mga araw na ito, o ilang katulad ng musika file. Kaya ng kaunti souvenir para sa iyo ngayon, at rin upang makatulong contextualize ano lilikha kami paglalaan para sa ipinagkaloob ngayon sa problema itakda limang. Kaya iyon ay inyo upang panatilihin. Kaya hayaan mo akong lumipat sa kung saan magiging gumagastos ng susunod na pset pati na rin. Kaya ngayon namin na-set ang pahinang ito para sa - oh, isang pares ng mga anunsyo ng mabilis. Ito Biyernes, kung gusto mong sumali CS50 para sa tanghalian, pumunta sa karaniwang lugar, cs50.net/rsvp. At huling proyekto - kaya ang bawat syllabus, aming na-post ang huling proyekto na pagtutukoy. Napag-alaman na iyon ay hindi nangangahulugan na ito ay dahil lalo na sa lalong madaling panahon. Ito ay nai-post, talaga, lamang upang makakuha ng mo guys pag-iisip tungkol dito. At sa katunayan, isang napaka-makabuluhang porsyento ng iyong ibibigay ay tackling huling proyekto sa materyal na namin hindi pa kahit na nakuha na sa klase, ngunit ito ay mas maaga sa susunod na linggo. Abiso, bagaman, na ang spec para sa mga tawag ng ilang iba't ibang mga bahagi ng huling proyekto. Ang una, sa loob ng ilang linggo, ay isang pre-proposal, isang magandang kaswal na e-mail sa ang iyong tf na sabihin sa kanya kung ano o ikaw ay nag-iisip tungkol sa para sa iyong proyekto, na may walang commitment. Panukala sa iyong magiging partikular na pangako, na sinasabi, dito, ito ay kung ano ang Gusto kong gawin para sa aking proyekto. Ano sa tingin ninyo? Masyadong malaki? Masyadong maliit? Ito ba ay napapamahalaang? At nakita mo ang spec para sa karagdagang detalye. Dalawang linggo pagkatapos na ay ang katayuan ulat, na kung saan ay isang katulad kaswal na email sa iyong tf sasabihin lamang kung paano malayo sa likod ikaw ay nasa iyong panghuling proyekto pagpapatupad, na sinusundan ng ang CS50 Hackathon na kung saan ang lahat ng tao ay inimbitahan, na kung saan ay magiging isang kaganapan mula sa 20:00 sa isa gabi hanggang 07:00 AM sa susunod na umaga. Pizza, na maaaring ko pa nabanggit sa linggo zero, Wil ihain sa 9:00, Chinese food sa 01:00. At kung hindi mo pa rin gising sa 5:00, magpapadala kami magdadala sa iyo sa IHOP para sa almusal. Kaya ang Hackathon ay isa sa mga mas di malilimutang karanasan sa klase. Pagkatapos ang pagpapatupad ay dapat bayaran, at pagkatapos ay ang climactic CS50 Fair. Higit pang mga detalye sa lahat ng mga sa linggo na dumating. Ngunit sabihin bumalik sa isang bagay lumang paaralan - muli, isang array. Kaya array ay isang magaling, sapagkat ito malulutas nito problema tulad ng nakita natin lamang ilang sandali ang nakalipas may mga istraktura mag-aaral pagkuha ng kaunti sa labas ng kontrol kung namin nais na magkaroon ng mag-aaral ng isa, dalawang mag-aaral, tatlong mag-aaral, mag-aaral na tuldok tuldok tuldok, ilang arbitrary na numero ng mga mag-aaral. Kaya array, ng ilang linggo ang nakalipas, sa swooped at nalutas ang lahat ng aming mga problema ng hindi pag-alam nang maaga kung gaano karaming mga bagay ng ilang mga uri maaari naming gusto. At nakakita kami na structs ay maaaring makatulong sa amin higit pang ayusin ang aming mga code at panatilihing conceptually katulad na variable, tulad ng isang pangalan at ng bahay, sama-sama, kaya na namin maaaring tratuhin ang mga ito bilang isa entity, sa loob kung saan mayroong mga mas maliit na piraso. Ngunit array ay may ilang mga disadvantages. Ano ang ilan sa mga disadvantages nakita kaming may array kaya ngayon? Ano iyan? Fixed laki - kaya kahit na maaari mong magagawang magtalaga ng memory para sa isang array, sa sandaling alam mo kung gaano karaming mga mag-aaral mayroon ka, kung gaano karaming mga character na mayroon kang mula sa gumagamit, sa oras na iyong inilaan ang array, mo na ang uri ng lagyan ng kulay ang iyong sarili sa isang sulok. Dahil hindi ka maaaring magpasok ng mga bagong elemento sa gitna ng isang array. Hindi ka maaaring magpasok ng higit pang mga elemento sa dulo ng isang array. Talagang, kailangan mong resort sa paglikha ng isang buong bagong array, bilang namin tinalakay, pagkopya sa lumang sa bagong. At muli, iyon ay ang sakit ng ulo na GetString deal na may para sa iyo. Ngunit muli, kahit na hindi ka maaaring magpasok ng isang bagay sa gitna ng array kung ang rate ay hindi ganap na puno. Halimbawa, kung ito array dito ng laki anim lamang ay may limang bagay na nasa loob nito, na rin, maaari mo lamang magtamtak isang bagay papunta sa dulo. Ngunit ano kung nais mong magpasok ng isang bagay sa gitna ng array, kahit na maaaring mayroon limang out ng anim na mga bagay sa loob nito? Well, kung ano ang ginagawa namin kapag nagkaroon kami lahat sa aming mga boluntaryo ng tao onstage sa nakaraang linggo? Kung gusto naming ilagay ang isang tao dito, alinman sa ang mga taong ito kung paano upang ilipat ito paraan, o ang mga taong ito kung paano upang ilipat ito paraan, at iyon ay naging mahal. Ang paglilipat ng mga tao sa loob ng isang array nagtapos ang pagdaragdag ng up at nagkakahalaga ng oras sa amin, kaya marami sa aming mga n squared panahon ng pagtakbo tulad ng pagpapasok ng uri, para sa Halimbawa, sa pinakamasama kaso. Kaya array ay mahusay, ngunit mayroon kang i- alam nang maaga kung gaano kalaki ang gusto mo ang mga ito. Kaya OK, narito ang isang solusyon. Kung hindi ko alam nang maaga kung gaano karaming mga mag-aaral ay maaaring ba akong magkaroon, at alam ko isang beses Magpasya ko, kahit na, ako natigil na may maraming mga mag-aaral, bakit hindi ko na lang lagi magtalaga ng dalawang beses ng mas maraming espasyo bilang ay maaaring sa tingin ko kailangan ko? Iyan ba ay hindi isang makatwirang solusyon? Realistically, Hindi sa tingin ko na kami ay pagpunta sa kailangan ng higit sa 50 mga puwang ng sa isang array para sa isang medium-size na klase, kaya sabihin lamang paglilikom. Magtatagal ako gumawa ng 100 mga puwang sa aking array, lamang upang maaari naming siguradong makuha ang bilang ng mga mag-aaral na inaasahan kong maging sa ilang mga medium-size na class. Kaya bakit hindi lamang paglilikom at maglaan mas memory, karaniwan, para sa isang array kaysa sa tingin mo na maaari mong kahit na kailangan? Ano ito simpleng pushback sa na ideya? Lamang ka pag-aaksaya memory. Literal bawat programa sumulat ka pagkatapos siguro ay gumagamit ng dalawang beses bilang magkano ang memorya ng ang talagang kailangan. At na lamang ay hindi pakiramdam tulad ng isang lalo eleganteng solusyon. Higit pa rito, ito lamang ay nababawasan ang posibilidad ng isang problema. Kung mangyari sa iyo na magkaroon ng isang popular na kurso isa semestre at mayroon kang 101 mga mag-aaral, ang iyong programa ay pa rin sa panimula nakaharap sa parehong isyu. Kaya thankfully, mayroong isang solusyon upang ad na ito ang lahat ng aming mga problema sa anyo ng mga istraktura ng data na mas kumplikado kaysa sa mga bago nasaksihan namin kaya sa ngayon. Ito, inaangkin ko, ay isang naka-link na listahan. Ito ay isang listahan ng mga numero ng - 9, 17, 22, 26, at 34 - na nai-link nang magkasama sa pamamagitan ng paraan ng kung ano ang ko na iginuhit ng mga arrow. Sa ibang salita, kung Nais kong kumatawan isang array, maaari kong gawin isang bagay na katulad nito. At makikita ko bang ilagay ito sa overhead sa loob lamang ng ilang sandali. Maaari kong gawin - kumusta, ang lahat ng karapatan. Stand sa pamamagitan ng. Bagong computer dito, malinaw - lahat ng karapatan. Kaya kung mayroon akong mga numerong ito sa array - 9, 17, 22, 26, 24 - hindi kinakailangan upang masukat. Ang lahat ng mga karapatan, kaya dito ay ang aking array - oh aking diyos. Ang lahat ng mga karapatan, kaya dito ay ang aking array. Oh aking diyos. [Tawa] David MALAN: magpanggap. Ito'y masyadong magkano ang pagsisikap upang bumalik at ayusin na, kaya doon - 26. Kaya mayroon kaming ito array ng 9, 17, 22, 26, at 34. Para sa mga mo makita ang nakakahiyang pagkakamali ko lang ginawa, Mayroon bang ito ay. Kaya inaangkin ko na ito ay isang napaka mahusay na solusyon. Ko na inilalaan ng maraming mga ints bilang Kailangan ko - isa, dalawa, tatlo, apat, lima, o anim - at pagkatapos ko na naka-imbak ang mga numero sa loob ng array na ito. Ngunit ipagpalagay, pagkatapos, gusto kong isingit ng halaga tulad ng mga numero ng 8? Well, kung saan ay ito pumunta? Ipagpalagay na gusto kong isingit isang numero tulad ng 20. Well, kung saan ay ito pumunta? Mayroon bang isang lugar sa gitna, o ang bilang 35 ay may upang pumunta sa isang lugar sa dulo. Ngunit Ako lahat nang puwang. At kaya ito ay isang pangunahing hamon ng array na ay ang solusyon. I-claim ng ilang sandali ang nakalipas, GetString malulutas nito ang problemang ito. Kung nais mong isingit 1/6 na numero sa array na ito, kung ano ang hindi bababa sa isang solusyon maaari mong umasa sa para sigurado, tulad ng ginagawa namin sa GetString? Ano iyan? Well, gawin itong mas malaki na ay mas madaling sinabi kaysa sa tapos na. Hindi kinakailangan namin magagawa ang array mas malaki, ngunit kung ano ang maaari naming gawin? Gumawa ng isang bagong array na mas malaki, laki ng 6, o marahil size 10, kung gusto naming upang makakuha ng maaga ng mga bagay, at pagkatapos ay kopyahin ang lumang array sa bago, at pagkatapos ay magbakante ang lumang array. Ngunit ano ang tumatakbo oras ngayon ng na proseso? Ito ay malaki ng O n, dahil ang pagkopya ay pagpunta sa gastos sa iyo ng ilang mga yunit ng oras, kaya hindi kaya mainam kung kami ay may sa magtalaga ng isang bagong array, na kung saan ay pagpunta upang ubusin dalawang beses bilang magkano pansamantalang memory. Kopyahin lumang sa bagong - Ibig kong sabihin, ito lamang ay isang sakit ng ulo, na ay, muli, kung bakit kami ay sumulat GetString para sa iyo. Kaya kung ano ang maaari naming gawin sa halip? Well, kung ano kung ang aming data istraktura talaga ay may gaps sa ito? Ipagpalagay na ako mamahinga ang aking mga layunin ng pagkakaroon ng magkadikit chunks ng memorya, kung saan 9 ay sa tabi mismo ng 17, na kung saan ay sa tabi mismo ng 22, at iba pa. At ipagpalagay na 9 ay maaaring maging sa paglipas dito sa RAM, at 17 ay maaaring sa paglipas dito sa RAM, at 22 ay maaaring sa paglipas dito sa RAM. Sa ibang salita, hindi ko kailangan ang mga ito kahit na i-back-back na ngayon. Ko na lang ay upang kahit papaano thread ng karayom sa pamamagitan ng bawat isa sa mga numero, o bawat ng mga nodes, dahil kakailanganin naming tawagan ang parihaba bilang ko na iginuhit sa kanila, upang matandaan kung paano makapunta sa huling tulad node mula sa unang. Kaya kung ano ang programming ang bumuo nasaksihan namin medyo kamakailan na kung saan ako maaaring ipatupad na thread, o iginuguhit dito, na kung saan ang maaari kong ipatupad ang mga arrow? Kaya payo, tama? Kung maglaan ako hindi lamang isang int, ngunit isang node - at sa pamamagitan ng node, ko lang ang ibig sabihin ng lalagyan. At biswal, ibig sabihin ako ng isang parihaba. Kaya node isang wari ay kailangang upang maglaman ng dalawang halaga - ang int mismo, at pagkatapos, tulad ng ipinahiwatig sa pamamagitan ng ibabang kalahati ng mga parihaba, sapat na puwang para sa isang int. Kaya lang iniisip maaga dito, kung paano malaki ay node na ito, ito lalagyan na pinag-uusapan? Gaano karaming bytes para sa int? Siguro 4, kung ito ay katulad ng dati. At pagkatapos ay kung gaano karaming mga byte para ang pointer? 4. Kaya ito lalagyan, o ito node, ay pagpunta sa maging isang 8-byte na istraktura. Oh, at iyan ay isang masaya na pagkakatulad lang namin ipinakilala ang pagkaunawa ng isang struct, o isang C istraktura. Kaya inaangkin ko na gusto kong gumawa ng isang hakbang patungo ito na mas sopistikadong pagpapatupad ng isang listahan ng mga numero, isang naka-link na listahan ng mga numero, kailangan kong gawin ang isang kaunti pa pag-iisip up harap at ipinapahayag hindi lamang sa isang int, ngunit isang struct na Tatawag ako, conventionally dito, node. Maaari naming tumawag ito anumang bagay na gusto namin, ngunit node ay magiging pampakay ng maraming ng mga bagay na sisimulan namin ang pagtingin sa ngayon. Sa loob ng na node ay isang int n. At pagkatapos ay ang syntax na ito, ang kaunti kakaiba sa unang tingin - struct node * susunod. Well pictorially, ano iyon? Iyon ay sa ilalim na kalahati ng ang parihaba na aming nakita sandali lamang ang nakalipas. Ngunit bakit ako sinasabi struct node * na taliwas sa lamang node *? Dahil kung pointer na nakaturo ang sa isa pang node, ito lamang ang address ng isang node. Iyon ay pare-pareho sa kung ano na namin napag-usapan tungkol sa mga payo kaya sa ngayon. Ngunit bakit, kung inaangkin ko ang istraktura na ito ay tinatawag na node, kailangan kong sabihin struct node loob dito? Mismong. Ito ay uri ng isang ugok katotohanan ng C. Ang typedef, kaya na magsalita, ay hindi nangyari pa. C ay sobrang literal. Ito bumabasa ng iyong code sa tuktok ibaba, kaliwa hanggang kanang. At hanggang sa ito ay umabot na tuldok-kuwit sa bottom line, hulaan kung ano ang hindi umiiral bilang isang uri ng data? Node, quote magpanipi node. Ngunit dahil sa ang higit pa masyadong masalita deklarasyon ginawa ko sa unang linya - typedef struct node - dahil iyon ay dumating una, bago ang kulot tirante, na ang uri ng mga tulad ng pre-educating kalatungin na, mo malaman kung ano ang, ninyo ako ng struct tinatawag struct node. Lantaran, hindi ko gusto pagtawag bagay struct node, struct node lahat sa buong aking code. Ngunit kukunin ko na lang gamitin ito nang isang beses, lamang loob, sa gayon ay maaari ko nang epektibo lumikha ng isang uri ng pabilog na sanggunian, hindi isang pointer sa sarili ko per se, ngunit isang pointer sa isa pang ng ang isang kaparehong uri. Kaya ito lumiliko out na sa isang istraktura ng data tulad nito, mayroong ilang operasyon na maaaring maging ng interes sa amin. Maaari naming nais upang ipasok sa isang listahan na tulad nito. Maaari naming gusto mong tanggalin ang mula sa isang listahan na tulad nito. Maaari naming nais upang maghanap sa listahan para sa isang halaga, o sa mas pangkalahatang paraan, pagtawid. At pagdaraan lamang ang isang magarbong paraan ng sinasabi ng mga pagsisimula sa kaliwa at ilipat ang lahat ng mga paraan sa kanan. At notice, kahit na may ito bahagyang higit pa sopistikadong istraktura ng data, sabihin ipanukala sa akin na maaari naming humiram ng ilang mga ang ideya ng nakalipas na dalawang linggo at ipatupad ang isang function na tinatawag na maghanap ganito. Ito ay pagpunta sa bumalik totoo o hindi totoo, na nagpapahiwatig, oo o walang, n ay nasa listahan. Ang pangalawang argumento ay isang pointer sa listahan ng sarili nito, kaya isang pointer sa isang node. Ang lahat ng mga pupuntahan ko pagkatapos gawin ay idedeklara isang pansamantalang variable. Susubukan naming tumawag ito ptr sa pamamagitan ng convention, para pointer. At magtalaga ko ito katumbas ng simula ng listahan. At ngayon mapansin ang habang loop. Kaya't hangga't pointer ay hindi kapantay sa null, pupuntahan ko check. Ay pointer arrow n katumbas ng sa n na nakapasa sa? At maghintay ng isang minuto - bagong piraso ng syntax. Ano ang arrow lahat ng isang biglaang? Oo? Mismong. Kaya samantalang ng ilang minuto ang nakalipas, ginamit namin ang tuldok notasyon upang ma-access ang isang bagay sa loob ng isang struct ang, kung ang variable mo ay hindi ang struct mismo, ngunit isang pointer sa isang struct, thankfully, isang piraso ng syntax na sa wakas ay ginagawang madaling maunawaan kahulugan. Arrow Ang ibig sabihin nito upang sundin ang pointer, tulad ng ating mga arrow karaniwang ibig sabihin pictorially, at pumunta sa data field sa loob. Kaya arrow ay ang parehong bagay bilang tuldok, ngunit mo itong gamitin kapag mayroon kang isang pointer. Kaya lang sa paglalagom pagkatapos, kung ang patlang na n sa loob ng struct tinatawag pointer katumbas ay katumbas n, nagbabalik ng tunay. Kung hindi man, ang linyang ito dito - pointer ay katumbas ng pointer susunod. Kaya kung ano ito ay paggawa, paunawa, ay kung ako ako ay kasalukuyang nagtuturo sa struct na naglalaman ng 9, at 9 ay hindi ang bilang Naghahanap ako - ipagpalagay Naghahanap ako para n katumbas ng 50 - Pupunta ako sa update ang aking pansamantalang pointer upang hindi ituro sa node na ito ngayon, ngunit ang pointer ng arrow sa tabi, na ay pagpunta sa ilagay up ako dito. Ngayon, napagtanto ko ay isang ipoipo pagpapakilala. Sa Miyerkules, ipapakita namin talagang gawin ito na may ilang mga kawani na tao at may ilan pa code sa isang mas mabagal na bilis. Ngunit napagtanto, ngayon ginagawa namin ang aming data kaayusan na mas kumplikado upang ang aming mga algorithm ay maaaring makakuha ng mas mahusay, na ay magiging bagay na kailangan para sa pset anim, kapag kami sa load, muli, mga 150,000 mga salita, ngunit kailangan na gawin ito mahusay, at may perpektong, lumikha ng programa na tumatakbo para sa aming mga gumagamit ay hindi sa linear, hindi sa n squared, ngunit sa pare-pareho ang oras, sa tamang-tama. Gagamitin namin ang nakikita mo sa Miyerkules. Tagapagsalita: Sa susunod na CS50, David forgets kanyang base kaso. David MALAN: At na kung paano mo ipadala mga text message na may C. Ano ang - [Iba't-ibang mga TEXT MESSAGE NOTIFICATION tunog]