忙了一天终于搞定了。
以下为算法类封装
//
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 calculator
description: requiring design a simulant calculator ,which could take operations such as +,-,*,/ ,( ),or functon SQR ,ABS
condition:inputted expression can limit into int type.therefore ,you must check the expression for exactness.if the errors
take 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;
}
//
// author: baker
// email:baker1203@sina.com
// course designing for data structures and program design in c++
// time:16/5/2006
/**/ /*
a simulant calculator
description: requiring design a simulant calculator ,which could take operations such as +,-,*,/ ,( ),or functon SQR ,ABS
condition:inputted expression can limit into int type.therefore ,you must check the expression for exactness.if the errors
take 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;
}