>> [MUSIC SPILLE]
DOUG LLOYD: All right.
Arbeide med singel variabler er ganske morsomt.
Men hva hvis vi ønsker å jobbe med en rekke variabler,
men vi ønsker ikke å ha en haug med forskjellige navn flyr rundt vår kode?
I dette tilfellet, arrays er skal komme i virkelig hendig.
Arrays er en veldig grunnleggende data struktur for alle programmeringsspråk
som du vil bruke.
Og de er veldig, veldig nyttig, spesielt, så vi får se, i CS 50.
>> Vi bruker arrays for å holde verdier av de samme datatype
på sammenhengende minnesteder.
Det vil si, det er en måte at vi kan gruppere
en haug av heltall sammen i minne eller en haug med karakterer
eller flyter i minnet egentlig tett sammen og arbeid
med dem uten å måtte gi hver man sin egen unike navn, som kan
får etter en liten stund tungvint.
>> Nå, en måte å analogize arrays er å tenke på din lokale post
kontor for en andre.
Så gå bort fra programmering og bare lukke øynene
og visualisere i tankene dine ditt lokale postkontor.
Vanligvis, i de fleste post kontorer, det er en stor bank
Et postkontor bokser på veggen.
>> En matrise er en gigantisk blokk av sammenhengende minne,
på samme måte som en post bank i ditt postkontor
er en stor plass på vegg av postkontoret.
Arrays har blitt delt opp i små, identisk store blokker med plass,
som hver er kalt et element, i på samme måte som veggen av stolpen
Kontoret har blitt delt opp i små, identisk store blokker med plass,
som vi kaller en postboks.
Hvert element i matrisen kan å lagre en viss mengde data,
akkurat som hver postboks er i stand å holde en viss mengde av e-post.
>> Hva som kan lagres i hvert element av matrisen er variable med samme data
type, for eksempel int eller røye, bare som i ditt postkontor boksen,
du kan bare passe ting av lignende type,
som brev eller små pakker.
Endelig kan vi få tilgang til hvert element i matrisen direkte av indeksnummer,
akkurat som vi kan få tilgang til vår postkontor boksen ved å kjenne sin postkasse.
Forhåpentligvis, som analogi hjelper deg å få hodet
rundt tanken på matriser av analogizing til noe annet
at du er sannsynligvis allerede er kjent med.
>> I C, elementene i en matrise er indeksert fra 0, og ikke fra en.
Og dette er veldig viktig.
Og faktisk, dette er grunnen til at vi, i CS 50, Og hvorfor dataforskere ofte
vil telle fra 0, er på grunn av C fylking
indeksering, som alltid starter på 0.
Så hvis en matrise består av n elementer, det første elementet i den oppstillingen
ligger ved indeks 0, og det siste element i matrisen
ligger ved indeks n minus en.
Igjen, hvis det er n elementer i vår array, er den siste indeksen n minus en.
>> Så hvis vår rekke har 50 elementer, de første element er plassert ved indeks 0,
og det siste elementet ligger på indeks 49.
Dessverre, eller heldigvis, avhengig av perspektiv,
C er svært skånsom her.
Det vil ikke hindre deg fra går ut over grensene for ditt array.
Du kan få tilgang til minus 3 element av klyngen
eller den 59. element i array, hvis matrisen bare har 50 elementer.
Det vil ikke stoppe programmet fra kompilering, men under kjøring,
du kan støte på en fryktede segmentering feil
hvis du begynner å få tilgang til minne som er utenfor grensene for hva
du spurte programmet å gi deg.
Så vær forsiktig.
>> Hva gjør en matrise erklæring se ut?
Hvordan kode vi en matrise til eksistens som vi kode noen annen variabel?
Det er tre deler til en matrise declaration-- en type, et navn,
og en størrelse.
Dette er svært lik en variabeldeklarasjon, som
er bare en type og et navn, størrelsen element blir
det spesielle tilfellet for en matrise, fordi vi får en haug av dem
samtidig.
>> Så den typen er hva slags variable deg vil hvert element i matrisen skal være.
Vil det til en rekke heltall?
Deretter bør du datatypen være int.
Ønsker du at det skal være en utvalg av doble eller flyter?
Datatype bør være dobbelt eller flyte.
Navnet er det du ønsker å ringe til array.
Hva vil du kalle denne giganten bank av heltall eller flyter eller chars
eller dobler, eller hva har du?
Hva vil du kalle det?
Ganske selvforklarende.
>> Til slutt, størrelse, som går innsiden av hakeparenteser,
er hvor mange elementer du ville som din array å inneholde.
Hvor mange heltall vil du ha?
Hvor mange flyter vil du ha?
>> Så for eksempel int student karakterer 40.
Dette erklærer en matrise som heter Student karakterer, som består av 40 tall.
Ganske selvforklarende, håper jeg.
Her er et annet eksempel.
Doble menyen priser 8.
Dette skaper en matrise som kalles Menyen priser, som består
plass i minnet for åtte dobles.
>> Hvis du tenker på hvert element av en oppstilling av type data-typen,
så for eksempel, et enkelt element av en rekke av type int, på samme måte som du
ville tenke på noe annet variabel av type int,
alle de kjente operasjoner som vi diskutert tidligere i drifts
Videoen vil være fornuftig.
Så her, kan vi erklære en matrise av Booleans kalt Truthtable,
som består av plass til 10 Booleans.
>> Og så, akkurat som vi bare kunne tildele en verdi til en annen variabel av typen
Boolean, vi kunne si noe som Truthtable hakeparentes
2, som er hvordan vi viser, som element av sannhet bordet?
Det tredje element i sannhet tabellen, fordi husk,
vi teller fra 0.
Så det er hvordan vi angir tredje element i sannhetstabellen.
Truthtable to lik falske, akkurat som vi kunne declare--
eller vi kan tildele, heller, noe Boolsk type variabel å være falsk.
>> Vi kan også bruke den i forhold.
if (truthtable 7 == true), det vil si,
hvis den åttende element av Truthtable er sant,
kanskje vi ønsker å skrive ut en melding for brukeren, printf ("TRUE! n") ;.
Det får oss til å si Truthtable 10 lik sant, ikke sant?
Vel, jeg kan, men det er ganske farlig, fordi husk,
Vi har en rekke 10 Booleans.
Så den høyeste indeksen at kompilatoren har gitt oss er ni.
>> Dette programmet vil kompilere, men hvis noe annet i minnet
finnes der vi ville forvente Truthtable 10 for å gå,
vi kunne lide en segmentering feil. Vi kan komme unna med det, men generelt,
ganske farlig.
Så det jeg gjør her er lovlig C, men ikke nødvendigvis det beste trekket.
Nå, når du deklarerer og initial en rekke samtidig,
det er faktisk en ganske spesiell syntaks som du
kan brukes til å fylle opp matrisen med sine startverdier.
Det kan bli tungvint å erklære en rekke størrelse 100,
og deretter har å si, element 0 tilsvarer dette; element 1 tilsvarer dette;
element 2 tilsvarer det.
Hva er poenget, ikke sant?
>> Hvis det er et lite utvalg, du kunne gjøre noe sånt som dette.
Bool truthtable tre lik åpen klammeparentes og deretter komma
skille liste av elementer som du ønsker å sette i rekken.
Deretter lukker krøllete brace semikolon.
Dette skaper en rekke størrelse tre kalt Truthtable,
med elementer falske, ekte og sann.
Og faktisk, oppretting syntaks jeg har her er
nøyaktig det samme som gjør enkelt element syntaksen nedenfor.
Disse to måtene å koding would produsere den samme matrisen.
>> På samme måte kan vi veksle i løpet av alle elementene
i en matrise ved hjelp av en løkke, som i sin Faktisk er et meget sterkt anbefalt
at-home trening.
Hvordan skaper du en matrise 100 heltall, der
hvert element i matrisen er indeksen?
Så for eksempel, har vi en rekke 100 heltall, og i det første element,
vi ønsker å sette 0.
I det andre elementet, ønsker vi å sette en.
I den tredje element, vi ønsker å sette to; og så videre og så videre.
Det er en virkelig god hjemme-trening for å gjøre det.
>> Her ser det ikke som for mye har forandret seg.
Men legg merke til at i mellom hakeparenteser, denne gangen
Jeg har faktisk utelatt nummeret.
Hvis du bruker dette svært spesiell oppretting
syntaks for å skape en array, du faktisk ikke
behov for å indikere størrelsen i matrisen på forhånd.
Kompilatoren er smart nok å vite at du faktisk
vil en rekke størrelse 3, fordi du putter tre elementer
til høyre for likhetstegnet.
Hvis du hadde satt fire, ville det ha gitt deg en sannhet tabell med størrelse fire;
og så videre og så videre.
>> Arrays er ikke begrenset til en enkelt dimensjon, som er ganske kult.
Du kan faktisk ha så mange sidebransjen som du ønsker.
Så for eksempel, hvis du ønsker å opprette et bord for spillet Battleship, som,
hvis du noen gang spilt, er et spill som er spilt med knagger på 10 av 10 rutenett,
du kan lage en matrise som dette.
Du kan si Bool slaghakeparentes 10
lukket hakeparentes torget brakett 10 stengt hakeparentes.
>> Og så kan du velge å tolke dette i tankene dine som en 10
ved 10 rutenett av celler.
Nå, i virkeligheten, i minnet, det virkelig bare
forbli en 100 element, enkelt dimensjonal array.
Og dette, faktisk, går for hvis du har tre dimensjoner eller fire eller fem.
Det egentlig bare ikke formere alle de indices--
eller alle av størrelsen specifiers-- sammen,
og du bare få en endimensjonal utvalg av denne størrelsen.
>> Men når det gjelder organisering og visualisering og menneskelig persepsjon,
det kan være mye enklere å arbeide med et rutenett
hvis du jobber med et spill som Tic-tac-toe eller Battleship,
eller noe sånt.
Det er en flott abstraksjon, i stedet for å måtte
å tenke på en Tic-Tac-Toe Styret som en linje av ni
firkanter eller en Battleship bord som en linje på 100 kvadrater.
En 10 med 10 gitter eller en tre med tre rutenett er trolig
mye mer lett å oppfatte.
>> Nå, noe virkelig viktig om arrays.
Vi kan behandle hver enkelt element i matrisen som en variabel.
Vi så at tidligere når vi tilordner
verdien True til visse Booleans eller teste dem i conditionals.
Men vi kan ikke behandle hele Arrays seg som variabler.
Vi kan for eksempel ikke, tildele ett array til en annen array ved hjelp av oppdraget
operatør.
Det er ikke lovlig C.
>> Hvis vi vil, for example-- hva vi skulle gjøre i det eksemplet
ville være å kopiere ett array til et annet.
Hvis vi ønsker å gjøre det, vi faktisk trenger å bruke en løkke til å kopiere over
hvert enkelt element en av gangen.
Jeg vet det er litt tidkrevende.
>> Så for eksempel, hvis vi hadde disse par linjer med kode, ville dette arbeidet?
Vel, nei, det ville ikke, ikke sant?
Fordi vi prøver å tildele mat til bar.
Det kommer ikke til å fungere, fordi det er en matrise,
og vi nettopp beskrev at det ikke er lovlig C.
>> I stedet, hvis vi ønsker å kopiere innholdet i maten
inn i baren, som er hva vi prøver å gjøre her,
vi trenger en syntaks som dette.
Vi har en for loop som går fra J er lik 0 til 5,
og vi øke J på hver iterasjon av løkken og tilordne elementer sånn.
Dette vil resultere i bar også være en, to, tre, fire, fem,
men vi må gjøre det på denne svært langsom element-til-element måte,
i stedet for av bare kopiere hele array.
I annen programmering språk, mer moderne seg,
du kan faktisk gjøre akkurat Så enkelt er lik syntaks.
Men C, dessverre, vi er ikke lov til å gjøre det.
>> Nå er det en annen ting jeg vil nevne
om arrays som kan være litt litt vanskelig den første gangen du
jobbe med dem.
Vi diskuterte i en video om variabel omfang,
at de fleste variabler i C, når du ringer dem i funksjoner, er vedtatt av verdi.
Husker du hva det betyr å passere noe av verdi?
Det betyr at vi gjør en kopi av variabel som blir vedtatt i.
Callee funksjon, funksjonen som er mottatt variabel,
får ikke variabelen selv.
Det får sin egen lokale kopi av det å jobbe med.
>> Arrays, selvfølgelig, gjør ikke følger denne regelen.
Snarere, det vi kaller dette passerer ved henvisning.
Callee faktisk mottar den array.
Det ikke får sin egen lokal kopi av den.
Og hvis du tenker på det, dette er fornuftig.
Hvis arrays er virkelig store, det tar så mye tid og krefter
å lage en kopi av en rekke 100 eller 1000 eller 10.000 elementer,
at det ikke er verdt det for en funksjon for å motta en kopi av den,
gjøre noe arbeid med det, og deretter bare gjøres med copy;
det trenger ikke å ha den hengende rundt lenger.
>> Fordi arrays er noen klumpete og tungvint,
vi bare passere dem som referanse.
Vi stoler på at funksjonen å ikke ødelegge noe.
Så det spiller faktisk får array.
Det blir ikke en egen lokal kopi av den.
>> Så hva betyr dette, så, når callee
manipulerer elementene i matrisen?
Hva skjer?
For nå, vil vi glans om hvorfor akkurat dette
skjer, hvorfor arrays føres ved referanse
og alt annet er vedtatt av verdi.
Men jeg lover deg, vil vi tilbake og gi deg svaret
til dette i en senere video.
>> Her er enda en øvelse for deg før vi pakke inn ting på arrays.
Haug av koden her, det er ikke spesielt god stil,
bare jeg skal gjøre det forbeholdet.
Det finnes ingen kommentarer her inne, som er ganske dårlig form.
Men det er bare fordi jeg ønsket å være stand til å passe alt på skjermen.
>> På toppen kan du se at jeg har to funksjonserklæringer for set utvalg
og satt int.
Set rekke tar tydeligvis en matrise av fire heltall som sin inngang.
Og sett int tar tilsynelatende et enkelt heltall som sin inngang.
Men begge har en utgang.
Utgangen, retur skriver, for hver og en er ugyldig.
I Main, har vi en par linjer med kode.
Vi erklærer et heltall variabel kalt A og tilordne den verdien 10.
Vi erklærer en rekke fire heltall kalt B og tildele elementene 0, 1,
2 og 3, henholdsvis.
Så har vi en samtale for å sette int og en oppfordring til å sette array.
Definisjonene av settet array og sett int er nede, på bunnen.
>> Og så, igjen, spør jeg deg spørsmålet.
Hva blir skrevet ut her på slutten av Main?
Det er en utskrift col. Jeg er skrive ut to heltall.
Jeg skriver ut innholdet av A og innholdet av B hakeparentes 0.
Pause videoen her og ta et minutt.
Kan du finne ut hva dette funksjonen vil skrive ut på slutten?
Forhåpentligvis, hvis du husker Skillet mellom bestått av verdi
og passerer ved referanse, denne Problemet var ikke så vanskelig for deg.
Og svaret du ville har funnet er denne.
Hvis du ikke er helt sikker på at det hvorfor det er tilfelle, ta en andre,
gå tilbake, se hva jeg var bare diskutere om bestått arrays
ved referanse, versus passerer andre variabler av verdi,
og forhåpentligvis vil det gjøre en litt mer fornuftig.
>> Jeg er Doug Lloyd, og dette er CS50.