有理数运算器的设计.docx
- 文档编号:4768292
- 上传时间:2022-12-08
- 格式:DOCX
- 页数:21
- 大小:112.17KB
有理数运算器的设计.docx
《有理数运算器的设计.docx》由会员分享,可在线阅读,更多相关《有理数运算器的设计.docx(21页珍藏版)》请在冰豆网上搜索。
有理数运算器的设计
《C++程序设计》
课程设计说明书
题目
有理数运算器的设计
学号
1267159206
姓名
张燕斌
指导教师
兰孝文
日期
2013.7.3
第1章需求分析
当今社会是信息社会,科技经济高速发展的社会,为了更方便人们的工作生活和加速人们处理信息的速度,计算器应运而生。
由于它体积小巧,携带方便,价格便宜,构造简单等诸多的优点成为人们生活的必备品。
因此此次课程设计我们小组选择了计算器类的设计与使用,它能即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。
在本次的课程设计中,系统开发平台为WindowsXP,程序设计语言采用VisualC++6.0。
本计算器类的设计实现了加、减、乘、除、取余、乘方的计算功能,以及可以进行括号内的运算,每次可运算多个表达式。
设计过程中表达式解析通过计算器类完成,调用按计算优先级排好的各种函数,每种函数处理同一优先级的运算。
设计界面简洁,美观,实用。
(1)输入输入有理数的分子和分母构造有理数。
(2)重载运算符“+”“-”“*”“/”“=”进行有理数的加减乘除和赋值运算,运算后化简有理数,如1/6+1/12=3/12需要将3/12化简为1/4。
(3)输出。
重载“<<”运算符输出有理数。
第2章总体设计
第3章类的设计
3.1rational类的设计
Classrational{
public:
voidprint();//输出函数
rational(intx=0,inty=0);//构造函数
virtual~rational();//析构函数释放内存
friendrationaloperator+(rationalnum1,rationalnum2);//友员函数重载运算符+
friendrationaloperator-(rationalnum1,rationalnum2);//友员函数重载运算符-
friendrationaloperator*(rationalnum1,rationalnum2);//友员函数重载运算符*
friendrationaloperator/(rationalnum1,rationalnum2);//友员函数重载运算符/
private:
voidoptimization();//优化有理数函数
intdenominator;//分母
intnumerator;//分子
};
第4章详细设计
4.1工程视图
4.2类图视图
4.3函数的调用关系
如下图:
4.4主程序流程图
4.5主要算法的流程图
对有理数类进行的操作有下面几种:
有理数相加:
当两个有理数a/b和c/d相加时,可得到这样的算式:
a/b+c/d=(a*d+b*c)/(b*d)
有理数相减:
当两个有理数a/b和c/d相减时,得到的结果是:
分子:
a*d-b*c
分母:
b*d
有理数相乘:
当两个有理数a/b和c/d相乘时,得到的结果是:
分子:
a*c
分母:
b*d
有理数相除:
当两个有理数a/b和c/d相除时,得到的结果是:
分子:
a*d
分母:
b*c
每次得到结果时,都需要对有理数进行优化。
/*****************************************************************************/
/*
函数名称:
operator+
功能描述:
重载运算符+
修改记录:
*/
rationaloperator+(rationalnum1,rationalnum2)
{
rationaltemp;
temp.denominator=num1.denominator*num2.denominator;
temp.numerator=num1.numerator*num2.denominator+num1.denominator*num2.numerator;
temp.optimization();
returntemp;
}
/*****************************************************************************/
/*
函数名称:
operator-
功能描述:
重载运算符-
修改记录:
*/
rationaloperator-(rationalnum1,rationalnum2)
{
rationaltemp;
temp.denominator=num1.denominator*num2.denominator;
temp.numerator=num1.numerator*num2.denominator-num1.denominator*num2.numerator;
temp.optimization();
returntemp;
}
/*****************************************************************************/
/*
函数名称:
operator*
功能描述:
重载运算符*
修改记录:
*/
rationaloperator*(rationalnum1,rationalnum2)
{
rationaltemp;
temp.denominator=num1.denominator*num2.denominator;
temp.numerator=num1.numerator*num2.numerator;
temp.optimization();
returntemp;
}
/*****************************************************************************/
/*
函数名称:
operator/
功能描述:
重载运算符/
修改记录:
*/
rationaloperator/(rationalnum1,rationalnum2)
{
rationaltemp;
temp.denominator=num1.denominator*num2.numerator;
temp.numerator=num1.numerator*num2.denominator;
temp.optimization();
returntemp;
}
/*****************************************************************************/
/*
函数名称:
optimization
功能描述:
定义有理数优化函数
修改记录:
*/
voidrational:
:
optimization()
{
intgcd;
if(numerator==0)//如果分子为零,则分母为1后返回
{
denominator=1;
return;
}
//取分子分母中较小的数作为公约数极限
gcd=(abs(numerator)>abs(denominator))?
abs(numerator):
abs(denominator);//abs求绝对值
if(gcd==0)
return;//若为0,则返回
for(inti=gcd;i>1;i--)//用循环找最大公约数
if((numerator%i==0)&&(denominator%i==0))
break;
numerator/=i;//i为最大公约数,将分子分母整除它,重新赋值
denominator/=i;
//若分子分母均为负数,则结果为正
if(numerator<0&&denominator<0)
{
numerator=-numerator;
denominator=-denominator;
}
//若分子分母只有一个为负数,则调整为分子取负,分母取正
elseif(numerator<0||denominator<0)
{
numerator=-abs(numerator);
denominator=abs(denominator);
}
}
第5章测试
程序的运行结果截图。
图1:
登陆界面
图2:
运算符选择界面
图3:
举例除法运算
图4:
退出界面
第6章总结
在学习了C++面向对象程序设计的前提下来进行实训,首先巩固了C++课程所学的基础知识,掌握了类的定义及模块的封装等,本次课程设计我们小组最大的特色是采用递归下降流式处理计算。
本次实训最大的收获就是真正理解了数据结构中的表达式求值解析处理在用C++程序实现时是如何处理的。
在C++实训过程中进一步巩固和学习了数据结构中的表达式求值,知道了函数递归的作用,成功的运用了C++语言编程将其实现。
经过几天的实训,我们学到了很多,或许我们的程序不是最好的,但是我们是尽了最大的努力自己动手写出来的,当然在写的过程中出现了不少困难,遇到问题后我们努力的查资料,积极思考,不理解的地方问老师,最终绘成了这个大程序。
通过这次实训我们知道了团队合作的重要性,虽然实训过程中我们有苦,有汗,有泪,但这几天我们很充实,当程序运行成功后大家都欣慰的笑了。
在以后的学习中我们会更加努力,真正把书本知识与实践联系起来,加强动手能力,完善这次程序中所出现的不足之处,比如在处理乘方运算时所存在的漏洞以及程序排错存在的缺陷.另外,我们这个程序与生活中的科学计算器所具有的功能还相差甚远,在以后,一定实现没有实现的功能,并且尽最大努力开拓创新。
最后,感谢兰老师在这次实训期间给予我们精心的指导,让我们受益匪浅。
附录:
程序代码
classrational
{
public:
voidprint();//输出函数
rational(intx=0,inty=0);
virtual~rational();
friendrationaloperator+(rationalnum1,rationalnum2);//重载运算符+
friendrationaloperator-(rationalnum1,rationalnum2);//重载运算符-
friendrationaloperator*(rationalnum1,rationalnum2);//重载运算符*
friendrationaloperator/(rationalnum1,rationalnum2);//重载运算符/
private:
voidoptimization();//优化有理数函数
intdenominator;//分母
intnumerator;//分子
};
#include
#include
voidjiemian();
voidtuichu();
voidrationalcompute();
voiddenglu();
intmain()
{
jiemian();
return0;
}
voidjiemian()
{
inti;
denglu();
cout< while(i) { cout< cout<<"简单的有理数计算器"< cout<<"1.有理数计算;"< cout<<"0.退出;"< cout<<"请选择按键: "; cin>>i; cout< system("CLS"); //判断输入,0退出 if(i>=0&&i<=1) { switch(i) { case1: rationalcompute(); break; case0: tuichu(); break; } } else { cout<<"输入错误! "; cout<<"重新输入"< } } } voidtuichu() { cout<<"----------------------------------------------------------------"< cout<<"**"< cout<<"*谢谢使用运算符重载实现特殊计算器程序,再见! *"< cout<<"**"< cout<<"----------------------------------------------------------------"< } voiddenglu() { cout<<"----------------------------------------------------------------"< cout<<"**"< cout<<"*欢迎进入用运算符重载实现特殊计算器程序*"< cout<<"**"< cout<<"----------------------------------------------------------------"< } voidrationalcompute() { intj; chart; system("CLS"); cout<<"请选择您的有理数计算内容: "< cout<<"1.两个有理数相加;"< cout<<"2.两个有理数相减;"< cout<<"3.两个有理数相乘;"< cout<<"4.两个有理数相除;"< cout<<"0.返回主界面;"< cout<<"请选择按键(0-4): "; cin>>j; cout< system("CLS"); while(j) { if(j>=0&&j<=4) { intr1,j1,r2,j2; cout<<"请输入第一个有理数的分子: "; cin>>r1; cout<<"请输入第一个有理数的分母: "; cin>>j1; cout<<"请输入第二个有理数的分子: "; cin>>r2; cout<<"请输入第二个有理数的分母: "; cin>>j2; rationalc1(r1,j1); rationalc2(r2,j2); rationalc3; switch(j) { case1: c3=c1+c2; c3.print(); cin>>t; break; case2: c3=c1-c2; c3.print(); cin>>t; break; case3: c3=c1*c2; c3.print(); cin>>t; break; case4: c3=c1/c2; c3.print(); cin>>t; break; } system("CLS"); } else cout<<"按键错误,请重新选择! "< cout< cout<<"请选择您的有理数计算内容: "< cout<<"1.两个有理数相加;"< cout<<"2.两个有理数相减;"< cout<<"3.两个有理数相乘;"< cout<<"4.两个有理数相除;"< cout<<"0.返回主界面;"< cout<<"请选择按键(0-4): "; cin>>j; cout< system("CLS"); } } #include #include rational: : rational(intx,inty) { numerator=x; denominator=y; optimization();//有理数优化 } rational: : ~rational()//释放内存 { } voidrational: : print() { cout<<"\n\n"<<"运算结果是: "< if(numerator! =0&&denominator! =1) cout<<"/"< else cout<<"\n\n"; cout<<"请按任意键继续........."< } rationaloperator+(rationalnum1,rationalnum2) { rationaltemp; temp.denominator=num1.denominator*num2.denominator; temp.numerator=num1.numerator*num2.denominator+num1.denominator*num2.numerator; temp.optimization(); returntemp; } rationaloperator-(rationalnum1,rationalnum2) { rationaltemp; temp.denominator=num1.denominator*num2.denominator; temp.numerator=num1.numerator*num2.denominator-num1.denominator*num2.numerator; temp.optimization(); returntemp; } rationaloperator*(rationalnum1,rationalnum2) { rationaltemp; temp.denominator=num1.denominator*num2.denominator; temp.numerator=num1.numerator*num2.numerator; temp.optimization(); returntemp; } rationaloperator/(rationalnum1,rationalnum2) { rationaltemp; temp.denominator=num1.denominator*num2.numerator; temp.numerator=num1.numerator*num2.denominator; temp.optimization(); returntemp; } voidrational: : optimization() { intgcd; if(numerator==0)//如果分子为零,则分母为1后返回 { denominator=1; return; } gcd=(abs(numerator)>abs(denominator))? abs(numerator): abs(denominator);//abs求绝对值 if(gcd==0) return;//若为0,则返回 for(inti=gcd;i>1;i--)//用循环找最大公约数 if((numerator%i==0)&&(denominator%i==0)) break; numerator/=i;//i为最大公约数,将分子分母整除它,重新赋值 denominator/=i; //若分子分母均为负数,则结果为正 if(numerator<0&&denominator<0) { numerator=-numerator; denominator=-denominator; } //若分子分母只有一个为负数,则调整为分子取负,分母取正 elseif(numerator<0||denominator<0) { numerator=-abs(numerator); denominator=abs(denominator); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 有理数 运算器 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)