Vous êtes sur la page 1sur 12

K.

Zabo sous-programmes Centre Universitaire Professionnalis

Les sous-programmes

I. Prsentation et terminologie
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 qu'on assemble pour former
l'application finale.

Les sous-programmes (procdures et fonctions) permettent de donc dcouper un gros


programme en morceaux plus petits et donc plus simples coder et comprendre, et de plus
permet d'viter de rpter plusieurs morceaux de code identiques.

Comme un programme, un sous-programme 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.
En effet, l'excution d'un sous-programme est demande par le programme principal (ou un
autre sous-programme) grce une instruction spcifique qu'on nomme APPEL. Le
programme principal est l'ensemble d'instruction qui s'excute au lancement de l'application
(depuis l'OS ou l'environnement de dveloppement). C'est le programme principal qui se
charge de demander l'excution des instructions se trouvant des les sous-programmes.

application

Remarque importante :

Vous avez dj utilis des sous-programmes en C# : les procdures vnementielles. Ce sont


des sous-programmes particulier, excuts la suite d'un vnement (par exemple clic sur un
bouton, chargement d'une fentre, ).

1
S. Laporte sous-programmes DAIGL TS1

Les sous-programmes que nous allons tudier sont d'un autre type : ces sous-programmes
(non vnementiel) ne sont pas excuts suite un vnement, mais sont lancs par une
instruction dans un autre sous-programme ou par le programme principal.

L'instruction qui permet d'excuter un sous-programme est nomme APPEL. On dit


qu'un sous-programme est appel par un programme appelant (qui peut tre le
programme principal ou un autre sous-programme).

Certains sous-programmes sont dj crits, regroups dans des bibliothques et sont


utilisables dans l'environnement de dveloppement. On les appelle les sous-programmes
prdfinis.

Mais le dveloppeur peut tre amen coder ses propres sous-programmes pour mieux
organiser son code (le dcouper pour le rendre plus lisible et plus facile dbogguer) et
permettre de rutiliser du code qui revient souvent.

Les instructions d'un sous-programme est crit en dehors du programme appelant: c'est la
DEFINITION du sous-programme. Si un sous-programme crit n'est jamais appel, il ne sera
jamais excut. Mais on peut vous demander d'crire un sous-programme sans savoir quand et
comment il sera appel.

Seul le programme principal est lanc au moment o on excute l'application. Les


sousprogrammes ne sont excuts seulement quand ils sont appels.

Lorsque l'excution d'un sous-programme est termine, il y a un RETOUR l'instruction qui


suit l'appel dans le programme appelant.

Il existe deux types de sous-programmes : les procdures et les fonctions. Les procdures ne
reprsentent qu'une suite d'instructions, alors que les fonctions renvoient en plus une valeur
rsultat. Pour l'instant nous n'tudierons que des exemples avec des procdures. Nous verrons
en dtail la diffrence entre les deux dans la 3 partie.

Exemple trs simple:

Procdure DessinerLigne( )
Var i :entier
Dbut
Pour i de 1 10 Faire
Afficher "*" FinPour
Afficher "\n" //passage la ligne
FinProc

Programme (principal)
Var n : entier Cette procdure dessine une
Dbut ligne de 10 toiles et passe
Afficher "Voici une belle figure gomtrique" Pour n la ligne
de 1 5 Faire
DessinerLigne( )
FinPour

L3-M1-M2-INFORMATIQUE-TELECOMS 2
S. Laporte sous-programmes DAIGL TS1

Afficher "Alors, a vous plait?"


FinProg
programme principal

DessinerLigne

Dbut i

Pour n de 1 5 Faire Dbut
DessinerLigne( )
FinPour
Fin
Fin

La procdure DessinerLigne est appele 5 fois (une fois par passage dans la boucle pour),
donc le programme dessine un rectangle

Un sous-programme peut lui-mme appeler un autre sous programme.


A chaque fin de sous-programme, on revient l'excution de l'instruction suivante dans le
programme appelant.

Ordre d'excution des instructions


programme principal ssprog A
4 ssprog C
5 7 1
6appel de C 8 2
3appel de A 10 9
11
14 12
13appel de B 15
16
ssprog B

Communication entre programme appelant et sous-programme appel

Les donnes et les rsultats d'un sous-programme proviennent d'une communication entre le
programme appelant et le sous-programme.

3 modes de communication sont possibles :


- l'utilisation de variables communes l'appelant et l'appel : ce sont les variables globales.
- le passage de paramtres, pour les procdures et les fonctions
- la valeur de retour pour les fonctions

3
S. Laporte sous-programmes DAIGL TS1

II. Variables locales et variables globales


L'endroit o est dclar une variable est trs important car il dtermine dans quel(s)
sousprogramme(s) elle va pouvoir tre utilise.
Une variable locale est dclare l'intrieur d'un sous-programme et elle n'est utilisable que dans le
sous-programme o elle a t dclare. Ceci est aussi valable pour le programme principal : une variable
dclare dans le programme principal n'est utilisable que dans le programme principal et pas dans les
sousprogramme.

Une variable globale est dclare l'extrieur du programme principal et des sous-programmes : elle
commune l'ensemble des sous-programmes1 et du programme principal, Elle est utilisable partout
(surtout il ne faut pas redclarer la variable dans les sous-programmes utilisateurs)

Suite de l'exemple :
Imaginons qu'on veuille que l'utilisateur puisse choisir le nombre d'toiles par lignes et le nombre de
lignes dans le rectangle. On pourrait dclarer ces deux donnes en variables globales

Var globales : nbe : entier //nombre d'toiles par


ligne nbl : entier //nombre de lignes du rectangle

nbe nbl
Procdure DessinerLigne( )
Var i :entier Procdure DessinerLigne
Dbut
Pour i de 1 nbe Faire
Afficher "*" FinPour
Afficher "\n" //passage la ligne
FinProc

Programme (principal) programme principal


Var i : entier
Dbut
Afficher "Combien de lignes voulez-vous votre rectangle ?"
Saisir nbl
Afficher "Combien d'toiles par lignes voulez-vous?"
Saisir nbe i
Pour i de 1 nbl Faire
DessinerLigne( )
FinPour
Afficher "Alors, a vous plait?"

1
plus exactement l'ensemble des sous-programmes de la classe (dans les langages objet tels que C#) ou dans
l'ensemble des sous-programmes du fichier dans les autres types de langage
L3-M1-M2-INFORMATIQUE-TELECOMS 4
S. Laporte sous-programmes DAIGL TS1

FinProg

Variables de mme nom


Le mme nom de variable peut dsigner plusieurs variables locales diffrentes. En effet, rien
n'empche que plusieurs sous-programmes utilisent le mme nom de variable en local. La valeur de i
dans un sous-programme n'aura pas d'influence sur la valeur de i d'un autre sous-programme, car i
correspond deux emplacements de la mmoire distincts, et propre un sous-programme.

En revanche, une variable globale n'existe qu'en un seul exemplaire pour tous les sous-programmes,
donc chaque fois qu'un sous-programme modifie une variable globale, alors sa modification sera
visible par tous les autres sous-programmes. C'est utilis seulement en cas de ncessit. Dans notre
exemple, on ne pourrait donc pas utiliser i comme variable globale, car i a une valeur diffrente dans
le programme principal et dans la procdure DessinerLigne.

Mais Attention ne jamais appeler une variable locale par le mme nom qu'une variable globale.

III. Fonctions et procdures


Dans les exemples prcdents, nous avons vu les procdures, qui ne sont pas les seuls types de
sous-programmes. Les procdures ne reprsentent qu'une suite d'instructions excutes
l'appel dans le programme appelant.

Les fonctions ralisent aussi une suite d'instructions mais en plus elle renvoie une valeur
rsultat au programme appelant. Cette valeur doit tre utilise par le programme appelant.
En effet; l'appel d'une fonction est remplac dans le programme appelant par la valeur
renvoye. Cette valeur doit donc tre incluse dans une instruction qui l'utilise. A la
dfinition d'une fonction, on doit indiquer le type de la valeur retourne

Exemple :

Variable globale montantHT


: rel

Fonction ttc ( ) : rel


Var montantTTC Dbut
montantTTC montantHT*1.196
retourne montantTTC
Fin

Programme totalfacture
Dbut
Rpter
"MontantHT du produit numro" + i Saisir
montantHT
total total + ttc( )
"Autre produit? (tapez N pour non ou tout autre touche pour continuer)"
Saisir rep
Jusqu' rep = 'N'
Afficher "Le total de la commande est de " + total
Fin
5
S. Laporte sous-programmes DAIGL TS1

En rsum :
l'appel d'une procdure constitue une instruction en lui-mme

l'appel d'une fonction en revanche reprsente une valeur (tout comme une variable
reprsente une valeur) qui doit tre utilise l'intrieur d'une instruction. On ne peut pas
trouver l'appel d'une fonction tout seul, sur une ligne part. Il se trouve forcment dans un
calcul, une affectation, un affichage, un test, ect.

Application : programme diffrence dates et procdure Quantime

IV. Les paramtres


La communication entre sous-programme et programme appelant se fait par l'intermdiaire de
variables locales qu'on appelle paramtres (ou parfois arguments).

Dans notre exemple, au lieu d'utiliser des variables globales, on peut passer le nombre
d'toiles par ligne en paramtre de la procdure.

Procdure DessinerLigne(E nbetoile :entier)


Var i :entier
Dbut
Pour i de 1 nbetoile Faire
Afficher "*" FinPour
Afficher "\n" //passage la ligne
FinProc

Programme (principal)
Var i , nbe, nbl : entier
Dbut
Afficher "Combien de lignes voulez-vous votre rectangle ?"
Saisir nbl
Afficher "Combien d'toiles par lignes voulez-vous?"
Saisir nbe
Pour i de 1 nbl Faire
DessinerLigne( nbe )
FinPour
Afficher "Alors, a vous plait?"
FinProg

Dans cet exemple, l'appel, la valeur de nbe est transmise la variable paramtre nbtoile de
la procdure, qui va donc s'excuter avec cette valeur. La valeur est donc une donne pour la
procdure, on dit que le paramtre est en entre (d'o E).

La communication avec les paramtres peut se faire dans deux sens:

L3-M1-M2-INFORMATIQUE-TELECOMS 6
S. Laporte sous-programmes DAIGL TS1

- du programme appelant au programme appel => du point de vue du sous-programme


appel, c'est une entre; une valeur de paramtre est donne lors de l'appel par le
programme appelant au sous-programme
- du programme appel vers le programme appelant => du point de vue du programme
appel, c'est une sortie; une variable du programme principal est valorise par le
sousprogramme.

Mais la communication peut aussi tre la fois en entre et en sortie.


Dans ce cas, la valeur initiale donne par le programme appelant est utilise puis modifie par
le sous-programme appel.

Lors de la dfinition, les paramtres sont dclars dans l'en-tte, avec leur type (entier,
chane,) et leur nature (donne, rsultat ou donne/rsultat). Ce sont les paramtres formels.
Les paramtres sont utiliss comme les autres variables dans le code du sous-programme

Les paramtres "donne" (en entre) ont une valeur fournie l'excution par l'instruction
d'appel du programme appelant.
C'est une erreur de les saisir ou de leur attribuer une valeur en dbut de traitement. Le fait de
mettre une variable en paramtre donne remplace sa saisie dans le sous-programme. Celle-
ci a t faite au pralable, avant l'excution du sous-programme.

Les paramtres "rsultat" vont rpercuter leur valeur aux variables correspondantes de l'appel
dans le programme appelant. Il est donc inutile de les afficher. C'est au programme appelant
de dcider de ce qu'il va faire de ces rsultats.
Nous allons tudier ces autres types de paramtre dans l'exemple suivant.

V. Exemple d'application
2 traitements complmentaires:
traitement 1 : trouver le nombre de secondes contenu dans une dure exprime en heures,
minutes et secondes
heures, minutes, secondes => nombre de secondes

traitement 2 : l'inverse, savoir calculer la dure en heures, minutes et secondes


correspondant un nombre de secondes
nombre de secondes => heures, minutes, secondes

Voir la ralisation de ces traitements sans sous programme


Donnes mmorises dans des variables et valorises par saisies au clavier (ou lues depuis un fichier
ou une base de donne, ou calcules partir d'autres variables). Rsultats affichs (ou crit et/ou utilis
dans la suite du programme)

Donnes du traitement en paramtres et rsultat affich traitement 1

Les donnes ne sont pas saisies mais leur valeur provient des paramtres de l'appel :
paramtres donnes (en entre)

7
S. Laporte sous-programmes DAIGL TS1

Procdure afficheNbsec(E heures : entier, minutes : entier, secondes : entier)


Var nbsec : entier
Dbut nbsec heures* 3600 + minutes * 60 + secondes
Afficher nbsec
FinProcdure
Utilisation de la procdure pour afficher le nombre de secondes coules en 2h 15m 10s =>
on appelle le sous-programme avec les valeurs de paramtres correspondantes

afficheNbsec(2, 15, 10)

Exemple de programme appelant


permettant de saisir une dure en heures, minutes et secondes puis d'afficher le nombre de
secondes coules pendant cette dure

Programme appelant
Var
h, m, s : entier
Dbut
Aff "Tapez la dure dans le format hh mm ss"
Saisir h, m, s
Aff "Voil le nombre de secondes coules pendant cette dure "
afficheNbsec(h, m, s)
Fin

traitement 2

Procdure afficheHMS(E nbsec :entier) Var


heur, min, sec : entier
Dbut
heur nbsec DIV 3600
reste nbsec MOD 3600
min reste DIV 60
sec nbsec MOD 60
Afficher heur, "h", min, "m", sec, "s"
FinProcdure

Rsultat communiqu au programme appelant au lieu d'tre affich => permet la


rutilisation du rsultat dans le programme appelant

2 faons de communiquer le rsultat d'un sous-programme l'appelant :


- retour d'une fonction ( utiliser si le rsultat correspond une seule valeur)
- paramtre en sortie ( utiliser si plusieurs variables forment le rsultat)

traitement1 => 1 seul rsultat => FONCTION

Par dfaut, les paramtres d'une fonction sont en entre.

Fonction nbsec(heure : entier, minute : entier, seconde : entier) : entier

L3-M1-M2-INFORMATIQUE-TELECOMS 8
S. Laporte sous-programmes DAIGL TS1

Var
nbsec : entier
Dbut
nbsec heure* 3600 + minute * 60 + seconde
Retourne nbsec
FinFonction

appel :
L'appel d'une fonction est remplac l'excution par la valeur retourne par celle-ci.
L'appel d'une fonction est donc utilis comme une expression, l'intrieur d'une instruction.

Les paramtres de l'appel peuvent tre des valeurs littrales ou des valeurs de variables
avec comme paramtres des valeurs littrales duresec nbsec(2, 15, 10) avec
comme paramtres des variables duresec nbsec(h, m, s)
On peut aussi trouver toute expression comme valeur de paramtre l'appel (rsultat d'un calcul, rsultat d'une
autre fonction). Pourvu que le type de l'expression corresponde bien au type du paramtre.

traitement 2 => rsultat form de plusieurs variables


=> procdure avec paramtres en sortie
Procdure converthms(E nbsec :entier
S heur, min, sec : entier)
Var reste :entier
Dbut
heur nbsec DIV 3600
reste nbsec MOD 3600
min reste DIV 60
sec nbsec MOD 60
FinProcdure

appel
converthms(10000, h, m, s)

Les paramtres de l'appel qui correspondent des paramtres en sortie (ou entre/sortie)
doivent obligatoirement tre des variables (car elles vont tre valorises). L'appel d'une
procdure reprsente une instruction part entire

Utilisation de ces sous-programmes dans un programme qui calcule la diffrence entre deux
heures de la journe.

Programme diffrenceHeures
Var h1, m1, s1 : entier //pour exprimer la premire heure h2, m2, s2 : entier
//pour exprimer la seconde heure sec1, sec2, sec : entier //pour le calcul
du nombre de secondes d'cart dh, dm, ds : entier //heure, minute
et seconde de la dure rsultat
Dbut
Afficher "Premire heure sous forme hh mm ss"
Saisir h1, m1, s1
Afficher "Deuxime heure sous forme hh mm ss"

9
S. Laporte sous-programmes DAIGL TS1

Saisir h2, m2, s2


sec1 nbsec(h1, m1, s1)
sec2 nbsec(h2, m2, s2)
sec sec2 sec1
converthms(sec, dh, dm, ds)
Afficher "la dure sparant ces deux heures est de ", dh, "h ", dm, "m ", ds, "s"
Fin

D) Utilisation d'un sous-programme dans un autre sous-programme


Ecrire une fonction qui retourne la dure coule entre deux heures.

Fonction dure (h1 : hms, h2: hms) : hms


Var
d : hms
sec : entier Dbut
sec nbsec(h2) nbsec(h1)
d converthms(sec) retourne converthms(nbsec(h2) nbsec(h1)) retourne d
FinFonction

E) tableau pass en paramtre


On peut passer en paramtre un tableau. Il faut que le type et les dimensions du tableau
transmis l'appel et correspondent au type et aux dimensions du tableau dclar en paramtre
dans la dfinition.
Lors de l'appel, un tableau pass en paramtre ne comporte pas de crochets. On indique juste
son nom.

ex: Fonction qui renvoie le maximum d'un tableau.


Quand le tableau est surdimensionn et qu'on utilise une variable contenant son nombre
d'lments utiliss, il faut passer cette variable en paramtre avec le tableau.

Fonction maximum(tab : tableau[1..Max] de rels, nbe : entier) : rel


Var
max : rel
i : entier Dbut
max 0 // valable si tous les lments sont positifs
Pour i de 1 j nbe Faire
Si tab[i] > max
Alors max tab[i]
FinSi FinPour retourne max FinFonction

appel Var
tabnote : tableau[1..MAX] de rels
nbeleve : entier

Dbut

//saisie du tableau de note (par exemple avec une procdure) et du nombre d'lves du tableau

L3-M1-M2-INFORMATIQUE-TELECOMS 10
S. Laporte sous-programmes DAIGL TS1

Afficher "la meilleure note est", maximum(tabnote, nbeleve)


Fin

VI. paramtres en entre-sortie (donne-rsultat)


Un paramtre peut tre la fois une donne et un rsultat pour le sous-programme. C'est-dire
que le sous-programme utilise la valeur en entre du sous-programme puis modifie cette
valeur.

Procdure qui insre une nouvelle valeur dans un tableau


Le tableau va tre modifi par la procdure, ainsi que le nombre d'lements. Ce sont donc des
paramtres en entre/sortie

Procdure ajout(E valeur : entier,


E/S tab: tableau[1..MAX]
d'entier,
E/S nbelem :
entier)
Dbut
Si nbelem < MAX //on vrifie que le tableau n'est pas dj plein Alors
tab[ nbelem+1 ] valeur // on ajoute dans la case suivante
nbelem nbelem +1 // on met jour le nombre d'lments
Sinon aff "tableau plein"
FinSi FinProc

11
S. Laporte sous-programmes DAIGL TS1

PARTIE 5 les sous programmes Enonc des Exercices


Exercice 5.1

Ecrivez un algorithme qui demande un mot lutilisateur et qui affiche lcran le nombre de
lettres de ce mot (c'est vraiment tout bte).

Exercice 5.2
Ecrivez un algorithme qui demande une phrase lutilisateur et qui affiche lcran le nombre de
mots de cette phrase. On suppose que les mots ne sont spars que par des espaces (et c'est dj
un petit peu moins bte).

Exercice 5.3

Ecrivez un algorithme qui demande une phrase lutilisateur et qui affiche lcran le nombre de
voyelles contenues dans cette phrase.
On pourra crire deux solutions. La premire dploie une condition compose bien fastidieuse. La
deuxime, en utilisant la fonction Trouve, allge considrablement l'algorithme.

L3-M1-M2-INFORMATIQUE-TELECOMS 12