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

Slides:



Advertisements
Présentations similaires
Premier programme en C :
Advertisements

La boucle for : init7.c et init71.c
Chapitre annexe. Récursivité
Les fonctions A quoi ça sert ?
1.Introduction à la programmation
Rappels C.
Initiation à la programmation et algorithmique cours 4
C.
Paramètres et pointeurs
Fonctions Dans un programme : certaines opérations (ou séquences d'opérations) peuvent se répéter plusieurs fois : affichage de tableau, saisie, ou même.
5. Les structures répétitives
4. Les structures de tests
8. Les tableaux P. Costamagna – ISEN N1.
3.Premiers pas en programmation
2.Les bases de lalgorithmique P. Costamagna – ISEN N1.
Les sous-programmes Chapitre n° 5: Objectifs : Activité:
CSI3525: Concepts des Langages de Programmation Notes # 11: Sous-Programmes ( Lire Chapitre 8 )
Les bases de l’Algorithmique
Principes de programmation (suite)
Langage C Révision.
CPI/BTS 2 Programmation Web Introduction au PHP
Initiation à la programmation et algorithmique
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
Récursivité.
Algorithmique et Programmation
8PRO100 Éléments de programmation Comment faire prendre une décision à un ordinateur?
RESUMES Module II1 SOMMAIRE CYCLE 1 : Saisir – Afficher – Données
Introduction à la programmation (Java)
Les pointeurs Enormément utilisé en C/C++ ! Pourquoi? A quoi ça sert?
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
Test et débogage Tests unitaires. Gestion d’erreurs. Notion d’état, de pré-condition et de post-condition. Assertion. Traces de programme. Débogueur et.
Les Fonctions. Définir une fonction Sections de code indépendantes que lon peut appeler à nimporte quel moment et dans nimporte quel ordre. Bout de code.
Introduction à la programmation I Fonctions Structures de contrôle Structures de données (arrays simples et indexés) Variables locales et globales.
Points importants de la semaine Le préprocesseur. La conversion de types. Les fonctions.
Instruction sélective switch-case Instruction répétitive do-while For
8PRO107 Éléments de programmation
1 La récursion. Nous avons vu qu'un programme est constitué d'un ensemble de fonctions. Il est possible pour une fonction donnée d'appeler une autre fonction.
Partie II Sémantique.
Plan troisième cours Instruction sélective Instruction répétitive
Répéter dans un programme avec une Instruction itérative
Procédures et fonctions
Plan cours La notion de pointeur et d’adresse mémoire.
PHP 2° PARTIE : FONCTIONS ET FORMULAIRE
Python Fonction et procédure
Le Bloc Case Cours LCS N°3 Présenté par Mr: LALLALI.
SIF-1053 Architecture des ordinateurs
8PRO100 Éléments de programmation Comment répéter plusieurs fois une séquence d’instructions.
7ième Classe (Mardi, 24 novembre) CSI2572. Devoir 3 ?
Argc et argv Utilisation des paramètres de la ligne de commande.
Un survol du language C.
1 Structures des données. 2  Le tableau permettait de désigner sous un seul nom un ensemble de valeurs de même type, chacune d'entre elles étant repérée.
Introduction au langage C Fonctions et Procédures
Sémantique des instructions pour le langage Z minimal Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI)
Méthodes et outils de conception Introduction à la programmation Paramètre de retour Appel d’une fonction Portée des variables Définition Pourquoi les.
ISBN Chapitre 10 L'implémentation des sous- programmes.
Variables et environnement utilisateur W. Barhoumi.
Introduction au langage C : Structures de contrôle 1 ère année Génie Informatique Dr Daouda Traoré Université de Ségou
Conception de Programmes - IUT de Paris - 1ère année Quelques éléments du langage C++ Les références La surcharge de fonctions Les fonctions «
CPI/BTS 2 Programmation Web Fonctions & Includes Prog Web CPI/BTS2 – M. Dravet – 02/11/2003 Dernière modification: 02/11/2003.
8PRO107 Éléments de programmation Les adresses et les pointeurs.
8PRO107 Éléments de programmation Les tableaux. Étude de cas 1 Description du problème : Lire une liste d’entiers et l’afficher d’abord dans le même ordre.
Scripts et fonctions Instructions de contrôle
PRO-1027 Programmation Scientifique en C
Algorithmique Tableaux de données
Philippe Gandy - 8 septembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
02/10/2015Les structures de contrôle1 COURS A2I12 Initiation à l'algorithmique illustrée par le langage C Guillaume BOURLET Département GEII IUT Sénart/Fontainebleau.
Philippe Gandy – 10 novembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
Algorithmique Boucles et Itérations
Informatique 1A Langage C 6 ème séance 1. Objectifs de la séance 6  Allocation dynamique de mémoire  Application à la création de tableaux 2.
M. BENJELLOUN : 2005 Le but final est de programmer un jeu où l'ordinateur choisira un nombre aléatoire entre 0 et 100 que vous devez deviner.
Transcription de la présentation:

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

A. Introduction Traitements identiques à plusieurs endroits d’un 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 qu’en un seul exemplaire) à chaque fois qu’on en a besoin. Le programme est alors décomposé en plusieurs sous-tâches. Le corps du programme = le programme principal (main), Les groupes d’instructions auxquels on a recours = des sous-programmes. P. Costamagna

B. Qu’est ce qu’un sous-programme ? Exemple 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é. Sous-programme = association d’un nom et d’un ensemble d’instructions. Programmation modulaire  Scission en plusieurs parties (programmation structurée)  Moins de répétitions dans les séquences d’instructions  Partage d’outils P. Costamagna

C. Fonction standard 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. Exemple 1 Exemple 3 Prototype : void sautDeLigne ( void ); Utilisation: sautDeLigne ( );  sautDeLigne = nom de la fonction  2 parenthèses obligatoires 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 2 Prototype : void fixePrecision ( int n ); Utilisation: fixePrecision ( 3 );  3 = argument / paramètre de la fonction  2 parenthèses obligatoires P. Costamagna

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 d’un résultat. Des procédures: Arguments – Pas de retour à proprement parler d’un résultat mais possibilité d’utiliser 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 d’autres langages. P. Costamagna

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 d’un sous-programme à un autre (0, 1, 2 …) Chaque argument est caractérisé par un nom et un type. Enumérer le bloc d’instructions 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. Entête du sous-programme: Enumération des paramètres (facultatif) int float char void id_fonction ( ) type1 p1, type2 p2, … Pas de ; à la fin de cette instruction Identificateur choisi pour représenter le ss-prog Les parenthèses sont obligatoires même s’il n’y a pas de paramètre Type à déterminer en fonction du résultat renvoyé par le ss-prog P. Costamagna

E. Définir un sous-programme (suite1) Absence d’arguments: Type_donnee id_fonction ( ) Ne signifie pas que le sous-programme n’a pas d’arguments 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 ( void ) int float char void id_fonction ( ) type1 p1, type2 p2, … Délimitation du bloc ss-prog { Déclaration de variables locales Instructions return résultat; Retour du résultat P. Costamagna }

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 d’un 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 qu’il soit défini avant lui. Le programme principal sera placé en dernière position. P. Costamagna

G. Les arguments d’un sous-programme Peut être nécessaire de récupérer ou de transmettre des informations vers l’exté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, … P. Costamagna

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 n’a aucune incidence sur la valeur originale. Exemple: int fct1 ( float p, float q, int r ) 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 ) 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 l’appel du sous-programme par n’importe quelle variable comme pour une fonction mathématique. Exemple: f(x) = ax2 + bx + c  f(t) = at2 + bt + c P. Costamagna

I. Renvoi d’une valeur par un sous-programme return = dernière instruction d’un 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. P. Costamagna

I. Renvoi d’une valeur par un sous-programme (suite1) return peut apparaître à plusieurs reprises dans un sous-programme.  c’est 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); } P. Costamagna

J. Appel d’un sous-programme Après définition, un sous-programme devient utilisable en tout endroit du programme. Un sous-programme ne s’exécutera que si on fait appel à lui. S’il 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. S’il n’existe pas d’arguments, 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 l’appel dans une variable de même nature. P. Costamagna

J. Appel d’un sous-programme (suite1) Type de la valeur renvoyée par le sous-programme 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; Variable locale au sous-programme utilisée pour stocker la valeur retournée Définition du sous-programme 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 Programme principal P. Costamagna

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 s’exécute sans tenir compte de l’OS et sans lui retourner de résultat. int main (void)  le programme s’exécute sans tenir compte de l’OS et lui retourne un code de fin d’exécution (valeur nulle = bon déroulement) P. Costamagna

L. Exercices Exercice1 Ecrire une fonction qui calcule et renvoie vers le programme principal le cube d’un nombre entier. 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. P. Costamagna

L. Corrections 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; } #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(); P. Costamagna

L. Corrections (suite1) 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 */ system ("pause"); return 0; } 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(); P. Costamagna

L. Corrections (suite2) 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 */ system ("pause"); return 0; } 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(); P. Costamagna

M. Quelques erreurs à éviter Pas de point virgule lors de la définition d’un sous-programme: Ne pas oublier de renvoyer un résultat si le type du sous-programme l’impose: ….. int addition ( int a, int b ) ; { return a+b; } ….. int addition ( int a, int b ) { int c c = a+b; } return c; 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; } P. Costamagna

G. Quelques erreurs à éviter (suite1) Le compteur de la boucle TANT QUE n’est pas incrémenté  boucle infinie: i = 0; while( i < 10 ) { ecrisChaine ("hello world !"); } 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 !"); P. Costamagna