90
1 Les fonctions

1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

Embed Size (px)

Citation preview

Page 1: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

1

Les fonctions

Page 2: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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.

Page 3: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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.

Page 4: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

4

• Il existe deux types de fonctions:

1. Les fonctions pré-définies

2. Nos propres fonctions

Page 5: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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:

Page 6: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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.

Page 7: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

7

Exemple 1: cos(x)

#include <iostream.h>#include <math.h>

main(){ double x; cin >> x; cout << cos(x);}

Page 8: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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.

Page 9: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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);}

Page 10: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 11: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 12: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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.

Page 13: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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,

Page 14: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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)

Page 15: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 16: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 17: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 18: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 19: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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.

Page 20: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

20

Calcul de la moyenne

Supposons l'existence d'une fonction ayant le prototype suivant:

entier moyenne3(entier, entier, entier)

Page 21: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

21

Fonction principale

entier nombre1 nombre2 nombre3entier moyenne

lire nombre1 nombre2 nombre3moyenne moyenne3(nombre1, nombre2, nombre3)écrire moyenne

Page 22: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 23: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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.

Page 24: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 25: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

25

lire nombre1 nombre2 nombre3

86

.

.

.

.

.

.

79

67nombre1

nombre2

nombre3

moyenne

entier

entier

entier

entier

Page 26: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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.

Page 27: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 28: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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.

Page 29: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 30: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 31: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 32: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 33: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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.

Page 34: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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.

Page 35: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 36: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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.

Page 37: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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)

Page 38: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

38

• Définition de aire

• Entête:

• réel aire(réel longueur, réel largeur)

• Corps:

• retourner longueur * largeur

Page 39: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 40: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

40

lire longueur largeur

7.2

3.5

.

.

.

.

.

.

longueur

largeur

réel

réel

Page 41: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 42: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 43: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 44: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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?

Page 45: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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.

Page 46: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 47: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 48: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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.

Page 49: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 50: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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.

Page 51: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

51

• Définition 1 de echanger

• Entête:

• echanger(entier a, entier b)

• Corps:

• a b

• b a

Page 52: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

52

Pas-à-pas

Entrée: 10 15

entier x ylire x y

10

15

.

.

.

.

.

.

x

y

entier

entier

Page 53: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

53

écrire x yéchanger(x, y)

10

10

15

15

.

.

.

.

.

.

x

y

entier

entier

ab entier

entier

Page 54: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 55: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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!!!

Page 56: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 57: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

57

10

10

15

15

.

.

.

.

.

.

x

y

entier

entier

ab entier

entier

tmp entier

entier tmp

tmp aa bb tmp

Page 58: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

58

entier tmp

tmp aa bb tmp

10

10

15

10

15

.

.

.

.

.

.

x

y

entier

entier

ab entier

entier

tmp a entiertmp

Page 59: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

59

entier tmp

tmp aa bb tmp

10

15

15

10

15

.

.

.

.

.

.

x

y

entier

entier

ab

entier

entier

a btmp

entier

Page 60: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

60

entier tmp

tmp aa bb tmp

10

15

15

10

10

.

.

.

.

.

.

x

y

entier

entier

ab

entier

entier

b tmp

tmp

entier

Page 61: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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!!!

Page 62: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 63: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

63

.

.

.

.

.

.

paramètres passés par copie

paramètres formels: a, b

paramètres d'appel: x, y

x

a

b

y

Page 64: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

64

.

.

.

.

.

.

paramètres passés par référence

paramètres formels: a, b

paramètres d'appel: x, y

a x

b y

Page 65: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 66: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

66

entier x ylire x y

écrire x yéchanger(x, y)

écrire x y

10

15

.

.

.

.

.

.

a x

b y

entier

entier

Page 67: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

67

entier tmp

tmp aa bb tmp

entier tmp

10

15

.

.

.

.

.

.

a x

b y

entier

entier

tmp entier

Dans echanger

Page 68: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

68

entier tmp

tmp aa bb tmp

tmp a

10

10

15

.

.

.

.

.

.

a x

b y

entier

entier

tmp entier

Dans echanger

Page 69: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

69

entier tmp

tmp aa bb tmp

15

10

15

.

.

.

.

.

.

a x

b y

entier

entier

tmp entier

Dans echanger

Page 70: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

70

entier tmp

tmp aa bb tmp b tmp

15

10

10

.

.

.

.

.

.

a x

b y

entier

entier

tmp entier

Dans la fonction echanger

Page 71: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 72: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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:

Page 73: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 74: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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.

Page 75: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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.

Page 76: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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.

Page 77: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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.

Page 78: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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.

Page 79: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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

Page 80: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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;}

Page 81: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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)}

Page 82: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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);}

Page 83: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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;}

Page 84: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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;}

Page 85: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

85

void: est utilisé pour signifier:

1. une fonction ne retourne pas de valeur;

2. une fonction est définie sans paramètres

Page 86: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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.

Page 87: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

87

Autres exemples

1. En utilisant les fonctions, écrire un programme en C qui détermine le PGCD de deux valeurs.

Page 88: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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 */

Page 89: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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); }

Page 90: 1 Les fonctions. 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun programme, De même, il peut

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’’; }