Exercice 22 : Transformer le décimal en binaire

 Énoncé 22 

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

 La légende du bûcheron 

Dans l'ancien temps, il était une fois un bûcheron qui était très fort. Il ne savait compter que jusqu'à 10 mais il était très très fort.

Toute l'année, il abattait des arbres pour le roi et, en fin d'année, il devait dire au roi combien d'arbres il avait abattu.

Cette année-là, il avait abattu 1.087 arbres. Il ne savait compter que jusqu'à 10 et pourtant, il a pu annoncer combien d'arbres il avait abattu au roi. Voici comment il a procédé.

Il a pris les arbres et il a fait des tas de 10 (il était très fort). Il lui est resté 7 arbres avec lesquels il n'a pas pu faire un paquet de 10.

Il a alors pris les paquets de 10 et il en a fait des paquets de 10, c'est-à-dire qu'il a fait des paquets de 100. Il lui est alors resté 8 paquets de 10 avec lesquels il n'a pas pu faire un paquet de 100.

Il a alors pris les paquets de 100 et il en a fait des paquets de 10 (quand on vous dit qu'il était très fort...) et donc des paquets de 1.000. Et cette fois, c'est tombé juste, il lui restait 0 paquets de 100.

Il a voulu faire des paquets de 10 avec les paquets de 1.000, mais il n'a pas pu il n'avait que 1 paquet de 1.000, il s'est donc arrêté de faire des paquets.

Il a alors pris un papier, il a noté le 7 à droite. Devant le 7, il a mis le 8, devant le 8 il a mis le 0 et devant le 0 il a mis le 1. Si on reporte cela dans un tableau, on obtient ceci :

Paquets de 10.000Paquets de 1.000Paquets de 100Paquets de 10Arbres seuls
104103102101100
Dix milliersMilliersCentainesDizainesUnités
01087

En résumé, le système du bûcheron a fonctionné comme ceci. En partant de la valeur initiale, il a effectué une division entière par la base, 10, il a gardé le reste et utilisé le résultat pour faire la division suivante. Cela a donné ceci :

ValeurDivisionRésultatReste
1.087Par 101087
108Par 10108
10Par 1010
1Par 1001

Résultat = 1.08710 (le 10 veut dire "en base 10")

Quand vous ferez ces calculs, vous devez veiller à trois choses importantes :

  1. Le résultat d'une ligne est repris comme la valeur de la ligne suivante (cases bleues);
  2. Pour que le calcul soit complet, vous devez nécessairement terminer avec un 0 dans le résultat de la division (case verte);
  3. Le résultat de la transformation est obtenu en notant les restes, le premier reste est celui des unités qui doit être noté le plus à droite (case rose).

Nous avons fonctionné en décimal, en base 10, ce qui peut paraître loufoque vu que nous obtenons le même résultat qu'au départ. Mais cela va nous permettre de comprendre comment cela fonctionne dans d'autres bases, notamment en binaire, en base 2, comme ci-dessous. Le processus fonctionne pour toutes les bases, octal (base 8), hexadécimal (base 16)...

 Le fils du bûcheron 

Le bûcheron avait un fils, mais comme le bûcheron était très occupé à abattre des arbres et à faire des paquets, le fils du bûcheron ne savait compter que jusqu'à 2.

Et le fils a commencé à abattre des arbres. Bien sûr, au début, il était moins fort que son père. La première année, il a abattu 57 arbres. Il devait communiquer ce nombre au roi.

Alors, le fils du bûcheron a fait des paquets de 2. Il s'est retrouvé avec 28 paquets de 2 et il lui restait 1 arbre tout seul.

Il a alors fait des paquets de 2 avec les paquets de 2, il a obtenu 14 paquets de 4 et il lui restait 0 paquets de 2.

Il a fait des paquets de 2 avec les paquets de 4, soit des paquets de 8. Il en a obtenu 7 et il lui restait 0 paquets de 4.

Il a fait des paquets de 2 avec les paquets de 8, soit des paquets de 16. Il en a obtenu 3 et il lui restait 1 paquets de 8.

Il a fait des paquets de 2 avec les paquets de 16, soit des paquets de 32. Il en a obtenu 1 et il lui restait 1 paquets de 16.

Il a voulu faire des paquets de 2 avec les paquets de 32, soit des paquets de 64 mais il n'a pas pu, il lui restait 1 paquets de 32.

Il a alors pris un papier et il a commencé à noter de la droite vers la gauche les 1 et les 0 qui lui restaient après avoir fait les paquets. Si on reporte cela dans un tableau, on obtient ceci :

P. de 64P. de 32P. de 16P. de 8P. de 4P. de 2Arbre seul
26252423222120
0111001
Total→32168001

Naturellement, quand le fils du bûcheron est venu devant le roi en lui disant qu'il avait abattu 111001 arbres, le roi n'a rien compris.

Heureusement, il y avait un grand mathématicien qui était présent et, quand il a compris que le fils ne savait compter que jusqu'à 2, il a fait le total des puissances de 2 et a obtenu 32+16+8+1 = 57 arbres. Tout le monde était content de voir que le fils deviendrait aussi fort que son père, mais que le mathématiciens devrait toujours être présent en fin d'année pour passer du comptage jusqu'à 2 (binaire, 0 et 1) au comptage jusqu'à 10 (décimal avec 10 chiffres de 0 à 9).

En résumé, le système du fils du bûcheron a fonctionné comme ceci. En partant de la valeur initiale, il a effectué une division entière par la base, 2, il a gardé le reste et utilisé le résultat pour faire la division suivante. Cela a donné ceci :

ValeurDivisionRésultatReste
57Par 2281
28Par 2140
14Par 270
7Par 231
3Par 211
1Par 201

Résultat : 5710 = 1110012

Le principe est le même que ci-dessus, vous devez veiller à trois choses importantes :

  1. Le résultat d'une ligne est repris comme la valeur de la ligne suivante (cases bleues);
  2. Pour que le calcul soit complet, vous devez nécessairement terminer avec un 0 dans le résultat de la division (case verte);
  3. Le résultat de la transformation est obtenu en notant les restes, le premier reste est celui des unités qui doit être noté le plus à droite (case rose).

 Conclusions 

Les processus sont les suivants :

  • Pour passer du décimal vers une autre base, vous devrez utiliser le processus du bûcheron ou de son fils;
  • Pour passer d'une autre base vers le décimal, vous devrez utiliser le processus du mathématicien ci-dessus mais nous y reviendrons dans l'exercice suivant numéro 23.

 Analyse 

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

A. Le Quoi Faire.

  1. Lire la valeur décimale à transformer en binaire;
  2. calculvaleur (on va garder une copie de la valeur en décimal et travailler sur calcul);
  3. Tant que calcul n'est pas égal à 0:
  4.     restes ← reste de la division entière de calcul par 2;
  5.     calcul ← résultat de la division entière de calcul par 2;
  6. Affiche+nl "le nombre décimal ", valeur, " vaut ", restes, " en binaire."

B. Le Comment Faire.

Les choses sont relativement simples, le tout est de savoir comment retenir la succession des restes des divisions par 2... Devinez quoi ? On va utiliser une liste... :O)

Lecture au clavier... attention robustesse !!! On veillera à lire un entier positif.

 Le programme en pseudo-code 

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

Affiche+nl "Ce programme va transformer le nombre décimal qui vous sera demandé en sa valeur binaire."
Affiche "Veuillez me donner le nombre décimal à transformer en binaire : "
Lis et colle sur valeur
Tant Que valeur n'est pas un entier positif Fais
    Affiche "Erreur, merci de donner un entier positif : "
    Lis et colle sur valeur
Fin Tant Que
calcul ← valeur convertie en entier
Tant Que calcul > 0 Fais
    restes ← calcul mod 2
    calcul ← calcul div 2
Fin Tant Que
Affiche+nl "le nombre décimal ", valeur, " vaut ", restes, " en binaire."

Attention, quand l'instruction restes ← calcul mod 2 sera effectuée, il faudra veiller à mettre chaque nouveau reste en début de liste, le premier reste (unités) doit se trouver à droite, en fin de liste.

 Le programme en Python 

print ("Ce programme va transformer le nombre décimal qui vous sera demandé en sa valeur binaire.")
restes = []
valeur = input ("Quelle est le nombre à transformer en binaire ? ")
while not valeur.isnumeric() :
    valeur = input ("Erreur, veuillez donner un nombre entier positif : ")
calcul = int (valeur)
while calcul > 0 :
    restes.insert (0, calcul % 2) # % permet d'obtenir le reste de la division entière
    calcul = calcul // 2 # // permet d'obtenir la division entière
print ("le nombre décimal", valeur, "vaut", end=" ")
for i in restes :
    print (i, end="") # Pour imprimer sans les crochets ni les virgules
print (" en binaire.")

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