Programmeringsspråket C

Fristående if-satser

Program som gör samma sak oavsett input kan vara användbara, men knappast särskilt roliga. Därför vill man kunna påverka programflödet beroende på vad för input användaren ger. Först ska vi ta en titt på if-satser, som är något du troligtvis kommer missbruka ganska friskt framöver. Vad är då en if-sats?

if (323 == 323) {
    printf("Hej på er, jag skrivs bara ut om 323 och 323 är samma sak!\n");
    printf("Hejdå\n");
}

Inte mycket nytt, men det är bara själva if-raden vi är intresserad av. Vad gör då den raden? I parantesen ställer man olika villkor, om de är sanna körs koden innanför måsvingarna. I exemplet så var villkoret "är 323 lika med 323?", vilket självklart är sant. Därför körs då de två printf-anropen. Tabellen nedan visar de olika villkorsoperatorerna.

SymbolFunktionExempel
==Lika medif (44 == a)
>Större änif (554 > 11)
<Mindre änif (13 < 22)
!=Inte lika medif (var1 != a)
>=Större än eller lika medif (43 >= 45)
<=Mindre än eller lika medif (65 <= b)

Varning! En viktig sak att notera är att == är INTE samma sak som =. = tilldelar en variabel ett värde, == jämför två värden/variabler. Att man skriver = i stället för == är en vanlig källa till buggar i if-satser, så tänk på det.

Något mer som hör ihop med if, är konstruktionen else. Engelska ordet "else" betyder just "annars", och det ger en ganska bra bild av hur det fungerar. Följande visar hur det fungerar i pseudokod:

OM (det här stämmer) {
    gör det här
    och det här
} ANNARS {
    gör det här istället
}

If utför något konditionellt (villkorat), alltså, om ett villkor stämmer kör den delarna inom måsvingar. Om värdet inte stämmer, så kör den det inom else's måsvingar istället. Detta har stor praktisk nytta i princip överallt, tänk dig följande if-sats som en som avgör om man i något spel för köpa något.

if (pengar >= pris) {
    pengar -= pris;
    printf("Du har just kopt en sak!\n");
} else {
    printf("Du har inte tillrackligt med pengar, tyvarr.\n");
}

Så vad gör koden? Jo, om man har per pengar än priset, eller om man har precis tillräckligt med pengar (läses, om pengar är större än eller lika med priset), så går den in i köpproceduren, som innebär att dra ifrån priset från pengarna, och sen säger den att man har köpt något. Annars, om man inte hade tillräckligt med pengar, så skriver den ut detta istället. Ganska grundläggande, men mycket användbart.

Hur gör man om man vill ha flera villkor? Kanske är det ett föremål man bara får köpa en gång. Men man måste naturligtvis ha råd. Man skulle kunna lösa detta med två if-satser, nästlade i varandra.

if (pengar >= pris) {
    if (kopt_forr != 1) {
        pengar -= pris;
        kopt_forr = 1;
        printf("Du har just kopt en sak!\n");
    } else {
        printf("Du har redan kopt den har...\n");
    }
} else {
    printf("Du har inte tillrackligt med pengar, tyvarr.\n");
}

Denna soppa av if-satser må se rörig ut, och det är den ju också. Man bör inte nästla mer än absolut nödvändigt. Det nya i den till skillnad från förr är if-satsen som avgör om man köpt saken förut eller inte. Den använder sig av något som kan vara nytt för dig, men som du kommer använda mycket i fortsättningen. En variabels läge bestämmer huruvida något är eller inte. I detta fall, antingen har man köpt den, eller inte. Det är mycket effektivt att då låta variabeln ha värdet antingen 1 eller 0.

Men det går att undvika soppan, nu ska vi utöka det ännu mer. Man kan nämligen ha mer än ett villkor per if-sats. Mellan de olika villkoren måste man ange vilka regler det är som gäller. Tabellen nedan visar de logiska operatorerna.

SymbolBetydelseExempel
&&och (logisk konjunktion)if (a == 33 && b == 22)
||eller (logisk disjunktion)if (a == 33 || b == 33)
!inverterar villkoret: sant blir falskt, falskt blir sant (logisk negation)if (! 45 == 22)

Förra köpe-koden skulle då se ut som följer, med flera villkor i en if-sats.

if (pengar >= pris && kopt_forr != 1) {
    pengar -= pris;
    kopt_forr = 1;
    printf("Du har just kopt en sak!\n");
} else {
    printf("Du har antingen för lite pengar eller så har du köpt den här förr, tyvarr.\n");
}

Ett litet tips, som främst gör koden snyggare, är att om du bara har en rad efter if-satsen så behövs inte måsvingarna. Exempel följer i den praktiska koden nedan.

#include <stdio.h>
 
int main() {
    int a;
 
    printf("Välj ett tal mellan 10 och 50: ");
    scanf("%i", &a);
 
    if (a >= 10 && a <= 50)
        printf("Du skrev in talet %i (=\n", a);
    else
        printf("Det där talet var ju inte mellan 10 och 50! >=(\n");
 
    return 0;
}

Ett allmänt tips om man har svårt för att se framför sig effekten av villkoren, är att läsa ut dem högt. Villkoret i exemplet skulle då låta som "så länge a är större än eller lika med tio, OCH mindre än eller lika med femtio".

Använda else tillsammans med if

Else kan du redan, men den går även att användas ihop med en extra if-sats. Tidigare kodexempel utökas här med else if. Se koden nedan.

#include <stdio.h>
 
int main() {
    int a;
 
    printf("Välj ett tal mellan 10 och 50: ");
    scanf("%i", &a);
 
    if (a >= 10 && a <= 50)
        printf("Du skrev in talet %i (=\n", a);
    else if (a >= 7 && a <= 55)
        printf("Okej då, tillräckligt nära! =/\n");
    else
        printf("Det där talet var ju inte mellan 10 och 50! >=(\n");
 
    return 0;
}

Koden skriver ut talet man skrev in om det är mellan angivna två tal, annars om den är "nära" (mellan 7 och 55), skriver den ut det, annars skriver den att talet inte var mellan 10 och 50.

If-satser och villkor är mycket värda att experimentera med, eftersom man måste kunna dem utan och innan när man programmerar. Det kan lätt bli fel när man provar sig fram, men börjar man med grunderna och jobbar uppåt, ett steg i taget så ska det nog gå bra.

← Inmatning av tal

Loopar →

Copyleft kqr & slaeshjag 2009, 2012 some rights reserved