Exood4 Studio - Video Game Development, Toulouse (France)
Exood4 Studios Exood4 Tutorials

   
A l g o r i t h m e s

L e s   s o u s - p r o g r a m m e s

(1re partie)




 Dans l'criture d'un algorithme nous pouvons tre confronts aux cas suivants :
  • les diffrentes parties de l'algorithme sont indpendantes
  • des suites identiques d'actions apparaissent en plusieurs points de l'algorithme
  • des suites identiques d'actions peuvent tre utilises dans d'autres algorithmes
 D'o la ncessit 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 dcrire (abstraction)
  • de diviser le travail (meilleure clart de l'algorithme, maintenance facile ...)
  • d'tendre le langage algorithmique de base


Dfinition et utilisation d'un sous-programme


Dfinition

 Dfinir un sous-programme, c'est donner un nom une action complexe (ou groupement d'actions)

 Il y a deux parties dans la dfinition d'un sous-programme :
  • la spcification (QUOI ou nom du sous-programme)
  • la ralisation (COMMENT ou regroupement d'actions)
 Syntaxiquement, la partie spcification constitue l'en-tte du sous-programme et la partie ralisation constitue le corps du sous-programme.


Exemple : Cration d'une quipe de personnages (dans un jeu de rle)

// Cration des personnages
 Lire le nombre de personnages crer;
 TANT QUE il reste un personnage crer FAIRE
 Lire le nom du personnage;
 Lire la race;
 Lire la profession;
 Lire l'alignement;
 Attribuer les points aux caractristiques du personnage;
 FIN TANT QUE;

 Dans cet exemple "Attribuer les points ..." est une action complexe qui peut tre dcompose :

// En tte du sous-programme
 SOUS-PROGRAMME Attribuer_points_caracteristiques
 // Corps du sous-programme
 DEBUT
 Affecter alatoirement les valeurs initiales des caractristiques;
 Dterminer le capital de points rpartir;
 TANT QUE il reste des points rpartir ET que le joueur dsire continuer FAIRE
 Choisir la caractristique modifier;
 Lire le nombre de points attribuer;
 SI ce nombre <= capital de points restant ALORS
 Modifier la caractristique choisie;
 Mettre jour le capital de points restant;
 FIN SI;
 FIN TANT QUE;
 FIN


Utilisation

 Utiliser un sous-programme, c'est faire rfrence (par son nom) au sous-programme. Ce qui revient excuter le corps de celui-ci.

Exemple :

Si nous avons dj crit la dfinition du sous-programme Attribuer_points_caracteristiques, on crira :

// Cration des personnages
 ...
 // rfrence au sous-programme
 Attribuer_points_caracteristiques;
 ...

Remarque : sur cet exemple, nous n'avons qu'une seule rfrence au sous-programme, mais en ralit nous pouvons l'appeler autant de fois que ncessaire.

 Voici ce qu'il se passe lorsqu'un sous-programme est appel :
  • appel du sous-programme
  • excution du corps du sous-programme
  • retour du sous-programme aprs l'action d'appel
 L'appel et le retour du sous-programme implique un transfert de contrle de l'appelant (algorithme) vers l'appel (sous-programme).




Paramtres de sous-programmes


Notions de paramtre

 L'ide est de pouvoir appliquer un mme sous-programme des contextes diffrents.

 Dans l'exemple prcdent, le sous-programme Attribuer_points_caracteristiques, l'absence de paramtres implique qu'il s'agira toujours du mme calcul (celui d'un personnage en particulier). Pour l'algorithme, nous avons besoin de changer de personnage chaque pas de la rptition. Il nous faut donc transmettre au sous-programme une information appele : PARAMETRE

Exemple : on peut imaginer comme paramtre le nom du personnage

// En tte du sous-programme
 SOUS-PROGRAMME Attribuer_points_caracteristiques(NOM_PERSONNAGE)
 // Corps du sous-programme
 DEBUT
 Affecter alatoirement les valeurs initiales des caractristiques (NOM_PERSONNAGE);
 Dterminer le capital de points rpartir;
 TANT QUE il reste des points rpartir ET que le joueur dsire continuer FAIRE
 Choisir la caractristique modifier (NOM_PERSONNAGE);
 Lire le nombre de points attribuer;
 SI ce nombre <= capital de points restant ALORS
 Modifier la caractristique choisie (NOM_PERSONNAGE);
 Mettre jour le capital de points restant;
 FIN SI;
 FIN TANT QUE;
 FIN

Dans l'algorithme on crira :

// Cration des personnages
 ...
 Attribuer_points_caracteristiques (PERSONNAGE1);
 ...
 Attribuer_points_caracteristiques (PERSONNAGE2);
 ...


Remarques :
  • Chez l'appelant (algorithme), le paramtre est appel paramtre effectif (ou rel), chez l'appel (sous-programme), le paramtre est appel paramtre formel.
  • On peut donner aux paramtres effectif et formel le mme nom.
  • La dfinition d'un sous-programme n'est pas lie au nombre d'utilisations (mme s'il n'y a qu'un seul appel, faire un sous-programme). Sa dfinition est lie la notion d'entit (ou module) et non sa frquence d'appel.
Modes de transmission des paramtres

 Les paramtres formels sont mis en correspondance avec les paramtres effectifs, un un et de gauche droite (avec vrification du type des paramtres 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 gnrale d'algorithmique)
  • Les langages de programmation implmentent certains types de transmission. Par exemple le langage C et le Pascal ont un mode entre (transmission par valeur) et un mode sortie/mise jour (transmission par rfrence), d'autres langages possdent les 3 modes.

1) Mode ENTREE

 Le sous-programme consulte uniquement la valeur du paramtre. La valeur du paramtre 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 retourne l'appelant. Le rsultat 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 attribus, nous crirons :

SOUS-PROGRAMME
Attribuer_points_caracteristiques (ENTREE NOM_PERSONNAGE, SORTIE CAPITAL_RESTANT)


2) Mode MISE A JOUR

 Le paramtre est communiqu par l'appelant, le sous-programme modifie la valeur du paramtre et retourne la nouvelle valeur du paramtre l'appelant . Il s'agit d'une combinaison des modes ENTREE et SORTIE.

Exemple :

Dans notre sous-programme, les caractristiques ont besoin d'tre retournes mais aussi d'tre values lors de la rpartition des points.

SOUS-PROGRAMME
Attribuer_points_caracteristiques (ENTREE NOM_PERSONNAGE, SORTIE CAPITAL_RESTANT,
  MISE A JOUR CARACTERISTIQUES )



Porte des variables


 En algorithmique une application sera code par plusieurs sous-programmes englobs dans un programme plus gnral appel programme principal. Chaque sous-programme est un bloc d'actions, on parle alors de langage structure de blocs. Au dbut de l'algorithme, le contrle est transmis la premire action du corps du programme.

 De manire gnrale, l'criture d'un programme se note ainsi :

PROGRAMME P
GLOSSAIRE

SOUS-PROGRAMME SP1
GLOSSAIRE
DEBUT
...
FIN

SOUS-PROGRAMME SP2
GLOSSAIRE
DEBUT
...
FIN
...
DEBUT // programme principal
...
FIN


 Rgles de porte des variables
  • Les variables dclares 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 mme nom est dclare dans le glossaire d'un sous-programme (priorit au bloc le plus interne).

  • Les variables dclares dans le glossaire d'un sous-programme ne sont visibles que dans le corps de ce sous-programme.

  • Les paramtres formels d'un sous-programme ne sont visibles que dans le sous-programme.
Remarques :

 Les variables du programme sont souvent appeles variables globales. Les variables d'un sous-programme sont appeles variables locales. Un sous-programme peut travailler :
  • sur des donnes du programme appelant (variables globales)
  • sur des donnes transmises par l'appelant (paramtres en mode entre)
  • sur des donnes propres au sous-programme (variables locales)


Activation d'un sous-programme


Rsum des effets d'une activation d'un sous-programme

 Fonctionnement de l'appel d'un sous-programme :
  • Mise en correspondance des paramtres effectifs avec les paramtres formels, un un, de gauche droite

  • Pour chaque paramtre formel en mode entre : allocation d'un emplacement et initialisation de l'emplacement par la valeur du paramtre effectif (recopie)

  • Chaque paramtre formel en mode sortie ou en mode mise jour reprsente le paramtre effectif correspondant (rfrence)

  • Pour chaque variable locale du sous-programme : allocation d'un emplacement non initialis (sa valeur est indtermine, il est ncessaire d'affecter une valeur dans le corps du sous-programme)

  • Excution du corps du sous-programme : pour les paramtres en mode entre et les variables locales, les modifications sont temporaires. Pour les paramtres en mode sortie et mise jour ainsi que pour les variables globales, les modifications sont permanentes

  • A la fin de l'excution du sous-programme (retour) tous les emplacements crs sont librs.
Remarques :
  • Pour les paramtres de taille importante (grands tableaux ou enregistrements ayant de nombreux champs), prfrer le mode mise jour plutt que le mode entre (mme si le sous-programme ne fait que consulter le paramtre) car il y a recopie de toutes les valeurs du paramtre sinon.

  • A un paramtre en mode mise jour ou sortie, on peut associer un paramtre effectif de type variable, mais on ne peut lui associer une expression (impossible de fournir la rfrence d'une expression). A un paramtre en mode entre on peut associer un paramtre effectif variable ou expression.

Exemple :

Soit le programme
PROGRAMME P
GLOSSAIRE
A : une variable entire;
B : une autre variable entire;
// A et B sont 2 variables globales

SOUS-PROGRAMME H (ENTREE X, MISE A JOUR Y)
DEBUT
 X X + 1;
 Y Y + 1;
 ECRIRE (X,Y);
FIN

DEBUT
 // tape 1
 A 0; B 0;

 // tape 2
 H (A, B);

 // tape 3
 ECRIRE (A,B);
FIN


 A et B sont 2 variables globales mais aussi paramtres effectifs du sous-programme H
 X et Y sont des paramtres formels du sous-programme H

 A et B sont visibles dans le corps du programme P et dans le sous-programme H (voir porte des variables)
 X et Y ne sont visibles que dans le sous-programme H (voir porte des variables)


Trace d'excution du programme P
Etape 1
Programme P
A = 0
B = 0
Etape 2
Programme P
Sous-programme H
A = 0 X = 0
B = 0 Y rfrence sur B = 0
Excution du sous-programme H
Programme P
Sous-programme H
A = 0 X = 1
B = 1 Y rfrence sur B = 1
Rsultat de l'opration ECRIRE(X,Y)
1 , 1
Etape 3
Programme P
A = 0
B = 1
Rsultat de l'opration ECRIRE(A,B)
0 , 1


Attention l'utilisation des paramtres en mode entre ! vitez de modifier ces paramtres...


 Rgles de "bonne conduite" d'utilisation des paramtres
  • Un paramtre en mode entre ne doit apparatre qu'en partie droite d'une affectation (valeur du paramtre). Interdiction de modifier un paramtre en mode entre.

  • Un paramtre en mode sortie ne doit apparatre qu'en partie gauche d'une affectation. Interdiction de consulter la valeur d'un paramtre en mode SORTIE.

  • Pour les paramtres en mode mise jour, autorisation des oprations de consultation et de modification (parties gauche et droite d'une affectation)

  • Ne pas transformer les en-ttes 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