Aller au contenu

TP - Conversions d'une base à une autre

Dans le dossier [NSI], créez le dossier [A01-Entiers positifs].

Téléchargez le fichier « à trous » TPA01.11.py (clic droit -> [Enregistrer sous]) et enregistrez-le dans ce dossier.

Dans ces travaux pratiques, l'écriture binaire et l'écriture hexadécimale d'un entier seront données sous la forme d'une chaîne de caractères. Il est interdit d'utiliser les fonctions pré-programmées bin() et hex().

Exemple

L'entier 117 s'écrira :

  • en décimal avec l'entier 117 (type int) ;
  • en binaire avec la chaîne '1110101' constituée uniquement des caractères 0 et 1 (type str) ;
  • en hexadécimal avec la chaîne '75' constituée des caractères inclus dans 0123456789ABCDEF (type str).

Important

Dans chaque fonction à programmer, remplacez le mot-clef pass par les instructions nécessaires.

De plus, ne vous précipitez pas sur les pistes !
Prenez le temps de réflechir et chercher par vous-même en suivant les conseils ci-après

Conseils
  • Pour exécuter ce programme, il suffit de le sauvegarder puis d'appuyer sur la touche [F5].
  • Avez-vous bien fait un schéma au brouillon pour visualiser le problème posé ?
  • Avez-vous essayé de rédiger un algorithme en français, avec vos propres mots, avant de vous lancer dans la programmation sur machine ?
  • Avez-vous utilisé des affichages intermédiaires, des print(), pour visualiser au fur et à mesure le contenu des variables ?
  • Avez-vous testé le programme avec les propositions de tests fournies ?
  • Avez-vous testé le programme avec de nouveaux tests, différents de ceux proposés ?

Partie A - Conversion de binaire à décimal

Complétez le corps de la fonction binaire_2_decim() en respectant ses spécifications.

1
2
3
4
5
6
def binaire_2_decim(nb):
    """
    nb – str, écriture binaire d'un entier positif donc formé
         uniquement des caractères '0' et de '1'
    Sortie: int – l'écriture décimale de nb
    """

Exemple de Tests

>>> binaire_2_decim('1110101')
117

>>> binaire_2_decim('110010100100')
3236
Une piste

Pensez à utiliser la longueur de la chaîne

Une autre piste - l'algorithme explicité

Prenons l'exemple ci-dessous : nb = '1110101' (c'est une chaîne de caractères - type str).
Pour déterminer la valeur décimale correspondant à l'écriture binaire de nb, on utilise un algorithme d'accumulation :

  • On initialise une variable nommée valeur (par exemple) à zéro ;
  • On parcourt chaque caractère de la chaîne :
    • Ce parcours commence par le premier '1', que l'on transforme en entier.
    • Quel est le poids de ce 1 ? (rappelez-vous la piste précédente)
    • On ajoute à valeur ce 1 multiplié par 2son poids, comme en classe (et c'est la machine qui fera les calculs, il suffit de lui dire quoi calculer).
    • Puis le parcours passe au '1' suivant, que l'on transforme en entier.
    • Quel est le poids de ce 1 ? (il faudra une variable pour modifier ce poids à chaque tour de boucle)
    • On ajoute à valeur ce 1 multiplié par 2son poids, comme avant.
    • Puis le parcours passe au '1' suivant, que l'on transforme en entier.
    • etc...

Partie B - Écriture binaire par divisions successives

Pour obtenir, un à un, les chiffres d'une écriture binaire, on peut utiliser Les divisions en cascade.
Raisonnons sur l'exemple de l'entier n = 17 :

  • Le chiffre de poids 0 dans l'écriture binaire de n est le reste de la division euclidienne de n par 2 :
    Le chiffre de poids 0 est donc 1.

  • Le chiffre de poids 1 dans l'écriture binaire de n est le reste de la division du quotient précédent par 2 :
    Le chiffre de poids 1 est donc 0.

  • Et on continue ainsi jusqu'à obtenir un quotient nul...

On peut résumer ce raisonnement par une "division en cascade" :

Dans cette division en cascade, on voit que les restes successifs (chiffres rouges) sont les chiffres de l'entier (obtenu à contre-sens de l'écriture usuelle puisqu'on obtient en premier le chiffre des unités) : n = (10001)_2

Lorsqu'on obtient un quotient (nombre noir) nul, on arrête la cascade.

Travail à faire

Utilisez l'algorithme précédent pour compléter le corps de la fonction ecriture_binaire() qui doit renvoyer l'écriture binaire de l'entier nb sous la forme d'une chaîne de caractère.

1
2
3
4
5
6
def ecriture_binaire(nb):
    """
    nb – int, entier positif ou nul
    Sortie: str – chaîne de caractères formée de '0' et de '1'
            qui correspond à l'écriture binaire de nb
    """

Exemple de Tests

>>> ecriture_binaire(117)
'1110101'

>>> ecriture_binaire(3236)
'110010100100'

Partie C - Conversion d'hexadécimal à décimal

  1. Complétez le corps de la fonction chiffre_hexa_2_decim() en respectant ses spécifications.

    1
    2
    3
    4
    5
    def chiffre_hexa_2_decim(chiffre):
        """
        chiffre – str, un seul caractère, qui est un chiffre hexadécimal entre '0' et 'F'
        Sortie: int – la valeur décimale de ce chiffre
        """
    

    Exemple de Tests

    >>> chiffre_hexa_2_decim('7')
    7
    
    >>> chiffre_hexa_2_decim('E')
    14
    
    Une piste

    On pourra utiliser la variable chiffres_hexa = '0123456789ABCDEF'.
    Testez les instructions

    >>> chiffres_hexa[5]
    

    et

    >>> chiffres_hexa[12]
    

    pour vous convaincre de l'utilité de cette chaîne de caractères.

  2. Complétez le corps de la fonction hexa_2_decim(). Vous pouvez faire appel à la fonction chiffre_hexa_2_decim().

    1
    2
    3
    4
    5
    6
    def hexa_2_decim(nb):
        """
        nb – str, écriture hexadécimale d'un entier positif donc formé
             uniquement des chiffres hexadécimaux de '0' à 'F'
        Sortie: int – l'écriture décimale de nb
        """
    

    Exemple de Tests

    >>> hexa_2_decim('75')
    117
    
    >>> hexa_2_decim('CA4')
    3236
    
    Une piste

    Pensez à utiliser la longueur de la chaîne

Partie D - Écriture hexadécimale par divisions successives

Pour obtenir, un à un, les chiffres d'une écriture hexadécimale, on peut utiliser les Les divisions en cascade.
Raisonnons sur l'exemple de l'entier n = 43 981 :

  • Le chiffre de poids 0 dans l'écriture hexadécimale de n est le reste de la division euclidienne de n par 16 :
    Le chiffre de poids 0 est donc D.

  • Le chiffre de poids 1 dans l'écriture binaire de n est le reste de la division du quotient précédent par 16 :
    Le chiffre de poids 1 est donc C.

  • Et on continue ainsi jusqu'à obtenir un quotient nul...

On peut résumer ce raisonnement par une "division en cascade" :

Dans cette division en cascade, on voit que les restes successifs (chiffres rouges) sont les chiffres de l'entier (obtenu à contre-sens de l'écriture usuelle puisqu'on obtient en premier le chiffre des unités) : n = (ABCD)_{16}

Lorsqu'on obtient un quotient (nombre noir) nul, on arrête la cascade.

Travail à faire

  1. On considère la chaîne de caractères chiffres_hexa = '0123456789ABCDEF'.
    Comment utiliser chiffres_hexa pour convertir en chiffre hexadécimal un entier compris entre 0 et 15 ?
    Appelez l'enseignant pour vérifier votre réponse.

  2. Utilisez l'algorithme précédent et la chaîne chiffres_hexa pour compléter le corps de la fonction ecriture_hexa() qui doit renvoyer l'écriture hexadécimale de l'entier nb sous la forme d'une chaîne de caractère.

    1
    2
    3
    4
    5
    6
    def ecriture_hexa(nb):
        """
        nb – int, entier positif ou nul
        Sortie: str – chaîne de caractères, formée de chiffres hexadécimaux entre '0' et 'F',
                qui correspond à l'écriture hexadécimale de n
        """
    

    Exemple de Tests

    >>> ecriture_hexa(117)
    '75'
    
    >>> ecriture_hexa(3236)
    'CA4'
    

Partie E - Écriture binaire par soustractions successives

Cette dernière partie a pour but de reprogrammer la fonction ecriture_binaire() en utilisant cette fois-ci l'algorithme des soustractions successives utilisé en cours.

  1. Compléter le corps de la fonction plus_grand_puissance2() en respectant ses spécifications.

    1
    2
    3
    4
    5
    def plus_grande_puissance2(n):
        """
        n – int, entier naturel non nul
        Sortie: int – le plus grand entier p tel que 2^p <= n
        """
    

    Exemple de Tests

    >>> plus_grande_puissance2(117)
    6
    
    >>> plus_grande_puissance2(3236)
    11
    
  2. Utilisez la fonction plus_grand_puissance2() pour compléter le corps de la fonction ecriture_binaire_bis().

    1
    2
    3
    4
    5
    6
    7
    def ecriture_binaire_bis(nb):
        """
        nb – int, entier positif ou nul
        Sortie: str – chaîne de caractères formée de '0' et de '1'
                qui correspond à l'écriture binaire de nb
                Cette chaîne est obtenue par la méthode des soustractions
        """
    

    Exemple de Tests

    >>> ecriture_binaire_bis(117)
    '1110101'
    
    >>> ecriture_binaire_bis(3236)
    '110010100100'