C++求解有理方程课设.docx
《C++求解有理方程课设.docx》由会员分享,可在线阅读,更多相关《C++求解有理方程课设.docx(17页珍藏版)》请在冰点文库上搜索。
C++求解有理方程课设
课程设计(论文)任务书
学 院 专 业2012-1 班
一、课程设计(论文)题目:
求解有理数分式方程
二、课程设计(论文)工作自2012年6月4日起至2012年6月7日止
三、课程设计(论文)地点:
科技楼
四、课程设计(论文)内容要求:
1.本课程设计的目的
(1)掌握C++语言的程序设计方法;
(2)理论联系实际,进一步提高学生的软件开发技术;
(3)培养学生分析、解决问题的能力;
(4)提高学生实践论文撰写能力。
2.课程设计的任务及要求
1)基本要求:
(1)对系统所需完成的功能分析;
(2)使用VisualC++编译器进行程序编译;
(3)提出系统的设计方案;
(4)对所设计源程序进行调试。
2)创新要求
在基本要求达到后,可进行创新设计。
3)课程设计论文编写要求
(1)理论设计部分以课程设计论文的形式提交,格式必须按照课程设计论文标准
格式进行书写和装订。
(2)课程设计报告(论文)包括设计任务分析(包括设计任务书、设计运行环境、同组人员及分工等)、系统总框图、每个模块的设计分析、列出所有定义的函数及说明、存在的问题与不足及对策、附上程序源代码。
(3)用A4纸打印出文档(附上源代码),封面到教务处购买;所写的有效代码不得少于50行;17周上机检查程序并上交设计报告。
4)课程设计评分标准:
(1)学习态度:
20分;
(2)回答问题及系统演示:
30分
(3)课程设计报告书论文质量:
50分。
成绩评定实行优秀、良好、中等、及格和不及格五个等级。
不及格者需重做。
5)参考文献:
(1)谢昕等编著,《C++程序设计》第二版,北京邮电大学出版社
(2)吕凤翥.C++语言基础教程[M].清华大学出版社.2007.2
(3)谭浩强编,《C++面向对象程序设计》,清华大学出版社,2005年7月出版
6)课程设计进度安排
1.准备阶段(4学时):
选择设计题目、了解设计目的要求、查阅相关资料。
2.程序模块设计分析阶段(4学时):
程序总体设计、详细设计。
3.代码编写调试阶段(8学时):
程序模块代码编写、调试、测试。
4.撰写论文阶段(4学时):
总结课程设计任务和设计内容,撰写课程设计论文。
7)课程设计题目具体要求:
1.有理数就是两个整数的比率,通常表示为a/b。
其中a称为分子,b称为分母,分母不能为O。
2.开发Rational类的目标就是创建一种类型,该类型的对象要像使用基本类型定义的对象那样,让人感到自然。
学生签名:
2012年6月7日
课程设计(论文)评审意见
(1)考勤(10分):
优( )、良( )、中( )、一般( )、差( );
(2)系统设计(20分):
优()、良( )、中( )、一般( )、差( );
(3)编程调试(10分):
优( )、良( )、中( )、一般( )、差( );
(4)回答问题(15分):
优( )、良( )、中( )、一般( )、差( );
(5)论文撰写(35分):
优( )、良( )、中( )、一般( )、差( );
(6)创新思想(10分):
优( )、良( )、中( )、一般( )、差( );
综合评定等级:
评阅人:
职称:
年月日
目 录
第1章设计任务分析1
第2章功能实现详细设计3
第3章设计和调试分析7
第4章源代码10
第5章小结18
参考文献18
第1章设计任务分析
有理数就是两个整数的比率,通常表示为
,分母
不能为0。
本设计要求设计一个Rational(有理数)类,实现有理数的四则运算,该类型的对象使用起来要像使用基本类型的对象一样自然。
具体要求如下:
(1)抽象Ration类,包含两个数据成员(分子、分母),比如有理数
可以用对象
表示为
。
(2)如果分子分母有公约数,应该约分,例如
应表示为
。
根据需要,有时要将
表示为
,或者将
表示为
(3)重载相应的运算符(输入、输出、加、减、乘、除)。
比如,要计算
,希望像普通加法一样操作,
和
相加得
,算数表达式为
。
又如,想使用如下形式直接输入分子分母
cin<//输入
cout>>r;
//输出
则需要重载这两个流运算符。
1、构造函数
构造函数的设计应能满足如下方式创建对象:
rationalr(5L);//5/1
rationalp;//0/1
rationals(2,3);//2/3
rationalq(5,-6);//-5/6
rationalq(.5);//1/2
r(5L)和q(.5)调用不同的构造函数,所以需要使用L
(1)来区分。
前者表示参数是整型数组,.5为double型数据。
使用默认参数的原型如下所示:
rationalr1,r2(5L),r3(4,8),r4(.75);
不允许分母为零。
调用Standardize()私有成员函数,使其对“-”号的表达统一。
如果输入的有理数有公约数,则进行化简。
gcd()成员函数用来求公约数,它被Reduce()函数调用,完成化简任务。
2、重载“/”运算符
与构造函数同理,得到结果之后,调用Standardize()和Reduce()函数。
其他运算不需要调用Standardize()函数,根据计算公式很容易写出。
3、重载流运算符
输入输出就是按格式构造输出,很简单。
输入流需要保证正确的格式。
首先保证分母不等于零;然后调用Standardize()和Reduce()函数调整格式。
第2章功能实现详细设计
//rational.cpp
#include"rational.h"
voidmain(){
cout<<"一、有理数的转换及四则运算"<rationalr1,r2(5L),r3(4,8),r4(.75);
cout<<"已知:
"<<"r1="<cout<<"进行如下的简单四则运算:
"<cout<<"1、r5=r1+r2-r3+r4=";
rationalr5=r1+r2-r3+r4;
cout<cout<<"2、-r5="<<-r5<cout<<"3、r6=r1+r2*r3-r4+r2/r4="<cout<<"二、以带分数形式输出有理数"<cout<<"1、r5=";
PrintMixedNumber(r5);
cout<cout<<"2、-r5=";
PrintMixedNumber(-r5);
cout<cout<<"三、动态分数与小数的转化运算"<floatf;
cout<<"已知r5="<cout<cout<<"请输入一个分数:
";
cin>>r1;
f=float(r1);
cout<<"等效的小形式数为:
"<cout<<"请输入一个浮点数:
";
cin>>f;
r1=f;
cout<<"转化为分数形式为:
"<cout<<"四、有理分数的化简"<cout<<"请输入一个能够化简的分式:
";
cin>>r1;
cout<<"化简后:
";
cout<cout<<"五、比较两个分数的大小"<rationalr7,r8;
cout<<"请输入两个分数:
"<cin>>r7>>r8;
cout<<"结果为:
";
if(r7>r8)cout<"<if(r7==r8)cout<if(r7}
第3章设计和调试分析
1、第一次测试得到:
2、第二次测试得到:
第4章源代码
#if!
defined(RATIONAL_H)
#defineRATIONAL_H
#include
#include
usingnamespacestd;
namespacestd{
classRational
{
private:
longnum,den;//供有理数成员函数自己使用的私有成员函数
voidStandardize(void);//标准化,使其对”-“号的表达式统一
longgcd(longm,longn)const;//简化,如果输入的有理数是公约数
public:
//用于整数->有理数、实数->有理数的构造函数
Rational(longp=0,longq=1);
Rational(doublex);//重载输入/输出流运算符
friendistream&operator>>(istream&istr,Rational&x);
friendostream&operator<<(ostream&ostr,constRational&x);//双目运算符
Rationaloperator+(Rational&x)const;
Rationaloperator-(Rational&x)const;
Rationaloperator*(Rational&x)const;
Rationaloperator/(Rational&x)const;
//单目运算符
Rationaloperator-(void)const;
//关系运算符
intoperator<(Rational&x)const;
intoperator<=(Rational&x)const;
intoperator==(Rational&x)const;
intoperator!
=(Rational&x)const;
intoperator>(Rational&x)const;
intoperator>=(Rational&x)const;
//转换运算符:
有理数->实数
operatordouble(void)const;
//例程
intGetNumerator(void)const{returnnum;}
intGetDenominator(void)const{returnden;}
//化简有理数
voidReduce(void);
};
Rational:
:
Rational(longp,longq):
num(p),den(q)
{
if(den==0)
{
cerr<<"AZerodenominatorisinvalid"<exit
(1);
}
Standardize();
Rational;
}
Rational:
:
Rational(doublex)
{
doubleval1,val2;
val1=100000000L*x;
val2=10000000L*x;
num=long(val1-val2);
den=90000000L;
//Standardize();
Rational();
}
voidRational:
:
Standardize(void)
{
if(den<0)
{
num=-num;
den=-den;
}
}
longRational:
:
gcd(longm,longn)const
{
staticlongx;
if(m>n)
{
if(n==0)x=m;
elsegcd(n,m%n);
}
else
{
if(m==0)x=n;
elsegcd(m,n%m);
}
returnx;
}
istream&operator>>(istream&istr,Rational&x)
{
charc;
istr>>x.num>>c>>x.den;
if(x.den==0)
{
cerr<<"AZerodenominatorisinvalid"<exit
(1);
}
x.Standardize();
x.Reduce();
returnistr;
}
ostream&operator<<(ostream&ostr,constRational&x)
{
ostr<returnostr;
}
RationalRational:
:
operator+(Rational&x)const
{
Rationaltemp=Rational(num*x.den+den*x.num,den*x.den);
temp.Reduce();
returntemp;
}
RationalRational:
:
operator-(Rational&x)const
{
Rationaltemp=Rational(num*x.den-den*x.num,den*x.den);
temp.Reduce();
returntemp;
}
RationalRational:
:
operator*(Rational&x)const
{
Rationaltemp=Rational(num*x.num,den*x.den);
temp.Standardize();
temp.Reduce();
returntemp;
}
RationalRational:
:
operator/(Rational&x)const
{
Rationaltemp=Rational(num*x.den,den*x.num);
temp.Standardize();
temp.Reduce();
returntemp;
}
RationalRational:
:
operator-(void)const
{
returnRational(-num,den);
}
intRational:
:
operator<(Rational&x)const
{
return(num*x.den}
intRational:
:
operator<=(Rational&x)const
{
return(num*x.den<=den*x.num);
}
intRational:
:
operator==(Rational&x)const
{
return(num*x.den==den*x.num);
}
intRational:
:
operator!
=(Rational&x)const
{
return(num*x.den!
=den*x.num);
}
intRational:
:
operator>(Rational&x)const
{
return(num*x.den>den*x.num);
}
intRational:
:
operator>=(Rational&x)const
{
return(num*x.den>=den*x.num);
}
Rational:
:
operatordouble(void)const
{
returndouble(num)/den;
}
voidRational:
:
Reduce(void)
{
longbigdivisor,tempnumerator;
tempnumerator=(num<0)?
-num:
num;
if(num==0)
den=1;
else
{
bigdivisor=gcd(tempnumerator,den);
if(bigdivisor>1)
{
num/=bigdivisor;
den/=bigdivisor;
}
}
}
/*****************************************
*以带分数形式输出有理数的处理函数
*****************************************/
voidPrintMixedNumber(Rationalx)
{
longwholepart=long(x.GetNumerator()/x.GetDenominator());
Rationalfractionpart=x-Rational(wholepart);
if(fractionpart==Rational(0L))
cout<else
{
fractionpart.Reduce();
if(wholepart<0)
fractionpart=-fractionpart;
if(wholepart!
=0)
cout<else
cout<}#endif
//rational.cpp
#include"rational.h"
voidmain(){
cout<<"一、有理数的转换及四则运算"<rationalr1,r2(5L),r3(4,8),r4(.75);
cout<<"已知:
"<<"r1="<cout<<"进行如下的简单四则运算:
"<cout<<"1、r5=r1+r2-r3+r4=";
rationalr5=r1+r2-r3+r4;
cout<cout<<"2、-r5="<<-r5<cout<<"3、r6=r1+r2*r3-r4+r2/r4="<cout<<"二、以带分数形式输出有理数"<cout<<"1、r5=";
PrintMixedNumber(r5);
cout<cout<<"2、-r5=";
PrintMixedNumber(-r5);
cout<cout<<"三、动态分数与小数的转化运算"<floatf;
cout<<"已知r5="<cout<cout<<"请输入一个分数:
";
cin>>r1;
f=float(r1);
cout<<"等效的小形式数为:
"<cout<<"请输入一个浮点数:
";
cin>>f;
r1=f;
cout<<"转化为分数形式为:
"<cout<<"四、有理分数的化简"<cout<<"请输入一个能够化简的分式:
";
cin>>r1;
cout<<"化简后:
";
cout<cout<<"五、比较两个分数的大小"<rationalr7,r8;
cout<<"请输入两个分数:
"<cin>>r7>>r8;
cout<<"结果为:
";
if(r7>r8)cout<"<if(r7==r8)cout<if(r7}
第5章小结
感想:
对C++语言的学习已经结束,我认为C++作为一种强大的编程语言在很多方面拥有优势。
C++程序作为面向对象语言的鼻祖,比其他后续发展的面向对象编程语言更简洁。
这就使得C++程序的执行效率更高,对内存的要求相对较低。
通过使用C++语言实现“职工信息表”使我深刻认识到C++语言的实现机制相比C语言要更见简洁、强大。
并且对于“面相对象程序设计是结构化的结构化程序设计”这句话有了深刻体会。
我认为,学习任何一门编程语言,实践是最重要的。
虽然理解了程序,但如果不上机,不将代码一一键入,要真正精通编程会很困难。
只有不断的上机摸索,增加自己对程序的印象及理解,才可能学好编程语言。
致谢:
感谢黎海生老师在此次课程设计中给予的指导和提示,是我们在完成课设的过程中达到很大点拨,同时也是因为日常课堂上老师的悉心教导和详细讲解,才是我们对这门语言有了深刻认识和兴趣,我们会把这份热情坚持下去,深入的学习更多有关知识,提高自己。
设计总结:
在设计过程中,我一直努力贴近实际并向使用性更强的方向靠拢,经过努力,也得到了一些效果,界面的简洁设计会更人性化,应用起来也很方便快捷,在设计过程中遇到的问题通过与同组人员的讨论和请教老师也都得到了解决。
程序不足及升级方向:
这个程序的设计涉及的知识较多,测试工作量也比较大。
要求设计好测试用例,编写合适的测试程序进行测试,以上我编的测试程序可能也不是十分全面。
需要进一步努力和更深入的考虑。
程序编写上有些地方还可以使用菜单程序,使得使程序的灵活性和可操作性更大、更广。
参考文献:
(1)谢昕等编著,《C++程序设计》第二版,北京邮电大学出版社
(2)吕凤翥.C++语言基础教程[M].清华大学出版社.2007.2
(3)谭浩强编,《C++面向对象程序设计》,清华大学出版社,2005年7月出版
小组分工
小组成员有:
XX,XX,XX(人员排名不分先后)
XX,XX主要负责的头文件;
XX主要负责主程序;
我们三个人都不仅做了自己一部分,而且都参与整个程序的设计,应该说,每个部分都是我们三个人的成果