Re: Traduire une fonction VB en PB
Publié : mer. 29/mai/2013 21:58
100 donne t'il 90 ou bien 89 dans ta logique ?
Forums PureBasic - Français
http://forums.purebasic.com/french/
100 = 121100 donne t'il 90 ou bien 89 dans ta logique ?
Code : Tout sélectionner
Procedure.s DecimalToBase9(DecimalToBase9.q)
A = 0
Repeat
A + 1
B + 1
While FindString(Str(B), "0", 1) ; remplacer les 0 par des 1
B + 1
Wend
If A => DecimalToBase9.q
ProcedureReturn Str(A) + " = " + Str(B)
EndIf
ForEver
EndProcedure
For i = 1 To 100
Debug DecimalToBase9(i)
Next
Si je veux exclure le zéro, c'est parce qu'il va me servir de séparateur, ainsi 13213210346513210 peut mieux se découper si je sais où je dois le faire, mais si je mets un autre caractère, mon code va être cracké tout de suite, car 1321321|34651321| ça se remarque toute de suite.SPH a écrit :Bon, et a quoi sert ta routine ?
Code : Tout sélectionner
nombre.s="13213210346513210"
id= CountString(nombre.s,"0")
for i=1 to id
debug stringfield(nombre.s,i,"0")
next i
; EPB
d'accord, mais comment je décode les nombres trouvés (base 9) en décimal (base 10)?Dobro a écrit :tout ça pour ça ? ......![]()
et voila
si tu t'étais expliqué tout de suite , on aurai gagné du tempsCode : Tout sélectionner
nombre.s="13213210346513210" id= CountString(nombre.s,"0") for i=1 to id debug stringfield(nombre.s,i,"0") next i ; EPB
Micoute a écrit :Si je veux exclure le zéro, c'est parce qu'il va me servir de séparateur, ainsi 13213210346513210 peut mieux se découper si je sais où je dois le faire, mais si je mets un autre caractère, mon code va être cracké tout de suite, car 1321321|34651321| ça se remarque toute de suite.
Code : Tout sélectionner
Declare decoupe(nombre.s)
calldebugger
nombre.s="132132103465132106548496851306506846860686468600"
debug "chaines de reference "+nombre.s
global newlist sequence.s()
decoupe(nombre.s) ; on decoupe nombre
; ****** affiche le contenu de la liste ******
ResetList(sequence.i())
While NextElement(sequence.i())
Debug val(sequence.i()) ; Affiche tous les éléments de la liste
Wend
procedure decoupe(nombre.s)
; Dobro
ClearList(sequence.s())
id= CountString(nombre.s,"0")
For i=1 to id
sortie.s=stringfield(nombre.s,i,"0")
if Sortie.s<>""
AddElement(sequence.s())
sequence.s()=sortie.s
Endif
Next i
Endprocedure
; EPB
Code : Tout sélectionner
; l'algo est basé sur le principe suivant :
; pour le nombre 94 en base 2
; 94/2 = 0 reste 47
; 47/2 = 1 reste 23
; 23/2 = 1 reste 11
; 11/2 = 1 reste 5
; 5/2 = 1 reste 2
; 2/2 = 0 reste 1
; donc : nombre/base .... on recup le resultat qu'on affiche, puis on prends le reste de la division comme nouveau nombre !
; ce qui donne "1011110" (en partant du dernier puis en remontant )
Declare.s Base(nombre,Base)
nombre=194
Debug "la valeur 194 en Decimal"
base=8 ; en Octal
debug "en octal :"+Base(nombre,Base)
nombre=194
base=16 ; en Hexa
debug "en Hexadecimal :"+Base(nombre,Base)
nombre=194
base=2 ; en Binaire
debug "en Binaire:"+Base(nombre,Base)
nombre=194
base=20 ; en base 20 !!!!
debug "en base 20:"+Base(nombre,Base)
calldebugger
Procedure.s Base(nombre,Base)
; By Dobro
string_ref.s="0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z"
while nombre>0
reste=Mod(nombre,base)
Resultat.s=Resultat.s+ StringField(string_ref.s,Reste+1,",") ;;str(reste)
nombre=nombre/base
Wend
ProcedureReturn ReverseString(Resultat.s)
Endprocedure
;
; EPB
Ca ne te conviens pas, ca ?SPH a écrit :Code ultra optimisé :Code : Tout sélectionner
nombre=31 Debug nombre-(nombre/10)
plus maintenant !!Micoute a écrit :car il laisse passer les zéros
precise ce point precis , qu'entends tu exactement par "decodage"/"codage"Micoute a écrit :Merci encore Dobro,
ton code de découpe est excellent, mais je reviens toujours à mon problème principal, c'est-à-dire le décodage des nombres,
Le code que tu donnes sur ce lien ne fonctionne pas. Ex : Debug nombre_encode(nombre,99) donne 10 alors que ça devrait Etre 1091 = 1, 2 = 2, 3 = 3, 4 = 4, 5 = 5, 6 = 6, 7 = 7, 8 = 8, 9 = 9, 10 = 11, 11 = 12, 12 = 13, 13 = 14, 14 = 15, 15 = 16, 16 = 17, 17 = 18, 18 = 19, 19 = 21, 20 = 22, 21 = 23, 22 = 24, 23 = 25, 24 = 26, 25 = 27, 26 = 28, 27 = 29, 28 = 31, etc...