们,请帮忙编一个表达式的运算代码(可以运算浮点数)多谢了明天要交
大虾们,请帮忙编一个表达式的运算代码(可以运算浮点数)谢谢了明天要交啊
谢谢大虾们啊!急啊...
------解决方案--------------------
谢谢大虾们啊!急啊...
------解决方案--------------------
- C/C++ code
#include<iostream> #include<cmath> using namespace std; const double PI=3.141592654; const int SZ=1000; int MKAC=0; double STP=1; template <class Type> class STACK{ private: Type base[SZ]; int Size; public: STACK(){Size=0;}; void push(Type a) //入栈 { base[Size]=a; Size++; } Type pop() //出栈 { return base[--Size]; } int size() {return Size;} }; bool IsData(char ch) { return ((ch>='0'&&ch<='9')||ch=='.')?true:false; } bool IsSym(char ch) { return (ch=='+'||ch=='-'||ch=='*'||ch=='/')?true:false; } int IsPar(char ch) { return ch=='\x28'?1:ch=='\x29'?-1:0; } int Priority(char ch) //符号的优先极别 { switch(ch) { case '+': return 0; case '-': return 0; case '*': return 1; case '/': return 1; default: return -1; } } bool Check(char *ch) { int a=0; for(int i=0;i<strlen(ch);i++) if(ch[i]=='.') a++; if(a>1) return false; return true; } double ToArc(double alpha){return (PI*alpha/180.0);} double ToDgr(double arc){return (180*arc/PI);} double ToData(char* ch) { int i,j,sumn=0; double sum=0.0; if(!Check(ch)) return 0.0; for(i=0;i<strlen(ch);i++) {if(ch[i]!='.') sumn=sumn*10+(ch[i]-'0'); else break; } if(i<strlen(ch)) for(j=i+1;j<strlen(ch);j++) sum=sum*10+(ch[j]-'0'); sum/=pow(10.0,(double)(strlen(ch)-1-i)); return (sum+sumn); } double Call(double sum,double data,char ch)//根据运算计算数据 { double ans=0.0; switch(ch) { case '+': ans=sum+data; break; case '-': ans=sum-data; break; case '*': ans=sum*data; break; case '/': ans=sum/data; break; default:ans=0.0; break; } return ans; } int GetMatch(char* buffer,int pos)//找到匹配的括号 { STACK<char> Temp; int i; for(i=pos;i<strlen(buffer);i++) {if(IsPar(buffer[i])==1) Temp.push('0'); if(IsPar(buffer[i])==-1) {Temp.pop(); if(Temp.size()==0) return i; } } return -1; } int NL(int n) { if(n==0) return 1; else return n*NL(n-1); } void Opr(STACK<char>& symbol,STACK<double>& data,int& mark) { double sum; while(symbol.size()!=0) {char tem=symbol.pop(); int temp=Priority(tem); symbol.push(tem); if(temp<mark) break; else{ sum=Call(data.pop(),data.pop(),symbol.pop()); data.push(sum); } } } double Calculate(char* buffer,double& sum)//主运算部分 { STACK<double> data; STACK<char> symbol; double ans; char temp[SZ]; int ct=0,mark=0,tp=0; data.push(sum); while(ct<=strlen(buffer)) { if(IsData(buffer[ct])) { while(ct<strlen(buffer)&&IsData(buffer[ct])) temp[tp++]=buffer[ct++]; temp[tp]='\0'; tp=0; ans=ToData(temp); data.push(ans); if(buffer[ct]=='!') {data.push(NL((int)data.pop()));ct++;} if(ct==strlen(buffer)) {mark=0; Opr(symbol,data,mark); sum=data.pop(); return sum; } else{ int mark=Priority(buffer[ct]); Opr(symbol,data,mark); } } else if(IsSym(buffer[ct])) symbol.push(buffer[ct++]); else{ char BF[100];int k=0; while(IsPar(buffer[ct])!=1&&ct<=strlen(buffer)) BF[k++]=buffer[ct++]; BF[k]='\0'; if(IsPar(buffer[ct])==1) {int i,j; char Temp[100]; for(i=ct+1,j=0;i<GetMatch(buffer,ct);i++,j++) Temp[j]=buffer[i]; Temp[j]='\0'; data.push(Calculate(Temp,sum)); ct+=(strlen(Temp)+1); if(ct+1==strlen(buffer)) {mark=0; Opr(symbol,data,mark); sum=data.pop(); return sum; } else{ mark=Priority(buffer[ct+1]); Opr(symbol,data,mark); } ct++; } } } return 0.; } int main() { char buffer[SZ]; double sum=0.0; cout.precision(12); cout << "示例输入:(3.2+2.6)/2" << endl; cout << "示例输入:(3.2+2.6)*2" << endl; cout << "示例输入:(3.2-2)+3*(2.0+3.0)" << endl; cout << "字符中间不要加空格,按回车计算结果"<<endl; cout << "输入 q 或 quit 退出" <<endl; cout << "请输入表达式:" << endl; //输入 do { cin>>buffer; if(strcmp(buffer,"q") == 0 || strcmp(buffer, "quit") == 0) { break; } cout<<Calculate(buffer,sum)<<endl;//计算和输出 }while(1); return 0; }