正文

模拟计算器续(MFC算法类的封装)2006-05-30 15:58:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/bakers/15222.html

分享到:

  class compute{public: void init(string &); void error(int); double cal(string &);    bool is_optr(char); double operat(double,char,double); char precede(char,char); char * get_value(char *); private: string str; char value[10]; };void  compute::init(string& s)     //初始化输入表达式.   {    s+="#";                      //S以#结束   }   void compute::error(int tag)    //报错函数 {     switch(tag)     {                case 1:                     value="输入错误的操作符!请重新输入!";       UpdateDate(FALSE);                     break;                case 2:                     value="输入错误的操作数!请重新输入!";       UpdateDate(FALSE);                     break;                           }     }      bool compute::is_optr(char c)     //检查输入是否为 运算符   {     string   optr_string("+-*/()AS#");     for(int   i=0;i<optr_string.size();i++)     if(c==optr_string[i])     return   true;     return   false;     }       char compute:: precede(char   op1,   char   op2)     {     string   tab[9];     tab[0]=">><<<><<>";     tab[1]=">><<<><<>";     tab[2]=">>>><><<>";     tab[3]=">>>><><<>";     tab[4]="<<<<<=<<E";     tab[5]=">>>>E>>>>";     tab[6]=">>>><>>>>";  tab[7]=">>>><>>>>";   tab[8]="<<<<<E<<=";  string optr_string("+-*/()AS#");         int op1_loc,op2_loc;         for(op1_loc=0;op1_loc<optr_string.size();op1_loc++)           if(optr_string[op1_loc]==op1)break;     for(op2_loc=0;op2_loc<optr_string.size();op2_loc++)        if(optr_string[op2_loc]==op2)break;         return   tab[op1_loc][op2_loc];     }       double compute::operat(double x,char op,double y)     {     switch(op)     {     case   '+':   return   x+y;   break;     case   '-':   return   x-y;   break;     case   '*':   return   x*y;   break;     case   '/':   return   x/y;   break;    case   'A':   return  fabs(y);break;  case   'S':   return  sqrt(y);break;   }     return   -1;     }                       double   compute::cal(string&   s)     {     stack<char>optr;     optr.push('#');     stack<double>opnd;         char   c=s[0];  s.erase(0,1);         while(c!='#'||optr.top()!='#')     {     if(!is_optr(c))     {        if(c>='0'&&c<='9')      {       string   num;             num.insert(num.begin(),c);         int loc=0;         while(!is_optr(s[loc]))         loc++;             string num2(s,0,loc);         num+=num2;         s.erase(0,loc);            double   x=atof(num.c_str());        opnd.push(x);        c=s[0];        s.erase(0,1);     }     else { error(2); return -1;}      }     else    {          switch(precede(optr.top(),c))          {       case   '<':   optr.push(c);   c=s[0];   s.erase(0,1);    break;       case   '=':   optr.pop();    c=s[0];    s.erase(0,1);   break;       case   '>':              char   op;              op=optr.top();             optr.pop();              double   a,b;              a=opnd.top();              opnd.pop();             if(op!='S'&&op!='A')          {           b=opnd.top();              opnd.pop();           }                  double   res;              res=operat(b,op,a);              opnd.push(res);              break;       case  'E':           error(1);           return -1;         }      }     }         return   opnd.top();   }       char * compute::get_value(char *va){ value=ftoa(cal(va)); return value; UpdateDate(FALSE);}     注:以上类为第二次修改

阅读(7560) | 评论(8)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册