Programmeringsspråket C

Loopar

Vad är en loop?

En loop påminner om en if-sats. Om ett villkor stämmer så kör den koden efter. Men det som skiljer en loop från en if-sats är att om villkoret fortfarande stämmer, så körs koden igen! Det är något som kan vara väldigt användbart, och vi ska gå igenom de två (eller tre, beroende på hur man räknar) looparna som kan användas i C.

while-loopen

Nu när vi gått igenom både hur en if-sats funkar och vad för funktion en loop har kommer inte while-loopen vara några svårigheter. While är den enklaste typen av loop, och är i stort sett bara en loopande if-sats. Studera kodexemplet nedan så förstår du varför.

int i = 0;

while (i != 5) {
    printf("Jak er snel loop, i är nu %i\n", i);
    i++;
}

Den sätter först i till 0, och sedan, så länge i inte är lika med 5 så kommer den köra koden i måsvingarna. Just den här koden skriver ut vilket varv den är på och ökar i med 1. Nästa "varv" kommer i vara 1, det är inte lika med 5, så den körs igen. Sen kommer i vara 2, inte lika med 5, körs igen. Så kommer det gå, tillslut blir i lika med 5, då kommer den inte köra mer, utan gå vidare till nästa del i programmet.

Varning! Här är en annan väldigt vanlig felkälla till att ett program inte beter sig som man väntat. Om man anger ett villkor som antingen aldrig blir sant eller alltid är sant, så kan man få förvånande resultat. I det första fallet körs aldrig loopen, och i det andra fallet får man en så kallad infinite loop, en loop som bara går och går. Det senare kan se ut som att programmet hänger sig.

Se till att du behärskar while-loopen någorlunda innan du går vidare till nästa del, för nästa sorts loop fungerar liknande, men kan te sig mer förvirrande i början.

for-loopen

Nästa modell av loop for-loopen, och den är till utseendet minst lik en if-sats. Men den är också slaeshjags favorit :). Nedan visas ett exempel på hur en for-loop kan se ut.

int i;
 
for (i = 0; i <= 10; i++)
    printf("Variabeln i innehåller nu siffran %i.\n", i);

Först, bara för att det kan vara förvirrande, så måste jag påminna om att eftersom koden ovan bara har en rad kod som ska loopas, så finns inga måsvingar. Vill man loopa mer än en rad är måsvingarna obligatoriska.

Det vi ser innanför paranteserna till for-loopen är att den är uppdelad i tre sektioner med hjälp av semikolon (;). Den första sektionen är saker som ska göras innan resten av koden körs. Här kan vi t.ex. ställa in värden på variabler som ska användas. I exemplet så gav vi variabeln i en nolla. Vill man göra flera saker i en sektion skiljs dessa åt med kommatecken, exempel kommer senare. Den andra sektionen är villkoret för att koden ska loopas. Den här delen funkar precis som en if-sats. I exemplet så sade vi att i måste vara mindre än eller lika med 10. Och sista delen är saker som ska göras efter att koden har körts. I vårt exempel öka värdet på i med ett.

Om det är svårt att förstå, så går det att göra jämförelser med while-loopen. Följande for-loop och while loop är identiska.

for (DEL1; DEL2; DEL3) {
    gör något här
}

DEL1;
while (DEL2) {
    gör något här
 
    DEL3;
}

Huruvida man använder while- eller for-loopen spelar ingen roll så här tidigt, använd den som känns bra. Om du inte till fullo behärskar for-loopen än så går det bra också, bara du förstår på ett ungefär hur den fungerar när du ser den.

Följande är ett praktiskt exempel på användningen av while-loopen. I den finns två nya grejer. while (1) är en välanvänd konstruktion. Alla värden över 0 räknas som sanna, så i och med while (1) skapar jag medvetet en oändlig loop. För nästa nya grej är break-instruktionen. Den hoppar ur en loop i körning. Variabeln i håller reda på hur många varv loopen har körts.

#include <stdio.h>
 
int main() {
    int i = 1;
    int gissning;
 
    printf("Gissa på ett tal mellan 1 och 10!\n");
 
    while (1) {
        scanf("%i", gissning);
        if (gissning == 7) {
            break;
        }
 
        i++;
    }
 
    printf("Du gissade rätt! Det tog dig %i gissningar!\n", i);
 
    return 0;
}

Detta program är ett extremt grundläggande spel, det går självklart att utveckla på flera sätt. Prova gärna att lägga till till exempel så den säger "Tyvärr, fel svar." om man gissar fel. Eller så den säger "högre!" om man gissar för lågt, och "lägre!" om man gissar för högt. Eller så den körs max 10 varv, och efter det har man "förlorat".

För sakens skull bör även nämnas att det finns en motsats till break-instruktionen. Nämligen continue-instruktionen. Denna instruktion hoppar vidare till nästa "varv" i loopen, utan att köra kvarvarande kod. Funktionaliteten visas i följande loop.

int i;
 
for (i = 1; i <= 5; i++) {
    if (i == 3) {
        printf("Skippar utskriften detta varv. :)\n");
        continue;
    }
    printf("Ar nu inne pa varv %i.\n", i);
}

Notera att detta är en helt vanlig for-loop, däremot händer en grej när i har blivit 3, och vi är inne på tredje varvet. Om i är tre, så görs en annorlunda utskrift, och sen ges en continue-instruktion. Denna gör att resten av varvet skippas (datorn hoppar över utskriften av varvnumret) och nästa varv körs.

Varning: Detta må se trivialt ut så länge man håller på med for-loopar, men kan lätt bli ett misstag i while-loopar. I for-loopen kan man använda continue lite hur som helst för att gå vidare till nästa varv. Betänk en while-loop, där continue-instruktionen körs INNAN man har hunnit öka varvantalet. Detta kommer leda till att varvet aldrig ökas, och vi riskerar en oändlig loop. Se därför alltid till att ändra alla variabler som ska ändras innan du kör continue. Detta speciellt om du jobbar med while-loopar.

I nästa del kommer vi behandla något som gör sig bra ihop med loopar, nämligen arrayer, så det kan vara bra att i alla fall behärska en av loop-typerna.

← If-satser

Arrays →

Copyleft kqr & slaeshjag 2009, 2012 some rights reserved