1 les fonctions. 2 pourquoi les fonctions? besoin de regrouper un ensemble dinstructions pour...
TRANSCRIPT
1
Les fonctions
2
Pourquoi les fonctions?
• Besoin de regrouper un ensemble d’instructions pour décomposer la complexité d’un programme,
• De même, il peut être nécessaire de décomposer ce programme en modules effectuant un travail une fois pour toute (par exemple la multiplication de deux matrices, un tri, un algorithme d’identification, ...tc)
• Il peut arriver aussi qu’un même traitement intervienne plusieurs fois dans un programme.
3
Dans ce cas, il est intéressant de pouvoir faire appel plusieurs fois au même module.
Ces notions sont le plus souvent recouvertes par le sous concept de sous-programmes.
En C, ces sous-programmes sont appelés FONCTIONS.
4
• Il existe deux types de fonctions:
1. Les fonctions pré-définies
2. Nos propres fonctions
5
Les fonctions pré-definies
• La plupart des environnements supportant le C standard disposent d'une large collection de fonctions appelée bibliothèque standard.
Plusieurs fonctions mathématiques courantes font parties de la bibliothèque standard. Pour les utiliser, il suffit d'inclure au début du programme la ligne suivante:
• #include <math.h>
• Il est alors possible d'employer des fonctions telles que:
6
• cos(x) cosinus de x• pow(x,y) x à la puissance y• sqrt(x) racine carrée de
x• ldexp(x,n) ……
et plusieurs autres.
7
Exemple 1: cos(x)
#include <iostream.h>#include <math.h>
main(){ double x; cin >> x; cout << cos(x);}
8
Exemple: sqrt(x)
Il est bien connu que l'équation
02 cbxax
a
acbb
2
42
où a,b et c sont des constantes, possède deux solutions données par la formule
Il est donc utile d'utiliser la fonction sqrt pour écrire un programme calculant les racines d'un polynôme.
9
Exemple: sqrt(x)#include <iostream.h>#include <math.h>
main(){ double a, b, c; double racine1, racine2; double delta; cin>>a>>b>>c; delta = sqrt(b*b - 4*a*c); if (delta >=0) { racine1 = ( -b - delta) / (2*a); racine2 = ( -b + delta) / (2*a); cout<<racine1<<endl<<racine2<<endl; } else cout << ‘’pas de solution dans les réels’’; return (0);}
10
Examinons plus en détails la fonction ldexp.
Rappelons que cette fonction retourne la valeur
Considérons quelques exemples:
ldexp(1,1) retourne ldexp(1.1, 1) retourneldexp(1,1.1) retourne
Pourquoi???
Exemple: ldexp(x,n)
nx2
12*12 12*1.12.2
14.22*12 1.1
11
Exemple: ldexp(x,n)
Pour comprendre ce qui se passe il faut savoir que la fonction ldexp attend deux nombres en entrée: x et n.
• x doit être un double• n doit être un entier• la fonction retourne un double
Donc lorsque l'on exécute ldexp(1, 1.1), la fonction reçoiten fait les valeurs 1 et 1 puisque la partie fractionnairedu second opérande est tronquée.
22*11) ldexp(1,1.1) ldexp(1,2*1 11.1
12
Morale: avant d'utiliser une fonction de la bibliothèque il faut connaître son prototype.
Le prototype d'une fonction indique • le nom de la fonction• le type des paramètres • le type de la valeur de retour
Les prototypes de fonctions
Exemple:double ldexp(double, int)
indique que ldexp est une fonction à deux paramètres (un double et un int) qui retourne un double.
13
Exemple: pow(x,y)
La fonction d'exponentiation a le prototype suivant:
double pow(double x, double y)
de sorte qu'on ne peut pas l'utiliser de la façon suivante:
pow(2, 3) % 5
Pourquoi?
yx y)pow(x,
14
Il faut plutôt écrire:
(int) pow(2, 3) % 5
ou encore
( (int)pow(2,3) ) % 5
L'opérateur cast permet de convertir le type d'une expressionen un autre type.
(type) expression
Exemple: pow(x,y)
15
Remarque
On voit ici une différence fondamentale entre le pseudo-code et un vrai langage de programmation tel que le C.
En pseudo-code, on n'a pas à se soucier des détails particuliers à un langage. Par exemple, on écrit:
x modulo 5
sans que cela ne cause de problème. Cela permet de se concentrer sur l'algorithme plutôt que sur la syntaxe.
Exemple: pow(x,y)
32
16
Une liste de quelquesde fonctions mathématiques
• ceil(x) retourne la valeur entiere par excès de x• floor(x) retourne la valeur entiere par défaut de x• fabs(x) retourne la valeur aboslue dun valeur réelle x• log(x) retourne le logaritme népérein de x• log10(x) retourne le logaritme décimal de x• sin(x) retourne le sinus de x• sqrt(x) retourne la racine carrée x• tan(x) retourne la tangente de x Vérifier à chaque fois leur prototype
17
Structure d'un programme en C
Un programme en C est une collection de fonctions quiinteragissent entre elles afin d'exécuter un calcul.
Une des fonctions doit porter le nom main: c'est la première fonction à être appelée lors de l'exécution du programme.
Comme on l'a vu, on peut utiliser les fonctions de la bibliothèque standard ou encore, on peut définir nos propres fonctions
18
Définition des fonctions
Dans la plupart des langages de programmation, la définition d'une fonction comporte deux parties:l'entête et le corps.
Entête
Nom de la fonctionType de la valeur retournéeNom des paramètresTypes des paramètres{
Corps Déclaration des variablesInstructions
19
Étude de cas
Calcul de la moyenne
Description du problème: Étant donné 3 entiers, calculer leur moyenne sous forme d'entier tronqué et afficher le résultat.
Entrée: Trois entiers séparés par un ou plusieurs caractères d'espacement.
Sortie: Un entier représentant la partie entière de la moyenne.
20
Calcul de la moyenne
Supposons l'existence d'une fonction ayant le prototype suivant:
entier moyenne3(entier, entier, entier)
21
Fonction principale
entier nombre1 nombre2 nombre3entier moyenne
lire nombre1 nombre2 nombre3moyenne moyenne3(nombre1, nombre2, nombre3)écrire moyenne
22
Définition de la fonction moyenne3
Entête: entier moyenne3( entier a, entier b, entier c)
Corps:entier mm (a + b + c) / 3retourner m
23
Définition de la fonction moyenne3
Entête: entier moyenne3(entier a, entier b, entier c)
Corps:entier mm (a + b + c) / 3retourner m
À l'appel de lafonction, les variables
a,b et c sont déclarées puis initialisées avec la valeur
des paramètres utiliséslors de l'appel.
24
Pas-à-pas
Vérifions le comportement de notre algorithme sur l'exemplesuivant: 67 86 79
Après les déclaration suivantes:
entier nombre1 nombre2 nombre3entier moyenne
l'état de la mémoire correspondà la figure de droite.
.
.
.
.
.
.
nombre1
nombre2
nombre3
moyenne
entier
entier
entier
entier
25
lire nombre1 nombre2 nombre3
86
.
.
.
.
.
.
79
67nombre1
nombre2
nombre3
moyenne
entier
entier
entier
entier
26
L'analyse de l'instructionmoyenne moyenne3(nombre1, nombre2, nombre3)est plus compliquée.
On doit d'abord évaluer l'expressionmoyenne3(nombre1, nombre2, nombre3)
Pour ce faire, il faut remplacer les variables par leurvaleur respective:
moyenne3(67, 86, 79)
Puis, la fonction moyenne3 est appelée.
27
Appel de moyenne3
Lorsqu'une fonction est appelée, chacun de ses paramètres est copié dans une nouvelle variable.
Le nom de ces nouvelles variables correspond au nom des paramètres tels qu'indiqué dans l'entête.
moyenne3(nombre1, nombre2, nombre3)
moyenne3( 67 , 86 , 79 )
moyenne3( a , b , c )
paramètres d’appel
paramètres formels
28
86
86
67
79
.
.
.
.
.
.
79
67nombre1
nombre2
nombre3
moyenne
entier
entier
entier
entier
Ainsi après l'appel de moyenne3(67, 86, 79)
l'état de la mémoire devient:
a
b
c
entier
entier
entier
Remarquer que les variablesformelles a, b et c sont crééeset initialisées à 67, 86 et 79.
29
86
86
67
79
.
.
.
.
.
.
79
67nombre1
nombre2
nombre3
moyenne
entier
entier
entier
entier
Exécution du corps de moyenne3
entier mm (a + b + c) / 3retourner m
D 'abord, la déclaration
entier m
a
b
c
m
entier
entier
entier
entier
30
86
86
67
79
.
.
.
.
.
.
79
67nombre1
nombre2
nombre3
moyenne
entier
entier
entier
entier
Exécution du corps de moyenne3
entier mm (a + b + c) / 3retourner m
Puis l'évaluation de l'expression (a + b + c) / 3= (67 + 86 + 79) / 3= (153 + 79) / 3= 232 / 3= 77.33
a
b
c
m
entier
entier
entier
entier
31
86
86
67
77
79
.
.
.
.
.
.
79
67nombre1
nombre2
nombre3
moyenne
entier
entier
entier
entier
Exécution du corps de moyenne3
entier mm (a + b + c) / 3retourner m
Et l'assignationm 77.33
Remarquez que 77 qui est mis dans m et non pas 77.33.
a
b
c
m
entier
entier
entier
entier
32
86
86
67
77
79
.
.
.
.
.
.
79
67nombre1
nombre2
nombre3
moyenne
entier
entier
entier
entier
Exécution du corps de moyenne3
entier mm (a + b + c) / 3retourner m
Finalement, la valeur souhaitéeest retournée à l'aide de l'instruction spéciale:
retourner m
a
b
c
m
entier
entier
entier
entier
33
86
.
.
.
.
.
.
79
67nombre1
nombre2
nombre3
moyenne
entier
entier
entier
entier
Au sortir d'une fonction, toutes les variables qui y ont été déclarées ainsi que toutes les variables contenants les paramètres disparaissent.
34
Retour à la fonction principale:
lire nombre1 nombre2 nombre3moyenne moyenne3(nombre1, nombre2, nombre3)écrire moyenne
Puisque la valeur retournée par moyenne3 est 77, cela veut dire que
moyenne3(67, 86, 79)est une expression s'évaluant à 77.
35
86
.
.
.
.
.
.
77
79
67nombre1
nombre2
nombre3
moyenne
entier
entier
entier
entier
La prochaine instruction à être exécutée est donc
moyenne 77
Finalement, l'instructionécrire moyenne
est exécutée
36
Calcul de l'aire d'un rectangle
Description du problème: Calculer et afficher • l'aire d'un rectangle.
• Entrée: Deux nombres réels, le premier indique la longueur et le second indique la largeur du rectangle.
• Sortie: Un nombre réel représentant l'aire du rectangle.
37
Fonction principale
réel longueur largeurlire longueur largeurécrire aire(longueur, largeur)
où aire est une fonction dont le prototype est
réel aire(réel, réel)
38
• Définition de aire
• Entête:
• réel aire(réel longueur, réel largeur)
• Corps:
• retourner longueur * largeur
39
Pas-à-pasVérifions le comportement de notre algorithme sur l'exemplesuivant: 7.2 3.5
Après les déclaration suivantes:
réel longueur largeur
l'état de la mémoire correspondà la figure de droite.
.
.
.
.
.
.
longueur
largeur
réel
réel
40
lire longueur largeur
7.2
3.5
.
.
.
.
.
.
longueur
largeur
réel
réel
41
écrire aire(longueur, largeur)
D'abord il faut évaluer
aire(longueur, largeur)
On appelle donc la fonction aire.
7.2
3.5
.
.
.
.
.
.
longueur
largeur
réel
réel
42
Appel de la fonction aire
Puisque l'entête de la fonction spécifie que les nom des paramètres sont longueur et largeur, cela veut dire que deux nouvelles variables portant cesnoms et contenant les mêmes valeurs sont créées.
7.2
7.2
3.5
3.5
.
.
.
.
.
.
longueur
largeur
réel
réel
longueur
largeur
réel
réel
43
Les instructions du corps de l;a fonction sont ensuite exécutées.
retourner longueur * largeur= retourner 7.2 * 3.5= retourner 25.2
7.2
7.2
3.5
3.5
.
.
.
.
.
.
longueur
largeur
réel
réel
longueur
largeur
réel
réel
44
Les instructions du corps sont ensuite exécutées.
retourner longueur * largeur= retourner 7.2* 3.5= retourner 25.2
7.2
7.2
3.5
3.5
.
.
.
.
.
.
longueur
largeur
réel
réel
longueur
largeur
réel
réel
Comment savoir à quelle casemémoire longueur et largeur
correspondent?
45
3.5
3.5
7.2
7.2
.
.
.
.
.
.
longueur
largeur
réel
réel
longueur
largeur
réel
réel
Déclarés et visibles seulement dans la fonction principale
Déclarés et visibles seulement dans la fonction aire
Une variable déclaréedans une fonction n'est visibleque dans cette fonction.
46
Au retour de la fonction, les variables qui y ont été crééesdisparaissent.
L'expression
aire(7.2, 3.5)
vaut la valeur retournée, c'est-à-dire 25.2.
7.2
3.5
.
.
.
.
.
.
longueur
largeur
réel
réel
47
L'instructionécrire aire(longueur, largeur)correspond àécrire 25.2
Ce qui est bien ce que l'on voulait que notre programme fasse!
3.5
7.2
.
.
.
.
.
.
longueur
largeur
réel
réel
réel longueur largeurlire longueur largeurécrire aire(longueur, largeur)
Retour dans la fonction principale
48
Échanger deux valeurs
Description du problème:• Lire deux entiers, les afficher dans l'ordre où ils
ont été lus puis, les afficher dans l'ordre inverse.• Utiliser une fonction pour inverser le contenu de
deux variables.
• Entrée: Deux entiers.
• Sortie: Les deux même entiers, dans l'ordre inverse.
49
Fonction principale 1
entier x y
lire x yécrire x yécrire y x
Mais cela ne satisfait pas la description du problème
50
• Fonction principale 2
• entier x y
• lire x y• ecrire x y• echanger(x, y)• ecrire x y
• où echanger est une fonction dont le prototype est:
• echanger(entier, entier)
• Remarque: la fonction echanger ne retourne aucune valeur.
51
• Définition 1 de echanger
• Entête:
• echanger(entier a, entier b)
• Corps:
• a b
• b a
52
Pas-à-pas
Entrée: 10 15
entier x ylire x y
10
15
.
.
.
.
.
.
x
y
entier
entier
53
écrire x yéchanger(x, y)
10
10
15
15
.
.
.
.
.
.
x
y
entier
entier
ab entier
entier
54
échanger(entier a, entier b) a b b a
10
15
15
15
.
.
.
.
.
.
x
y
entier
entier
ab entier
entier
On exécute d ’abord
a b
55
échanger(entier a, entier b) a b b a
10
15
15
15
.
.
.
.
.
.
x
y
entier
entier
ab entier
entier
Puis on exécute
b a
Problème!!!
56
Définition 2 de échanger
Entête: échanger(entier a, entier b)
Corps: entier tmp
tmp a a b b tmp
10
10
15
15
.
.
.
.
.
.
x
y
entier
entier
ab entier
entier
57
10
10
15
15
.
.
.
.
.
.
x
y
entier
entier
ab entier
entier
tmp entier
entier tmp
tmp aa bb tmp
58
entier tmp
tmp aa bb tmp
10
10
15
10
15
.
.
.
.
.
.
x
y
entier
entier
ab entier
entier
tmp a entiertmp
59
entier tmp
tmp aa bb tmp
10
15
15
10
15
.
.
.
.
.
.
x
y
entier
entier
ab
entier
entier
a btmp
entier
60
entier tmp
tmp aa bb tmp
10
15
15
10
10
.
.
.
.
.
.
x
y
entier
entier
ab
entier
entier
b tmp
tmp
entier
61
10
15
.
.
.
.
.
.
x
y
entier
entierÉtat de la mémoire au retour de la fonction echanger:
On a échangé le contenu des variables a et b mais pas celui des variable x et y!!!
62
Définition 3 de échanger
Entête:echanger(entier référence a, entier référence b)
où a et b ne sont pas des copies mais des références aux paramètres d'appel.
Corps:entier tmp
tmp aa bb tmp
63
.
.
.
.
.
.
paramètres passés par copie
paramètres formels: a, b
paramètres d'appel: x, y
x
a
b
y
64
.
.
.
.
.
.
paramètres passés par référence
paramètres formels: a, b
paramètres d'appel: x, y
a x
b y
65
Pas-à-pas
Entrée: 10 15
entier x ylire x y
écrire x yéchanger(x, y)écrire x y
10
15
.
.
.
.
.
.
x
y
entier
entier
66
entier x ylire x y
écrire x yéchanger(x, y)
écrire x y
10
15
.
.
.
.
.
.
a x
b y
entier
entier
67
entier tmp
tmp aa bb tmp
entier tmp
10
15
.
.
.
.
.
.
a x
b y
entier
entier
tmp entier
Dans echanger
68
entier tmp
tmp aa bb tmp
tmp a
10
10
15
.
.
.
.
.
.
a x
b y
entier
entier
tmp entier
Dans echanger
69
entier tmp
tmp aa bb tmp
15
10
15
.
.
.
.
.
.
a x
b y
entier
entier
tmp entier
Dans echanger
70
entier tmp
tmp aa bb tmp b tmp
15
10
10
.
.
.
.
.
.
a x
b y
entier
entier
tmp entier
Dans la fonction echanger
71
Retour à la fonction principale
entier x y
lire x yécrire x yéchanger(x, y)écrire x y
Ce qui donne bien le résultat souhaité.
15
10
10
.
.
.
.
.
.
a x
b y
entier
entier
tmp entier
72
Résumé
• utilisation des fonctions pour étendre les possibilités de l'ordinateur.• prototype d'une fonction• définition d'une fonction.• les paramètres • l'appel d'une fonction• le retour d'une fonction• l'utilisation d'une variable tampon
Les trois études de cas précédents ont servi à illustrer les concepts suivants:
73
Définition des fonctions
Dans la plupart des langage de programmation, la définition d'une fonction comporte deux parties:l'entête et le corps.
Entête
Nom de la fonctionType de la valeur retournéeNom des paramètresTypes des paramètres{
Corps Déclaration des variablesInstructions
74
Les paramètres
Paramètres formels: Ceux utilisés dans la définition.
Paramètres d'appel: Ceux utilisés lors de l'appel.
75
Avant d'utiliser une fonction de la bibliothèque il faut connaître son prototype.
Le prototype d'une fonction indique • le nom de la fonction• le type des paramètres • le type de la valeur de retour
Les prototypes de fonctions
Bien sûr, pour utiliser une fonction il n'est pas nécessaire de connaître le nom de ses paramètres formels.
76
Passage de paramètres
Par copie: Les paramètres d'appel sont copiés dans les paramètres formels: création de nouvelles variables.
Par référence: Les paramètre formels réfèrent aux paramètres d'appel: plusieurs noms pour une même case mémoire.
77
Appel de fonctions
• Création de nouvelles variables pour chacun des paramètres passés par copie.
•Le contrôle est donné à la fonction: la première ligne du corps de la fonction est d'abord exécutée.
Remarques: Le nom des variables déclaré dans une fonctions est local à cette fonction et il est invisible aux autres fonctions.
Deux fonctions distinctes peuvent utiliser le même identificateur pour nommer deux cases mémoire distinctes.
78
Retour d'une fonction
À l'intérieur d'une fonction, l'instruction
retourner expression
est exécutée de la façon suivante:
• L'expression est d'abord évaluée.• Le résultat est retourné à la fonction appelante• Toutes les variables ayant été créées après l'appel de la fonction sont détruites.• Le contrôle est redonné à la fonction appelante.
79
entier nombre1 nombre2 nombre3entier moyenne
lire nombre1 nombre2 nombre3moyenne moyenne3(nombre1, nombre2, nombre3)écrire moyenne
#include <iostream.h>int moyenne3(int, int, int); /* prototype de la fonction*/ /* est déclaré avant la fonction main */main(){int nombre1, nombre2, nombre3;int moyenne;cin >> nombre1 >> nombre2 >> nombre3;moyenne = moyenne3(nombre1, nombre2, nombre3);cout << moyenne;return (0)}
Version C
80
Version CEntête:
entier moyenne3( entier a, entier b, entier c)Corps:
entier mm (a + b + c) / 3retourner m
int moyenne3(int a, int b, int c) /* définition de la fonction */{ int m; m = (a + b + c) / 3; return m;}
81
version C (air du rectangle)réel longueur largeur
lire longueur largeurécrire aire(longueur, largeur)
#include <iostream.h>double aire(double, double);/* prototype de la fonction*/main(){ double longueur, largeur; cin >> longueur >> largeur; cout << aire(longueur, largeur); /* appel de la fonction */
return(0)}
82
Version c
Entête:réel aire(réel longueur, réel largeur)
Corps:retourner longueur * largeur
double aire(double longueur, double largeur) /* définition de la fonction */{ return (longueur * largeur);}
83
Version C (échanger)entier x y
lire x yécrire x yéchanger(x, y)écrire x y
#include <iostream.h>void echanger(int &, int &);main(){ int x, y; cin >> x >> y; cout << x << y; echanger(x, y); cout << x << y;}
84
Version CEntête:
échanger(entier référence a, entier référence b)Corps:
entier tmp
tmp aa bb tmp
void echanger(int &a, int &b){ int tmp;
tmp = a; a = b; b = tmp;}
85
void: est utilisé pour signifier:
1. une fonction ne retourne pas de valeur;
2. une fonction est définie sans paramètres
86
Remarque• En C++, dans une fonction, le symbole & sert à indiquer qu'un paramètre est passé par référence.
• Il est utilisé dans l'entête de la définition ainsi que dans le prototype.
•Cependant, il n'est pas utilisé lors de l'appel de la fonction.
• En C il n`y a pas de passage de paramètres par référence. Pour obtenir le même effet (c'est-à-dire pour pouvoir changer la valeur d'un paramètre) il faut utiliser les pointeurs que nous verrons plus tard.
87
Autres exemples
1. En utilisant les fonctions, écrire un programme en C qui détermine le PGCD de deux valeurs.
88
#include <iostream.h> /* prototype dde la fonction*/ int PGCD(int,int); main(){ int m,n; cin >>n>>n; cout <<‘’le PGCD est ‘’<<PGCD(n.m); return (0); }*/ définition de la fonction */ int PGCD(int A, int B){ int reste; reste = A % B; while (reste != 0){ A = B; B = reste; reste = A % B; } return (B); } /* fin de la fonction */
89
Exo 2. Reprendre l’exemple du calcul de la racine carrée
avec une fonction #include <stdio>#include <math.h> double racine(double); */ prototype de la fonction */ main(){ double a, rac0,rac1; cin >>a; cout << "la racine carrée de "<<a; cout << " est "<<racine(a); return (0); } double racine(double a) { rac1 = (1+a)/2; do rac0 = rac1; rac1 = (rac0 + a/rac0)*0.5; while (fabs((rac1 – rac0)/rac0) > 0.00001) return (rac1); }
90
3. À l’aide d’une fonction, écrire un programme qui visualise le texte: Bonjour, comment allez-vous?
#include <iostream.h> void texte(void) /* prototype de la fonction*/ main(){ texte; /* appel à la fonction texte */ return (0); }void texte ( ) /* définition de la fonction */ { cout << ‘’Bonjour, comment allez-vous?\n’’; }