8 Arrayer

När vi tidigare använt vanliga variabler så har vi kunnat lagra ett enda värde i respektive variabel. Ett heltal i en int-variabel, ett tecken i en char-variabel osv. Med hjälp av array (fält/vektor) kan vi lagra flera värden med ett och samma variabelnamn. Syntaxen för array är två hakparanteser [] och i exemplet heltal kan vi tänka oss att det ser ut ungefär såhär:

Vanlig heltalsvariabel och en heltalsarray.

Syntaxen för att skapa en array med några heltal ser ut som följande:

int[] tal = { 13, 37, -1, 99, 64 };

Varje tal hamnar på varsin plats och dessa platser numreras med start från 0. Denna numrering kallas index. Med andra ord finner vi det första talet på index 0, det andra talet på index 1 osv. Det som finns lagrat på respektive plats kallas element.

Delar av en array.

Utöver ovanstående sätt att skapa en array (med några tal specificerade från början) kan vi även skapa en tom array med ett antal platser. Det gör vi på följande vis:

int[] tal = new int[100];

Kodraden skapar en array med 100 platser, varje plats har ett null-värde (tomt värde) tills dess att något annat stoppas in på respektive plats. Det är alltså siffran 100 i den andra hakparantesen som anger storleken. Generellt är syntaxen för initialisering av en array likadan som tidigare initialiseringar: först datatypen int[], sedan variabelnamnet tal, sedan likhetstecknet = och till sist det värde som ska tilldelas variabeln new int[100].

Om vi ska tilldela nya värden till respektive plats i vår array använder vi arraynamnet i kombination med hakparanteser och index. Att stoppa in värden på de tre första platser kan man alltså göra såhär:

tal[0] = 13;
tal[1] = 37;
tal[2] = -1;

Vill vi istället skriva ut något, t.ex. från andra platsen refererar vi bara med arraynamnet, hakparanteserna och index 1.

Console.WriteLine(tal[1]);

Med andra ord fungerar varje plats i arrayen (tal[i]) precis som vilken variabel som helst. Det fina är dock att vi inte behöver skapa alla dessar variabler (100 st.) manuellt.

För att skapa arrayer av andra datatyper använder vi samma syntax, men istället för int skriver vi då givetvis den datatyp vi vill använda, t.ex:

double[] decimaltal = new double[10];
char[] tecken = new char[13];
string[] strangar = new string[80];

8.1 Gå igenom en array

På grund av att indexeringen av en array görs med heltal så är en for-loop med heltal som loop-variabel mycket användbar när en array skall gås igenom (t.ex. alla element skall skrivas ut). Vi använder även en egenskap som finns hos alla variabler som är arrayer, nämligen Length. Length ger oss antalet platser i en array (tänk på att största index är 1 mindre eftersom att vi räknar från 0, så kallade off by one-fel är väldigt vanliga).

Vi tänker oss ett exempel där en användare ska få mata in 5 tal och dessa skall sedan skrivas ut i omvänd ordning.

int[] tal = new int[5];

for (int i = 0; i < tal.Length; i++)
{
    tal[i] = int.Parse(Console.ReadLine());
}

for (int i = tal.Length - 1; i >= 0; i--)
{
    Console.WriteLine(tal[i]);
}

I exemplet ovan bakar vi ihop Console.ReadLine() och int.Parse() utan mellanlagring i string-variabel för att göra programmet något kortare.

8.2 Sträng som char-array

Utan att veta om det har vi egentligen redan hanterat arrayer från första början. Det är nämligen så att alla strängar (string) egentligen är arrayer av tecken (char). Om jag t.ex. har texten "Martin" lagrad i en variabel namn består den egentligen av följande array:

Sträng som char-array.

När en sträng skapas skapas alltså en array vars storlek beror på antalet tecken i strängen. Varje bokstav, mellanslag eller andra specialtecken hamnar på varsin plats i arrayen. Om jag t.ex. ska skriva ut bokstäverna i mitt namn på varsin rad skulle jag kunna göra såhär:

string namn = "Martin";
for (int i = 0; i < namn.Length; i++)
{
    Console.WriteLine(namn[i]);
}

Det krävs med andra ord ingen konvertering eller något annat kommando för att skapa arrayen i detta fall - att skapa strängen är att skapa char-arrayen!

8.3 Unicode

En annan sak som är något speciell med datatypen char är att att varje tecken även har ett numeriskt värde. Om vi t.ex. initialiserar char alpha = 'A'; så skulle vi precis lika gärna kunna skriva char alpha = (char)65;. Tecknet A representeras alltså av värdet 65, datorns minne kan ju trots allt bara innehålla siffror. Koddelen (char) kallas för typkonvertering (eller typecasting) och innebär i detta fall en konvertering från int (65 står ju som ett vanligt heltal) till char. Ett alternativt sätt att konvertera är med kommandot Convert.ToChar(65).

För att datorn ska veta vilket tecken som ska matchas till vilket tal används en stor teckentabell som i nuvarande form heter Unicode. Du hittar delar av denna på s. 39 i boken.

8.4 Övningar

Genomför följande övningar i Visual Studio.

  1. Skapa en heltalsarray med plats för fem tal. Stoppa in värdena 5, 3, 7, 12 och -3. Beräkna sedan summan för dessa

    1. Utan loop
    2. Med loop
  2. Skriv ett program där du kan mata in ditt namn och programmet svarar med att skriva ut ditt namn baklänges.

  3. Skapa en teckenarray med alfabetets 26 bokstäver (ej åäö).

    1. Skriv ut det tecken som finns på plats 17.
    2. Skriv ut index för bokstaven r.
  4. Skapa en heltalsarray med 10 platser. Sätt in värdena -42, 13, 71, 0, 35, 8, 21, 99, -3 och 5.

    1. Beräkna summan av alla talen med hjälp av en loop.
    2. Skriv ut det största och det minsta talet.
    3. Beräkna produkten av alla tal som är större än 10.
  5. Skapa ett program där storleken på en array bestäms av användarinput. Fyll arrayen med slumpade heltal inom ett intervall som användaren också bestämmer.

  6. Skapa ett program där fem stycken tärningar slås (fem stycken slumpade tal mellan 1 och 6) och lagra antalet av varje valör i en array (antalet 1:or på index 0, antal 2:or index 1 osv…). Skapa sedan en kontroll för att undersöka om man har

    1. Par (Två av samma)
    2. Liten stege (1, 2, 3, 4, 5)
    3. Skriv ut informationen om par (och vilken valör), stege och/eller inget av dessa.
  7. Skriv ett program där användaren först får mata in en sträng och sedan ett tecken. Programmet ska sedan svara med hur många av det inmatade tecknet det finns i strängen.

  8. Skriv ett program som skapar en array med följande tal: -23, -20, -13, -84, -68, 79, -5, 71, 4, 58, -60, 46, -57, -44, -87, 62, -6, 99, 18, -64, 65, -72, 20, 8, -97, -28, 74, -59, -49, 39. Låt sedan användaren mata in ett tal mellan -99 och 99. Programmet ska svara med vilket index talet finns på om det existerar i arrayen, annars med texten "Finns ej.".

  9. Skriv ett program där du matar in ditt namn med versaler och programmet skrivet ut med gemener. Använd teckentabellen på s. 39 i boken och nyttja tipset som ges i Övning 3.8 på sidan precis innan tabellen.

  10. På webbsidor numera är det vanligt att man har unika, läsbara adresser för respektive artikel/undersida. Ofta försöker man skapa en adress som liknar titeln för sidan (se bild nedan). Men mellanslag eller åäö är ingen bra idé att ha med i webbadresser - därför behövs ibland en funktion som tar en vanliga titel (mening) och ändrar om en del. Skriv ett program som tar emot en mening men ersätter alla åä med a, ö med o och mellanslag med bindestreck. Gör dessutom alla tecken till gemener.

Adress och titel liknar varandra.