philouxy
Messages postés36Date d'inscriptionjeudi 30 avril 2009StatutMembreDernière intervention18 janvier 2013
-
16 nov. 2009 à 20:52
userrrqi115
Messages postés181Date d'inscriptionmardi 18 novembre 2008StatutMembreDernière intervention 4 février 2011
-
19 nov. 2009 à 10:12
Bonjour à tous,
Je suis nouveau sur ce forum, et je débute dans la programmation... Alors, j'espère que vous serez indulgent lors de la lecture de mon code
Je suis sur une partie de mon programme, où j'aimerai pouvoir sur un nombre X, séparer les unités, les dizaines, les centaines, les milliers, etc...
je vous mets le bout du programme qui me pose soucis. Voilà par exemple, si je rentre 123, mon programme fonctionne !!!, mais si je rentre 873 (ca plante).. .
J'ai remarqué avec le déboggeur que lors de ma première division, le 8 passe en 9, ce qui va me faire fausser mon calcul par la suite et va tourner à l'infini dans ma 2ème boucle...
Voici mes questions : Y a-t-il un algorithme ou je puisse m'inspirer ? La division en programmation est-elle justicieuse, ou y a-t-il d'autres procédés ?
Est-ce qu'il y a un tuto parlant de ces principes de divisions ou des calculs entres float et entier...
Dim Val_CC as Long
Dim Val_Int As Integer
Dim Indice_Barre As Integer
Val_Int = Val_CC / Val_Div
Do While Val_Int > 9 Or Val_Int < 1
If Val_Int = 0 Then
Val_Div = Val_Div / 10
Val_Int = Val_CC / Val_Div
Else
Val_Div = Val_Div * 10
Val_Int = Val_CC / Val_Div
End If
Loop
Indice_Barre = 1
Code_couleur Val_Int, Indice_Barre
Val_CC = Val_CC - (Val_Int * Val_Div)
Val_Div = Val_Div / 10
Val_Int = Val_CC / Val_Div
Do While Val_Int > 9 Or Val_Int < 1
If Val_Int = 0 Then
Val_Div = Val_Div / 10
Val_Int = Val_CC / Val_Div
Else
Val_Div = Val_Div * 10
Val_Int = Val_CC / Val_Div
End If
Loop
Indice_Barre = 2
Code_couleur Val_Int, Indice_Barre
Val_CC = Val_CC - (Val_Int * Val_Div)
Val_Div = Val_Div / 10
Val_Int = Val_CC / Val_Div
Do While Val_Int > 9 Or Val_Int < 1
If Val_Int = 0 Then
Val_Div = Val_Div / 10
Val_Int = Val_CC / Val_Div
Else
Val_Div = Val_Div * 10
Val_Int = Val_CC / Val_Div
End If
Loop
Indice_Barre = 3
Code_couleur Val_Int, Indice_Barre
cs_Ayr
Messages postés221Date d'inscriptionmercredi 9 avril 2003StatutMembreDernière intervention13 décembre 20092 16 nov. 2009 à 23:24
Salut Philou,
Pour commencer, je dois dire que je suis désolé mais je n'ai pas été jusqu'au bout de ton code, car au départ tu ne donne pas la valeur de Val_Div... ceci dit, bravo pour les efforts d'explications et de présentation.
Néanmoins, si j'ai bien compris, ton problème principal est que tu veux pouvoir séparer chaque digit de ta valeur de départ.
Par exemple si Val_Int = 873, tu veux 3 puis 7 puis 8 ?
Si c'est le cas, voilà une petite fonction:
Public Function GetSeparateDigits(ByVal Valeur As Long) As Collection
Dim resultat As New Collection
Do While Valeur <> 0
Call resultat.Add(Valeur Mod 10)
Valeur = Valeur \ 10
Loop
Set GetSeparateDigit = resultat
End Function
Note que la division Valeur = Valeur \ 10 se fait avec l'antislash, qui est la division entière.
Ce qui reviens à décaler tes valeurs de 1 digit vers la droite.
Exemple d'utilisation:
Dim DigitsCollection As New Collection
Dim Valeur As Long
Valeur = 6745812
Set DigitsCollection = GetSeparateDigits(Valeur)
Tu pourra connaitre:
- le nombre de digits avec DigitsCollection.count
- L'unité avec DigitsCollection.Item(1)
- les dizaines avec DigitsCollection.Item(2)
- les centaines avec DigitsCollection.Item(3)
- etc, en fonction de ta valeur de départ.
Dans l'exemple donné tu as pour Valeur = 6745812:
DigitsCollection.count = 7
DigitsCollection.Item(1) = 2
DigitsCollection.Item(2) = 1
DigitsCollection.Item(3) = 8
DigitsCollection.Item(4) = 5
DigitsCollection.Item(5) = 4
DigitsCollection.Item(6) = 7
DigitsCollection.Item(7) = 6
Tu peux ensuite faire le traitement de tes digits séparés dans un deuxième temps.
Bien entendu, si je n'ai rien compris et que je suis à côté du problème, je nierai avoir écrit ce message
cs_Ayr
Messages postés221Date d'inscriptionmercredi 9 avril 2003StatutMembreDernière intervention13 décembre 20092 18 nov. 2009 à 20:33
Je reviens pour te dire que l'erreur que tu obtiens dans ton programme viens du fait que tu utilise le type Integer pour Val_Int. En effet, quand tu divise 873 par 100, tu es sensé obtenir 8,73. Mais voilà, la variable qui reçoit le résultat étant un entier, la valeur est arrondie à l'entier supérieur, soit : 9.
Le problème ne se pose pas avec 123 car 1,23 est arrondie à 1 mais tu aurai eu le même problème avec 152 par exemple car 1,52 est arrondie à 2.
(Avis aux lecteurs eventuels: j'ai décidé, d'un commun accord avec moi même, d'arreter de donner des exemples d'arrondies car la liste pourrai être longue et je risque de ne pas avoir fini avant la fin du monde qui, comme chacun sait, se produira le 31/12/2012)
philouxy
Messages postés36Date d'inscriptionjeudi 30 avril 2009StatutMembreDernière intervention18 janvier 2013 17 nov. 2009 à 09:17
Merci Beaucoup Ayr pour ta réponse,
Effectivement tu as bien compris mon soucis, et merci pour l'exemple du code... je vais regardé ça ce soir...
Oui, sorry pour la valeur de Val_Div, je l'avais initialisé à 100... car j'avais déclaré cette variable comme gloabale... Je crois que ca se fait pas trop... mais pour l'instant ca simplifier le code (pour me )... y faudra par la suite que je remédie à ce soucis...
userrrqi115
Messages postés181Date d'inscriptionmardi 18 novembre 2008StatutMembreDernière intervention 4 février 2011 19 nov. 2009 à 10:12
Hello,
Question peut être idiote de ma part...
Pourquoi ne pas interprété le nombre en tant que texte et le décomposer à l'aide de Len, Left et Right ?
BR
Au fait la fin du monde est pour le 21 décembre 2012, préparons nous à vivre notre avant dernier noel