Académique Documents
Professionnel Documents
Culture Documents
1) Introduction
▪ On appelle fonction un sous-programme qui permet d'effectuer un ensemble d'instructions par simple appel de la fonction dans le corps
du programme principal.
▪ Les fonctions permettent d'exécuter dans plusieurs parties du programme une série d'instructions,
→ cela permet une simplicité du code et donc une taille de programme minimale.
▪ Une fonction peut faire appel à elle-même, on parle alors de fonction récursive.
▪ Généralement, une fonction retourne une valeur qui est le résultat de l'exécution de son code.
1
Les fonctions 167
2) Déclaration
➢ Exemple :
int f (int i, int j); // déclaration d’une fonction nommée f qui retourne un entier et qui a comme paramètres (i et j) de type entier
2) Déclaration
▪ Le prototype d'une fonction est une description d'une fonction qui est définie plus loin dans le programme.
▪ Cette description permet au compilateur de « vérifier » la validité de la fonction à chaque fois qu'il la rencontre dans le programme.
int f (int , int ); // déclaration du prototype d’une fonction f qui retourne un entier et qui a deux paramètres de type entier
2
Les fonctions 169
3) Définition
▪ Il s'agit donc de la spécification de l'ensemble des instructions dont l'exécution réalise la tâche assurée par la fonction.
Indication : Les variables locales ne peuvent être utilisées qu'à l'intérieur de la fonction. Elles ne sont pas visibles à l'extérieur.
▪ Si aucun type n'est spécifié pour une fonction alors cette dernière est considérée par défaut comme étant de type int.
▪ L'instruction return provoque un arrêt immédiat de l'exécution des instructions du bloc associé à la fonction.
→ Elle permet de renvoyer une valeur à l'extérieur de la fonction en utilisant la syntaxe suivante :
return (valeur) ; Indication : L'utilisation des parenthèses avec return est facultative.
▪ Si l’instruction return est absente du corps d'une fonction, alors le programme continue son exécution des instructions jusqu'à l'accolade
fermant.
▪ La valeur renvoyée par return doit être du même type que celui de la fonction.
3
Les fonctions 171
▪ Une fonction peut être exploitée comme n'importe quelle autre valeur du même type.
▪ Par exemple, elle peut être récupérée et stockée dans une variable de la manière suivante :
int var;
….
var = NomFonction (arg1, arg2, arg3…);
▪ Suite à une exécution, une fonction ne peut retourner qu'une seule valeur et pas plus.
➢ Stratégie 1 : La déclaration de la fonction avant sa première utilisation (avant main()) et la définition après le programme principal.
➢ Stratégie 2 : La déclaration et la définition de la fonction avant sa première utilisation ( avant le programme principal main() ).
4
Les fonctions 173
▪ Par exemple, si on veut définir une fonction qui prend comme paramètre un nombre et qui affiche un message indiquant si ce nombre est
5
Les fonctions 175
► Fonction locale
▪ Tout comme les variables, une fonction peut être déclarée en C à l'intérieur d'un bloc (éventuellement une fonction) ou à l'extérieur.
▪ Si la déclaration est faite à l'intérieur alors la fonction est considérée comme locale à ce bloc et ne peut être appelée en dehors de celui-ci.
➢ Exemple :
#include <stdio.h>
int main(){
int somme (int a, int b ){ // déclaration et définition de la fonction somme
return a+b ;
}
int s = somme (5,4); // Appel de la fonction somme
printf("%d",s) ;
return 0 ;
}
► Fonction globale
▪ Une fonction est dite globale, si elle est déclarée en dehors de tout bloc.
▪ Elle peut être dans ce cas appelée de n'importe qu'elle endroit du programme.
➢ Exemple :
float moyenne (float n_ds , float n_ex ){ // déclaration et définition de la fonction moyenne int id ; float n_ds ; float n_ex ;
} scanf ("%d",&id) ;
void resultat (int id, float n_ds , float n_ex ){ // déclaration et définition de la fonction résultat printf(" Donner une note de DS = ") ;
}else {
printf("L'étudiant possédant l’id : %f a échoué la matière ",id) ; resultat (id, n_ds , n_ex ) ;
} return 0 ;
} }
6
Les fonctions 177
▪ Deux types de paramètres de fonctions peuvent être distingués : les paramètres formels et les paramètres effectifs.
▪ NB: Les paramètres formels et effectifs doivent s'accorder en nombre, ordre et type.
➢ Exemple:
int main(){
#include <stdio.h>
int s, x , y, z=10 ;
scanf ("%d",&x ) ;
int somme (int a , int b){
scanf ("%d",&y ) ; Le compilateur va afficher un message d’erreur :
return a+b ;
s= somme (x, y, z); error: too many arguments to function ‘somme’
}
printf("somme = %d", s) ; → Les paramètres formels et effectifs doivent s'accorder en nombre
return 0;
}
7
Les fonctions 179
▪ Suivant le rôle qu'ils assurent dans la fonction, les paramètres formels peuvent être classés en trois catégories :
▪ Suivant le rôle qu'ils assurent dans la fonction, les paramètres formels peuvent être classés en trois catégories :
→ Un paramètre "donnée" est une donnée nécessaire pour réaliser la tâche associée à la fonction.
…
int somme (int a , int b){
return a+b ;
}
….
8
Les fonctions 181
▪ Suivant le rôle qu'ils assurent dans la fonction, les paramètres formels peuvent être classés en trois catégories :
→ Un paramètre "résultat" est une variable qui est destinée à contenir le résultat de l'action de la fonction.
▪ Suivant le rôle qu'ils assurent dans la fonction, les paramètres formels peuvent être classés en trois catégories :
→ Il sert à passer une donnée à la fonction et que cette dernière modifie sa valeur.
…
void Permutation (int *a , int *b){
int aux ;
aux = *a ; *a=*b ; *b=aux ;
}
….
9
Les fonctions 183
▪ Dans ce mode, les valeurs des arguments au moment de l'appel (paramètres effectifs) sont recopiées dans les éléments de données locaux
▪ Après la sortie de la fonction, les valeurs des paramètres effectifs restent identiques à celles qu'ils avaient avant l'exécution de la fonction.
→ Pour les paramètres de type "résultat" ou "donnée-résultat", ce mode ne permet pas de récupérer les éventuelles modifications
➢ Syntaxe :
10
Les fonctions 185
… …
➢ Exemple 2 : Les deux paramètres a et b sont passées à la fonction Permutation par valeur.
… … Supposons que a = 1 et b = 2
void Permutation (int a , int b){ int main(){ // Appel de la fonction Permutation
aux = a ; scanf ("%d",&a ) ; scanf ("%d",&b ) ; Affiche a=1 b=2 (Les valeurs n’ont pas changé)
a=b; Permutation (a, b); → La modification effectuée sur a et b à l'intérieur
b = aux ; printf("a = %d | b = %d ", a , b) ; de la fonction Permutation n'est pas récupérée à
} return 0; l'extérieur de cette dernière.
} Pourquoi ?
….
11
Les fonctions 187
▪ Réponse : Les valeurs des arguments au moment de l'appel (paramètres effectifs) sont recopiées dans les éléments de données locaux
… a 1 2 b …
void Permutation (int a , int b){ int main(){ Copier
int aux ; a b aux
aux = a ; 1 2 1 …
a=b; 2 2 1 Permutation (a, b); 1 2
b = aux ; 2 1 1 … a b
} }
….
▪ Dans un passage par adresse d'un argument on impose à la fonction de travailler non plus sur une copie locale du paramètre effectif, mais
→ Pas de copie du paramètre effectif dans le paramètre formel, le travail se fait directement sur le paramètre effectif.
▪ De cette façon, toute modification effectuée à l'intérieur de la fonction sera en réalité réalisée sur le paramètre effectif.
▪ Ce mode de passage de paramètre est effectué en faisant passer à la fonction l'adresse du paramètre effectif.
→ Toute référence à ce dernier de l'intérieur de la fonction doit se faire à l'aide de l'opérateur d'indirection (*)
12
Les fonctions 189
➢ Syntaxe de déclaration
TypeFonction NomFonction (……, Type* ParamAdresse,…); // ParamAdresse étant le paramètre passé par adresse et Type étant son type
… *ParamAdresse ;
➢ Exemple
… a 1 2 b …
13
Les fonctions 191
▪ Si un tableau figure comme argument d'une fonction alors son passage se fait toujours par adresse.
→ Le passage d'un tableau comme paramètre d'une fonction est impossible en tant que valeur.
→ Cela permettra à la fonction d'effectuer des lectures et des écritures directement dans le tableau
→ Toutes les opérations et modifications appliquées à ses éléments seront visibles à l'extérieur de la fonction.
▪ Exemples :
14
Les fonctions 193
▪ Exemples :
Exercice d’application
1) Une fonction « Remplissage » pour remplir un tableau T par N entiers positifs entrés au clavier.
3) Une fonction « Recherche » qui permet de rechercher et d'afficher les valeurs qui se trouvent dans une plage donnée dans un tableau
d'entiers et l'utilisateur devra spécifier une valeur minimale et maximale de la plage de recherche.
15
Les fonctions 195
Exercice d’application
1) Une fonction « Remplissage » pour remplir un tableau T par N entiers positifs entrés au clavier.
Exercice d’application
16
Les fonctions 197
Exercice d’application
3) Une fonction « Recherche » qui permet de rechercher et d'afficher les valeurs qui se trouvent dans une plage donnée.
// Fonction pour afficher les valeurs dans la plage spécifiée int main(){
void Recherche (int T[], int N, int valeurMin, int valeurMax ) { ….
int i ; bool valeursTrouvees = false; int valeurMin, valeurMax ;
for (i = 0; i < N; i++) { // Demander à l'utilisateur la plage de recherche
if (T[i] >= valeurMin && T[i] <= valeurMax) { printf("\nEntrez la valeur minimale de la plage : ");
printf("%d ", T[i]); scanf("%d", &valeurMin);
valeursTrouvees = true; } printf("\nEntrez la valeur maximale de la plage : ");
} scanf("%d", &valeurMax);
// Si aucune valeur n'est trouvée dans la plage, afficher un message approprié Recherche (T, N, valeurMin, valeurMax ) ;
if (valeursTrouvees==false) { return 0;
printf("Aucune valeur trouvée dans la plage spécifiée."); } }
}
→ En d'autres mots, le corps de la fonction est inséré dans le module appelant à l'endroit de l'appel.
▪ À quoi ça sert ?
→ Les fonctions en ligne permettent d'accélérer l'exécution en évitant les allées-retours entre la fonction et le module appelant.
Remarques : → La déclaration et la définition d'une fonction en ligne doivent obligatoirement précéder son appel.
17
Les fonctions 199
➢ Syntaxe :
➢ Exemples :
// Fonction qui renvoie la valeur absolue de la variable x // Fonction qui renvoie le maximum de deux variables x et y
} }
… …
▪ La surcharge de fonctions consiste à proposer plusieurs définitions d'une même fonction au sein d'un même programme.
→ La signature d'une fonction est définie par le nombre, le type et l'ordre de ses paramètres.
▪ À quoi ça sert ?
→ On surcharge généralement les fonctions qui font le même traitement, mais sur des données de types différents.
18
Les fonctions 201
➢ Syntaxe :
➢ Exemples :
// Fonction qui renvoie la position de la valeur maximale dans le // Fonction qui renvoie la position de la valeur maximale dans le
tableau d’entiers T tableau de réels T
int MaxTab(int T[], int n) { int MaxTab(double T[], int n) {
int i, pos, max=T[0] ; int i, pos ; double max=T[0] ;
for(i=1 ; i<n ; i++) { for(i=1 ; i<n ; i++) {
if(T[i]> max) { if(T[i]> max){
max = T[i]; pos = i; } max = T[i]; pos = i; }
} }
return pos; return pos;
} }
TypeFonction NomFonction (Type_1 arg_1, Type_2 arg_2, , Type_3 arg_3 = Val); × n’est pas supporté en C
➢ Exemple
int f (int a , int b=0) ; // déclaration d’une fonction f qui a comme paramètre a et b qui a une valeur par défaut 0
▪ Le langage C ne supporte pas les arguments par défaut comme le C++ ou d’autres langages.
▪ Cela signifie que vous devez toujours fournir tous les arguments attendus par une fonction lorsque vous l’appelez,
19
Fin du cours
20