Aller au menu - Aller au contenu

Icône TP : convertisseur de bases

Avatar
Par Avatar mdr1
Mise à jour : 25/10/2011
Difficulté : Intermédiaire Intermédiaire Durée d'étude : 20 minutes Creative Commons BY-NC-ND
924 visites depuis 7 jours, dont 46 sur ce chapitre classé 136/786
Voilà donc comme promis, l'heureux élu convertisseur de bases!

Si vous ne savez pas ce qu'est une base numérique, no problem ! Je vous expliquerais tout ! Bon, d'accord, encore un programme de maths… mais grâce à ça, vous ferez de plus en plus facilement des algorithmes et donc… des jeux ! :p En plus, vous allez apprendre à manier plus facilement les chaînes, les boucles, les listes, etc.
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Les bases : ça veut dire quoi ?

Bon, ça sert à rien d'apprendre à faire un convertisseur de bases si vous ne savez pas ce que c'est. Voilà donc quelques explications :

L'écriture décimale


Ce qu'on utilise dans la vie de tous les jours : elle se caractérise par la base de 10, donc :
  • 10 caractères possibles : 0123456789
  • 2 chiffres significatifs à partir de 10


L'écriture binaire


C'est un système avec des zéros (non, pas nous :lol: ) et des uns. Autrement dit :
  • 2 caractères possibles : 01
  • 2 chiffres significatifs à partir de 2 (s'écrivant 10)


L'écriture hexadécimale


Elle est caractérisée par :
  • 16 caractères possibles : 0123456789ABCDEF
  • 2 chiffres significatifs à partir de 16 (s'écrivant 10)

A ne pas oublier : A=10 ; B=11 ; C=12 ; D=13 ; E=14 ; F=15


Si je ne vous ai montré que le binaire et l'hexadécimal, c'est que les autres bases sont très peu utilisées.

Je pense que vous avez deviné que plus il y a de caractères possibles, plus la taille du nombre (en nombre de chiffres) est diminuée.




Comment convertir un nombre vers la base dix ?


C'est tout bête : on additionne tous les nombres correspondants aux caractères constituants le nombre donc leur valeur fois la base montée à la puissance de son rang.
Exemples (parce-que je suppose que vous avez rien pigé à ce @*"#& de bazar :-° ):
7B6 à base 16 vers le décimal : 7*16^2 + 11*16^1 + 6*16^0 = 1974
10110 à base 2 vers le décimal : 1*2^4 + 0*2^3 + 1*2^2 + 1*2^1 + 0*2^0 = 22
C'est plus clair maintenant ?




Et maintenant, le contraire : de la base 10 vers une base au choix


Il suffit de répéter les étapes suivantes jusqu'à ce que le quotient soit égal à 0.
  1. On effectue une division euclidienne du décimal par la base d'arrivée.
  2. On garde le reste qui servira pour le résultat.
  3. Le quotient devient le dividende de la division suivante.


Exemple avec 8749 (on le veut en binaire) :


Dividende Quotient Reste
8749 4374 1
4374 2187 0
2187 1093 1
1093 546 1
546 273 0
273 136 1
136 68 0
68 34 0
34 17 0
17 8 1
8 4 0
4 2 0
2 1 0
1 0 1

Et maintenant, on inverse l'ordre des restes et on obtient ... 10001000101101 !
C'est beaucoup plus long qu'en décimal, en tout cas.

Mais ?! Notre dernier reste est forcément 1, puisque notre dernier dividende est forcément 1 ! (Essayez, vous verrez !)

Heureusement que oui, car sinon, notre nombre commencerait par 0 ... ce qui est superflu.





2e exemple avec 695 qu'on veut en hexadécimal :


Bon, là, il y a une complication : on peut obtenir un reste qui peut aller jusqu'à 15.
Mais vous souvenez-vous de ce qu'on utilise après le chiffre 9 ? Mais oui ! Les chiffres A, B, C, D, E et F ! Comme on a pas inventé de nouveaux caractères, on utilise par convention les lettres de l'alphabet.
Il va donc falloir rajouter une petite colonne dans ce tableau : écriture.
Dividende Quotient Reste Écriture
695 43 7 7
43 2 11 B
2 0 2 2

Maintenant, on prend les résultats à l’envers ce qui nous donne 2B7.




Convertir un nombre d'une base vers une autre base.


Et ben si on se creuse un peu les méninges, on remarque qu'il suffit d'abord de le convertir en décimal puis en la base voulue !
Je ne perdrais pas de temps à vous montrer un exemple (les tableaux sont très longs à faire), mais ceci dit, vous pouvez toujours essayer !



Maintenant, ça rigole plus : enfin le programme ! :)

Construire le programme pas à pas

Maintenant que l'on connait toutes les étapes pour convertir la base d'un nombre, il ne reste plus qu'a faire la même chose ... mais en programmation.

I) Les préparatifs.



A) Demander à l'utilisateur ses besoins.



Bon, là je vous donne directement le code :

Code : Pascal - Exemple 2.2.2.1
1
2
3
:Input "NB ",Str1 //demande le nombre à convertir
:Input "BA ",C //demande la base de ce nombre
:Input ">B ",D //demande la base désirée


B) Autres préparatifs.



Alors déjà on entre dans une chaîne tous les caractères possibles jusqu'à la base 36 (sauf 0).
Puis on met dans une variable la longueur de la chaîne Str1.

Code : Pascal - 2.2.2.2
1
2
:"123456789ABCDEFGHIJKLMNOPQRSTUVWXYZStr2
:length(Str1A



II) On convertit le nombre en décimal.



Je vais vous expliquer le code au fur et à mesure.

Code : Pascal - Exemple 2.2.2.3
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
:0 //on place zéro dans Ans

:For(Ɵ,1,A //On fait parcourir à Théta (juste après le Z) tous les numéros du premier au dernier caractère de Str1

	:Ans+C^(A-Ɵ)inString(Str2,sub(Str1,Ɵ,1 //On ajoute à Ans la valeur du caractère en cours.
	// si "inSring(" ne trouve pas le caractère correspondant dans Str2, il renvoie zéro (c'est pour ça que je ne l'ai pas mis dans Str2).

:End //fin de la boucle

:AnsB //on stocke dans B le décimal obtenu



III) On convertit le décimal en la base voulue.



Code : Pascal - Exemple 2.2.2.4
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
:"0"+Str2Str2 //On ajoute le zéro dans Str2

:While B //tant que le dividende est positif (le dividende parce-que c'est l'ancien quotient
// et que la boucle "While(" commence par tester la condition avant d'exécuter les instructions.)

	:int(B/DC //on met le quotient obtenu par B/D dans C
	:sub(Str2,B-DC+1,1)+Str1Str1
	//on a B-DC qui est égal au reste de la division
	//on recherche le caractère qui correspond à la valeur du reste ; on ajoute 1 au reste car le caractère n°1 de Str2 est "0".
	//on ajoute donc ce caractère au résultat qui sera affiché
	:CB //l'ancien quotient devient le dividende

:End


IV) L'affichage du résultat.



Le plus simple :

Code : Pascal - Exemple 2.2.2.5
1
2
3
sub(Str1,1,length(Str1)-A //on affiche le résultat en prenant soin d'enlever
                          //le "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" de la fin.
//cette méthode d'affichage est expliquée dans les astuces

Le code complet

Code : Pascal - Exemple 2.2.2.6
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
:Input "NB ",Str1 //demande le nombre à convertir
:Input "BA ",C //demande la base de ce nombre
:Input ">B ",D //demande la base désirée

:"123456789ABCDEFGHIJKLMNOPQRSTUVWXYZStr2
:length(Str1A

:0 //on place zéro dans Ans

:For(Ɵ,1,A //On fait parcourir à Théta (juste après le Z) tous les numéros du premier au dernier caractère de Str1

	:Ans+C^(A-Ɵ)inString(Str2,sub(Str1,Ɵ,1 //On ajoute à Ans la valeur du caractère en cours.
	// si "inSring(" ne trouve pas le caractère correspondant dans Str2, il renvoie zéro (c'est pour ça que je ne l'ai pas mis dans Str2).

:End //fin de la boucle

:AnsB //on stocke dans B le décimal obtenu

:"0"+Str2Str2 //On ajoute le zéro dans Str2

:While B //tant que le dividende est positif (le dividende parce-que c'est l'ancien quotient
// et que la boucle "While(" commence par tester la condition avant d'exécuter les instructions.)

	:int(B/DC //on met le quotient obtenu par B/D dans C
	:sub(Str2,B-DC+1,1)+Str1Str1
	//on a B-DC qui est égal au reste de la division
	//on recherche le caractère qui correspond à la valeur du reste ; on ajoute 1 au reste car le caractère n°1 de Str2 est "0".
	//on ajoute donc ce caractère au résultat qui sera affiché
	:CB //l'ancien quotient devient le dividende

:End

sub(Str1,1,length(Str1)-A //on affiche le résultat en prenant soin d'enlever le "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" de la fin.


  • Remarque : lors de l'exécution du programme, entrez un nombre d'une base de 1 à 36 et demandez la conversion en une base de 2 à 36.
  • Astuce : pour exécuter à nouveau le programme, appuyez simplement sur la touche Image utilisateur

Q.C.M.

Qu'est-ce la base d'un nombre ? (Faites gaffe, c'est bourré de pièges)
Bon allez, un peu plus facile. :p
Comment convertit-on un nombre d'une base vers une autre (sur la TI) ?

Statistiques de réponses au QCM

Voilà ! Vous pouvez passer à la partie suivante. :ange:
Chapitre précédent Sommaire Chapitre suivant

Partager

17 commentaires pour "TP : convertisseur de bases"
Note moyenne : 3.68 / 4 (40 votes)
Pseudo Commentaire
Hors ligne mdr1 # Posté le 19/04/2012 à 18:03:49
你好吗?我很好!
Avatar

Avis : Très bon

Oups, pardon, je n'avais pas vu ton message.

Alors en fait je crois que y a un truc que t'as pas compris pour le tutoriel : ici, tu n'es pas dans un tutoriel, mais dans un chapitre de tutoriel. Pour accéder au sommaire (où il y a l'intro), soit tu cliques sur "Apprenez à programmer en TI-Basic !" dans le "Le Site du Zéro - Informatique > Cours > Tutoriels > Programmation > Calculatrices > Ti > Apprenez à programmer en TI-Basic ! > Notions avancées > TP : convertisseur de bases > Lecture du tutoriel", soit tu regardes juste en dessous de l'intro, tu clique sur le lien avec une maison et une flèche. Pour passer d'un chapitre à l'autre, tu cliques sur les flèches gauche et droite.

Pour l'optimisation, celle-ci ne marche pas avec les 68k. De toutes façons, ce n'est pas grave car la TI-92 est bien plus rapide et a beaucoup plus de mémoire.

Pour l'erreur, je suppose qu'elle se produit à la ligne 26. Essaye "While b≠0". Ensuite, n'oublie pas de demander explicitement un affichage ligne 32.
 
Hors ligne Nomanoclass # Posté le 22/04/2012 à 00:33:01
4661696c6c69206e65737420706173
Avatar

Mmmmh je voie...
Et pour afficher, je dois afficher le résultat, ok, mais il est stocké dans quelle variable?

[code]
sub(Str1,1,length(Str1)-A //on affiche le résultat en prenant soin d'enlever le "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" de la fin.

//je mets ça?
mid(Str1,1,dim(Str1)-A
Disp Str2 //ça me donne la chaine de caractère 0123456789...
[/code]

Code : VB.NET
1
2
NULL=0
VOID="Impossible de décrire"
 
Hors ligne mdr1 # Posté le 22/04/2012 à 14:10:45
你好吗?我很好!
Avatar

Avis : Très bon

Plutôt que de faire mid(String,1,nombre) tu peux faire : left(String,nombre).
N'oublie pas de fermer les parenthèses. Et pour l'affichage, pas besoin de stocker quelque part, tu peux faire Disp left(...)
N'hésite pas à fouiller le site que je t'ai donné : http://tibasicdev.wikidot.com/
 
Hors ligne Nomanoclass # Posté le 24/04/2012 à 02:50:55
4661696c6c69206e65737420706173
Avatar

Ah ouai ok, mais il ne m'affiche rien :S j'ai du faire une faute d’inattention comme d'habitude T_T

Code : VB.NET
1
2
NULL=0
VOID="Impossible de décrire"
 
Hors ligne mdr1 # Posté le 24/04/2012 à 10:17:10
你好吗?我很好!
Avatar

Avis : Très bon

Euh, je crois que c'est Text left(...) et pas Disp left(...).
PS : cette section est censée être réservée aux commentaires pour le tutoriel et non pour les questions. Je t'invite donc à poursuivre tes questions si tu en as d'autres à cet endroit : http://www.siteduzero.com/forum-83-566 [...] ti-basic.html

@+ ;)
 

Voir tous les commentaires