1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] Kom ons praat oor skikkings. 2 00:00:09,360 --> 00:00:12,780 So hoekom sou ons ooit wil skikkings te gebruik? 3 00:00:12,780 --> 00:00:17,210 Wel, laat ons sê jy het 'n program wat moet 5 student ID's op te slaan. 4 00:00:17,210 --> 00:00:21,270 Dit lyk dalk redelik 5 aparte veranderlikes te hê. 5 00:00:21,270 --> 00:00:24,240 Vir redes wat ons sien in 'n bietjie, sal ons begin met die tel van 0. 6 00:00:24,240 --> 00:00:30,700 Die veranderlikes wat ons sal hê, sal int id0, int ID1, en so aan. 7 00:00:30,700 --> 00:00:34,870 Enige logika wat ons wil uit te voer op 'n student ID moet word gekopieer en geplak 8 00:00:34,870 --> 00:00:36,870 vir elk van hierdie student ID's. 9 00:00:36,870 --> 00:00:39,710 As ons wil hê om te kyk wat gebeur te wees in CS50, 10 00:00:39,710 --> 00:00:43,910 sal ons eers moet kyk of id0 stel die student in die kursus. 11 00:00:43,910 --> 00:00:48,070 Dan om dieselfde te doen vir die volgende student, sal ons nodig het om te kopieer en plak die kode vir id0 12 00:00:48,070 --> 00:00:54,430 en vervang alle voorkomste van id0 met ID1 en so aan vir id2, 3 en 4. 13 00:00:54,430 --> 00:00:57,560 >> So gou as jy hoor dat ons nodig het om te kopieer en plak, 14 00:00:57,560 --> 00:01:00,440 moet jy begin dink dat daar 'n beter oplossing. 15 00:01:00,440 --> 00:01:05,360 Nou wat as jy besef dat jy nie nodig het 5 student ID's, maar eerder 7? 16 00:01:05,360 --> 00:01:09,570 Wat jy nodig het om terug te gaan in jou bronkode en voeg in 'n id5, 'n id6, 17 00:01:09,570 --> 00:01:14,260 en kopieer en plak die logika vir die beheer van die ID's behoort tot die klas vir hierdie 2 nuwe ID's. 18 00:01:14,260 --> 00:01:19,600 Daar is niks wat die koppeling van al hierdie IDs saam, en so daar is geen manier om te vra 19 00:01:19,600 --> 00:01:22,040 die program om dit te doen vir ID's 0 tot 6. 20 00:01:22,040 --> 00:01:26,120 Goed nou het jy besef jy het 100 student ID's. 21 00:01:26,120 --> 00:01:30,770 Dit begin lyk minder as ideaal moet apart elkeen van hierdie IDs verklaar, 22 00:01:30,770 --> 00:01:33,760 en kopieer en plak enige logika vir die nuwe ID's. 23 00:01:33,760 --> 00:01:38,380 Maar miskien kan ons bepaal, en ons doen dit vir al 100 studente. 24 00:01:38,380 --> 00:01:42,240 Maar wat as jy nie weet hoeveel studente daar eintlik? 25 00:01:42,240 --> 00:01:47,320 Daar is net 'n paar N-studente en jou program om die gebruiker te vra wat dit n. 26 00:01:47,320 --> 00:01:50,250 Uh oh. Dit gaan nie baie goed werk. 27 00:01:50,250 --> 00:01:53,820 Jou program werk slegs vir 'n paar konstante aantal studente. 28 00:01:53,820 --> 00:01:57,520 >> Oplos van al hierdie probleme is die skoonheid van skikkings. 29 00:01:57,520 --> 00:01:59,930 So, wat is 'n skikking? 30 00:01:59,930 --> 00:02:04,480 In sommige programmeertale 'n verskeidenheid tipe dalk in staat wees om 'n bietjie meer te doen, 31 00:02:04,480 --> 00:02:09,960 maar hier sal ons fokus op die basiese verskeidenheid data struktuur net soos u sal sien dit in C. 32 00:02:09,960 --> 00:02:14,030 'N skikking is net 'n groot blok van die geheue. Dit is dit. 33 00:02:14,030 --> 00:02:17,770 Wanneer ons sê dat ons 'n skikking van 10 heelgetalle, wat net beteken dat ons het 'n paar blok 34 00:02:17,770 --> 00:02:20,740 geheue wat groot genoeg is 10 afsonderlike heelgetalle te hou. 35 00:02:29,930 --> 00:02:33,410 Die veronderstelling dat 'n heelgetal is 4 grepe, beteken dit dat 'n skikking van 10 heelgetalle 36 00:02:33,410 --> 00:02:37,180 is 'n deurlopende blok van 40 grepe in die geheue. 37 00:02:42,660 --> 00:02:46,280 Selfs wanneer jy gebruik van multidimensionele skikkings, wat ons sal nie gaan nie in hier, 38 00:02:46,280 --> 00:02:49,200 dit is nog steeds net 'n groot blok van die geheue. 39 00:02:49,200 --> 00:02:51,840 Die multidimensionele notasie is net 'n gerief. 40 00:02:51,840 --> 00:02:55,640 As jy 'n 3 deur 3 multi-dimensionele skikking van heelgetalle, 41 00:02:55,640 --> 00:03:00,650 dan jou program sal net regtig behandel dit as 'n groot blok van 36 grepe. 42 00:03:00,650 --> 00:03:05,460 Die totale aantal heelgetalle is 3 keer 3, en elke heelgetal 4 bytes. 43 00:03:05,460 --> 00:03:07,750 >> Kom ons neem 'n blik op 'n basiese voorbeeld. 44 00:03:07,750 --> 00:03:10,660 Ons kan hier sien 2 verskillende maniere verklaar skikkings. 45 00:03:15,660 --> 00:03:18,580 Ons sal moet 1 van hulle uit om kommentaar te lewer vir die program saamstel 46 00:03:18,580 --> 00:03:20,900 aangesien ons verklaar x twee keer. 47 00:03:20,900 --> 00:03:25,140 Ons neem 'n blik op sommige van die verskille tussen hierdie 2 vorme van verklarings in 'n bietjie. 48 00:03:25,140 --> 00:03:28,560 Beide van hierdie lyne verklaar 'n verskeidenheid van grootte N, 49 00:03:28,560 --> 00:03:30,740 waar ons definieer # N as 10. 50 00:03:30,740 --> 00:03:34,460 Ons kon net so maklik gevra het die gebruiker vir 'n positiewe heelgetal 51 00:03:34,460 --> 00:03:37,250 en gebruik word dat die heelgetal as 'n aantal van die elemente in ons verskeidenheid. 52 00:03:37,250 --> 00:03:41,960 Graag ons student ID voorbeeld voor, dit is soort van soos verklaar 10 heeltemal aparte 53 00:03:41,960 --> 00:03:49,000 denkbeeldige veranderlikes; x0, x1, x2, en so aan tot xn-1. 54 00:03:57,270 --> 00:04:00,840 Ignoreer die lyne waar ons die skikking verklaar, let op die vierkantige hakies ongeskonde 55 00:04:00,840 --> 00:04:02,090 binne die loops is. 56 00:04:02,090 --> 00:04:09,660 Wanneer ons skryf iets soos x [3], wat ek sal net lees as x bracket 3, 57 00:04:09,660 --> 00:04:13,090 jy kan dink dit soos om te vra vir die denkbeeldige x3. 58 00:04:13,090 --> 00:04:17,519 Kennisgewing as met 'n verskeidenheid van grootte N, dit beteken dat die binnekant van die hakies, 59 00:04:17,519 --> 00:04:22,630 wat ons sal noem die indeks, kan enigiets van 0 tot N-1, 60 00:04:22,630 --> 00:04:25,660 wat is 'n totaal van N-indekse. 61 00:04:25,660 --> 00:04:28,260 >> Na te dink oor hoe dit eintlik werk 62 00:04:28,260 --> 00:04:31,260 onthou dat die skikking is 'n groot blok van die geheue. 63 00:04:31,260 --> 00:04:37,460 Die veronderstelling dat 'n heelgetal is 4 grepe, die hele verskeidenheid x is 'n 40-byte blok geheue. 64 00:04:37,460 --> 00:04:41,360 So x0 verwys na die heel eerste 4 grepe van die blok. 65 00:04:45,810 --> 00:04:49,230 X [1] verwys na die volgende 4 bytes en so aan. 66 00:04:49,230 --> 00:04:53,760 Dit beteken dat die begin van x is al die program ooit nodig het om tred te hou van. 67 00:04:55,660 --> 00:04:59,840 As jy wil x [400] te gebruik, dan is die program weet dat dit is gelykstaande 68 00:04:59,840 --> 00:05:03,460 tot net 1600 bytes na die begin van x. 69 00:05:03,460 --> 00:05:08,780 Waar kom ons kry 1600 bytes uit? Dit is net 400 keer 4 grepe per heelgetal. 70 00:05:08,780 --> 00:05:13,170 >> Voordat beweeg op, dit is baie belangrik om te besef dat in C 71 00:05:13,170 --> 00:05:17,080 daar is geen toepassing van die indeks wat ons gebruik in die skikking. 72 00:05:17,080 --> 00:05:23,180 Ons groot blok is slegs 10 heelgetalle lank, maar niks sal skreeu op ons as ons skryf x [20] 73 00:05:23,180 --> 00:05:26,060 of selfs x [-5]. 74 00:05:26,060 --> 00:05:28,240 Die indeks het nie eens aan 'n getal wees. 75 00:05:28,240 --> 00:05:30,630 Dit kan enige arbitrêre uitdrukking wees. 76 00:05:30,630 --> 00:05:34,800 In die program wat ons gebruik die veranderlike i van die lus om die indeks in die skikking. 77 00:05:34,800 --> 00:05:40,340 Dit is 'n baie algemene patroon, herhaling van i = 0 aan die lengte van die skikking, 78 00:05:40,340 --> 00:05:43,350 en dan met behulp van i as die indeks vir die skikking. 79 00:05:43,350 --> 00:05:46,160 In hierdie manier waarop jy effektief loop oor die hele verskeidenheid, 80 00:05:46,160 --> 00:05:50,600 en jy kan óf toewys aan elke plek in die skikking of gebruik dit vir 'n paar berekening. 81 00:05:50,600 --> 00:05:53,920 >> In die eerste vir die lus, ek begin by 0, 82 00:05:53,920 --> 00:05:58,680 en so sal dit toewys aan die 0 plek in die skikking, die waarde 0 keer 2. 83 00:05:58,680 --> 00:06:04,370 Toe het ek inkremente, en ons ken die eerste plek in die skikking die waarde 1 keer 2. 84 00:06:04,370 --> 00:06:10,170 Toe het ek inkremente weer en so aan tot totdat ons toewys N-1 in die skikking te posisioneer 85 00:06:10,170 --> 00:06:13,370 die waarde N-1 keer 2. 86 00:06:13,370 --> 00:06:17,810 Dus het ons 'n skikking met die eerste 10 ewe getalle. 87 00:06:17,810 --> 00:06:21,970 Miskien Langs hom sou gewees het om 'n bietjie beter naam vir die veranderlike as x, 88 00:06:21,970 --> 00:06:24,760 maar dit sou gegee het om dinge weg. 89 00:06:24,760 --> 00:06:30,210 Die tweede vir loop dan druk net die waardes wat ons reeds binnekant van die skikking gestoor. 90 00:06:30,210 --> 00:06:33,600 >> Kom ons probeer om die program met beide tipes van skikking verklarings 91 00:06:33,600 --> 00:06:36,330 en neem 'n blik op die afvoer van die program. 92 00:06:51,450 --> 00:06:57,020 So ver as wat ons kan sien, die program tree op dieselfde manier vir beide tipes van verklarings. 93 00:06:57,020 --> 00:07:02,230 Kom ons neem ook 'n blik op wat gebeur as ons die eerste lus verander om nie te stop by N 94 00:07:02,230 --> 00:07:05,040 maar eerder sê 10.000. 95 00:07:05,040 --> 00:07:07,430 Ver verby die einde van die skikking. 96 00:07:14,700 --> 00:07:17,210 Oeps. Miskien het jy gesien voor. 97 00:07:17,210 --> 00:07:20,440 'N segmentering skuld beteken jou program neergestort. 98 00:07:20,440 --> 00:07:24,430 Jy begin sien wanneer jy raak gebiede van die geheue wat jy moet raak nie. 99 00:07:24,430 --> 00:07:27,870 Hier is ons raak 10.000 plekke buite die begin van x, 100 00:07:27,870 --> 00:07:31,920 wat klaarblyklik 'n plek in die geheue, ons moet raak nie. 101 00:07:31,920 --> 00:07:37,690 So die meeste van ons sal waarskynlik nie per ongeluk sit 10.000 in plaas van N, 102 00:07:37,690 --> 00:07:42,930 maar wat as ons doen iets meer subtiel soos sê skryf minder as of gelyk aan N 103 00:07:42,930 --> 00:07:46,830 in die loop toestand, in teenstelling met minder as N. 104 00:07:46,830 --> 00:07:50,100 Onthou dat slegs 'n skikking het die indekse van 0 tot N-1, 105 00:07:50,100 --> 00:07:54,510 wat beteken dat indeks N is verby die einde van die skikking. 106 00:07:54,510 --> 00:07:58,050 Die program kan nie crash in hierdie geval, maar dit is nog steeds 'n fout. 107 00:07:58,050 --> 00:08:01,950 In werklikheid, hierdie fout is so algemeen dat dit het sy eie naam, 108 00:08:01,950 --> 00:08:03,970 'n af met 1 fout. 109 00:08:03,970 --> 00:08:05,970 >> Dit is dit vir die basiese beginsels. 110 00:08:05,970 --> 00:08:09,960 So, wat is die belangrikste verskille tussen die 2 tipes van skikking verklarings? 111 00:08:09,960 --> 00:08:13,960 Een verskil is waar die groot blok van die geheue gaan. 112 00:08:13,960 --> 00:08:17,660 In die eerste verklaring, wat ek sal noem die bracket-skikking tipe, 113 00:08:17,660 --> 00:08:20,300 al is dit nie beteken dat 'n konvensionele naam, 114 00:08:20,300 --> 00:08:22,480 dit gaan op die stapel. 115 00:08:22,480 --> 00:08:27,450 AANGESIEN dit in die tweede, wat ek sal noem die pointer-skikking tipe, dit gaan op die wal. 116 00:08:27,450 --> 00:08:32,480 Dit beteken dat wanneer die funksie opbrengste, die bracket skikking sal outomaties deallocated word, 117 00:08:32,480 --> 00:08:36,419 terwyl as jy moet explicitily noem vry op die wyser skikking 118 00:08:36,419 --> 00:08:38,010 of anders jy het 'n geheue lek. 119 00:08:38,010 --> 00:08:42,750 Daarbenewens het die bracket skikking is nie eintlik 'n veranderlike. 120 00:08:42,750 --> 00:08:45,490 Dit is belangrik. Dit is net 'n simbool. 121 00:08:45,490 --> 00:08:49,160 Jy kan dink aan dit as 'n konstante wat die vertaler kies vir jou. 122 00:08:49,160 --> 00:08:52,970 Dit beteken dat ons nie kan doen nie iets soos x + + met die bracket tipe, 123 00:08:52,970 --> 00:08:56,240 maar dit is volkome geldig met die tipe wyser. 124 00:08:56,240 --> 00:08:58,270 >> Die pointer tipe is 'n veranderlike. 125 00:08:58,270 --> 00:09:01,510 Vir die tipe wyser, ons het 2 afsonderlike blokke van geheue. 126 00:09:01,510 --> 00:09:06,060 Die veranderlike x self is in die stapel gestoor en is net 'n enkele wyser, 127 00:09:06,060 --> 00:09:08,620 maar die groot blok van die geheue gestoor word op die hoop. 128 00:09:08,620 --> 00:09:11,010 Die veranderlike x op die stapel winkels net die adres 129 00:09:11,010 --> 00:09:14,010 van die groot blok van die geheue op die hoop. 130 00:09:14,010 --> 00:09:17,370 Een implikasie hiervan is met die grootte van die operateur. 131 00:09:17,370 --> 00:09:22,480 As jy vra vir die grootte van die bracket skikking, sal dit gee jou die grootte van die groot blok van die geheue, 132 00:09:22,480 --> 00:09:24,620 iets soos 40 bytes, 133 00:09:24,620 --> 00:09:26,920 maar as jy vra vir die grootte van die wyser soort van verskeidenheid, 134 00:09:26,920 --> 00:09:32,740 sal dit gee jou die grootte van die veranderlike x self, wat op die toestel is waarskynlik net 4 grepe. 135 00:09:32,740 --> 00:09:36,530 Gebruik die wyser-skikking tipe, is dit onmoontlik om direk vra vir 136 00:09:36,530 --> 00:09:38,530 die grootte van die groot blok van die geheue. 137 00:09:38,530 --> 00:09:42,530 Dit is gewoonlik nie veel van 'n beperking aangesien ons baie selde wil die grootte 138 00:09:42,530 --> 00:09:46,980 van die groot blok van die geheue, en ons kan bereken, is dit gewoonlik as ons dit nodig het. 139 00:09:46,980 --> 00:09:51,490 >> Ten slotte, die bracket array gebeur om ons te voorsien met 'n kortpad vir die initialiseren van 'n skikking. 140 00:09:51,490 --> 00:09:56,130 Kom ons kyk hoe ons die eerste 10 ewe heelgetalle kan skryf deur gebruik te maak van die shortcut initilization. 141 00:10:11,220 --> 00:10:14,470 Met die wyser verskeidenheid, is daar nie 'n manier om 'n kortpad soos hierdie te doen. 142 00:10:14,470 --> 00:10:18,120 Dit is net 'n inleiding tot wat jy kan doen met skikkings. 143 00:10:18,120 --> 00:10:20,990 Hulle wys in byna elke program wat jy skryf. 144 00:10:20,990 --> 00:10:24,390 Hopelik sal jy nou kan sien 'n beter manier van doen die student IDs voorbeeld 145 00:10:24,390 --> 00:10:26,710 van die begin van die video. 146 00:10:26,710 --> 00:10:29,960 >> My naam is Rob Bowden, en dit is CS50.