[VB 2005] CLASSE DE CALCUL

romagny13 Messages postés 687 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 27 août 2014 - 22 juil. 2007 à 23:28
JmbBoubou Messages postés 1 Date d'inscription dimanche 7 mars 2004 Statut Membre Dernière intervention 14 février 2011 - 14 févr. 2011 à 12:49
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/43545-vb-2005-classe-de-calcul

JmbBoubou Messages postés 1 Date d'inscription dimanche 7 mars 2004 Statut Membre Dernière intervention 14 février 2011
14 févr. 2011 à 12:49
très bien mais je voudrais signaler 2 bugs:

- si la formule est du texte (ex: toto), le programme boucle (il faut rajouter un test de sortie)
- si on écrit 1.23/45.23 alors il y a erreur. Il faut dans la procédure IsReal ajouter un 0 si la chaine à tester commence par un .
Elxior Messages postés 56 Date d'inscription jeudi 28 juin 2007 Statut Membre Dernière intervention 29 août 2010 1
31 juil. 2007 à 06:23
Petite remarque rien de méchant :
Ligne 160 : If str <> "" Then => If Not str.IsNullOrEmpty Then

Bon code, 9/10
cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018
27 juil. 2007 à 14:38
J'ai corrigé la première erreur, mais la seconde me semble impossible pour une simple raison : (k)k remplacé par (k)*k ne peut être possible si k est négatif .

exemple:

(8)-2 serait transformé en (8)*-2... le seul moyen est donc de l'appliquer lorsqu'il n'y a aucun signe devant le second k, ce qui est casi impossible via ma classe (sauf dans le cas ou il est spécifié dans la formule de départ ...)

Donc cela marche, mais ne peu prendre en compte que les calculs de type (k)q vec q non signé !

Voilou :)
damienpasqualinotto Messages postés 16 Date d'inscription samedi 4 mars 2006 Statut Membre Dernière intervention 1 décembre 2007
27 juil. 2007 à 14:18
Pour le premier rentre par exemple :
5+cos(2)+4cos(3)

Et pour la deuxième je suis d'accord avec toi sur le fait qu'on écris plutot : k*(K) que (K)*k mais si dans un calcul tu a (2+X)cos(3) par exemple il faut quand même rajouterr un "*" aprés ")".
Voila bone journée.

Damien
cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018
27 juil. 2007 à 09:54
-Humm pour le tout premier bug, peux-tu me donner un exemple d'équation qui bug?

-et pour la deuxième, a savoir (K)k, j'ai volontairement omis le (k)*k généralement, et par sorte de convention, on met les nombre facteur de parenthèses devant celles-ci. Tu peux d'ailleurs essayer de tapper (8)2 sur ta calculatrice, tu auras des surprises :)
Mais bon je pense que je l'ajouterai finalement.

Merci de tes conseils :)
damienpasqualinotto Messages postés 16 Date d'inscription samedi 4 mars 2006 Statut Membre Dernière intervention 1 décembre 2007
26 juil. 2007 à 21:18
Salut a toi...


J'ai trouvé 2 petits problèmes dans ta classe.
Les deux sont en rapport avec ta fonction "remplaceProduit" :


- Quand tu remplace par exemple "3cos" par "3*cos" tu met :

equ = equ.Replace("cos", "*cos")

sauf que si par exemple un "5+cos" traine ailleurs dans le calcul, il sera remplacé par "5+*cos" se qui créé un bug plus tard dans le code.
Je pense que tu devrais plutôt mètre quelque chose comme :

equ = equ.Substring(0, result.Index) & result.Value.Replace("cos", "*cos") & equ.Substring(result.Index + result.Length)

Cela ne pose pas de problème pour les ")(" car elles doivent toutes être changées en ")*(".
Donc par contre je pense que pour les ")(" un simple :

equ = equ.Replace(")(", ")*(")

suffirait sans utilisé d'expression régulières.


- Ensuite tu oubli de rajouter un "*" entre une parenthèse fermée et un chiffre ou |cos|sin|tan|sqr.
Donc par exemple quand le calcul : (2+3)2 est rentré. Le résultat retourné est 52 et non 10.
Je pense qu'avec un :

modèle = "\)(([\-|\+|]?\d+(\.\d*)?)|cos|sin|tan|sqr)"
reg = New Regex(modèle)
result = reg.Match(equ)
Do While result.Success = True
equ = equ.Substring(0, result.Index) & result.Value.Replace(")", ")*") & equ.Substring(result.Index + result.Length)
result = reg.Match(equ)
Loop

le problème sera résolu.


Voila, si tu modifie ton code, n'oublie pas de le mètre à jour dans "Euler".
Si je trouve qu'autre problème je te lés indiquerais aussi.


Damien.
Rejoignez-nous