Apprenez à programmer en TI-Basic !
Last updated on Friday, June 21, 2013
  • 1 semaine
  • Facile

Free online content available in this course.

Got it!

TP : convertisseur de bases

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.

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 :

: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.

:"123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ→Str2
:length(Str1→A

II) On convertit le nombre en décimal.

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

: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

:Ans→B //on stocke dans B le décimal obtenu

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

:"0"+Str2→Str2 //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/D→C //on met le quotient obtenu par B/D dans C
	:sub(Str2,B-DC+1,1)+Str1→Str1
	//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é
	:C→B //l'ancien quotient devient le dividende

:End

IV) L'affichage du résultat.

Le plus simple :

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

: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

:"123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ→Str2
:length(Str1→A

: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

:Ans→B //on stocke dans B le décimal obtenu

:"0"+Str2→Str2 //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/D→C //on met le quotient obtenu par B/D dans C
	:sub(Str2,B-DC+1,1)+Str1→Str1
	//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é
	:C→B //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.

Voilà ! Vous pouvez passer à la partie suivante. :ange:

The author

Check out this course in other formats...

Example of certificate of achievement
Example of certificate of achievement