Voici mon analyseur d'expressions utilisant l'algorithme de la cour de transfert. Il fonctionne bien comme prévu sauf dans une situation, lorsque j'utilise un moins unaire comme dans -2*3 cela ne fonctionne pas (je pense que cela ne devrait pas car je n'ai rien trouvé dans l'algorithme pour gérer cela) y a-t-il un moyen simple que je puisse réparer cela? (c'est un analyseur simple j'ai seulement besoin de () + - * / ^) Salutations Pedram
#include
#include
#include
#include
#include
using namespace std;
int olaviat(char c) {
/*************
**Précédence de l'opérateur
*************/
switch(c) {
case '-' : case '+' :
return 1;
case '*' : case '/' :
return 2;
case '^' :
return 3;
default :
return 0;
}
}
double eval(char *exp) {
/*************
**Conversion en notation polonaise inverse
*************/
char n[50], o[50];
static int nl = 0, ol = 0;
while (*exp) {
while(isspace(*exp)) *exp++ ;
if(*exp == '(') {
o[ol++] = *exp++;
}
else if (*exp == ')'){
while(o[--ol]!='('){
n[nl++] = o[ol];
n[nl++] = ' ';
}
*exp++;
}
else if (isdigit(*exp)) {
while (isdigit(*exp)) {
n[nl++] = *exp++ ;
}
n[nl++] = ' ' ;
}
else if (strchr("+-*/^", *exp)){
if (olaviat(*exp) > olaviat(o[ol-1])) {
o[ol++] = *exp++ ;
}
else {
if (olaviat(*exp) == olaviat(o[ol-1]) && olaviat(*exp) == 3) {
o[ol++] = *exp++;
}else{
n[nl++] = o[ol-1];
n[nl++] = ' ';
o[--ol] = '\0';
}
}
}
}
for (int k = ol-1; k >= 0; k--){
n[nl++] = o[k];
n[nl++] = ' ';
}
/*******************************/
cout << "Notation Polonaise Inverse" << endl ;
for (int i = 0; i < nl-1; i++){
cout << n[i] ;
}
cout << endl;
//n[nl+1] = '\0' ;
/*******************************
**Calcul du Résultat
*******************************/
double temp[50];
char *e;
ol = 0;
int nol = 0;
e = n;
int digitcount = 0;
while (*e) {
while (isspace(*e)) *e++;
if (isdigit(*e)) {
while (isdigit(*e)) {
o[ol++] = *e++;
digitcount++;
}
temp[nol++] = atof(o);
for (int i = 0; i < digitcount; i++)
o[i] = '\0';
ol = 0;
digitcount = 0;
}
else if (strchr("+-*/^", *e)){
// char opr ;
double tempAns = 0;
switch (*e) {
case '+' :
tempAns = temp[nol-2] + temp[nol-1];
break;
case '-' :
tempAns = temp[nol-2] - temp[nol-1];
break;
case '*' :
tempAns = temp[nol-2] * temp[nol-1];
break;
case '/' :
tempAns = temp[nol-2] / temp[nol-1];
break;
case '^' :
tempAns = pow(temp[nol-2], temp[nol-1]);
break;
default :
cout << "\n Erreur inconnue";
continue;
}
*e++;
nol--;
temp[nol-1] = tempAns;
temp[nol] = NULL;
}
else {
break;
}
}
double ans = temp[0];
return ans;
}
int main() {
char exp[100];
char c;
début :
cin.get(exp, 99);
cout << "\n\tANS= " << eval(exp);
cout << endl;
system("PAUSE");
return 0;
}