Écrire cesar(texte, k) qui décale de k rangs les lettres minuscules…
Exercice d'entraînement · niveau 2 · NSI (première), chapitre 2 — Flottants, booléens et textes · Manipuler du texte caractère par caractère
Énoncé
Écrire cesar(texte, k) qui décale de rangs les lettres minuscules non accentuées et laisse les autres caractères inchangés. Vérifier que cesar(cesar(t, 3), -3) redonne t.
Corrigé
def cesar(texte, k):
"""Decale de k rangs les lettres 'a' a 'z', modulo 26.
Precondition : aucune. Les caracteres hors de 'a'..'z' (accents,
espaces, ponctuation) sont recopies tels quels. Le modulo 26 rend
la fonction correcte pour k negatif comme pour k > 26.
"""
resultat = ""
for c in texte:
if "a" <= c <= "z":
rang = (ord(c) - ord("a") + k) % 26
resultat = resultat + chr(ord("a") + rang)
else:
resultat = resultat + c
return resultat
>>> cesar("nsi premiere", 3)
'qvl suhplhuh'
>>> cesar(cesar("nsi premiere", 3), -3)
'nsi premiere'
Le mécanisme. ord(c) - ord("a") ramène la lettre à son rang dans l'alphabet ( à ) ; on décale, on replie par % 26, on repasse en caractère avec chr. Le point de code n'est qu'un intermédiaire.
Erreur attendue : écrire chr(ord(c) + k) sans modulo. Avec , le "z" devient "\"} — on est sorti de l'alphabet sans que rien ne proteste, car chr accepte n'importe quel point de code. Le modulo est la précondition rendue exécutable.
Contrôle : le décalage annule le décalage parce que . Chiffrer et déchiffrer, c'est la même fonction à un signe près.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.