版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Vc+课程设计报告题目名称:四则运算班级:测控技术与仪器姓名:周赛学号:0一、程序功能简介该程序用字符串形式接受一个带括号的四则运算表达式,然后按照四则运算优先级的算法先括号,后乘方、乘除、加减这样的顺序将这个算式解出。该程序的设计比较巧妙,是在主程序中反复查找最后一对括号,将其中的结果计算出来,去掉括号,这样的过程持续下去,最后导致所有的括号都去除,解出算式。二、课程设计要求()用类的要求改写程序,将数据和函数封装到类中。()修改主程序,使程序可以反复运算,直到选择退出为止。()扩充程序功能,使程序适合浮点数运算。()增加程序的判断功能,当有非法的输入时(如字母等),给出提示信息并退出运算,
2、当输入带有空格时,能将空格滤除。三、程序设计思想(1)类的封装实际上该字符串类基本类似于中的string类,比string类多定义了浮点数与字符串的相互转换的函数,输入输出友元函数,可以从string类派生出CStr类,这样,类的定义就更加简单,且可以利用很多现成的成员函数。(2)主程序结构算法的设置定义char类型的变量用来存储字符串,定义CStr类用于对字符串操作函数的引用。先对输入字符串用Judge函数进行输入正确性的判断及取出空格内容;然后用charinstr函数在字符串中反复查找最后一对括号;用midstr函数提取出来,用calculate函数进行计算;并用left函数与right函
3、数及addstrings函数将所找到这对括号的左边、右边及运算结果以字符串的形式合并成一个新的字符串;重复上述操作直至字符串中不再有括号;最后用calculate函数进行最后的计算返回计算结果。紧接着进行是否退出计算的输入判断,完成程序反复运算的功能。四、详细设计判断功能:用类中定义的judge函数实现,返回值为1即合法,为0即不合法。 去除空格:定义p、s两个指针指向字符串,r指针指向p指针实现p、s指针在字符串中的遍历,用p指针找到第一处空格处,再用s指针找到p指向位置以后最近一个不是空格处,赋值语句*p=*s,继续向下遍历字符串直至结束。 非法输入:定义destination指向字符串,
4、列举算式中出现的合法的字符,通过遍历字符串找到非法输入字符,返回0; 非法算式逻辑:包括运算符号相连,以及违背运算法则等现象,通过对运算符号的遍历比较实现;还有包括左括号前或右括号后紧挨数字,通过定义一个新字符串数组指向字符串来寻找括号并判断括号前后是否合法;非法,返回0; 全都合法返回1.数字字符串转换成数字:用类中定义的val函数实现,扩充到浮点数的运算范围。 定义char类型的source指针指向字符串,用charinstr函数寻找字符串中小数点位置,以此判断整数还是浮点数,如果整数即用10的相应位数的乘方来乘以相应字符位置字符的数字,并进行累加,最后返回result;如果是浮点数,则分
5、为整数与小数部分依次进行计算,整数同上,小数部分则用相应字符位置字符所代表的数字除以10的相应位数的乘方,并进行累加,最后将整数小数部分的和返回result。字符串的连接,通过类中定义的left、right、midstr、addstrings函数配合实现。 通过left、right、midstr三个函数进行字符串的提取,addstrtings函数进行三个指针的遍历实现两个字符串的合并。数字的字符串化,通过类中定义的str函数实现。 类比val函数一样区分整数与浮点数,将数字的每一个数字单个提取出来通过与字符0的比较转化为相应字符复制给递增的指针。算式的计算,通过类中定义的calculate函数
6、实现。 依次按照*/+-的顺序用charinstr函数寻找运算符号,并用相应函数进行字符串与数字之间的转换,以及新的字符串的合并,返回计算结果。友元函数的定义,定义输入输出友元函数,重载赋值运算符等,实现字符串之间的加法。五、程序调试的过程 出现问题:开始编写完整个程序,出现许多编写错误,一个个改正; 在实现浮点数的扩充过程中的小数部分,以及输入合法性的判断过程漏掉情况,指针的误用等; 有时单独的一个函数不能搞懂或错误不能改正,就单独在编写一个类似程序,多次调试运行,来弄懂并加以改正;解决办法:查阅书籍,上网搜索,独立思考,询问同学老师,多次上机调试等;六、输入输出数据开始界面:非法输入判断:
7、 非法字母:运算符紧挨: 左括号前或右括号后为数字: 括号为中文符号:清理空格:运算第一个输入字符串算式结果:退出判断:继续运算:退出运算:浮点数的加入:七、课程设计总结 经过这次庞大复杂的课程设计过程,是我对c+知识有了更加深刻的理解,引起了我对c+语言世界的无限好奇心和探索欲,感慨到了世界的神奇与微妙,程序控制的无限用途以及自身的渺小; 在其中编写判断括号前后是否合法语句时,指针遍历不易实现,于是经过多次调试后重新定义了一个字符串数组来实现,这给了我很大的启示,只要努力并不断尝试新的东西一定会成功;还有程序中友元函数与运算符重载部分,由于知识掌握不够牢固,反复调试查阅书籍,最终得到了解决,
8、也使得我对这方面的知识获得了更为深刻的理解与认知;浮点数的加入要进行小数点数位的取舍,函数中设定为小数点儿后六位,因此浮点数运算过程中每次都会出现六位小数的现象,使得结果有0.的误差,通过单独编写类似函数多次调试,使得我对c+语言中对double型向int型变量转化的规律的理解获得了更深层次的理解;通过编写过程,体会到了细节的厉害,有时一个微小的错误就能使整个程序而不能正确运行;八、源程序注解#include#include#includechar pause;int len(char*source)/算出字符串的长素 int retval=0; while(*(source+retval+)
9、!=0)return -retval;class CStr/定义字符串类 private:int nlen;/字符串长度 char *pstr;/字符串首地址public: CStr(); CStr(char *str) nlen=len(str);pstr=str; int Getlen()return nlen;/返回字符串长度char*Getstr()return pstr;/返回字符串首地址CStr(CStr&str)nlen=str.Getlen();pstr=str.Getstr();/拷贝构造函数char*Getpstr()return pstr;void midstr(CStr
10、 & str1,int start,int length);/*返回指定字符串类中从nStart序号开始nLength长度的字符*/ void left(CStr & str1,int length);/*返回指定字符串中从左边开始nLength个字符*/ void right(CStr & str1,int length);/*返回指定字符串中从右边开始nLength个字符*/ calculate();/计算该字符串所代表的四则运算的值(内无括号)friend int charinstr(char); /友元函数,判断字符是否在字符串中double val();/求字符串代表的数字字符的数值
11、str(double val);/将数值表示成字符串的形式 friend istream &operator(istream &,CStr &);/重载输入运算符 int Judge();/判断输入是否合法,滤除空格;void CStr:left(CStr & str1,int length)/从参数指向的地址左边取Length个字符赋给目的字符串char*destination=pstr;char *source=str1.Getstr();*(destination+-length+1)=0;/目的字符串以0 结尾 while(length=0)/赋值Length个字符 *(destina
12、tion+length)=*(source+length-); void CStr:midstr(CStr & str1,int start,int length)/从参数指向的地址处从start位置开始取length个字符赋给目的字符串char *source=str1.Getstr();source+=start-1;/开始赋值处的地址 char*destination=pstr;*(destination+-length+1)=0;/目的字符串以0 结尾while(length=0)/赋值Length个字符*(destination+length)=*(source+length-);
13、void CStr:right(CStr & str1,int length)/从参数指向的地址右边取Length个字符赋给目的字符串char *source=str1.Getstr();while(*source!=0) source+; /移至字符串尾部char*destination=pstr;source-=length;/跳至欲赋值的首地址*(destination+-length+1)=0;/目的字符串以0 结尾while(length=0)/赋值Length个字符 *(destination+length)=*(source+length-); int charinstr( ch
14、ar *destination,char char_to_find)/判断字符串char_to_find是否在目的字符串中,若在,返回其所在位置,若不再返回0 int pos=0;while(*(destination+pos)!=0)/循环查找 if(char_to_find=*(destination+pos+) return pos; /找到,返回其位置return 0;CStr:str(double value)/将value的值转换为字符串的形式返回,加入浮点数 char*tempdest=pstr; int a=0; int b=(int)value;double c=value-
15、b;int multiplier=;for(multiplier=;multiplier!=0;multiplier/=10)*tempdest=0+(char)(b/multiplier);b-=(b/multiplier)*multiplier;if(*tempdest!=0)|(a)a+;tempdest+; if(c=0)/如果value为整数*tempdest=0;else/如果value为浮点数*tempdest+=.;for(a=1;a=6;a+)c*=10;int d=(int)c;if(d!=0&a=6)*tempdest+=0+d;c-=d; *tempdest=0;/赋值
16、字符串最后一位为0char*addstrings(char*destination,char*source1,char*source2)/两个字符串合并,结果在第一个参数中 char*tempdest=destination; while(*source1!=0)*(tempdest+)=*(source1+); while(*source2!=0)*(tempdest+)=*(source2+);*tempdest=0;/NULLreturn destination;double pwr(double a,double b)/计算a的b次方double result=1; for(int c
17、=1;c=b;c+)result*=a; return result;double CStr:val()/将数字字符串转换成数值(包括浮点数)char*source=pstr;double result=0;CStr nstr(source); int z=charinstr(source,.);/从source字符串中找到小数点if(z=0)/如果为整数int multiplier=(int)pwr(10,len(source)-1);while(*source!=0)/依次遍历每一个字符result+=(*(source+)-0)*multiplier;multiplier/=10;/将相
18、应字符转化为对应位数的整数,并依次累加获得所需整数数return result; else/如果为小数,此时指针指向小数点的位置char a150;CStr A1(a1);A1.left(nstr,z-1);/返回此时nstr指向的地址左边的z-1个字符,即所需浮点数的整数部分char*nint=A1.Getstr();/将A1的内容赋值给nint指针int multiplier=(int)pwr(10,len(nint)-1);/定义multiplier等于10的整数位数的乘方while(*nint!=0)result+=(double)(*(nint+)-0)*multiplier;mul
19、tiplier/=10; /将浮点数整数部分字符串转换为数值char a350;CStr A3(a3);A3.midstr(nstr,z+1,len(source)-z);/返回从nstr指向地址的z+1位置开始的(len(source)-z)个字符,即所需浮点数的小数部分char *ndouble=A3.Getstr();/将A3的内容赋值给ndouble指针for(multiplier=10;*ndouble!=0;ndouble+)/依次遍历ndouble指向的每一个字符 result+=(double)(*(ndouble)-0)/(double)multiplier; multipl
20、ier*=10; /将相应字符除以对应数位的10的乘方获得该位的小数并依次相加return result;char*assignstr(char*source,char*destination)/字符串赋值char*tempdest=destination;while (source!=0)*(tempdest+)=*(source+); *tempdest=0; return destination;CStr:calculate()/计算数字算式形式的字符串,将其转换为数字形式并计算出来,然后再将结果转换为字符串的形式,此算式没有括号,遵循的原则是先乘除后加减char*string=pstr
21、; CStr nstr(string);char buf150,buf250,buf350,buf450,buf550; CStr cuf1(buf1),cuf2(buf2),cuf3(buf3),cuf4(buf4),cuf5(buf5);char opstr6=/*+-;double leftnr;double rightnr;int oppos;int z;double result;for(int pos_in_opstr=0;pos_in_opstr=0;z-)if (*(string+z)=+)|(*(string+z)=/)|(*(string+z)=-)|(*(string+z
22、)=*)|(*(string+z)=)cuf1.midstr(nstr,z+2,oppos-z-2); leftnr=cuf1.val(); z=-1; else if(z=0)cuf1.left(nstr,oppos-1); leftnr=cuf1.val(); for(z=oppos;zlen(string);z+)/再将运算符右边的数字字符取出转换为数字if(*(string+z)=+)|(*(string+z)=/)|(*(string+z)=-)|(*(string+z)=*)|(*(string+z)=)cuf2.midstr(nstr,oppos+1,z-oppos); righ
23、tnr=cuf2.val();z=len(string);else if(z=len(string)-1)cuf2.right(nstr,len(string)-oppos); rightnr=cuf2.val();/对这两个数字进行计算,结果在result中if(opstrpos_in_opstr=+)result=leftnr+rightnr;else if (opstrpos_in_opstr=-)result=leftnr-rightnr;else if (opstrpos_in_opstr=/)result=leftnr/rightnr;else if (opstrpos_in_op
24、str=*)result=leftnr*rightnr;else if (opstrpos_in_opstr=)result=pwr(leftnr,rightnr);/计算后,将结果转换为字符串,然后将左右未运算过的字符串与其连接起来cuf4.left(nstr,oppos-len(&buf10)-1);cuf5.str(result);addstrings(&buf30,cuf4.pstr,cuf5.pstr);cuf5.right(nstr,len(string)-oppos-len(&buf20);addstrings(string,cuf3.pstr,cuf5.pstr);cout运行
25、的结果是pstr(istream&is,CStr&ss) char a50;char *x=a;char *y=ss.pstr;cin.getline(x,50);while(*x!=0) *(y+)=*(x+);*y=0; return is;int CStr: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; /找到除基本
26、运算符和数字外的非法输入char *destination=source;while(*destination!=0)if(=*destination&*destination=+|-=*destination&*destination=/|0=*destination&*destination=9|*destination=|*destination= )destination+;elsereturn 0;/找到非法输入,返回0/找到非法逻辑destination=pstr;if(*destination=|*destination=*|*destination=/|*destination
27、=+)/一开始为运算符 return 0;int pos_in_opstr;int pos;int z;char opstr6=/*+-;for(pos_in_opstr=0;pos_in_opstr=4;pos_in_opstr+) while(charinstr(source,opstrpos_in_opstr)pos=charinstr(source,opstrpos_in_opstr);z=pos;if(*(source+z)=|*(source+z)=*|*(source+z)=/|*(source+z)=+|*(source+z)=-|*(source+z)=0)return 0;
28、/运算符后紧接着又是运算符,返回0 z-=2;if(*(source+z)=|*(source+z)=*|*(source+z)=/|*(source+z)=+|*(source+z)=-|*(source+z)=0)return 0;/两个运算符相距非法,返回0elsesource+=pos;/继续遍历字符串 char m50;int n=0;strcpy(m,pstr); while(mn) if(mn=()if(n=0) n+;continue;/左括号位于开头,继续向下遍历else if(0=mn-1&mn-1=9)return 0;break;/如果左括号左边是数字,没有运算符号,非法,返回0if(mn=)if(mn+1=0) n+;continue;/右括号位于结尾,继续else if(0=mn+1&mn+1=9)return 0;break;/如果右括号右边是数字,没有运算符号,非法,返回0n+;return 1;cout去除空格后的算式:pstrendl;void main()CStr myrecord; cout2 欢迎使用四则运算程序 2 n;cout2 2 n;cout2 2 n; cout2 2 n; cout2 2 n;cout2 2 n; cout2 请按回车键继续 2 n; cin.get(p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025行纪合同书范文
- 二零二五年度智能穿戴设备研发与销售合作协议2篇
- 玉米de-1双穗突变体的细胞学观察及分子调控分析
- 基于ROS的细菌LLDRA6及其生物Mn2O3降解阿特拉津的机理研究
- 格里格《c小调小提琴奏鸣曲》(Op.45)的艺术风格及演绎分析
- 退市新规下统一股份盈余管理研究
- 二零二五版新能源风力发电设备ODM制造合同3篇
- CLIL教学模式在“中文+”项目课程中的教学实践研究
- 二零二五年度智能家居电缆电线批量采购合同2篇
- 基于供需平衡视角下北京旅游型乡村公共空间优化路径研究
- 【探迹科技】2024知识产权行业发展趋势报告-从工业轰鸣到数智浪潮知识产权成为竞争市场的“矛与盾”
- 《中国政法大学》课件
- GB/T 35270-2024婴幼儿背带(袋)
- 2024-2025学年高二上学期期末数学试卷(新题型:19题)(基础篇)(含答案)
- 2022版艺术新课标解读心得(课件)小学美术
- Profinet(S523-FANUC)发那科通讯设置
- 红色历史研学旅行课程设计
- 下运动神经元损害综合征疾病演示课件
- 2023中考地理真题(含解析)
- JJF 1101-2019环境试验设备温度、湿度参数校准规范
- GB/T 25000.51-2016系统与软件工程系统与软件质量要求和评价(SQuaRE)第51部分:就绪可用软件产品(RUSP)的质量要求和测试细则
评论
0/150
提交评论