OVH Cloud OVH Cloud

classe et affichage de tableau

3 réponses
Avatar
Pascal
Bonjour
Je voulais créer des nombres complémentaires pour afficher des opérations du
type suivant (choisir la taille des nombres, la quantité de leurs chiffres
qui seront complémentaires; mélanger ou non ces nombres etc...)

37 + 13 + 48 + 12 = (seul le dernier chiffre est le complémentaire à 10 du
nombre suivant) 7 + 3 = 10 et 8 + 2 = 10
ou 456 + 244 + 512 + 188 = (seul les deux derniers chiffres sont
complémentaires à 100 du nombre suivant) 56 + 44 = 100 et 12 + 88 = 100
j'ai donc créer la classe suivante :

'additionner des nombres qui sont complémentaires les uns des autres
Public Function Ope4(ByRef Tableau() As Variant, ByVal high As Long, ByVal _
low As Long, ByVal Deci As Boolean, ByVal NbrChifApVirgule As Integer, ByVal
_
Combien As Integer, Melanger As Boolean, NbrChifrPriCpte As Integer) As
Variant

Randomize Timer
ReDim Tableau(0 To Combien, 0 To Combien)
Dim y, v, Comp As Integer
Dim N2, N1 As Integer
v = NbrChifApVirgule
'complémentaire à combien 10, 100, 1000 ?
Comp = 1
For y = 1 To NbrChifrPriCpte
Comp = 10 * Comp
Next y

Select Case Deci
Case False 'cas des entiers
For v = 0 To Combien
For y = 0 To Combien

N1 = Int((high - low + 1) * Rnd) + low 'je tire un nombre
x = Right(N1, NbrChifrPriCpte) 'je teste la fin de celui-ci
If x = 0 Then
x = 10
End If

Tableau(v, y) = N1 ' je le mets dans le tableau
Ope4 = Tableau(v, y)
y = y + 1 'j'avance
N2 = Int((high - low + 1) * Rnd) + low 'je tire le nombre suivant
dont la fin doit être le complémentaire du précédent
N2 = Left(N2, Len(N2) - (NbrChifrPriCpte)) & (Comp - x) 'je
l'adapte
Tableau(v, y) = N2 ' je le mets dans le tableau
Ope4 = Tableau(v, y)
N2 = 0
N1 = 0
Next y
v = v + 1
Next v
Case Else 'cas des décimaux

End Select

End Function


et dans ma form1 contenant des labels et des command button

Private Sub Command12_Click()
Dim t() As Variant
Dim c6 As Class1
Set c6 = New Class1

For i = 0 To 3
Label4(i) = c6.Ope4(t(), 100, 0, False, 0, 1, False, 1)
'Label4(i) = FormatNumber(Label4(i))
Next i

End Sub


je suis incapable d'afficher l'ensemble des nombres fabriqués par la Ope4.
Apparemment ils sont bien fabriqués (avec F8 je contrôle les infobulles du
code et c ok)
Par contre je ne sais pas sélectionner dans tout ce qui est fabriqué
(collection de nombres ?) au niveau de ma form1 afin de les afficher comme
je le souhaite.
merci de votre aide

3 réponses

Avatar
Jean-Marc
"Pascal" a écrit dans le message de
news:41b20b44$0$8116$
Bonjour
Je voulais créer des nombres complémentaires pour afficher des opérations


du
type suivant (choisir la taille des nombres, la quantité de leurs chiffres
qui seront complémentaires; mélanger ou non ces nombres etc...)

37 + 13 + 48 + 12 = (seul le dernier chiffre est le complémentaire à 10 du
nombre suivant) 7 + 3 = 10 et 8 + 2 = 10
ou 456 + 244 + 512 + 188 = (seul les deux derniers chiffres sont
complémentaires à 100 du nombre suivant) 56 + 44 = 100 et 12 + 88 = 100
j'ai donc créer la classe suivante :



<snip le code>

je suis incapable d'afficher l'ensemble des nombres fabriqués par la Ope4.
Apparemment ils sont bien fabriqués (avec F8 je contrôle les infobulles du
code et c ok)
Par contre je ne sais pas sélectionner dans tout ce qui est fabriqué
(collection de nombres ?) au niveau de ma form1 afin de les afficher comme
je le souhaite.



Hello,

j'ai remis un peu d'ordre dans la fonction de la classe, pour que
au moins ça puisse compiler :-( Ton code a des gros soucis
(algorithmiques, techniques) et il ne fait pas ce que tu crois.
Difficile de t'expliquer en quelques lignes tout ce qui ne va pas.
Au minimum, essaie de lire et de bien comprendre comment marche un
retour de fonction en VB. Tu verras en particulier que les
affectations Ope4 = Tableau(...) ne veulent rien dire dans ce
contexte. Si tu passes un tableau Byref, c'est précisément que tu
comptes le modifier. Donc utilises le tableau lors du retour de la
fonction pour l'affichage. Je te renvoie à la lecture (utile je
pense) de:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbenlr98/html/vastmFunction.asp

En annexe, le code de la fonction, un peu corrigé etcommenté.

'
' IL FAUT TOUJOURS METTRE CECI EN TETE DE MODULE, FORM, ETC.
' C EST LA SEULE FACON DE VOIR LES DECLARATIONS MANQUANTES
Option Explicit

Public Function Ope4(ByRef Tableau() As Variant, ByVal high As Long, ByVal _
low As Long, ByVal Deci As Boolean, ByVal NbrChifApVirgule As Integer, ByVal
_
Combien As Integer, Melanger As Boolean, NbrChifrPriCpte As Integer) As
Variant

ReDim Tableau(0 To Combien, 0 To Combien)
' ATTENTION : il faut typer CHAQUE variable
Dim y As Integer, v As Integer, Comp As Integer
Dim N2 As Integer, N1 As Integer ' idem, typer chaque variable
' il faut délclarer x ! on le voit de suite avec Option explicit
Dim x As Integer

' on termine les déclarations avant de commencer le code
Randomize Timer

v = NbrChifApVirgule
'complémentaire à combien 10, 100, 1000 ?
Comp = 1
' toujours indenter dans un for
For y = 1 To NbrChifrPriCpte
Comp = 10 * Comp
Next y

Select Case Deci
Case False 'cas des entiers
For v = 0 To Combien ' idem => indenter proprement
For y = 0 To Combien ' idem

N1 = Int((high - low + 1) * Rnd) + low 'je tire un nombre
' LA fonction Right return un Variant String
' et tu teste avec 0 (un entier)
' NON !! convertir en entier alors!
' en plus, on ne doit pas utiliser Right
' mais right$
x = CInt(Right$(N1, NbrChifrPriCpte)) 'je teste la fin de
celui-ci
If x = 0 Then
x = 10 ' on indente proprement
End If

Tableau(v, y) = N1 ' je le mets dans le tableau

' pourquoi ces assignations en plein milieu ?? but ??
' le principal probleme ici: voir la doc
Ope4 = Tableau(v, y)

' <<=== horrible!! - à proscrire absolument
y = y + 1 'j'avance

N2 = Int((high - low + 1) * Rnd) + low 'je tire le nombre
suivant dont la fin doit être le complémentaire du précédent
N2 = Left(N2, Len(N2) - (NbrChifrPriCpte)) & (Comp - x) 'je
l 'adapte
Tableau(v, y) = N2 ' je le mets dans le tableau

' pourquoi ces assignations en plein milieu ?? but ??
' idem, le probleme vient de la
Ope4 = Tableau(v, y)

N2 = 0
N1 = 0
Next y

v = v + 1 ' !!! <== c'est quoi cette horreur ?????????
' en faisant ça tu avances v 2 par 2 !! c'est le but ????
' si oui, ecrire plutot : for v = 0 to combien step 2

Next v
Case Else 'cas des décimaux

End Select
End Function

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
Avatar
Pascal
bon j'ai changé mon fusil d'épaule et j'ai essayé autre chose:

créer une classe3

Option Explicit
'tirage aléatoire de nombres entiers ou décimaux
Public Function Rand(ByVal high As Long, ByVal low As Long, ByVal Deci As
Boolean, _
ByVal NbrChifApVirgule As Integer) As Variant


Dim i As Integer, v As Integer
v = NbrChifApVirgule
Select Case Deci
Case False 'entiers
Rand = Int((high - low + 1) * Rnd) + low
Rand = FormatNumber(Rand, v, vbFalse, vbFalse, vbUseDefault)
Case Else 'décimaux
Rand = ((high - low + 1) * Rnd) + low
Rand = FormatNumber(Rand, v, vbFalse, vbFalse, vbUseDefault)
End Select
End Function

puis dans ma form contenant des labels et un cmdbutton :

Private Sub Command13_Click()

Dim c4 As Class3
Set c4 = New Class3
Dim i As Integer, x As Integer, NbrChifrPriCpte As Integer
Dim Comp As Integer, Combien As Integer
Dim T() As Variant

Combien = 10 'Combien de nombres ?
'complémentaire à combien 10, 100, 1000 ?

NbrChifrPriCpte = 4 ' donc à 10000

Comp = 1
For i = 1 To NbrChifrPriCpte
Comp = 10 * Comp
Next i


ReDim T(1 To Combien)

For i = 1 To Combien - 1 Step 2 'je tire les nombres
T(i) = c4.Rand(10000, 1000, False, 0) ' je les mets dans le
tableau
Label4(i) = T(i) j'affiche
x = CLng(Right$(T(i), NbrChifrPriCpte)) 'je teste la fin du
nombre et si il n'y a que des zéros
If x = 0 Then 'je fais gaffe au résultat de la prochaine
soustraction sinon le nombre complémentaire pourrait avoir un drôle
d'allure... (d'ailleurs je me demande si le procédé est bien efficace à
100% ?
x = 10
End If
T(i + 1) = c4.Rand(10000, 1000, False, 0)
T(i + 1) = CLng(Left$(T(i + 1), Len(T(i + 1)) - (NbrChifrPriCpte)) &
(Comp - x)) 'je l'adapte, je le mets dans le tableau
Label4(i + 1) = FormatNumber(T(i + 1), 0)
Next i



End Sub
Avatar
Jean-Marc
"Pascal" a écrit dans le message de
news:41b35f7c$0$3435$
bon j'ai changé mon fusil d'épaule et j'ai essayé autre chose:

créer une classe3

Option Explicit
'tirage aléatoire de nombres entiers ou décimaux
Public Function Rand(ByVal high As Long, ByVal low As Long, ByVal Deci As
Boolean, _
ByVal NbrChifApVirgule As Integer) As Variant


Dim i As Integer, v As Integer
v = NbrChifApVirgule
Select Case Deci
Case False 'entiers
Rand = Int((high - low + 1) * Rnd) + low
Rand = FormatNumber(Rand, v, vbFalse, vbFalse, vbUseDefault)
Case Else 'décimaux
Rand = ((high - low + 1) * Rnd) + low
Rand = FormatNumber(Rand, v, vbFalse, vbFalse, vbUseDefault)
End Select
End Function

puis dans ma form contenant des labels et un cmdbutton :

Private Sub Command13_Click()

Dim c4 As Class3
Set c4 = New Class3
Dim i As Integer, x As Integer, NbrChifrPriCpte As Integer
Dim Comp As Integer, Combien As Integer
Dim T() As Variant

Combien = 10 'Combien de nombres ?
'complémentaire à combien 10, 100, 1000 ?

NbrChifrPriCpte = 4 ' donc à 10000

Comp = 1
For i = 1 To NbrChifrPriCpte
Comp = 10 * Comp
Next i


ReDim T(1 To Combien)

For i = 1 To Combien - 1 Step 2 'je tire les nombres
T(i) = c4.Rand(10000, 1000, False, 0) ' je les mets dans le
tableau
Label4(i) = T(i) j'affiche
x = CLng(Right$(T(i), NbrChifrPriCpte)) 'je teste la fin du
nombre et si il n'y a que des zéros
If x = 0 Then 'je fais gaffe au résultat de la prochaine
soustraction sinon le nombre complémentaire pourrait avoir un drôle
d'allure... (d'ailleurs je me demande si le procédé est bien efficace à
100% ?
x = 10
End If
T(i + 1) = c4.Rand(10000, 1000, False, 0)
T(i + 1) = CLng(Left$(T(i + 1), Len(T(i + 1)) - (NbrChifrPriCpte))


&
(Comp - x)) 'je l'adapte, je le mets dans le tableau
Label4(i + 1) = FormatNumber(T(i + 1), 0)
Next i



End Sub




Ca n'a pas l'air mal, mais tu n'es pas obligé de créer ta focntion dans un
module de classe. Une simple fonction publique dans ta forme ou dans un
module normal fait aussi bien l'affaire.

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."