读书人

们请帮忙编一个表达式的运算代码(可

发布时间: 2012-03-09 16:54:56 作者: rapoo

大虾们,请帮忙编一个表达式的运算代码(可以运算浮点数)谢谢了明天要交啊
谢谢大虾们啊!急啊...

[解决办法]

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;} 

读书人网 >软件架构设计

热点推荐