Partage
  • Partager sur Facebook
  • Partager sur Twitter

Evaluation d'une expression mathematique

29 octobre 2010 à 11:14:39

Bonjour a tous,

J'aimerais ecrire une fonction qui soit capable d'evaluer une expression mathematique passee en parametre sous la forme d'une chaine de caracteres.
Celle-ci est simplement prototypee comme ca :

int  eval_expr(char *str);


La chaine serait du style de : "4+(12*4)+(3*2)/4+42"
Disons que j'ai compris comment me debrouiller pour retrouver la valeur decimale des caracteres avec la table ASCII, le probleme vient du fait que je ne sais pas du tout comment m'y prendre pour arriver a decouper correctement la chaine, et d'indiquer quels caracteres regrouper ensemble pour effectuer les operations correspondantes.
J'ai entendu parler de plusieurs choses, notamment d'un tableau de structures avec des pointeurs sur les fonctions adequates (addition, multiplication ...), et meme d'une methode avec un parseur qui utiliserait des listes chainees.
Mon probleme c'est que je ne sais pas tres bien manier les structures, et pas du tout les pointeurs sur fonctions. Comment utiliser des structures dans ce cas la ? Qu'est ce que permet exactement le pointeur sur fonctions ? (j'ai lu le cours s'y rapportant sans parvenir a reutiliser le concept dans mon cas).

J'ai pense a faire un truc du style (encore une fois sans savoir comment l'utiliser en pratique) :



struct  s_operation
{
   char operator; // Reperer quel est l'operateur trouve dans le chaine ?
   int  (*ptr_func) (char *, char *); // Pointeur sur la fonction correspondante ?
};


Puis peut etre faire un tableau de structures pour gerer tous les operateurs ?

J'avoue etre bien perdu, bien qu'ayant compris l'interet des structures je ne sais meme pas si cela est judicieux d'utiliser le concept ici.
Pour l'instant je ne parle meme pas de la gestion des parentheses, je voudrais essayer de decouper une chaine simple avec des operateurs differents.

Merci de m'avoir lu et je reste dispo si je n'ai pas ete clair du tout. :)
  • Partager sur Facebook
  • Partager sur Twitter
29 octobre 2010 à 11:29:07

Ce n'est pas simple. J'avais fait quelques fonctions il y a longtemps. Je stockais le résultat dans un arbre.
Et ensuite, évaluer l'arbre n'était pas trop dur (récursif)
  • Partager sur Facebook
  • Partager sur Twitter

Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

29 octobre 2010 à 11:30:00

Les demandes d'aides scolaires sont interdites sur les forums du SDZ.


Pose tes questions aux Asteks, Non?
Bon allez je suis genereuse:
Tu peut utiliser la NPI pour que la gestion de sparentheses et les prioritees. Ensuite.
http://fr.wikipedia.org/wiki/Notation_polonaise_inverse
Pour chaque operateur tu peut faire comme le do-op de la piscine. (Jour sur les tableau de pointeur sur fonction...)
  • Partager sur Facebook
  • Partager sur Twitter
29 octobre 2010 à 11:40:57

Spotted...xD

Mais bon le probleme c'est que je ne suis meme pas capable de faire le do op pour l'instant, et que je n'ai pas compris comment les pointeurs sur fonctions marchent.
En tout cas merci de tes indications sur la gestion des parentheses :)
  • Partager sur Facebook
  • Partager sur Twitter
29 octobre 2010 à 11:49:35

Il vaudrai mieux que tu re-regarde le jour de piscine sur les pointeur sur fonction. Sinon tu peut faire sans mais c'est moche. Ou ils s'attendent a ce que tu face un parseur de ouf (LL). Essaye de voir comment ca marche car tu en aura besoin pour les projet a venir (my_printf par ex et là c'est tres moche de pas les utiliser car c'est la seule difficultée du proj). Si tu n'y arrive vraiment pas, tu verra ca au moment de my_printf(bcp de tek1 comprenent les pointeurs sur fonction qua ce moment la)
Commence aussi coder/penser tes fonctions multiplication/addition/soustr etc...
Enfin le mieu c'est que tu commencer tres vite a coder pour avoir un bout de code a montrer au asteks pour leur poser des question et ensuite roxxer de la bistro.
  • Partager sur Facebook
  • Partager sur Twitter
29 octobre 2010 à 11:54:57

C'est un chouilla complique de comprendre les pointeurs sur fonction avec un cours de 5 minutes qui ne sert a rien selon moi. De plus, ce matin mon binome et moi sommes alles en suivi bistro, ce qui n'a servi a ...rien. On nous a dit de nous y mettre, c'est tout. Et on est plus en piscine, il n'y a plus d'asteks dans les SM. M'enfin on verra bien, je vais essayer de faire quelques essais.
  • Partager sur Facebook
  • Partager sur Twitter
29 octobre 2010 à 12:04:28

Si tu veux rendre un petit trucs, sans la gestion des priorites (au moins tu rends qqch et pas rien du tout) fait le do-op.


le do-op t'as 3 chaines de caracteres
nb1 = "1"
op = "+"
nb2 = "2"

Donc le nb1 et nb2 faut les transformers en int
et ensuite si l'op est un "+" tu fais une addition nb1 + nb2

Pas tres compliqué ?


Ensuite tu fais la meme chose avec 1 seule chaine de caractere
str = "1+2"
mais la tu decoupes ta chaine et tu fais pareil que le do-op

Quand ca marche tu fais les nombres "infinie"
et apres tu fais la NPI si tu comprends et que t'as le temps.



Pour le "Il n'y a plus d'asteks dans les SM"
Si t'as un code, que tu bloques, et que t'as une vrai question,
Va en chercher un, ils sont la pour ca !
Mais si t'y vas sans rien, ils vont te foutre un coup de pied au cul !

Sinon il n'y a pas que les asteks, si tu connais un TEK1 qui a compris, que tu lui demandes gentilement qql minutes de son temps pour qu'il t'explique, il va t'expliquer, sauf s'il est aigri
  • Partager sur Facebook
  • Partager sur Twitter
29 octobre 2010 à 12:08:19

la NPI ca aide un maximum pour la bistro. (par contre on est fin octobre la, j'avais en tète qu'on avait ce projet fin septembre).

Commence par prendre des nombres qui ce stock dans des entiers et boss a fond ton parseur. une fois que c'est fonctionnel attaque toi a l'algo des fonctions arithmétique. Bonne chance, c'est l'un des projets les plus intéressant de tek1
  • Partager sur Facebook
  • Partager sur Twitter
29 octobre 2010 à 12:53:06

D'acc je vais me pencher sur le do op, qui me posait probleme lorsque les chaines contiennent plus d'un caractere. Surement un systeme de retenues a gerer , merci pour vos reponses en tout cas.
  • Partager sur Facebook
  • Partager sur Twitter
24 octobre 2019 à 17:13:24

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter

Pas d'aide concernant le code par MP, le forum est là pour ça :)