toujours sur le même principe, je souhaiterais faire une procédure faisant l'inverse de celle-ci, c'est-à-dire de remettre en décimal le code sortant de cette même procédure que voici :
Procedure Coder(Nombre.q)
; À toutes les dizaines on est décalé d'une unité, ça donne une Retenue
Retenue = (Nombre - 1) / 9
; On ajoute la Retenue au résultat
Resultat = Nombre + Retenue
; Pour l'instant on n'a modifié que les unités ajoutés toutes les dizaines, il faut aussi ajouter
; tous les blocs de 0 qui apparaissent 10 fois toutes les centaines, 100 fois tous les milliers, etc.
; Sans oublier qu'à chaque fois qu'on ajoute une Retenue celle-ci décale le résultat, il faut donc
; calculer aussi la Retenue de la Retenue !
; 1 = unités, 10 = dizaines, 100 = centaines...
Rang = 1
; On s'arrête quand il n'y a plus de Retenue à ajouter
While Retenue > 0
; Nouvelle Retenue à ajouter
Retenue = (10 * Rang) * ((Retenue - 1) / (9 * Rang))
; Ajout de la Retenue
Resultat + Retenue
; Passage au Rang suivant
Rang * 10
Wend
ProcedureReturn Resultat
EndProcedure
Je vous remercie tous par avance de votre participation
Dernière modification par Micoute le mer. 19/juin/2013 14:38, modifié 1 fois.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Global NewMap Codage.d()
Procedure Coder(Nombre.d)
; À toutes les dizaines on est décalé d'une unité, ça donne une Retenue
Retenue = (Nombre - 1) / 9
; On ajoute la Retenue au résultat
Resultat = Nombre + Retenue
; Pour l'instant on n'a modifié que les unités ajoutés toutes les dizaines, il faut aussi ajouter
; tous les blocs de 0 qui apparaissent 10 fois toutes les centaines, 100 fois tous les milliers, etc.
; Sans oublier qu'à chaque fois qu'on ajoute une Retenue celle-ci décale le résultat, il faut donc
; calculer aussi la Retenue de la Retenue !
; 1 = unités, 10 = dizaines, 100 = centaines...
Rang = 1
; On s'arrête quand il n'y a plus de Retenue à ajouter
While Retenue > 0
; Nouvelle Retenue à ajouter
Retenue = (10 * Rang) * ((Retenue - 1) / (9 * Rang))
; Ajout de la Retenue
Resultat + Retenue
; Passage au Rang suivant
Rang * 10
Wend
Codage(Str(Resultat)) = nombre
ProcedureReturn Resultat
EndProcedure
Procedure.d Decoder(nombre)
If FindMapElement(Codage(),Str(nombre))
ProcedureReturn Codage(StrD(nombre))
EndIf
EndProcedure
Debug StrD(Decoder( Coder(55.2) ) ,1)
je vous avais tous laissé un peu tomber, car j'ai été passer quelque jours à Carnac où je n'ai eu que du mauvais temps et mal au dos tous les jours, je crois avoir compris pourquoi il pousse des pierres par chez eux : c'est parce qu'ils sont arrosés copieusement à longueur de temps.
Revenons à PureBasic ma raison de vivre, je remercie G-Rom pour son idée et j'ai conçu ceci:
Global NewMap Codage.q()
Procedure Coder(Nombre.q)
; À toutes les dizaines on est décalé d'une unité, ça donne une Retenue
Retenue = (Nombre - 1) / 9
; On ajoute la Retenue au résultat
Resultat = Nombre + Retenue
; Pour l'instant on n'a modifié que les unités ajoutées toutes les dizaines, il faut aussi ajouter
; tous les blocs de 0 qui apparaissent 10 fois toutes les centaines, 100 fois tous les milliers, etc.
; Sans oublier qu'à chaque fois qu'on ajoute une Retenue celle-ci décale le résultat, il faut donc
; calculer aussi la Retenue de la Retenue !
; 1 = unités, 10 = dizaines, 100 = centaines...
Rang = 1
; On s'arrête quand il n'y a plus de Retenue à ajouter
While Retenue > 0
; Nouvelle Retenue à ajouter
Retenue = (10 * Rang) * ((Retenue - 1) / (9 * Rang))
; Ajout de la Retenue
Resultat + Retenue
; Passage au Rang suivant
Rang * 10
Wend
Codage(Str(Resultat)) = nombre
ProcedureReturn Resultat
EndProcedure
Procedure.q Decoder(nombre)
If FindMapElement(Codage(),Str(nombre))
ProcedureReturn Codage(Str(nombre))
EndIf
EndProcedure
;Test
;For i = 0 To 40
; Debug Str(Coder(i)) + " = " + Str(Decoder( Coder(i) ))
;Next
;CallDebugger
Debug Str(Coder(50200)) + " = " + Str(Decoder(75767))
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !