Vous êtes sur la page 1sur 10

S.

Laporte

Chap 5

Lyce Louise Michel BTS IG 1

Chapitre 5 : Les sous-programmes


INTRODUCTION
Lorsqu'un programme est long, il est irraliste d'crire son code d'un seul tenant. En fait, on dcompose le
programme en plusieurs parties plus petites, on donne un nom chacune de ces parties, et on les assemble
pour former le programme final. C'est le principe de la programmation modulaire, qui repose sur
l'criture de sous-programmes.
Un sous-programme est, comme son nom l'indique, un petit programme ralisant un traitement particulier
qui s'excute l'intrieur d'un autre programme.
Les sous-programmes sont utiliss pour deux raisons essentielles :
- quand un mme traitement doit tre ralis plusieurs fois dans un programme (ou qu'il est
utilis dans plusieurs programmes): on crit un sous-programme pour ce traitement et on l'appelle
chaque endroit o l'on en a besoin. On vite ainsi de rcrire plusieurs fois le code du traitement.
- pour organiser le code, amliorer la conception et la lisibilit des gros programmes. En effet, le
dcoupage en sous-programmes permet de traiter sparment les difficults.
Certains sous-programmes ont dj t crits et peuvent tre utiliss directement dans n'importe quel
programme. Ce sont des sous-programmes standards ou prdfinis. C'est le cas par exemple des sousprogrammes permettant de faire des calculs mathmatiques (racine carre, exposant, ). La nature et le
nombre de programmes standards dpendent des langages.
Mais les sous-programmes prdfinis ne suffisent pas pour dcouper un gros programme : le programmeur
est amen crire le code de ses propres sous-programmes.
Il existe deux sortes de sous-programmes : les procdures et les fonctions
Nous allons tudier d'abord les procdures simples, puis les fonctions. Nous reviendrons ensuite sur les
procdures pour tudier tous les types de passage de paramtres.

LES PROCEDURES (1ire partie)


Une procdure est un ensemble d'instructions regroupes sous un nom, qui ralise un traitement particulier
dans un programme lorsqu'on l'appelle.
Comme un programme, une procdure possde un nom, des variables, des instructions, un dbut et une fin.
Mais contrairement un programme, un sous-programme ne peut pas s'excuter indpendamment d'un autre
programme.
Syntaxe de la DEFINITION d'une procdure:
Procdure ligneEtoile( )
Var
i : entier
Dbut
Pour i de 1 jusqu' 10 Faire
Afficher '*'
FinPour
Afficher '\n'
FinProc

EN-TETE

CORPS

Cette procdure permet d'afficher une ligne de 10 toiles puis passe la ligne.
1

S. Laporte

Chap 5

Lyce Louise Michel BTS IG 1

APPEL d'une procdure


Pour dclencher l'excution d'une procdure dans un programme, il suffit de l'appeler, c'est--dire d'indiquer
son nom suivi de parenthses.
Programme RectangleEtoile
Var
nlignes: entier
cpt : entier
Dbut
Afficher "Ce programme dessine un rectangle d'toiles. Combien voulez-vous de lignes?"
Saisir nlignes
Pour cpt de 1 jusqu' nlignes Faire
Var
ligneEtoile( )
i : entier
FinPour
Dbut
Fin
Pour i de 1 jusqu' 10 Faire
Afficher '*'
FinPour
appel de la
Afficher '\n'
procdure
FinProc

Lorsque le processeur rencontre l'appel d'une procdure, il arrte momentanment l'excution du


programme appelant pour aller excuter les instructions de la procdure. Quand il a termin l'excution de
la procdure, le processeur reprend l'excution du programme appelant l o il s'tait arrt.
Une procdure peut tre appele soit par un programme, soit par un autre sous-programme (qui lui mme a
t appel). Les appels de sous-programmes peuvent s'imbriquer autant qu'on le dsire.

Notions de variables locales et de paramtres


Les variables dclares dans une procdure ne sont pas utilisables dans le programme appelant et
inversement, les variables dclares dans le programme appelant ne sont pas utilisables dans les procdures.
Chaque programme et sous-programme a son propre espace de variables, inaccessible par les autres. On dit
que les variables sont LOCALES. (on verra qu'il existe des variables globales, mais elles sont trs peu
utilises).

S. Laporte

Chap 5

Lyce Louise Michel BTS IG 1

Dans notre exemple, on ne pourrait pas saisir ou afficher cpt dans le programme principal, car cpt est une
variable de la procdure, utilisable seulement dans celle-ci. Le programme principal n'a pas le droit de
l'utiliser.
Une question qui se pose alors est de savoir comment procdures et programmes vont pouvoir
communiquer des donnes. Par exemple, on pourrait vouloir que le programme principal communique le
procdure combien d'toiles afficher par ligne. Cela est possible grce aux paramtres.
Un paramtre est une variable particulire qui sert la communication entre programme appelant et
sous-programme.
Exemple :
Dans notre exemple, nous allons mettre le nombre d'toiles par lignes en paramtre.
Pour cela, nous indiquons entre parenthses la dclaration du paramtre (qui est une variable de la
procdure !), prcd du mot cl donne pour indiquer que le paramtre constitue une donne du traitement
ralis par la procdure. La valeur de cette donne est communique l'appel, par le programme appelant.
Procdure ligneEtoile(donne nombre : entier )
//sous-programme
Var
paramtre formel
cpt : entier
Dbut
Pour cpt de 1 jusqu' nombre Faire
Afficher '*'
FinPour
Afficher '\n'
FinProc
Programme RectangleEtoile
//programme appelant
Var
nlignes, netoiles: entier //nombre de lignes et nombre d'toiles par ligne
i : entier
Dbut
Afficher "Ce programme dessine un rectangle d'toiles."
Afficher "Combien voulez-vous d'toiles par ligne?"
Saisir netoiles
Afficher "Combien voulez-vous de lignes?"
Saisir nlignes
Pour i de 1 jusqu' nlignes Faire
ligneEtoile(netoiles)
FinPour
paramtre effectif
Fin

Fonctionnement du passage des paramtres (de type donn)


Lors de l'appel de la procdure, la valeur de la variable netoiles passe en argument est copie dans le
paramtre formel nombre (qui est une variable). La procdure effectue alors le traitement avec la variable
nombre qui a bien la valeur voulue: celle de netoiles.
La procdure n'utilise par directement la variable netoile : elle utilise sa valeur, qu'elle a recopie dans sa
propre variable-paramtre.

S. Laporte

Chap 5

Programme RectangleEtoile

copie

Lyce Louise Michel BTS IG 1

Procdure ligneEtoile
paramtre
donne

netoiles

nombre

nlignes

cpt

! " Remarque importante sur l'ordre et le nombre des paramtres


Lorsqu'il y a plusieurs paramtres dans la dfinition d'une procdure, il faut absolument qu'il y en
ait le mme nombre l'appel et que l'ordre soit respect (car la copie se fait dans l'ordre).

Les paramtres rels et formels


Il est primordial de bien distinguer les paramtres qui se trouvent dans l'en-tte d'une procdure, lors de sa
dfinition et les paramtres (ou arguments) qui se trouvent placs entre parenthses lors de l'appel.
#$ Les paramtres placs dans la dfinition d'une procdure sont les paramtres formels. Ils servent
dcrire le traitement raliser par la procdure indpendamment des valeurs traites. Les
paramtres formels sont des variables locales la procdure, et ce titre ils sont dclars dans l'entte de la procdure.
#$ Les paramtres placs dans l'appel d'une procdure sont les paramtres rels ou effectifs.
Lorsqu'ils sont de type donne, ils contiennent effectivement les valeurs sur lesquelles sera effectu
le traitement de la procdure. Lors de l'appel, leur valeur est recopie dans les paramtres formels
correspondants. Un paramtre effectif en donne peut tre soit une variable du programme appelant,
soit une valeur littrale, soit le rsultat d'une expression.

LES FONCTIONS
Les fonctions sont des sous-programmes qui retournent un et un seul rsultat au programme appelant. De ce
fait, les fonctions sont appeles pour rcuprer une valeur, alors que les procdures ne renvoient aucune
valeur au programme appelant.
L'appel des fonctions est diffrent de l'appel des procdures :
L'appel d'une fonction doit obligatoirement se trouver l'intrieur d'une instruction (affichage,
affectation,) qui utilise sa valeur.
Le rsultat d'une fonction doit obligatoirement tre retourn au programme appelant par l'instruction
Retourne.
Syntaxe gnrale
Fonction nom(dclaration des paramtres) : type de la valeur retourne
Var
//variables locales
! instruction obligatoire
Dbut
//traitement
Retourne valeur retourner
FinFonction

correspond la valeur d'une variable, d'une


expression ou d'une valeur littrale.
4

S. Laporte

Chap 5

Lyce Louise Michel BTS IG 1

Exemple :
dclaration du paramtre formel
Fonction factorielle(n: entier) : entier
type de la valeur retourne
/*Cette fonction retourne la factorielle
du nombre n pass en paramtre*/
Var
commentaires de spcifications
i : entier
fact : entier
Dbut
fact % 1
Si n 0 Alors
Pour i de 1jusqu' n faire
fact % fact * n
FinPour
FinSi
Retourne fact
instruction de retour
FinFonction

DEFINITION
de la fonction
factorielle

Fonction saisie_nb_positif( ) : entier


/*Cette fonction permet de faire saisir l'utilisateur un nombre positif qui est alors retourn*/
Var
nb_saisi :entier
Dbut
Afficher "Veuillez entrer un nombre positif"
Saisir nb_saisi
Tantque nb_saisi < 0 Faire
Afficher "Erreur. Saisissez un nombre suprieur 0 s'il vous plait !"
Saisir nb_saisi
FinTantque
Retourne nb_saisi
FinFonction
Exemple de programme appelant utilisant ces deux fonctions:
Programme affiche_factorielle
Var
nombre: entier
appel de la fonction saisie_nb_positif
rep : chane
et affectation de sa valeur retourne la
variable nombre
Dbut
Rpter
nombre % saisie_nb_positif( )
paramtre effectif
Afficher "La factorielle de ", nombre, " est ", factorielle(nombre)
Afficher "Voulez-vous recommencez? (oui/non)"
de
la
fonction
appel
factorielle et affichage de sa
Saisir rep
valeur retourne
Jusqu' rep = "non"
Afficher "A bientt"
Fin
Remarque :
Les paramtres d'une fonction sont toujours de type donne. La valeur des paramtres effectifs
l'appel est recopie dans les paramtres formels qui servent raliser le traitement de la fonction.

S. Laporte

Chap 5

Lyce Louise Michel BTS IG 1

LES PROCEDURES (suite et fin)


Comment faire pour qu'un sous-programme communique plusieurs rsultats au programme appelant? C'est
impossible avec une fonction qui ne donne qu'un seul rsultat, mais c'est possible grce aux procdures
ayant des paramtres de statut rsultat.
Une procdure peut renvoyer plusieurs rsultats au programme appelant travers des paramtres de statut
rsultat. Elle peut aussi modifier la valeur d'un paramtre : ce paramtre doit alors avoir le statut de donnersultat.
Rappel et mise en garde: une fonction ne communique pas son rsultat travers un paramtre, mais
travers une simple valeur de retour. Ne pas confondre avec les paramtres rsultats utiliss dans les
procdures ! Le mode de communication est totalement diffrent
Il existe donc trois statuts pour les paramtres des procdures: donne, rsultat et donne-rsultat

Programme appelant

Procdure
l'appel

la fin de la procdure

donne
rsultat

l'appel

donne-rsultat
la fin de la procdure

copie de valeur
Nous avons dj tudi le fonctionnement des paramtres donnes dans la premire partie de ce cours; nous
allons voir ci-dessous le fonctionnement des deux autres.

Les paramtres rsultats


Les paramtres rsultats sont communiqus au programme appelant au moment du retour d'appel, c'est-dire la fin de la procdure. La valeur du paramtre formel rsultat est alors copie dans la variable passe
en paramtre dans l'appel (le paramtre effectif). La valeur initiale du paramtre effectif ( l'appel) n'a
aucune importance ; elle est mme souvent indtermine. La procdure se charge de lui affecter une valeur.
Exemple:
Voil tout d'abord une procdure qui permet de saisir les valeurs (c'est--dire d'initialiser) un tableau de 30
rels. Cette procdure n'a qu'un paramtre : le tableau. C'est un rsultat de la procdure.

Procdure Saisietab( rsultat untab : tableau[1..30] de rels)


Var
i: entier
Dbut
Pour i de 1 jusqu' 30 Faire
Saisir untab[i]
FinPour
/* la fin de la boucle, le tableau est rempli*/
FinProc
6

S. Laporte

Chap 5

Lyce Louise Michel BTS IG 1

Voil une autre procdure qui trouve le minimum et le maximum dans un tableau de 30 rels. Le tableau est
une donne, le minimum et le maximum sont des rsultats.

Procdure minmax (donne letab : tableau [1..30] de rels


rsultats mini, maxi : rels )
Var
i : entier
Dbut
mini % letab[1]
maxi %letab[1]
Pour i de 2 jusqu' 30 Faire
Si tab[i]< mini Alors
mini % letab[i]
FinSi
Si tab[i]> maxi Alors
maxi % letab[i]
FinSi
FinPour
/*A la sortie de la boucle, mini et maxi contiennent respectivement la valeur du minimum et la
valeur du maximum*/
FinProc
Voil comment ces procdures peuvent tre appeles dans un programme qui saisit 30 notes et affiche la
note maximale et la note minimale

Programme notes
Var
tabnotes: tableau [1..30] de rels
notemin, notemax: rels
Dbut
Afficher "Veuillez saisir les 30 notes"

Appel de la procdure Saisietab


Le paramtre est un tableau
! Attention : on ne met pas de crochets !

Saisietab(tabnotes)
minmax(tabnotes, notemin, notemax)

! Attention l'ordre des paramtres

Afficher " La note la plus haute est ", notemax, "et la note la plus basse est ", notemin
Fin
Programme notes
appel

notemin

au retour d'appel

Procdure Saisietab

notemax
i

S. Laporte

Chap 5

Lyce Louise Michel BTS IG 1

Programme notes
l'appel
Procdure minmax

notemin

au retour d'appel
mini

maxi

notemax
i
" Remarques :
#$ On peut passer tout un tableau en paramtre. C'est une exception la rgle de manipulation des
tableaux : normalement, on ne peut pas les manipuler globalement, mais par exception, on peut les
utiliser globalement lorsqu'on les passe en paramtre.

#$ Les deux procdures utilisent toutes les deux une variable appele i. Mais i correspond deux
variables diffrentes. Le i de la premire procdure ne correspond pas la mme variable que le i
de la deuxime procdure : chaque sous-programme a son espace mmoire propre.

Paramtres donne-rsultat
Les paramtres donnes-rsultats correspondent des donnes qui doivent tre modifies par une
procdure.
A l'appel, la valeur du paramtre effectif est copi dans le paramtre formel de la procdure. La procdure
se sert de cette valeur pour la modifier. A la fin de la procdure, la nouvelle valeur du paramtre formel est
recopie dans le paramtre effectif du programme appelant.

Exemple :
Voil une procdure qui prend pour paramtre un tableau de 10 entiers non tri et qui le renvoie tri en
ordre croissant. Le tableau est la fois une donne et un rsultat de la procdure.

Procdure tabtri( donne-rsultat letab : tableau[1...10] d'entiers)


Var
change : boolen
i, fin : entier
//indices (fin = dernier indice trait)
temp : entier
//variable servant l'change
Dbut
change % faux
fin % 10 -1
Rpter
Tantque i < fin Faire
Si letab[i] > letab[i+1] Alors
change % vrai
temp % letab[i]
letab[i] % letab[i+1]
letab[i+1] % letab[i]
FinSi
8

S. Laporte

Chap 5

Lyce Louise Michel BTS IG 1

i%i+1
FinTantque
fin % fin 1
Jusqu' non change
/* la sortie de la boucle, il n'y a plus d'changes possibles donc le tableau est tri */
FinProc
Programme tri
Var
montablo: tableau[1..10] d'entiers
i :entier
Dbut
Afficher "Tapez 10 valeurs entires"
Pour i de 1 jusqu' 10 Faire
Saisir montab[i]
FinPour

Appel de la procdure
Le paramtre est un tableau
! Attention : on ne met pas les crochets l'appel!

tabtri(montab) $
Afficher "Voil les valeurs tries dans l'ordre"
Pour i de 1 jusqu' 10 Faire
Afficher montab[i]
FinPour
Fin
Rsum des diffrents statuts pour les paramtres
paramtre donne (appelant & sous-programme)
la valeur du paramtre effectif est utilise dans la procdure et elle reste inchange.
paramtre rsultat (sous-programme& appelant)
la valeur initiale du paramtre effectif est ignore par la procdure. La valeur final du paramtre formel
rsultat est copie dans le paramtre effectif correspondant (qui doit obligatoirement tre une variable de
mme type)
paramtre donne-rsultat ( appelant %& sous-programme)
La valeur initiale paramtre effectif est utilise par la procdure qui modifie cette valeur. Au retour d'appel,
la nouvelle valeur est recopie dans le paramtre effectif correspondant (qui est obligatoirement une
variable)

Rsum des diffrences entre fonctions et procdures.


Les fonctions ne peuvent avoir que des
paramtres donnes.
Les fonctions ne peuvent communiquer qu'un
seul rsultat au programme appelant travers
une valeur de retour (et non travers un
paramtre)

Une s'appelle l'intrieur d'une instruction.


L'instruction utilise la valeur retourne par la
fonction.

Les procdures peuvent avoir des paramtres


rsultats, donnes ou donnes-rsultats.
Les procdures peuvent communiquer de 0
plusieurs rsultats au programme appelant
travers des paramtres rsultats ou donnesrsultats. La valeur de ces rsultat est affecte
aux paramtres effectifs correspondant (qui
doivent obligatoirement tre des variables du
programme appelant).
L'appel d'une procdure reprsente une
instruction en elle-mme. On ne peut pas
appeler une procdure au milieu d'une
instruction
9

S. Laporte

Chap 5

Lyce Louise Michel BTS IG 1

10