informatique (MP2I/MPI) · Chapitre 1 · Exercice de TD
Compter sans déborder
Le langage C · niveau 2
Énoncé
Écrire une fonction qui compte les occurrences d'un caractère dans une chaîne, avec sa spécification complète.
Corrigé
/* Renvoie le nombre d'occurrences de c dans la chaîne s.
Précondition : s est une chaîne valide, terminée par '\0'.
Postcondition : le résultat est compris entre 0 et strlen(s). */
int occurrences(const char s[], char c) {
assert(s != NULL);
int compte = 0;
/* INVARIANT : compte est le nombre d'occurrences de c dans s[0..i-1]. */
for (int i = 0; s[i] != '\0'; i = i + 1) {
if (s[i] == c) { compte = compte + 1; }
}
return compte;
}
Trois points de méthode. La boucle s'arrête sur la sentinelle et non sur une longueur calculée d'avance : un seul parcours, . Le paramètre est const — la fonction promet de ne rien modifier, et le compilateur le vérifie. Et l'invariant est écrit là où on peut le lire, juste au-dessus de la boucle.