Écrire ses propres fonctions
Découper un programme en fonctions : paramètres, valeur de retour et passage par valeur.
Ce que tu vas apprendre
- Définir une fonction avec ses paramètres et son type de retour
- Appeler une fonction et utiliser sa valeur de retour
- Comprendre que les paramètres sont des copies
Définir une fonction
Une fonction s'écrit type nom(paramètres) { ... return valeur; }. Par exemple int carre(int x) { return x * x; } reçoit un entier et en renvoie un autre.
return renvoie le résultat et termine la fonction immédiatement. Une fonction peut avoir plusieurs return, par exemple un dans chaque branche d'un if.
Une fonction doit être déclarée avant d'être utilisée : écris-la au-dessus de main, ou place son prototype (int carre(int x);) en haut du fichier.
Fonctions « oui ou non »
Une fonction qui répond à une question renvoie 1 (vrai) ou 0 (faux), et s'utilise directement dans un if : if (est_pair(n)) { ... }. <stdbool.h> propose aussi le type bool avec true et false.
Les paramètres sont des copies
Quand on appelle f(n), la fonction reçoit une copie de la valeur de n. Modifier le paramètre dans la fonction ne change pas la variable de l'appelant (on verra en module 8 comment faire autrement, avec les pointeurs).
Les exercices « Complétez la fonction »
Dans ce module, le main est souvent fourni dans le code de départ : complète seulement la fonction demandée, sans changer son nom ni ses paramètres. Le correcteur vérifie que la fonction existe bien.
Exemples commentés
1.Aire d'un trapèze
#include <stdio.h>
double aire_trapeze(double grande, double petite, double hauteur) {
return (grande + petite) * hauteur / 2;
}
int main(void) {
double B, b, h;
scanf("%lf %lf %lf", &B, &b, &h);
printf("%.2f\n", aire_trapeze(B, b, h)); // appel dans printf
return 0;
}Entrée
6 4 3
Sortie
15.00
La fonction est définie au-dessus de main. Les noms des paramètres n'ont pas besoin d'être ceux des variables de l'appelant.
2.Une fonction qui répond oui ou non
#include <stdio.h>
int est_multiple(int a, int b) {
if (b == 0) {
return 0; // pas de division par zéro
}
return a % b == 0; // 1 si vrai, 0 sinon
}
int main(void) {
int a, b;
scanf("%d %d", &a, &b);
if (est_multiple(a, b)) {
printf("oui\n");
} else {
printf("non\n");
}
return 0;
}Entrée
21 7
Sortie
oui
Le premier return traite le cas particulier et arrête la fonction ; le second renvoie le résultat de la comparaison.
3.Un paramètre est une copie
#include <stdio.h>
void tenter_de_modifier(int x) {
x = 100; // modifie seulement la copie
printf("dans la fonction : %d\n", x);
}
int main(void) {
int n = 5;
printf("avant : %d\n", n);
tenter_de_modifier(n);
printf("apres : %d\n", n);
return 0;
}Sortie
avant : 5 dans la fonction : 100 apres : 5
La copie vaut bien 100 dans la fonction, mais n vaut toujours 5 dans main. Pour obtenir un résultat, on le renvoie avec return.
Chaque exemple est compilé et exécuté automatiquement pour garantir la sortie affichée.
Erreurs fréquentes
Oublier le return
À éviter
int carre(int x) {
x * x;
}À préférer
int carre(int x) {
return x * x;
}Sans return, la valeur renvoyée est indéterminée. gcc avertit : « control reaches end of non-void function ».
Utiliser une fonction avant de la déclarer
Si main appelle une fonction écrite plus bas sans prototype, gcc signale une « implicit declaration ». Place la fonction au-dessus de main ou ajoute son prototype.
Une division entière cachée
À éviter
double moyenne(int a, int b) {
return (a + b) / 2;
}À préférer
double moyenne(int a, int b) {
return (a + b) / 2.0;
}Le type de retour double ne change pas le calcul, qui est fait entre entiers avant d'être converti.
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 !
17 exercices pour mettre cette leçon en pratique, du plus simple au plus avancé.