É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.000 | Paquets de 1.000 | Paquets de 100 | Paquets de 10 | Arbres seuls |
---|---|---|---|---|
104 | 103 | 102 | 101 | 100 |
Dix milliers | Milliers | Centaines | Dizaines | Unités |
0 | 1 | 0 | 8 | 7 |
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 :
Valeur | Division | Résultat | Reste |
---|---|---|---|
1.087 | Par 10 | 108 | 7 |
108 | Par 10 | 10 | 8 |
10 | Par 10 | 1 | 0 |
1 | Par 10 | 0 | 1 |
Résultat = 1.08710 (le 10 veut dire "en base 10")
Quand vous ferez ces calculs, vous devez veiller à trois choses importantes :
- Le résultat d'une ligne est repris comme la valeur de la ligne suivante (cases bleues);
- Pour que le calcul soit complet, vous devez nécessairement terminer avec un 0 dans le résultat de la division (case verte);
- 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 64 | P. de 32 | P. de 16 | P. de 8 | P. de 4 | P. de 2 | Arbre seul |
---|---|---|---|---|---|---|
26 | 25 | 24 | 23 | 22 | 21 | 20 |
0 | 1 | 1 | 1 | 0 | 0 | 1 |
Total→ | 32 | 16 | 8 | 0 | 0 | 1 |
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 :
Valeur | Division | Résultat | Reste |
---|---|---|---|
57 | Par 2 | 28 | 1 |
28 | Par 2 | 14 | 0 |
14 | Par 2 | 7 | 0 |
7 | Par 2 | 3 | 1 |
3 | Par 2 | 1 | 1 |
1 | Par 2 | 0 | 1 |
Résultat : 5710 = 1110012
Le principe est le même que ci-dessus, vous devez veiller à trois choses importantes :
- Le résultat d'une ligne est repris comme la valeur de la ligne suivante (cases bleues);
- Pour que le calcul soit complet, vous devez nécessairement terminer avec un 0 dans le résultat de la division (case verte);
- 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.
- Lire la valeur décimale à transformer en binaire;
- calcul ← valeur (on va garder une copie de la valeur en décimal et travailler sur calcul);
- Tant que calcul n'est pas égal à 0:
- restes ← reste de la division entière de calcul par 2;
- calcul ← résultat de la division entière de calcul par 2;
- 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.