您的当前位置:首页正文

有理数四则运算

来源:爱站旅游
导读有理数四则运算
 . . . .

综合作业报告

一、 试验目的、试验环境、设计思路:

实验目的:掌握面向过程和面向对象程序设计的根本方法和编程技巧,巩固所学理论知识,使理论与实际相结合。从而提高自我分析问题、解决问题的能力。通过课程设计,进一步巩固《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(),在函数体中首先要找到分子与分母的最大公约数,再将分子与分母同时除以这个最大公约数,优化函数在创建有理数对象时应执行,在执

1 / 12

. . . .

行其它各种运算之后也需执行它,这样可保证所存储的有理数随时都是最优的。然后定义一个转换函数realnum(),将每一个有理数都好转换成实数形式,且同样在执行各种运算后都执行它。最后定义一个函数show(),实现对数据的输出,同时为了防止分母为零的错误输入,当一个有理数的分母输入为零时,提示输入错误,以保证数据的正确性,当分子输入为零时,不管其分母多大,都显示输出为零,否那么输出形式为:分子/分母。

设有理数输入格式为:整数1 整数2 整数3 整数4 //整数1、2、3、4分别为两个有理数的分子和分母

有理数输出格式为:分子/分母

三、 流程描述:〔函数流程图〕

属性和方法定义: 类名 成员类别 类型 成员名 描述 分子 分母 输入两个有理数 化简有理数 两数相加运算 两数相减运算 两数相乘运算 两数相除运算 判断两个有理数是否相等 转换为实数 输出有理数 num 属性 int numerator denomination num() yuefen(int,int) +(num) -(num) *(num) /(num) == (num) realnum() show() int 方法 num void num num num num bool double void 四、源代码:

#include class num

2 / 12

. . . .

{ public:

num(int z=0,int m=0){numerator=z; denominator=m;} void yuefen(int x,int y);//定义约分函数 num operator + (num n2);//运算符+重载成员函数 num operator - (num n2);//运算符-重载成员函数 num operator * (num n2);//运算符*重载成员函数 num operator / (num n2);//运算符/重载成员函数 bool operator == (num n2);//运算符==重载成员函数 double realnum(){R=(double)numerator/denominator; return R;

cout<int numerator,denominator; double R; };

void num::yuefen(int x,int y) //分数化简函数

{ int t; int i;

3 / 12

. . . .

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)

4 / 12

. . . .

cout<<\"0\"<cout<//////////////////////////////// 重载运算符函数的实现 /////////////////////////////////// num num::operator+(num n2) { return

num(numerator*n2.denominator+denominator*n2.numerator,denominator*n2.denominator); }

num num::operator-(num n2) { return

num(numerator*n2.denominator-denominator*n2.numerator,denominator*n2.denominator); }

num num ::operator*(num n2) { return

num(numerator*n2.numerator,denominator*n2.denominator)

5 / 12

. . . .

; }

num num ::operator/(num n2) { return

num(numerator*n2.denominator,denominator*n2.numerator); }

bool num::operator == (num n2) {

if((numerator=n2.numerator)&&(denominator=n2.denominator))

return true; else

return false; }

void num::show()//显示输出函数 {

if(numerator==0) cout<<\"0\"<6 / 12

. . . .

else

cout</////////////////////////////////////////// 主函数 //////////////////////////////////// int main() { char m;

cout<<\"/////////////////////////// 有理数运算程序 //////////////////////////////\"<cout<<\"确定进入系统?(Y/N)\"<>m;

if(m=='n'||m=='N')

cout<<\"不进入系统!\"<char n;

cout<<\"输入两个有理数:\"; int a,b,c,d; cin>>a>>b>>c>>d; num n1(a,b),n2(c,d),n3;

7 / 12

. . . .

cout<<\"您所输入的有理数n1为:\"; n1.show();

cout<<\"化简后的n1为:\"; n1.yuefen(a,b);

cout<<\"转化为实数后的n1为\"<cout<<\"您所输入的有理数n2为:\"; n2.show();

cout<<\"化简后的n2为:\"; n2.yuefen(c,d);

cout<<\"转化为实数后的n2为\"<cout<<\"输入您所需要的运算符:\"; cin>>n; if(n=='+') {

n3=n1+n2;

cout<<\"您所需的操作为:n1+n2=\"; n3.show();

cout<<\"化简后的数为:\"; n3.yuefen(a*d+b*c,b*d);

cout<<\"转化为实数后为:\"<8 / 12

:: . . . .

}

else if(n=='-') {

n3=n1-n2;

cout<<\"您所需的操作为:n1-n2=\"; n3.show();

cout<<\"化简后的数为:\"; n3.yuefen(a*d-b*c,b*d); cout<<\"

\"<else if(n=='*') {

n3=n1*n2;

cout<<\"您所需的操作为:n1*n2=\"; n3.show();

cout<<\"化简后的数为:\"; n3.yuefen(a*c,b*d); cout<<\"

\"<else if(n=='/')

9 / 12

. . . .

{

n3=n1/n2;

cout<<\"您所需的操作为:n1/n2=\"; n3.show();

cout<<\"化简后的数为:\"; n3.yuefen(a*d,b*c); cout<<\"

\"<cout<<\"您输入的运算符不正确!\"<cout<<\"n1=n2\"<cout<<\"n1!=n2\"<cout<<\"您的输入有误!\"<cout<<\"运算完毕,您继续吗?(Y/N)\";//提示是否继续运算 char p;

10 / 12

. . . .

cin>>p; if(p=='n'||p=='N')

cout<<\"退出运算系统!\"<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语句提示是否继续进展下一个运算,如果不继续,那么输出“退出运算系统〞,如果继续,那么会通过return main()返回继续以上操作。

六、 问题与解决方法

问题一,开始设计的程序并不能满足我们的需求当我们输入一个整型实数时却与我们预期的结果并不一样,并不能够执行。进一步测试后能运行了,结果却与 是

11 / 12

. . . .

与实数无关,原因是我定义的运算符重载的参数类型都是类,而没有整型实数,参数无法传递过去。又经过调整后每一条形参是类的运算符函数下面再补加一个形参是整型实数的运算符函数。

问题二,我声明了类的三个对象,两个用于存放输入的分数,另一个用于存放运算后的结果,而结果却要输入三组实数, 得到了三个分数.这与设计要得到两个分数不同,原因是我三次调用无形参的构造函数。后来我又曾加了一个带形参构造函数,我把第三个对象改为C〔0,0〕后又出现了错误,经过几次的测试C的第二个参数必须是非零的参数,因为第二个参数是作为分母不能取零。

七、 总结:

通过此次C++的课程设计,我熟练掌握了面向对象程序语言中的很多功能的实现,并且熟悉了很多调试程序的方法,懂得了处理错误的方法。进一步掌握面向过程和面向对象程序设计的根本方法和编程技巧,巩固所学理论知识,使理论与实际相结合。从而提高自我分析问题、解决问题的能力。通过课程设计,在各方面的能力得到了锻炼,经历了这次课程设计,不仅对我的学习提供了帮助,而且在意志力方面也得到了锻炼。没有足够的耐力和信心就很难坚持对课程设计每一步的顺利进展。

12 / 12

因篇幅问题不能全部显示,请点此查看更多更全内容

Top