Beruflich Dokumente
Kultur Dokumente
Début
…
PARTIE 3
Alors
Ecrire "Le produit est positif"
Sinon
Ecrire "Le produit est négatif"
Finsi
Exercice 3.1
Variable n en Entier Fin
Début Si on souhaite simplifier l’écriture de la condition
Ecrire "Entrez un nombre : " lourde du SinonSi, on peut toujours passer par des
Lire n variables booléennes intermédiaires. Une astuce de
Si n > 0 Alors sioux consiste également à employer un Xor (c'est l'un
Ecrire "Ce nombre est positif”
des rares cas dans lesquels il est pertinent)
Sinon
Exercice 3.6
Ecrire "Ce nombre est négatif" Variable age en Entier
Finsi Début
Fin Ecrire "Entrez l’âge de l’enfant : "
Exercice 3.2 Lire age
Variables m, n en Entier
Si age >= 12 Alors
Début
Ecrire "Catégorie Cadet"
Ecrire "Entrez deux nombres : "
SinonSi age >= 10 Alors
Lire m, n
Ecrire "Catégorie Minime"
Si (m > 0 ET n > 0) OU (m < 0 ET n < 0)
SinonSi age >= 8 Alors
Alors
Ecrire "Catégorie Pupille"
Ecrire "Leur produit est positif"
SinonSi age >= 6 Alors
Sinon
Ecrire "Catégorie Poussin"
Ecrire "Leur produit est négatif"
Finsi
Finsi
Fin
Fin
On peut évidemment écrire cet algorithme de
Exercice 3.3
Variables a, b, c en Caractère différentes façons, ne serait-ce qu’en commençant
Début par la catégorie la plus jeune.
Ecrire "Entrez successivement trois noms : "
Lire a, b, c PARTIE 4
Si a < b ET b < c Alors
Ecrire "Ces noms sont classés
alphabétiquement" Exercice 4.1
Sinon Aucune difficulté, il suffit d’appliquer la règle de la
Ecrire "Ces noms ne sont pas classés" transformation du OU en ET vue en cours (loi de
Finsi Morgan). Attention toutefois à la rigueur dans la
Fin transformation des conditions en leur contraire...
Exercice 3.4 Si Tutu <= Toto + 4 ET Tata <> "OK" Alors
Variable n en Entier Tutu ← Tutu - 1
Début Sinon
Ecrire "Entrez un nombre : " Tutu ← Tutu + 1
Lire n Finsi
Si n < 0 Alors
Exercice 4.2
Ecrire "Ce nombre est négatif" Variables h, m en Numérique
SinonSi n = 0 Alors Début
Ecrire "Ce nombre est nul" Ecrire "Entrez les heures, puis les minutes
Sinon : "
Ecrire "Ce nombre est positif" Lire h, m
Finsi m ← m + 1
Fin Si m = 60 Alors
m ← 0
h ← h + 1 Exercice 4.6
FinSi Cet exercice, du pur point de vue algorithmique, n'est
Si h = 24 Alors pas très méchant. En revanche, il représente
h ← 0 dignement la catégorie des énoncés piégés.
FinSi
En effet, rien de plus facile que d'écrire : si le
Ecrire "Dans une minute il sera ", h,
candidat a plus de 50%, il est élu, sinon s'il a plus de
"heure(s) ", m, "minute(s)"
12,5 %, il est au deuxième tour, sinon il est éliminé.
Fin
Hé hé hé... mais il ne faut pas oublier que le candidat
Exercice 4.3
Variables h, m, s en Numérique peut très bien avoir eu 20 % mais être tout de même
Début éliminé, tout simplement parce que l'un des autres a
Ecrire "Entrez les heures, puis les minutes, fait plus de 50 % et donc qu'il n'y a pas de deuxième
puis les secondes : " tour !...
Lire h, m, s Moralité : ne jamais se jeter sur la programmation
s ← s + 1
avant d'avoir soigneusement mené l'analyse du
Si s = 60 Alors
problème à traiter.
s ← 0
Variables A, B, C, D en Numérique
m ← m + 1
Début
FinSi
Ecrire "Entrez les scores des quatre
Si m = 60 Alors
prétendants :"
m ← 0
Lire A, B, C, D
h ← h + 1
C1 ← A > 50
FinSi
C2 ← B > 50 ou C > 50 ou D > 50
Si h = 24 Alors
C3 ← A >= B et A >= C et A >= D
h ← 0
C4 ← A >= 12,5
FinSi
Si C1 Alors
Ecrire "Dans une seconde il sera ", h, "h",
Ecrire “Elu au premier tour"
m, "m et ", s, "s"
Sinonsi C2 ou Non(C4) Alors
Fin
Ecrire “Battu, éliminé, sorti !!!”
Exercice 4.4 SinonSi C3 Alors
Variables n, p en Numérique
Ecrire "Ballotage favorable"
Début
Sinon
Ecrire "Nombre de photocopies : "
Ecrire "Ballotage défavorable"
Lire n
FinSi
Si n <= 10 Alors
Fin
p ← n * 0,1
SinonSi n <= 30 Alors
p ← 10 * 0,1 + (n – 10) * 0,09 Exercice 4.7
Sinon Là encore, on illustre l'utilité d'une bonne analyse. Je
p ← 10 * 0,1 + 20 * 0,09 + (n – 30) * 0,08 propose deux corrigés différents. Le premier suit
FinSi l'énoncé pas à pas. C'est juste, mais c'est vraiment
Ecrire "Le prix total est: ", p lourd. La deuxième version s'appuie sur une vraie
Fin compréhension d'une situation pas si embrouillée
Exercice 4.5 qu'elle n'en a l'air.
Variable sex en Caractère
Dans les deux cas, un recours aux variables
Variable age en Numérique
booléennes aère sérieusement l'écriture.
Variables C1, C2 en Booléen
Début
Donc, premier corrigé, on suit le texte de l'énoncé
Ecrire "Entrez le sexe (M/F) : " pas à pas :
Lire sex Variables age, perm, acc, assur en Numérique
Ecrire "Entrez l’âge: " Variables C1, C2, C3 en Booléen
Lire age Variable situ en Caractère
C1 ← sex = "M" ET age > 20 Début
C2 ← sex = "F" ET (age > 18 ET age < 35) Ecrire "Entrez l’âge: "
Si C1 ou C2 Alors Lire age
Ecrire "Imposable" Ecrire "Entrez le nombre d'années de permis:
Sinon "
Ecrire "Non Imposable" Lire perm
FinSi Ecrire "Entrez le nombre d'accidents: "
Fin Lire acc
Ecrire "Entrez le nombre d'années
d'assurance: " FinSi
Lire assur Si P = -1 Alors
C1 ← age >= 25 situ ← "Bleu"
C2 ← perm >= 2 SinonSi P = 0 Alors
C3 ← assur > 1 situ ← "Vert"
Si Non(C1) et Non(C2) Alors SinonSi P = 1 Alors
Si acc = 0 Alors situ ← "Orange"
situ ← "Rouge" SinonSi P = 2 Alors
Sinon situ ← "Rouge"
situ ← "Refusé" Sinon
FinSi situ ← "Refusé"
Sinonsi ((Non(C1) et C2) ou (C1 et Non(C2)) FinSi
Alors Ecrire "Votre situation : ", situ
Si acc = 0 Alors Fin
situ ← "Orange" Cool, non ?
SinonSi acc = 1 Alors Exercice 4.8
situ ← "Rouge" En ce qui concerne le début de cet algorithme, il n’y
Sinon a aucune difficulté. C’est de la saisie bête et même
situ ← "Refusé"
pas méchante:
FinSi Variables J, M, A, JMax en Numérique
Sinon Variables VJ, VM, B en Booleen
Si acc = 0 Alors Début
situ ← "Vert" Ecrire "Entrez le numéro du jour"
SinonSi acc = 1 Alors Lire J
situ ← "Orange" Ecrire "Entrez le numéro du mois"
SinonSi acc = 2 Alors Lire M
situ ← "Rouge" Ecrire "Entrez l'année"
Sinon Lire A
situ ← "Refusé"
C'est évidemment ensuite que les ennuis
FinSi
commencent… La première manière d'aborder la
FinSi
Si C3 Alors chose consiste à se dire que fondamentalement, la
Si situ = "Rouge" Alors structure logique de ce problème est très simple. Si
situ ← "Orange" nous créons deux variables booléennes VJ et VM,
SinonSi situ = "Orange" Alors représentant respectivement la validité du jour et du
situ ← "Orange" mois entrés, la fin de l'algorithme sera d'une
SinonSi situ = "Vert" Alors simplicité biblique (l’année est valide par définition,
situ ← "Bleu" si on évacue le débat byzantin concernant l’existence
FinSi
de l’année zéro) :
FinSi
Si VJ et VM alors
Ecrire "Votre situation : ", situ
Ecrire "La date est valide"
Fin
Sinon
Vous trouvez cela compliqué ? Oh, certes oui, ça l'est Ecrire "La date n'est pas valide"
! Et d'autant plus qu'en lisant entre les lignes, on FinSi
pouvait s'apercevoir que ce galimatias de tarifs Toute la difficulté consiste à affecter correctement
recouvre en fait une logique très simple : un système les variables VJ et VM, selon les valeurs des variables
à points. Et il suffit de comptabiliser les points pour J, M et A. Dans l'absolu, VJ et VM pourraient être les
que tout s'éclaire... Reprenons juste après objets d'une affectation monstrueuse, avec des
l'affectation des trois variables booléennes C1, C2, et conditions atrocement composées. Mais franchement,
C3. On écrit : écrire ces conditions en une seule fois est un travail
P ← 0 de bénédictin sans grand intérêt. Pour éviter d'en
Si Non(C1) Alors
arriver à une telle extrémité, on peut sérier la
P ← P + 1
difficulté en créant deux variables supplémentaires :
FinSi
Si Non(C2) Alors
P ← P + 1 B : variable booléenne qui indique s'il s'agit d'une
FinSi année bissextile
P ← P + acc JMax : variable numérique qui indiquera le dernier
Si P < 3 et C3 Alors jour valable pour le mois entré.
P ← P - 1
Avec tout cela, on peut y aller et en ressortir vivant. Sinon
On commence par initialiser nos variables Si J < 1 ou J > 28 Alors
booléennes, puis on traite les années, puis les mois, Ecrire "Date Invalide"
Sinon
puis les jours.
Ecrire "Date Valide"
On note "dp" la condition "divisible par" :
FinSi
B ← A dp 400 ou (non(A dp 100) et A dp 4)
FinSi
Jmax ← 0
SinonSi M = 4 ou M = 6 ou M = 9 ou M = 11
VM ← M >= 1 et M =< 12
Alors
Si VM Alors
Si J < 1 ou J > 30 Alors
Si M = 2 et B Alors
Ecrire "Date Invalide"
JMax ← 29
Sinon
SinonSi M = 2 Alors
Ecrire "Date Valide"
JMax ← 28
FinSi
SinonSi M = 4 ou M = 6 ou M = 9 ou M = 11
Sinon
Alors
Si J < 1 ou J > 31 Alors
JMax ← 30
Ecrire "Date Invalide"
Sinon
Sinon
JMax ← 31
Ecrire "Date Valide"
FinSi
FinSi
VJ ← J >= 1 et J =< Jmax
FinSi
FinSi
On voit que dans ce cas, l'alternative finale (Date
Cette solution a le mérite de ne pas trop compliquer
valide ou invalide) se trouve répétée un grand
la structure des tests, et notamment de ne pas
nombre de fois. Ce n'est en soi ni une bonne, ni une
répéter l'écriture finale à l'écran. Les variables
mauvaise chose. C'est simplement une question de
booléennes intermédiaires nous épargnent des
choix stylistique.
conditions composées trop lourdes, mais celles-ci
Personnellement, j'avoue préférer assez nettement la
restent néanmoins sérieuses.
première solution, qui fait ressortir beaucoup plus
clairement la structure logique du problème (il n'y a
Une approche différente consisterait à limiter les
qu'une seule alternative, autant que cette alternative
conditions composées, quitte à le payer par une
ne soit écrite qu'une seule fois).
structure beaucoup plus exigeante de tests
imbriqués. Là encore, on évite de jouer les
Il convient enfin de citer une solution très simple et
extrémistes et l'on s'autorise quelques conditions
élégante, un peu plus difficile peut-être à imaginer
composées lorsque cela nous simplifie l'existence. On
du premier coup, mais qui avec le recul apparaît
pourrait aussi dire que la solution précédente "part
comme très immédiate. Sur le fond, cela consiste à
de la fin" du problème (la date est elle valide ou non
dire qu'il y a quatre cas pour qu'une date soit valide :
?), alors que celle qui suit "part du début" (quelles
celui d'un jour compris entre 1 et 31 dans un mois à
sont les données entrées au clavier ?) :
31 jours, celui d'un jour compris entre 1 et 30 dans un
Si M < 1 ou M > 12 Alors
Ecrire "Date Invalide" mois à 30 jours, celui d'un jour compris entre 1 et 29
SinonSi M = 2 Alors en février d'une année bissextile, et celui d'un jour de
Si A dp 400 Alors février compris entre 1 et 28. Ainsi :
Si J < 1 ou J > 29 Alors B ← (A dp 4 et Non(A dp 100)) ou A dp 400
Ecrire "Date Invalide" K1 ← (m=1 ou m=3 ou m=5 ou m=7 ou m=8 ou
Sinon m=10 ou m=12) et (J>=1 et J=<31)
Ecrire "Date Valide" K2 ← (m=4 ou m=6 ou m=9 ou m=11) et (J>=1 et
FinSi J=<30)
SinonSi A dp 100 Alors K3 ← m=2 et B et J>=1 et J=<29
Si J < 1 ou J > 28 Alors K4 ← m=2 et J>=1 et J=<28
Ecrire "Date Invalide" Si K1 ou K2 ou K3 ou K4 Alors
Sinon Ecrire "Date valide"
Ecrire "Date Valide" Sinon
FinSi Ecrire "Date non valide"
SinonSi A dp 4 Alors FinSi
Si J < 1 ou J > 28 Alors Fin
Ecrire "Date Invalide" Tout est alors réglé avec quelques variables
Sinon booléennes et quelques conditions composées, en un
Ecrire "Date Valide" minimum de lignes de code.
FinSi
La morale de ce long exercice - et non moins long Som ← 0
corrigé, c'est qu'un problème de test un peu Pour i ← 1 à N
compliqué admet une pléiade de solutions justes... Som ← Som + i
i Suivant
...Mais que certaines sont plus astucieuses que
Ecrire "La somme est : ", Som
d'autres !
Fin
PARTIE 8
i suivant
FinTantQue
Fin Exercice 8.1
Exercice 7.3 Tableau Truc(5, 12) en Entier
On suppose que n est le nombre d’éléments du Debut
tableau préalablement saisi Pour i ← 0 à 5
… Pour j ← 0 à 12
Pour i ← 0 à (N-1)/2 Truc(i, j) ← 0
Temp ← T(i) j Suivant
T(i) ← T(N-1-i) i Suivant
T(N-1-i) ← Temp Fin
i suivant Exercice 8.2
Fin Cet algorithme remplit un tableau de la manière
Exercice 7.4 suivante:
… X(0, 0) = 1
Ecrire "Rang de la valeur à supprimer ?" X(0, 1) = 2
Lire S X(0, 2) = 3
Pour i ← S à N-2 X(1, 0) = 4
T(i) ← T(i+1) X(1, 1) = 5
i suivant X(1, 2) = 6
Redim T(N–1) Il écrit ensuite ces valeurs à l’écran, dans cet ordre.
Fin
Exercice 8.3 Pour i ← 0 à 12
Cet algorithme remplit un tableau de la manière Pour j ← 0 à 8
suivante: Si T(i,j) > T(iMax,jMax) Alors
X(0, 0) = 1 iMax ← i
X(1, 0) = 4 jMax ← j
X(0, 1) = 2 FinSi
X(1, 1) = 5 j Suivant
X(0, 2) = 3 i Suivant
X(1, 2) = 6 Ecrire "Le plus grand élément est ", T(iMax,
Il écrit ensuite ces valeurs à l’écran, dans cet ordre. jMax)
Ecrire "Il se trouve aux indices ", iMax, ";
Exercice 8.4
Cet algorithme remplit un tableau de la manière ", jMax
Fin
suivante:
T(0, 0) = 0 Exercice 8.7
Variables i, j , posi, posj, i2, j2 en
T(0, 1) = 1
Entier
T(1, 0) = 1
Variables Correct, MoveOK en Booléen
T(1, 1) = 2
Tableau Damier(7, 7) en Booléen
T(2, 0) = 2
Tableau Mouv(3, 1) en Entier
T(2, 1) = 3
T(3, 0) = 3 Le damier contenant un seul pion, on choisit de le
T(3, 1) = 4 coder à l'économie, en le représentant par un tableau
Il écrit ensuite ces valeurs à l’écran, dans cet ordre. de booléens à deux dimensions. Dans chacun des
Exercice 8.5 emplacements de ce damier, Faux signifie l'absence
Version a : cet algorithme remplit un tableau de la du pion, Vrai sa présence.
manière suivante:
T(0, 0) = 1 Par ailleurs, on emploie une méchante astuce, pas
T(0, 1) = 2 obligatoire, mais bien pratique dans beaucoup de
T(1, 0) = 3 situations. L'idée est de faire correspondre les choix
T(1, 1) = 4
possibles de l'utilisateur avec les mouvements du
T(2, 0) = 5
pion. On entre donc dans un tableau Mouv à deux
T(2, 1) = 6
dimensions, les déplacements du pion selon les
T(3, 0) = 7
T(3, 1) = 8 quatre directions, en prenant soin que chaque ligne
Il écrit ensuite ces valeurs à l’écran, dans cet ordre. du tableau corresponde à une saisie de l’utilisateur.
La première valeur étant le déplacement en i, la
Version b : cet algorithme remplit un tableau de la seconde le déplacement en j. Ceci nous épargnera
manière suivante: par la suite de faire quatre fois les mêmes tests.
T(0, 0) = 1 Debut
T(0, 1) = 5 Choix 0 : pion en haut à droite
T(1, 0) = 2 Mouv(0, 0) ← -1
T(1, 1) = 6 Mouv(0, 1) ← -1
T(2, 0) = 3 Choix 1 : pion en haut à droite
T(2, 1) = 7 Mouv(1, 0) ← -1
T(3, 0) = 4 Mouv(1, 1) ← 1
T(3, 1) = 8 Choix 2 : pion en bas à gauche
Il écrit ensuite ces valeurs à l’écran, dans cet ordre. Mouv(2, 0) ← 1
Exercice 8.6 Mouv(2, 1) ← -1
Variables i, j, iMax, jMax en Numérique Choix 3 : pion en bas à droite
Tableau T(12, 8) en Numérique Mouv(3, 0) ← 1
Le principe de la recherche dans un tableau à deux Mouv(3, 1) ← 1
dimensions est strictement le même que dans un Initialisation du damier; le pion n’est pour le moment
tableau à une dimension, ce qui ne doit pas nous nulle part
étonner. La seule chose qui change, c'est qu'ici le Pour i ← 0 à 7
balayage requiert deux boucles imbriquées, au lieu Pour j ← 0 à 7
Damier(i, j) ← Faux
d'une seule.
Debut j suivant
... i suivant
iMax ← 0 Saisie de la coordonnée en i ("posi") avec contrôle de
jMax ← 0 saisie
PARTIE 9
Correct ← Faux
TantQue Non Correct
Ecrire "Entrez la ligne de votre pion: " Exercice 9.1
Lire posi A ← Sin(B) Aucun problème
Si posi >= 0 et posi <= 7 Alors A ← Sin(A + B * C) Aucun problème
Correct ← vrai B ← Sin(A) – Sin(D) Erreur ! D est en
Finsi caractère
Fintantque D ← Sin(A / B) Aucun problème… si B
Saisie de la coordonnée en j ("posj") avec contrôle de est différent de zéro
saisie C ← Cos(Sin(A) Erreur ! Il manque une
Correct ← Faux parenthèse fermante
TantQue Non Correct Exercice 9.2
Ecrire "Entrez la colonne de votre pion: " Vous étiez prévenus, c'est bête comme chou ! Il suffit
Lire posj de se servir de la fonction Len, et c'est réglé :
Si posj >= 0 et posj <= 7 Alors Variable Mot en Caractère
Correct ← Vrai Variable Nb en Entier
Finsi Debut
Fintantque Ecrire "Entrez un mot : "
Positionnement du pion sur le damier virtuel. Lire Mot
Damier(posi, posj) ← Vrai Nb ← Len(Mot)
Saisie du déplacement, avec contrôle Ecrire "Ce mot compte ", Nb, " lettres"
Ecrire "Quel déplacement ?" Fin
Ecrire " - 0: en haut à gauche" Exercice 9.3
Là, on est obligé de compter par une boucle
Ecrire " - 1: en haut à droite"
le nombre d'espaces de la phrase, et on en
Ecrire " - 2: en bas à gauche"
déduit le nombre de mots. La boucle examine
Ecrire " - 3: en bas à droite"
les caractères de la phrase un par un, du
Correct ← Faux
premier au dernier, et les compare à
TantQue Non Correct
l'espace.
Lire Dep
Variable Bla en Caractère
Si Dep >= 0 et Dep <= 3 Alors
Variables Nb, i en Entier
Correct ← Vrai
Debut
FinSi
Ecrire "Entrez une phrase : "
FinTantQue
Lire Bla
i2 et j2 sont les futures coordonnées du pion. La
Nb ← 0
variable booléenne MoveOK vérifie la validité de ce Pour i ← 1 à Len(Bla)
futur emplacement Si Mid(Bla, i , 1) = " " Alors
i2 ← posi + Mouv(Dep, 0) Nb ← Nb + 1
j2 ← posj + Mouv(Dep, 1) FinSi
MoveOK ← i2 >= 0 et i2 <= 7 et j2 >= 0 et j2 i suivant
<= 7 Ecrire "Cette phrase compte ", Nb + 1, "
Cas où le déplacement est valide mots"
Si MoveOK Alors Fin
Damier(posi, posj) ← Faux Exercice 9.4
Damier(i2, j2) ← Vrai Solution 1 : pour chaque caractère du mot, on pose
Affichage du nouveau damier une très douloureuse condition composée. Le moins
Pour i ← 0 à 7
que l'on puisse dire, c'est que ce choix ne se distingue
Pour j ← 0 à 7
pas par son élégance. Cela dit, il marche, donc après
Si Damier(i, j) Alors
tout, pourquoi pas.
Ecrire " O ";
Variable Bla en Caractère
Sinon
Variables Nb, i, j en Entier
Ecrire " X ";
Debut
FinSi
Ecrire "Entrez une phrase : "
j suivant
Lire Bla
Ecrire ""
Nb ← 0
i suivant
Pour i ← 1 à Len(Bla)
Sinon
Si Mid(Bla, i, 1) = "a" ou Mid(Bla, i, 1)
Cas où le déplacement n’est pas valide
= "e" ou Mid(Bla, i, 1) = "i" ou Mid(Bla, i,
Ecrire "Mouvement impossible"
1) = "o" ou Mid(Bla, i, 1) = "u" ou Mid(Bla,
FinSi
i, 1) = "y" Alors
Fin
Nb ← Nb + 1 Pour cet exercice, il y a une règle générale : pour
FinSi chaque lettre, on détecte sa position dans l'alphabet,
i suivant et on la remplace par la lettre occupant la position
Ecrire "Cette phrase compte ", Nb, "
suivante. Seul cas particulier, la vingt-sixième lettre
voyelles"
(le Z) doit être codée par la première (le A), et non
Fin
par la vingt-septième, qui n'existe pas !
Solution 2 : on stocke toutes les voyelles dans une
Variables Bla, Cod, Alpha en Caractère
chaîne. Grâce à la fonction Trouve, on détecte Variables i, Pos en Entier
immédiatement si le caractère examiné est une Début
voyelle ou non. C'est nettement plus sympathique... Ecrire "Entrez la phrase à coder : "
Variables Bla, Voy en Caractère Lire Bla
Variables Nb, i, j en Entier Alpha ← "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Debut Cod ← ""
Ecrire "Entrez une phrase : " Pour i ← 1 à Len(Bla)
Lire Bla Let ← Mid(Bla, i, 1)
Nb ← 0 Si Let <> "Z" Alors
Voy ← "aeiouy" Pos ← Trouve(Alpha, Let)
Pour i ← 1 à Len(Bla) Cod ← Cod & Mid(Alpha, Pos + 1, 1)
Si Trouve(Voy, Mid(Bla, i, 1)) <> 0 Alors Sinon
Nb ← Nb + 1 Cod ← Cod & "A"
FinSi FinSi
i suivant i Suivant
Ecrire "Cette phrase compte ", Nb, " Bla ← Cod
voyelles" Ecrire "La phrase codée est : ", Bla
Fin Fin
Exercice 9.5 Exercice 9.7
Il n'existe aucun moyen de supprimer directement un Cet algorithme est une généralisation du précédent.
caractère d'une chaîne… autrement qu'en procédant Mais là, comme on ne connaît pas d'avance le
par collage. Il faut donc concaténer ce qui se trouve décalage à appliquer, on ne sait pas a priori combien
à gauche du caractère à supprimer, avec ce qui se de "cas particuliers", à savoir de dépassements au-
trouve à sa droite. Attention aux paramètres des delà du Z, il va y avoir.
fonctions Mid, ils n'ont rien d'évident ! Il faut donc trouver un moyen simple de dire que si
Variable Bla en Caractère on obtient 27, il faut en réalité prendre la lettre
Variables Nb, i, j en Entier
numéro 1 de l'alphabet, que si on obtient 28, il faut
Début
en réalité prendre la numéro 2, etc. Ce moyen simple
Ecrire "Entrez une phrase : "
Lire Bla existe : il faut considérer le reste de la division par
Ecrire "Entrez le rang du caractère à 26, autrement dit le modulo.
supprimer : " Il y a une petite ruse supplémentaire à appliquer,
Lire Nb puisque 26 doit rester 26 et ne pas devenir 0.
L ← Len(Bla) Variable Bla, Cod, Alpha en Caractère
Bla ← Mid(Bla, 1, Nb – 1) & Mid(Bla, Nb + 1, Variables i, Pos, Décal en Entier
L – Nb) Début
Ecrire "La nouvelle phrase est : ", Bla Ecrire "Entrez le décalage à appliquer : "
Fin Lire Décal
Exercice 9.6 Ecrire "Entrez la phrase à coder : "
Sur l'ensemble des exercices de cryptographie, il y a Lire Bla
deux grandes stratégies possibles : Alpha ← "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Cod ← ""
Pour i ← 1 à Len(Bla)
- soit transformer les caractères en leurs codes ASCII.
Let ← Mid(Bla, i, 1)
L'algorithme revient donc ensuite à traiter des
Pos ← Trouve(Alpha, Let)
nombres. Une fois ces nombres transformés, il faut NouvPos ← Mod(Pos + Décal, 26)
les reconvertir en caractères. Si NouvPos = 0 Alors
NouvPos ← 26
- soit en rester au niveau des caractères, et procéder FinSi
directement aux transformations à ce niveau. C'est Cod ← Cod & Mid(Alpha, NouvPos, 1)
cette dernière option qui est choisie ici, et pour tous i Suivant
les exercices de cryptographie à venir. Bla ← Cod
Ecrire "La phrase codée est : ", Bla Let ← Mid(Bla, i, 1)
Fin Pos ← Trouve(Alpha, Let)
Exercice 9.8 NouvPos ← Pos + PosLetClé
Là, c'est assez direct. Si NouvPos > 26 Alors
Variable Bla, Cod, Alpha en Caractère NouvPos ← NouvPos – 26
Variables i, Pos, Décal en Entier FinSi
Début Cod ← Cod & Mid(Alpha, NouvPos, 1)
Ecrire "Entrez l’alphabet clé : " i Suivant
Lire Clé Bla ← Cod
Ecrire "Entrez la phrase à coder : " Ecrire "La phrase codée est : ", Bla
Lire Bla Fin
Alpha ← "ABCDEFGHIJKLMNOPQRSTUVWXYZ" Exercice 9.10
Cod ← "" On en revient à des choses plus simples...
Pour i ← 1 à Len(Bla) Variable Nb en Entier
Let ← Mid(Bla, i, 1) Ecrire "Entrez votre nombre : "
Pos ← Trouve(Alpha, Let) Lire Nb
Cod ← Cod & Mid(Clé, Pos, 1) Si Nb/2 = Ent(Nb/2) Alors
i Suivant Ecrire "Ce nombre est pair"
Bla ← Cod Sinon
Ecrire "La phrase codée est : ", Bla Ecrire "Ce nombre est pair"
Fin FinSi
Exercice 9.9 Fin
Le codage de Vigenère n’est pas seulement plus Exercice 9.11
difficile à briser; il est également un peu plus raide à a) Glup ← Alea() * 2
programmer. La difficulté essentielle est de b) Glup ← Alea() * 2 - 1
c) Glup ← Alea() * 0,30 + 1,35
comprendre qu’il faut deux boucles: l’une pour
d) Glup ← Ent(Alea() * 6) + 1
parcourir la phrase à coder, l’autre pour parcourir la
e) Glup ← Alea() * 17 – 10,5
clé. Mais quand on y réfléchit bien, ces deux boucles f) Glup ← Ent(Alea()*6) + Ent(Alea()*6) + 2
ne doivent surtout pas être imbriquées. Et en réalité,
quelle que soit la manière dont on l'écrit, elle n’en PARTIE 10
forment qu’une seule. Exercice 10.1
Variables Alpha, Bla, Cod, Clé, Let en Cet algorithme écrit l'intégralité du fichier
Caractère "Exemple.txt" à l'écran
Variables i, Pos, PosClé, Décal en Entier
Exercice 10.2
Début Variable Truc en Caractère
Ecrire "Entrez la clé : " Variable i en Entier
Lire Clé Debut
Ecrire "Entrez la phrase à coder : " Ouvrir "Exemple.txt" sur 5 en Lecture
Lire Bla Tantque Non EOF(5)
Alpha ← "ABCDEFGHIJKLMNOPQRSTUVWXYZ" LireFichier 5, Truc
Cod ← "" Pour i ← 1 à Len(Truc)
PosClé ← 0 Si Mid(Truc, i, 1) = "/" Alors
Pour i ← 1 à Len(Bla) Ecrire " "
On gère la progression dans la clé. J’ai effectué cela Sinon
"à la main" par une boucle, mais un joli emploi de la Ecrire Mid(Truc, i, 1)
fonction Modulo aurait permis une programmation en FinSi
une seule ligne! i Suivant
Posclé ← Posclé + 1 FinTantQue
Si PosClé > Len(Clé) Alors Fermer 5
PosClé ← 1 Exercice 10.3
FinSi Variables Nom * 20, Prénom * 17, Tel * 10,
Mail * 20, Lig en Caractère
On détermine quelle est la lettre clé et sa position
Debut
dans l’alphabet
Ecrire "Entrez le nom : "
LetClé ← Mid(Clé, PosClé, 1)
Lire Nom
PosLetClé ← Trouve(Alpha, LetClé)
Ecrire "Entrez le prénom : "
On détermine la position de la lettre à coder et le Lire Prénom
décalage à appliquer. Là encore, une solution Ecrire "Entrez le téléphone : "
alternative aurait été d’employer Mod : cela nous Lire Tel
aurait épargné le Si… Ecrire "Entrez le nom : "
Lire Mail Exercice 10.5
Lig ← Nom & Prénom & Tel & Mail C'est un peu du même tonneau que ce qu'on vient de
Ouvrir "Adresse.txt" sur 1 pour Ajout faire, à quelques variantes près. Il y a
EcrireFichier 1, Lig essentiellement une petite gestion de flag pour faire
Fermer 1
bonne mesure.
Fin Structure Bottin
Exercice 10.4 Nom en Caractère * 20
Là, comme indiqué dans le cours, on passe par un Prénom en Caractère * 15
tableau de strutures en mémoire vive, ce qui est la Tel en caractère * 10
technique la plus fréquemment employée. Le tri - qui Mail en Caractère * 20
est en fait un simple test - sera effectué sur le Fin Structure
premier champ (nom). Tableau Mespotes() en Bottin
Structure Bottin Variables MonPote en Bottin
Nom en Caractère * 20 Variables Ancien, Nouveau en Caractère*20
Prénom en Caractère * 15 Variables i, j en Numérique
Tel en Caractère * 10 Variable Trouvé en Booléen
Mail en Caractère * 20 Debut
Fin Structure Ecrire "Entrez le nom à modifier : "
Tableau Mespotes() en Bottin Lire Ancien
Variables MonPote, Nouveau en Bottin Ecrire "Entrez le nouveau nom : "
Variables i, j en Numérique Lire Nouveau
Debut On recopie l'intégralité de "Adresses" dans Fic, tout
Ecrire "Entrez le nom : " en recherchant le clampin. Si on le trouve, on
Lire Nouveau.Nom procède à la modification.
Ecrire "Entrez le prénom : " Ouvrir “Adresse.txt” sur 1 pour Lecture
Lire Nouveau.Prénom i ← -1
Ecrire "Entrez le téléphone : " Trouvé ← Faux
Lire Nouveau.Tel Tantque Non EOF(1)
Ecrire "Entrez le mail : " i ← i + 1
Lire Nouveau.Mail Redim MesPotes(i)
On recopie l'intégralité de "Adresses" dans MesPotes(). LireFichier 1, MonPote
Et après tout, c'est l'occasion : quand on tombe au Si MonPote.Nom = Ancien.Nom Alors
bon endroit, on insère subrepticement notre nouveau Trouvé ← Vrai
copain dans le tableau. MonPote.Nom ← Nouveau
Ouvrir "Adresse.txt" sur 1 pour Lecture FinSi
i ← -1 MesPotes(i) ← MonPote
inséré ← Faux FinTantQue
Tantque Non EOF(1) Fermer 1
i ← i + 1 On recopie ensuite l'intégralité de Fic dans "Adresse"
Redim MesPotes(i) Ouvrir "Adresse.txt" sur 1 pour Ecriture
LireFichier 1, MonPote Pour j ← 0 à i
Si MonPote.Nom > Nouveau.Nom et Non Inséré EcrireFichier 1, MesPotes(j)
Alors j Suivant
MesPotes(i) ← Nouveau Fermer 1
Inséré ← Vrai Et un petit message pour finir !
i ← i + 1 Si Trouvé Alors
Redim MesPotes(i) Ecrire "Modification effectuée"
FinSi Sinon
MesPotes(i) ← MonPote Ecrire "Nom inconnu. Aucune modification
FinTantQue effectuée"
Fermer 1 FinSi
Et le tour est quasiment joué. Il ne reste plus qu'à Fin
rebalancer tel quel l'intégralité du tableau MesPotes Exercice 10.6
dans le fichier, en écrasant l'ancienne version. Là, c'est un tri sur un tableau de structures, rien de
Ouvrir "Adresse.txt" sur 1 pour Ecriture plus facile. Et on est bien content de disposer des
Pour j ← 0 à i structures, autrement dit de ne se coltiner qu'un seul
EcrireFichier 1, MesPotes(j) tableau...
j suivant Structure Bottin Nom en Caractère * 20
Fermer 1 Prénom en Caractère * 15
Fin Tel en caractère * 10
Mail en Caractère * 20 Exercice 10.8
Fin Structure On va éliminer les mauvaises entrées dès la recopie :
Tableau Mespotes() en Bottin si l'enregistrement ne présente pas un mail valide, on
Variables Mini en Bottin l'ignore, sinon on le copie dans le tableau.
Variables i, j en Numérique Structure Bottin
Debut Nom en Caractère * 20
On recopie l'intégralité de "Adresses" dans MesPotes... Prénom en Caractère * 15
Ouvrir "Adresse.txt" sur 1 pour Lecture Tel en caractère * 10
i ← -1 Mail en Caractère * 20
Tantque Non EOF(1) Fin Structure
i ← i + 1 Tableau Mespotes() en Bottin
Redim MesPotes(i) Variable MonPote en Bottin
LireFichier 1, MesPotes(i) Variables i, j en Numérique
FinTantQue Debut
Fermer 1 On recopie "Adresses" dans MesPotes en testant le
On trie le tableau selon l'algorithme de tri par mail...
insertion déjà étudié, en utilisant le champ Nom de la Ouvrir "Adresse.txt" sur 1 pour Lecture
structure : i ← -1
Pour j ← 0 à i - 1 Tantque Non EOF(1)
Mini ← MesPotes(j) LireFichier 1, MonPote
posmini ← j nb ← 0
Pour k ← j + 1 à i Pour i ← 1 à Len(MonPote.Mail)
Si MesPotes(k).Nom < Mini.Nom Alors Si Mid(MonPote.Mail, i, 1) = "@" Alors
mini ← MesPotes(k) nb ← nb + 1
posmini ← k FinSi
Finsi i suivant
k suivant Si nb = 1 Alors
MesPotes(posmini) ← MesPotes(j) i ← i + 1
MesPotes(j) ← Mini Redim MesPotes(i)
j suivant MesPotes(i) ← MonPote
On recopie ensuite l'intégralité du tableau dans FinSi
"Adresse" FinTantQue
Ouvrir "Adresse.txt" sur 1 pour Ecriture Fermer 1
Pour j ← 0 à i On recopie ensuite l'intégralité de Fic dans "Adresse"
EcrireFichier 1, MesPotes(j) Ouvrir "Adresse.txt" sur 1 pour Ecriture
j suivant Pour j ← 0 à i
Fermer 1 EcrireFichier 1, MesPotes(j)
Fin j Suivant
Exercice 10.7 Fermer 1
Bon, celui-là est tellement idiot qu'on n'a même pas Fin
besoin de passer par des tableaux en mémoire vive. Exercice 10.9
Variable Lig en Caractère Une fois de plus, le passage par un tableau de
Début structures est une stratégie commode. Attention
Ouvrir "Tutu.txt" sur 1 pour Ajout toutefois, comme il s'agit d'un fichier texte, tout est
Ouvrir “Toto.txt” sur 2 pour Lecture stocké en caractère. Il faudra donc convertir en
Tantque Non EOF(2) numérique les caractères représentant les ventes,
LireFichier 2, Lig
pour pouvoir effectuer les calculs demandés. Pour le
EcrireFichier 1, Lig
traitement, il y a deux possibilités. Soit on recopie le
FinTantQue
fichier à l'identique dans un premier tableau, et on
Fermer 2
Ouvrir “Tata.txt” sur 3 pour Lecture traite ensuite ce tableau pour faire la somme par
Tantque Non EOF(3) vendeur. Soit on fait le traitement directement, dès
LireFichier 2, Lig la lecture du fichier. C'est cette option qui est choisie
EcrireFichier 1, Lig dans ce corrigé.
FinTantQue Structure Vendeur
Fermer 3 Nom en Caractère * 20
Fermer 1 Montant en Numérique
Fin Fin Structure
Tableau MesVendeurs() en Vendeur
Variables NomPrec * 20, Lig, Nom en
caractère TantQue i < Len(a) - Len(b) et b <> Mid(a,
Variables Somme, Vente en Numérique i, Len(b))
On balaye le fichier en faisant nos additions. i ← i + 1
Dès que le nom a changé (on est passé au vendeur FinTantQue
suivant), on range le résultat et on remet tout à zéro Si b <> Mid(a, i, Len(b)) Alors
Debut Renvoyer 0
Ouvrir "Ventes.txt” sur 1 pour Lecture Sinon
i ← -1 Renvoyer i
Somme ← 0 FinFonction
NomPréc ← "" Fonction ChoixDuMot
Tantque Non EOF(1) Quelques explications : on lit intégralement le fichier
LireFichier 1, Lig contenant la liste des mots. Au fur et à mesure, on
Nom ← Mid(Lig, 1, 20) range ces mots dans le tableau Liste, qui est
Vente ← CNum(Mid(Lig, 21, 10) redimensionné à chaque tour de boucle. Un tirage
Si Nom = NomPrec Alors aléatoire intervient alors, qui permet de renvoyer un
Somme ← Somme + Vente des mots au hasard.
Sinon Fonction ChoixDuMot()
i ← i + 1 Tableau Liste() en Caractère
Redim MesVendeurs(i) Variables Nbmots, Choisi en Numérique
MesVendeurs(i).Nom ← NomPrec Ouvrir "Dico.txt" sur 1 en Lecture
MesVendeurs(i).Montant ← Somme Nbmots ← -1
Somme ← 0 Tantque Non EOF(1)
NomPrec ← Nom Nbmots ← Nbmots + 1
FinSi Redim Liste(Nbmots)
FinTantQue LireFichier 1, Liste(Nbmots)
Et n'oublions pas un petit tour de plus pour le dernier FinTantQue
de ces messieurs… Fermer 1
i ← i + 1 Choisi ← Ent(Alea() * Nbmots)
Redim MesVendeurs(i) Renvoyer Liste(Choisi)
MesVendeurs(i).Nom ← NomPrec FinFonction
MesVendeurs(i).Montant ← Somme Fonction PartieFinie
Fermer 1 On commence par vérifier le nombre de mauvaises
Pour terminer, on affiche le tableau à l'écran réponses, motif de défaite. Ensuite, on regarde si la
Pour j ← 0 à i partie est gagnée, traitement qui s’apparente à une
Ecrire MesVendeurs(j) gestion de Flag : il suffit que l’une des lettres du mot
j suivant
à deviner n’ait pas été trouvée pour que la partie ne
Fin
soit pas gagnée. La fonction aura besoin, comme
PARTIE 11 arguments, du tableau Verif, de son nombre
d’éléments et du nombre actuel de mauvaises
Exercice 11.1
Voilà un début en douceur... réponses.
Fonction Sum(a, b, c, d, e) Fonction PartieFinie(t() en Booleen, n, x en
Renvoyer a + b + c + d + e Numérique)
FinFonction Variables i, issue en Numerique
Si x = 10 Alors
Exercice 11.2
Fonction NbVoyelles(Mot en Caractère) Renvoyer 2
Variables i, nb en Numérique Sinon
Pour i ← 1 à Len(Mot) Issue ← 1
Si Trouve("aeiouy", Mid(Mot, i, 1)) <> 0 Pour i ← 0 à n
Alors Si Non t(i) Alors
nb ← nb + 1 Issue ← 0
FinSi FinSi
i suivant i suivant
Renvoyer nb Renvoyer Issue
FinFonction FinSi
FinFonction
Exercice 11.3
Fonction Trouve(a, b) Procédure AffichageMot
Variable i en Numérique Une même boucle nous permet de considérer une par
Début une les lettres du mot à trouver (variable m), et de
i ← 1 savoir si ces lettres ont été identifiées ou non.
Procédure AffichageMot(m en Caractère par Variable Correct en Booleen
Valeur, t() en Booléen par Valeur) Début
Variable Aff en Caractere Correct ← Faux
Variable i en Numerique Pour i ← 1 à Len(M)
Aff ← "" Si Mid(M, i, 1) = L Alors
Pour i ← 0 à len(m) - 1 Correct ← Vrai
Si Non t(i) Alors T(i - 1) ← Vrai
Aff ← Aff & "-" FinSi
Sinon FinTantQue
Aff ← Aff & Mid(mot, i + 1, 1) Si Non Correct Alors
FinSi N ← N + 1
i suivant FinSi
Ecrire Aff Fin Procédure
FinProcédure Procédure Epilogue
Remarque : cette procédure aurait également pu Procédure Epilogue(M en Caractère par
être écrite sous la forme d'une fonction, qui aurait Valeur, N en Numérique par Valeur)
Début
renvoyé vers la procédure principale la chaîne de
Si N = 2 Alors
caractères Aff. L'écriture à l'écran de cette chaîne Aff
Ecrire "Une mauvaise proposition de trop…
aurait alors été faite par la procédure principale. Partie terminée !"
Voilà donc une situation où on peut assez Ecrire "Le mot à deviner était : ", M
indifféremment opter pour une sous-procédure ou Sinon
pour une fonction. Ecrire "Bravo ! Vous avez trouvé !"
Procédure SaisieLettre FinSi
On vérifie que le signe entré (paramètre b) est bien Fin Procédure
une seule lettre, qui ne figure pas dans les Procédure Principale
propositions précédemment effectuées (paramètre a) Procédure Principale
Procédure SaisieLettre(a, b en Caractère par Variables Lettre, Mot, Propos en Caractere
Référence) Variables g i, MovRep en Numérique
Variable Correct en Booleen Tableau Verif() en Booleen
Variable Alpha en Caractere Début
Début Mot ← ChoixDuMot()
Correct ← Faux Propos ← ""
Alpha ← "ABCDEFGHIJKLMNOPQRSTUVWXYZ" Lettre ← ""
TantQue Non Correct Redim Verif(Len(Mot)-1)
Ecrire "Entrez la lettre proposée : " Pour i ← 0 à Len(Mot)-1
Lire b Verif(i) ← Faux
Si Trouve(alpha, b) = 0 Ou len(b) <> 1 i suivant
Alors k ← 0
Ecrire "Ce n’est pas une lettre !" Tantque k = 0
SinonSi Trouve(a, b) <> 0 Alors AffichageMot(Mot, Verif())
Ecrire "Lettre déjà proposée !" SaisieLettre(Propos, Lettre)
Sinon VerifLettre(Lettre, Mot, Verif(), MovRep)
Correct ← Vrai k ← PartieFinie(Verif(), len(mot), MovRep)
a ← a & b FinTantQue
FinSi Epilogue(Mot, k)
FinTantQue Fin
Fin Procédure
Procédure VerifLettre
Les paramètres se multiplient… L est la lettre
proposée, t() le tableau de booléens, M le mot à
trouver et N le nombre de mauvaises propositions. Il
n’y a pas de difficulté majeure dans cette
procédure : on examine les lettres de M une à une, et
on en tire les conséquences. Le flag sert à savoir si la
lettre proposée faisait ou non partie du mot à
deviner.
Procédure VerifLettre(L, M en Caractère par
Valeur, t() en Booléen par Référence, N en
Numérique par Référence)