📘 Le cours : répéter en C
Répéter une action est la raison d'être d'un ordinateur. Une boucle bien écrite a toujours trois ingrédients : un départ, une condition d'arrêt et un pas qui fait progresser vers cet arrêt. Si l'un des trois manque, la boucle ne s'arrête jamais ou ne démarre pas.
La boucle for
for (init; condition; pas) : l'initialisation est faite une seule fois, la condition est testée avant chaque tour, le pas est exécuté après chaque tour.
#include <stdio.h>
int main(void) {
for (int i = 1; i <= 5; i++) {
printf("7 x %d = %d\n", i, 7 * i);
}
return 0;
}
Affichage7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35
Le pas n'est pas forcément i++ : i += 2 avance de deux en deux, i-- ou i -= 3 compte à rebours.
#include <stdio.h>
int main(void) {
for (int i = 10; i > 0; i -= 3) {
printf("%d ", i);
}
printf("\n");
return 0;
}
Convention
Pour parcourir n éléments, on écrit for (int i = 0; i < n; i++) : les indices vont de 0 à n−1, donc la condition est i < n et jamais i <= n.
La boucle while
while (condition) convient quand on ne sait pas à l'avance combien de tours seront nécessaires. Ici, on additionne les chiffres de 2845 : tant qu'il reste un chiffre, on prend le dernier (n % 10) puis on le retire (n /= 10).
#include <stdio.h>
int main(void) {
int n = 2845;
int somme = 0;
while (n > 0) {
somme += n % 10; /* dernier chiffre */
n /= 10; /* on le retire */
}
printf("%d\n", somme); /* 5 + 4 + 8 + 2 */
return 0;
}
do … while : au moins un tour
Le test est fait à la fin du bloc : c'est idéal pour redemander une saisie tant qu'elle est invalide. Remarque le ; obligatoire après le while (…).
#include <stdio.h>
int main(void) {
int n;
do {
printf("Un nombre entre 1 et 10 : ");
scanf("%d", &n);
} while (n < 1 || n > 10);
printf("Merci : %d\n", n);
return 0;
}
Si tu tapes 42 puis 7Un nombre entre 1 et 10 : 42
Un nombre entre 1 et 10 : 7
Merci : 7
break et continue
break quitte la boucle ; continue abandonne le tour en cours et passe au suivant (dans un for, le pas est quand même exécuté).
#include <stdio.h>
int main(void) {
int somme = 0;
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; /* on saute les nombres pairs */
}
somme += i;
}
printf("somme des impairs : %d\n", somme);
return 0;
}
Affichagesomme des impairs : 25
#include <stdio.h>
int main(void) {
int n = 51;
while (1) { /* boucle sans fin... */
if (n % 7 == 0) {
break; /* ...arrêtée de l'intérieur */
}
n++;
}
printf("premier multiple de 7 apres 50 : %d\n", n);
return 0;
}
Affichagepremier multiple de 7 apres 50 : 56
Boucles imbriquées
Une boucle peut en contenir une autre : pour chaque tour de la boucle extérieure, la boucle intérieure recommence depuis le début.
#include <stdio.h>
int main(void) {
for (int ligne = 1; ligne <= 4; ligne++) {
for (int k = 0; k < ligne; k++) {
printf("*");
}
printf("\n");
}
return 0;
}
Le corps de la boucle intérieure s'exécute 1 + 2 + 3 + 4 = 10 fois. Avec n lignes, le nombre de tours croît comme n² : c'est la complexité quadratique étudiée dans T(n) et O().