Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2672 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++] expression mathématique

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] expression mathématique

n°886740
burgergold
5$? va chez l'diable!
Posté le 31-10-2004 à 02:55:11  profilanswer
 

J'ai des expressions mathématiques à lire, à transformer en une file de symbole et à évaluer
 
présentement ca fonctionne plutot bien avec des constantes et des opérateurs binaires de base (+, -, *, /, <, > )
 
mais y'a plein d'autres opérateurs à traiter, ainsi que des variables
 
j'ai donc une class Symbole, composé d'un int "valeur", une string "chaine", d'un int "type" (0 => inconnu, 1 => variable, 2 => constante, ...)
 
présentement, lorsque j'appele le constructeur, je lui passe soit un double ou une string
 
lorsque c'est un double, je l'assigne à "valeur" et j'assigne "2" au type
 
lorsque c'est une string, je l'assigne à "chaine" et je dois déterminer s'il s'agit d'une variable, d'un opérateur (binaire ou unaire, jcrois pouvoir faire ca simplement dans la classe donc j'ai p-e tout faux dans ma conception), une parenthèse ouvrante ou fermante ou un point virgule(qui signifit la fin de l'expression)
 
ya un moyen de déterminer si ma string est une variable (débute par un alpha, suivie par des alphanum ou underscore)? la seule solution que je vois c'est de copier ma string dans un tableau de char et de tester, jtrouve ca un peu mauvais :/
 
pour les opérateurs, justement le fait que jdois vérifier le symbole précédent dans ma file pour déterminer s'il s'agit d'un opérateur binaire ou unaire me fait croire que je ne peux pas déterminer dans mon constructeur de Symbole de quel type d'opérateur il s'agit. Alors comment associer un type à un Symbole? Ca reste logique d'attribuer un type à un Symbole en dehors de son constructeur?
 
l'algo sur lequel je me base présentement:
 


lecture d'un expression
 tant que le symbole n'est pas un point virgule
   lire symbole
   enfiler symbole
 
lecture d'un symbole
  lire un caractere
  si caractere est numérique // constante
    replacer le caractere
    lire un double
    créer un objet Symbole(mon_double)
  sinon
    ma_string = caractere
    si mon_caractere est alpha // variable
      tant que mon prochain caractere est alphanumérique ou un underscore
        lire un caractere et le concaténer à ma_string
    si caractere n'est pas "(" et pas " )" et pas ";" // opérateur
      // traitement pour lire un opérateur de plusieurs caractères
    créer un objet Symbole(ma_string)


 
donc récap de mes problèmes  :sweat:  
déterminer qu'une string est une variable
lire un opérateur sur plusieurs caractères (ex: ++, >=, !=)
déterminer si une string est un opérateur binaire ou unaire (possiblement revoir ma logique de création de symbole)
 
si vous croyez pouvoir aider un peu :/


---------------
http://www.boincstats.com/signature/user_664861.gif
mood
Publicité
Posté le 31-10-2004 à 02:55:11  profilanswer
 

n°886799
pascal_
Posté le 31-10-2004 à 10:46:44  profilanswer
 

Tu peux pas utiliser des outils comme lex ou yacc ? Ça se fait en quelques minutes avec...

n°886865
gilou
Modérateur
Modzilla
Posté le 31-10-2004 à 12:39:15  profilanswer
 

C'est clairement un exo de cours, donc certainement pas lex et yacc.
 
> j'ai donc une class Symbole, composé d'un int "valeur", une string "chaine", d'un int "type"
Ca serait pas plus lisible d'employer un type enumere pour ton "type"??
 
Et Burgergold, vu que tu as pas enoncé clairement les parametres de ton pb (par exemple, la liste des operateurs a reconnaitre...) comment veux tu que l'on t'aide...  
A+,


Message édité par gilou le 31-10-2004 à 12:41:42

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°886872
burgergold
5$? va chez l'diable!
Posté le 31-10-2004 à 13:07:52  profilanswer
 

gilou a écrit :

C'est clairement un exo de cours, donc certainement pas lex et yacc.
 
> j'ai donc une class Symbole, composé d'un int "valeur", une string "chaine", d'un int "type"
Ca serait pas plus lisible d'employer un type enumere pour ton "type"??
 
Et Burgergold, vu que tu as pas enoncé clairement les parametres de ton pb (par exemple, la liste des operateurs a reconnaitre...) comment veux tu que l'on t'aide...  
A+,


 
bin même le prof l'a pas énoncé alors on considère que c'est pas mal tous les opérateurs :D


---------------
http://www.boincstats.com/signature/user_664861.gif
n°886892
burgergold
5$? va chez l'diable!
Posté le 31-10-2004 à 13:38:19  profilanswer
 

tiens une liste avec leur priorité de ceux que je crois qui sont à être supporté
 


x++ (2) prédécrément
x-- (2) postdécrément
 
++x (3) préincrément
--x (3) prédécrément
!   (3) non logique
+x  (3) + unaire
-x  (3) - unaire
 
* (6) multiplication
/ (6) division
% (6) modulo
 
+ (7) addition
- (7) soustraction
 
<< (8) décalage à gauche
>> (8) décalage à droite
 
<  (9) inférieur
<= (9) inférieur ou égal
>  (9) supérieur
>= (9) supérieur ou égal
 
== (10) égal
!= (10) non égal
 
&  (11) et bit à bit
^  (12) ou exclusif bit à bit
|  (13) ou inclusif bit à bit
&& (14) et logique
|| (15) ou logique
=  (17) affectation
+= (17) opérateur et affectation
(... genre -=, *=, ...)


---------------
http://www.boincstats.com/signature/user_664861.gif
n°886896
pascal_
Posté le 31-10-2004 à 13:40:46  profilanswer
 

Commence par écrire une grammaire qui parse tout ça...

n°886911
burgergold
5$? va chez l'diable!
Posté le 31-10-2004 à 13:48:46  profilanswer
 

pascal_ a écrit :

Commence par écrire une grammaire qui parse tout ça...


 
c'est l'un de mes problèmes justement :D
 
lors de la lecture d'un opérateur, jvais devoir testé dans un "GROS" if si l'opérateur existe. S'il existe, jvais prendre un autre caractère de ma chaine, l'ajouter à ma string, et retester si c'est un opérateur qui existe. S'il n'existe pas, alors je replace le caractère dans ma chaine, et je lis le prochain Symbole.
 
Donc disons que j'ai comme expression 1++;
 
Je lis le premier symbole; je prend un caractère, c'est un digit. Je le replace dans ma chaine et je lis un double (qui sera 1).
 
Il me reste ++ dans mon flux d'entrée
 
Je lis le second symbole. je prend un caractère, c'est ni un digit, ni un alpha, ni un ";", ni un "(", ni un " )". Je le considère donc comme un opérateur. Je l'ajoute à ma string. Je teste avec un GROS if si c'est un symbole valide (if string == "+" || string == "-" || ...). Je lis un second caractère, le second +. je l'ajoute à la string et reteste si c'est un opérateur valide. Fin du flux d'entrée, je crée mon objet Symbole à partir de la string ++. Mais là dans mon objet Symbole, je dois déterminer s'il s'agit d'un opérateur unaire ou binaire. Dans ce cas ci, c'est unaire, c'est plutot évident, mais on pourrait avoir un + unaire, qui lui ne saurait pas qu'il est unaire sans savoir dans quel contexte il se trouve (ne doit pas avoir de variable/constante à sa gauche). Et là jsuis bloqué car je détermine et assigne le type dans mon constructeur de symbole présentement
 
edit: d'ailleur l'idée du gros if qui test si la string est l'un des nombreux opérateur que je supporte (pas loin de 30), je trouve ca un peu bourrin (un if avec 30 conditions séparé par des ||, ca fait un peu beurk...)


Message édité par burgergold le 31-10-2004 à 13:54:28

---------------
http://www.boincstats.com/signature/user_664861.gif
n°886998
peak
Posté le 31-10-2004 à 14:16:36  profilanswer
 

Tu dois faire un automate qui identifie pour chaque token le type d’ unité lexicale au quel il appartient (exp reg = DFA = scanner = analyseur lexical) puis faire remonter le type d'unité vers le parser (analyseur syntaxique) qui lui verifie si la syntaxe du langage est vérifié sur base de la grammaire et éventuellement d'un table de descision (cf : left parsing, right parsing avec combien de symboles de prévisions) et enfin générer ton code (si tu le fais par descente récursive c'est tout bête)
 
bon amusement mais à mon avis tu ferais bien de commencer par te documenter.....


---------------
"Theres 10 types of people in the world : Those who understand binary and those who don't."
n°887002
burgergold
5$? va chez l'diable!
Posté le 31-10-2004 à 14:20:52  profilanswer
 

peak a écrit :

Tu dois faire un automate qui identifie pour chaque token le type d’ unité lexicale au quel il appartient (exp reg = DFA = scanner = analyseur lexical) puis faire remonter le type d'unité vers le parser (analyseur syntaxique) qui lui verifie si la syntaxe du langage est vérifié sur base de la grammaire et éventuellement d'un table de descision (cf : left parsing, right parsing avec combien de symboles de prévisions) et enfin générer ton code (si tu le fais par descente récursive c'est tout bête)
 
bon amusement mais à mon avis tu ferais bien de commencer par te documenter.....


 
ouin bien le travail c'est quand même pour demain :D
 
le prof nous a fournit 7 fichiers de test (le 7e est meme un fichier pour avoir 1 point bonus sur 10)
 
avec mon présent code, jsuis en mesure d'évaluer les 5 premiers. Le 6e est celui qui comporte des opérateurs unaires ainsi que des opérateurs sur plus d'un caractère
 
donc logiquement jpeux croire que le prof s'attendait à ce qu'on ait de la misère
 
il a d'ailleurs spécifié à la fin du travail: "je ne m'attends pas à ce que vous aillez été en mesure de tout faire. Si vous n'avez pas terminé, remettez votre code pour qu'il soit fonctionnel avec les fonctionnalités que vous avez implanté."
 
donc bon... en plus un ancien étudiant m'a envoyez son ancien tp (dans lequel il dit avoir eu une bonne note) et il est encore moins avancé que moi :/


---------------
http://www.boincstats.com/signature/user_664861.gif
n°887193
pascal_
Posté le 31-10-2004 à 18:21:12  profilanswer
 

Ouais, ben c'est un peu débile.  
 
Il y a une façon de faire pour traiter un exo pareil. Ce n'est pas évident du tout au début.
 
Donc soit il vous expose la méthode, mais vous laissez vous débrouiller à bidouiller des solutions bancales c'est  [:w3c compliant]

mood
Publicité
Posté le 31-10-2004 à 18:21:12  profilanswer
 

n°887200
burgergold
5$? va chez l'diable!
Posté le 31-10-2004 à 18:25:31  profilanswer
 

pascal_ a écrit :

Ouais, ben c'est un peu débile.  
 
Il y a une façon de faire pour traiter un exo pareil. Ce n'est pas évident du tout au début.
 
Donc soit il vous expose la méthode, mais vous laissez vous débrouiller à bidouiller des solutions bancales c'est  [:w3c compliant]


 
c'est le cas pourtant :D
 
bon bien jcrois que jvais en rester là, j'ai présentement le support des constantes et des opérateurs binaires suivant
 

+
-
*
/
%
<
<=
>
>=
==
!=
&
^
|
&&
||


 
c'est déjà beaucoup plus que certain. J'suis en mesure de traiter parfaitement 5 des 6 fichiers de test du prof.
 
le 6e je le fais à 10/12
 
et le bonus c'est trop compliqué, c'est avec des variables :D
 


[yaberger@lfs01]# cat ../tp2.x
a=5;
b=a*3+a;
c=a+b;
d=(e=1)+(abc=2);
a;b;c;d;e;abc;
++a;
a++;
a;
b=a++ + ++a;
a;
a+=1;
b+=a;
c+=b+=a;b;
c;
c>>=2;c++;
c<<=2;c;


---------------
http://www.boincstats.com/signature/user_664861.gif
n°887650
gilou
Modérateur
Modzilla
Posté le 01-11-2004 à 11:24:48  profilanswer
 

Burgergold a écrit :

ouin bien le travail c'est quand même pour demain :D

:pfff:  
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°891388
gaille
Posté le 05-11-2004 à 16:38:04  profilanswer
 

pascal_ a écrit :

Tu peux pas utiliser des outils comme lex ou yacc ? Ça se fait en quelques minutes avec...


 
Ouep, parce que s'il faut que tu réinventes la roue...

n°891396
burgergold
5$? va chez l'diable!
Posté le 05-11-2004 à 16:51:16  profilanswer
 

gaille a écrit :

Ouep, parce que s'il faut que tu réinventes la roue...


 
ouais mais là c'était quand meme un travail dont le but était l'apprentissage


---------------
http://www.boincstats.com/signature/user_664861.gif

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++] expression mathématique

 

Sujets relatifs
[C++] expression infixée -> postfixée[Ada] exploiter une fonction mathematique saisie
expression reguliere formatage de donneesProbleme d'une simple expression reguliere [RESOLU]
[Perl] Question de logique mathématique[C++] Librairie mathématique
Expression régulière c++Expression régulière PHP (enlever les balises <? et ?>)
Expression reguliere, capture et alternativeSurligner une expression recherchée dans une chaine de caractères
Plus de sujets relatifs à : [C++] expression mathématique


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR