7 Blandade övningar

Innan vi jobbar med blandade övningar (där sekvens, iteration och selektion blandas) tar vi en titt på några specialfall av iteration - nämligen villkorsoperatorn och switch-case-satsen.

7.1 Villkorsoperatorn

Villkorsoperatorn kan man säga är ett förtkortat sätt att skriva en if-else-sats. Koden för villkoret och de två olika utfallen skall helst vara kort nog för att få plats på en rad för att det ska bli läsligt - men det är inget krav för att det ska fungera. Vi tittar först på en helt vanlig if-sats och sedan hur motsvarigheten skulle kunna skrivas med villkorsoperatorn:

int storst = 0;
if (13 > 37)
{
    storst = 13;
}
else
{
    storst = 37;
}
storst = 13 > 37 ? 13 : 37;

Vi använder villkorsoperatorn om det är en tilldelning som ska ske utifrån ett visst villkor. I det här fallet skall det största talet av 13 och 37 tilldelas till variabeln storst. I första exemplet har vi en if-sats i vanlig ordning. I andra exemplet gör vi exakt samma sak - men på endast en kodrad! Kod fungerar som så att direkt efter likhetstecknet (vanlig tilldelning, precis som med variabler tidigare) kommer det villkors som ska utvärderas följt av ett frågetecken. Precis efter frågetecknet skrivs det värde som variabeln storst ska få om uttrycket är sant. Detta följs av ett kolon (vanligt kolon, inte semikolon) och sedan det värde variabeln istället ska få om uttrycket är falskt. På “svenska” skulle man kunna säga att en kodrad med villkorsoperatorn kan läsas som variabeln = uttryck ? värde om sant : värde om falskt;.

Ett program som läser in två tal och skriver ut det största kan helt enkelt skrivas såhär:

Console.Write("Skriv in ett tal: ");
string inlasning = Console.ReadLine();
int tal1 = int.Parse(inlasning);

Console.Write("Skriv in ett andra tal: ");
inlasning = Console.ReadLine();
int tal2 = int.Parse(inlasning);

int storst = tal1 > tal2 ? tal1 : tal2;

Console.WriteLine(storst + " är störst.");

7.2 switch-case-satsen

Om det är ganska många olika villkors som skall kontrolleras (t.ex. som i uppgift 37 där vi gjorde en miniräknare, ett villkor för varje räkneoperation) så kan det bli lite stökigt/onödigt mycket kod för ganska lite funktionalitet. När det rör sig om att en och samma variabel kan anta flera olika värden kan det istället vara bra att använda switch-case. Man pekar ut vilken variabel man ska switcha på och sedan vilka olika case som finns. Exemplet med miniräknaren kan se ut såhär:

Console.Write("Skriv in ett tal: ");
string inlasning = Console.ReadLine();
int tal1 = int.Parse(inlasning);

Console.Write("Skriv in räknesätt: ");
inlasning = Console.ReadLine();
char raknesatt = char.Parse(inlasning);

Console.Write("Skriv in ett andra tal: ");
inlasning = Console.ReadLine();
int tal2 = int.Parse(inlasning);

switch (raknesatt)
{
    case '+':
        Console.WriteLine(tal1 + tal2);
        break;
    case '-':
        Console.WriteLine(tal1 - tal2);
        break;
    case '*':
        Console.WriteLine(tal1 * tal2);
        break;
    case '/':
        Console.WriteLine(tal1 / tal2);
        break;
    default:
        Console.WriteLine("Okänt räknesätt");
        break;
}

Single-quote-tecknen (’) är inget som är speciellt för switch-case - det är istället på grund av att vi hanterar en variabel av typen char. Hade det istället varit en string hade vi behövt skriva något citattecken (“), t.ex. case "ja": eller om det varit ett heltal hade vi inte behövt något specialtecken före eller efter: case 13:.

Nyckelordet default är motsvarigheten till else i vanlig if-sats. Det kodstycken körs om inget av villkoren ovan blir uppfyllt. break används för att satsen skall avbrytas när ett sant utfall funnits.

7.3 break

I switch-case-satsen använde vi break. Detta nyckelord går också att använda för att avbryta en loop - dvs. i for- eller while-sats. Låt oss säga att vi med en for-loop skall summera alla tal från 1 och uppåt men avbryta när vi kommit till en summa som är större än 22. Det är då möjligt att genom att kombinera for, if och break att ha en loop som löper enligt ett villkor men avbryts enligt ett annat. T.ex såhär:

int summa = 0;
for (int i = 1; i <= 100; i++)
{
    summa = summa + i;
    Console.WriteLine("Varv " + i + ": " + summa);
    if (summa > 22)
    {
        break;
    }
}
Console.WriteLine("Summan blev " + summa);

Trots att break sitter i en if-sats avbryts alltså den senast påbörjade loopen. Detta går även att använda i en while-sats, med andra ord kan du med hjälp av break avbryta en while-sats även om villkoret för att upprepa fortfarande är uppfyllt.

7.4 Slumptal

I några av de kommande uppgifterna är det nödvändigt att låta ditt program slumpa fram ett tal. Det gör vi enklast på följande vis.

Random slumpmaskin = new Random();
int slumptal = slumpmaskin.Next(1,11);

Koden ovan slumpar fram heltal mellan 1 och 10 (första siffran är inklusive och andra exklusive). Vill man slumpa tal mellan 0 och 100 anger man alltså (0,101). Den resterande syntaxen är inget du behöver lära dig just nu (exempel finns även på bladet med syntaxhjälp) men man kan lära sig att första raden skapar en slumptalsgenerator och den andra raden slumpar fram ett heltal och lagrar i en variabel.

Samma generator (slumpmaskin) kan användas för att slumpa fram flera tal. Man kan alltså köra slumpmaskin.Next(1,11) flera gånger för att få fram flera slumptal. En ny slumptalsgenerator behöver ej (ska ej) skapas.

7.5 Kommentarer

Om man vill skriva saker i sin källkodsfil utan att detta påverkar programmets körning kan detta göras i form av kommentarer.

Kommentarer är tänkta som text till sig själv eller andra programmerare. De skrivs antingen på enkelrad med // eller på multirad med /*och */. Det kan t.ex. se ut såhär:

int totalpoang = 0; //Detta är en kommentar
double totalvarde = 0;
//Detta är en annan kommentar
for (int i = 1; i < 11; i++)
{
    /*
    Koden här nedan kommer inte köras eftersom
    att den ligger inom en kommentar
    totalpoang = totalpoang + 50;
    */
}

Det är ofta en god idé att som programmerare lämna en kommentar i källkoden om det är något man programmerat som är lite mer svårförståeligt. Man förklarar kort det man gjort med en kommentar. Utgångspunkten är dock att man ska skriva så tydlig och läsbar kod (bra variabelnamn mm.) som möjligt att behovet av sådana kommentarer är minimalt. Välskriven kod behöver sällan kommenteras!

7.6 Övningar

  1. Skapa ett “Gissa talet”-program. Programmet har ett hemligt tal som du ska gissa! Talet kan bestämmas på förväg i koden eller slumpas fram. Det hemliga talet ska ligga mellan 1 och 100. Användaren får gissa tills användaren gissat rätt. När användaren gissat rätt så ska antalet gissningar skrivas ut.

Gissa talet!

  1. Skriv ett program som testar sig fram till en approximativ (läs ungefärlig) lösning till kubikroten ur ett tal. Använd en decimals noggrannhet (tips: använd en variabel av typen double för att styra for-loopen).

  2. Skriv ett program där en användare har oändligt antal försök på sig att logga in med ett i källkod angivet användarnamn och lösenord. Så länge användaren skriver fel får denne fortsätta försöka logga in. Om inloggningen är korrekt skrivs ett välkomstmeddelande ut.

  3. Gör ett program där användaren kan mata in numret på en veckodag. Programmet skall sedan skriva ut veckodagens namn. Använd en switch-sats i ditt program.

  4. Gör ett program som frågar efter ditt kön och som ger svarsalternativen m och k. Därefter skall utskriften bli: ”Du är en man” eller ”Du är en kvinna”, beroende på om du matat in ett ’m’ eller inte. Använd villkorsoperatorn ”?” i ditt program.

  5. Skriv ett program som låter användaren mata in två decimaltal och sedan beräknar addition, subtraktion, multiplikation och division mellan talen. Programmet ska sedan skriva ut svaret av det räknesätt som ger störst resultat.

  6. Vad innehåller strängen a när loopen är klar?

string a = "";
for (int i = 20; i >= 0; i = i - 5)
{
    s = s + i;
}
  1. Skriv ett program som läser in två tal och kollar om den ena är negativ och den andra positiv. I så fall skrivs “Sant” ut annars “Falskt”.

  2. Skapa ett program som skriver ut alla tal mellan 1 och 200 som är delbara med 3 och med 7.

  3. Skapa ett liknande program som i uppgiften ovan men låt användaren bestämma vilka tal resultatet ska vara delbara med.

  4. Skapa ett program där en användare kontinuerligt får mata in nya positiva heltal. Programmet ska sedan hålla reda på det störta och det minsta talet som matats in. För att avsluta ska användaren mata in -1 och då skrivs största och minsta talen ut.

Största och minsta vid flera inmatningar.

  1. Skapa ett program som slumpar fram slumptal mellan 1 och 6 (=simulera vanlig tärning). Räkna hur manga ’kast’ behövs för en 6:a.

  2. Skapa ett program som genererar/kastar många slumptal dvs flera tusen. Räkna hur många 6:or det blir och om det är 1/6 av alla kast.

  3. Gör likadant som förra uppgiften men nu för alla tal.

  4. Skriv ett program som räknar hur många kast det behövs för att få en dublett, dvs två likadana valörer direkt efter varandra.

  5. Skriv ett program som räknar ut hur många kast som behövs innan alla tal har förkommit minst en gång.

  6. Skriv ett program där du får mata in betyg (A-F) på 10 gymnasiekurser i rad. Alla kurser är på 100p förutom den första som är på 50 och den sista som är på 150. Programmet ska sedan räkna ut snittbetyget och skriva ut på skärmen.

Snittbetygsräknaren.