>> [MUZIKO Ludante]
DOUG LLOYD: Bone.
Laborante kun sola variabloj estas sufiĉe amuza.
Sed kion se ni volas labori kun multaj variabloj,
sed ni ne volas havi faskon de malsamaj nomoj flugante ĉirkaŭ nia kodo?
En tiu kazo, tabeloj estas tuj veni en vere oportuna.
Arrays estas vere fundamentaj datumoj strukturon por ajna programlingvo
ke vi uzos.
Kaj ili estas vere, vere utila, aparte, kiel ni vidos, en CS 50.
>> Ni uzas tabeloj por teni valoroj de la sama datumtipo
ĉe apudaj memoro lokojn.
Tio estas, ĝi estas maniero ke ni povas grupigi
faskon de entjeroj kune en memoro aŭ faskon de karakteroj
aŭ flosas memore vere fermi kune kaj laboro
kun ili sen devi doni ĉiun unu sian propran unikan nomon, kiu povas
akiri maloportuna post iom da tempo.
>> Nun, unu maniero analogize tabeloj estas pensi pri via loka posteno
oficejo dum sekundo.
Do paŝu for de programado kaj simple fermu viajn okulojn
kaj visualizar en via menso via loka poŝtoficejo.
Kutime, en plej posteno oficejoj, ekzistas granda banko
poŝtejo skatoloj sur la muro.
>> Tabelo estas giganta bloko de apudaj memoro,
sammaniere ke poŝto banko en via poŝtejo
estas granda spaco sur la muro de la poŝtoficejo.
Arrays estis dispartigita en malgrandaj, idente grandeco blokojn de spaco,
el kiuj ĉiu estas nomata ero, en sammaniere ke la muro de la post
oficejo estis dispartigita en malgrandaj, idente grandeco blokojn de spaco,
kiun ni nomas PO kesto.
Ĉiu elemento de la tabelo povas stoki iun kvanton de datumoj,
Tiel ĉiu poŝtejo skatolo povas teni certan kvanton de poŝto.
>> Kio povas esti stokita en ĉiu elemento de la tabelo estas variabloj de la sama datumoj
tipo, kiel ekzemple int aŭ char, nur kiel en via poŝtoficejo skatolo,
Vi nur povas persvadi aferoj de simila tipo,
kiel literoj aŭ malgrandaj pakoj.
Finfine, ni povas aliri ĉiu ero de la tabelo rekte per indekso numeron,
kiel ni povas aliri nian poŝtoficejo skatolo de scianta lia leterkesto nombro.
Espereble, ke analogio helpas vin akiri vian kapon
ĉirkaŭ la ideo de sensilo per analogizing al io alia
ke oni verŝajne jam konas.
>> En C, la elementoj de tabelo estas indeksita ekde 0, ne de 1.
Kaj tiu estas vere grava.
Kaj fakte, ĉi tiu estas kial ni, en CS 50, kaj kial komputikistoj ofte
rakontos de 0, estas pro C la tabelo
indeksado, kiu ĉiam startas je 0.
Do se tabelo konsistas de n eroj, la unua elemento de tiu tabelo
situas ĉe indeksa 0, kaj la lasta elemento de la tabelo
situas ĉe indekso n minus 1.
Denove, se estas n elementoj en nia tabelo, la lasta indekso estas n minus 1.
>> Do se nia tabelo havas 50 elementoj, la unua ero situas ĉe indeksa 0,
kaj la lasta elemento situas ĉe indekso 49.
Bedaŭrinde, aŭ bonŝance, Dependanta sur via perspektivo,
C estas tre malsevera tie.
Ĝi ne malhelpas vin de irante el baroj de via tabelo.
Vi povus aliri la minus 3 elementon de via tabelo
aŭ la 59a ero de via tabelo, se via tabelo nur havas 50 elementojn.
Ĝi ne ĉesos vian programon el kompilado, sed en tempo de ekzekuto,
vi eble malkovros timitan segmentación kulpo
se vi komencas aliri memoro kiu estas ekster la saltegoj de kio
vi petis vian programon por doni al vi.
Do zorgu.
>> Kion faras tabelo deklaro aspektas?
Kiel ni kodigi tabelo en ekziston kiel ni kodi ajna alia variablo?
Ekzistas tri partoj al tabelo declaration-- tipo, nomo,
kaj grandeco.
Ĉi tio estas tre simila al ŝanĝiĝema deklaro, kiu
estas nur tipo kaj nomo, la grandeco elemento estanta
la speciala kazo por tabelo, ĉar ni plialtigas faskon de ili
samtempe.
>> Do la tipo estas kia variablo vin volas ĉiu elemento de la tabelo esti.
Ĉu deziras ĝin al aro de entjeroj?
Tiam, via datumtipo devus esti int.
Ĉu vi deziras ĝin esti tabelo de duobloj aŭ flosoj?
Datumtipo devus esti duobla aŭ flosi.
La nomo estas kion vi volas nomi via tabelo.
Kion vi volas nomi tiun giganto banko de entjeroj aŭ kaleŝegoj aŭ signoj
aŭ duobligas, aŭ kion ajn vi havas?
Kion vi volas nomi ĝin?
Bela mem klarigan.
>> Laste, grandeco, kiu iras ene de rektaj krampoj,
estas kiom da elementoj vi farus kiel via tabelo enhavi.
Kiom da entjeroj vi volas?
Kiom da flosoj vi volas?
>> Do ekzemple, int studento gradoj 40.
Tio deklaras tabelo nomita Studenta kvalifikojn, kiu konsistas de 40 entjeroj.
Bela memo klarigaj, mi esperas.
Jen alia ekzemplo.
Duobla menuo prezojn 8.
Tio kreas aron vokis Menuo prezoj, kiu konsistas
de ĉambro en memoro por ok duobloj.
>> Se vi pensas de ĉiu ero de tabelo de tipo datumoj-tipo,
tiel ekzemple, sola ero de tabelo de tipo int, la sama maniero vi
pensus pri iu ajn alia variablo de tipo int,
ĉiuj familiaraj ekspluatadoj ke ni diskutis antaŭe en la Operacioj
video sencon.
Do jen, ni povus deklari tabelo de Booleans nomita Truthtable,
kiu konsistas el ĉambro por 10 Booleans.
>> Kaj tiam, ĝuste kiel ni povus simple asigni valoron al ajna alia variablo de tipo
Buleaj, ni povus diri ion kiel Truthtable kvadrata krampo
2, kiu estas kiel ni markas, kiu ero de la vero tablo?
La tria ero de la vertabelo, ĉar memoru,
ni rakonti de 0.
Do jen kiel ni indikas la tria elemento de la vertabelo.
Truthtable 2 egalas malvera, ĝuste kiel ni povus declare--
aŭ ni povus atribui prefere ajnan Buleaj tipo variablo esti falsa.
>> Ni povas ankaŭ uzi ĝin en kondiĉoj.
se (truthtable 7 == vera), kiu estas,
se la oka ero de Truthtable estas vera,
eble ni volas presi mesaĝon al la uzanton, printf ("VERA! n") ;.
Kiu kaŭzas nin diri Truthtable 10 egalas vera, ĉu ne?
Nu, mi povas, sed ĝi estas sufiĉe danĝera, ĉar memoru,
Ni havas aron de 10 Booleans.
Do la plej alta indico kiu la tradukilo donis nin estas 9.
>> Tiu programo kompilos, sed se io alia en memoro
Ekzistas kie ni volus atendi Truthtable 10 iri,
ni povis suferi segmentación kulpo. Ni povus foriri per ĝi, sed en ĝenerala,
bela danĝera.
Do kion mi faras ĉi tie estas jura C, sed ne nepre la pli bona movado.
Nun, kiam vi rakontos kaj pravalorizi tabelo samtempe,
ekzistas reale belan speciala sintakso ke vi
povas uzi por plenigi la tabelo kun lia komenca valoroj.
Ĝi povas akiri ĝene deklari tabelo de grandeco 100,
kaj tiam devi diri, elemento 0 egalas ĉi; elemento 1 egalas ĉi;
elemento 2 egalas tio.
Kio estas la punkto, dekstra?
>> Se ĝi estas malgranda tabelo, vi povus fari ion kiel tiu.
Bool truthtable 3 egalas malfermita krispa streĉa kaj tiam komo
apartigi la lerta de elementoj ke vi volas meti en la tabelo.
Tiam fermi krispa streĉa punktokomo.
Tio kreas aron da grandeco tri nomitaj Truthtable,
kun elementoj malvera, vera kaj vera.
Kaj fakte, la instantiation sintakso mi havas ĉi tie estas
ĝuste la sama kiel faranta la individua elemento sintakso sube.
Tiuj du manieroj de kodigo volus produkti la ĝusta sama tabelo.
>> Simile, ni povis persisti super ĉiuj de la elementoj
de tabelo uzante buklo, kiu, en Fakte, estas tre forte rekomendita
ĉe-hejmo ekzerco.
Kiel vi kreas tabelon de 100 entjeroj, kie
ĉiu ero de la tabelo estas ĝia indekso?
Do ekzemple, ni havas aron de 100 entjeroj, kaj en la unua elemento,
ni volas meti 0.
En la dua ero, ni volas meti 1.
En la tria elemento, ni volas meti 2; kaj tiel plu kaj tiel plu.
Tio estas vere bona ĉe-hejmo ekzerco fari tion.
>> Ĉi tie, ĝi ne aspektas kiel tro multe ŝanĝiĝis.
Sed rimarki ke en inter la rektaj krampoj, ĉifoje,
Mi fakte preterlasis la numeron.
Se vi uzas ĉi tre speciala instantiation
sintakso krei tabelo, vi fakte ne
bezonas indiki la grandecon de la tabelo anticipe.
La tradukilo estas sufiĉe lertaj scii ke vi efektive
volas tabelo de amplekso 3, ĉar vi metis tri elementoj
dekstre de la egalsigno.
Se vi metis kvar, ĝi havus donis al vi vertabelo de grandeco kvar;
kaj tiel plu kaj tiel plu.
>> Arrays estas ne limigita al sola dimensio, kiu estas sufiĉe freŝa.
Vi povas fakte havi tiom da flanko specifiers kiel vi deziras.
Do ekzemple, se vi volas krei estraron por la ludo Battleship, kiu,
se vi iam ludis, estas ludo kiu estas ludis kun kejloj sur la 10 por 10 krado,
vi povus krei tabelo kiel ĉi.
Vi povus diri Bool batalŝipo kvadrata krampo 10
fermita kvadrata krampo kvadrataj krampo 10 fermita kvadrata krampo.
>> Kaj tiam, vi povas elekti interpreti tion en via menso kiel 10
per 10 krado de ĉeloj.
Nun, fakte, en memoro, ĝi vere faras ĝuste
resti 100 elemento, ununura dimensia tabelo.
Kaj tio, fakte, iras por se havas tri dimensiojn aŭ kvar aŭ kvin.
Ĝi vere nur faras multobligi ĉiuj indices--
aŭ ĉio el la grandeco specifiers-- kune,
kaj vi simple akiri unu-dimensia tabelo de tiu grandeco.
>> Sed en terminoj de organizo kaj videbligo kaj homa percepto,
ĝi povas esti multe pli facila labori kun krado
se vi laboras sur ludo kiel Tic-tac-piedfingro aŭ Marbatalo,
aŭ io simila.
Estas granda abstrakteco, anstataŭ havanta
pensi en Tic-tac-piedfingro tabulo kiel linio de naŭ
kvadratojn aŭ Marbatalo estraro kiel linio de 100 kvadratoj.
Ĉirkaŭ 10 per 10 krado aŭ tri per tri krado estas probable
multe pli facile percepti.
>> Nun, iu vere grava pri tabeloj.
Ni povas trakti ĉiu individua elemento de la tabelo kiel variablo.
Ni vidis ke pli frue kiam ni asignanta
la valoron True to certaj Booleans aŭ provi ilin en Conditionals.
Sed ni ne povas trakti ĉiun tabeloj sin kiel variabloj.
Ni ne povas, ekzemple, atribui unu tabelo al alia tabelo uzante la asigno
operatoro.
Ĝi ne estas laŭleĝa C.
>> Se ni volas, por example-- kio ni farus en tiu ekzemplo
estus kopii unu tabelo en alian.
Se ni volas fari tion, ni efektive bezonas uzi buklo kopii super
ĉiu individua elemento unuope.
Mi scias ke estas iom tempo konsumanta.
>> Do ekzemple, se ni havis tiujn paro de linioj de kodo, farus tiun laboron?
Nu, ne, ĝi ne volis, ĉu ne?
Ĉar ni provas atribui manĝon al trinkejo.
Tio ne tuj funkcios, ĉar ĝi estas tabelo,
kaj ni ĵus priskribita ke tio ne laŭleĝa C.
>> Anstataŭe, se ni volas kopiu la enhavon de nutraĵo
en trinkejo, kiu estas kiu ni provas fari tie,
ni bezonus sintakson kiel ĉi.
Ni havas por buklo kiu iras de J estas egalaj al 0 ĝis 5,
kaj ni pliigo J sur ĉiu ripeto de la buklo kaj atribui elementoj tiel.
Tiu rezultus en trinkejo ankaŭ esti unu, du, tri, kvar, kvin,
sed ni devas fari ĝin ĉi tre malrapida elemento post elemento vojon,
anstataŭ per nur kopianta la tuta tabelo.
En aliaj programado lingvoj, pli modernaj,
vi povas, fakte, do nur ke simplaj egalas sintakso.
Sed C, bedaŭrinde, ni estas ne rajtas fari tion.
>> Nun, ekzistas unu alia aferon mi volas mencii
pri sensilo kiu povas esti iom iom malfacila la unua tempo vi
labori kun ili.
Ni diskutis en video pri variablo medion,
ke plej variabloj en C, kiam vi nomas ilin en funkcioj, estas pasitaj de valoro.
Cxu vi memoras, kion signifas pasi iun por valoro?
Ĝi signifas ni fari kopion de la variablo ke tio esti pasis en.
La callee funkcio, la funkcio tio estas ricevi la variablon,
ne ricevas la variablo mem.
Ĝi ricevas sian propran lokan kopio por labori kun.
>> Arrays, kompreneble, fari ne sekvas tiun regulon.
Prefere, kion ni nomas tiun irante referenco.
La callee reale does ricevi la tabelo.
Ĝi ne ricevas liajn propra loka kopio.
Kaj se vi pensas pri ĝi, tiu havas sencon.
Se tabeloj estas vere granda, prenas tiom da tempo kaj peno
fari kopion de tabelo de 100 aŭ 1,000 aŭ 10,000 elementoj,
ke tio ne valoras por funkcii ricevi kopion de ĝi,
fari iun laboron kun ĝi kaj poste nur esti farita kun la teksto;
ĝi ne bezonas havi ĝi pendis ĉirkaŭ anymore.
>> Ĉar arrays estas iuj dikigitaj kaj pezaj,
ni simple preterpasas ilin por referenco.
Ni nur esperas ke funkcio al, ne rompas nenion.
Do ĝi reale preni la tabelo.
Ĝi ne ricevas sian propran lokan kopion de ĝi.
>> Do kio faras ĉi tiun mezumon, tiam, kiam la callee
Manipulas elementoj de la tabelo?
Kio okazas?
Por nun, ni forgliti super kial ĝuste tiu
okazas, kial tabeloj estas pasitaj por referenco
kaj ĉio alia estas pasita por valoro.
Sed mi promesas al vi, ni volas reveni kaj doni al vi la respondon
al tiu en posta vidbendo.
>> Jen unu pli ekzerco por vi Antaŭ ol ni finos aferojn sur tabeloj.
La faskon de kodo tie, jen ne aparte bona stilo,
nur mi faros ke averto.
Mankas komentoj tien, kiuj estas sufiĉe malbona formo.
Sed estas nur ĉar mi volis esti povis konveni ĉion sur la ekrano.
>> Ĉe la supro, vi povas vidi ke mi havas du funkcio deklaroj por aro tabelo
kaj starigis int.
Aro tabelo ŝajne prenas tabelo de kvar entjeroj kiel ĝia enigo.
Kaj aro int ŝajne prenas sola entjero kiel ĝia enigo.
Sed ambaux ne havas eliron.
La produktaĵo, la reveno tajpi, de ĉiu estas malplena.
En Main, ni havas paro de linioj de kodo.
Ni deklaras entjera variablo nomitaj A kaj atribui al ĝi la valoron 10.
Ni deklaras tabelo de kvar entjeroj nomata B kaj asigni la elementoj 0, 1,
2, kaj 3, respektive.
Tiam, ni havas alvokon starigi int kaj alvokon starigi tabelo.
La difinoj de aro tabelo kaj aro int estas sube, ĉe la fundo.
>> Kaj do, denove mi petas vin la demando.
Kio gets presita eksteren tie ĉe la fino de Main?
Ekzistas printaĵo col. Mi estas presi el du entjeroj.
Mi presi el la enhavon de A kaj la enhavo de B kvadrata krampo 0.
Paŭzi la video tie kaj preni momenton.
Ĉu vi povas diveni kio tiu funkcio estos presi fine?
Espereble, se vi memoras la distingo inter preteriranto valoro
kaj pasinte preter referenco, ĉi problemo ne estis tro malfacila por vi.
Kaj la respondo vi farus trovis estas jena.
Se vi ne estas vere komprenis, kial tio estas la kazo, preni duan,
reiri, revizii kion mi estis ĵus diskuti pri pasanta tabeloj
por referenco, kontre pasanta aliaj variabloj laŭ valoro,
kaj espereble, gxi devos fari iomete pli sentita.
>> Mi Doug Lloyd, kaj ĉi tiu estas CS50.