[Music kucheza] DOUG LLOYD: zote haki. Kufanya kazi na moja vigezo ni pretty furaha. Lakini nini kama tunataka kufanya kazi na mengi ya vigezo, lakini hatutaki kuwa na rundo la majina tofauti kuruka karibu kificho zetu? Katika kesi hiyo, arrays ni atakuja katika kweli Handy. Arrays ni data kweli za msingi muundo wa lugha yoyote programu kwamba utatumia. Na wao ni kweli, muhimu kweli kweli, hasa, kama tutaweza kuona, katika CS 50. Sisi kutumia arrays kushikilia maadili ya data aina moja katika maeneo ya kumbukumbu contiguous. Hiyo ni kusema, ni njia hiyo tunaweza kundi rundo la integers pamoja katika kumbukumbu au kundi la wahusika au ikifungwa katika kumbukumbu kweli karibu pamoja na kazi nao bila ya kuwa na kutoa kila moja pekee yake mwenyewe jina, ambayo inaweza kupata mbaya baada ya muda mfupi. Sasa, njia moja ya analogize arrays ni kufikiri kuhusu wadhifa eneo lako Ofisi ya pili. Hivyo hatua mbali na kompyuta na tu karibu na macho yako na taswira katika akili yako baada ya ofisi ya eneo lako. Kwa kawaida, katika zaidi baada ofisi, kuna benki kubwa masanduku ofisi ya posta kwenye ukuta. Safu ni kuzuia kubwa ya contiguous ya kumbukumbu, njia ile ile ambayo pepe benki katika ofisi yako baada ni nafasi kubwa ya ukuta wa ofisi ya mwisho. Arrays wamekuwa partitioned ndani ya ndogo, identically vitalu ukubwa wa nafasi, kila mmoja uitwao kipengele, katika njia ile ile ambayo ukuta wa baada Ofisi imekuwa partitioned ndani ya ndogo, identically vitalu ukubwa wa nafasi, ambayo sisi kuwaita SLP. Kila kipengele cha safu Unaweza kuhifadhi kiasi fulani cha data, tu kama kila sanduku baada ya ofisi ni uwezo kushikilia kiasi fulani cha barua. Nini inaweza kuhifadhiwa katika kila kipengele cha safu ni vigezo ya data huo aina, kama vile int au Char, tu kama katika yako sanduku ofisi ya posta, unaweza tu fit mambo ya aina hiyo, kama vile barua au vifurushi vidogo. Mwisho, tuweze kupata kila kipengele cha safu moja kwa moja na ripoti idadi, kama tunaweza kupata ofisi yetu baada sanduku kwa kujua mailbox namba yake. Hopefully, kwamba mfano husaidia kupata kichwa yako kuzunguka wazo la arrays na analogizing kwa kitu kingine kuwa wewe ni pengine tayari ukoo na. Katika C, mambo ya safu ni indexed kuanzia 0, si kutoka 1. Na hii ni kweli ni muhimu. Na kwa kweli, hii ni kwa nini sisi, katika CS 50, na kwa nini wanasayansi wa kompyuta mara nyingi kuhesabu kutoka 0, ni kwa sababu ya C ya safu Indexing, ambayo daima kuanza saa 0. Hivyo kama safu lina vipengele n, sehemu ya kwanza ya kwamba safu iko katika index 0, na kipengele mwisho wa safu iko katika ripoti n bala 1. Tena, kama kuna mambo n katika yetu safu, jana ripoti ni n bala 1. Hivyo kama safu yetu ina mambo 50, kitu cha kwanza iko katika index 0, na kipengele mwisho iko katika ripoti 49. Kwa bahati mbaya, au kwa bahati nzuri, kutegemea na mtazamo wako, C ni lenient sana hapa. Itakuwa si kuzuia kutoka kwenda nje ya mipaka ya safu yako. Unaweza kupata bala 3 kipengele cha safu yako au kipengele 59 wa safu yako, kama safu yako tu ina 50 vipengele. Itakuwa si kuacha mpango wako kutoka kuandaa, lakini wakati huo kukimbia, unaweza kukutana dreaded segmentation kosa kama kuanza kupata kumbukumbu kuwa ni nje ya mipaka ya nini wewe aliuliza mpango wako kukupa. Hivyo kuwa makini. Je safu Tamko kuangalia kama? Je, sisi kanuni safu katika kuwepo kama sisi kanuni kutofautiana nyingine yoyote? Kuna sehemu tatu kwa safu declaration-- aina, jina, na ukubwa. Hii ni sawa na kutofautiana tamko, ambayo ni tu aina na jina, ukubwa kipengele kuwa kesi maalum kwa safu, kwa sababu sisi ni kupata rundo la yao wakati huo huo. Hivyo ni aina ni aina gani ya kutofautiana wewe wanataka kila kipengele cha safu kuwa. Je, unataka kwa safu ya integers? Kisha, aina yako data inapaswa kuwa int. Je, unataka kuwa ni safu ya mara mbili au ikifungwa? Takwimu aina wanapaswa kuwa mara mbili au kuelea. Jina ni nini unataka simu safu yako. Unataka nini kwa jina kubwa hii benki ya integers au ikifungwa au chars au mara mbili, au chochote na wewe? Je, unataka simu yake? Pretty maelezo binafsi. Mwisho, ukubwa, ambayo inakwenda ndani ya mabano mraba, ni jinsi mambo mengi wewe ungekuwa kama safu yako na vyenye. Jinsi integers wengi unataka? Jinsi ikifungwa nyingi unataka? Hivyo kwa mfano, int darasa mwanafunzi 40. Hii inatangaza safu kuitwa Mwanafunzi darasa, ambalo lina 40 integers. Pretty maelezo binafsi, mimi matumaini. Hapa ni mfano mwingine. Double orodha bei 8. Hii inajenga safu kuitwa Orodha ya bei, ambalo lina ya chumba katika kumbukumbu kwa mara mbili nane. Kama unafikiri ya kila kipengele ya safu ya aina data-aina, hivyo kwa mfano, kipengele moja ya safu ya aina int, kwa njia hiyo hiyo kudhani ya mtu mwingine yeyote kutofautiana wa aina int, shughuli zote ukoo kwamba sisi kujadiliwa hapo awali katika Uendeshaji video itakuwa mantiki. Hivyo hapa, tunaweza kutangaza safu ya Booleans aitwaye Truthtable, ambalo lina nafasi ya 10 Booleans. Na kisha, tu kama sisi inaweza tu kuwapa thamani ya kutofautiana nyingine yoyote ya aina Boolean, tunaweza kusema kitu kama Truthtable mraba mabano 2, ambayo ni jinsi sisi zinaonyesha, ambayo kipengele cha meza kweli? Sehemu ya tatu ya ukweli meza, kwa sababu kumbuka, sisi ni kuhesabu kutoka 0. Hivyo hiyo ni jinsi sisi zinaonyesha Sehemu ya tatu ya meza ukweli. Truthtable 2 sawa na uongo, kama tungeweza declare-- au tunaweza kuwapa, badala yake, yoyote Boolean aina kutofautiana kuwa uongo. Tunaweza pia kutumia katika hali ya. kama (truthtable 7 == kweli), ambayo ni kusema, kama kipengele nane ya Truthtable ni kweli, labda tunataka magazeti ujumbe kwa mtumiaji, printf ("KWELI! n") ;. Ambayo inatufanya kusema Truthtable 10 sawa na kweli, haki? Naam, naweza, lakini ni pretty hatari, kwa sababu kumbuka, tuna safu ya 10 Booleans. Hivyo ripoti juu kwamba compiler ametupa ni 9. Mpango huu kukusanya, lakini kama kitu kingine katika kumbukumbu lipo ambapo tunataka wanatarajia Truthtable 10 kwenda, tunaweza kuteseka segmentation kosa. Sisi inaweza kupata mbali na hayo, lakini kwa ujumla, pretty hatari. Hivyo nini mimi kufanya hapa ni kisheria C, lakini si lazima hoja bora. Sasa, wakati wewe kutangaza na initialize safu wakati huo huo, kuna kweli pretty syntax maalum kwamba Unaweza kutumia kujaza juu safu na maadili yake ya kuanza. Inaweza kupata mbaya kwa kutangaza safu ya ukubwa 100, na kisha kusema, kipengele 0 sawa huu; kipengele 1 ni sawa na hii; kipengele 2 sawa na hiyo. Nini maana, sawa? Kama ni safu ndogo, wewe anaweza kufanya kitu kama hiki. Bool truthtable 3 sawa na ya wazi curly brace na kisha comma kutenganisha orodha ya mambo kwamba unataka kuweka katika safu. Kisha kufunga curly brace semicolon. Hii inajenga safu ya ukubwa tatu aitwaye Truthtable, na mambo ya uongo, kweli, na kweli. Na kwa kweli, instantiation syntax nina hapa ni sawa kama kufanya mtu binafsi kipengele syntax hapa chini. Hizi njia mbili za coding ingekuwa kuzalisha halisi safu moja. Vile vile, tunaweza iterate zaidi ya yote ya mambo wa safu kutumia kitanzi, ambayo, kwa kweli, ni sana sana ilipendekeza at-nyumbani zoezi hilo. Jinsi gani unaweza kuunda safu 100 integers, ambapo kila kipengele cha safu ni ripoti yake? Hivyo kwa mfano, tuna safu ya 100 integers, na katika kipengele kwanza, tunataka kuweka 0. Katika kipengele cha pili, tunataka kuweka 1. Katika kipengele cha tatu, tunataka kuweka 2; na kadhalika na kadhalika. Hiyo ni nzuri kwa kweli at-nyumbani zoezi kwa kufanya hivyo. Hapa, haina kuangalia kama sana yamebadilika. Lakini taarifa kwamba katika kati ya mabano mraba, wakati huu, Nimekuwa kwa kweli liliondolewa idadi. Kama unatumia hii sana instantiation maalum syntax kujenga safu, wewe kweli kufanya si haja ya kuonyesha ukubwa wa safu ya mbele. Compiler ni smart kutosha kujua kwamba kweli wanataka safu ya ukubwa 3, kwa sababu wewe kuweka mambo matatu na haki ya ishara sawa. Kama alikuwa na kuweka nne, ingekuwa kutokana na ukweli meza ya ukubwa nne; na kadhalika na kadhalika. Arrays si pungufu ya moja mwelekeo, ambayo ni pretty cool. Unaweza kweli kuwa kama wengi upande specifiers kama unataka. Hivyo kwa mfano, kama unataka kujenga bodi kwa vita ya mchezo, ambayo, kama wewe milele kucheza, ni mchezo kuwa ni alicheza na vigingi juu ya 10 na 10 gridi ya taifa, unaweza kujenga safu kama hii. Unaweza kusema Bool vita ya mraba mabano 10 kufungwa mraba mabano mraba mabano 10 kufungwa mraba mabano. Na kisha, unaweza kuchagua kutafsiri hii katika akili yako kama 10 na 10 gridi ya seli. Sasa, kwa kweli, katika kumbukumbu, ni kweli haina tu kubaki 100 kipengele, moja ya pande safu. Na hii, kwa kweli, huenda kwa maana kama kuwa na vipimo tatu au nne au tano. Ni kweli tu haina kuzidisha wote wa indices-- au yote ya ukubwa specifiers-- pamoja, na wewe tu kupata mwelekeo mmoja safu ya kwamba ukubwa. Lakini katika suala la utaratibu na taswira na mtazamo wa binadamu, inaweza kuwa rahisi sana kufanya kazi na gridi kama wewe ni kufanya kazi katika mchezo kama Tic-TAC-toe au vita, au kitu kama hicho. Ni uchukuaji kubwa, badala ya kuwa kufikiri juu Tic-TAC-toe bodi kama mstari wa tisa viwanja au bodi Vita kama mstari wa viwanja 100. 10 na 10 gridi ya taifa au tatu na tatu gridi pengine ni mengi zaidi rahisi kujua. Sasa, kitu kweli muhimu kuhusu arrays. Tunaweza kutibu kila mtu binafsi kipengele cha safu kama kutofautiana. Tuliona kwamba mapema tulipokuwa kumshirikisha thamani Kweli kwa baadhi ya Booleans au kuwapima katika conditionals. Lakini hatuwezi kutibu nzima arrays wenyewe kama vigezo. Hatuwezi, kwa mfano, kuwapa safu moja kwa safu mwingine kwa kutumia zoezi operator. Siyo kisheria C. Kama tunataka, kwa nini example-- tunataka kuwa kufanya katika mfano kwamba itakuwa nakala safu moja hadi nyingine. Kama tunataka kufanya hivyo, sisi kweli haja ya kutumia kitanzi kwa nakala zaidi kila kipengele binafsi moja kwa wakati mmoja. Najua ni muda mfupi tu kuteketeza. Hivyo kwa mfano, kama tulikuwa na hizi wanandoa ya mstari wa kanuni, ingekuwa kazi hii? Naam, hapana, hakutaka, sawa? Kwa sababu sisi ni kujaribu kuwapa chakula kwa bar. Hiyo si kwenda kufanya kazi, kwa sababu ni safu, na sisi tu ilivyoelezwa kwamba si kwamba kisheria C. Badala yake, kama tunataka nakala yaliyomo ya chakula ndani ya bar, ambayo ni nini sisi ni kujaribu kufanya hapa, tunataka haja syntax kama hii. Tuna kwa kitanzi kwamba huenda kutoka J ni sawa na 0 hadi 5, na sisi increment J juu ya kila iteration ya kitanzi na mambo hawawajui kama hicho. Hii ingeweza kusababisha bar pia kuwa moja, mbili, tatu, nne, tano, lakini sisi kufanya hivyo huu sana polepole kipengele-na-kipengele njia, badala ya tu na kuiga safu nzima. Katika programu zingine lugha, wale wa kisasa zaidi, unaweza, kwa kweli, kufanya tu kuwa rahisi sawa na syntax. Lakini C, kwa bahati mbaya, sisi ni haruhusiwi kufanya hivyo. Sasa, kuna mtu mwingine Jambo nataka kutaja kuhusu arrays kwamba inaweza kuwa ni kidogo kidogo Tricky mara ya kwanza kazi nao. Sisi kujadiliwa katika video kuhusu wigo kutofautiana, kwamba vigezo zaidi katika C, wakati wewe piga nao katika kazi, ni wanapita thamani. Unakumbuka nini maana kupita kitu na thamani? Ina maana sisi ni kufanya nakala ya kutofautiana hiyo kuwa kupita katika. Callee kazi, kazi hiyo ni kupokea kutofautiana, haina kupata kutofautiana yenyewe. Anapata yake mwenyewe mitaa nakala yake kufanya kazi pamoja. Arrays, bila shaka, kufanya si kufuata kanuni hii. Badala yake, ni nini sisi wito huu anapita kumbukumbu. Callee kweli haina kupokea safu. Haina kupokea wake nakala mwenyewe ndani yake. Na kama unadhani kuhusu hivyo, hii hufanya akili. Kama arrays ni kweli kubwa, ni inachukua muda sana na juhudi kufanya nakala ya safu ya Mambo 100 au 1000 au 10,000, kwamba siyo thamani yake kwa kazi ya kupokea nakala yake, kufanya baadhi ya kazi na hayo, na kisha tu kufanywa na nakala; haina haja ya kuwa na ni kunyongwa karibu tena. Kwa sababu arrays ni baadhi bulky na mbaya, sisi tu kupita yao kwa kumbukumbu. Sisi tu imani kwamba kazi kwa, wala kuvunja chochote. Hivyo hana kweli kupata safu. Haina kupata nakala yake mwenyewe ndani yake. Hivyo hii ina maana gani, basi, wakati callee kuyaharibu mambo ya safu? Nini kinatokea? Kwa sasa, tutaweza Gloss zaidi ya nini hasa hii itatendeka, kwa nini arrays ni kupita kwa kumbukumbu na kila kitu kingine ni wanapita thamani. Lakini mimi ahadi yenu, sisi kurudi na kukupa jibu kwa hii katika video ya baadaye. Hapa ni moja zaidi kwa ajili ya zoezi wewe kabla ya sisi kufuta mambo juu ya arrays. Kundi la kanuni hapa, hiyo ni si hasa mtindo mzuri, tu mimi itabidi kufanya kwamba caveat. Hakuna maoni katika hapa, ambayo ni aina pretty mbaya. Lakini ni kwa sababu tu nilitaka kuwa uwezo walionao kila kitu kwenye screen. Saa ya juu, unaweza kuona kwamba nina mbili maazimio kazi kwa seti safu na kuweka int. Kuweka safu inaonekana inachukua safu integers nne kama mchango wake. Na kuweka int inaonekana inachukua integer moja kama mchango wake. Lakini wote wawili hawana pato. Pato, kurudi aina, ya kila mmoja ni batili. Katika Kuu, tuna michache ya mstari wa kanuni. Tunatangaza integer kutofautiana aitwaye A na hawawajui thamani 10. Sisi kutangaza safu ya integers nne aitwaye B na kuwapa mambo 0, 1, 2, na 3, kwa mtiririko huo. Kisha, tuna wito wa kuweka int na wito wa kuweka safu. Ufafanuzi wa kuweka safu na kuweka int ni chini chini, chini. Na hivyo, tena, mimi kuuliza swali. Nini anapata kuchapishwa hapa mwishoni mwa Kuu? Kuna printout col. Mimi nina uchapishaji nje integers mbili. Mimi uchapishaji nje yaliyomo ya A na yaliyomo ya B mraba mabano 0. Pause video hapa na kuchukua dakika. Je, unaweza kufikiri nini hii kazi itakuwa magazeti mwishoni? Hopefully, kama unakumbuka tofauti kati ya kupita na thamani na kupita kwa kumbukumbu, hii Tatizo halikuwa gumu sana kwa ajili yenu. Na jibu wewe ungekuwa wamegundua ni hii. Kama huna uhakika kama kwa kwa nini hiyo kesi, kuchukua pili, kurudi nyuma, kupitia kile Nilikuwa tu kujadili kuhusu kupita arrays ukihusishwa, dhidi ya kupita vigezo vingine na thamani, na hopefully, kutakuwa na kufanya kidogo zaidi hisia. Mimi nina Doug Lloyd, na hii ni CS50.