Boucle for Next

papounez Messages postés 118 Date d'inscription samedi 16 juillet 2005 Statut Membre Dernière intervention 18 novembre 2008 - 4 août 2005 à 23:07
papounez Messages postés 118 Date d'inscription samedi 16 juillet 2005 Statut Membre Dernière intervention 18 novembre 2008 - 5 août 2005 à 13:16
Bonjour!
comment peut on faire pour etre sur a la derniere
boucle exacte
exemple:
calcule l'angle du pas
x = Pas / 2 / (Rp - Ro)
Arcsin = Atn(x / Sqr(-x * x + 1)) * 2
m = Round(Arcsin, 9) 'angle du pas en RADIAN
a = m * 1 / (3.1415926 / 180) 'angle du pas en DEGRE
'===================================================== 'calcule Angle depard et Arrivée
If Cxr < Rp Then
x = Cxr / Rp
Arccos = Atn(-x / Sqr(-x * x + 1)) + 2 * Atn(1)
End If
Ad = 3.1415926 + Arccos
Ar = (3.1415926 * 2) - Arccos
'===================================================== 'Calcule pas corrigée
If i = 0 Then 'Calcule le pas corrigée 1 fois
Ac = Int((Ar - Ad) / m)
Ac1 = Round((Ar - Ad) / Ac, 6)
End If

voila mon probleme si x + Ac1
il me manque le point Ar
For x = Ad To Ar Step Ac1

un peut confus peut etre

10 réponses

papounez Messages postés 118 Date d'inscription samedi 16 juillet 2005 Statut Membre Dernière intervention 18 novembre 2008
4 août 2005 à 23:10
pour etre plus clair
la fin de ma boucle doit bien se terminer sur Ar
0
MrdJack Messages postés 146 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 8 mars 2008 2
5 août 2005 à 02:07
Le probleme rencontré est si je ne m'abuse a cause du pas choisit dans ta boucle FOR :



Une boucle for utilisée avec un pas STEP va incrémenter de la valeur du pas ta variable x a chaque lecture de la boucle.

ainsi, tu vas commencer à Ad puis va incrémenter de ton pas pour
devenir Ad+pas puis va réincrémenter de pas pour devenir Ad
+2*pas etc..... jusqu'a ce que ta valeur de x soit égale a Ar



bon je sais jusque là je t'apprends rien de bien nouveau....

mais la subtilité réside dans le fait que ta valeur de x n'ateindra jamais la valeur de Ar sauf dans un seul cas, lorsque Ar = Ad + n*pas



donc pour résumer, si le pas dépasse la valeur de Ar, le for s'arrete sans exécuter avec cette valeur Ar.



le mieux à faire pour ton probleme, serait de faire après ton for une
condition qui teste si x est égal a Ar (la dernière valeur de x reste
en mémoire normalement et si ce n'est pas le cas, tu refais un
traitement avec x=Ar (la derniere condition est là pour éviter
que tu ne refasses deux fois le même calcul)



ou sinon, si tu a la possibilité d'aller plus loin, c'est tout
simplement de réajuster avant le FOR la valeur de Ar pour que le pas
tombe dessus.


en espérant t'avoir aidé, je te souhaite une bonne nuit.



@+ Mrdjack
0
papounez Messages postés 118 Date d'inscription samedi 16 juillet 2005 Statut Membre Dernière intervention 18 novembre 2008
5 août 2005 à 11:00
bonjour! et merci


oui apres la boucle je test le le (x)
If x < Ar Then
x = Ar
ici aucun changement
=====================
et la c'est bon
If x <> Ar Then
x = Ar
il le calcule 2 fois

donc comment faire , j' ai recalculer le
Ac = Int((Ar - Ad) / m)
Ac1 = Round((Ar - Ad) / Ac, 6)
mais ca ne fais rien
merci
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
5 août 2005 à 11:04
tu n'arriveras jamais au résultat à partir du moment ou la division n'est pas exacte, tu seras légérement plus petit.

en enlevant le Round déjà tu auras un peu plus de chance.





pour la dernière valeur la différence (Ar - x) sera plus petite que le
pas, donc tu pourrais faire la correction If (Ar -x) < Ac1 Then x =
Ar

ou travailler en entier avec une valeur intermédiaire



For y = Ad*Ac to Ar*Ac Step (Ar - Ad)

x = y / Ac

- - - - - -

Next

Daniel
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
5 août 2005 à 11:46
je prends un exemple:








Dim x As Double

Dim y As Long

Dim pas As Double

Dim debut As Long

Dim fin As Long

Dim Ac As Long



debut = 1

fin = 3

Ac = 3

pas = (fin - debut) / Ac



' 1er cas: avec correction pour le dernier cas

For x = debut To fin Step pas

If (fin - x) < pas Then x = fin

MsgBox x & " - " & (fin - x)

Next



'2eme cas: travail en entier

For y = debut * Ac To fin * Ac Step (fin - debut)

x = y / 3

MsgBox x & " - " & (fin - x)

Next


Daniel
0
papounez Messages postés 118 Date d'inscription samedi 16 juillet 2005 Statut Membre Dernière intervention 18 novembre 2008
5 août 2005 à 12:01
pas trop compris


angle depard Ad =3.14 ou plus
angle Arivée Ar =2*3.14 ou moins

pas Recalcule Ac1 =
je voudrais etre sur de finir avec Ar
sans qui le calcule 2 fois suivant le pas
merci
0
papounez Messages postés 118 Date d'inscription samedi 16 juillet 2005 Statut Membre Dernière intervention 18 novembre 2008
5 août 2005 à 12:03
le pas trop compris
correspond au 1 message
je vais etudier le 2
merci
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
5 août 2005 à 12:07
c'est parce que tu travailles en radians

tavailles en degrés pour avoir des nombres entiers et transforme les en radians ensuite.

sinon le test reste valable:

If (fin - x) < pas Then x = fin


Daniel
0
papounez Messages postés 118 Date d'inscription samedi 16 juillet 2005 Statut Membre Dernière intervention 18 novembre 2008
5 août 2005 à 12:19
Merci
c' est parfait !
j' ai pris le 1 Ex:


je l' ai mis a l'interieur de la boucle


If (Ar - x) < Ac1 Then
x = Ar
End If
0
papounez Messages postés 118 Date d'inscription samedi 16 juillet 2005 Statut Membre Dernière intervention 18 novembre 2008
5 août 2005 à 13:16
excuse sa ne marche pas
si il Termine Ar
il saute l'avant dernier pas
dur dur
voici mon code

Private Sub O_Calcule_Click()
Dim j, l, m, x, a As Double
Dim Rp, Ro, Pas, Cxr, AngC, AngP, Dx, Dy, Dz As Double


O_Fenetre(0).Clear 'Vide O_Fenetre (listBox)
O_Fenetre(1).Clear 'Vide O_Fenetre (listBox)
O_Fenetre(2).Clear 'Vide O_Fenetre (listBox)


For i = 0 To 1 '2 boucles Depard et Arrivée


Rp = Val(O_RayPiece(i).Text)
Ro = Val(O_RayOutil(i).Text)
Pas = Val(O_Pas(i).Text)
Cxr = Val(O_CoteXR(i).Text)
AngC = Val(O_AngCoupe(i).Text)
AngP = Val(O_AngProjection(i).Text)
Dx = Val(O_DecaX(i).Text)
Dy = Val(O_DecaY(i).Text)
Dz = Val(O_DecaZ(i).Text)


If Rp 0 Or Ro 0 Or Pas = 0 Then
MsgBox " Un des Arguments ci-dessous est égale a Zéro " + vbLf + _
" De la colonne Dépard ou Arrivée" + vbCrLf + vbCr + _
" - Rayon de la Pièce" + vbLf + _
" - Rayon de l'Outil" + vbLf + _
" - Pas", (vbCritical)

Exit Sub
Else
'===================================================== 'calcule l'angle du pas
x = Pas / 2 / (Rp - Ro)
'Arcsin(X) = Atn(X / Sqr(-X * X + 1))
Arcsin = Atn(x / Sqr(-x * x + 1)) * 2
m = Arcsin 'angle du pas en RADIAN
a = m * 1 / (3.1415926 / 180) 'angle du pas en DEGRE
'===================================================== 'calcule Angle depard et Arrivée
' Arccos(X) = Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1)
If Cxr < Rp Then
x = Cxr / Rp
Arccos = Atn(-x / Sqr(-x * x + 1)) + 2 * Atn(1)
End If
Ad = 3.1415926 + Arccos
Ar = (3.1415926 * 2) - Arccos
'===================================================== 'Calcule pas corrigée
If i = 0 Then 'Calcule le pas corrigée 1 fois
Ac = Int((Ar - Ad) / m)
Ac1 = (Ar - Ad) / Ac
End If
'===================================================== 'Calcul de X Y Z 'en fontion de Angle Coupe et Projection
R = Rp - Ro
Ac = AngC * (3.1415926 / 180) 'conversion angle de coupe en Radian
Ap = AngP * (3.1415926 / 180) 'conversion angle de projection en Radian


For x = Ad To Ar Step Ac1


If (Ar - x) < Ac1 Then
x = Ar
End If

Axe1 = Cos(x) * R
Axe11 = Axe1 / Cos(Ac)
Axe111 = Axe11 * Cos(Ap)
AxeX = Round(Axe111 + Dx, 2)

Axe2 = Sin(Ap) * Axe11
AxeY = Round(Axe2 + Dy, 2)

Axe3 = Sin(x) * R
AxeZ = Round(Axe3 + Dz - Ro, 2)
O_Fenetre(i).AddItem "X" + Str(AxeX) + " " + "Y" + Str(AxeY) + " " + "Z" + Str(AxeZ)
Next x

End If
Next i
0
Rejoignez-nous