Beruflich Dokumente
Kultur Dokumente
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.
application
Remarque importante :
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.
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.
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.
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
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
Les donnes et les rsultats d'un sous-programme proviennent d'une communication entre le
programme appelant et le sous-programme.
3
S. Laporte sous-programmes DAIGL TS1
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
nbe nbl
Procdure DessinerLigne( )
Var i :entier Procdure DessinerLigne
Dbut
Pour i de 1 nbe Faire
Afficher "*" FinPour
Afficher "\n" //passage la ligne
FinProc
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
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.
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 :
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.
Dans notre exemple, au lieu d'utiliser des variables globales, on peut passer le nombre
d'toiles par ligne en paramtre de la procdure.
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).
L3-M1-M2-INFORMATIQUE-TELECOMS 6
S. Laporte sous-programmes DAIGL TS1
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
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
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
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.
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
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
11
S. Laporte sous-programmes DAIGL TS1
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