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.
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.
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.
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.
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.
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.
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.
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.
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
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. A ← B;
17. B ←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.
Merci de votre visite
Laissez un commentaire