当前位置:文档之家› 四则运算程序报告

四则运算程序报告

四则运算
程序功能简介:
该程序用字符串的形式接收一个带括号的四则运算的表达式,然后按照四则运算优先级的算法先括号,后乘方、乘除、加减这样的顺序将这个算式解出。

该程序的设计比较巧妙,是在主程序中反复查找最后一对括号,将其中的结果计算出来,去掉括号,这样的过程持续下去,最后导致所有的括号都去除,解出算式。

课程设计要求:
(1)用类的形式改写程序,将数据和函数封装到类中。

(2)修改主程序结构,使程序可以反复运算,直到选择退出为止。

(3)扩充程序功能,使程序适合浮点运算。

(4)增加程序的判断功能,当有非法输入(如字母等),给出提示信息并退出运算,当输入带有空格使,能将空格滤除。

评定难易等级:A级。

程序设计思想:
类的封装:
class CStr // 定义一个字符串类
{
private:
int nLen; //字符串长度
char *pStr; //字符串首地址
public:
CStr(){nLen=0;pStr=NULL;} //构造函数
CStr(CStr &str); //拷贝的构造函数
~CStr(){if(pStr) delete[]pStr;} //析构函数
int GetLen(){return nLen;} //返回字符串长度
CStr & Midstr(CStr &str,int nStart,int nLength); /*返回字符串类中从nStart序号开始nLength长度的字符串*/
CStr & Left(CStr &str,int nLength); //返回制定字符串类中从左边开始nLength 个字符
CStr & Right(CStr &str,int nLength); //返回制定字符串类中从右边开始nLength个字符
CStr & Calculate(); //计算该字符串所代表的四则运算的值(内无括号)
int CharInStr(char chChar); //判断字符chChar是否在字符串中
double V al(); //求字符串代表的数字字符的数值
char GetChar(int i){return *(pStr+i);} //返回字符串中第i个字符
CStr & Str(double val); //将数值表示成字符串的形式
CStr & operator=(CStr &); //重载赋值运算符
friend CStr operator+(CStr &,CStr &); //友元,实现字符串类的加法
operator char *(){return(char *)pStr;} //将字符串类转换成字符数组
friend istream &operator>>(istream &,CStr &); //重载输入运算符
int Judge(); //判断输入法是否合法,滤除空格
};
对程序设计要求的解答所遇到的问题及解决方案:
(1)用类的形式改写程序,将数据和函数封装到类中。

程序一开始定义了一个字符串类CStr如上,包含十七个公有成员函数,并已经在类内定义函数原型。

课本中给出了十个成员函数的源代码,而且构造函数,拷贝构造函数及析构函数已经给出。

但left,right,midstr,str,calculate五个函数均有返回值,将return语句删掉。

同时val函数的返回值类型也需要修改。

再在类外,补充定义为类的成员函数即可。

(具体程序代码见课本)
还缺少一些重载运算符函数,友元函数和Judge函数,补充在后。

(2)修改主程序结构,使程序可以反复运算,直到选择退出为止。

课本中将主函数的源程序代码基本设计好,不过界面提示语是英文,运用起来有些不太方便。

我先将其翻译成中文,便于阅读和使用。

关于反复运算的要求,在学长的指点下,使用了while循环语句,具体的还是不怎么理解。

但是运行是正确的,好像是用到了第八部分的二叉数有关程序。

(3)扩充程序功能,使程序适合浮点运算。

除了在运算符中增加小数点“.”之外,还需要更改部分函数的返回值类型(如val函数)与部分变量的类型。

(4)增加程序的判断功能,当有非法输入(如字母等),给出提示信息并退出运算,当输入带有空格使,能将空格滤除。

关于Judge函数的源程序代码,设计如下:
int Judge()
{
char *p,*s,*r,*source=pstr;
p=source;s=p+1;
while(*p!=0) //滤去空格
{r=p;
if(*p==' '){
while(*s!=0){*p=*s;p++;s++;}
*p=0;p=r;s=p+1;
continue;
}
p=r+1;s=p+1;
}
cout<<"去除空格后的算式:"<<pstr<<endl;
char *destination=source;
while(*destination!=0) //判断是否有非法字符的输入
{if('('<=*destination&&*destination<='+'||'-'<=*destination&&*destination<='/'||'0'<= *destination&&*destination<='9'||*destination=='^'||*destination==' ')
{destination++;}
else{return 0;}
}
destination=pstr;
if(*destination=='^'||*destination=='*'||*destination=='/'||*destination=='+'||*destinatio n=='-') //检查语法错误(检查运算符左右的操作数是否正确){ return 0;}
int pos_in_opstr;
int pos;int z;
char opstr[6]="^/*+-";
for(pos_in_opstr=0;pos_in_opstr<=4;pos_in_opstr++)
{
while(charinstr(source,opstr[pos_in_opstr]))
{
pos=charinstr(source,opstr[pos_in_opstr]);z=pos;
if(*(source+z)=='^'||*(source+z)=='*'||*(source+z)=='/'||*(source+z)=='+'||*(source+z) =='-'||*(source+z)==0)
{return 0;}
z-=2;
if(*(source+z)=='^'||*(source+z)=='*'||*(source+z)=='/'||*(source+z)=='+'||*(source+z) =='-'||*(source+z)==0)
{return 0;}
else{source+=pos;}
}
}
return 1;
}
程序设计完成之后的思考:
在程序设计之前,我仔细地阅读了课本,发现其实大部分函数的源代码已经编译好,我只需要修改,再添加一些缺少的程序代码。

可是后来发现自己是眼高手低,像如何将返回值正确地修改好以及Judge函数的设计都犯了很多错误,再如主函数的反复设计也是一筹莫展。

幸好有学长和一些C++高手的指点,这才勉强完成。

完成之后,我把自己的程序和前年的学长的作了一些比较,改了一些语句,发现更加简洁明了了,高手不愧是高手。

不过,他在主函数开始时设计了一个的欢迎语句,但是我不是很能理解’\2’等的具体含义,不禁开始佩服他们的强大。

Visual C++支持面向对象的程序设计方法,支持MFC类库编程,有强大的集成开发环境Developer Studio。

可用来开发各种类型,不同规模和复杂程序的
应用程序,开发效能很高,生成的应用软件代码品质优良。

C++是Windows环境下最强大,最流行的程序设计语言之一。

老师将C++程序设计的任务交给我们,一方面是提高我们C++程序设计的能力,另一方面是培养我们对C++的兴趣,让我们以后成为专业软件设计人才提供了可能,可谓是良苦用心,在这里表示最衷心的感谢。

指导老师:刘永
设计人:戴淑君
时间:2010-3-20。

相关主题