Gå till innehållet

Kapitel 3 - 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ör 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 har 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 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.");
}

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. De flesta vet 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 behöver egentligen endast se den första radens utskrift. I nästa avsnitt kommer du att lära dig hur du kan åstadkomma detta.

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!");
}

=-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.");
}

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 skrev om svaret var rätt eller fel.

Eftersom vi inte använder variabeln i exemplet som innehöll användarens ursprungliga svar 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 3.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 3.1

Uppgift 3.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 3.2

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

Lösningsförslag 3.2

if, else if och else

Som tidigare nämnts så vill man ibland endast kontrollera saker med en till if-sats om den första if-satsen inte kördes. 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 ett föregående exempel 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.");
}

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 3.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 3.3

Uppgift 3.4

På det nationella provet i Matematik 4 våren 2013 så fanns följande poänggränser för olika provbetyg.

Provbetyg Poänggräns
A 55
B 46
C 35
D 27
E 18

Skapa ett program som frågar användaren hur många poäng hen fick på detta prov. Programmet ska säga vilket provbetyg användaren fick.

Lösningsförslag 3.4

Uppgift 3.5

Medelåldern i Göteborgs kommun är 39 år. Medellönen i Sverige är 36100 kr/månad.

Skapa ett program som frågar användaren efter hens ålder och månadslön. Programmet ska sedan säga om användaren är lika gammal som, yngre eller äldre än medelpersonen i Göteborg. Därefter ska programmet säga om användaren tjänar lika mycket som, mindre eller mer än meddellönen i Sverige.

En körning av programmet skulle kunna se ut så här:

Hur gammal är du? Svara i år.
25
Hur mycket tjänar du per månad? Svara i kronor.
36100
Du är yngre än medelpersonen i Göteborg.
Du tjänar lika mycket som medellönen i Sverige.

Lösningstips 3.5

Använd en if - else if - else för åldern och en ny if - else if - else för lönen.

Lösningsförslag 3.5

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å passagerare 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.");
}

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");
}

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 3.6

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 3.6

Uppgift 3.7

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 3.7

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 3.7

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.");
}            

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 3.8

Skapa ett program där användaren får skriva in tre olika ord på var sin rad. Programmet ska berätta om det första ordet kommer först i bokstavsordning av alla de tre orden.

Lösningsförslag 3.8

Uppgift 3.9

Skapa ett program där användaren får skriva in en valfri sträng. Programmet ska sedan berätta ifall strängen innehåller...

  • ... ett plustecken
  • ... ett minustecken
  • ... både ett plustecken och ett minustecken
  • ... varken ett plustecken eller ett minustecken

Endast ett av de föregående alternativen ska skrivas ut.

Lösningsförslag 3.9

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 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.");

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.");

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 kan användas för att välja vilken kod som ska köras, 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 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;
}

Man kan skriva kod som gör samma sak 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.");
}

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 3.10

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 3.10

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 3.10

Uppgift 3.11

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 för användaren om hen svarar rätt eller fel.

Lösningstips 3.11

Deklarera variabeln string rättSvar = ""; som ska innehålla det korrekta svaret på den frågan som användaren får. Ge denna variabel det värde som den ska ha med hjälp av en switch-sats.

Lösningsförslag 3.11

Villkorsoperatorn ?

Kortare skrivsätt

Detta avsnitt handlar om villkorsoperatorn som kan användas för att skriva en if-else-sats på ett mer kompakt sätt. Det går alltid att använda if-else istället för villkorsoperatorn så den är inte nödvändig för något annat avsnitt i boken. Den kan däremot vara trevlig att känna till om du gillar att skriva kompakt kod.

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;

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, ålder > 10, ä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, 30, 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, 10, 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 3.12

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 3.12

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 3.12

Blandade uppgifter till kapitel 3

Uppgift 3.13

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 3.13

Uppgift 3.14

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 3.14

Uppgift 3.15

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 3.15

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 3.15

Uppgift 3.16

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 3.16

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 3.16

Uppgift 3.17

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ändaren skrev in med det räknesätt som användaren valde.

Lösningsförslag 3.17

Uppgift 3.18

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 3.17

Använd en range för att dela upp namnet i för- och efternamn.

Lösningsförslag 3.18

Uppgift 3.19

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 3.19

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

Lösningsförslag 3.19

Uppgift 3.20

Skapa ett program där användaren ska skriva in tre olika ord på var sin rad. Programmet ska säga vilket av orden som kommer först i bokstavsordning.

Lösningstips 3.20

Använd && när du jämför ett ord med de båda andra.

Lösningsförslag 3.20

Uppgift 3.21

Skapa ett program där användaren ska skriva in ett matematiskt uttryck innehållande ett eller två plustecken till exempel 5+2,9 eller 20+30+5,2. Programmet ska beräkna uttryckets värde. Programmet ska hantera både ett och två plustecken utan att krascha.

Lösningstips 3.21

Dela första upp användarens sträng vid plustecknet. Undersök sedan om det finns ett till plustecken med hjälp av Contains.

Lösningsförslag 3.21