c++课程设计四则运算doc_第1页
c++课程设计四则运算doc_第2页
c++课程设计四则运算doc_第3页
c++课程设计四则运算doc_第4页
c++课程设计四则运算doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C+课程设计四则运算docVc+课程设计报告题目名称:四则运算班级:测控技术与仪器姓名:周赛学号:914101170150 一、程序功能简介该程序用字符串形式接受一个带括号的四则运算表达式,然后按照四则运算优先级的 算法先括号,后乘方、乘除、加减这样的顺序将这个算式解出。该程序的设计比较巧妙,是在主程序中反复查找最后一对括号,将其中的结果计算出 来,去掉括号,这样的过程持续下去,最后导致所有的括号都去除,解出算式。二、课 程设计要求(1)用类的要求改写程序,将数据和函数封装到类中。(2)修改主程序,使程序可以反复运算,直到选择退出为止。(3)扩充程序功能, 使程序适合浮点数运算。(4)增加程序

2、的判断功能,当有非法的输入时(如字母等),给出提示信息并退出运 算,当输入带有空格时,能将空格滤除。三、程序设计思想(1)类的封装实际上该字符串类基本类似于c + +中的string类,比string类多定义了浮点数与 字符串的相互转换的函数,输入输出友元函数,可以从string类派生出CStr类,这样, 类的定义就更加简单,且可以利用很多现成的成员函数。(2)主程序结构算法的设置定义char类型的变量用来存储字符串,定义CStr类用于对字符串操作函数的引用。 先对输入字符串用Judge函数进行输入正确性的判断及取出空格内容;然后用charinstr 函数在字符串中反复查找最后一对括号:用mi

3、dstr函数提取出来,用calculate函数进 行计算:并用left函数与right函数及addstrings函数将所找到这对括号的左边、右边及运 算结果以字符串的形式合并成一个新的字符串;重复上述操作直至字符串中不再有括号;最后用calculate函数进行最后的计算返回计算结果。紧接着进行是否退出计算的输入判断,完成程序反复运算的功能。四、详细设计判断功能:用类中定义的judge函数实现,返回值为1即合法,为0即不合法。去除空格:定义p、s两个指针指向字符串,r指针指向p指针实现p、s指针在字符 串中的遍历,用p指针找到第一处空格处,再用s指针找到p指向位置以后最近一个不是 空格处,赋值语

4、句*p=*s,继续向下遍历字符串直至结束。非法输入:定义destination指向字符串,列举算式中出现的合法的字符,通过遍历 字符串找到非法输入字符,返回0:非法算式逻辑:包括运算符号相连,以及违背运算法则等现象,通过对运算符号的遍 历比较实现:还有包括左括号前或右括号后紧挨数字,通过定义一个新字符串数组指向字 符串来寻找括号并判断括号前后是否合法;非法,返回0:全都合法返回1.数字字符串转换成数字:用类中定义的val函数实现,扩充到浮点数的运算范围。定义char类型的source指针指向字符串,用eharinstr函数寻找字符串中小数点位 置,以此判断整数还是浮点数,如果整数即用10的相应

5、位数的乘方来乘以相应字符位置 字符的数字,并进行累加,最后返回result;如果是浮点数,则分为整数与小数部分依次 进行计算,整数同上,小数部分则用相应字符位置字符所代表的数字除以10的相应位数 的乘方,并进行累加,最后将整数小数部分的和返回result。字符串的连接,通过类中定义的left、right、midstr、addstrings函数配合实现。 通过left、right、midstr三个函数进行字符串的提取,addstrtings函数进行三个指针 的遍历实现两个字符串的合并。数字的字符串化,通过类中定义的str函数实现。类比val函数一样区分整数与浮点数,将数字的每一个数字单个提取出来

6、通过与字符 '0'的比较转化为相应字符复制给递增的指针。算式的计算,通过类中定义的 calculate函数实现。依次按照的顺序用charinstr函数寻找运算符号,并用相应函数进行字符串与 数字之间的转换,以及新的字符串的合并,返回计算结果。友元函数的定义,定义输入输出友元函数,重载赋值运算符等,实现字符串之间的 加法。五、程序调试的过程出现问题:开始编写完整个程序,出现许多编写错误,一个个改正:在实现浮点数的扩充过程中的小数部分,以及输入合法性的判断过程漏掉情况,指针的误用等;有时单独的一个函数不能搞懂或错误不能改正,就单独在编写一个类似程序,多次调试运行,来弄懂并加以改正:

7、解决办法:查阅书籍,上网搜索,独立思考,询问同学老师,多次上机调试等:六、 输入输出数据开始界面:非法输入判断:非法字母:运算符紧挨:左括号前或右括号后为数字:括号为中文符号:清理空格:运算第一个输入字符串算式结果:退出判断:继续运算:退出运算:浮点数的加入:七、课程设计总结经过这次庞大复杂的课程设计过程,是我对C+知识有了更加深刻的理解,引起了我 对C+语言世界的无限好奇心和探索欲,感慨到了世界的神奇与微妙,程序控制的无限用 途以及自身的渺小:在其中编写判断括号前后是否合法语句时,指针遍历不易实现,于是经过多次调试后 重新定义了一个字符串数组来实现,这给了我很大的启示,只要努力并不断尝试新的

8、东西一定会成功:还有程序中友元函数与运算符重载部分,由于知识掌握不够牢固,反复调试查阅书籍,最终得到了解决,也使得我对这方面的知识获得了更为深刻的理解与认知;浮点数的加入要进行小数点数位的取舍,函数中设定为小数点儿后六位,因此浮点数运算过程中每次都会出现六位小数的现象,使得结果有0.000001的误差,通过单 独编写类似函数多次调试,使得我对C+语言中对double型向int型变量转化的规律的理 解获得了更深层次的理解:通过编写过程,体会到了细节的厉害,有时一个微小的错误就能使整个程序而不能正确运行;八、源程序注解#include trinclude #includechar pause;算出

9、字符串的长素int len(char*source) int retval=O;class CStr private:;void CStr: :left(CStr & strl, int length) 字符串/从参数指向的地址左边取Length个字符赋给目的int nlen; 字符串长度char *pstr; /字符串首地址CStr 0 ();CStr (char *str) nlen=len(str);pstr=str; int GetlenO return nlen; char*Getstr0 return pstr; char*Getpstr0 return pstr;void

10、 midstr(CStr & strl,int start,int length); void left (CStr & strl,int length);/*返回指定字符串类中从nStart序号开返回字符串长度返回字符串首地址拷贝构造函数定义字符串类while(*(source+retval+)!=0) return -retval;public:CStr (CStr&str) nlen=str. GetlenO ;pstr=str. Getstr 0 ;始nLength长度的字符*/*返回指定字符串中从左边开始nLength个字符*/*返回指定字符串中从右边开始nL

11、ength个字符*/void right(CStr & strl,int length); friend int charinstr(char) ; double val0; str(double val);calculate。; 计算该字符串所代表的四则运算的值(内无括号)友元函数,判断字符是否在字符串中/求字符串代表的数字字符的数值将数值表示成字符串的形式重载输入运算符friend istream &operator» (istream &, CStr &) ; int Judge (); 判断输入是否 合法,滤除空格 )char*destinat

12、ion=pstr; char *source=strl. Getstr0; *(destination+- length+l)=0;目的字符串以0结尾while (length>=0) 赋值 Length 个字符*(destination+length)=*(source+length);从参数指向的地址处从start位void CStr: :midstr(CStr & strl, int start, int length)置开始取 length 个字符 赋给目的字符串void CStr: :right (CStr & strl, int length) 字符串int

13、char instr ( char *destination, char char_to_f ind)目的字符串中,若在,返 回其所在位置,若不再返回0 int pos=0; CStr::str(double value) char*tempdest=pstr; int a=0; int b= (int)value;double c=value-b;int multiplier=1000000000; while(*(destination+pos)!=0)return 0; return pos;/循环查找 if(char_to_f ind=*(destination+pos+)找到,返回其

14、位置char *source=strl. Getstr (); while(*source!=0) source+; char*destination=pstr; source-=length;/跳至欲赋值的首地址*(destination+-length+l)=0; char *source=strl. Getstr0;source+=start-l; 开始赋值处的地址 * (destination+length+O=O; char*dest inat ion=pstr;目的字符串以0结尾while (length>=0) 赋值 Length 个字符*(dest inat ion+length)=*(source+length);从参数指向的地址右边取Length个字符赋给目的移至字符串尾部目的字符串以0结尾while (length>=0) 赋值 Length 个字符 *(destination+length)=*(source+length); 判断字符串

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论