DAVID Malan: Të gjithë të drejtë, të mirëpritur mbrapa. Kjo është CS50. Ky është fillimi i javës së shtatë. Pra, ajo ka qenë një kohë, kështu që mendova që ne do të marrë një turne shakullinë e ku ne lënë jashtë dhe ku ne jemi duke shkuar tani. Pra, kjo gjë mund të ketë këtu shkaktuar disa Angst në fillim. Por, shpresojmë se, ju jeni duke filluar të acclimate për atë që kjo tregon këtu - yll përfaqëson një tregues, i cili është vetëm atë që, në kushtet e laik e më shumë? Pra, kjo është një adresë. Pra, kjo është adresa e diçka në kujtesë. Dhe kemi filluar të zhvishem përsëri shtresat nja dy javë më parë, gjëra të tilla si Funksionet getString dhe të tjera të tilla gjithë kësaj kohe kanë qenë të kthyer Adresat e gjërave në memorie, si Adresën e karakter pare ne disa sekuenca. Pra, ne gjithashtu paraqiti Shprehje, e cila që ju do të filloni të përdorni për këtë problem vendosur, veçanërisht për të ardhshëm Problemi vendosur si edhe. Dhe Shprehje çfarë bën për ne? Ajo kontrollon për rrjedhjet e kujtesës, dhe kjo gjithashtu kontrollon për abuzim të kujtesës. Ajo mund, me disa gjasave, zbuluar nëse Kodi juaj do të prekë kujtesën se ajo thjesht nuk duhet. Pra jo domosdoshmërisht një rrjedhje, por në qoftë se ju shkojnë përtej kufijve të disa array, dhe ju në të vërtetë të kandidojë Shprehje dhe shkaktojnë këtë sjellje, ndërsa Shprehje po kandidon në programin tuaj është drejtimin në brendësi të saj, ju do të merrni mesazhe si ky - "pavlefshme shkruaj e Madhësia 4 ", e cila, kujtojnë një çift të javë më parë thoshte se kisha aksidentalisht si në një int shumë larg përtej kufijve të një rrjet. Dhe kështu madhësi 4 do të thotë këtu madhësinë e asaj int veçantë. Kështu që të marrin siguroheshin në faktin se Shprehje e prodhimit, formati i saj, është vetëm mizor. Është e vërtetë e vështirë për të parë përmes rrëmujë për informata interesante. Pra ajo që kemi bërë këtu është vetëm fragment disa prej dy prej më Linjat interesante. Por të kuptojë se 80% e së Shprehje prodhimi do të jetë pak e një çmenduri. Vetëm shikoni për modele si këto - pavlefshme të drejtë, e pavlefshme lexohen, 40 bytes dhe numrin e disa blloqe janë patjetër humbur, me fjalë kyçe si kjo. Dhe çfarë shpresojmë se ju do të shihni disa lloj gjurmë të asaj që të funksionojë Gabimi është në të vërtetë in Në këtë rast këtu, në atë linjë të kodi im ishte gabim me sa duket? 26 në një dosje të quajtur memory.c, e cila ishte Shembulli ne ishim duke luajtur me në kohë. Pra, kjo nuk është ndoshta në malloc. Ajo ishte ndoshta në kodin tim në vend. Pra ne do të shohim këtë përsëri dhe përsëri para se të gjatë. Pra scanf, kjo erdhi deri në një Çifti i formave deri tani. Ne pamë sscanf shkurtimisht. Kjo ishte diçka që një numër i ti fetar në në tuaj përgatitjet për quiz. Dhe scanf është në të vërtetë ajo që CS50 Biblioteka ka qenë duke përdorur nën kapuç për mjaft kohë në mënyrë për të marrë të dhëna nga përdoruesi. Për shembull, në qoftë se unë të lëvizë mbi të CS50 aplikim këtu, më lejoni të hapur një Shembulli që sot quhet scanf 0.c- Dhe kjo është e thjeshtë super. Është vetëm disa rreshta të kodit. Por kjo tregon me të vërtetë se si getInt ka qenë duke punuar të gjithë këtë kohë. Në këtë program Këtu, në përputhje 16 , Njoftim se unë deklaroj një int. Pra, nuk ka asgjë magjike pointers, atje, vetëm një int. Pastaj në linjë 17, unë shkaktonte shfrytëzues për një numër, ju lutem. 18 Pastaj në fund, unë përdorin scanf këtu. Dhe unë specifikuar, lloj si printf, që unë jam duke pritur kuotë i mbyll thonjëzat për qind. Pra qind Unë, natyrisht, tregon një int. Por njoftim se çfarë dytë Argumenti për scanf është. Si do ta përshkruanit dytë Argumenti pas presjes? Çfarë është kjo? Kjo është adresa e x. Pra, kjo është e dobishme për shkak se duke siguruar scanf me adresën e x, çfarë e bën që të fuqizojë atë funksion për të bërë? Jo vetëm të shkojnë atje, por edhe të bëjë çfarë? Bëni një ndryshim tek ajo. , Sepse ju mund të shkoni atje, kjo është lloj i si një hartë në një vend në kujtesë. Dhe për aq kohë sa ju japin scanf, ose ndonjë funksion me një hartë të tillë, që Funksioni mund të shkojë atje, dhe jo vetëm shikoni në vlerë, por ai gjithashtu mund të ndryshuar këtë vlerë, e cila është e dobishme në qoftë se Qëllimi i jetës është për të scanf scan dhëna nga përdoruesit, në mënyrë specifike nga keyboard. Dhe f tregon formatuar, ashtu si printf, f tregon një formatuar string që ju doni të shtypura. Pra me pak fjalë, kjo 18 linja thjesht thotë, përpiqen për të lexuar një int nga përdoruesit e tastierë dhe ruajtur atë brenda x, në Adresa çfarëdo x ndodh të jetojnë në të. Dhe pastaj së fundi, linjë 19 vetëm thotë, thanks for int, në këtë rast. Pra më lejoni të shkoj përpara dhe të bëjë këtë. Pra, të bëjë scanf 0. Më lejoni të shkojnë përpara dhe zoom in Unë do të shkoj dhe të drejtuar këtë me dots zvogëlojë scanf 0. Numri, ju lutëm? 50. Faleminderit për 50. Pra, kjo është mjaft e thjeshtë. Tani çfarë nuk është bërë kjo? Kjo nuk është bërë një bandë e tërë e kontrollit të gabimit. Për shembull, në qoftë se unë nuk bashkëpunojnë, dhe unë nuk e shkruani në një numër, por në vend që unë shkruaj diçka si "hello", kjo është vetëm një lloj të çuditshme. Dhe kështu një nga gjërat CS50 Biblioteka ka qenë bërë për ne për disa Ora është se reprompting dhe reprompting. Rigjykuar risjell frazë ishte në cs50.c, dhe kjo është arsyeja që në getInt Biblioteka CS50 është në fakt një e tërë bandë e linjave të gjata, sepse ne jemi kontrolluar për gjëra idiote si kjo. A nuk të japë përdoruesit na, në fakt, një int? A ai ose ajo të na japë diçka si një letër të alfabetit? Nëse është kështu, ne duam të zbuluar se dhe bërtas në to. Por gjërat më interesante në këtë shembull tjetër. Nëse unë shkoj në scanf-1.c, çfarë është një gjë që është ndryshuar rrënjësisht në ky shembull tjetër? Unë jam duke përdorur * char, natyrisht, në vend të int. Pra, kjo është interesante, sepse * char, kujtoj, është me të vërtetë vetëm e njëjta gjë si string. Pra, ai ndjehet si ndoshta kjo është një super Zbatimi i thjeshtë i getString. Por unë kam peeled prapa shtresa e bibliotekës CS50, kështu që unë jam char * duke e quajtur këtë tani. Pra, le të shohim se ku, nëse kudo, Ne të shkojnë keq. Line 17 - Unë them përsëri, ju lutem jepni diçka, në këtë rast, një varg. Dhe pastaj në vijën e ardhshëm, ju bëj thirrje scanf, përsëri, duke i dhënë asaj një kod format, por kjo s koha për qind. Dhe pastaj kjo kohë, unë jam duke i dhënë asaj tampon. Tani vini re, unë nuk jam duke përdorur simbol. Por pse është se ndoshta OK këtu? Sepse ajo është tampon tashmë? Kjo është tashmë një akrep. Kjo është tashmë një adresë. Dhe le kjo fjala "ngatërruar", më lejoni vetëm e quajti atë s, për shembull, për thjeshtësia. Por unë e kam quajtur atë tampon sepse në përgjithshëm, në programim, nëse ju keni një copë e kujtesës, e cila një varg të vërtetë vetëm është, ju mund të telefononi atë një tampon. Kjo është një vend për të ruajtur informacione. Ngjashëm me gjëra të tilla si YouTube, kur ata janë buffering, kështu që të flasin, që thjesht do të thotë ajo shkarkimit nga BITS internet dhe ruajtjen e tyre në një array lokal, një copë lokal i memories në mënyrë që ju mund të shikojnë atë më vonë pa ajo duke lënë mënjanë ose varur në jeni duke luajtur prapa. Pra ka një problem këtu pse, sepse unë jam i thënë scanf, presin një string nga përdoruesi. Këtu është adresa e një copë e kujtesës. Vendoseni atë varg atje. Pse është i detyruar që të japë na probleme, pse? Çfarë është ajo? Unë jam i lejuar për të hyrë se një pjesë e kujtesës? Ju e dini, unë nuk e di. Sepse ka qenë initialized tampon për asgjë? Jo me të vërtetë. Dhe kështu kjo është ajo që ne kemi qenë të thirrur një vlerë plehrash, e cila nuk është një fjalë formal. Ajo thjesht do të thotë që ne nuk kemi ide se çfarë bit janë brendësi prej kater bytes që Unë kam ndarë si tampon. Unë nuk e kam quajtur malloc. Unë nuk e kam quajtur definitivisht getString. Pra, kush e di se çfarë është në të vërtetë brenda tampon? Dhe akoma thënë scanf verbërisht, shkoni atje dhe vuri çdo gjë që përdoruesit shtypur. Pra, çfarë ka të ngjarë të shkaktojë në kodin tonë, nëse ne të drejtuar atë? Ndoshta një segfault. Ndoshta jo, por ndoshta një segfault. Dhe unë them ndoshta jo për shkak se nganjëherë ju bëni, nganjëherë ju nuk merrni një segfault. Ndonjëherë ju vetëm të merrni me fat, por ajo megjithatë do të jetë një bug në programin tonë. Pra më lejoni të shkoj përpara dhe të përpilojnë këtë. Unë jam duke shkuar për të bërë atë rrugën e vjetër e shkollës. Pra dash tingëllimë 0, scanf-1, scanf, 1.c, Enter. Oops, shkollë shumë e vjetër. Le të shohim. Ku të shkoj unë? Oh, tampon char *. Oh, thank you - Save, OK - shkollë shumë e vjetër. Të gjithë të drejtë, ajo ka qenë një kohë. Kështu që unë kam ruajtur vetëm skedarin pas bërë që të përkohshëm ndryshojë një moment më parë. Dhe tani unë kam hartuar atë dorë me tingëllimë. Dhe tani unë jam duke shkuar për të shkuar përpara dhe të drejtuar scanf-1, Enter. String ju lutem. Unë do të shkruani në "hello". Dhe tani, këtu është ku, sinqerisht, printf mund eshte nje pak bezdisshëm. Kjo nuk është në të vërtetë do të segfault në këtë rast. Printf është pak e veçantë, sepse është kaq super i zakonshëm që përdoret që printf në thelb është duke bërë na një favor dhe realizimin, që nuk është një tregues i vlefshëm. Më lejoni të marrë atë me veten për të vetëm të shtypur në kllapa null, madje edhe edhe pse kjo nuk është domosdoshmërisht se çfarë ne vetë pritet. Pra, ne nuk mund të vërtetë e lehtë të shkaktoj një segfault me ​​këtë, por në mënyrë të qartë kjo nuk është sjellje që kam kërkuar. Pra, çfarë është zgjidhja më e thjeshtë? E pra, në scanf-2, më lejoni të propozoj që në vend të ndarjes në fakt vetëm një * char, më lejoni të jetë pak më të zgjuar në lidhje me kjo, dhe më lejoni të buffer si një sekuencë prej 16 chars. Kështu që unë mund ta bëjë këtë në disa mënyra. Unë mund të përdorin malloc absolutisht. Por unë mund të kthehem në dy javë, kur Unë vetëm nevojë për një bandë e tërë e karaktere. Kjo është vetëm një koleksion. Pra më lejoni të ripërcaktuar në vend buffer të jetë një grup prej 16 karaktereve. Dhe tani, kur kam kaluar tampon në - dhe kjo është diçka që ne nuk e bëri flasim në dy javë - por ju mund të trajtoni si një grup pse kjo është një adresë. Teknikisht, siç kemi parë, ata janë pak më ndryshe. Por scanf nuk do të ngurrojë në qoftë se ju të kalojë atë emri i një vargu, sepse ajo Tingëllimë do të bëjë për ne është në thelb trajtojnë emrin e atij luftojnë si Adresën e copë e 16 bajt. Pra kjo është më mirë. Kjo do të thotë tani që unë mund të shpresojmë të bëjë në vijim. Më lejoni të zoom jashtë për një moment dhe të nuk bëjnë scanf-2, përpiluar OK. Tani më lejoni të bëj mori plagë scanf-2. String ju lutem. "Hello". Dhe kjo dukej për të punuar këtë kohë. Por dikush mund të propozojë një skenar në të cilat ajo mund të mos punojnë ende? Vërtet? Diçka më shumë se 16 karaktere. Dhe në të vërtetë, ne mund të jetë pak më të saktë. Diçka më shumë se 15 karaktere, sepse me të vërtetë ne kemi nevojë për të mbajtur në mend se ne kemi nevojë për atë backslash zero implicite në fund të vargut, e cila është një mënjanë scanf do tipike të kujdeset për ne. Pra më lejoni të bëj diçka si - nganjëherë ne vetëm mund të lënë atë si kjo. OK, kështu që ne kemi detyruar tani faji ynë segmentimit. Pse? Sepse unë shtypur në më shumë se 15 karaktere, dhe kështu që ne kemi në fakt kujtesës prekur se unë në fakt nuk duhet të ketë. Pra, çfarë është me të vërtetë zgjidhja këtu? E pra, çfarë nëse ne kemi nevojë për një varg më të gjatë? E pra, ne ndoshta bëjnë atë 32 bytes. E pra, çka nëse kjo nuk është kohë e mjaftueshme? Si rreth 64 bytes? Çka në qoftë se nuk është kohë e mjaftueshme? Si rreth 128 ose 200 bytes? Çfarë është me të vërtetë zgjidhja këtu në Rasti i përgjithshëm, në qoftë se ne nuk e dimë në paraprakisht se çfarë përdoruesit do të shkruani? Kjo është vetëm një lloj dhimbje e madhe në gomar, të jenë ndershëm, e cila është pse CS50 bibliotekë ka një duzinë disa rreshta të kodin që kolektivisht të zbatojë GetString string në një mënyrë që ne nuk duhet të dinë paraprakisht se çfarë përdoruesi është duke shkuar për të tipit. Në veçanti, në qoftë se ju shikoni mbrapa në cs50.c nga dy javë më parë, do të shihni që në fakt bën getString mos përdorin scanf në këtë mënyrë. Përkundrazi, ai lexon një karakter në një kohë. Për shkak se një gjë e bukur për lexuar një karakter është mundemi garantojë veten për gjithmonë kanë të paktën një char. Unë vetëm mund të deklaroj një char, dhe pastaj të marrë këto hapa të vërtetë fëmijë të vetëm lexuar një karakter në të një Ora nga keyboard. Dhe pastaj, çfarë ju do të shihni getString nuk është çdo herë që ajo shkon jashtë, themi, 16 bytes të kujtesës, ai përdor malloc, ose nje tij kushëri, te caktojë më shumë memorie, kopjimi i vjetër memorie në zvarritje të re, dhe pastaj së bashku, duke marrë një karakter në një kohë, dhe kur ajo shkon nga të cilat copë e kujtesës, hedh atë larg, grabs një copë të madhe të kujtesës, kopjon vjetër në të rinj, dhe përsëritësit. Dhe kjo është me të vërtetë një dhimbje të vërtetë zbatojë diçka e thjeshtë si duke marrë të dhëna nga një përdorues. Kështu që ju mund të përdorni scanf. Ju mund të përdorni funksione të tjera të ngjashme. Dhe shumë i teksteve dhe online Shembuj të bëjmë, por ata janë të gjithë prekshme për problemet si kjo. Dhe në fund të fundit, duke marrë një segfault është lloj i bezdisshëm. Kjo nuk është e mirë për përdoruesit. Por në rastin më të keq, çfarë bën ajo rrënjësisht vënë Juaj Kodi në rrezik? Disa lloj sulmi, potencialisht. Ne biseduam rreth një sulmi të tillë - tejmbushur rafte. Por në përgjithësi, në qoftë se ju jeni i lejuar për të një tampon del nga shtrati, si ne e bëmë një Nja dy javë më parë, vetëm me shkrim më shumë se "hello" në rafte, ju mund të vërtetë të marrë përsipër, potencialisht, një kompjuteri, ose të paktën të marrë në të dhëna që nuk i takon për ju. Pra me pak fjalë, kjo është arsyeja pse ne kemi ato rrota trajnimit. Por tani, ne fillojmë për të marrë ato jashtë, si programet tona nuk ka më nevojë, domosdoshmërisht, të dhëna nga përdoruesi. Por në rastin e problemit të vendosur gjashtë, input juaj do të vijë nga një i madh 150 fotografi fjalor me disa rastësishëm mijë fjalë. Pra, ju nuk do të duhet të shqetësohen për input arbitrare e anëtarit. Ne do t'ju japë disa supozime në lidhje me këtë dosje. Çdo pyetje mbi pointers ose scanf ose input përdorues në përgjithësi? Të gjithë të drejtë, kështu që një vështrim i shpejtë pastaj në një zvarritës temë nga dy javë më parë. Dhe kjo ishte ky nocion i një struct. Jo se - ky nocion i një përpilohet, e cila ishte ajo? Çfarë bëri struct bënte për ne? Define - Na vjen keq? Përcaktoni një lloj të ndryshueshme. Pra lloj i. Ne jemi të vërtetë duke kombinuar dy tema. Pra, me typedef, kujtojnë se ne mundemi shpallë një lloj të vetën tonë, si një sinonim, si për varg char *. Por duke përdorur typedef dhe struct, ne mund të të krijojë me të vërtetë strukturat e të dhënave tona. Për shembull, nëse unë kthehem në Gedit këtu vetëm për një moment, dhe të shkoj përpara dhe të bëjë diçka si, më lejoni të shpëtuar këtë si, le të themi, structs.c përkohësisht, unë jam vetëm duke shkuar të shkojnë përpara dhe të përfshijë standardio.h, i pavlefshëm kryesore int. Dhe pastaj në këtu, mendoj se unë dua të shkruaj një program që ruan Nxënësit të shumta nga të shumëfishtë shtëpi, për shembull. Pra, ajo është si një registrarial Baza e të dhënave të disa lloj. Pra, nëse kam nevojë për një student me emrin, unë mund të bëni diçka si emri * char, dhe unë do të bëj diçka si - në fakt, le të përdorin bibliotekën CS50 për vetëm një moment për të bërë këtë një pak të thjeshtë, kështu që ne mund të marrë hua ato dhjetra e linjave të kodit. Dhe le të vetëm ta mbani atë të thjeshtë. Ne do të vazhdojmë atë string, dhe tani getString. Kështu që unë pretendojnë tani që unë kam ruajtur emrin i disa nxënës, dhe shtëpisë së disa student, thjesht duke përdorur ndryshoret si ne e bëmë dhe në një javë. Por mendoj unë tani duan të mbështesin Nxënësit e shumta. Të gjithë të drejtë, kështu që instinktet e mia janë për të bërë string name2, merr getString varg, house2 merr getString. Dhe pastaj studenti ynë i tretë, le të bëjë name3 getString. Të gjithë të drejtë, kështu që shpresojmë se kjo është e habitshme ju si lloj i trashë, sepse ky proces është me të vërtetë kurrë do të përfundojë, dhe ajo është vetëm do të të bëjë kodi im duken më keq dhe më keq dhe më keq. Por ne kemi zgjidhur këtë shumë në dy javë. Cila ishte zgjidhja jonë relativisht të pastër kur ne kishim variabla të shumta të njëjtë të dhënave lloji që janë të lidhura të gjitha, por ne nuk e duam këtë rrëmujë mizor e variablave të quajtur në mënyrë të ngjashme? Çfarë bëjmë ne vend? Kështu që unë mendoj se kam dëgjuar disa vende. Ne patëm një rrjet. Nëse ju doni raste të shumta të diçka, pse nuk kemi pastruar këtë të gjithë up dhe vetëm thonë, më jep mua array quajtur emrat? Dhe tani për tani, le të 3 vështirë kod. Dhe pastaj jepni një tjetër rrjet quhet shtëpi, dhe le mua për tani Kodi vështirë 3. Dhe unë e kam pastruar deri masivisht bela që kam krijuar vetëm. Tani, unë e kam ende të vështirë të koduar me 3, por edhe 3 dinamike mund të vijnë nga përdoruesi, ose argv, apo si. Pra, kjo tashmë është e pastër. Por ajo që i bezdisshëm në lidhje me këtë është se tani, ndonëse emri është disi të lidhura thelbësisht të Shtëpia e nxënësit - kjo është një student që unë me të vërtetë duan të përfaqësojnë - Unë tani keni dy vargjeve që janë paralele në kuptimin që ata janë të të njëjtën madhësi, dhe emrat kllapa 0 me sa duket harta në shtëpitë kllapa 0, dhe emrat kllapa 1 hartat në shtëpitë e kllapa 1. Me fjalë të tjera, që studentore jeton në që shtëpia, dhe se studenti tjera jeton në atë shtëpi tjetër. Por sigurisht kjo mund të jetë bëhet edhe më e pastër. E pra, ajo mund, në fakt. Dhe më lejoni të shkoj përpara dhe të hapur structs.h lart, dhe ju do të shihni këtë ide këtu. Vini re se unë kam përdorur typedef, si ju aludoi për një moment më parë për të deklaruar tonë vetë lloji të dhëna. Por unë jam gjithashtu duke përdorur këtë fjalë kyçe të tjera quajtur struct e cila jep mua një të ri Struktura e të dhënave. Dhe kjo Struktura e të dhënave Unë pretendojnë po shkon të keni dy gjëra në brendësi të ajo - një varg të quajtur emrin, dhe një varg të quajtur shtëpi. Dhe emri që unë jam duke shkuar për të dhënë për kjo Struktura e të dhënave është duke shkuar për t'u quajtur studenti. Unë mund të telefononi atë gjë që unë dua, por kjo semantike të bëjnë kuptim për mua në mendjen time. Deri tani, në qoftë se unë i hapur deri një version më të mirë e programit Fillova shkrim atje, më lejoni të lëvizni në krye. Dhe ka disa linja shumë të kodit këtu, por më lejoni të përqëndrohet për në një moment. Unë e kam deklaruar një nxënës konstante ashtuquajturat dhe 3 koduar vështirë tani për tani. Por tani, vini re se si të pastër kodi im fillon të marrë. Në linjë 22, unë deklaroj Grup i nxënësve. Dhe vini re se studenti është me sa duket tani një lloj të dhënave. Sepse në krye të këtij file, njoftim Unë e kam përfshirë atë skedar header që unë u tërhoq deri vetëm një moment më parë. Dhe se dosja header mjaft thjesht kishte ky përkufizim i një studenti. Deri tani, unë kam krijuar dhënat e mi custom tip që autorët e viteve C më parë nuk mendojnë paraprakisht. Por, nuk ka problem. Unë mund të bëjë atë vetë. Pra, ky është një grup i quajtur studentëve, secili prej anëtarëve të të cilit është një strukturë studente. Dhe unë dua tre prej atyre ne vektorit. Dhe tani, çfarë e bën pjesa tjetër i këtij programi të bëni? Unë e nevojshme diçka pak arbitrar. Pra, nga 24 e tutje në internet, Unë iterate 0-3. Unë pastaj të kërkojë nga shfrytëzuesi për emri i studentit. Dhe atëherë unë përdorin getString si më parë. Pastaj unë kërkoj për shtëpinë e studentit, dhe unë përdor getString si më parë. Por njoftimi - pak e re copë e sintaksës - Unë ende mund të indeksit të studentit i-th, por si mund ta merrni në të dhënat specifike brendësi fusha e struct? E pra, ajo që është me sa duket pjesë të re të sintaksës? Është vetëm operator dot. Ne nuk e kam parë këtë para se të vërtetë. Ju kam parë atë në pset pesë qoftë se ju keni hodh në krahun tashmë me fotografi bitmap. Por dot thjesht do të thotë në brendësi të kësaj struct ose fusha të shumta, japin dot emri, ose më jepni dot shtëpinë. Kjo do të thotë të shkojnë në brendësi të struct dhe për të marrë ato fusha të veçanta. Çfarë tjetër e këtij programi të bëni? Kjo nuk është e gjitha që sexy. Vini re se unë iterate 0-3 përsëri, dhe unë thjesht të krijuar një anglisht fraza si kështu dhe kështu është në të tillë dhe tillë një shtëpi, duke kaluar në emrin dot nga i-th student i tyre dhe shtëpi si. Dhe pastaj së fundi, tani ne do të fillojë të marrë anal në lidhje me këtë, tani që ne jemi njohur me atë malloc dhe Funksionet e tjera kanë qenë bërë gjithë këtë kohë. Pse nuk kam për të liruar si emrin dhe shtëpia, megjithëse unë nuk e quajnë malloc? GetString bëri. Dhe kjo ishte e fshehtë pista pak për disa javë, por ka getString qenë rrjedhjen e kujtesës të gjithë të zhvillohet të gjitha semestër deri tani. Dhe në fund do valgrand zbulojë këtë për ne. Por kjo nuk është një punë e madhe, sepse unë e di që unë thjesht mund të lirojë emrin dhe shtëpia, edhe pse teknikisht, të jetë super, super të sigurt, unë duhet të jenë të bërë ndonjë gabim checking këtu. Çfarë janë instinktet tuaja ju thënë? Çfarë duhet unë të kontrolluar për para I liruar atë që është një string, aka cilën një * char? Unë me të vërtetë duhet të jenë të kontrolluar nëse nxënësit Unë kllapa emri dot nuk null barabartë. Atëherë ajo do të jetë në rregull për të shkuar përpara dhe të lirë që akrep, dhe të njëjta ose të tjera një si. Nëse studentët parantezë Unë dot shtëpi nuk është barabartë me null, kjo tani do të mbrojë kundër rastit këndi në të cilën GetString kthen diçka si null. Dhe ne pamë një moment më parë, do printf na mbrojnë deri këtu duke thënë se vetëm zero, e cila do te duket çuditshëm. Por të paktën ajo nuk do të segfault, siç e kemi parë. E pra, më lejoni të bëj një gjë tjetër këtu. structs-0 është lloj i një programi budallaqe sepse unë të hyjë gjitha këto të dhëna, dhe pastaj ajo ka humbur një herë përfundon programi. Por më lejoni të shkoj përpara dhe të bëjë këtë. Më lejoni të bëjë terminalin dritare pak më e madhe. Më lejoni të bëjë structs-1, e cila është një version të ri për këtë. Unë do të zoom në një grimë të vogël. Dhe tani më lejoni të kandidojë dot pakësojë structs-1. Emri i nxënësit - David Mather, le të bëjë Rob Kirkland, le të bëjë Lauren Leverett. Çfarë është interesante tani është njoftimi - dhe unë vetëm e di këtë, sepse I shkroi programin - ka një skedë tani në time aktuale Direktoria quajtur students.csv. Disa prej jush mund të keni parë këto në botën reale. Çfarë është një CSV file? Presje-të ndara vlerat. Është lloj si një njeri të varfër version i një file Excel. Kjo është një tabelë e rreshtave dhe kolonave që ju mund të hapë në një program si Excel, ose numrat në një Mac. Dhe nëse kam hapur këtë skedë këtu në Gedit, Njoftim - dhe numrat nuk janë atje. Kjo është vetëm Gedit thënë mua numrat e linjës. Vini re në vijën e parë të kësaj skedë është Davidi dhe Mather. Linja tjetër është Rob presje Kirkland. Dhe Linja e tretë është Lauren Leverett presje. Pra, çfarë kam krijuar? Unë kam shkruar tani që një program C në mënyrë efektive mund të gjenerojnë spreadsheets që mund të hapen në një program si Excel. Jo të gjithë që imponues një grup të dhënave, por në qoftë se ju keni chunks akoma më të mëdha Të dhënat që ju të vërtetë duan të manipuluar dhe të bëjë grafikët e dhe pëlqen, kjo është ndoshta një mënyrë që të dhënat për të krijuar. Për më tepër, CSVs vërtetë janë super të zakonshme vetëm për magazinimin e të dhënave të thjeshta - Yahoo Finance, per shembull, nëse ju merrni Kuotat e aksioneve nëpërmjet tyre të ashtuquajtura API, shërbim falas që ju lejon merrni aktuale të aksioneve up-to-date- kuotat për kompanitë, ata japin të dhënat përsëri në formatin CSV super e thjeshtë. Pra, si e bëjmë këtë? Well njoftim, shumica e këtij programi të pothuajse e njëjtë. Por vini re këtu poshtë, në vend se të shtypura studentët jashtë, on line 35 tutje, unë pretendojnë se unë jam i kursyer Nxënësit në disk, kështu kursyer një skedar. Pra njoftim unë jam deklaruar një skedar * - tani, kjo është lloj i një anomali në C Për çfarëdo arsye, dosja është e gjitha shkronja kapitale, e cila nuk është si shumica e llojeve të të dhënave të tjera në C. Por kjo është një built-in Lloji i të dhënave, * FILE. Dhe unë jam deklaruar një pointer në një skedar, është se si ju mund të mendoni se. fopen thotë skedë të hapur. Çfarë fotografi nuk ju duan për të hapur? Unë dua për të hapur një skedar që unë do arbitrarisht telefononi students.csv. Unë mund të telefononi se çdo gjë që unë dua. Dhe pastaj të marrë një guess. Çfarë e bën Argumenti i dytë për fopen ndoshta do të thotë? E drejta, w për të shkruaj, mund të r për të lexuar. Ka një për Append në qoftë se ju dëshironi të shtoni rreshtave dhe jo prishësh gjithë gjë. Por unë vetëm dua të krijojë këtë fotografi një herë, kështu që unë do të përdorë quote mbyll thonjëzat w. Dhe unë e di se vetëm nga që ka lexuar dokumentacioni, apo faqja njeri. Nëse skedari nuk është i pavlefshëm - me fjalë të tjera, në qoftë se asgjë nuk shkoi keq atje - më lejoni të iterate mbi Nxënësit 0-3. Dhe tani vini re ka diçka ndonjëherë në mënyrë pak më të ndryshme rreth 41 linja këtu. Kjo nuk është printf. Është fprintf për dosjen printf. Pra, ajo do të shkruaj për file. Cila fotografi? Një akrep të cilit ju specifikoni si të argumentit pare. Pastaj ne të specifikoni një turmash. Pastaj ne të specifikojë se çfarë string ne duam të plug ne për s pare qind, dhe pastaj një tjetër variabël ose s dyti për qind. Pastaj ne mbyllë dosjen me Shkrimi. Se unë të liruar kujtesës si më parë, pse Unë duhet të shkoj përsëri në dhe të shtoni disa kontrolle for null. Dhe kjo është ajo. fopen, fprintf, Shkrimi më jep Aftësia për të krijuar fotografi tekst. Tani, ju do të shihni në grup problemit pesë, e cila përfshin imazhe, ju do të jetë duke përdorur fotografi binare këtu. Por në thelb, ideja është e njëjtë, edhe pse funksionet që ju do të shihni janë pak më ndryshe. Pra, turne shakullinë, por ju do të merrni të gjitha shumë të njohur me dosjen I/O-- input dhe output - me pset pesë. Dhe ndonjë pyetje rreth Bazat fillestare këtu? Po? Çfarë nëse ju përpiqeni për të liruar një vlerë zero? Unë besoj se, nëse nuk ka marrë një pagesë pak më shumë user-friendly, ju mund të potencialisht segfault. Kalimi null ajo është e keqe, sepse unë nuk bëj besoj falas pengon për të kontrolluar për ju, sepse kjo do të jetë potencialisht një humbje nga koha që ajo të bëjë për veten të gjithë në botë. Pyetje e mirë, edhe pse. Të gjithë të drejtë, kështu që ky lloj i merr na në një temë interesante. Tema e problemit set pesë është mjeko-ligjore. Të paktën kjo është një pjesë i vendosur problemit. Mjekësinë Ligjore në përgjithësi i referohet rimëkëmbja e informacionit që mund ose mund të mos ketë qenë fshirë qëllimisht. Dhe kështu që unë mendova se do të ju jap një të shpejtë shije të asaj që po ndodh në të vërtetë të gjithë këtë herë nën individualitet e kompjuterit tuaj. Për shembull, nëse ju keni brenda tuaj laptop apo kompjuter desktop tuaj një hard drive, kjo është ose një mekanik pajisje që vishet në fakt - ka gjëra rrethore quajtur platters që duken mjaft të pëlqen ajo që unë kishte vetëm deri në ekran këtu, edhe pse kjo është gjithnjë e më e vjetër e shkollës. Kjo është një tri-dhe-a-gjysmë-inç hard drive. Dhe tre dhe një gjysmë inç i referohet me i sendit kur ju instaloni atë në një kompjuter. Shumë nga ju djema në laptopë tuaj tani kemi të ngurta-shtet drives, apo SSD, të cilat nuk kanë lëvizur pjesë. Ata janë më shumë si dhe më pak si RAM këto pajisje mekanike. Por idetë janë ende të njëjta, sigurisht si ato që lidhen Problemi për të ngritur pesë. Dhe në qoftë se ju mendoni rreth tani një hard drive përfaqëson qenë një rrethi, të cilat Unë do të tërheq si kjo këtu. Kur keni krijuar një skedar në kompjuterin tuaj, nëse kjo është një SSD, ose në Në këtë rast, një makinë të vjetër shkollor vështirë, se dosja përbëhet nga bit shumta. Le të thonë se kjo 0 dhe 1, një bandë e tërë e 0s dhe 1s. Pra, kjo është e tërë hard time e vështirë. Kjo është me sa duket një fotografi goxha i madh. Dhe kjo është përdorur deri 0s dhe 1s në atë pjesë të pjatës fizike. E pra, çfarë është ajo pjesë fizike? E pra, ajo rezulton se në një hard drive, të paktën i këtij lloji, ka këto grimca të vogël pak magnetike. Dhe ata në thelb kanë të Veriut dhe Polet në jug të tyre, kështu që nëse ju të kthehet një nga ato grimca magnetike këtë mënyrë, ju mund të thonë se kjo është përfaqëson një 1. Dhe në qoftë se kjo është me kokë poshtë në jug të në veri, ju mund të thoni se kjo është përfaqëson një 0. Pra në botën reale fizike, që është se si ju mund të përfaqësojë diçka në gjendja binar i 0 dhe a 1. Pra, kjo është e gjitha një skedar është. Ka një bandë e tërë e magnetike grimcat që janë rruga e tyre ky ose në këtë mënyrë, duke krijuar modele e 0s dhe 1s. Por kjo rezulton kur ju ruani një skedar, disa informata është ruajtur veçmas. Pra, kjo është një tabelë të vogël, një directory, kështu që të flasin. Dhe unë do të thërrasë këtë emër kolonë, dhe Unë do të thërrasë këtë vend kolonës. Dhe unë jam duke shkuar për të thënë, mendoj kjo është e rinisë time. Resume.doc im është ruajtur në vend, le të themi 123. Unë shkoj gjithmonë për atë numër. Por mjafton të themi se ashtu si në RAM, ju mund të merrni një hard drive kjo është një gigabajt Gigabyte ose 200 ose një terabyte, dhe ju mundeni Numri i të gjitha bytes. Ju mund të numërojmë të gjitha chunks e 8 bit. Pra, ne do të themi se kjo është 123 vend. Pra, kjo brenda Drejtoria e operimit tim Sistemi i kujton se im rinisë është në vendin 123. Por, ajo merr interesante kur ju fshini një skedar. Pra, për shembull - dhe fatmirësisht, shumica e botës ka kapur mbi këtë - çfarë ndodh kur ju drag një skedar për Mac OS plehra tuaj ose Recycle Bin tuaj të Windows? Cili është qëllimi i bërë se? Është e qartë për të hequr qafe e dosjes, por çfarë e bën aktin e zvarritje dhe rënie në Plehra tuaj ose tuaj Recycle Bin bëni në një kompjuter? Absolutisht asgjë, të vërtetë. Është tamam si një dosje. Kjo është një dosje të veçantë, të jetë i sigurt. Por a është në fakt fshini skedar? E pra, jo, sepse disa nga ju ndoshta kanë qenë si, oh mallkuar, ju nuk e keni do të thotë për të bërë këtë. Pra, ju klikoni dy herë Plehra ose Recycle Bin. Ju keni poked përreth dhe ju keni shëruar skedar vetëm duke zvarritur atë nga atje. Pra, në mënyrë të qartë, nuk është domosdoshmërisht fshirjes atë. OK, ju jeni më të zgjuar se kaq. Ju e dini që vetëm zvarrit atë në Plehra ose Recycle Bin nuk nënkupton Youre zbrazjes plehra. Kështu që ju të shkoni deri në menu, dhe ju thoni: Empty Trash ose Empty Recycle Bin. Atëherë çfarë ndodh? Yeah, kështu që është fshirë më shumë. Por gjithçka që ndodh është kjo. Kompjuteri harron ku resume.doc ishte. Por ajo që nuk ka ndryshuar sa duket në foto? Pjesëzat, 0s dhe 1s që unë pretendojnë janë në faqen e disa aspektit fizik të hardware. Ata janë ende atje. Është vetëm kompjuteri ka harruar atë që ata janë. Pra, ajo është liruar në thelb fotografinë e bit në mënyrë që ata të mund të ripërdoren. Por jo deri sa ju e krijoni më shumë fotografi, më shumë fotografi dhe fotografi, dhe më shumë do të probabilistically, ata 0s dhe 1s, këto grimca magnetike, të merrni ripërdoren, Ana përmbysur ose djathtas lart, për fotografi të tjera, 0s dhe 1s. Pra, ju e keni këtë dritare të kohës. Dhe kjo nuk është e parashikueshme gjatësia, me të vërtetë. Kjo varet nga madhësia e hard juaj makinë dhe sa shumë fotografi që ju keni dhe sa shpejt ju bëni ato të reja. Por nuk është kjo dritare e kohës gjatë se dosja e cila është ende e përkryer rikuperueshme. Pra, nëse ju ndonjëherë të përdorni programe si McAfee Norton ose të përpiqen për të rimarrë Të dhënat, të gjithë ata po bëjnë është duke u përpjekur për të mbulojë këtë direktorium ashtuquajturin ndaj gjej ku dosja juaj ishte. Dhe nganjëherë Norton dhe do të thonë, skedë është 93% e rikuperueshme. E pra, çfarë do të thotë kjo? Kjo thjesht do të thotë se disa fotografi të tjera përfundoi rastësisht duke përdorur, të themi, ato jashtë bit e skedarin tuaj origjinal. Pra, çfarë është e përfshirë në të vërtetë në kthimin e të dhënave? E pra, në qoftë se ju nuk keni diçka si Norton para-instaluar në kompjuterin tuaj, mirë që ju mund ndonjëherë të bëni është të shikoni në të gjithë hard drive duke kërkuar për modele të BITS. Dhe njëra nga temat e problemit set pesë është se ju do të kërkoni ekuivalenti i një hard drive, një mjeko-ligjore Imazhi i një kartë compact flash nga një aparat fotografik dixhital, në kërkim për 0s dhe 1s që në mënyrë tipike, me të lartë probabiliteti, përfaqësojnë fillimin e një imazh JPEG. Dhe ju djema mund të shërohen ato imazhe nga supozuar, në qoftë se unë shoh këtë model të bit mbi imazhin mjeko-ligjor, me probabilitet të lartë, që shënon fillimi i nje JPEG. Dhe në qoftë se unë shoh të njëjtin model përsëri, që ndoshta shënon fillimin e tjetër JPEG, dhe një tjetër JPEG, JPEG dhe një tjetër. Dhe kjo është zakonisht si të dhënat e rimëkëmbjes do të punojnë. Çfarë është e bukur për JPEG është edhe pse format file në vetvete është disi komplekse, fillimi i çdo të tilla skedë është në të vërtetë mjaft të identifikueshme dhe të thjeshtë, si ju do të shihni, në qoftë se ju nuk e keni tashmë. Pra, le të marrin një vështrim më të afërt nën telajo individualitet si për të saktësisht se çfarë ka qenë ndodh, dhe çfarë janë këto 0s dhe 1s janë, për të ju jap pak më shumë një Konteksti për këtë sfidë të veçantë. [Video playback] -Ku PC tuaj ruan shumicën të dhënat e saj të përhershëm. Për ta bërë këtë, të dhënat udhëton nga RAM së bashku me sinjalet që tregojnë software hard drive si për të ruajtur të dhënat. Qarqet hard drive përkthehet këto sinjale në tension Luhatjet. Këto, nga ana tjetër, të kontrolluar hard drive-së lëvizin pjesët, disa prej pak pjesë lëviz majtas në kompjuter modern. Disa prej sinjaleve të kontrolluar një motor e cila vishet metalike-veshura platters. Të dhënat tuaja është ruajtur në të vërtetë në këto platters. Sinjale të tjera të lëvizin lexoni / shkruani kokat për të lexuar ose shkruani të dhënat mbi platters. Kjo makineri aq i saktë se një njeri flokët nuk mund edhe të kalojë në mes të kokat dhe platters tjerrje. Megjithatë, të gjitha punët në shpejtësi të frikshëm. [VIDEO END rishikim] DAVID Malan: Zoom në pak thellë tani në atë që është në të vërtetë në ato platters. [Video playback] -Le të shikojmë në atë që ne vetëm pashë në lëvizje të ngadaltë. Kur një impuls të shkurtër i energjisë elektrike është dërgohen kreut lexoni / shkruani, nëse flips elektromagnetike në një të vogël për një pjesë të një të dytë. Magneti krijon një fushë, e cila Ndryshimet polaritetin e një, tiny tiny pjesa e grimcave metalike që pallto çdo sipërfaqe pjatë. Një seri model i këtyre tiny, akuzuar-up zonat në disk paraqet një grimë të vetme të Të dhënat në numrin binar Sistemi i përdorur nga kompjuterat. Tani, në qoftë se tanishëm është dërguar në një mënyrë përmes lexoni / shkruani kokë, zonën është polarizuar në një drejtim. Nëse i tanishëm është dërguar në drejtim të kundërt, polarizimi është i kundërt. Si ju merrni të dhënat off hard disk? Vetëm procesin e kundërt. Pra, kjo është se grimcat në disk që të merrni aktuale në lexoni / shkruani kreu lëviz. Vendos së bashku miliona të këtyre Segmente magnetized, dhe ju keni marrë një skedar. Tani, copat e një skedar të vetëm mund të të shpërndara në të gjithë një makinë të platters, një lloj si në rrëmujë e letrave në tavolinën tuaj. Pra, një file të veçantë ekstra mban gjurmët e ku çdo gjë është. A nuk dëshironi ju kishte diçka si kjo? [VIDEO END rishikim] DAVID Malan: OK, ndoshta jo. Deri sa shumë prej jush djema u rrit me këto? OK, kështu që është më pak dhe më pak duart për çdo vit. Por unë jam i kënaqur që ju jeni të paktën të njohur me ta, sepse kjo dhe tonat demo libër, fatkeqësisht, po vdes një shumë të vdekje të ngadalshme këtu e familjaritetit. Por kjo është ajo që unë, të paktën, të kthehet në shkollë të lartë, përdorimi përdoret për backups. Dhe kjo ishte e mahnitshme, sepse ju mund të ruani 1.4 megabajt në ky disk veçanti. Dhe ky ishte versioni densitet të lartë, siç tregohet nga HD, e cila ka që do të thotë para se të videos HD sotme. Standard dendësia ishte 800 kilobytes. Dhe para se, ka pasur 400-kilobyte disqe. Dhe para se, ka pasur 5 dhe 1/4 disqe inç, të cilat ishin me të vërtetë floppy, dhe një pak më të gjerë dhe më shtatlartë përveç këtyre gjërave këtu. Por ju mund të shikoni në fakt ashtuquajtura Aspekti i këtyre floppy disqe. Dhe funksionalisht, ata janë në fakt goxha i ngjashëm me të në hard drives paktën ky lloj. Përsëri, SSD në kompjutera të reja punojnë pak ndryshe. Por nëse ju lëvizni se tab pak metalik, ju mund të shikoni në fakt një cookie pak, apo pjatë. Kjo nuk është metalike si ky. Kjo është në fakt disa të lirë materiale plastike. Dhe ju mund të lloj të luaj atë. Dhe ju keni trully fshihen vetëm jashtë disa Numri i bit apo grimcat magnetike nga ky disk. Pra, fatmirësisht, nuk ka asgjë në të. Nëse kjo gjë është në mënyrë të - dhe të mbuluar sytë tuaj dhe ato të afërmit tënd - vetëm ju mund të tërheqë këtë lloj off tërë mill si kjo. Por ka një pranverë e vogël, kështu që të jetë të vetëdijshëm se me sytë tuaj. Deri tani ju keni të vërtetë një floppy disk. Dhe çfarë është shquar në lidhje me këtë është se ne aq sa kjo eshte nje shkallë të vogël përfaqësimi i një më të madhe hard drive, këto gjëra janë super, thjeshtë super. Nëse ju çikë pjesën e poshtme të saj, tani që Gjëja që metali është jashtë, dhe zhvishem ato të hapur, të gjithë nuk është është dy copa të ndjerë dhe e ashtuquajtura floppy disk me një copë metali në brendësi. Dhe atje shkon gjysma e Përmbajtja Disk tim. Nuk shkon një tjetër gjysma e tyre. Por kjo është e gjitha që ishte tjerrje brenda e kaluar në kompjuterin tuaj. Dhe përsëri, për të vënë këtë në perspektivë, sa e madhe është më e juaj hard drives këto ditë? 500 gigabajt, një terabyte, ndoshta në një kompjuter desktop, 2 terabytes, 3 terabytes, 4 terabajt, e drejtë? Kjo është një megabyte, të japë ose të marrë, të cilat nuk mund të përshtaten edhe një MP3 tipike më këto ditë, apo disa muzikë fotografi të ngjashme. Pra një suvenir të vogël për ju sot, dhe gjithashtu për të ndihmuar kontekstualizuar çfarë Ne do të marrë për të dhënë tani në të problemit të ngritur pesë. Pra, ata janë tuajat për të mbajtur. Pra më lejoni të tranzicionit të vendit ku do të jenë të shpenzimet e pset ardhshëm si. Pra, ne kemi vendosur tani këtë faqe për - oh, një çift i njoftimeve shpejt. Kjo e premte, në qoftë se ju do të donte të bashkohet CS50 për drekë, shkoni në vendin e zakonshëm, cs50.net/rsvp. Dhe projekti përfundimtar - kaq per planin mësimor, ne kemi postuar specifikim projekti përfundimtar tashmë. Kuptojnë se kjo nuk do të thotë kjo është për shkak veçanërisht shpejti. Ajo është postuar, me të vërtetë, vetëm për të marrë ju djema të menduarit rreth saj. Dhe me të vërtetë, një super i rëndësishëm përqindje prej jush do të trajtimin Projektet përfundimtare mbi materialit që ne nuk kanë marrë edhe në klasë, por do si fillim si javën e ardhshme. Njoftimi, edhe pse, se spekulim bën thirrje për një komponentë pak të ndryshme të Projekti përfundimtar. Pare, ne nje javësh, eshte nje para-propozim, një email goxha i rastësishëm për të TF juaj të tregoni atij ose asaj që ju jeni menduarit rreth për projektin tuaj, me asnjë angazhim. Propozimi do të jetë në veçanti e juaj angazhim, duke thënë, këtu, kjo është ajo që Unë do të doja të bëjë për projektin tim. Çfarë mendoni ju? Tepër i madh? Shumë e vogël? A është e menaxhueshme? Dhe ju shihni spekulim për më shumë detaje. Nja dy javë pasi që është statusi Raporti, i cili është një mënyrë të ngjashme Email rastësor për TF tuaj për të thënë se sa larg prapa ju jeni në finale juaj zbatimit të projektit, pasuar nga CS50 Hackathon për të cilat të gjithë është i ftuar, i cili do të jetë një ngjarje nga 20:00 në një mbrëmje deri 07:00 PD mëngjes. Pizza, si unë mund të ketë përmendur në javë zero, Wil të shërbehet at 9:00 kryeministrit, Ushqimi kinez at 1:00 AM. Dhe në qoftë se ju jeni ende zgjuar at 5:00 AM, ne do të ju merr në IHOP për mëngjes. Kështu eshte Hackathon njëri prej më Përvojat paharrueshëm në klasë. Pastaj zbatimi është për shkak, dhe atëherë klimatik CS50 Fair. Më shumë detaje mbi të gjitha këto në javët që do të vijnë. Por le të kthehemi në diçka Shkolla e vjetër - përsëri, një koleksion. Pra, një grup ishte e bukur, sepse ajo zgjidh probleme si ne pamë thjesht një Momenti më parë me strukturat studentore duke marrë një nga pak të kontrollit, nëse ne duan të kenë një nxënës, student, dy Studenti tre, studenti dot dot dot, disa numër arbitrar të nxënësve. Pra vargjeve, disa javë më parë, swooped në dhe të zgjidhen të gjitha problemet tona nuk i duke e ditur paraprakisht se sa shumë gjëra i disa lloj që ne mund të duam. Dhe ne kemi parë se structs mund të na ndihmojë më tej organizojnë kodin tonë dhe për të mbajtur Variablat konceptualisht të ngjashme, si një emri dhe një shtëpi, së bashku, kështu që ne mund të trajtojnë ato si një entitet, brenda të cilat nuk janë copa të vogla. Por vargjeve kanë disa disavantazhe. Cilat janë disa nga disavantazhet ne kemi hasur me vargjeve deri tani? Çfarë është ajo? Madhësia fikse - kështu që, edhe pse ju mund të të jetë në gjendje të caktojë kujtesës për një array, pasi ju e dini se sa nxënës keni, sa karaktere keni nga përdoruesit, një herë ju kam ndarë array, ju keni lloj i pikturuar veten në një qoshe. Sepse ju nuk mund të futni elemente te rinj në mes të një rrjet. Ju nuk mund të futni elemente shumë në fund të një rrjet. Me të vërtetë, ju duhet të mbështetet në krijimin e një grup të tërë të re, siç kemi diskutuar, kopjimi i vjetër në të ri. Dhe përsëri, që është dhimbje koke që GetString merret me të për ju. Por përsëri, ju nuk mund edhe të futur diçka në mes të vektorit nëse norma nuk është e mbushur tërësisht. Për shembull, në qoftë se ky grup i madhësisë këtu gjashtë ka vetëm pesë gjëra në të, mirë, ju mund vetëm tack diçka të mbyllet në fund. Por, çfarë nëse ju doni të futur diçka në mes të array, edhe pse ajo mund të ketë pesë nga gjashtë gjëra në të? E pra, çfarë bëri që ne bëjmë kur ne kishim të gjithë i vullnetarëve tanë të njeriut në skenë javëve të fundit? Nëse ne të kërkuar për të vënë dikë këtu, qoftë këta njerëz se si për të lëvizur këtë mënyrë, apo këta njerëz se si për të lëvizur këtë mënyrë, dhe kjo u bë e shtrenjtë. Kalimi i njerëzve në brendësi të një array përfundoi shtuar deri dhe kushton ne koha, prandaj shumë prej katror ynë n running herë si lloj futje, për shkallës, ne rastin keq. Pra vargjeve janë të mëdha, por ju duhet të e di paraprakisht se sa i madh ju doni ta. Pra, OK, këtu është një zgjidhje. Nëse Unë nuk e di paraprakisht se sa Nxënësit që unë mund të ketë, dhe unë e di një herë Unë vendos, edhe pse, unë jam i mbërthyer me atë shumë studentë, pse nuk e bëni gjithmonë unë vetëm ndajë hapësirë ​​dy herë më shumë si unë mund të mendoj se kam nevojë? A nuk është kjo një zgjidhje e arsyeshme? Realisht, unë nuk mendoj se ne jemi do të ketë nevojë më shumë se 50 lojëra elektronike në një grup për një klasë të mesme, kështu që le të vetëm të rrumbullakosë më lart. Unë do të bëjë 100 lojëra elektronike në rrjet tim, vetëm kështu që ne mund të marrë patjetër Numri i nxënësve që unë pres për të të jetë në disa klasë të mesme. Pra, pse jo vetëm të rrumbullakosë më lart dhe të ndajë më shumë memorie, zakonisht, për një grup të se sa ju mendoni se ju mund edhe nevojë? Ç'është kjo Pushback thjeshtë për këtë ide? Ju jeni vetëm humbur kujtesës. Fjalë për fjalë çdo program që ju shkruani, atëherë është ndoshta duke përdorur memorie sa dyfishi ju në të vërtetë nevojë. Dhe kjo thjesht nuk do të ndjehen si një veçanërisht zgjidhje elegante. Më tepër, ajo vetëm ul Probabiliteti i një problemi. Nëse ju ndodh që të ketë një kurs popullore një semestër dhe ju keni 101 Nxënësit, programi juaj është ende rrënjësisht përballet me të njëjtën çështje. Pra, fatmirësisht, ka një zgjidhje për Kjo ad gjitha problemet tona në formë i strukturave të të dhënave që janë më komplekse se ato ne kemi parë deri tani. Kjo, thonë, është një listë e lidhur. Kjo është një listë të numrave - 9, 17, 22, 26, dhe 34 - që janë të lidhura së bashku me mënyrën të asaj që unë kam tërhequr si shigjeta. Me fjalë të tjera, nëse kam kërkuar për të përfaqësuar një grup, unë mund të bëj diçka si kjo. Dhe unë do të vënë këtë në lart në një moment të vetëm. Unë mund të bëj - hello, të gjithë të drejtë. Stand by. Kompjuter i ri këtu, e qartë - Dakord. Pra, nëse unë kam këto numra në rrjet - 9, 17, 22, 26, 24 - jo domosdoshmërisht në shkallë. Të gjithë të drejtë, kështu që këtu është array ime - oh my god. Të gjithë të drejtë, kështu që këtu është array im. Oh my god. [Qeshura] DAVID Malan: Pretendon. Është shumë përpjekje për të shkuar mbrapa dhe të rregullojmë atë, kështu që nuk ka - 26. Pra, ne kemi këtë rrjet të 9, 17, 22, 26, dhe 34. Për ata prej jush mund të shihni gabim turpshme Unë bëra vetëm, ajo është atje. Kështu që unë pretendojnë se kjo është një zgjidhje shumë efikase. Unë kam shpërndarë si ints shumë si Unë kam nevojë - një, dy, tre, kater, pese ose gjashte - dhe unë kam ruajtur pastaj numrat brenda këtij array. Por mendoj, atëherë, unë dua të futur një vlerë si numri 8? E pra, ku e bën atë të shkojnë? Supozoni se unë dua të futur një numër si 20. E pra, ku e bën atë të shkojnë? Diku aty në mes, ose numri 35 ka për të shkuar diku në fund. Por unë jam i të gjitha jashtë hapësirës. Dhe kështu që kjo është një sfidë themelore i vargjeve që nuk janë zgjidhje. Unë pohoi një moment më parë, getString zgjidh këtë problem. Nëse ju doni të futur një numër gjashtë në këtë grup, ajo është të paktën njëri zgjidhje që ju mund të bien përsëri në për të sigurtë, ashtu si bëjmë me getString? Çfarë është ajo? E pra, e bëjnë atë më të mëdha është lehtë tha se bëhet. Ne nuk mund domosdoshmërisht të bëjë koleksion madhe, por çfarë mund të bëjmë? Bëni një koleksion të ri që është më e madhe, e madhësisë 6, ose ndoshta madhësia 10, nëse duam për të marrë përpara e gjërave, dhe pastaj të kopjoni array vjetra në të reja, dhe pastaj çlirojmë array vjetër. Por, çfarë është koha running tani i atij procesi? Është i madh o n, sepse kopjimi do të ju kushtojë disa njësi kohë, kështu që nuk është aq ideale, nëse ne duhet të caktojë një grup të ri, i cili do të konsumojnë dy herë më shumë kujtesës përkohësisht. Kopje të vjetra në të reja - Unë do të thotë, kjo është vetëm një dhimbje koke, e cila është, përsëri, pse kemi shkruar GetString për ju. Pra, çfarë mund të bëjmë në vend? E pra, çfarë nëse struktura e të dhënave tona në fakt ka boshllëqe në të? Le të supozojmë se unë relaksoheni qëllimin tim e të pasurit chunks puqur e kujtesës, ku 9 është e drejtë tjetër për të 17, e cila është e drejta e ardhshme në 22, dhe kështu me radhë. Dhe mendoj se 9 mund të jetë mbi këtu në RAM, dhe 17 mund të jetë mbi këtu në RAM, dhe 22 mund të jetë mbi këtu në RAM. Me fjalë të tjera, unë nuk kam nevojë t'i madje edhe të kthehet prapa më. Unë vetëm duhet të disi pe në gjilpërë nëpërmjet secili prej këtyre numrave, ose secili prej këtyre nyjeve, si ne do të thërrasë rectangles si unë e kam tërhequr atyre, kujtohet se si për të marrë të fundit të tilla nga nyja e parë. Pra, çfarë është programimi ndërtojnë ne kemi parë mjaft kohët e fundit me të cilën unë mund të zbatojë atë fije, ose tërhequr këtu, me të cilin unë mund të zbatojë ato shigjeta? Pointers Pra, e drejtë? Nëse unë të mos ndajë vetëm një int, por një nyje - dhe nga nyje, unë do të thotë vetëm enë. Dhe me sy, unë do të thotë një drejtkëndësh. Pra, një nyje me sa duket ka nevojë për të përmbajë dy vlera - int vetvete, dhe pastaj, duke nënkuptuar si Gjysma e poshtme e drejtkëndësh, hapësirë ​​të mjaftueshme për një int. Pra, vetëm të menduarit përpara këtu, sa e madhe është kjo nyje, kjo enë në fjalë? Sa bytes për Int? 4 Me sa duket, në qoftë se është njëjtë si zakonisht. Dhe pastaj sa bytes për treguesin? 4. Pra, kjo enë, ose kjo nyje, është do të jetë një 8-bajt strukturë. Oh, dhe kjo është një rastësi e lumtur që ne sapo futur këtë nocion të a struct, ose një strukturë C. Kështu që unë pretendojnë se unë dua të të marrë një hap këtë drejtim më të sofistikuara zbatimi i një listë të numrave, një listë e lidhur e numrave, kam nevojë për të bërë një menduarit pak më shumë deri përpara dhe deklarojnë jo vetëm int një, por një struct që unë do të thërrasë, konvencionalisht këtu, nyje. Ne mund të telefononi atë diçka që duam, por nyje do të jetë tematike në një shumë nga gjërat që ne të fillojmë të shikojmë tani. Brendësi të këtij nyjes eshte nje n int. Dhe pastaj kjo sintaksë, pak pazakontë në shikim të parë - struct * nyjen e ardhshëm. E pra në pikturë, çfarë është ajo? Kjo është gjysma e poshtme e drejtkëndësh që pamë vetëm një moment më parë. Por, pse jam unë duke thënë struct nyje * në krahasim me vetëm * nyjen? Sepse në qoftë se treguesi është duke treguar në një tjetër nyje, kjo është vetëm Adresën e nje nyje. Kjo është në përputhje me atë që ne kemi diskutuan rreth pointers deri tani. Por pse, në qoftë se unë pretendojnë se kjo strukturë është quhet nyje, nuk kam për të thënë struct Nyja brenda këtu? Saktësisht. Kjo është lloj i një realiteti budallaqe e C. Typedef, kështu që të flasin, nuk ka ndodhur ende. C është super literal. Ajo lexon krye tuaj kod për fund, e majta në të djathtë. Dhe deri sa ajo godet atë pikëpresje në bottom line, me mend se çfarë nuk ekzistojë si një lloj të të dhënave? , Nyja quote mbyll thonjëzat nyje. Por për shkak të fjalëshumë më shumë Deklarata e kam bërë në rreshtin e parë - Nyja typedef struct - pasi që arriti i pari, para se të formatimin e teksteve kaçurrel, që është lloj i si para-edukimin tingëllimë se, ju e di se çfarë, më jep mua një struct struct quhet nyje. Sinqerisht, unë nuk pëlqen gjërat e quajtur struct, struct nyje nyje të gjithë të gjithë kodin tim. Por unë do ta përdorni atë vetëm një herë, vetëm brenda, kështu që unë mund të në mënyrë efektive krijuar një lloj reference rrethore jo, një tregues për veten time në vetvete, por një tregues për një tjetër një lloj identike. Pra, rezulton se në strukturën e të dhënave si ky, ka disa Operacionet që mund të jenë me interes deri ne Na. Ne mund të dëshironi të futni në një listë si kjo. Ne mund të dëshironi të fshini nga një listë si kjo. Ne mund të dëshironi të kërkoni në listën për një vlera, ose më në përgjithësi, kundërvënie. Dhe kundërvënie është vetëm një mënyrë e sofistikuar për duke thënë se në fillim të majtë dhe të lëvizë të gjithë mënyrë të drejtë. Dhe vini re, edhe me këtë pak më shumë Struktura e të dhënave të sofistikuar, le të mua propozojë që ne mund të marrë hua disa nga idetë e dy javëve të fundit dhe të zbatojë një funksion të quajtur kërkoni si kjo. Ajo do të kthehen e vërtetë apo false, duke treguar, po ose no, n eshte ne lista. Argumenti i dytë i saj është një akrep te lista vetvete, kështu një kursori te nje nyje. Të gjitha unë jam duke shkuar për të pastaj të bëni është të deklarojë një ndryshore të përkohshme. Ne do të thërrasë atë ptr nga Konventa, për treguesin. Dhe unë të caktojë atë të barabartë për të fillim të listës. Dhe tani vini re lak kohë. Deri sa akrep nuk është i barabartë të pavlefshëm, unë jam duke shkuar për të kontrolluar. Është shigjetë pointer n barabartë me n që u miratua në? Dhe prit një minutë - new copë e sintaksës. Çfarë është shigjetë të gjithë një e papritur? Po? Saktësisht. Pra, ndërsa pak minuta më parë, ne kemi përdorur simbol dot për të hyrë në diçka brendësi të një struct së, nëse variabli ju keni nuk është struct në vetvete, por një tregues për një struct, fatmirësisht, një pjesë e sintaksës që më në fund bën kuptim intuitiv. Shigjetë do të thotë të ndjekë kursorin, Shigjetat tona si zakonisht do të thotë në pikturë, dhe të shkojnë në Të dhënat brenda fushë. Pra, shigjeta është e njëjta gjë si dot, por ju përdorni atë kur ju keni një pointer. Pra, vetëm për radhitje atëherë, në qoftë se fusha n në brendësi të struct quajtur treguesin barabartë barabartë n, kthehen vërtetë. Përndryshe, kjo vijë këtu - pointer barabartë treguesin e ardhshëm. Pra, çfarë është duke bërë këtë, njoftim, është në qoftë se unë jam duke vënë në struct përmbajnë 9, dhe 9 nuk është numri i Unë jam duke kërkuar për - mendoj unë jam duke kërkuar për n barabartë me 50 - Unë jam duke shkuar për të rinovuar treguesin time të përkohshme të mos theksoj në këtë nyje më, por akrep shigjetë tjetër, e cila është duke shkuar për të vënë mua deri këtu. Tani, kam kuptuar është një shakullinë hyrje. Të mërkurën, në fakt ne do të bëjmë këtë me disa njerëzve dhe me disa më shumë Kodi me një ritëm më të ngadaltë. Por e kuptojnë, ne jemi tani duke e bërë të dhënat tona struktura më komplekse në mënyrë që tonë Algoritme mund të merrni më të efektshme, e cila do të jetë e nevojshme për të pset gjashtë, kur ne të ngarkesës në, përsëri, ata 150,000 fjalë, por duhet të bëni kështu efikase, dhe në mënyrë ideale, të krijojë një program që shkon për përdoruesit tanë jo në linear, jo në n katror, ​​por në kohë konstante, ne idealin. Ne do të shihemi të mërkurën. Gjuha: Në CS50 ardhshëm, David harron rastin e tij bazë. DAVID Malan: Dhe kjo është se si ju të dërgoni Mesazhet me tekst C. Çfarë - [MESAZH NDRYSHME TEXT NJOFTIMI Sounds]