Title: 8PRO100
18PRO100
Éléments de programmation
Les fonctions
2La bibliothèque standard du C
Il y a peu d'opérateurs arithmétiques en C, mais
à partir de ceux que nous avons vus il est
possible d'en construire d'autres. On distingue
les opérateurs de base des opérateurs
complexe, construits à partir des opérateurs de
base, en appelant ces derniers fonctions. La
plupart des environnements supportants le C
standard disposent d'une large collection de
fonctions appelée bibliothèque standard.
3Exemple math.h
Plusieurs fonctions mathématiques courantes font
partie de la bibliothèque standard. Pour les
utiliser, il suffit d'inclure au début du
programme la ligne suivante include
ltmath.hgt Il est alors possible d'employer des
fonctions telles que 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.
4Exemple cos(x)
include ltiostream.hgt include
ltmath.hgt main() double x cin gtgt x cout ltlt
cos(x)
5Exemple sqrt(x)
Il est bien connu que l'équation 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.
6Exemple sqrt(x)
include ltiostream.hgt include
ltmath.hgt main() double a, b, c double
racine1, racine2 double tmp cingtgtagtgtbgtgtc tmp
sqrt(bb - 4ac) racine1 ( -b - tmp) /
(2a) racine2 ( -b tmp) /
(2a) coutltltracine1ltltendlltltracine2ltltendl
7Exemple ldexp(x,n)
Examinons plus en détails la fonction
ldexp. Nous savons que cette fonction retourne
la valeur Considérons quelques
exemples ldexp(1 , 1) retourne ldexp(1.1,
1) retourne ldexp(1, 1.1) retourne
Pourquoi???
8Exemple 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çoit - en fait les valeurs 1 et 1 puisque la partie
fractionnaire - du second opérande est tronquée.
9Les prototypes de fonctions
- 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
Exemple double ldexp(double, int) indique que
ldexp est une fonction à deux paramètres (un
double et un int) qui retourne un double.
10Exemple 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 Exercice Pourquoi?
11Exemple pow(x,y)
Il faut plutot écrire (int) pow(2, 3) 5 ou
encore ( (int)pow(2,3) ) 5 L'opérateur cast
permet de convertir le type d'une expression en
un autre type. (type) expression
12Exemple pow(x,y)
Remarque On voit ici une différence fondamentale
entre le pseudocode et un vrai language de
programmation tel que le C. En pseudocode, on
n'a pas a se soucier des détails particulier à un
langage. Par exemple, on écrit modulo 5 sans
que cela ne cause de problème. Cela permet de se
concentrer sur l'algorithme plutôt que sur la
syntaxe.
13Structure d'un programme en C
Un programme en C est une collection de fonctions
qui interagissent 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
14Définition des fonctions
Dans la plupart des langages de programmation, la
définition d'une fonction comporte deux
parties l'en-tête et le corps.
Nom de la fonction Type de la valeur
retournée Nom des paramètres Types des paramètres
En-tête
Déclaration des variables Instructions
Corps
15Étude de cas 4.1
Calcul de la moyenne Description du problème
Étant donné 3 entiers, calculer leur moyenne et
afficher le résultat. Entrée Trois entiers
séparés par un ou plusieurs caractères
d'espacement. Sortie Un réel représentant la
moyenne.
16Étude de cas 4.1
Calcul de la moyenne Supposons l'existence d'une
fonction ayant le prototype suivant moyenne3(ent
ier, entier, entier) retourne un réel
17Étude de cas 4.1
Fonction principale Entiers nombre1 nombre2
nombre3 Réel moyenne lire nombre1 nombre2
nombre3 moyenne moyenne3(nombre1, nombre2,
nombre3) afficher moyenne
18Étude de cas 4.1
Définition de la fonction moyenne3 En-tête
moyenne3( entier a, entier b, entier c)
retourne un réel Corps entier m m (a b
c) / 3 retourner m
19Étude de cas 4.1
Définition de la fonction moyenne3 En-tête
moyenne3( entier a, entier b, entier c)
retourne un réel Corps entier m m (a b
c) / 3 retourner m
À l'appel de la fonction, les variables a,b et c
sont déclarées puis initialisées avec la
valeur des paramètres utilisés lors de l'appel.
20Étude de cas 4.1
Pas-à-pas Vérifions le comportement de notre
algorithme sur l'exemple suivant 67 86 79
nombre1
entier
nombre2
entier
nombre3
entier
moyenne
réel
Après les déclaration suivantes Entiers
nombre1 nombre2 nombre3 Réel moyenne l'état de
la mémoire correspond à la figure de droite.
. . .
. . .
21Étude de cas 4.1
67
nombre1
entier
86
nombre2
entier
79
nombre3
entier
moyenne
réel
lire nombre1 nombre2 nombre3
. . .
. . .
22Étude de cas 4.1
L'analyse de l'instruction moyenne
moyenne3(nombre1, nombre2, nombre3) est plus
compliquée. On doit d'abord évaluer
l'expression moyenne3(nombre1, nombre2,
nombre3) Pour ce faire, il faut remplacer les
variables par leur valeur respective moyenne3(67
, 86, 79) Puis, la fonction moyenne3 est appelée.
23Étude de cas 4.1
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'en-tête.
moyenne3(nombre1, nombre2, nombre3) moyenne3(
67 , 86 , 79
) moyenne3( a , b ,
c )
24Étude de cas 4.1
67
nombre1
entier
86
nombre2
entier
79
nombre3
entier
moyenne
réel
Ainsi après lappel de moyenne3(67, 86,
79) l'état de la mémoire devient
67
entier
a
86
entier
b
79
c
entier
. . .
. . .
25Étude de cas 4.1
Exécution du corps de moyenne3 réel m m (a
b c) / 3 retourner m D 'abord, la
déclaration réel m
67
nombre1
entier
86
nombre2
entier
79
nombre3
entier
moyenne
réel
67
a
entier
86
entier
b
79
c
entier
m
réel
. . .
. . .
26Étude de cas 4.1
Exécution du corps de moyenne3 réel m m (a
b c) / 3 retourner m Puis l'évaluation de
l'expression (a b c) / 3 (67 86 79)
/ 3 (153 79) / 3 232 / 3 77.33
67
nombre1
entier
86
nombre2
entier
79
nombre3
entier
moyenne
réel
67
a
entier
86
entier
b
79
c
entier
m
réel
. . .
. . .
27Étude de cas 4.1
Exécution du corps de moyenne3 entier m m (a
b c) / 3 retourner m Et l'assignation m
77.33
67
nombre1
entier
86
nombre2
entier
79
nombre3
entier
moyenne
réel
67
a
entier
86
entier
b
79
c
entier
77.33
m
réel
. . .
. . .
28Étude de cas 4.1
Exécution du corps de moyenne3 entier m m (a
b c) / 3 retourner m Finalement, la valeur
souhaitée est retournée à l'aide de l'instruction
spéciale retourner m
67
nombre1
entier
86
nombre2
entier
79
nombre3
entier
moyenne
réel
67
a
entier
86
entier
b
79
c
entier
77.33
m
réel
. . .
. . .
29Étude de cas 4.1
67
nombre1
entier
86
nombre2
entier
Au sortir dune fonction, toutes les variables
qui y ont été déclarées ainsi que toutes les
variables contenants les paramètres
disparaissent.
79
nombre3
entier
moyenne
réel
. . .
. . .
30Étude de cas 4.1
Retour à la fonction principale lire nombre1
nombre2 nombre3 moyenne moyenne3(nombre1,
nombre2, nombre3) écrire moyenne Puisque la
valeur retournée par moyenne3 est 77.33, cela
veut dire que moyenne3(67, 86, 79) est une
expression s'évaluant à 77.33.
31Étude de cas 4.1
67
nombre1
entier
La prochaine instruction à être exécutée est
donc moyenne 77.33
86
nombre2
entier
79
nombre3
entier
77.33
moyenne
réel
Finalement, l'instruction afficher moyenne est
exécutée
. . .
. . .
32Étude de cas 4.2
Calcul de laire d'un rectangle Description du
problème Calculer et afficher laire 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 laire du rectangle.
33Étude de cas 4.2
Fonction principale réels longueur
largeur lire longueur largeur afficher
aire(longueur, largeur) où aire est une fonction
dont le prototype est aire(réel, réel) retourne
un réel
34Étude de cas 4.2
Définition de aire En-tête réel aire(réel
longueur, réel largeur) Corps retourner
longueur largeur
35Étude de cas 4.2
Pas-à-pas Vérifions le comportement de notre
algorithme sur l'exemple suivant 3.5 7.2
longueur
réel
réel
largeur
Après les déclaration suivantes réel longueur
largeur létat de la mémoire correspond à la
figure de droite.
. . .
. . .
36Étude de cas 4.2
longueur
réel
3.5
7.2
réel
largeur
lire longueur largeur
. . .
. . .
37Étude de cas 4.2
longueur
réel
3.5
écrire aire(longueur, largeur) Dabord il faut
évaluer aire(longueur, largeur) On appelle donc
la fonction aire.
7.2
réel
largeur
. . .
. . .
38Étude de cas 4.2
Appel de la fonction aire Puisque l'en-tête de
la fonction spécifie que les nom des paramètres
sont longueur et largeur, cela veut dire que deux
nouvelles variables portant ces noms et contenant
les mêmes valeurs sont créées.
longueur
réel
3.5
7.2
réel
largeur
3.5
longueur
réel
7.2
largeur
réel
. . .
. . .
39Étude de cas 4.2
longueur
réel
3.5
Les instructions du corps sont ensuite
exécutées. retourner longueur largeur
retourner 3.5 7.2 retourner 25.2
7.2
réel
largeur
3.5
longueur
réel
7.2
largeur
réel
. . .
. . .
40Étude de cas 4.2
longueur
réel
3.5
Les instructions du corps sont ensuite
exécutées. retourner longueur largeur
retourner 3.5 7.2 retourner 25.2
7.2
réel
largeur
3.5
longueur
réel
7.2
largeur
réel
. . .
. . .
Comment savoir à quelle case mémoire longueur et
largeur correspondent?
41Étude de cas 4.2
Déclarés et visibles seulement dans la fonction
principale
longueur
réel
3.5
7.2
réel
largeur
3.5
longueur
réel
Déclarés et visibles seulement dans la fonction
aire
7.2
largeur
réel
. . .
. . .
Une variable déclarée dans une fonction nest
visible que dans cette fonction.
42Étude de cas 4.2
Au retour de la fonction, les variables qui y ont
été créées disparaissent. L'expression aire(3.5
, 7.2) vaut la valeur retournée, c'est-à-dire
25.2.
longueur
réel
3.5
7.2
réel
largeur
. . .
. . .
43Étude de cas 4.2
Retour dans la fonction principale
réels longueur largeur lire longueur
largeur afficher aire(longueur, largeur)
longueur
réel
3.5
7.2
réel
largeur
L'instruction afficher aire(longueur,
largeur) correspond à afficher 25.2 Ce qui est
bien ce que l'on voulait que notre programme
fasse!
. . .
. . .
44Étude de cas 4.3
É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.
45Étude de cas 4.3
Fonction principale 1 deux entiers x y lire x
y afficher x y afficher y x
Ne satisfait pas la description du problème
46Étude de cas 4.3
Fonction principale 2 deux entiers x y lire x
y afficher x y échanger(x, y) afficher x y où
échanger est une fonction dont le prototype
est échanger(entier, entier) Remarque la
fonction échanger ne retourne aucune valeur.
47Étude de cas 4.3
Définition 1 de échanger En-tête échanger(entie
r a, entier b) Corps a b b a
48Étude de cas 4.3
10
x
entier
Pas-à-pas Entrée 10 15 entier x y lire x y
15
y
entier
. . .
. . .
49Étude de cas 4.3
afficher x y échanger(x, y)
10
x
entier
15
y
entier
10
a
entier
b
15
entier
échanger(entier a, entier b) a b b
a
. . .
. . .
50Étude de cas 4.3
échanger(entier a, entier b) a b b
a
10
x
entier
15
y
entier
15
a
entier
b
15
entier
. . .
. . .
On exécute d abord a b
51Étude de cas 4.3
échanger(entier a, entier b) a b b
a
10
x
entier
15
y
entier
15
a
entier
b
15
entier
Puis on exécute b a Problème!!!
. . .
. . .
52Étude de cas 4.3
Définition 2 de échanger En-tête
échanger(entier a, entier b) Corps entier
tmp tmp a a b b tmp
10
x
entier
15
y
entier
10
a
entier
b
15
entier
. . .
. . .
53Étude de cas 4.3
10
x
entier
15
y
entier
entier tmp tmp a a b b tmp
entier tmp
10
a
entier
b
15
entier
entier
tmp
. . .
. . .
54Étude de cas 4.3
10
x
entier
15
y
entier
entier tmp tmp a a b b tmp
10
a
entier
b
15
entier
tmp a
tmp
10
entier
. . .
. . .
55Étude de cas 4.3
10
x
entier
15
y
entier
entier tmp tmp a a b b tmp
15
a
entier
b
15
entier
tmp
10
entier
a b
. . .
. . .
56Étude de cas 4.3
10
x
entier
15
y
entier
entier tmp tmp a a b b tmp
15
a
entier
b
10
entier
tmp
10
entier
. . .
. . .
b tmp
57Étude de cas 4.3
10
x
entier
15
y
entier
État de la mémoire au retour de la fonction
échanger On a échangé le contenu des variables
a et b mais pas celui des variable x et y!!!
. . .
. . .
58Étude de cas 4.3
Définition 3 de échanger En-tête échanger(entie
r 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 dappel. Corps entier tmp tmp
a a b b tmp
59Étude de cas 4.3
x
paramètres passés par copie paramètres formels
a, b paramètres d'appel x, y
y
a
b
. . .
. . .
60Étude de cas 4.3
a º x
paramètres passés par référence paramètres
formels a, b paramètres d'appel x, y
b º y
. . .
. . .
61Étude de cas 4.3
Pas-à-pas Entrée 10 15 entiers x y lire x
y afficher x y échanger(x, y) afficher x y
10
x
entier
15
y
entier
. . .
. . .
62Étude de cas 4.3
10
a º x
entier
entiers x y lire x y afficher x y échanger(x,
y) afficher x y
b º y
15
entier
. . .
. . .
63Étude de cas 4.3
Dans echanger
10
a º x
entier
b º y
15
entier
entier tmp tmp a a b b tmp
entier tmp
tmp
entier
. . .
. . .
64Étude de cas 4.3
Dans echanger
10
a º x
entier
b º y
15
entier
entier tmp tmp a a b b tmp
10
tmp
entier
tmp a
. . .
. . .
65Étude de cas 4.3
Dans echanger
15
a º x
entier
b º y
15
entier
entier tmp tmp a a b b tmp
10
tmp
entier
a b
. . .
. . .
66Étude de cas 4.3
Dans echanger
15
a º x
entier
b º y
10
entier
entier tmp tmp a a b b tmp
10
tmp
entier
. . .
. . .
b tmp
67Étude de cas 4.3
Retour à la fonction principale entiers x
y lire x y afficher x y échanger(x, y) afficher
x y Ce qui donne bien le résultat souhaité.
15
a º x
entier
b º y
10
entier
. . .
. . .
68Résumé
Les trois études de cas précédents ont servi à
illustrer les concepts suivants
- Utilisations 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
69Définition des fonctions
Dans la plupart des langage de programmation, la
définition d'une fonction comporte deux
parties l'en-tête et le corps.
Nom de la fonction Type de la valeur
retournée Nom des paramètres Types des paramètres
En-tête
Déclaration des variables Instructions
Corps
70Les paramètres
Paramètres formels Ceux utilisés dans la
définition. Paramètres dappel Ceux utilisés
lors de lappel.
71Les prototypes de fonctions
- 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
Bien sur, pour utiliser une fonction il nest pas
nécessaire de connaître le nom de ses paramètres
formels.
72Passage de paramètres
Par copie Les paramètres dappel 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
dappel plusieurs noms pour une
même case mémoire.
73L'appel de fonctions
- Créations 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 fonction
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.
74Retour d'une fonction
- À l'intérieur d'une fonction, l'instruction
- retourner expression
- est exécutée de la façon suivante
- Lexpression 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.
75Étude de cas 4.1 version C
trois entiers nombre1 nombre2 nombre3 réel
moyenne lire nombre1 nombre2 nombre3 moyenne
moyenne3(nombre1, nombre2, nombre3) afficher
moyenne
include ltiostream.hgt int moyenne3(int, int,
int) main() int nombre1, nombre2, nombre3
int moyenne cin gtgt nombre1 gtgt nombre2 gtgt
nombre3 moyenne moyenne3(nombre1, nombre2,
nombre3) cout ltlt moyenne
76Étude de cas 4.1 version C
En-tête moyenne3( entier a, entier b, entier
c) retourne un réel Corps réel m m (a b
c) / 3 retourner m
float moyenne3(int a, int b, int c) float m
m (a b c) / 3.0 return m
77Étude de cas 4.2 version C
deux réels longueur largeur lire longueur
largeur afficher aire(longueur, largeur)
include ltiostream.hgt double aire(double,
double) main() double longueur, largeur
cin gtgt longueur gtgt largeur cout ltlt
aire(longueur, largeur)
78Étude de cas 4.2 version C
En-tête aire(réel longueur, réel largeur)
retourne un réel Corps retourner longueur
largeur
double aire(double longueur, double largeur)
return longueur largeur
79Étude de cas 4.3 version C
deux entiers x y lire x y afficher x
y échanger(x, y) afficher x y
include ltiostream.hgt void echanger(int , int
) main() int x, y cin gtgt x gtgt y cout
ltlt x ltlt y echanger(x, y) cout ltlt x ltlt y
80Étude de cas 4.3 version C
En-tête échanger(entier référence a, entier
référence b) Corps entier tmp tmp a a
b b tmp
void echanger(int a, int b) int tmp tmp
a a b b tmp
81Remarque
- En C le symbole sert à indiquer qu'un
paramètre est passé par référence. - Il est utilisé dans len-tête de la définition
ainsi que dans le prototype. - Il n'est pas utilisé lors de lappel de la
fonction. - En C il ny 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.