[MUSIK SPELA] DOUG LLOYD: Okej. Att arbeta med enkel variabler är ganska kul. Men vad händer om vi vill arbeta med många variabler, men vi vill inte ha en massa olika namn flyger runt vår kod? I detta fall, arrayer är kommer att komma i riktigt händig. Arrayer är en riktigt grundläggande uppgifter struktur för alla programmeringsspråk att du kommer att använda. Och de är riktigt, riktigt bra, särskilt som vi får se i CS 50. Vi använder arrayer för att hålla värden av samma datatyp på intilliggande minnesplatser. Det vill säga, det är en sätt som vi kan gruppera ett gäng heltal tillsammans minne eller ett gäng tecken eller flyter i minnet verkligen nära varandra och arbeta med dem utan att behöva ge varje ett eget unikt namn, som kan få besvärligt efter en liten stund. Nu, ett sätt att analogize arrayer är att tänka på din lokal postar kontor för en sekund. Så steg bort från programmering och bara blunda och visualisera i ditt sinne ditt lokala postkontor. Vanligtvis i de flesta inlägg kontor, det finns en stor bank en postboxar på väggen. En array är en jätte-block sammanhängande minne, på samma sätt som en post bank i postkontoret är ett stort utrymme på vägg av postkontoret. Arrayer har uppdelad i små, identiskt stora block av utrymme, vilka var och en kallas ett element, i på samma sätt att väggen av stolpen kontor har uppdelad i små, identiskt stora block av utrymme, som vi kallar en postbox. Varje element i arrayen kan lagra en viss mängd data, precis som varje postbox kan att hålla en viss mängd post. Vad som kan lagras i varje element i matrisen är variabler av samma data typ, såsom int eller char, bara som i ditt postbox, du kan bara passa saker av en liknande typ, såsom bokstäver eller små förpackningar. Slutligen kan vi komma åt varje del av arrayen direkt efter indexvärde, precis som vi kan få tillgång till vår postkontoret box genom att känna sin brevlåda. Förhoppningsvis analogi som hjälper dig att få ditt huvud kring idén om matriser av analogizing till något annat att du förmodligen redan är bekant med. I C, elementen i en array är indexeras med utgångspunkt från 0, inte från en. Och det är verkligen viktigt. Och i själva verket är detta anledningen till att vi, i CS 50, och varför datavetare ofta kommer att räknas från 0, är på grund av C: s array indexering, som alltid börjar på 0. Så om en matris består av n element, det första elementet i den matris ligger på index 0, och det sista elementet i arrayen ligger vid index n minus ett. Återigen, om det finns n element i vår array, är det sista indexet n minus 1. Så om vår array har 50 element, de första elementet ligger på index 0, och det sista elementet ligger på index 49. Tyvärr, eller lyckligtvis, beroende på ditt perspektiv, C är mycket mildare här. Det kommer inte att hindra dig från att gå out of bounds på din array. Du kan komma åt minus 3 del av din samling eller den 59: e del av din samling, Om din array har endast 50 element. Det kommer inte att sluta ditt program från sammanställa, men vid körning, du kan stöta på en fruktade segmente fel Om du börjar att få tillgång till minne som ligger utanför gränserna för vad du bad ditt program för att ge dig. Så var försiktig. Vad gör en array deklaration ser ut? Hur kan vi koda en array till existens som vi koda någon annan variabel? Det finns tre delar till en matris declaration-- en typ, ett namn, och en storlek. Detta är mycket likt en variabel deklaration, som är bara en typ och ett namn, storleken elementet är specialfallet för en array, eftersom vi får ett gäng av dem på samma gång. Så typen är vilken typ av variabel du vill att varje element i arrayen att vara. Vill att det ska en rad heltal? Då bör din datatyp vara int. Vill du att det ska vara en uppsättning av dubblar eller flyter? Datatyp bör vara dubbelt eller flyta. Namnet är vad du vill ringa din array. Vad vill du namnge denna jätte bank av heltal eller flöten eller tecken eller dubbel, eller vad har du? Vad vill du kalla det? Ganska självförklarande. Slutligen, storlek, som går insidan av hakparenteser, är hur många element som du skulle som din array för att innehålla. Hur många heltal vill du ha? Hur många flottar vill du ha? Så till exempel, int student kvaliteter 40. Detta förklarar en array med namnet Student kvaliteter, som består av 40 heltal. Ganska självförklarande, hoppas jag. Här är ett annat exempel. Dubbla priser meny 8. Detta skapar en array med namnet Menyn priser, som består om utrymme i minne för åtta dubbelrum. Om du tänker på varje element av en matris av datatyp-typ, så till exempel, en enda del av en rad av typen int, på samma sätt som du skulle tänka på något annat variabel av typen int, alla de välkända verksamheter som vi diskuterats tidigare i drift video är meningsfullt. Så här kan vi förklara en array av Booleans kallas Truthtable, som består av rum för 10 Booleans. Och sedan, precis som vi kunde bara tilldela ett värde till varje annan variabel av typen Boolean, vi kunde säga något liknande Truthtable hakparentes 2, vilket är hur vi ange vilket element av sanningstabellen? Den tredje delen av den sanningstabell, eftersom kom ihåg, vi räknar från 0. Så det är hur vi anger tredje delen av sanningstabellen. Truthtable 2 är lika med falsk, precis som vi kunde declare-- eller vi kunde överlåta snarare alla Boolean typ variabel för att vara falsk. Vi kan också använda den under förhållanden. if (truthtable 7 == sant), det vill säga, om den åttonde elementet av Truthtable är sant, kanske vi vill skriva ut ett meddelande till användaren, printf ("SANT n!") ;. Det ger oss anledning att säga Truthtable 10 är lika sant, eller hur? Tja, jag kan, men det är ganska farlig, eftersom kom ihåg, vi har en matris med 10 Booleans. Så den högsta index som kompilator har gett oss är 9. Detta program kommer att sammanställa, men om något annat i minnet föreligger när vi skulle förväntar Truthtable 10 att gå, vi kunde drabbas av en segmentering fel. Vi kan komma undan med det, men i allmänhet, ganska farligt. Så vad jag gör här är lagligt C, men inte nödvändigtvis det bästa draget. Nu, när du deklarerar och initiera en array samtidigt, det finns faktiskt en ganska speciell syntax som du kan använda för att fylla upp arrayen med dess utgångsvärden. Det kan bli besvärligt att deklarerar en matris med storlek 100, och sedan har att säga, element 0 motsvarar detta; elementet 1 motsvarar detta; elementet 2 är lika med den. Vad är poängen, eller hur? Om det är en liten samling, du kunde göra något sånt här. Bool truthtable tre lika öppen klammerparentes och sedan komma separera listan av element som du vill sätta i matrisen. Stäng sedan klammerparentes semikolon. Detta skapar en array av storlek tre kallas Truthtable, med inslag falskt, sant och riktigt. Och i själva verket exemplifiering syntax jag har här är exakt samma som att göra den individuellt element syntax. Dessa två sätt att kodning skulle producera exakt samma matris. På liknande sätt skulle vi iterera över alla element av en array med användning av en slinga, som i Faktum är ett mycket starkt rekommenderat at-home träning. Hur skapar du en array av 100 heltal, där varje element i arrayen är dess index? Så till exempel har vi en samling av 100 heltal, och i det första elementet, Vi vill sätta 0. I den andra delen, vill vi sätta ett. I den tredje delen, vi vill ha att sätta 2; och så vidare och så vidare. Det är en riktigt bra at-home motion för att göra det. Här ser det inte som alltför mycket har förändrats. Men märker att mellan hakparenteser, den här gången, Jag har faktiskt utelämnas numret. Om du använder detta mycket speciell instansiering syntax för att skapa en array, du faktiskt inte behöva ange storleken av uppsättningen i förväg. Kompilatorn är smart nog att veta att du faktiskt vill ha en rad storlek 3, eftersom du sätter tre element till höger om likhetstecknet. Om du hade lagt fyra, skulle det ha gett dig en sanningstabell storlek fyra; och så vidare och så vidare. Arrayer är inte begränsade till en enda dimension, som är ganska coolt. Du kan faktiskt ha så många sidospecifice som du önskar. Så till exempel, om du vill skapa en styrelse för spelet Battleship, som Om du någonsin spelat, är ett spel som är lekte med pinnar på 10 av 10 rutnät, du kan skapa en array som denna. Man kan säga Bool slagskepp hakparentes 10 sluten hakparentes kvadrat konsol 10 stängd hakparentes. Och sedan kan du välja att tolka detta i ditt sinne som en 10 med 10 rutnät av celler. Nu, i själva verket, i minne, det verkligen bara förbli ett 100 element, enda dimensionell array. Och detta i själva verket gäller om du har tre dimensioner eller fyra eller fem. Det är verkligen bara inte föröka alla av indices-- eller alla av storleken specifiers-- tillsammans, och du bara få en endimensionell array med den storleken. Men när det gäller organisation och visualisering och mänsklig perception, det kan vara en mycket enklare att arbeta med ett rutnät Om du arbetar på ett spel som Tre i rad eller slagskepp, eller något sådant. Det är en stor abstraktion, istället för att ha att tänka på en Tre i rad styrelsen som en linje av nio torg eller en slagskepp styrelse som en linje av 100 rutor. En 10 av 10 rutnät eller tre genom tre rutnät är förmodligen mycket lättare att uppfatta. Nu, något riktigt viktigt om arrayer. Vi kan behandla varje enskild element i arrayen som en variabel. Vi såg att tidigare när vi tilldelar värdet True för vissa Booleans eller testa dem i villkors. Men vi kan inte behandla hela samlingama sig som variabler. Vi kan till exempel inte tilldela en array till en annan array med uppdraget operatör. Det är inte lagligt C. Om vi ​​vill, för example-- vad vi skulle göra i detta exempel skulle vara att kopiera en matris till en annan. Om vi ​​vill göra det, vi faktiskt behöver använda en slinga för att kopiera över varje enskilt element en i taget. Jag vet att det är lite tidskrävande. Så till exempel, om vi hade dessa par rader kod, skulle detta arbete? Tja, nej, skulle det inte, eller hur? Eftersom vi försöker att tilldela mat till baren. Det kommer inte att fungera, eftersom det är en array, och vi just beskrivit att det inte är lagligt C. Istället, om vi vill kopiera innehållet i livsmedel i bar, vilket är vad vi försöker göra här, Vi skulle behöva en syntax som denna. Vi har en for-loop som går från J är lika med 0 till 5, och vi inkrementera J på varje iteration av slingan och tilldela element som. Detta skulle resultera i bar också vara en, två, tre, fyra, fem, men vi måste göra det här mycket långsam inslag-by-elementet sätt, i stället för genom att bara kopiera hela uppsättningen. I andra program språk, modernare, du kan faktiskt göra just Så enkelt är lika med syntax. Men C, tyvärr, vi är inte tillåtet att göra det. Nu finns det en annan jag vill nämna om arrayer som kan vara lite lite knepigt första gången du arbeta med dem. Vi diskuterade i en video om variabel omfattning, att de flesta variabler i C, när du ringer dem funktioner, passeras av värde. Minns du vad det betyder att passera något av värde? Det betyder att vi gör en kopia av variabel som är passeras i. Den uppringda funktionen, funktionen som är mottagande variabeln, inte får variabeln själv. Det blir en egen lokal kopia av den att arbeta med. Arrayer, naturligtvis, göra inte följa denna regel. Snarare, vad vi kallar detta passerar genom hänvisning. Den uppringda faktiskt tar emot uppsättningen. Det tar inte emot sin egen lokal kopia av det. Och om du tycker om det, gör denna mening. Om arrayer är riktigt stora, det tar så mycket tid och ansträngning att göra en kopia av en grupp av 100 eller 1000 eller 10.000 element, att det inte är värt det för en fungera för att få en kopia av det, göra en del arbete med det, och sedan bara göras med kopian; Det behöver inte ha det hängande runt längre. Eftersom matriser är några skrymmande och besvärliga, vi bara förbi dem som referens. Vi litar bara denna funktion att inte bryta något. Så det gör faktiskt få arrayen. Det kan inte bli sin egen lokala kopia av den. Så vad betyder det, då, när den uppringda manipulerar uppsättningens element? Vad händer? Nu ska vi glans över varför just denna händer, varför arrayer förs genom hänvisning och allt annat passeras av värde. Men jag lovar dig, vi kommer tillbaka och ge dig svaret till detta i ett senare video. Här är en mer motion för dig innan vi avsluta saker på arrayer. Den massa kod här, det är inte särskilt bra stil, bara att jag ska göra det varning. Det finns inga kommentarer här, vilket är ganska dålig form. Men det är bara för att jag ville vara kunna passa allt på skärmen. På toppen kan du se att jag har två funktionsdeklarationer för areal array och ställa in int. Ställ array tar tydligen en array av fyra heltal som dess ingång. Och set int tydligen tar en enda heltal som dess ingång. Men båda av dem inte har en utgång. Utgången avkastningen typ av var och en är ogiltig. I Main, vi har en par rader kod. Vi förklarar en heltalsvariabel kallad A och tilldela det värdet 10. Vi deklarerar en matris med fyra heltal kallas B och tilldela elementen 0, 1, 2, och 3, respektive. Då har vi ett samtal för att ställa in int och en uppmaning att ställa array. Definitionerna av set array och set int är nere på botten. Och så, återigen, jag ber er frågan. Vad får skrivas ut här i slutet av Main? Det finns en utskrift col. Jag är utskrift av två heltal. Jag skriva ut innehållet i A och innehållet i B hakparentes 0. Pausa videon här och ta en minut. Kan du räkna ut vad detta Funktionen kommer ut i slutet? Förhoppningsvis, om du minns åtskillnad mellan passerar värde och passerar genom hänvisning, detta Problemet var inte alltför svårt för dig. Och svaret du skulle har funnit är det här. Om du inte är riktigt säker på att varför så är fallet, ta en andra, gå tillbaka, gå igenom vad jag var bara diskuterar om passerande arrayer genom hänvisning, jämfört med att passera andra variabler av värde, och förhoppningsvis kommer det göra lite mer meningsfullt. Jag är Doug Lloyd, och detta är CS50.