Bonjour
Je veux réaliser un programme qui permet de convertir un nombre d'une base à une autre.
Est-ce que je dois utiliser les bases les plus connues ???
Bonjour
Je veux réaliser un programme qui permet de convertir un nombre d'une base à une autre.
Est-ce que je dois utiliser les bases les plus connues ???
Non, tu peux très bien faire un algorithme générique de changement de base, c'est pas bien compliqué, tape "changement de base" dans google et regarde le premier résultat.
L'algorithme à implémenter est une simple réécriture de la formule mathématique.
merci beaucoup
loceka
mon programme de transcodage d'une base a une autre ne marche que pour des nombres entiers, que dois-je ajouter pour des nombres réels et bien sûr signés ??!!![]()
Pour les nombres réels, le principe reste le même mais c'est un peu plus compliqué.
Bon, voici la formule de changement de base :
b1 = base 1, c1_i = i-ème coefficient dans [0..b1[
b2 = base 2, c2_k = k-ième coefficient dans [0..b2[
Tout nombre représenté dans la base b1, est associé à un nombre dans la base b2. La relation est :
Somme_i ( c1_i * b1^i ) = Somme_k ( c2_k * b2^k)
Le nombre (2,5)_10 (lire 2,5 en base 10) s'écrit en base 2 :
(2,5)_10 = 1x2^-1 + 0x2^0 + 1x2^2 = (10,1)_2
Pour le traitement d'un nombre réel, il est donc plus simple de séparer la partie entière et la partie décimale.
Tu auras donc :
Partie entière :
Somme_k_de_0_à_n ( c2_k * b2^k )
Partie décimale :
Somme_k_de_-1_à_-m ( c2_k * b2^k )
Voilà pour les nombres réels. Si de plus ton nombre est négatif, il suffit de le positiver pour effectuer le changement de base puis de le négativer une fois que c'est fait.
Après, je te laisse trouver comment obtenir les différents coefficients (indice : sers-toi de la division euclidienne).
merci
beaucoup, je pense pouvoir le faire.
salut tous le monde ,voici une fonction qui permet de changer un nombre de n'importe quelle base vers la base 10,mais le probleme est que je ne comprend pas l'instruction mise en bleue
remarque:cette fonction marche correctement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 function Base10(v1:string;Base:BYTE):LONGINT; var i : BYTE; B10 : LONGINT; begin B10:=0; i:=1; while i<= length(v1)do begin B10:=B10*Base+POS(v1[i],t1)-1; i:=i+1; end; Base10:=B10 end;
1) Utilise la balise CODE.
2) Mets en forme ton source
3) Il est incomplet : il manque la constante t1, qui, je suppose, doit probablement contenir une liste des chiffres usuels, plus les caractères censés être utilisés comme chiffres pour les bases supérieures à 10.
L'instruction en bleue multiplie par la base le résultat précédent de la boucle (ça c'est assez facile à comprendre, si tu n'y arrives pas, il faut étudier mieux que ça la théorie des changements de base), puis ajoute au résultat obtenu la valeur correspondant au "chiffre" de la base donnée, déterminé par sa position dans t1.
Code : Sélectionner tout - Visualiser dans une fenêtre à part const t1 = '0123456789ABCDEF.......'; // <- c'est bien ça ? j'ai bien deviné ?
Exemples : si v1[i] est le caractère 'B', pos(v1[i]) renvoit 12 car B est à la douxième place dans t1, et pos(v1[i])-1 renvoit 11, qui est effectivement la valeur traditionnelle de B en base 16 par exemple.
De même si v1[i] est le caractère '7', pos(v1[i])-1 renvoit 7, etc.
Jal,
N'oublie pas les balises [code] pour mettre ton code.
Bon grillé par CapJack, avant que j'aie eu le temps de tout écrire.
J'étais en train d'écrire à peu près la même chose, mais j'y ajoute :
Cette manière de faire conduit droit à des erreurs de décodage.
Exemples :
Exemple 1 :
- On veut travailler avec une base = 2,
- On entre la chaîne 10102501
Que se passe-t-il : on renvoie une valeur totalement erronée, car on ne fait pas de vérification (ici, des caractères incompatibles avec la base désirée)
Exemple 2 :
J'admets que la chaîne de référence suggérée par CapJack est bonne, et donc
t1 = '0123456789ABCDEF.......'
- On veut travailler en base 16
- On entre la chaîne 4aBe
Même problème que pour le 1er exemple : valeur erronée, car pas de vérification (ici, des caractères en minuscules alors que dans la référence ils sont en majuscules).
Quand on veut décoder une chaîne de caractère, il faut toujours vérifier qu'elle est compatible avec ce que l'on veut faire.
Une fonction de décodage doit donc, au minimum, positionner une variable booléenne à true ou false selon que le décodage est bon ou pas.
A charge alors au programme appelant de gérer le problème s'il reçoit false.
Je préfère carrément une fonction qui renvoie un booléen, avec mise à jour de la valeur décodée dans une variable passée par adresse, car on peut alors écrire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 ... function decode(const chaine : string; var resultat : integer) : boolean; ... var s : string; r : integer; ... { après initialisation de s } if decode(s,r) then begin { code si le décodage a été ok } end else begin { s'il y a eu un problème de décodage } end; ...
Partager