忙了一天终于搞定了。 以下为算法类封装 // calDlg.cpp : implementation file // // author: baker // email:baker1203@sina.com // course designing for data structures and program design in c++ // time:16/5/2006 /**/ /* a simulant calculatordescription: requiring design a simulant calculator ,which could take operations such as +,-,*,/ ,( ),or functon SQR ,ABScondition:inputted expression can limit into int type.therefore ,you must check the expression for exactness.if the errorstake place ,the program would give an alarm.*/ class compute ... {public: void init(string &); void error(int); void cal(string &); bool is_optr(char); double operat(double,char,double); char precede(char,char); char* get_value(string);private: CString str; char value[50]; } ; void compute::init( string & s) // ³õʼ»¯ÊäÈë±í´ïʽ. ... { s+="#"; //SÒÔ#½áÊø } void compute::error( int tag) // ±¨´íº¯Êý ... { switch(tag) ...{ case 1: str="ÊäÈë´íÎóµÄ×Ö·û£¡ÇëÖØÐÂÊäÈë"; break; case 2: str="ÊäÈë´íÎóµÄ²Ù×÷Êý£¡ÇëÖØÐÂÊäÈ룡"; break; } strcpy(value,(char *)(const char*)str); } 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; } void compute::cal( string & s) ... { stack<char>optr; optr.push('#'); stack<double>opnd; s=s+"#"; 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; } } 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 ; } } } sprintf(value, "%f", opnd.top()); } char * compute::get_value( string va) ... { cal(va); return value; loc=0;}