忙了一天终于搞定了。

以下为算法类封装
// 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;
}
1545

被折叠的 条评论
为什么被折叠?



