Beetje Coderen

Les 4

Operatoren en control flow

Rekenen, vergelijken, if/else, switch en de drie soorten lussen in C.

⏱ 45 minuten leestijd + oefenen

🎯 Na deze les kun je

  • rekenkundige, vergelijkings- en logische operatoren in C gebruiken
  • keuzes maken met if/else en switch
  • for-, while- en do-while-lussen schrijven
  • de valkuil van gehele deling vermijden

Keuzes en lussen ken je uit Python. De ideeën zijn in C precies hetzelfde; de schrijfwijze verschilt. In deze les zet je ze naast elkaar en leer je de plekken waar C je verrast: gehele deling, switch met break, en = versus ==.

Operatoren

Python C Opmerking
a + b, a - b, a * b idem
a / b a / b twee ints → gehele deling
a // b a / b (bij ints)
a % b a % b rest
a ** b pow(a, b) uit <math.h>, link met -lm
and, or, not &&, \|\|, !
x += 1 x += 1 of x++

C heeft geen echt bool-type nodig: 0 is onwaar, alles anders is waar. Sinds C99 kun je <stdbool.h> gebruiken voor bool, true en false; doe dat, het leest prettiger.

if/else

#include <stdio.h>

int main(void) {
    int cijfer = 7;
    if (cijfer >= 8) {
        printf("Goed\n");
    } else if (cijfer >= 6) {
        printf("Voldoende\n");
    } else {
        printf("Onvoldoende\n");
    }
    return 0;
}

De voorwaarde staat altijd tussen haakjes. De accolades mag je bij één opdracht weglaten, maar doe dat niet: het is een bekende bron van bugs als je later een regel toevoegt.

switch

switch kiest op basis van een geheel getal of teken:

#include <stdio.h>

int main(void) {
    char bewerking = '*';
    double a = 6.0, b = 4.0;

    switch (bewerking) {
    case '+':
        printf("%.2f\n", a + b);
        break;
    case '-':
        printf("%.2f\n", a - b);
        break;
    case '*':
        printf("%.2f\n", a * b);
        break;
    case '/':
        if (b == 0.0) {
            printf("Delen door nul kan niet\n");
        } else {
            printf("%.2f\n", a / b);
        }
        break;
    default:
        printf("Onbekende bewerking\n");
    }
    return 0;
}

Zonder break "valt" de uitvoering door naar de volgende case (fall-through). Dat is bijna nooit wat je wilt; -Wextra waarschuwt ervoor (-Wimplicit-fallthrough).

Lussen

#include <stdio.h>

int main(void) {
    /* for: als je het aantal stappen kent */
    for (int i = 1; i <= 3; i++) {
        printf("for %d\n", i);
    }

    /* while: zolang een voorwaarde geldt */
    int saldo = 100;
    while (saldo > 0) {
        saldo -= 40;
    }
    printf("saldo %d\n", saldo);

    /* do-while: minstens één keer */
    int poging = 0;
    do {
        poging++;
    } while (poging < 3);
    printf("pogingen %d\n", poging);
    return 0;
}

Voorspel: welke waarde heeft saldo na de while-lus? (100 → 60 → 20 → -20, dus -20.)

Een for in C bestaat uit drie delen: begin, voorwaarde, stap. for (int i = 0; i < n; i++) is het equivalent van Python's for i in range(n). break en continue werken zoals je gewend bent.

Typische fout: gehele deling

#include <stdio.h>

int main(void) {
    int punten = 7, totaal = 10;
    double fout = punten / totaal;           /* 0.0: eerst int-deling, dan pas omzetten */
    double goed = (double)punten / totaal;   /* 0.7 */
    printf("%.2f %.2f\n", fout, goed);
    return 0;
}

De deling wordt uitgerekend met de typen van de operanden. Twee ints → gehele deling, het resultaat 0 wordt daarna pas 0.0. Een cast (double) vóór één van de operanden lost het op.

Andere klassiekers:

  • if (x = 5) in plaats van if (x == 5): dat is een toekenning, altijd waar. -Wall waarschuwt: suggest parentheses around assignment used as truth value.
  • Puntkomma na de voorwaarde: for (i = 0; i < 10; i++); voert een lege lus uit.

Oefeningen

  1. Schrijf een for-lus die de tafel van 7 afdrukt (1 × 7 = 7 … 10 × 7 = 70).
  2. Wat drukt printf("%d\n", -7 / 2); af? En -7 % 2?
  3. Schrijf een do-while-lus die een getal blijft vragen tot de gebruiker iets tussen 1 en 10 invoert.
Modelantwoord
  1. for (int i = 1; i <= 10; i++) { printf("%d x 7 = %d\n", i, i * 7); }
  2. -3 en -1. In C wordt een gehele deling naar nul afgerond (Python's // rondt naar beneden af en geeft -4). De rest heeft hetzelfde teken als het deeltal.
  3. Een mogelijke uitwerking:
#include <stdio.h>

int main(void) {
    int getal = 0;
    do {
        printf("Getal (1-10): ");
        if (scanf("%d", &getal) != 1) {
            return 1;
        }
    } while (getal < 1 || getal > 10);
    printf("Je koos %d\n", getal);
    return 0;
}

Lab: rekenmachine met switch

  1. Schrijf rekenmachine.c dat een regel als 12.5 * 4 inleest met scanf("%lf %c %lf", ...).
  2. Gebruik een switch voor + - * / en geef een nette melding bij delen door nul of een onbekende operator.
  3. Herhaal tot de gebruiker 0 q 0 invoert.
  4. beetje check c-cpp-les4

Samenvatting

  • Operatoren lijken op Python, maar / tussen twee ints is een gehele deling. Gebruik een cast of .0.
  • switch heeft break nodig per case.
  • for, while en do-while dekken alle lussen; do-while draait minstens één keer.
  • Zet -Wall aan: het vangt = versus == en fall-through.

Volgende les: je code opdelen in functies en over meerdere bestanden verspreiden.

Lab

Rekenmachine met switch

💻 Dit lab doe je op je eigen computer met Docker. Start de lab-container met (geeft de opdracht een eigen startcommando, gebruik dan dat):

$ docker run -it --rm registry.wizg.it/webhosting/beetje-labs:c-cpp-les4

Volg daarna de stappen van de opdracht hierboven. Nog geen Docker? Zie les 14 van Een beetje Linux & Docker. Voor dit lab is er geen live lab in de browser.

Klaar? Controleer je werk met:

$ beetje check c-cpp-les4

📝 Quiz: operatoren en control flow

5 vragen · 70% nodig om te slagen

1. Wat is de waarde van `double x = 7 / 2;`?
2. Wat gebeurt er als je `break` vergeet in een case?
3. Welke lus voert de body altijd minstens één keer uit?
4. Wat is het probleem met `if (x = 5)`?
5. Wat is in C het equivalent van Python's `and`?