Professional Documents
Culture Documents
OFPPT
RESUME THEORIQUE
&
GUIDE DES TRAVAUX PRATIQUES
MODULE N3 :
Titre : Codification dun algorithme et programmation
procdurale
SECTEUR
: Tertiaire
SPECIALITE
NIVEAU
: TS
Mars 2006
REMERCIEMENT
La DRIF remercie les personnes qui ont contribu llaboration du prsent document.
Pour la supervision :
MME.BENNANI WAFAE
M. ESSABKI NOURDDINE
Pour la conception :
- JELLAL ABDELILAH
- KHLIFA AIT TALEB
Pour la validation :
PRECISIONS SUR LE
COMPORTEMENT ATTENDU
Rsum de Thorie
Partie 01 : Algorithme
Page : 3
Mars 2006
Filire : TSDI
1. INTRODUCTION
1.1. Notion de programme
Si lon sintresse aux applications de lordinateur, on saperoit quelles sont trs nombreuses. En
voici quelques exemples :
Etablissement de feuille de payes, de factures
Gestion de stocks
Calcul de la trajectoire dun satellite
Suivi mdical de patients dans un hpital
Un ordinateur pour quil puisse effectuer des tches aussi varies il suffit de le programmer.
Effectivement lordinateur est capable de mettre en mmoire un programme quon lui fournit puis
lexcuter.
Plus prcisment, lordinateur possde un ensemble limit doprations lmentaires quil sait
excuter. Un programme est constitu dun ensemble de directives, nommes instructions, qui
spcifient :
les oprations lmentaires excuter
la faon dont elles senchanent.
Pour sexcuter, un programme ncessite quon lui fournisse ce quon peut appel informations
donnes ou plus simplement donnes . En retour, le programme va fournir des informations
rsultats ou plus simplement rsultats.
Par exemple un programme de paye ncessite des informations donnes : noms des employs,
situations de famille, nombres dheures supplmentaires, etc Les rsultats seront imprims sur les
diffrents bulletins de paye.
1.2. Le processus de la programmation
La programmation consiste, avant tout, dterminer la dmarche permettant dobtenir, laide dun
ordinateur, la solution dun problme donn.
Le processus de la programmation se droule en deux phases :
dans un premier temps, on procde ce quon appelle lanalyse du problme pos ou
encore la recherche dun algorithme1 qui consiste dfinir les diffrentes tapes de la
rsolution du problme. Cest la partie essentielle dans le processus de
programmation. Elle permet de dfinir le contenu dun programme en termes de
donnes et dactions.
Dans un deuxime temps, on exprime dans un langage de programmation donn, le
rsultat de ltape prcdente. Ce travail, quoi quil soit facile, exige le respect strict
de la syntaxe du langage de programmation.
Lors de ltape dexcution, il se peut que des erreurs syntaxiques sont signales, ce qui entrane des
corrections en gnral simple ou des erreurs smantiques plus difficiles dceler. Dans ce dernier cas,
le programme produit des rsultats qui ne correspondent pas ceux escompts : le retour vers
lanalyse sera alors invitable.
1 Un algorithme est une suite dactions que devra effectuer un ordinateur pour arriver un rsultat, partir dune
situation donne.
Page : 4
Octobre 2005
Filire : TSDI
Problme
rel
ANALYSE
Algorithme
CODAGE
Programme
Rsultats
Page : 5
Octobre 2005
Filire : TSDI
Remarque : Pour les noms des variables choisissez des noms reprsentatifs des informations quils
dsignent ; ainsi MONTANT est un meilleur choix que X pour dsigner le montant dune facture.
Une variable peut tre caractris aussi par sa valeur. A un instant donn, une variable ne peut contenir
quune seule valeur. Bien sr, cette valeur pourra voluer sous laction de certaines instructions du
programme.
Outre le nom et la valeur, une variable peut tre caractrise par son type. Le type dune variable
dfinit la nature des informations qui seront reprsentes dans les variables (numriques,
caractres).
Ce type implique des limitations concernant les valeurs qui peuvent tre reprsentes. Il limite aussi
les oprations ralisables avec les variables correspondantes. Ainsi, les oprations arithmtiques
(addition, soustraction, multiplication, division) possibles des variables numriques, nont aucun sens
pour des variables de type caractres. Par contre les comparaisons seront possibles pour les deux
types.
2.2. Dclaration des variables
La premire chose faire tout au dbut de lalgorithme, avant de pouvoir utiliser des variables, cest
de faire la dclaration des variables.
Lorsquon dclare une variable, on lui attribue un nom et on lui rserve un emplacement mmoire. La
taille de cet emplacement mmoire dpend du type de variable. Cest pour cette raison quon doit
prciser lors de la dclaration le type du variable.
La syntaxe dune dclaration de variable est la suivante :
VARIABLE nom : TYPE
ou
VARIABLES nom1, nom2, : TYPE
2.3. Types de variables
2.3.1. Type numrique
Commenons par le cas trs frquent, celui dune variable destine recevoir des nombres.
Gnralement, les langages de programmation offrent les types suivants :
ENTIER
Le type entier dsigne lensemble des nombres entiers ngatifs ou positifs dont les valeurs varient
entre -32 768 32 767.
On crit alors :
VARIABLES i, j, k : ENTIER
REEL
Le type rel comprend les variables numriques qui ont des valeurs relles. La plage des valeurs du
type rel est :
-3,40x1038 -1,40x1045 pour les valeurs ngatives
1,40x10-45 3,40x1038 pour les valeurs positives
On crit alors :
VARIABLES x, y : REEL
Remarque : Le type de variable choisi pour un nombre va dterminer les valeurs maximales et
minimales des nombres pouvant tre stocks dans la variable. Elle dtermine aussi la prcision de ces
nombres (dans le cas de nombres dcimaux).
Page : 6
Octobre 2005
Filire : TSDI
Page : 7
Octobre 2005
Filire : TSDI
Dans une expression o on y trouve des variables ou valeurs numriques, lordre de priorit des
oprateurs est important. En effet, la multiplication et la division sont prioritaires par rapport
laddition et la soustraction.
Par exemple, 12 * 3 + 5 donne comme rsultat 41.
Si lon veut modifier cette ordre de priorit on sera oblig dutiliser les parenthse.
Par exemple, 12 * (3 + 5) donne comme rsultat 96.
2.3.5. Linstruction daffectation
Linstruction daffection est opration qui consiste attribuer une valeur une variable. On la notera
avec le signe .
Cette instruction scrit :
VARIABLE valeur
Par exemple : MONTANT 3500.
On dit quon affecte (ou on attribue) la valeur 3500 la variable numrique MONTANT.
Si dans une instruction daffectation, la variable laquelle on affecte la valeur et la valeur affecte ont
des types diffrents, cela provoquera une erreur.
On peut aussi attribuer une variable la valeur dune variable ou dune expression de faon gnrale.
On crit :
VARIABLE EXPRESSION
Par exemple :
AB
AB*2+5
Dans ce cas, linstruction daffectation sera excute en deux temps :
- Dabord, on calcule la valeur de lexpression
- On affecte la valeur obtenue la variable gauche.
On peut mme avoir des cas o la variable de gauche qui figure dans lexpression droite.
Par exemple :
AA+5
Dans cette exemple, aprs lexcution de linstruction daffectation la valeur de la variable A sera
augmenter de 5.
Remarque :
Dans une instruction daffection on a toujours :
- gauche de la flche daffection un nom de variable
- droite de la flche daffectation une valeur ou une expression
- lexpression droite de la flche doit tre du mme type que la variable situe
gauche.
Si dans une instruction daffectation une ces points nest pas respect, cela engendra une erreur.
Il est noter que lordre dans lequel sont crites les instructions est essentiel dans le rsultat final.
Exemple :
CAS I
CAS II
A 15
A 30
A 30
A 15
Aprs excution des deux instructions daffection, la valeur de A sera :
- Cas I : 30
- Cas II : 15
Exercices
1. Quelles seront les valeurs des variables A et B aprs excution des instructions suivantes ?
Page : 8
Octobre 2005
Filire : TSDI
Variables A, B : Entier
Dbut
A1
BA+3
A3
Fin
2. Quelles seront les valeurs des variables A, B et C aprs excution des instructions suivantes ?
Variables A, B, C : Entier
Dbut
A5
B3
CA+B
A2
CBA
Fin
3. Quelles seront les valeurs des variables A et B aprs excution des instructions suivantes ?
Variables A, B : Entier
Dbut
A5
BA+4
AA+1
BA4
Fin
4. Quelles seront les valeurs des variables A, B et C aprs excution des instructions suivantes ?
Variables A, B, C : Entier
Dbut
A3
B 10
CA+B
BA+B
AC
Fin
5. Quelles seront les valeurs des variables A et B aprs excution des instructions suivantes ?
Variables A, B : Entier
Dbut
A5
B2
AB
BA
Fin
Questions : les deux dernires instructions permettent-elles dchanger les deux valeurs de B et A ? Si
lon inverse les deux dernires instructions, cela change-t-il quelque chose ?
Page : 9
Octobre 2005
Filire : TSDI
6. Ecrire un algorithme permettant dchanger les valeurs de deux variables A et B, et ce quel que soit
leur contenu pralable.
7. On dispose de trois variables A, B et C. Ecrivez un algorithme transfrant B la valeur de A, C la
valeur de B et A la valeur de C (toujours quels que soient les contenus pralables de ces variables).
8. Que produit lalgorithme suivant ?
Variables A, B, C : Caractres
Dbut
A 423
B 12
CA+B
Fin
9. Que produit lalgorithme suivant ?
Variables A, B : Caractres
Dbut
A 423
B 12
CA&B
Fin
Solutions
1.
Aprs excution de linstruction
A1
BA+3
A3
2.
3.
4.
Page : 10
Octobre 2005
Filire : TSDI
5.
Les deux dernires instructions ne permettent donc pas dchanger les deux valeurs de B et A, puisque
lune des deux valeurs (celle de A) est ici crase.
Si lon inverse les deux dernires instructions, cela ne changera rien du tout, hormis le fait que cette
fois cest la valeur de B qui sera crase.
6. Lalgorithme est :
Dbut
CA
AB
BC
Fin
On est oblig de passer par une variable dite temporaire (la variable C).
7. Lalgorithme est :
Dbut
DC
CB
BA
AD
Fin
En fait, quel que soit le nombre de variables, une seule variable temporaire suffit.
8. Il ne peut produire quune erreur dexcution, puisquon ne peut pas additionner des caractres.
9. On peut concatner ces variables. A la fin de lalgorithme, C vaudra donc 42312.
3. LES INSTRUCTIONS DE LECTURE ET ECRITURE
Considrons le programme suivant :
VARIABLE A : ENTIER
Dbut
A 12 ^ 2
Fin
Il permet de calculer le carr de 12.
Le problme de ce programme, cest que, si lon veut calculer le carr dun autre nombre que 12, il
faut rcrire le programme.
Page : 11
Octobre 2005
Filire : TSDI
Dautre part, la machine calcule le rsultat et lutilisateur qui fait excuter ce programme ne saura
jamais que ce rsultat correspond au carr de 12.
Cest pour cela quil faut introduire des instructions qui permettent le dialogue avec lutilisateur.
En effet, il existe une instruction qui permet lutilisateur de faire entrer des valeurs au clavier pour
quelles soient utilises par le programme. La syntaxe de cette instruction de lecture est :
LIRE NomVariable
Lorsque le programme rencontre une instruction LIRE, lexcution du programme sinterrompt,
attendant la saisie dune valeur au clavier.
Ds que lon frappe sur la touche ENTER, lexcution reprend.
Une autre instruction permet au programme de communiquer des valeurs lutilisateur en les affichant
lcran. La syntaxe de cette instruction dcriture est :
ECRIRE NomVariable
ou de faon gnrale
ECRIRE Expression
Remarque : Avant de lire une variable, il est fortement conseill dcrire des libells lcran, afin de
prvenir lutilisateur de ce quil doit frapper. La mme chose pour linstruction dcriture.
Exemple :
Variables A, CARRE : Rels
DEBUT
Ecrire Entrez un nombre
Lire A
CARRE A * A
Ecrire Le carr de ce nombre est :
Ecrire CARRE
FIN
Exercices
1. Quel rsultat produit le programme suivant ?
VARIABLES Val, Double : ENTIERS
Dbut
Val 231
Double Val * 2
ECRIRE Val
ECRIRE Double
Fin
2. Ecrire un programme qui demande deux nombres entiers lutilisateur, puis qui calcule et affiche
le somme de ces nombres.
3. Ecrire un programme qui lit le prix HT dun article, le nombre darticles et le taux de TVA, et qui
fournit le prix total TTC correspondant. Faire en sorte que des libells apparaissent clairement.
4. Ecrire un programme qui lit une valeur et qui nous calcule linverse de cette valeur.
5. Le surveillant gnral dun tablissement scolaire souhaite quon lui crit un programme qui
calcule, pour chaque lve, la moyenne des notes des cinq matires. Ces matires sont avec leur
coefficient :
MATIERE
Math
COEFFICIENT
5
Page : 12
Octobre 2005
Physique
Franais
Anglais
Histoire - Gographie
Filire : TSDI
5
4
2
2
Corrections
1. On verra apparatre lcran :
231
462
2. Le programme est :
VARIABLES A, B, SOMME : ENTIERS
Dbut
ECRIRE Entrez le premier nombre
Lire A
ECRIRE Entrez le deuxime nombre
Lire B
SOMME A + B
ECRIRE La somme de ces deux nombres est :
ECRIRE SOMME
Fin
Remarque : On peut remplacer les deux derniers lignes par :
ECRIRE La somme de ces deux nombres est : , SOMME
3. Le programme est :
VARIABLES pht, ttva, pttc : REELS
VARIABLE nb : ENTIER
Dbut
ECRIRE Entrez le prix hors taxes :
LIRE pht
ECRIRE Entrez le nombre darticles :
LIRE nb
ECRIRE Entrez le taux de TVA :
LIRE ttva
Pttc nb * pht * (1 + ttva)
ECRIRE Le prix toutes taxes est : , ttva
Fin
4. Le programme est :
VARIABLES x, inverse : REELS
Dbut
ECRIRE Entrez une valeur :
LIRE x
inverse 1 / x
ECRIRE Linverse est : , inverse
Fin
5. Le programme est :
VARIABLES mat, phy, ang, fra, hg, moyenne : REELS
Dbut
ECRIRE Entrez la note de math :
OFPPT / DRIF / CDC Tertiaire & TIC
Page : 13
Octobre 2005
Filire : TSDI
LIRE mat
ECRIRE Entrez la note de physique :
LIRE phy
ECRIRE Entrez la note de franais :
LIRE fra
ECRIRE Entrez la note danglais :
LIRE ang
ECRIRE Entrez la note dhistoire-Go :
LIRE hg
moyenne ((mat + phy) * 5 + fra * 4 + (ang
+ hg) * 2) / 18
ECRIRE La moyenne est : , moyenne
Fin
4. LA STRUCTURE ALTERNATIVE
4.1. Les conditions simples
Une condition simple consiste en une comparaison entre deux expressions du mme type.
Cette comparaison s'effectue avec des oprateurs de comparaison. Voici la liste de ces oprateurs
accompagns de leur signification dans le cas des types numrique ou chane :
Oprateur
=
Signification
numrique
gal
Signification
chane
gal
<>
diffrent
diffrent
<
infrieur
>
suprieur
<=
infrieur ou gal
>=
suprieur ou gal
Pour la comparaison du type chane c'est l'ordre alphabtique qu'est utilis dans le cas o l'on compare
deux lettres majuscules ou minuscules. Mais si l'on compare majuscules et minuscules, il faut savoir
que les majuscules apparaissent avant les minuscules. Ainsi, par exemple : "M" < "m".
4.2. Les conditions complexes
Certains problmes exigent parfois de formuler des conditions qui ne peuvent pas tre exprimes sous
la forme simple vu en dessus. A cet effet, la plupart des langages autorisent des conditions formes de
plusieurs conditions simples relies entre elles par ce qu'on appelle des oprateurs logiques. Ces
oprateurs sont : ET, OU et NON.
Pour que la condition complexe,
condition1 ET condition2
soit VRAI, il faut imprativement que la condition1 soit VRAI et que la condition2 soit VRAI.
Pour que la condition
condition1 OU condition2
soit VRAI, il suffit que condition1 soit VRAI ou condition2 soit VRAI. Il est noter que cette
condition complexe sera VRAI si condition1 et condition2 sont VRAI.
Le NON inverse une condition :
NON(condition)
est VRAI si condition est FAUX, et il sera FAUX si condition est VRAI.
Page : 14
Octobre 2005
Filire : TSDI
D'une manire gnrale, les oprateurs logiques peuvent porter, non seulement sur des conditions
simples, mais aussi sur des conditions complexes. L'usage de parenthses permet dans de tels cas de
rgler d'ventuels problmes de priorit. Par exemple, la condition :
(a < 0 ET b > 1) OU (a > 0 ET b > 3)
est VRAI si l'une au moins des conditions entre parenthses est VRAI.
4.3. La structure alternative
Supposons que nous avons besoin, dans un programme, d'afficher un message prcisant que la valeur
d'une variable est positive ou ngative. Avec les instructions de base que nous avons vu (celles qui
permettent la manipulation des variables : affectation, lecture, criture), on ne peut pas. Il faut
introduire une des instructions de structuration du programme (ces instructions servent prciser
comment doivent s'enchaner chronologiquement ces instructions de base) qui donne la possibilit
d'effectuer des choix dans le traitement ralis. Cette instruction s'appelle la structure alternative. Sa
syntaxe est :
SI condition ALORS
bloc 1 d'instructions
SINON
bloc 2 d'instructions
FIN SI
Si la condition mentionne aprs SI est VRAI, on excute le bloc1 d'instructions (ce qui figure aprs
le mot ALORS); si la condition est fausse, on excute le bloc2 d'instructions (ce qui figure aprs le
mot SINON).
Exemple :
SI a > 0 ALORS
ECRIRE ''valeur positive''
SINON
ECRIRE ''valeur ngative''
FIN SI
Dans ce programme, on vrifie si la valeur de a est suprieure 0, on affichera le message ''valeur
positive''. Dans le cas contraire, il sera affiche le message ''valeur ngative''.
La structure alternative peut prendre une autre forme possible o l'une des parties du choix est absente.
Elle s'crit dans ce cas :
SI condition ALORS
bloc d'instructions
FIN SI
Exemple : Dans un programme de calcul du montant d'une facture, on applique une remise de 1% si le
montant dpasse 5000 Dhs. Nous crirons :
SI montant > 5000 ALORS
montant montant * 0.99
FIN SI
4.4. Les structures alternatives imbriques
Il peut arriver que l'une des parties d'une structure alternative contienne son tour une structure
alternative. Dans ce cas, on dit qu'on a des structures alternatives imbriques les unes dans les autres.
Exemple : Ecrire un programme qui donne ltat de leau selon sa temprature.
Variable Temp : Entier
Dbut
Ecrire Entrez la temprature de leau :
Lire Temp
Si Temp =< 0 Alors
OFPPT / DRIF / CDC Tertiaire & TIC
Page : 15
Octobre 2005
Filire : TSDI
valeurN : actionN
SINON : action
FIN SELON
Si expression est gale valeuri, on excute actioni et on passe la suite de lalgorithme. Sinon on
excute action et on passe la suite de lalgorithme.
Exercices
1. Ecrire un algorithme qui demande deux nombres lutilisateur et linforme ensuite si leur produit
est ngatif ou positif (on laisse de ct le cas o le produit est nul). Attention toutefois : on ne doit pas
calculer le produit des deux nombres.
2. Ecrire un algorithme qui demande trois noms lutilisateur et linforme ensuite sils sont rangs ou
non dans lordre alphabtique.
Page : 16
Octobre 2005
Filire : TSDI
3. Ecrire un algorithme qui demande un nombre lutilisateur, et linforme ensuite si ce nombre est
positif ou ngatif (on inclut cette fois le traitement du cas o le nombre vaut zro).
4. Ecrire un algorithme qui demande deux nombres lutilisateur et linforme ensuite si le produit est
ngatif ou positif (on inclut cette fois le traitement du cas o le produit peut tre nul). Attention
toutefois, on ne doit pas calculer le produit !
5. Ecrire un algorithme qui demande lge dun enfant lutilisateur. Ensuite, il linforme de sa
catgorie :
- Poussin de 6 7 ans
- Pupille de 8 9 ans
- Minime de 10 11 ans
- Cadet aprs 12 ans
6. a partir dun montant lu, on dtermine un montant net par application dune remise de :
- 1% si le montant est compris entre 2000 et 5000 Dhs (valeurs comprises)
- 2 % si le montant est suprieur 5000 Dhs.
Solutions
1. Le programme est :
Variables m, n : Entier
Dbut
Ecrire Entrez deux nombres :
Lire m, n
Si m * n > 0 Alors
Ecrire Leur produit est positif
Sinon
Ecrire Leur produit est ngatif
Finsi
Fin
2. Le programme est :
Variables a, b, c : Caractre
Dbut
Ecrire Entrez successivement trois noms :
Lire a, b, c
Si a < b et b < c Alors
Ecrire Ces noms sont classs alphabtiquement
Sinon
Ecrire Ces noms ne sont pas classs
Finsi
Fin
3. Le programme est :
Variable n : Entier
Dbut
Ecrire Entrez un nombre :
Lire n
Si n < 0 Alors
Ecrire Ce nombre est ngatif
SinonSi n = 0 Alors
Ecrire Ce nombre est nul
Sinon
Ecrire Ce nombre est positif
OFPPT / DRIF / CDC Tertiaire & TIC
Page : 17
Octobre 2005
Filire : TSDI
Finsi
Fin
4. Le programme est :
Variables m, n : Entier
Dbut
Ecrire Entrez deux nombres :
Lire m, n
Si m = 0 OU n = 0 Alors
Ecrire Le produit est nul
SinonSi (m < 0 ET n < 0) OU (m > 0 ET n > 0) Alors
Ecrire Le produit est positif
Sinon
Ecrire Le produit est ngatif
Finsi
Fin
5. Le programme est :
Variable age : Entier
Dbut
Ecrire Entrez lge de lenfant :
Lire age
Si age >= 12 Alors
Ecrire Catgorie Cadet
SinonSi age >= 10 Alors
Ecrire Catgorie Minime
SinonSi age >= 8 Alors
Ecrire Catgorie Pupille
SinonSi age >= 6 Alors
Ecrire Catgorie Poussin
Finsi
Fin
6. Le programme est :
Variables montant , taux , remise : Rels
Dbut
Ecrire Entrez le montant :
Lire montant
Si montant < 2000 Alors
taux 0
Sinon
Si montant 5000 Alors
taux 1
Sinon
taux 2
Fin SI
Fin Si
Montant montant * (1 taux / 100)
Ecrire Le montant net est : , montant
Fin
Page : 18
Octobre 2005
Filire : TSDI
Page : 19
Octobre 2005
Filire : TSDI
7x1=7
7 x 2 = 14
7 x 3 = 21
7 x 10 = 70
2. Ecrire un algorithme qui demande un nombre de dpart, et qui calcule la somme des entiers jusqu
ce nombre. Par exemple, si lon entre 5, le programme doit calculer :
1 + 2 + 3 + 4 + 5 = 15
3. Ecrire un algorithme qui demande un nombre de dpart, et qui calcule sa factorielle.
NB : la factorielle de 8, note 8 ! vaut 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8
4. Ecrire un algorithme qui demande successivement 20 nombres lutilisateur, et qui lui dise ensuite
quel tait le plus grand parmi ces 20 nombres :
Entrez le nombre numro 1 : 12
Entrez le nombre numro 2 : 14
Modifiez ensuite lalgorithme pour que le programme affiche de surcrot en quelle position avait t
saisie ce nombre :
Ctait le nombre numro 2
5. Ecrire un algorithme qui :
- lit dabord une valeur
- ensuite il va lire successivement 20 nombres.
- enfin il va dterminer combien de fois la premire valeur a t saisie (sans compter la premire
saisie).
Solutions
1. Le programme est :
Variables i , valeur : Entiers
DEBUT
Lire valeur
POUR i = 1 A valeur
Ecrire valeur & X & i & = & valeur * i
FIN POUR
FIN
2. Le programme est :
Variables i , valeur , somme : Entiers
DEBUT
Lire valeur
somme 0
POUR i = 1 A valeur
somme somme + i
FIN POUR
Ecrire La somme des & valeur & premiers entiers est : & somme
OFPPT / DRIF / CDC Tertiaire & TIC
Page : 20
Octobre 2005
Filire : TSDI
FIN
3. Le programme est :
Variables i , valeur , factoriel : Entiers
DEBUT
Lire valeur
factoriel 1
POUR i = 1 A valeur
factoriel factoriel * i
FIN POUR
Ecrire Le factoriel de & valeur & est : & factoriel
Fin
4. Le programme est :
Variables i , a , max , pmax : Entiers
DEBUT
Ecrire Entrez le nombre numro 1
Lire a
max a
pmax 1
POUR i = 2 A 20
Ecrire Entrez le nombre numro , i
Lire a
SI a > max ALORS
max a
pmax i
FIN SI
FIN POUR
Ecrire Le plus grand nombre est : , max
Ecrire Sa position est : , pmax
FIN
5. Le programme est :
Variables i , a , b , S : Entiers
DEBUT
Ecrire Entrez un chiffre :
Lire a
S0
POUR i = 1 A 20
Ecrire Entrez un nombre :
Lire b
SI a = b ALORS
SS+1
FIN SI
FIN POUR
Ecrire Le nombre de fois de saisie de , a , est : , S
FIN
5.2. La structure TANT QUE
Cette structure permet de rpter les instructions tant quune condition est satisfaite. Sa syntaxe est :
TANT QUE condition
Instructions rpter
FIN TANT QUE
Page : 21
Octobre 2005
Filire : TSDI
condition cest une condition quon appelle parfois condition darrt. Cette condition est teste avant
la premire excution.
Cette structure diffre de la premire par le fait quon va rpter des instructions pour un nombre de
fois inconnu au pralable.
Exemple : Reprenant toujours le programme de notre surveillant. Sil ne sait pas combien de
moyennes calculer on ne pourra pas utiliser la structure POUR. Dans ce cas on est oblig dutiliser
la structure TANT QUE. Le programme sera alors :
Variables mat, phy, ang, fra, hg, moyenne : Rels
Variable reponse : Chane
DEBUT
reponse o
TANT QUE reponse = o
Ecrire Entrez la note de math :
Lire mat
Ecrire Entrez la note de physique :
Lire phy
Ecrire Entrez la note de franais :
Lire fra
Ecrire Entrez la note danglais :
Lire ang
Ecrire Entrez la note dhistoire-Go :
Lire hg
moyenne ((mat + phy) * 5 + fra * 4 + (ang + hg) * 2) / 18
Ecrire La moyenne est : , moyenne
Ecrire Voulez-vous continuer oui (o) /non (n) ?
Lire reponse
FIN TANT QUE
FIN
Exercices
1. Ecrire un algorithme qui demande lutilisateur un nombre compris entre 1 et 3 jusqu ce que la
rponse convienne.
2. Ecrire un algorithme qui demande un nombre compris entre 10 et 20, jusqu ce que la rponse
convienne. En cas de rponse suprieure 20, on fera apparatre un message : Plus petit ! , et
inversement, Plus grand ! si le nombre est infrieur 10.
3. Ecrire un algorithme qui demande un nombre de dpart, et qui ensuite affiche les dix nombres
suivants. Par exemple, si l'utilisateur entre le nombre 17, le programme affichera les nombres de 18
27.
4. Ecrire un algorithme qui demande successivement des nombres lutilisateur, et qui lui dise ensuite
quel tait le plus grand parmi ces nombres et quel tait sa position. La saisie des nombres sarrte
lorsque lutilisateur entre un zro.
5. Lire la suite des prix (en dhs entiers et termine par zro) des achats dun client. Calculer la somme
quil doit, lire la somme quil paye, et dterminer le reste rendre.
Solutions
1. Le programme est :
Variable a : Rel
Dbut
OFPPT / DRIF / CDC Tertiaire & TIC
Page : 22
Octobre 2005
Filire : TSDI
Page : 23
Octobre 2005
Filire : TSDI
DEBUT
Ecrire Entrez le prix
Lire prixlu
mdu 0
mdu mdu + prixlu
TANT QUE prixlu <> 0
Ecrire Entrez le prix
Lire prixlu
mdu mdu + prixlu
FIN TANT QUE
Ecrire Entrez le prix pay
Lire mpaye
reste mpaye - mdu
Ecrire Le reste est : , reste
FIN
5.3. La structure REPETER
Cette structure sert rpter des instructions jusqu ce quune condition soit ralise. Sa syntaxe est :
REPETER
Instructions rpter
JUSQU'A condition
Considrons le programme suivant :
Variables a , c : Entiers
DEBUT
REPETER
Lire a
cc*c
Ecrire c
JUSQU'A a = 0
Ecrire Fin
FIN
Les mots REPETER et JUSQU'A encadrent les instructions rpter. Cela signifie que ces
instructions doivent tre rpter autant de fois jusqu ce que la variable a prennent la valeur 0.
Notez bien que le nombre de rptition dans cette structure nest indiqu explicitement comme cest la
cas de la structure TANT QUE. Il dpend des donnes que lon fournit au programme.
Pour bien expliciter cela, voyons ce que produira ce programme si lon lui fournit successivement les
valeurs 2, 4, 0. Le rsultat se prsentera ainsi :
4
16
0
Fin
Exercices
1. Ecrire un algorithme qui demande successivement des nombres lutilisateur, et qui calcule le
nombre de valeurs saisies. La saisie des nombres sarrte lorsque lutilisateur entre le caractre n
ou N .
2. Ecrire un algorithme qui demande successivement des nombres lutilisateur, et qui calcule leur
moyenne. La saisie des nombres sarrte lorsque lutilisateur entre un zro.
3. Modifiez lalgorithme de lexercice 1, de faon quil nous renseigne sur le nombre des valeurs
positives et sur le nombre des valeurs ngatives. Ne comptez pas les valeurs nuls.
Page : 24
Octobre 2005
Filire : TSDI
4. Ecrire un algorithme qui lit les caractres saisies par lutilisateur. A la fin ce programme nous
affichera la phrase saisie. La saisie des caractres sarrte lorsquon tape point . . Pour lutilisateur
veut insrer un espace il lui suffit de tapez sur 0. Par exemple si lutilisateur tape successivement les
caractres b , o , n , j , o , u , r , t , o , u , s , . , il nous affichera
la chane bonjour tous .
Mais si il tape b , o , n , j , o , u , r , 0 , t , o , u , s , . , le
programme affichera bonjour tous .
Solutions
1. le programme est :
Variables a , compteur : Entiers
Variable reponse : Chane
DEBUT
compteur 0
REPETER
Ecrire Entrez un nombre :
Lire a
compteur compteur + 1
Ecrire Voulez-vous continuez Oui/Non ?
Lire reponse
JUSQU'A reponse = N ou reponse = n
Ecrire Le nombre de valeurs saisies est : , compteur
FIN
2. Le programme est :
Variables a , somme , moyenne , compteur : Entiers
DEBUT
compteur 0
somme 0
REPETER
Ecrire Entrez un nombre :
Lire a
compteur compteur + 1
somme somme + a
JUSQU'A a = 0
Moyenne somme / compteur
Ecrire La moyenne de valeurs saisies est : , moyenne
FIN
3. le programme est :
Variables a , npos , nneg : Entiers
Variable reponse : Chane
DEBUT
npos 0
nneg 0
REPETER
Ecrire Entrez un nombre :
Lire a
SI a > 0 ALORS
npos npos + 1
SINON
SI a < 0 ALORS
nneg nneg + 1
FIN SI
OFPPT / DRIF / CDC Tertiaire & TIC
Page : 25
Octobre 2005
Filire : TSDI
FIN SI
Ecrire Voulez-vous continuez Oui/Non ?
Lire reponse
JUSQU'A reponse = O ou reponse = o
Ecrire Le nombre de valeurs positives saisies est : , npos
Ecrire Le nombre de valeurs ngatives saisies est : , nneg
FIN
4. Le programme est :
Variables caractere , phrase : Chanes
DEBUT
phrase
REPETER
Ecrire Entrez une caractre :
Lire caractre
SI caractere = 0 ALORS
caractere
FIN SI
phrase phrase +caractere
JUSQU'A caractere = .
Ecrire La phrase rsultante est : , phrase
FIN
6. LES TABLEAUX
6.1. Les tableaux une seul dimension
Imaginez que lon veuille calculer la moyenne des notes dune classe dlves. Pour linstant on
pourrait lalgorithme suivant :
Variables somme, nbEleves, Note, i : Rels
DEBUT
somme 0
Ecrire " Nombre deleves :"
Lire nbEleves
POUR i = 1 A nbEleves
Ecrire " Note de leleve numero ", i , " : "
Lire Note
somme somme + Note
FIN POUR
Ecrire " La moyenne est de :", somme / nbEleves
FIN
Si lon veut toujours calculer la moyenne des notes dune classe mais en gardant en mmoire toutes les
notes des lves pour dventuels calculs (par exemple calculer le nombre dlves qui ont des notes
suprieurs la moyenne). Dans ce cas il faudrait alors dclarer autant de variables quil y a
dtudiants. Donc, si lon a 10 lves il faut dclarer 10 variables et si lon a N il faut dclarer N
variables et cest pas pratique. Ce quil faudrait cest pouvoir par lintermdiaire dune seule variable
stocker plusieurs valeurs de mme type et cest le rle des tableaux.
Un tableau est un ensemble de valeurs de mme type portant le mme nom de variable. Chaque valeur
du tableau est repre par un nombre appel indice.
Les tableaux cest ce que lon nomme un type complexe en opposition aux types de donnes simples
vus prcdemment. La dclaration dun tableau sera via la syntaxe suivante dans la partie des
dclarations :
Tableau nom_tableau (nombre) : Type
nom_tableau : dsigne le nom du tableau
Page : 26
Octobre 2005
nombre
Type
Filire : TSDI
Exemples :
Tableau Note (20) : Rel
Note (20) est un tableau qui contient vingt valeurs relles.
Tableau nom (10) , prenom (10) : Chane
Nom (10) et prenom (10) sont deux tableaux de 10 lments de type chane.
Un tableau peut tre reprsent graphiquement par (exemple Note (15)) :
Note (1)
Note (4)
Si lon veut accder (en lecture ou en criture) la i me valeur dun tableau en utilisant la syntaxe
suivante :
nom_tableau (indice)
Par exemple si X est un tableau de 10 entiers :
X (2) - 5
met la valeur -5 dans la 2 me case du tableau
En considrant le cas o a est une variable de type Entier, a X (2)
met la valeur de la 2 me case du tableau tab dans a, cest- - dire 5
Lire X (1)
met lentier saisi par lutilisateur dans la premire case du tableau
Ecrire X (1)
affiche la valeur de la premire case du tableau
Remarques :
- Un tableau possde un nombre maximal dlments dfini lors de lcriture de lalgorithme (les
bornes sont des constantes explicites, par exemple 10, ou implicites, par exemple MAX). Ce nombre
dlments ne peut tre fonction dune variable.
- La valeur dun indice doit toujours :
9 tre un nombre entier
9 tre infrieure ou gale au nombre dlments du tableau
Exercices
1. Considrons les programmes suivants:
Tableau X (4) : Entier
DEBUT
X (1) 12
X (2) 5
X (3) 8
X (4) 20
FIN
Tableau voyelle (6) : Chane
DEBUT
voyelle (1) a
voyelle (2) e
voyelle (3) i
voyelle (4) o
Page : 27
Octobre 2005
Filire : TSDI
voyelle (5) u
voyelle (6) y
FIN
Donner les reprsentations graphiques des tableaux X (4) et voyelle (6) aprs excution de ces
programmes.
2. Quel rsultat fournira lexcution de ce programme :
Variable i : Entier
Tableau C (6) : Entier
DEBUT
POUR i = 1 A 6
Lire C (i)
FIN POUR
POUR i = 1 A 6
C (i) C (i) * C (i)
FIN POUR
POUR i = 1 A 6
Ecrire C (i)
FIN POUR
FIN
Si on saisit successivement les valeurs : 2 , 5 , 3 , 10 , 4 , 2.
3. Que fournira lexcution de ce programme :
Tableau suite (8) : Entier
Variable i : Entier
DEBUT
Suite (1) 1
Suite (2) 1
POUR i = 3 A 8
suite (i) suite (i - 1) + suite (i - 2)
FIN POUR
POUR i = 1 A 8
Ecrire suite (i)
FIN POUR
FIN
4. Soit T un tableau de vingt lments de types entiers. Ecrire le programme qui permet de calculer la
somme des lments de ce tableau.
5. Soit T un tableau de N entiers. Ecrire lalgorithme qui dtermine le plus grand lment de ce
tableau.
6. Ecrire un programme qui permet de lire 100 notes et de dterminer le nombre de celles qui sont
suprieures la moyenne.
7. Soit T un tableau de N entiers. Ecrire lalgorithme qui dtermine simultanment la position du plus
grand lment et la position du plus petit lment du tableau.
8. Soit T un tableau de N rels. Ecrire le programme qui permet de calculer le nombre des occurrences
dun nombre X (c'est--dire combien de fois ce nombre X figure dans le tableau T).
Page : 28
Octobre 2005
Filire : TSDI
9. On dispose des notes de 25 lves ; chaque lve peut avoir une ou plusieurs notes mais toujours au
moins une. Ecrire un programme permettant dobtenir la moyenne de chaque lve lorsquon lui
fournit les notes. On veut que les donnes et les rsultats se prsentent ainsi :
Notes de llve numro 1
12
12
-1
Notes de llve numro 2
Elve numro 25 : 15
Moyenne de la classe : 12.3
Les parties italiques correspondent aux donnes tapes par lutilisateur. La valeur -1 sert de critre de
fin de notes pour chaque lve.
Solutions
1. La reprsentation graphique du tableau X (4) aprs excution du premier programme est :
12
20
La reprsentation graphique du tableau voyelle (4) aprs excution du deuxime programme est :
a
Page : 29
Octobre 2005
Filire : TSDI
Page : 30
Octobre 2005
Filire : TSDI
max T (i)
pmax i
FIN SI
SI T (i) < min ALORS
min T (i)
pmin i
FIN SI
JUSUQA i = N
Ecrire La position du plus grand lment du tableau est : , pmax
Ecrire La position du plus petit lment du tableau est : , pmin
FIN
8. Le programme est :
Variables X ,i,Compt : Rels
Variable Compt :ENTIER
Tableau T (N) : Rel
DEBUT
Lire X
POUR i=1 JUSQU'A i=N
SI T (i) =X ALORS
Compt compt+1
FIN SI
FIN POUR
Ecrire Le nombre doccurrences de cet lments du tableau est : , compt
FIN
9. Le programme est :
Variables i , note , nnote , snote , smoyenne , cmoyenne : Entiers
Tableau moy (25) : Rel
DEBUT
POUR i = 1 A 25
Ecrire Notes de llve numro , i
snote 0
nnote 0
REPETER
Lire note
SI note <> -1 ALORS
snote snote + note
nnote nnote + 1
FIN SI
JUSQU'A note = -1
moy (i) = snote / nnote
smoyenne = smoyenne + moy (i)
FIN POUR
Ecrire Moyennes
POUR i = 1 A 25
Ecrire Elve numro , i , : , moy (i)
FIN POUR
cmoyenne = smoyenne / 25
Ecrire Moyenne de la classe : , cmoyenne
FIN
OFPPT / DRIF / CDC Tertiaire & TIC
Page : 31
Octobre 2005
Filire : TSDI
FIN
Exercices
1. Insertion dun lment dans un tableau
Soit T un tableau de N lments. Ecrire un programme qui permet dinsrer un lment x la position
i du tableau T.
2. Suppression dun lment du tableau
Soit T un tableau de N lments. Ecrire un programme qui permet de supprimer un lment x du
tableau.
Solutions
1. Le programme est :
Tableau T () : Entier
Variables i, x, j : Entier
DEBUT
Ecrire Donnez la dimension du tableau
Lire N
Redim T (N)
POUR j = 1 A N
Lire T (j)
FIN POUR
Ecrire Entrez le nombre insrer
Lire x
Ecrire Entrez la position o insrer ce nombre
Lire i
Redim T (N +1)
j=N
TANT QUE j i
T (j+1) = T (j)
j=j-1
FIN TANT QUE
T (i) = x
OFPPT / DRIF / CDC Tertiaire & TIC
Page : 32
Octobre 2005
Filire : TSDI
Dans ce programme on a travaill avec un seul tableau dynamique. On peut aussi travailler avec le
tableau T dimension fixe et en dfinir un autre qui recevra tous les lments de T plus llment
insrer. Le programme dans ce cas est :
Tableau T (N) : Entier
Tableau Tr (N+1) : Entier
Variables i , x , j , k : Entier
DEBUT
POUR j = 1 A N
Lire T (j)
FIN POUR
Ecrire Entrez le nombre insrer
Lire x
Ecrire Entrez la position o insrer ce nombre
Lire i
j=1
k=1
TANT QUE k N + 1
SI k i ALORS
Tr (k) T (j)
jj+1
SINON
Tr (k) = x
FIN SI
k=k+1
FIN TANT QUE
2. Le programme est :
Tableau T (N) : Entier
Tableau Tr () : Entier
Variables i , x , j : Entier
DEBUT
POUR j = 1 A N
Lire T (j)
FIN POUR
Ecrire Entrez le nombre supprimer
Lire x
j0
POUR i = 1 A N
SI T (i) x ALORS
jj+1
ReDim Tr (j)
Tr (j) = T (i)
FIN SI
FIN POUR
Dans ce programme on a considr deux tableaux, le tableau T dimension fixe et le tableau Tr
dynamique. Il est aussi possible de travailler avec un seul tableau dynamique.
Tableau T () : Entier
Variables x, j , k , N : Entiers
DEBUT
Ecrire Donnez la dimension du tableau
Lire N
Redim T (N)
OFPPT / DRIF / CDC Tertiaire & TIC
Page : 33
Octobre 2005
Filire : TSDI
POUR j = 1 A N
Lire T (j)
FIN POUR
Ecrire Entrez le nombre supprimer
Lire x
j=1
TANT QUE j N
SI T (j) = x ALORS
POUR k = j A N - 1
T (k) = T (k + 1)
FIN POUR
NN1
ReDim T (N)
SINON
jj+1
FIN SI
FIN TANT QUE
6.3. Les tableaux multidimensionnels
Nous avons vu quun tableau une dimension correspond une liste ordonne de valeurs, repre
chacune par un indice.
Dans tous les langages de programmation, il est possible de dfinir des tableaux deux dimensions
(permettant par exemple de reprsenter des matrices). Ainsi, on pourra placer des valeurs dans un
tableau deux dimensions et cela consiste comme dans le cas des tableaux une dimension donner
un nom lensemble de ces valeurs. Chaque valeur est alors repre par deux indices qui prcise la
position.
On dclare un tableau deux dimensions de la faon suivante :
Tableau nom_tableau (i , j ) : Type
nom_tableau : dsigne le nom du tableau
i
: dsigne le nombre de lignes du tableau
j
: dsigne le nombre de colonnes du tableau
Type
: reprsente le type des lments du tableau
Exemple :
Soit T (3 , 5) un tableau dentiers. On peut reprsenter graphiquement par :
T (1 , 4)
T (3 , 4)
T (1 , 4) et T(3 , 4) sont deux lments du tableau. Entre parenthse on trouve les valeurs des indices
spares par une virgule. Le premier sert reprer le numro de la ligne, le second le numro de la
colonne.
On accde en lecture ou en criture la valeur dun lment dun tableau deux dimensions en
utilisant la syntaxe suivante :
Nom_tableau (i , j)
Par exemple si T est dfini par : Tableau T ( 3 , 2) : Rel
OFPPT / DRIF / CDC Tertiaire & TIC
Page : 34
Octobre 2005
Filire : TSDI
T (2 , 1) -1.2
Page : 35
Octobre 2005
Filire : TSDI
2
5
3
6
Les deux dernires boucles permettent dafficher ces six lments. Le rsultat sera donc :
Question a
1
2
3
4
5
6
Question b
1
4
2
5
3
6
2. Les deux premires boucles de ce programme permettent de remplir le tableau. La reprsentation
graphique sera ainsi :
2
3
4
5
3
4
5
6
Les dernires boucles permettent dafficher les huit lments du tableau. Le rsultat est :
2
3
3
4
4
5
5
6
3. Soit T (20 , 50) un tableau de rels.
a. Lalgorithme qui calcule la somme de tous les lments du tableau est :
OFPPT / DRIF / CDC Tertiaire & TIC
Page : 36
Octobre 2005
Filire : TSDI
Page : 37
Octobre 2005
Filire : TSDI
POUR j = 1 A 50
SI T (i , j) > max ALORS
max T (i , j)
FIN SI
FIN POUR
FIN POUR
Ecrire Le plus grand lment du tableau est : , max
Ecrire la position de llment i = ,imax, et j= jmax
e. Lalgorithme qui dtermine simultanment llment le plus grand du tableau ainsi que sa position
est :
Tableau T (20 , 50) : Rel
Variables i , j , imax , jmax : Entiers
Variable max : Rel
DEBUT
max T (1 , 1)
POUR i = 1 A 20
POUR j = 1 A 50
SI T (i , j) > max ALORS
max T (i , j)
imax i
jmax j
FIN SI
FIN POUR
FIN POUR
Ecrire Le plus grand lment du tableau est : , max
7. LES STRUCTURES
Imaginons que lon veuille afficher les notes dune classe dlves par ordre croissant avec les noms et
prnoms de chaque lve. On va donc utiliser trois tableaux (pour stocker les noms, les prnoms et les
notes). Lorsque lon va trier le tableau des notes il faut aussi modifier lordre les tableaux qui
contiennent les noms et prnoms. Mais cela multiplie le risque derreur. Il serait donc intressant
dutiliser ce quon appelle les structures.
Les structures contrairement aux tableaux servent rassembler au sein dune seule entit un ensemble
fini dlments de type ventuellement diffrents. Cest le deuxime type complexe disponible en
algorithmique.
A la diffrence des tableaux, il nexiste pas par dfaut de type structure c'est--dire quon ne peut pas
dclarer une variable de type structure. Ce quon peut faire cest de construire toujours un nouveau
type bas sur une structure et aprs on dclare des variables sur ce nouveau type.
La syntaxe de construction dun type bas sur une structure est :
TYPE NomDuType = STRUCTURE
attribut1 : Type
attribut2 : Type
...
attributn : Type
FIN STRUCTURE
Le type dun attribut peut tre :
9 Un type simple
9 Un type complexe
- Un tableau
- Un type bas sur une structure
Exemple :
Page : 38
Octobre 2005
Filire : TSDI
Type
Chane
Chane
Structure
Le champ Datenais est aussi une structure dont les champs sont :
Champ
Jour
Mois
Anne
Type
Entier
Entier
Entier
Ecrivez ensuite lalgorithme qui permet de lire et aprs afficher le nom, prnom et date de naissance
dun stagiaire.
2. On souhaite grer les notes dun tudiant. Pour cela on va dfinir la structure Etudiant dont les
champs sont :
Page : 39
Octobre 2005
Champ
Nom
Prnom
Note
Moyenne
Filire : TSDI
Type
Chane
Chane
Tableau de 3 lments
Rel
Ecrire lalgorithme qui permet de lire les informations dun tudiant (nom, prnom et notes), de
calculer sa moyenne et dafficher la fin un message sous la forme suivante :
La moyenne de ltudiant Dinar Youssef est : 12.45
o Dinar et Youssef sont les noms et prnoms lus et 12.45 est la moyenne calcule.
3. Modifier lalgorithme de lexercice prcdent de faon que lon puisse grer les notes de 50
tudiants.
Solutions
1. Lalgorithme est :
TYPE Date = STRUCTURE
Jour : Entier
Mois : Entier
Annee : Entier
FIN STRUCTURE
TYPE Stagiaire = STRUCTURE
Nom : chane
Prenom : chane
Datenais : Date
FIN STRUCTURE
Variable stag : Stagiaire
DEBUT
Ecrire Entrez les information du stagiaire
Ecrire Entrez le nom
Lire stag.Nom
Ecrire Entrez le prnom
Lire stag.Prenom
Ecrire Entrez le jour de naissance
Lire stag.Date.Jour
Ecrire Entrez le mois de naissance
Lire stag.Date.Mois
Ecrire Entrez lanne de naissance
Lire stag.Date.Annee
Ecrire Le nom du stagiaire est : , stag.Nom
Ecrire Son prnom est : , stag.Prenom
Ecrire Sa date de naissance est :, stag.Date.Jour , /, stag.Date.Mois, /, stag.Date.Annee
2. Lalgorithme est :
TYPE Etudiant = STRUCTURE
Nom : Chane
Prenom : Chane
Note (3) : Rel
Moyenne : Rel
FIN STRUCTURE
Variable i : Entier
Variable som : Rel
Variable etud : Etudiant
DEBUT
OFPPT / DRIF / CDC Tertiaire & TIC
Page : 40
Octobre 2005
Filire : TSDI
Page : 41
Octobre 2005
Filire : TSDI
Page : 42
Octobre 2005
Filire : TSDI
La valeur ainsi renvoye par la fonction peut tre utilise dans nimportante quelle expression
compatible avec son type.
Exemple :
FONCTION Calcul (x : Rel , y : Rel , z : Rel) : Rel
Variable a : Entier
DEBUT
a3
Calcul (x + y + z) * a
FIN
a cest un exemple de dclaration de fonction. Cette fonction appele Calcul est de type rel et
elle admet trois arguments de type rel.
Maintenant voici un exemple de programme complet :
FONCTION Calcul (x : Rel , y : Rel , z : Rel) : Rel
Variable a : Entier
DEBUT
a3
Calcul (x + y + z) * a
FIN
Variables i , j , k , b : Rels
DEBUT
Lire i
Lire j
Lire k
b Calcul (i , j , k) + 2
Ecrire b
FIN
Dans ce programme on fait appel a une fonction. Sa valeur est utilise dans une expression.
Exercice
1. Dfinir la fonction Somme quon lui passe deux valeurs de type entier et qui renvoie comme
valeur la somme des valeurs reues.
2. Dfinir la fonction Absolue qui renvoie la valeur absolue dune valeur quon lui passe comme
paramtre.
3. Dfinir la fonction Inverse qui renvoie linverse dune valeur quon lui passe comme paramtre.
4. Dfinir la fonction Max qui renvoie le maximum de deux valeurs.
5. Ecrivez un programme qui lit trois scores et qui utilise la fonction dfinie dans lexercice prcdent
pour dterminer le meilleur score et lafficher aprs.
Solutions
1. La dfinition de la fonction Somme est :
FONCTION Somme (x : Rel , y : Rel ) : Rel
DEBUT
Somme x + y
FIN
2. La dfinition de la fonction Absolue est :
FONCTION Absolue (x : Rel) : Rel
DEBUT
SI x > 0 ALORS
Absolue x
OFPPT / DRIF / CDC Tertiaire & TIC
Page : 43
Octobre 2005
Filire : TSDI
SINON
Absolue -1 * x
FIN SI
FIN
3. La dfinition de la fonction Inverse est :
FONCTION Inverse (x : Rel) : Rel
DEBUT
SI x 0 ALORS
Inevrse 1 /x
FIN SI
FIN
4. La dfinition de la fonction Max est :
FONCTION Max (x : Rel , y Rel) : Rel
DEBUT
SI x > y ALORS
Max x
SINON
Max y
FIN SI
FIN
5. Le prgramme est :
FONCTION Max (x : Rel , y Rel) : Rel
DEBUT
SI x > y ALORS
Max x
SINON
Max y
FIN SI
FIN
Variables score1 , score2 , score3 , meil_score : Rels
DEBUT
Ecrire Entrez les troix scores :
Lire score1
Lire score2
Lire score3
meil_score Max (Max (score1 , score2) , score3)
Ecrire Le meilleur score est : , meil_score
FIN
8.2. Les variables locales et globales
La porte dune variable est lensemble des sous- programmes o cette variable est connue c'est--dire
que les instructions de ces sous-programmes peuvent utiliser cette variable.
Une variable dfinie au niveau du programme principal (problme appelant) est appele variable
globale. Sa porte est totale : tout sous-programme du programme principal peut utiliser cette
variable.
Cependant, une variable dfinie au sein dun sous-programme est appele variable locale. La porte
dune variable locale est uniquement le sous-programme qui la dclare.
Remarque :
Lorsque le nom dune variable locale est identique une variable globale, la variable globale est
localement masque. Dans ce sous-programme la variable globale devient inaccessible.
OFPPT / DRIF / CDC Tertiaire & TIC
Page : 44
Octobre 2005
Filire : TSDI
Exemple
Soit le programme suivant :
Fonction Surface (a : Rel) : Rel
Variables valeur , resultat : Rels
DEBUT
valeur 3.14
resulat valeur * a
Surface resultat
FIN
Variable rayon : Rel
DEBUT
Ecrire Entrez le rayon du cercle :
Lire rayon
Ecrire La surface de cette cercle est : , Surface (rayon)
FIN
Les variables valeur et resultat dclares dans la fonction Surface sont locales.
Considrons presque le mme programme sauf que la variable valeur est dclare maintenant dans le
programme appelant.
Fonction Surface (a : Rel) : Rel
Variables resultat : Rels
DEBUT
resulat valeur * a
Surface resultat
FIN
Variable valeur , rayon : Rel
DEBUT
valeur 3.14
Ecrire Entrez le rayon du cercle :
Lire rayon
Ecrire La surface de cette cercle est : , Surface (rayon)
FIN
Dans ce deuxime programme seule la variable resultat est locale. Tandis que la variable valeur est
devenue globale. On peut par consquent accder sa valeur dans la fonction Surface.
8.3. Les passage de paramtres
Il existe deux types dassociation (que lon nomme passage de paramtre) entre le(s) paramtre(s) du
sous-programme (fonction ou procdure) et variable(s) du programme appelant :
- Passage par valeur
- Passage par adresse
Dans le cas o lon choisit pour un paramtre effectif un passage par valeur, la valeur de ce paramtre
effectif ne change pas mme si lors de lappel du sous-programme la valeur du paramtre formel
correspondant change. On peut dire que dans ce cas le paramtre effectif et le paramtre formel ont
font deux variables diffrents qui ont seulement la mme valeur. Cest la type de passage par dfaut.
Dans le cas o lon choisit pour un paramtre effectif un passage par adresse, la valeur de ce paramtre
effectif change si lors de lappel du sous-programme la valeur du paramtre formel correspondant
change. On peut dire que dans ce cas le paramtre effectif et le paramtre formel ont font deux
variables qui ont le mme adresse (par consquent valeur). Pour prciser quil sagit dun passage par
adresse, il faut souligns les paramtres concerns lors de la dfinition du sous-programme.
Exemple
Considrons les deux programmes suivants :
Programme 1
Fonction Calcul (a : Rel) : Rel
OFPPT / DRIF / CDC Tertiaire & TIC
Page : 45
Octobre 2005
Filire : TSDI
DEBUT
Calcul a * 2
aa1
FIN
Variable x : Rel
DEBUT
x3
Ecrire Calcul (x)
Ecrire x
FIN
Programme 2
Fonction Calcul (a : Rel) : Rel
DEBUT
Calcul a * 2
aa1
FIN
Variable x : Rel
DEBUT
x3
Ecrire Calcul (x)
Ecrire x
FIN
Dans le premier programme on a un passage de paramtre par valeur et dans le deuxime on a un
passage de parametrespar adresse. Le premier programme affichera le rsultat suivant :
6
3
car mme si la valeur de a change celle de x non.
Tandis que le deuxime programme il affichera :
6
2
la valeur de x changera car celle de a a change.
8.4. Les procdures
Les procdures sont des sous- programmes qui ne retournent aucun rsultat. Elles admettent comme
les fonctions des paramtres.
On dclare une procdure de la faon suivante :
PROCEDURE nom_procedure (Argument1 : Type , Argument2 : Type ,.)
Dclarations
DEBUT
Instructions de la procdure
FIN
Et on appelle une procdure comme une fonction, en indiquant son nom suivi des paramtres entre
parenthses.
Exercice
1. Ecrire une procdure qui reoit la longueur et la largeur dune surface et qui affiche la valeur de la
surface. Donnez cette procdure le nom Surface .
2. Ecrire une procdure qui permet dchanger les valeurs de deux variables. Appelez cette procdure
Echanger .
3. On dispose dune phrase dont les mots sont sparer par des point virgules. Ecrivez une procdure
qui permet de remplacer les points virgules par des espaces. On suppose quon dispose des fonctions
suivantes :
OFPPT / DRIF / CDC Tertiaire & TIC
Page : 46
Octobre 2005
Filire : TSDI
Page : 47
Octobre 2005
Filire : TSDI
2
7
3
8
4
8
5
11
6
15
7
20
8
24
Vous constatez que le tableau T est dj ordonn. On va voir comment s'applique la mthode de
recherche binaire pour rechercher si x = 20 existe dans le tableau T.
On divise l'intervalle des indices [1,8] en deux intervalles [1,4] et [5,8]. On obtient deux tableaux T1 et
T2.
1
3
2
7
3
4
8
8
x T1
5
11
6
15
x T2
7
20
8
24
La recherche va continuer dans le tableau T2 puisque x (20) est plus suprieur que le plus grand
lment de T1. Donc l'intervalle de recherche devient [5,8] et on va le diviser son tour en deux
intervalles [5,6] et [7,8].
5
11
6
15
x T1
7
20
8
24
x T2
De mme, la recherche va continuer dans T2. L'intervalle de recherche devient [7,8]. On le divise en
deux intervalles [7,7] et [8,8].
Finalement, x est trouv.
7
8
20
24
x T1 x T2
Le programme de la recherche dichotomique est le suivant :
Tableau T(N) : Entier
Variables inf , sup , milieu , x : Entier
Variable Trouve : Boolen
DEBUT
Trouve Faux
inf = 1
sup N
TANT QUE inf sup ET Trouve = Faux
2
Page : 48
Octobre 2005
Filire : TSDI
Page : 49
Octobre 2005
Filire : TSDI
Itration 2
Itration 3
25
Etat du tableau
52
1
1
52
1
25
10
25
10
25
10
25
10
25
10
10
10
1
1
1
1
Itration 1
10
Valeur de nc
25
25
52
52
52
52
52
3
1
0
10
52
3
3
3
3
3
3
3
3
1
10
52
3
3
3
3
3
3
3
25
25
10
52
8
8
8
8
8
8
62
62
25
10
52
10
10
10
10
10
3
3
62
25
10
52
23
23
23
23
8
8
8
62
25
25
52
25
25
25
55
55
55
8
62
62
25
52
52
52
3
3
3
55
55
55
62
62
62
55
23
23
23
23
23
23
55
55
55
62
Algorithme :
POUR i ALLANT DE 1 A 9
FAIRE
Petit TAB (i)
POUR j ALLANT DE i A 10
FAIRE
Si (TAB (j) < petit) ALORS petit TAB (j) ; position j FSI
FinPour
POUR j ALLANT DE position A i+1 PAS 1
FAIRE
TAB(j) TAB (j-1) ;
FinPour
TAB (i) petit ;
FinPour
5.4.2- Le tri bulle :
FAIRE
Inversion FAUX
POUR i ALLANT DE 1 A 9
FAIRE
Si (TAB (i) > TAB (i+1))
ALORS
Tampon TAB (i) ;
TAB (i) TAB (i+1) ;
Page : 50
Octobre 2005
Filire : TSDI
Page : 51
Octobre 2005
Filire : TSDI
Pluspetit VRAI
j1
TANTQUE (pluspetit ET (j < nbmots))
Faire
k1
TantQue ((MOTS (j, k) = MOT (k)) ET k <= 20)
Faire
k k+1
FTQ
Si (MOTS (j, k) < MOT (k))
ALORS
j j+1
SINON
Pluspetit FAUX
FSI
FTQ
Si (j < nbmots)
ALORS
POUR i ALLANT DE nbmots A j+1 PAS 1
Faire
POUR k ALLANT DE 1 A 20
Faire
MOTS (i, k) MOTS (i-1, k)
FinPour
FinPour
FSI
POUR k ALLANT DE 1 A 20
Faire
MOTS (j, k) MOT (k)
FinPour
FinPour
POUR i ALLANT DE 1 A nbmots
Faire
AFFICHER MOTS (i)
FinPour
Page : 52
Octobre 2005
Filire : TSDI
Partie 02 : JAVA
Page : 53
Octobre 2005
Filire : TSDI
1. Prsentation
Java est un langage de programmation usage gnral, volu et orient objet dont la syntaxe est
proche du C. Il existe 2 types de programmes en Java : les applets et les applications. Une application
autonome (stand alone program) est une application qui s'excute sous le contrle direct du systme
d'exploitation. Une applet est une application qui est charge par un navigateur et qui est excute sous
le contrle d'un plug in de ce dernier.
Ce chapitre contient plusieurs sections :
Les caractristiques
Bref historique de Java
Les diffrentes ditions et versions de Java
Un rapide tour d'horizon des API et de quelques outils
Les diffrences entre Java et JavaScript
L'installation du JDK
Page : 54
Octobre 2005
Filire : TSDI
les applets n'ont pas de mthode main() : la mthode main() est appele par la machine
virtuelle pour excuter une application.
les applets ne peuvent pas tre testes avec l'interprteur mais doivent tre intgres
une page HTML, elle mme visualise avec un navigateur disposant d'un polug in
sachant grer les applets Java, ou testes avec l'applet viewer.
Evnements
mai : premier lancement commercial
janvier : JDK 1.0
septembre : lancement du JDC
fvrier : JDK 1.1
dcembre : lancement de J2SE et du JCP
dcembre : lancement J2EE
mai : J2SE 1.3
J2SE 1.4
J2SE 5.0
Page : 55
Octobre 2005
Filire : TSDI
Sun fourni le JDK, partir de la version 1.2, sous les plate-formes Windows, Solaris et Linux.
La version 1.3 de Java est dsigne sous le nom Java 2 version 1.3.
La version 1.5 de Java est dsigne officiellement sous le nom J2SE version 5.0.
La documentation au format HTML des API de Java est fournie sparment. Malgr sa taille
imposante, cette documentation est indispensable pour obtenir des informations compltes sur
toutes les classes fournies. Le tableau ci dessous rsume la taille des diffrents composants
selon leur version pour la plate-forme Windows.
Version
1.0
JDK compress
JDK install
JRE compress
JRE install
Documentation
compresse
Documentation
dcompresse
21 Mo
30 Mo
43,5 Mo
83 Mo
106 Mo
144 Mo
223 Mo
Page : 56
Octobre 2005
Filire : TSDI
Java 2 se dcline en 3 ditions diffrentes qui regroupent des APIs par domaine d'application :
Java 2 Micro Edition (J2ME) : contient le ncessaire pour dvelopper des applications
capable de fonctionner dans des environnements limits tels que les assistants personnels
(PDA), les tlphones portables ou les systmes de navigation embarqus
Java 2 Standard Edition (J2SE) : contient le ncessaire pour dvelopper des
applications et des applets. Cette dition reprend le JDK 1.0 et 1.1.
Java 2 Enterprise Edition (J2EE) : contient un ensemble de plusieurs API
permettant le dveloppement d'applications destines aux entreprises tel que JDBC
pour l'accs aux bases de donnes, EJB pour dvelopper des composants orients
mtiers, Servlet / JSP pour gnrer des pages HTML dynamiques, ... Cette dition
necessite le J2SE pour fonctionner.
Le but de ces trois ditions est de proposer une solution reposant sur Java quelque soit le type
de dveloppement raliser.
1.3.4. J2SE 1.3
Cette version du JDK apporte de nombreuses amliorations notamment sur les performances et des
fonctionnalits nouvelles dont :
Page : 57
Octobre 2005
Filire : TSDI
Cette version ajoute un nouveau mot cl au langage pour utiliser les assertions : assert.
1.3.6. J2SE 5.0 (nom de code Tiger)
La version 1.5 du J2SE est spcifie par le JCP sous la JSR 176. Elle devrait intgrer un certain
nombre de JSR dans le but de simplifier les dveloppements en Java.
Ces volutions sont rparties dans une quinzaine de JSR qui seront intgres dans la version 1.5 de
Java.
JSR-003
JMX Management API
JSR-013
Decimal Arithmetic
JSR-014
Generic Types
JSR-028
SASL
JSR-114
JDBC API Rowsets
JSR-133
New Memory Model and thread
JSR-163
Profiling API
JSR-166
Concurrency Utilities
JSR-174
Monitoring and Management for the JVM
JSR-175
Metadata facility
JSR-199
Compiler APIs
JSR-200
Network Transfer Format for Java Archives
JSR-201
Four Language Updates
JSR-204
Unicode Surrogates
JSR-206
JAXP 1.3
La version 1.5 de Java est dsigne officiellement sous le nom J2SE version 5.0.
Page : 58
Octobre 2005
Filire : TSDI
Nom de code
Merlin
Hopper
Mantis
Tiger
Dragonfly
Mustang
Date de sortie
2001
2002
2003
2004
???
???
Description
Java Naming and directory interface Cet API permet d'unifier l'accs
JNDI
des ressources. Elle est intgre a Java 1.3
Cette API permet de grer des emails. Elle est intgre a la
Java mail
plateforme J2EE.
Cette API permet de mettre en oeuvre des graphismes en 3
Java 3D
dimensions
Java Media Cette API permet d'utiliser des composants multimdia
Java
Cette API permet de crer des servlets (composants serveurs). Elle
Servlets
est intgre a la plateforme J2EE.
Java Help Cette API permet de crer des aides en ligne pour les applications
Cette API permet d'utiliser Java avec des appareils qui ne sont pas
Jini
des ordinateurs
Cette API permet le parsing et le traitement de document XML. Elle
JAXP
est intgr a Java 1.4
Cette liste n'est pas exhaustive.
1.4. Un rapide tour d'horizon des API et de quelques outils
La communaut Java est trs productive car elle regroupe :
Page : 59
Octobre 2005
Filire : TSDI
la communaut libre qui produit un trs grand nombre d'API et d'outils pour Java
Ainsi l'ensemble des API et des outils utilisables est norme et volue trs rapidement. Les
tableaux ci dessous tentent de recenser les principaux par thme.
J2SE 1.4
Java Bean
Reflexion
Net (rseau)
Internationalisation
RMI
Collection
Preferences
Exp rgulire
IO
Logging
Security
Applet
AWT
JFC
Swing
Javadoc
JWSDK
JDBC
JDO
Jakarta Ant
Eclipse
JBoss
Web
Entreprise
XML
Divers
Servlets
JSP
JSTL
Jave Server Faces
Java Mail
JNDI
EJB
JMS
JMX
JTA
RMI-IIOP
Java IDL
JINI
JXTA
JAXP
SAX
DOM
JAXM
JAXR
JAX-RPC
SAAJ
JAXB
JAI
JAAS
JCA
JCE
Java Help
JMF
JSSE
Java speech
Java 3D
OJB
Cator
hibernate
Apache Axis
Jakarta
Struts
Webmacro
Expresso
Barracuda
Turbine
XML
Divers
Apache
Xerces
Apache Xalan
Apache Axis
JDOM
DOM4J
Jakarta Log4j
Jakarta
regexp
Page : 60
Octobre 2005
Filire : TSDI
Java
Auteur
Format
Execution
POO
Orient objets
Stockage
Utilisation
Typage
Fortement typ
Complxit du
Code relativement complexe
code
Javascript
Dvelopp par Netscape
Communications
Interprt
Source insr dans la page web
Utilisable uniquement pour
"dynamiser" les pages web
Execut par le navigateur
Manipule des objets mais ne permet
pas d'en dfinir
Pas de contrle de type
Code simple
Page : 61
Octobre 2005
Filire : TSDI
L'installation vous demande ensuite de lire et d'approuver les termes de la licence d'utilisation.
L'installation vous demande le rpertoire dans lequel le JDK va tre install. Le rpertoire propos par
dfaut est pertinent car il est simple.
Page : 62
Octobre 2005
Filire : TSDI
Page : 63
Octobre 2005
Filire : TSDI
Il peut tre pratique de dsarchiver le fichier dans un sous rpertoire, ce qui permet de reunir plusieurs
versions de la documentation.
1.6.3. La configuration des variables systme sous Windows 9x
Pour un bon fonctionnement du JDK, il est recommand de paramtrer correctement deux variables
systmes : la variable PATH qui dfinit les chemins de recherche des excutables et la variable
CLASSPATH qui dfinit les chemins de rechercher des classes et bibliothques Java.
Pour configurer la variable PATH, il suffit d'ajouter la fin du fichier autoexec.bat :
Exemple :
SET PATH=%PATH%;C:\JDK1.3\BIN
Attention : si une version antrieure du JDK tait dj prsente, la variable PATH doit dj contenir un
chemin vers les utilitaires du JDK. Il faut alors modifier ce chemin sinon c'est l'ancienne version qui
sera utilise. Pour vrifier la version du JDK utilise, il suffit de saisir la commande java -version dans
une fentre DOS.
Page : 64
Octobre 2005
Filire : TSDI
La variable CLASSPATH est aussi dfinie dans le fichier autoexec.bat. Il suffit d'ajouter une ligne ou
de modifier la ligne existante dfinissant cette variable.
Exemple :
SET CLASSPATH=C:\JAVA\DEV;
Dans un environnement de dveloppement, il est pratique d'ajouter le . qui dsigne le rpertoire
courant dans le CLASSPATH surtout lorsque l'on n'utilise pas d'outils de type IDE. Attention
toutefois, cette pratique est fortement dconseille dans un environnement de production pour ne pas
poser des problmes de scurit.
Il faudra ajouter par la suite les chemins d'accs aux diffrents packages requis par les dveloppements
afin de les faciliter.
Pour que ces modifications prennent effet dans le systme, il faut redemarrer Windows ou excuter ces
deux instructions sur une ligne de commande DOS.
1.6.4. Les lments du JDK 1.3 sous Windows
Le rpertoire dans lequel a t install le JDK contient plusieurs rpertoires. Les rpertoires donns ciaprs sont ceux utiliss en ayant gard le rpertoire par dfaut lors de l'installation.
Rpertoire
Contenu
Le rpertoire d'installation contient deux fichiers intressants : le fichier
readme.html qui fourni quelques informations et des liens web et le
C:\jdk1.3
fichier src.jar qui contient le source Java de nombreuses classes. Ce
dernier fichier n'est prsent que si l'option correspondante a t coche
lors de l'installation.
Ce rpertoire contient les excutables : le compilateur javac,
C:\jdk1.3\bin
l'interprteur java, le dbuggeur jdb et d'une faon gnrale tous les
outils du JDK.
Ce rpertoire n'est prsent que si l'option ncessaire a t coche lors de
C:\jdk1.3\demo
l'installation. Il contient des applications et des applets avec leur code
source.
C:\jdk1.3\docs
Ce rpertoire n'est prsent que si la documentation a t dcompresse.
C:\jdk1.3\include Ces rpertoires ne sont prsents que si les options ncessaires ont t
coches lors de l'installation. Il contient des fichiers d'en-tte C (fichier
et
C:\jdk1.3\include- avec l'extension .H) qui permettent de faire interagir du code Java avec
du code natif
old
Ce rpertoire contient le JRE : il regroupe le ncessaire l'excution des
applications notamment le fichier rt.jar qui regroupe les API. Depuis la
version 1.3, le JRE contient deux machines virtuelles : la JVM classique
et la JVM utilisant la technologie Hot spot. Cette dernire est bien plus
C:\jdk1.3\jre
rapide et c'est elle qui est utilise par dfaut.
C:\jdk1.3\lib
Les lments qui composent le JRE sont spars dans les rpertoires bin
et lib selon leur nature.
Ce rpertoire ne contient plus que quelques bibliothques notamment le
fichier tools.jar. Avec le JDK 1.1 ce rpertoire contenait le fichier de la
bibliothque standard. Ce fichier est maintenant dans le rpertoire JRE.
Page : 65
Octobre 2005
Filire : TSDI
Mme si ce n'est pas obligatoire pour fonctionner, il est particulirement utile de configurer
deux variables systmes : PATH et CLASSPATH.
Dans la variable PATH, il est pratique de rajouter le chemin du rpertoire bin du JDK install
pour viter chaque appel des commandes du JDK d'avoir saisir leur chemin absolu.
Dans la variable CLASSPATH, il est pratique de rajouter les rpertoires et les fichiers .jar qui
peuvent tre ncessaire lors des phases de compilation ou d'excution, pour viter d'avoir les
prciser chaque fois.
Page : 66
Octobre 2005
Filire : TSDI
Sur la page Licence Agreement , il faut lire la licence et si vous l'acceptez, cochez le
bouton radio I accept the terms in the licence agreement et cliquez sur le bouton Next
Sur la page Custom Setup , il est possible de slectionner/dslectionner les
lments installer. Cliquez simplement sur le bouton Next .
La page Browser registration permet de slectionner les plug-ins des navigateurs
qui seront installs. Cliquez sur le bouton Install
Les fichiers sont copis.
La page InstallShield Wizard Completed s'affichage la fin de l'installation.
Cliquez sur Finish .
Pour faciliter l'utilisation des outils du J2SE SDK, il faut ajouter le chemin du rpertoire bin
contenant ces outils dans la variable Path du systme.
Il est aussi utile de dfinir la variable d'environnement JAVA_HOME avec comme valeur le chemin
d'installation du SDK.
2. Les techniques de base de programmation en Java
N'importe quel diteur de texte peut tre utilis pour diter un fichier source Java.
Il est ncessaire de compiler le source pour le transformer en J-code ou byte-code Java qui sera lui
excut par la machine virtuelle.
Page : 67
Octobre 2005
Filire : TSDI
Il est prfrable de dfinir une classe par fichier. Le nom de la classe publique et le fichier qui la
contient doivent tre identiques.
Pour tre compil, le programme doit tre enregistr au format de caractres Unicode : une conversion
automatique est faite par le JDK si ncessaire.
Ce chapitre contient plusieurs sections :
La compilation d'un code source : cette section prsente la compilation d'un fichier source.
L'excution d'un programme et d'une applet : cette section prsente l'excution d'un
programme et d'une applet.
Pour compiler un fichier source il suffit d'invoquer la commande javac avec le nom du fichier source
avec son extension .java
javac NomFichier.java
Le nom du fichier doit correspondre au nom de la classe principale en respectant la casse mme si le
systme d'exploitation n'y est pas sensible
Suite la compilation, le pseudo code Java est enregistr sous le nom NomFichier.class
2.2. L'excution d'un programme et d'une applet
Les rgles de base : cette section prsente les rgles syntaxiques de base de Java.
Les identificateurs : cette section prsente les rgles de composition des
identificateurs.
Les commentaires : cette section prsente les diffrentes formes de commentaires de
Java.
Page : 68
Octobre 2005
Filire : TSDI
boolean
char
do
final
if
interface
package
Page : 69
break
class
double
finally
implements
long
private
byte
const
else
float
import
native
protected
Octobre 2005
Filire : TSDI
public
switch
transient
while
return
synchronized
true
short
this
try
static
throw
void
super
throws
volatile
commentaire de documentation
automatique
Exemple
// commentaire sur une seule ligne
int N=1; // dclaration du compteur
/* commentaires ligne 1
commentaires ligne 2 */
/**
* commentaire de la methode
* @param val la valeur a traiter
* @since 1.0
* @return Rien
* @deprecated Utiliser la nouvelle
methode XXX
*/
Page : 70
Octobre 2005
Filire : TSDI
soit un type lmentaire dit aussi type primitif dclar sous la forme type_lmentaire
variable;
soit une classe dclare sous la forme classe variable ;
exemple
long nombre;
int compteur;
String chaine;
Rappel : les noms de variables en Java peuvent commencer par un lettre, par le caractre de
soulignement ou par le signe dollar. Le reste du nom peut comporter des lettres ou des nombres mais
jamais d'espaces.
Il est possible de dfinir plusieurs variables de mme type en sparant chacune d'elles par une virgule.
Exemple
int jour, mois, annee ;
Java est un langage typage rigoureux qui ne possde pas de transtypage automatique lorsque ce
transtypage risque de conduire une perte d'information.
Pour les objets, il est ncessaire en plus de la dclaration de la variable de crer un objet avant de
pouvoir l'utiliser. Il faut rserver de la mmoire pour la cration d'un objet ( remarque : un tableau est
un objet en Java ) avec l'instruction new. La libration de la mmoire se fait automatiquement grce au
garbage collector.
Exemple
MaClasse instance; // dclaration de l'objet
instance = new maClasse(); // cration de l'objet
OU MaClasse instance = new MaClasse(); // dclaration et cration de l'objet
Exemple
int[] nombre = new int[10];
Il est possible en une seule instruction de faire la dclaration et l'affectation d'une valeur une variable
ou plusieurs variables.
Exemple
int i=3 , j=4 ;
Page : 71
Octobre 2005
Filire : TSDI
Dsignation
Longueur
Valeurs
boolean
valeur logique :
true ou false
1 bit
true ou false
byte
short
octet sign
entier court sign
8 bits
16 bits
-128 127
-32768 32767
char
int
entier sign
virgule flottante
float
simple prcision
(IEEE754)
virgule flottante
double double prcision
(IEEE754)
\u0000 \uFFFF
32 bits
-2147483648 2147483647
32 bits
1.401e-045 3.40282e+038
64 bits
2.22507e-308
1.79769e+308
Commentaires
pas de conversion
possible vers un autre
type
entour de cotes
simples dans du code
Java
-9223372036854775808
9223372036854775807
Les types lmentaires commencent tous par une minuscule.
long
entier long
64 bits
Page : 72
Octobre 2005
Filire : TSDI
Java
/* test sur les caractres */
class test1 {
public static void main (String args[]) {
char code = 'D';
int index = code - 'A';
System.out.println("index = " + index);
}
}
3.4.4. L'initialisation des variables
Exemple
int nombre; // dclaration
nombre = 100; //initialisation
OU int nombre = 100; //dclaration et initialisation
En Java, toute variable appartenant un objet (dfinie comme tant un attribut de l'objet) est initialise
avec une valeur par dfaut en accord avec son type au moment de la creation. Cette initialisation ne
s'applique pas aux variables locales des mthodes de la classe.
Les valeurs par dfaut lors de l'initialisation automatique des variables d'instances sont :
Type
Valeur par dfaut
boolean
false
byte, short, int, long
0
float, double
0.0
char
\u000
classe
null
Remarque : Dans une applet, il est prfrable de faire les dclarations et initialisation dans la
mthode init().
3.4.5. L'affectation
le signe = est l'oprateur d'affectation et s'utilise avec une expression de la forme variable =
expression. L'opration d'affectation est associatif de droite gauche : il renvoie la valeur affecte ce
qui permet d'crire :
x = y = z = 0;
Il existe des oprateurs qui permettent de simplifier l'criture d'une opration d'affectation associe
un oprateur mathmatique :
Oprateur Exemple
Signification
=
a=10
quivalent : a = 10
+=
a+=10 quivalent : a = a + 10
-=
a-=10
quivalent : a = a - 10
*=
a*=10 quivalent : a = a * 10
/=
a/=10
quivalent : a = a / 10
%=
A%=10 reste de la division
^=
a^=10
quivalent : a = a ^ 10
<<=
A<<=10 quivalent : a = a << 10 a est complt par des zros
OFPPT / DRIF / CDC Tertiaire & TIC
Page : 73
Octobre 2005
Filire : TSDI
droite
quivalent : a = a >> 10 a est complt par des zros
>>>=
a>>=10
gauche
>>>=
a>>>=10 quivalent : a = a >>> 10 dcalage gauche non sign
Attention : Lors d'une opration sur des oprandes de types diffrents, le compilateur
dtermine le type du rsultat en prenant le type le plus prcis des oprandes. Par exemple,
une multiplication d'une variable de type float avec une variable de type double donne un
rsultat de type double. Lors d'une opration entre un oprande entier et un flottant, le rsultat
est du type de l'oprande flottant.
3.4.6. Les comparaisons
Java propose des oprateurs pour toutes les comparaisons :
Oprateur Exemple
Signification
>
a > 10 strictement suprieur
<
a < 10 strictement infrieur
>=
a >= 10 suprieur ou gal
<
a < 10 infrieur ou gal
==
a == 10 Egalit
!=
a != 10 diffrent de
&
a&b
ET binaire
^
a^b
OU exclusif binaire
|
a|b
OU binaire
ET logique (pour expressions boolennes) : l'valuation de
&
a && b
l'expression cesse ds qu'elle devient fausse
OU logique (pour expressions boolennes) : l'valuation de
||
a || b
l'expression cesse ds qu'elle devient vraie
oprateur conditionnel : renvoie la valeur b ou c selon l'valuation de
?:
a ? b : c l'expression a (si a alors b sinon c) : b et c doivent retourner le mme
type
Les oprateurs sont excuts dans l'ordre suivant l'intrieure d'une expression qui est analyse de
gauche droite:
incrments et dcrments
multiplication, division et reste de division (modulo)
addition et soustraction
comparaison
le signe = d'affectation d'une valeur une variable
Page : 74
Octobre 2005
Filire : TSDI
nombre += 10;
3.5.1. L'arithmtique entire
Pour les types numriques entiers, Java met en oeuvre une sorte de mcanisme de conversion implicite
vers le type int appele promotion entire. Ce mcanisme fait partie des rgles mise en place pour
renforcer la scurit du code.
Exemple
short x= 5 , y = 15;
x = x + y ; //erreur la compilation
Incompatible type for =. Explicit cast needed to convert int to short.
x = x + y ; //erreur la compilation
^
1 error
Les oprandes et le rsultat de l'opration sont convertis en type int. Le rsultat est affect dans un
type short : il y a donc risque de perte d'informations et donc erreur la compilation est mise. Cette
promotion vite un dbordement de capacit sans que le programmeur soit pleinement conscient du
risque : il est ncessaire, pour rgler le problme, d'utiliser une conversion explicite ou cast
Exemple
x = (short) ( x + y );
Il est ncessaire de mettre l'opration entre parenthse pour que ce soit son rsultat qui soit converti
car le cast a une priorit plus forte que les oprateurs arithmtiques.
La division par zro pour les types entiers lve l'exception ArithmeticException
Exemple
/* test sur la division par zero de nombres entiers */
class test3 {
public static void main (String args[]) {
int valeur=10;
double rsultat = valeur / 0;
System.out.println("index = " + rsultat);
}
}
3.5.2. L'arithmtique en virgule flottante
Avec des valeurs float ou double, la division par zro ne produit pas d'exception mais le rsultat est
indiqu par une valeur spciale qui peut prendre trois tats :
Page : 75
Octobre 2005
Filire : TSDI
X
valeur finie
valeur finie
0
+/-
+/-
Y
0
+/-
0
valeur finie
+/-
X/Y
+
0
NaN
+/-
NaN
X%Y
NaN
x
NaN
NaN
NaN
Exemple
/* test sur la division par zero de nombres flottants */
class test2 {
public static void main (String args[]) {
float valeur=10f;
double rsultat = valeur / 0;
System.out.println("index = " + rsultat);
}
}
3.5.3. L'incrmentation et la dcrmentation
Les oprateurs d'incrmentation et de dcrmentation sont : n++ ++n n-- --n
Si l'oprateur est plac avant la variable (prfix), la modification de la valeur est immdiate sinon la
modification n'a lieu qu' l'issu de l'excution de la ligne d'instruction (postfix)
L'oprateur ++ renvoie la valeur avant incrmentation s'il est postfix, aprs incrmentation s'il est
prfix.
Exemple
System.out.println(x++); // est quivalent
System.out.println(x); x = x + 1;
System.out.println(++x); // est quivalent
x = x + 1; System.out.println(x);
Exemple
/* test sur les incrementations prefixees et postfixees */
class test4 {
public static void main (String args[]) {
int n1=0;
int n2=0;
System.out.println("n1 = " + n1 + " n2 = " + n2);
n1=n2++;
System.out.println("n1 = " + n1 + " n2 = " + n2);
n1=++n2;
System.out.println("n1 = " + n1 + " n2 = " + n2);
n1=n1++;
//attention
System.out.println("n1 = " + n1 + " n2 = " + n2);
}
}
Rsultat
int n1=0;
int n2=0; // n1=0 n2=0
Page : 76
Octobre 2005
Filire : TSDI
()
++
les oprateurs d'incrmentation
-*
les oprateurs de multiplication, division, et modulo
/
%
+
les oprateurs d'addition et soustraction
<<
les oprateurs de dcalage
>>
<
>
les oprateurs de comparaison
<=
>=
==
les oprateurs d'galit
!=
l'oprateur OU exclusif
^
l'oprateur ET
&
l'oprateur OU
|
l'oprateur ET logique
&&
l'oprateur OU logique
||
=
les oprateurs d'assignement
+=
-=
Les parenthses ayant une forte priorit, l'ordre d'interprtation des oprateurs peut tre modifi par
des parenthses.
3.7. Les structures de contrles
Comme quasi totalit des langages de dveloppement orient objets, Java propose un ensemble
d'instructions qui permettent de d'organiser et de structurer les traitements. L'usage de ces instructions
est similaire celui rencontr dans leur quivalent dans d'autres langages.
3.7.1. Les boucles
while ( boolean )
{
... // code a excuter dans la boucle
}
Le code est excut tant que le boolen est vrai. Si avant l'instruction while, le boolen est faux, alors
le code de la boucle ne sera jamais excut
Page : 77
Octobre 2005
Filire : TSDI
Ne pas mettre de ; aprs la condition sinon le corps de la boucle ne sera jamais excut
do {
...
} while ( boolean )
Cette boucle est au moins excut une fois quelque soit la valeur du boolen;
for ( initialisation; condition; modification) {
...
}
Exemple
for (i = 0 ; i < 10; i++ ) { .... }
for (int i = 0 ; i < 10; i++ ) { .... }
for ( ; ; ) { ... } // boucle infinie
L'initialisation, la condition et la modification de l'index sont optionels.
Dans l'initialisation, on peut dclarer une variable qui servira d'index et qui sera dans ce cas locale la
boucle.
Il est possible d'inclure plusieurs traitements dans l'initialisation et la modification de la boucle :
chacun des traitements doit tre spar par une virgule.
Exemple
for (i = 0 , j = 0 ; i * j < 1000;i++ , j+= 2) { ....}
La condition peut ne pas porter sur l'index de la boucle :
Exemple
boolean trouve = false;
for (int i = 0 ; !trouve ; i++ ) {
if ( tableau[i] == 1 )
trouve = true;
... //gestion de la fin du parcours du tableau
}
Il est possible de nommer une boucle pour permettre de l'interrompre mme si cela est peu
recommend :
Exemple
int compteur = 0;
boucle:
while (compteur < 100) {
for(int compte = 0 ; compte < 10 ; compte ++) {
compteur += compte;
System.out.println("compteur = "+compteur);
if (compteur > 40) break boucle;
}
}
3.7.2. Les branchements conditionnels
if (boolean) {
...
} else if (boolean) {
OFPPT / DRIF / CDC Tertiaire & TIC
Page : 78
Octobre 2005
Filire : TSDI
...
} else {
...
}
swith (expression) {
case constante1 :
instr11;
instr12;
break;
case constante2 :
...
default :
...
}
On ne peut utiliser switch qu'avec des types primitifs d'une taille maximum de 32 bits (byte, short, int,
char).
Si une instruction case ne contient pas de break alors les traitements associs au case suivant sont
excuts.
Il est possible d'imbriquer des switch
L'oprateur ternaire : ( condition ) ? valeur-vrai : valeur-faux
Exemple
if (niveau == 5) // equivalent total = (niveau ==5) ? 10 : 5;
total = 10;
else total = 5 ;
System.out.println((sexe == "H") ? "Mr" : "Mme");
3.7.3. Les dbranchements
break : permet de quitter immdiatement une boucle ou un branchement. Utilisable dans tous les
contrles de flot
continue : s'utilise dans une boucle pour passer directement l'itration suivante
break et continue peuvent s'excuter avec des blocs nomms. Il est possible de prciser une tiquette
pour indiquer le point de retour lors de la fin du traitement dclench par le break.
Une tiquette est un nom suivi d'un deux points qui dfinit le dbut d'une instruction.
3.8. Les tableaux
Ils sont drivs de la classe Object : il faut utiliser des mthodes pour y accder dont font partie des
messages de la classe Object tel que equals() ou getClass().
Le premier lment d'un tableau possde l'indice 0.
3.8.1. La dclaration des tableaux
Java permet de placer les crochets aprs ou avant le nom du tableau dans la dclaration.
Page : 79
Octobre 2005
Filire : TSDI
Exemple
int tableau[] = new int[50]; // dclaration et allocation
OU int[] tableau = new int[50];
OU int tab[]; // dclaration
tab = new int[50]; //allocation
Java ne supporte pas directement les tableaux plusieurs dimensions : il faut dclarer un tableau de
tableau.
Exemple
float tableau[][] = new float[10][10];
La taille des tableaux de la seconde dimension peut ne pas tre identique pour chaque occurrence.
Exemple
int dim1[][] = new int[3][];
dim1[0] = new int[4];
dim1[1] = new int[9];
dim1[2] = new int[2];
Chaque lment du tableau est initialis selon son type par l'instruction new : 0 pour les numriques,
'\0' pour les caractres, false pour les boolens et nil pour les chaines de caractres et les autres objets.
3.8.2. L'initialisation explicite d'un tableau
Exemple:
int tableau[5] = {10,20,30,40,50};
int tableau[3][2] = {{5,1},{6,2},{7,3}};
La taille du tableau n'est pas obligatoire si le tableau est initialis sa cration.
Exemple:
int tableau[] = {10,20,30,40,50};
Le nombre d'lment de chaque lignes peut ne pas tre identique :
Exemple:
int[][] tabEntiers = {{1,2,3,4,5,6},
{1,2,3,4},
{1,2,3,4,5,6,7,8,9}};
3.8.3. Le parcours d'un tableau
Exemple:
for (int i = 0; i < tableau.length ; i ++) { ... }
La variable length retourne le nombre d'lments du tableau.
Pour passer un tableau une mthode, il suffit de dclarer les paramtres dans l'en tte de la mthode
Exemple:
public void printArray(String texte[]){ ...
}
Les tableaux sont toujours transmis par rfrence puisque se sont des objets.
Un accs un lment d'un tableau qui dpasse sa capacit, lve une exception du type
java.lang.arrayIndexOutOfBoundsException.
Page : 80
Octobre 2005
Filire : TSDI
Page : 81
Octobre 2005
Filire : TSDI
Affichage
Apostrophe
Guillemet
anti slash
Tabulation
retour arrire (backspace)
retour chariot
saut de page (form feed)
saut de ligne (newline)
caractre ASCII ddd (octal)
caractre ASCII dd (hexadcimal)
caractre Unicode dddd (hexadcimal)
Page : 82
Octobre 2005
Filire : TSDI
Page : 83
Octobre 2005
Filire : TSDI
4. Les fichiers :
Les entres/sorties en Java
La langage Java, comme tout langage de programmation digne de ce nom, fournit une API de
manipulation de flux de donnes. Quasiment toutes les classes de cette API sont localises
dans le package java.io.*, l'exception des classes de manipulation de flux sur sockets.
Pour ces dernires, vous les trouverez dans le package java.net.*.
Afin d'apprhender au mieux les choses, nous allons diviser notre tude en plusieurs sousparties.
Dans un premier temps, nous allons nous focaliser sur comment manipuler un fichier
(indpendamment des donnes qu'il contient). Pour ce faire, nous utiliserons la classe
java.io.File. Elle expose un grand nombre de mthodes : nous en verrons les plus
utiles.
En second lieu, nous allons voir comment manipuler les flux de donnes. Plus
prcisment, nous allons voir comment exploiter les donnes contenues dans un
fichier. Un grand nombre de classes peuvent alors tre utilises en fonction des
besoins.
Enfin, nous finirons cette prsentation en parlant de srialisation. Ce concept consiste
en la possibilit de prendre un objet en mmoire et d'envoyer son tat (la valeur de ses
attributs) sur un flux de donnes (pourquoi pas vers un fichier, ou mieux encore, vers
une socket).
Chaque chapitre est agrment de nombreux exemples de code, afin de faciliter au mieux
votre apprentissage. Ce cours est maintenu en permanence. Si vous dtectez des erreurs, ou si
vous avez des suggestions apporter, dans le but d'amliorer sa qualit, n'hsitez pas me
contacter par email.
4.1 Manipulations de fichiers
Nous allons, dans cette section, voir comment on manipule les fichiers en Java. Comme il est
dit dans l'introduction, nous n'allons pas maintenant voir comment manipuler les donnes que
contient le fichier : il nous faudra pour ce faire utiliser les classes de flux (streams en anglais),
ce que nous verrons dans la section suivante. En revanche, nous allons voir quelles sont les
possibilits de manipulation de fichiers tels que le renommage, la suppression, connatre les
droits d'un fichier en terme de scurit, ...
Toutes ces possibilits vous sont offertes par l'intermdiaire de la classe File du package
java.io. Nous terminerons cette section en analysant un exemple de code permettant de lister
le contenu d'un rpertoire.
La classe java.io.File.
La classe File permet donc de manipuler un fichier sur le disque dur. Elle propose cet effet,
un grand nombre de mthodes. L'exemple suivant montre un exemple simple d'utilisation de
cette classe : on y cr un objet File bas sur un fichier, puis on l'utilise pour connatre
Page : 84
Octobre 2005
Filire : TSDI
certaines de ces caractristiques (Droits d'accs, longueur du fichier). Au final, le fichier est
supprim.
Le tableau suivant prsente certaines mthodes couramment utilises. Pour chacune d'entre
elles, un court descriptif vous est propos. Pour de plus amples informations sur cette classe,
vous pouvez toujours vous rfrer la documentation en ligne de l'API fournie pas Sun :
http://java.sun.com/j2se/1.4/docs/api/index.html.
String getName();
String getPath();
String getAbsolutePath();
String getParent();
boolean exists() ;
boolean canRead();
boolean canWrite();
boolean isDirectory();
boolean isFile();
long length();
boolean delete();
boolean mkdir();
String[] list();
Pour finaliser la prsentation de cette classe, vous pouvez consulter ce dernier exemple. La
classe Scan ne contient qu'une mthode statique : le main. Celle-ci accepte en paramtre le
nom d'un dossier consulter. On en demande la liste de tout ce qu'il contient et on affiche
chacune des entres en spcifiant s'il s'agit d'un dossier ou d'un fichier.
import java.io.*;
Page : 85
Octobre 2005
Filire : TSDI
Conclusion
La classe java.io.File vous permet donc de manipuler le systme de fichiers. Vous pouvez
ainsi crer, supprimer, dplacer ou obtenir des informations aussi bien sur des fichiers que sur
des dossiers.
4.2 Manipulations de flux de donnes
Nous allons, dans cette section, nous intresser aux flux (streams en anglais) de donnes,
proprement parl. Il est vrai qu'il existe plusieurs types de flux de donnes : des flux bass sur
des fichiers, sur des sockets rseaux, sur la console de l'application, ... Mais dans tous les cas,
leurs utilisations seront similaires. Ce sont les concepts d'hritage et d'interfaces qui
permettent d'obtenir cette abstraction.
Pour initier cette prsentation, nous allons donc commencer parler des flux de donnes
prdfinis. Puis nous prsenterons les principales classes du package java.io (comme vous
allez le voir, il y a de quoi faire). Enfin nous tudierons un exemple concret permettant de
raliser une copie de fichiers.
Les flux de donnes prdfinis.
Il existe, comme dans presque tous les autres langages, trois flux prdfinis. Ces trois flux
sont associs l'entre standard d'une application, sa sortie standard ainsi que sa sortie
standard d'erreurs. Ils sont respectivement nomms System.in, System.out et System.err.
Nous pouvons d'ores et dj signaler que System.in est une instance de la classe
InputStream, alors que les deux autres flux sont des instances de la classe PrintStream.
Page : 86
Octobre 2005
Filire : TSDI
try {
int c;
while((c = System.in.read()) != -1) {
System.out.print(c); nbc++;
}
} catch(IOException exc) {
exc.printStackTrace(); // En fait
exc.printStackTrace(System.err);
}
Pour ce qui est de la manipulation du flux de sortie, il est prfrable de ne pas directement
utiliser la classe InputStream. En effet, elle ne propose que des mthodes lmentaires de
rcupration de donnes. Prfrez au contraire la classe BufferedReader. Nous reviendrons
ultrieurement, dans ce document, sur la notion de Reader et de Writer. Pour l'heure, sachez
simplement gnrer un objet BufferedReader partir de System.in, comme le montre
l'exemple suivant. Cela vous permettra de facilement rcuprer des chanes de caractres
saisies sur la console par l'utilisateur.
Reader reader = new InputStreamReader(System.in);
BufferedReader keyboard = new BufferedReader(reader);
System.out.print("Entrez une ligne de texte : ");
String line = keyboard.readLine();
System.out.println("Vous avez saisi : " + line);
Le tableau suivant vous montre brivement quelques classes proposes dans le package
java.io. Comme vous pouvez le remarquer le tableau est constitu de quatre zones distinctes.
La colonne de gauche contient quelques noms de classes de flux de lecture, contrairement la
colonne de droite qui, elle, contient des classes de flux d'criture.
En plus, le tableau est aussi divis en deux lignes. La premire contient des classes qui
manipulent des octets. Ces classes existent plus ou moins depuis la version originale du JDK
(Java Development Kit). Mais certaines de leurs possibilits (de leurs mthodes) ont
rapidement t dprcies. En effet, les mthodes permettant l'acquisition de chanes de
caractres prsentent l'inconvnient de ne pas tre portables d'un systme un autre, ce qui
pour Java est inacceptable. N'oubliez pas que la norme ASCII (American Standard Code for
Information Interchange) ne spcifie que 128 caractres. Or, nos codes accentus (par
exemple) n'en font pas partie. Il existe, au final, plusieurs drivs d'ASCII (utiliss d'un
systme un autre) ne partageant pas tous les mmes codes.
En Java, le problme se rgle via l'utilisation de systme Unicode (16 bits). Il peut spcifier,
thoriquement, jusqu' 65536 caractres. On est donc tranquille pour l'change d'informations
textuelles entre des systmes htrognes. Mais, attention : dans la majorit des cas, les flux
sont des flux 8 bits. Qu'est ce que signifie donc, dans ce cas, l'utilisation de Reader ou de
Writer. En fait c'est simple, ces classes permettent de raliser des transformations de code
d'un systme ASCII driv vers Unicode et rciproquement. Ainsi, par exemple, System.in
est et restera un flux 8 bits, mais l'utilisation d'un Reader permettra de transformer les
caractres ASCII (ou driv) en code Unicode en tenant compte du systme de codage utilis
sur le poste. Ces classes sont apparues partir du JDK 1.1.
Page : 87
Octobre 2005
Filire : TSDI
Notez bien que le tableau suivant n'est pas exhaustif, bien au contraire. Pour s'en convaincre,
jetez un oeil sur la documentation du JDK pour le package java.io.
JDK 1.0
Flux d'octets
(8 bits)
JDK 1.1
Flux de caractres
(16 bits)
Flux d'entres
Flux de sorties
InputStream
+FileInputStream
+DataInputStream
+BufferedInputStream
+- . . .
Reader
+- FileReader
+- BufferedReader
+- StringReader
+- . . .
OutputStream
+FileOutputStream
+DataOutputStream
+BufferedOutputStream
+- . . .
Writer
+- FileWriter
+- BufferedWriter
+- StringWriter
+- . . .
Encore une petite chose : initialement, quasiment tous vos flots seront de types InputStream
ou OutputStream (ou de classes drives). Comment faire pour en obtenir un Reader ou un
Writer. En fait c'est simple : deux classes de transition vous sont proposes. Elles se
nomment InputStreamReader et OutputStreamWriter. Elles permettent, respectivement,
de transformer un InputStream en un Reader et un OutputStream en un Writer. A titre
d'exemple, je vous rappelle juste le code permettant de gnrer un flot d'acquisition de chanes
de caractres partir de la console.
Reader reader = new InputStreamReader(System.in);
BufferedReader keyboard = new BufferedReader(reader);
System.out.print("Entrez une ligne de texte : ");
String line = keyboard.readLine();
System.out.println("Vous avez saisi : " + line);
Maintenant que l'on voit un peu mieux quoi correspondent telle ou telle classe, il nous faut
comprendre comment elles s'utilisent. En effet, pour obtenir le flux adapt vos besoins, il
faut souvent passer par plusieurs constructions intermdiaires.
Les exemples de code suivants montrent comment cumuler les constructions de classes de
flux pour arriver au rsultat escompt. Le but final est d'obtenir un flot sur fichier, buffris,
permettant de manipuler des donnes types.
Page : 88
Octobre 2005
Filire : TSDI
Il est important de comprendre que l'ordre de construction ne peut en aucun cas tre chang.
En effet, l'objet final utiliser se doit d'tre de type DataInputStream. En effet, c'est sur ce
type que les mthodes attendues sont dfinies. Le second exemple montre le mme exemple,
mais pour crire dans un flux.
L'exemple que je vous propose permet de raliser une copie de fichier. Pour ce faire, votre
programme attend que le nom du fichier source et le nom du fichier de destination soient
renseigns sur la ligne de commande servant lancer le programme. A titre indicatif, voici un
exemple de commande servant dmarrer le programme en sachant que si le nombre de
paramtres n'est pas correct, le programme vous informera de qu'elle est sa bonne utilisation
(son usage).
> java Copy sourceFile.txt destFile.txt
Ensuite, le programme ralise la copie proprement parler. Deux points me semblent tre
prciser. Premirement, nous allons travailler sur des flux binaires et non des flux textuels : il
est donc judicieux de choisir les classes drives de InputStream et de OutputStream.
Secondo, la manipulation de flux peut aboutir lever des exceptions. Il faut donc spcifier ce
que l'on fera d'une ventuelle exception. Ici, j'ai choisi de mettre un bloc try ... catch et
d'afficher la pile des appels de mthodes (mais un throws Exception sur le prototype du main
en aurait fait autant).
Dans le but de vous montrer un maximum de choses, je rcupre la taille du fichier grce
l'objet de type File. Mais j'aurais pu coder la boucle de lecture des octets jusqu' obtenir la
valeur -1 (c'est elle qui vous est renvoye en cas de fin de fichier). Dans le but d'acclrer le
traitement, je place des buffers (des tampons) sur les flux bass sur les fichiers. Dans ce cas, il
faut absolument que vous fermiez les flux buffriss et non les flux simples (en fait les
derniers objets de flux crs). Pour le reste, il me semble que les choses sont suffisamment
simples.
import java.io.*;
public class Copy {
public static void main (String[] argv)
{
// Test sur le nombre de paramtres passs
if (argv.length != 2) {
System.out.println("Usage> java Copy sourceFile
destinationFile");
System.exit(0);
}
Page : 89
Octobre 2005
Filire : TSDI
try {
// Prparation du flux d'entre
File sourceFile = new File(argv[0]);
FileInputStream fis = new
FileInputStream(sourceFile);
BufferedInputStream bis = new
BufferedInputStream(fis);
long l = sourceFile.length();
// Prparation du flux de sortie
FileOutputStream fos = new
FileOutputStream(argv[1]);
BufferedOutputStream bos = new
BufferedOutputStream(fos);
// Copie des octets du flux d'entre vers le
flux de sortie
for(long i=0;i<l;i++) {
bos.write(bis.read());
}
// Fermeture des flux de donnes
bos.flush();
bos.close();
bis.close();
} catch (Exception e) {
System.err.println("File access error !");
e.printStackTrace();
}
System.out.println("Copie termine");
}
}
Conclusion
Nous avons donc, dans cette section, tudi comment manipuler les classes de flux proposes
en Java. En fait, il y a toute une arborescence de classes qui vous est propose. Chacune de
ces classes prsente certaines caractristiques que vous pouvez cumuler par constructions
successives.
Nous avons aussi vu que trois objets de flux sont initialement dfinis pour toutes applications
: System.in, System.out et System.err. Vous pouvez, eux aussi, les spcialiser. Finalement
nous avons mis en oeuvre un exemple permettant de raliser une copie de fichier : il nous a
donc fallu crer des objets de flux bass sur des fichiers mais en plus buffriss.
4.3 La srialisation en Java
Page : 90
Octobre 2005
Filire : TSDI
Prsentation du concept
Les problmatiques
Mais cela n'est pas aussi simple qu'il n'y parait. En effet, quelques problmes font que la
srialisation n'est pas si simple mettre en oeuvre. Pour s'en convaincre, dite vous que le
langage C++ (par exemple) ne fournit pas, de base, la srialisation. Certes, certaines librairies
(les MFC, pour ne citer qu'elles) proposent le concept, mais pas avec le mme aboutissement
qu'en Java.
Le premier problme rside dans le fait que les attributs (en effet, ce sont eux qu'il faut
sauvegarder pour sauvegarder l'tat de l'objet) ne sont pas tous de types scalaires (int, float,
double, ...). Certains sont de types agrgats (sous-objets ou tableaux). Or, en Java, les agrgats
sont obligatoirement stocks dans le tas (la mmoire autre que la pile d'excution) : ils sont
donc invitablement points. Or, qu'est ce que cela veut dire que de srialiser un pointeur ? Ne
serait-ce pas plutt l'objet point qu'il faudrait sauvegarder ?
A partir de cette question, une autre en dcoule tout naturellement. Comment savoir si le type
d'un attribut est un type scalaire ou un agrgat ?
Une dernire question vous est peut tre venue l'esprit : comment le mcanisme de
srialisation va fonctionner sur deux objets qui se pointent mutuellement ? Il ne faudrait, en
effet, pas sauvegarder les mmes objets indfiniment.
Les solutions
En fait, il n'y a pas des solutions, mais une solution tous ces problmes : la rflexion. La
rflexion permet, par programmation, d'obtenir des informations sur un type de donnes
charg en mmoire. Ces informations permettent de dcrire les attributs, les mthodes et les
constructeurs de la classe considre.
Ces informations descriptives sont stockes dans les mta-classes. Une mta-classe est donc
un type qui en identifie un autre. En fait, si l'on y rflchit bien, les concepts de mta-classes
et de rflexion sont les cls de vote de tout le systme Java (Java Bean, JNI, RMI, ...).
A titre d'information, le concept d'introspection peut tre vu comme un aboutissement de la
rflexion. Ce que traite en plus l'introspection, ce sont les conventions de codage dfinies en
Java. Ainsi, partir des mthodes exposes par une classe on peut aussi en dduire ses
proprits (les gets et les sets) et ses vnements (les couteurs). Mais cela n'apporte rien de
plus pour ce qui est de la srialisation.
Pour que l'on puisse manipuler les mta-classes, il faut que le compilateur joigne la table des
symboles au fichier de byte code gnrer. C'est ce que ne sait pas faire C++ : les mta-classes
en sont donc plus difficiles fournir (certain compilateurs y arrivent malgr tout en mode
debug).
Pour pouvoir utiliser la rflexion, l'environnement Java vous fournit la classe java.lang.Class,
ainsi qu'un bon nombre d'autres classes utilitaires localises dans le package
java.lang.reflect. A titre d'exemple, je vous suggre de tester le programme suivant. Il affiche
Page : 91
Octobre 2005
Filire : TSDI
l'ensemble des attributs d'une classe en prcisant si, pour chaque attribut, son type est scalaire
ou s'il s'agit d'un agrgat.
import java.lang.reflect.*;
public class MetaDonnees {
public static void main(String[] args) {
Class metaClass = javax.swing.JButton.class;
/* ou Class metaClass = new JButton().getClass(); */
Field attributes[] = metaClass.getFields();
for(int i=0; i<attributes.length; i++) {
boolean scalar =
attributes[i].getType().isPrimitive();
System.out.print(scalar ? "Scalar" : "Object");
System.out.print(" : " + attributes[i].getName()
+ " de type ");
System.out.println(attributes[i].getType());
}
}
}
Utilisation de la srialisation
Maintenant que vous avez bien compris les pr-requis, nous pouvons nous focaliser sur la
mise en oeuvre de la srialisation via l'API de Java. Tout ce que vous devez savoir est localis
dans le package java.io. On y trouve notamment deux classes : ObjectInputStream et
ObjectOutputStream. Ces deux classes proposent, respectivement, les mthodes readObjet
et writeObject. Ce sont ces mthodes qui vont vous permettre la srialisation. Pour toutes les
problmatiques prcdentes, vous ne vous occupez de rien : tout est pris en charge par ces
deux classes.
L'exemple de code suivant tente de vous montrer la puissance du mcanisme. Pour ce faire, la
mthode saveWindow construit une fentre contenant diffrents composants graphiques (zone
de saisie de texte, boutons, arborescence, ...) puis sauvegarde l'objet de fentre sur le disque.
A partir de l, tous les autres composants doivent tre aussi srialiss. La mthode
loadWindow, permet, quant elle, l'opration inverse : elle reconstruit la fentre et tous les
lments initialement contenus. La mthode "main" se charge, elle, d'acqurir les commandes
de la part de l'utilisateur et de les traiter.
En guise de test, demandez d'abord de sauvegarder une fentre. Regardez alors la taille du
fichier "window.ser" sur le disque (pour ma part 19,7 Ko). Puis demandez conscutivement,
de recharger la fentre quelques fois : on peut considrer le fichier comme un modle servant
rgnrer autant d'instance que souhait. Tapez exit, pour sortir de la fentre.
import java.io.*;
import java.awt.*;
import javax.swing.*;
public class Serialisation {
private final static Reader reader = new
InputStreamReader(System.in);
private final static BufferedReader keyboard = new
OFPPT / DRIF / CDC Tertiaire & TIC
Page : 92
Octobre 2005
Filire : TSDI
BufferedReader(reader);
// Permet de crer une fentre et de la srialiser dans
un fichier.
public void saveWindow() throws IOException {
JFrame window = new JFrame("Ma fentre");
JPanel pane = (JPanel)window.getContentPane();
pane.add(new JLabel("Barre de status"),
BorderLayout.SOUTH);
pane.add(new JTree(), BorderLayout.WEST);
JTextArea textArea = new JTextArea("Ceci est le
contenu !!!");
textArea.setBackground(Color.GRAY);
pane.add(textArea, BorderLayout.CENTER);
JPanel toolbar = new JPanel(new FlowLayout());
toolbar.add(new JButton("Open"));
toolbar.add(new JButton("Save"));
toolbar.add(new JButton("Cut"));
toolbar.add(new JButton("Copy"));
toolbar.add(new JButton("Paste"));
pane.add(toolbar, BorderLayout.NORTH);
window.setSize(400,300);
FileOutputStream fos = new
FileOutputStream("window.ser");
ObjectOutputStream oos = new
ObjectOutputStream(fos);
oos.writeObject(window);
oos.flush();
oos.close();
}
// Permet de reconstruire la fentre partir des
donnes du fichier.
public void loadWindow() throws Exception {
FileInputStream fis = new
FileInputStream("window.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
JFrame window = (JFrame)ois.readObject();
ois.close();
window.setVisible(true);
}
// Permet de saisir diffrentes commandes. Testez
plusieurs load
// conscutifs : plusieurs fentres doivent apparatrent
public static void main(String[] args) throws Exception
{
Serialisation object = new Serialisation();
while(true) {
System.out.print("Saisir le mode d'execution
(load ou save) : ");
String mode = keyboard.readLine();
if (mode.equalsIgnoreCase("exit")) break;
if (mode.equalsIgnoreCase("save"))
Page : 93
Octobre 2005
Filire : TSDI
object.saveWindow();
if (mode.equalsIgnoreCase("load"))
object.loadWindow();
}
System.exit(0);
}
}
Dans certains cas subtils, vous pourriez avoir besoin qu'un attribut ne soit pas srialis pour
une classe donne. Cela est ralisable sans de relle difficult. Il suffit de rajouter le
qualificateur transient l'attribut en question. Le code suivant dfinit une classe dont le
second attribut ne sera jamais srialis.
import java.io.*;
import java.util.*;
public MaClasse implements Serializable {
private String monPremierAttribut;
private transient Date monSecondAttribut;
srialis
private long monTroisimeAttributs;
Page : 94
// non
Octobre 2005
Filire : TSDI
// . . . d'ventuelles mthodes . . .
}
Un pige viter
Pour terminer cette section, il faut que je vous mette en garde. Il y a une source potentielle de
fuites mmoire avec le mcanisme de srialisation : j'en ai d'ailleurs dj fait les frais. En fait
ce n'est pas rellement un bug : il faut juste bien comprendre comment marchent les classes
ObjectInputStream et ObjectOutputStream.
Pour dtecter les cycles de pointeurs et donc viter de srialiser plusieurs fois un objet dans un
flux, les deux classes prcdentes grent des vecteurs (java.util.Vector). Un tel conteneur,
peut contenir autant d'objets (de pointeurs) que ce qu'il y a de mmoire disponible. A chaque
fois qu'un objet est manipul par l'intermdiaire de l'une des deux classes de flux d'objet, sa
rfrence est stocke dans le vecteur associ.
Dans un de mes dveloppements, j'ai eu besoin de coder un client et un serveur TCP/IP. Pour
communiquer, j'ai dfini des nombreuses classes drivant toutes d'une mme classe mre
nomme Message. Cette classe dfinit une mthode abstraite process. Chacune des autres
classes la redfinit. Le client gnre ainsi des objets de messages divers et les envoie au
serveur. Le client est aujourd'hui cod de manire similaire l'extrait de code qui suit.
try {
OutputStream os = sockService.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
while(true) {
Message msg = this.createMessage();
oos.writeObject(msg)
oos.reset();
}
} catch(Exception e) {
e.printStackTrace();
}
Le problme, auquel je me suis heurt, rside dans le fait que j'avais omis la ligne marque en
gras. Elle permet de rinitialiser le vecteur contenu dans l'objet de flot. Ainsi, il ne crot pas
indfiniment et le programme n'arrive donc plus une erreur de type
java.lang.OutOfMemoryError. Pensez tenir compte de cette problmatique, en
comprenant bien qu'elle n'apparat que si votre connexion rseau est utilise pour un grand
nombre de transfert d'objets.
Conclusion
Nous avons donc, au terme de cette section, vu ce que propose le concept de srialisation.
Nous avons prsent les diffrents problmes inhrents ce concept. Ce qu'il faut simplement
en retenir, c'est que l'environnement Java prend tout sa charge par l'intermdiaire de la
rflexion.
Deux classes principales vous permettent de mettre en oeuvre cette srialisation :
java.io.ObjectInputStream et java.io.ObjectOutputStream. Mais attention : pour qu'un
objet puisse tre manipul sur un flux d'objet, il faut qu'il soit marqu comme tant
OFPPT / DRIF / CDC Tertiaire & TIC
Page : 95
Octobre 2005
Filire : TSDI
Page : 96
Octobre 2005
Filire : TSDI
Exercices
Page : 97
Octobre 2005
Filire : TSDI
Enonc 1 : Ecrire un algorithme qui permet la saisie dun montant HT dune facture, puis de calculer
et afficher un total TTC qui est gal au montant HT + TVA selon les conditions suivantes :
Si le montant HT est infrieure a 5000, alors la TVA est gal 7%.
Sinon si le montant HT est entre 5000 et 10000, alors la TVA est gal 14%.
Sinon si le montant HT est suprieur a 10000, alors la TVA est gal 20%.
Enonc 2 : Ecrire un algorithme qui permet de saisir un nombre au clavier puis de dterminer sil est
premier ou non.
Rgle : on dit quun nombre est premier sil nest divisible que par 1 et lui-mme.
Enonc 3 : Ecrire un algorithme qui permet de ranger dix nombres dans un tableau T dune
dimension, puis les afficher avec leur somme et leur moyenne.
Enonc 4
Ecrire un algorithme qui demande un nombre compris entre 10 et 20, jusqu ce que la rponse
convienne. En cas de rponse suprieure 20, on fera apparatre un message : Plus grand ! , et
inversement, Plus petit ! si le nombre est infrieur 10.
Enonc 5 :
Ecrire les programme qui permettent de calculer les sommes suivantes, en utilisant les schmas : pour,
tant que et rpter :
S1= 3+6+9++n
S2= 2+4+6++n
S3=1 !+2 !+3 !+.+n !
S4=1/1 !+1/2 !+1/3 !++1/n !
S5=n !/((p !*(n-p) !)
Enonc 6 :
Quelles sont les valeurs de a et i affiches par l'algorithme suivant:
entier a,i;
dbut
a 0; i0;
Rpter
i i+1;
a a+i;
i 2*i+1;
jusqu' i >=10;
crire(a,i);
fin
Enonc 7 :
Raliser la fonction Nvoy () qui reoit une chaine de caractres en paramtre et renvoie le
nombre de voyelles contenues dans cette chaine. Une voyelle fait partie des caractres
suivant : a, e, i, o, u, y
Enonc 8 :
Etablir un algorithme qui permet de saisir les lments d'un tableau de 20 rels; et affiche le
nombre des valeurs positives, le nombre des valeurs ngative, le nombre des valeurs nulles.
L'algorithme fait appel deux procdures.
Page : 98
Octobre 2005
Filire : TSDI
Enonc 9 :
Etablir un algorithme qui permet de trier les lments d'un tableau de 20 rels; et calcule et
affiche la moyenne de ses lments.
L'algorithme fait appel une procdure trie et une fonction moyenne.
Raliser sur PC les algorithmes demands dans les exercices suivants en utilisant le langage
java :
1) Compter de 5 en 5
Ecrire un programme qui compte de 5 en 5 de 0 jusqu' 100 puis affiche la somme des
nombres trouvs.
2) Minimum, maximum et somme
Ecrire un programme qui place 3 nombres passs en paramtres dans un tableau, puis
calcule et affiche le minimum, le maximum et la somme de ces nombres.
3) Mois
Ecrire un programme qui lit le nombre entier entre 1 et 12 passs en paramtre et qui
affiche le nom du mois correspondant.
On pourra utiliser un tableau ou l'instruction switch.
Ex1:
Concevoir un programme permettant de calculer le salaire net dun employ sachant que ce dernier et
constitu des valeurs suivantes :
Le salaire de base (SB), une prime (P), une retenue (R) tel que :
SB= nombre dheures * taux horaire
P= taux de prime *SB
R= taux de retenue*SB
EX2:
Ecrire un algorithme qui permet de remplir un tableau M de deux dimensions (trois lignes et cinq
colonnes) avec les nombres de 1 15.
1
6
11
2
7
12
3
8
13
4
9
14
5
10
15
Ex3
Quel rsultat produira cet algorithme ?
Dbut
Tableau T(3, 1) en Entier
Variables k, m, en Entier
Pour k
03
Pour m
01
T(k, m)
k+m
m Suivant
k Suivant
Pour k
03
Page : 99
Octobre 2005
Pour m
Filire : TSDI
01
Ecrire T(k, m)
m Suivant
k Suivant
Fin
Ex4
Ecrivez un algorithme qui trie un tableau dans lordre dcroissant.
Vous crirez bien entendu deux versions de cet algorithme, l'une employant le tri par slection, l'autre
le tri bulles.
Ex 5:
Le prsident d'un Club sportif a soumis chaque joueur du club un questionnaire, lui demandant de
citer trois de ses coquipiers qu'il juge les plus utiles pour le club. au point de vue motivation. On
propose
de
stocke
les
rponses
dans
des
tableaux.
Les tableaux doivent contenir comme informations
Le nom du joueur ayant rpondu au questionnaire (le nombre des joueurs est 31 ) ;
Les noms des trois joueurs choisis par le prcdent.
Travail faire :
1.
Dclarer les tableaux ncessaires pour l'application
Ecrire les algorithmes permettant de :
2.
3.
4.
5.
6.
7.
Page : 100
Octobre 2005