CALCULER UNE OPERATION PRESENTE DANS UNE STRING (GESTION DES NOMBRES A VIRGULES)

Signaler
Messages postés
374
Date d'inscription
vendredi 20 octobre 2000
Statut
Modérateur
Dernière intervention
15 janvier 2021
-
Messages postés
1
Date d'inscription
vendredi 26 décembre 2003
Statut
Membre
Dernière intervention
26 décembre 2003
-
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/17428-calculer-une-operation-presente-dans-une-string-gestion-des-nombres-a-virgules

Messages postés
1
Date d'inscription
vendredi 26 décembre 2003
Statut
Membre
Dernière intervention
26 décembre 2003

Salut balgrim

En faisant des essais avec ton code j'ai fait les deux modifications suivant pour que si je calcul (1+1)(2+3) il renvoi 10 et non 7.

Remplacer "Result := AnsiReplaceStr(Result, '*(', '(');" par "Result := AnsiReplaceStr(Result, ')(', ')*(');" ainsi que


"for I:=1 to Length(Str) do //Debut de la boucle"
par "for I:=1 to Length(StringTemp) do //Debut de la boucle"


Dans l'initialisation des variable j'ai aussi fait une petite modification pour être certain de la variable ZPar soit bien initialisée
Remplacer "ZPar[0]:=0"
Par
For I:=0 To Niveau_Parentheses Do
Begin
zPar[I] := 0;
End;

La variable J n'est jamais utilisé on peut donc la supprimer
Il ne reste plus qu'a gérer la priorité.

Voilà bon coding pour la gestion des prioritées
Messages postés
52
Date d'inscription
vendredi 26 avril 2002
Statut
Membre
Dernière intervention
28 octobre 2003

A propos de l'autre source, je m'été renseigné, mais si tu faisait un petit peu plus attention, tu verrai qu'elle ne gere pas les nombre a virgules, mais seulement les integer.
En plus elle est beaucoup plus lente à l'execution, et ça aller pas pour ce que je voulais faire :)

Donc non tu casse pas la baraque, c'est meme deux sources complementaires...
Messages postés
205
Date d'inscription
samedi 10 mai 2003
Statut
Membre
Dernière intervention
2 juin 2005
1
oups pas manchester mais balgrim
Messages postés
52
Date d'inscription
vendredi 26 avril 2002
Statut
Membre
Dernière intervention
28 octobre 2003

Oui j'avais pensé à la fin de ligne, mais le probleme est toujours le meme ;) 8+3*2+4 ==> on revien au meme pb... La meilleur solution c de gerée la multiplication et la division comme une parenthese, sa doit pas etre trop difficile :)

Sinon j'ai remarquer une erreur, si on dans la chaine ...)+... comme (2*5)+3 renvoi 7. c'est du au fait d'une erreur dans le code:


//-------------Le signe Plus-----------------
(...)
if not fstOp then if StringTemp[I-1]=')' then //Si le dernier caractere été un ')' alors...
LastOperande := loSub; <<--Modifier par loAdd
//---------------------------------------------

J'ameliore tout ça, et je v mettre un zip tout de meme, avec des jolie exemples :)
Messages postés
374
Date d'inscription
vendredi 20 octobre 2000
Statut
Modérateur
Dernière intervention
15 janvier 2021

Tu te complique la vie le plus simple pour analyser ce genre de calcul est de commancer par la fin de la ligne ...

Exemple :
8+3*2 => 8+6 => 14 et hop...

Bon Coding...

ManChesTer.