由于最开始做个人项目的时候就是按照模块的思想进行的设计,所以已经是模块化的程序了。
结对项目关于程序方面老师提出了下列要求
Calc()
这个Calc 函数接受字符串的输入(字符串里就是运算式子,例如 “ 5+3.5”, “7/8 – 3/8 ”,“3 + 90 * (-0.3)” 等等),这个模块的返回值是一个字符串,例如,前面几个例子的结果就是 ( “17.5”, “1/2”, “-24”).
所以我要增加小数的运算以及负数运算的功能。
并且让模块的返回值为【字符串】(现在的返回类型是Fraction)
故我在Fraction类里加了个toString函数。 里面分别可以将分数和小数都转换为string形的
string Fraction::toString(){ //计算结果变为string char t[10]; sprintf(t,"%d",num); string s1=t; if(den==1){ return s1; } else{ sprintf(t,"%d",den); string s2=t; return s1+"/"+s2; } } string Fraction::toString2(int jingdu){ //计算结果变为string char t[10]; float result=num*1.0/den; float result2=int(result*pow(10.0,jingdu))/pow(10.0,jingdu); sprintf(t,"%f",result2); string s1=t; return s1; }
对于负数的运算,由于负数会出现在最开头: -1+4/2*5 或是带括号出现 2+4*(-4)+2。所以找到这种规律后,我找到负数然后在其前面加上0。
Exp::Exp(string s) { str=""; //实现负数运算 for(int i=0;i<s.size();i++){ if(i==0&&s[i]==‘-‘ ||s[i]==‘-‘&&s[i-1]==‘(‘) str+="0"; str=str+s[i]; }
对于小数的运算,我用的办法是将小数也转为分数。
比如3.45就是 345/100。
除此之外,我还设计了“最多几个运算符,数据范围是多少,还要设置计算的精度(保留几位小数,等等)”以及3种异常
void Exp::setting(int geshu,int jingdu,int max,int min){ this->geshu=geshu; this->jingdu=jingdu; this->max=max; this->min=min; }
在setFraction(string str,int max,int min)函数里增加了下面的语句,抛出异常
if(num>max||num<min||den>max||den<min) throw string("超出范围"); else if(den==0) throw string("分母不可以为0");
在setExp(string s)增加以下语句,抛出异常
if(cal>geshu) throw string("运算符太多");
增加toString2的函数,具体实现的方法是比如【5,4321】要保留两位小数(精度是2),就用5.4321乘以100,取整,再除以100,就变成5.43了
string Fraction::toString2(int jingdu){ //计算结果变为string char t[10]; float result=num*1.0/den; float result2=int(result*pow(10.0,jingdu))/pow(10.0,jingdu); sprintf(t,"%f",result2); string s1=t; return s1; }
大概就是这样。具体的测试部分见我的partner的博客:
http://www.cnblogs.com/xDan/
原文:http://www.cnblogs.com/vikkii/p/5363033.html