本帖最后由 SstudentT 于 2015-4-28 14:17 编辑
全部是自己想的,还没有看牛逼的例子,所以代码有点长。对于类什么的运用,我觉的其实用函数就可以了啊!
但是没办法,为了习惯C++的类,用的再别扭我也得用!可能用多了就懂了怎么正确运用了!
例如
输入:”100-6*(10-(1+3/(1-7)+2.5)*5)=“
输出:130
由于还在编写过程中,所以无法处理非法输入
例如
“12+-12/13=” 语义不对
“113/(9+1=” 括号无法匹配
“12-16” 少了等号
“15516155346465645000000000000000000 -464=” 数值越界
以上错误还无法处理。
如果发现逻辑错误(就是输入正确的表达式,但是得出错误答案的。)
麻烦您通知我一下,不胜感激!
(因为我一个人测试总有想不到的地方,谢谢你的帮助!)
下面附上源码
expression.h 这个类是处理不带括号的表达式。
[C++] 纯文本查看 复制代码 #ifndef EXPRESSION_H
#define EXPRESSION_H
#include<string>
#include<iostream>
#include<vector>
using std::vector;
using std::string;
class Expression{
const string Number="0123456789.";
const string Operator="+-*/";
string expression;
string result;
private:
string oper;
vector<double> operand;
string expre;
void FAlloper();
void FAlloperand();
public:
Expression(string s);
void OutCome(){std::cout<<expression<<" "<<result<<std::endl;};
string Theresult(){return result;}
string compute();
};
#endif // EXPRESSION_H
expression.cpp 实现Expression类
[C++] 纯文本查看 复制代码 #include"expression.h"
Expression::Expression(string s):expression(s){}
void Expression::FAlloper()
{
string T=expression;
auto i=T.find_first_of(Operator);
while(i!=string::npos)
{
oper.append(T,i,1);
if(T[i+1]=='-')
T.erase(0,i+2);
else
T.erase(0,i+1);
i=T.find_first_of(Operator);
}
}
void Expression::FAlloperand()
{
size_t p;
string T=expression;
do
{
operand.push_back(stod(T,&p));
if(T[p]=='=')
break;
T.erase(0,p+1);
}while(1);
}
string Expression::compute()
{
FAlloper();
FAlloperand();
while(operand.size()!=1){
auto i=oper.find_first_of("/*");
if(i==string::npos)
while(oper.size()!=0)
{
if(oper[0]=='+')
{
double r=operand[0]+operand[1];
auto ins=operand.erase(operand.begin(),operand.begin()+2);
operand.insert(ins,r);
oper.erase(oper.begin());
}
else if(oper[0]=='-')
{
double r=operand[0]-operand[1];
auto ins=operand.erase(operand.begin(),operand.begin()+2);
operand.insert(ins,r);
oper.erase(oper.begin());
}
}
else if(oper[i]=='*')
{
double r=operand[i]*operand[i+1];
auto ins=operand.erase(operand.begin()+i,operand.begin()+i+2);
operand.insert(ins,r);
oper.erase(i,1);
}
else if(oper[i]=='/')
{
if(operand[i+1]==0)
{
result="Error! Divisor can't be zero!";
return result;
}
double r=operand[i]/operand[i+1];
auto ins=operand.erase(operand.begin()+i,operand.begin()+i+2);
operand.insert(ins,r);
oper.erase(i,1);
}
}
result=std::to_string(operand[0]);
return result;
}
calculator.h 计算带括号的表达式,里面用到Expression类
[C++] 纯文本查看 复制代码 #include"expression.h"
class Expression;
class Calculator{
private:
string expree,p,l;
size_t phr,phl;
size_t phrInter,phlInter;
bool Ispure(string s);
void markShell(string s);
void markShellInter(string s);
string Filiter(string s);
string Calculate();
public:
Calculator(string s);
string TheEnd(){return Calculate();}
};
calculator.cpp Calculator类的实现
[C++] 纯文本查看 复制代码 #include"calculator.h"
Calculator::Calculator(string s)
:expree(s),p(s),l(s)
{
TheEnd();
}
bool Calculator::Ispure(string s)
{
auto pornot=s.find_first_of("()");
return (pornot==string::npos)?true:false;
}
void Calculator::markShell(string s)
{
int n=0;
size_t p=0;
phl=s.find("(");
while(true)
{
p=s.find_first_of("()",p);
if(s[p]=='(')
n++;
else if(s[p]==')')
n--;
if(n==0)
{
phr=p;
break;
}
else
p++;
}
}
string Calculator::Filiter(string s)
{
if(!Ispure(s))
{
const string Identical("=");
markShell(s);
string T=s;
T.assign(s,phl+1,phr-phl-1);
T=T+Identical;
s=Filiter(T);
return s;
}
else
{
Expression exp(s);
return exp.compute();
}
}
string Calculator::Calculate()
{
string s=expree;
while(!Ispure(s))
{
markShellInter(s);
s.replace(phlInter,phrInter-phlInter+1,Filiter(s));
}
Expression exp(s);
return exp.compute();
}
void Calculator::markShellInter(string s)
{
size_t p=0;
while(true)
{
p=s.find_first_of("()",p);
if(s[p]=='(')
{
phlInter=p;
p++;
}
else if(s[p]==')')
{
phrInter=p;
break;
}
}
}
main 函数驱动
[C++] 纯文本查看 复制代码 #include"expression.h"
#include"calculator.h"
int main()
{
string s;
std::cin>>s;
Calculator c0(s);
std::cout<<c0.TheEnd();
return 0;
}
发现逻辑错误求告知,不胜感激!谢谢!!!
|