Dans l'écriture d'un algorithme nous pouvons être confrontés aux cas suivants :
		
		- les différentes parties de l'algorithme sont indépendantes 
		
- des suites identiques d'actions apparaissent en plusieurs points de l'algorithme 
		
- des suites identiques d'actions peuvent être utilisées dans d'autres algorithmes 
		
D'où la nécessité de regrouper ces actions en "
sous-programmes". Écrire un
		sous-programme revient à donner un nom à un regroupement d'actions. Voici quelques bonnes raisons d'utiliser
		les sous-programmes, ils permettent :
		
		- de nommer des actions complexes sans les décrire (abstraction)
		
- de diviser le travail (meilleure clarté de l'algorithme, maintenance facile ...)
		
- d'étendre le langage algorithmique de base
		
Définition et utilisation d'un sous-programme
		
		
		Définition
		
		 Définir un sous-programme, c'est donner un nom à une action complexe (ou groupement d'actions)
		
		
 Il y a deux parties dans la définition d'un sous-programme :
		
		- la spécification (QUOI ou nom du sous-programme) 
		
- la réalisation (COMMENT ou regroupement d'actions) 
		
Syntaxiquement, la partie 
spécification constitue l'
en-tête du
		sous-programme et la partie 
réalisation constitue le 
corps du sous-programme.
		
		
		Exemple : Création d'une équipe de personnages (dans un jeu de rôle)
		
		
		
			
				| Lire le nombre de personnages à créer;
 TANT QUE il reste un personnage à créer FAIRE
 Lire le nom du personnage;
 Lire la race;
 Lire la profession;
 Lire l'alignement;
 Attribuer les points aux caractéristiques du personnage;
 FIN TANT QUE;
 | 
		
		
		 Dans cet exemple "Attribuer les points ..." est une action complexe qui peut être décomposée :
		
		
			
				| SOUS-PROGRAMME Attribuer_points_caracteristiques
 
 DEBUT
 Affecter aléatoirement les valeurs initiales des caractéristiques;
 Déterminer le capital de points à répartir;
 TANT QUE il reste des points à répartir ET que le joueur désire continuer FAIRE
 Choisir la caractéristique à modifier;
 Lire le nombre de points à attribuer;
 SI ce nombre <= capital de points restant ALORS
 Modifier la caractéristique choisie;
 Mettre à jour le capital de points restant;
 FIN SI;
 FIN TANT QUE;
 FIN
 | 
		
		
		
		Utilisation
		
		 Utiliser un sous-programme, c'est faire référence (par son nom) au sous-programme. Ce qui revient
		à exécuter le corps de celui-ci.
		
		Exemple :
		
		
			
				| Si nous avons déjà écrit la définition du sous-programme Attribuer_points_caracteristiques, on écrira : 
 
 ...
 
 Attribuer_points_caracteristiques;
 ...
 | 
		
		
		Remarque : sur cet exemple, nous n'avons qu'une seule référence au sous-programme, mais en réalité
		nous pouvons l'appeler autant de fois que nécessaire.
		
		 Voici ce qu'il se passe lorsqu'un sous-programme est appelé :
		
		- appel du sous-programme
		
- exécution du corps du sous-programme
		
- retour du sous-programme après l'action d'appel
		
L'appel et le retour du sous-programme implique un transfert de contrôle de l'
appelant
		(algorithme) vers l'
appelé (sous-programme).
		
		
		
		
		
		Paramètres de sous-programmes
		
		
		Notions de paramètre
		
		 L'idée est de pouvoir appliquer un même sous-programme à des contextes différents.
		
		
 Dans l'exemple précédent, le sous-programme Attribuer_points_caracteristiques, l'absence de paramètres
		implique qu'il s'agira toujours du même calcul (celui d'un personnage en particulier). Pour l'algorithme, nous
		avons besoin de changer de personnage à chaque pas de la répétition. Il nous faut donc transmettre au sous-programme
		une information appelée : 
PARAMETRE
		
		Exemple : on peut imaginer comme paramètre le nom du personnage
		
		
			
				| SOUS-PROGRAMME Attribuer_points_caracteristiques(NOM_PERSONNAGE)
 
 DEBUT
 Affecter aléatoirement les valeurs initiales des caractéristiques (NOM_PERSONNAGE);
 Déterminer le capital de points à répartir;
 TANT QUE il reste des points à répartir ET que le joueur désire continuer FAIRE
 Choisir la caractéristique à modifier (NOM_PERSONNAGE);
 Lire le nombre de points à attribuer;
 SI ce nombre <= capital de points restant ALORS
 Modifier la caractéristique choisie (NOM_PERSONNAGE);
 Mettre à jour le capital de points restant;
 FIN SI;
 FIN TANT QUE;
 FIN
 
 Dans l'algorithme on écrira :
 
 
 ...
 Attribuer_points_caracteristiques (PERSONNAGE1);
 ...
 Attribuer_points_caracteristiques (PERSONNAGE2);
 ...
 
 | 
		
		
		
		
		Remarques :
		
		- Chez l'appelant (algorithme), le paramètre est appelé paramètre effectif (ou réel), chez l'appelé (sous-programme), le paramètre est appelé paramètre formel. 
		
- On peut donner aux paramètres effectif et formel le même nom. 
		
- La définition d'un sous-programme n'est pas liée au nombre d'utilisations (même s'il n'y a qu'un seul appel, faire un sous-programme). Sa définition est liée à la notion d'entité (ou module) et non à sa fréquence d'appel. 
		
Modes de transmission des paramètres
		
		 Les paramètres formels sont mis en correspondance avec les paramètres effectifs, un à un et de gauche
		à droite (avec vérification du type des paramètres pour les langages de programmation)
		
		
 Il existe 3 modes de transmission :
		
		- mode ENTREE (lecture seulement)
		
- mode SORTIE (écriture seulement)
		
- mode MISE A JOUR (lecture et/ou écriture)
		
		Remarques :
		
		- Il s'agit de modes de transmission logiques (notion générale d'algorithmique)
		
- Les langages de programmation implémentent certains types de transmission. Par exemple le langage C et le Pascal ont un mode entrée (transmission par valeur) et un mode sortie/mise à jour (transmission par référence), d'autres langages possèdent les 3 modes.
		
1) Mode ENTREE
		
		 Le sous-programme consulte uniquement la valeur du paramètre. La valeur du paramètre est fournie par
		l'appelant.
		
		Exemple : 
		
		
			
				| SOUS-PROGRAMME Attribuer_points_caracteristiques (ENTREE NOM_PERSONNAGE) | 
		
		
		
		2) Mode SORTIE
		
		 Le sous-programme calcule une valeur qui est ensuite retournée à l'appelant. Le résultat est fourni
		par le sous-programme.
		
		Exemple :
		
		
			
				| On suppose que le sous-programme Attribuer_points_caracteristiques retourne le nombre de points n'ayant
					pas été attribués, nous écrirons : SOUS-PROGRAMME
 Attribuer_points_caracteristiques (ENTREE NOM_PERSONNAGE, SORTIE CAPITAL_RESTANT)
 | 
		
		
		
		2) Mode MISE A JOUR
		
		 Le paramètre est communiqué par l'appelant, le sous-programme modifie la valeur du paramètre et
		retourne la nouvelle valeur du paramètre à l'appelant . Il s'agit d'une combinaison des modes ENTREE et SORTIE.
		
		Exemple :
		
		
			
				| Dans notre sous-programme, les caractéristiques ont besoin d'être
					retournées mais aussi d'être évaluées lors de la répartition des points. SOUS-PROGRAMME
 Attribuer_points_caracteristiques (ENTREE NOM_PERSONNAGE, SORTIE CAPITAL_RESTANT,
 MISE A JOUR CARACTERISTIQUES )
 | 
		
		
		
		
		
		
		
		 En algorithmique une application sera codée par plusieurs sous-programmes englobés dans un
		programme plus général appelé 
programme principal. Chaque sous-programme est un 
bloc
		d'actions, on parle alors de langage à structure de blocs. Au début de l'algorithme, le contrôle est
		transmis à la première action du corps du programme.
		
		
 De manière générale, l'écriture d'un programme se note ainsi :
		
		
			
				| PROGRAMME P GLOSSAIRE
 
 SOUS-PROGRAMME SP1
 GLOSSAIRE
 DEBUT
 ...
 FIN
 
 SOUS-PROGRAMME SP2
 GLOSSAIRE
 DEBUT
 ...
 FIN
 ...
 DEBUT
 ...
 FIN
 | 
		
		
		
		 Règles de portée des variables
		
		- Les variables déclarées dans le glossaire du programme sont visibles (et donc accessibles) dans tout le programme, y compris les sous-programmes. Sauf si une variable portant le même nom est déclarée dans le glossaire d'un sous-programme (priorité au bloc le plus interne).
 
 
- Les variables déclarées dans le glossaire d'un sous-programme ne sont visibles que dans le corps de ce sous-programme.
 
 
- Les paramètres formels d'un sous-programme ne sont visibles que dans le sous-programme. 
 
		Remarques :
		
		 Les variables du programme sont souvent appelées 
variables globales. Les variables
		d'un sous-programme sont appelées 
variables locales. Un sous-programme peut travailler :
		
		- sur des données du programme appelant (variables globales) 
		
- sur des données transmises par l'appelant (paramètres en mode entrée) 
		
- sur des données propres au sous-programme (variables locales) 
		
Activation d'un sous-programme
		
		
		Résumé des effets d'une activation d'un sous-programme
		
		 Fonctionnement de l'appel d'un sous-programme :
		
		- Mise en correspondance des paramètres effectifs avec les paramètres formels, un à un, de gauche à droite
		
 
 
- Pour chaque paramètre formel en mode entrée : allocation d'un emplacement et initialisation de l'emplacement par la valeur du paramètre effectif (recopie)
		
 
 
- Chaque paramètre formel en mode sortie ou en mode mise à jour représente le paramètre effectif correspondant (référence)
		
 
 
- Pour chaque variable locale du sous-programme : allocation d'un emplacement non initialisé (sa valeur est indéterminée, il est nécessaire d'affecter une valeur dans le corps du sous-programme)
		
 
 
- Exécution du corps du sous-programme : pour les paramètres en mode entrée et les variables locales, les modifications sont temporaires. Pour les paramètres en mode sortie et mise à jour ainsi que pour les variables globales, les modifications sont permanentes
		
 
 
- A la fin de l'exécution du sous-programme (retour) tous les emplacements créés sont libérés.
		
		Remarques :
		
		- Pour les paramètres de taille importante (grands tableaux ou enregistrements ayant de nombreux champs), préférer le mode mise à jour plutôt que le mode entrée (même si le sous-programme ne fait que consulter le paramètre) car il y a recopie de toutes les valeurs du paramètre sinon.
		
 
 
- A un paramètre en mode mise à jour ou sortie, on peut associer un paramètre effectif de type variable, mais on ne peut lui associer une expression (impossible de fournir la référence d'une expression). A un paramètre en mode entrée on peut associer un paramètre effectif variable ou expression. 
		
		Exemple :
		
		
			
				| Soit le programme PROGRAMME P
 GLOSSAIRE
 A : une variable entière;
 B : une autre variable entière;
 
 
 SOUS-PROGRAMME H (ENTREE X, MISE A JOUR Y)
 DEBUT
 X
  X + 1; Y
  Y + 1; ECRIRE (X,Y);
 FIN
 
 DEBUT
 
 A
  0; B  0; 
 
 H (A, B);
 
 
 ECRIRE (A,B);
 FIN
 | 
		
		
		
		 A et B sont 2 variables globales mais aussi paramètres effectifs du sous-programme H
		
 X et Y sont des paramètres formels du sous-programme H
		
		
 A et B sont visibles dans le corps du programme P et dans le sous-programme H (voir 
portée des variables)
		
 X et Y ne sont visibles que dans le sous-programme H (voir 
portée des variables)
		
		
		
			| Trace d'exécution du programme P | 
			 
				| Etape 1 |  | 
			 
				| Etape 2 
 | 
						 
							| Programme P | Sous-programme H |   
							| A = 0 | X = 0 |   
							| B = 0 | Y référence sur B = 0 |  | 
			 
				| Exécution du sous-programme H | 
						 
							| Programme P | Sous-programme H |   
							| A = 0 | X = 1 |   
							| B = 1 | Y référence sur B = 1 |  | 
			 
				| Résultat de l'opération ECRIRE(X,Y) 
 | 1 , 1 | 
			 
				| Etape 3 
 |  | 
			 
				| Résultat de l'opération ECRIRE(A,B) 
 | 0 , 1 | 
		
		
		
		
			 
				|  | Attention à l'utilisation des paramètres en mode entrée ! Évitez de modifier ces paramètres... | 
		
		
		
		 Règles de "bonne conduite" d'utilisation des paramètres
		
		- Un paramètre en mode entrée ne doit apparaître qu'en partie droite d'une affectation (valeur du paramètre). Interdiction de modifier un paramètre en mode entrée.
		
 
 
- Un paramètre en mode sortie ne doit apparaître qu'en partie gauche d'une affectation. Interdiction de consulter la valeur d'un paramètre en mode SORTIE.
		
 
 
- Pour les paramètres en mode mise à jour, autorisation des opérations de consultation et de modification (parties gauche et droite d'une affectation)
		
 
 
- Ne pas transformer les en-têtes des sous-programmes en utilisant uniquement le mode MISE A JOUR ! 
		
Solution et correction du sous-programme H :
		
		
		
			
				| SOUS-PROGRAMME H (ENTREE X, MISE A JOUR Y) GLOSSAIRE
 Z : variable locale au sous-programme H
 DEBUT
 Z
  X; Z
  Z + 1; Y
  Y + 1; ECRIRE (X,Y);
 FIN
 
 | 
		
		
		
		 L'action ECRIRE(X,Y) donnera les valeurs 0 et 1, ce qui est conforme aux valeurs des variables A et B
		de l'action ECRIRE(A,B).
		
		
		
		
		
		Retour en haut de page