Exercice 23 : Transformer le binaire en décimal

 Préliminaire 

La résolution de cet exercice nécessite que vous ayez lu la résolution de l'exercice précédent, le numéro 22. Sans cela, vous ne pourrez pas comprendre les explications de la présente résolution.

 Énoncé 23 

Réalisez un programme qui transforme un nombre binaire demandé à l'utilisateur en sa valeur décimale.

Notre système de numération (notre façon de compter) est organisée sur un système de rangs et de base.

La base d'un système numérique est le nombre de chiffres disponibles :

SystèmeNombre de chiffresBaseChiffres
Binaire220, 1
Octal880, 1, 2, 3, 4, 5, 6, 7
Décimal10100, 1, 2, 3, 4, 5, 6, 7, 8, 9
Hexadécimal16160, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

Les rangs sont les positions des chiffres les uns par rapport aux autres. Le rang le plus à droite, le rang 1, est toujours celui des unités (base0).

base3base2base1base0
Rang 4Rang 3Rang 2Rang 1

Quand on commence à compter, dans n'importe quelle base, on met 0 dans le rang 1. Ensuite, on ajoute une unité... et, quand on arrive à la limite des chiffres disponibles, on écrit 0 dans le rang et on reporte 1 au rang immédiatement supérieur. Voici ce que ça donne en binaire.

Décimal222120
Valeur421
0000
1001
2010
3011
4100
5101
6110
7111

Ce tableau permet de voir que, pour chaque ligne, si on additionne les valeurs des cases multipliées par la valeur de leur rang, on obtient la valeur décimale. Exemple : pour la dernière ligne, 4+2+1 = 7.

C'est sur ce principe qu'on va se baser pour transformer un nombre de n'importe quelle base vers le décimal.

 Analyse 

On peut considérer que l'analyse a été faite ci-dessus :

A. Le Quoi Faire.

  1. Lire la valeur binaire à transformer en décimal;
  2. decimal ← 0 (on initialise la variable avec laquelle on va calculer le résultat);
  3. Pour i allant de 0 à la longueur de binaire - 1 :
  4.     decimal ← decimal + la valeur de l'indice i de binaire multipliée par la valeur de son rang
  5. Affiche+nl "le nombre binaire ", binaire, " vaut ", decimal, " en décimal."

B. Le Comment Faire.

Les choses sont relativement simples, sauf pour le contenu de la boucle pour. Prenons l'exemple du nombre binaire 111001 à transformer en décimal.

Valeur du rang252423222120
Indice Python012345
Valeur binaire111001

On va extraire un chiffre après l'autre de 111001 et l'indice de chaque chiffre sera exactement l'inverse de l'exposant de 2 pour obtenir sa valeur.

Il existe deux solutions : une faisant intervenir une liste, l'autre faisant intervenir une astuce mathématique. Nous allons examiner la solution avec la liste. La solution mathématique sera donnée plus bas, à vous d'en trouver l'explication.

L'idée est la suivante :

  1. Lire le nombre binaire à transformer comme une chaîne de caractère, comme ça se fait par défaut;
  2. Transformer cette chaîne de caractères en liste;
  3. Inverser la liste;
  4. Multiplier chaque élément de la liste par 2son indice;
  5. Additionner ces valeurs dans decimal et afficher decimal.

Lecture au clavier... attention robustesse !!! On veillera à lire un ensemble de 0 et de 1 et rien d'autre.

 Le programme en pseudo-code 

Voici le résultat de nos cogitations traduit en pseudo-code.

Affiche+nl "Ce programme va transformer le nombre binaire qui vous sera demandé en sa valeur décimale."
Affiche "Veuillez me donner le nombre binaire à transformer en décimal : "
Lis et colle sur binaire
Tant Que binaire contient autre chose que des 0 ou des 1 Fais
    Affiche "Erreur, merci de donner un nombre binaire (des 1 et des 0) : "
    Lis et colle sur binaire
Fin Tant Que
liste_binaire ← binaire convertie en liste
Inverser liste_binaire
decimal ← 0
Pour i allant de 0 à la longueur de liste_binaire - 1 Fais
    decimal ← decimal + liste_binaire[i] * 2 ** i # ** calcule l'exposant
Fin Pour
Affiche+nl "le nombre binaire ", binaire, " vaut ", decimal, " en décimal."

 Le programme en Python 

print ("Ce programme va transformer le nombre binaire qui vous sera demandé en sa valeur décimale.")
erreur = True
while erreur :
    binaire = input ("Quel est le nombre binaire à transformer en décimal ? ")
    erreur = False
    for i in range(len(binaire)) :
        if binaire[i] != "0" and binaire[i] != "1" :
            erreur = True
liste_binaire = list(binaire.strip()) # transformation du contenu de la variable binaire en liste
liste_binaire.reverse() # Attention, il s'agit d'une liste de caractères et non de chiffres
decimal = 0
for i in range (len(liste_binaire)) :
    decimal += int(liste_binaire[i]) * 2 ** i # int pour transformer le caractère en chiffre
print ("le nombre binaire", binaire, "vaut", decimal, "en décimal.")

Vous pouvez "copier-coller" ce programme dans votre éditeur IDLE pour vérifier s'il fonctionne selon les spécifications de départ.

 Alternative matheuse 

Voici une autre manière de rédiger le programme sans utiliser de liste. Pouvez-vous expliquer comment ce programme fonctionne pour donner son résultat ?

print ("Ce programme va transformer le nombre binaire qui vous sera demandé en sa valeur décimale.")
erreur = True
while erreur :
    binaire = input ("Quel est le nombre binaire à transformer en décimal ? ")
    erreur = False
    for i in range(len(binaire)) :
        if binaire[i] != "0" and binaire[i] != "1" :
            erreur = True
decimal = 0
for i in range (len(binaire)) :
    decimal += int(binaire[len(binaire) - 1 - i]) * 2 ** i
print ("le nombre binaire", binaire, "vaut", decimal, "en décimal.")

Vous pouvez "copier-coller" ce programme dans votre éditeur IDLE pour vérifier s'il fonctionne selon les spécifications de départ.

Bonne poursuite de votre apprentissage.

Retour