1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] Le të flasim për vargjeve. 2 00:00:09,360 --> 00:00:12,780 Pra, pse do të kemi ndonjëherë të dëshironi të përdorni vargjeve? 3 00:00:12,780 --> 00:00:17,210 E pra, le të thonë se ju keni një program që ka nevojë për të ruajtur 5 studentëve ID. 4 00:00:17,210 --> 00:00:21,270 Kjo mund të duket e arsyeshme të ketë 5 variablat të ndara. 5 00:00:21,270 --> 00:00:24,240 Për arsye ne do të shohim në një grimë, ne do të fillojë numërimi nga 0. 6 00:00:24,240 --> 00:00:30,700 Variablat ne do të kemi do të jetë id0 int, int id1, dhe kështu me radhë. 7 00:00:30,700 --> 00:00:34,870 Çdo logjika ne duam të kryer mbi një ID të studentëve do të duhet të kopjohet dhe të ngjit 8 00:00:34,870 --> 00:00:36,870 për secilin prej këtyre ID studentore. 9 00:00:36,870 --> 00:00:39,710 Nëse ne duam të kontrolloni që studentët të ndodhë të jetë në CS50, 10 00:00:39,710 --> 00:00:43,910 ne do së pari duhet të kontrolloni nëse id0 përfaqëson nxënës në kurs. 11 00:00:43,910 --> 00:00:48,070 Pastaj të bëjë të njëjtën gjë për nxënësit e ardhshëm, ne do të duhet të kopjoni dhe ngjisni kodin për id0 12 00:00:48,070 --> 00:00:54,430 dhe të zëvendësojë të gjitha dukuritë e id0 me id1 dhe kështu me radhë për id2, 3, dhe 4. 13 00:00:54,430 --> 00:00:57,560 >> Sa më shpejt që ju dëgjoni se ne kemi nevojë të kopjoni dhe ngjisni, 14 00:00:57,560 --> 00:01:00,440 ju duhet të fillojnë të mendojnë se ka një zgjidhje më të mirë. 15 00:01:00,440 --> 00:01:05,360 Tani çfarë nëse ti e kupton se ju nuk keni nevojë ID studentore 5 por 7? 16 00:01:05,360 --> 00:01:09,570 Ju duhet të shkoni përsëri në kodin tuaj burim dhe shtoni në një id5, një id6, 17 00:01:09,570 --> 00:01:14,260 dhe kopjoni dhe ngjisni logjikën për të kontrolluar nëse ID i përkasin klasës për këto 2 ID të reja. 18 00:01:14,260 --> 00:01:19,600 Nuk ka asgjë që lidh të gjitha këto së bashku ID, dhe kështu që nuk ka asnjë mënyrë për të kërkuar 19 00:01:19,600 --> 00:01:22,040 programi për të bërë këtë për kartat e identitetit 0 deri 6. 20 00:01:22,040 --> 00:01:26,120 E pra tani ti e kupton se ju keni 100 ID studentore. 21 00:01:26,120 --> 00:01:30,770 Është filluar të duket më pak se ideale për të duhet të deklarojë veçmas secilin nga këto ID, 22 00:01:30,770 --> 00:01:33,760 dhe kopjoni dhe ngjisni ndonjë logjikë për ato ID të reja. 23 00:01:33,760 --> 00:01:38,380 Por ndoshta ne jemi të vendosur, dhe ne bëjmë atë për të gjithë 100 studentët. 24 00:01:38,380 --> 00:01:42,240 Por, çfarë nëse ju nuk e dini se sa nxënës ka në të vërtetë janë? 25 00:01:42,240 --> 00:01:47,320 Nuk janë vetëm disa studentë n dhe programi juaj ka për të kërkuar përdoruesit se çfarë është n. 26 00:01:47,320 --> 00:01:50,250 Uh oh. Kjo nuk do të punojnë shumë mirë. 27 00:01:50,250 --> 00:01:53,820 Programi juaj punon vetëm për një numër të vazhdueshëm të studentëve. 28 00:01:53,820 --> 00:01:57,520 >> Zgjidhja e të gjitha këtyre problemeve është bukuria e vargjeve. 29 00:01:57,520 --> 00:01:59,930 Pra, çfarë është një grup? 30 00:01:59,930 --> 00:02:04,480 Në disa gjuhë programimi një lloj grup mund të jetë në gjendje të bëjë pak më shumë, 31 00:02:04,480 --> 00:02:09,960 por këtu ne do të përqëndrohet në strukturën bazë të të dhënave array ashtu si ju do të shihni atë në C. 32 00:02:09,960 --> 00:02:14,030 Një grup është vetëm një bllok i madh i kujtesës. Kjo ishte. 33 00:02:14,030 --> 00:02:17,770 Kur ne themi se kemi një rrjet të integers 10, që vetëm do të thotë që ne kemi një bllok 34 00:02:17,770 --> 00:02:20,740 e kujtesës që është mjaft e madhe për të mbajtur 10 integers veçantë. 35 00:02:29,930 --> 00:02:33,410 Duke supozuar se një numër i plotë është 4 bytes, kjo do të thotë se një grup i integers 10 36 00:02:33,410 --> 00:02:37,180 është një bllok i vazhdueshëm i 40 bytes në kujtesë. 37 00:02:42,660 --> 00:02:46,280 Edhe kur ju përdorni vargjeve shumëdimensionale, të cilat ne nuk do të shkojnë në këtu, 38 00:02:46,280 --> 00:02:49,200 është ende vetëm një bllok i madh i kujtesës. 39 00:02:49,200 --> 00:02:51,840 Shënimi shumëdimensionale është vetëm një komoditet. 40 00:02:51,840 --> 00:02:55,640 Nëse ju keni një 3 nga 3 grup shumëdimensionale të integers, 41 00:02:55,640 --> 00:03:00,650 atëherë programi juaj do të me të vërtetë vetëm trajtojnë këtë si një bllok i madh i 36 bytes. 42 00:03:00,650 --> 00:03:05,460 Numri i përgjithshëm i integers është 3 herë 3, dhe secila integer merr 4 bytes. 43 00:03:05,460 --> 00:03:07,750 >> Le të marrin një vështrim në një shembull themelor. 44 00:03:07,750 --> 00:03:10,660 Ne mund të shohim këtu 2 mënyrat e ndryshme të vargjeve që deklarojnë. 45 00:03:15,660 --> 00:03:18,580 Ne do të duhet të komentojë 1 prej tyre për programin për të hartuar 46 00:03:18,580 --> 00:03:20,900 pasi ne deklarojë x dy herë. 47 00:03:20,900 --> 00:03:25,140 Ne do të hedhim një vështrim në disa nga dallimet në mes këtyre 2 lloje të deklaratave në një grimë. 48 00:03:25,140 --> 00:03:28,560 Të dyja këto linja të deklarojë një sërë N madhësi, 49 00:03:28,560 --> 00:03:30,740 ku kemi N # define si 10. 50 00:03:30,740 --> 00:03:34,460 Ne mund po aq e lehtë kanë kërkuar përdoruesit për një numër i plotë pozitiv 51 00:03:34,460 --> 00:03:37,250 dhe përdoret si një numër i plotë që numri i elementeve në array tonë. 52 00:03:37,250 --> 00:03:41,960 Ashtu si shembullin tonë ID studentore më parë, kjo është lloj i si shpallja e 10 krejtësisht të veçantë 53 00:03:41,960 --> 00:03:49,000 variablat imagjinare; X0, X1, x2, dhe kështu më lart në Xn-1. 54 00:03:57,270 --> 00:04:00,840 Injorimi linjat ku ne deklarojë koleksion, njoftim kllapa katrore paprekur 55 00:04:00,840 --> 00:04:02,090 brenda për sythe. 56 00:04:02,090 --> 00:04:09,660 Kur kemi shkruar diçka si x [3], të cilën unë vetëm do të lexohet si parantezë x 3, 57 00:04:09,660 --> 00:04:13,090 ju mund të mendoni për atë si të pyesësh për x3 imagjinare. 58 00:04:13,090 --> 00:04:17,519 Vini re se sa me një grup të madhësisë N, kjo do të thotë se numri i brenda kllapa, 59 00:04:17,519 --> 00:04:22,630 të cilat ne do të thërrasë indeksin, mund të jetë çdo gjë nga 0 deri N-1, 60 00:04:22,630 --> 00:04:25,660 cila është një total prej indekseve N. 61 00:04:25,660 --> 00:04:28,260 >> Të mendoni se si kjo punon 62 00:04:28,260 --> 00:04:31,260 mos harroni se array është një bllok i madh i kujtesës. 63 00:04:31,260 --> 00:04:37,460 Duke supozuar se një numër i plotë është 4 bytes, x tërë array është një bllok 40 bajt memorie. 64 00:04:37,460 --> 00:04:41,360 Pra, x0 referohet shumë para 4 bytes e bllokut. 65 00:04:45,810 --> 00:04:49,230 X [1] i referohet të ardhshëm 4 bytes dhe kështu me radhë. 66 00:04:49,230 --> 00:04:53,760 Kjo do të thotë se fillimi i X është mbi të gjitha programi kurrë ka nevojë për të mbajtur gjurmët e. 67 00:04:55,660 --> 00:04:59,840 Nëse ju doni të përdorni x [400], atëherë programi e di se kjo është e barabartë 68 00:04:59,840 --> 00:05:03,460 për vetëm 1,600 bytes pas fillimit të x. 69 00:05:03,460 --> 00:05:08,780 Ku kemi marrë 1600 bytes nga? Kjo është vetëm 400 herë në 4 bytes numër të plotë. 70 00:05:08,780 --> 00:05:13,170 >> Para se të lëvizin, është shumë e rëndësishme të kuptohet se në C 71 00:05:13,170 --> 00:05:17,080 nuk ka zbatimi i indeks që ne përdorim në rrjet. 72 00:05:17,080 --> 00:05:23,180 Bllok ynë i madh është vetëm 10 integers gjatë, por asgjë nuk do të çirrem në ne, nëse kemi shkruar x [20] 73 00:05:23,180 --> 00:05:26,060 apo edhe x [-5]. 74 00:05:26,060 --> 00:05:28,240 Indeksi as nuk duhet të jetë një numër. 75 00:05:28,240 --> 00:05:30,630 Ajo mund të jetë çdo shprehje arbitrare. 76 00:05:30,630 --> 00:05:34,800 Në programin ne i përdorim i ndryshueshëm nga lak për të indeksit në rrjet. 77 00:05:34,800 --> 00:05:40,340 Ky është një model shumë i zakonshëm, looping nga i = 0 deri në gjatësinë e vektorit, 78 00:05:40,340 --> 00:05:43,350 dhe pastaj i përdorur si indeks për rrjet. 79 00:05:43,350 --> 00:05:46,160 Në këtë mënyrë ju në mënyrë efektive lak mbi të gjithë grup, 80 00:05:46,160 --> 00:05:50,600 dhe ju ose mund të caktojë në çdo vend, në grup apo e përdorin atë për disa llogaritje. 81 00:05:50,600 --> 00:05:53,920 >> Në rastin e parë për lak, i fillon në 0, 82 00:05:53,920 --> 00:05:58,680 dhe kështu ajo do të caktojë në vend 0 në grup, vlera 0 herë 2. 83 00:05:58,680 --> 00:06:04,370 Pastaj i increments, dhe ne të caktojë vendin e parë në grup vlera 1 herë 2. 84 00:06:04,370 --> 00:06:10,170 Atëherë unë increments përsëri dhe kështu me radhë deri ne caktojë pozitën N-1 në rrjet 85 00:06:10,170 --> 00:06:13,370 vlera N-1 herë 2. 86 00:06:13,370 --> 00:06:17,810 Pra, ne kemi krijuar një koleksion me 10 numrat e parë madje. 87 00:06:17,810 --> 00:06:21,970 Ndoshta evens do të kishte qenë një emër pak më mirë për variablin se x, 88 00:06:21,970 --> 00:06:24,760 por që do të kanë dhënë gjërat larg. 89 00:06:24,760 --> 00:06:30,210 Dytë për lak vetëm atëherë shtyp vlerat që kemi ruajtur tashmë brenda array. 90 00:06:30,210 --> 00:06:33,600 >> Le të provoni drejtimin e programit me të dy llojet e deklaratave array 91 00:06:33,600 --> 00:06:36,330 dhe për të marrë një vështrim në prodhimin e programit. 92 00:06:51,450 --> 00:06:57,020 Aq sa ne mund të shohim, programi sillet në të njëjtën mënyrë për të dy llojet e deklaratave. 93 00:06:57,020 --> 00:07:02,230 Le të marrin një vështrim në çfarë ndodh nëse ne ndryshojmë lak e parë që të mos ndalemi në N 94 00:07:02,230 --> 00:07:05,040 por thonë 10,000. 95 00:07:05,040 --> 00:07:07,430 Rruga pas përfundimit të vektorit. 96 00:07:14,700 --> 00:07:17,210 Oops. Ndoshta ju keni parë këtë më parë. 97 00:07:17,210 --> 00:07:20,440 Një faji segmentimit të thotë programi juaj ka u rrëzua. 98 00:07:20,440 --> 00:07:24,430 Ju filloni duke parë këto kur ju prek fushat e kujtesës që ju nuk duhet të jetë prekur. 99 00:07:24,430 --> 00:07:27,870 Këtu ne jemi të prekur 10.000 vende përtej fillimit të x, 100 00:07:27,870 --> 00:07:31,920 e cila dukshëm është një vend në kujtesë, ne nuk duhet të prekur. 101 00:07:31,920 --> 00:07:37,690 Pra, shumica prej nesh ndoshta nuk do të aksidentalisht vënë në vend të 10.000 N, 102 00:07:37,690 --> 00:07:42,930 por çfarë nëse ne bëjmë diçka shumë delikate si thonë shkruaj pak se ose e barabartë me N 103 00:07:42,930 --> 00:07:46,830 në gjendje për lak në krahasim me më pak se N. 104 00:07:46,830 --> 00:07:50,100 Mos harroni se një grup ka vetëm indekseve nga 0 deri N-1, 105 00:07:50,100 --> 00:07:54,510 që do të thotë se indeksi N është përtej përfundimit të vektorit. 106 00:07:54,510 --> 00:07:58,050 Programi nuk mund të rrëzimit në këtë rast, por është ende një gabim. 107 00:07:58,050 --> 00:08:01,950 Në fakt, ky gabim është aq e zakonshme që ajo ka emrin e vet, 108 00:08:01,950 --> 00:08:03,970 një off nga 1 gabim. 109 00:08:03,970 --> 00:08:05,970 >> Kjo është ajo për bazat. 110 00:08:05,970 --> 00:08:09,960 Pra, çfarë janë dallimet kryesore në mes të 2 llojet e deklaratave array? 111 00:08:09,960 --> 00:08:13,960 Një ndryshim është vendi ku blloku i madh i kujtesës shkon. 112 00:08:13,960 --> 00:08:17,660 Në deklaratën e parë, të cilën unë do të thërrasë llojin kllapa-array, 113 00:08:17,660 --> 00:08:20,300 edhe pse kjo nuk është aspak një emër konvencional, 114 00:08:20,300 --> 00:08:22,480 ajo do të shkojë në rafte. 115 00:08:22,480 --> 00:08:27,450 Ndërsa në të dytin, që unë do të thërrasë llojin pointer-grup, ajo do të shkojë në tog. 116 00:08:27,450 --> 00:08:32,480 Kjo do të thotë se kur kthehet funksion, array kllapa automatikisht do të ç'alokohen, 117 00:08:32,480 --> 00:08:36,419 ndërsa si ju duhet të telefononi explicitily lirë në grup akrep 118 00:08:36,419 --> 00:08:38,010 ose tjetër ju keni një rrjedhje kujtesës. 119 00:08:38,010 --> 00:08:42,750 Përveç kësaj, array kllapa nuk është në fakt një ndryshore. 120 00:08:42,750 --> 00:08:45,490 Kjo është e rëndësishme. Kjo është vetëm një simbol. 121 00:08:45,490 --> 00:08:49,160 Ju mund të mendoni për atë si një konstante që përpiluesi zgjedh për ju. 122 00:08:49,160 --> 00:08:52,970 Kjo do të thotë se ne nuk mund të bëjmë diçka si x + + me llojin kllapa, 123 00:08:52,970 --> 00:08:56,240 edhe pse kjo është krejtësisht e vlefshme me llojin akrep. 124 00:08:56,240 --> 00:08:58,270 >> Lloji akrep është një variabël. 125 00:08:58,270 --> 00:09:01,510 Për llojin akrep, ne kemi 2 blloqe të veçanta të kujtesës. 126 00:09:01,510 --> 00:09:06,060 X ndryshueshme vetë është ruajtur në rafte dhe është vetëm një tregues të vetëm, 127 00:09:06,060 --> 00:09:08,620 por blloku i madh i kujtesës është ruajtur në tog. 128 00:09:08,620 --> 00:09:11,010 X ndryshueshme në rafte vetëm ruan adresë 129 00:09:11,010 --> 00:09:14,010 e bllokut të madh të kujtesës në tog. 130 00:09:14,010 --> 00:09:17,370 Një implikim i kësaj është me madhësinë e operatorit. 131 00:09:17,370 --> 00:09:22,480 Nëse ju pyesni për madhësinë e vektorit parantezë, ai do t'ju japë madhësinë e bllokut të madh të kujtesës, 132 00:09:22,480 --> 00:09:24,620 diçka si 40 bytes, 133 00:09:24,620 --> 00:09:26,920 por në qoftë se ju kërkoni për madhësinë e llojit akrep array së, 134 00:09:26,920 --> 00:09:32,740 ai do t'ju japë përmasat e vetë x ndryshueshme, e cila në zbatim ka të ngjarë vetëm 4 bytes. 135 00:09:32,740 --> 00:09:36,530 Duke përdorur të tipit pointer-array, është e pamundur për të drejtpërdrejt të kërkojë 136 00:09:36,530 --> 00:09:38,530 madhësia e bllokut të madh të kujtesës. 137 00:09:38,530 --> 00:09:42,530 Kjo zakonisht nuk është shumë i një kufizimi që ne duam shumë rrallë madhësinë 138 00:09:42,530 --> 00:09:46,980 nga blloku i madh i memories, dhe ne zakonisht mund të llogarisim se në qoftë se ne kemi nevojë për atë. 139 00:09:46,980 --> 00:09:51,490 >> Së fundi, array kllapa ndodh që të na japin me një shkurtore për fillimin e një sërë. 140 00:09:51,490 --> 00:09:56,130 Le të shohim se si ne mund të shkruaj e para 10 integers madje duke perdoruremailin e initilization shkurtore. 141 00:10:11,220 --> 00:10:14,470 Me grup akrep, nuk është një mënyrë për të bërë një shkurtore si kjo. 142 00:10:14,470 --> 00:10:18,120 Kjo është vetëm një hyrje për atë që ju mund të bëni me vargjeve. 143 00:10:18,120 --> 00:10:20,990 Ata shfaqen në pothuajse çdo program që ju shkruani. 144 00:10:20,990 --> 00:10:24,390 Shpresojmë që ju tani mund të shihni një mënyrë më të mirë për të bërë shembullin e studentëve IDS 145 00:10:24,390 --> 00:10:26,710 nga fillimi i video. 146 00:10:26,710 --> 00:10:29,960 >> Emri im është Rob Bowden, dhe kjo është CS50.