Académique Documents
Professionnel Documents
Culture Documents
Les fonctions 1
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.
→ Il est possible en C/C++ de définir des fonctions qui ne retournent aucune valeur.
1
Les fonctions 2
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
Les fonctions 3
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 4
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.
Les fonctions 5
▪ 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 6
▪ Elle 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() )
Les fonctions 7
4
Les fonctions 8
Les fonctions 9
▪ 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 10
► 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 :
Les fonctions 11
► 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 cout<< " Donner id = " ;
void resultat (int id, float n_ds , float n_ex ){ // déclaration et définition de la fonction résultat cin >> n_ds ;
float res ; res = moyenne (n_ds , n_ex ); cout<< "Donner une note de l’examen = " ;
cout << "L'étudiant possédant l’id : " << id << " a réussi la matière " ;
else resultat (id, n_ds , n_ex ) ;
cout << "L'étudiant possédant l’id : " << id << " a échoué la matière " ; return 0 ;
} }
6
Les fonctions 12
▪ Deux types de paramètres de fonctions peuvent être distingués : les paramètres formels et les paramètres effectifs.
→ sont ceux qui figurent dans la définition de la fonction. using namespace std; Paramètres formels
→ Ils sont utilisés dans les instructions faisant partie du bloc de la fonction et là seulement. int somme (int a , int b){
return a+b ;
→ Ces paramètres sont considérés comme des variables locales à la fonction.
}
Les fonctions 13
▪ NB: Les paramètres formels et effectifs doivent s'accorder en nombre, ordre et type.
➢ Exemple:
int main(){
#include <iostream>
int s, x , y, z=10 ;
cin >> x ;
int somme (int a , int b){
cin >> y ; Le compilateur va afficher un message d’erreur :
return a+b ;
s= somme (x, y, z); error: too many arguments to function ‘somme’
}
cout<<"somme ="<<s ; → Les paramètres formels et effectifs doivent s'accorder en nombre
return 0;
}
7
Les fonctions 14
▪ Suivant le rôle qu'ils assurent dans la fonction, les paramètres formels peuvent être classés en trois catégories :
Les fonctions 15
▪ 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 16
▪ 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.
Les fonctions 17
▪ 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 18
▪ C'est le mode de passage d'arguments le plus courant en C/C++ et le plus simple également.
▪ 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
Les fonctions 19
➢ Syntaxe :
10
Les fonctions 20
… …
a=3*a; int a ;
…. CalculerTriple (a)
cout<< "le résultat est =" << a ; // Affiche 3 puisque la valeur de a n'a pas changé
return 0;
}
Les fonctions 21
➢ Exemple 2: Les deux paramètres a et b sont passées à la fonction Permutation par valeur.
Supposons que a = 1 et b = 2
… …
// Appel de la fonction Permutation
void Permutation (int a , int b){ int main(){
Résultat ?
int aux ; int a,b ;
aux = a ;
Affiche a=1 b=2 (Les valeurs n’ont pas changé)
cin>> a >> b ;
a=b ; Permutation (a, b); → La modification effectuée sur a et b à l'intérieur
b=aux ; cout<< "a=" << a << "b=" << 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 22
▪ 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
} }
….
Les fonctions 23
▪ 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 24
➢ Syntaxe de déclaration
TypeFonction NomFonction (……, Type* ParamAdresse,…); // ParamAdresse étant le paramètre passé par adresse et Type étant son type
… *ParamAdresse ;
Les fonctions 25
➢ Exemple
… a 1 2 b …
13
Les fonctions 26
▪ Par rapport au C, le C++ introduit un nouveau mode de passage de paramètres appelé le passage par référence.
▪ Dans le passage par référence, toute modification effectuée sur le paramètre formel de la fonction est répercutée directement sur le
paramètre effectif.
▪ La déclaration d'un passage par référence s'effectue en adjoignant au type du paramètre à passer le symbole &.
Les fonctions 27
➢ Syntaxe de déclaration
TypeFonction NomFonction (…, Type& ParamRéf,…); // ParamRéf étant le paramètre passé par référence et Type étant son type
… ParamRéf ;
14
Les fonctions 28
➢ Exemple :
… …
Les fonctions 29
▪ 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.
15
Les fonctions 30
▪ Exemples :
Passage par adresse : le tableau est converti implicitement en pointeur vers son premier élément lors de l'appel .
Ceci serait donc équivalent : void Incrementation (int *TabEnt , int Taille)
Les fonctions 31
▪ Exemples :
16
Les fonctions 32
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.
Les fonctions 33
Exercice d’application
1) Une fonction « Remplissage » pour remplir un tableau T par N entiers positifs entrés au clavier.
17
Les fonctions 34
Exercice d’application
Les fonctions 35
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) { cout<<endl<<"Entrez la valeur minimale de la plage : ";
cout << T[i]<< " "; cin>>valeurMin;
valeursTrouvees = true; } cout<<endl<<"Entrez la valeur maximale de la plage : ";
} cin>>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;
cout << "Aucune valeur trouvée dans la plage spécifiée."; } }
}
18
Les fonctions 36
→ 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.
Les fonctions 37
➢ Syntaxe :
➢ Exemples :
// Fonction qui renvoie la valeur absolue de la variable x // Fonction qui renvoie le maximum de deux variables x et y
} }
… …
19
Les fonctions 38
▪ 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.
Les fonctions 39
➢ 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=0 ; i<n ; i++) { for(i=0 ; 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;
} }
20
Les fonctions 40
▪ Des valeurs par défaut peuvent être affectées aux arguments d'une fonction.
▪ Ces arguments ont généralement des valeurs habituelles qu'il n'est pas nécessaire de spécifier à chaque utilisation.
➢ 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
Remarque1 : Seuls les derniers arguments, de la droite vers la gauche peuvent avoir des valeurs par défaut
Les fonctions 41
▪ Remarque 2 :
→ Si la valeur d'un argument par défaut a été spécifiée dans la déclaration de la fonction, alors elle ne doit pas être mentionnée à
→ Si une fonction est directement définie, alors la valeur par défaut doit être spécifiée dans la définition
➢ Exemple :
… } return 0;
} }
Au moment de l'appel de la fonction, la spécification de
l'argument par défaut est optionnelle
21
Fin du cours
22