Formule à calculer en C

Fermé
alain044 - 13 juin 2003 à 14:14
 Bob - 18 déc. 2003 à 11:40
transformation d'une formule pour obtenir le résultat
ma formule peut être différente à chaque fois
les valeurs aussi.

exemple maformule = "(a+b)/c";
1 - remplacer a,b et c par leurs valeurs
si a=5 b =7 c =2
j'obtiens : "(5+7)/2"
2 - maintenant comment faire le calcul ?
resultat = 6

Merci de votre aide

16 réponses

Galfus Messages postés 242 Date d'inscription lundi 19 mai 2003 Statut Membre Dernière intervention 8 novembre 2008 14
13 juin 2003 à 14:47
j'ai pas bien saisi ou était le problème...


<------Galfus------>
In penguin we trust
0
Utilisateur anonyme
13 juin 2003 à 14:53
je crois que le seul problème se situe au niveau de la composition de la formule, car pour a, b et c... c'est des variables, t'en as deja entendu parler???
Pour la formule, tu peux faire un analyseur syntaxique, mais en C je te le déconseille (le CamL ca va mieux). Sinon si le nombre d'opérateurs et d'opérandes est fixe tu peux faire quelquechose d'assez simple avec les paramètres en ligne de commande.
J'ai bon??

Fat_Cartman,
Parce que je le vaux bien... 
0
batmat Messages postés 1871 Date d'inscription jeudi 1 novembre 2001 Statut Membre Dernière intervention 9 janvier 2008 114
13 juin 2003 à 14:54
Je cherche je cherche mais je ne vois pas non plus :-)

@++

Poster, poster encore et toujours :-)
0
Galfus Messages postés 242 Date d'inscription lundi 19 mai 2003 Statut Membre Dernière intervention 8 novembre 2008 14
13 juin 2003 à 14:54
lol

<------Galfus------>
In penguin we trust
0

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

Posez votre question
Suite pour vous éclairez et m'aider...
j'ai un tableau de valeur
int val[5] = {1,2,3,4,5};
// donc a=1, b=2,c=3.....
// l'utilisateur entre la fomule de son choix
char forumle[] = "(a+c)/(b+b)"
// remplacer a,b,c par leur valeur pour obtenir
char remplace[] = "(1+3)/(2+2)"

// maintenant donner le résultat qui est 1
int resultat = remplace ?? // ne marche pas car c'est du char
// donc comment faire ?

suis-je plus clair ?
merci
0
batmat Messages postés 1871 Date d'inscription jeudi 1 novembre 2001 Statut Membre Dernière intervention 9 janvier 2008 114
13 juin 2003 à 16:27
Un peu plus, mais continue pasque je suis toujours éclairé par une lampe de poche là :-)
Nan sans dec, y manque des choses, continue un peu...
Ce que tu veux faire est simple, mais je ne vois pas trop où TU bloques en fait...

@++

Poster, poster encore et toujours :-)
0
letissya Messages postés 89 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 8 novembre 2005 5
13 juin 2003 à 16:52
oui tu es beaucoup plus clair...!!

ben il faut que tu fasses un ananlyseur syntaxique (cf fat_cartman)...

tu dois détecter les parenthèses, les opérandes (+,-,*,/) et les opérateurs (a, b,c ..) et puis tu fais tes calculs avec des entiers... pour obtenir le résultat et l'afficher...

voilà

Letissya
0
batmat Messages postés 1871 Date d'inscription jeudi 1 novembre 2001 Statut Membre Dernière intervention 9 janvier 2008 114
13 juin 2003 à 17:12
Attend attend attend,
Il a déjà l'air d'avoir du mal avec 4 variables... Un analyseur syntaxique c pas très simple...

Bon, pour cette solution en tout cas, il faut que tu utilises une structure un peu complexe :
-> un arbre que tu remplis au fur et à mesure de ton analyse...

Mais, tu as déjà l'air d'avoir du mal avec le C, alors une difficulté à la fois ;p si tu n'as pas le choix du langage. Travaille déjà un peu ce pb avant d'attaquer la construction de ton arbre.

Ptete en python ou en camL (cf. fat_cartman) ou java ?

Comme fat_cartman, je pense aussi qu'il y a moyen de faire simple pour commencer si tu limites le nombre d'opérateurs et d'opérandes par exemple, et que tu les saisis un par un...
@++
@++


Poster, poster encore et toujours :-)
0
letissya Messages postés 89 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 8 novembre 2005 5
13 juin 2003 à 17:26
il peut faire aussi un algo récursif.. c'est pas si compliqué que ça... et ça me parait plus simple que de construire un arbre...

enfin ça dépend des personnes..

Letissya
0
Merci à tous, mais j'ai tjrs pas la solution.
Je pensais ke ce genre de problème était déjà résolu des tas de fois.
Mais c'est vrai qu'il est tjrs bon de commencer simple avant de compliquer.
0
batmat Messages postés 1871 Date d'inscription jeudi 1 novembre 2001 Statut Membre Dernière intervention 9 janvier 2008 114
13 juin 2003 à 18:15
Comment ça, tu n'as pas la solution ? Tu n'as plus qu'à choisir :)
TU choisis ON t'aide :-)
@++

Poster, poster encore et toujours :-)
0
Marden Messages postés 1072 Date d'inscription dimanche 11 février 2001 Statut Membre Dernière intervention 29 janvier 2006 210
13 juin 2003 à 19:14
Voir du côté de Lex et Yacc signalés à plusieurs reprises sur le forum.
0
letissya Messages postés 89 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 8 novembre 2005 5
16 juin 2003 à 13:13
Je vais t'expliquer comment tu peux faire un algo récursif :

tu cherches à calculer des expressions du type a+b, (a+b)/c, (a-b)*(c+d), ...


l'opération la plus simple est lorsque tu as juste deux opérateurs et une opérande : a+b, a-b, a*c, a/b

et toutes les expressions peuvent réduite à cette opération simple ex : (a+b)/(c-d) <=> A/B si A=a+b et B = c-d ...

donc ton algo récursif va prendre en paramètre ton expression qu'il va décomposer comme précedemment...

resultat traitement (formule)
{

si j'ai une formule 'simple' alors // ex : (a+b)
{
calcul de la formule
retour du résultat de la formule
}
// ex : (a+b) * (c-d)
sinon //je décompose ma formule en élément plus simple
{
formule simple = début formule compliqué // ex: (a+b)
formule reste = reste de la formule à traiter // ex :(c-d)
//rappel récursif de la fonction en fonction du signe qui sépare
resultat= traitement (formule simple) * traitement (formule reste )
retourner resultat

}
}


Voilà je sais pas si tu as compris le principe... mais le plus compliqué va être de gérer les parenthèses... pour bien faire les calculs.. mais bon ça peut être une solution...

maintenant à toi de décider dans quelle direction tu veux aller...

Letissya
0
Merci à tous.
Finalement j'ai opté pour un traitement de pile.
je lis ma formule caractère par caractère et j'empile ou je dépile en
fonction du caractère lu ( nombre ou symbole)
0
Bonjour,
Pouvez-vous m'aider pour le résultat de ces formules :
E=5+6racine carré de 2(3racine carré2+4)

(6racinecarré de 2)puissance 2 + 1
0
/* En C++ */

#include <cmath>

float x;
x = 5 + 6 * std::powf(2, 0.5) * (3 * std::powf(2, 0.5) + 4;

float y;
y = 6 * std::powf(std::powf(2, 0.5), 2) + 1

/*
Au fait:
5 + 6 racine carré de 2(3 racine carré 2+4) = 5 + 18 * 2 + 24 * 2^0.5 = 41 + 24 * 2^0.5
(6 racine carré de 2)puissance 2 + 1 = 6² * 2 + 1 = 73
*/
0