有理数四则运算.docx
- 文档编号:4798618
- 上传时间:2022-12-09
- 格式:DOCX
- 页数:10
- 大小:54.96KB
有理数四则运算.docx
《有理数四则运算.docx》由会员分享,可在线阅读,更多相关《有理数四则运算.docx(10页珍藏版)》请在冰豆网上搜索。
有理数四则运算
有理数四则运算
综合作业报告
、试验目的、试验环境、设计思路:
实验目的:
掌握面向过程和面向对象程序设计的基本方法和编程技巧,巩固所学理论知识,使理论与实际相结合。
从而提高自我分析问题、解决问题的能力。
通过课程设计,进一步巩固《C++语言程序设计》的基本理论知识,理论联系实际,进一步培养综合分析问题、解决问题的能力。
实验环境:
VisuaiC++6.0
设计思路:
定义一个有理数类num(),通过构造函数实现对数据的初始化;然后将运算符+、-、*、/重载为该类的成员函数,再在函数内按照上述方法将两个有理数之间的加、减、乘、除运算实现,;再同样通过重载运算符==实现判定两个有理数是否相等,判定两个数是否相等的方法为判断一个数的分子与另一个数的分母相乘的值是否与该数的分母与另一个数的分子相乘的值相等;再定义一个可对有理数约分的函数yuefen(),在函数体中首先要找到分子与分母的最大公约数,再将分子与分母同时除以这个最大公约数,优化函数在创建有理数对象时应执行,在执行其它各种运算之后也需执行它,这样可保证所存储的有理数随时都是最优的。
然后定义一个转换函数realnum(),将每一个有理数都好转换成实数形式,且同样在执行各种运算后都执行它。
最后定义一个函数show(),实现对数据的输出,同时为了避免分母为零的错误输入,当一个有理数的分母输入为零时,提示输入错误,以保证数据的正确性,当分子输入为零时,不管其分母多大,都显示输出为零,否则输出形式为:
分子/分母。
二、功能模块及结构描述(函数功能和数据结构类型的定义。
)
设有两个有理数a/b和c/d,则有:
1)
有理数相加
分子=a*d+b*c;
分母=b*d
2)
有理数相减
分子=a*d-b*c;
分母=b*d
3)
有理数相乘
分子=a*c;
分母=b*d
4)
有理数相除
分子=a*d;
分母=b*c
定义一个有理数类num(),通过构造函数实现对数据的初始化;然后将运算符+、-、*、/重载为该类的成员函数,再在函数内按照上述方法将两个有理数之间的加、减、乘、除运算实现,;再同样通过重载运算符==实现判定两个有
理数是否相等,判定两个数是否相等的方法为判断一个数的分子与另一个数的分母相乘的值是否与该数的分母与另一个数的分子相乘的值相等;再定义一个可对有理数约分的函数yuefen(),在函数体中首先要找到分子与分母的最大公约数,再将分子与分母同时除以这个最大公约数,优化函数在创建有理数对象
时应执行,在执行其它各种运算之后也需执行它,这样可保证所存储的有理数
随时都是最优的。
然后定义一个转换函数realnum(),将每一个有理数都好转换
成实数形式,且同样在执行各种运算后都执行它。
最后定义一个函数show(),
实现对数据的输出,同时为了避免分母为零的错误输入,当一个有理数的分母输入为零时,提示输入错误,以保证数据的正确性,当分子输入为零时,不管其分母多大,都显示输出为零,否则输出形式为:
分子/分母。
设有理数输入格式为:
整数1整数2整数3整数4//整数1、2、3、
4分别为两个有理数的分子和分母
有理数输出格式为:
分子/分母
三、流程描述:
(函数流程图)
属性和方法定义:
类名
成员类别
类型
成员名
描述
num
属性
int
numerator
分子
int
denomination
分母
方法
num
num()
输入两个有
理数
void
yuefen(int,int)
化简有
理数
num
+(num)
两数相加
运算
num
-(num)
两数相减
运算
num
*(num)
两数相乘
运算
num
/(num)
两数相除
运算
bool
==(num)
判断两个有理数是否相等
double
realnum()
转换为实数
void
show()
输出有
理数
四、源代码:
#include
{
public:
num(intz=0,intm=0){numerator二z;denominator=m;}
realnum(){R=(double)numerator/denominator;
returnR;
cout< voidshow();//定义函数将其输出 private: intnumerator,denominator; doubleR; }; voidnum: : yuefen(intx,inty)//分数化简函 数 {intt; inti; if(x>y) t=y; else t=x; for(i=t;i>=1;i--)if((x%i==0)&&(y%i==0)){ t=i; break; } if(t) { numerator=x/t;denominator=y/t; } else { numerator=x;denominator=y;} if(numerator==0)cout<<"0"< cout< } ////////////////////////////////重载运算符函数的实现/////////////////////////////////// numnum: : operator+(numn2) { returnnum(numerator*n2.denominator+denominator*n2.numerator,denominator*n2.denominator); } numnum: : operator-(numn2) { returnnum(numerator*n2.denominator-denominator*n2.numerator,denominator*n2.denominator); } numnum: : operator*(numn2) { return num(numerator*n2.numerator,denominator*n2.denominator) numnum: : operator/(numn2) { return num(numerator*n2.denominator,denominator*n2.numerator) 5 } boolnum: : operator==(numn2) { if((numerator=n2.numerator)&&(denominator=n2.denominator)) returntrue; else returnfalse; } voidnum: : show()//显示输出函数 { if(numerator==0)cout<<"0"< elseif(denominator==0) cout<<"您的输入有误! "< else cout< /////////////////////////////////////////// 函数//////////////////////////////////// intmain() { charm; 有理数运算程 提示是否进入 cout<<"/////////////////////////// 序//////////////////////////////"< cout<<"确定进入系统? (Y/N)"< cin>>m; if(m=='n'||m=='N') cout<<"不进入系统! "< elseif(m=='y'||m=='Y') { charn; cout<<"输入两个有理数: "; inta,b,c,d; cin>>a>>b>>c>>d; numn1(a,b),n2(c,d),n3; coutvv"您所输入的有理数n1为: "; n1.show(); n1为: n2为: 后为: coutvv"化简后的n1为: "; n1.yuefen(a,b); cout<<"转化为实数后的 "< coutvv"您所输入的有理数n2为: "; n2.show(); coutvv"化简后的n2为: "; n2.yuefen(c,d); coutvv"转化为实数后的 "vvn2.realnum()vvendl; coutvv"输入您所需要的运算符: "; cin>>n; if(n=='+') { n3=n1+n2; coutvv"您所需的操作为: n1+n2="; n3.show(); coutvv"化简后的数为: "; n3.yuefen(a*d+b*c,b*d); coutvv"转化为实数 "vvn3.realnum()vvendl; elseif(n=='-') { n3=n1-n2; cout<<"您所需的操作为: n3.show(); cout<<"化简后的数为: n3.yuefen(a*d-b*c,b*d); cout<<"转化为 "< } elseif(n=='*') { n3=n1*n2; cout<<"您所需的操作为: n3.show(); cout<<"化简后的数为: n3.yuefen(a*c,b*d); cout<<"转化为 "< } n1-n2="; 实数后为: n1*n2="; 实数后为: elseif(n=='/') n3=n1/n2; cout<<"您所需的操作为: n1/n2="; n3.show(); cout<<"化简后的数为: "; n3.yuefen(a*d,b*c); cout<<"转化为实数后为: "< } else cout<<"您输入的运算符不正确! "< cout<<"由==重载运算符知: "; if(a*d==b*c) cout<<"n1=n2"< else cout<<"n1! =n2"< } else cout<<"您的输入有误! "< cout<<"运算结束,您继续吗? (Y/N)";//提示是否继续运算 charp; cin>>p; if(p=='n'||p=='N') cout<<"退出运算系统! "< elseif(p=='y'||p=='Y') returnmain(); else cout<<"您的输入有误! "< } 五、使用说明: 主函数中要提示使用者操作,首先定义一个字符m提示使用者输入n或y来 确定是否进入系统,用if语句来来实现,输入为n,则显示“不进入系统! ”,输入为y,则确定进入系统,则显示“您的输入有误! ”。 确定进入系统后,定义四个整数a,b,c,d,数据从键盘输入,分别存放有理数1的分子分母和有理数2的分子分母,再将这两个有理数分别通过分数、实数及最优形式输出。 然后声明两个带参数的有理数类对象n1(a,b)和n2(c,d),分别为有理数a/b和c/d,再声明一个无实参对象n3,来存放有理数n1和n2的运算结果;再提示输入运算符,又通过if语句实现每一个相应运算符的操作并将结果再次通过分数、实数及最优形式输出,如果输入的运算符不是 “+、-、*、/”,则提示“您的运算符输入不正确! ”,最后判断出两个有理数是否相等并将结果输出。 一个运算结束后,再次通过if语句提示是否继续进行下一个运算,如果不继续,则输出“退出运算系统”,如果继续,则会通过returnmain()返回继续以上操作。 六、问题及解决方法问题一,开始设计的程序并不能满足我们的需求当我们输入一个整型实数时却与我们预期的结果并不一样,并不能够执行。 进一步测试后能运行了,结果却与是与实数无关,原因是我定义的运算符重载的参数类型都是类,而没有整型实数,参数无法传递过去。 又经过调整后每一条形参是类的运算符函数下面再补加一个形参是整型实数的运算符函数。 问题二,我声明了类的三个对象,两个用于存放输入的分数,另一个用于存放运算后的结果,而结果却要输入三组实数,得到了三个分数.这与设计要得到两个分数不同,原因是我三次调用无形参的构造函数。 后来我又曾加了一个带形参构造函数,我把第三个对象改为C(0,0)后又出现了错误,经过几次的测试C的第二个参数必须是非零的参数,因为第二个参数是作为分母不能取零。 七、总结: 通过此次C++勺课程设计,我熟练掌握了面向对象程序语言中的很多功能的实现,并且熟悉了很多调试程序的方法,懂得了处理错误的方法。 进一步掌握面向过程和面向对象程序设计的基本方法和编程技巧,巩固所学理论知识,使理论与实际相结合。 从而提高自我分析问题、解决问题的能力。 通过课程设计,在各方面的能力得到了锻炼,经历了这次课程设计,不仅对我的学习提供了帮助,而且在意志力方面也得到了锻炼。 没有足够的耐力和信心就很难坚持对课程设计每一步的顺利进行。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 有理数 四则运算