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 ???
Version imprimable
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 ??!!:help:
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).
:yaisse2: merci: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:
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: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 :D.
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:
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; ...
pour le tableau t je l'ai fais mais je me suis arrété a 'f' est ce que c'est juste? pour la fonction je l'ai fais c bon une qui verifie si le nombre est juste et l'autre qui convertie en majuscule.
je vs remercie de votre aide.:ccool:
Oui si tu n'as pas besoin d'aller au-delà de la base 16.Citation:
je l'ai fais mais je me suis arrété a 'f' est ce que c'est juste?
oui mais moi je veus aller au dela de 16...
Ial,
Seulement comme exercice ou dans un but bien déterminé ?Citation:
Envoyé par nawal.02
Si c'est à titre d'exercice, ça ne présente pas beaucoup d'intérêt, car si tu sais faire le transcodage pour les bases 2 à 16, les autres ne te poseront pas de problème.
Je suppose donc que c'est dans un but précis.
Dans ce cas, il va falloir faire attention aux caractères que tu utiliseras pour représenter les valeurs dans les autres bases.
Jusqu'à l'utilisation de "Z", pas de problème, c'est après.
Il existe des choses plus ou moins standard à ce niveau là, je ne sais plus très bien, car je n'ai fait que survoler les textes qui en parlaient.
En particulier, il me semble qu'il y a des composants de chez M$ qui utilisent la base 64, mais c'est très vague dans mon esprit, je ne suis même plus sûr que ce soit chez M$ :).
ok j'essayerais de chercher plus.:merci: pour votre aide.
salut: j'ai un probléme avec cette fonction elle ne veux pas marcher::furieux:
c'est une fonction qui permet de convertir un nombre(réel ou entier) de n'importe quelle base vers la base 10.Code:
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
34
35
36
37
38
39
40
41
42
43 function Base_10(St:string;Base:longint):real; var i,l,l1,l2,k,r : longint; b1,b2 : real; nbr1:string; begin i:=1; nbr:=''; l:=length(st); while (st[i]<>'.')and (i<=l) do begin nbr1:=nbr1+st[i]; i:=i+1; end; l1:= length(nbr1); r:=1; b1:=0; while r<= l1 do begin B1:=B1+(POS(nbr1[r],t1)-1)*power(base,(l1-r)); r:=r+1; end; if st[i]='.' then begin k:=i+1; nbr2:=''; while i<=l do begin nbr2:=nbr2+st[k]; k:=k+1; end; l2:=length(nbr2); j:=1; b2:=0; while j<=l2 do begin b2:=b2+(POS(nbr2[j],t1)-1)*power(base,(l2-j)); j:=j+1; end; end; Base_10:=b1+b2; end;
ou est le probléme?????:(
Lre,
Ça compile ce truc ? :D
J'y vois au moins l'utilisation d'une variable non déclarée, qui entraîne l'utilisation d'une variable non utilisée.
Je ne suis pas allé plus loin :)
Revoici ton code NON CORRIGÉ mis en forme de manière un peu plus classique concernant l'indentation (ce n'est qu'une préférence).
Il serait bon d'aérer le code avec des lignes vides pour séparer les différentes parties du traitement, ET de mettre des commentaires, qui deviennent d'autant plus utiles que le code s'allonge :)Code:
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
34
35
36
37
38
39
40
41
42
43 function Base_10(St: string; Base: longint): real; var i, l, l1, l2, k, r: longint; b1, b2: real; nbr1: string; begin i := 1; nbr := ''; l := Length(st); while (st[i] <> '.') and (i <= l) do begin nbr1 := nbr1 + st[i]; i := i + 1; end; l1 := Length(nbr1); r := 1; b1 := 0; while r <= l1 do begin B1 := B1 + (Pos(nbr1[r], t1) - 1) * power(base, (l1 - r)); r := r + 1; end; if st[i] = '.' then begin k := i + 1; nbr2 := ''; while i <= l do begin nbr2 := nbr2 + st[k]; k := k + 1; end; l2 := Length(nbr2); j := 1; b2 := 0; while j <= l2 do begin b2 := b2 + (Pos(nbr2[j], t1) - 1) * power(base, (l2 - j)); j := j + 1; end; end; Base_10 := b1 + b2; end;
merci a tous ceux qui m'on aidé a realisé ce tp:king: