Base 10 à base X , et de base X à base 10

Programmation d'applications complexes
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Base 10 à base X , et de base X à base 10

Message par Mytic »

Bonjour,
Je vous présente deux petites procédures que j’avais faites pour passer le temps.

Ce sont deux procédures de conversion de base 10 à base X , et de base X à base 10.

Tout est expliqué dans le code source :

Code : Tout sélectionner

;==============================================================================
;|   Programme de conversion [Base(X) à Base(10)] ou de [Base(10) à Base(X)]  |
;|                            By Mytic.                                       |
;==============================================================================
;Pb : 4.20

;Note : Que sur des entiers

;_______________________________________________( les procedures de conversion )
Procedure.s Dec_to_BaseX(nombre.l,base.c)
r.l = 0
t$ = ""

Repeat

   r = nombre % base : nombre = (nombre / base)
   If r>9
      c = 87+r
      t$=t$ + Chr(c)
   Else
      t$=t$+Str(r)
   EndIf


Until nombre = 0

For i = Len(t$) To 1 Step -1
   n$ = n$ + Mid(t$,i,1)
Next i

ProcedureReturn n$

EndProcedure

Procedure.l BaseX_to_Dec(nombre.s,base.c)
n.l=0
m.l=0
For i = Len(nombre) To 1 Step -1
  m=Pow(base,Len(nombre)-i)
  l$ = Mid(nombre,i,1)
 If Asc(l$) >= 97
     n = n + (Asc(l$)-87)*m
 Else
     n = n + (Val(l$)*m)
 EndIf

Next i
ProcedureReturn n

EndProcedure
;________________________________________________________________________________


;==== Exemples :

Debug Dec_to_BaseX(255,16)         ; converti le décimal 255 (base 10) en base 16 (hexadécimal)

Debug BaseX_to_Dec("1000",2)       ; converti le binaire 1000 (base 2) en base 10 (décimal)



Debug Dec_to_BaseX(255,30)    ; converti 255 (décimal) en base 30

Debug BaseX_to_Dec("8f",30)  ; converti 8f ( base 30 ) en base 10

Note : on peut élargir le nombre de bases en passant en mode Unicode.
:)
Dernière modification par Mytic le ven. 13/juin/2008 11:06, modifié 1 fois.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Merci, ça peut être utile :wink:
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Une autre petite remarque, il faut respecter la casse, f minuscule ce n’est pas le F majuscule !
[a…z] < [A…Z]
:idea:
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Bonjour

J'ai légèrement modifié le code de Mytic qui ne craint plus la casse avec une petite optimisation.

Code : Tout sélectionner

Procedure.s Dec_to_BaseX(nombre.l,base.c)
  t$ = ""
  Repeat
    r = nombre % base +48: nombre = (nombre / base)
    If r>57
      r+7 
    EndIf
     t$=Chr(r)+t$
  Until nombre = 0
  Debug t$
  ProcedureReturn t$
EndProcedure

Procedure.l BaseX_to_Dec(nombre.s,base.c)
nombre=LCase(nombre)
  n.l=0
  For i = Len(nombre) To 1 Step -1
    v = Asc(Mid(nombre,i,1))-48
    If v > 9
      v - 39
    EndIf
    n = n + v*Pow(base,Len(nombre)-i)
  Next i
  ProcedureReturn n
EndProcedure

;==== Exemples :

DDebug( Dec_to_BaseX(255,16) )        ; converti le décimal 255 (base 10) en base 16 (hexadécimal)
DDebug (Str(BaseX_to_Dec("1000",2)))       ; converti le binaire 1000 (base 2) en base 10 (décimal))
DDebug( Dec_to_BaseX(255,30))    ; converti 255 (décimal) en base 30
DDebug(Str( BaseX_to_Dec("8F",30)))  ; converti 8f ( base 30 ) en base 10
DDebugShow()
Denis

Bonne Jounée à tous
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Heu… je voulais garder les minuscules ! C’est pour avoir plus de Bases
Mais en Unicode 26 lettres de moins ça n’aura pas trop d’effet.
Merci pour la modif
Répondre