|
本帖最后由 981013 于 2013-11-10 16:34 编辑
自己写了个计算器,打表达式进去就能计算
附上代码
[code=Cpp width=740px]//caculator.h
#ifndef CACULATOR_H
#define CACULATOR_H
#include <mylib.h>
#include <cmath>
#define DEBUG 0
using std::cerr;
using std::endl;
using mine::stack;
int opl(char op)
{
if(op=='*'||op=='/')
return 2;
else if(op=='^'||op=='r')
return 3;
else if(op=='+'||op=='-')
return 1;
else
return 4;
}
bool compare(char op1,char op2)///<=
{
if(opl(op1)<=opl(op2))
return 1;
else return 0;
}
double cacu(double num1,char op,double num2)///infact it is mun2(op)num1
{
switch(op)
{
case '+':
return num2+num1;
case '-':
return num2-num1;
case '*':
return num2*num1;
case '/':
if(num1==0)
{
cerr<<"Divided by 0 error!"<<endl;
exit(1);
}
else
return num2/num1;
case '^':
return pow(num2,num1);
case 'r':
return pow(num1,1/num2);
#if DEBUG
default:
cerr<<"Unexpected operator error!"<<endl;
exit(1);
#endif
}
}
double caculate(const char* formula)
{
stack<double> numbers;
stack<char> operate;
double carry=0;
int afterpoint=0;
bool ap=false;
bool minus=false;
for(int a=0; formula[a]!='\0'; a++)
{
if(a==0&&formula[a]=='-')
minus=true;
else if(formula[a]=='.'&&ap)
{
cerr<<"No more than a decimal point!"<<endl;
exit(1);
}
else if(formula[a]=='.'&&!ap)
ap=true;
else if(formula[a]>='0'&&formula[a]<='9')
{
if(!ap)
{
carry*=10;
carry+=formula[a]-'0';
}
else
{
carry+=(formula[a]-'0')*pow(10,--afterpoint);
}
if((formula[a+1]<'0'||formula[a+1]>'9')&&formula[a+1]!='.')
{
if(minus)
{
carry=-carry;
minus=false;
}
numbers<<carry;
#if DEBUG
cerr<<"number"<<carry<<"in"<<endl;
#endif
carry=0;
afterpoint=0;
ap=false;
}
}
else if(formula[a]=='+'||formula[a]=='-'||formula[a]=='*'||formula[a]=='/'||formula[a]=='('||formula[a]=='^'||formula[a]=='r')
{
if(formula[a]=='-'&&(formula[a-1]=='+'||formula[a-1]=='-'||formula[a-1]=='*'||formula[a-1]=='/'||formula[a-1]=='('))
{
minus=!minus;
continue;
}
if(formula[a]=='+'&&(formula[a-1]=='+'||formula[a-1]=='-'||formula[a-1]=='*'||formula[a-1]=='/'||formula[a-1]=='('))
continue;
if(formula[a]=='r'&&(numbers.isempty()||formula[a-1]<'0'||formula[a-1]>'9'))
numbers<<2;
if(formula[a]=='('&&formula[a-1]==')')
operate<<'*';
if(operate.gettop()!='('&&!operate.isempty()&&compare(formula[a],operate.gettop()))
{
double num1=numbers.pop();
#if DEBUG
cerr<<num1<<"poped"<<endl;
#endif
double num2=numbers.pop();
#if DEBUG
cerr<<num2<<"poped"<<endl;
#endif
double ls=cacu(num1,operate.pop(),num2);
numbers<<ls;
#if DEBUG
cerr<<ls<<"in"<<endl;
#endif
}
operate<<formula[a];
#if DEBUG
cerr<<formula[a]<<"in"<<endl;
#endif
}
else if(formula[a]==')')
{
if(formula[a-1]=='(')
{
cerr<<'\a'<<"Meaningless Expression \"()\"!"<<endl;
exit(1);
}
while(operate.gettop()!='(')
{
double num1=numbers.pop();
double num2=numbers.pop();
double ls=cacu(num1,operate.pop(),num2);
numbers<<ls;
}
operate.pop();
#if DEBUG
cerr<<"()compared"<<endl;
#endif
}
else
{
cerr<<'\a'<<"Illegal operator!"<<endl;
exit(1);
}
}
while(!operate.isempty())
{
double num1=numbers.pop();
double num2=numbers.pop();
double ls=cacu(num1,operate.pop(),num2);
numbers<<ls;
}
return numbers.pop();
}
#endif // CACULATOR_H
[/code]
stack是一个防溢出的栈
请高手们看看有没有错&能不能简化
功能上的建议也可以提 |
|