[Speel van musiek] DOUG LLOYD: Alle reg. Werk met 'n enkele veranderlikes is redelik pret. Maar wat as ons wil om te werk met 'n baie veranderlikes, maar ons wil nie 'n klomp van het verskillende name vlieg rond ons kode? In hierdie geval, skikkings is gaan om in te kom regtig handig. Skikkings is 'n baie fundamentele data struktuur vir enige programmeertaal wat jy sal gebruik. En hulle is regtig, regtig nuttig, veral as ons sal sien, in CS 50. Ons gebruik skikkings te hou waardes van dieselfde tipe data op aangrensende geheue plekke. Dit is om te sê, dit is 'n manier wat ons kan groep 'n klomp van heelgetalle saam in geheue of 'n klomp van die karakters of dryf in die geheue werklik naby aan mekaar en werk met hulle sonder om te gee elke een sy eie unieke naam, wat kan kry swaar na 'n rukkie. Nou, een manier om skikkings analogize is om te dink oor jou plaaslike poskantoor kantoor vir 'n tweede. So stap weg van ontwikkeling en net jou oë toemaak en visualiseer in jou gedagtes jou plaaslike poskantoor. Gewoonlik, in die meeste post kantore, daar is 'n groot bank 'n poskantoor bokse op die muur. 'N skikking is 'n reuse-blok van aangrensende geheue, Op dieselfde wyse dat 'n e-pos bank in jou poskantoor is 'n groot ruimte op die muur van die poskantoor. Skikkings is verdeel in klein, identies grootte blokke van die ruimte, elk van wat genoem word 'n element in Op dieselfde wyse dat die muur van die post kantoor is verdeel in klein, identies grootte blokke van die ruimte, wat ons noem 'n PO word Posbus. Elke element van die skikking kan stoor 'n sekere bedrag van data, net soos elke posbus kan om 'n sekere bedrag van pos beklee. Wat kan gestoor word in elke element van die skikking is veranderlikes van dieselfde data tipe, soos int of char, net soos in jou posbus, jy kan net inpas dinge van 'n soortgelyke tipe, soos briewe of klein pakkette. Laastens, kan ons toegang elke element van die skikking wat direk deur indeks nommer, net soos ons kan toegang tot ons poskantoor boks deur die wete sy posbus nommer. Hopelik dat analogie help om jou kop te kry rondom die idee van skikkings deur analogizing na iets anders dat jy waarskynlik reeds vertroud is met. In C, die elemente van 'n skikking is geïndekseer vanaf 0, nie van 1. En dit is werklik belangrik. En in die feit, dit is hoekom ons in CS 50, en waarom die rekenaar wetenskaplikes dikwels tel van 0, is as gevolg van C se verskeidenheid kruip, wat altyd begin by 0. So as 'n skikking bestaan ​​uit n elemente, die eerste element van daardie verskeidenheid is geleë op indeks 0, en die laaste element van die skikking is geleë op indeks N minus 1. Weereens, as daar is n elemente in ons skikking, die laaste indeks is N minus 1. So as ons verskeidenheid het 50 elemente, die eerste element is geleë op indeks 0, en die laaste element is geleë op 49-indeks. Ongelukkig of gelukkig, afhangende van jou perspektief, C is hier baie toegeeflik. Dit sal jou nie verhoed gaan uit van die grense van jou skikking. Jy kan toegang tot die minus 3 element van jou array of die 59 element van jou skikking, as jou array het slegs 50 elemente. Dit sal jou program nie verhoed die opstel van, maar te hardloop tyd, wat jy kan teëkom n gevreesde segmentering skuld As jy begin om toegang tot die geheue wat buite die grense van wat jy gevra jou program om jou te gee. So moenie versigtig wees. Wat doen 'n verskeidenheid verklaring lyk? Hoe weet ons die kode 'n skikking in bestaan soos ons kodeer enige ander veranderlike? Daar is drie dele om 'n verskeidenheid declaration-- 'n tipe, 'n naam, en 'n grootte. Dit is baie soortgelyk aan 'n veranderlike verklaring, wat is net 'n tipe en 'n naam, die grootte element om die spesiale geval vir 'n skikking, want ons kry 'n klomp van hulle op dieselfde tyd. So die tipe is watter soort veranderlike wil elke element van die skikking te wees. Wil dit om 'n verskeidenheid van heelgetalle? Dan moet jy jou data tipe int wees. Wil jy dit aan 'n wees verskeidenheid van dubbelspel of dryf? Data tipe moet dubbel of float. Die naam is wat jy wil jou array noem. Wat wil jy hierdie reuse noem bank van heelgetalle of dryf of karakters of verdubbel, of wat ook al jy? Wat doen jy wil om dit te noem? Pretty selfverduidelikend. Laastens, grootte, wat gaan binnekant van vierkantige hakies, is hoeveel elemente wat jy sou soos jou array bevat. Hoeveel heelgetalle wil jy hê? Hoeveel dryf wil jy hê? So byvoorbeeld, int student grade 40. Dit verklaar 'n skikking met die naam Student grade, wat bestaan ​​uit 40 heelgetalle. Pretty selfverduidelikend, ek hoop. Hier is nog 'n voorbeeld. Double spyskaart pryse 8. Dit skep 'n skikking met die naam Menu pryse, wat bestaan ​​uit van die kamer in die geheue vir agt dubbelspel. As jy dink van elke element van 'n verskeidenheid van data tipe-tipe, so byvoorbeeld, 'n enkele element van 'n verskeidenheid van tipe int, dieselfde manier wat jy sou dink aan enige ander veranderlike van tipe int, al die bekende bedrywighede dat ons voorheen bespreek in die Bedryf video sal sin maak nie. So hier, kan ons 'n verskeidenheid te verklaar boolse genoem Truthtable, wat bestaan ​​uit ruimte vir 10 Booleans. En dan, net soos ons kon net toewys 'n waarde aan enige ander veranderlike van tipe Boole, kan ons iets te sê soos Truthtable vierkante bracket 2, wat is hoe ons te dui, watter element van die waarheid tafel? Die derde element van die waarheid tafel, want onthou, ons tel van 0. So dit is hoe ons dui die derde element van die waarheid tafel. Truthtable 2 is gelyk aan valse, net soos ons kon declare-- of ons kan toewys, eerder, enige Boole tipe veranderlike te wees valse. Ons kan dit ook gebruik in toestande. As (truthtable 7 == ware), wat is om te sê, As die agtste element van Truthtable is waar, Miskien wil ons 'n boodskap te druk aan die gebruiker, printf ("WAAR! n") ;. Dit veroorsaak dat ons Truthtable sê 10 is gelyk aan ware, reg? Wel, ek kan nie, maar dit is redelik gevaarlik, want onthou, ons het 'n verskeidenheid van 10 Booleans. So het die hoogste indeks wat die samesteller aan ons gegee het is 9. Hierdie program sal saamstel, maar as iets anders in die geheue bestaan ​​waar ons sou verwag Truthtable 10 om te gaan, ons het 'n fout segmentering kan ly. Ons kan wegkom met dit nie, maar in die algemeen, redelik gevaarlik. So wat ek hier doen, is reg C, maar nie noodwendig die beste beweeg. Nou, wanneer jy verklaar en inisialiseer 'n verskeidenheid gelyktydig, daar is eintlik 'n redelik spesiale sintaksis wat jy kan gebruik om te vul die skikking met sy beginspan waardes. Dit kan lastig te kry verklaar 'n verskeidenheid van grootte 100, en dan het om te sê, element 0 gelyk hierdie; element 1 gelyk hierdie; element 2 is gelyk aan daardie. Wat is die punt, reg? As dit is 'n klein verskeidenheid, jy kan iets soos hierdie te doen. Bool truthtable 3 gelyk oop krullerige brace en dan komma skei die lys van elemente wat jy wil in die skikking te sit. Dan sluit krullerige brace kommapunt. Dit skep 'n verskeidenheid van grootte drie genoem Truthtable, met elemente valse, waar, en waar. En in die feit, die Instantiëring sintaksis Ek het hier is presies dieselfde as wat die individuele element sintaksis hieronder. Hierdie twee maniere van kodering sou produseer die presiese dieselfde skikking. Net so, kan ons Itereer oor al die elemente van 'n skikking met behulp van 'n lus, wat in Trouens, is 'n baie sterk aanbeveel at-home oefening. Hoe kan jy 'n verskeidenheid te skep 100 heelgetalle, waar elke element van die skikking is die indeks? So byvoorbeeld, het ons 'n verskeidenheid van 100 heelgetalle, en in die eerste element, ons wil om te sit 0. In die tweede element, ons wil om te sit 1. In die derde element, ons wil 2 om te sit; en so aan en so aan. Dit is 'n baie goeie at-home oefening om dit te doen. Hier lyk dit nie of soos te veel het verander. Maar let dat in tussen die vierkantige hakies, hierdie keer, Ek het eintlik uitgelaat die getal. As jy met behulp van hierdie baie spesiale Instantiëring sintaksis om 'n te skep verskeidenheid, wat jy eintlik doen nie nodig om die grootte aan te dui van die skikking vooraf. Die samesteller is slim genoeg om werklik te weet dat jy wil 'n skikking van grootte 3, omdat jy drie elemente aan die regterkant van die gelykaanteken. As jy vier gesit het, sou dit gegee 'n waarheidstabel grootte vier; en so aan en so aan. Skikkings is nie beperk tot 'n enkele dimensie, wat is pretty cool. Jy kan eintlik soveel kant spesifiseerders as jy wil. So byvoorbeeld, as jy wil skep 'n raad vir die spel Battle, wat As jy al ooit gespeel het, is 'n spel wat is gespeel met die penne op die 10 deur 10 rooster, jy kan 'n verskeidenheid soos hierdie te skep. Jy kan sê Bool slagskip vierkante bracket 10 geslote vierkante vierkante bracket bracket 10 gesluit vierkante bracket. En dan, kan jy kies om interpreteer dit in jou gedagtes as 'n 10 10 rooster van selle. Nou, in werklikheid, in die geheue, dit nie regtig net bly 'n 100 element, enkele dimensionele skikking. En dit, in werklikheid, geld vir as jy drie dimensies of vier of vyf. Dit is regtig net nie vermeerder al die indices-- of al die grootte specifiers-- saam en jy net 'n een-dimensionele verskeidenheid van die grootte. Maar in terme van die organisasie en visualisering en menslike persepsie, kan dit 'n baie makliker wees om te werk met 'n rooster As jy werk op 'n spel soos Tic-tac-toe of Battle, of iets soos dit. Dit is 'n groot abstraksie, in plaas van om na te dink oor 'n Tic-tac-toe raad as 'n lyn van nege vierkante of 'n Battle raad as 'n lyn van 100 vierkante. A 10 deur 10 rooster of 'n drie deur drie rooster is waarskynlik 'n baie meer maklik om te sien. Nou, iets wat regtig belangrik is oor skikkings. Ons kan elke individu te behandel element van die skikking as 'n veranderlike. Ons het gesien dat vroeër toe ons toeken die waarde Getrou aan sekere Booleans of hulle die toets in conditionals. Maar ons kan nie behandel hele skikkings hulself as veranderlikes. Ons kan nie, byvoorbeeld, wys een array om 'n skikking met die opdrag operateur. Dit is nie reg C. As ons wil, want example-- wat ons sou doen in daardie voorbeeld sou wees om een ​​array kopieer na 'n ander. As ons wil hê dat ons werklik doen nodig om 'n lus te gebruik om oor kopieer elke individuele element een op 'n tyd. Ek weet dit is 'n bietjie tyd in beslag. So byvoorbeeld, as ons het hierdie egpaar reëls van die kode, sal dit werk? Wel, nee, dit sou nie, reg? Want ons probeer om kos te wys aan bar. Dit gaan nie werk nie, want dit is 'n skikking, en ons het net beskryf dat dit is nie reg C. In plaas daarvan, as ons wil kopieer die inhoud van voedsel in bar, en dit is wat ons probeer om hier te doen, ons sou 'n sintaksis soos hierdie nodig. Ons het 'n lus vir die wat gaan van J is gelyk aan 0 tot 5, en ons inkrementeer J elke iterasie van die lus en wys elemente soos dit. Dit sal lei tot bar ook synde een, twee, drie, vier, vyf, maar ons het om dit te doen hierdie baie stadige element-by-element manier, in plaas van deur net kopiëring van die hele skikking. In ander programme tale, meer moderne kinders, jy kan, in werklikheid, nie net so eenvoudig gelyk sintaksis. Maar C, ongelukkig, ons is nie toegelaat om dit te doen. Nou, daar is een ander ding wat ek wil noem oor skikkings dat 'n bietjie kan wees bietjie lastig die eerste keer dat jy saam met hulle werk. Ons bespreek in 'n video oor veranderlike omvang, dat die meeste veranderlikes in C, wanneer jy bel hulle funksies, is verby waarde. Onthou jy wat dit beteken om iets deur waarde te slaag? Dit beteken dat ons 'n afskrif van die veranderlike wat is oorgedra in. Die callee-funksie dit is die ontvangs van die veranderlike, nie die veranderlike self te kry. Dit kry sy eie plaaslike afskrif daarvan om te werk met. Skikkings, natuurlik, doen volg nie hierdie reël. Inteendeel, wat ons noem verbygaan verwysing. Die callee eintlik ontvang nie die skikking. Dit maak nie ontvang sy eie plaaslike afskrif daarvan. En as jy dink oor dit, dit maak sin. As skikkings is regtig groot is, is dit neem soveel tyd en moeite 'n afskrif van 'n verskeidenheid van maak 100 of 1000 of 10000 elemente, dat dit nie die moeite werd om 'n funksioneer om 'n kopie te ontvang van dit, 'n werk te doen met dit, en dan net gedoen word met die kopie; dit nie nodig om dit hang rond nie. Omdat skikkings is 'n paar lywige en omslagtig, ons hulle net verby met verwysing. Ons het net vertrou dat funksie om, nie iets breek. Sodat dit nie eintlik kry die skikking. Dit maak nie sy eie plaaslike kopie van dit te kry. So wat beteken dit, Dan, wanneer die callee manipuleer elemente van die skikking? Wat gebeur? Vir nou, sal ons glans oor waarom juis hierdie gebeur, waarom skikkings geslaag deur verwysing en alles anders word geslaag deur waarde. Maar ek belowe jou, sal ons terug en gee jou die antwoord om dit in 'n later video. Hier is nog een oefening vir jou voordat ons draai dinge op skikkings. Die klomp van die kode hier, dis nie besonder goeie styl, net ek sal dit caveat te maak. Daar is geen kommentaar hier, wat is redelik slegte vorm. Maar dit is net omdat ek wou wees in staat wees om alles in te pas op die skerm. Op die top, kan jy sien dat ek twee funksie verklarings vir stel array en stel int. Stel verskeidenheid neem blykbaar 'n skikking vier heelgetalle aangesien sy insette. En stel int neem blykbaar 'n enkele heelgetal aangesien sy insette. Maar beide van hulle het nie 'n uitset. Die uitset, die terugkeer tik, van elkeen is nietig. In Main, het ons 'n paar reëls van die kode. Ons verklaar 'n heelgetal veranderlike genoem A en gee dit die waarde 10. Ons verklaar 'n verskeidenheid van vier heelgetalle genoem B en die elemente 0, 1 toewys, 2 en 3 onderskeidelik. Dan het ons 'n oproep te stel int en 'n oproep om verskeidenheid te stel. Die definisies van vaste en stel array int is onder af, aan die onderkant. En so, weer, vra ek jou die vraag. Wat kry gedruk hier aan die einde van Main? Daar is 'n uitdruk Kol. Ek is uit te druk twee heelgetalle. Ek druk die inhoud van A en die inhoud van B vierkante bracket 0. Stop die video hier en neem 'n minuut. Kan jy uitvind wat dit funksie sal druk op die einde? Hopelik, as jy onthou die onderskeid tussen verbygaan waarde en verby deur verwysing, hierdie probleem was nie te moeilik vir jou. En die antwoord wat jy sou gevind het is dit. As jy nie seker as om waarom dit die geval is, neem 'n tweede, gaan terug, te hersien wat ek was net bespreek oor die verbygaan skikkings deur verwysing, versus verby ander veranderlikes volgens waarde en hopelik sal dit maak 'n bietjie meer sin. Ek is Doug Lloyd, en dit is CS50.