[Powered by Google Translate] Pogovorimo se o nizi.
Torej, zakaj bi si kdaj želeli uporabljati polja?
Pa recimo, da imate program, ki ga je potrebno hraniti 5 študentov ID.
Morda se zdi smiselno, da ima 5 različnih spremenljivk.
Zaradi bomo videli v nekaj, bomo začeli štetje od 0.
Spremenljivke, da bomo imeli bodo int ID0, int ID1, in tako naprej.
Vsako logiko želimo izvesti na študentsko ID bo treba kopirali in prilepili
Za vsako od teh študentskih izkaznic.
Če želimo preveriti, kateri učenci zgodi, da se v CS50,
bomo morali najprej preveriti, če ID0 predstavlja študenta pri predmetu.
Potem, da storijo enako za naslednjo študenta, bomo morali kopirati in prilepiti kodo za ID0
in zamenjajte vse pojavitve ID0 z ID1 in ID2 tako naprej, 3 in 4.
>> Takoj, ko slišimo, da moramo kopiranje in lepljenje,
bi morali začeti razmišljati, da je boljša rešitev.
Zdaj, kaj če se zavedaš, da vam ni treba 5 študentov ID ampak 7?
Moraš iti nazaj v svojo izvorno kodo in dodajte v ID5, je id6,
in kopirajte in prilepite logiko za preverjanje, če so ID-ji pripada razredu za te 2 nove ID-je.
Nič ne povezuje vse te identifikacijske številke skupaj, tako da to ni način postavljanja
Program, da to stori ID 0 do 6 let.
No, sedaj se zavedaš, da imate 100 študentov ID.
Začenja se zdi manj kot idealno, da je treba posebej prijavijo vsako od teh izkaznic,
ter kopiranje in lepljenje za vsako logiko teh novih izkaznic.
Toda morda smo odločeni, in to počnemo v vseh 100 študentov.
Toda kaj, če ne veste, koliko študentov je dejansko so?
Obstaja le nekaj n študente in vaš program mora od uporabnika zahteva, kaj je n.
Ojoj. To ne bo šlo zelo dobro.
Vaš program deluje le za nekaj stalnega števila študentov.
>> Reševanje vseh teh problemov je lepota nizi.
Torej, kaj je matrika?
V nekaterih programskih jezikih lahko matrika tipa biti sposoben narediti malo več,
tukaj pa se bomo osredotočili na osnovne strukture matrike podatkov, tako kot boste videli v C.
Matrika je samo velik blok pomnilnika. To je to.
Ko rečemo, da imamo niz 10 celih števil, ki samo pomeni, da imamo nekaj blok
pomnilnika, ki je dovolj velika, da imajo 10 ločenih celih števil.
Ob predpostavki, da celo je 4 bajte, to pomeni, da matrika celih 10
je stalno blok od 40 bajtov v pomnilniku.
Tudi če uporabljate večdimenzionalne matrike, ki ne bo šel v tu,
še vedno je samo velik blok pomnilnika.
Večdimenzionalni zapis je le udobje.
Če imate 3 za 3 večdimenzionalni array števil,
potem bo vaš program res samo to obravnava kot velik blok z 36 bajtov.
Skupno število celih je 3-krat 3, in vsako celo zavzema 4 bajte.
>> Oglejmo si na osnovni primer.
Tukaj lahko vidite 2 različne načine razglasitvi nizi.
Morali bomo komentar 1 od njih določene za program, da zberejo
saj izjavljamo x dvakrat.
Bomo si oglejte nekaj razlik med temi 2 vrsti prijav malo.
Oba od teh vrstic razglasi niz velikosti N,
kjer smo # define N kot 10.
Lahko bi prav tako lahko zlahka prosil si za pozitivno celo število
in se uporablja, da je celo število kot vrsto elementov v našem polju.
Tako kot naš primer študentsko ID prej, to je nekako kot 10 razglasitvi so popolnoma ločeni
namišljeni spremenljivke, x0, x1, x2, in tako naprej do xn-1.
Neupoštevanje linij, kjer izjavljamo matriko, opazili oklepaju nedotaknjeno
znotraj for zanke.
Ko smo napisali nekaj podobnega x [3], ki bom prebral v razredu x 3,
lahko si o njej mislijo kot prosi za namišljene X3.
Obvestilo razen s paleto velikosti N, to pomeni, da se je število znotraj oklepajev,
ki bomo poklicali indeks, je lahko karkoli, od 0 do N-1,
ki je skupaj indeksov N.
>> Če samo pomislim, kako to dejansko deluje
ne pozabite, da je matrika je velik blok pomnilnika.
Ob predpostavki, da celo je 4 bajte, celotno paleto x 40 bajt blok pomnilnika.
Torej x0 nanaša na prvih 4 bajte bloka.
X [1], se nanaša na obdobje naslednjih 4 bajte in tako naprej.
To pomeni, da je začetek x toliko program, kdaj mora slediti.
Če želite uporabljati X [400], potem program ve, da je to enakovredno
na le 1600 bajtov po začetku x.
Kje bomo dobili 1.600 bytes from? To je samo 400 krat 4 bajtov.
>> Preden preidemo, da je zelo pomembno, da se zavedaš, da v C
ni uveljavitev indeksa, ki ga uporabljamo v polje.
Naš velik blok je le 10 celih dolgo, vendar ne bo nič kričati na nas, če zapišemo x [20]
ali celo x [-5].
Indeks sploh ni nujno, da je številka.
To je lahko vsaka arbitrarna izraz.
V programu bomo uporabili spremenljivko i iz zanke za indeks v matriki.
To je zelo pogost vzorec, zanka od i = 0 do dolžine niza,
In potem sem uporabo kot indeks za matrike.
Na ta način lahko učinkovito zanke prek celotnega niza,
in lahko bodisi vsakemu mestu v matriki ali pa ga uporabljajo za nekaj izračun.
>> V prvem zanke for, i se začne z 0,
in tako bo dodeliti 0 lokaciji v polju, se vrednost 0 krat 2.
Potem sem korakih, in določimo prvo mesto v polju vrednost 1-krat 2.
Potem sem še enkrat korakih in tako naprej, dokler se dodeli v položaj N-1 v matriki
vrednost N-1-krat 2.
Zato smo izdelali paleto s prvimi 10 sodih števil.
Mogoče bi bila izravnava malo bolje ime za spremenljivko od x,
vendar bi bilo, da bi glede stvari stran.
Druga zanka se šele nato natisne na vrednote, ki smo jih že shranjeni v notranjosti polje.
>> Poskusimo vodenje programa pri obeh tipih polj izjav
in si na izhodu programa.
Kolikor vidimo, program obnaša na enak način za obe vrsti izjav.
Poglejmo pa si oglejte, kaj se zgodi, če spremenimo prvo zanko, da ne končajo na N
ampak pravijo 10.000.
Pot po koncu niza.
Ups. Mogoče si videl.
Segmentacija napaka pomeni, vaš program se je zrušil.
Vi boste lahko videli to, ko se boste dotaknili področja pomnilnika, ki ga ne bi smeli dotikajo.
Tu smo se dotaknili 10.000 mest, ki presegajo začetku x,
ki je očitno mesto v pomnilniku, ne smemo se jih dotikajo.
Torej, večina od nas verjetno ne bi slučajno dal 10.000 namesto N,
kaj pa če smo kaj bolj subtilno, kot pravijo, pisanje ali manj v N
v stanju, v zanko, v nasprotju z manj kot N.
Ne pozabite, da matrika ima samo indekse od 0 do n-1,
kar pomeni, da je indeks S je po koncu niza.
Program ne bo crash v tem primeru, vendar je še vedno napaka.
V bistvu je to napaka je tako pogost, da ima svoje ime,
off za 1 napake.
>> To je to za osnove.
Torej, kaj so glavne razlike med 2 vrste polj izjav?
Ena razlika je, če velik blok pomnilnika gre.
V prvi izjavi, ki je poklicala bom nosilec-diod tipa,
čeprav to nikakor ne pomeni konvencionalno ime,
bo šel v sklad.
Ker je v 2., ki je poklicala bom kazalnik niza vrsto, bo šlo na kup.
To pomeni, da ko se funkcija vrne, bo nosilec polje samodejno deallocated,
ker so se morate explicitily pokličite brezplačno na kazalec niz
ali pa imate pomnilnika.
Poleg tega je nosilec matrika dejansko ni spremenljiva.
To je pomembno. To je samo simbol.
Lahko pomislite, da je konstanta, ki je prevajalnik odloči za vas.
To pomeni, da ne moremo storiti kaj takega x + + z nosilcem tipa,
čeprav je to povsem ustrezen tip kazalca.
>> Kazalec tipa je spremenljivka.
Za kazalec tipa, imamo 2 ločeni blokov pomnilnika.
Spremenljivka x sam je shranjena v plasteh in je samo en kazalec,
vendar je velik blok pomnilnika shrani na kup.
Spremenljivka x na kupu samo shrani naslov
od velikih blok pomnilnika na kup.
Ena izmed posledic tega je, glede na velikost operaterja.
Če vprašate za velikost držala matrike, se vam bo na velikost velik blok pomnilnika,
nekaj takega kot 40 bajtov,
ampak če vprašate za velikost kazalca vrsto matrike,
to vam bo dala velikost spremenljivke x sama, ki je na aparatu je verjetno le 4 bajte.
Z uporabo kazalec diod tipa, je nemogoče, da neposredno zaprosijo za
velikost velikega bloka pomnilnika.
To običajno ni veliko omejitev, saj smo zelo redko želite velikost
od tega velik blok pomnilnika, zato lahko običajno izračunati, če jo potrebujete.
>> Nazadnje je nosilec niz se zgodi, da nam pošljete bližnjico za inicializacijo niz.
Pa poglejmo, kako lahko zapišemo prvih 10 še cela uporabo bližnjice initilization.
S kazalcem niz, ni način, da to bližnjico, kot je ta.
To je samo uvod, kaj lahko naredite z nizi.
Kažejo se v skoraj vsakem programu, ki ga pišete.
Upam, da zdaj lahko videli, boljši način za početje primer študentsko ID-ja
od začetka videa.
>> Moje ime je Rob Bowden, in to je CS50.