>> [Predvaja glasba]
Doug LLOYD: V redu.
Delo z single spremenljivke je precej zabavno.
Toda kaj, če želimo delati z veliko spremenljivk,
vendar ne želimo, da imajo kup različna imena plujejo okoli našega kodo?
V tem primeru so nizi dogaja, da pridejo zelo prav.
Polja so res temeljni podatki struktura za katero koli programskega jezika
ki ga boste uporabili.
In oni so res, res uporabno, posebej, kot bomo videli, v CS 50.
>> Mi uporabljamo nize, da imajo Vrednosti istega podatkovnega tipa
na sosednjih pomnilniških lokacijah.
To se pravi, da je Tako da bomo lahko skupina
kup celih skupaj spomin ali kup znakov
ali pa plava v spomin res tesno skupaj in delo
z njimi, ne da bi dal vsak ena svojo edinstveno ime, ki lahko
dobite okorni po malo časa.
>> Zdaj, eden od načinov za analogize nize je, da razmišljajo o vaši lokalni pošti
urad za sekundo.
Torej korak stran od programiranja in samo zaprite oči
in vizualizirati v tvoji glavi vaša lokalna pošta.
Ponavadi je v večini pošti pisarne, tam je velika banka
a poštnih predalov na steni.
>> Množica je velikan blok stičnega spomina,
na enak način, da se pošta banka v vašem poštnem uradu
je velik prostor na stena poštnem uradu.
Nizi so bile razdeljene na majhne, enako velikih blokov prostora,
od katerih je vsak imenovani element, pri enak način, da steni mesto
pisarna je bila razdeljena v majhne, enako velikih blokov prostora,
ki jo imenujemo poštni predal.
Vsak element matrike lahko shraniti določeno količino podatkov,
prav tako kot je vsak post office box sposoben da imajo določeno količino pošte.
>> Kaj se lahko shranijo v vsakem elementu matrika je spremenljivke istih podatkov
tip, kot int ali char, samo kot v poštni predal,
lahko fit samo stvari podobnega tipa,
kot so pisma ali manjših paketov.
Nazadnje smo lahko dostopate vsak element array neposredno s številko indeksa,
tako kot smo lahko dostopate našo pošto polje s poznavanjem svojo številko predala.
Upajmo, da je analogija vam pomaga dobiti svojo glavo
okoli idejo nizi ga analogizing nekaj drugega
da ste verjetno že poznajo.
>> V C elementi matrike so indeksirajo izhajajoč iz 0, ne od 1.
In to je zelo pomembno.
In v bistvu je to zato, v CS 50, In zakaj računalniški znanstveniki pogosto
bo štel od 0, je Zaradi dodatnih C je
indeksiranje, ki se vedno začne pri 0.
Torej, če niz sestavljen iz n elementov, Prvi element te matrike
se nahaja na indeks 0, in zadnji element matrike
se nahaja na indeksom n minus 1.
Še enkrat, če je n elementov v našem matrika, zadnji indeks n minus 1.
>> Torej, če je naš nabor 50 elementov, Prvi element se nahaja na indeks 0,
in zadnji element se nahaja na indeks 49.
Na žalost ali na srečo, odvisno od vaše perspektive,
C je zelo prizanesljivi tukaj.
To vam ne bo preprečilo dogaja izven igrišča vašega array.
Lahko dostop do minus 3 element vaše matrike
ali 59. element vaše array, če ima vaš nabor le 50 elementov.
To ne bo ustavil svoj program iz pripravo, vendar na doživljenjsko času,
boste morda naleteti bala krivda segmentacija
če začnete dostop do pomnilnika ki je izven meja kaj
boste morali svoj program, da vam.
Torej, bodite previdni.
>> Kaj array Izjava izgledal?
Kako bomo kodo array v obstoju kot smo kodo nobene druge spremenljivke?
Obstajajo trije deli na matriko declaration-- vrsto, ime,
in velikost.
To je zelo podoben spremenljivka deklaracija, ki
je le tip in ime, velikost element čemer
posebno velja za niz, saj smo dobili kup njih
ob istem času.
>> Torej, tip je kakšno spremenljivko ste ponudbe vsak element matrike biti.
Ali jo želite niz celih števil?
Nato bi moral tvoj tip podatkov biti int.
Ali želite, da biti array dvojicah ali plovci?
Vrsta podatkov mora biti dvojna ali plavajo.
Ime je kaj želite poklicati svojo paleto.
Kaj želite poimenovati ta velikan Banka celih ali plovci ali znakov
ali podvoji, ali karkoli že imaš?
Kaj hočeš, da ga pokličete?
Precej samoumevne.
>> Nazadnje, velikost, ki gre znotraj oglatih oklepajev,
je, kako bi jih mnogi elementi kot tvoj array vsebujejo.
Koliko celih hočeš?
Koliko plava hočeš?
>> Tako, na primer, int študentske ocene 40.
To izjavlja array imenovano Student stopnje, ki je sestavljena iz 40 celih števil.
Precej samoumevne, upam.
Tu je še en primer.
Dvojne cene Meni 8.
To ustvarja paleto imenovano Cene menijev, ki jih sestavljajo
prostora v pomnilniku za osem dvojic.
>> Če menite, da vsakega elementa od array tipa tip-podatkov,
tako, na primer, en sam element niz tipa int se vam enak način
bi bilo razmišljati o vseh drugih spremenljivka tipa int,
vse znane operacije, da smo že razpravljali v operativnem
video bo smiseln.
Torej, tukaj smo lahko razglasi niz od Booleans imenovanih Truthtable,
ki je sestavljen iz prostora za 10 Booleans.
>> In potem, tako kot smo se lahko samo določite vrednost za vsako drugo spremenljivko tipa
Boolean, bi lahko rekli kaj kot Truthtable kvadratni nosilec
2, ki je, kako smo se kažejo, kateri element resnice mizo?
Tretji element Resnica mizo, saj se spomnite,
smo štetje od 0.
Torej, to je, kako bomo navesti Tretji element resnice mizo.
Truthtable 2 enaka false, tako kot smo lahko declare--
ali bi lahko dodelite, ampak vsak Logični tip spremenljivke, da je lažna.
>> Lahko jo uporabite tudi v pogojih.
če (truthtable 7 == Res), kar pomeni,
če osmega elementa od Truthtable je res,
morda želimo natisniti sporočilo za uporabnika, printf ("TRUE! n") ;.
Ki nam povzroča reči Truthtable 10 je enako res, kajne?
No, lahko, ampak to je precej nevaren, saj se spomnite,
imamo celo paleto 10 Booleans.
Torej najvišji indeks, da je prevajalnik je dal nam je 9.
>> Ta program bo sestavil, vendar če je nekaj drugega, v spomin
obstaja, če bi mi pričakujejo Truthtable 10 iti,
smo lahko trpijo napako segmentacije. Mi lahko izmaže, vendar na splošno,
precej nevarno.
Torej, kaj delam tukaj je pravna C, vendar pa ni nujno najboljša poteza.
Zdaj, ko se prijavijo in inicializirati array hkrati,
tam je pravzaprav precej posebno sintakso, ki vas
lahko uporabite, da bi zapolnili array s svojimi izhodiščnimi vrednostmi.
Prav tako lahko dobili težje razglasi paleto velikosti 100,
in potem moram reči, element 0 enak to; Element 1 enak temu;
element 2, da je enak.
V čem je smisel, kajne?
>> Če je majhen niz, si lahko naredil kaj takega.
Bool truthtable 3 enaka odprta kodrasti brace in nato vejica
ločevanje seznam elementov ki jo želite dati v matriki.
Nato zaprite zavit oklepaj podpičjem.
To ustvarja niz Velikost tri imenuje Truthtable,
z elementi false, true, in res.
In v resnici, o primeru sintaksa imam tu
natanko isto kot počne Posameznik skladenjski element spodaj.
Ta dva načina kodiranja bi pa proizvajajo točno isto vrsto.
>> Podobno bi lahko Ponovil preko vseh elementov
od array uporabo zanko, ki je v Dejstvo, je zelo zelo priporočljivo
at-home vaja.
Kako si ustvariti niz 100 celih števil, kadar
vsak element matrike je njen indeks?
Tako na primer imamo paleto 100 cela števila, in v prvem elementu,
želimo postaviti 0.
V drugem elementu, želimo postaviti 1.
V tretji element, želimo postaviti 2; in tako naprej in tako naprej.
To je res dobra at-home vaja, da to storim.
>> Tukaj ni videti kot je preveč spremenila.
Ampak obvestilo, da je med oglati oklepaji, ta čas,
Sem dejansko izpustimo številko.
Če uporabljate to zelo posebno o primeru
sintaksa da ustvarite matrika, ki jih dejansko ne
morate navesti velikost array vnaprej.
Prevajalnik je dovolj pameten, vedeti, da vas dejansko
želijo paleto velikosti 3, ker si dal tri elemente
na desni strani enačaja.
Če bi si dal štiri, bi bilo vam dal resnico tabelo velikosti štiri;
in tako naprej in tako naprej.
>> Nizi niso omejene na eno samo razsežnost, ki je precej kul.
Lahko dejansko imajo toliko stranske projektantje kot želite.
Torej, za primer, če želite ustvariti tabla za igro Battleship, ki,
če si kdaj igral, je igra, ki je igral s čepki na 10. do 10. omrežje,
lahko ustvarite paleto, kot je ta.
Lahko bi rekli, bool bojna oglati oklepaj 10
zaprt oglati oklepaj square Nosilec 10 zaprt oglati oklepaj.
>> In potem se lahko odločite za to razlagajo v tvoji glavi kot 10
10 mrežo celic.
Sedaj v bistvu v spomin, res ne samo
ostane 100 element, single dimenzionalni array.
In to v resnici, gre za, če vas imajo tri dimenzije ali štiri ali pet.
To je res samo ne množijo vse indices--
ali vseh velikosti specifiers-- skupaj
in ste pravkar dobili enodimenzionalna array te velikosti.
>> Ampak v smislu organizacije in vizualizacija in človeška percepcija,
je lahko veliko lažje za delo z omrežjem
če delate na igro kot Tic-tac-toe ali Battleship,
ali nekaj takega.
To je velika abstrakcija, namesto da
razmišljati o Tic-tac-toe svet kot linijo devetih
kvadratov ali Battleship board kot vrstica 100 kvadratov.
10-10 omrežje ali tri s tremi omrežje je verjetno
Veliko bolj enostavno zaznati.
>> Zdaj pa nekaj res Pomembno približno nizi.
Mi lahko privoščite vsak posameznik element matrike kot spremenljivko.
Videli smo, da prej ko smo dodeljevanju
vrednost True nekaterim Booleans ali jih je testiranje v pogojnih.
Vendar ne moremo obravnavati cele sami nizi kot spremenljivke.
Ne moremo na primer dodelite en niz na drugi matriki, ki uporablja razporeditev
operater.
To ni pravna C.
>> Če želimo, za example-- kaj pa bi storili v tem primeru
bi bilo, da bi kopirali en niz v drugega.
Če želimo narediti, da smo dejansko morali uporabiti zanko, da bi kopirali več
vsak posamezen element enega naenkrat.
Vem, da je malo zamudno.
>> Torej, za primer, če bi imeli te par vrstic kode, bi to delo?
No, no, da ne bi, kajne?
Ker smo poskušali dodeliti hrano bar.
Da ne bo delovalo, ker je matrika,
in smo pravkar opisali da to ni pravna C.
>> Namesto tega, če želimo kopirati vsebino hrane
v baru, kjer je kaj smo poskušali narediti tukaj,
mi bi potrebovali sintakso, kot je ta.
Imamo za zanke, ki gre od J enak 0 do 5,
in smo prirastek J na vsaki ponovitvi zanka in določite elemente, kot da.
To bi povzročilo baru tudi pri čemer ena, dva, tri, štiri, pet,
ampak jo moramo to storiti zelo počasno element-by-element način,
Namesto s pravkar kopiranje celotno paleto.
V drugih programskih jeziki, bolj sodobni tisti,
lahko v resnici, ne samo Tako preprosto je enako sintakso.
Ampak C, žal, smo ni dovoljeno, da to storim.
>> Zdaj obstaja ena druga stvar bi rad omenil
o nizi da lahko malo bit težavno, ki ste ga prvič
delo z njimi.
Smo razpravljali v videoposnetku o variabilnega področja,
da večina spremenljivke v C, če pokličete jim v funkcijah, so po vrednosti.
Se spomnite, kaj to pomeni da prenese nekaj po vrednosti?
To pomeni, da smo kar kopijo spremenljivka, ki se je opravil v.
Funkcija callee, funkcija da je prejemanje spremenljivko,
ne dobijo spremenljivko sam.
To postane sama lokalna izvod to delati.
>> Nizi, seveda, ne ne po tem pravilu.
Namesto, kar imenujemo to je po referenci.
Callee dejansko ne prejme niz.
To ne prejme njeno lastna lokalna kopija.
In če mislite, da o tem da je to smiselno.
Če so nizi zelo velika, tako traja toliko časa in truda
narediti kopijo array 100 ali 1.000 ali 10.000 elementi,
da je ni vredno za delovati prejeti kopijo njega,
narediti nekaj dela z njim, in nato samo je treba storiti s kopijo;
to ni potrebno imeti da visi okoli več.
>> Ker so nizi nekateri zajetno in okorni,
smo jih pravkar prenese z referenco.
Samo zaupamo, da funkcijo da, ne zlomi ničesar.
Tako da se dejansko dobil niz.
To ne bi dobili svojo lokalno kopijo.
>> Torej, kaj to pomeni, potem, ko je callee
manipulira elemente matrike?
Kaj se zgodi?
Za zdaj, bomo zatajili več, zakaj ravno ta
se zgodi, zakaj nize so opravili s sklicevanjem
in vse ostalo se prenese po vrednosti.
Ampak obljubim ti, bomo vrnil in vam odgovor
da je to v kasnejšem video.
>> Tukaj je še ena vaja za vas preden smo zaviti stvari na nizi.
Kup kode tukaj, to je ni posebej dober stil,
Pravkar sem bom, da to opozorilo.
Ni komentarjev tukaj, ki je precej slaba oblika.
Ampak to je samo zato, ker sem hotel biti sposobni prilagoditi vse na zaslonu.
>> Na vrhu, lahko vidite, da imam dve deklaracije funkcij za set paleto
in nastavite int.
Set paleto očitno traja niz štirih števil kot vložek.
In set int očitno traja ena celo kot svoj vložek.
Toda oba nimajo izhoda.
Izhod, vrnitev tip, za ničen vsak.
V glavnem, imamo nekaj vrstic kode.
Izjavljamo celo število spremenljivko imenuje in mu dodeliti vrednost 10.
Izjavljamo niz štirih števil imenovano B in določite elemente, 0, 1,
2 in 3, v tem zaporedju.
Nato smo klic, da nastavite int in klic, da nastavite paleto.
Opredelitve pojmov nastavljeno paleto in nabor int so pod tla in na dnu.
>> In tako, še enkrat, sem vam zastavil vprašanje.
Kaj dobi izpisal tukaj na koncu Main?
Tam je izpis col. Jaz sem tiskanje dve celi števili.
Jaz tiskanje vsebine in vsebina B kvadratni nosilec 0.
Premor video tukaj in traja približno minuto.
Lahko ugotovimo, kaj je to Funkcija bo izpisal na koncu?
Upajmo, če spomnimo Razlikovanje med mimogrede po vrednosti
in po referenci, to Problem ni bil preveč zapleteno zate.
In odgovor bi jih Ugotovili to.
Če niste prepričani, da se zakaj je temu tako, bo drugi,
iti nazaj, pregledali, kaj sem pravkar razpravljali o prehodu nize
z referenco, v primerjavi poteka druge spremenljivke po vrednosti,
in upam, da bo to, da malo več smisla.
>> Sem Doug Lloyd, in to je CS50.