1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] Við skulum tala um fylki. 2 00:00:09,360 --> 00:00:12,780 Svo hvers vegna vildi að við viljum alltaf að nota fylki? 3 00:00:12,780 --> 00:00:17,210 Jæja við skulum segja að þú ert með forrit sem þarf að geyma 5 nemenda auðkenni. 4 00:00:17,210 --> 00:00:21,270 Það kann að virðast sanngjarnt að hafa 5 aðskilin breytur. 5 00:00:21,270 --> 00:00:24,240 Af munum sjá í hluti, munum við byrja að telja frá 0. 6 00:00:24,240 --> 00:00:30,700 Breyturnar sem við munum hafa mun int id0, int id1, og svo framvegis. 7 00:00:30,700 --> 00:00:34,870 Hvaða rökfræði við viljum framkvæma á nemandi ID þarf að afrita og líma 8 00:00:34,870 --> 00:00:36,870 fyrir hvern þessara nemenda auðkenni. 9 00:00:36,870 --> 00:00:39,710 Ef við viljum að athuga hvaða nemendur gerst að vera í CS50, 10 00:00:39,710 --> 00:00:43,910 Við munum fyrst að athuga hvort id0 táknar nemanda í námskeiðinu. 11 00:00:43,910 --> 00:00:48,070 Þá að gera það sama fyrir næsta nemanda, munum við þurfa að afrita og líma kóðann fyrir id0 12 00:00:48,070 --> 00:00:54,430 og skipta út öllum tilfellum af id0 með id1 og svo framvegis fyrir id2, 3 og 4. 13 00:00:54,430 --> 00:00:57,560 >> Um leið og þú heyrir að við þurfum að afrita og líma, 14 00:00:57,560 --> 00:01:00,440 þú ættir að byrja að hugsa um að það er betri lausn. 15 00:01:00,440 --> 00:01:05,360 Nú hvað ef þér grein fyrir að þú þarft ekki 5 nemandi auðkenni heldur 7? 16 00:01:05,360 --> 00:01:09,570 Þú þarft að fara aftur í kóða og bæta við í id5, sem id6, 17 00:01:09,570 --> 00:01:14,260 og afrita og líma rökfræði til að stilla ef auðkenni tilheyra flokki fyrir þessar 2 nýju auðkenni. 18 00:01:14,260 --> 00:01:19,600 Það er ekkert að tengja öll þessi auðkenni saman, og svo það er engin leið til að biðja 19 00:01:19,600 --> 00:01:22,040 forritið til að gera þetta fyrir auðkenni 0 í 6. 20 00:01:22,040 --> 00:01:26,120 Jæja núna þú grein fyrir að þú hefur 100 nemandi auðkenni. 21 00:01:26,120 --> 00:01:30,770 Það er að byrja að virðast minna en hugsjón að þurfa að sérstaklega lýsa öllum þessum auðkennum, 22 00:01:30,770 --> 00:01:33,760 og afrita og líma allar rökfræði fyrir þá ný auðkenni. 23 00:01:33,760 --> 00:01:38,380 En kannski erum við ákveðin, og við gerum það fyrir alla 100 nemendur. 24 00:01:38,380 --> 00:01:42,240 En hvað ef þú veist ekki hversu margir nemendur eru í raun og veru er? 25 00:01:42,240 --> 00:01:47,320 Það eru bara sumir n nemendur og program hefur til að spyrja notandann hvað sem n er. 26 00:01:47,320 --> 00:01:50,250 Uh oh. Þetta er ekki að fara að vinna mjög vel. 27 00:01:50,250 --> 00:01:53,820 Program virkar aðeins fyrir einhverjum stöðugum fjölda nemenda. 28 00:01:53,820 --> 00:01:57,520 >> Leysa öll þessi vandamál er fegurð fylki. 29 00:01:57,520 --> 00:01:59,930 Svo er það fylki? 30 00:01:59,930 --> 00:02:04,480 Í sumum forritunarmál fylki tegund gæti verið fær um að gera aðeins meira, 31 00:02:04,480 --> 00:02:09,960 en hér munum við leggja áherslu á helstu array gögn uppbygging eins og þú munt sjá það í C. 32 00:02:09,960 --> 00:02:14,030 An array er bara stór blokk af minni. Það er það. 33 00:02:14,030 --> 00:02:17,770 Þegar við segjum að við höfum fjölda 10 heiltölur, sem einfaldlega þýðir að við höfum sumir blokk 34 00:02:17,770 --> 00:02:20,740 minni sem er nógu stórt til að halda 10 aðskildum heiltölur. 35 00:02:29,930 --> 00:02:33,410 Miðað við að heiltala er 4 bæti, þetta þýðir að fylki af 10 heiltalna 36 00:02:33,410 --> 00:02:37,180 er samfelld blokk af 40 bæti í minninu. 37 00:02:42,660 --> 00:02:46,280 Jafnvel þegar þú notar fjölvíða fylki, sem við munum ekki fara á hér, 38 00:02:46,280 --> 00:02:49,200 það er samt bara stór blokk af minni. 39 00:02:49,200 --> 00:02:51,840 The fjölvíða ritháttur er bara þægindi. 40 00:02:51,840 --> 00:02:55,640 Ef þú ert með 3 af 3 margþætt array heiltölur 41 00:02:55,640 --> 00:03:00,650 þá program vilja raunverulega bara meðhöndla þetta sem stór blokk 36 bæti. 42 00:03:00,650 --> 00:03:05,460 Heildarfjöldi heiltalna er 3 sinnum 3, og hver heiltala tekur upp 4 bæti. 43 00:03:05,460 --> 00:03:07,750 >> Við skulum taka a líta á a undirstöðu dæmi. 44 00:03:07,750 --> 00:03:10,660 Við sjáum hér 2 mismunandi leiðir báru fylki. 45 00:03:15,660 --> 00:03:18,580 Við verðum að tjá 1 af þeim út fyrir the program til að safna saman 46 00:03:18,580 --> 00:03:20,900 þar sem við lýsa x tvisvar. 47 00:03:20,900 --> 00:03:25,140 Við munum taka a líta á sumir af the mismunur á milli þessara 2 gerðir af yfirlýsingum í hluti. 48 00:03:25,140 --> 00:03:28,560 Báðar þessar línur lýsa fjölda N stærð, 49 00:03:28,560 --> 00:03:30,740 þar sem við höfum skilgreint # N og 10. 50 00:03:30,740 --> 00:03:34,460 Við gætum alveg eins auðveldlega getað beðið notandi til jákvæða heiltölu 51 00:03:34,460 --> 00:03:37,250 og notað sem heiltala sem fjölda staka í fylki okkar. 52 00:03:37,250 --> 00:03:41,960 Eins og nemandi ID dæmi okkar áður, þetta er góður af eins og að lýsa yfir 10 alveg sérstakt 53 00:03:41,960 --> 00:03:49,000 ímyndaða breytur, x0, x1, x2, og svo á allt að xn-1. 54 00:03:57,270 --> 00:04:00,840 Hunsa línur þar sem við lýsa yfir fylking, sérð að hornklofum ósnortinn 55 00:04:00,840 --> 00:04:02,090 inni til lykkjur. 56 00:04:02,090 --> 00:04:09,660 Þegar við skrifa eitthvað eins og x [3], sem ég ætla bara að lesa sem x krappi 3, 57 00:04:09,660 --> 00:04:13,090 hægt er að hugsa um það eins og að biðja um ímyndaða X3. 58 00:04:13,090 --> 00:04:17,519 Fyrirvara en með fjölda N stærð, þetta þýðir að fjöldi innan sviga, 59 00:04:17,519 --> 00:04:22,630 sem við munum kalla vísitölu, getur verið allt frá 0 til N-1, 60 00:04:22,630 --> 00:04:25,660 sem er samtals N vísitölum. 61 00:04:25,660 --> 00:04:28,260 >> Til að hugsa um hvernig þetta virkar 62 00:04:28,260 --> 00:04:31,260 muna að fylki er stór blokk af minni. 63 00:04:31,260 --> 00:04:37,460 Miðað við að heiltala er 4 bæti, allt array x er 40 bæti blokk minni. 64 00:04:37,460 --> 00:04:41,360 Svo vísar x0 á fyrstu 4 bæti í reitnum. 65 00:04:45,810 --> 00:04:49,230 X [1] vísar til næstu 4 bæti og svo framvegis. 66 00:04:49,230 --> 00:04:53,760 Þetta þýðir að byrja á x er allt forritið alltaf þarf að halda utan um. 67 00:04:55,660 --> 00:04:59,840 Ef þú vilt nota x [400], þá veit forritið sem jafngildir 68 00:04:59,840 --> 00:05:03,460 að aðeins 1.600 bæti eftir upphaf x. 69 00:05:03,460 --> 00:05:08,780 Hvar fáum við 1.600 bæti úr? Það er bara 400 sinnum 4 bæti á heiltölu. 70 00:05:08,780 --> 00:05:13,170 >> Áður en hann flutti á, það er mjög mikilvægt að átta sig á í C 71 00:05:13,170 --> 00:05:17,080 það er engin framkvæmd á vísitölu sem við notum í fylki. 72 00:05:17,080 --> 00:05:23,180 Stór blokk okkar er aðeins 10 heiltölur lengi, en ekkert mun æpa á okkur ef við skrifum x [20] 73 00:05:23,180 --> 00:05:26,060 eða jafnvel x [-5]. 74 00:05:26,060 --> 00:05:28,240 Vísitalan er ekki einu sinni að vera tala. 75 00:05:28,240 --> 00:05:30,630 Það getur verið handahófskennt tjáningu. 76 00:05:30,630 --> 00:05:34,800 Í áætluninni sem við nota breytilega i frá til lykkju til vísitölu í array. 77 00:05:34,800 --> 00:05:40,340 Þetta er mjög algengt mynstur, lykkja frá i = 0 til lengd fylkisins, 78 00:05:40,340 --> 00:05:43,350 og svo nota ég eins vísitölu fylkisins. 79 00:05:43,350 --> 00:05:46,160 Á þennan hátt sem þú lykkja í raun yfir allt fylki, 80 00:05:46,160 --> 00:05:50,600 og þú getur annaðhvort framselja til hvers blettur í fylki eða nota það fyrir sumir útreikning. 81 00:05:50,600 --> 00:05:53,920 >> Í fyrsta til lykkju, fer ég á 0, 82 00:05:53,920 --> 00:05:58,680 og svo það mun tengja til 0 blettur í fylki, gildið 0 sinnum 2. 83 00:05:58,680 --> 00:06:04,370 Þá i þrepum, og við að tengja fyrsta blettur í fylki gildi 1 sinnum 2. 84 00:06:04,370 --> 00:06:10,170 Og ég þrepum aftur og svo framvegis þar til við gefum stöðu N-1 í fylkinu 85 00:06:10,170 --> 00:06:13,370 gildi N-1 sinnum 2. 86 00:06:13,370 --> 00:06:17,810 Þannig að við höfum búið til fylki með fyrstu 10 jafnvel númer. 87 00:06:17,810 --> 00:06:21,970 Kannski Aftansöngur hefði verið aðeins betri heiti breytu en X, 88 00:06:21,970 --> 00:06:24,760 en það hefði gefið það í burtu. 89 00:06:24,760 --> 00:06:30,210 Annað fyrir lykkju þá prentar bara þau gildi sem við höfum nú þegar geymdar inni í array. 90 00:06:30,210 --> 00:06:33,600 >> Við skulum reyna að keyra forrit með báðar yfirlýsingar array 91 00:06:33,600 --> 00:06:36,330 og taka a líta á the framleiðsla af the program. 92 00:06:51,450 --> 00:06:57,020 Eins og langt eins og við getum séð, forritið hagar sér á sama hátt fyrir báðar yfirlýsingar. 93 00:06:57,020 --> 00:07:02,230 Við skulum einnig kíkja á hvað gerist ef við breyta fyrsta lykkja til að ekki hætta á N 94 00:07:02,230 --> 00:07:05,040 heldur segja 10.000. 95 00:07:05,040 --> 00:07:07,430 Vegur út í lok fylkisins. 96 00:07:14,700 --> 00:07:17,210 Oops. Kannski þú hafir séð þetta áður. 97 00:07:17,210 --> 00:07:20,440 A skiptingu kenna þýðir program hefur hrunið. 98 00:07:20,440 --> 00:07:24,430 Þú byrjar að sjá þetta þegar þú snerta svæði af minni sem þú ættir ekki að vera að snerta. 99 00:07:24,430 --> 00:07:27,870 Hér erum við að snerta 10.000 stöðum utan byrjun x, 100 00:07:27,870 --> 00:07:31,920 sem er augljóslega staður í minni að við ættum ekki að vera að snerta. 101 00:07:31,920 --> 00:07:37,690 Svo af okkur myndi sennilega ekki tilviljun að setja 10.000 í stað N, 102 00:07:37,690 --> 00:07:42,930 En hvað ef við gerum eitthvað meira lúmskur eins segja skrifa minna en eða jafnt og N 103 00:07:42,930 --> 00:07:46,830 í for lykkju ástand í stað þess að minna en N. 104 00:07:46,830 --> 00:07:50,100 Mundu að fylki aðeins hefur vísitölur frá 0 til N-1, 105 00:07:50,100 --> 00:07:54,510 sem þýðir að vísitalan N er handan lok fylkisins. 106 00:07:54,510 --> 00:07:58,050 Forritið getur ekki hrun í þessu tilfelli, en það er enn villa. 107 00:07:58,050 --> 00:08:01,950 Í raun er þetta villa er svo algeng að hún hefur eigin nafn það er, 108 00:08:01,950 --> 00:08:03,970 slökkt um 1 villa. 109 00:08:03,970 --> 00:08:05,970 >> Það er það fyrir grunnatriði. 110 00:08:05,970 --> 00:08:09,960 Svo hvað eru helstu munur á milli 2 konar yfirlýsingar array? 111 00:08:09,960 --> 00:08:13,960 Einn munur er þar stóra blokk af minni fer. 112 00:08:13,960 --> 00:08:17,660 Í fyrstu yfirlýsingu, sem ég ætla að hringja í krappi-array tegund, 113 00:08:17,660 --> 00:08:20,300 þótt það sé alls ekki hefðbundin heiti, 114 00:08:20,300 --> 00:08:22,480 það fer á mánudaginn. 115 00:08:22,480 --> 00:08:27,450 En í öðru lagi, sem ég ætla að kalla músina-array tegund, mun það fara á hrúga. 116 00:08:27,450 --> 00:08:32,480 Þetta þýðir að þegar skilar er krappi array verður sjálfkrafa deallocated, 117 00:08:32,480 --> 00:08:36,419 en eins og þú verður explicitily hringja ókeypis á músina fylkisins 118 00:08:36,419 --> 00:08:38,010 eða annað sem þú ert með minni leka. 119 00:08:38,010 --> 00:08:42,750 Auk þess krappi array er í raun ekki a breyta. 120 00:08:42,750 --> 00:08:45,490 Þetta er mikilvægt. Það er bara tákn. 121 00:08:45,490 --> 00:08:49,160 Þú getur hugsað um það sem stöðug að þýðandi velur fyrir þig. 122 00:08:49,160 --> 00:08:52,970 Þetta þýðir að við getum ekki gert eitthvað eins og x + + með krappi tegund, 123 00:08:52,970 --> 00:08:56,240 þótt þetta er fullkomlega gilt með músina tegund. 124 00:08:56,240 --> 00:08:58,270 >> Bendillinn tegund er breytilegt. 125 00:08:58,270 --> 00:09:01,510 Fyrir músina gerð, höfum við 2 aðskilin blokkir af minni. 126 00:09:01,510 --> 00:09:06,060 Breytan x sjálft er geymt í stafla og er bara einn músina, 127 00:09:06,060 --> 00:09:08,620 En stóra blokk af minni er geymt á hrúga. 128 00:09:08,620 --> 00:09:11,010 Breytan x á stafla geymir bara heimilisfang 129 00:09:11,010 --> 00:09:14,010 af stóru blokk minni á hrúga. 130 00:09:14,010 --> 00:09:17,370 Einn vísbendingu um þetta er með stærð rekstraraðila. 131 00:09:17,370 --> 00:09:22,480 Ef þú biður um stærð krappi fylking, það vilja gefa þú the stærð af the stór blokk minni, 132 00:09:22,480 --> 00:09:24,620 eitthvað eins og 40 bæti, 133 00:09:24,620 --> 00:09:26,920 en ef þú biður um stærð músina gerð fjölda, 134 00:09:26,920 --> 00:09:32,740 það mun gefa þér stærð breytu x sig, sem á tækinu er líklega bara 4 bæti. 135 00:09:32,740 --> 00:09:36,530 Using músina-array tegund, það er ómögulegt að beint að biðja um 136 00:09:36,530 --> 00:09:38,530 stærð stóru blokk minni. 137 00:09:38,530 --> 00:09:42,530 Þetta er yfirleitt ekki mikið takmarkanir þar sem við viljum mjög sjaldan stærð 138 00:09:42,530 --> 00:09:46,980 af stór blokk af minni, og við getum yfirleitt reikna það ef við þurfum það. 139 00:09:46,980 --> 00:09:51,490 >> Loks krappi array gerist að veita okkur með a smákaka fyrir Frumstilli fylki. 140 00:09:51,490 --> 00:09:56,130 Við skulum sjá hvernig við gætum skrifað fyrstu 10 jafnvel heiltölur með the smákaka initilization. 141 00:10:11,220 --> 00:10:14,470 Með músina fylking, það er ekki leiðin til að gera a smákaka svona. 142 00:10:14,470 --> 00:10:18,120 Þetta er bara kynning á hvað þú getur gert með fylki. 143 00:10:18,120 --> 00:10:20,990 Þeir mæta í nánast hvert forrit sem þú skrifar. 144 00:10:20,990 --> 00:10:24,390 Vonandi getur þú nú séð betri leið til að gera nemandann auðkenni dæmi 145 00:10:24,390 --> 00:10:26,710 frá byrjun af the vídeó. 146 00:10:26,710 --> 00:10:29,960 >> Mitt nafn er Rob Bowden, og þetta er CS50.