[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.