0% ont trouvé ce document utile (0 vote)
96 vues27 pages

Exercices Algorithme Avec Corrigées

Le document présente une série d'exercices d'algorithmique, abordant des concepts tels que l'échange de valeurs entre variables, la manipulation de chaînes de caractères, et la gestion des entrées utilisateur. Chaque exercice demande de concevoir des algorithmes pour résoudre des problèmes spécifiques, allant de simples calculs à des structures de contrôle plus complexes. Les parties sont organisées par thèmes, incluant des exercices sur les conditions, les boucles, et la gestion des tableaux.

Transféré par

Abdoulaye Belem
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
96 vues27 pages

Exercices Algorithme Avec Corrigées

Le document présente une série d'exercices d'algorithmique, abordant des concepts tels que l'échange de valeurs entre variables, la manipulation de chaînes de caractères, et la gestion des entrées utilisateur. Chaque exercice demande de concevoir des algorithmes pour résoudre des problèmes spécifiques, allant de simples calculs à des structures de contrôle plus complexes. Les parties sont organisées par thèmes, incluant des exercices sur les conditions, les boucles, et la gestion des tableaux.

Transféré par

Abdoulaye Belem
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

PARTIE 1 inverse les deux dernières instructions, cela change-t-

il quelque chose ?
Exercice 1.6
Exercice 1.1
Plus difficile, mais c’est un classique absolu, qu’il
Quelles seront les valeurs des variables A et B après
faut absolument maîtriser : écrire un algorithme
exécution des instructions suivantes ?
permettant d’échanger les valeurs de deux variables
Variables A, B en Entier
A et B, et ce quel que soit leur contenu préalable.
Début
A ← 1
B ← A + 3 Exercice 1.7
A ← 3
Une variante du précédent : on dispose de trois
Fin
variables A, B et C. Ecrivez un algorithme transférant
Exercice 1.2
à B la valeur de A, à C la valeur de B et à A la valeur
Quelles seront les valeurs des variables A, B et C
de C (toujours quels que soient les contenus
après exécution des instructions suivantes ?
préalables de ces variables).
Variables A, B, C en Entier
Début
Exercice 1.8
A ← 5 Que produit l’algorithme suivant ?
B ← 3 Variables A, B, C en Caractères
C ← A + B Début
A ← 2 A ← "423"
C ← B – A B ← "12"
Fin C ← A + B
Exercice 1.3 Fin

Quelles seront les valeurs des variables A et B après Exercice 1.9


exécution des instructions suivantes ? Que produit l’algorithme suivant ?
Variables A, B en Entier Variables A, B, C en Caractères
Début Début
A ← 5 A ← "423"
B ← A + 4 B ← "12"
A ← A + 1 C ← A & B
B ← A – 4 Fin
Fin
Exercice 1.4 PARTIE 2
Quelles seront les valeurs des variables A, B et C Exercice 2.1
après exécution des instructions suivantes ?
Quel résultat produit le programme suivant ?
Variables A, B, C en Entier
Variables val, double numériques
Début
Début
A ← 3
Val ← 231
B ← 10
Double ← Val * 2
C ← A + B
Ecrire Val
B ← A + B
Ecrire Double
A ← C
Fin
Fin
Exercice 2.2
Exercice 1.5
Ecrire un programme qui demande un nombre à
Quelles seront les valeurs des variables A et B après
l’utilisateur, puis qui calcule et affiche le carré de
exécution des instructions suivantes ?
Variables A, B en Entier ce nombre.
Début Exercice 2.3
A ← 5 Ecrire un programme qui lit le prix HT d’un article, le
B ← 2 nombre d’articles et le taux de TVA, et qui fournit le
A ← B prix total TTC correspondant. Faire en sorte que des
B ← A
libellés apparaissent clairement.
Fin
Moralité : les deux dernières instructions permettent-
elles d’échanger les deux valeurs de B et A ? Si l’on
Exercice 2.4
Ecrire un algorithme utilisant des variables de type
chaîne de caractères, et affichant quatre variantes PARTIE 4
possibles de la célèbre « belle marquise, vos beaux
Exercice 4.1
yeux me font mourir d’amour ». On ne se soucie pas
de la ponctuation, ni des majuscules. Formulez un algorithme équivalent à l’algorithme

PARTIE 3 suivant :
Si Tutu > Toto + 4 OU Tata = "OK" Alors
Tutu ← Tutu + 1
Exercice 3.1
Sinon
Ecrire un algorithme qui demande un nombre à Tutu ← Tutu – 1
l’utilisateur, et l’informe ensuite si ce nombre est Finsi
positif ou négatif (on laisse de côté le cas où le Exercice 4.2
nombre vaut zéro).
Cet algorithme est destiné à prédire l'avenir, et il
Exercice 3.2 doit être infaillible !
Ecrire un algorithme qui demande deux nombres à Il lira au clavier l’heure et les minutes, et il affichera
l’utilisateur et l’informe ensuite si leur produit est l’heure qu’il sera une minute plus tard. Par exemple,
négatif ou positif (on laisse de côté le cas où le si l'utilisateur tape 21 puis 32, l'algorithme doit
produit est nul). Attention toutefois : on ne doit pas répondre :
calculer le produit des deux nombres.
"Dans une minute, il sera 21 heure(s) 33".
Exercice 3.3
NB : on suppose que l'utilisateur entre une heure
Ecrire un algorithme qui demande trois noms à valide. Pas besoin donc de la vérifier.
l’utilisateur et l’informe ensuite s’ils sont rangés ou Exercice 4.3
non dans l’ordre alphabétique.
De même que le précédent, cet algorithme doit
Exercice 3.4
demander une heure et en afficher une autre. Mais
Ecrire un algorithme qui demande un nombre à cette fois, il doit gérer également les secondes, et
l’utilisateur, et l’informe ensuite si ce nombre est afficher l'heure qu'il sera une seconde plus tard.
positif ou négatif (on inclut cette fois le traitement Par exemple, si l'utilisateur tape 21, puis 32, puis 8,
du cas où le nombre vaut zéro). l'algorithme doit répondre : "Dans une seconde, il
Exercice 3.5 sera 21 heure(s), 32 minute(s) et 9 seconde(s)".

Ecrire un algorithme qui demande deux nombres à NB : là encore, on suppose que l'utilisateur entre une
l’utilisateur et l’informe ensuite si le produit est date valide.
négatif ou positif (on inclut cette fois le traitement Exercice 4.4
du cas où le produit peut être nul). Attention
toutefois, on ne doit pas calculer le produit ! Un magasin de reprographie facture 0,10 E les dix
premières photocopies, 0,09 E les vingt suivantes et
Exercice 3.6 0,08 E au-delà. Ecrivez un algorithme qui demande à
Ecrire un algorithme qui demande l’âge d’un enfant à l’utilisateur le nombre de photocopies effectuées et
l’utilisateur. Ensuite, il l’informe de sa catégorie : qui affiche la facture correspondante.
Exercice 4.5
 "Poussin" de 6 à 7 ans
Les habitants de Zorglub paient l’impôt selon les
 "Pupille" de 8 à 9 ans
règles suivantes :
 "Minime" de 10 à 11 ans
 "Cadet" après 12 ans
 les hommes de plus de 20 ans paient l’impôt
 les femmes paient l’impôt si elles ont entre
Peut-on concevoir plusieurs algorithmes équivalents
18 et 35 ans
menant à ce résultat ?
 les autres ne paient pas d’impôt

Le programme demandera donc l’âge et le sexe du


Zorglubien, et se prononcera donc ensuite sur le fait
que l’habitant est imposable.
Exercice 4.6 Exercice 4.8
Les élections législatives, en Guignolerie Ecrivez un algorithme qui a près avoir demandé un
Septentrionale, obéissent à la règle suivante : numéro de jour, de mois et d'année à l'utilisateur,
renvoie s'il s'agit ou non d'une date valide.
 lorsque l'un des candidats obtient plus de 50% Cet exercice est certes d’un manque d’originalité
des suffrages, il est élu dès le premier tour. affligeant, mais après tout, en algorithmique comme
 en cas de deuxième tour, peuvent participer ailleurs, il faut connaître ses classiques ! Et quand on
uniquement les candidats ayant obtenu au a fait cela une fois dans sa vie, on apprécie
moins 12,5% des voix au premier tour. pleinement l’existence d’un type numérique « date »
dans certains langages…).
Vous devez écrire un algorithme qui permette la Il n'est sans doute pas inutile de rappeler rapidement
saisie des scores de quatre candidats au premier tour. que le mois de février compte 28 jours, sauf si
Cet algorithme traitera ensuite le candidat numéro 1 l’année est bissextile, auquel cas il en compte 29.
(et uniquement lui) : il dira s'il est élu, battu, s'il se L’année est bissextile si elle est divisible par quatre.
trouve en ballottage favorable (il participe au second Toutefois, les années divisibles par 100 ne sont pas
tour en étant arrivé en tête à l'issue du premier tour) bissextiles, mais les années divisibles par 400 le sont.
ou défavorable (il participe au second tour sans avoir Ouf !
été en tête au premier tour). Un dernier petit détail : vous ne savez pas, pour
Exercice 4.7 l’instant, exprimer correctement en pseudo-code
Une compagnie d'assurance automobile propose à ses l’idée qu’un nombre A est divisible par un nombre B.
clients quatre familles de tarifs identifiables par une Aussi, vous vous contenterez d’écrire en bons
couleur, du moins au plus onéreux : tarifs bleu, vert, télégraphistes que A divisible par B se dit « A dp B ».
orange et rouge. Le tarif dépend de la situation du
conducteur :
PARTIE 5
Exercice 5.1
 un conducteur de moins de 25 ans et titulaire
du permis depuis moins de deux ans, se voit Ecrire un algorithme qui demande à l’utilisateur un
attribuer le tarif rouge, si toutefois il n'a nombre compris entre 1 et 3 jusqu’à ce que la
jamais été responsable d'accident. Sinon, la réponse convienne.
compagnie refuse de l'assurer. Exercice 5.2
 un conducteur de moins de 25 ans et titulaire
Ecrire un algorithme qui demande un nombre compris
du permis depuis plus de deux ans, ou de plus
entre 10 et 20, jusqu’à ce que la réponse convienne.
de 25 ans mais titulaire du permis depuis
En cas de réponse supérieure à 20, on fera apparaître
moins de deux ans a le droit au tarif orange
un message : « Plus petit ! », et inversement, « Plus
s'il n'a jamais provoqué d'accident, au tarif
grand ! » si le nombre est inférieur à 10.
rouge pour un accident, sinon il est refusé.
 un conducteur de plus de 25 ans titulaire du Exercice 5.3
permis depuis plus de deux ans bénéficie du Ecrire un algorithme qui demande un nombre de
tarif vert s'il n'est à l'origine d'aucun accident départ, et qui ensuite affiche les dix nombres
et du tarif orange pour un accident, du tarif suivants. Par exemple, si l'utilisateur entre le nombre
rouge pour deux accidents, et refusé au-delà 17, le programme affichera les nombres de 18 à 27.
 De plus, pour encourager la fidélité des
Exercice 5.4
clients acceptés, la compagnie propose un
contrat de la couleur immédiatement la plus Ecrire un algorithme qui demande un nombre de
avantageuse s'il est entré dans la maison départ, et qui ensuite écrit la table de multiplication
depuis plus d'un an. de ce nombre, présentée comme suit (cas où
l'utilisateur entre le nombre 7) :
Ecrire l'algorithme permettant de saisir les données Table de 7 :
nécessaires (sans contrôle de saisie) et de traiter ce 7 x 1 = 7
problème. Avant de se lancer à corps perdu dans cet 7 x 2 = 14
exercice, on pourra réfléchir un peu et s'apercevoir 7 x 3 = 21
qu'il est plus simple qu'il n'en a l'air (cela s'appelle …
faire une analyse !) 7 x 10 = 70
Exercice 5.5 X et Y nous sont donnés par la formule suivante, si n
Ecrire un algorithme qui demande un nombre de est le nombre de chevaux partants et p le nombre de
départ, et qui calcule la somme des entiers jusqu’à chevaux joués (on rappelle que le signe ! signifie
ce nombre. Par exemple, si l’on entre 5, le "factorielle", comme dans l'exercice 5.6 ci-dessus) :
programme doit calculer : X = n ! / (n - p) !
Y = n ! / (p ! * (n – p) !)
1 + 2 + 3 + 4 + 5 = 15
NB : cet algorithme peut être écrit d’une manière
NB : on souhaite afficher uniquement le résultat, pas
simple, mais relativement peu performante. Ses
la décomposition du calcul.
performances peuvent être singulièrement
Exercice 5.6 augmentées par une petite astuce. Vous
Ecrire un algorithme qui demande un nombre de commencerez par écrire la manière la plus simple,
départ, et qui calcule sa factorielle. puis vous identifierez le problème, et écrirez une
deuxième version permettant de le résoudre.
NB : la factorielle de 8, notée 8 !, vaut
1x2x3x4x5x6x7x8
PARTIE 6
Exercice 5.7
Exercice 6.1
Ecrire un algorithme qui demande successivement 20
nombres à l’utilisateur, et qui lui dise ensuite quel Ecrire un algorithme qui déclare et remplisse un
était le plus grand parmi ces 20 nombres : tableau de 7 valeurs numériques en les mettant
Entrez le nombre numéro 1 : 12 toutes à zéro.
Entrez le nombre numéro 2 : 14 Exercice 6.2
etc.
Entrez le nombre numéro 20 : 6 Ecrire un algorithme qui déclare et remplisse un
Le plus grand de ces nombres est : 14 tableau contenant les six voyelles de l’alphabet latin.
Modifiez ensuite l’algorithme pour que le programme Exercice 6.3
affiche de surcroît en quelle position avait été saisie
Ecrire un algorithme qui déclare un tableau de 9
ce nombre :
notes, dont on fait ensuite saisir les valeurs par
C’était le nombre numéro 2
l’utilisateur.
Exercice 5.8 Exercice 6.4
Réécrire l’algorithme précédent, mais cette fois-ci on
Que produit l’algorithme suivant ?
ne connaît pas d’avance combien l’utilisateur
souhaite saisir de nombres. La saisie des nombres Tableau Nb(5) en Entier
Variable i en Entier
s’arrête lorsque l’utilisateur entre un zéro.
Début
Exercice 5.9 Pour i ← 0 à 5
Nb(i) ← i * i
Lire la suite des prix (en euros entiers et terminée
i suivant
par zéro) des achats d’un client. Calculer la somme
Pour i ← 0 à 5
qu’il doit, lire la somme qu’il paye, et simuler la
Ecrire Nb(i)
remise de la monnaie en affichant les textes "10 i suivant
Euros", "5 Euros" et "1 Euro" autant de fois qu’il y a de Fin
coupures de chaque sorte à rendre.
Peut-on simplifier cet algorithme avec le même
Exercice 5.10 résultat ?
Écrire un algorithme qui permette de connaître ses Exercice 6.5
chances de gagner au tiercé, quarté, quinté et autres
impôts volontaires. Que produit l’algorithme suivant ?
Tableau N(6) en Entier
On demande à l’utilisateur le nombre de chevaux
Variables i, k en Entier
partants, et le nombre de chevaux joués. Les deux
Début
messages affichés devront être : N(0) ← 1
Dans l’ordre : une chance sur X de gagner Pour k ← 1 à 6
Dans le désordre : une chance sur Y de N(k) ← N(k-1) + 2
gagner k Suivant
Pour i ← 0 à 6
Ecrire N(i) Tableau à constituer :
i suivant
Fin 11 14 12 11 2 8 11 10

Peut-on simplifier cet algorithme avec le même


résultat ?
Exercice 6.11
Exercice 6.6
Toujours à partir de deux tableaux précédemment
Que produit l’algorithme suivant ?
saisis, écrivez un algorithme qui calcule le
Tableau Suite(7) en Entier schtroumpf des deux tableaux. Pour calculer le
Variable i en Entier schtroumpf, il faut multiplier chaque élément du
Début
tableau 1 par chaque élément du tableau 2, et
Suite(0) ← 1
additionner le tout. Par exemple si l'on a :
Suite(1) ← 1
Pour i ← 2 à 7 Tableau 1 :
Suite(i) ← Suite(i-1) + Suite(i-2)
i suivant 4 8 7 12
Pour i ← 0 à 7
Ecrire Suite(i)
i suivant Tableau 2 :
Fin
3 6
Exercice 6.7

Ecrivez la fin de l’algorithme 6.3 afin que le calcul de


la moyenne des notes soit effectué et affiché à Le Schtroumpf sera :
l’écran. 3 * 4 + 3 * 8 + 3 * 7 + 3 * 12 + 6 * 4 + 6 * 8 + 6 * 7 + 6 *
Exercice 6.8 12 = 279

Ecrivez un algorithme permettant à l’utilisateur de Exercice 6.12


saisir un nombre quelconque de valeurs, qui devront Ecrivez un algorithme qui permette la saisie d’un
être stockées dans un tableau. L’utilisateur doit donc nombre quelconque de valeurs, sur le principe de l’ex
commencer par entrer le nombre de valeurs qu’il 6.8. Toutes les valeurs doivent être ensuite
compte saisir. Il effectuera ensuite cette saisie. augmentées de 1, et le nouveau tableau sera affiché
Enfin, une fois la saisie terminée, le programme à l’écran.
affichera le nombre de valeurs négatives et le
Exercice 6.13
nombre de valeurs positives.
Exercice 6.9 Ecrivez un algorithme permettant, toujours sur le
même principe, à l’utilisateur de saisir un nombre
Ecrivez un algorithme calculant la somme des valeurs déterminé de valeurs. Le programme, une fois la
d’un tableau (on suppose que le tableau a été saisie terminée, renvoie la plus grande valeur en
préalablement saisi). précisant quelle position elle occupe dans le tableau.
Exercice 6.10 On prendra soin d’effectuer la saisie dans un premier
temps, et la recherche de la plus grande valeur du
Ecrivez un algorithme constituant un tableau, à partir tableau dans un second temps.
de deux tableaux de même longueur préalablement
saisis. Le nouveau tableau sera la somme des Exercice 6.14
éléments des deux tableaux de départ. Toujours et encore sur le même principe, écrivez un
Tableau 1 : algorithme permettant, à l’utilisateur de saisir les
notes d'une classe. Le programme, une fois la saisie
4 8 7 9 1 5 4 6 terminée, renvoie le nombre de ces notes supérieures
à la moyenne de la classe.

Tableau 2 :

7 6 5 2 1 3 7 4
PARTIE 7 Exercice 7.5

Ecrivez l'algorithme qui recherche un mot saisi au


Exercice 7.1 clavier dans un dictionnaire. Le dictionnaire est
supposé être codé dans un tableau préalablement
Ecrivez un algorithme qui permette de saisir un
rempli et trié.
nombre quelconque de valeurs, et qui les range au
fur et à mesure dans un tableau. Le programme, une
fois la saisie terminée, doit dire si les éléments du
PARTIE 8
tableau sont tous consécutifs ou non. Exercice 8.1
Par exemple, si le tableau est :
Écrivez un algorithme remplissant un tableau de 6 sur
13, avec des zéros.
12 13 14 15 16 17 18 Exercice 8.2

Quel résultat produira cet algorithme ?


ses éléments sont tous consécutifs. En revanche, si le Tableau X(1, 2) en Entier
tableau est : Variables i, j, val en Entier
Début
Val ← 1
9 10 11 15 16 17 18 Pour i ← 0 à 1
Pour j ← 0 à 2
X(i, j) ← Val
ses éléments ne sont pas tous consécutifs. Val ← Val + 1
Exercice 7.2 j Suivant
i Suivant
Ecrivez un algorithme qui trie un tableau dans l’ordre Pour i ← 0 à 1
décroissant. Pour j ← 0 à 2
Vous écrirez bien entendu deux versions de cet Ecrire X(i, j)
j Suivant
algorithme, l'une employant le tri par insertion,
i Suivant
l'autre le tri à bulles.
Fin
Exercice 7.3
Exercice 8.3
Ecrivez un algorithme qui inverse l’ordre des
Quel résultat produira cet algorithme ?
éléments d’un tableau dont on suppose qu'il a été
préalablement saisi (« les premiers seront les Tableau X(1, 2) en Entier
Variables i, j, val en Entier
derniers… »)
Début
Exercice 7.4 Val ← 1
Pour i ← 0 à 1
Ecrivez un algorithme qui permette à l’utilisateur de
Pour j ← 0 à 2
supprimer une valeur d’un tableau préalablement X(i, j) ← Val
saisi. L’utilisateur donnera l’indice de la valeur qu’il Val ← Val + 1
souhaite supprimer. Attention, il ne s’agit pas de j Suivant
remettre une valeur à zéro, mais bel et bien de la i Suivant
supprimer du tableau lui-même ! Si le tableau de Pour j ← 0 à 2
départ était : Pour i ← 0 à 1
Ecrire X(i, j)
i Suivant
12 8 4 45 64 9 2 j Suivant
Fin

Exercice 8.4
Et que l’utilisateur souhaite supprimer la valeur
d’indice 4, le nouveau tableau sera : Quel résultat produira cet algorithme ?
Tableau T(3, 1) en Entier
Variables k, m, en Entier
12 8 4 45 9 2
Début
Pour k ← 0 à 3
Pour m ← 0 à 1 Exercice 9.2
T(k, m) ← k + m
m Suivant Ecrivez un algorithme qui demande un mot à
k Suivant l’utilisateur et qui affiche à l’écran le nombre de
Pour k ← 0 à 3 lettres de ce mot (c'est vraiment tout bête).
Pour m ← 0 à 1
Exercice 9.3
Ecrire T(k, m)
m Suivant Ecrivez un algorithme qui demande une phrase à
k Suivant l’utilisateur et qui affiche à l’écran le nombre de
Fin mots de cette phrase. On suppose que les mots ne
Exercice 8.5 sont séparés que par des espaces (et c'est déjà un
petit peu moins bête).
Mêmes questions, en remplaçant la ligne :
Exercice 9.4
T(k, m) ← k + m

par Ecrivez un algorithme qui demande une phrase à


l’utilisateur et qui affiche à l’écran le nombre de
T(k, m) ← 2 * k + (m + 1)
voyelles contenues dans cette phrase.
puis par :
On pourra écrire deux solutions. La première déploie
T(k, m) ← (k + 1) + 4 * m
une condition composée bien fastidieuse. La
Exercice 8.6 deuxième, en utilisant la fonction Trouve, allège
considérablement l'algorithme.
Soit un tableau T à deux dimensions (12, 8)
préalablement rempli de valeurs numériques. Exercice 9.5

Écrire un algorithme qui recherche la plus grande Ecrivez un algorithme qui demande une phrase à
valeur au sein de ce tableau. l’utilisateur. Celui-ci entrera ensuite le rang d’un
Exercice 8.7 caractère à supprimer, et la nouvelle phrase doit être
affichée (on doit réellement supprimer le caractère
Écrire un algorithme de jeu de dames très simplifié. dans la variable qui stocke la phrase, et pas
L’ordinateur demande à l’utilisateur dans quelle case uniquement à l’écran).
se trouve son pion (quelle ligne, quelle colonne). On Exercice 9.6 - Cryptographie 1
met en place un contrôle de saisie afin de vérifier la
validité des valeurs entrées. Un des plus anciens systèmes de cryptographie
(aisément déchiffrable) consiste à décaler les lettres
Ensuite, on demande à l’utilisateur quel mouvement
d’un message pour le rendre illisible. Ainsi, les A
il veut effectuer : 0 (en haut à gauche), 1 (en haut à
deviennent des B, les B des C, etc. Ecrivez un
droite), 2 (en bas à gauche), 3 (en bas à droite).
algorithme qui demande une phrase à l’utilisateur et
Si le mouvement est impossible (i.e. on sort du qui la code selon ce principe. Comme dans le cas
damier ), on le signale à l’utilisateur et on s’arrête précédent, le codage doit s’effectuer au niveau de la
là . Sinon, on déplace le pion et on affiche le damier variable stockant la phrase, et pas seulement à
résultant, en affichant un « O » pour une case vide et l’écran.
un « X » pour la case où se trouve le pion.
Exercice 9.7 - Cryptographie 2 - le chiffre de César

PARTIE 9 Une amélioration (relative) du principe précédent


consiste à opérer avec un décalage non de 1, mais
Exercice 9.1 d’un nombre quelconque de lettres. Ainsi, par
exemple, si l’on choisit un décalage de 12, les A
Parmi ces affectations (considérées indépendamment
deviennent des M, les B des N, etc.
les unes des autres), lesquelles provoqueront des
erreurs, et pourquoi ? Réalisez un algorithme sur le même principe que le
précédent, mais qui demande en plus quel est le
Variables A, B, C en Numérique
décalage à utiliser. Votre sens proverbial de
Variables D, E en Caractère
A ← Sin(B) l'élégance vous interdira bien sûr une série de vingt-
A ← Sin(A + B * C) six "Si...Alors"
B ← Sin(A) – Sin(D)
D ← Sin(A / B)
C ← Cos(Sin(A)
Exercice 9.8 - Cryptographie 3 Ecrire l’algorithme qui effectue un cryptage de
Vigenère, en demandant bien sûr au départ la clé à
Une technique ultérieure de cryptographie consista à
l’utilisateur.
opérer non avec un décalage systématique, mais par
Exercice 9.10
une substitution aléatoire. Pour cela, on utilise un
alphabet-clé, dans lequel les lettres se succèdent de Ecrivez un algorithme qui demande un nombre entier
manière désordonnée, par exemple : à l’utilisateur. L’ordinateur affiche ensuite le
message "Ce nombre est pair" ou "Ce nombre est
HYLUJPVREAKBNDOFSQZCWMGITX impair" selon le cas.
C’est cette clé qui va servir ensuite à coder le Exercice 9.11
message. Selon notre exemple, les A deviendront des Ecrivez les algorithmes qui génèrent un nombre Glup
H, les B des Y, les C des L, etc. aléatoire tel que …
Ecrire un algorithme qui effectue ce cryptage
(l’alphabet-clé sera saisi par l’utilisateur, et on  0 =< Glup < 2
suppose qu'il effectue une saisie correcte).  –1 =< Glup < 1
Exercice 9.9 - Cryptographie 4 - le chiffre de  1,35 =< Glup < 1,65
 Glup émule un dé à six faces
Vigenère
 –10,5 =< Glup < +6,5
Un système de cryptographie beaucoup plus difficile à  Glup émule la somme du jet simultané de
briser que les précédents fut inventé au XVIe siècle deux dés à six faces
par le français Vigenère. Il consistait en une
combinaison de différents chiffres de César.
On peut en effet écrire 25 alphabets décalés par PARTIE 10
rapport à l’alphabet normal :
Exercice 10.1

 l’alphabet qui commence par B et finit par Quel résultat cet algorithme produit-il ?
…YZA Variable Truc en Caractère
 l’alphabet qui commence par C et finit par Début
…ZAB Ouvrir "[Link]" sur 5 en Lecture
 etc. Tantque Non EOF(5)
LireFichier 5, Truc
Ecrire Truc
Le codage va s’effectuer sur le principe du chiffre de
FinTantQue
César : on remplace la lettre d’origine par la lettre
Fermer 5
occupant la même place dans l’alphabet décalé. Fin
Mais à la différence du chiffre de César, un même
Exercice 10.2
message va utiliser non un, mais plusieurs alphabets
décalés. Pour savoir quels alphabets doivent être Ecrivez l’algorithme qui produit un résultat similaire
utilisés, et dans quel ordre, on utilise une clé. au précédent, mais le fichier texte "[Link]" est
Si cette clé est "VIGENERE" et le message "Il faut cette fois de type délimité (caractère de
coder cette phrase", on procèdera comme suit : délimitation : /). On produira à l'écran un affichage
La première lettre du message, I, est la 9e lettre de où pour des raisons esthétiques, ce caractère sera
l’alphabet normal. Elle doit être codée en utilisant remplacé avec des espaces.
l’alphabet commençant par la première lettre de la
Exercice 10.3
clé, V. Dans cet alphabet, la 9e lettre est le D. I
devient donc D. On travaille avec le fichier du carnet d’adresses en
La deuxième lettre du message, L, est la 12e lettre champs de largeur fixe.
de l’alphabet normal. Elle doit être codée en utilisant Ecrivez un algorithme qui permet à l’utilisateur de
l’alphabet commençant par la deuxième lettre de la saisir au clavier un nouvel individu qui sera ajouté à
clé, I. Dans cet alphabet, la 12e lettre est le S. L ce carnet d’adresses.
devient donc S, etc.
Exercice 10.4
Quand on arrive à la dernière lettre de la clé, on
recommence à la première. Même question, mais cette fois le carnet est supposé
être trié par ordre alphabétique. L’individu doit donc
être inséré au bon endroit dans le fichier.
Exercice 10.5 à la différence de Mid et Len, n’est pas une fonction
indispensable dans un langage).
Ecrivez un algorithme qui permette de modifier un
renseignement (pour simplifier, disons uniquement le
nom de famille) d’un membre du carnet d’adresses. Il
faut donc demander à l’utilisateur quel est le nom à
modifier, puis quel est le nouveau nom, et mettre à
jour le fichier. Si le nom recherché n'existe pas, le
programme devra le signaler.
Exercice 10.6

Ecrivez un algorithme qui trie les individus du carnet


d’adresses par ordre alphabétique.
Exercice 10.7

Soient [Link] et [Link] deux fichiers dont les


enregistrements ont la même structure. Ecrire un
algorithme qui recopie tout le fichier Toto dans le
fichier Tutu, puis à sa suite, tout le fichier Tata
(concaténation de fichiers).
Exercice 10.8

Ecrire un algorithme qui supprime dans notre carnet


d'adresses tous les individus dont le mail est invalide
(pour employer un critère simple, on considèrera que
sont invalides les mails ne comportant aucune
arobase, ou plus d'une arobase).
Exercice 10.9

Les enregistrements d’un fichier contiennent les deux


champs Nom (chaîne de caractères) et Montant
(Entier). Chaque enregistrement correspond à une
vente conclue par un commercial d’une société.
On veut mémoriser dans un tableau, puis afficher à
l'écran, le total de ventes par vendeur. Pour
simplifier, on suppose que le fichier de départ est
déjà trié alphabétiquement par vendeur.

PARTIE 11
Exercice 11.1

Écrivez une fonction qui renvoie la somme de cinq


nombres fournis en argument.
Exercice 11.2

Écrivez une fonction qui renvoie le nombre de


voyelles contenues dans une chaîne de caractères
passée en argument. Au passage, notez qu'une
fonction a tout à fait le droit d'appeler une autre
fonction.
Exercice 11.3

Réécrivez la fonction Trouve, vue précédemment, à


l’aide des fonctions Mid et Len (comme quoi, Trouve,
PARTIE 1
Début

CORRIGES DES EXERCICES


D ← C
C ← B
Exercice 1.1 B ← A
Après La valeur des variables est : A ← D
A ← 1 A = 1 B = ? Fin
B ← A + 3 A = 1 B = 4 En fait, quel que soit le nombre de variables, une
A ← 3 A = 3 B = 4 seule variable temporaire suffit…
Exercice 1.2 Exercice 1.8
Après La valeur des variables est : Il ne peut produire qu’une erreur d’exécution,
A ← 5 A = 5 B = ?
puisqu’on ne peut pas additionner des caractères.
C = ?
Exercice 1.9
B ← 3 A = 5 B = 3
…En revanche, on peut les concaténer. A la fin de
C = ?
l’algorithme, C vaudra donc "42312".
C ← A + B A = 5 B = 3
C = 8
A ← 2 A = 2 B = 3
PARTIE 2
C = 8
C ← B – A A = 2 B = 3 C = 1
Exercice 1.3 Exercice 2.1
Après La valeur des variables est : On verra apparaître à l’écran 231, puis 462 (qui vaut
A ← 5 A = 5 B = ? 231 * 2)
B ← A + 4 A = 5 B = 9 Exercice 2.2
A ← A + 1 A = 6 B = 9 Variables nb, carr en Entier
B ← A – 4 A = 6 B = 2 Début
Ecrire "Entrez un nombre :"
Exercice 1.4
Après La valeur des variables est : Lire nb
A ← 3 A = 3 B = ? carr ← nb * nb
C = ? Ecrire "Son carré est : ", carr
B ← 10 A = 3 B = 10 Fin
C = ? En fait, on pourrait tout aussi bien économiser la
C ← A + B A = 3 B = 10 variable carr en remplaçant les deux avant-dernières
C = 13 lignes par :
B ← A + B A = 3 B = 13 Ecrire "Son carré est : ", nb*nb
C = 13 C'est une question de style ; dans un cas, on privilégie
A ← C A = 13 B = 13 C
la lisibilité de l'algorithme, dans l'autre, on privilégie
= 13
l'économie d'une variable.
Exercice 1.5
Après La valeur des variables est : Exercice 2.3
Variables nb, pht, ttva, pttc en Numérique
A ← 5 A = 5 B = ?
Début
B ← 2 A = 5 B = 2
Ecrire "Entrez le prix hors taxes :"
A ← B A = 2 B = 2
Lire pht
B ← A A = 2 B = 2
Ecrire "Entrez le nombre d’articles :"
Les deux dernières instructions ne permettent donc Lire nb
pas d’échanger les deux valeurs de B et A, puisque Ecrire "Entrez le taux de TVA :"
l’une des deux valeurs (celle de A) est ici écrasée. Lire ttva
Si l’on inverse les deux dernières instructions, cela ne pttc ← nb * pht * (1 + ttva)
changera rien du tout, hormis le fait que cette fois Ecrire "Le prix toutes taxes est : ", pttc
c’est la valeur de B qui sera écrasée. Fin
Exercice 1.6 Là aussi, on pourrait squeezer une variable et une
Début ligne en écrivant directement. :
… Ecrire "Le prix toutes taxes est : ", nb *
C ← A pht * (1 + ttva)
A ← B C'est plus rapide, plus léger en mémoire, mais un peu
B ← C
plus difficile à relire (et à écrire !)
Fin
Exercice 2.4
On est obligé de passer par une variable dite Variables t1, t2, t3, t4 en Caractère
temporaire (la variable C). Début
Exercice 1.7 t1 ← "belle Marquise"
t2 ← "vos beaux yeux" Exercice 3.5
t3 ← "me font mourir" Variables m, n en Entier
t4 ← "d’amour" Début
Ecrire t1 & " " & t2 & " " & t3 & " " & t4 Ecrire "Entrez deux nombres : "
Ecrire t3 & " " & t2 & " " & t4 & " " & t1 Lire m, n
Ecrire t2 & " " & t3 & " " & t1 & " " & t4 Si m = 0 OU n = 0 Alors
Ecrire t4 & " " & t1 & " " & t2 & " " & t3 Ecrire "Le produit est nul"
Fin SinonSi (m < 0 ET n < 0) OU (m > 0 ET n > 0)

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 5 Exercice 5.6


Variables N, i, F en Entier
Debut
Ecrire "Entrez un nombre : "
Exercice 5.1 Lire N
Variable N en Entier F ← 1
Debut Pour i ← 2 à N
N ← 0 F ← F * i
Ecrire "Entrez un nombre entre 1 et 3" i Suivant
TantQue N < 1 ou N > 3 Ecrire "La factorielle est : ", F
Lire N Fin
Si N < 1 ou N > 3 Alors
Exercice 5.7
Ecrire "Saisie erronée. Recommencez” Variables N, i, PG en Entier
FinSi Debut
FinTantQue PG ← 0
Fin Pour i ← 1 à 20
Exercice 5.2 Ecrire "Entrez un nombre : "
Variable N en Entier Lire N
Debut Si i = 1 ou N > PG Alors
N ← 0 PG ← N
Ecrire "Entrez un nombre entre 10 et 20" FinSi
TantQue N < 10 ou N > 20 i Suivant
Lire N Ecrire "Le nombre le plus grand était : ",
Si N < 10 Alors PG
Ecrire "Plus grand !" Fin
SinonSi N > 20 Alors
En ligne 3, on peut mettre n’importe quoi dans PG, il
Ecrire "Plus petit !"
suffit que cette variable soit affectée pour que le
FinSi
FinTantQue premier passage en ligne 7 ne provoque pas d'erreur.
Fin
Exercice 5.3 Pour la version améliorée, cela donne :
Variables N, i en Entier Variables N, i, PG, IPG en Entier
Debut Debut
Ecrire "Entrez un nombre : " PG ← 0
Lire N Pour i ← 1 à 20
Ecrire "Les 10 nombres suivants sont : " Ecrire "Entrez un nombre : "
Pour i ← N + 1 à N + 10 Lire N
Ecrire i Si i = 1 ou N > PG Alors
i Suivant PG ← N
Fin IPG ← i
Exercice 5.4 FinSi
Variables N, i en Entier i Suivant
Debut Ecrire "Le nombre le plus grand était : ",
Ecrire "Entrez un nombre : " PG
Lire N Ecrire "Il a été saisi en position numéro ",
Ecrire "La table de multiplication de ce IPG
nombre est : " Fin
Pour i ← 1 à 10 Exercice 5.8
Ecrire N, " x ", i, " = ", n*i Variables N, i, PG, IPG en Entier
i Suivant Debut
Fin N ← 1
Exercice 5.5 i ← 0
Variables N, i, Som en Entier PG ← 0
Debut TantQue N <> 0
Ecrire "Entrez un nombre : " Ecrire "Entrez un nombre : "
Lire N Lire N
i ← i + 1 Pour i ← 2 à P
Si i = 1 ou N > PG Alors Déno2 ← Déno2 * i
PG ← N i Suivant
IPG ← i Ecrire "Dans l’ordre, une chance sur ", Numé
FinSi / Déno1
FinTantQue Ecrire "Dans le désordre, une sur ", Numé /
Ecrire "Le nombre le plus grand était : ", (Déno1 * Déno2)
PG Fin
Ecrire "Il a été saisi en position numéro ", Cette version, formellement juste, comporte tout de
IPG même deux faiblesses.
Fin
Exercice 5.9 La première, et la plus grave, concerne la manière
Variables FF, somdue, M, IPG, Reste, Nb10F,
Nb5F En Entier
dont elle calcule le résultat final. Celui-ci est le
Debut quotient d'un nombre par un autre ; or, ces nombres
E ← 1 auront rapidement tendance à être très grands. En
somdue ← 0 calculant, comme on le fait ici, d'abord le
TantQue E <> 0 numérateur, puis ensuite le dénominateur, on prend
Ecrire "Entrez le montant : " le risque de demander à la machine de stocker des
Lire E nombres trop grands pour qu'elle soit capable de les
somdue ← somdue + E
coder (cf. le préambule). C'est d'autant plus bête que
FinTantQue
rien ne nous oblige à procéder ainsi : on n'est pas
Ecrire "Vous devez :", E, " euros"
obligé de passer par la division de deux très grands
Ecrire "Montant versé :"
Lire M nombres pour obtenir le résultat voulu.
Reste ← M - E
Nb10E ← 0 La deuxième remarque est qu'on a programmé ici
TantQue Reste >= 10 trois boucles successives. Or, en y regardant bien, on
Nb10E ← Nb10E + 1 peut voir qu'après simplification de la formule, ces
Reste ← Reste – 10 trois boucles comportent le même nombre de tours !
FinTantQue (si vous ne me croyez pas, écrivez un exemple de
Nb5E ← 0
calcul et biffez les nombres identiques au numérateur
Si Reste >= 5
et au dénominateur). Ce triple calcul (ces trois
Nb5E ← 1
Reste ← Reste – 5
boucles) peut donc être ramené(es) à un(e) seul(e).
FinSi Et voilà le travail, qui est non seulement bien plus
Ecrire "Rendu de la monnaie :" court, mais aussi plus performant :
Ecrire "Billets de 10 E : ", Nb10E Variables N, P, i, O, F en Entier
Ecrire "Billets de 5 E : ", Nb5E Debut
Ecrire "Pièces de 1 E : ", reste Ecrire "Entrez le nombre de chevaux partants
Fin : "
Exercice 5.10 Lire N
Spontanément, on est tenté d'écrire l'algorithme Ecrire "Entrez le nombre de chevaux joués :
suivant : "
Variables N, P, i, Numé, Déno1, Déno2 en Lire P
Entier A ← 1
Debut Ecrire "Entrez le nombre de chevaux B ← 1
partants : " Pour i ← 1 à P
Lire N A ← A * (i + N - P)
Ecrire "Entrez le nombre de chevaux joués : B ← B * i
" i Suivant
Lire P Ecrire "Dans l’ordre, une chance sur ", A
Numé ← 1 Ecrire "Dans le désordre, une chance sur ",
Pour i ← 2 à N A / B
Numé ← Numé * i Fin
i Suivant
Déno1 ← 1
Pour i ← 2 à N-P
Déno1 ← Déno1 * i
i Suivant
Déno2 ← 1
PARTIE 6 Exercice 6.7
Variable S en Numérique
Tableau Notes(8) en Numérique
Debut
s ← 0
Exercice 6.1
Tableau Truc(6) en Numérique Pour i ← 0 à 8
Variable i en Numérique Ecrire "Entrez la note n° ", i + 1
Debut Lire Notes(i)
Pour i ← 0 à 6 s ← s + Notes(i)
Truc(i) ← 0 i Suivant
i Suivant Ecrire "Moyenne :", s/9
Fin Fin
Exercice 6.2 Exercice 6.8
Tableau Truc(5) en Caractère Variables Nb, Nbpos, Nbneg en Numérique
Debut Tableau T() en Numérique
Truc(0) ← "a" Debut
Truc(1) ← "e" Ecrire "Entrez le nombre de valeurs :"
Truc(2) ← "i" Lire Nb
Truc(3) ← "o" Redim T(Nb-1)
Truc(4) ← "u" Nbpos ← 0
Truc(5) ← "y" Nbneg ← 0
Fin Pour i ← 0 à Nb - 1
Exercice 6.3 Ecrire "Entrez le nombre n° ", i + 1
Tableau Notes(8) en Numérique Lire T(i)
Variable i en Numérique Si T(i) > 0 alors
Pour i ← 0 à 8 Nbpos ← Nbpos + 1
Ecrire "Entrez la note numéro ", i + 1 Sinon
Lire Notes(i) Nbneg ← Nbneg + 1
i Suivant Finsi
Fin i Suivant
Exercice 6.4 Ecrire "Nombre de valeurs positives : ",
Cet algorithme remplit un tableau avec six valeurs : Nbpos
0, 1, 4, 9, 16, 25. Ecrire "Nombre de valeurs négatives : ",
Il les écrit ensuite à l’écran. Simplification : Nbneg
Tableau Nb(5) en Numérique Fin
Variable i en Numérique Exercice 6.9
Variables i, Som, N en Numérique
Début
Tableau T() en Numérique
Pour i ← 0 à 5
Debut
Nb(i) ← i * i
Ecrire Nb(i) … (on ne programme pas la saisie du tableau, dont on
i Suivant suppose qu’il compte N éléments)
Fin Redim T(N-1)
Exercice 6.5 …
Cet algorithme remplit un tableau avec les sept Som ← 0
valeurs : 1, 3, 5, 7, 9, 11, 13. Pour i ← 0 à N - 1
Som ← Som + T(i)
Il les écrit ensuite à l’écran. Simplification :
i Suivant
Tableau N(6) en Numérique
Ecrire "Somme des éléments du tableau : ",
Variables i, k en Numérique
Som
Début
Fin
N(0) ← 1
Ecrire N(0) Exercice 6.10
Variables i, N en Numérique
Pour k ← 1 à 6
Tableaux T1(), T2(), T3() en Numérique
N(k) ← N(k-1) + 2
Debut
Ecrire N(k)
k Suivant
… (on suppose que T1 et T2 comptent N éléments, et
Fin qu’ils sont déjà saisis)
Redim T3(N-1)
Exercice 6.6
Cet algorithme remplit un tableau de 8 valeurs : 1, 1, …
Pour i ← 0 à N - 1
2, 3, 5, 8, 13, 21
T3(i) ← T1(i) + T2(i)
i Suivant Ecrire "Entrez le nombre de notes à saisir :
Fin "
Exercice 6.11 Lire Nb
Variables i, j, N1, N2, S en Numérique Redim T(Nb-1)
Tableaux T1(), T2() en Numérique Pour i ← 0 à Nb - 1
Debut Ecrire "Entrez le nombre n° ", i + 1
… On ne programme pas la saisie des tableaux T1 et Lire T(i)
T2. i Suivant
On suppose que T1 possède N1 éléments, et que T2 Som ← 0
Pour i ← 0 à Nb - 1
en possède T2)
… Som ← Som + T(i)
S ← 0 i Suivant
Pour i ← 0 à N1 – 1 Moy ← Som / Nb
Pour j ← 0 à N2 – 1 NbSup ← 0
S ← S + T1(i) * T2(j) Pour i ← 0 à Nb - 1
j Suivant Si T(i) > Moy Alors
i Suivant NbSup ← NbSup + 1
Ecrire "Le schtroumpf est : ", S FinSi
Fin i Suivant
Ecrire NbSup, " élèves dépassent la moyenne
Exercice 6.12
Variables Nb, i en Numérique de la classe"
Tableau T() en Numérique Fin
Debut
Ecrire "Entrez le nombre de valeurs : " PARTIE 7
Lire Nb
Redim T(Nb-1)
Pour i ← 0 à Nb - 1 Exercice 7.1
Ecrire "Entrez le nombre n° ", i + 1 Variables Nb, i en Entier
Lire T(i) Variable Flag en Booleen
i Suivant Tableau T() en Entier
Ecrire "Nouveau tableau : " Debut
Pour i ← 0 à Nb – 1 Ecrire "Entrez le nombre de valeurs :"
T(i) ← T(i) + 1 Lire Nb
Ecrire T(i) Redim T(Nb-1)
i Suivant Pour i ← 0 à Nb - 1
Fin Ecrire "Entrez le nombre n° ", i + 1
Exercice 6.13 Lire T(i)
Variables Nb, Posmaxi en Numérique i Suivant
Tableau T() en Numérique Flag ← Vrai
Ecrire "Entrez le nombre de valeurs :" Pour i ← 1 à Nb - 1
Lire Nb Si T(i) <> T(i – 1) + 1 Alors
Redim T(Nb-1) Flag ← Faux
Pour i ← 0 à Nb - 1 FinSi
Ecrire "Entrez le nombre n° ", i + 1 i Suivant
Lire T(i) Si Flag Alors
i Suivant Ecrire "Les nombres sont consécutifs"
Posmaxi ← 0 Sinon
Pour i ← 0 à Nb - 1 Ecrire "Les nombres ne sont pas
Si T(i) > T(Posmaxi) alors consécutifs"
Posmaxi ← i FinSi
Finsi Fin
i Suivant Cette programmation est sans doute la plus
Ecrire "Element le plus grand : ", spontanée, mais elle présente le défaut d'examiner la
T(Posmaxi) totalité du tableau, même lorsqu'on découvre dès le
Ecrire "Position de cet élément : ", Posmaxi départ deux éléments non consécutifs. Aussi, dans le
Fin
cas d'un grand tableau, est-elle dispendieuse en
Exercice 6.14
Variables Nb, i, Som, Moy, Nbsup en
temps de traitement. Une autre manière de procéder
Numérique serait de sortir de la boucle dès que deux éléments
Tableau T() en Numérique non consécutifs sont détectés. La deuxième partie de
Debut l'algorithme deviendrait donc :
i ← 1 Exercice 7.5
TantQue T(i) = T(i – 1) + 1 et i < Nb - 1 N est le nombre d'éléments du tableau Dico(),
i ← i + 1 contenant les mots du dictionnaire, tableau
FinTantQue préalablement rempli.
Si T(i) = T(i – 1) + 1 Alors Variables Sup, Inf, Comp en Entier
Ecrire "Les nombres sont consécutifs" Variables Fini en Booléen
Sinon Début
Ecrire "Les nombres ne sont pas Ecrire "Entrez le mot à vérifier"
consécutifs" Lire Mot
FinSi
On définit les bornes de la partie du tableau à
Exercice 7.2 considérer
On suppose que N est le nombre d’éléments du Sup ← N - 1
tableau. Tri par insertion : Inf ← 0
… Fini ← Faux
Pour i ← 0 à N - 2 TantQue Non Fini
posmaxi = i
Comp désigne l'indice de l'élément à comparer. En
Pour j ← i + 1 à N - 1
bonne rigueur, il faudra veiller à ce que Comp soit
Si t(j) > t(posmaxi) alors
posmaxi ← j bien un nombre entier, ce qui pourra s'effectuer de
Finsi différentes manières selon les langages.
j suivant Comp ← (Sup + Inf)/2
temp ← t(posmaxi) Si le mot se situe avant le point de comparaison,
t(posmaxi) ← t(i) alors la borne supérieure change, la borne inférieure
t(i) ← temp ne bouge pas.
i suivant Si Mot < Dico(Comp) Alors
Fin Sup ← Comp - 1
Tri à bulles : Sinon, c'est l'inverse
… Sinon
Yapermut ← Vrai Inf ← Comp + 1
TantQue Yapermut FinSi
Yapermut ← Faux Fini ← Mot = Dico(Comp) ou Sup < Inf
Pour i ← 0 à N - 2 FinTantQue
Si t(i) < t(i + 1) Alors Si Mot = Dico(Comp) Alors
temp ← t(i) Ecrire "le mot existe"
t(i) ← t(i + 1) Sinon
t(i + 1) ← temp Ecrire "Il n'existe pas"
Yapermut ← Vrai Finsi
Finsi 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 "[Link]" à 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 "[Link]" 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 "[Link]" 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 [Link] procède à la modification.
Ecrire "Entrez le prénom : " Ouvrir “[Link]” sur 1 pour Lecture
Lire [Link]énom i ← -1
Ecrire "Entrez le téléphone : " Trouvé ← Faux
Lire [Link] Tantque Non EOF(1)
Ecrire "Entrez le mail : " i ← i + 1
Lire [Link] 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 [Link] = [Link] Alors
bon endroit, on insère subrepticement notre nouveau Trouvé ← Vrai
copain dans le tableau. [Link] ← Nouveau
Ouvrir "[Link]" 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 "[Link]" sur 1 pour Ecriture
LireFichier 1, MonPote Pour j ← 0 à i
Si [Link] > [Link] 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 "[Link]" 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 "[Link]" 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 "[Link]" 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([Link])
Si MesPotes(k).Nom < [Link] Alors Si Mid([Link], 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 "[Link]" 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 "[Link]" 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 "[Link]" sur 1 pour Ajout toutefois, comme il s'agit d'un fichier texte, tout est
Ouvrir “[Link]” 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 “[Link]” 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 "[Link]” 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 "[Link]" 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)

Vous aimerez peut-être aussi