5 Iteration

Många gånger kan det vara till stor hjälp att något kodstycke upprepas. Det kan t.ex. röra sig om uppräkning av ett tal, flera utskrifter i rad, upprepad inmatning och mycket annat. Vi kallar denna typ av konstruktion för iteration. På ren svenska säger vi att något skall göras så länge som något är sant. Vi kan titta på det enkla exemplet med att skriva ut alla heltal från och med 1 till och med 200. Med strukturdiagram och pseudokod kan det se ut såhär:

Iteration som strukturdiagram.

start
    tal = 1
    så länge tal <= 200
        skriv ut tal
        tal = tal + 1
slut

Diamantstrukturen i strukturdiagram används när det finns fler än en väg att gå. F står för falskt och S för sant. Vilket väg som skall tas beror på om villkoret inom diamanten är uppfyllt (S) eller ej (F). Notera att samma väg kan vandras flera gånger, det är själva poängen med iteration. Notera att värdet på variabeln tal ändras inom sant-banan. Om inte så hade vi fastnat i en oändlig loop. När villkoret inte längre uppfylls vandrar man F-vägen och hamnar vid algoritmens slut.

Pseudokoden beskriver samma sak men notera indragen. Raderna skriv ut tal och tal = tal + 1 har ett indrag mer än raden ovanför, vilket indikerar att dessa “hör till” kodblocket så länge tal <= 200. Precis som hela algoritmen “hör till” start-blocket. Det är alltså endast kodraderna med två indrag som kommer att upprepas.

När raden tal = tal + 1 har körts återvänder man till att kontrollera villkoret tal <= 200 en gång till, men nu med de nya förutsättningarna (variabeln tal har ju fått nytt värde). Detta synliggörs tydligare i strukturdiagrammet än pseudokoden men principen är exakt densamma.

5.1 Iteration i C#

När vi skall skapa en iteration i C# så finns två olika sätt - for-sats och while-sats. Vi tittar på for-satsen först.

5.1.1 For-satsen

Om vi utgår från pseudokoden till exemplet med tal upp till 200 ovan så skriver vi i C# följande:

int tal;
for (tal = 1; tal <= 200; tal = tal + 1)
{
    Console.WriteLine(tal);
}

Först deklareras variabeln tal (kallas loopvariabeln). Sedan följer nyckelordet for samt en startparantes. På första “platsen” i parantesen (tänk att ; separerar tre kodstycken inom parantesen) tilldelas tal värdet 1. Därefter kommer villkoret som ska uppfyllas för att köra loopen en gång till (tal <= 200) och till sist den förändring som skall ske efter varje loopvarv (tal = tal + 1). Med andra ord så är förändringen av variabelns värde “inbyggt” i for-satsen syntax (skrivregler) och resultatet är då att i C# är det endast utskriftsraden som är indragen (indenterad) till skillnad från pseudokoden. Förändringen hör dock till blocket på precis samma sätt men skrivs alltså något annorlunda.

Lägg märke till tecknen { och } som anger var ett block startar och slutar - det räcker alltså inte bara med indrag i C#! Indragen gör det mer läsligt för oss människor men dessa curly brackets (måsvingar) måste sättas ut för att kompilatorn ska kunna tolka koden korrekt.

En variant på C#-koden ovan hade varit att låta deklaration och tilldelning ske i ett enda steg - initialisering direkt i for-satsen.

for (int tal = 1; tal <= 200; tal = tal + 1)
{
    Console.WriteLine(tal);
}

Ytterligare en förkortning av koden skulle kunna göras. Eftersom att det är väldigt vanligt att man ökar en variabels värde med ett så har just denna förändring fått en egen förkortning i C# (och många andra språk!) nämligen tal++ (negativa motsvarigheten existerar givetvis också --). Med andra ord är tal = tal + 1 exakt samma sak som tal++, inget likhetstecken behövs. Vår uppräkningskod skulle med andra ord då kunna se ut såhär:

for (int tal = 1; tal <= 200; tal++)
{
    Console.WriteLine(tal);
}

Rent generellt kan vi beskriva for-satsen i C# enligt följande:

for (initialisering; villkor; förändring)
{
    kod att upprepa
}

Några saker att lägga på minnet vad gäller for-satsen:

  • Loopvariabeln måste inte vara ett heltal.
  • Loopvariabelns förändring måste varken vara positiv eller i heltalssteg.
  • Alla variabler som deklarerats före for-loopen kan användas (och tilldelas nya värden) inuti for-loop-blocket.
  • Alla variabler som deklarerats inuti for-loopen kan endast användas inuti for-loop-blocket.
  • Det är väldigt vanligt att variabelnamnet på loopvariabeln är i.
  • I Visual Studio får du enkelt hjälp med att skriva en for-loop genom att endast skriva for och sedan trycka tab två gånger. Tryck sedan tab igen för att redigera de standardvärden som dyker upp och avsluta sedan med enter för att ställa dig inuti loop-blocket.

5.1.2 While-satsen

Ett annat sätt att skapa iteration i C# är att använda while-satsen. Vi åstadkommer samma resultat som med for-satsen (och de beskrivs därmed med samma strukturdiagram och pseudokod) men skrivsättet är något annorlunda. Vi tar exemplet med tal upp till 200 en gång till:

int tal = 1;
while (tal <= 200)
{
    Console.WriteLine(tal);
    tal = tal + 1;
}

Som du märker så är sättet att skriva en while-sats något mer likt sättet vi beskriver iteration med pseudokod. Initialisering av loopvariabeln först, sedan upprepningsvillkoret och slutligen både utskrift och förändring av variabelvärde inom loop-blocket. Precis som med for-sats kan vi skriva förändringen med förkortningen ++.

int tal = 1;
while (tal <= 200)
{
    Console.WriteLine(tal);
    tal++;
}

Några saker att lägga på minnet vad gäller while-satsen:

  • Loopvariabeln måste inte vara ett heltal.
  • Loopvariabelns förändring måste varken vara positiv eller i heltalssteg.
  • Alla variabler som deklarerats före while-loopen kan användas (och tilldelas nya värden) inuti while-loop-blocket.
  • Alla variabler som deklarerats inuti while-loopen kan endast användas inuti while-loop-blocket.

Som sagt kan både for- och while-loop används för att lösa samma problem men oftast brukar man säga att for-loopen är bäst lämpad när man vet antalet upprepningar som kommer att ske och att while-loopen är att föredra när antalet upprepningar är okänt (tills dess att programmet faktiskt kör igenom, såklart).

5.1.3 Enkla jämförelser

Hittills har vi uteslutande använt exemplet då vi jämför tal med 200 och det får vara antingen mindre än eller lika med. De fyra vanliga olikhetstecknen skrivs enligt följande i C#.

Vardagligt språk Matematik Källkod
Större än > >
Mindre än < <
Större än eller lika med \(\ge\) >=
Mindre än eller lika med \(\le\) <=

5.2 Övningar

Lös följande uppgifter (skriv algoritmer som löser problemen) i tre steg: strukturdiagram, pseudokod och sedan källkod i C#.

  1. Skriv ut talen 0-100.
  2. Skriv ut talen 10, 9, 8, … 2 och 1.
  3. Läs in en multipel och räkna upp de första tio multiplerna. Exempel: Om värdet är 3 skall utskriften vara: 3 6 9 12 15 18 21 24 27 30.
  4. Räkna från noll till ett okänt positivt tal som läses in.
  5. För att skriva ut en multiplikationstabell används nedanstående algoritm. Beskriv den med ett strukturdiagram och provkör den sedan i C#.
start
    läs in tal
    antal = 1
    så länge antal < 11
        skriv ut antal * tal
        antal = antal + 1
slut
  1. Räkna upp från okänt startvärde till okänt slutvärde.
  2. Räkna ut summan av ett okänt antal positiva tal. Avsluta när summan är över en miljon.

Kommande uppgifter behöver du endast lösa med källkod i C#.

  1. Skapa en oändlig loop som skriver ut valfri text. Tips: Ctrl+c avbryter ett konsollprogram.
  2. Skriv ett program där man får mata in 3 saker; saldo, ränta samt slutmål. Programmet ska sedan tala om hur många år det tar innan man når eller passerar slutmålet. Ange räntan i procentenheter.

Testkörning av programmet med beräkning av ränta.

  1. Konstruera ett program som ber om inmatning för “start”, “stop” och “steg”. Programmet skall sedan baserat på inmatningen göra en for-loop och skriva ut de tal som styr for-loopen enligt bild nedan.

Exempel på körning av programmet med steg för for-loop.

  1. Skriv ett program som listar tal i Fibonacci-serien. Stanna när du passerat 1 miljon.

    1. Skriv ett program som i “tabellformat” skriver ut multiplikationstabellerna med korrekt formatering enligt nedan (tips: nästlade loopar).

Multiplikationstabellerna.

    1. Utöka ditt program med multiplikationstabellerna så att även faktorerna skrivs ut.

Multiplikationstabellerna med faktorer.

    1. Redigera i ditt program med multiplikationstabellerna så att man kan välja vilka tabeller som ska skrivas ut och hur många på varje rad.

Multiplikationstabellerna med val.

    1. Utöka ditt program med multiplikationstabellerna så att summan av produkterna skrivs ut nedanför tabellerna.

Multiplikationstabellerna med produktsumma.