您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > AI人工智能 > 程序设计语言-有理数运算程序
有理数运算程序一、题目有理数运算程序。有理数是一个可以化为一个分数的数,例如2/3,533/920,-12/49都是有理数。在C++中,并没有预先定义有理数,该课程设计要求定义一个有理数类,将有理数的分子和分母分别存放在两个整型变量中,模拟进行针对有理数的各种操作。二、问题的分析针对有理数的各种算法,首先要定义一个有理数类,在类中定义两个整型变量作为私有数据,分别存放有理数的分子和分母;其次,要对有理数进行各种不同的操作,如加、减、乘、除、判断两个有理数是否相等等各种关系运算,有理数是通过分数形式来进行各种运算的,有理数的加减乘除,并不是简单的分子与与分子相加减,分母与分母相加减,故要实现它的各种不同的运算,则要针对每种算法进行不同的操作,处理好两个有理数的分子与分母之间的运算;再次,有理数是一个可以转化为分数的数,但它还有实数的形式,所以,要定义一个函数来实现将有理数的分数形式转化为实数形式,以实现其完整性;同时当从键盘输入一个有理数的分子与分母,或者两数进行运算后,有理数之间并不是最优化的形式,分子与分母之间仍可以进行化简,所以,针对这种情况仍需要定义一个函数来使有理数的分数形式化为最简,以实现有理数的最优化。以上算法都实现了之后,要对每一步都进行输出显示,包括数据、计算及计算结果等,所以要再定义一个输出函数来实现有理数分数形式、实数形式及最优形式的输出。同时,为了避免分母为零的错误输入与操作,在函数体内,要将各种错误的操作情况一一列出,来避免错误的有理数。三、算法的设计设有两个有理数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分别为两个有理数的分子和分母有理数输出格式为:分子/分母主函数中要提示使用者操作,首先定义一个字符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()返回继续以上操作。系统类图:属性和方法定义:类名成员类别类型成员名描述num属性intnumerator分子intdenomination分母方法numnum()输入两个有理数voidyuefen(int,int)化简有理数num+(num)两数相加运算num-(num)两数相减运算num*(num)两数相乘运算num/(num)两数相除运算bool==(num)判断两个有理数是否相等doublerealnum()转换为实数voidshow()输出有理数有理数运算程序numintnumertorintdenominatornumnum()voidyuefen(int,int)num+(num)num–(num)num*(num)num/(num)bool==(num)doublerealnum()voidshow()四、用户手册程序运行时,首先提示是否进入系统。如不进入系统,则显示不进入系统;确定进入系统后,提示输入两个有理数。输入四个整数分别作为两个有理数的分子和分母后,会将这两个有理数和化简与转换后的形式分别输出;再提示所需要的运算符;输入一个运算符后,将会将其所进行的操作显示出来并将其优化且转化为实数,并判断出两个有理数是否相等;运算结束后,再提示是否继续,然后继续以上操作。五、调试及测试调试:调试过程中,对于类中成员与函数的定义与实现,起初并无什么错误,对于主函数,采取由简入深的方法,开始仅声明了三个有理数对象n1(3,4),n2(5,6),n3,然后通过n3=n1+n2,n3=n1-n2,n3=n1*n2,n3=n1/n2来进行计算,并调用有理数的输出、转化、约分函数来进行输出。后来,在主函数中,定义了四个整数,以实现从键盘输入有理数,然后声明有理数对象n1(a,b),n2(c,d),n3,然后再进行上一步一样的操作。但这个不能实现多组数据进行测试,所以采用了for循环,但后来发现for循环的使用不能很好的进行各种运算。即便采用了for循环,这也仅仅只是一个简单的运算程序,不能实现系统的各种输入,要实现系统化,并将每一个运算都进行化简与转换,保证输入都正确,输出的形式完好,且要系统化的输出,并实现用多个数进行测试,就需进一步改进。于是采用了后来的if语句等,然后根据各种选择来进行各种不同的操作运算,调试中也没什么错。但对于怎样实现在一个运算之后返回继续运行程序,进行下一个运算,开始根本就没有任何办法,一个运算结束后,不管输入的是y还是n,都会退出系统,后来,抱着试试看的态度,采用returnmain(),调试后无错误,且运行结果正确。要能保证输入的数正确,当将分母输入为零时,将会提示输入错误,只是不能立即结束,继续进行下一步运算,这是一大漏洞。测试及运行实例:首先,我要输入“y”确定进入有理数运算系统,然后输入2,4,6,9四个整数来进行测试,测试显示出两个有理数及其各种形式,然后,输入运算符“+”来测试对以上两个有理数2/4,6/9的加法运算,结果输出显示运算后的各种形式,并且判断出了这两个有理数不相等并输出。这个运算结束后,继续输入“y”进入系统,然后再重新输入四个整数3,7,9,11进行测试,测试结果无误,接着输入运算符“/”来测试两个新的有理数3/7,9/11之间的除法运算,结果显示并输出,然后又判断出这两个有理数步行等并输出。运算结束后,输入“n”来结束有理数的运算,结果中则会显示出“退出运算程序!”。再次进入系统,来测试分子与分母分别输入输入为零时的运算,当先输入一个分子为零的有理数0/3和一个有理数7/10时,有理数0/3的输出形式为0,输出结果正确,运算继续;当输入输入的有理数中有一个分母为零的有理数时,如有理数3/0,7/10,它的化简形式仍为3/0,但后面关于这个数的运算就是乱码。实例如下:对测试结果的分析:从测试结果来看,题目中的要求等都能实现,针对有理数的各种不同的运算都可以很好的运算出来,且可以在调用任何一个运算时同时调用约分、化简、转换等函数,并且将结果输出,并且可以在运算结束后根据函数中的算法判断出输入的两个有理数是否相等。在主函数中,也可以通过一步步的操作来进行不同的运算,同时,可以在一个运算结束后通过返回来实现运用多组数据进行不同运算符的操作。六、参考文献[1]郑莉等.C++语言程序设计(第三版).北京:清华大学出版社,1999年[2]郑莉等.C++语言程序设计(第三版)学生用书.北京:清华大学出版社,1999年[3]李春葆等.C++程序设计学习与上机实验指导.北京:清华大学出版社,1999年[4]范辉等.VisualC++6.0程序设计简明教程.高等教育出版社,2000年[5]李龙澍.C++程序设计实训教程.北京:清华大学出版社,1999年[6]洪国胜等.C++Builder程序设计轻松上手.北京:清华大学出版社,1997年[7]严蔚敏等.数据结构(c语言版).北京:清华大学出版社,1997年4月第1版。[8]胡学钢等.数据结构算法设计指导.北京:清华大学出版社,1999年第1版。附录源程序#includeiostream.hclassnum{public:num(intz=0,intm=0){numerator=z;denominator=m;}voidyuefen(intx,inty);//定义约分函数numoperator+(numn2);//运算符+重载成员函数numoperator-(numn2);//运算符-重载成员函数numoperator*(numn2);//运算符*重载成员函数numoperator/(numn2);//运算符/重载成员函数booloperator==(numn2);//运算符==重载成员函数doublerealnum(){R=(double)numerator/denominator;returnR;coutR;}//定义函数将其转化voidshow();//定义函数将其输出private:intnumerator,denominator;doubleR;};voidnum::yuefen(intx,inty)//分数化简函数{intt;inti;if(xy)t=y;elset=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)cout0endl;elsecoutnumerator/denominatorendl;}////////////////////////////////重载运算符函数的实现///////////////////////////////////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){returnnum(numerator*n2.numerator,denominator*n2.denominator);}numnum::operator/(numn2){returnnum(numerator*n2.denominator,denominator*n2.numerator);}boolnum::operator==(numn2){if((numerator=n
本文标题:程序设计语言-有理数运算程序
链接地址:https://www.777doc.com/doc-4615016 .html