Exercice 9
Exercice 9
Exercice 9
1
Parmi ces affectations (considérées indépendamment les unes des autres), lesquelles
provoqueront des erreurs, et pourquoi ?
Variables A, B, C en Numérique
Variables D, E en Caractère
A ← Sin(B)
A ← Sin(A + B * C)
B ← Sin(A) – Sin(D)
D ← Sin(A / B)
C ← Cos(Sin(A)
corrigé - retour au cours
Exercice 9.2
Ecrivez un algorithme qui demande un mot à l’utilisateur et qui affiche à l’écran le
nombre de lettres de ce mot (c'est vraiment tout bête).
corrigé - retour au cours
Exercice 9.3
Ecrivez un algorithme qui demande une phrase à l’utilisateur et qui affiche à l’écran le
nombre de mots de cette phrase. On suppose que les mots ne sont séparés que par des
espaces (et c'est déjà un petit peu moins bête).
corrigé - retour au cours
Exercice 9.4
Ecrivez un algorithme qui demande une phrase à l’utilisateur et qui affiche à l’écran le
nombre de voyelles contenues dans cette phrase.
On pourra écrire deux solutions. La première déploie une condition composée bien
fastidieuse. La deuxième, en utilisant la fonction Trouve, allège considérablement
l'algorithme.
corrigé - retour au cours
Exercice 9.5
Ecrivez un algorithme qui demande une phrase à l’utilisateur. Celui-ci entrera ensuite
le rang d’un caractère à supprimer, et la nouvelle phrase doit être affichée (on doit
réellement supprimer le caractère dans la variable qui stocke la phrase, et pas
uniquement à l’écran).
corrigé - retour au cours
Exercice 9.6 - Cryptographie 1
Un des plus anciens systèmes de cryptographie (aisément déchiffrable) consiste à
décaler les lettres d’un message pour le rendre illisible. Ainsi, les A deviennent des B,
les B des C, etc. Ecrivez un algorithme qui demande une phrase à l’utilisateur et qui la
code selon ce principe. Comme dans le cas précédent, le codage doit s’effectuer au
niveau de la variable stockant la phrase, et pas seulement à l’écran.
corrigé - retour au cours
Exercice 9.7 - Cryptographie 2 - le chiffre de César
Une amélioration (relative) du principe précédent consiste à opérer avec un décalage
non de 1, mais d’un nombre quelconque de lettres. Ainsi, par exemple, si l’on choisit
un décalage de 12, les A deviennent des M, les B des N, etc.
Réalisez un algorithme sur le même principe que le précédent, mais qui demande en
plus quel est le décalage à utiliser. Votre sens proverbial de l'élégance vous interdira
bien sûr une série de vingt-six "Si...Alors"
corrigé - retour au cours
Exercice 9.8 - Cryptographie 3
Une technique ultérieure de cryptographie consista à opérer non avec un décalage
systématique, mais par une substitution aléatoire. Pour cela, on utilise un alphabet-clé,
dans lequel les lettres se succèdent de manière désordonnée, par exemple :
HYLUJPVREAKBNDOFSQZCWMGITX
C’est cette clé qui va servir ensuite à coder le message. Selon notre exemple, les A
deviendront des H, les B des Y, les C des L, etc.
Ecrire un algorithme qui effectue ce cryptage (l’alphabet-clé sera saisi par
l’utilisateur, et on suppose qu'il effectue une saisie correcte).
corrigé - retour au cours
Exercice 9.9 - Cryptographie 4 - le chiffre de Vigenère
Un système de cryptographie beaucoup plus difficile à briser que les précédents fut
inventé au XVIe siècle 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 rapport à l’alphabet normal :
Pour cet exercice, il y a une règle générale : pour chaque lettre, on détecte sa
position dans l'alphabet, et on la remplace par la lettre occupant la position
suivante. Seul cas particulier, la vingt-sixième lettre (le Z) doit être codée par
la première (le A), et non par la vingt-septième, qui n'existe pas !
• Variables Bla, Cod, Alpha en Caractère
Variables i, Pos en Entier
Début
Ecrire "Entrez la phrase à coder : "
Lire Bla
Alpha ← "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Cod ← ""
Pour i ← 1 à Len(Bla)
Let ← Mid(Bla, i, 1)
Si Let <> "Z" Alors
Pos ← Trouve(Alpha, Let)
Cod ← Cod & Mid(Alpha, Pos + 1, 1)
Sinon
Cod ← Cod & "A"
FinSi
i Suivant
Bla ← Cod
Ecrire "La phrase codée est : ", Bla
Fin
• énoncé - retour au cours
•
• Exercice 9.7
• Cet algorithme est une généralisation du précédent. Mais là, comme on ne
connaît pas d'avance le décalage à appliquer, on ne sait pas a priori combien
de "cas particuliers", à savoir de dépassements au-delà du Z, il va y avoir.
Il faut donc trouver un moyen simple de dire que si on obtient 27, il faut en
réalité prendre la lettre numéro 1 de l'alphabet, que si on obtient 28, il faut en
réalité prendre la numéro 2, etc. Ce moyen simple existe : il faut considérer le
reste de la division par 26, autrement dit le modulo.
Il y a une petite ruse supplémentaire à appliquer, puisque 26 doit rester 26 et
ne pas devenir 0.
• Variable Bla, Cod, Alpha en Caractère
Variables i, Pos, Décal en Entier
Début
Ecrire "Entrez le décalage à appliquer : "
Lire Décal
Ecrire "Entrez la phrase à coder : "
Lire Bla
Alpha ← "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Cod ← ""
Pour i ← 1 à Len(Bla)
Let ← Mid(Bla, i, 1)
Pos ← Trouve(Alpha, Let)
NouvPos ← Mod(Pos + Décal, 26)
Si NouvPos = 0 Alors
NouvPos ← 26
FinSi
Cod ← Cod & Mid(Alpha, NouvPos, 1)
i Suivant
Bla ← Cod
Ecrire "La phrase codée est : ", Bla
Fin
• énoncé - retour au cours
•
• Exercice 9.8
• Là, c'est assez direct.
• Variable Bla, Cod, Alpha en Caractère
Variables i, Pos, Décal en Entier
Début
Ecrire "Entrez l’alphabet clé : "
Lire Clé
Ecrire "Entrez la phrase à coder : "
Lire Bla
Alpha ← "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Cod ← ""
Pour i ← 1 à Len(Bla)
Let ← Mid(Bla, i, 1)
Pos ← Trouve(Alpha, Let)
Cod ← Cod & Mid(Clé, Pos, 1)
i Suivant
Bla ← Cod
Ecrire "La phrase codée est : ", Bla
Fin
• énoncé - retour au cours
•
• Exercice 9.9
• Le codage de Vigenère n’est pas seulement plus difficile à briser; il est
également un peu plus raide à programmer. La difficulté essentielle est de
comprendre qu’il faut deux boucles: l’une pour parcourir la phrase à coder,
l’autre pour parcourir la clé. Mais quand on y réfléchit bien, ces deux boucles
ne doivent surtout pas être imbriquées. Et en réalité, quelle que soit la manière
dont on l'écrit, elle n’en forment qu’une seule.
• Variables Alpha, Bla, Cod, Clé, Let en Caractère
Variables i, Pos, PosClé, Décal en Entier
Début
Ecrire "Entrez la clé : "
Lire Clé
Ecrire "Entrez la phrase à coder : "
Lire Bla
Alpha ← "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Cod ← ""
PosClé ← 0
Pour i ← 1 à Len(Bla)
• On gère la progression dans la clé. J’ai effectué cela "à la main" par une
boucle, mais un joli emploi de la fonction Modulo aurait permis une
programmation en une seule ligne!
• Posclé ← Posclé + 1
Si PosClé > Len(Clé) Alors
PosClé ← 1
FinSi
• On détermine quelle est la lettre clé et sa position dans l’alphabet
• LetClé ← Mid(Clé, PosClé, 1)
PosLetClé ← Trouve(Alpha, LetClé)
• On détermine la position de la lettre à coder et le décalage à appliquer. Là
encore, une solution alternative aurait été d’employer Mod : cela nous aurait
épargné le Si…
• Let ← Mid(Bla, i, 1)
Pos ← Trouve(Alpha, Let)
NouvPos ← Pos + PosLetClé
Si NouvPos > 26 Alors
NouvPos ← NouvPos – 26
FinSi
Cod ← Cod & Mid(Alpha, NouvPos, 1)
i Suivant
Bla ← Cod
Ecrire "La phrase codée est : ", Bla
Fin
• énoncé - retour au cours
•
• Exercice 9.10
• On en revient à des choses plus simples...
• Variable Nb en Entier
Ecrire "Entrez votre nombre : "
Lire Nb
Si Nb/2 = Ent(Nb/2) Alors
Ecrire "Ce nombre est pair"
Sinon
Ecrire "Ce nombre est impair"
FinSi
Fin
• énoncé - retour au cours
•
• Exercice 9.11
• a) Glup ← Alea() * 2
b) Glup ← Alea() * 2 - 1
c) Glup ← Alea() * 0,30 + 1,35
d) Glup ← Ent(Alea() * 6) + 1
e) Glup ← Alea() * 17 – 10,5
f) Glup ← Ent(Alea()*6) + Ent(Alea()*6) + 2