Page 1 sur 1

[RESOLU] Base 8 - Octal

Publié : mer. 20/déc./2006 11:27
par Progi1984
Bonjour, je suis à la recherche de deux fonctions mathématiques :

OctToDec : transforme une string (contenant le nombre décimal en base 8) en nombre décimal
DecToOct : transforme un nombre décimal en string (contenant le nombre décimal en base 8)

Je n'ai pas trouvé d'algo non plus donc j'en appelle à vous :)

Merci d'avance !

Publié : mer. 20/déc./2006 14:38
par Mwoua

Code : Tout sélectionner

Procedure OctToDec(o$)
  d=0
  L=Len(o$)
  For i=1 To L
    d=d+Val(Mid(o$,L-i+1,1))*Pow(8,i-1)
  Next i
  ProcedureReturn d
EndProcedure

Procedure DecToOct(d)
  o$=""
  Repeat
    o$=Str(d%8)+o$
    d=Int(d/8)
  Until d<8
  o$=Str(d)+o$
  ProcedureReturn Val(o$)
EndProcedure

Debug OctToDec("17")

Debug DecToOct(96)
Et voilà !

Publié : mer. 20/déc./2006 15:39
par Progi1984
Nickel ! Merci Mwoua !

Publié : mer. 20/déc./2006 15:45
par Progi1984
Encore mieux :

Code : Tout sélectionner

Procedure OctToDec(o$)
  d=0
  L=Len(o$)
  For i=1 To L
    d=d+Val(Mid(o$,L-i+1,1))*Pow(8,i-1)
  Next i
  ProcedureReturn d
EndProcedure

Procedure DecToOct(d)
  o$=""
  Repeat
    o$=Str(d%8)+o$
    d=Int(d/8)
  Until d<8
  o$=Str(d)+o$
  ProcedureReturn Val(o$)
EndProcedure
Procedure BaseToDec(o$, base.l)
  d=0
  L=Len(o$)
  For i=1 To L
    d=d+Val(Mid(o$,L-i+1,1))*Pow(base,i-1)
  Next i
  ProcedureReturn d
EndProcedure

Procedure DecToBase(d, base.l)
  o$=""
  Repeat
    o$=Str(d%base)+o$
    d=Int(d/base)
  Until d<base
  o$=Str(d)+o$
  ProcedureReturn Val(o$)
EndProcedure
Debug OctToDec("4610")

Debug DecToOct(2440)

Debug BaseToDec("4610",8)

Debug DecToBase(2440,8)

Publié : mer. 20/déc./2006 16:13
par Mwoua
J'ai failli faire un eprocedure BaseToBase :

Code : Tout sélectionner

Procedure BaseToBase(N1,Base1, N2, Base2)
et puis je me suis dit que comme tu voulais travailler juste en octal et décimal...

Tu l'as fait (ou presque), c'est cool ! :P

Publié : mer. 20/déc./2006 16:59
par Progi1984
Je te laisse faire :)

Publié : mer. 20/déc./2006 17:07
par Mwoua
Uniquement si ça t'interresse vraiment :lol:

Aller, hop :

Code : Tout sélectionner

Procedure.s BaseToBase(n$,base1,base2)
  d=0
  L=Len(n$)
  For i=1 To L
    C$=Mid(n$,L-i+1,1)
    If Val(C$)=0 And C$<>"0" ; caractère alphabétique
      C$=Str(Asc(C$)-55)
    EndIf
    If Val(C$)>=base1 : MessageRequester("Conversion Base à Base","Problème : un chiffre du nombre à convertir est incorrect", #PB_MessageRequester_Ok ) : End : EndIf
    d=d+Val(C$)*Pow(base1,i-1)
  Next i
  n$=""
  Repeat
    C$=Str(d%base2)
    If Val(C$)>=10 ; caractère alphabétique
      C$=Chr(55+Val(C$))
    EndIf
    n$=C$+n$
    d=Int(d/base2)
  Until d<base2
  If d<>0 : n$=Str(d)+n$ : EndIf
  ProcedureReturn n$
EndProcedure

Debug BaseToBase("F0",16,2)
En fait : conversion base1 -> dec puis dec -> base2