Gå till innehållet

Kapitel 4 - Val med if och switch

Introduktion till kapitlet

Detta kapitel handlar om de olika sätt som man kan styra sina program så att de göra olika saker när de körs beroende på vad som har hänt tidigare i programmet. Ofta låter man vilket värde en variabel ha styra vilka delar av programmets kod som ska köras och vilka delar som ska hoppas över. Du kommer få lära dig olika metoder för att jämföra text och tal för att styra dina program, och du kommer även att stifta bekantskap med en ny typ av variabel som bara har två möjliga värden: sant eller falskt.

Val med if

De flesta datorprogram gör inte samma sak varje gång de körs. Beroende på vilka val som görs av användaren och därmed vilka värden programmets variabler har så fungerar programmet olika från gång till gång. Vi ska nu se på några olika sätt att få programmet att göra olika saker från gång till gång, och det första vi kollar på är if-satser. Eftersom ”if” är engelska för ”om” så kan man läsa koden som ”om uttrycket i parentesen är sant så ska kodblocket köras”.

En if-sats är består av ett booleskt uttryck (uttalas boolskt), ett uttryck som är antingen sant eller falskt, följt av ett kodblock som bara kommer att köras om det booleska uttrycket är sant. Namnet booleskt uttryck kommer från matematikern George Boole. För att skapa ett booleskt uttryck så kan man använda sig av följande operatorer som visas i användning med variablerna x och y.

Operator Uttrycket är sant om...
x == y x är lika med y
x != y x inte är lika med y
x < y x är mindre än y
x > y x är större än y
x <= y x är mindre än eller lika med y
x >= y x är större än eller lika med y

Vi kommer nu att se ett exempel med if-satser där operatorerna används med tal. Det går även att använda operatorerna == och != för att jämföra två strängar med varandra.

Console.WriteLine("Hur gammal är du? Svara i hela antal år.");            
int ålder = int.Parse(Console.ReadLine());

if (ålder >= 18)
{
    Console.WriteLine("Du är minst 18 år gammal, du får ta körkort.");
}

if (ålder >= 15)
{
    Console.WriteLine("Du är minst 15 år gammal, du får köra moped.");
}

if (ålder < 15)
{
    Console.WriteLine("Du är för ung för att köra moped.");
}

// Avsluta inte direkt
Console.ReadKey();

I exemplet får användaren skriva in sin ålder och sedan så kommer programmet att ge olika text beroende på vilken ålder användaren anger. Den första if-satsen kontrollerar om användarens ålder är större än eller lika med 18, och om den är det skrivs ett meddelande om körkort ut. Om användarens ålder är mindre än 18 år så kommer all kod inuti if-satsens kodblock att hoppas över.

Nästa if-sats kodblock körs endast om användarens ålder är 15 eller mer. Notera att kontrollen i denna if-sats görs oberoende av vad resultat av den tidigare if-satsen var. Detta innebär att en användare som är minst 18 år och därmed uppfyller båda de två första if-satsernas krav kommer att få se både raden om körkort och raden om moped. Ibland önskar man att endast en av if-satserna ska köras, t.ex. vet de flesta att personer som får ta körkort för bil också får köra moped, så en användare som är minst 18 år endast ser den första radens utskrift. I nästa avsnitt kommer du att lära dig hur du kan åstadkomma detta. I detta exempel får en användare som är 15, 16 eller 17 år endast att se raden om moped.

Den sista if-satsen i exemplet gör så att alla användare av programmet kommer att få någon utskrift. Om man är minst 15 år gammal så kommer man att ha fått en utskrift tidigare i programmet men om man är under 15 år så kommer ingen av de första if-satserna att köras, däremot så kommer den tredje if-satsen att göra det.

Intellisense-tips

Visual Studio kan hjälpa dig att skriva if-satser snabbt om du skriver if och sedan trycker på tab-tangenten två gånger.

Det går också att använda if-satser för att undersöka värden för strängar.

Console.WriteLine("Vem var statsminister i Sverige år 1970?");
string användarensSvar = Console.ReadLine();

if (användarensSvar == "Olof Palme")
{
    Console.WriteLine("Du svarade rätt!");
}

// Avsluta inte direkt
Console.ReadKey();

=-tecken i if-satser

Kom ihåg att alltid använda == när du undersöker ett värde i en if-sats, d.v.s. två =-tecken. Man använder ett =-tecken när man ger en variabel ett värde, inte när man undersöker den.

Användaren får i detta exempel svara på en fråga, och om användarens sträng innehåller precis samma text som strängen ”Olof Palme” så skrivs det ut att svaret är rätt. Programmet skriver dock inte ut någonting om användaren svarar fel vilket är dumt, om användaren kör programmet för första gången och svarar fel så vet hen ju inte om svaret var rätt eller fel eftersom ingen information ges. Dessutom kan det vara så att användaren är slarvig och skriver in namnet med enbart små bokstäver och då kommer hen inte få reda på att svaret är rätt eftersom jämförelsen av svaren gör skillnad på små och stora bokstäver. Vi gör därför ett nytt exempel som dels skriver ut information till användaren om hen har skrivit fel svar och dessutom spelar det ingen roll om användaren skriver sitt svar med små eller stora bokstäver i det nya exemplet. Detta åstadkommer vi med metoden ToLower som man kan använda på alla strängar, ToLower ger oss en ny version av en sträng som bara innehåller små bokstäver.

Console.WriteLine("Vad heter Sveriges största sjö?");
string rättSvar = "vänern";
string användarensSvar = Console.ReadLine();
string användarensSvarSmå = användarensSvar.ToLower();

// Gör jämförelserna utan hänsyn till stora/små bokstäver
if (användarensSvarSmå == rättSvar)
{
    Console.WriteLine("Du svarade rätt.");
}
if (användarensSvarSmå != rättSvar)
{
    Console.WriteLine("Du svarade fel.");
}

Console.ReadKey();

När användaren har skrivit in sitt svar sparar vi en kopia av svaret som endast innehåller små bokstäver i variabeln användarensSvarSmå. Notera att strängen som innehåller rätt svar också bara innehåller små bokstäver. Den andra if-satsen kontrollerar om användarens svar inte är lika med det rätta svaret vilket är detsamma som att användaren har svarat fel.

Det rätta svaret har sparats i en variabel eftersom det används på flera ställen i programmet, och om man skulle vilja skriva om programmet så att det innehåller en annan fråga med ett annat svar så behöver vi bara ändra på svaret på ett ställe istället för på två olika ställen om vi hade skrivit svaren direkt i if-satserna. Dessutom skulle man ju kunna skriva fel och skriva två olika strängar i de båda if-satserna vilket hade lett till att programmet inte alltid skev om svaret var rätt eller fel.

Eftersom vi inte använda variabeln som innehöll användarens svar som skulle kunna innehålla stora bokstäver så är den egentligen onödig. Vi hade direkt kunnat få en variabel som innehåller användarens svar med enbart små bokstäver på följande sätt.

// Detta går bra för att konvertera till små bokstäver direkt
string användarensSvar = Console.ReadLine().ToLower();

Var i koden ska man skriva ToLower()?

Om du inte behöver använda den ursprungliga texten som användaren skrev in, som kanske innehåller en blandning av små och stora bokstäver, så går det bra att använda ToLower() samtidigt som du läser in texten.

Om du däremot behöver använda den ursprungliga texten så kan du skapa en egen variabel för texten med små bokstäver som exemplet visade. Ytterligare ett alternativ är att använda ToLower() i själva if-satsen, det hade kunnat se ut såhär:

if (användarensSvar.ToLower() == rättSvar)
{
    Console.WriteLine("Du svarade rätt.");
}

I detta exempel så vore det egentligen smidigt om vi hade sluppit skriva den andra if-satsen som kontrollerar nästan samma sak. Det bästa hade varit att skriva ”om den första if-satsen inte var sann, kör den här koden istället för koden inuti if-satsen”. Det går att åstadkomma detta med hjälp av else som vi kommer titta på i nästa avsnitt.

Uppgift 4.1

För att få delta i seniormästerskapen på en golfklubb måste man vara minst 50 år gammal. Skapa ett program som frågar användaren hur gammal hen är och sedan berättar om användaren får vara med i seniormästerskapen eller inte.

Lösningsförslag 4.1

Uppgift 4.2

Skapa ett program som frågar användaren vilket land som vann fotbolls-VM för damer år 2015. Om användaren svarar USA ska programmet skriva ut att svaret var rätt, annars ska programmet skriva ut att svaret var fel. Det ska inte spela någon roll om användaren skriver svaret med stora eller små bokstäver.

Lösningstips 4.2

Glöm inte att omvandla användarens svar till enbart små bokstäver med ToLower().

Lösningsförslag 4.2

if, else if och else

Som tidigare nämnt så vill man ibland endast fortsätta kontrollera saker med en if-sats om den första if-satsen inte kördes, d.v.s. om det booleska uttrycket i den första if-satsen var falskt. För att enkelt kunna göra det så finns det två andra typer av satser som används tillsammans med if, och dessa är else if samt else. Efter en if-sats kan man placera hur många else if-satser som man vill. Efter att if-satsen har kontrollerats och körts går programmet vidare till else if-satsen som bara kommer att kontrolleras och köras om if-satsen inte kördes. Om det finns ytterligare en else if-sats efter den första else if-satsen så kommer denna bara att köras om både if-satsen och den första else if-satsen inte kördes. Efter att ha gått igenom if-satsen och alla else if-satser så kan man slutligen skriva en else-sats som körs ifall varken if-satsen eller någon av else if-satserna kördes.

Exemplet som följer är väldigt likt det föregående exemplet med skillnaden att else if samt else används. Detta får följden att endast ett av kodblocken kan köras.

Console.WriteLine("Hur gammal är du? Svara i hela antal år.");
int ålder = int.Parse(Console.ReadLine());

if (ålder >= 18)
{
    Console.WriteLine("Du är minst 18 år gammal, du får ta körkort.");
}

else if (ålder >= 15)
{
    Console.WriteLine("Du är minst 15 år gammal, du får köra moped.");
}

else
{
    Console.WriteLine("Du är för ung för att köra moped.");
}

// Avsluta inte direkt
Console.ReadKey();

I exemplet ovan så kan koden läsas på följande sätt. Om användarens ålder är minst 18 år så körs den första if-satsen. Om den första if-satsen inte kördes och användarens ålder är minst 15 år så körs else if-satsen. Om varken if-satsen eller else if-satsen kördes så körs else-satsen.

Man kan som tidigare nämnt skriva hur många olika else if-satser som man vill efter en if-sats. Det går också bra att lägga till nya if-satser efter man är färdig med en if - else if - else. Den kommer då att kontrolleras oberoende av vad resultatat blev av någon if-sats tidigare i programmet.

Många if - else if - else i samma program

Du kan använda många olika if - else if - else i samma program om du vill. En if är självständig och behöver inte någon av de andra för att fungera. En else if måste däremot komma direkt efter en if-sats, och en else måste komma direkt efter en if-sats eller else if-sats.

Om kodblocken som hör till en if-sats, else if-sats eller else-sats endast innehåller en rad med kod så är det inte nödvändigt att skriva ut klammerparenteserna. Saknas klammerparenteser så antas helt enkelt den efterföljande raden vara det som ska köras ifall if-satsens booleska uttryck är sant.

// Två exempel på if-satser utan klammerparenteser
if (ålder >= 18)
    Console.WriteLine("Du är minst 18 år gammal.");

if (ålder >= 18) Console.WriteLine("Du är minst 18 år gammal.");

Raden kan antingen skrivas på en ny rad eller direkt efter if-satsen på samma rad. Dock så är risken större att man gör något misstag i koden när man försöker ändra på en if-sats utan klammerparenteser, man kanske vill lägga till eller ta bort en rad i if-satsen men tänker inte på att skriva dit klammerparenteserna. Med detta sagt så rekommenderas du att alltid skriva ut klammerparenteserna till if-satser, men det kan vara bra att känna till att koden kan skrivas så här om du t.ex. läser koden för ett program som någon annan skrivit.

Uppgift 4.3

Skapa ett program som frågar användaren vad hen heter. Om användaren heter Stig ska programmet säga att användaren har namnsdag idag. Om användaren istället heter Abraham ska användaren få veta att hen har namnsdag imorgon, men om användaren varken heter Stig eller Abraham ska hen få veta att hen inte har namnsdag vare sig idag eller imorgon.

Lösningsförslag 4.3

Flera booleska uttryck samtidigt och fler logiska operatorer

I de exempel som vi hittills har studerat så har varje if-sats alltid bara innehållit ett booleskt uttryck. Det är möjligt att kontrollera ifall flera booleska uttryck är sanna inuti en if-sats och det gör man med hjälp av några logiska operatorer. I tabellen är både x och y booleska uttryck.

Operator Hela uttrycket är sant om...
x && y Både de booleska uttrycken är sanna.
x || y Minst ett av de booleska uttrycken är sant.

Vi ska se hur flera booleska uttryck kan användas med hjälp av ett exempel. Ett flygbolag ska släppa på passagera på ett flygplan men har bestämt sig för att låta passagerarna stiga ombord på planet i en lite annorlunda ordning. Detta är ordningen som flygbolaget har bestämt sig för:

  1. Alla som heter Felicia och Felix eftersom de har namnsdag.
  2. Alla som är äldre än 75 år.
  3. Alla som är från 18 t.o.m 25 år.
  4. Övriga passagerare.

Exemplet visar hur man kan skriva ett program som frågar efter användarens namn och ålder för att sedan ange i vilken grupp som användaren hamnar i flygbolagets speciella ordning.

// Läs in användarens namn och ålder
Console.WriteLine("Vad heter du?");
string namn = Console.ReadLine();
Console.WriteLine("Hur gammal är du? Svara i hela antal år.");
int ålder = int.Parse(Console.ReadLine());

// Kontrollera användarens grupp
if (namn == "Felicia" || namn == "Felix")
{
    Console.WriteLine("Du har namnsdag idag, du får gå ombord först.");
}
else if (ålder > 75)
{
    Console.WriteLine("På grund av din ålder får du gå ombord i grupp två.");
}
else if (ålder >= 18 && ålder <= 25)
{
    Console.WriteLine("Unga vuxna får gå ombord i grupp tre.");
}
else
{
    Console.WriteLine("Du är välkommen ombord i grupp fyra.");
}

// Avsluta inte direkt
Console.ReadKey();

Man behöver inte begränsa sig till att använda två booleska uttryck heller, det går att kombinera hur många booleska uttryck man vill med hjälp av de nya operatorerna som har visats. Om man vill så kan man använda parenteser för att tydliggöra vilka booleska uttryck som hör ihop med varandra.

Programmeraren Erik som har skrivit detta program är intresserad av att köpa en ny bil. Han vill antingen köpa en Volvo eller en Ford men kan bara tänka sig att betala som högst 50000 för bilen. Erik frågar användaren efter information om en bil som användaren vill sälja och berättar sedan om han är intresserad av bilen.

// Läs in information om bilen
Console.WriteLine("Vilket märke är bilen du vill sälja?");
string märke = Console.ReadLine();
Console.WriteLine("Vad säljer du bilen för?");
int pris = int.Parse(Console.ReadLine());

// Kontrollera bilens information
if ((märke == "Volvo" || märke == "Ford") && pris <= 50000)
{
    Console.WriteLine("Jag är intresserad av bilen.");
}
else
{
    Console.WriteLine("Jag är inte intresserad av bilen");
}

// Avsluta inte direkt
Console.ReadKey();

I exemplet så är märkesundersökningen grupperad i parenteser. Detta gör att hela parentesens värde blir sant om märket antingen är Volvo eller Ford.

Uppgift 4.4

För att få åka en viss berg-och-dalbana på en nöjespark så måste man vara mellan 1,5 och 1,9 meter lång. Skapa ett program som frågar användaren hur lång hen är och sedan skriver ut om hen får åka berg-och-dalbanan eller inte.

Lösningsförslag 4.4

Uppgift 4.5

Ett kafé utlyser en kampanj där personer äldre än 65 år samt personer mellan 10 och 18 erbjuds att köpa kaffe till ett extra billigt pris. Skriv ett program som innehåller endast en if-sats som undersöker om användaren kan få köpa kaffe extra billigt.

Lösningstips 4.5

Använd gärna parenteser när du grupperar de jämförelser som du gör i if-satsen. T.ex. så kan du sätta jämförelserna som undersök om man är mellan 10 och 18 år inuti en parentes.

Lösningsförslag 4.5

Spara booleska värden i variabler

Erik bestämmer sig för att ändra sina krav på bilen och samtidigt ge användaren mer information om varför han inte är intreserad av vissa bilar. Han kan nu också tänka sig att köpa en BMW, men han vill fortfarande betala som högst 50000 kr för bilen. För att slippa skriva samma ganska långa booleska uttryck i varje if och else if så kan man spara värdet av ett booleskt uttryck i en variabel av typen bool. En bool–variabel har endast två möjliga värden, true eller false. Förutom att ge en bool–variabel ett värde med hjälp av ett booleskt uttryck som i exemplet så kan man också direkt ge den värdet true eller false genom att skriva något av de orden.

// Läs in information om bilen
Console.WriteLine("Vilket märke är bilen du vill sälja?");
string märke = Console.ReadLine();
Console.WriteLine("Vad säljer du bilen för?");
int pris = int.Parse(Console.ReadLine());

// Är bilen rätt märke? Spara svaret i variabeln märkeOK
bool märkeOK = (märke == "Volvo" || märke == "Ford" || märke == "BMW");

// Kontrollera bilens information
if (märkeOK && pris <= 50000)
{
    Console.WriteLine("Jag är intresserad av bilen");
}
else if (märkeOK && pris > 50000)
{
    Console.WriteLine("Jag är intresserad av bilen om du sänker priset.");
}
else if (!märkeOK && pris <= 50000)
{
    Console.WriteLine("Priset är bra men jag vill ha ett annat märke.");
}
else
{
    Console.WriteLine("Jag är inte intresserad av bilen.");
}

// Avsluta inte direkt
Console.ReadKey();

Parenteserna som används när märkeOK tilldelas sitt värde är inte nödvändiga, de är där för att göra raden mer lättläst. Om variabeln märke är antingen Volvo, Ford eller BMW så får variabeln märkeOK värdet true, annars får den värdet false.

if-satser och bool-variabler

När man undersöker om en bool är true eller false så kan man tänka sig att man skulle kunna göra på följande sätt:

bool märkeOK = true;
if (märkeOK == true)
{
    // Kod...
}

Om märkeOK är true så kommer hela uttrycket märkeOK == true att vara sant och därmed få värdet true. Det blir därför som om if-satsen egentligen var if (true). Det är dock inte nödvändigt att göra på detta sätt, det räcker med att göra så här:

bool märkeOK = true;
if (märkeOK)
{
    // Kod...
}

Om märkeOK är true så kommer det vara som att if-satsen är if (true) och därmed köras. Detta senare skrivsätt är det som användes i exemplet längre upp och det är det som är vanligast bland programmerare. Om du tycker att det är lättare att förstå vad koden gör när du skriver if (märkeOK == true) så går det också bra.

Uppgift 4.6

En innebandyturnering är öppen för personer från fyra olika städer: Göteborg, Kungälv, Kungsbacka och Mölnlycke. Dessutom måste man vara mellan 12 och 16 år för att få delta. Skapa ett program som frågar användaren var hen kommer ifrån samt hur gammal hen är. Programmet ska sedan skriva ut ifall användaren får delta i turneringen eller inte. Om användaren inte får delta ska programmet säga varför så är fallet. Använd två booleska variabler i ditt program som du kallar för stadOK och ålderOK.

Lösningstips 4.6

Du kommer få fyra fall som du måste undersöka:

  • Både stadOK och ålderOK är true.
  • stadOK är true men ålderOK är false.
  • stadOK är false men ålderOK är true.
  • Både stadOK och ålderOK är false.

Lösningsförslag 4.6

Metoder för strängar och if-satser

Vi har i ett tidigare kapitel tittat på några av de metoder som finns för strängar, och tidigare i detta kapitel har du fått se hur man kan använda metoden ToLower för att få en ny sträng som är en kopia av en annan sträng där alla stora bokstäver omvandlats till små. Det finns även fler metoder för strängar som kan användas i if-satser eftersom de tar reda på om någonting är sant eller falskt. Exemplet nedan visar två sådana metoder, Contains och CompareTo.

Console.WriteLine("Var vänlig och skriv in två ord.");
string ord1 = Console.ReadLine();
string ord2 = Console.ReadLine();

// Finns det andra ordet i det första?
if (ord1.Contains(ord2))
{
    Console.WriteLine($"{ord1} innehåller ordet {ord2}");
}
else
{
    Console.WriteLine($"{ord1} innehåller INTE ordet {ord2}");
}

// Vilket ord kommer först i bokstavsordning?
if (ord1.CompareTo(ord2) < 0)
{
    Console.WriteLine($"{ord1} kommer före {ord2} i bokstavsordning.");
}
else if (ord1.CompareTo(ord2) == 0)
{
    Console.WriteLine("Du skrev samma ord 2 gånger.");
}
else
{
    Console.WriteLine($"{ord2} kommer före {ord1} i bokstavsordning.");
}            

// Avsluta inte direkt
Console.ReadKey();

Metoden Contains används för att undersöka om en sträng innehåller en annan sträng och får antingen värdet true eller false. CompareTo används för att se vilken av två strängar som kommer först i bokstavsordning. Eftersom det finns tre olika svarsalternativ (den första strängen, den andra strängen eller båda strängarna ifall de är identiska) så räcker det inte att svara med true eller false. Metoden CompareTo kommer att få ett heltal som värde och det som visar vilket ord som kommer först i bokstavsordning är om heltalet är positivt, negativt eller noll. För att se vilken sträng som motsvarar ett negativt eller positivt svar så kan du kolla på koden i exemplet.

Fler metoder för strängar

Det finns fler metoder för strängar än de som vi hittills har undersökt. Om du någon gång har behov av att undersöka någon egenskap hos en sträng kan du försöka ta hjälp av internet för att se om en passande metod redan finns, då behöver du inte skriva lika mycket kod själv.

Uppgift 4.7

I exemplet ovan så räknas inte HEJSAN och hejsan som samma ord när man använder CompareTo-metoden. Använd sträng-metoden ToLower för att skapa ett program som jämför bokstavsordningen för två strängar utan att ta hänsyn till små och stora bokstäver.

Lösningsförslag 4.7

Variablers definitionsområde

Variabler har något som kallas för definitionsområde eller område, som betyder var i koden som variabeln är tillgänglig. Detta är något som är viktigt att ta upp nu när vi har börjat skriva egna kodblock med if, else if och else. En variabels definitionsområde är till slutet av det kodblock som variabeln deklareras i, detta kallas också för variabelns livslängd. När kodblocket når sitt slut så kan variabeln inte användas längre och platsen som variabeln tog i datorns minne kommer senare att frigöras. Detta betyder att variabler som vi skapar i t.ex. en if-sats inte kan användas när if-satsen har kört klart vilket blir ett problem i följande exempel som anger biljettpriset för att gå in på ett museum.

// Hur gammal är personen?
Console.WriteLine("Hur gammal är du? Svara i hela antal år.");
int ålder = int.Parse(Console.ReadLine());

// Bestäm biljettpris för båtresan
if (ålder < 18 || ålder >= 65)
{
    double biljettpris = 0;
}
else
{
    double biljettpris = 59.9;
}

// Variabeln biljettpris är inte definierad här
Console.WriteLine($"Biljettpriset är {biljettpris} kr.");

// Avsluta inte direkt
Console.ReadKey();

Detta program kommer inte att kunna kompileras och senare köras eftersom variabeln biljettpris inte finns längre när biljettpriset ska skrivas ut. För att få programmet att fungera så måste vi deklarera variabeln biljettpris innan if-satsen så att den är tillgänglig även efter att if-satsen har körts.

// Hur gammal är personen?
Console.WriteLine("Hur gammal är du? Svara i hela antal år.");
int ålder = int.Parse(Console.ReadLine());

// Deklarera variabeln men ge den inget värde
double biljettpris;

// Bestäm biljettpris för båtresan
if (ålder < 18 || ålder >= 65)
{
    biljettpris = 0;
}
else
{
    biljettpris = 59.9;
}

// Variabeln biljettpris är definierad här
Console.WriteLine($"Biljettpriset är {biljettpris} kr.");

// Avsluta inte direkt
Console.ReadKey();

Eftersom variabeln nu deklareras i kodblocket som tillhör Main-metoden så är den tillgänglig både i och efter if-satsen. Vi deklarerar inte variabeln igen inuti if- eller else-blocket eftersom variabeln redan är deklarerad, vi tilldelar bara variabeln ett värde. Om man försöker använda en variabel som kanske inte har tilldelats ett värde kommer programmet inte att kunna kompileras (testa själv genom att ta bort else-satsen), men eftersom variabeln måste tilldelas ett värde antingen i if- eller else-blocket så är denna kod OK. Det hade också gått bra att tilldela variabeln ett värde när den deklarerades i exemplet ovan, det hade sedan blivit överskrivet av if- eller else-blocket.

Viktig teori

Bara för att det inte finns några uppgifter till detta avsnitt så betyder det inte att det inte är viktigt! I senare kapitel kommer du att skapa fler typer av kodblock i dina program och då är det viktigt att du förstår var dina variabler kan användas.

switch – Bra om man jämför samma variabel om och om igen

Förutom if-satser så finns det en ytterligare typ av sats som man kan använda för att programmet bara ska köra vissa delar av koden beroende på värdet av en variabel, nämligen switch. Denna sats används för att jämföra värdet på samma variabler flera gånger och köra olika kod beroende på vad variabeln är lika med. I parentesen efter switch skrivs vilken variabel eller vilket uttryck som ska undersökas. Vilken kod som ska köras beroende på variabelns värde bestäms av vilket case som uppfylls. Varje case kan bestå av flera rader kod men måste avslutas med ett break. Som ett sista fall så kan man ha default som uppfyller samma funktion som else, koden här kommer att köras om inget annat case kördes.

Console.WriteLine("Detta program kan berätta vilka de 5 bästa filmerna" +
    "genom tiderna är. Vilken position vill du veta om?");
string val= Console.ReadLine();

switch (val)
{
    case "1":
        Console.WriteLine("Nyckeln till frihet");
        break;
    case "2":
        Console.WriteLine("Gudfadern");
        break;
    case "3":
        Console.WriteLine("Gudfadern del 2");
        break;
    case "4":
        Console.WriteLine("The Dark Knight");
        break;
    default:
        Console.WriteLine("Schindler's List");
        break;
}

// Avsluta inte direkt
Console.ReadKey();

Man kan skriva kod som gör samma sak som med hjälp av if-satser, ett sådant program hade sett ut så här.

Console.WriteLine("Detta program kan berätta vilka de 5 bästa filmerna" +
    "genom tiderna är. Vilken position vill du veta om?");
string val= Console.ReadLine();

if (val == "1")
{
    Console.WriteLine("Nyckeln till frihet");
}
else if (val == "2")
{
    Console.WriteLine("Gudfadern");
}
else if (val == "3")
{
    Console.WriteLine("Gudfadern del 2");
}
else if (val == "4")
{
    Console.WriteLine("The Dark Knight");
}
else if (val == "5")
{
    Console.WriteLine("Schindler's List");
}
else
{
    Console.WriteLine("Du valde inte rätt tal.");
}

// Avsluta inte direkt
Console.ReadKey();

Fördelen med att använda switch är att man direkt ser att variabeln val kommer att undersökas flera gånger, och allt som gör programmet mer lättöverskådligt är bra. Det går bra att använda heltal och strängar i switch–satser, men man ska inte använda double av samma anledning som att man inte ska jämföra om två double-variabler är lika med varandra i en if-sats. På grund av hur double-värden sparas i datorns minnen så kan det se ut som om två double-variabler borde ha samma värde enligt programmets trots att de kan skilja lite grann.

Uppgift 4.8

Skapa ett program som frågar användaren vilken plats hen kom på i den senaste idrottsturneringen hen var med på. Programmet ska sedan, med hjälp av en switch-sats, säga om användaren fick guld, silver, brons eller ingen medalj.

Lösningstips 4.8

Tänk på att du inte måste omvandla användarens svar till ett tal eftersom du inte ska göra någon beräkning med det, du kan låta det vara en string.

Lösningsförslag 4.8

Uppgift 4.9

Skapa ett program som skriver ut följande meny till användaren.

Välj en frågekategori.
1. Musik
2. Geografi
3. Historia
Användaren ska få välja ett alternativ och få en frågesportsfråga ur denna kategori. Programmet ska berätta till användaren om hen svarar rätt eller fel.

Lösningstips 4.9

Om du vill så kan du deklarera en variabel för användarens frågesportssvar innan själva switch-satsen, då kan du använda samma variabel för användarens frågesvar oavsett frågekategori.

Du kan även deklarera en bool-variabel som håller koll på om användaren svarar rätt på sin fråga, sätt den till true om svaret blir rätt i den kategori som har valts. Genom att undersöka denna variabel efter switch-satsen så kan du skriva ut om användaren hade rätt eller fel.

Lösningsförslag 4.9

Villkorsoperatorn ?

Ibland så använder man if-satser för att endast tilldela en variabel ett värde, och det kan tyckas som att man behöver skriva väldigt många rader kod för att göra detta. Det finns ett kortare sätt att skriva detta på med hjälp av villkorsoperatorn, en operator som är ett frågetecken. I exemplet nedan ska biljettpriset till ett museum bestämmas genom att fråga om användarens ålder, barn under 10 år går in gratis men alla andra får betala 30 kr. Biljettpriset bestäms två gånger, en gång med en if-sats och en gång med villkorsoperatorn. Egentligen behövs alltså endast ett av sätten, men båda visas eftersom de båda alternativen gör precis samma sak.

Console.WriteLine("Hur gammal är du? Svara i hela antal år.");
int ålder = int.Parse(Console.ReadLine());

int biljettpris;

// En if-sats för att bestämma biljettpriset
if (ålder > 10)
{
    biljettpris = 30;
}
else
{
    biljettpris = 0;
}

// Biljettpriset bestäms här med villkorsoperatorn ?
biljettpris = ålder > 10 ? 30 : 0;

// Avsluta inte direkt
Console.ReadKey();

Vi ska nu analysera raden med villkorsoperatorn.

biljettpris = ålder > 10 ? 30 : 0;
Biljetpriset ska få värdet av uttrycket till höger om likhetstecknet. Detta uttryck består av tre mindre uttryck som separeras av frågetecknet och ett kolon.
biljettpris = ålder > 10 ? 30 : 0;
Det första uttrycket är ett booleskt uttryck som avgör vilket av de sista två uttrycken som kommer att sparas i biljettpris. Det booleska uttrycket avslutas med villkorsoperatorn, alltså ett frågetecken.
biljettpris = ålder > 10 ? 30 : 0;
Nästa uttryck, som är mellan frågetecknet och kolonet, anger det värde som biljettpris kommer att få om det booleska uttrycket är sant.
biljettpris = ålder > 10 ? 30 : 0;
Det sista uttrycket anger det värde som biljettpris kommer att få om det booleska uttrycket är falskt.

Med hjälp av villkorsoperatorn kan man alltså korta ner vissa if-satser som tar upp flera rader i koden till att bara ta upp en rad. Det kan vara ganska svårt att läsa uttryck med villkorsoperatorn till en början men efter övning så kan det göra koden mer lättöverskådlig vilket är något att eftersträva.

Uppgift 4.10

Skapa ett program som frågar användaren hur många datorer hen äger. Programmet ska sedan skriva ut hur många datorer hen äger med ett ord som är korrekt i singular eller plural. Det innebär att om användaren har en dator ska programmet skriva ut
Du har 1 dator.
Om användaren har t.ex. 3 datorer ska programmet skriva ut
Du har 3 datorer.
Bestäm om ordet dator/datorer ska användas med hjälp av villkorsoperatorn.

Lösningstips 4.10

Skapa en string-variabel som heter datorord. Om användaren har 1 dator låter du datorord få värdet "dator", annars får det värdet "datorer".

Lösningsförslag 4.10

Blandade uppgifter till kapitel 4

Uppgift 4.11

För att få delta i en tävling som anordnas av en gymnasieskola så måste man vara mellan 16 och 19 år gammal. Skapa ett program som frågar användaren hur gammal hen är och sedan skriver ut om hen får delta i tävlingen, om hen är för ung eller om hen är för gammal.

Lösningsförslag 4.11

Uppgift 4.12

Ett företag vill gynna nyblivna gymnasiestudenter när det ska anställa ny personal. Skapa ett program som frågar användaren om hen har gått ut gymnasiet, användaren ska uppmanas att svara j för ja eller n för nej. Därefter ska programmet fråga användaren hur gammal hen är. Om användaren har gått ut gymnasiet och är under 22 år gammal så ska programmet säga ”Vi vill gärna anställa dig”, annars ska programmet säga ”Vi letar tyvärr efter annan personal just nu”. Du ska kontrollera om användaren uppfyller båda kraven med endast en if-sats.

Lösningsförslag 4.12

Uppgift 4.13

Ett företag hyr ut bilar till en avgift av 80 kronor i timmen, men den maximala hyran man kan betala per dag är 950 kr. Skriv ett program som frågar användaren hur många timmar hen vill hyra en bil och skriv därefter ut vad detta kommer att kosta. Du kan förutsätta att användaren inte vill hyra bilen mer än 1 dag, man måste hyra en bil i ett helt antal timmar.

Lösningstips 4.13

Beräkna kostnaden med formeln kostnad = 80 * antalTimmar. Undersök därefter med en if-sats om kostnaden är över 950 kr.

Lösningsförslag 4.13

Uppgift 4.14

En radiostation har ett krav på de låtar som den ska spela: de måste vara minst 2 minuter och 45 sekunder långa men maximalt 4 minuter och 20 sekunder. Skapa ett program där användaren får skriva in hur lång en låt är genom att ange två heltal. Om låten t.ex. är 3 minuter och 50 sekunder ska användaren ange talen 3 och 50. Ditt program ska sedan skriva ut ifall låten får spelas på radiostationen eller inte.

Lösningstips 4.14

Beräkna längden av användarens låt i sekunder , d.v.s. en låt på 2 minuter och 10 sekunder är 130 sekunder lång. Använd sedan denna längd för att undersöka om låten är lagom lång.

Lösningsförslag 4.14

Uppgift 4.15

Skapa ett program som ber användaren att skriva in två tal. Därefter ska programmet skriva ut följande meny till användaren.

Välj ett räknesätt
1. Addition
2. Subtraktion
3. Multiplikation
4. Division

Programmet ska skriva ut resultatet av en beräkning med de två tal som använder skrev in med det räknesätt som användaren valde.

Lösningsförslag 4.15

Uppgift 4.16

Skapa ett program där användaren får skriva in sitt förnamn och efternamn på samma rad. Programmet ska sedan säga om förnamnet eller efternamnet kommer först i bokstavsordning.

Lösningstips 4.16

Använd metoden Substring för att dela upp namnet i för- och efternamn.

Lösningsförslag 4.16

Uppgift 4.17

Skapa ett program där användaren får skriva in en addition eller en subtraktion på en rad, programmet ska sedan beräkna resultatet av additionen eller subtraktionen. Användaren ska alltså kunna skriva t.ex. ”4+7” eller ”20-9” på endast en rad. Du ska inte fråga användaren om hen vill skriva in en addition eller subtraktion, programmet ska själv upptäcka vilket räknesätt som ska användas ur den rad som användaren skriver in.

Lösningstips 4.17

Utöver Substring så kan det vara lämpligt att använda metoden Contains för denna uppgift.

Lösningsförslag 4.17

Uppgift 4.18

Utöka uppgift 4.17 så att det inte spelar någon roll om användaren skriver in några mellanslag i sin addition eller subtraktion. Det ska alltså gå lika bra att skriva "20-9" som t.ex. "20 - 9" eller " 20- 9 ".

Lösningstips 4.17

Utöver Substring och Contains så kan det vara lämpligt att använda metoden Trim för denna uppgift.

Lösningsförslag 4.18

Kommentarer