Exercice corrigé Ancien programme

codage ascii et codage affine

Partie A. Le code ASCII.

En informatique, le code ASCII consiste à associer à chaque caractère (lettre de l'alphabet, chiffre, signe de ponctuation, . . .) un code numérique entier, compris entre 0 et 255, que l'on appelle son code ASCII.

Par exemple, le code de A est 65, celui de B est 66, et ainsi de suite pour tout l'alphabet, celui de a est 97, celui de l'espace est 32...

1. a. En considérant que la lettre A occupe la place dans l'alphabet, donner une formule reliant C, le code ASCII d'une lettre, et sa place N dans l'alphabet.

b. Déterminer le code ASCII de la lettre Z.

La 26e lettre de l'alphabet occupe la place N =…. . .

c. À quelle lettre correspond le code ASCII 82 ?

2. Pour crypter un message, on peut effectuer le codage affine suivant : pour chaque lettre, on calcule sa position N dans l'Alphabet, puis on détermine le reste modulo 26 du produit Ce reste r correspond à une lettre majuscule qu'on transmettra en guise de message codé.

a. Déterminer le reste correspondant à la lettre A, puis à la lettre B, puis à la lettre M. Quel code sera transmis pour les lettres A, B, M ?

b. Justifier que (modulo 26), et en déduire la lettre correspondant au reste

On commencera par calculer le reste modulo 26 de

Partie B. Codage affine et Algobox.

1. Écrire un programme qui donne C, le code ASCII d'une lettre écrite en majuscules, détermine sa place N dans l'Alphabet, affiche son reste r modulo 26, puis la lettre majuscule à transmettre : on pourra l'appeler code.

Il y a deux étapes opérations bien distinctes. L'une qui donnera la position de la lettre dans l'alphabet en fonction de son code ASCII (et inversement), et l'autre qui permet le codage affine à proprement parler. Cette dernière est exclusivement réalisée sur la position de la lettre dans l'alphabet. Il suffit ensuite de bien respecter l'ordre des opérations demandées.

Syntaxe Algobox : la lettre à coder et le code seront des variables de type chaine. Lettre.charCodeAt(0) renvoie le code ASCII du caractère situé en première position dans la chaine lettre, c'est-à-dire qu'une chaine est une liste de caractères numérotés à partir de 0.

String.fromCharCode(r) renvoie la lettre dont le code ASCII est r.

Le reste de la division Euclidienne de a par b se calcule avec la formule

2. Utiliser ce programme pour coder le mot DIVISIBILITE.

Partie C. Décodage affine et Algobox.

1. Modifier le programme de la partie B pour qu'il retrouve la lettre initiale à partir de la lettre codée.

Utiliser A.2.b.

2. Décoder le mot REODUEPC.

Partie A.

1. a. .

b. Z est la 26-ième lettre de l'alphabet, donc Z occupe la place. Le code ASCII de Z est donc .

c. , donc si N est la place de la lettre dont le code
ASCII est 82, . Il s'agit donc de la 18-ième lettre de l'Alphabet, R.

2. a. Pour la lettre A, , donc . Donc . Le code transmis est donc A.

Pour la lettre B, , donc . Donc . Le code transmis est donc H.

Pour la lettre M, , donc . Donc . Le code transmis est donc G.

b. , donc .

Donc . Or , donc on a bien .

Pour , . Donc , donc .

La lettre correspondant au reste est donc la lettre dont la position dans
l'alphabet est 24 c'est la 25-ème lettre de l'alphabet, Y.

Partie B.

1. En respectant l'ordre des opérations décrites aux questions A.1. et A.2., on obtient :

VARIABLES

lettre EST_DU_TYPE CHAINE

C EST_DU_TYPE NOMBRE

N EST_DU_TYPE NOMBRE

r EST_DU_TYPE NOMBRE

code EST_DU_TYPE CHAINE

DEBUT_ALGORITHME

LIRE lettre

C PREND_LA_VALEUR lettre.charCodeAt(0)

N PREND_LA_VALEUR C-65

r PREND_LA_VALEUR (7*N)%26

code PREND_LA_VALEUR String.fromCharCode(r+65)

AFFICHER code

FIN_ALGORITHME

2. On obtient le code VEREWEHEZEDC.

La faiblesse de ce type de codage vient du fait que la lettre I, ici répétée 5 fois dans le mot à coder, est toujours codée par la même lettre, ici E. Des méthodes basées sur l'analyse de ce type de régularité permettent de casser ce code très facilement. Pour un codage qui évite ce problème, voir le codage de Vigenère à l'exercice 44.

Partie C.

1. Ici, on va intervertir les rôles de la lettre à coder et du code, et calculer le reste modulo 26 de , où r désigne la position dans l'alphabet du code à décoder.

On obtient avec les mêmes variables :

DEBUT_ALGORITHME

LIRE code

C PREND_LA_VALEUR code.charCodeAt(0)

r PREND_LA_VALEUR C-65

N PREND_LA_VALEUR (15*r)%26

lettre PREND_LA_VALEUR String.fromCharCode(N+65)

AFFICHER lettre

FIN_ALGORITHME

2. Le mot décodé est VICTOIRE.

Accéder à tous les contenus
dès 6,79€/mois

  • Les dernières annales corrigées et expliquées
  • Des fiches de cours et cours vidéo/audio
  • Des conseils et méthodes pour réussir ses examens
  • Pas de publicités
S'abonner