1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] Hebu majadiliano kuhusu arrays. 2 00:00:09,360 --> 00:00:12,780 Hivyo ni kwa nini sisi milele wanataka kutumia arrays? 3 00:00:12,780 --> 00:00:17,210 Naam hebu sema una mpango kwamba mahitaji ya kuhifadhi vitambulisho mwanafunzi 5. 4 00:00:17,210 --> 00:00:21,270 Inaweza kuonekana kuwa na busara 5 vigezo tofauti. 5 00:00:21,270 --> 00:00:24,240 Kwa sababu tutaweza kuona katika kidogo, tutaweza kuanza kuhesabu kutoka 0. 6 00:00:24,240 --> 00:00:30,700 vigezo tutaweza kuwa itakuwa int Jina la mtumiaji0, id1 int, na kadhalika. 7 00:00:30,700 --> 00:00:34,870 Yoyote mantiki tunataka kufanya juu ya ID mwanafunzi atahitaji kunakiliwa na pasted 8 00:00:34,870 --> 00:00:36,870 kwa kila moja ya vitambulisho hivi mwanafunzi. 9 00:00:36,870 --> 00:00:39,710 Kama tunataka kuangalia ambayo wanafunzi kutokea kwa kuwa katika CS50, 10 00:00:39,710 --> 00:00:43,910 tutaweza kwanza haja ya kuangalia kama Jina la mtumiaji0 inawakilisha mwanafunzi katika shaka. 11 00:00:43,910 --> 00:00:48,070 Kisha kufanya hivyo kwa mwanafunzi ijayo, tutaweza haja ya nakala na kuweka code kwa Jina la mtumiaji0 12 00:00:48,070 --> 00:00:54,430 na kuchukua nafasi ya matukio yote ya Jina la mtumiaji0 na id1 na kadhalika kwa ajili ya id2, 3, na 4. 13 00:00:54,430 --> 00:00:57,560 >> Haraka kama wewe kusikia kwamba tunahitaji nakala na kuweka, 14 00:00:57,560 --> 00:01:00,440 unapaswa kuanza kufikiri kwamba kuna suluhisho. 15 00:01:00,440 --> 00:01:05,360 Sasa nini kama wewe kutambua haja Vitambulisho mwanafunzi 5 lakini badala 7? 16 00:01:05,360 --> 00:01:09,570 Unahitaji kwenda nyuma katika chanzo code yako na kuongeza katika id5, id6, 17 00:01:09,570 --> 00:01:14,260 na nakala na kuweka mantiki kwa ajili ya kuangalia kama vitambulisho ni ya darasa kwa ajili ya haya Vitambulisho 2 mpya. 18 00:01:14,260 --> 00:01:19,600 Hakuna kitu kuunganisha haya vitambulisho wote kwa pamoja, na hivyo hakuna njia ya kuuliza 19 00:01:19,600 --> 00:01:22,040 mpango wa kufanya hivyo kwa njia ya Vitambulisho 0 6. 20 00:01:22,040 --> 00:01:26,120 Naam sasa wewe kutambua kuwa vitambulisho mwanafunzi 100. 21 00:01:26,120 --> 00:01:30,770 Ni mapya ya kuonekana chini ya bora ya haja ya kutangaza tofauti kila moja ya vitambulisho hivi, 22 00:01:30,770 --> 00:01:33,760 na nakala na kuweka yoyote mantiki kwa vitambulisho wale mpya. 23 00:01:33,760 --> 00:01:38,380 Lakini labda sisi ni kuamua, na sisi kufanya hivyo kwa wanafunzi wote 100. 24 00:01:38,380 --> 00:01:42,240 Lakini nini kama hujui jinsi wanafunzi wengi huko kweli ni? 25 00:01:42,240 --> 00:01:47,320 Kuna baadhi tu ya wanafunzi n na mpango wako ana kuuliza mtumiaji kile kwamba ni n. 26 00:01:47,320 --> 00:01:50,250 Uh oh. Hii si kwenda kufanya kazi vizuri sana. 27 00:01:50,250 --> 00:01:53,820 Mpango wako kazi tu kwa idadi baadhi ya mara kwa mara ya wanafunzi. 28 00:01:53,820 --> 00:01:57,520 >> Kutatua matatizo yote haya ni uzuri wa arrays. 29 00:01:57,520 --> 00:01:59,930 Hivyo kile ni safu? 30 00:01:59,930 --> 00:02:04,480 Katika baadhi ya lugha ya programu ya aina safu kuwa na uwezo wa kufanya kidogo zaidi, 31 00:02:04,480 --> 00:02:09,960 lakini hapa tutaweza kuzingatia muundo wa msingi safu data tu kama utaona katika C. 32 00:02:09,960 --> 00:02:14,030 safu ni tu block kubwa ya kumbukumbu. Hiyo ni. 33 00:02:14,030 --> 00:02:17,770 Tunaposema tuna safu ya integers 10, kwamba tu ina maana tuna baadhi block 34 00:02:17,770 --> 00:02:20,740 ya kumbukumbu kwamba ni kubwa ya kutosha kushikilia 10 integers tofauti. 35 00:02:29,930 --> 00:02:33,410 Kutokana kuwa integer ni 4 ka, hii ina maana kwamba safu ya integers 10 36 00:02:33,410 --> 00:02:37,180 ni ya kuzuia kuendelea ya ka 40 katika kumbukumbu. 37 00:02:42,660 --> 00:02:46,280 Hata wakati matumizi ya arrays multidimensional, ambayo sisi si kwenda katika hapa, 38 00:02:46,280 --> 00:02:49,200 bado tu block kubwa ya kumbukumbu. 39 00:02:49,200 --> 00:02:51,840 nukuu multidimensional ni urahisi. 40 00:02:51,840 --> 00:02:55,640 Kama una 3 na safu 3 multidimensional wa integers, 41 00:02:55,640 --> 00:03:00,650 kisha mpango wenu kweli tu kutibu hii kama block kubwa ya ka 36. 42 00:03:00,650 --> 00:03:05,460 jumla ya idadi ya integers ni mara 3 3, na integer kila inachukua hadi ka 4. 43 00:03:05,460 --> 00:03:07,750 >> Hebu tuangalie mfano wa msingi. 44 00:03:07,750 --> 00:03:10,660 Tunaweza kuona hapa 2 njia mbalimbali za kutangaza arrays. 45 00:03:15,660 --> 00:03:18,580 Tutaweza kutoa maoni yao nje ya 1 kwa ajili ya mpango wa kukusanya 46 00:03:18,580 --> 00:03:20,900 tangu sisi kutangaza x mara mbili. 47 00:03:20,900 --> 00:03:25,140 Tutaweza kuangalia baadhi ya tofauti kati ya aina hizi 2 ya maazimio katika kidogo. 48 00:03:25,140 --> 00:03:28,560 Wote mistari haya kutangaza safu ya N kawaida, 49 00:03:28,560 --> 00:03:30,740 ambapo tuna # define N kama 10. 50 00:03:30,740 --> 00:03:34,460 Tunaweza kwa urahisi tu kama wameomba mtumiaji kwa integer chanya 51 00:03:34,460 --> 00:03:37,250 na kutumika kwamba integer kama idadi ya vipengele katika safu yetu. 52 00:03:37,250 --> 00:03:41,960 Kama mwanafunzi wetu ID mfano kabla, hii ni aina ya kama kutangaza 10 tofauti kabisa 53 00:03:41,960 --> 00:03:49,000 imaginary vigezo; x0, x1, x2, na kadhalika hadi kwenye Xn-1. 54 00:03:57,270 --> 00:04:00,840 Kupuuzia mistari ambapo sisi kutangaza safu, taarifa ya mabano mraba intact 55 00:04:00,840 --> 00:04:02,090 ndani kwa ajili ya matanzi. 56 00:04:02,090 --> 00:04:09,660 Tunapoandika kitu kama x [3], ambayo mimi itabidi kusoma kama x 3 bracket, 57 00:04:09,660 --> 00:04:13,090 unaweza kufikiria ni kama kuuliza kwa x3 imaginary. 58 00:04:13,090 --> 00:04:17,519 Ilani ya pamoja na safu ya ukubwa N, hii ina maana kwamba idadi ya ndani ya mabano, 59 00:04:17,519 --> 00:04:22,630 ambayo Tutamwita index, inaweza kuwa kitu chochote kutoka kwa 0 N-1, 60 00:04:22,630 --> 00:04:25,660 ambayo ni jumla ya fahirisi N. 61 00:04:25,660 --> 00:04:28,260 >> Kufikiri jinsi hii kweli kazi 62 00:04:28,260 --> 00:04:31,260 kukumbuka kwamba safu ni block kubwa ya kumbukumbu. 63 00:04:31,260 --> 00:04:37,460 Kutokana kuwa integer ni 4 ka, mzima safu x ni ya kuzuia 40 Byte ya kumbukumbu. 64 00:04:37,460 --> 00:04:41,360 Hivyo x0 inahusu ka sana kwanza 4 ya block. 65 00:04:45,810 --> 00:04:49,230 X [1] inahusu ka 4 ijayo na kadhalika. 66 00:04:49,230 --> 00:04:53,760 Hii ina maana kwamba mwanzo wa x ni mpango wote milele inahitaji kuweka wimbo wa. 67 00:04:55,660 --> 00:04:59,840 Kama unataka kutumia x [400], basi mpango anajua kwamba hii ni sawa 68 00:04:59,840 --> 00:05:03,460 tu 1600 bytes baada ya kuanza x. 69 00:05:03,460 --> 00:05:08,780 Ambapo 'd sisi kupata ka 1600 kutoka? Ni tu 400 mara 4 kwa kila ka integer. 70 00:05:08,780 --> 00:05:13,170 >> Kabla ya kuhamia kwenye, ni muhimu sana kwa kutambua kwamba katika C 71 00:05:13,170 --> 00:05:17,080 hakuna utekelezaji wa ripoti ya kwamba sisi kutumia katika safu. 72 00:05:17,080 --> 00:05:23,180 Block yetu kubwa ni 10 tu integers muda mrefu, lakini hakuna kitu yell katika sisi kama sisi kuandika x [20] 73 00:05:23,180 --> 00:05:26,060 au hata x [-5]. 74 00:05:26,060 --> 00:05:28,240 index haina hata kuwa idadi. 75 00:05:28,240 --> 00:05:30,630 Inaweza kuwa yoyote kujieleza holela. 76 00:05:30,630 --> 00:05:34,800 Katika mpango sisi kutumia i variable kutoka kwa kitanzi kwa index katika safu. 77 00:05:34,800 --> 00:05:40,340 Hii ni kawaida sana mfano, looping kutoka i = 0 kwa urefu wa safu, 78 00:05:40,340 --> 00:05:43,350 na kisha kwa kutumia i kama index kwa safu. 79 00:05:43,350 --> 00:05:46,160 Kwa njia hii kwa ufanisi zaidi kitanzi safu nzima, 80 00:05:46,160 --> 00:05:50,600 na unaweza ama hawawajui kila doa katika safu au kutumia kwa ajili ya hesabu fulani. 81 00:05:50,600 --> 00:05:53,920 >> Katika kwanza kwa kitanzi, i kuanza saa 0, 82 00:05:53,920 --> 00:05:58,680 na hivyo itakuwa hawawajui doa 0 katika safu, thamani 0 mara 2. 83 00:05:58,680 --> 00:06:04,370 Kisha i nyongeza, na sisi hawawajui doa kwanza katika safu thamani 1 mara 2. 84 00:06:04,370 --> 00:06:10,170 Kisha i nyongeza tena na kadhalika hadi mpaka sisi hawawajui nafasi N-1 katika safu 85 00:06:10,170 --> 00:06:13,370 thamani N-1 mara 2. 86 00:06:13,370 --> 00:06:17,810 Hivyo tumekuwa umba safu kwa kwanza namba 10 jioni. 87 00:06:17,810 --> 00:06:21,970 Labda evens ingekuwa jina kidogo bora kwa variable kuliko x, 88 00:06:21,970 --> 00:06:24,760 lakini kwamba angekupa mambo mbali. 89 00:06:24,760 --> 00:06:30,210 pili kwa kitanzi basi tu Prints maadili ambayo sisi tayari kuhifadhiwa ndani ya safu. 90 00:06:30,210 --> 00:06:33,600 >> Hebu jaribu mbio mpango na aina zote mbili ya matamko safu 91 00:06:33,600 --> 00:06:36,330 na kuangalia pato la mpango. 92 00:06:51,450 --> 00:06:57,020 Mbali kama tunavyoona, mpango unaendelea kwa njia hiyo hiyo kwa ajili ya aina zote mbili ya matamko. 93 00:06:57,020 --> 00:07:02,230 Hebu pia kuangalia nini kinatokea kama sisi mabadiliko kitanzi kwanza na si kuacha katika N 94 00:07:02,230 --> 00:07:05,040 lakini badala ya kusema 10,000. 95 00:07:05,040 --> 00:07:07,430 Njia zaidi ya mwisho wa safu. 96 00:07:14,700 --> 00:07:17,210 Lo. Labda wewe ve kuona hili kabla. 97 00:07:17,210 --> 00:07:20,440 kosa segmentation maana programu yako imeharibika. 98 00:07:20,440 --> 00:07:24,430 Wewe kuanza kuona haya wakati kugusa maeneo ya kumbukumbu unapaswa kuwa kugusa. 99 00:07:24,430 --> 00:07:27,870 Hapa tunagusa maeneo 10,000 zaidi ya mwanzo ya x, 100 00:07:27,870 --> 00:07:31,920 ambayo dhahiri ni mahali katika kumbukumbu hatupaswi kugusa. 101 00:07:31,920 --> 00:07:37,690 Hivyo wengi wetu pengine bila ajali kuweka 10,000 badala ya N, 102 00:07:37,690 --> 00:07:42,930 lakini nini kama sisi kufanya kitu Mpole zaidi kama kusema kuandika chini au sawa na N 103 00:07:42,930 --> 00:07:46,830 katika kwa kitanzi hali kama kinyume na chini ya N. 104 00:07:46,830 --> 00:07:50,100 Kumbuka kwamba safu tu ana fahirisi kutoka 0 kwa N-1, 105 00:07:50,100 --> 00:07:54,510 ambayo ina maana kwamba index N ni zaidi ya mwisho wa safu. 106 00:07:54,510 --> 00:07:58,050 mpango wanaweza kukwama katika kesi hii, lakini bado ni kosa. 107 00:07:58,050 --> 00:08:01,950 Kwa kweli, hitilafu hii ni kawaida mno kiasi kwamba ina yake mwenyewe jina, 108 00:08:01,950 --> 00:08:03,970 mbali na makosa 1. 109 00:08:03,970 --> 00:08:05,970 >> Hiyo ni kwa misingi. 110 00:08:05,970 --> 00:08:09,960 Kwa hiyo kile ni kubwa tofauti kati ya aina 2 ya matamko safu? 111 00:08:09,960 --> 00:08:13,960 Tofauti moja kubwa ni ambapo block ya kumbukumbu unaendelea. 112 00:08:13,960 --> 00:08:17,660 Katika tamko la kwanza, ambalo Mimi nitakuita aina bracket-safu, 113 00:08:17,660 --> 00:08:20,300 ingawa hii ni kwa maana hakuna jina kawaida, 114 00:08:20,300 --> 00:08:22,480 itakuwa kwenda juu ya stack. 115 00:08:22,480 --> 00:08:27,450 Wakati katika pili, ambayo Mimi nitakuita aina pointer-safu, itakuwa kwenda kwenye chungu. 116 00:08:27,450 --> 00:08:32,480 Hii ina maana kwamba wakati anarudi kazi, safu bracket moja kwa moja kuwa deallocated, 117 00:08:32,480 --> 00:08:36,419 ambapo kama wewe lazima explicitily kuwaita bure kwenye safu pointer 118 00:08:36,419 --> 00:08:38,010 au mwingine una leak kumbukumbu. 119 00:08:38,010 --> 00:08:42,750 Zaidi ya hayo, safu bracket si kweli hazibadiliki. 120 00:08:42,750 --> 00:08:45,490 Hii ni muhimu. Ni tu mfano. 121 00:08:45,490 --> 00:08:49,160 Unaweza kufikiria kama mara kwa mara kwamba compiler akiamua kwa ajili yenu. 122 00:08:49,160 --> 00:08:52,970 Hii ina maana kwamba hatuwezi kufanya kitu kama x + + na aina bracket, 123 00:08:52,970 --> 00:08:56,240 ingawa hii ni kikamilifu halali na aina pointer. 124 00:08:56,240 --> 00:08:58,270 >> aina pointer ni kutofautiana. 125 00:08:58,270 --> 00:09:01,510 Kwa ajili ya aina pointer, tuna 2 tofauti vitalu ya kumbukumbu. 126 00:09:01,510 --> 00:09:06,060 x variable yenyewe ni kuhifadhiwa katika stack na ni tu pointer moja, 127 00:09:06,060 --> 00:09:08,620 lakini block kubwa ya kumbukumbu ni kuhifadhiwa juu ya lundo. 128 00:09:08,620 --> 00:09:11,010 x variable juu ya stack tu maduka anuani 129 00:09:11,010 --> 00:09:14,010 wa block kubwa ya kumbukumbu juu ya lundo. 130 00:09:14,010 --> 00:09:17,370 Moja kidokezo cha hii ni pamoja na ukubwa wa operator. 131 00:09:17,370 --> 00:09:22,480 Ukiuliza kwa ukubwa wa safu bracket, nitakupa ukubwa wa block kubwa ya kumbukumbu, 132 00:09:22,480 --> 00:09:24,620 kitu kama ka 40, 133 00:09:24,620 --> 00:09:26,920 lakini kama wewe kuuliza kwa ukubwa wa aina pointer wa safu, 134 00:09:26,920 --> 00:09:32,740 nitakupa ukubwa wa x variable yenyewe, ambayo juu ya appliance ni uwezekano tu 4 ka. 135 00:09:32,740 --> 00:09:36,530 Kutumia aina pointer-safu, haiwezekani moja kwa moja kwa kuuliza 136 00:09:36,530 --> 00:09:38,530 ukubwa wa block kubwa ya kumbukumbu. 137 00:09:38,530 --> 00:09:42,530 Hii si kawaida sana ya kizuizi tangu sisi mara chache sana wanataka ukubwa 138 00:09:42,530 --> 00:09:46,980 wa block kubwa ya kumbukumbu, na tunaweza kawaida mahesabu ni kama sisi haja yake. 139 00:09:46,980 --> 00:09:51,490 >> Hatimaye, safu bracket kinachotokea kwa sisi na kutoa njia ya mkato kwa initializing safu. 140 00:09:51,490 --> 00:09:56,130 Hebu angalia jinsi tunaweza kuandika kwanza 10 integers hata kwa kutumia initilization njia ya mkato. 141 00:10:11,220 --> 00:10:14,470 Na safu pointer, hakuna njia ya kufanya mkato kama hii. 142 00:10:14,470 --> 00:10:18,120 Hii ni kuanzishwa kwa nini unaweza kufanya na arrays. 143 00:10:18,120 --> 00:10:20,990 Wao kuonyesha juu katika mpango karibu kila wewe kuandika. 144 00:10:20,990 --> 00:10:24,390 Hopefully sasa unaweza kuona njia bora ya kufanya mwanafunzi Vitambulisho mfano 145 00:10:24,390 --> 00:10:26,710 tangu mwanzo wa video. 146 00:10:26,710 --> 00:10:29,960 >> Jina langu ni Rob Bowden, na hii ni CS50.