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

6. Les sous-programmes P. Costamagna – ISEN N1. P. Costamagna2 A. Introduction Traitements identiques à plusieurs endroits dun programme. Méthode immédiate.

Présentations similaires


Présentation au sujet: "6. Les sous-programmes P. Costamagna – ISEN N1. P. Costamagna2 A. Introduction Traitements identiques à plusieurs endroits dun programme. Méthode immédiate."— Transcription de la présentation:

1 6. Les sous-programmes P. Costamagna – ISEN N1

2 P. Costamagna2 A. Introduction Traitements identiques à plusieurs endroits dun programme. Méthode immédiate mais peu habile = répéter le code correspondant autant de fois que nécessaire. programme lourd, illisible, difficile à maintenir. Une autre stratégie consiste à - séparer ce traitement du corps du programme - et à appeler ces instructions (qui ne figurent donc plus quen un seul exemplaire) à chaque fois quon en a besoin. Le programme est alors décomposé en plusieurs sous-tâches. Le corps du programme = le programme principal (main), Les groupes dinstructions auxquels on a recours = des sous- programmes.

3 P. Costamagna3 B. Quest ce quun sous-programme ? Sous-programme = association dun nom et dun ensemble dinstructions. Soit une tortue qui sait seulement se déplacer tout droit et tourner à droite ou à gauche. On lui apprend à dessiner un carré en la faisant aller tout droit, puis tourner à droite, puis continuer tout droit, etc, quatre fois. Ces actions ou instructions peuvent être regroupées au sein d'une procédure que l'on appellerait "dessiner_un_carré". Ainsi, quand on dirait à la tortue "dessiner_un_carré", elle effectuerait les instructions de la procédure les unes à la suite des autres et dessinerait un carré. Exemple Programmation modulaire Scission en plusieurs parties (programmation structurée) Moins de répétitions dans les séquences dinstructions Partage doutils

4 P. Costamagna4 C. Fonction standard Prototype : void sautDeLigne ( void ); Utilisation: sautDeLigne ( ); sautDeLigne = nom de la fonction 2 parenthèses obligatoires Exemple 1 Il existe dans la plupart des langages, des fonctions définies en standard qui fonctionnent de la même façon que le feront nos sous-programmes. Prototype : void fixePrecision ( int n ); Utilisation: fixePrecision ( 3 ); 3 = argument / paramètre de la fonction 2 parenthèses obligatoires Exemple 2 Prototype : int lisEntier ( void ); Utilisation: A = lisEntier ( ); int = type de la fonction A = variable dans laquelle est récupérée le résultat de la fonction Exemple 3

5 P. Costamagna5 D. Fonctions et procédures Dans la plupart des langages évolués, il existe: Des fonctions : notion proche des maths. Arguments = informations transmises pour le bon fonctionnement – Retour dun résultat. Des procédures: Arguments – Pas de retour à proprement parler dun résultat mais possibilité dutiliser certains arguments pour renvoyer des résultats. En C on ne programme que des fonctions. Mais les fonctions en C sont aussi puissantes que les fonctions et les procédures dautres langages.

6 P. Costamagna6 E. Définir un sous-programme Avant d'être utilisé, un sous-programme doit être défini. Déterminer le type de valeur que le sous-programme renverra (int/float/char/void) Indiquer le nom du sous-programme Préciser si besoin les arguments (= informations nécessaires au bon fonctionnement). Nombre variable dun sous-programme à un autre (0, 1, 2 …) Chaque argument est caractérisé par un nom et un type. Enumérer le bloc dinstructions correspondant aux actions à réaliser par le sous- programme. Bloc délimité par des accolades et pouvant contenir des déclarations de variables et des instructions. int float char void Type à déterminer en fonction du résultat renvoyé par le ss-prog id_fonction Identificateur choisi pour représenter le ss-prog ( ) Les parenthèses sont obligatoires même sil ny a pas de paramètre Pas de ; à la fin de cette instruction type1 p1, type2 p2, … Enumération des paramètres (facultatif) Entête du sous-programme:

7 P. Costamagna7 E. Définir un sous-programme (suite1) Ne signifie pas que le sous-programme na pas darguments Le programmeur ne souhaite pas que ses appels soient contrôlés par le compilateur. On préfèrera donc la forme suivante: Type_donnee id_fonction( ) { } Délimitation du bloc ss-prog Déclaration de variables locales Instructions return résultat ; Retour du résultat Type_donnee id_fonction( void ) Absence darguments: int float char void id_fonction( )type1 p1, type2 p2, …

8 P. Costamagna8 F. Définition de plusieurs sous programmes Un programme peut contenir plusieurs sous-programmes. Un sous-programme ne peut pas être défini dans le corps dun autre. Tous les sous-programmes sont au même niveau. Ils sont définis les uns à la suite des autres. Un sous programme peut appeler un autre sous programme à condition quil soit défini avant lui. Le programme principal sera placé en dernière position.

9 P. Costamagna9 G. Les arguments dun sous-programme Peut être nécessaire de récupérer ou de transmettre des informations vers lextérieur = paramètres ou arguments. Un argument est caractérisé par - un nom - un type - un mode de transmission Chaque argument est ainsi décrit dans les parenthèses au moment de la définition. int float char void id_fonction( )type1 p1, type2 p2, …

10 P. Costamagna10 H. Les modes de transmission des arguments Par valeur (entrée) Les valeurs des arguments sont recopiées dans des emplacements locaux au sous-programme (copies). Toute modification de la copie na aucune incidence sur la valeur originale. Exemple: int fct1 ( float p, float q, int r ) Les identificateurs choisis pour les arguments lors de la définition du sous- programme sont génériques. Ils pourront être remplacés lors de lappel du sous-programme par nimporte quelle variable comme pour une fonction mathématique. Exemple: f(x) = ax 2 + bx + c f(t) = at 2 + bt + c Par adresse (sortie) Le sous-programme travaille sur les valeurs originales des arguments. Les identificateurs des arguments doivent être précédés du signe *. Exemple: int fct2 ( float *p, float *q, int *r )

11 P. Costamagna11 I. Renvoi dune valeur par un sous-programme return = dernière instruction dun sous-programme. Syntaxe return; (pour une fonction de type void) return valeur variable ; expression Le sous programme évalue la valeur/variable/expression et la renvoie au programme appelant. Le type de la valeur retournée doit correspondre au type de la fonction précisé au moment de la définition.

12 P. Costamagna12 I. Renvoi dune valeur par un sous-programme (suite1) return peut apparaître à plusieurs reprises dans un sous- programme. cest la 1ère instruction rencontrée qui provoque la sortie du sous-programme. Exemple float absom (float u, float v) { float s; s = u + v; if ( s > 0) return (s); else return (-s); }

13 P. Costamagna13 J. Appel dun sous-programme Après définition, un sous-programme devient utilisable en tout endroit du programme. Un sous-programme ne sexécutera que si on fait appel à lui. Sil existe des arguments, ils doivent être énumérés en respectant: - leur nombre - leur type - leur mode de transmission Les paramètres transmis seront affectés respectivement aux paramètres définis. Sil nexiste pas darguments, les parenthèses doivent rester présentes, sinon aucun appel au sous-programme ne sera effectué. Si le sous-programme renvoie un résultat, le récupérer au moment de lappel dans une variable de même nature.

14 P. Costamagna14 J. Appel dun sous-programme (suite1) Exemple float absom (float u, float v) { float s; s = u + v; if ( s > 0) return (s); else return (-s); } int main (void) { float res, a, b; ecrisChaine (« Saisir 2 valeurs »); a = lisFlottant ( ); b = lisFlottant ( ); res = absom (a, b); ecrisChaine (« Somme des 2 »); ecrisFlottant (res); system(« pause »); return 0; } Définition du sous-programme Programme principal Type de la valeur renvoyée par le sous-programme Variable locale au sous- programme utilisée pour stocker la valeur retournée Retour de la valeur Appel du sous-programme la valeur de a remplace le paramètre u la valeur de b remplace le paramètre v La variable res récupère le résultat renvoyé par le sous- programme

15 P. Costamagna15 K. La fonction main Un programme C comporte obligatoirement une fonction main (=programme principal). Fonction comme les autres. Seule particularité: son nom void main (void) le programme sexécute sans tenir compte de lOS et sans lui retourner de résultat. int main (void) le programme sexécute sans tenir compte de lOS et lui retourne un code de fin dexécution (valeur nulle = bon déroulement)

16 P. Costamagna16 L. Exercices Ecrire une fonction qui calcule et renvoie vers le programme principal le cube dun nombre entier. Exercice1 Exercice 2 Ecrire une fonction qui réalise léchange des valeurs de 2 valeurs entières transmises en arguments. - 1 ère méthode: passage des arguments par valeur - 2 ème méthode: passage des arguments par adresse.

17 P. Costamagna17 L. Corrections #include "ESLib.h" int cub (int nb) { int res; /* résultat du calcul */ res = nb * nb * nb; return res; } int main (void) { int x; /* nombre à élever au cube */ int c; /* résultat de lélévation au cube */ ecrisChaine ("Saisir un entier: "); x = lisEntier(); sautDeLigne(); Correction Exercice1 /* Appel de la fonction de calcul du cube */ c = cub (x); ecrisEntier (x); ecrisChaine (" au cube = "); ecrisEntier (c); sautDeLigne(); system ("pause"); return 0; }

18 P. Costamagna18 L. Corrections (suite1) 1 ère méthode: transmission des arguments par valeur #include "ESLib.h" void ech1 (int a, int b) { int tmp; /* variable temporaire utilisée pour l'échange */ tmp = a; /* sauvegarde du contenu de la 1 ère valeur */ a = b; /* la 1 ère variable prend la 2è me valeur */ b = tmp; /* la 2 ème variable prend la 1 ère valeur précédemment sauvegardée */ return; } int main (void) { int n, p; /* 2 valeurs à échanger */ ecrisChaine ("Saisir un entier: "); n = lisEntier(); sautDeLigne(); ecrisChaine ("Saisir un 2 ème entier: "); p = lisEntier(); Correction Exercice2 /* Affichage avant échange */ sautDeLigne(); ecrisChaine ("n = "); ecrisEntier (n); ecrisChaine (" - p = "); ecrisEntier (p); /* Appel de la fonction d'échange */ ech1 (n, p); /* Affichage après échange */ sautDeLigne(); ecrisChaine ("n = "); ecrisEntier (n); ecrisChaine (" - p = "); ecrisEntier (p); sautDeLigne(); system ("pause"); return 0; }

19 P. Costamagna19 L. Corrections (suite2) 2 ème méthode: transmission des arguments par adresse #include "ESLib.h" void ech1 (int *a, int *b) { int tmp; /* variable tempo utilisée pour l'échange */ tmp = *a; /* sauvegarde du contenu de la 1 ère valeur */ *a = *b; /* la 1 ère variable prend la 2 ème valeur */ *b = tmp; /* la 2 ème variable prend la 1 ère valeur précédemment sauvegardée */ return; } int main (void) { int n, p; /* 2 valeurs à échanger */ ecrisChaine ("Saisir un entier: "); n = lisEntier(); sautDeLigne(); ecrisChaine ("Saisir un 2 ème entier: "); p = lisEntier(); Correction Exercice2 /* Affichage avant échange */ sautDeLigne(); ecrisChaine ("n = "); ecrisEntier (n); ecrisChaine (" - p = "); ecrisEntier (p); /* Appel de la fonction d'échange */ ech1 (&n, &p); /* Affichage après échange */ sautDeLigne(); ecrisChaine ("n = "); ecrisEntier (n); ecrisChaine (" - p = "); ecrisEntier (p); sautDeLigne(); system ("pause"); return 0; }

20 P. Costamagna20 M. Quelques erreurs à éviter ….. int addition ( int a, int b ) ; { return a+b; } Pas de point virgule lors de la définition dun sous-programme: Ne pas déclarer comme variable un paramètre transmis par le sous-programme : ….. int addition ( int a, int b ) { int a, b; return a+b; } ….. int addition ( int a, int b ) { int c c = a+b; } Ne pas oublier de renvoyer un résultat si le type du sous- programme limpose: return c;

21 P. Costamagna21 G. Quelques erreurs à éviter (suite1) i = 0; while( i < 10 ) { ecrisChaine ("hello world !"); } Le compteur de la boucle TANT QUE nest pas incrémenté boucle infinie: i = 0; while( i < 10 ) { ecrisChaine ("hello world !"); i = i + 1; } Attention aux ; en trop. La boucle suivante ne fait rien pendant 10 fois puis affiche la phrase hello world ! une seule fois : for ( i = 0; i < 10; i = i+1 ); ecrisChaine ("hello world !"); for ( i = 0; i < 10; i = i+1 ) ecrisChaine ("hello world !");


Télécharger ppt "6. Les sous-programmes P. Costamagna – ISEN N1. P. Costamagna2 A. Introduction Traitements identiques à plusieurs endroits dun programme. Méthode immédiate."

Présentations similaires


Annonces Google