Les 4
Operatoren en control flow
Rekenen, vergelijken, if/else, switch en de drie soorten lussen in C.
🎯 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 vanif (x == 5): dat is een toekenning, altijd waar.-Wallwaarschuwt:suggest parentheses around assignment used as truth value.- Puntkomma na de voorwaarde:
for (i = 0; i < 10; i++);voert een lege lus uit.
Oefeningen
- Schrijf een
for-lus die de tafel van 7 afdrukt (1 × 7 = 7 … 10 × 7 = 70). - Wat drukt
printf("%d\n", -7 / 2);af? En-7 % 2? - Schrijf een do-while-lus die een getal blijft vragen tot de gebruiker iets tussen 1 en 10 invoert.
Modelantwoord
for (int i = 1; i <= 10; i++) { printf("%d x 7 = %d\n", i, i * 7); }-3en-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.- 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
- Schrijf
rekenmachine.cdat een regel als12.5 * 4inleest metscanf("%lf %c %lf", ...). - Gebruik een
switchvoor+ - * /en geef een nette melding bij delen door nul of een onbekende operator. - Herhaal tot de gebruiker
0 q 0invoert. beetje check c-cpp-les4
Samenvatting
- Operatoren lijken op Python, maar
/tussen twee ints is een gehele deling. Gebruik een cast of.0. switchheeftbreaknodig percase.for,whileendo-whiledekken alle lussen;do-whiledraait minstens één keer.- Zet
-Wallaan: 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
Klaar? Controleer je werk met:
$ beetje check c-cpp-les4