Forum

Catégorie : Programmes
Forum : Les programmes des internautes
Vues : 3318
Réponses : 24
Type : discussion
Etat : réponses autorisées

Convertisseur (n'importe quelle base) - Page 1 / 2

snap le 14/10/2012 à 20:23
Salut, sa fait longtemps que j'ai rien mis Oo donc pour me faire pardonner (bah oui je devais vous mettre un monopoly que j'ai d'ailleurs toujours l'intention de finir) je vous ai fait un superbe convertisseur hum... Il est trèèèèès lent, mais il est tellement bien et j'ai mis tellement de temps a le faire! (2h). Le voila, en plus il est trèèèès long (398 octets environ)

Code

:" -> Chaîne 3
:"0123456789abcdefghijklmnopqrstuvwxyz -> Chaîne 0
:Repeat C
:Repeat A<37 et A>0 et B>0 et B<37
:Input "BASE NOMBRE :    ",A
:1 -> C
:Input "NOMBRE :         ",Chaîne 1
:Input "BASE FINALE :    ",B
:sous-chaîne(Chaîne0,1,A -> Chaîne2
:sous-châine(Chaîne0,1,B -> Chaîne0
:For(D,1,longueur(Chaîne1
:Ccarchaîne(Chaîne2,sous-chaîne(Chaîne1,D,1 -> C   <-- Oubliez pas le C au début
:End
:End
:End
:EffVar EFor(D,longueur(Chaîne1),1,-1
:E+(carChaîne(chaîne2,sous-chaîne(Chaîne1,D,1))-1)A^(longueur(Chaîne1)-D -> E
:End
:-1 -> V
:EffVar SWhile S<E
:V+1 -> V
:B^V -> S
:End
:For(W,V,0,-1
:PartEnt(E/B^W -> X
:Chaîne3+sous-chaîne(chaîne0,X+1,1 -> Chaine3
:E-XB^W -> E
:End
:sous-Chaîne(Chaîne3,2,longueur(Chaîne3)-1 -> Chaîne3
:Disp "
:If "0"=sous-chaîne(Chaîne3,1,1
:sous-chaîne(Chaîne3,2,longueur(Chaîne3)-1 -> Chaîne3
:Chaîne3


Voila voila. Comme d'hab vu qu'il y a plein de truc a améliorer, faut me les dire crazy.gif. Tout commentaire est le bienvenue.
En espérant que ce programme vous comblera de bonheur.
Cordialement,

Votre humble serviteur, SNAP.
linkakro le 14/10/2012 à 22:08
La réduction de Chaine0 pour n'avoir que le stricte nécessaire est originale mais innutile.

L'algorithme de division euclidienne par les puissances de Base maximales est intéressant mais moins performant que les divisions successives par Base.
... modulo(modulo(...,64),32), ... ) ; ce que tu fais pour Base=2
... ent(ent(X/2)/2) ... ; le plus optimisé pour Base=2
Les divisions par Base permettent de s'arrêter dès qu'un reste est nul, et d'avoir facilement la décomposition en relisant à l'envers les restes des divisions.
Persalteas le 15/10/2012 à 13:06
Je me demande quel code est le plus léger entre celui là et celui de linkakro tongue.gif

Rapport à Algebrepowa...
linkakro le 15/10/2012 à 18:48
For(D,1,longueur(Chaîne1),1,-1
est faux, cause une erreur argument.

Le code de snap (malgré l'erreur argument) occupe actuellement dans mon vti 395 octets.
Ma meilleure version incluant la reconversion occupe 268 octets.
(celle la plus légère sans option et sans les astuces de mdr1 est 4 octets plus lourde que celle de mdr1)
snap le 16/10/2012 à 23:20
Ah oui, sa doit être :

Code
For(D,longueur(Chaîne1),1,-1


Je suis pas sur et j'ai pas le programme sur moi la, je confirmerai ou non demain. Pour ceux que sa interesse mon monopoly est quasi-fini, manque plus que le parc gratuit, les caisses de communauté et chance à faire, quelques petits trucs a faire pour que sa rende joli et c'est terminé. Vous l'aurez dans quelques semaines tout au plus. Il est pas très très long, environ 6-7000 octets en additionnant les quatres programmes. Je vais surement les regrouper pour faire un seul programme, se sera plus simple, quoi que...
Skull le 02/12/2012 à 00:36
Bonjour,

J'ai fais aussi un convertisseur mais le mien a la particularité d'être très rapide, je l'ai même ralentie pour des effets qui ne servent que pour l'ergonomie. Si sa vous intéresse je peut vous le poster. 1068o de taille avec les effets...

-Skull-
linkakro le 02/12/2012 à 00:50
Allez, poste happy.gif
Je préfère que tu le postes dans un nouveau sujet mais après tout le faire ici permet de rassembler les programmes semblables.

Je ne m'attend pas à ce qu'il surpasse ceux de mdr1 et moi, mais qui-sait, tu as peut-être révolutionné le calcul des bases.
Skull le 02/12/2012 à 11:24
Bonjour,

Inscription faite ! bigmouth.gif Je ne pense pas que je vais le regretter.

Ensuite je ne pense absolument pas révolutionner le calcule de base ! happy.gif
Et il y a peu de chance qu'il soit meilleur que le votre... A voir.

Je vais le poster ici en deux partie une avec les effets et l'autre sans les effets (en optimisation ^^). Je ne poste que la conversion binaire -> Décimal et
Décimal -> Binaire

Code

Version avec effet:

While W[différent de]2 or W[différent de]10
ClrHome
Disp "En quel base ?
Input ":",W
If w=2:Goto 2
If W=10:Goto 3
End

Lbl 2
2->B
ClrHome
Disp "Nombre a","convertir ?
Inuput ":",A
ClrHome
int (A/B)->Q
A-B*Q->R
R->J
Output(1,1,"°
69!
int (Q/B)->Z
Q-B*Z->R
R-I
Output(1,2,"°
69!
int (Z/B)->Q
Z-B*Q->R
R->H
Output(1,3,"°
69!
int (Q/B)->Z
Q-B*Z->R
R->G
Output(1,4,"°
69!
int (Z/B)->Q
Z-B*Q->R
R->F
Output(1,5,"°
69!
int (Q/B)->Z
Q-B*Z->R
R->E
Output(1,6,"°
69!
int (Z/B)->Q
Z-B*Q->R
R->D
Output(1,7,"°
69!
int (Q/B)->Z
Q-B*Z->R
R->C
Output(1,8,"°
69!
ClrHome
Output(1,1,A
Output(2,2,"=
Output(3,1,C
Output(3,2,D
Output(3,3,E
Output(3,4,F
Output(3,5,G
Output(3,6,H
Output(3,7,I
Output(3,8,J
Disp "
Stop

Lbl 3
ClrHome
Disp "Entre le premier","caractere puis","tape Enter.
Input "1:",A
Input "2:",B
Input "3:",C
Input "4:",D
Input "5:",E
Input "6:",F
Input "7:",G
Input "8:",H
ClrHome
Output (3,1,"Est-le bon nombre ?

Output (4,1,A
Output (4,2,B
Output (4,3,C
Output (4,4,D
Output (4,5,E
Output (4,6,F
Output (4,7,G
Output (4,8,H
Output (5,1,"1=Oui 2=Non ?
Input ":",Q
If Q=1:Goto 4
If Q=2:Goto 3

Lbl 4
ClrHome

If A=0:0->I
If A=1:128->I
Output(1,1,"°
69!

If B=0:0->J
If B=1:64->J
Output(1,2,"°
69!

If C=0:0->K
If C=1:32->K
Output(1,3,"°
69!

If D=0:0->L
If D=1:16->L
Output(1,4,"°
69!

If E=0:0->M
If E=1:8->M
Output(1,5,"°
69!

If F=0:0->N
If F=1:4->N
Output(1,6,"°
69!

If G=0:0->O
If G=1:2->O
Output(1,7,"°
69!

If H=0:0->P
If H=1:1->P
Output(1,8,"°
69!

I+J+K+L+M+N+O+P->R

ClrHome
Output (1,1,A
Output (1,2,B
Output (1,3,C
Output (1,4,D
Output (1,5,E
Output (1,6,F
Output (1,7,G
Output (1,8,H
Output (2,2,"="
Output (3,1,R
Pause

<------------------------------------------------------>

Version sans effet :

While W[différent de]2 or W[différent de]10
ClrHome
Disp "En quel base ?
Input ":",W
If w=2:Goto 2
If W=10:Goto 3
End

Lbl 2
2->B
ClrHome
Disp "Nombre a","convertir ?
Inuput ":",A
ClrHome
int (A/B)->Q
A-B*Q->R
R->J
int (Q/B)->Z
Q-B*Z->R
R-I
int (Z/B)->Q
Z-B*Q->R
R->H
int (Q/B)->Z
Q-B*Z->R
R->G
int (Z/B)->Q
Z-B*Q->R
R->F
int (Q/B)->Z
Q-B*Z->R
R->E
int (Z/B)->Q
Z-B*Q->R
R->D
int (Q/B)->Z
Q-B*Z->R
R->C
ClrHome
Output(1,1,A
Output(2,2,"=
Output(3,1,C
Output(3,2,D
Output(3,3,E
Output(3,4,F
Output(3,5,G
Output(3,6,H
Output(3,7,I
Output(3,8,J
Disp "
Stop

Lbl 3
ClrHome
Disp "Entre le premier","caractere puis","tape Enter.
Input "1:",A
Input "2:",B
Input "3:",C
Input "4:",D
Input "5:",E
Input "6:",F
Input "7:",G
Input "8:",H
ClrHome
Output (3,1,"Est-le bon nombre ?

Output (4,1,A
Output (4,2,B
Output (4,3,C
Output (4,4,D
Output (4,5,E
Output (4,6,F
Output (4,7,G
Output (4,8,H
Output (5,1,"1=Oui 2=Non ?
Input ":",Q
If Q=1:Goto 4
If Q=2:Goto 3

Lbl 4
ClrHome

If A=0:0->I
If A=1:128->I

If B=0:0->J
If B=1:64->J

If C=0:0->K
If C=1:32->K

If D=0:0->L
If D=1:16->L

If E=0:0->M
If E=1:8->M

If F=0:0->N
If F=1:4->N

If G=0:0->O
If G=1:2->O

If H=0:0->P
If H=1:1->P

I+J+K+L+M+N+O+P->R

ClrHome
Output (1,1,A
Output (1,2,B
Output (1,3,C
Output (1,4,D
Output (1,5,E
Output (1,6,F
Output (1,7,G
Output (1,8,H
Output (2,2,"="
Output (3,1,R
Pause

<---------------FIN----------------------->


Voila n’hésiter pas a critiquer.Je ne vous garantie pas que je n'est pas fais de faute de frappe mais moi il marche ni quel. Il me sert même plutôt bien en cours. ^^


-Skull-
Cytropus le 02/12/2012 à 11:33
Citation
Voila n’hésiter pas a critiquer.

On peut toujours chercher la petite bête godgrace.gif

J'ai pas grand chose à ajouter si ce n'est que ça :
Code
If A=0:0->I
If A=1:128->I

If B=0:0->J
If B=1:64->J

If C=0:0->K
If C=1:32->K

If D=0:0->L
If D=1:16->L

If E=0:0->M
If E=1:8->M

If F=0:0->N
If F=1:4->N

If G=0:0->O
If G=1:2->O

If H=0:0->P
If H=1:1->P


peut se transformer en ça :
Code
128(A=1)->I

64(B=1)->J

32(C=1)->K

16(D=1)->L

8(E=1)->M

4(F=1)->N

2(G=1)->O

(H=1)->P



Continu sur ta lancé glasses.gif
Skull le 02/12/2012 à 11:36
Merci du conseil... happy.gif Très sympa !

Tu l'as essayer ?

-Skull-
Cytropus le 02/12/2012 à 11:40
Pas trop le temps en ce moment, dsl eyeonly.gif

Par contre, pour une meilleure esthétique du programme, je te conseil de mettre les choix de base possible dans la boucle

Et 2 questions :
Citation
int (Q/B)->Z
Q-B*Z->R
R-I

Ce serai pas R->I

et a ce propos, pourquoi ne pas stocker dans I directement ? ahh.gif
Skull le 02/12/2012 à 11:50
En recopiant le code je me suis poser le même question, j'ai besoin de la variable R il me semble... Non entait non R = reste c plus claire happy.gif. Une division euclidienne c'est déjà assez complexe comme sa en programmation, on va pas en rajouter.

Mais sinon par rapport au tien il vaut quoi ? ^^ Je suis curieux hein ?!! laugh.gif laugh.gif loupe.gif

-Skull-
Cytropus le 02/12/2012 à 12:08
Par rapport au mein godgrace.gif !
tu peux pas comparer, je l'ai fait en Visual Basic glasses.gif

Je l'ai fait un peu de la même façon que ld
Cytropus le 02/12/2012 à 12:31
heu, non godgrace.gif

fin du Hs
ld le 28/10/2013 à 19:39
EDIT : NOUVELLE VERSION

De la base 10 à X et inversement, pour X de 2 à 36.
Au défit de faire mieux et plus léger !

Prgm AllBase V3 187 octets.
Code
:"0123456789ABCDEF->Chaîne0   ----   (Allez jusqu'à Z pour la base 36).
:EffEcr:0->N:0->R
:Input:"DE BASE ",X
:Input "A ",Y
:Input "N= ",Chaîne1
:longueur(Chaîne1->L
:For(Z,0,L-1
:carChaîne(Chaîne0,sous-Chaîne(Chaîne1,L-Z,1))-1
:R+X^ZRép->R
:End
:Repeat non(R
:N+1->N
:Output(8,17-N,sous-Chaîne(Chaîne0,1+R-Yent(R/Y),1
:ent(R/Y->R
:End

Vous pouvez le tester à cette adresse :
http://www.kaagaard.dk/service/convert.htm
Attila le 28/10/2013 à 21:44
Désolé d'être un débutant (bah il faut bien un boulet de temps à autre non ?), mais à quoi serve tout ces convertisseurs ?

Ps:pour ce que ca interèsse j'ai posté mon premier programme et j'ai mis 3 semaine à le faire ... Alors est-ce que vous pourriez aller jetez un coup d'oeil ? Le post se nomme "mon premier programme, un sshoot'em up du nom de Phoenix Lord"...

Sur ce, salutation oh génies que vous êtes godgrace.gif
linkakro le 29/10/2013 à 16:11
----- ld :
tu t'es enfin décidé à utiliser les chaines de caractères.

Je me dis toujours que Mdr1 est imbattable, mais tu n'offres pas les mêmes fonctionnalités.
C'est-à-dire que tu effectues une seule conversion à la fois. On doit commander A->10 puis 10->B quand Mdr1 et ses semblables (dont moi) font naturellement A->10->B.
Je préfère quand-même permettre de base quelconque à quelconque plutôt que passer manuellement par 10.

Par contre tu as placé le Prompt N avant le test de la base, cela doit obliger à écrire deux fois logiquement ???
En plus ce serait assez simple de saisir une chaine puis d'interpréter avec expr() dans le cas de la saisie base 10.

----- Attila :
il est question de convertir l'écriture des nombres dans des bases différentes. La base est le nombre de symboles disponibles et donc la retenue. Les bases 10,2,16,60 sont les quatre bases les plus utilisées, par les humains ou par les ordinateurs. (la notation horaire cependant écrit en base 10 tout en effectuant les retenues à 60)
On a le nombre écrit par les digits a,b,c et la base z avec :
(abc)z = a*z^2 + b*z^1 + c*z^0 = a*z^2 + b*z + c
Exemple : (21)10=(10101)2=(15)16 car 21=16+4+1=16+5
m@thieu41 le 29/10/2013 à 16:30
Citation
Les bases 10,2,16,60 sont les trois bases

Ca fait 4 winkle.gif
linkakro le 29/10/2013 à 16:35
Erreur de réécriture. Merci.
ld le 29/10/2013 à 16:43
"Par contre tu as placé le Prompt N avant le test de la base, cela doit obliger à écrire deux fois logiquement ???"
J'ai inverser deux lignes en recopiant. MERCI ! ahh.gif

"En plus ce serait assez simple de saisir une chaine puis d'interpréter avec expr() dans le cas de la saisie base 10."
Pas con, je vais essayer...