>> [Musik spiller]
DOUG LLOYD: Okay.
Arbejde med enkelt variabler er temmelig sjovt.
Men hvad nu, hvis vi ønsker at arbejde med en masse af variabler,
men vi ønsker ikke at have en flok forskellige navne flyver rundt vores kode?
I dette tilfælde er arrays vil komme i virkelig handy.
Arrays er en virkelig grundlæggende data struktur for alle programmeringssprog
at du vil bruge.
Og de er virkelig, virkelig nyttige, især, som vi vil se, i CS 50.
>> Vi bruger arrays til at holde værdier af samme datatype
på tilgrænsende lagerpladser.
Det vil sige, det er en måde, at vi kan gruppere
en flok af heltal sammen i hukommelse eller en flok tegn
eller flyder i hukommelsen virkelig tæt sammen og arbejde
med dem uden at skulle give hver man sit eget unikke navn, som kan
få besværlige efter et lille stykke tid.
>> Nu, at én måde analogize arrays er at tænke over dit lokale indlæg
kontor for en anden.
Så skridt væk fra programmering og bare lukke øjnene
og visualisere i dit sind dit lokale posthus.
Normalt i de fleste indlæg kontorer, der er en stor bank
et postkontor bokse på væggen.
>> Et array er en kæmpe blok af sammenhængende hukommelse,
på samme måde som en e-mail bank i dit posthus
er en stor plads på mur af posthuset.
Arrays er blevet opdelt i små, identisk størrelse blokke af rummet,
der hver især kaldes et element i på samme måde, at væggen af ​​posten
kontor er blevet opdelt i små, identisk størrelse blokke af rummet,
som vi kalder en postboks.
Hvert element i arrayet kan lagre en vis mængde data,
ligesom hver postboks er i stand at holde en vis mængde af post.
>> Hvad kan lagres i hvert element i arrayet er variabler af de samme data
type, såsom int eller char, lige ligesom i din postboks,
du kan kun passer tingene af en lignende type,
såsom bogstaver eller små pakker.
Endelig kan vi få adgang til hvert element i array direkte ved indeksnummer,
ligesom vi kan få adgang til vores posthus kasse ved at vide sin mailboks nummer.
Forhåbentlig denne analogi hjælper dig med at få dit hoved
omkring ideen om arrays af analogizing til noget andet
at du er sandsynligvis allerede er bekendt med.
>> I C, elementerne i et array er indekseret startende fra 0, ikke fra en.
Og det er virkelig vigtigt.
Og i virkeligheden, det er derfor, vi i CS 50, og hvorfor dataloger ofte
vil tælle fra 0, er på grund af C'er matrix
indeksering, som altid starter ved 0.
Så hvis en matrix består af n elementer, det første element i denne matrix
ligger ved indeks 0, og det sidste element i arrayet
ligger ved indeks n minus 1.
Igen, hvis der er n elementer i vores array, sidste indekset er n minus 1.
>> Så hvis vores matrix har 50 elementer, de første element ligger ved indeks 0,
og det sidste element ligger ved indeks 49.
Desværre, eller heldigvis, afhængig af dit perspektiv,
C er meget mildere her.
Det vil ikke forhindre dig i at gå ud af grænserne for dit array.
Du kunne få adgang til minus 3 element i dit array
eller den 59. element i dit array, hvis dit array kun har 50 elementer.
Det vil ikke stoppe dit program fra kompilering, men under kørslen,
du kan støde på en frygtede segmentering fejl
hvis du begynder at få adgang til hukommelsen der ligger uden for rammerne af, hvad
du bedt om dit program til at give dig.
Så vær forsigtig.
>> Hvad betyder et array erklæring ud?
Hvordan kan vi kode et array i eksistens ligesom vi kode enhver anden variabel?
Der er tre dele til en matrix declaration-- en type, et navn,
og en størrelse.
Dette er meget lig en variabel erklæring, som
er bare en type og et navn, størrelsen element er
det særlige tilfælde for et array, fordi vi får en masse af dem
på samme tid.
>> Så den type er, hvad slags variabel, du ønsker hvert element i array til at være.
Må vil have det til et array af heltal?
Derefter skal din datatype være int.
Har du ønsker det skal være et vifte af doubler eller flåd?
Datatype skal være dobbelt eller flyde.
Navnet er, hvad du ønsker at ringe til din array.
Hvad ønsker du at navngive denne kæmpe bank af heltal eller flåd eller chars
eller doubler, eller hvad har du?
Hvad vil du kalde det?
Temmelig selvforklarende.
>> Endelig størrelse, der går indersiden af ​​firkantede parenteser,
er, hvor mange elementer du ville ligesom din array til at indeholde.
Hvor mange heltal vil du have?
Hvor mange flydere vil du have?
>> Så for eksempel, int studerendes kvaliteter 40.
Dette erklærer et array kaldet Student kvaliteter, som består af 40 tal.
Temmelig selvforklarende, håber jeg.
Her er et andet eksempel.
Dobbelt menuen priser 8.
Dette skaber et array kaldet Priser menu, som består
af plads i hukommelsen til otte dobbeltværelser.
>> Hvis du tænker på hvert element af et array af typen data-type,
så for eksempel, et enkelt element i en vifte af typen int, på samme måde du
ville tænke på noget andet variabel af typen int,
alle de velkendte operationer, vi omtalt tidligere i Operations
video vil give mening.
Så her kunne vi erklære et array af Booleans kaldet Truthtable,
som består af plads til 10 Booleans.
>> Og så, ligesom vi kunne bare tildele en værdi til en anden variabel af typen
Boolean, vi kunne sige noget ligesom Truthtable firkantet beslag
2, som er, hvordan vi angiver, hvilket element af sandheden bordet?
Det tredje element i sandhedstabel, fordi huske,
vi tælle fra 0.
Så det er, hvordan vi angiver tredje element af sandheden bordet.
Truthtable 2 er lig med falsk, ligesom vi kunne declare--
eller vi kunne tildele snarere, enhver Boolean typen variabel til at være falske.
>> Vi kan også bruge det i forhold.
if (truthtable 7 == sand), hvilket vil sige,
hvis den ottende element af Truthtable er sandt,
måske vi ønsker at udskrive en besked til brugeren, printf ("SAND! n") ;.
Det får os til at sige Truthtable 10 lig sandt, ikke?
Tja, jeg kan, men det er temmelig farligt, fordi huske,
Vi har en vifte af 10 Booleans.
Så det højeste indeks, at compiler har givet os er 9.
>> Dette program vil kompilere, men hvis noget andet i hukommelsen
foreligger, når vi ville forventer Truthtable 10 til at gå,
vi kunne lide en segmentering fejl. Vi kunne slippe afsted med det, men generelt,
temmelig farlige.
Så hvad jeg laver her er lovlig C, men ikke nødvendigvis det bedste spil.
Nu, når du erklærer og initialisere et array samtidigt,
der er faktisk en temmelig speciel syntaks, som du
kan bruge til at fylde array med sine startværdier.
Det kan få besværlige at erklære en bred vifte af størrelse 100,
og derefter er nødt til at sige, element 0 lig dette; element 1 er lig dette;
element 2 er lig med det.
Hvad er pointen, ikke?
>> Hvis det er et lille array, du kunne gøre noget som dette.
Bool truthtable 3 lig åben krøllede klammeparentes og derefter komma
adskille liste over elementer, at du ønsker at sætte i arrayet.
Luk derefter krøllet tandbøjle semikolon.
Dette skaber et array af størrelse tre kaldet Truthtable,
med elementer falsk, sandt, og sandt.
Og faktisk instantiering syntaks jeg har her, er
nøjagtigt det samme som at gøre det enkelt element syntaks nedenfor.
Disse to måder at kodning ville producere nøjagtig samme array.
>> Tilsvarende kunne vi gentage over hele elementerne
af et array ved hjælp af en løkke, som i Faktisk er en meget stærkt anbefalet
at-home øvelse.
Hvordan skaber man et array af 100 heltal, hvor
hvert element i array er sit indeks?
Så for eksempel, har vi en vifte af 100 heltal, og i det første element,
Vi ønsker at sætte 0.
I det andet element, vi ønsker at sætte 1.
I det tredje element, vi ønsker at sætte 2; og så videre og så videre.
Det er en rigtig god at-home øvelse at gøre det.
>> Her ser det ikke som for meget har ændret sig.
Men se, at i mellem kantede parenteser, denne gang,
Jeg har faktisk udeladt nummeret.
Hvis du bruger denne meget særlige instantiering
syntaks for at skabe en array, du faktisk ikke
skal angive størrelsen af opstillingen på forhånd.
Den compiler er smart nok at vide, at du rent faktisk
ønsker en bred vifte af størrelse 3, fordi du lægger tre elementer
til højre for lighedstegnet.
Hvis du havde sat fire, ville det have givet dig en sandhed tabel med størrelsen fire;
og så videre og så videre.
>> Arrays er ikke begrænset til en enkelt dimension, som er ret cool.
Du kan faktisk have så mange side beregnere, som du ønsker.
Så for eksempel, hvis du vil oprette en bestyrelse for spillet Battleship, som,
hvis du nogensinde spillet, er et spil, der er legede med pinde på 10 med 10 grid,
man kunne skabe en række som denne.
Man kan sige Bool slagskib firkantede beslag 10
lukket firkantet beslag firkantet beslag 10 lukket firkantet beslag.
>> Og så kan du vælge at fortolke dette i dit sind som en 10
med 10 gitter af celler.
Nu, i virkeligheden, i hukommelsen, det virkelig bare
forbliver en 100 element, enkelt dimensionelle array.
Og det i virkeligheden går efter, hvis du har tre dimensioner eller fire eller fem.
Det er virkelig bare gør formere alle de indices--
eller alle størrelse specifiers-- sammen,
og du bare få en endimensional array af denne størrelse.
>> Men med hensyn til organisation og visualisering og menneskelig perception,
det kan være en hel del lettere at arbejde med et gitter
Hvis du arbejder på et spil ligesom Kryds og bolle eller slagskib,
eller sådan noget.
Det er en stor abstraktion, i stedet for at
at tænke på en Kryds og bolle bestyrelsen som en linje af ni
firkanter eller et slagskib bord som en linje af 100 kvadrater.
En 10 ved 10 gitter eller en tre med tre gitter er sandsynligvis
meget mere let at opfatte.
>> Nu noget virkelig vigtigt om arrays.
Vi kan behandle hver enkelt element i arrayet som en variabel.
Vi så, at tidligere da vi tildele
værdien Sand til visse Booleans eller teste dem i betingede.
Men vi kan ikke behandle hele arrays sig som variable.
Vi kan for eksempel ikke, tildele en vifte til et andet array ved hjælp af opgaven
operatør.
Det er ikke lovligt C.
>> Hvis vi vil, for example-- hvad vi ville gøre i dette eksempel
ville være muligt at kopiere en matrix til en anden.
Hvis vi ønsker at gøre det, vi faktisk nødt til at bruge en løkke til at kopiere løbet
hvert enkelt element én ad gangen.
Jeg ved det er lidt tidskrævende.
>> Så for eksempel, hvis vi havde disse par af linjer kode, ville dette arbejde?
Nå, nej, ville det ikke, vel?
Fordi vi prøver at tildele mad til bar.
Det kommer ikke til at fungere, fordi det er et array,
og vi lige har beskrevet at det ikke er lovligt C.
>> I stedet hvis vi ønsker at kopiere indholdet af mad
i bar, som er det vi prøver at gøre her,
Vi ville have en syntaks som denne.
Vi har en for-løkke, der går fra J er lig med 0 til 5,
og vi tilvækst J på hver iteration af løkken og tildele elementer som.
Dette ville resultere i bar også være en, to, tre, fire, fem,
men vi er nødt til at gøre det på denne meget langsom element-by-element måde,
i stedet for ved blot kopiere hele array.
I andre programmering sprog, mere moderne dem,
du kan faktisk gøre netop så simpelt er lig syntaks.
Men C, desværre, vi er ikke lov til at gøre det.
>> Nu er der er en anden ting, jeg vil nævne
om arrays, der kan være lidt smule tricky, første gang du
arbejde med dem.
Vi diskuterede i en video om variabel rækkevidde,
at de fleste variabler i C, når du kalder dem i funktioner, træffes ved værdi.
Kan du huske, hvad det betyder at passere noget ved værdi?
Det betyder, at vi laver en kopi af variabel, der bliver vedtaget i.
Kalderlisten funktion, funktionen der er modtager den variable,
ikke får den variable selv.
Det får sin egen lokale kopi af det at arbejde med.
>> Arrays, selvfølgelig, gøre ikke følger denne regel.
Snarere, hvad vi kalder det passerer som reference.
Callee faktisk ikke modtager array.
Det betyder ikke modtager sin egen lokale kopi af den.
Og hvis du tænker over det, det giver mening.
Hvis arrays er virkelig store, det tager så meget tid og kræfter
at lave en kopi af en vifte af 100 eller 1000 eller 10.000 elementer,
at det ikke er værd for en funktion til at modtage en kopi af det,
gøre noget arbejde med det, og derefter bare gøres med kopien;
det behøver ikke at have det hængende rundt længere.
>> Fordi arrays er nogle klodsede og besværlige,
vi bare videregive dem som reference.
Vi har lige tillid til, at funktionen til, ikke bryder noget.
Så det gør faktisk få array.
Det bliver ikke sin egen lokale kopi af den.
>> Så hvad betyder det, så, når callee
manipulerer elementer i array?
Hvad der sker?
For nu, vil vi glans løbet hvorfor netop dette
sker, hvorfor arrays videregives ved henvisning
og alt andet er gået i værdi.
Men jeg lover dig, vil vi vende tilbage og give dig svaret
til dette i en senere video.
>> Her er endnu en øvelse for dig før vi wrap op ting på arrays.
Bundt af koden her, det er ikke særlig god stil,
bare jeg vil gøre, at advarsel.
Der er ingen kommentarer herinde, som er temmelig dårlig form.
Men det er kun fordi jeg ønskede at være stand til at passe alt på skærmen.
>> Øverst kan du se, at jeg har to funktions angivelser til sæt-array
og sæt int.
Set matrix tilsyneladende tager et array fire heltal som sit input.
Og sæt int tilsyneladende tager en enkelt heltal som sit input.
Men begge af dem har ikke en udgang.
Udgangen, afkastet skriver, af hver enkelt er ugyldig.
I Main, har vi en par linjer kode.
Vi erklærer en heltalsvariabel kaldet A og tildele den værdien 10.
Vi erklærer en vifte af fire heltal kaldet B og tildele elementerne 0, 1,
2 og 3, henholdsvis.
Så har vi en opfordring til at indstille int og en opfordring til at indstille array.
Definitionerne af sæt array og sæt int er nede, nederst.
>> Og så, igen, jeg spørger dig spørgsmålet.
Hvad der bliver udskrevet her i slutningen af ​​Main?
Der er en udskrift col. Jeg er udskrive to heltal.
Jeg udskrive indholdet af A og indholdet af B firkantede beslag 0.
Pause videoen her og tage et minut.
Kan du regne ud, hvad dette funktion udskrives i slutningen?
Forhåbentlig hvis du husker den skelnen mellem forbifarten efter værdi
og passerer som reference, dette problemet ikke var for svært for dig.
Og det svar, du ville har fundet er dette.
Hvis du ikke er helt sikker på at hvorfor det er tilfældet, tage et andet,
gå tilbage, gennemgå, hvad jeg var bare diskutere om passerer arrays
som reference, versus passerer andre variable ved værdi,
og forhåbentlig vil det gøre lidt mere mening.
>> Jeg Doug Lloyd, og det er CS50.