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ème | Nombre de chiffres | Base | Chiffres |
---|---|---|---|
Binaire | 2 | 2 | 0, 1 |
Octal | 8 | 8 | 0, 1, 2, 3, 4, 5, 6, 7 |
Décimal | 10 | 10 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 |
Hexadécimal | 16 | 16 | 0, 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).
base3 | base2 | base1 | base0 |
---|---|---|---|
Rang 4 | Rang 3 | Rang 2 | Rang 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écimal | 22 | 21 | 20 |
---|---|---|---|
Valeur | 4 | 2 | 1 |
0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 |
2 | 0 | 1 | 0 |
3 | 0 | 1 | 1 |
4 | 1 | 0 | 0 |
5 | 1 | 0 | 1 |
6 | 1 | 1 | 0 |
7 | 1 | 1 | 1 |
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.
- Lire la valeur binaire à transformer en décimal;
- decimal ← 0 (on initialise la variable avec laquelle on va calculer le résultat);
- Pour i allant de 0 à la longueur de binaire - 1 :
- decimal ← decimal + la valeur de l'indice i de binaire multipliée par la valeur de son rang
- 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 rang | 25 | 24 | 23 | 22 | 21 | 20 |
---|---|---|---|---|---|---|
Indice Python | 0 | 1 | 2 | 3 | 4 | 5 |
Valeur binaire | 1 | 1 | 1 | 0 | 0 | 1 |
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 :
- Lire le nombre binaire à transformer comme une chaîne de caractère, comme ça se fait par défaut;
- Transformer cette chaîne de caractères en liste;
- Inverser la liste;
- Multiplier chaque élément de la liste par 2son indice;
- 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.