Boucles imbriquées

Résolu
guikk Messages postés 9 Date d'inscription mercredi 13 juin 2007 Statut Membre Dernière intervention 18 juin 2007 - 14 juin 2007 à 23:42
guikk Messages postés 9 Date d'inscription mercredi 13 juin 2007 Statut Membre Dernière intervention 18 juin 2007 - 18 juin 2007 à 09:39
salut a tous,

j'ai quelques difficultés avec des lignes de codes en VB 6.
J'ai créé un form avec différents bouton devant déclencher des calculs avec les données remplies par l'utilisateur dans les champs appropriés.
lorsque j'écrit le code suivant, pour faire des itérations successives, la boucle ne s'arrete pas

je mets le code, pour que ce soit plus clair:

Private Sub cmd1_Click()


N = Val(txt_N.Text)
nbo = Val(txt_nbo.Text)
nvl = Val(txt_nvl.Text)
T = Val(txt_T.Text)
diff_a = Val(txt_diff_a.Text)
d_ats = Val(txt_d_ats.Text)
cours = Val(txt_cours.Text)
bpa = Val(txt_bpa.Text)
dis_div = Val(txt_dis_div.Text)
div = Val(txt_div.Text)
g = Val(txt_g.Text)
b = Val(txt_b.Text)
p = Val(txt_p.Text)
i = Val(txt_i.Text)
c = Val(txt_c.Text)
Mi = Val(txt_Mi.Text)
marche = Val(txt_marche.Text)
tsr = Val(txt_tsr.Text)
fisca = Val(txt_fisca.Text)
fe = Val(txt_fe.Text)
fsfc = Val(txt_fsfc.Text)
fsfr = Val(txt_fsfr.Text)


Dim j As Integer
Dim Vora, Kora, temp1, temp2, temp3, bund, action, a, k As Double


temp1 = Mi * (1 - (fe * fisca))


temp3 = 1
k = 0.01
Do Until temp3 >= temp1 * (1 + 0.001)
    For j = 1 To T
        temp2 = ((i * Mi) * (1 - fisca) * (1 + fsfc))
        temp3 = temp2 * (1 + k) ^ -j    
    Next j
    k = k + 0.0001
Loop
txt_k_dif = Str(k)
'
End Sub

le but est de déterminer le taux K tel que la valeur actualisée des flux de remboursement d'une obligation convertibles est égale au montant initial de l'émission

Merci d'avance pour votre préciseuse aide.

12 réponses

cs_Nicko11 Messages postés 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 3
15 juin 2007 à 08:10
Salut,

je pense que tu n'as vraiment pas besoin de nous pour resoudre ce pb. tu executes le programme en mode debut avec un point d'arret sur le debut de ta boucle et tu verifier toutes les opérations pour chaque itérations et tu auras au moins une informations sur la ligne de calcul qui pose probleme.

Si vraiment tu n'y arrives pas, donne l'algo que l'on voit ou ca cloche.

"c'est une logique d'actualisation de flux financiers, et je comprends que ce type de raisonnement échappe totalement (visiblement !!) à des gens qui ne sont pas de ce domaine."

Ce n'est qu'un algorithme et plutot simple d'ailleurs, rassure toi, je suis sur que meme nous, LOL, on peut comprendre, rassures toi.
3
guikk Messages postés 9 Date d'inscription mercredi 13 juin 2007 Statut Membre Dernière intervention 18 juin 2007
18 juin 2007 à 09:39
Salut,
J'ai trouvé la solution, en appliquant la méthode de Nicko11: point d'arrêt et espion.
Si quelqu'un a besoin de ce genre de code, c'est une méthode très efficace.

Voila, fini de vous embeter avec mon souci de boucles imbriquées et de flux actualisés !!

Merci @ vous pour les ti conseils
3
guikk Messages postés 9 Date d'inscription mercredi 13 juin 2007 Statut Membre Dernière intervention 18 juin 2007
14 juin 2007 à 23:51
Re-Bonsoir a tous, j'ai oublié de préciser que dans le code déposé dans le précédent message, le but est de refaire le calcul jusqu'a atteindre l'égalité entre le montant (temp1 et la valeur actualisée de la somme des flux générés par l'émission obligataire (Temp3).

je ne suis pas sur d'avoir été très explicite.
en tout cas, je vous remercie par avance.

Bonne fin de soirée à tous
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
15 juin 2007 à 00:04
Bonsoir :

1) Ton temp2 ne change pas de valeur ( temp2 = ((i * Mi) * (1 - fisca) * (1 + fsfc))
 ) ... bien que tu recalcules sa vakleur à chaque tour de boucle (on se demande pourquoi). Bref De toutes façons temp2 ne varie pas !

2) temp3 (  temp3 = temp2 * (1 + k) ^ -j    ) ne risque pas d'aumenter, mais de diminuer à cette allure là !

Je vois alors très mal comment tu peux espérer sortir de ta bouble While (puisque jamais Temp3, au départ <w temp2, ne va qu'en diminuant et ne sera donc jamais supérieur ou égal à  temp1 * (1 + 0.001)

Bref ! il y a certes une question de code (manifeste ici) mais aussi et surtout une d"fionition de ton algorythme pour qu'il corresponde bien à ce que tu recherches, c'est certain (et là, ma foi, tu es bien seul à connaître cette logique à mettre en oeuvre).
0

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

Posez votre question
guikk Messages postés 9 Date d'inscription mercredi 13 juin 2007 Statut Membre Dernière intervention 18 juin 2007
15 juin 2007 à 00:46
c'est une logique d'actualisation de flux financiers, et je comprends que ce type de raisonnement échappe totalement (visiblement !!) à des gens qui ne sont pas de ce domaine.

j'ai réussi à sortir de ma boucle, mais n'obtiens pas le résultat attendu.
c'est un problème que je résouds aisément sous Excel, mais pour la prog, je suis pratiquant depuis 1 mois....

@+ et merci d'avoir pris le temps de me répondre.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
15 juin 2007 à 01:33
Salut
Je pense que le problème vient du fait que certaines de tes variables ne sont pas des Double :
   Dim Vora, Kora, temp1, temp2, temp3, bund, action, a, k As Double
ne veut pas dire que chacune de ces variables est de type Double (seule la dernière).
Il faut toujours préciser, pour chaque variable, le "As Double"

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
guikk Messages postés 9 Date d'inscription mercredi 13 juin 2007 Statut Membre Dernière intervention 18 juin 2007
15 juin 2007 à 01:54
cela ne change rien, jai déclaré mes variables de la même façon pour une autre partie de mon prog, et j'ai obtenu les résultats escomptés... sans la moindre difficulté 

en revanche, si tu sais quelle instruction permet de faire la somme actualisée des termes X au taux "i" sur "n" années, je suis très intéressé !!

Merci @+
0
guikk Messages postés 9 Date d'inscription mercredi 13 juin 2007 Statut Membre Dernière intervention 18 juin 2007
15 juin 2007 à 09:35
salut nicko11,

"c'est une logique d'actualisation de flux financiers, et je comprends que ce type de raisonnement échappe totalement (visiblement !!) à des gens qui ne sont pas de ce domaine."

ce message était à destination de jmfmarques qui avait l'air de me prendre pour un c*n avec ses grands airs...
j'aurais pu lui envoyer un message perso.

je sais bien que l'algo est simple, mais comme je l'ai dit, je pratique VB depuis un mois a peine...

Merci @ toi
0
cs_Nicko11 Messages postés 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 3
15 juin 2007 à 10:14
Ok mais pour ton tu vas faire quoi alors.

Comme je te l'ai dis tu peux le faire toi meme rapidement en mode debug. Au pire, donne nous un exemple pour les valeurs des variables et le resultat attendu que l'on essaies de voir un peu ou ca cloche.

temp1 = Mi * (1 - (fe * fisca))

temp3 = 1
k = 0.01
Do Until temp3 >= temp1 * (1 + 0.001)
    For j = 1 To T
        temp2 = (( i * Mi) * (1 - fisca) * (1 + fsfc))
        temp3 = temp2 * (1 + k) ^ -j    
    Next j
    k = k + 0.0001
Loop
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
15 juin 2007 à 10:16
Je ne t'ai pas prtis pour ce que tu dis, 1086392 guikk, non...
Mais j'insiste sur ce que j('ai dit à propos de ton code, oui.
1) recalcul inutile de :
   temp2 = ((i * Mi) * (1 - fisca) * (1 + fsfc))
dans ta boucle sur J alors que la valeur de temp2 n'est jamais modifiée !


   lenteurs ajoutées pour rien

2) temp3 = temp2 * (1 + k) ^ -j   
une puissance négative sur une valeur de J qui augmente de 1 unité à chaque tour de ta boucle ne risque pas de faire aller temp3 dans le sens d'une incrémentation, et ce quelles que soit la valeur de k puisque k n'augmente que de  0.0001 à chaque passage alors que J augmente d'une unité à chaque passage et que J est utilisé en exposant négatif.


Or la boucle que tu nous as montrée ne s'arrêtait que lorsque temp3 atyteignait une valeur supérieure (Do Until temp3 >= temp1 * (1 + 0.001)) à celle de départ.
Ta boucle tournait donc bien évidemment sans fin !

Si te le faire remarquer te parait pédant, ma foi... je me demande bien pourquoi tu venais demander pourquoi une telle boucle tournait sans fin !!!


PS : tu perux t'abstenir de m'envoyer un message personnel.
0
guikk Messages postés 9 Date d'inscription mercredi 13 juin 2007 Statut Membre Dernière intervention 18 juin 2007
15 juin 2007 à 10:39
j'avais bien compris hier que l'incrémentation ne se faisait pas, et le msg de jmfmarques était clair, Je suis juste vexé d'avoir été pris pour un nul (quand on débute, c'est normal de faire des erreurs?! lol)

en fait, dans le code que j'ai mis hier soir, il manquait un terme, en rouge. empechant l'incrémntation



temp1 = Mi * (1 - (fe * fisca))




temp3 = 1
'k = 0.01 est ce utile de mettre une valeur de départ à k??
Do Until temp3 >= temp1 * (1 + 0.001)
    For j = 1 To


T
        temp2 = (( i * Mi) * (1 - fisca) * (1 + fsfc))
        temp3 = temp3 + temp2 * (1 + k) ^ -j    
    Next j
    k = k + 0.0001
Loop

k est le parametre inconnu, a determiner par la boucle.
je souhaite que la boucle tourne en augmentant de 0.0001 (0.01%, en fait) à chaque tour jusqu'a ce que temp3 soit égale tres proche de temp1.

les parametres a retenir sont les suivants:

T=13
Mi=1.000.000.000
fe=0.02      
fisca = 0.5
fsfc=0.001
i= 0.065

le but du jeu est de déterminer un taux 'K' = 10.20 %(environ)...

Merci @ toi, Nicko11,

PS: jmfmarques, rassures toi, je ne t'enverrai pas de msg, et ne te sens pas obligé de répondre à celui ci.
merci qd mm d'avoir pris le temps de me répondre, bonne dev et bon we
0
cs_Nicko11 Messages postés 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 3
15 juin 2007 à 14:08
Ok meme si je connais pas l'alogo, ca permet de voir un peu comment ca s'execute tout ca.
0
Rejoignez-nous