Question sur les divisions avec VB

[Résolu]
Signaler
Messages postés
36
Date d'inscription
jeudi 30 avril 2009
Statut
Membre
Dernière intervention
18 janvier 2013
-
Messages postés
181
Date d'inscription
mardi 18 novembre 2008
Statut
Membre
Dernière intervention
4 février 2011
-
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



Si il y a des erreurs grossières dites-le moi...

Je vous remercie pour m'avoir lu...

Amicalement Philou

4 réponses

Messages postés
221
Date d'inscription
mercredi 9 avril 2003
Statut
Membre
Dernière intervention
13 décembre 2009
1
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
Messages postés
221
Date d'inscription
mercredi 9 avril 2003
Statut
Membre
Dernière intervention
13 décembre 2009
1
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)

A+ et bonne continuation pour ton programme
Messages postés
36
Date d'inscription
jeudi 30 avril 2009
Statut
Membre
Dernière intervention
18 janvier 2013

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...

Encore merci pour la réponse

Amicalement Philou
Messages postés
181
Date d'inscription
mardi 18 novembre 2008
Statut
Membre
Dernière intervention
4 février 2011

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

USERRRQI115
Simple user
Great brain