cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013
-
25 juin 2005 à 16:14
cs_Lisa46
Messages postés99Date d'inscriptionjeudi 17 février 2005StatutMembreDernière intervention20 août 2008
-
21 oct. 2005 à 22:06
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
cs_Lisa46
Messages postés99Date d'inscriptionjeudi 17 février 2005StatutMembreDernière intervention20 août 2008 21 oct. 2005 à 22:06
Attention, j'ai mélangé dans les lettres: t, a, etc...corrige...
Et tu comprends, Julien que:
1)
dim a as variant
Variant attrape tout, même "12mlip"; a est alors déclaré, mais bon, on peut modifier comme tu le dis.
Pas décalré = variant on me dit toujours !C'est idem !
2)
a =text1.text
v = val(text1.text)
F = Fix(val(text.text))
Ma NOUVELLE IDée que: a v F 'alors va au programme, ta saisie est bonne...
Cette double égalité correspond à la nécessité pour que la saisie soit un nombre entier !
C'est mathématique, non ?
.....
RE-VOICI, puisque tu n'as pas reçu le message privé...
On Error Resume Next
Dim a As Variant: Dim v As Double: Dim F As Double
a = Text1.Text ' a est variant donc attrape -tout ???
v = Val(Text1.Text)
F = Fix(Val(Text1.Text))
If a v And v F And v <> 1 And v <> 0 Then
Label1.Caption a: Label2.Visible True (Ou label1.caption = text1.text, si tu veux, mais je vois que ça marche!)
Else
Label1.Caption "Entrez un entier positif différent de 1 et 0": Label2.Visible False
Exit Sub
End If
If v < 0 Then
Label1.Caption "Entrez un entier positif. ": Label2.Visible False
Exit Sub
End If
Programme:
'Text1.Text = a
'enleve les valeurs incorrectes que peut prendre le texte ( 1,2 ou frz...)
For n = 2 To a
DoEvents
For i = 2 To Sqr(n) + 1
DoEvents
If (n And 1) = 0 Then
Exit For
End If
If n Mod (2 * i - 1) = 0 Then
Exit For
End If
Next i
If i > Sqr(n) Then
If a / n = Fix(a / n) Then
'Si le nombre est divisible par n qui est premier
a = a / n
'Alors on le remplace a
List1.AddItem (n)
'et n fait partie des diviseurs premiers de n
n = n - 1
'cette derniere opération permet de chercher le nombres de n nécéssaires à la décomposition (exemple n=8 décomposition 2*2*2) sans cette derniere opération le résultat est juste que si les coefficients de tout les n sont 1
End If
End If
Next n
a = Label1.Caption
'sa s'est juste pour que text1 redevienne ce qu'il était au départ et c'est pour toi SDan qui ne comprenais pas pourqu
cs_Lisa46
Messages postés99Date d'inscriptionjeudi 17 février 2005StatutMembreDernière intervention20 août 2008 19 oct. 2005 à 18:23
J'ai fait fait un petit progr. de tests:
1-XP paramétré virgule:
a) text 2,6 ; Val 2; Fix =2 donc Val ne sait pas lire 2,6
b) Text 2.6 ; Val 2,6 ; fix 2. Là, Val lit le point décimal et transcrit en virgule 2,6.
2-XP paramétré point:
a) text 2,6 ;val 2 fix2 val = fix; Val ne lira pas 2,6 numérique
b) text 2.6 ; val =2.6 et Fix = 2
Conclusion 1 :
Val sait lire que le point décimal qq. soit le paramétrage.
Val sait écrire 2.6 en 2,6 en paramétrage virgule
Donc Val sait écrire le décimal virgule (paramétrage virgule de XP), Mais ne sait jamais lire le décimal virgule.(2,6)
Pour bloquer une saisie décimale, il me semble que, le plus simple : satisfaire la double égalité:
If Text1.text val(text1.text) Fix(val(text1.text))then
aller au programme (goto)
else
"Message entrez un entier"
exit sub
End If
exit sub
Car attention, avec 2,6 on a:
val(text1.text) = Fix(Val(text1.text))
val donnant 2 dans tout paramétrage de Windows.
Il me semble avoir trouvé..voir ???
Lisa
J'ai fait ceci :
Private Sub Command1_Click()
Dim a As Variant 'ceci un programme test en observant les réponses
Dim q As Single
Dim v As Double
Dim f As Integer
a Text1.Text: Label4.Caption a
v Val(Text1.Text): Label6.Caption v
f Fix(Val(Text1.Text)): Label8.Caption f
Label10.Caption = 9 / 2 'teste le paramétrage Windows point ou virgule
End Sub
cs_Lisa46
Messages postés99Date d'inscriptionjeudi 17 février 2005StatutMembreDernière intervention20 août 2008 18 oct. 2005 à 16:13
Julien et ceux qui lisent; :
Mon idée de stopper l'entrée de tout décimal, point ou virgule a un hic ! J'ai trouvé où ça coince et je recopie ici.
Info pour les débutants comme moi :
Dans un programme d'entiers, pour éliminer sans bug les entrées décimales, tel 4.21 et aussi 4,21 j'avais trouvé ceci :
dim a as double
if val(text1.text) <> Text1.text or Fix(a) <> a then
label1.caption= "Vous devez Entrer un entier"
exit sub
end if
Ainsi avec 2.6 ou 2,6 sur mon PC ça marche dans les deux cas, mais pas sur le second PC qui dit "Type incompatible", pour 2.6 mais marche dans l'autre cas.
La raison simple, je vois:
le second PC a pour symbole décimal dans Windows la virgule et le premier le point.
Avec le point, Windows, donc VB, comprend bien le programme dans les deux cas. La virgule est logiquement considérée comme du texte par VAL.
Mais dans le cas inverse de paramétrage virgule, le point est refusé par Windows et pas considéré comme du texte par VAL comme il le devrait !
Une incohérence de Windows et de VB6...
Et mon problème n'est pas résolu pour tout PC.
Si vous avez un truc simple ? Merci !
Lisa
cs_Lisa46
Messages postés99Date d'inscriptionjeudi 17 février 2005StatutMembreDernière intervention20 août 2008 17 oct. 2005 à 14:43
Je vais essayer 10 pour les nombres premiers, très utile! Je prends, j'ai pas ça !
Je t'ai écrit sur ma source, que tu essaies mon truc et que tu me dises! Un grand service, merci !Au fait ici, tu peux stopper l'entrée (aussi) des nombres négatifs ?
En début de programme:
If a<0 then label5.caption =" Entrez des entiers positifs ! ": exit sub
(C'est du basic, sauf que on met print "..." au lieu du label et un goto vers étiquette en fin de code.). Pas loin du VB, hein ?
Et tu pouvais faire suivre de ma condition pour larguer les décimaux x,n... et les x.n...
Si elle est confirmée, ma procédure, justement à étudier par un + fort que moi en VB !
Ce que je demande...
erci pour tout!
Bizz
Lisa
cs_Julien39
Messages postés6414Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention29 juillet 2020371 16 oct. 2005 à 20:59
La note n'était pas si sévere que sa c'est pas extraordinaire ce code mais bon sa fait toujours plaisir d'avoir une bonne note.
Merci, bon courage pour tes programmes.
cs_Lisa46
Messages postés99Date d'inscriptionjeudi 17 février 2005StatutMembreDernière intervention20 août 2008 16 oct. 2005 à 20:55
T'es sympa mais je t'assure que j'ignore plein de choses et je fais avec mes propres éléments limités. Au fond c'est plus dur qd on possède moins de cartes dans son jeu! Mais je f vaius finir en qq mois ce cours débutant de Diane Zak et j'en saurais plus.
La note de 4.5 est sévère, c'est pas évident de demander à l'ordi de décomposer en facteurs premoiers, ni de décomposer une racine. Je te mets 10, aussi pour compenser cette note trop basse !Je peux pas mettre 12...
Bonne soirée !
cs_Julien39
Messages postés6414Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention29 juillet 2020371 16 oct. 2005 à 17:15
J'ai ajouté le label et la commande quitter c'est vrai c'est des détails mais c'est pas plus mal.
En revanche pour les valeurs incorectes j'aime autant demander au programme de les régler (j'ai quand meme rajouté une msgbox signalant l'erreur)
Merci de ce commentaire et ne te dévalorise pas en disant que tu ne connait rien au vb je ne pense pas que ce soit bénéfique, j'ai regardé ce que tu savais faire et je ne dirais pas que c'est rien.
cs_Lisa46
Messages postés99Date d'inscriptionjeudi 17 février 2005StatutMembreDernière intervention20 août 2008 16 oct. 2005 à 15:54
J'ai lu ton programme sobre de décomposition et bien réussi. Je vois qu'en effet ceux rompus au VB emploient des instructions différentes dont bcp sont inconnues pour moi.
Pour ça que je pense ne savoir que 4% du VB. En fait je fais du code basic avec une interface VB.
Bien que Do Loop, etc soient Basic et je maîtrise pas...
Mais si je lis un code Basic (ancien, donc), je comprends.
Je te passerai ma décomp. par mail. J'ai un peu honte de présenter du Basic ici...
Un détail :
Tu pouvais prévoir un label "Entrer votre nombre", et un Bouton Quitter ? (Là ça te prends 1 minute pour le mettre...sourire.)
Détail no 2:
Et prévoir l'entrée par erreur de 2.18 ou 2,18 par exemple où ton progr donnera alors 2. Je le fais moi, désormais.
Pour arrêter la procédure, si un décimal est entré par erreur:
Je fais un truc du genre et que je disais à US :
If val(text1.text) <> text1.text or Fix(a) <> a then
>un message d'avertissement "Pas de décimaux"
> et sortir du code.
End If
no1: Val ne prend pas à partir de la virgule considérée comme texte
et no 2: si a est pris comme décimal, il est refusé également car a <> Fix(a).
Dis-moi ce que tu en pneses.
Ceci marche sur mon PC. Tu me diras.
Je suis poisse, hein?
MaX_62
Messages postés879Date d'inscriptionvendredi 22 octobre 2004StatutMembreDernière intervention29 juin 2007 26 juin 2005 à 18:25
Pas mal !
J'avais fait un code similaire, mais sous la forme d'une fonction, qui retourne une expression de la forme i^j*k^l ; je trouve que c'est plus pratique... Si tu veux voir l'algorythme utilisé : http://www.vbfrance.com/code.aspx?ID=31260
cs_Julien39
Messages postés6414Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention29 juillet 2020371 25 juin 2005 à 19:51
Merci à DarK Sidious pour ses conseils que j'ai suivi du mieux que je pouvais et SDan j'ai modifié mon code pour qu'a la fin tu retrouves 111 c'était pas voulu au départ mais sa ne servait en effet à rien non plus de le laisser afficher 1 à chaque fois
cs_SDan
Messages postés288Date d'inscriptiondimanche 1 septembre 2002StatutMembreDernière intervention13 juin 2008 25 juin 2005 à 16:21
Salut,
Je viens de tester ton application avec l aversion 5.0 de VB, ça marche trè bien. Par contre, il y a qqch qui m'ennuie un peu et ou je ne comprends pas, par exemple, j'ai tapé 111 et puis j'ai cliqué sur Calculer. là, je suis tombé sur 3 et 37, tout à fai td'accord ave ctoi car 3 * 37 = 111 seulement, là ou j'ai tapé 111, il y a seulement l epremier chiffre qui s'affiche. Pourquoi? mais à droite, il met bien 111 est le produit de snombres premiers suivants : 3 et 37.
Sinon pas mal du tout.
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 25 juin 2005 à 16:14
J'ai pas regardé dans le détail l'algorithme utilisé.
Par contre quelques remarques concernant le code. Ce n'est pas pour te décourager, bien au contraire, c'est pour t'encourager à faire du code plus propre :
* Pas d'indentation
* Aucune variable déclarée
* Aucun espace entre les lignes
Bref, ton code est difficile à lire (encore là ca va vu qu'il n'est pas très long, mais sur une fonction de plus de 100 lignes, ca deviendrais suicidaire de te relire ;)
21 oct. 2005 à 22:06
Et tu comprends, Julien que:
1)
dim a as variant
Variant attrape tout, même "12mlip"; a est alors déclaré, mais bon, on peut modifier comme tu le dis.
Pas décalré = variant on me dit toujours !C'est idem !
2)
a =text1.text
v = val(text1.text)
F = Fix(val(text.text))
Ma NOUVELLE IDée que: a v F 'alors va au programme, ta saisie est bonne...
Cette double égalité correspond à la nécessité pour que la saisie soit un nombre entier !
C'est mathématique, non ?
.....
RE-VOICI, puisque tu n'as pas reçu le message privé...
On Error Resume Next
Dim a As Variant: Dim v As Double: Dim F As Double
a = Text1.Text ' a est variant donc attrape -tout ???
v = Val(Text1.Text)
F = Fix(Val(Text1.Text))
If a v And v F And v <> 1 And v <> 0 Then
Label1.Caption a: Label2.Visible True (Ou label1.caption = text1.text, si tu veux, mais je vois que ça marche!)
Else
Label1.Caption "Entrez un entier positif différent de 1 et 0": Label2.Visible False
Exit Sub
End If
If v < 0 Then
Label1.Caption "Entrez un entier positif. ": Label2.Visible False
Exit Sub
End If
Programme:
'Text1.Text = a
'enleve les valeurs incorrectes que peut prendre le texte ( 1,2 ou frz...)
For n = 2 To a
DoEvents
For i = 2 To Sqr(n) + 1
DoEvents
If (n And 1) = 0 Then
Exit For
End If
If n Mod (2 * i - 1) = 0 Then
Exit For
End If
Next i
If i > Sqr(n) Then
If a / n = Fix(a / n) Then
'Si le nombre est divisible par n qui est premier
a = a / n
'Alors on le remplace a
List1.AddItem (n)
'et n fait partie des diviseurs premiers de n
n = n - 1
'cette derniere opération permet de chercher le nombres de n nécéssaires à la décomposition (exemple n=8 décomposition 2*2*2) sans cette derniere opération le résultat est juste que si les coefficients de tout les n sont 1
End If
End If
Next n
a = Label1.Caption
'sa s'est juste pour que text1 redevienne ce qu'il était au départ et c'est pour toi SDan qui ne comprenais pas pourqu
19 oct. 2005 à 18:23
1-XP paramétré virgule:
a) text 2,6 ; Val 2; Fix =2 donc Val ne sait pas lire 2,6
b) Text 2.6 ; Val 2,6 ; fix 2. Là, Val lit le point décimal et transcrit en virgule 2,6.
2-XP paramétré point:
a) text 2,6 ;val 2 fix2 val = fix; Val ne lira pas 2,6 numérique
b) text 2.6 ; val =2.6 et Fix = 2
Conclusion 1 :
Val sait lire que le point décimal qq. soit le paramétrage.
Val sait écrire 2.6 en 2,6 en paramétrage virgule
Donc Val sait écrire le décimal virgule (paramétrage virgule de XP), Mais ne sait jamais lire le décimal virgule.(2,6)
Pour bloquer une saisie décimale, il me semble que, le plus simple : satisfaire la double égalité:
If Text1.text val(text1.text) Fix(val(text1.text))then
aller au programme (goto)
else
"Message entrez un entier"
exit sub
End If
exit sub
Car attention, avec 2,6 on a:
val(text1.text) = Fix(Val(text1.text))
val donnant 2 dans tout paramétrage de Windows.
Il me semble avoir trouvé..voir ???
Lisa
J'ai fait ceci :
Private Sub Command1_Click()
Dim a As Variant 'ceci un programme test en observant les réponses
Dim q As Single
Dim v As Double
Dim f As Integer
a Text1.Text: Label4.Caption a
v Val(Text1.Text): Label6.Caption v
f Fix(Val(Text1.Text)): Label8.Caption f
Label10.Caption = 9 / 2 'teste le paramétrage Windows point ou virgule
End Sub
18 oct. 2005 à 16:13
Mon idée de stopper l'entrée de tout décimal, point ou virgule a un hic ! J'ai trouvé où ça coince et je recopie ici.
Info pour les débutants comme moi :
Dans un programme d'entiers, pour éliminer sans bug les entrées décimales, tel 4.21 et aussi 4,21 j'avais trouvé ceci :
dim a as double
if val(text1.text) <> Text1.text or Fix(a) <> a then
label1.caption= "Vous devez Entrer un entier"
exit sub
end if
Ainsi avec 2.6 ou 2,6 sur mon PC ça marche dans les deux cas, mais pas sur le second PC qui dit "Type incompatible", pour 2.6 mais marche dans l'autre cas.
La raison simple, je vois:
le second PC a pour symbole décimal dans Windows la virgule et le premier le point.
Avec le point, Windows, donc VB, comprend bien le programme dans les deux cas. La virgule est logiquement considérée comme du texte par VAL.
Mais dans le cas inverse de paramétrage virgule, le point est refusé par Windows et pas considéré comme du texte par VAL comme il le devrait !
Une incohérence de Windows et de VB6...
Et mon problème n'est pas résolu pour tout PC.
Si vous avez un truc simple ? Merci !
Lisa
17 oct. 2005 à 14:43
Je t'ai écrit sur ma source, que tu essaies mon truc et que tu me dises! Un grand service, merci !Au fait ici, tu peux stopper l'entrée (aussi) des nombres négatifs ?
En début de programme:
If a<0 then label5.caption =" Entrez des entiers positifs ! ": exit sub
(C'est du basic, sauf que on met print "..." au lieu du label et un goto vers étiquette en fin de code.). Pas loin du VB, hein ?
Et tu pouvais faire suivre de ma condition pour larguer les décimaux x,n... et les x.n...
Si elle est confirmée, ma procédure, justement à étudier par un + fort que moi en VB !
Ce que je demande...
erci pour tout!
Bizz
Lisa
16 oct. 2005 à 20:59
Merci, bon courage pour tes programmes.
16 oct. 2005 à 20:55
La note de 4.5 est sévère, c'est pas évident de demander à l'ordi de décomposer en facteurs premoiers, ni de décomposer une racine. Je te mets 10, aussi pour compenser cette note trop basse !Je peux pas mettre 12...
Bonne soirée !
16 oct. 2005 à 17:15
En revanche pour les valeurs incorectes j'aime autant demander au programme de les régler (j'ai quand meme rajouté une msgbox signalant l'erreur)
Merci de ce commentaire et ne te dévalorise pas en disant que tu ne connait rien au vb je ne pense pas que ce soit bénéfique, j'ai regardé ce que tu savais faire et je ne dirais pas que c'est rien.
16 oct. 2005 à 15:54
Pour ça que je pense ne savoir que 4% du VB. En fait je fais du code basic avec une interface VB.
Bien que Do Loop, etc soient Basic et je maîtrise pas...
Mais si je lis un code Basic (ancien, donc), je comprends.
Je te passerai ma décomp. par mail. J'ai un peu honte de présenter du Basic ici...
Un détail :
Tu pouvais prévoir un label "Entrer votre nombre", et un Bouton Quitter ? (Là ça te prends 1 minute pour le mettre...sourire.)
Détail no 2:
Et prévoir l'entrée par erreur de 2.18 ou 2,18 par exemple où ton progr donnera alors 2. Je le fais moi, désormais.
Pour arrêter la procédure, si un décimal est entré par erreur:
Je fais un truc du genre et que je disais à US :
If val(text1.text) <> text1.text or Fix(a) <> a then
>un message d'avertissement "Pas de décimaux"
> et sortir du code.
End If
no1: Val ne prend pas à partir de la virgule considérée comme texte
et no 2: si a est pris comme décimal, il est refusé également car a <> Fix(a).
Dis-moi ce que tu en pneses.
Ceci marche sur mon PC. Tu me diras.
Je suis poisse, hein?
26 juin 2005 à 18:25
J'avais fait un code similaire, mais sous la forme d'une fonction, qui retourne une expression de la forme i^j*k^l ; je trouve que c'est plus pratique... Si tu veux voir l'algorythme utilisé : http://www.vbfrance.com/code.aspx?ID=31260
25 juin 2005 à 19:51
25 juin 2005 à 16:21
Je viens de tester ton application avec l aversion 5.0 de VB, ça marche trè bien. Par contre, il y a qqch qui m'ennuie un peu et ou je ne comprends pas, par exemple, j'ai tapé 111 et puis j'ai cliqué sur Calculer. là, je suis tombé sur 3 et 37, tout à fai td'accord ave ctoi car 3 * 37 = 111 seulement, là ou j'ai tapé 111, il y a seulement l epremier chiffre qui s'affiche. Pourquoi? mais à droite, il met bien 111 est le produit de snombres premiers suivants : 3 et 37.
Sinon pas mal du tout.
25 juin 2005 à 16:14
Par contre quelques remarques concernant le code. Ce n'est pas pour te décourager, bien au contraire, c'est pour t'encourager à faire du code plus propre :
* Pas d'indentation
* Aucune variable déclarée
* Aucun espace entre les lignes
Bref, ton code est difficile à lire (encore là ca va vu qu'il n'est pas très long, mais sur une fonction de plus de 100 lignes, ca deviendrais suicidaire de te relire ;)
DarK Sidious