C++课程设计.docx
- 文档编号:9948081
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:41
- 大小:26.42KB
C++课程设计.docx
《C++课程设计.docx》由会员分享,可在线阅读,更多相关《C++课程设计.docx(41页珍藏版)》请在冰豆网上搜索。
C++课程设计
C++课程设计实验报告
所选题目分数计算器
评定难易级别一般
1实验内容:
1.1程序功能介绍
分数计算器及测试程序,具有对输入的运算进行“+,-,*,/,^”的功能
1.2程序设计要求
(1)完成计算器程序,对main函数的结构进行改进,要求有详细的菜单选项界面,用户不选择退出就可以反复运算。
(2)完善程序,改为多操作数基本四则运算,遇到0停止。
(3)增加函数,完成四则混合运算,注意算法要考虑运算符的优先级,对应增加主菜单选项。
(4)增加语句使四则运算具有测试功能,即计算机能够自动出题,并要求用户计算,同时计算机判断用户计算的对错并打分,要求十题一个单元,每题一个运算符,参与运算的分子分母均为一位数,运算符包括加,减,乘,除及大于小于等运算符。
1.3程序设计思想
1)类的封装
原程序类的封装比较完善,又定义了许多运算符的重载函数,操作起来十分方便。
所以不对原类的定义进行修改,新增加的视线混合四则运算和测试功能的函数定义为全局函数,同时充分利用已定义的各种重载运算符。
2)主函数的修改
原函数的主函数要进行大的修改,在函数中首先列出各种运算的菜单,每个菜单选项对应一项功能,供用户进行选择。
每个菜单相应地增加增加子菜单,使功能更加完善。
2课程设计的详细设计
程序设计时,主要在原来的程序基础上,增加了分数基本运算菜单menu1(),分数与分数及分数与整数的关系比较菜单menu2(),多个操作数的基本运算菜单menu3(),分数转化成小数的运算菜单menu4(),大于1的分数转化成整数真分数格式的菜单menu5(),四则混合运算菜单menu6(),以及基本测试程序test(),并将它们定义为全局函数,同时还在每个函数里增加了清屏函数system("cls"),以更方便与用户对界面操作,便于查看对进行过的操作。
最后将主菜单定义在全局函数里,避免了定义过多全局函数造成的程序不严密,子菜单要返回主菜时调用主函数。
将一些菜单函数中的变量定义为全局变如:
fractionf1,f2,f[50];intn;intnumember1,numember2,numember3,numember4;避免反复定义变量造成的不方便。
程序要求用户不选择退出就可以反复运算,基于此我在menu1(),menu2(),menu3(),menu4(),menu5()中分别利用了do-while语句,这样就可以很方便的重复本菜单的操作了。
menu6()是实现四则混合运算的函数,采用的方法是在输入时遇到加减号先放一下,即存储起来,遇到乘除号尽力即将运算符两边的数字计算出来,输入符号@作为算式的结束。
此外该函数还利用了条件判断语句用以询问用户是否继续本菜单的操作,输入y/Y继续本菜单操作,输入其它则返回主菜单,利用goto语句,在输入有误时进行相关操作。
test()函数是由计算机出题,用户计算,计算机判断对错并给出单元测试用户所得分数,对于做错的题目计算机会给出正确的结果。
计算机自动出题,利用了随机数发生器,主要参考了福彩游戏和扑克牌游戏。
同四则混合运算相同,测试程序也利用了条件判断语句判断是否重复菜单操作。
3调试程序的过程
调试的过程中遇到了很多的问题:
1)unexpectedendoffilefound出现在主函数末尾,最后检查出是前面的符号有误,经过修改错误消失。
2)在执行menu1(),menu2(),menu3(),menu4(),menu5()一开始进入界面就出现了死循环,检查出势在修改程序过程中没有添加语句cin>>nchoice;造成了错误的出现。
添加之后错误便没有了。
3)程序中涉及大量的输入,如果是cin流输入而不加以处理,一旦输入错误,比如输入字母,则程序会出现非法循环,不能正确运行。
处理方法是对输入cin流进行处理是直接受非法输入时,能自动察觉并提示重新输入。
于是就加入了程序段while(!
cin)//当输入的数据类型与定义的变量类型不一致时
{charstr[20];
cin.clear();//清空键盘缓冲区
cin.getline(str,20);//接收原输入数据
cout<<"非法输入,请重新输入一个整数!
"< cin>>nchoice;//重新输入 } 同时考虑到清空键盘缓冲区的问题,又在switch语句结束后加上语句getch();才使问题得到很好的解决。 于是就加上了语句getch();结果当要进行下一次运算时就要再敲一次回车,当去掉语句后,问题就不会出现了。 4)最初设计时menu1(),menu2(),menu3(),menu4(),menu5()只给了返回主菜单的操作,如果用户想随时结束程序就要返回主菜单会很不方便,于是又加入了放返回主菜单的操作语句,使程序变得更加灵活。 5)test()程序设计中出现语句f1(numember1,numember2);本来想给全局变量赋值的,结果该行语句出现了termdoesnotevaluatetoafunction的错误,后来检查出对象在定义时有形式fractionf1(numember1,numember2);在将test()中程序段改为后者时问题得以解决。 另外还可以将程序段改为f1.setnum(numember1);f1.setden(numember2);也能解决这个问题。 6)四则混合运算程序编写时显,现按面的程序段编写 while(op! ='@'){ cin>>f2; switch(op) { case'+': case'-': switch(operator1) { case'': answer=f1;break; case'+': answer=answer+f1;break; case'-': answer=answer-f1;break; } --〉operator1=op;f1=f2;break; case'*': f1=f1*f2;break; case'/': if(f2! =0){f1=f1/f2;break;} else{cout<<"除数为零! \n"; gotoend;} default: cout<<"运算符输入有误\n"; gotoend; } cin>>op; } 后来在调试时发现算式的一个操作数总被忽略致使结果出错,后来又想到由于应用了红色箭头指示的语句,所以还应对operator1并作判断进行运算。 于是在上面程序后加入程序段,便可得出正确的结果了. switch(operator1) { case'': answer=f1;break; case'+': answer=answer+f1;break; case'-': answer=answer-f1;break; } 4课程设计总结: 经过为期四个周的课程设计,使我渐渐学会了如何自己通过使用VisualC++程序设计语言编写程序解决现实生活中遇到的一些问题,而且对面向对象的程序设计思想有了一个更为全面的认识。 在自己调试的过程中遇到了各式各样的问题,有的是自己解决的,有的是通过向老师同学寻求帮助。 有些错误要经过很长的时间才能改正,从中认识到自己的基础还不是很扎实还需要自己付出更多的努力去完善自己的知识体系,还需要更多的时间去提升自己独立思考问题,并积极寻求解决方案的能力。 同时也明白了一个道理,现代社会正处于知识大爆炸的时代,我们不仅要不断的更新自己的知识,还应学会团队合作或者说是积极主导的向他人寻求帮助,但靠一个人的力量有时是很难做出成绩的。 我逐渐懂得编写程序解绝不仅仅是简单的解决问题,使拥有一定的功能,还应给予人性化的角度考虑,如何才能给他人的使用带来方便,如果这样才能令编写的程序有更高的质量,更加实用。 在开始选完课程设计题目后自己盲目上机编程,但却没有一个明确的目标,导致几天下来没有太大进展。 自己认识应到该先有一个明了的思路,知道每一步应该做什么才行。 就像学习一样也应有一个明确的计划,基于这种思想我最终使课程设计得以顺利进行下去,并通过反复调试,使程序设计更趋合理,功能更为完善。 通过课程设计的过程,培养了我积极动手的能力。 因为我们在大学里学习知识,决不能单凭书本,更应将所学知识尽可能的用于实践,实践是检验真理的唯一标准,实践也使得出成果的必要途径,勤于实践,必将使我们更有竞争力。 知行合一,是我们大学学习必须秉承的一种思想。 最后谢谢我的指导老师,还有我的同学,谢谢你们为我提供的帮助,是你们让我更加进步。 5附件(源程序): (红色为关键程序段) #ifndef_TGP_FRACTIONS_H #define_TGP_FRACTIONS_H #include #include #include #include #include #include classfraction//分数类的定义 { public: fraction();//默认的构造函数 fraction(intinitn,intinitd);//重载构造函数 intnumerator()const;//取分子,const成员函数,不能修改数据成员 intdenominator()const;//取分母 doubledecimal()const;//将分数转化为对应的小数 fractionabsval()const;//分数的绝对值 voidsetnum(intnewnum);//用整数设置分子 voidsetden(intnewden);//用整数设置分母 voidsimplify();//约分化简分数 voidrecip();//分子分母转置 constfraction&operator+=(intrhs);//重载分数与整数的运算符+= private: intn;//分数的分子numerator intd;//分数的分母denominator }; //全局变量 fractionf1,f2,f[50]; intn; intnumember1,numember2,numember3,numember4; //全局函数 intGCF(intx,inty);//求x,y的最大公因子 fractionoperator+(constfraction&lhs,constfraction&rhs);//重载分数加法运算符 fractionoperator+(constfraction&lhs,intrhs);//重载分数与整数加法运算符 fractionoperator-(constfraction&lhs,constfraction&rhs);//重载分数减法运算符 fractionoperator-(constfraction&lhs,intrhs);//重载分数与整数减法运算符 fractionoperator*(constfraction&lhs,constfraction&rhs);//重载分数乘法运算符 fractionoperator*(constfraction&lhs,intrhs);//重载分数与整数乘法运算符 fractionoperator/(constfraction&lhs,constfraction&rhs);//重载分数除法运算符 fractionoperator/(constfraction&lhs,intrhs);//重载分数与整数除法运算符 fractionoperator^(constfraction&base,intexp);//重载幂(^)运算符 //重载两分数比较运算符,返回1结果成立,返回0结果不成立 booloperator==(constfraction&lhs,constfraction&rhs); booloperator! =(constfraction&lhs,constfraction&rhs); booloperator>=(constfraction&lhs,constfraction&rhs); booloperator<=(constfraction&lhs,constfraction&rhs); booloperator>(constfraction&lhs,constfraction&rhs); booloperator<(constfraction&lhs,constfraction&rhs); //重载分数与整数比较运算符,返回1结果成立,返回0结果不成立 booloperator==(constfraction&lhs,intrhs); booloperator! =(constfraction&lhs,intrhs); booloperator>=(constfraction&lhs,intrhs); booloperator<=(constfraction&lhs,intrhs); booloperator>(constfraction&lhs,intrhs); booloperator<(constfraction&lhs,intrhs); ostream&operator<<(ostream&os,constfraction&f);//输出运算符重载 istream&operator>>(istream&is,constfraction&f);//输入运算符重载 voidPrintAsMixed(ostream&os,constfraction&f);//将分数f按整数,真分数格式输出到流os voidmenu1(void);//进行基本四则运算的函数 voidmenu2(void);//进行关系比较运算的函数 voidmenu3(void);//进行多个操作数的基本四则运算的函数 voidmenu4(void);//进行将分数按整数真分数格式输出的函数 voidmenu5(void);//进行将分数按小数格式输出的函数 voidmenu6(void);//进行四则混合运算的函数 voidtest(void);//进行基本四则运算的测试的函数 #endif fraction: : fraction(): n(0),d (1){}//缺省的构造函数(=0/1) fraction: : fraction(intinitn,intinitd): n(initn),d(initd){} intfraction: : numerator()const//取分子 {returnn;} intfraction: : denominator()const {returnd;} doublefraction: : decimal()const {returndouble(n)/double(d);} fractionfraction: : absval()const {fractionreturnValue(abs(n),abs(d)); returnreturnValue; } voidfraction: : setnum(intnewnum) {n=newnum;} voidfraction: : setden(intnewden) {if(newden! =0) d=newden; else {cout<<"Error: Attemtedtosetdenominatortozero! \n" <<"Pressanykeytoterminate"; getch(); abort(); } } voidfraction: : simplify() {intr=GCF(n,d); n/=r; d/=r; } voidfraction: : recip() {inttemp=n; n=d; d=temp; } constfraction&fraction: : operator+=(intrhs) {fractionnewrhs(rhs,1); return(*this+newrhs); } intGCF(intx,inty)//辗转相除求x,y的最大公约数 { intr=x%y; if(r==0) returny; else returnGCF(y,r); } fractionoperator+(constfraction&lhs,constfraction&rhs) { fractionsum; intnewnum=(lhs.numerator()*rhs.denominator()) +(rhs.numerator()*lhs.denominator()); intnewden=(lhs.denominator()*rhs.denominator()); sum.setnum(newnum); sum.setden(newden); sum.simplify(); returnsum; } fractionoperator+(constfraction&lhs,intrhs) { fractionnewrhs(rhs,1); returnlhs+newrhs; } fractionoperator-(constfraction&lhs,constfraction&rhs) { fractionnewrhs=rhs; newrhs.setnum(-rhs.numerator()); returnlhs+newrhs; } fractionoperator-(constfraction&lhs,intrhs) { fractionnewrhs(rhs,-1); returnlhs+newrhs; } fractionoperator*(constfraction&lhs,constfraction&rhs) { fractionproduct; intnewnum=lhs.numerator()*rhs.numerator(); intnewden=lhs.denominator()*rhs.denominator(); product.setnum(newnum); product.setden(newden); product.simplify(); returnproduct; } fractionoperator*(constfraction&lhs,intrhs) { fractionprod(lhs.numerator()*rhs,lhs.denominator()); prod.simplify(); returnprod; } fractionoperator/(constfraction&lhs,constfraction&rhs) { if(rhs==0) { cout<<"Error: Divisionbyzeroattempted! \n" <<"Pressanykeytoterminate"; getch(); abort(); } fractionnewrhs=rhs; newrhs.recip(); returnlhs*newrhs; } fractionoperator/(constfraction&lhs,intrhs) { if(rhs==0) { cout<<"Error: Divisionbyzeroattempted! \n" <<"Pressanykeytoterminate"; getch(); abort(); } fractionquot(lhs.numerator(),lhs.denominator()*rhs); quot.simplify(); returnquot; } fractionoperator^(constfraction&base,intexp) { fractionreturnValue; returnValue.setnum(pow(base.numerator(),exp)); returnValue.setden(pow(base.denominator(),exp)); returnreturnValue; } booloperator==(constfraction&lhs,constfraction&rhs) { returnlhs.decimal()==rhs.decimal(); } booloperator! =(constfraction&lhs,constfraction&rhs) { returnlhs.decimal()! =rhs.decimal(); } booloperator>=(constfraction&lhs,constfraction&rhs) { returnlhs.decimal()>=rhs.decimal(); } booloperator<=(constfraction&lhs,constfraction&rhs) { returnlhs.decimal()<=rhs.decimal(); } booloperator>(constfraction&lhs,constfraction&rhs) { returnlhs.decimal()>rhs.decimal(); } booloperator<(constfraction&lhs,constfraction&rhs) { returnlhs.decimal() } booloperator==(constfraction&lhs,intrhs) { returnlhs.decimal()==rhs; } booloperator! =(constfraction&lhs,intrhs) { returnlhs.decimal()! =
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 课程设计