Organiser un programme : portée, static et décomposition
Où vivent les variables, les variables static, et l'art de découper un problème en fonctions.
Ce que tu vas apprendre
- Comprendre la portée et la durée de vie d'une variable
- Utiliser une variable locale
static - Découper un problème en petites fonctions qui s'appellent
Portée des variables
Une variable déclarée dans une fonction (ou dans un bloc { }) n'existe que dans cette fonction : c'est une variable locale. Deux fonctions peuvent avoir chacune leur variable i sans conflit.
Une variable locale est recréée à chaque appel : elle ne se souvient pas de la valeur de l'appel précédent.
Les variables static
Avec le mot-clé static, une variable locale est créée une seule fois et garde sa valeur d'un appel à l'autre. Son initialisation n'a lieu qu'au premier appel. Elle reste invisible en dehors de la fonction.
Décomposer un problème
Un bon découpage donne des fonctions courtes, qui font une seule chose et portent un nom clair. Elles se testent séparément et se réutilisent : une fonction est_premier sert aussi bien à compter les nombres premiers qu'à trouver des jumeaux.
Exemple d'algorithme qui se prête bien à une fonction : la recherche dichotomique dans un tableau trié. On compare la valeur cherchée à la case du milieu, puis on recommence dans la moitié qui peut la contenir. Chaque étape divise la zone de recherche par deux.
Exemples commentés
1.Un total qui se souvient
#include <stdio.h>
int ajouter(int x) {
static int total = 0; // initialisé une seule fois
total += x;
return total;
}
int main(void) {
int n, x;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &x);
printf("%d\n", ajouter(x));
}
return 0;
}Entrée
3 5 3 10
Sortie
5 8 18
Sans static, total repartirait de 0 à chaque appel et la fonction renverrait simplement x.
2.Découper en fonctions
#include <stdio.h>
int en_minutes(int h, int m) {
return h * 60 + m;
}
void afficher_duree(int minutes) {
printf("%dh%02d\n", minutes / 60, minutes % 60); // %02d : 2 chiffres
}
int main(void) {
int h1, m1, h2, m2;
scanf("%d %d %d %d", &h1, &m1, &h2, &m2);
afficher_duree(en_minutes(h2, m2) - en_minutes(h1, m1));
return 0;
}Entrée
9 45 11 10
Sortie
1h25
Chaque fonction fait une seule chose. main se lit presque comme une phrase : « afficher la durée entre les deux horaires ».
Chaque exemple est compilé et exécuté automatiquement pour garantir la sortie affichée.
Erreurs fréquentes
Attendre qu'une variable locale se souvienne
À éviter
int compteur(void) {
int n = 0;
n++;
return n; // toujours 1
}À préférer
int compteur(void) {
static int n = 0;
n++;
return n;
}Une variable locale ordinaire est recréée à chaque appel.
Une fonction qui fait tout
Une fonction de 60 lignes est difficile à corriger. Si tu dois commenter « partie 1, partie 2 », chaque partie mérite sa propre fonction.
Entraîne-toi
6 questions variées pour fixer la leçon : choix, résultat à prévoir, ligne à compléter, code à remettre dans l'ordre, erreur à trouver.
À toi de jouer !
10 exercices pour mettre cette leçon en pratique, du plus simple au plus avancé.