boostcoder, Что это такое? math64, Все я разобрался. Вот мой рабочий код
| Код | #include<iostream> #include<cstring> using namespace std;
const int LEN=80; const int MAX=100;
class Token { public: virtual char getOperator()=0; virtual float getNumber()=0; };
class Operator:public Token { private: char oper; public: Operator(char a) { oper=a; } char getOperator() { return oper; } float getNumber() { return 0; } };
class Number:public Token { private: float fnum; public: Number(float a) { fnum=a; } char getOperator() { return 0; } float getNumber() { return fnum; } };
class Stack { private: Token *st[MAX]; int top; public: Stack() { top=0; } void push(char var) { st[++top]=new Operator(var); } void push(float var) { st[++top]=new Number(var); } Token* pop() { return st[top--]; } int gettop() { return top; } };
class express { private: Stack s; char* pStr; int len; public: express(char*ptr) { pStr=ptr; len=strlen(pStr); } void parse() { float F=0; int C=0,U=10; char ch; Token* lastval; Token* lastop; for(int j=0;j<len;j++) { ch=pStr[j]; if(ch>='0'&&ch<='9'&&C==0) { F=F*10+(ch-'0'); } if(ch>='0'&&ch<='9'&&C==1) { F=F+(ch-'0')/U; U=U*10; } if(ch=='.') C=1; if(ch=='+'||ch=='-'||ch=='*'||ch=='/') { s.push(F); F=0; C=0; U=10;
if(s.gettop()==1) s.push(ch); else { lastval=s.pop(); lastop=s.pop(); if((ch=='*'||ch=='/')&&(lastop->getOperator()=='+'||lastop->getOperator()=='-')) { s.push(lastop->getOperator()); s.push(lastval->getNumber()); } else { switch(lastop->getOperator()) { case'+': s.push(s.pop()->getNumber() + lastval->getNumber()); break; case'-': s.push(s.pop()->getNumber() - lastval->getNumber()); break; case'*': s.push(s.pop()->getNumber() * lastval->getNumber()); break; case'/': s.push(s.pop()->getNumber() / lastval->getNumber()); break; default: cout<<"Неизвестный оператор\n"; } } s.push(ch); } } } s.push(F); } float solve() { Token* lastval; while(s.gettop()>1) { lastval=s.pop(); switch(s.pop()->getOperator()) { case'+': s.push(s.pop()->getNumber()+lastval->getNumber()); break; case'-': s.push(s.pop()->getNumber()-lastval->getNumber()); break; case'*': s.push(s.pop()->getNumber()*lastval->getNumber()); break; case'/': s.push(s.pop()->getNumber()/lastval->getNumber()); break; default: cout<<"Неизвестный опер\n"; } } return float(s.pop()->getNumber()); } }; int main() { setlocale(LC_ALL,"Rus"); char ans; char str[LEN]; cout<<"Введите арифметическое выражение\n в виде 2+3*4/3-2.\n Никакое число не может иметь более одной цифры.\n Не используйте пробелы и круглые скобки.\n"; do { cout<<"Введите выражение: "; cin>>str; express*eptr=new express(str); eptr->parse(); cout<<"Численное значение: "<<eptr->solve()<<endl; delete eptr; cout<<"Сделать еще одно (Введите y или n)? "; cin>>ans; } while(ans=='y'); return 0; }
|
Спасибо всем за помочь  |