12 Flerdimensionella arrayer
En array (ett fält) i en dimension har vi sett tidigare. Syntaxen ser ut såhär
int[] a = new int[10];
och vi kan visualisera arrayen på detta vis:
Om vi istället går över till två dimensioner så kan vi använda liknande syntax men med några förändringar. En tvådimensionell array med storleken 5x3
(av typen heltal) skapar vi med
int[,] b = new int[5,3];
Ett kommatecken mellan de första hakparanteserna anger att det är fråga om två dimensioner. I den andra hakparantesen anger första siffra storleken på första dimensionen (bredden) och andra siffran storleken på andra dimensionen (höjden). Vi kan tänka oss den tvådimensionella arrayen som en matris.
För att komma åt ett visst element (för att t.ex. läsa av eller ändra ett värde) måste vi ange två positioner (koordinater).
[3,1] = 5; b
En tvådimensionell array har alltså två siffror för sitt index. Båda räknar fortfarande från 0, dvs. i arrayen b
som vi deklarerade ovan så finns index 0-4 i ena dimensionen och 0-2 i den andra.
Om storleken på en flerdimensionell array är okänd kan vi ta reda på den genom GetLength()
(inte bara Length
) och i parantesen ange ordningsnumret på den dimension man vill undersöka. Dessa nummer börjar också räknas från 0, precis som index. Om vi t.ex. ska loopa igenom matrisen b
och stoppa in slumpade tal mellan 1 och 100 på varje position kan vi göra såhär:
int[,] b = new int[5,3];
= new Random();
Random slump for (int i = 0; i < b.GetLength(0); i++)
{
for (int j = 0; j < b.GetLength(1); j++)
{
[i,j] = slump.Next(1, 101);
b}
}
12.1 Array av arrayer
Det gäller att inte blanda ihop flerdimensionell array med arrayer av arrayer. Om vi t.ex. har en sträng s
string s = "En apa och en katt, vilken underbar skatt!";
och sedan kör Split
på den
string[] c = s.Split();
så kan vi inte komma åt första bokstaven i första ordet med c[0,0]
utan måste ta till c[0][0]
. Vi kan tänka oss att strängarrayen c (med dess char-arrayer) ser ut såhär:
Med andra ord gäller det att “den andra dimensionen” är olika stor för olika positioner i den första dimensionen, något som inte är sant för en matris.
12.2 Initialisera flerdimensionell array
Om vi vill tilldela värdet till en flerdimensionell array direkt vid deklaration gäller det att sätta måsvingarna {}
på rätt plats. Om en 3x3
-matris ska fyllas med talen 1-9 kan det se ut såhär:
int[,] d =
{
{1,2,3},
{4,5,6},
{7,8,9}
};
Med andra ord är det en upprepning av hur vi gör för att fylla en endimensionell array med ett par extra måsvingar som start och slut.
12.3 Ytterligare dimensioner
Om vi vill ha fler dimensioner är det bara att lägga till fler kommatecken i vår syntax! En tredimensionell array kan t.ex. skapas med
int[,,] e = new int[3,4,5];
Och vi kan då tänka oss att strukturen ser ut ungefär såhär:
För att komma åt storleken (om den skulle vara okänd) på den tredje dimensionen får vi i så fall använda oss av e.GetLength(2)
.
12.4 Övningar
-
Skapa följande matris. Summera sedan samtliga tal och skriv ut till skärmen.
int[,] tal = { { 3, 3, 9, 4, 3 }, { 5, 2, 1, 9, 8 }, { 6, 1, 8, 6, 7 }, { 5, 9, 5, 4, 8 }, { 4, 5, 1, 8, 8 } };
Återanvänd datan ifrån uppgift 33 men beräkna nu istället summan kolumn för kolumn och skriv ut till skärmen. Med andra ord ska du skriva ut fem olika summor.
Skapa en
3x3
-matris av typenbool
. Sätt in värdettrue
på två godtyckliga ställen ochfalse
på resten. Låt sedan användaren “spela” genom att skriva in koordinater och gissa vartrue
-värdena finns. Skriv ut antal gissningar som krävdes och avsluta programmet när båda värdena har hittats.-
I matrisen nedan betecknas levande cell med
*
och död cell med mellanslag. Skriv ett program som beräknar vilken cell som har flest levande grannar. En cell kan maximalt ha 8 grannar.char[,] celler = { { ' ', '*', ' ', ' ', ' ', '*', ' ', ' ', ' ', '*' }, { ' ', '*', ' ', ' ', ' ', ' ', '*', ' ', ' ', '*' }, { '*', '*', '*', ' ', ' ', ' ', ' ', ' ', '*', ' ' }, { ' ', ' ', '*', '*', '*', '*', ' ', ' ', '*', ' ' }, { ' ', '*', ' ', ' ', ' ', '*', ' ', ' ', ' ', ' ' }, { ' ', '*', '*', ' ', '*', ' ', ' ', ' ', '*', ' ' }, { '*', '*', '*', ' ', ' ', ' ', '*', ' ', ' ', '*' }, { '*', '*', ' ', '*', ' ', ' ', ' ', '*', ' ', ' ' }, { ' ', '*', ' ', ' ', ' ', ' ', ' ', '*', ' ', ' ' }, { ' ', '*', ' ', ' ', ' ', '*', '*', '*', ' ', ' ' }, };
Utöka ditt program från uppgift 36 och lägg till så att levande celler slumpas på exakt 30 celler. Få programmet att skriva ut matrisen i konsollen och sedan beräkna samt skriva ut hur många grannar cellen med flest grannar har (inklusive cellens koordinater).