Académique Documents
Professionnel Documents
Culture Documents
Algorithmique
Algorithmique
INTRODUCTION A LALGORITHMIQUE
illogique,
Dave
Capitaine
Small
-
Mr
Spock
1. QUEST-CE
QUE LALGOMACHIN
un
mode
demploi
traduit directement
du
coren pour
faire
algorithme
doit
donc
contenir
uniquement
des
instructions comprhensibles par celui qui devra lexcuter. Cest dailleurs lun
des points dlicats pour les rdacteurs de modes demploi : les rfrences
culturelles, ou lexicales, des utilisateurs, tant variables, un mme mode demploi
peut tre trs clair pour certains et parfaitement abscons pour dautres.
En informatique, heureusement, il ny a pas ce problme : les choses auxquelles
ont doit donner des instructions sont les ordinateurs, et ceux-ci ont le bon got
dtre tous strictement aussi idiots les uns que les autres.
2. FAUT-IL
matrise
de
lalgorithmique
requiert
deux
qualits,
trs
complmentaires dailleurs :
3. LADN,
LES
SHADOKS,
ET LES ORDINATEURS
laffectation de variables
la lecture / criture
les tests
les boucles
4. ALGORITHMIQUE
ET PROGRAMMATION
Pourquoi apprendre lalgorithmique pour apprendre programmer ? En quoi at-on besoin dun langage spcial, distinct des langages de programmation
comprhensibles par les ordinateurs ?
Parce que lalgorithmique exprime les instructions rsolvant un problme donn
indpendamment des particularits de tel ou tel langage. Pour prendre une
image, si un programme tait une dissertation, lalgorithmique serait le plan, une
fois mis de ct la rdaction et lorthographe. Or, vous savez quil vaut mieux
faire dabord le plan et rdiger ensuite que linverse
Apprendre lalgorithmique, cest apprendre manier la structure logique dun
programme informatique. Cette dimension est prsente quelle que soit le langage
de programmation ; mais lorsquon programme dans un langage (en C, en Visual
Basic, etc.) on doit en plus se colleter les problmes de syntaxe, ou de types
dinstructions, propres ce langage. Apprendre lalgorithmique de manire
spare, cest donc srier les difficults pour mieux les vaincre.
rgles
fondamentales de
lalgorithmique Alors,
autant
5. AVEC
etc.
quon
appelait
des
organigrammes.
Aujourdhui,
cette
reprsentation est quasiment abandonne, pour deux raisons. Dabord, parce que
ds que lalgorithme commence grossir un peu, ce nest plus pratique du tout.
Ensuite parce que cette reprsentation favorise le glissement vers un certain
type de programmation, dite non structure (nous dfinirons ce terme plus tard),
que lon tente au contraire dviter.
Cest pourquoi on utilise gnralement une srie de conventions appele
pseudo-code , qui ressemble un langage de programmation authentique dont
on aurait vacu la plupart des problmes de syntaxe. Ce pseudo-code est
susceptible de varier lgrement dun livre (ou dun enseignant) un autre. Cest
PARTIE 1
LES VARIABLES
lorigine
de
toute
erreur
attribue
1. A
lordinateur.
Anonyme
Ces donnes peuvent tre de plusieurs types (on en reparlera) : elles peuvent
tre des nombres, du texte, etc. Toujours est-il que ds que lon a besoin de
stocker une information au cours dun programme, on utilise une variable.
Pour employer une image, une variable est une bote, que le programme
(lordinateur) va reprer par une tiquette. Pour avoir accs au contenu de la
bote, il suffit de la dsigner par son tiquette.
En ralit, dans la mmoire vive de lordinateur, il ny a bien sr pas une vraie
bote, et pas davantage de vraie tiquette colle dessus (javais bien prvenu que
la bote et ltiquette, ctait une image). Dans lordinateur, physiquement, il y a
un emplacement de mmoire, repr par une adresse binaire. Si on programmait
dans un langage directement comprhensible par la machine, on devrait se fader
de dsigner nos donnes par de superbes 10011001 et autres 01001001
(enchant !). Mauvaise nouvelle : de tels langages existent ! Ils portent le doux
nom dassembleur. Bonne nouvelle : ce ne sont pas les seuls langages disponibles.
Les langages informatiques plus volus (ce sont ceux que presque tout le
monde emploie) se chargent prcisment, entre autres rles, dpargner au
programmeur la gestion fastidieuse des emplacements mmoire et de leurs
adresses. Et, comme vous commencez le comprendre, il est beaucoup plus facile
demployer les tiquettes de son choix, que de devoir manier des adresses
binaires.
2. DECLARATION
DES VARIABLES
La premire chose faire avant de pouvoir utiliser une variable est de crer
la bote et de lui coller une tiquette. Ceci se fait tout au dbut de
lalgorithme, avant mme les instructions proprement dites. Cest ce quon appelle
la dclaration des variables. Cest un genre de dclaration certes moins
Grosso
modo,
on
retrouve
cependant
les
types
suivants :
Type Numrique
Plage
Byte (octet)
0 255
Entier simple
Entier long
Rel simple
Rel double
Nous nemploierons pas ces types dans ce cours ; mais je les signale, car vous
ne manquerez pas de les rencontrer en programmation proprement dite.
diable ?
Pour
viter
deux
sources
principales
de possibles
confusions :
sur
ce
point
crucial
dans
quelques
instants.
3. LINSTRUCTION DAFFECTATION
3.1 Syntaxe et signification
Ouf, aprs tout ce baratin prliminaire, on aborde enfin nos premires
vritables manipulations dalgorithmique. Pas trop tt, certes, mais pas moyen de
faire autrement !
En fait, la variable (la bote) n'est pas un outil bien sorcier manipuler. A la
diffrence du couteau suisse ou du superbe robot mnager vendu sur Tl
Boutique Achat, on ne peut pas faire trente-six mille choses avec une variable,
mais seulement une et une seule.
Cette seule chose quon puisse faire avec une variable, cest laffecter, cest-dire lui attribuer une valeur. Pour poursuivre la superbe mtaphore file dj
employe, on peut remplir la bote.
En pseudo-code, l'instruction d'affectation se note avec le signe
Ainsi :
Toto 24
Attribue la valeur 24 la variable Toto.
Ceci, soit dit en passant, sous-entend imprativement que Toto soit une
variable de type numrique. Si Toto a t dfini dans un autre type, il faut bien
comprendre que cette instruction provoquera une erreur. Cest un peu comme si,
en donnant un ordre quelquun, on accolait un verbe et un complment
incompatibles, du genre Epluchez la casserole . Mme dote de la meilleure
volont du monde, la mnagre lisant cette phrase ne pourrait quinterrompre
dubitativement sa tche. Alors, un ordinateur, vous pensez bien
On peut en revanche sans aucun problme attribuer une variable la valeur
dune autre variable, telle quelle ou modifie. Par exemple :
Tutu Toto
Signifie que la valeur de Tutu est maintenant celle de Toto.
Notez bien que cette instruction na en rien modifi la valeur de Toto : une
instruction daffectation ne modifie que ce qui est situ gauche de la
flche.
Tutu Toto + 4
Si Toto contenait 12, Tutu vaut maintenant 16. De mme que prcdemment,
Toto vaut toujours 12.
Tutu Tutu + 1
Si Tutu valait 6, il vaut maintenant 7. La valeur de Tutu est modifie, puisque
Tutu est la variable situe gauche de la flche.
Pour revenir prsent sur le rle des guillemets dans les chanes de
caractres et sur la confusion numro 2 signale plus haut, comparons
maintenant deux algorithmes suivants :
Exemple n1
Dbut
Riri "Loulou"
Fifi "Riri"
Fin
Exemple n2
Dbut
Riri "Loulou"
Fifi Riri
Fin
Fin
Exemple 2
Variable A en Numrique
Dbut
A 12
A 34
Fin
Il est clair que dans le premier cas la valeur finale de A est 12, dans lautre
elle est 34.
Il est tout aussi clair que ceci ne doit pas nous tonner. Lorsquon indique le
chemin quelquun, dire prenez tout droit sur 1km, puis droite nenvoie pas
les gens au mme endroit que si lon dit prenez droite puis tout droit pendant
1 km .
Enfin, il est galement clair que si lon met de ct leur vertu pdagogique, les
deux algorithmes ci-dessus sont parfaitement idiots ; tout le moins ils
contiennent une incohrence. Il ny a aucun intrt affecter une variable pour
laffecter diffremment juste aprs. En loccurrence, on aurait tout aussi bien
atteint le mme rsultat en crivant simplement :
Exemple 1
Variable A en Numrique
Dbut
A 12
Fin
Exemple 2
Variable A en Numrique
Dbut
A 34
Fin
Tous les lments sont maintenant en votre possession pour que ce soit vous
de jouer !
4. EXPRESSIONS
ET OPERATEURS
monde empli de doutes quest celui de lalgorithmique, cest une des rares
rgles dor qui marche tous les coups : si on voit gauche dune flche
daffectation autre chose quun nom de variable, on peut tre certain
100% quil sagit dune erreur.
un mot qui est trompeur ; en effet, ce mot existe dans le langage courant,
o il revt bien des significations. Mais en informatique, le terme
dexpression ne dsigne quune seule chose, et qui plus est une chose trs
prcise :
7
5+4
123-45+844
Toto-12+5-Riri
sont toutes des expressions valides, pour peu que Toto et Riri soient bien
des nombres. Car dans le cas contraire, la quatrime expression na pas de sens.
En loccurrence, les oprateurs que jai employs sont laddition (+) et la
soustraction (-).
Revenons pour le moment sur laffectation. Une condition supplmentaire (en
plus des deux prcdentes) de validit dune instruction daffectation est que :
+ : addition
- : soustraction
* : multiplication
/ : division
Mentionnons galement le ^ qui signifie puissance . 45 au carr scrira
donc 45 ^ 2.
Enfin, on a le droit dutiliser les parenthses, avec les mmes rgles quen
mathmatiques. La multiplication et la division ont naturellement priorit sur
laddition et la soustraction. Les parenthses ne sont ainsi utiles que pour
modifier cette priorit naturelle.
Cela signifie quen informatique, 12 * 3 + 5 et (12 * 3) + 5 valent strictement la
mme chose, savoir 41. Pourquoi ds lors se fatiguer mettre des parenthses
inutiles ?
En revanche, 12 * (3 + 5) vaut 12 * 8 soit 96. Rien de difficile l-dedans, que
du normal.
5. DEUX
Maintenant que nous sommes familiers des variables et que nous les
manipulons les yeux ferms (mais les neurones en veil, toutefois), jattire votre
attention sur la trompeuse similitude de vocabulaire entre les mathmatiques et
linformatique. En mathmatiques, une variable est gnralement une
inconnue, qui recouvre un nombre non prcis de valeurs. Lorsque jcris :
y=3x+2
les variables x et y satisfaisant lquation existent en nombre infini
(graphiquement, lensemble des solutions cette quation dessine une droite).
Lorsque jcris :
ax + bx + c = 0
la variable x dsigne les solutions cette quation, cest--dire zro, une
ou deux valeurs la fois
En informatique, une variable possde un moment donn une valeur et
une seule. A la rigueur, elle peut ne pas avoir de valeur du tout (une fois quelle a
t dclare, et tant quon ne la pas affecte. A signaler que dans certains
langages, les variables non encore affectes sont considres comme valant
automatiquement zro). Mais ce qui est important, cest que cette valeur
justement, ne varie pas proprement parler. Du moins ne varie-t-elle que
lorsquelle est lobjet dune instruction daffectation.
mathmatiques,
constitue
une
quation
sans
solution,
reprsente
en
mrite de ne pas laisser place lambigut. Une fois acquis les bons rflexes
avec ce signe, vous naurez plus aucune difficult passer au = des langages de
programmation.
ENONCE
DES
EXERCICES
Exercice 1.1
Quelles seront les valeurs des variables A et B aprs excution des
instructions suivantes ?
Variables A, B en Entier
Dbut
A1
BA+3
A3
Fin
Exercice 1.2
Exercice 1.3
Quelles seront les valeurs des variables A et B aprs excution des
instructions suivantes ?
Variables A, B en Entier
Dbut
A5
BA+4
AA+1
BA4
Fin
corrig - retour au cours
Exercice 1.4
Quelles seront les valeurs des variables A, B et C aprs excution des
instructions suivantes ?
Variables A, B, C en Entier
Dbut
A3
B 10
CA+B
BA+B
AC
Fin
corrig - retour au cours
Exercice 1.5
Quelles seront les valeurs des variables A et B aprs excution des
instructions suivantes ?
Variables A, B en Entier
Dbut
A5
B2
AB
BA
Fin
Moralit : 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 ?
Exercice 1.6
Exercice 1.7
Une variante du prcdent : 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).
corrig - retour au cours
Exercice 1.8
Que produit lalgorithme suivant ?
Variables A, B, C en Caractres
Dbut
A "423"
B "12"
CA+B
Fin
corrig - retour au cours
Exercice 1.9
Que produit lalgorithme suivant ?
Variables A, B, C en Caractres
Dbut
A "423"
B "12"
CA&B
Fin
Exercice 1.1
Aprs
La
valeur
A
A3
des
A = 3
variables est
=
B
?
=
B = 4
nonc - retour au cours
Exercice 1.2
Aprs
A
La
5
CBA
valeur
A
A = 2
des
variables est
B
B
5
=
B
B = 3
=?
3
=
3
3
:
=
C = 1
nonc - retour au cours
Exercice 1.3
Aprs
A
La
valeur
A
des
5
variables est
B
:
?
BA4
A = 6
B = 2
nonc - retour au cours
Exercice 1.4
Aprs
La
valeur
des
variables est
=?
10
= 10
= 10
13
= 13
13
AC
A = 13
B = 13
C = 13
nonc - retour au cours
Exercice 1.5
Aprs
La
valeur
des
variables est
=?
=2
A
BA
A = 2
=2
B = 2
crase.
Exercice 1.6
Dbut
CA
AB
BC
Fin
On est oblig de passer par une variable dite temporaire (la variable
C).
nonc - retour au cours
Exercice 1.7
Dbut
DC
CB
BA
AD
Fin
En fait, quel que soit le nombre de variables, une seule variable
temporaire suffit
nonc - retour au cours
Exercice 1.8
Il ne peut produire quune erreur dexcution, puisquon ne peut pas
additionner des caractres.
nonc - retour au cours
Exercice 1.9
En revanche, on peut les concatner. A la fin de lalgorithme, C
vaudra donc "42312".
PARTIE 2
LECTURE ET ECRITURE
derreur.
Anonyme
1. DE
QUOI PARLE-T-ON
Dune part, ce programme nous donne le carr de 12. Cest trs gentil lui.
Mais si lon veut le carr dun autre nombre que 12, il faut rcrire le programme.
Bof.
Dautre part, le rsultat est indubitablement calcul par la machine. Mais elle
le garde soigneusement pour elle, et le pauvre utilisateur qui fait excuter ce
programme, lui, ne saura jamais quel est le carr de 12. Re-bof.
Cest pourquoi, heureusement, il existe des dinstructions pour permettre la
machine de dialoguer avec lutilisateur (et Lyce de Versailles, et ajout
lestim Pierre Dac, qui en prcurseur mconnu de lalgorithmique, affirmait tout
aussi profondment que rien ne sert de penser, il faut rflchir avant ).
Dans un sens, ces instructions permettent lutilisateur de rentrer des
valeurs au clavier pour quelles soient utilises par le programme. Cette opration
est la lecture.
Dans lautre sens, dautres instructions permettent au programme de
communiquer des valeurs lutilisateur en les affichant lcran. Cette opration
est lcriture.
Remarque essentielle : A premire vue, on peut avoir limpression que les
informaticiens taient beurrs comme des petits lus lorsquils ont baptis ces
oprations ; puisque quand lutilisateur doit crire au clavier, on appelle a la
lecture, et quand il doit lire sur lcran on appelle lcriture. Mais avant
dagonir dinsultes une digne corporation, il faut rflchir un peu plus loin. Un
algorithme, cest une suite dinstructions qui programme la machine, pas
lutilisateur ! Donc quand on dit la machine de lire une valeur, cela implique que
lutilisateur va devoir crire cette valeur. Et quand on demande la machine
dcrire une valeur, cest pour que lutilisateur puisse la lire. Lecture et criture
sont donc des termes qui comme toujours en programmation, doivent tre
compris du point de vue de la machine qui sera charge de les excuter. Et l,
tout devient parfaitement logique. Et toc.
2. LES
Ds
que
le
programme
rencontre
une
instruction
Lire,
lexcution
machine, ou machine
homme).
ENONCE
DES
EXERCICES
Exercice 2.1
Quel rsultat produit le programme suivant ?
Variables val, double numriques
Dbut
Val 231
Double Val * 2
Ecrire Val
Ecrire Double
Fin
corrig - retour au cours
Exercice 2.2
Ecrire un programme qui demande un nombre lutilisateur, puis qui
calcule et affiche le carr de ce nombre.
corrig - retour au cours
Exercice 2.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.
corrig - retour au cours
Exercice 2.4
Exercice 2.1
On verra apparatre lcran 231, puis 462 (qui vaut 231 * 2)
Exercice 2.2
nb,
Variables
carr
en
Entier
Dbut
"Entrez
Ecrire
un
nombre
:"
nb
Lire
carr
Ecrire
nb
"Son
carr
*
est
nb
",
carr
Fin
En fait, on pourrait tout aussi bien conomiser la variable carr en
remplaant les deux avant-dernires lignes par :
Ecrire "Son carr est : ", nb*nb
C'est une question de style ; dans un cas, on privilgie la lisibilit de
l'algorithme, dans l'autre, on privilgie l'conomie d'une variable.
nonc - retour au cours
Exercice 2.3
Variables
Dbut
nb,
pht,
ttva,
pttc
en
Numrique
"Entrez
Ecrire
le
prix
hors
taxes
:"
pht
Lire
"Entrez
Ecrire
le
nombre
darticles
:"
nb
Lire
"Entrez
Ecrire
le
taux
de
TVA
:"
ttva
Lire
pttc
nb
pht
Ecrire
"Le
prix
toutes
(1
taxes
est
ttva)
",
pttc
Fin
L aussi, on pourrait squeezer une variable et une ligne en crivant
directement. :
Ecrire "Le prix toutes taxes est : ", nb * pht * (1 + ttva)
C'est plus rapide, plus lger en mmoire, mais un peu plus difficile
relire (et crire !)
nonc - retour au cours
Exercice 2.4
t1,
Variables
t2,
t3,
t4
en
Caractre
Dbut
t1
"belle
Marquise"
t2
"vos
beaux
t3
"me
font
t4
yeux"
mourir"
"damour"
Ecrire
t1
&
"
"
&
t2
&
"
"
&
t3
&
"
"
&
t4
Ecrire
t3
&
"
"
&
t2
&
"
"
&
t4
&
"
"
&
t1
Ecrire
t2
&
"
"
&
t3
&
"
"
&
t1
&
"
"
&
t4
Ecrire
t4
&
"
"
&
t1
&
"
"
&
t2
&
"
"
&
t3
Fin
PARTIE 3
LES TESTS
McConnell
mauvais
programmes .
Anonyme
Anonyme
1. DE
QUOI SAGIT-IL
Mais si en revanche elle est en sens interdit, alors continuez jusqu la prochaine
droite, prenez celle-l, et ensuite la premire droite .
Ce deuxime algorithme a ceci de suprieur au premier quil prvoit, en
fonction dune situation pouvant se prsenter de deux faons diffrentes, deux
faons diffrentes dagir. Cela suppose que linterlocuteur (le touriste) sache
analyser la condition que nous avons fixe son comportement ( la rue est-elle
en sens interdit ? ) pour effectuer la srie dactions correspondante.
Eh bien, croyez le ou non, mais les ordinateurs possdent cette aptitude, sans
laquelle dailleurs nous aurions bien du mal les programmer. Nous allons donc
pouvoir parler notre ordinateur comme notre touriste, et lui donner des
sries dinstructions effectuer selon que la situation se prsente dune manire
ou dune autre. Cette structure logique rpond au doux nom de test. Toutefois,
ceux qui tiennent absolument briller en socit parleront galement de
structure alternative.
TEST
boolen
Instructions
Sinon
Alors
1
Instructions
Finsi
Ceci appelle quelques explications.
Un boolen est une expression dont la valeur est VRAI ou FAUX. Cela peut
donc tre (il ny a que deux possibilits) :
une condition
CE QUUNE CONDITION
une valeur
un oprateur de comparaison
gal
diffrent de
VRAI
FAUX
VRAI
Remarque
trs
importante
<
Exercice 3.1
COMPOSEES
"Condition1 XOR Condition2" soit VRAI, il faut que soit Condition1 soit
VRAI, soit que Condition2 soit VRAI. Si toutes les deux sont fausses, ou
que toutes les deux sont VRAI, alors le rsultat global est considr
comme FAUX. Le XOR est donc l'quivalent du "ou bien" du langage
courant.
Jinsiste toutefois sur le fait que le XOR est une raret, dont il nest pas
strictement indispensable de sencombrer en programmation.
C2 Vrai
C2 Faux
C1 Vrai
Vrai
Faux
C1 Faux
Faux
Faux
C1 ou C2
C2 Vrai
C2 Faux
C1 Vrai
Vrai
Vrai
C1 Faux
Vrai
Faux
C1 xor C2
C2 Vrai
C2 Faux
C1 Vrai
Faux
Vrai
C1 Faux
Vrai
Faux
Non C1
LE
GAG
C1 Vrai
Faux
C1 Faux
Vrai
DE
LA
JOURNE...
pas.
Cela peut tre par exemple : Si Toto < 10 ET Toto > 15 Alors (il est
trs difficile de trouver un nombre qui soit la fois infrieur 10 et
suprieur
15 !)
Exercice 3.2
Exercice 3.3
IMBRIQUES
Exercice 3.4
Exercice 3.5
Exercice 3.6
A LA GARE DE TRI
Mais dans certains cas, ce ne sont pas deux voies quil nous faut, mais trois, ou
mme plus. Dans le cas de ltat de leau, il nous faut trois voies pour notre
train , puisque leau peut tre solide, liquide ou gazeuse. Alors, nous navons
pas eu le choix : pour deux voies, il nous fallait un aiguillage, pour trois voies il
nous en faut deux, imbriqus lun dans lautre.
Cette structure (telle que nous lavons programme la page prcdente)
devrait tre schmatise comme suit :
Soyons bien clairs : cette structure est la seule possible du point de vue
logique (mme si on peut toujours mettre le bas en haut et le haut en bas). Mais
du point de vue de lcriture, le pseudo-code algorithmique admet une
simplification supplmentaire. Ainsi, il est possible (mais non obligatoire,
que lalgorithme initial :
Variable Temp en Entier
Dbut
Ecrire "Entrez la temprature de leau :"
Lire Temp
Si Temp =< 0 Alors
Ecrire "C'est de la glace"
Sinon
Si Temp < 100 Alors
Ecrire "Cest du liquide"
Sinon
Ecrire "Cest de la vapeur"
Finsi
Finsi
Fin
devienne :
Variable Temp en Entier
Dbut
lalgorithme
de
dpart,
en
ayant
recours
deux
variables
supplmentaires.
bit pour tre stocke. De ce point de vue, lalourdissement nest donc pas
considrable.
ENONCE
DES
EXERCICES
Exercice 3.1
Ecrire un algorithme qui demande un nombre lutilisateur, et linforme
ensuite si ce nombre est positif ou ngatif (on laisse de ct le cas o
le nombre vaut zro).
corrig - retour au cours
Exercice 3.2
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.
corrig - retour au cours
Exercice 3.3
Ecrire un algorithme qui demande trois noms lutilisateur et linforme
ensuite sils sont rangs ou non dans lordre alphabtique.
corrig - retour au cours
Exercice 3.4
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).
Exercice 3.5
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 !
corrig - retour au cours
Exercice 3.6
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
DES
EXERCICES
Exercice 3.1
n
Variable
en
Entier
Dbut
"Entrez
Ecrire
un
nombre :
"
n
Lire
n
Si
Ecrire
>
"Ce
0
nombre
Alors
est
positif
Sinon
"Ce
Ecrire
nombre
est
ngatif"
Finsi
Fin
nonc - retour au cours
Exercice 3.2
m,
Variables
en
Entier
Dbut
"Entrez
Ecrire
deux
"
m,
Lire
Si
nombres :
(m
>
ET
>
0)
OU
n
(m
<
ET
<
0)
Alors
Ecrire
"Leur
produit
est
positif"
Ecrire
"Leur
produit
est
ngatif"
Sinon
Finsi
Fin
nonc - retour au cours
Exercice 3.3
a,
Variables
b,
en
Caractre
Dbut
"Entrez
Ecrire
trois
a,
Lire
Si
successivement
a
Ecrire
<
b,
"Ces
noms :
ET
noms
sont
c
<
classs
"
Alors
alphabtiquement"
Sinon
Ecrire
"Ces
noms
ne
sont
pas
classs"
Finsi
Fin
nonc - retour au cours
Exercice 3.4
n
Variable
en
Entier
Dbut
"Entrez
Ecrire
un
nombre :
"
n
Lire
n
Si
<
"Ce
Ecrire
nombre
SinonSi
est
=
"Ce
Ecrire
Alors
ngatif"
Alors
nombre
est
nul"
Sinon
"Ce
Ecrire
nombre
est
positif"
Finsi
Fin
nonc - retour au cours
Exercice 3.5
m,
Variables
en
Entier
Dbut
"Entrez
Ecrire
deux
(m
<
Ecrire
OU
ET
n
"Le
<
n
n
"Le
Ecrire
SinonSi
"
m,
Lire
Si
nombres :
produit
0)
OU
(m
produit
>
Alors
est
0
ET
est
nul"
>
0)
Alors
positif"
Sinon
"Le
Ecrire
produit
est
ngatif"
Finsi
Fin
Si on souhaite simplifier lcriture de la condition lourde du SinonSi, on
peut toujours passer par des variables boolennes intermdiaires. Une
astuce de sioux consiste galement employer un Xor (c'est l'un des
rares cas dans lesquels il est pertinent)
nonc - retour au cours
Exercice 3.6
age
Variable
en
Entier
Dbut
Ecrire
"Entrez
lge
de
lenfant :
"
age
Lire
Si
age
>=
12
"Catgorie
Ecrire
SinonSi
age
10
age
>=
age
Ecrire
>=
Alors
Minime"
"Catgorie
Ecrire
SinonSi
Cadet"
"Catgorie
Ecrire
SinonSi
>=
Alors
Alors
Pupille"
"Catgorie
Alors
Poussin"
Finsi
Fin
On peut videmment crire cet algorithme de diffrentes faons, ne
serait-ce quen commenant par la catgorie la plus jeune.
ENCORE DE LA LOGIQUE
1. FAUT-IL
METTRE UN
ET ? FAUT-IL
METTRE UN
OU ?
dtonnant ce quune situation qui sexprime avec une des tables (un des
oprateurs logiques) puisse tout aussi bien tre exprime avec lautre table
(lautre
oprateur logique).
Toute
lastuce
consiste
savoir
effectuer
correctement ce passage.
Bien sr, on ne peut pas se contenter de remplacer purement et simplement
les ET par des OU ; ce serait un peu facile. La rgle dquivalence est la suivante
(on peut la vrifier sur lexemple de la fentre) :
Si A ET B Alors
Instructions 1
Sinon
Instructions 2
Finsi
quivaut :
Exercice 4.1
Exercice 4.2
Exercice 4.3
Exercice 4.4
Exercice 4.5
DE LA LOGIQUE
LE STYLE
une
structure
alternative
complexe,
les
conditions
composes,
Exercice 4.6
Exercice 4.7
Exercice 4.8
Si vous avez compris ce qui prcde, et que l'exercice de la date ne vous pose
plus aucun problme, alors vous savez tout ce qu'il y a savoir sur les tests pour
affronter n'importe quelle situation. Non, ce n'est pas de la dmagogie !
Malheureusement, nous ne sommes pas tout fait au bout de nos peines ; il
reste une dernire structure logique examiner, et pas des moindres
PARTIE 5
LES BOUCLES
les
autres
dveloppement
90%
-
du
temps
Tom
de
Cargill
structures itratives. Ca calme, hein ? Bon, vous faites ce que vous voulez, ici on
est entre nous, on parlera de boucles.
Les
boucles,
c'est
gnralement
le
point
douloureux
de
l'apprenti
quivalentes aux variables (les cellules, les formules) et aux tests (la fonction
SI). Mais les boucles, a, a n'a aucun quivalent. Cela n'existe que dans les
langages de programmation proprement dits.
Le maniement des boucles, s'il ne diffrencie certes pas l'homme de la bte (il
ne faut tout de mme pas exagrer), est tout de mme ce qui spare en
informatique le programmeur de l'utilisateur, mme averti.
Alors, vos futures et invitables - difficults sur le sujet, il y a trois
remdes : de la rigueur, de la patience, et encore de la rigueur !
1. A
FinSi
Fin
Cest impeccable. Du moins tant que lutilisateur a le bon got de ne se tromper
quune seule fois, et dentrer une valeur correcte la deuxime demande. Si lon
veut galement btonner en cas de deuxime erreur, il faudrait rajouter un SI.
Et ainsi de suite, on peut rajouter des centaines de SI, et crire un algorithme
aussi lourd quune blague des Grosses Ttes, on nen sortira pas, il y aura
toujours moyen quun acharn flanque le programme par terre.
La solution consistant aligner des SI en pagaille est donc une impasse. La
seule issue est donc de flanquer une structure de boucle, qui se prsente ainsi :
TantQue boolen
Instructions
FinTantQue
Le principe est simple : le programme arrive sur la ligne du TantQue. Il
examine alors la valeur du boolen (qui, je le rappelle, peut tre une variable
boolenne ou, plus frquemment, une condition). Si cette valeur est VRAI, le
programme excute les instructions qui suivent, jusqu ce quil rencontre la ligne
FinTantQue. Il retourne ensuite sur la ligne du TantQue, procde au mme
examen, et ainsi de suite. Le mange enchant ne sarrte que lorsque le boolen
prend la valeur FAUX.
Illustration avec notre problme de contrle de saisie. Une premire
approximation de la solution consiste crire :
Variable Rep en Caractre
Dbut
fait, puisque cette affectation doit avoir pour rsultat de provoquer lentre
obligatoire dans la boucle. Laffectation doit donc faire en sorte que le boolen
soit mis VRAI pour dclencher le premier tour de la boucle. Dans notre
exemple, on peut donc affecter Rep avec nimporte quelle valeur, hormis O et
N : car dans ce cas, lexcution sauterait la boucle, et Rep ne serait pas du
tout lue au clavier. Cela donnera par exemple :
Variable Rep en Caractre
Dbut
Rep "X"
Ecrire "Voulez vous un caf ? (O/N)"
TantQue Rep <> "O" et Rep <> "N"
Lire Rep
FinTantQue
Fin
Cette manire de procder est connatre, car elle est employe trs
frquemment.
Il faut remarquer que les deux solutions (lecture initiale de Rep en dehors de
la boucle ou affectation de Rep) rendent toutes deux lalgorithme satisfaisant,
mais prsentent une diffrence assez importante dans leur structure logique.
En effet, si lon choisit deffectuer une lecture pralable de Rep, la boucle
ultrieure sera excute uniquement dans lhypothse dune mauvaise saisie
initiale. Si lutilisateur saisit une valeur correcte la premire demande de Rep,
lalgorithme passera sur la boucle sans entrer dedans.
En revanche, avec la deuxime solution (celle dune affectation pralable de
Rep), lentre de la boucle est force, et lexcution de celle-ci, au moins une
fois, est rendue obligatoire chaque excution du programme. Du point de vue
de lutilisateur, cette diffrence est tout fait mineure ; et la limite, il ne la
remarquera mme pas. Mais du point de vue du programmeur, il importe de bien
comprendre que les cheminements des instructions ne seront pas les mmes dans
un cas et dans lautre.
Pour terminer, remarquons que nous pourrions peaufiner nos solutions en
ajoutant des affichages de libells qui font encore un peu dfaut. Ainsi, si lon
est un programmeur zl, la premire solution (celle qui inclut deux lectures de
Rep, une en dehors de la boucle, lautre lintrieur) pourrait devenir :
Variable Rep en Caractre
Dbut
Ecrire "Voulez vous un caf ? (O/N)"
Lire Rep
TantQue Rep <> "O" et Rep <> "N"
Ecrire "Vous devez rpondre par O ou N. Recommencez"
Lire Rep
FinTantQue
Ecrire "Saisie accepte"
Fin
Quant la deuxime solution, elle pourra devenir :
Variable Rep en Caractre
Dbut
Rep "X"
Ecrire "Voulez vous un caf ? (O/N)"
TantQue Rep <> "O" et Rep <> "N"
Lire Rep
Si Rep <> "O" et Rep <> "N" Alors
Ecrire "Saisie Errone, Recommencez"
FinSi
FinTantQue
Fin
Le
Gag
De
La
Journe
sur
la
faute
laquelle
vous
symtrique
est
avez
au
moins
tant
aussi
su
dsopilante.
cul,
mais
fait
toujours
rire.
Exercice 5.1
Exercice 5.2
Exercice 5.3
2. BOUCLER
Dans le dernier exercice, vous avez remarqu quune boucle pouvait tre
utilise pour augmenter la valeur dune variable. Cette utilisation des boucles est
trs frquente, et dans ce cas, il arrive trs souvent quon ait besoin deffectuer
un nombre dtermin de passages. Or, a priori, notre structure TantQue ne sait
pas lavance combien de tours de boucle elle va effectuer (puisque le nombre de
tours dpend de la valeur dun boolen).
Cest pourquoi une autre structure de boucle est notre disposition :
Variable Truc en Entier
Dbut
Truc 0
TantQue Truc < 15
Truc Truc + 1
Ecrire "Passage numro : ", Truc
FinTantQue
Fin
Equivaut :
Variable Truc en Entier
Dbut
Pour Truc 1 15
Ecrire "Passage numro : ", Truc
Truc Suivant
Fin
Insistons :
la
structure
Pour
Suivant
nest
pas
du
tout
Instructions
Compteur suivant
Les structures TantQue sont employes dans les situations o lon doit
procder un traitement systmatique sur les lments dun ensemble dont on
ne connat pas davance la quantit, comme par exemple :
la gestion des tours dun jeu (tant que la partie nest pas finie, on
recommence)
Partie 9)
Les structures Pour sont employes dans les situations o lon doit procder
un traitement systmatique sur les lments dun ensemble dont le programmeur
connat davance la quantit.
Nous verrons dans les chapitres suivants des sries dlments appels
tableaux (parties 7 et 8) et chanes de caractres (partie 9). Selon les cas, le
balayage systmatique des lments de ces sries pourra tre effectu par un
Pour ou par un TantQue : tout dpend si la quantit dlments balayer (donc le
nombre de tours de boucles ncessaires) peut tre dnombre lavance par le
programmeur ou non.
aucun sens logique, et de plus, bien peu de langages vous autoriseraient ne seraitce qu crire cette structure aberrante.
Variables Truc, Trac en Entier
Pour Truc
instructions
Pour Trac
instructions
Truc Suivant
instructions
Trac Suivant
Pourquoi imbriquer des boucles ? Pour la mme raison quon imbrique des tests.
La traduction en bon franais dun test, cest un cas . Eh bien un cas (par
exemple, est-ce un homme ou une femme ? ) peut trs bien se subdiviser en
dautres cas ( a-t-il plus ou moins de 18 ans ? ).
De mme, une boucle, cest un traitement systmatique, un examen dune srie
dlments un par un (par exemple, prenons tous les employs de lentreprise un
par un ). Eh bien, on peut imaginer que pour chaque lment ainsi considr
(pour chaque employ), on doive procder un examen systmatique dautre
chose ( prenons chacune des commandes que cet employ a traites ). Voil un
exemple typique de boucles imbriques : on devra programmer une boucle
principale (celle qui prend les employs un par un) et lintrieur, une boucle
secondaire (celle qui prend les commandes de cet employ une par une).
Dans la pratique de la programmation, la matrise des boucles imbriques est
ncessaire, mme si elle nest pas suffisante. Tout le contraire dAlain Delon, en
quelque sorte.
4. ET
Le
Gag
De
La
Journe
le
monde
au
bistrot.
Exercice 5.4
Exercice 5.5
Exercice 5.6
Exercice 5.7
Exercice 5.8
Exercice 5.9
Exercice 5.10
ENONCE
DES
EXERCICES
Exercice 5.1
Ecrire un algorithme qui demande lutilisateur un nombre compris
entre 1 et 3 jusqu ce que la rponse convienne.
corrig - retour au cours
Exercice 5.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.
corrig - retour au cours
Exercice 5.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.
corrig - retour au cours
Exercice 5.4
Ecrire un algorithme qui demande un nombre de dpart, et qui ensuite
crit la table de multiplication de ce nombre, prsente comme
suit (cas o l'utilisateur entre le nombre 7) :
Table de 7 :
7x1=7
7 x 2 = 14
7 x 3 = 21
7 x 10 = 70
corrig - retour au cours
Exercice 5.5
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
NB : on souhaite afficher uniquement le rsultat, pas la
dcomposition du calcul.
corrig - retour au cours
Exercice 5.6
Ecrire un algorithme qui demande un nombre de dpart, et
qui calcule sa factorielle.
NB : la factorielle de 8, note 8 !, vaut
1x2x3x4x5x6x7x8
corrig - retour au cours
Exercice 5.7
Ecrire
un
algorithme
qui
demande successivement
20
Exercice 5.8
Rcrire lalgorithme prcdent, mais cette fois-ci on ne
connat pas davance combien lutilisateur souhaite saisir de
nombres. La saisie des nombres sarrte lorsque lutilisateur
entre un zro.
corrig - retour au cours
Exercice 5.9
Lire la suite des prix (en euros entiers et termine par zro)
des achats dun client. Calculer la somme quil doit, lire la
somme quil paye, et simuler la remise de la monnaie en
affichant les textes "10 Euros", "5 Euros" et "1 Euro" autant
de fois quil y a de coupures de chaque sorte rendre.
corrig - retour au cours
Exercice 5.10
crire un algorithme qui permette de connatre ses chances
de gagner au tierc, quart, quint et autres impts
volontaires.
On demande lutilisateur le nombre de chevaux partants, et
le nombre de chevaux jous. Les deux messages affichs
devront tre :
Dans lordre : une chance sur X de gagner
Dans le dsordre : une chance sur Y de gagner
X et Y nous sont donns par la formule suivante, si n est le
nombre de chevaux partants et p le nombre de chevaux
jous (on rappelle que le signe ! signifie "factorielle", comme
dans l'exercice 5.6 ci-dessus) :
X = n ! / (n - p) !
Y = n ! / (p ! * (n p) !)
NB : cet algorithme peut tre crit dune manire simple,
mais relativement peu performante. Ses performances
peuvent tre singulirement augmentes par une petite
astuce. Vous commencerez par crire la manire la plus
simple, puis vous identifierez le problme, et crirez une
deuxime version permettant de le rsoudre.
CORRIGES
DES
EXERCICES
Exercice 5.1
N
Variable
en
Entier
Debut
N
"Entrez
Ecrire
un
TantQue
nombre
<
entre
ou
et
>
<
ou
"Saisie
Ecrire
3
N
Lire
Si
3"
>
errone.
Alors
Recommencez
FinSi
FinTantQue
Fin
nonc - retour au cours
Exercice 5.2
N
Variable
en
Entier
Debut
N
Ecrire
"Entrez
N
TantQue
un
nombre
<
10
entre
ou
10
N
<
10
"Plus
Ecrire
N
SinonSi
Ecrire
>
20"
20
N
Lire
Si
et
>
grand !"
20
"Plus
Alors
Alors
petit !"
FinSi
FinTantQue
Fin
nonc - retour au cours
Exercice 5.3
N,
Variables
en
un
nombre :
Entier
Debut
"Entrez
Ecrire
"
N
Lire
"Les
Ecrire
10
Pour
nombres
N
suivants
1
sont :
N
"
10
i
Ecrire
i
Suivant
Fin
nonc - retour au cours
Exercice 5.4
N,
Variables
en
un
nombre :
Entier
Debut
"Entrez
Ecrire
"
N
Lire
"La
Ecrire
table
de
Pour
Ecrire
multiplication
"
ce
N,
de
",
i,
nombre
est :
"
"
10
",
n*i
Suivant
Fin
nonc - retour au cours
Exercice 5.5
Variables
Debut
N,
i,
Som
en
Entier
"Entrez
Ecrire
un
nombre :
"
N
Lire
Som
Pour
Som
Som
N
+
Suivant
"La
Ecrire
somme
est :
",
Som
Fin
nonc - retour au cours
Exercice 5.6
N,
Variables
i,
en
Entier
Debut
"Entrez
Ecrire
un
nombre :
"
N
Lire
F
Pour
i
Ecrire
Suivant
"La
factorielle
est :
",
Fin
nonc - retour au cours
Exercice 5.7
N,
Variables
i,
PG
en
Entier
Debut
PG
Pour
20
"Entrez
Ecrire
un
nombre :
"
N
Lire
i
Si
ou
PG
>
PG
Alors
N
FinSi
i
Suivant
Ecrire
"Le
nombre
le
plus
grand
tait :
",
PG
Fin
En ligne 3, on peut mettre nimporte quoi dans PG, il suffit que cette
variable soit affecte pour que le premier passage en ligne 7 ne
provoque
pas
d'erreur.
Exercice 5.8
N,
Variables
i,
PG,
IPG
en
Entier
Debut
N
PG
TantQue
<>
"Entrez
Ecrire
un
nombre :
"
N
Lire
i
i
Si
ou
PG
>
1
PG
Alors
N
IPG
FinSi
FinTantQue
Ecrire
Ecrire
"Le
"Il
nombre
a
le
plus
saisi
en
grand
tait :
",
PG
position
numro
",
IPG
Fin
nonc - retour au cours
Exercice 5.9
Variables
FF,
somdue,
M,
IPG,
Reste,
Nb10F,
Nb5F
En
Entier
Debut
E
somdue
TantQue
Ecrire
<>
"Entrez
le
0
montant :
Lire
somdue
"
somdue
FinTantQue
Ecrire
"Vous
devez :",
E,
"
euros"
"Montant
Ecrire
vers :"
M
Lire
Reste
Nb10E
E
0
Reste
TantQue
Nb10E
>=
Nb10E
Reste
10
+
Reste
1
10
FinTantQue
Nb5E
Reste
>=
Nb5E
Si
Reste
Reste
FinSi
Ecrire
"Rendu
de
la
Ecrire
"Billets
de
10
E:
Ecrire
"Billets
de
E:
Ecrire
"Pices
de 1
E:
monnaie :"
",
",
",
Nb10E
Nb5E
reste
Fin
nonc - retour au cours
Exercice 5.10
Spontanment, on est tent d'crire l'algorithme suivant :
Variables N, P, i, Num, Dno1, Dno2 en Entier
Debut Ecrire "Entrez le nombre de chevaux partants : "
Lire N
Ecrire "Entrez le nombre de chevaux jous : "
Lire P
Num 1
Pour i 2 N
Num Num * i
i Suivant
Dno1 1
Pour i 2 N-P
Dno1 Dno1 * i
i Suivant
Dno2 1
Pour i 2 P
Dno2 Dno2 * i
i Suivant
Ecrire "Dans lordre, une chance sur ", Num / Dno1
Ecrire "Dans le dsordre, une sur ", Num / (Dno1 * Dno2)
Fin
Cette version, formellement juste, comporte tout de mme deux
faiblesses.
La premire, et la plus grave, concerne la manire dont elle calcule le
rsultat final. Celui-ci est le quotient d'un nombre par un autre ; or,
ces nombres auront rapidement tendance tre trs grands. En
calculant, comme on le fait ici, d'abord le numrateur, puis ensuite le
dnominateur, on prend le risque de demander la machine de stocker
des nombres trop grands pour qu'elle soit capable de les coder (cf. le
prambule). C'est d'autant plus bte que rien ne nous oblige
procder ainsi : on n'est pas oblig de passer par la division de deux
trs
grands
nombres
pour
obtenir
le
rsultat
voulu.
revanche.
Henry
Spencer.
Bonne nouvelle ! Je vous avais annonc quil y a avait en tout et pour tout
quatre structures logiques dans la programmation. Eh bien, a y est, on les a
toutes passes en revue.
Mauvaise nouvelle, il vous reste tout de mme quelques petites choses
apprendre
1. UTILITE
DES TABLEAUX
sappelle
un
tableau,
ou
encore
une
variable
indice.
Le nombre qui, au sein dun tableau, sert reprer chaque valeur sappelle
surprise
lindice.
Chaque fois que lon doit dsigner un lment du tableau, on fait figurer le
nom du tableau, suivi de lindice de llment, entre parenthses.
ET UTILISATION ALGORITHMIQUE
Dans notre exemple, nous crerons donc un tableau appel Note. Chaque note
individuelle (chaque lment du tableau Note) sera donc dsigne Note(0),
Note(1), etc. Eh oui, attention, les indices des tableaux commencent
gnralement 0, et non 1.
Un tableau doit tre dclar comme tel, en prcisant le nombre et le type de
valeurs quil contiendra (la dclaration des tableaux est susceptible de varier
d'un langage l'autre. Certains langages rclament le nombre d'lments,
d'autre le plus grand indice... C'est donc une affaire de conventions).
En nous calquant sur les choix les plus frquents dans les langages de
programmations, nous dciderons ici arbitrairement et une bonne fois pour
toutes que :
Lnorme avantage des tableaux, cest quon va pouvoir les traiter en faisant
des boucles. Par exemple, pour effectuer notre calcul de moyenne, cela
donnera par exemple :
Tableau Note(11) en Numrique
Variables Moy, Som en Numrique
Dbut
Pour i 0 11
Ecrire "Entrez la note n", i
Lire Note(i)
i Suivant
Som 0
Pour i 0 11
Som Som + Note(i)
i Suivant
Moy Som / 12
Fin
NB : On a fait deux boucles successives pour plus de lisibilit, mais on aurait
tout aussi bien pu nen crire quune seule dans laquelle on aurait tout fait dun
seul coup.
Remarque gnrale : lindice qui sert dsigner les lments dun tableau
peut tre exprim directement comme un nombre en clair, mais il peut tre aussi
une variable, ou une expression calcule.
Dans un tableau, la valeur dun indice doit toujours :
lment dun tableau porte lindice 1). Mais comme je l'ai dj crit plus
haut, nous avons choisi ici de commencer la numrotation des indices
tre
un nombre
LE
GAG
DE
LA
JOURNEE
Exercice 6.1
Exercice 6.2
Exercice 6.3
Exercice 6.4
Exercice 6.5
Exercice 6.6
Exercice 6.7
DYNAMIQUES
Cette technique na rien de sorcier, mais elle fait partie de larsenal de base
de la programmation en gestion.
Exercice 6.8
Exercice 6.9
Exercice 6.10
Exercice 6.11
Exercice 6.12
Exercice 6.13
Exercice 6.14
Exercice 6.1
Ecrire un algorithme qui dclare et remplisse un tableau de 7 valeurs
numriques en les mettant toutes zro.
corrig - retour au cours
Exercice 6.2
Exercice 6.3
Ecrire un algorithme qui dclare un tableau de 9 notes, dont on fait
ensuite saisir les valeurs par lutilisateur.
corrig - retour au cours
Exercice 6.4
Que produit lalgorithme suivant ?
Tableau Nb(5) en Entier
Variable i en Entier
Dbut
Pour i 0 5
Nb(i) i * i
i suivant
Pour i 0 5
Ecrire Nb(i)
i suivant
Fin
Peut-on simplifier cet algorithme avec le mme rsultat ?
corrig - retour au cours
Exercice 6.5
Exercice 6.6
Que produit lalgorithme suivant ?
Tableau Suite(7) en Entier
Variable i en Entier
Dbut
Suite(0) 1
Suite(1) 1
Pour i 2 7
Suite(i) Suite(i-1) + Suite(i-2)
i suivant
Pour i 0 7
Ecrire Suite(i)
i suivant
Fin
corrig - retour au cours
Exercice 6.7
Ecrivez la fin de lalgorithme 6.3 afin que le calcul de la moyenne des
notes soit effectu et affich lcran.
corrig - retour au cours
Exercice 6.8
Ecrivez un algorithme permettant lutilisateur de saisir un nombre
quelconque de valeurs, qui devront tre stockes dans un tableau.
Lutilisateur doit donc commencer par entrer le nombre de valeurs quil
compte saisir. Il effectuera ensuite cette saisie. Enfin, une fois la
saisie termine, le programme affichera le nombre de valeurs
ngatives et le nombre de valeurs positives.
corrig - retour au cours
Exercice 6.9
Ecrivez un algorithme calculant la somme des valeurs dun tableau (on
suppose que le tableau a t pralablement saisi).
corrig - retour au cours
Exercice 6.10
12
11
11
10
Tableau 2 :
7
Tableau constituer :
11
14
Exercice 6.11
Toujours partir de deux tableaux prcdemment saisis, crivez un
algorithme qui calcule le schtroumpf des deux tableaux. Pour calculer
le schtroumpf, il faut multiplier chaque lment du tableau 1 par
chaque lment du tableau 2, et additionner le tout. Par exemple si
l'on a :
Tableau 1 :
4
Tableau 2 :
12
Le Schtroumpf sera :
3 * 4 + 3 * 8 + 3 * 7 + 3 * 12 + 6 * 4 + 6 * 8 + 6 * 7 + 6 * 12 = 279
corrig - retour au cours
Exercice 6.12
Ecrivez un algorithme qui permette la saisie dun nombre quelconque de
valeurs, sur le principe de lex 6.8. Toutes les valeurs doivent tre
ensuite augmentes de 1, et le nouveau tableau sera affich lcran.
corrig - retour au cours
Exercice 6.13
Ecrivez un algorithme permettant, toujours sur le mme principe,
lutilisateur de saisir un nombre dtermin de valeurs. Le programme,
une fois la saisie termine, renvoie la plus grande valeur en prcisant
quelle position elle occupe dans le tableau. On prendra soin deffectuer
la saisie dans un premier temps, et la recherche de la plus grande
valeur du tableau dans un second temps.
corrig - retour au cours
Exercice 6.14
Toujours et encore sur le mme principe, crivez un algorithme
permettant, lutilisateur de saisir les notes d'une classe. Le
programme, une fois la saisie termine, renvoie le nombre de ces notes
suprieures la moyenne de la classe.
CORRIGES
DES
EXERCICES
Exercice 6.1
Truc(6)
Tableau
en
Variable
Numrique
en
Numrique
Debut
i
Pour
Truc(i)
6
0
Suivant
Fin
nonc - retour au cours
Exercice 6.2
Truc(5)
Tableau
en
Caractre
Debut
Truc(0)
"a"
Truc(1)
"e"
Truc(2)
"i"
Truc(3)
"o"
Truc(4)
"u"
Truc(5)
"y"
Fin
nonc - retour au cours
Exercice 6.3
Notes(8)
Tableau
Variable
Ecrire
"Entrez
Numrique
en
Pour
en
la
Numrique
note
Lire
numro
",
8
i
Notes(i)
Suivant
Fin
nonc - retour au cours
Exercice 6.4
Cet algorithme remplit un tableau avec six valeurs : 0, 1, 4, 9, 16, 25.
Il les crit ensuite lcran. Simplification :
Tableau Nb(5) en Numrique
Variable i en Numrique
Dbut
Pour i 0 5
Nb(i) i * i
Ecrire Nb(i)
i Suivant
Fin
nonc - retour au cours
Exercice 6.5
Cet algorithme remplit un tableau avec les sept valeurs : 1, 3, 5, 7, 9,
11,
Il les crit ensuite lcran. Simplification :
Tableau N(6) en Numrique
Variables i, k en Numrique
Dbut
N(0) 1
Ecrire N(0)
Pour k 1 6
N(k) N(k-1) + 2
Ecrire N(k)
13.
k Suivant
Fin
nonc - retour au cours
Exercice 6.6
Cet algorithme remplit un tableau de 8 valeurs : 1, 1, 2, 3, 5, 8, 13, 21
nonc - retour au cours
Exercice 6.7
S
Variable
en
Notes(8)
Tableau
Numrique
en
Numrique
Debut
s
Pour
"Entrez
Ecrire
la
note
",
8
i
Notes(i)
Lire
s
Notes(i)
Suivant
"Moyenne
Ecrire
:",
s/9
Fin
nonc - retour au cours
Exercice 6.8
Variables
Nb,
Nbpos,
Nbneg
T()
Tableau
en
en
Numrique
Numrique
Debut
Ecrire
"Entrez
le
nombre
de
valeurs
:"
Nb
Lire
T(Nb-1)
Redim
Nbpos
Nbneg
Pour
"Entrez
Ecrire
le
Nb
nombre
",
1
+
1
T(i)
Lire
T(i)
Si
Nbpos
>
Nbpos
alors
+
1
Sinon
Nbneg
Nbneg
1
Finsi
Suivant
Ecrire
"Nombre
de
valeurs
positives
",
Nbpos
Ecrire
"Nombre
de
valeurs
ngatives
",
Nbneg
Fin
nonc - retour au cours
Exercice 6.9
Variables
i,
Tableau
Som,
T()
en
en
Numrique
Numrique
Debut
(on ne programme pas la saisie du tableau, dont on suppose quil
compte N lments)
Redim T(N-1)
Som 0
Pour i 0 N - 1
Som Som + T(i)
i Suivant
Ecrire "Somme des lments du tableau : ", Som
Fin
nonc - retour au cours
Exercice 6.10
i,
Variables
T1(),
Tableaux
en
T2(),
T3()
Numrique
en
Numrique
Debut
(on suppose que T1 et T2 comptent N lments, et quils sont dj
saisis)
Redim T3(N-1)
Pour i 0 N - 1
T3(i) T1(i) + T2(i)
i Suivant
Fin
nonc - retour au cours
Exercice 6.11
Variables
i,
Tableaux
j,
T1(),
N1,
N2,
T2()
en
en
Numrique
Numrique
Debut
On ne programme pas la saisie des tableaux T1 et T2.
On suppose que T1 possde N1 lments, et que T2 en possde T2)
S0
Pour i 0 N1 1
Pour j 0 N2 1
S S + T1(i) * T2(j)
j Suivant
i Suivant
Ecrire "Le schtroumpf est : ", S
Fin
nonc - retour au cours
Exercice 6.12
Nb,
Variables
en
T()
Tableau
Numrique
en
Numrique
Debut
Ecrire
"Entrez
le
nombre
de
valeurs
"
Nb
Lire
T(Nb-1)
Redim
i
Pour
"Entrez
Ecrire
le
Nb
nombre
",
Suivant
"Nouveau
Ecrire
i
T(i)
tableau
0
:
Nb
T(i)
Ecrire
1
T(i)
Lire
Pour
"
1
1
T(i)
Suivant
Fin
nonc - retour au cours
Exercice 6.13
Nb,
Variables
Posmaxi
en
T()
Tableau
"Entrez
Ecrire
Numrique
en
le
Numrique
nombre
de
valeurs
:"
Nb
Lire
T(Nb-1)
Redim
i
Pour
"Entrez
Ecrire
le
Nb
nombre
",
1
+
1
T(i)
Lire
i
Suivant
Posmaxi
Pour
T(i)
Si
Nb
>
T(Posmaxi)
Posmaxi
alors
i
Finsi
i
Suivant
Ecrire
"Element
le
plus
Ecrire
"Position
de
cet
grand
",
lment
T(Posmaxi)
",
Posmaxi
Fin
nonc - retour au cours
Exercice 6.14
Nb,
Variables
i,
Som,
Moy,
Nbsup
T()
Tableau
en
Numrique
en
Numrique
Debut
Ecrire
"Entrez
le
nombre
de
notes
saisir
"
Nb
Lire
T(Nb-1)
Redim
i
Pour
Ecrire
"Entrez
le
nombre
Nb
n
",
1
+
T(i)
Lire
i
Suivant
Som
Pour
Som
Nb
Som
T(i)
Suivant
Moy
Som
NbSup
Pour
Nb
0
T(i)
Si
NbSup
Nb
>
Moy
1
Alors
NbSup
1
FinSi
Suivant
Ecrire
NbSup,
"
lves
dpassent
la
moyenne
de
la
classe"
Fin
PARTIE 7
TECHNIQUES RUSEES
Une fois nest pas coutume, ce chapitre na pas pour but de prsenter un
nouveau type de donnes, un nouveau jeu dinstructions, ou que sais-je encore.
Son propos est de dtailler quelques techniques de programmation qui
possdent deux grands points communs :
1. TRI DUN
TABLEAU
LE TRI PAR
SELECTION
lon
45
122
12
part
21
78
64
53
89
de :
28
84
46
On commence par rechercher, parmi les 12 valeurs, quel est le plus petit
lment , et o il se trouve. On lidentifie en quatrime position (cest le nombre
3), et on lchange alors avec le premier lment (le nombre 45). Le tableau
devient
ainsi :
122
12
45
21
78
64
53
89
28
84
46
avec
12
122
45
21
le
78
64
53
troisime :
89
28
84
46
12
ce
21
45
qui
122
78
donnera
64
53
89
in
28
fine :
84
46
2. UN
EXEMPLE DE FLAG
Tout ceci peut vous sembler un peu fumeux, mais cela devrait sclairer laide
dun exemple extrmement frquent : la recherche de loccurrence dune valeur
dans un tableau. On en profitera au passage pour corriger une erreur
particulirement frquente chez le programmeur dbutant.
Soit un tableau comportant, disons, 20 valeurs. Lon doit crire un algorithme
saisissant un nombre au clavier, et qui informe lutilisateur de la prsence ou de
labsence de la valeur saisie dans le tableau.
La premire tape, vidente, consiste crire les instructions de lecture /
criture, et la boucle car il y en a manifestement une de parcours du tableau :
Tableau Tab(19) en Numrique
Variable N en Numrique
Dbut
Ecrire "Entrez la valeur rechercher"
Lire N
Pour i 0 19
???
i suivant
Fin
Il nous reste combler les points d'interrogation de la boucle Pour.
videmment, il va falloir comparer N chaque lment du tableau : si les deux
valeurs sont gales, alors bingo, N fait partie du tableau. Cela va se traduire,
bien entendu, par un Si Alors Sinon. Et voil le programmeur raisonnant
htivement qui se vautre en crivant :
Tableau Tab(19) en Numrique
Variable N en Numrique
Dbut
Pour i 0 19
Si N = Tab(i) Alors
Trouv Vrai
FinSi
i suivant
Si Trouv Alors
Ecrire "N fait partie du tableau"
Sinon
Ecrire "N ne fait pas partie du tableau"
FinSi
Fin
Mditons un peu sur cette affaire.
La difficult est de comprendre que dans une recherche, le problme ne se
formule pas de la mme manire selon qu'on le prend par un bout ou par un autre.
On peut rsumer l'affaire ainsi : il suffit que N soit gal une seule valeur de
Tab pour qu'elle fasse partie du tableau. En revanche, il faut qu'elle soit
diffrente de toutes les valeurs de Tab pour qu'elle n'en fasse pas partie.
Voil la raison qui nous oblige passer par une variable boolenne , un
drapeau qui peut se lever, mais jamais se rabaisser. Et cette technique
de flag (que nous pourrions lgamment surnommer gestion asymtrique de
variable boolenne ) doit tre mise en uvre chaque fois que lon se trouve
devant pareille situation.
Autrement dit, connatre ce type de raisonnement est indispensable, et savoir
le reproduire bon escient ne l'est pas moins.
3. TRI
DE TABLEAU
FLAG
TRI A BULLES
TantQue Yapermute
FinTantQue
Fin
Que va-t-on faire lintrieur de la boucle ? Prendre les lments du tableau,
du premier jusqu lavant-dernier, et procder un change si ncessaire. Cest
parti :
Variable Yapermute en Boolen
Dbut
TantQue Yapermute
Pour i 0 10
Si t(i) > t(i+1) Alors
temp t(i)
t(i) t(i+1)
t(i+1) temp
Finsi
i suivant
Fin
Mais il ne faut pas oublier un dtail capital : la gestion de notre flag. Lide,
cest que cette variable va nous signaler le fait quil y a eu au moins une
permutation effectue. Il faut donc :
(il suffit quil y en ait eu une seule pour quon doive tout recommencer
encore une fois).
Yapermut Vrai
TantQue Yapermut
Yapermut Faux
Pour i 0 10
Si t(i) > t(i+1) alors
temp t(i)
t(i) t(i+1)
t(i+1) temp
Yapermut Vrai
Finsi
i suivant
FinTantQue
Fin
Au risque de me rpter, la comprhension et la matrise du principe du flag
font partie de larsenal du programmeur bien arm.
4. LA
RECHERCHE DICHOTOMIQUE
etc.
Exercice 7.1
Exercice 7.2
Exercice 7.3
Exercice 7.4
Exercice 7.5
TABLEAUX
PARTIE 8
MULTIDIMENSIONNELS
B.F.
Skinner
Ceci nest pas un drglement de votre tlviseur. Nous contrlons tout, nous
savons tout, et les phnomnes paranormaux que vous constatez sont dus au fait
que vous tes passs dans la quatrime dimension (musique angoissante :
tintintin ).
Oui, enfin bon, avant dattaquer la quatrime, on va dj se coltiner la
deuxime.
1. POURQUOI
PLUSIEURS DIMENSIONS
C'tait
2.
pour
voir
si
vous
suiviez.
A DEUX DIMENSIONS
ESSENTIELLE
Exercice 8.1
Exercice 8.2
Exercice 8.3
Exercice 8.4
Exercice 8.5
Exercice 8.6
Exercice 8.7
A N DIMENSIONS
Si vous avez compris le principe des tableaux deux dimensions, sur le fond, il
ny a aucun problme passer au maniement de tableaux trois, quatre, ou
pourquoi pas neuf dimensions. Cest exactement la mme chose. Si je dclare un
tableau Titi(2, 4, 3, 3), il sagit dun espace mmoire contenant 3 x 5 x 4 x 4 =
240 valeurs. Chaque valeur y est repre par quatre coordonnes.
Le principal obstacle au maniement systmatique de ces tableaux plus de
trois dimensions est que le programmeur, quand il conoit son algorithme, aime
bien faire des petits gribouillis, des dessins immondes, imaginer les boucles dans
sa tte, etc. Or, autant il est facile dimaginer concrtement un tableau une
dimension, autant cela reste faisable pour deux dimensions, autant cela devient
lapanage dune minorit privilgie pour les tableaux trois dimensions (je nen
fais malheureusement pas partie) et hors de porte de tout mortel au-del. Cest
comme a, lesprit humain a du mal se reprsenter les choses dans lespace, et
crie grce ds quil saute dans lhyperespace (oui, cest comme a que a sappelle
au del de trois dimensions).
Donc, pour des raisons uniquement pratiques, les tableaux plus de trois
dimensions sont rarement utiliss par des programmeurs non matheux (car les
matheux, de par leur formation, ont une fcheuse propension manier des
espaces n dimensions comme qui rigole, mais ce sont bien les seuls, et laissons
les dans leur coin, cest pas des gens comme nous).
LES
PARTIE 9
FONCTIONS PREDEFINIES
Anonyme
1. STRUCTURE
arguments doivent tre dun certain type, et quil faut respecter ces
types.
Et d'entre, nous trouvons :
LE
Il
GAG
consiste
DE
affecter
une
LA
fonction,
JOURNEE
quelle
qu'elle
soit.
fautes
algorithmiques,
et
punie
Tavernier...
Exercice 9.1
FONCTIONS DE TEXTE
comme
telle.
Une catgorie privilgie de fonctions est celle qui nous permet de manipuler
des chanes de caractres. Nous avons dj vu quon pouvait facilement coller
deux chanes lune lautre avec loprateur de concatnation &. Mais ce que nous
ne pouvions pas faire, et qui va tre maintenant possible, cest pratiquer des
extractions de chanes (moins douloureuses, il faut le noter, que les extractions
dentaires).
Tous les langages, je dis bien tous, proposent peu ou prou les fonctions
suivantes, mme si le nom et la syntaxe peuvent varier dun langage lautre :
chane.
chane
vaut
vaut
16
Mid("Zorro is back", 4, 7)
vaut
"ro is b"
vaut
"c"
Left("Et pourtant", 8)
vaut
"Et pourt"
Right("Et pourtant", 4)
vaut
"t"
vaut
vaut
Il existe aussi dans tous les langages une fonction qui renvoie le caractre
correspondant un code Ascii donn (fonction Asc), et Lyce de Versailles
(fonction Chr) :
Asc("N")
vaut
78
Chr(63)
vaut
"?"
Exercice 9.2
Exercice 9.3
Exercice 9.4
Exercice 9.5
Exercice 9.6
Partie Entire
Une fonction extrmement rpandue est celle qui permet de rcuprer la
partie entire dun nombre :
Aprs : A Ent(3,228)
A vaut 3
Modulo
Cette fonction permet de rcuprer le reste de la division dun nombre par un
deuxime nombre. Par exemple :
A Mod(10,3)
B Mod(12,2)
C Mod(44,8)
Cette fonction peut paratre un peu bizarre, est rserve aux seuls matheux.
Mais vous aurez l aussi loccasion de voir dans les exercices venir que ce nest
pas le cas.
Mais il ny a pas que les jeux qui ont besoin de gnrer des nombres alatoires.
La modlisation (physique, gographique, conomique, etc.) a parfois recours
des modles dits stochastiques (chouette, encore un nouveau mot savant !). Ce
sont des modles dans lesquels les variables se dduisent les unes des autres par
des relations dterministes (autrement dit des calculs), mais o lon simule la
part dincertitude par une fourchette de hasard.
Par exemple, un modle dmographique supposera quune femme a en moyenne
x enfants au cours de sa vie, mettons 1,5. Mais il supposera aussi que sur une
population donne, ce chiffre peut fluctuer entre 1,35 et 1,65 (si on laisse une
part dincertitude de 10%). Chaque anne, cest--dire chaque srie de calcul des
valeurs du modle, on aura ainsi besoin de faire choisir la machine un nombre au
hasard compris entre 1,35 et 1,65.
Dans tous les langages, cette fonction existe et produit le rsultat suivant :
Aprs : Toto Alea()
On a :
En fait, on se rend compte avec un tout petit peu de pratique que cette
fonction Ala peut nous servir pour gnrer nimporte quel nombre compris dans
nimporte quelle fourchette. Je sais bien que mes lecteurs ne sont gure
matheux, mais l, on reste franchement en de du niveau de feu le BEPC :
Exercice 9.7
Exercice 9.8
Exercice 9.9
Exercice 9.10
Exercice 9.11
FONCTIONS DE CONVERSION
1. ORGANISATION
DES FICHIERS
Vous connaissez tous le coup des papous : chez les papous, il y a les papous
papas et les papous pas papas. Chez les papous papas, il y a les papous papas
poux et les papous papas pas poux, etc. Eh bien les fichiers, c'est un peu
pareil : il y a des catgories, et dans les catgories, des sortes, et dans les
sortes des espces. Essayons donc de dbroussailler un peu tout cela...
Un premier grand critre, qui diffrencie les deux grandes catgories de
fichiers, est le suivant : le fichier est-il ou non organis sous forme de lignes
successives ? Si oui, cela signifie vraisemblablement que ce fichier contient le
mme genre d'information chaque ligne. Ces lignes sont alors appeles des
enregistrements.
Afin d'illuminer ces propos obscurs, prenons le cas classique, celui d'un carnet
d'adresses. Le fichier est destin mmoriser les coordonnes (ce sont toujours
les plus mal chausses, bien sr) d'un certain nombre de personnes. Pour
chacune, il faudra noter le nom, le prnom, le numro de tlphone et l'email.
Dans ce cas, il peut paratre plus simple de stocker une personne par ligne du
fichier (par enregistrement). Dit autrement, quand on prendra une ligne, on sera
les
fichiers
qui
ne
possdent
pas
de
structure
de
lignes
(d'enregistrement). Les octets, quels qu'il soient, sont crits la queue leu leu.
Ces fichiers sont appels des fichiers binaires. Naturellement, leur structure
diffrente implique un traitement diffrent par le programmeur. Tous les
fichiers qui ne codent pas une base de donnes sont obligatoirement des fichiers
binaires : cela concerne par exemple un fichier son, une image, un programme
excutable, etc. . Toutefois, on en dira quelques mots un peu plus loin, il est
toujours possible d'opter pour une structure binaire mme dans le cas o le
fichier reprsente une base de donnes.
Autre diffrence majeure entre fichiers texte et fichiers binaires : dans un
fichier texte, toutes les donnes sont crites sous forme de... texte (tonnant,
non ?). Cela veut dire que les nombres y sont reprsents sous forme de suite de
chiffres (des chanes de caractres). Ces nombres doivent donc tre convertis
en chanes lors de l'criture dans le fichier. Inversement, lors de la lecture du
fichier, on devra convertir ces chanes en nombre si l'on veut pouvoir les
utiliser dans des calculs. En revanche, dans les fichiers binaires, les donnes sont
crites l'image exact de leur codage en mmoire vive, ce qui pargne toutes
ces oprations de conversion.
Ceci a comme autre implication qu'un fichier texte est directement lisible,
alors qu'un fichier binaire ne l'est pas(sauf bien sr en crivant soi-mme un
programme appropri). Si l'on ouvre un fichier texte via un diteur de textes,
comme le bloc-notes de Windows, on y reconnatra toutes les informations (ce
sont des caractres, stocks comme tels). La mme chose avec un fichier binaire
ne nous produit l'cran qu'un galimatias de scribouillis incomprhensibles.
DES ENREGISTREMENTS
Structure n2
Fonfec
Sophie
Ztofrais
Mlanie
Herbien
Jean-Philippe
Hergbel
Octave
0142156487fonfec@yahoo.fr
0456912347ztofrais@free.fr
0289765194vantard@free.fr
0149875231rg@aol.fr
le fichier est un vrai gruyre plein de trous. Mais dun autre ct, la
rcupration des diffrents champs est trs rapide. Lorsquon rcupre
une ligne, il suffit de la dcouper en diffrentes chanes de longueur
prdfinie, et le tour est jou.
quon vient de lire. On ne peut donc accder une information qu'en ayant
au pralable examin celle qui la prcde. Dans le cas d'un fichier texte,
cela signifie qu'on lit le fichier ligne par ligne (enregistrement par
enregistrement).
lenregistrement
de
son
choix,
en
prcisant
le
numro
de
cet
enregistrement. Mais cela veut souvent dire une gestion fastidieuse des
dplacements dans le fichier.
On les utilise
stocker...
pour
voici
un petit tableau
Fichiers Texte
Fichiers Binaires
lignes (enregistrements)
rcapitulatif
au choix, avec un
sparateur ou en champs
de largeur fixe
Lisibilit
Lecture du fichier
Si lon veut travailler sur un fichier, la premire chose faire est de louvrir.
Cela se fait en attribuant au fichier un numro de canal. On ne peut ouvrir quun
seul fichier par canal, mais quel que soit le langage, on dispose toujours de
plusieurs canaux, donc pas de soucis.
Limportant est que lorsquon ouvre un fichier, on stipule ce quon va en faire :
lire, crire ou ajouter.
toutes les informations que lon veut. Mais les informations prcdentes, si
elles existent, seront intgralement crases Et on ne pourra pas accder
aux informations qui existaient prcdemment.
LireFichier
rcupre
donc
dans
la
variable
spcifie
lenregistrement suivant dans le fichier... "suivant", oui, mais par rapport quoi ?
Par rapport au dernier enregistrement lu. Cest en cela que le fichier est dit
squentiel. En loccurrence, on rcupre donc la premire ligne, donc, le premier
FinTantQue
Fermer 5
Fin
Et neuf fois sur dix galement, si lon veut stocker au fur et mesure en
mmoire vive les informations lues dans le fichier, on a recours un ou plusieurs
tableaux. Et comme on ne sait pas davance combien il y aurait denregistrements
dans le fichier, on ne sait pas davantage combien il doit y avoir demplacements
dans les tableaux. Quimporte, les programmeurs avertis que vous tes
connaissent la combine des tableaux dynamiques.
Et pour finir, une fois quon en a termin avec un fichier, il ne faut pas oublier
de fermer ce fichier. On libre ainsi le canal quil occupait (et accessoirement, on
pourra utiliser ce canal dans la suite du programme pour un autre fichier ou
pour le mme).
Exercice 10.1
Exercice 10.2
Exercice 10.3
DE TRAITEMENT
modifier directement (ou presque) les informations sur le disque dur. Cest
parfois un peu acrobatique, lorsquon veut supprimer un lment dun
fichier : on programme alors une boucle avec un test, qui recopie dans un
deuxime fichier tous les lments du premier fichier sauf un ; et il faut
ensuite recopier intgralement le deuxime fichier la place du premier
fichier Ouf.
la rapidit : les accs en mmoire vive sont des milliers de fois plus
rapides
(nanosecondes)
que
les
accs
aux
mmoires
de
masse
de recopie du fichier dans le tableau, pour peu quon doive tripoter les
informations dans tous les sens, cest largement plus facile de faire cela
avec un tableau quavec des fichiers.
Pourquoi, alors, demanderez-vous haletants, ne fait-on pas cela tous les
coups ? Y a-t-il des cas o il vaut mieux en rester aux fichiers et ne pas passer
par des tableaux ?
La recopie dun trs gros fichier en mmoire vive exige des ressources qui
peuvent atteindre des dimensions considrables. Donc, dans le cas d'immenses
fichiers (trs rares, cependant), cette recopie en mmoire peut s'avrer
problmatique.
Toutefois, lorsque le fichier contient des donnes de type non homognes
(chanes, numriques, etc.) cela risque dtre coton pour le stocker dans un
tableau unique : il va falloir dclarer plusieurs tableaux, dont le maniement au
final peut tre aussi lourd que celui des fichiers de dpart.
A moins... d'utiliser une ruse : crer des types de variables personnaliss,
composs dun collage de plusieurs types existants (10 caractres, puis un
numrique, puis 15 caractres, etc.). Ce type de variable s'appelle un type
structur. Cette technique, bien quelle ne soit pas vraiment difficile, exige tout
de mme une certaine aisance... Voil pourquoi on va maintenant en dire quelques
mots.
6. DONNEES
STRUCTUREES
que nous voulons crer un nouveau type de variable (par assemblage de types
existants), il va falloir faire deux choses : d'abord, crer le type. Ensuite
seulement, dclarer la (les) variable(s) d'aprs ce type.
Reprenons une fois de plus l'exemple du carnet d'adresses. Je sais, c'est un
peu comme mes blagues, a lasse (l, pour ceux qui s'endorment, je signale qu'il y
a un jeu de mots), mais c'est encore le meilleur moyen d'avoir un point de
comparaison.
Nous allons donc, avant mme la dclaration des variables, crer un type, une
structure, calque sur celle de nos enregistrements, et donc prte les
accueillir :
Structure Bottin
Nom en Caractre * 20
Prnom en Caractre * 15
Tel en Caractre * 10
Mail en Caractre * 20
Fin Structure
Ici, Bottin est le nom de ma structure. Ce mot jouera par la suite dans mon
programme exactement le mme rle que les types prdfinis comme Numrique,
Caractre ou Boolen. Maintenant que la structure est dfinie, je vais pouvoir,
dans la section du programme o s'effectuent les dclarations, crer une ou des
variables correspondant cette structure :
Variable Individu en Bottin
Et si cela me chantait, je pourrais remplir les diffrentes informations
contenues au sein de la variable Individu de la manire suivante :
Individu "Joker", "Midnight", "0348946532", "allstars@rock.com"
variable
Individu
correspond
parfaitement
la
structure
des
REMARQUE
FINALE
SUR
LES
DONNES
STRUCTURES
sous
la
forme
de
telles
structures.
ou
mme
inutile.
des
donnes
devient
fondamental.
7. RECAPITULATIF
GENERAL
Lorsqu'on est amen travailler avec des donnes situes dans un fichier,
plusieurs choix, en partie indpendants les uns des autres, doivent tre faits :
squentiel)
Exercice 10.4
Exercice 10.5
Exercice 10.6
Exercice 10.7
Exercice 10.8
Exercice 10.9
REMARQUE
N1
N1bis
compose
uniquement
de
types
caractres.
Une
N2
la
structure.
Nous avons postul ici que cette interdiction n'existait pas ; en tenir
PARTIE 11
PROCEDURES ET FONCTIONS
miracle
1. FONCTIONS
Anonyme
PERSONNALISEES
...
...
Ecrire "Etes-vous mari ?"
Rep1 RepOuiNon()
...
Ecrire "Avez-vous des enfants ?"
Rep2 RepOuiNon()
...
Et le tour est jou ! On a ainsi vit les rptitions inutiles, et si d'aventure, il
y avait un bug dans notre contrle de saisie, il suffirait de faire une seule
correction dans la fonction RepOuiNon pour que ce bug soit limin de toute
l'application. Elle n'est pas belle, la vie ?
Toutefois, les plus sagaces d'entre vous auront remarqu, tant dans le titre
de la fonction que dans chacun des appels, la prsence de parenthses. Celles-ci,
ds qu'on dclare ou qu'on appelle une fonction, sont obligatoires. Et si vous avez
bien compris tout ce qui prcde, vous devez avoir une petite ide de ce qu'on va
pouvoir mettre dedans...
Eh bien, quitte construire nos propres fonctions, nous pouvons donc construire
nos propres arguments. Voil comment laffaire se prsente...
La fonction sera dornavant dclare comme suit :
Fonction RepOuiNon(Msg en Caractre) en Caractre
Ecrire Msg
Truc ""
TantQue Truc <> "Oui" et Truc <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Truc
FinTantQue
Renvoyer Truc
Fin Fonction
Il y a donc maintenant entre les parenthses une variable, Msg, dont on
prcise le type, et qui signale la fonction quun argument doit lui tre envoy
chaque appel. Quant ces appels, justement, ils se simplifieront encore dans la
procdure principale, pour devenir :
...
Rep1 RepOuiNon("Etes-vous mari ?")
...
Rep2 RepOuiNon("Avez-vous des enfants ?")
...
Et voil le travail.
Une remarque importante : l, on n'a pass quun seul argument en entre.
Mais bien entendu, on peut en passer autant quon veut, et crer des fonctions
avec deux, trois, quatre, etc. arguments ; Simplement, il faut viter d'tre
gourmands, et il suffit de passer ce dont on en a besoin, ni plus, ni moins !
Dans le cas que l'on vient de voir, le passage d'un argument la fonction tait
lgant, mais pas indispensable. La preuve, cela marchait dj trs bien avec la
premire version. Mais on peut imaginer des situations o il faut absolument
concevoir la fonction de sorte qu'on doive lui transmettre un certain nombre
d'arguments si l'on veut qu'elle puisse remplir sa tche. Prenons, par exemple,
toutes les fonctions qui vont effectuer des calculs. Que ceux-ci soient simples
ou compliqus, il va bien falloir envoyer la fonction les valeurs grce auxquelles
elle sera cens produire son rsultat (pensez tout btement une fonction sur le
modle d'Excel, telle que celle qui doit calculer une somme ou une moyenne).
C'est galement vrai des fonctions qui traiteront des chanes de caractres.
Bref, dans 99% des cas, lorsqu'on crera une fonction, celle-ci devra comporter
des arguments.
temps,
on
dcoupe
le
traitement
en
modules
(algorithmique
Exercice 11.1
Exercice 11.2
Exercice 11.3
2.1 Gnralits
Les fonctions, c'est bien, mais dans certains cas, a ne nous rend gure
service.
Il peut en effet arriver que dans un programme, on ait raliser des tches
rptitives, mais que ces tches n'aient pas pour rle de gnrer une valeur
particulire, ou qu'elles aient pour rle d'en gnrer plus d'une la fois. Vous ne
voyez pas de quoi je veux parler ? Prenons deux exemples.
Premier exemple. Imaginons qu'au cours de mon application, j'aie plusieurs
fois besoin d'effacer l'cran et de rafficher un bidule comme un petit logo en
haut gauche. On pourrait se dire qu'il faut crer une fonction pour faire cela.
Mais quelle serait la valeur renvoye par la fonction ? Aucune ! Effacer l'cran,
ce n'est pas produire un rsultat stockable dans une variable, et afficher un logo
non plus. Voil donc une situation ou j'ai besoin de rpter du code, mais o ce
code n'a pas comme rle de produire une valeur.
Deuxime exemple. Au cours de mon application, je dois plusieurs fois faire
saisir un tableau d'entiers (mais chaque fois, un tableau diffrent). L encore,
on serait tent d'effectuer toutes ces saisies de tableaux dans une seule
fonction. Mais problme, une fonction ne peut renvoyer qu'une seule valeur la
fois. Elle ne peut donc renvoyer un tableau, qui est une srie de valeurs
distinctes.
Alors, dans ces deux cas, faute de pouvoir traiter l'affaire par une fonction,
devra-t-on en rester au code rptitif dont nous venons de dnoncer si
vigoureusement les faiblesses ? Mmmmmh ? Vous vous doutez bien que non.
Heureusement, tout est prvu, il y a une solution. Et celle-ci consiste utiliser
des sous-procdures.
En fait, les fonctions - que nous avons vues - ne sont finalement qu'un cas
particulier des sous-procdures - que nous allons voir : celui o doit tre
renvoy vers la procdure appelante une valeur et une seule. Dans tous les
autres cas (celui o on ne renvoie aucune valeur, comme celui ou en en renvoie
plusieurs), il faut donc avoir recours non la forme particulire et simplifie (la
fonction), mais la forme gnrale (la sous-procdure).
Parlons donc de ce qui est commun aux sous-procdures et aux fonctions, mais
aussi de ce qui les diffrencie. Voici comment se prsente une sous-procdure :
Procdure Bidule( ... )
...
Fin Procdure
Dans la procdure principale, lappel la sous-procdure Bidule devient quant
lui :
Appeler Bidule(...)
tablissons un premier tat des lieux.
Procdure ... Fin Procdure. Oui, je sais, c'est un peu trivial comme
remarque, mais, bon, on ne sait jamais.
Mme une fois qu'on a bien compris les trois premiers points, on
l'instruction
"renvoyer").
Ces rsultats
que
la
sous-procdure
doit
transmettre la procdure appelante devront donc eux aussi tre vhiculs par
des paramtres. Mais cette fois, il s'agira de paramtres fonctionnant dans
l'autre sens (du sous-traitant vers le donneur d'ordres) : on les appellera donc
des paramtres en sortie.
Ceci nous permet de reformuler en d'autres termes la vrit fondamentale
apprise un peu plus haut : toute sous-procdure possdant un et un seul
paramtre en sortie peut galement tre crite sous forme d'une fonction
(et entre nous, c'est une formulation prfrable car un peu plus facile
comprendre et donc retenir).
Jusque l, a va ? Si oui, prenez un cachet d'aspirine et poursuivez la lecture.
Si non, prenez un cachet d'aspirine et recommencez depuis le dbut. Et dans les
deux cas, n'oubliez pas le grand verre d'eau pour faire passer l'aspirine.
Il nous reste un dtail examiner, dtail qui comme vous vous en doutez bien,
a une certaine importance : comment fait-on pour faire comprendre un langage
quels sont les paramtres qui doivent fonctionner en entre et quels sont ceux
qui doivent fonctionner en sortie...
mmes n'ont cure de mes dsirs, et ce n'est pas cette classification qu'ils
adoptent. C'est toute la diffrence entre dire qu'une prise lectrique sert
brancher un rasoir ou une cafetire (ce qui caractrise son rle), et dire qu'elle
est en 220 V ou en 110 V (ce qui caractrise son type technique, et qui est
l'information qui intresse l'lectricien). A l'image des lectriciens, les langages
se contrefichent de savoir quel sera le rle (entre ou sortie) d'un paramtre.
Ce qu'ils exigent, c'est de connatre leur voltage... pardon, le mode de passage
de ces paramtres. Il n'en existe que deux :
pouvons
utilisation
entre
rsumer
en
utilisation en sortie
tout
cela
par
un
petit
passage par
rfrence
oui
oui
non
oui
tableau
PUBLIQUES ET PRIVEES
Rsumons la situation. Nous venons de voir que nous pouvions dcouper un long
traitement comportant ventuellement des redondances (notre application) en
diffrents modules. Et nous avons vu que les informations pouvaient tre
transmises entre ces modules selon deux modes :
doivent tre employes avec nos clbres amis italo-armniens, c'est-dire avec parcimonie et bon escient.
2.
rsultat unique, et des sous-procdures dans tous les autres cas (ce qui
implique de ne jamais passer un paramtre par rfrence une fonction :
soit on n'en a pas besoin, soit on en a besoin, et ce n'est alors plus une
fonction).
Respecter ces rgles d'hygine est indispensable si l'on veut qu'une
application ressemble autre chose qu'au palais du facteur Cheval. Car une
architecture laquelle on ne comprend rien, c'est sans doute trs potique, mais
il y a des circonstances o l'efficacit est prfrable la posie. Et, pour ceux
qui en douteraient encore, la programmation informatique fait (hlas ?) partie de
ces circonstances.
5. ALGORITHMES
FONCTIONNELS
fonctionnel
de
lapplication
est
le
dcoupage
et/ou
la
particulirement dou, mieux vaut respecter le canevas qui suit, car les
difficults se rsolvent mieux quand on les saucissonne
bout de sa tche ?
une liste de mots (si lon veut viter que le programme ne propose
le mot deviner
et enfin, last but not least, lensemble des lettres dj trouves par
certaines
informations, la question va tre vite rgle, pour dautres, il va falloir faire des
choix (et si possible, des choix intelligents !). Cest parti, mon kiki :
information simple de type chane, qui pourra tre stock dans une
variable appele mot, de type caractre.
simple de type chane, qui sera stocke dans une variable appele lettre,
de type caractre.
pourra tre stocke dans une variable numrique de type entier simple
appele MovRep.
Type
Description
Dico.txt
Fichier texte
Mot
Caractre
Mot deviner
Lettre
Caractre
Lettre propose
MovRep
Entier
Verif()
Tableau de Boolens
Propos
Caractre
Fonction ChoixDuMot
Fonction PartieFinie
Procdure AffichageMot
Procdure SaisieLettre
Procdure VrifLettre
Procdure Epilogue
Procdure Principale
PARTIE 12
NOTIONS COMPLEMENTAIRES
Une fois nest pas coutume, ce chapitre ne sera lobjet daucun exercice. Cela
ne veut pas dire pour autant que ce qui sy trouve nest pas intressant.
Non mais des fois.
1. PROGRAMMATION
STRUCTUREE
Petit retour sur une notion trs rapidement survole plus haut : celle de
programmation structure . En fait, nous avons jusqu prsent, tels Monsieur
Jourdain, fait de la programmation structure sans le savoir. Aussi, plutt
quexpliquer longuement en quoi cela consiste, je prfre prendre le problme
par l'autre bout : en quoi cela ne consiste pas.
Dans certains langages (historiquement, ce sont souvent des langages anciens),
les lignes de programmation portent des numros. Et les lignes sont excutes
par la machine dans lordre de ces numros. Jusquici, en soi, pas de problme.
Mais lastuce est que tous ces langages, il existe une instruction de branchement,
note aller en pseudo-code, instruction qui envoie directement le programme
la ligne spcifie. Inversement, ce type de langage ne comporte pas
dinstructions comme FinTantQue, ou FinSi, qui ferment un bloc.
ET COMPILATION
En fait, si lalgorithme est bien crit, sans faute logique, ltape suivante ne
doit normalement poser aucun problme conceptuel. Il n'y a plus qu' effectuer
une simple traduction.
pourquoi
tout
langage,
partir
dun
programme
crit,
doit
LOGIQUE VICELARDE
LA PROGRAMMATION RECURSIVE
Vous savez comment sont les informaticiens : on ne peut pas leur donner quoi
que ce soit sans quils essayent de jouer avec, et le pire, cest quils y russissent.
La programmation des fonctions personnalises a donn lieu l'essor dune
logique un peu particulire, adapte en particulier au traitement de certains
problmes mathmatiques (ou de jeux) : la programmation rcursive. Pour vous
expliquer de quoi il retourne, nous allons reprendre un exemple cher vos
curs : le calcul dune factorielle (l, je sentais que jallais encore me faire des
copains).
Rappelez-vous : la formule de calcul de la factorielle dun nombre n scrit :
N!=1x2x3xxn
Nous avions programm cela aussi sec avec une boucle Pour, et roule Raoul.
Mais une autre manire de voir les choses, ni plus juste, ni moins juste, serait de
dire que quel que soit le nombre n :
n ! = n x (n-1) !
En bon franais : la factorielle dun nombre, cest ce nombre multipli par la
factorielle du nombre prcdent. Encore une fois, cest une manire ni plus juste
ni moins juste de prsenter les choses ; cest simplement une manire
diffrente.
Si lon doit programmer cela, on peut alors imaginer une fonction Fact, charge
de calculer la factorielle. Cette fonction effectue la multiplication du nombre
pass en argument par la factorielle du nombre prcdent. Et cette factorielle
du nombre prcdent va bien entendu tre elle-mme calcule par la fonction
Fact.
Autrement dit, on va crer une fonction qui pour fournir son rsultat, va
sappeler elle-mme un certain nombre de fois. Cest cela, la rcursivit.
Toutefois, il nous manque une chose pour finir : quand ces auto-appels de la
fonction Fact vont-ils sarrter ? Cela naura-t-il donc jamais de fin ? Si, bien
sr, rassure-toi, public, la rcursivit, ce nest pas Les Feux de LAmour. On
sarrte quand on arrive au nombre 1, pour lequel la factorielle est par dfinition
1.
Cela produit lcriture suivante, un peu dconcertante certes, mais parfois
trs pratique :
Fonction Fact (N en Numrique)
Si N = 0 alors
Renvoyer 1
Sinon
Renvoyer Fact(N-1) * N
Finsi
Fin Fonction
Vous remarquerez que le processus rcursif remplace en quelque sorte la
boucle, cest--dire un processus itratif. Et en plus, avec tous ces nouveaux
mots qui riment, vous allez pouvoir crire de trs chouettes pomes. Vous
remarquerez aussi quon traite le problme lenvers : on part du nombre, et on
remonte rebours jusqu 1 pour pouvoir calculer la factorielle. Cet effet de
rebours est caractristique de la programmation rcursive.
Pour conclure sur la rcursivit, trois remarques fondamentales.
Last but not least, et cest le gag final, tout problme formul en
(5 et 6).
roll, c'est mieux ! Visitez le site des Midnight Jokers, le groupe dans
lequel j'ai le bonheur de svir. Vous y trouverez dates de concerts,
morceaux en tlchargement, photos, videos, and more and more !
cours, propose cet expos riche et pdagogique. Peut tre un peu difficile
d'accs pour les vrais dbutants, surtout s'ils ne sont pas matheux.
aspirateur,
ou
faites
une
petite
srie
de
"Enregistrer
sous".
alors
mon
bonheur
sera
complet.
N'y aurait-il pas une erreur dans le corrig de tel ou tel exercice ?
C'est
franchement
bien
possible.
Malgr
d'innombrables
relectures
trouvez
une
erreur,
n'hsitez
pas
me
la
signaler
De deux choses l'une. Ou bien j'y ai pens, mais j'ai choisi, pour une raison ou
pour une autre, de laisser cet aspect de ct. Ou bien je n'y ai pas pens, et la
rflexion, c'est dommage de ne pas l'avoir trait. Pour en avoir le coeur net,
envoyez-moi
un
pour
me
poser
la
question.
Ca
leur
fait
tellement
plaisir...