Adloun

É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(&quot;a&quot;) 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 &quot;z&quot; devient &quot;\"} — 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.