Integer , long ou single !! [Résolu]

Signaler
Messages postés
69
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
6 juin 2011
-
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
-
donc vite fait un probleme trop bete mais auquel je trouve pas de solution visible.
je fais la convertion du decimale en binaire quand je divise par deux y'a un petit probleme .. si par exp j'ai 3/2 = 1.5 le programme lui automatiquement me prend 2 et pas 1 et cela bouzille tout !!
donc je veux savoir comment devrai-je declarer mes variable pour qu'en divisant 3/2=1,5 mon programme prend la valeur 1 (pas 1,5 pas 2)
pour avoir que des 1 et des 0

Merci d'avance
Developper c'est créer une nouvelle vie, Celle qu'on trouve parfaite...Saad.

14 réponses

Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
13
Tu dois travailler avec le reste de division : ce sont toujours des entiers qui sont manipulés ! Regarde ma fonction de conversion de base ...
Option Explicit
Public Const Charset As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

Public Function NumToBase(Number As Integer, Base As Byte) As String
 Dim Rest As Integer, Result As String
 If Base > 36 Then Exit Function
 Do
  Rest = Number Mod Base
  Number = Number \ Base
  Result = Mid(Charset, Rest + 1, 1) & Result
 Loop While Number > 0
 NumToBase = Result
End Function

---
VB.NET is good ... VB6 is better
Messages postés
69
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
6 juin 2011

Voila c'est bon j'ai resolue le pti probleme tout marche a merveille ma calculatrice "toutes options" est finie

Private Function stock_mod(ByVal nb As Integer) As String
        stock_mod = nb Mod 2
    End Function

dd = n Mod 2
            Do

                If n Mod 2 <> 0 Then   'je test ici avant de faire la division si
                    'le nombre est paire ou impaire si oui :
                    res = n / 2 - 0.5
                    'je soustrai le 0,5 qui me pose un probleme
                Else
                    'sinon pas de probleme si c'est un paire :
                    res = n / 2
                End If
                d = stock_mod(res)
                dd = dd & d
                n = res
            Loop Until res = 1

            ReDim t(Len(dd))
            For i = 1 To Len(dd)
                t(i) = Mid(dd, i, 1)
            Next
            For i = Len(dd) To 1 Step -1

                m = m & t(i)

            Next


donc c'etait la convertion de la base 10 vers la base 2
un peu longue mais elle fonctionne sans compromis

a bientot.
Merci pour vous
Developper c'est créer une nouvelle vie, Celle qu'on trouve parfaite...Saad.
Messages postés
69
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
6 juin 2011

ps: j'ai deja essaiyé de declarer mes variables en question notament le resultat de la division et le nombre divisé, en integer,long et single ah oui et meme short..

Developper c'est créer une nouvelle vie, Celle qu'on trouve parfaite...Saad.
Messages postés
69
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
6 juin 2011

donc.. merci hein mais bon j'avais pas demandé un code ou une fonction pour pour convertire j'ai deja pris la peine de creer la mienne que je crois la plus simple jamais conçu ^^" (une ligne !!)d'autant plus je sais qu'il faut jouer avec le reste et c'est la que reside le probleme le programme quand il divise un entier et que le resultat est un reel notament un 'x,5' il prend automatiquement l'entier le plus grand proche du nombre..
Bon je fais un dessin

11/2=5,5 (5,5=n) n etant etait declarée integer le programme lui affecte la valeur 6 (5,5+0,5) et non un 5 (5,5-0,5)
donc aprés quand je gere le modulo c'est la cata !!
paske 6 mod 2=0
alors que 5 mod 2=1...

donc svp une idée ingenieuse pour contourner ce probleme pask ela moi chui bloqué

ghuysmans si tu pouvais eclairer ton idée sur la manipulation des entiers :
ce sont toujours des entiers qui sont manipulés !

merci encore une fois .

Developper c'est créer une nouvelle vie, Celle qu'on trouve parfaite...Saad.
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
13
Je ne t'ai pas donné le source de ma fonction pour rien mais bien pour illustrer ce que j'ai dit . L'algorithme de conversion en une autre base est simple : tant que le nombre est > 0, tu ajoutes le reste de division du nombre par la base au début du résultat de la fonction (sinon l'écriture sera inversée) et tu divises entièrement (opérateur \) le nombre par la base. Tu n'as nul part de nombre décimal !
---
VB.NET is good ... VB6 is better
Messages postés
1
Date d'inscription
mardi 14 juillet 2009
Statut
Membre
Dernière intervention
26 décembre 2009

si t'en trouve pas la reponse alors il suffit de soustraire 1 du resultats. bon courage
Messages postés
69
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
6 juin 2011

Re: donc ghysmans j'ai comprid et ma source fonctionne aussi trés bien pour le :sinon l'écriture sera inversée tkt pas pour ca je stock le mod 2 de chaque nombre obtenu dans un chaine (chaine_mod par exp) ca me donne un resulat inverse certe mais aprés je passe la chaine dans un tableau avec la ptite "mid" pi pour lire le resultat a bin rien de plus facile j'affiche le resulat en inverssant le tableau (step-1). donc je te jure crois moi y'a pas de probleme ladessus mdr. merci quand meme

quant a messaoud86 ta reponse est fausse mais sans le vouloir je crois tu m'as fais pensé a un truc donc si par exp j'ai un (3/2=1.5) suffit de soustraire 0.5 et non 1 paske le programme lui il prend tjr la grande valeur l aplus proche du nombre donc ce qui donne :
3/2=1.5--1.5-0.5=1
4/2=2----2-0.5=1.5 ==) la encore une fois le programme prendra un 2 et non un 1.5 ou moin encore un 1

voila je vais tester ca et vous repondre d'ici quelque instants

Merci pour vos reponses !

Developper c'est créer une nouvelle vie, Celle qu'on trouve parfaite...Saad.
Messages postés
69
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
6 juin 2011

j'ai oublié d'afficher le "m" dans mon code donc voila
TextBox3.Text = m

m est finalement le nombre n en binaire

tchao.
Developper c'est créer une nouvelle vie, Celle qu'on trouve parfaite...Saad.
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
13
Mais tu te fous complètement de ce que je dis ! Je disais qu'une division entière (nombre-reste, le tout divisé par ton diviseur) se note \ en VB :
                If n Mod 2 <> 0 Then   'je test ici avant de faire la division si
                    'le nombre est paire ou impaire si oui :
                    res = n / 2 - 0.5
                    'je soustrai le 0,5 qui me pose un probleme
                Else
                    'sinon pas de probleme si c'est un paire :
                    res = n / 2
                End If
Devient ceci (+ court et rapide)
                res = n \ 2
Et ton code tout entier est MAUVAIS : essaie de convertir 225 (11100001b) et tu t'apercevras qu'il y a un gros problème dans ton algo ! Je ne sais pas quoi te donner après la solution ...
---
VB.NET is good ... VB6 is better
Messages postés
69
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
6 juin 2011

Donc pour commencer, si je met 225 le programme me retourne belle et bien un 11100001.. , d'autre part je me fou pas de ton code mdr!! aprés avoir fini le mien qui est MAUVAIS et qui fonctionne ,je vais voir avec ta source en ecrivant ce message elle est deja copiée..

Alors voila je me fous pas de ce que tu disais ^^ mais juste que quand j'ai un probleme je cherche a le resoudre a ma maniere pour finir a ma façons avec de l'aide biensure, (merci a vous) et si j'y arrive pas, j'opte alors pour d'autre solution notament la tienne qui est plus SOPHISTIQUEE j'admet! sinon je fais d'une pierre deux coups, je regle mon probleme de base puis je passe au teste des autres solutions presentées, c'etait tout ^^.

Et puis si t'avais pris un peu la peine de regarder en haut, t'aurai pu voir que ta solution a etait aussi acceptée !

donc bref..plus qu'aller travailler sur ton code. avec un grand MERCI et aussi un petit dsl si je me suis montré un peu ennuyeux :p

A bientot.

Developper c'est créer une nouvelle vie, Celle qu'on trouve parfaite...Saad.
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
13
Bah autant aller au plus court & rapide ... non ? Tu n'as que deux petits trucs à changer : le premier est expliqué dans mon dernier message (\ et pas de If) et le deuxième c'est d'ajouter directement dans la chaine en ordre inverse le bit. Change ça :
                dd = dd & d
                n = res
            Loop Until res = 1

            ReDim t(Len(dd))
            For i = 1 To Len(dd)
                t(i) = Mid(dd, i, 1)
            Next
            For i = Len(dd) To 1 Step -1

                m = m & t(i)

            Next
En ceci :
                dd = d & dd
                n = res
            Loop Until res = 1
            m = dd

Ca va aussi rendre ton code plus lisible ! Une petite question en passant : pourquoi as-tu fait du modulo une fonction ? Pourquoi n'as-tu pas mis ta conversion de base dans une fonction séparée ?
---
VB.NET is good ... VB6 is better
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
13
UneDe petites questions en passant
---
VB.NET is good ... VB6 is better
Messages postés
69
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
6 juin 2011

modulo dans une fonction integer qui retourne un nombre soit 1 ou 0, avec la chaine 'd' qui reçoit la valeur retournée par cette fonction ce qui nous donne une d composée de 0 et de 1, qui n'est rien d'autre que le nombre decimale converti en binaire mais en sens inverse d'ou le code:

ReDim t(Len(dd))
            For i = 1 To Len(dd)
                t(i) = Mid(dd, i, 1)
            Next
            For i = Len(dd) To 1 Step -1

                m = m & t(i)

            Next

qui inverse la dd si par exp je veux convertir 8 la dd finale va etre 0001 donc je la passe par un tableau et j'affecte les valeur a 'm' en commençant par la derniere case ce qui donne un m=1000 (8 en binaire)
sinon si je fais :

dd = d & dd
                n = res
            Loop Until res = 1
            m = dd


m=0001 (1 en decimale) ce qui est finalement pas juste .

et pour la fonction de convertion separée..une seule reponse, Je debute encore
et ca, ca se voit dans mon code :p

cordialement .
Developper c'est créer une nouvelle vie, Celle qu'on trouve parfaite...Saad.
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
13
Faut plus inverser la chaine après avoir effectué ma modif
---
VB.NET is good ... VB6 is better