C# Array (Vektor)
Inledning
Ofta har man behov av att arbeta med långa listor med tal. Istället för att skapa en variabel för varje tal så
är det möjligt att arbeta med en variabel som istället innehåller möjligheten att lagra flera tal. Man kallar
sådana här variabler med "flera fack" för fält, lista eller det engelska uttrycket array. Man kan jämföra dem
med en hylla som har flera, numrerade fack, eller rent av med en gatuadress (gatunamn och husnummer).
För att få tag i ett av de värden man lagrat i listan anger du namnet på variabeln (hyllan, gatunamnet) och
fackets nummer eller index (hyllnummer, husnummer).
Ex.
Tidigare:
Nu:
// Här i deklarationen anger siffran inom hakparenteserna antal element i fältet.

Den senare deklarationen skapar fem "fack" direkt. För att komma åt innehållet i ett "fack" skulle du ju
ange fackets nummer (index), men observera att numreringen börjar på 0, vilket gör att i ett fält med fem
element får du indexnumren 0-4. Säg t.ex. att du vill tilldela det tredje facket värdet 31, vilket du gör med
följande kod:
talserie[2]=31;
OBS! Ingen kontroll sker av ditt värde inom hakparenteserna, så det hänger på dig som programmerare att
vara vaksam. När du kompilerar ditt program säger kompilatorn inget om du skrivit ett för stort index,
t.ex.
talserie[55]=1;
men när du kör programmet är det stor risk att det kraschar. Datorn tar det ställe i minnet där "fack" 55
skulle ha legat om det hade funnits, och då finns det stora chanser till att någonting viktigt för systemet
skrivs över.
Det är inte bara int som kan användas för att skapa fält, utan du kan skapa fält av godtyckliga typer, t.ex.
double[ ] temperaturer = new double[10];
float[ ] medelvärden = new float[3];
string[ ] dagar = new string[7];
Initiera en vektor vid deklarationen
Du kan också initiera ett fält direkt i deklarationen, t ex
int[ ] tal = {4,3,2,1};
Här skulle du kunna utelämna antalet fack i deklarationen och skriva tomma hakparenteser. För här ser
den ju hur många element som fältet består av.
Ett litet exempel med "while"
//Array Ex 1:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Array1
{
class Program
{
static void Main(string[] args)
{
int[ ] lista = new int[5];
int i, summa = 0;
//***** läs in 5 heltal *****
i=0;
while (i < 5)
{
Console.WriteLine(" Ange ett heltal: ");
lista[i] =Convert.ToInt32(Console.ReadLine());
i++;
}
//***** summera de 5 talen och skriv ut summan *****
i = 0;
while (i < 5)
{
summa = summa + lista[i];
i++;
}
Console.WriteLine(" Summan av de 5 talen = " + summa);
//***** öka på de 5 talen med värdet 2 och skriv ut de nya talen *****
i = 0;
while (i < 5)
{
lista[i] += 2;
Console.WriteLine(" Element " + i + " = " + lista[i]);
i++;
}
Console.ReadKey();
}
}
}
For-loop
For-satsen är inget annat än en omskrivning av while som blir något kortare. Den används oftast när vi jobbar med arrayer. For-satsen samlar ihop 3 viktiga inställningar och gör dessa i en parentes. Inställningarna skiljs åt med semikolon.
for (int i=0; i<5; i++) { }
De tre inställningarna:
int i=0 här skapar vi vår räknar-variabel och sätter startvärdet till 0 (om den deklarerats i programmets inledning så behöver vi inte ha med int, dvs bara i=0 ).
i<5 detta är vår test som utförs innan varje varv vi kör (körs om testen är sann) .
i++ detta vår uppräkning som sker efter att ett varv slutförts, just här ökar värdet med exakt ett men vi hade kunnat skriva i+=3 eller i=i+4 eller i-- .
Studera exemplet nedan och jämför med vårt tidigare exempel som gör exakt samma sak fast där använder vi while.
int i;
...
...
i=0;
while (i < 5)
{
Console.WriteLine(" Ange ett heltal: ");
lista[i] = Convert.ToInt32(Console.ReadLine());
i++;
}
...
...
for (i = 0; i < 5; i++)
{
Console.WriteLine(" Ange ett heltal: ");
lista[i] = Convert.ToInt32(Console.ReadLine());
}
Ett litet exempel med "for"
//Array Ex 2:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Array2
{
class Program
{
static void Main(string[] args)
{
int[ ] lista = new int[5];
int i, summa = 0;
//***** läs in 5 heltal *****
for (i = 0; i < 5; i++)
{
Console.WriteLine(" Ange ett heltal: ");
lista[i] = Convert.ToInt32(Console.ReadLine());
}
//***** summera de 5 talen och skriv ut summan *****
for (i = 0; i < 5; i++) summa = summa + lista[i];
Console.WriteLine(" Summan av de 5 talen = " + summa);
//***** öka på de 5 talen med värdet 2 och skriv ut de nya talen *****
for (i = 0; i < 5; i++)
{
lista[i] += 2;
Console.WriteLine(" Element " + i + " = " + lista[i]);
}
Console.ReadKey();
}
}
}
Flerdimensionell array
Vi ser på en 2-dimensionell lista som en matris eller ett rutnär med rader och kolumner. Egentligen ligger informationen i en rad i minnet, det vill säga rad för rad ligger de i minnet. För att bekanta oss med hur vi kan jobba med sådan här lista så studera exemplet nedan. Vi behöver givetvis två variabler som styr oss i listan en för rader och en för kolumner.
//Array Ex 3:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Array3
{
class Program
{
static void Main(string[] args)
{
int[ , ] rutor = new int[5,10];
int r,k;
//***** skriv in tal automatiskt i 2-dim array *****
for (r= 0; r < 5; r++)
{
for (k = 0; k < 10; k++)
{
rutor[r,k] =r*k;
}
}
//***** skriv ut tal *****
for (r= 0; r < 5; r++)
{
for (k = 0; k < 10; k++)
{
if (rutor[r,k]<10)
Console.Write(" " + rutor[r,k] + " ") ;
else
Console.Write(rutor[r, k] + " ");
}
Console.WriteLine();
}
Console.ReadKey();
}
}
}
Bestäm antal element inuti programmet
För att slippa deklarera en lista på 10000 element för att täcka alla möjliga fall så kan det vara elegant att fråga efter hur stor listan ska vara och sedan skapa listan. För att efter detta köra resten av programmet.
//Array Ex 4:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Array4
{
class Program
{
static void Main(string[] args)
{
int i, antal, summa=0;
Console.WriteLine("Ange hur stor 'lista' du vill ha:");
antal = int.Parse(Console.ReadLine());
//Nu när vi vet hur array vi vill ha så deklarerar vi den
int[ ] tal = new int[antal];
//***** läs in heltal *****
for (i = 0; i < antal; i++)
{
Console.WriteLine(" Ange ett heltal: ");
tal[i] = Convert.ToInt32(Console.ReadLine());
}
//***** summera de 5 talen och skriv ut summan *****
for (i = 0; i < antal; i++)
summa = summa + tal[i];
Console.WriteLine(" Summan av de " + antal + " talen = " + summa);
Console.ReadKey();
}
}
}
samt ett liknande exempel med textsträngar
//Array Ex 5:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Array5
{
class Program
{
static void Main(string[] args)
{
int i, antal;
Console.WriteLine("Ange hur stor 'lista' du vill ha:");
antal = Convert.ToInt32(Console.ReadLine());
//Nu när vi vet hur array vi vill ha så deklarerar vi den
string[ ] namn = new string[antal];
//***** läs in heltal *****
for (i = 0; i < antal; i++)
{
Console.WriteLine(" Skriv ett namn: ");
namn[i] = Console.ReadLine();
}
//***** skriv ut alla namn *****
for (i = 0; i < antal; i++)
Console.WriteLine( (i+1) + ": " + namn[i]);
Console.ReadKey();
}
}
}
Källor
Filmer
C# Svenska - 15 - For loop (Mr1Buying - 5 min)
C# Svenska - 13 - Array (Mr1Buying - 10 min)
C# Svenska - 16 - Foreach (Mr1Buying - 5 min)
C# Svenska - 17 - Break och Continue (Mr1Buying - 4 min)