NOTION DE FONCTION ET DE PROCEDURE

 

Introduction : les sous-programmes

Une application, surtout lorsqu’elle est longue, a toutes les chances de devoir procéder aux mêmes traitements, ou à des traitements similaires, à plusieurs endroits de son déroulement. Par exemple, la saisie d’une réponse par oui ou par non (et le contrôle qu’elle implique), peut être répétée dix fois à des moments différents dans la même application, pour dix questions différentes.

Il faut donc séparer ce traitement du corps du programme et regrouper les instructions qui le composent en un module séparé appelé sous-programme. Il ne restera alors plus qu'à appeler ce groupe d'instructions (qui n'existe donc désormais qu’en un exemplaire unique) à chaque fois qu’on en a besoin. Ainsi, la lisibilité est assurée ; le programme devient modulaire, et il suffit de faire une seule modification au bon endroit, pour que cette modification prenne effet dans la totalité de l’application.

Le corps du programme s’appelle alors le programme principal, et ces groupes d’instructions auxquels on a recours s’appellent des sous-programmes.

Lorsque le programme principal a besoin d’utiliser un sous-programme, il fait appel au sous-programme. Lors de l’appel d’un module, il y aura des échanges d’informations entre le module et le programme appelant. Cet échange est assuré par les paramètres.

Il existe deux types de sous-programmes : les procédures et les fonctions.

 

LES PROCEDURES

Définition

 Une procédure est un sous-programme qui permet la résolution d’un problème précis et qui peut envoyer plusieurs résultats au programme principal appelé aussi programme appelant.

 

Les parties d’une procédure

La définition d’une procédure est constituée de trois parties :

a)    L’en-tête : cette partie comporte le nom de la procédure suivi de l’ensemble des paramètres formels qui sont mis entre parenthèses. Chaque paramètre sera précédé par son mode de passage et suivi du type qui lui correspond.

b)    La déclaration : cette partie sera réservée à la déclaration des objets locaux propres à la procédure.

c)    Le corps : qui contient l’ensemble des instructions de développement de la procédure.

 

·         Syntaxe de la définition d’une procédure :

 

Procédurenom_procédure (paramètre I : type : I,……………., paramètre N :type N) ;

               /*Déclaration des variables et des constantes*/

 

Début

/*corps de la procédure*/

Fin nom_procédure

 

Exemple : Procédure qui demande la saisie d’un nom et d’un prénom à un utilisateur.

Procédure Saisie(x : chaine ; y : chaine)                        /*en-tête de la procédure */

var : x, y : chaine de caractères ;                         /*déclaration des variables propres de la procédure */

Début

Répéter

                   Ecrire (« Donner un nom ») ; Lire(x) ;                            /*corps de la procédure*/

 Ecrire (« Donner un prénom ») ; Lire(y) ;

Jusqu’à (x= « ») et (y= « ») ;

FinSaisie

 

 

 

NB : Etant un sous-programme complet, une procédure peut contenir ses propres procédures et fonctions qui n’existent que lorsque la procédure principale est en cours.        

 

Paramètres d’une procédure

            Un paramètre est une variable d’entrée de la procédure. Les paramètres vont permettre l’appel de la procédure dans le programme principal, dans une procédure principale ou appelante.

Il existe deux types de paramètres : les paramètres formels (fictifs) et les paramètres réels (effectifs).

-Les paramètres formels (fictifs) sont des paramètres avec lesquels on définit le module (ils figurent dans l’en-tête de la déclaration de la procédure).

-Les paramètres réels (effectifs) sont ceux qui sont utilisés dans l’instruction d’appel du module.      

 

Appel d’une procédure

            Pour appeler une procédure, il suffit d’écrire son nom suivi des paramètres réels qui se substitueront aux paramètres formels lors de l’exécution de la procédure en respectant la syntaxe suivante :

Syntaxe :

            Nom_de_la_procédure (paramètre effectif1, paramètre effectif2…..)

            Dans le programme principal, il faudra déclarer la procédure comme on déclare n’importe quel objet.

Exemple : Appelons la procédure Saisie dans un programme principal :

Algorithme NomComplet

var A, B, C : Chaine de caractères ;       /* déclaration des variables du programme principal */

Procédure Saisie ;   /* déclaration de la procédure */

 

Début

            Saisie (A, B) ;                                     /* appel de la procédure*/

C← A &B ;

            Ecrire (« Le nom complet est », C) ;

Fin

 

 

Remarque : Dans cet exemple, x et y sont des paramètres formels et A et B sont des paramètres réels.

Lors de l’appel d’une procédure, il faut respecter le nombre, l’ordre et le type des paramètres effectifs par rapport aux paramètres formels.

 

Modes de passage des paramètres

            Il s’agit ici du mode de transfert des données entre le programme appelant et le programme appelé. On distingue deux modes de passage des paramètres :

a)    Passage par valeur : Dans ce mode de passage, le programme appelant assure le transfert d’une valeur au programme appelé, même si ce paramètre subit une modification de sa valeur dans le programme appelé, cette modification ne doit pas être transmise au programme appelant, donc le transfert dans ce mode se fait de manière unidirectionnelle.

 

                  Appelant               Appelé

 

            b) Passage par adresse ou par référence

            Dans ce mode de passage, le programme appelant et le programme appelé font un échange de données. En effet, toute modification de la valeur d’un paramètre au sein du programme doit être communiquée au programme appelant, donc le transfert dans ce mode se fait dans les deux sens.

           

              Appelant                     Appelé

 

Dans l’en-tête de la procédure, il faut précéder les paramètres formels qui seront transmis par adresse par le mot clé var.

 

LES FONCTIONS

Définition

Une fonction est un sous-programme qui permet la résolution d’un problème précis et doit avoir un seul résultat de type simple (entier, réel, booléen, caractère ou chaine). Il s’agit d’un cas particulier des procédures.

Les parties d’une fonction

            La définition d’une fonction est constituée de trois parties :

a)    L’en-tête : cette partie comporte le nom de la fonction suivi de l’ensemble de la liste des paramètres formels qui sont mis entre parenthèses, et du type d’objet que la fonction va retourner. Chaque paramètre sera suivi du type qui lui correspond.

b) La déclaration : cette partie sera réservée à la déclaration des objets locaux propres à la fonction.

c)Le corps : qui contient l’ensemble des instructions de développement de la procédure.

·         Syntaxe de la définition d’une fonction :

 fonctionnom_de_la_fonction (paramètre I : type I ,….., paramètre N :type N) : Typevaleur_de_retour

                                    /*Déclaration des variables et des constantes propres à la fonction */

 

Début

 

            /*corps de la fonction*/

 

            Retourner nom-d’une-variable retournée ;

Fin Fonction

 

·         Exemple :Fonction qui effectue le produit de deux entiers

 

Fonction Produit (a : entier ; b : entier) : entier              /* en-tête de la fonction */

var  P : entier ;/* déclaration des variables propres à la fonction*/

Début

            P       a*b ;

Retourner P ;

FinProduit

 

Appel d’une fonction

Pour appeler une fonction, il suffit d’écrire son nom suivi des paramètres effectifs qui se substitueront aux paramètres formels lors de l’exécution de la fonction en respectant la syntaxe suivante :

            Syntaxe :

Nom_fonction (paramètre effectif1, paramètre effectif2…..)

Exemple : Appelons la fonction Produit dans un programme principal

 

Algorithme CalculProduit                             /* en-tête du programme principal */

var x, y, Prod : entiers ;         /* déclaration des variables du programme principal */

fonction Produit ;                                             /* déclaration de la fonction Produit */

Début

            Ecrire (« veuillez entrer deux nombres entiers ») ;

            Lire(x) ;

            Lire(y) ;

            Prod          Produit (a, b) ;                      /* appel de

la fonction Produit*/

            Ecrire (« Le produit des deux nombres x et y est », Prod) ;

Fin

 

 

REMARQUES : Les paramètres effectifs et les paramètres formels doivent correspondre de point de vue nombre, ordre et type.

·         Une fonction possède un type qui est celui de son résultat.

 

VARIABLES LOCALES ET VARIABLES GLOBALES

            Les variables globales sont des variables définies dans le programme principal. Ces variables sont accessibles par tous les modules existants dans ce programme.

Une procédure, ou un module en général peut avoir ses propres variables locales qui seront réinitialisées à chaque appel. Ces variables n’existent que dans cette procédure ou cette fonction.

 

EXEMPLES DES PROGRAMMES UTILISANT LES PROCEDURES ET LES FONCTIONS

1-Exemple1 :

            La mairie désire évaluer la taxe foncière à collecter dans un quartier de Yaoundé. Les lots de ce quartier sont des rectangles de longueur L et de largeur l. La valeur de la taxe foncière est de 1640 francs par m2. Comme il y a des milliers de lots, on vous sollicite pour écrire un programme permettant de faire ce travail :

            -Une procédure permettra de saisir (procédure Saisie) les dimensions de chaque lot.

            -Une fonction permettra de calculer la surface (fonction CalculSurface) de chaque lot et d’envoyer le résultat au programme principal.

            - Le programme principal doit récupérer toutes ces informations pour calculer le montant de la taxe foncière pour chaque individu, sommer les différents montants pour avoir un montant unique pour tout le quartier.

 

a)    Procédure de saisie : cette procédure permet de saisir la longueur et la largeur d’un lot.

Procédure Saisie (var x: réel)

var x: réel ;

Début

            Répéter

                        Ecrire « donner un réel positif » ;

                        Lire (x) ;

            Jusqu’à (x= « »)

FinSaisie

 

b)     

Fonction calculSurface : cette fonction calcule la surface de chaque lot.

Fonction CalculSurface (L :réel ; l :réel) : réel

var aire : réel ;

Début

            Aire               L*l ;

            Retourner (Aire) ;

FinCalculSurface

 

c)    Programme principal :

Algorithme taxeFoncière

const TAUX=1640 ;

var Montant, MontantTotal, surface, a, b : réels ;   /* déclaration des variables du programme principal */

Procédure Saisie  /* déclaration de la procédure */

Fonction CalculSurface                                     /* déclaration de la fonction */

Début

            MontantTotal      0 ;        /* on initialise la somme à 0 */

            Saisie(a,b) ;                                /* on appelle la procédure Saisie */

            Surface                CalculSurface (a,b) ; /* on appelle la fonction CalculSurface, le résultat est */

                                                                       /*affecté dans une variable surface*/

            Ecrire « Calcul de la taxe foncière » ;

Montant                         surface*TAUX ;

MontantTotal=MontantTotal + montant ;

Ecrire (« le montant total de la taxe est : », montantTotal) ;

Fin

 

Exemple2 :

Deux entiers m et n sont amis si la somme des diviseurs m (qu’on va appeler sdm) est égale à n et la somme des diviseurs de n(qu’on va appeler sdn) est égale à m. Pour vérifier si n et m sont amis, il suffit de comparer la somme des diviseurs de m à n et la somme des diviseurs de n à m. Deux cas se présentent :si sdm=n et sdn=m alors m et n son amis, sinon ils ne sont pas amis.

            -Une procédure (saisie) permettra de saisir deux entiers m et n strictement positifs.

            -une fonction (diviseur) permettra de calculer la somme des diviseurs de n et m.

            -Le programme principal devra faire appel à la fonction et la procédure, comparer sdm à n, sdn à m, et afficher si m et n sont amis ou pas.

a)    Procédure Saisie

Procédure Saisie (var x : entier)

var x : réel ;

Début

            Répéter

                        Ecrire « Entrer un réel positif » ;

                        Lire(x) ;

            Jusqu’à (x<= 0)

FinSaisie

 

b)   Fonction Diviseurs

Fonction Diviseurs (x : entier) : entier ;

var x, Sdx : entier ;

Début

            Sdx           1 ;

            Pour i de 2 à (x DIV 2) Faire

                        Si (x MOD i = = 0) Alors

                                    Sdx             Sdx + i ;

                        FinSi

            FinPour

FinDiviseurs

 

c)    Programme principal

Algorithme_Ami

var m,n, Sdm, Sdn : entiers ;

Début

            Saisie (m) ;

            Saisie (n) ;

            Sdm                        Diviseurs(m) ;

            Sdn                         Diviseurs(n) ;

            Si ((Sdm==n) et (Sdn==m) Alors

                                    Ecrire « m et n sont amis » ;

                        Sinon

                                    Ecrire « m et n ne sont pas amis »

            FinSi

Fin

 

 

 

EXERCICES

CONTROLE SE CONNAISSANCES

1-Définir : sous-programme

2-Citer 02 types de sous-programmes.

3-Quelle est la différence fondamentale entre une fonction et une procédure ?

4-Quelle est la différence entre une variable locale et une variable globale ?

5-Quelle est la différence entre un paramètre fictif (formel) et un paramètre effectif (réel) ?

 

EXERCICE I : On donne l’algorithme suivant :

/*Programme principal */

1. Algorithme

2.     Var carréNombre, i, S : entiers ;                                                

3     Fonction calculCarré ;                                 

3. Début

4.S    0 ;  

5.Pour i allant de 1 à 5   Faire    

6.carréNombre CalculCarré (i) ;

7.S             S+  carréNombre ;

8.FinPour

9.Ecrire (« la somme des carrés des 5 premiers entiers est : », S) ;

10. Fin

 

/*Fonction*/

11. Fonction calculCarré (a: entier ;) : entier ;

12. var carré: entier ;

13. Début

14       carré          a*a ;

15.      Retourner (carré) ;

16. FincalculCarré

 

Questions :

1. Identifier une variable locale.

2. Identifier une variable globale.

3. Identifier paramètre fictif.

4. Identifier un paramètre effectif.

5. Quel est le mode transfert des paramètres pour cette fonction ?

 

EXERCICE II : On donne l’algorithme suivant :

 

/*Programme principal*/

1. Algorithme

2.   tab : Tableau [1…5] de réels ;

3.   var           N, a, b, j : entiers ;

4.   Procédure permuter ;

5. Debut

6.         Pour i de N-1 à 1 Faire

7.         Pour j allant de 1  à N-1 faire;     

8.                    a← tab[j] ;     

9.                    b ←tab[j+1] ;

10                   Si a > b alors          

11                               Permuter (a, b) ;

12.                  FinSi

13.      FinPour

14.     FinPour

15. Fin

 

 

/*procédure*/

11. Procédure permuter (var A: entier, var B :entier)

12.     var Aux: entier ;

13. Début

14.

15.            Aux  A ;

16.               ← B ;

17.               ←Aux ;

18.

19. Finpermuter

 

Questions :

1. Identifier une variable locale.

2. Identifier une variable globale.

3. Identifier un paramètre fictif

4. Identifier un paramètre effectif

5. Quel est le mode de passage des paramètres pour cette procédure ?

 

EXERCICE III : 

          On se propose d'écrire un programme qui saisit un entier naturel n (100>n>20). Cet
entier n désigne le nombre d'étudiants d'une classe. On se propose de saisir pour
chaque étudiant, le nom, le prénom, la date de naissance, cinq notes d'examens et
leur moyenne pondérée par des coefficients. On veut déterminer et afficher la plus
grande moyenne permettant de faire passer au moins 75% des candidats, la liste
correspondante des candidats admis, la moyenne du plus jeune étudiant s'il est
admis et la moyenne du plus âgé s'il est admis aussi.
Questions
1) Définissez les structures de données adéquates à ce problème.
2) Spécifiez ce problème en le décomposant en modules.
3) Spécifiez chacun de ces modules.
4) En déduire l’algorithme de résolution relatif à chacun de ces modules ainsi que
celui du programme principal.

EXERCICES

CORRIGES

1-Sous-programme : C’est un bout de programme qu’un programme principal appelle au cours de son exécution pour effectuer des tâches   répétitives.

NB : Le programme principal est le programme appelant et le sous-programme est le programme appelé.

2-Fonctions et Procédures.

3-Les fonctions retournent une valeur, les procédures pas.

4- Une variable globale s’applique dans le programme principal et tous les sous programmes alors qu’une variable locale s’applique seulement dans le sous-programme dans lequel elle est définie.

NB : Une variable globale est définie dans le programme principal.

5-Un paramètre formel est utilisé pour définir un sous-programme alors qu’un paramètre réel et utilisé lors de l’appel du sous-programme.

 

EXERCICE I :

1. Variable locale : carré

2. Variable globale :carréNombre

3. Paramètre fictif : a

4. Paramètre effectif : i

5. Par valeur.

NB : Les fonctions utilisent en général un mode de transfert par valeur.

Quel est le mode de passage des paramètres pour cette procédure ?

 

EXERCICE II :

1. Variable locale : Aux

2. Variable globale : a

3. Paramètre fictif : A

4. Paramètre effectif : a 

5. Par variable.