8PRO107 Éléments de programmation Les fonctions. La bibliothèque standard du C/C++ Il y a peu...
-
Upload
ame-salaun -
Category
Documents
-
view
102 -
download
0
Transcript of 8PRO107 Éléments de programmation Les fonctions. La bibliothèque standard du C/C++ Il y a peu...
8PRO107
Éléments de programmation
Les fonctions
La bibliothèque standard du C/C++
Il y a peu d'opérateurs arithmétiques en C/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 complexes,construits à partir des opérateurs de base, en appelant ces derniers : « fonctions ».
La plupart des environnements supportant le C/C++ standard disposent d'une large collection de fonctions appeléebibliothèque standard.
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 <cmath>
Il est alors possible d'employer des fonctions telles que:
cos(x) cosinus de xpow(x,y) x à la puissance ysqrt(x) racine carrée de xldexp(x,n)
et plusieurs autres.
Exemple : cmath
nx2
Exemple : cos(x)
#include <iostream>#include <cmath>
int main(){ double x; std::cin >> x; std::cout << cos(x); return 0;}
Il est bien connu que l'équation
où a, b et c sont des constantes, possède deux solutionsdonnées par la formule
Il est donc utile d'utiliser la fonction sqrt pour écrire un programme calculant les racines d'un polynôme.
Exemple : sqrt(x)
02 cbxax
a
acbb
2
42
#include <iostream>#include <cmath>
int main(){ double a, b, c; double racine1, racine2; double tmp;
std::cin >> a >> b >> c; tmp = sqrt(b*b - 4*a*c); racine1 = ( -b - tmp) / (2*a); racine2 = ( -b + tmp) / (2*a); std::cout << racine1 << std::endl << racine2 << std::endl; return 0;}
Exemple : sqrt(x)
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) retourneldexp(1, 1.1) retourne
Pourquoi???
Exemple : ldexp(x,n)
nx2
12*12 12*1.12.2
14.22*12 1.1
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
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.
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
Exercice: Pourquoi?
yx y)pow(x,
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 expressionen un autre type.
(type) expression
Exemple : pow(x,y)
Remarque
On voit ici une différence fondamentale entre le pseudocode et un vrai langage de programmation tel que le C/C++.
En pseudocode, on n'a pas à 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.
Exemple : pow(x,y)
32
Structure d'un programme en C/C++
Un programme en C/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.
Dé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.
En-tête
Nom de la fonctionType de la valeur retournéeNom des paramètresTypes des paramètres{
Corps Déclaration des variablesInstructions
Étude de cas 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.
Étude de cas 1
Calcul de la moyenne
Supposons l'existence d'une fonction ayant le prototype suivant:
moyenne3(entier, entier, entier) retourne un réel
Étude de cas 1
Fonction principale
Entiers : nombre1, nombre2, nombre3Réel: moyenne
LIRE nombre1, nombre2, nombre3moyenne moyenne3(nombre1, nombre2, nombre3)ÉCRIRE moyenne
Étude de cas 1
Définition de la fonction moyenne3
En-tête: moyenne3 (entier a, entier b, entier c) retourne un réel
Corps:réel mm (a + b + c) / 3RETOURNER m
Étude de cas 1
Définition de la fonction moyenne3
En-tête: moyenne3 (entier a, entier b, entier c) retourne un réel
Corps:réel 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.
Étude de cas 1
Pas-à-pas
Vérifions le comportement de notre algorithme sur l'exemplesuivant: 67 86 79
Après les déclarations suivantes :
Entiers : nombre1, nombre2, nombre3Réel : moyenne
l'état de la mémoire correspondà la figure de droite.
.
.
.
.
.
.
nombre1
nombre2
nombre3
moyenne
entier
entier
entier
réel
Étude de cas 1
LIRE nombre1, nombre2, nombre3
86
.
.
.
.
.
.
79
67nombre1
nombre2
nombre3
moyenne
entier
entier
entier
réel
Étude de cas 1
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.
Étude de cas 1Appel 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 tel qu'indiqué dans l'en-tête.
moyenne3 (nombre1, nombre2, nombre3)
moyenne3 ( 67 , 86 , 79 )
moyenne3 ( a , b , c )
paramètres d’appel
paramètres formels
Étude de cas 1
86
86
67
79
.
.
.
.
.
.
79
67nombre1
nombre2
nombre3
moyenne
entier
entier
entier
entierAinsi après l’appel de
moyenne3 (67, 86, 79)l'état de la mémoire devient:
a
b
c
entier
entier
réel
Étude de cas 1
86
86
67
79
.
.
.
.
.
.
79
67nombre1
nombre2
nombre3
moyenne
entier
entier
entier
réel
Exécution du corps de moyenne3
réel : mm (a + b + c) / 3RETOURNER m
D 'abord, la déclaration
réel : m
a
b
c
m
entier
entier
entier
réel
Étude de cas 1
86
86
67
79
.
.
.
.
.
.
79
67nombre1
nombre2
nombre3
moyenne
entier
entier
entier
réel
Exécution du corps de moyenne3
réel : 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
réel
Étude de cas 1
86
86
67
77.33
79
.
.
.
.
.
.
79
67nombre1
nombre2
nombre3
moyenne
entier
entier
entier
réel
Exécution du corps de moyenne3
réel : mm (a + b + c) / 3RETOURNER m
Et l'assignationm 77.33
a
b
c
m
entier
entier
entier
réel
Étude de cas 1
86
86
67
77.33
79
.
.
.
.
.
.
79
67nombre1
nombre2
nombre3
moyenne
entier
entier
entier
réel
Exécution du corps de moyenne3
réel : 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
réel
entier
Étude de cas 1
86
.
.
.
.
.
.
79
67nombre1
nombre2
nombre3
moyenne
entier
entier
entier
réel
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.
Étude de cas 1
Retour à la fonction principale:
LIRE nombre1, nombre2, nombre3moyenne 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.
Étude de cas 1
86
.
.
.
.
.
.
77.33
79
67nombre1
nombre2
nombre3
moyenne
entier
entier
entier
réel
La prochaine instruction à être exécutée est donc
moyenne 77.33
Finalement, l'instructionÉCRIRE moyenne
est exécutée
Étude de cas 2
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.
Étude de cas 2
Fonction principale
réels : longueur largeurLIRE longueur largeurAFFICHER aire(longueur, largeur)
où aire est une fonction dont le prototype est
aire(réel, réel) retourne un réel
Étude de cas 2
Définition de aire
En-tête:réel aire (réel longueur, réel largeur)
Corps:RETOURNER longueur * largeur
Étude de cas 2
Pas-à-pasVérifions le comportement de notre algorithme sur l'exemplesuivant: 3.5 7.2
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
Étude de cas 2
LIRE longueur, largeur
3.5
7.2
.
.
.
.
.
.
longueur
largeur
réel
réel
Étude de cas 2
ÉCRIRE aire(longueur, largeur)
D’abord, il faut évaluer
aire (longueur, largeur)
On appelle donc la fonction aire.
3.5
7.2
.
.
.
.
.
.
longueur
largeur
réel
réel
Étude de cas 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 cesnoms et contenant les mêmes valeurs sont créées.
3.5
3.5
7.2
7.2
.
.
.
.
.
.
longueur
largeur
réel
réel
longueur
largeur
réel
réel
Étude de cas 2
Les instructions du corps sont ensuite exécutées.
RETOURNER longueur * largeur= RETOURNER 3.5 * 7.2= RETOURNER 25.2
3.5
3.5
7.2
7.2
.
.
.
.
.
.
longueur
largeur
réel
réel
longueur
largeur
réel
réel
Étude de cas 2
Les instructions du corps sont ensuite exécutées.
RETOURNER longueur * largeur= RETOURNER 3.5 * 7.2= RETOURNER 25.2
3.5
3.5
7.2
7.2
.
.
.
.
.
.
longueur
largeur
réel
réel
longueur
largeur
réel
réel
Comment savoir à quelle casemémoire longueur et largeur
correspondent?
Étude de cas 2
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.
Étude de cas 2
Au retour de la fonction, les variables qui y ont été crééesdisparaissent.
L'expression
aire (3.5, 7.2)
vaut la valeur retournée, c'est-à-dire 25.2.
3.5
7.2
.
.
.
.
.
.
longueur
largeur
réel
réel
Étude de cas 2
L'instructionafficher aire(longueur, largeur)correspond àafficher 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éels: longueur largeurLIRE longueur largeurAFFICHER aire(longueur, largeur)
Retour dans la fonction principale
Étude de cas 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.
Étude de cas 3
Fonction principale 1
deux entiers: x, y
LIRE x, yAFFICHER x, yAFFICHER y, x
Ne satisfait pas la description du problème
Étude de cas 3Fonction principale 2
deux entiers : x, y
LIRE x, yAFFICHER 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.
Étude de cas 3
Définition 1 de échanger
En-tête:échanger (entier a, entier b)
Corps:a bb a
Étude de cas 3
Pas-à-pas
Entrée: 10 15
entier x, yLIRE x, y
10
15
.
.
.
.
.
.
x
y
entier
entier
Étude de cas 3
AFFICHER x, yéchanger (x, y)
10
10
15
15
.
.
.
.
.
.
x
y
entier
entier
ab entier
entier
échanger (entier a, entier b) a b b a
Étude de cas 3
é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
Étude de cas 3
é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!!!
Définition 2 de échanger
En-tête: échanger (entier a, entier b)
Corps: entier : tmp
tmp a a b b tmp
Étude de cas 3
10
10
15
15
.
.
.
.
.
.
x
y
entier
entier
ab entier
entier
Étude de cas 3
10
10
15
15
.
.
.
.
.
.
x
y
entier
entier
ab entier
entier
tmp entier
entier tmp
tmp aa bb tmp
entier: tmp
entier tmp
tmp aa bb tmp
Étude de cas 3
10
10
15
10
15
.
.
.
.
.
.
x
y
entier
entier
ab entier
entier
tmp a entiertmp
entier tmp
tmp aa bb tmp
Étude de cas 3
10
15
15
10
15
.
.
.
.
.
.
x
y
entier
entier
ab
entier
entier
a btmp
entier
entier tmp
tmp aa bb tmp
Étude de cas 3
10
15
15
10
10
.
.
.
.
.
.
x
y
entier
entier
ab
entier
entier
b tmp
tmp
entier
Étude de cas 3
10
15
.
.
.
.
.
.
x
y
entier
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!!!
Étude de cas 3Définition 3 de échanger
En-tête:échanger (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
Étude de cas 3
.
.
.
.
.
.
paramètres passés par copie
paramètres formels: a, b
paramètres d'appel: x, y
x
a
b
y
Étude de cas 3
.
.
.
.
.
.
paramètres passés par référence
paramètres formels: a, b
paramètres d'appel: x, y
a x
b y
Étude de cas 3
Pas-à-pas
Entrée: 10 15
entiers : x, yLIRE x, y
AFFICHER x yéchanger(x, y)AFFICHER x y
10
15
.
.
.
.
.
.
x
y
entier
entier
Étude de cas 3
Entiers : x, yLIRE x, y
AFFICHER x, yéchanger (x, y)
AFFICHER x, y
10
15
.
.
.
.
.
.
a x
b y
entier
entier
entier tmp
tmp aa bb tmp
Étude de cas 3
entier: tmp
10
15
.
.
.
.
.
.
a x
b y
entier
entier
tmp entier
Dans echanger
entier: tmp
tmp aa bb tmp
Étude de cas 3
tmp a
10
10
15
.
.
.
.
.
.
a x
b y
entier
entier
tmp entier
Dans echanger
entier: tmp
tmp aa bb tmp
Étude de cas 3
a b
15
10
15
.
.
.
.
.
.
a x
b y
entier
entier
tmp entier
Dans echanger
entier: tmp
tmp aa bb tmp
Étude de cas 3
b tmp
15
10
10
.
.
.
.
.
.
a x
b y
entier
entier
tmp entier
Dans echanger
Retour à la fonction principale
entiers: x y
LIRE x yAFFICHER x yéchanger(x, y)AFFICHER x y
Ce qui donne bien le résultat souhaité.
Étude de cas 3
15
10
.
.
.
.
.
.
a x
b y
entier
entier
Résumé
• 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
Les trois études de cas précédentes ont servi à illustrer les concepts suivants:
Dé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.
En-tête
Nom de la fonctionType de la valeur retournéeNom des paramètresTypes des paramètres{
Corps Déclaration des variablesInstructions
Les paramètres
Paramètres formels: Ceux utilisés dans la définition.
Paramètres d’appel: Ceux utilisés lors de l’appel.
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 sur, pour utiliser une fonction il n’est pas nécessaire de connaître le nom de ses paramètres formels.
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.
L'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.
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.
Étude de cas 1: version C/C++trois entiers : nombre1, nombre2, nombre3réel : moyenne
LIRE nombre1, nombre2, nombre3moyenne moyenne3 (nombre1, nombre2, nombre3)AFFICHER moyenne
#include <iostream>int moyenne3 (int, int, int);int main(){ int nombre1, nombre2, nombre3; int moyenne;
std::cin >> nombre1 >> nombre2 >> nombre3; moyenne = moyenne3 (nombre1, nombre2, nombre3); std::cout << moyenne; return 0;}
Étude de cas 1: version C/C++
En-tête: moyenne3 ( entier a, entier b, entier c) retourne un réel
Corps:réel mm (a + b + c) / 3RETOURNER m
double moyenne3 (int a, int b, int c){ double m; m = (a + b + c) / 3.0; return m;}
Étude de cas 2: version C/C++deux réels : longueur largeur
LIRE longueur largeurAFFICHER aire(longueur, largeur)
#include <iostream>double aire (double, double);int main(){ double longueur, largeur;
std::cin >> longueur >> largeur; std::cout << aire(longueur, largeur); return 0;}
Étude de cas 2: version C/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;}
Étude de cas 3: version C/C++deux entiers : x, y
LIRE x, yAFFICHER x, yéchanger(x, y)AFFICHER x, y
#include <iostream>void echanger(int &, int &);int main(){ int x, y;
std::cin >> x >> y; std::cout << x << y; echanger(x, y); std::cout << x << y; return 0;}
Étude de cas 3: version C/C++En-tê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;}
Remarque
•En C++, le symbole & sert à indiquer qu'un paramètre est passé par référence.
•Il est utilisé dans l’en-tête de la définition ainsi que dans le prototype.
•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.