La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

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.

Présentations similaires


Présentation au sujet: "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."— Transcription de la présentation:

1 1 Les fonctions

2 2 Pourquoi les fonctions? Besoin de regrouper un ensemble dinstructions pour décomposer la complexité dun 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 didentification,...tc) Il peut arriver aussi quun même traitement intervienne plusieurs fois dans un programme.

3 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 4 Il existe deux types de fonctions: 1.Les fonctions pré-définies 2.Nos propres fonctions

5 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 Il est alors possible d'employer des fonctions telles que:

6 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 7 Exemple 1: cos(x) #include main(){ double x; cin >> x; cout << cos(x); }

8 8 Exemple: 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.

9 9 Exemple: sqrt(x) #include 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<

10 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) retourne ldexp(1,1.1) retourne Pourquoi??? Exemple: ldexp(x,n)

11 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çoit en fait les valeurs 1 et 1 puisque la partie fractionnaire du second opérande est tronquée.

12 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 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?

14 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 expression en un autre type. (type) expression Exemple: pow(x,y)

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

16 16 Une liste de quelques de 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 17 Structure 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

18 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 fonction Type de la valeur retournée Nom des paramètres Types des paramètres { Corps Déclaration des variables Instructions

19 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 20 Calcul de la moyenne Supposons l'existence d'une fonction ayant le prototype suivant: entier moyenne3(entier, entier, entier)

21 21 Fonction principale entier nombre1 nombre2 nombre3 entier moyenne lire nombre1 nombre2 nombre3 moyenne moyenne3(nombre1, nombre2, nombre3) écrire moyenne

22 22 Définition de la fonction moyenne3 Entête: entier moyenne3( entier a, entier b, entier c) Corps: entier m m (a + b + c) / 3 retourner m

23 23 Définition de la fonction moyenne3 Entête: entier moyenne3(entier a, entier b, entier c) 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.

24 24 Pas-à-pas Vérifions le comportement de notre algorithme sur l'exemple suivant: Après les déclaration suivantes: entier nombre1 nombre2 nombre3 entier moyenne l'état de la mémoire correspond à la figure de droite nombre1 nombre2 nombre3 moyenne entier

25 25 lire nombre1 nombre2 nombre nombre1 nombre2 nombre3 moyenne entier

26 26 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.

27 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 dappelparamètres formels

28 nombre1 nombre2 nombre3 moyenne entier Ainsi après l'appel de moyenne3(67, 86, 79) l'état de la mémoire devient: a b c entier Remarquer que les variables formelles a, b et c sont créées et initialisées à 67, 86 et 79.

29 nombre1 nombre2 nombre3 moyenne entier Exécution du corps de moyenne3 entier m m (a + b + c) / 3 retourner m D 'abord, la déclaration entier m a b c m entier

30 nombre1 nombre2 nombre3 moyenne entier Exécution du corps de moyenne3 entier m m (a + b + c) / 3 retourner m Puis l'évaluation de l'expression (a + b + c) / 3 = ( ) / 3 = ( ) / 3 = 232 / 3 = a b c m entier

31 nombre1 nombre2 nombre3 moyenne entier Exécution du corps de moyenne3 entier m m (a + b + c) / 3 retourner m Et l'assignation m Remarquez que 77 qui est mis dans m et non pas a b c m entier

32 nombre1 nombre2 nombre3 moyenne entier 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 a b c m entier

33 nombre1 nombre2 nombre3 moyenne 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 34 Retour à la fonction principale: lire nombre1 nombre2 nombre3 moyenne 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 nombre1 nombre2 nombre3 moyenne entier La prochaine instruction à être exécutée est donc moyenne 77 Finalement, l'instruction écrire moyenne est exécutée

36 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 37 Fonction principale réel longueur largeur lire longueur largeur écrire aire(longueur, largeur) où aire est une fonction dont le prototype est réel aire(réel, réel)

38 38 Définition de aire Entête: réel aire(réel longueur, réel largeur) Corps: retourner longueur * largeur

39 39 Pas-à-pas Vérifions le comportement de notre algorithme sur l'exemple suivant: 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

40 40 lire longueur largeur longueur largeur réel

41 41 écrire aire(longueur, largeur) D'abord il faut évaluer aire(longueur, largeur) On appelle donc la fonction aire longueur largeur réel

42 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 ces noms et contenant les mêmes valeurs sont créées longueur largeur réel longueur largeur réel

43 43 Les instructions du corps de l;a fonction sont ensuite exécutées. retourner longueur * largeur = retourner 7.2 * 3.5 = retourner longueur largeur réel longueur largeur réel

44 44 Les instructions du corps sont ensuite exécutées. retourner longueur * largeur = retourner 7.2* 3.5 = retourner longueur largeur réel longueur largeur réel Comment savoir à quelle case mémoire longueur et largeur correspondent?

45 longueur largeur réel longueur largeur 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ée dans une fonction n'est visible que dans cette fonction.

46 46 Au retour de la fonction, les variables qui y ont été créées disparaissent. L'expression aire(7.2, 3.5) vaut la valeur retournée, c'est-à- dire longueur largeur réel

47 47 L'instruction écrire aire(longueur, largeur) correspond à écrire 25.2 Ce qui est bien ce que l'on voulait que notre programme fasse! longueur largeur réel réel longueur largeur lire longueur largeur écrire aire(longueur, largeur) Retour dans la fonction principale

48 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 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 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 51 Définition 1 de echanger Entête: echanger(entier a, entier b) Corps: a b b a

52 52 Pas-à-pas Entrée: entier x y lire x y x y entier

53 53 écrire x y échanger(x, y) x y entier a b

54 54 échanger(entier a, entier b) a b b a x y entier a b On exécute d abord a b

55 55 échanger(entier a, entier b) a b b a x y entier a b Puis on exécute b a Problème!!!

56 56 Définition 2 de échanger Entête: échanger(entier a, entier b) Corps: entier tmp tmp a a b b tmp x y entier a b

57 x y entier a b tmp entier entier tmp tmp a a b b tmp

58 58 entier tmp tmp a a b b tmp x y entier a b tmp a entier tmp

59 59 entier tmp tmp a a b b tmp x y entier a b a b tmp entier

60 60 entier tmp tmp a a b b tmp x y entier a b b tmp tmp entier

61 x y 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 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 a a b b 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 65 Pas-à-pas Entrée: entier x y lire x y écrire x y échanger(x, y) écrire x y x y entier

66 66 entier x y lire x y écrire x y échanger(x, y) écrire x y a x b y entier

67 67 entier tmp tmp a a b b tmp entier tmp a x b y entier tmpentier Dans echanger

68 68 entier tmp tmp a a b b tmp tmp a a x b y entier tmpentier Dans echanger

69 69 entier tmp tmp a a b b tmp a x b y entier tmpentier Dans echanger

70 70 entier tmp tmp a a b b tmp a x b y entier tmpentier Dans la fonction echanger

71 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é a x b y entier tmpentier

72 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 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 fonction Type de la valeur retournée Nom des paramètres Types des paramètres { Corps Déclaration des variables Instructions

74 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 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 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 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 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 79 entier nombre1 nombre2 nombre3 entier moyenne lire nombre1 nombre2 nombre3 moyenne moyenne3(nombre1, nombre2, nombre3) écrire moyenne #include 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 80 Version C Entête: entier moyenne3( entier a, entier b, entier c) Corps: entier m m (a + b + c) / 3 retourner m int moyenne3(int a, int b, int c) /* définition de la fonction */ { int m; m = (a + b + c) / 3; return m; }

81 81 version C (air du rectangle) réel longueur largeur lire longueur largeur écrire aire(longueur, largeur) #include 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 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 83 Version C (échanger) entier x y lire x y écrire x y échanger(x, y) écrire x y #include void echanger(int &, int &); main(){ int x, y; cin >> x >> y; cout << x << y; echanger(x, y); cout << x << y; }

84 84 Version C Entê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; }

85 85 void: est utilisé pour signifier: 1.une fonction ne retourne pas de valeur; 2.une fonction est définie sans paramètres

86 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 87 Autres exemples 1. En utilisant les fonctions, écrire un programme en C qui détermine le PGCD de deux valeurs.

88 88 #include /* prototype dde la fonction*/ int PGCD(int,int); main(){ int m,n; cin >>n>>n; cout <

89 89 Exo 2. Reprendre lexemple du calcul de la racine carrée avec une fonction #include double racine(double); */ prototype de la fonction */ main(){ double a, rac0,rac1; cin >>a; cout << "la racine carrée de "< ) return (rac1); }

90 90 3. À laide dune fonction, écrire un programme qui visualise le texte: Bonjour, comment allez-vous? #include 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; }


Télécharger ppt "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."

Présentations similaires


Annonces Google