Programmation II : Concepts avancés du langage C Pr Rachid DEHBI, Faculté des s
Programmation II : Concepts avancés du langage C Pr Rachid DEHBI, Faculté des sciences Ain Chock, Département MATH/INFO 1 Chapitre 1 : Programmation modulaire et les fonctions Sommaire : I- Introduction ......................................................................................................................... 1 Un exemple ............................................................................................................................. 2 II- Définition d’une fonction .................................................................................................... 3 III- L'utilisation des fonctions................................................................................................ 3 1) La déclaration des prototypes. ......................................................................................... 4 2) La déclaration de fonction. .............................................................................................. 4 3) L'appel de fonction: ......................................................................................................... 4 4) Exemples de définition .................................................................................................... 5 5) Situation de la déclaration ............................................................................................... 7 IV- Mode de transmission des paramètres et portés des variables ....................................... 9 1) Passage par valeur ......................................................................................................... 10 2) Variable globale ............................................................................................................ 10 3) Variable locale ............................................................................................................... 12 4) Les variables locales automatiques ............................................................................... 12 5) Les variables locales statiques ....................................................................................... 13 6) Le cas des fonctions récursives ..................................................................................... 13 V- La compilation séparée et ses conséquences..................................................................... 14 1) La portée d’une variable globale - la déclaration extern ............................................... 15 2) Les variables globales et l’édition de liens .................................................................... 15 3) Les variables globales cachées- la déclaration static.................................................... 16 4) Tableau récapitulatif ...................................................................................................... 17 Exercices : ................................................................................................................................ 18 I- Introduction Un long programme est difficile à appréhender globalement. Il vaut donc mieux le scinder en petits programmes : un programme principal fait appel à des sous-programmes, qui Programmation II : Concepts avancés du langage C Pr Rachid DEHBI, Faculté des sciences Ain Chock, Département MATH/INFO 2 peuvent eux-mêmes faire appel à des sous-programmes, du programme principal ou de celui- ci, et ainsi de suite. C’est le principe du raffinement successif. De plus certains sous- programmes peuvent servir dans d’autres programmes, c’est le principe de la modularité. Ces principes sont mis en œuvre en langage C grâce aux fonctions. On peut distinguer, en langage C, les fonctions prédéfinies des bibliothèques (telles que printf() ou scanf()), livrées avec le compilateur et « intégrées » au programme lors de l’édition des liens, et les fonctions que le programmeur écrit lui-même en tant que partie du texte source. Nous avons déjà vu comment utiliser les premières dans le module programmation 1. Nous allons donc nous intéresser ici aux secondes. Nous verrons aussi, d’ailleurs, la façon de concevoir les fonctions prédéfinies. Un exemple Commençons par donner un exemple simple de définition et d’utilisation d’une fonction. Considérons à nouveau, pour cela, notre exemple de fonction que l’on veut évaluer en un certain nombre de points. Une nouvelle amélioration consiste à dégager la définition de la fonction en utilisant un sous-programme. Programme : La mise en place suivante est intuitivement compréhensible, nous la détaillerons ensuite : /* Fonct_1.c */ #include <stdio.h> #include <math.h> double f(double x) { return((sin(x) + log(x))/(exp(x) + 2)); } void main(void) { float x, y; printf("x = "); scanf("%f",&x); while (x != 1000) { y = f(x); printf("f(%f) = %f\n", x, y); printf("x = "); scanf("%f",&x); } } L’amélioration provient ici plus particulièrement du fait que l’on ne s’occupe pas de la fonction particulière dans le corps du programme, mais uniquement du fait que l’on veut afficher sa valeur en un certain nombre de points, ce qui est l’essence du programme. Il suffit de changer le sous-programme, bien mis en évidence, lorsqu’on veut changer de fonction. Programmation II : Concepts avancés du langage C Pr Rachid DEHBI, Faculté des sciences Ain Chock, Département MATH/INFO 3 II- Définition d’une fonction La définition des fonctions, dans des cas simples, est suffisamment claire au vu du programme Précédent. Mais l’explicitation suivante donne les limites d’une utilisation intuitive. Une fonction ou procédure ou encore sous programme est une suite d'instructions élémentaires, mais vue du programme principal main(), elle représente une seule action. Elle est la base des langages structurés. En effet, l'écriture de tout programme commence par définir un algorithme qui décrit l'enchaînement de toutes les actions (fonctions). La réalisation d'un algorithme c'est la décomposition en une suite de fonctions simples pouvant réaliser une ou plusieurs fonctions beaucoup plus compliquées. Un algorithme doit être le plus clair possible. Une fonction est caractérisée par un appel et un retour. - L'appel est effectué par le programme principal main() ou une autre procédure. - Le retour s'effectue après la dernière action de la fonction appelée et le programme continue juste après l'appel de la fonction. Une fonction peut appeler une autre fonction. Le nom donné à une fonction doit être représentatif de la fonction réalisée (exemple : perimetre_cercle pour une procédure calculant le périmètre d'un cercle). Le programme principal main() et les fonctions ont besoin de se communiquer des valeurs. Lors d'un appel d'une procédure les valeurs passées sont les paramètres d'entrée et à la fin d'une fonction les paramètres renvoyés sont les paramètres de sortie. III- L'utilisation des fonctions. La déclaration se fait en deux temps: Programmation II : Concepts avancés du langage C Pr Rachid DEHBI, Faculté des sciences Ain Chock, Département MATH/INFO 4 1) La déclaration des prototypes. Elle permet de définir au compilateur les paramètres d'entrée et de sortie afin de pouvoir vérifier lors d'appel de fonction l'ordre de passage des paramètres. La déclaration de prototype se différencie de la déclaration de fonction par l’ajout d’un point virgule ; en fin de ligne. Elle est située au début du programme. Syntaxe: <type_iden_sortie> iden_fonc(<type> iden_1,..., <type> iden_n); type_iden_sortie: type de l’identificateur du paramètre de sortie. iden_fonc: identificateur de fonction. iden_1: identificateur du paramètre 1 d'entrée. iden_n: identificateur du paramètre n d'entrée. 2) La déclaration de fonction. Elle décrit l'enchaînement de toutes les instructions permettant de réaliser la fonction. Une variable déclarée dans une fonction est locale à celle-ci et elle n'a aucune existence en dehors de la fonction. Syntaxe: <type_iden_sortie> iden_fonc(<type> iden_1,..., <type> iden_n) { /* Déclaration de variable(s) locale(s) */ <type> iden_2,...,iden_m; . . . /* renvoie dans le paramètre de sortie */ return(valeur); } type_iden_sortie: type de l’identificateur du paramètre de sortie. iden_fonc: identificateur de fonction. iden_1: identificateur du paramètre 1 d'entrée. iden_n: identificateur du paramètre n d'entrée. Iden_2: identificateur 2 de variable locale. iden_m: identificateur m de variable locale. 3) L'appel de fonction: Il dirige le programme principal ou une autre fonction sur la fonction à exécuter en donnant les variables d'entrées et ou l'affectation de la variable de sortie. Syntaxe: iden_var_sortie = iden_fonc(iden_1_var,...,iden_n_var) ; ou iden_fonc.(iden_1_var,...,iden_n_var) ; Programmation II : Concepts avancés du langage C Pr Rachid DEHBI, Faculté des sciences Ain Chock, Département MATH/INFO 5 iden_var_sortie: identificateur de sortie. iden_fonc: identificateur de fonction. iden_1_var: identificateur du paramètre 1 d'entrée. iden_n_var: identificateur du paramètre n d'entrée. 4) Exemples de définition Donnons quelques exemples varies de définitions pour illustrer ce que nous venons de dire. Exemple 1.- (La fonction sinc) La fonction f définie par l’expression f(x) = sin(x)/x est a priori définie sur R*, mais on sait la prolonger par continuité en 0 en lui attribuant la valeur 1. Ceci permet de définir la fonction suivante : double f(double x) { double y; if (x == 0) y = 1; else y = sin(x)/x; return(y); } Ou double f(double x) { if (x == 0) return(1); else return(sin(x)/x)); } Ceci nous donne un exemple avec deux utilisations de return, à cause de la définition par cas. Exemple 2.- (L’exponentiation) Programmons l’exponentiation, c’est-à-dire l’application de R×N dans R qui au couple (x, n) associe : double puiss(double x, int n) { double y; int i; y = 1; for (i=1; i <= n; i++) y = y*x; return(y); } Programmation II : Concepts avancés du langage C Pr Rachid DEHBI, Faculté des sciences Ain Chock, Département MATH/INFO 6 Cet exemple est intéressant à plusieurs titres : la fonction a deux paramètres et, de plus, de types différents ; le corps comporte des déclarations de variables, dites variables locales ; on utilise une boucle pour définir la fonction. On remarquera que nous sommes obligés d’introduire la variable locale y car puiss ne pourrait pas être utilise à droite d’une affectation. Exemple 3.- (Fonction sans paramètre) Considérons le programme suivant : /* intro.c */ #include <stdio.h> void welcome(void) { printf("Welcome to this fantastic program"); printf("\nwhich proves to you the power"); printf("\nof the modularity. \n"); } void bienvenue(void) { printf("Bienvenue dans ce merveilleux"); printf("\nprogramme qui vous montre la"); printf("\npuissance de la modularite. \n"); } void main(void) { char c; printf("Do you want to continue in"); printf("\nEnglish or in French (E/F) "); scanf("%c",&c); if (c == ’E’) welcome(); else bienvenue(); } Les fonctions welcome() et bienvenue() n’ont ni paramètre ni valeur de retour. Remarquons cependant l’utilisation du type void et le couple de parenthèses pour l’appel de ces fonctions. Le fait qu’il n’y ait pas de type de retour rend l’utilisation de return superflue. Exemple 4.- (Le pgcd) Nous avons déjà rencontré des exercices sur le calcul du pgcd de deux entiers non nuls, l’utilisation des fonctions améliore successivement les algorithmes pour le calculer. Le programme suivant repose sur l’algorithme d’Euclide. int pgcd(int a, int b) { int r; r = 1; while (r != 0) { r = a % b; a = b; Programmation II : Concepts avancés du langage C Pr Rachid DEHBI, Faculté des sciences Ain Chock, Département MATH/INFO 7 b = uploads/s1/ cours-c-avance.pdf
Documents similaires










-
45
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Oct 21, 2021
- Catégorie Administration
- Langue French
- Taille du fichier 0.2417MB