有理数运算C++课程设计报告.docx
《有理数运算C++课程设计报告.docx》由会员分享,可在线阅读,更多相关《有理数运算C++课程设计报告.docx(16页珍藏版)》请在冰豆网上搜索。
![有理数运算C++课程设计报告.docx](https://file1.bdocx.com/fileroot1/2022-12/30/ec7176eb-aab7-4cd6-99e9-c2d9ff15777e/ec7176eb-aab7-4cd6-99e9-c2d9ff15777e1.gif)
有理数运算C++课程设计报告
课程设计报告
课程设计题目:
有理数运算
学生姓名:
冯绍文
专业:
软件工程
班级:
1221815
学号:
201220181502
指导教师:
许志文
2013年06月20日
东华理工大学
1.有理数运算
问题描述
有理数是一个可以化为一个分数的数,例如2/3,533/920,-12/49都是有理数,而就为无理数。
在C++中,并没有预先定义有理数,需要时可以定义一个有理数类,将有理数的分子和分母分别存放在两个整型变量中。
对有理数的各种操作都可以用重载运算符来实现。
基本要求
定义并实现一个有理数类,通过重载运算符+、-、*、/对有理数进行算术运算,通过重载运算符==实现判定两个有理数是否相等。
写一个优化函数,它的作用是使有理数约去公分母,也即是使保存的有理数分子和分母之间没有公约数(除去1以外)。
此外,还要定义一个将有理数转换为实数的函数,再加上构造函数和有理数输出函数。
测试数据
在应用程序中,创建若干有理数对象,通过带参数的构造函数使得各有理数对象值各不相同,然后分别进行各类运算,输出运算结果,检验其正确性。
实现提示
设有两个有理数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
优化函数在创建有理数对象时应执行,在执行其它各种运算之后也需执行它,这样可保证所存储的有理数随时都是最优的。
对于判断两个有理数是否相等,由于在对有理数进行各种运算后都对其进行优化,所以判定两个有理数是否相等只需判定它们两个的分子和分母分别相等即可。
选做内容
重载插入(<<)和提取(>>)运算符,使得对有理数可以直接输入输出。
设有理数输入格式为:
整数1整数2//整数1为分子,整数2为分母
有理数输出格式为:
分子/分母
以下为代码
#include
#include
#include
#include
//usingnamespacestd;删除此处才能为类定义友元函数
classrationalnumber//定义一个有理数类
{
private:
intfenmu;//有理数分母
intfenzi;//有理数分子
public:
rationalnumber(inta=1,intb=1);//带默认形参的构造函数
voidsetnumber(inta,intb);//设置分子分母的函数
rationalnumberoperator+(rationalnumberaa);//重载加法运算符
rationalnumberoperator-(rationalnumberaa);//重载减法运算符
rationalnumberoperator*(rationalnumberaa);//重载乘法运算符
rationalnumberoperator/(rationalnumberaa);//重载除法运算符
voiddisplay();//有理数输出函数
//friendvoidadd(rationalnumbera,rationalnumberb);
friendrationalnumber&yuefen(rationalnumber&r);//将约分函数设为友元函数
frienddoublezhuan(rationalnumberr);//将有理数转换成实数函数声明
friendistream&operator>>(istream&input,rationalnumber&r);//对输入流符号的重载为有元函数
friendostream&operator<<(ostream&output,rationalnumber&r);//对输出流符号的重载为友元函数
/*对"<<"和">>"重载的函数形式如下:
只能重载为友元函数
istream&operator>>(istream&,自定义类&);
ostream&operator<<(ostream&,自定义类&);*/
};
rationalnumber:
:
rationalnumber(inta,intb)
{
fenzi=a;
fenmu=b;
}
voidrationalnumber:
:
setnumber(inta,intb)
{
fenzi=a;
fenmu=b;
}
rationalnumberrationalnumber:
:
operator+(rationalnumberaa)
{
rationalnumberc;
c.fenmu=fenmu*aa.fenmu;
c.fenzi=fenzi*aa.fenmu+aa.fenzi*fenmu;
returnc;
}
rationalnumberrationalnumber:
:
operator-(rationalnumberaa)
{
rationalnumberc;
c.fenmu=fenmu*aa.fenmu;
c.fenzi=fenzi*aa.fenmu-aa.fenzi*fenmu;
returnc;
}
rationalnumberrationalnumber:
:
operator*(rationalnumberaa)
{
rationalnumberc;
c.fenmu=fenmu*aa.fenmu;
c.fenzi=fenzi*aa.fenzi;
returnc;
}
rationalnumberrationalnumber:
:
operator/(rationalnumberaa)
{
rationalnumberc;
c.fenmu=fenmu*aa.fenzi;
c.fenzi=fenzi*aa.fenmu;
returnc;
}
voidrationalnumber:
:
display()//有理数输出函数的实现
{
cout<}
ostream&operator<<(ostream&output,rationalnumber&r)//对输出符号的重载实现
{
if(r.fenmu<0)
{
r.fenmu=-1*r.fenmu;
output<<"-("<}
elseif(r.fenzi<0)
{
r.fenzi=-1*r.fenzi;
output<<"-("<}
else
output<<"("<returnoutput;
}
istream&operator>>(istream&input,rationalnumber&r)//对输入流符号的重载实现
{
//cout<<"输入分子和分母:
";
input>>r.fenzi>>r.fenmu;
returninput;
}
doublezhuan(rationalnumberr)//将有理数转换成实数的函数实现
{
returnstatic_cast(r.fenzi*1.0)/static_cast(r.fenmu);
}
rationalnumber&yuefen(rationalnumber&r)//约分函数的实现
{
inta,b,temp;
if(r.fenmu>r.fenzi)
{
a=r.fenmu;
b=r.fenzi;
}
else
{
a=r.fenzi;
b=r.fenmu;
}
while(b!
=0)
{
temp=a%b;
a=b;
b=temp;
}
r.fenzi=r.fenzi/a;
r.fenmu=r.fenmu/a;
returnr;
}
voidadd()
{
rationalnumbera;
rationalnumberb;
cout<<"进行有理数的加法运算"<cout<<"请输入第一个有理数:
";
cin>>a;
cout<<"请输入第二个有理数:
";
cin>>b;
cout<}
voidjian()
{
rationalnumbera;
rationalnumberb;
cout<<"进行有理数的减法运算"<cout<<"请输入第一个有理数:
";
cin>>a;
cout<<"请输入第二个有理数:
";
cin>>b;
cout<}
voidcheng()
{
rationalnumbera;
rationalnumberb;
cout<<"进行有理数的乘法运算"<cout<<"请输入第一个有理数:
";
cin>>a;
cout<<"请输入第二个有理数:
";
cin>>b;
cout<}
voidchu()
{
rationalnumbera;
rationalnumberb;
cout<<"进行有理数的乘法运算"<cout<<"请输入第一个有理数:
";
cin>>a;
cout<<"请输入第二个有理数:
";
cin>>b;
cout<}
voidmenu()
{
cout<<"--------1.有理数加法运算--------"<cout<<"--------2.有理数减法运算--------"<cout<<"--------3.有理数乘法运算--------"<cout<<"--------4.有理数除法运算--------"<cout<<"--------5.退出运算--------------"<}
charxuan()
{
charc;
while
(1)
{
menu();
c=getch();
switch(c)
{
case'1':
add();break;
case'2':
jian();break;
case'3':
cheng();break;
case'4':
chu();break;
case'5':
;break;
}
if(c=='5')
break;
else
;
}
returnc;
}
intmain()
{
//system("color0A");
cout<<"以下有理数输出形式均为(a/b)"<rationalnumberr1(3,5),r2(2,9),r3,r4;
cout<<"r1和r2由带参数的构造函数创建"<cout<<"r1:
"<"<cout<<"r3和r4由键盘输入(请按任意键开始从键盘输入)"<getch();
cout<<"请输入r3:
";
cin>>r3;
cout<<"请输入r4:
";
cin>>r4;
cout<<"r1:
"<"<"<"<cout<<"r1:
"<"<(2)<cout<<"r2:
"<"<(2)<cout<<"r3:
"<"<(2)<cout<<"r4:
"<"<(2)<cout<<"r1+r2:
"<cout<<"r2-r3:
"<cout<<"r3*r4:
"<cout<<"r2/r4:
"<cout<<"你想做有理数的简单运算吗?
(y/n)"<charc;
while
(1)
{
c=getch();
if(c=='y')
{
c=xuan();
if(c=='5')
break;
}
elseif(c=='n')
{
break;
}
else
;
}
cout<<"已经退出运算,按任意键退出程序"<getch();
//system("cls");
cout<<"成功退出!
"<return0;
}
运行界面如下:
按任意键后出现以下界面:
输入r3的值:
这时你可以选择y或n进行选择,但注意必须是小写。
若输入的为y:
选择不同的数字依次会出现以下界面:
若输入的为n:
实验总结:
通过此次C++的课程设计,我熟练掌握了面向对象程序语言中的很多功能的实现,并且熟悉了很多调试程序的方法,懂得了处理错误的方法。
进一步掌握面向过程和面向对象程序设计的基本方法和编程技巧,巩固所学理论知识,使理论与实际相结合。
从而提高自我分析问题、解决问题的能力。
通过课程设计,在各方面的能力得到了锻炼
经历了这次课程设计,不仅对我的学习提供了帮助,而且在意志力方面也得到了锻炼。
没有足够的耐力和信心就很难坚持对课程设计每一步的顺利进行。
欢迎下载,资料仅供参考!
!
!
资料仅供参考!
!
!