Pb avec les gds nombres (10^26)

[Résolu]
Signaler
Messages postés
17
Date d'inscription
mercredi 10 novembre 2004
Statut
Membre
Dernière intervention
27 avril 2008
-
Messages postés
17
Date d'inscription
mercredi 10 novembre 2004
Statut
Membre
Dernière intervention
27 avril 2008
-

7 réponses

Messages postés
1263
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
6
Voici le code que j'ai fait

Public Function BinToLettre(BinVal as String) As String
   Dim sortie As String, i As integer, my_lettres As String,chiffre as String
   my_lettres = "ZYXWVUTSRQPONMLKJIHGFEDCBA"
   sortie =""
   For i = len(Binval) to 1 step -1  ' on explore BinVal de droite à gauche
      chiffre = mid$(BinVal,i,1) ' chiffre de BinVal (0 ou 1)      if chiffre "1" then sortie sortie & mid$(my_lettres,i,1) ' si = 1 : lettre de la même position
   Next i
   BinToLettre = sortie
End Function

GRENIER Alain
Messages postés
17
Date d'inscription
mercredi 10 novembre 2004
Statut
Membre
Dernière intervention
27 avril 2008

heu .... je crois qu'il y a eu un beug, mon message est vide, et c'est reparti pour un tour ^^

Msg original:
Bonjour, j'ai créé une fonction qui a un binaire associe une chaine de caractère.
Son "schéma" est le suivant: 1 -> A  ;  11 -> BA  ;  1000000000000000000000000 -> Z ...

Voici ma fonction:
Public Function BinToLettre(BinVal As String) As String
Dim sortie As String, length As Byte, my_lettres As String
length = Len(BinVal)
my_lettres = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Do While BinVal <> 0
MsgBox BinVal
sortie = sortie &amp; Mid(my_lettres, length, 1)
BinVal = BinVal - (10 ^ (length - 1))
length = length - 1
Loop
BinToLettre = sortie
End Function


J'ai un problème au niveau de mon surlignement en rouge. En effet, je ne sais pas quelle typage utiliser.
Mon problème (vérifié par la MsgBox) est qu'après la première redéfinition de BinVal, celle-ci est arrondie, elle vaut en effet: "1,11111111111111E+24" si j'ai appelé "BinToLettre(111111111111111111111111111)" (il y'en a 26).
Cela n'est pas cool, car du coup "BinToLettre(11..11)" renvoit "Z...K" autrement dit que 16 lettres au lieu de l'alphabet entier ...

Merci d'avance.
http://loozerteam.tk
Messages postés
1263
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
6
Salut Lozerteam
Si j'ai compris ta fonction A --> 1 ,  11 -->BA , 101 -->CA (  on ne met pas le B car le bit est à 0)
donc 10000000000000000000000000 donne Z ( 1 suivi de  25 zéros) et 10000000000000000000000001 donne ZA ( 1 suivi de 24 zéros puis un 1)

Soit la String 111000111 en paramètre de ta fonction
Cela doit donner "IHGCBA"  comme résultat

Dans ta fonction tu mets comme paramètre Binval as String et dans le code de la fonction tu codes : Do While BinVal <> 0 ( là Binval n'est pas une chaine de caractères mais une valeur numérique)

J'aurais bien un code à te proposer pour solutionner ton problème mais je voudrais être sur de bien avoir compris la fonction que tu désires coder

J'attends ta réponse pour confirmer si j'ai bien compris ou non
A+
GRENIER Alain
Messages postés
17
Date d'inscription
mercredi 10 novembre 2004
Statut
Membre
Dernière intervention
27 avril 2008

Salut, Galain, tout à fait, tu as tout compris, en effet j'ai mis binval as string en "attendant" de trouver une réponse ^^.
Merci pour ta future réponse
Messages postés
17
Date d'inscription
mercredi 10 novembre 2004
Statut
Membre
Dernière intervention
27 avril 2008

Hum ... ca marche mais du coup, my_lettres="ABCDEFGHIJKLMNOPQRSTUVWXYZ" car la boucle s'effectue dans l'autre sens ou alors For i =1 to  len(Binval) ...
Mais merci, il n'y a donc pas de solutions miracle pour que vb ne fasse pas d'arrondi ?
Au cas où un jour pour un autre pb j'en aurais besoin ...
http://loozerteam.tk
Messages postés
1263
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
6
C'est ce que je me suis aperçu en testant mon code
L'astuce consiste à faire de façon que Binval fasse 26 caractères en rajoutant des zéros à gauche

Public Function BinToLettre(BinVal as String) As String
   Dim sortie As String, i As integer, my_lettres As String,chiffre as String
   my_lettres = "ZYXWVUTSRQPONMLKJIHGFEDCBA"
   BinVal = String(26 - Len(BinVal), "0") & BinVal ' rajoute les zéros à gauche
   sortie =""
   For i = len(Binval) to 1 step -1  ' on explore BinVal de droite à gauche
      chiffre = mid$(BinVal,i,1) ' chiffre de BinVal (0 ou 1)      if chiffre "1" then sortie sortie & mid$(my_lettres,i,1) ' si = 1 : lettre de la même position
   Next i
   BinToLettre = sortie
End Function
GRENIER Alain
Messages postés
17
Date d'inscription
mercredi 10 novembre 2004
Statut
Membre
Dernière intervention
27 avril 2008

Mon code final:

Public Function BinToLettre(BinVal As String) As String
   Dim sortie As String, i As Integer, my_lettres As String, chiffre As String
   my_lettres = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
   sortie = ""
   For i = 1 To Len(BinVal) ' on explore BinVal de droite à gauche
      chiffre = Mid$(BinVal, i, 1) ' chiffre de BinVal (0 ou 1)      If chiffre "1" Then sortie sortie & Mid$(my_lettres, i, 1) ' si = 1 : lettre de la même position
   Next i
   BinToLettre = sortie
End Function

Il est tout aussi simple, et en plus le résultat est renvoyé classé par ordre alphabétique, encore mieux !!!

Merci, bcp et bonne nuit.