[Powered by Google Translate] Hebu majadiliano kuhusu arrays.
Hivyo ni kwa nini sisi milele wanataka kutumia arrays?
Naam hebu sema una mpango kwamba mahitaji ya kuhifadhi vitambulisho mwanafunzi 5.
Inaweza kuonekana kuwa na busara 5 vigezo tofauti.
Kwa sababu tutaweza kuona katika kidogo, tutaweza kuanza kuhesabu kutoka 0.
vigezo tutaweza kuwa itakuwa int Jina la mtumiaji0, id1 int, na kadhalika.
Yoyote mantiki tunataka kufanya juu ya ID mwanafunzi atahitaji kunakiliwa na pasted
kwa kila moja ya vitambulisho hivi mwanafunzi.
Kama tunataka kuangalia ambayo wanafunzi kutokea kwa kuwa katika CS50,
tutaweza kwanza haja ya kuangalia kama Jina la mtumiaji0 inawakilisha mwanafunzi katika shaka.
Kisha kufanya hivyo kwa mwanafunzi ijayo, tutaweza haja ya nakala na kuweka code kwa Jina la mtumiaji0
na kuchukua nafasi ya matukio yote ya Jina la mtumiaji0 na id1 na kadhalika kwa ajili ya id2, 3, na 4.
>> Haraka kama wewe kusikia kwamba tunahitaji nakala na kuweka,
unapaswa kuanza kufikiri kwamba kuna suluhisho.
Sasa nini kama wewe kutambua haja Vitambulisho mwanafunzi 5 lakini badala 7?
Unahitaji kwenda nyuma katika chanzo code yako na kuongeza katika id5, id6,
na nakala na kuweka mantiki kwa ajili ya kuangalia kama vitambulisho ni ya darasa kwa ajili ya haya Vitambulisho 2 mpya.
Hakuna kitu kuunganisha haya vitambulisho wote kwa pamoja, na hivyo hakuna njia ya kuuliza
mpango wa kufanya hivyo kwa njia ya Vitambulisho 0 6.
Naam sasa wewe kutambua kuwa vitambulisho mwanafunzi 100.
Ni mapya ya kuonekana chini ya bora ya haja ya kutangaza tofauti kila moja ya vitambulisho hivi,
na nakala na kuweka yoyote mantiki kwa vitambulisho wale mpya.
Lakini labda sisi ni kuamua, na sisi kufanya hivyo kwa wanafunzi wote 100.
Lakini nini kama hujui jinsi wanafunzi wengi huko kweli ni?
Kuna baadhi tu ya wanafunzi n na mpango wako ana kuuliza mtumiaji kile kwamba ni n.
Uh oh. Hii si kwenda kufanya kazi vizuri sana.
Mpango wako kazi tu kwa idadi baadhi ya mara kwa mara ya wanafunzi.
>> Kutatua matatizo yote haya ni uzuri wa arrays.
Hivyo kile ni safu?
Katika baadhi ya lugha ya programu ya aina safu kuwa na uwezo wa kufanya kidogo zaidi,
lakini hapa tutaweza kuzingatia muundo wa msingi safu data tu kama utaona katika C.
safu ni tu block kubwa ya kumbukumbu. Hiyo ni.
Tunaposema tuna safu ya integers 10, kwamba tu ina maana tuna baadhi block
ya kumbukumbu kwamba ni kubwa ya kutosha kushikilia 10 integers tofauti.
Kutokana kuwa integer ni 4 ka, hii ina maana kwamba safu ya integers 10
ni ya kuzuia kuendelea ya ka 40 katika kumbukumbu.
Hata wakati matumizi ya arrays multidimensional, ambayo sisi si kwenda katika hapa,
bado tu block kubwa ya kumbukumbu.
nukuu multidimensional ni urahisi.
Kama una 3 na safu 3 multidimensional wa integers,
kisha mpango wenu kweli tu kutibu hii kama block kubwa ya ka 36.
jumla ya idadi ya integers ni mara 3 3, na integer kila inachukua hadi ka 4.
>> Hebu tuangalie mfano wa msingi.
Tunaweza kuona hapa 2 njia mbalimbali za kutangaza arrays.
Tutaweza kutoa maoni yao nje ya 1 kwa ajili ya mpango wa kukusanya
tangu sisi kutangaza x mara mbili.
Tutaweza kuangalia baadhi ya tofauti kati ya aina hizi 2 ya maazimio katika kidogo.
Wote mistari haya kutangaza safu ya N kawaida,
ambapo tuna # define N kama 10.
Tunaweza kwa urahisi tu kama wameomba mtumiaji kwa integer chanya
na kutumika kwamba integer kama idadi ya vipengele katika safu yetu.
Kama mwanafunzi wetu ID mfano kabla, hii ni aina ya kama kutangaza 10 tofauti kabisa
imaginary vigezo; x0, x1, x2, na kadhalika hadi kwenye Xn-1.
Kupuuzia mistari ambapo sisi kutangaza safu, taarifa ya mabano mraba intact
ndani kwa ajili ya matanzi.
Tunapoandika kitu kama x [3], ambayo mimi itabidi kusoma kama x 3 bracket,
unaweza kufikiria ni kama kuuliza kwa x3 imaginary.
Ilani ya pamoja na safu ya ukubwa N, hii ina maana kwamba idadi ya ndani ya mabano,
ambayo Tutamwita index, inaweza kuwa kitu chochote kutoka kwa 0 N-1,
ambayo ni jumla ya fahirisi N.
>> Kufikiri jinsi hii kweli kazi
kukumbuka kwamba safu ni block kubwa ya kumbukumbu.
Kutokana kuwa integer ni 4 ka, mzima safu x ni ya kuzuia 40 Byte ya kumbukumbu.
Hivyo x0 inahusu ka sana kwanza 4 ya block.
X [1] inahusu ka 4 ijayo na kadhalika.
Hii ina maana kwamba mwanzo wa x ni mpango wote milele inahitaji kuweka wimbo wa.
Kama unataka kutumia x [400], basi mpango anajua kwamba hii ni sawa
tu 1600 bytes baada ya kuanza x.
Ambapo 'd sisi kupata ka 1600 kutoka? Ni tu 400 mara 4 kwa kila ka integer.
>> Kabla ya kuhamia kwenye, ni muhimu sana kwa kutambua kwamba katika C
hakuna utekelezaji wa ripoti ya kwamba sisi kutumia katika safu.
Block yetu kubwa ni 10 tu integers muda mrefu, lakini hakuna kitu yell katika sisi kama sisi kuandika x [20]
au hata x [-5].
index haina hata kuwa idadi.
Inaweza kuwa yoyote kujieleza holela.
Katika mpango sisi kutumia i variable kutoka kwa kitanzi kwa index katika safu.
Hii ni kawaida sana mfano, looping kutoka i = 0 kwa urefu wa safu,
na kisha kwa kutumia i kama index kwa safu.
Kwa njia hii kwa ufanisi zaidi kitanzi safu nzima,
na unaweza ama hawawajui kila doa katika safu au kutumia kwa ajili ya hesabu fulani.
>> Katika kwanza kwa kitanzi, i kuanza saa 0,
na hivyo itakuwa hawawajui doa 0 katika safu, thamani 0 mara 2.
Kisha i nyongeza, na sisi hawawajui doa kwanza katika safu thamani 1 mara 2.
Kisha i nyongeza tena na kadhalika hadi mpaka sisi hawawajui nafasi N-1 katika safu
thamani N-1 mara 2.
Hivyo tumekuwa umba safu kwa kwanza namba 10 jioni.
Labda evens ingekuwa jina kidogo bora kwa variable kuliko x,
lakini kwamba angekupa mambo mbali.
pili kwa kitanzi basi tu Prints maadili ambayo sisi tayari kuhifadhiwa ndani ya safu.
>> Hebu jaribu mbio mpango na aina zote mbili ya matamko safu
na kuangalia pato la mpango.
Mbali kama tunavyoona, mpango unaendelea kwa njia hiyo hiyo kwa ajili ya aina zote mbili ya matamko.
Hebu pia kuangalia nini kinatokea kama sisi mabadiliko kitanzi kwanza na si kuacha katika N
lakini badala ya kusema 10,000.
Njia zaidi ya mwisho wa safu.
Lo. Labda wewe ve kuona hili kabla.
kosa segmentation maana programu yako imeharibika.
Wewe kuanza kuona haya wakati kugusa maeneo ya kumbukumbu unapaswa kuwa kugusa.
Hapa tunagusa maeneo 10,000 zaidi ya mwanzo ya x,
ambayo dhahiri ni mahali katika kumbukumbu hatupaswi kugusa.
Hivyo wengi wetu pengine bila ajali kuweka 10,000 badala ya N,
lakini nini kama sisi kufanya kitu Mpole zaidi kama kusema kuandika chini au sawa na N
katika kwa kitanzi hali kama kinyume na chini ya N.
Kumbuka kwamba safu tu ana fahirisi kutoka 0 kwa N-1,
ambayo ina maana kwamba index N ni zaidi ya mwisho wa safu.
mpango wanaweza kukwama katika kesi hii, lakini bado ni kosa.
Kwa kweli, hitilafu hii ni kawaida mno kiasi kwamba ina yake mwenyewe jina,
mbali na makosa 1.
>> Hiyo ni kwa misingi.
Kwa hiyo kile ni kubwa tofauti kati ya aina 2 ya matamko safu?
Tofauti moja kubwa ni ambapo block ya kumbukumbu unaendelea.
Katika tamko la kwanza, ambalo Mimi nitakuita aina bracket-safu,
ingawa hii ni kwa maana hakuna jina kawaida,
itakuwa kwenda juu ya stack.
Wakati katika pili, ambayo Mimi nitakuita aina pointer-safu, itakuwa kwenda kwenye chungu.
Hii ina maana kwamba wakati anarudi kazi, safu bracket moja kwa moja kuwa deallocated,
ambapo kama wewe lazima explicitily kuwaita bure kwenye safu pointer
au mwingine una leak kumbukumbu.
Zaidi ya hayo, safu bracket si kweli hazibadiliki.
Hii ni muhimu. Ni tu mfano.
Unaweza kufikiria kama mara kwa mara kwamba compiler akiamua kwa ajili yenu.
Hii ina maana kwamba hatuwezi kufanya kitu kama x + + na aina bracket,
ingawa hii ni kikamilifu halali na aina pointer.
>> aina pointer ni kutofautiana.
Kwa ajili ya aina pointer, tuna 2 tofauti vitalu ya kumbukumbu.
x variable yenyewe ni kuhifadhiwa katika stack na ni tu pointer moja,
lakini block kubwa ya kumbukumbu ni kuhifadhiwa juu ya lundo.
x variable juu ya stack tu maduka anuani
wa block kubwa ya kumbukumbu juu ya lundo.
Moja kidokezo cha hii ni pamoja na ukubwa wa operator.
Ukiuliza kwa ukubwa wa safu bracket, nitakupa ukubwa wa block kubwa ya kumbukumbu,
kitu kama ka 40,
lakini kama wewe kuuliza kwa ukubwa wa aina pointer wa safu,
nitakupa ukubwa wa x variable yenyewe, ambayo juu ya appliance ni uwezekano tu 4 ka.
Kutumia aina pointer-safu, haiwezekani moja kwa moja kwa kuuliza
ukubwa wa block kubwa ya kumbukumbu.
Hii si kawaida sana ya kizuizi tangu sisi mara chache sana wanataka ukubwa
wa block kubwa ya kumbukumbu, na tunaweza kawaida mahesabu ni kama sisi haja yake.
>> Hatimaye, safu bracket kinachotokea kwa sisi na kutoa njia ya mkato kwa initializing safu.
Hebu angalia jinsi tunaweza kuandika kwanza 10 integers hata kwa kutumia initilization njia ya mkato.
Na safu pointer, hakuna njia ya kufanya mkato kama hii.
Hii ni kuanzishwa kwa nini unaweza kufanya na arrays.
Wao kuonyesha juu katika mpango karibu kila wewe kuandika.
Hopefully sasa unaweza kuona njia bora ya kufanya mwanafunzi Vitambulisho mfano
tangu mwanzo wa video.
>> Jina langu ni Rob Bowden, na hii ni CS50.