1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] Pogovorimo se o nizi. 2 00:00:09,360 --> 00:00:12,780 Torej, zakaj bi si kdaj želeli uporabljati polja? 3 00:00:12,780 --> 00:00:17,210 Pa recimo, da imate program, ki ga je potrebno hraniti 5 študentov ID. 4 00:00:17,210 --> 00:00:21,270 Morda se zdi smiselno, da ima 5 različnih spremenljivk. 5 00:00:21,270 --> 00:00:24,240 Zaradi bomo videli v nekaj, bomo začeli štetje od 0. 6 00:00:24,240 --> 00:00:30,700 Spremenljivke, da bomo imeli bodo int ID0, int ID1, in tako naprej. 7 00:00:30,700 --> 00:00:34,870 Vsako logiko želimo izvesti na študentsko ID bo treba kopirali in prilepili 8 00:00:34,870 --> 00:00:36,870 Za vsako od teh študentskih izkaznic. 9 00:00:36,870 --> 00:00:39,710 Če želimo preveriti, kateri učenci zgodi, da se v CS50, 10 00:00:39,710 --> 00:00:43,910 bomo morali najprej preveriti, če ID0 predstavlja študenta pri predmetu. 11 00:00:43,910 --> 00:00:48,070 Potem, da storijo enako za naslednjo študenta, bomo morali kopirati in prilepiti kodo za ID0 12 00:00:48,070 --> 00:00:54,430 in zamenjajte vse pojavitve ID0 z ID1 in ID2 tako naprej, 3 in 4. 13 00:00:54,430 --> 00:00:57,560 >> Takoj, ko slišimo, da moramo kopiranje in lepljenje, 14 00:00:57,560 --> 00:01:00,440 bi morali začeti razmišljati, da je boljša rešitev. 15 00:01:00,440 --> 00:01:05,360 Zdaj, kaj če se zavedaš, da vam ni treba 5 študentov ID ampak 7? 16 00:01:05,360 --> 00:01:09,570 Moraš iti nazaj v svojo izvorno kodo in dodajte v ID5, je id6, 17 00:01:09,570 --> 00:01:14,260 in kopirajte in prilepite logiko za preverjanje, če so ID-ji pripada razredu za te 2 nove ID-je. 18 00:01:14,260 --> 00:01:19,600 Nič ne povezuje vse te identifikacijske številke skupaj, tako da to ni način postavljanja 19 00:01:19,600 --> 00:01:22,040 Program, da to stori ID 0 do 6 let. 20 00:01:22,040 --> 00:01:26,120 No, sedaj se zavedaš, da imate 100 študentov ID. 21 00:01:26,120 --> 00:01:30,770 Začenja se zdi manj kot idealno, da je treba posebej prijavijo vsako od teh izkaznic, 22 00:01:30,770 --> 00:01:33,760 ter kopiranje in lepljenje za vsako logiko teh novih izkaznic. 23 00:01:33,760 --> 00:01:38,380 Toda morda smo odločeni, in to počnemo v vseh 100 študentov. 24 00:01:38,380 --> 00:01:42,240 Toda kaj, če ne veste, koliko študentov je dejansko so? 25 00:01:42,240 --> 00:01:47,320 Obstaja le nekaj n študente in vaš program mora od uporabnika zahteva, kaj je n. 26 00:01:47,320 --> 00:01:50,250 Ojoj. To ne bo šlo zelo dobro. 27 00:01:50,250 --> 00:01:53,820 Vaš program deluje le za nekaj stalnega števila študentov. 28 00:01:53,820 --> 00:01:57,520 >> Reševanje vseh teh problemov je lepota nizi. 29 00:01:57,520 --> 00:01:59,930 Torej, kaj je matrika? 30 00:01:59,930 --> 00:02:04,480 V nekaterih programskih jezikih lahko matrika tipa biti sposoben narediti malo več, 31 00:02:04,480 --> 00:02:09,960 tukaj pa se bomo osredotočili na osnovne strukture matrike podatkov, tako kot boste videli v C. 32 00:02:09,960 --> 00:02:14,030 Matrika je samo velik blok pomnilnika. To je to. 33 00:02:14,030 --> 00:02:17,770 Ko rečemo, da imamo niz 10 celih števil, ki samo pomeni, da imamo nekaj blok 34 00:02:17,770 --> 00:02:20,740 pomnilnika, ki je dovolj velika, da imajo 10 ločenih celih števil. 35 00:02:29,930 --> 00:02:33,410 Ob predpostavki, da celo je 4 bajte, to pomeni, da matrika celih 10 36 00:02:33,410 --> 00:02:37,180 je stalno blok od 40 bajtov v pomnilniku. 37 00:02:42,660 --> 00:02:46,280 Tudi če uporabljate večdimenzionalne matrike, ki ne bo šel v tu, 38 00:02:46,280 --> 00:02:49,200 še vedno je samo velik blok pomnilnika. 39 00:02:49,200 --> 00:02:51,840 Večdimenzionalni zapis je le udobje. 40 00:02:51,840 --> 00:02:55,640 Če imate 3 za 3 večdimenzionalni array števil, 41 00:02:55,640 --> 00:03:00,650 potem bo vaš program res samo to obravnava kot velik blok z 36 bajtov. 42 00:03:00,650 --> 00:03:05,460 Skupno število celih je 3-krat 3, in vsako celo zavzema 4 bajte. 43 00:03:05,460 --> 00:03:07,750 >> Oglejmo si na osnovni primer. 44 00:03:07,750 --> 00:03:10,660 Tukaj lahko vidite 2 različne načine razglasitvi nizi. 45 00:03:15,660 --> 00:03:18,580 Morali bomo komentar 1 od njih določene za program, da zberejo 46 00:03:18,580 --> 00:03:20,900 saj izjavljamo x dvakrat. 47 00:03:20,900 --> 00:03:25,140 Bomo si oglejte nekaj razlik med temi 2 vrsti prijav malo. 48 00:03:25,140 --> 00:03:28,560 Oba od teh vrstic razglasi niz velikosti N, 49 00:03:28,560 --> 00:03:30,740 kjer smo # define N kot 10. 50 00:03:30,740 --> 00:03:34,460 Lahko bi prav tako lahko zlahka prosil si za pozitivno celo število 51 00:03:34,460 --> 00:03:37,250 in se uporablja, da je celo število kot vrsto elementov v našem polju. 52 00:03:37,250 --> 00:03:41,960 Tako kot naš primer študentsko ID prej, to je nekako kot 10 razglasitvi so popolnoma ločeni 53 00:03:41,960 --> 00:03:49,000 namišljeni spremenljivke, x0, x1, x2, in tako naprej do xn-1. 54 00:03:57,270 --> 00:04:00,840 Neupoštevanje linij, kjer izjavljamo matriko, opazili oklepaju nedotaknjeno 55 00:04:00,840 --> 00:04:02,090 znotraj for zanke. 56 00:04:02,090 --> 00:04:09,660 Ko smo napisali nekaj podobnega x [3], ki bom prebral v razredu x 3, 57 00:04:09,660 --> 00:04:13,090 lahko si o njej mislijo kot prosi za namišljene X3. 58 00:04:13,090 --> 00:04:17,519 Obvestilo razen s paleto velikosti N, to pomeni, da se je število znotraj oklepajev, 59 00:04:17,519 --> 00:04:22,630 ki bomo poklicali indeks, je lahko karkoli, od 0 do N-1, 60 00:04:22,630 --> 00:04:25,660 ki je skupaj indeksov N. 61 00:04:25,660 --> 00:04:28,260 >> Če samo pomislim, kako to dejansko deluje 62 00:04:28,260 --> 00:04:31,260 ne pozabite, da je matrika je velik blok pomnilnika. 63 00:04:31,260 --> 00:04:37,460 Ob predpostavki, da celo je 4 bajte, celotno paleto x 40 bajt blok pomnilnika. 64 00:04:37,460 --> 00:04:41,360 Torej x0 nanaša na prvih 4 bajte bloka. 65 00:04:45,810 --> 00:04:49,230 X [1], se nanaša na obdobje naslednjih 4 bajte in tako naprej. 66 00:04:49,230 --> 00:04:53,760 To pomeni, da je začetek x toliko program, kdaj mora slediti. 67 00:04:55,660 --> 00:04:59,840 Če želite uporabljati X [400], potem program ve, da je to enakovredno 68 00:04:59,840 --> 00:05:03,460 na le 1600 bajtov po začetku x. 69 00:05:03,460 --> 00:05:08,780 Kje bomo dobili 1.600 bytes from? To je samo 400 krat 4 bajtov. 70 00:05:08,780 --> 00:05:13,170 >> Preden preidemo, da je zelo pomembno, da se zavedaš, da v C 71 00:05:13,170 --> 00:05:17,080 ni uveljavitev indeksa, ki ga uporabljamo v polje. 72 00:05:17,080 --> 00:05:23,180 Naš velik blok je le 10 celih dolgo, vendar ne bo nič kričati na nas, če zapišemo x [20] 73 00:05:23,180 --> 00:05:26,060 ali celo x [-5]. 74 00:05:26,060 --> 00:05:28,240 Indeks sploh ni nujno, da je številka. 75 00:05:28,240 --> 00:05:30,630 To je lahko vsaka arbitrarna izraz. 76 00:05:30,630 --> 00:05:34,800 V programu bomo uporabili spremenljivko i iz zanke za indeks v matriki. 77 00:05:34,800 --> 00:05:40,340 To je zelo pogost vzorec, zanka od i = 0 do dolžine niza, 78 00:05:40,340 --> 00:05:43,350 In potem sem uporabo kot indeks za matrike. 79 00:05:43,350 --> 00:05:46,160 Na ta način lahko učinkovito zanke prek celotnega niza, 80 00:05:46,160 --> 00:05:50,600 in lahko bodisi vsakemu mestu v matriki ali pa ga uporabljajo za nekaj izračun. 81 00:05:50,600 --> 00:05:53,920 >> V prvem zanke for, i se začne z 0, 82 00:05:53,920 --> 00:05:58,680 in tako bo dodeliti 0 lokaciji v polju, se vrednost 0 krat 2. 83 00:05:58,680 --> 00:06:04,370 Potem sem korakih, in določimo prvo mesto v polju vrednost 1-krat 2. 84 00:06:04,370 --> 00:06:10,170 Potem sem še enkrat korakih in tako naprej, dokler se dodeli v položaj N-1 v matriki 85 00:06:10,170 --> 00:06:13,370 vrednost N-1-krat 2. 86 00:06:13,370 --> 00:06:17,810 Zato smo izdelali paleto s prvimi 10 sodih števil. 87 00:06:17,810 --> 00:06:21,970 Mogoče bi bila izravnava malo bolje ime za spremenljivko od x, 88 00:06:21,970 --> 00:06:24,760 vendar bi bilo, da bi glede stvari stran. 89 00:06:24,760 --> 00:06:30,210 Druga zanka se šele nato natisne na vrednote, ki smo jih že shranjeni v notranjosti polje. 90 00:06:30,210 --> 00:06:33,600 >> Poskusimo vodenje programa pri obeh tipih polj izjav 91 00:06:33,600 --> 00:06:36,330 in si na izhodu programa. 92 00:06:51,450 --> 00:06:57,020 Kolikor vidimo, program obnaša na enak način za obe vrsti izjav. 93 00:06:57,020 --> 00:07:02,230 Poglejmo pa si oglejte, kaj se zgodi, če spremenimo prvo zanko, da ne končajo na N 94 00:07:02,230 --> 00:07:05,040 ampak pravijo 10.000. 95 00:07:05,040 --> 00:07:07,430 Pot po koncu niza. 96 00:07:14,700 --> 00:07:17,210 Ups. Mogoče si videl. 97 00:07:17,210 --> 00:07:20,440 Segmentacija napaka pomeni, vaš program se je zrušil. 98 00:07:20,440 --> 00:07:24,430 Vi boste lahko videli to, ko se boste dotaknili področja pomnilnika, ki ga ne bi smeli dotikajo. 99 00:07:24,430 --> 00:07:27,870 Tu smo se dotaknili 10.000 mest, ki presegajo začetku x, 100 00:07:27,870 --> 00:07:31,920 ki je očitno mesto v pomnilniku, ne smemo se jih dotikajo. 101 00:07:31,920 --> 00:07:37,690 Torej, večina od nas verjetno ne bi slučajno dal 10.000 namesto N, 102 00:07:37,690 --> 00:07:42,930 kaj pa če smo kaj bolj subtilno, kot pravijo, pisanje ali manj v N 103 00:07:42,930 --> 00:07:46,830 v stanju, v zanko, v nasprotju z manj kot N. 104 00:07:46,830 --> 00:07:50,100 Ne pozabite, da matrika ima samo indekse od 0 do n-1, 105 00:07:50,100 --> 00:07:54,510 kar pomeni, da je indeks S je po koncu niza. 106 00:07:54,510 --> 00:07:58,050 Program ne bo crash v tem primeru, vendar je še vedno napaka. 107 00:07:58,050 --> 00:08:01,950 V bistvu je to napaka je tako pogost, da ima svoje ime, 108 00:08:01,950 --> 00:08:03,970 off za 1 napake. 109 00:08:03,970 --> 00:08:05,970 >> To je to za osnove. 110 00:08:05,970 --> 00:08:09,960 Torej, kaj so glavne razlike med 2 vrste polj izjav? 111 00:08:09,960 --> 00:08:13,960 Ena razlika je, če velik blok pomnilnika gre. 112 00:08:13,960 --> 00:08:17,660 V prvi izjavi, ki je poklicala bom nosilec-diod tipa, 113 00:08:17,660 --> 00:08:20,300 čeprav to nikakor ne pomeni konvencionalno ime, 114 00:08:20,300 --> 00:08:22,480 bo šel v sklad. 115 00:08:22,480 --> 00:08:27,450 Ker je v 2., ki je poklicala bom kazalnik niza vrsto, bo šlo na kup. 116 00:08:27,450 --> 00:08:32,480 To pomeni, da ko se funkcija vrne, bo nosilec polje samodejno deallocated, 117 00:08:32,480 --> 00:08:36,419 ker so se morate explicitily pokličite brezplačno na kazalec niz 118 00:08:36,419 --> 00:08:38,010 ali pa imate pomnilnika. 119 00:08:38,010 --> 00:08:42,750 Poleg tega je nosilec matrika dejansko ni spremenljiva. 120 00:08:42,750 --> 00:08:45,490 To je pomembno. To je samo simbol. 121 00:08:45,490 --> 00:08:49,160 Lahko pomislite, da je konstanta, ki je prevajalnik odloči za vas. 122 00:08:49,160 --> 00:08:52,970 To pomeni, da ne moremo storiti kaj takega x + + z nosilcem tipa, 123 00:08:52,970 --> 00:08:56,240 čeprav je to povsem ustrezen tip kazalca. 124 00:08:56,240 --> 00:08:58,270 >> Kazalec tipa je spremenljivka. 125 00:08:58,270 --> 00:09:01,510 Za kazalec tipa, imamo 2 ločeni blokov pomnilnika. 126 00:09:01,510 --> 00:09:06,060 Spremenljivka x sam je shranjena v plasteh in je samo en kazalec, 127 00:09:06,060 --> 00:09:08,620 vendar je velik blok pomnilnika shrani na kup. 128 00:09:08,620 --> 00:09:11,010 Spremenljivka x na kupu samo shrani naslov 129 00:09:11,010 --> 00:09:14,010 od velikih blok pomnilnika na kup. 130 00:09:14,010 --> 00:09:17,370 Ena izmed posledic tega je, glede na velikost operaterja. 131 00:09:17,370 --> 00:09:22,480 Če vprašate za velikost držala matrike, se vam bo na velikost velik blok pomnilnika, 132 00:09:22,480 --> 00:09:24,620 nekaj takega kot 40 bajtov, 133 00:09:24,620 --> 00:09:26,920 ampak če vprašate za velikost kazalca vrsto matrike, 134 00:09:26,920 --> 00:09:32,740 to vam bo dala velikost spremenljivke x sama, ki je na aparatu je verjetno le 4 bajte. 135 00:09:32,740 --> 00:09:36,530 Z uporabo kazalec diod tipa, je nemogoče, da neposredno zaprosijo za 136 00:09:36,530 --> 00:09:38,530 velikost velikega bloka pomnilnika. 137 00:09:38,530 --> 00:09:42,530 To običajno ni veliko omejitev, saj smo zelo redko želite velikost 138 00:09:42,530 --> 00:09:46,980 od tega velik blok pomnilnika, zato lahko običajno izračunati, če jo potrebujete. 139 00:09:46,980 --> 00:09:51,490 >> Nazadnje je nosilec niz se zgodi, da nam pošljete bližnjico za inicializacijo niz. 140 00:09:51,490 --> 00:09:56,130 Pa poglejmo, kako lahko zapišemo prvih 10 še cela uporabo bližnjice initilization. 141 00:10:11,220 --> 00:10:14,470 S kazalcem niz, ni način, da to bližnjico, kot je ta. 142 00:10:14,470 --> 00:10:18,120 To je samo uvod, kaj lahko naredite z nizi. 143 00:10:18,120 --> 00:10:20,990 Kažejo se v skoraj vsakem programu, ki ga pišete. 144 00:10:20,990 --> 00:10:24,390 Upam, da zdaj lahko videli, boljši način za početje primer študentsko ID-ja 145 00:10:24,390 --> 00:10:26,710 od začetka videa. 146 00:10:26,710 --> 00:10:29,960 >> Moje ime je Rob Bowden, in to je CS50.