DAVID Malan: haki wote, kuwakaribisha nyuma. Hii ni CS50. Huu ni mwanzo wa wiki saba. Hivyo imekuwa ni ya muda, hivyo nimeona tunatarajia kuchukua ziara ya kimbunga ambapo sisi kushoto mbali na ambapo sisi ni sasa kwenda. Hivyo jambo hili hapa ili kuwa imesababisha baadhi ya Angst saa ya kwanza. Lakini pengine, wewe ni mwanzo acclimate kwa nini hii inaashiria hapa - nyota anayewakilisha pointer, ambayo ni kile tu, katika suala layman zaidi? Hivyo ni anwani. Hivyo ni anwani ya kitu katika kumbukumbu. Na sisi kuanza peel nyuma tabaka michache ya wiki iliyopita, mambo kama GetString na wengine vile kazi muda wote huu wamekuwa kurudi anwani ya mambo katika kumbukumbu, kama anuani ya tabia ya kwanza katika baadhi ya mlolongo. Hivyo sisi pia ilianzisha Valgrind, ambayo itabidi kuanza kutumia kwa ajili ya tatizo hili kuweka, hasa kwa ajili ya pili tatizo kuweka pia. Na Valgrind anafanya nini kwa ajili yetu? Ni hundi kwa uvujaji kumbukumbu, na pia hundi kwa ajili ya matumizi mabaya ya kumbukumbu. Inaweza, pamoja na uwezekano baadhi, kuchunguza kama kanuni yako ni kwenda kwa kugusa kumbukumbu kwamba tu hawapaswi. Hivyo si lazima leak, lakini kama wewe kwenda zaidi ya mipaka ya baadhi ya safu, na wewe kweli kuendesha Valgrind na kushawishi kwamba tabia wakati Valgrind ni mbio katika mpango wako ni mbio ndani yake, utapata ujumbe kama hii - "batili kuandika ya ukubwa 4, "ambayo, kukumbuka michache ya wiki iliyopita na maana kwamba mimi alikuwa na ajali kama kwenye int moja mbali mno zaidi ya mipaka ya safu. Na hivyo ukubwa 4 maana hapa ukubwa ya kwamba int fulani. Hivyo kuchukua uhakika katika ukweli kwamba pato Valgrind ya, muundo wa hayo, ni mauaji. Ni kweli ni vigumu kuona kwa kupitia fujo kwa habari ya kuvutia. Hivyo kile ambacho tumefanya hapa ni Excerpt baadhi ya wanandoa wa zaidi kuvutia mistari. Lakini kutambua kwamba 80% ya wa Valgrind pato ni kwenda kuwa kidogo ya ovyo. Kuangalia tu kwa chati kama haya - batili kulia, batili kusoma, ka 40 na baadhi ya idadi ya vitalu ni dhahiri waliopotea, maneno kama hayo. Na nini wewe utakuwa hopefully kuona ni baadhi aina ya kuwaeleza ya nini kazi kosa ni kweli in Katika kesi hii hapa, katika kile mstari wa kanuni yangu ilikuwa inaonekana makosa? 26 katika faili inayoitwa memory.c, ambayo ilikuwa mfano sisi walikuwa kucheza na kwa wakati. Hivyo pengine si katika malloc. Ilikuwa pengine katika kanuni yangu badala yake. Hivyo tutaweza kuona hili tena na tena kabla ya muda mrefu. Hivyo scanf, hii walifika katika michache ya aina hivi sasa. Tuliona sscanf ufupi. Ni kitu ya simu ya wewe dived katika katika yako maandalizi ya chemsha bongo. Na scanf ni kweli nini CS50 maktaba imekuwa kutumia chini ya Hood kwa muda ili baadhi kabisa kupata mawazo kutoka kwa mtumiaji. Kwa mfano, kama mimi hoja juu ya CS50 appliance hapa, napenda kufungua mfano leo kwamba wito scanf-0.c Na ni super rahisi. Ni tu mistari michache ya kificho. Lakini inaonyesha kweli jinsi GetInt imekuwa ikifanya kazi yote ya wakati huu. Katika mpango huu hapa, katika mstari wa 16 , Taarifa kwamba mimi kutangaza int. Hivyo hakuna kuyatumia, kitu kichawi huko, tu int. Kisha katika mstari 17, mimi haraka mtumiaji kwa ajili ya simu, tafadhali. Kisha katika 18 marehemu, mimi kutumia scanf hapa. Na mimi maalum, aina ya kama printf, kwamba mimi nina wanatarajia quote unquote asilimia i. Hivyo asilimia i, bila shaka, inaashiria int. Lakini taarifa ya nini pili hoja ya scanf ni. Jinsi gani unaweza kuelezea pili Hoja baada ya koma? Hiyo ni nini? Ni anuani ya x. Hivyo hii ni muhimu kwa sababu kwa kutoa scanf na anuani ya x, ni nini kwamba kuwawezesha kuwa kazi ya kufanya? Si tu kwenda huko, lakini pia kufanya nini? Kufanya mabadiliko hayo. Kwa sababu unaweza kwenda huko, ni aina ya kama ramani ya eneo katika kumbukumbu. Na hivyo muda mrefu kama wewe kutoa scanf, au kazi yoyote na ramani, vile kwamba kazi inaweza kwenda huko, na si tu kuangalia thamani, lakini unaweza pia mabadiliko ya kwamba thamani, ambayo ni muhimu kama kusudi katika maisha ya scanf ni Scan pembejeo kutoka kwa mtumiaji, hasa kutoka keyboard. Na f inaashiria mpangilio tu kama printf, f inaashiria mpangilio kamba kwamba unataka magazeti. Hivyo katika muda mfupi, hii 18 mstari tu anasema, kujaribu kusoma int kutoka user keyboard na kuhifadhi ndani ya x, saa chochote anuani x hutokea kuishi katika. Na kisha mwishowe, mstari 19 tu anasema, shukrani kwa ajili ya int, katika kesi hii. Hivyo basi mimi kwenda mbele na kufanya hii. Hivyo kufanya scanf 0. Hebu kwenda mbele na zoom in Nitakwenda na kukimbia hii na dots kufyeka scanf 0. Simu, tafadhali? 50. Shukrani kwa ajili ya 50. Hivyo ni rahisi sana. Sasa ni nini si kufanya? Siyo kufanya rundo zima ya kuangalia makosa. Kwa mfano, kama mimi si kushirikiana, na mimi si aina katika idadi, lakini badala mimi kuandika kitu kama "hello," hiyo ni aina tu ya ajabu. Na hivyo moja ya mambo CS50 maktaba amekuwa akifanya kwa ajili yetu kwa baadhi ya muda ni kwamba reprompting na reprompting. Jaribu tena maneno kukumbuka ilikuwa katika cs50.c, na kwamba ni sababu ya kwamba GetInt katika Maktaba CS50 ni kweli nzima rundo la mistari ya muda mrefu, kwa sababu tuko kuangalia kwa mambo ya kijinga kama hii. Je, si kutoa mtumiaji yetu, kwa kweli, int? Je, yeye au kutupa kitu kama barua ya herufi? Kama ni hivyo, tunataka kuchunguza kwamba na yell katika wao. Lakini mambo kupata zaidi ya kuvutia katika mfano huu unaofuata. Kama mimi kwenda scanf-1.c, kile ni moja kitu kwamba ni kimsingi iliyopita katika mfano huu ijayo? Mimi nina kutumia * Char, bila shaka, badala ya int. Hivyo hii ni ya kuvutia, kwa sababu Char *, kukumbuka, ni kweli tu kitu kimoja kama kamba. Hivyo anahisi kama labda hii ni super rahisi ya utekelezaji wa GetString. Lakini nimepata peeled nyuma ya safu ya maktaba CS50, hivyo mimi nina wito huu * Char sasa. Basi hebu angalia ambapo, kama mahali popote, sisi kwenda vibaya. Mstari 17 - Mimi tena kusema, tafadhali nipe kitu, katika kesi hii, kamba. Na kisha katika mstari wa pili, mimi wito scanf, tena, kutoa ni kanuni ya muundo, lakini hii asilimia muda s. Na kisha wakati huu, mimi nina kutoa ni buffer. Sasa taarifa, mimi si kutumia Ampersand. Lakini kwa nini ni kwamba pengine OK hapa? Sababu kile ni buffer tayari? Ni tayari pointer. Ni tayari anwani. Na hebu neno hili "kuwachanganya," basi mimi tu kuiita s, kwa mfano, kwa unyenyekevu. Lakini nimepata kuitwa ni buffer kwa sababu katika ujumla, katika programu, kama una chunk ya kumbukumbu, ambayo string kweli tu ni, unaweza kuiita buffer. Ni mahali pa kuhifadhi habari. Sawa na mambo kama YouTube, wakati wao ni buffering, hivyo kusema, kwamba tu ina maana ni kushusha bits kutoka internet na kuzihifadhi katika mitaa safu, chunk mitaa ya kumbukumbu ili kwamba unaweza kuangalia ni baadaye bila ni kuruka au kunyongwa wewe wakati kucheza nyuma. Hivyo kuna tatizo hapa ingawa, kwa sababu mimi nina kuwaambia scanf, wanatarajia kamba kutoka mtumiaji. Hapa ni anwani ya chunk ya kumbukumbu. Kuweka kwamba kamba huko. Kwa nini ni kwamba amefungwa kutoa sisi shida, ingawa? Nini hiyo? Naruhusiwa kupata kuwa sehemu ya kumbukumbu? Unajua, mimi sijui. Kwa sababu ina buffer wamekuwa initialized na kitu chochote? Si kweli. Na hivyo ni nini tumekuwa wito thamani taka, ambayo si neno rasmi. Ni tu ina maana hatuna wazo nini bits ni ndani ya ka nne ambazo Mimi zilizotengwa kama kinga. Mimi si kuitwa malloc. Nimekuwa dhahiri si kuitwa GetString. Hivyo ambaye anajua nini ni kweli ndani ya buffer? Na bado kuwaambia scanf upofu, kwenda huko na kuweka chochote mtumiaji typed. Kwa hiyo kile ni uwezekano wa kusababisha katika kanuni zetu kama sisi kukimbia? Pengine segfault. Labda si, lakini pengine segfault. Na mimi kusema labda si kwa sababu wakati mwingine kufanya, wakati mwingine huwezi kupata segfault. Wakati mwingine wewe tu kupata bahati, lakini hata hivyo ni kwenda kuwa mdudu katika programu yetu. Hivyo basi mimi kwenda mbele na kukusanya hii. Mimi naenda kufanya hivyo umri wa shule ya njia. Hivyo Clang dash 0, scanf-1, scanf-1.c, kuingia. Lo, mzee sana shule. Hebu angalia. Wapi mimi kwenda? Oh, char * buffer. Oh, asante - Ila, OK - zamani sana shule. Haki ya wote, imekuwa ni muda. Hivyo nimekuwa tu baada ya kuokolewa faili maamuzi kwamba muda mabadiliko ya wakati iliyopita. Na sasa mimi ni compiled manually na Clang. Na sasa mimi nina kwenda mbele na kukimbia scanf-1, kuingia. Kamba tafadhali. Mimi itabidi aina katika "hello." Na sasa, hapa ambapo, kusema ukweli, printf unaweza ni kidogo annoying. Siyo kweli kwenda segfault katika kesi hii. Printf ni kidogo maalum kwa sababu hivyo ni super kawaida kutumika kwamba kimsingi printf ni kufanya sisi neema na kutambua, si kwamba pointer halali. Napenda kuchukua juu ya mwenyewe tu magazeti nje katika null mabano, hata ingawa ni lazima si kile sisi wenyewe ilivyotarajiwa. Hivyo hatuwezi kweli urahisi kushawishi segfault na hili, lakini ni wazi hii si tabia nilitaka. Basi nini ufumbuzi rahisi? Naam, katika scanf-2, napenda kupendekeza kwamba badala ya kweli tu kugawa * Char, basi mimi kuwa ni kidogo nadhifu kuhusu hii, na napenda kutenga buffer kama mlolongo wa chars 16. Hivyo naweza kufanya hivyo katika michache ya njia. Mimi naweza kabisa kutumia malloc. Lakini siwezi kwenda nyuma ya wiki mbili wakati Mimi tu inahitajika rundo zima la wahusika. Hiyo tu safu. Hivyo basi mimi badala redefine buffer kuwa safu ya wahusika 16. Na sasa, wakati mimi kupita buffer katika - na hii ni kitu hatukuwa majadiliano juu katika wiki mbili - lakini unaweza kutibu safu kama ingawa ni anwani. Kitaalam, kama tumeona, wao ni tofauti kidogo. Lakini scanf si akili kama wewe kupita jina la safu, kwa sababu kile Clang kufanya kwa sisi kimsingi ni kutibu jina la safu kwamba kama anuani ya chunk ya ka 16. Hivyo hii ni bora. Hii ina maana kwamba sasa naweza hopefully kufanya yafuatayo. Hebu zoom nje kwa muda na kufanya kufanya scanf-2, ulioandaliwa OK. Sasa basi mimi wala got kufyeka scanf-2. Kamba tafadhali. "Hello." Na ni walionekana kazi wakati huu. Lakini mtu anaweza kupendekeza mazingira ambayo wanaweza bado kazi? Yeah? Kitu zaidi ya wahusika 16. Na kwa kweli, tunaweza kuwa na kidogo sahihi zaidi. Kitu tena basi 15 wahusika, kwa sababu kwa kweli tunahitaji kukumbuka kwamba tunahitaji kuwa backslash sifuri inamuunga mwisho wa kamba, ambayo ni scanf kando mapenzi kawaida utunzaji wa kwetu. Hivyo basi mimi kufanya kitu kama - wakati mwingine tunaweza tu kuondoka ni kama hiyo. OK, hivyo tumekuwa sasa ikiwa segmentation wetu kosa. Kwa nini? Kwa sababu mimi niliandika kwa zaidi ya 15 wahusika, na hivyo tumekuwa kweli kuguswa kumbukumbu kwamba mimi kwa kweli unapaswa kuwa. Basi nini ufumbuzi kweli hapa? Naam, nini kama tunahitaji kamba tena? Naam, sisi kufanya hivyo labda 32 ka. Naam, ni nini kama si kwamba muda wa kutosha? Vipi kuhusu 64 ka? Nini kama si kwamba muda wa kutosha? Vipi kuhusu 128 au 200 ka? Kile kwa kweli ni ufumbuzi hapa katika kesi ujumla, kama hatujui katika kuendeleza kile user kinaendelea na aina? Ni tu aina ya maumivu kubwa katika punda, kuwa waaminifu, ambayo ni kwa nini CS50 maktaba ina mistari kadhaa chache ya kificho kwamba pamoja kutekeleza GetString kamba katika njia kwamba hatuna kujua mapema kile user ni kwenda aina. Hasa, kama wewe kuangalia nyuma katika cs50.c kutoka wiki mbili zilizopita, utaona GetString kwamba kweli haina si kutumia scanf kwa njia hii. Badala yake, anasoma moja tabia kwa wakati. Sababu moja nzuri kitu kuhusu kusoma tabia moja ni tunaweza kuhakikisha wenyewe daima angalau moja Char. Naweza tu kutangaza Char, na kisha kuchukua hatua hizi kweli mtoto tu kusoma tabia moja katika saa wakati kutoka keyboard. Na kisha, nini utaona GetString gani ni kila wakati anaendesha nje ya, kusema, ka 16 ya kumbukumbu, inatumia malloc, au binamu yake, kwa kutenga zaidi ya kumbukumbu, kuiga kale kumbukumbu katika kutambaa mpya, na kisha pamoja, kupata tabia moja kwa wakati, na wakati anaendesha nje ya kwamba chunk ya kumbukumbu, kumtupia mbali, grabs chunk kubwa ya kumbukumbu, nakala ya zamani katika mpya, na kurudia. Na ni kweli maumivu ya kweli kutekeleza kitu rahisi kama kupata pembejeo kutoka kwa mtumiaji. Hivyo unaweza kutumia scanf. Unaweza kutumia kazi nyingine kama hiyo. Na mengi ya vitabu vya kiada na online mifano kufanya, lakini wao ni wote mazingira magumu na matatizo kama hii. Na hatimaye, kupata segfault ni aina ya annoying. Ni si nzuri kwa ajili ya mtumiaji. Lakini katika hali mbaya zaidi, ni nini kimsingi ni kuweka yako kanuni katika hatari ya? Baadhi ya aina ya mashambulizi, uwezekano. Kuongelea mashambulizi moja vile - wingi stack. Lakini kwa ujumla, kama wewe ni kuruhusiwa kufurika buffer, kama tulivyofanya michache ya wiki iliyopita, na kuandika tu zaidi ya "hello" juu ya stack, unaweza unaweza kweli kuchukua, uwezekano, kompyuta, au angalau kupata saa data kwamba siyo wewe. Hivyo katika muda mfupi, hii ni kwa nini tuna magurudumu mafunzo hayo. Lakini sasa, sisi kuanza kuchukua mbali, kama mipango yetu hakuna haja tena, lazima, pembejeo kutoka kwa mtumiaji. Lakini katika kesi ya tatizo kuweka sita, mchango wako watakuja kutoka kubwa kamusi faili na baadhi ya 150 isiyo ya kawaida maneno elfu. Hivyo huwezi kuwa na wasiwasi kuhusu mtumiaji holela pembejeo. Sisi nitakupa baadhi ya mawazo kuhusu faili hilo. Maswali yoyote juu ya kuyatumia au scanf au mtumiaji pembejeo kwa ujumla? Haki ya wote, hivyo kuangalia haraka kisha saa moja trailing mada kutoka wiki mbili zilizopita. Na kwamba alikuwa wazo hili la struct. Si kwamba - wazo hili la Struct, ambayo ilikuwa nini? Nini struct kufanya kwa ajili yetu? Kufafanua - pole? Kufafanua aina ya kutofautiana. Hivyo aina ya. Sisi ni kweli kuchanganya mada mbili. Hivyo, pamoja na typedef, kukumbuka kwamba tunaweza kutangaza aina ya yetu wenyewe, kama kisawe, kama kamba kwa ajili ya * Char. Lakini kwa kutumia typedef na struct, tunaweza kujenga kweli wetu data mwenyewe miundo. Kwa mfano, kama mimi kurejea katika gedit hapa kwa muda tu, na mimi kwenda mbele na kufanya kitu kama, napenda kuokoa hii kama, hebu sema, structs.c muda, Mimi tu kwenda kwa kwenda mbele na ni pamoja na standardio.h, int kuu utupu. Na kisha katika hapa, tuseme kwamba mimi nataka kuandika mpango kwamba maduka nyingi wanafunzi kutoka nyingi nyumba, kwa mfano. Hivyo ni kama registrarial database ya aina fulani. Hivyo kama nahitaji jina mwanafunzi mmoja, mimi anaweza kufanya kitu kama jina Char *, na mimi itabidi kufanya kitu kama - kweli, hebu kutumia maktaba CS50 kwa muda tu kufanya hii kidogo rahisi, ili tuweze kukopa wale kadhaa ya mistari ya kificho. Na wacha tu kuitunza rahisi. Tutaweza kushika ni kamba, na sasa GetString. Hivyo mimi sasa wanadai kwamba nimepata kuhifadhiwa jina baadhi ya mwanafunzi, na nyumba ya baadhi ya mwanafunzi, kifupi kwa kutumia vigezo kama tulivyofanya na katika wiki moja. Lakini nadhani sasa wanataka kusaidia mbalimbali ya wanafunzi. Haki ya wote, hivyo silika yangu ni kufanya kamba NAME2, anapata GetString, kamba house2 anapata GetString. Na kisha mwanafunzi wetu wa tatu, hebu kufanya name3 GetString. Haki wote, hivyo hii ni hopefully fora wewe kama aina ya kijinga, kwa sababu mchakato huu ni kweli kamwe kwenda mwisho, na ni kwenda tu kufanya code yangu kuangalia mbaya na mbaya zaidi na zaidi. Lakini sisi kutatuliwa hilo pia katika wiki mbili. Ni ufumbuzi gani wetu kiasi safi wakati tulikuwa na vigezo mbalimbali ya huo data aina kuwa ni wote kuhusiana, lakini sisi hakutaka hii fujo mauaji ya vigezo vile vile jina lake? Nini sisi nini badala yake? Hivyo nadhani nikasikia maeneo machache. Tulikuwa safu. Kama unataka matukio mbalimbali ya kitu, kwa nini sio sisi safi hii kila juu na kusema tu, nipe safu kuitwa majina? Na kwa sasa, hebu ngumu kanuni 3. Na kisha nipe mwingine safu kuitwa nyumba, na napenda kwa sasa kwa bidii kanuni 3. Na nimekuwa massively alisafisha fujo kwamba mimi tu kuundwa. Sasa, nimekuwa bado ngumu coded 3, lakini hata 3 inaweza dynamically kuja kutoka mtumiaji, au argv, au kama. Hivyo hii ni tayari safi. Lakini nini annoying kuhusu hili ni kwamba sasa, hata kama jina ni namna fulani Kimsingi wanaohusishwa na mwanafunzi nyumba - ni mwanafunzi wa kwamba mimi kwa kweli wanataka kuwakilisha - Mimi sasa na arrays mbili ambazo ni sambamba kwa maana ya kwamba wao ni ukubwa huo, na majina ya mabano 0 labda ramani ya nyumba mabano 0, na majina mabano 1 ramani na nyumba mabano 1. Kwa maneno mengine, mwanafunzi kwamba maisha katika kwamba nyumba, na kwamba mwanafunzi mwingine maisha katika nyumba nyingine. Lakini hakika hii inaweza kuwa kufanyika hata zaidi cleanly. Vizuri, inaweza, kwa kweli. Na napenda kwenda mbele na kufungua hadi structs.h, na utasikia kuona wazo hili hapa. Taarifa kwamba nimekuwa kutumika typedef, kama wewe alluded wakati iliyopita kutangaza wetu mwenyewe data aina. Lakini nina pia kutumia Keyword nyingine kuitwa struct ambayo inatoa mimi mpya data muundo. Na muundo huu data mimi kudai ni kwenda kuwa na mambo mawili ndani ya yake - string kuitwa jina, na string kuitwa nyumba. Na jina Mimi naenda kuwapa muundo huu data ni kwenda kuitwa mwanafunzi. Mimi naweza kuiita kitu nataka, lakini hii semantically kufanya kuhisi na mimi katika mawazo yangu. Hivyo sasa, kama mimi kufungua toleo bora ya mpango Nilianza kuandika huko, basi mimi kitabu juu. Na kuna baadhi ya zaidi ya mistari ya kanuni hapa, lakini napenda kuzingatia kwa sasa juu ya mmoja. Nimekuwa alitangaza mara kwa mara wanafunzi kinachoitwa na ngumu coded 3 kwa sasa. Lakini sasa, taarifa jinsi safi kanuni yangu huanza kupata. Katika mstari wa 22, mimi kutangaza safu ya wanafunzi. Na taarifa kwamba mwanafunzi ni inaonekana sasa aina data. Kwa sababu saa ya juu ya faili hili, taarifa Nimekuwa pamoja na kwamba faili header kwamba mimi vunjwa juu tu wakati iliyopita. Na kwamba faili header kabisa tu alikuwa ufafanuzi huu wa mwanafunzi. Hivyo sasa, nimekuwa kuundwa data yangu mwenyewe desturi aina ya kwamba waandishi wa miaka C iliyopita hakufikiri wa mapema. Lakini hakuna tatizo. Siwezi kufanya hivyo mwenyewe. Hivyo hii ni safu kuitwa wanafunzi, kila mmoja wa wanachama ambao ni muundo wa mwanafunzi. Na mimi nataka tatu ya wale katika safu. Na sasa, je, wengine ya mpango huu kufanya? Mimi zinahitajika kitu kidogo holela. Hivyo kutokana na kuendelea online 24, Mimi iterate 0-3. Mimi kisha kuuliza mtumiaji kwa ajili ya mwanafunzi jina. Na kisha mimi kutumia GetString kama kabla. Basi mimi kuuliza kwa ajili ya nyumba ya mwanafunzi, na mimi kutumia GetString kama kabla. Lakini ilani - kidogo mpya kipande cha syntax - Mimi bado unaweza index kwa mwanafunzi i-th, lakini jinsi gani mimi kupata saa data maalum shamba ndani ya struct? Vizuri, nini inaonekana mpya kipande cha syntax? Ni tu operator dot. Tumekuwa si kweli kuona hii kabla. Ve kuonekana katika pset tano kama wameweza dived katika tayari kwa files bitmap. Lakini dot tu ina maana ndani ya hii struct au mashamba mbalimbali, kutoa dot jina, au nipe dot nyumba. Hiyo ina maana kwenda ndani ya struct na kupata mashamba hayo hasa. Nini wengine wa mpango hii nini? Siyo sexy kwamba wote. Taarifa kwamba mimi iterate 0-3 tena, na mimi tu kujenga Kiingereza maneno kama hivyo na hivyo ni katika vile na nyumba hiyo, kupita katika jina dot kutoka mwanafunzi i-th na wao nyumba pia. Na kisha mwisho, sasa tutaweza kuanza kupata anal kuhusu hili, sasa kwamba sisi ni ukoo na nini malloc na kazi nyingine wamekuwa kufanya wakati huu wote. Kwa nini nina huru wawili jina na nyumba, hata mimi hakuwa na wito malloc? GetString alivyofanya. Na kwamba ilikuwa chafu kidogo siri kwa wiki kadhaa, lakini ana GetString imekuwa kinachovuja kumbukumbu yote juu ya mahali yote ya muhula wa hivi sasa. Na valgrand mapenzi hatimaye yatangaza hii kwetu. Lakini si kubwa mpango huo, kwa sababu ninajua kwamba naweza tu huru jina na nyumba, ingawa kitaalam, kwa kuwa super, super salama, nitakuwa kufanya baadhi ya makosa ya kuangalia hapa. Je, ni silika yako nakuambia? Nini anatakiwa kuwa na kuangalia kwa kabla mimi huru ni nini kamba, aka ambayo * Char? Mimi lazima kweli kuwa na kuangalia kama wanafunzi bracket i dot jina haina sawa null. Basi utakuwa ni sawa na kwenda mbele na bure kwamba pointer, na moja au nyingine moja pia. Kama wanafunzi mabano i dot nyumba si sawa na null, hii sasa kulinda dhidi ya kesi ya kona ambayo GetString anarudi kitu kama null. Na tuliona wakati iliyopita, printf mapenzi kulinda sisi hapa juu na kusema tu null, ambayo ni kwenda kuangalia weird. Lakini angalau itakuwa si segfault, kama tulivyoona. Vizuri, basi mimi kufanya jambo moja nyingine hapa. structs-0 ni aina ya mpango wa kijinga kwa sababu mimi kuingia hii data zote, na kisha ni kupotea mara moja mpango wa mwisho. Lakini napenda kwenda mbele na kufanya hili. Napenda kufanya terminal dirisha kubwa kidogo. Napenda kufanya structs-1, ambayo ni toleo jipya la hii. Mimi itabidi kuvuta kidogo. Na sasa basi mimi kukimbia dot kufyeka structs-1. Jina ya mwanafunzi - Daudi Mather, hebu kufanya Rob Kirkland, hebu kufanya Lauren LEVERETT. Nini kuvutia sasa ni taarifa - na mimi tu najua hili kwa sababu Niliandika mpango - kuna faili sasa sasa yangu saraka ya kuitwa students.csv. Baadhi ya unaweza kuwa na kuonekana hizi katika ulimwengu wa kweli. Nini faili CSV? Koma maadili. Ni aina ya kama maskini wa mtu toleo la faili Excel. Ni meza ya safu na nguzo kwamba unaweza kufungua katika mpango kama Excel, Hesabu au juu ya Mac. Na kama mimi kufungua faili hii hapa gedit, ilani - na idadi si huko. Hiyo tu gedit kuwaambia mimi line namba. Taarifa juu ya line ya kwanza ya hii faili ni Daudi na Mather. mstari wa pili ni Rob comma Kirkland. Na mstari wa tatu ni Lauren comma LEVERETT. Hivyo kile mimi umba? Nimepata sasa imeandikwa mpango C kwamba ufanisi inaweza kuzalisha Spreadsheets kwamba anaweza kufunguliwa katika mpango kama Excel. Si kulazimisha kwamba wote kuweka data, lakini kama una chunks kubwa ya data kwamba kweli wanataka kuendesha na kufanya grafu ya na kama, hii labda ni moja njia ya kujenga data hizo. Aidha, ni kweli CSVs super kawaida tu kwa ajili ya kuhifadhi data rahisi - Yahoo Fedha, kwa mfano, kama kupata hisa quotes kupitia yao kinachojulikana API, huduma ya bure ambayo inakuwezesha kupata sasa up-to-ya-tarehe hisa quotes kwa ajili ya makampuni, wao kutoa data nyuma katika super rahisi CSV format. Hivyo ni jinsi gani sisi kufanya hivyo? Vizuri taarifa, zaidi ya hii ya mpango karibu sawa. Lakini taarifa chini hapa, badala ya magazeti wanafunzi nje, juu ya mstari 35 kuendelea, mimi kudai kwamba mimi nina kuokoa wanafunzi kwa disk, hivyo kuokoa faili. Hivyo taarifa mimi nina kutangaza JALADA * - sasa, hii ni aina ya makosa katika C. Kwa sababu yoyote, JALADA ni kila kofia, ambayo si kama aina nyingine ya data katika C. Lakini hii ni kujengwa katika data aina, JALADA *. Na mimi nina kutangaza pointer faili, ni jinsi gani unaweza kufikiri ya kwamba. fopen maana faili wazi. Nini faili unataka wazi? Nataka kufungua faili kwamba mimi kiholela kuwaita students.csv. Mimi naweza kuita kwamba kitu nataka. Na kisha kuchukua nadhani. Ni nini hoja ya pili kwa fopen pengine maana? Haki, w kwa kuandika, inaweza kuwa r kwa ajili ya kusoma. Kuna kwa append kama wewe unataka kuongeza mistari na si overwrite jambo zima. Lakini mimi tu wanataka kujenga faili hii mara moja, hivyo mimi itabidi kutumia quote unquote w. Na najua kwamba tu kutoka baada ya kusoma nyaraka, au ukurasa mtu. Kama faili si null - kwa maneno mengine, kama hakuna kitu potoka huko - basi mimi iterate juu ya wanafunzi 0-3. Na sasa taarifa kuna kitu milele hivyo tofauti kidogo kuhusu line 41 hapa. Siyo printf. Ni kwa ajili ya faili fprintf printf. Hivyo ni kwenda kuandika na faili. Ambayo faili? mtu ambaye pointer bayana kama hoja ya kwanza. Kisha sisi bayana kamba format. Kisha sisi bayana nini kamba tunataka kuziba katika s kwanza kwa asilimia, na kisha mwingine kutofautiana au pili asilimia s. Kisha sisi karibu faili na fclose. Kuliko mimi huru kumbukumbu kama kabla, ingawa Mimi lazima kurudi nyuma katika na kuongeza baadhi ya hundi kwa null. Na hiyo ni yake. fopen, fprintf, fclose anitiaye uwezo wa kujenga files maandishi. Sasa, utaona katika tatizo kuweka tano, ambayo inahusisha picha, wewe utakuwa kutumia binary files badala yake. Lakini kimsingi, wazo ni sawa, hata ingawa kazi utasikia kuona ni tofauti kidogo. Hivyo kimbunga ziara, lakini utapata wote pia familiar na faili I/O-- pembejeo na pato - na pset tano. Na maswali yoyote kuhusu awali misingi hapa? Yeah? Nini kama wewe kujaribu bure thamani null? Naamini, isipokuwa bure imenipatia kidogo zaidi user-kirafiki, unaweza uwezekano segfault. Kupita null ni mbaya kwa sababu mimi si kuamini bure bothers kuangalia kwa ajili yenu, sababu ingekuwa uwezekano kuwa taka ya muda kwa ajili yake kufanya yenyewe kwa ajili ya kila mtu katika ulimwengu. Nzuri swali, ingawa. Haki ya wote, hivyo aina hii ya anapata sisi mada ya kuvutia. mandhari ya kuweka tatizo tano ni forensics. Angalau hiyo ni sehemu ya kuweka tatizo. Forensics kwa ujumla inahusu ahueni wa habari kwamba wanaweza au inaweza kuwa imefutwa makusudi. Na hivyo mimi mawazo ningependa kukupa haraka ladha ya kile ni kweli kinachoendelea kila wakati huu chini ya kofia ya kompyuta yako. Kwa mfano, kama una yako ndani ya mbali au desktop yako kompyuta gari ngumu, ni aidha mitambo kifaa kwamba kweli spins - kuna mviringo mambo kuitwa platters kwamba kuangalia kabisa kama kile tu alikuwa juu ya screen hapa, ingawa hii ni inazidi umri wa shule. Hii ni mitatu na nusu-inch gari ngumu. Na tatu na nusu inchi inahusu ya na wa kitu wakati wa kufunga ni katika kompyuta. Wengi wenu guys katika Laptops yako sasa kuwa anatoa imara-hali, au SSDs, ambayo hakuna kusonga sehemu. Wao ni zaidi kama RAM na chini kama haya vifaa mitambo. Lakini mawazo bado ni sawa, hakika kama wao kuhusiana kwa tatizo kuweka tano. Na kama unadhani kuhusu sasa gari ngumu inawakilisha kuwa mduara, ambayo Mimi itabidi kuteka kama hii hapa. Wakati kujenga faili kwenye kompyuta yako, kama ni SSD, au katika kesi hii, wakubwa shule ngumu kuendesha gari, faili ambayo inajumuisha bits nyingi. Hebu kusema kwamba ni hii 0 na 1, kundi zima la sekunde 0 na 1s. Hivyo hii ni ngumu wangu wote gari. Hii ni inaonekana faili pretty kubwa. Na ni kwa kutumia hadi sekunde 0 na 1s saa kwamba sehemu ya sahani ya kimwili. Naam, kile ni kwamba sehemu ya kimwili? Naam, zinageuka kuwa kwenye gari ngumu, angalau ya aina hii, kuna haya kidogo kidogo magnetic chembe. Na wao kimsingi kuwa na kaskazini na kusini fito kwa wao, ili kwamba kama wewe kurejea moja ya chembe wale magnetic njia hii, unaweza kusema kwamba ni anayewakilisha 1. Na kama ni kichwa chini kusini kaskazini, unaweza kusema kwamba ni anayewakilisha 0. Hivyo katika ulimwengu halisi ya kimwili, hiyo ni jinsi gani unaweza kuwakilisha kitu katika binary hali ya 0 na 1. Hivyo kwamba ni faili wote ni. Kuna rundo zima la magnetic chembe kuwa ni yao kwa njia hii au njia hii, kujenga chati ya sekunde 0 na 1s. Lakini zinageuka wakati wewe ila faili, baadhi ya habari ni kuokolewa tofauti. Hivyo hii ni meza kidogo, directory, hivyo kusema. Na Mimi nitakuita jina hili safu, na Mimi nitakuita hii eneo safu. Na mimi nina kwenda kusema, tuseme hii ni resume yangu. Resume.doc yangu ni kuhifadhiwa katika mahali, hebu sema 123. Mimi daima kwenda kwa idadi hiyo. Lakini inatosha kusema kwamba kama tu katika RAM, unaweza kuchukua gari ngumu hiyo ni gigabytes gigabyte au 200 au terabyte, na unaweza idadi yote ya ka. Unaweza kuzihesabu chunks wote wa bits 8. Hivyo tutaweza kusema kwamba hii ni eneo 123. Hivyo hii ndani ya saraka ya uendeshaji yangu mfumo anakumbuka kwamba yangu resume ni katika eneo 123. Lakini anapata kuvutia wakati kufuta faili. Hivyo kwa mfano - na nashiriki, wengi wa dunia ina hawakupata kwenye hii - kile kinachotokea wakati Drag faili takataka yako Mac OS au Windows yako Recycle Bin? Nini madhumuni ya kufanya hivyo? Ni wazi kujikwamua faili, lakini nini kitendo cha akawatoa na kuacha katika takataka yako au yako Recycle Bin kufanya kwenye kompyuta? Kabisa kitu, kwa kweli. Ni kama tu folder. Ni folder maalum, kuwa na uhakika. Lakini je, ni kweli kufuta faili? Naam, hapana, kwa sababu baadhi yenu pengine wamekuwa kama, oh damn, wewe si maana kwa kufanya hivyo. Hivyo bonyeza mara mbili Takataka au Recycle Bin. Umefanya poked karibu na umefanya zinalipwa faili tu na akawatoa ni nje ya hapo. Hivyo ni wazi, siyo lazima kufuta yake. OK, wewe ni nadhifu zaidi ya hiyo. Unajua kwamba tu akawatoa ndani Takataka au Recycle Bin haina maana wewe ni kuondoa takataka. Hivyo kwenda hadi orodha, na kusema Tupu takataka au Tupu Recycle Bin. Kisha nini kitatokea? Yeah, hivyo ni ilifutwa zaidi ya hivyo. Lakini yote ambayo hufanyika ni hii. kompyuta anasahau ambapo resume.doc mara. Lakini nini haujabadilika inaonekana kwenye picha? bits, sekunde 0 na 1s kwamba mimi kudai ni kwenye tovuti ya nyanja baadhi ya kimwili ya vifaa. Bado wapo. Ni tu kompyuta ina wamesahau nini hao. Hivyo ni kimsingi huru faili bits ili waweze kutumika tena. Lakini si mpaka kujenga files zaidi, na zaidi files, na zaidi files mapenzi probabilistically, wale sekunde 0 na 1s, chembe wale magnetic, kupata kutumika tena, kichwa au upande wa kulia juu, kwa nyingine files, sekunde 0 na 1s. Hivyo kuwa na dirisha hili la wakati. Na si wa kutabirika urefu, kwa kweli. Inategemea na ukubwa wa bidii yako gari na jinsi wengi files una na jinsi ya haraka ya kufanya ndio mpya. Lakini kuna hii dirisha la muda wakati ambayo faili kwamba ni bado kikamilifu recoverable. Hivyo kama wewe milele kutumia programu kama McAfee au Norton kujaribu kuokoa data, kila unachokifanya ni kujaribu kupona saraka hii kinachojulikana kwa kufikiri ambapo faili yako mara. Na wakati mwingine Norton na kusema, faili ni 93% recoverable. Naam, hiyo ina maana gani? Kwamba tu ina maana kwamba baadhi ya faili nyingine bahati kuishia kutumia, kusema, wale bits nje ya faili yako ya awali. Hivyo kile ni kweli kushiriki katika kurejesha data? Naam, kama huna kitu kama Norton kabla ya imewekwa kwenye kompyuta yako, bora unaweza wakati mwingine kufanya ni kuangalia saa nzima gari ngumu kuangalia kwa chati ya bits. Na moja ya mandhari ya kuweka tatizo tano ni kwamba utakuwa kutafuta sawa ya gari ngumu, kuchunguza mauaji mfano wa kadi Compact flash kutoka kamera ya digital, kwa ajili ya kutafuta sekunde 0 na 1s kwamba kwa kawaida, na high uwezekano, kuwakilisha kuanza wa picha JPEG. Na wewe guys anaweza kupona picha hizo na kuchukua, kama mimi kuona muundo huu wa bits juu ya picha kuchunguza mauaji, na juu ya uwezekano, kwamba alama mwanzo wa JPEG. Na kama mimi kuona mfano huo tena, kwamba pengine ni mwanzo wa mwingine JPEG, na mwingine JPEG, na mwingine JPEG. Na hii ni kawaida jinsi data ahueni itakuwa kazi. Nini ni nzuri kuhusu JPEGs ni hata ingawa aina ya faili yenyewe ni kiasi fulani tata, mwanzo wa kila vile faili ni kweli haki zinazotambulika na rahisi, kama utaona, kama wameweza si tayari. Basi hebu kuangalia kwa karibu chini ya kofia kama na hasa nini imekuwa kinachoendelea, na nini hawa sekunde 0 na 1s ni, kukupa zaidi kidogo ya mazingira kwa ajili ya changamoto hii hasa. [Video avspelning] -Wapi PC yako maduka zaidi ya data yake ya kudumu. Kufanya hivyo, data husafiri kutoka RAM pamoja na programu ishara kwamba kuwaambia gari ngumu jinsi ya kuhifadhi data hizo. ngumu kuendesha nyaya kutafsiri wale ishara katika voltage kushuka kwa thamani. Hizi, kwa upande wake, kudhibiti gari ngumu ya kuhamia sehemu, baadhi ya wachache kuhamia maeneo kushoto katika kisasa ya kompyuta. Baadhi ya ishara ya kudhibiti motor ambayo spins platters chuma-coated. Data zako ni kweli kuhifadhiwa juu ya haya platters. Ishara nyingine hoja ya kusoma / kuandika vichwa kusoma au kuandika data kwenye sahani. Hii mitambo hivyo sahihi kwamba binadamu nywele hakuweza hata kupita kati ya vichwa na platters inazunguka. Hata hivyo, kila kazi kwa kasi kali. [MWISHO video avspelning] DAVID Malan: Zoom katika kidogo undani sasa saa nini kweli juu platters hayo. [Video avspelning] -Hebu kuangalia nini sisi tu aliona katika mwendo wa polepole. Wakati mapigo mafupi ya umeme ni kutumwa kwa kichwa kusoma / kuandika, kama flips juu ya sumakuumeme vidogo kwa ajili ya sehemu ya pili. sumaku inajenga uwanja, ambayo mabadiliko polarity ya vidogo, vidogo sehemu ya chembe chuma ambayo kanzu kila uso sahani. mfululizo mfano wa haya vidogo, kushtakiwa-up maeneo ya rekodi inawakilisha kidogo moja ya data katika idadi binary mfumo kutumiwa na kompyuta. Sasa, kama sasa ni kutumwa kwa njia moja kupitia kusoma / kuandika kichwa, eneo ni polarized katika mwelekeo mmoja. Kama sasa ni alimtuma katika kinyume mwelekeo, ubaguzi ni kuachwa. Jinsi ya kupata data mbali disk ngumu? Tu kubadili mchakato. Hivyo ni chembe ya rekodi kwamba kupata sasa katika kusoma / kuandika kichwa kusonga mbele. Kuweka pamoja mamilioni ya hizi sumaku makundi, na nimepata faili. Sasa, vipande vya faili moja huenda watatawanyika wote juu ya gari platters, aina ya kama fujo karatasi ya dawati yako. Hivyo maalum faili ziada anaendelea kufuatilia ya ambapo kila kitu. Je, si unataka wewe alikuwa kitu kama hicho? [MWISHO video avspelning] DAVID Malan: OK, pengine si. Hivyo ni jinsi wengi wenu guys ikakua na haya? OK, hivyo ni chache na chache mikono kila mwaka. Lakini mimi nina furaha uko angalau ukoo pamoja nao, kwa sababu hii na yetu wenyewe kitabu demo, cha kusikitisha, wanakufa sana kupunguza vifo hapa ya kufahamiana. Lakini hii ni nini mimi, angalau, nyuma katika shule ya sekondari, kutumika kwa ajili ya matumizi ya Hifadhi. Na ilikuwa ni ajabu, kwa sababu wewe inaweza kuhifadhi megabaiti 1.4 juu ya hii disk fulani. Na hii ilikuwa high wiani toleo, kama unahitajika kwa HD, ambayo ina maana kabla ya video ya leo HD. Wiani kiwango mara 800 kilobytes. Na kabla ya kuwa, kulikuwa na 400-KiloByte disks. Na kabla ya kuwa, kulikuwa na 5 na 1/4 inch disks, ambayo yalikuwa kweli floppy, na pana kidogo na mirefu kuliko haya mambo hapa. Lakini unaweza kweli kuona kinachojulikana floppy disks nyanja ya haya. Na functionally, wao ni kweli pretty sawa na anatoa ngumu ya saa angalau aina hii. Tena, SSDs katika kompyuta ya karibu zaidi kazi tofauti kidogo. Lakini kama wewe hoja kwamba kidogo chuma tab, unaweza kweli kuona alama ya cookie kidogo, au ulio. Siyo chuma kama hii moja. Moja hii ni kweli baadhi ya bei nafuu plastiki nyenzo. Na unaweza aina ya wiggle yake. Na umefanya trully tu wiped off baadhi idadi ya bits au chembe magnetic kutoka disk hii. Hivyo nashiriki, kuna kitu juu yake. Kama jambo hilo katika njia - na kufunika macho yako na wale wa jirani yako - unaweza tu aina ya kuvuta hii nzima ala mbali kama hiyo. Lakini kuna spring kidogo, hivyo kuwa na kufahamu kwamba kwa macho yako. Hivyo sasa una kweli disketi. Na nini ajabu kuhusu hili ni kwamba katika kiasi kama hii ni wadogo wadogo kubwa ya uwakilishi wa gari ngumu, mambo haya ni super, super rahisi. Kama wewe Bana chini yake, sasa kwamba kwamba jambo chuma ni mbali, na peel yao wazi, kila kuna ni vipande viwili vya waliona na kinachojulikana floppy disk na kipande cha chuma ya ndani. Na huenda kuna nusu ya disk yangu yaliyomo. Huenda kuna mwingine nusu yao. Lakini hiyo yote ilikuwa inazunguka ndani ya kompyuta yako katika yesteryear. Na tena, kwa kuweka hii katika mtazamo, jinsi kubwa ni zaidi ya yako ngumu anatoa siku hizi? 500 gigabytes, terabyte, labda katika desktop kompyuta, terabytes 2, 3 terabytes, terabytes 4, haki? Hii ni moja megabyte, kutoa au kuchukua, ambayo hawezi hata fit MP3 kawaida tena siku hizi, au baadhi ya sawa muziki faili. Hivyo souvenir kidogo kwa ajili yenu leo, na pia kusaidia contextualize nini tutaweza kuwa na kuchukua kwa nafasi sasa katika tatizo kuweka tano. Hivyo wale ni yako ya kutunza. Hivyo basi mimi mpito ambapo itakuwa matumizi pset ijayo pia. Hivyo tumekuwa sasa kuweka ukurasa huu kwa ajili - oh, michache ya matangazo ya haraka. Ijumaa hii, kama ungependa kujiunga CS50 kwa chakula cha mchana, kwenda mahali kawaida, cs50.net/rsvp. Na ya mwisho ya mradi - hivyo kwa mtaala, tumekuwa posted mwisho wa mradi vipimo tayari. Kutambua kwamba haina maana kwamba ni kutokana hasa hivi karibuni. Ni posted, kwa kweli, tu kupata guys kufikiri juu yake. Na kwa kweli, muhimu super asilimia ya utakuwa kukabiliana na mwisho miradi juu ya vifaa kwamba sisi si hata wamezipata kwa darasani, bali mapenzi mapema wiki ijayo. Ilani, ingawa, kwamba spec wito kwa vipengele kadhaa tofauti ya mwisho wa mradi. kwanza, katika wiki chache, ni kabla ya pendekezo, email pretty kawaida na TF wako kumwambia au nini wewe kufikiri juu kwa ajili ya mradi wako, na hakuna kujitoa. Pendekezo itakuwa hasa yako ahadi, akisema, hapa, hii ni nini Ningependa kufanya kwa ajili ya mradi wangu. Unafikiri nini? Kubwa mno? Ndogo mno? Je, ni manageable? Na unaweza kuona spec kwa maelezo zaidi. Wiki kadhaa baada ya kuwa ni hali ya Ripoti hiyo, ambayo ni vile vile kawaida email TF yako ya kusema tu jinsi mbali nyuma wewe ni katika fainali yako utekelezaji wa mradi, ikifuatiwa na Hackathon CS50 ambayo kila mtu ni waalikwa, ambayo itakuwa ya tukio kutoka 20:00 jioni kwenye moja mpaka 07:00 Asubuhi asubuhi. Pizza, kama nipate kuwa zilizotajwa katika wiki sifuri, Wil kuwa aliwahi saa 9:00, Kichina chakula saa 1:00 asubuhi. Na kama wewe ni bado macho saa 5:00 asubuhi, tutaweza kuchukua wewe IHOP kwa kifungua kinywa. Hivyo hackathon ni moja ya zaidi kukumbukwa uzoefu katika darasa. Kisha utekelezaji ni kutokana na kisha climactic CS50 Fair. Maelezo zaidi juu ya yote haya katika wiki ijayo. Lakini hebu kwenda nyuma ya kitu umri wa shule - tena, safu. Hivyo safu ilikuwa nzuri, kwa sababu ni kutatua matatizo kama tuliona tu wakati iliyopita na miundo ya mwanafunzi kupata nje kidogo ya kudhibiti kama sisi wanataka kuwa na mwanafunzi mmoja, mwanafunzi mbili, mwanafunzi wa tatu, mwanafunzi dot dot dot, baadhi ya idadi holela wa wanafunzi. Hivyo arrays, wiki chache zilizopita, swooped katika na kutatuliwa matatizo yote ya yetu ya si kujua mapema jinsi mambo mengi ya aina fulani sisi kutaka. Na tumeona kwamba structs unaweza kutusaidia zaidi kuandaa kanuni wetu na kuendelea conceptually sawa vigezo, kama jina na nyumba, pamoja, hivyo kwamba sisi wanaweza kutibu yao kama moja chombo, ndani ya ya ambayo kuna vipande vidogo. Lakini arrays na baadhi hasara. Ni nini baadhi ya hasara tumekuwa wamekutana na arrays hivi sasa? Nini hiyo? Fasta ukubwa - hivyo hata kama wewe ili kuwa na uwezo wa kutenga kumbukumbu kwa safu, mara tu kujua jinsi wanafunzi wengi una ngapi wahusika una kutoka kwa mtumiaji, mara moja umefanya zilizotengwa safu, umefanya aina ya walijenga mwenyewe katika kona. Sababu huwezi kuingiza vipengele mpya ndani ya katikati ya safu. Huwezi kuingiza mambo zaidi mwisho wa safu. Kweli, una ya mapumziko kwa kujenga nzima mwezi safu, kama tumekuwa kujadiliwa, kuiga zamani katika mpya. Na tena, kwamba ni kichwa kwamba GetString inahusika na kwa ajili yenu. Lakini tena, unaweza hata kuingiza kitu ndani ya katikati ya safu ikiwa ni kiwango cha si kabisa kujazwa. Kwa mfano, kama hii safu ya ukubwa hapa sita tu ana mambo matano katika hayo, vizuri, unaweza tu tack kitu kwenye mwisho. Lakini nini kama unataka kuingiza kitu ndani ya katikati ya safu, hata ingawa inaweza kuwa watano kati ya vitu sita katika hilo? Vizuri, nini cha kufanya wakati tulikuwa wote ya kujitolea yetu ya kibinadamu onstage katika wiki iliyopita? Kama sisi alitaka kuweka mtu hapa, ama hawa watu jinsi ya hoja hii njia, au watu hawa jinsi ya hoja hii njia, na kwamba akawa ghali. shifting ya watu ndani ya safu kuishia na kuongeza hadi na kugharimu sisi wakati, hivyo mengi ya squared wetu n mbio mara kama aina kuingizwa, kwa ajili ya mfano, katika kesi mbaya. Hivyo arrays ni kubwa, lakini una kujua mapema jinsi kubwa unataka yao. OK hivyo, hapa ufumbuzi. Kama mimi si kujua mapema ngapi wanafunzi nipate kuwa, na mimi kujua mara moja Mimi kuamua, ingawa, mimi nina kukwama na kwamba wanafunzi wengi, kwa nini sio mimi tu daima kutenga mara mbili kama vile nafasi kama mimi ili nadhani wanahitaji? Ni kwamba si suluhisho busara? Realistically, sidhani kwamba sisi ni kwenda haja inafaa zaidi ya 50 katika safu kwa ajili ya darasa kati-kawaida, hivyo hebu tu pande zote juu. Mimi itabidi kufanya inafaa 100 katika safu yangu, tu ili tuweze dhahiri kupata idadi ya wanafunzi mimi kutarajia kuwa katika baadhi ya tabaka la kati-size. Hivyo kwa nini siyo tu pande zote juu na kutenga zaidi ya kumbukumbu, kwa kawaida, kwa ajili ya safu kuliko unafikiri unaweza hata haja? Nini hii pushback rahisi na wazo hilo? Wewe tu kupoteza kumbukumbu. Literally kila mpango kuandika basi labda ni kwa kutumia mara mbili kama vile kumbukumbu kama haja kweli. Na kwamba tu haina kujisikia kama hasa kifahari ufumbuzi. Aidha, ni tu itapungua uwezekano wa tatizo. Kama kutokea kwa kuwa na shaka maarufu moja muhula na una 101 wanafunzi, mpango wako bado ni kimsingi yanayowakabili suala hilo hilo. Hivyo nashiriki, kuna ufumbuzi kwa ad hii matatizo yetu yote katika fomu ya data miundo ambayo ni ngumu zaidi kuliko wale tumeona hivi sasa. Hii, mimi kudai, ni orodha zinazoungwa. Hii ni orodha ya idadi - 9, 17, 22, 26, na 34 - ambayo yamekuwa wanaohusishwa pamoja kwa njia ya nini nimekuwa inayotolewa kama mishale. Kwa maneno mengine, kama alitaka kuwakilisha safu, mimi naweza kufanya kitu kama hiki. Na mimi itabidi kuweka hii juu ya uendeshaji katika muda tu. Mimi naweza kufanya - hello, wote haki. Kusimama kwa. Mpya ya kompyuta hapa, wazi - wote haki. Hivyo kama nina namba hizi katika safu - 9, 17, 22, 26, 24 - si lazima wadogo. Haki ya wote, hivyo hapa ni safu yangu - oh mungu wangu. Haki ya wote, hivyo hapa ni safu yangu. Oh mungu wangu. [Kicheko] DAVID Malan: kujifanya. Ni sana juhudi ya kwenda nyuma na kurekebisha kwamba, hivyo kuna - 26. Hivyo tuna hii safu ya 9, 17, 22, 26, na 34. Kwa wale wa wewe unaweza kuona kosa aibu mimi tu alifanya, huko ni. Hivyo mimi kudai kwamba hii ni ufanisi sana ufumbuzi. Nimekuwa zilizotengwa kama ints wengi kama Nahitaji - moja, mbili, tatu, nne, tano, au sita - na nimekuwa kisha kuhifadhiwa idadi ndani ya safu hii. Lakini tuseme, basi, nataka kuingiza thamani kama idadi ya 8? Naam, yanakwenda wapi? Tuseme nataka kuingiza idadi kama 20. Naam, yanakwenda wapi? Mahali fulani pale katikati, au namba 35 ina kwenda mahali fulani mwishoni. Lakini mimi nina wote nje ya nafasi. Na hivyo hii ni changamoto za msingi ya arrays kwamba hana ni ufumbuzi. Mimi alidai wakati iliyopita, GetString kutatua tatizo hili. Kama unataka kuingiza idadi ya sita ndani ya safu hii, ni nini angalau moja ufumbuzi unaweza kuanguka nyuma kwa hakika, tu kama sisi kufanya na GetString? Nini hiyo? Vizuri, kufanya hivyo ni kubwa rahisi kusema kuliko kutenda. Tunaweza si lazima kufanya safu kubwa, lakini tunaweza kufanya nini? Kufanya safu mpya kwamba ni kubwa zaidi, ya kawaida 6, au labda kawaida 10, kama tunataka kupata mbele ya mambo, na kisha nakala safu ya zamani katika mpya, na kisha huru safu ya zamani. Lakini nini wakati mbio sasa ya mchakato huo? Ni kubwa O ya n, kwa sababu ya kuiga ni kwenda gharama vitengo baadhi ya wakati, hivyo si hivyo bora kama tuna kutenga safu mpya, ambayo ni kwenda kuwaondoa mara mbili kama vile kumbukumbu kwa muda. Nakala ya zamani katika mpya - I mean, ni tu maumivu ya kichwa, ambayo ni, tena, kwa nini sisi aliandika GetString kwa ajili yenu. Basi nini ili sisi nini badala yake? Vizuri, nini kama yetu data muundo kweli ina mapungufu katika hivyo? Tuseme kwamba mimi kupumzika lengo langu la kuwa na contiguous chunks ya kumbukumbu, ambapo 9 ni haki ya karibu na 17, ambayo ni haki ya karibu na 22, na kadhalika. Na tuseme kwamba 9 inaweza kuwa zaidi ya hapa katika RAM, na 17 inaweza kuwa zaidi ya hapa katika RAM, na 22 inaweza kuwa zaidi ya hapa katika RAM. Kwa maneno mengine, mimi hawana haja nao hata nyuma kwa nyuma tena. Mimi tu na kwa namna fulani thread sindano kupitia katika kila namba hizi, au kila ya nodi hiyo, kama tutaweza kuwaita mistatili kama nimekuwa inayotolewa yao, ili kumbuka jinsi ya kupata mwisho vile nodi kutoka kwanza. Kwa hiyo kile ni kujenga programu tumeona kabisa hivi karibuni na ambayo mimi inaweza kutekeleza kwamba thread, au inayotolewa hapa, na ambayo naweza kutekeleza mishale hizo? Hivyo kuyatumia, haki? Kama mimi kutenga si tu int, lakini nodi - na kwa nodi, mimi tu maana chombo. Na kuibua, I mean mstatili. Hivyo nodi inaonekana mahitaji vyenye maadili mbili - int yenyewe, na kisha, kama alisema kwa nusu ya chini ya Mstatili, nafasi ya kutosha kwa int. Hivyo tu kufikiri mbele hapa, jinsi kubwa ni nodi hii, hii chombo katika swali? Ngapi ka kwa int? Takribani 4, ikiwa ni sawa kama kawaida. Na kisha ngapi ka kwa pointer? 4. Hivyo hii chombo, au hii nodi, ni kwenda kuwa muundo wa 8-Byte. Oh, na kwamba ni bahati mbaya furaha kwamba sisi tu ilianzisha wazo hili la struct, au muundo C. Hivyo mimi kudai kwamba nataka kuchukua hatua kuelekea hii ya kisasa zaidi utekelezaji wa orodha ya idadi, wanaohusishwa orodha ya idadi, mimi haja ya kufanya zaidi kidogo kufikiri hadi mbele na kutangaza si tu int, lakini struct kwamba Mimi nitakuita, conventionally hapa, nodi. Tunaweza kuiita kitu tunataka, lakini nodi ni kwenda kuwa mada katika mengi ya mambo ya sisi kuanza kuangalia sasa. Ndani ya nodi kwamba ni n int. Na kisha hii syntax, kidogo weird katika mtazamo wa kwanza - struct nodi * ijayo. Vizuri pictorially, hiyo ni nini? Hiyo ni nusu ya chini ya Mstatili kuwa tuliona muda tu iliyopita. Lakini kwa nini mimi kusema struct nodi * kinyume na * tu nodi? Kwa sababu kama pointer kwamba ni akizungumzia kwenye nodi mwingine, ni tu anuani ya nodi. Hiyo ni thabiti na nini tumekuwa kujadiliwa kuhusu kuyatumia hivi sasa. Lakini kwa nini, kama mimi kudai muundo huu ni kuitwa nodi, wala mimi kusema struct nodi ndani ya hapa? Hasa. Ni aina ya hali halisi ya kijinga ya C. typedef, hivyo kusema, hana kilichotokea bado. C ni super halisi. Anasoma kanuni yako ya juu kwa chini, kushoto na kulia. Na mpaka hits kwamba semicolon juu ya bottom line, nadhani nini haina kuwepo kama aina data? Nodi, quote unquote nodi. Lakini kwa sababu ya verbose zaidi tamko mimi juu ya mstari wa kwanza - typedef struct nodi - kwa sababu kwamba alikuja kwanza, kabla ya curly braces, hiyo ni aina ya kama kabla ya kuelimisha Clang kwamba, wewe kujua nini, nipe struct kuitwa struct nodi. Kusema ukweli, sijui kama mambo wito struct nodi, struct nodi kila katika kanuni yangu. Lakini mimi itabidi kuitumia tu mara moja, tu ndani, ili niweze ufanisi kuunda aina ya kumbukumbu ya mviringo, si pointer mwenyewe per se, lakini pointer mwingine wa aina kufanana. Hivyo zinageuka kuwa juu ya muundo wa data kama hii, kuna wachache shughuli ambayo inaweza kuwa wa maslahi na sisi. Sisi kutaka kuingiza katika orodha kama hii. Sisi kutaka kufuta kutoka kwenye orodha kama hii. Sisi kutaka kutafuta orodha ya thamani, au zaidi kwa ujumla, tindanga. Na tindanga ni njia tu ya dhana ya akisema kuanza saa kushoto na hoja zote njia ya haki. Na notisi, hata na hii zaidi kidogo kisasa data muundo, basi mimi kupendekeza kwamba tunaweza kukopa baadhi ya mawazo ya wiki mbili zilizopita na kutekeleza kazi kuitwa kutafuta kama hii. Ni kwenda na kurudi kweli au uongo, kuonyesha, au ndiyo hakuna, n ni katika orodha. Hoja yake ya pili ni pointer kwa orodha yenyewe, hivyo pointer nodi. Kila nitakacho kisha kufanya ni kutangaza kutofautiana ya muda mfupi. Tutaweza kuiita PTR kwa mkataba, kwa pointer. Na mimi hawawajui ni sawa na mwanzo wa orodha. Na sasa taarifa kitanzi wakati. Hivyo muda mrefu kama pointer si sawa kwa null, mimi nina kwenda kuangalia. Ni pointer mshale n sawa na n kwamba ilipitishwa katika? Na kusubiri dakika - mpya kipande cha syntax. Kile ni mshale wote wa ghafla? Yeah? Hasa. Hivyo ambapo dakika chache zilizopita, sisi kutumika nukta nukuu kupata kitu ndani ya struct, kama variable wewe si struct yenyewe, lakini pointer struct, nashiriki, kipande cha syntax kwamba hatimaye hufanya akili angavu. mshale maana yake kufuata pointer, kama mishale yetu kawaida maana pictorially, na kwenda katika shamba data ndani. Hivyo mshale ni kitu sawa kama nukta, lakini wewe kutumia wakati una pointer. Hivyo tu kwa kurejea basi, kama n shamba ndani ya struct kuitwa pointer sawa sawa n, kurudi kweli. Vinginevyo, line hii hapa - pointer sawa pointer ijayo. Basi nini hii ni kufanya, ilani, ni kama mimi am sasa akionyesha struct zenye 9, na 9 ni si idadi Mimi nina kuangalia kwa - nadhani nina kuangalia kwa ajili ya n sawa na 50 - Mimi nina kwenda update pointer yangu muda na si kumweka kwenye nodi hii tena, lakini pointer mshale ijayo, ambayo ni kwenda kuweka me up hapa. Sasa, mimi barabara ni kimbunga utangulizi. Siku ya Jumatano, tutaweza kweli kufanya hii pamoja na baadhi ya binadamu na kwa baadhi ya zaidi kanuni kwa kasi ndogo. Lakini kutambua, sisi ni sasa kufanya takwimu zetu miundo ngumu zaidi ili wetu algorithms wanaweza kupata ufanisi zaidi, ambayo ni kwenda kuwa zinazohitajika kwa pset sita, wakati sisi mzigo katika, tena, wale 150,000 maneno, lakini haja ya kufanya hivyo ufanisi, na walau, kujenga mpango kwamba anaendesha kwa watumiaji wetu si katika linear, si katika n squared, lakini katika mara kwa mara wakati, katika bora. Tutaweza kuona juu ya Jumatano. SPIKA: Katika CS50 ijayo, Daudi anasahau wigo wake kesi. DAVID Malan: Na kwamba ni jinsi ya kutuma Nakala ujumbe na C. Nini - [MBALIMBALI TEXT UJUMBE Taarifa Sauti]