版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机高级语言课 程 设 计 报 告课题名称:设计程序实现分数的运算设计时间:2013.12.30 2014.1.10学生姓名:学生学号:指导教师:完成日期:2014年1月10日管理科学学院信息与计算机科学系二一三年十二月设计程序实现分数的运算【摘要】:设计一个分数计算器实现对分数的各种运算【关键字】:分数、四则运算、连续运算、混合计算program designing about simple management system of teachers and studentsabstract:the design of afractionalcalculator to achievevar
2、ious operations onfraction。keywords: fractional、the four operations、continuous operation、hybrid computing。目录1问题描述及设计要求 11.1问题描述11.2设计要求12.系统分析(需求分析)12.1功能需求12.2性能需求23.总体设计24.详细设计2 4.1设计思路3 4.2主要函数设计45.程序代码56.程序测试177.程序使用说明208.总结21参考文献221. 问题描述及设计要求1.1问题描述:该问题就是要求学生能够设计程序实现分数的运算,包括加、减、乘、除四则运算,最后总要是能将
3、这种运算拓展到多个分数之间并实现连续运算。1.2设计要求:(1):设计合理的分数表达方式(2): 设计函数分别实现两个分数之间的加、减、乘、除运算(3):设计函数实现分数输入并计算(4):考虑将分数运算拓展到多个分数之间的运算和连续计算的情况2.系统分析(需求分析)2.1功能需求:(1):有合理的界面,用户进入后可选择需要的操作。(2):能够输入合理的分数表达式并进行常规的四则运算,还可进行必要的逻辑运算。(3):能够进行多个分数时的混合运算,并能连续计算。2.2性能需求:(1):程序有一定健壮性,出现错误是能提示相应信息给用户。(2):性能要好,可改动性要好,方便他人优化和改正,每个小功能用
4、子函数实现。(3):灵活性要好,可作为子函数融到其他程序。3.总体设计简介: 设计一个分数计算器,进行分数的算术运算和逻辑运算。在该计算器中能输入合理的分数形式,同时允许对整数这种特殊形式进行相应的输入和计算,并在程序开始前设计出相应的界面供用户选择,同时在能进行两个分数之间简单的四则运算的基础上,可以对多个分数进行混合运算(定义新函数),并且要能够承接上一个结果继续进行计算(询问用户是否继续,继续则再调用相应函数)。4.详细设计4.1设计思路:(见下流程图表示)(1):主函数控制流程图:(见下页)进入main()函数选择1、2、3做相应操作调用simple函数调用test函数调用comple
5、x函数判断是否继续进行分数操作结束yn123(2):子函数控制流程图:(以simple函数为例)输入运算符输入相应数据进入simple函数是否以该结果继续运算结束调用相应运算函数(加减乘除)yn4.2主要函数设计:fraction operator +(const fraction &lhs, const fraction &rhs);重载加法运算符+,实现两个分数相加;fraction operator -(const fraction &lhs, const fraction &rhs);重载加法运算符-,实现两个分数相减;fraction operator *(const fractio
6、n &lhs, const fraction &rhs);重载加法运算符*,实现两个分数相乘;fraction operator /(const fraction &lhs, const fraction &rhs);重载加法运算符/,实现两个分数相除;void simple();简单计算函数,通过判断运算类型,调用相应运算函数并计算;void test();测试函数,通过调用函数对输入的两个分数进行逻辑运算;void complex();混合运算函数,通过调用函数对多个分数进行混合运算;ostream& operator (istream&is, fraction &f); 输入运算符重载;
7、5.程序源代码:/* fractions class - header file-分数类头文件*/*#ifndef _tgr_fractions_h#define _tgr_fractions_h*/#include /输入输出流头文件#include /键盘和屏幕输入输出函数的头文件#include /标准库函数头文件#include /数学库函数头文件/#include #include /字符组函数头文件class fraction /分数类定义public:fraction();/constructorsfraction(intinitn, intinitd);/accessorsin
8、t numerator() const; /取分子,const成员函数,不能修改数据成员int denominator() const; /取分母double decimal() const; /将分数转换为对应的小数fraction absval() const; /分数的绝对值/modifiersvoid setnum(intnewnum); /设置分子void setden(intnewden); /设置分母void simplify(); /约分void recip(); /分子分母转置const fraction & operator+= (intrhs);private:int n
9、;int d;/free (nonmember) functions/miscellanyvoid simple(); /简单计算函数void test(); /测试函数void complex(); /混合运算函数int gcf(int x, int y); /求x,y的最大公因子/addition operatorsfraction operator+ (const fraction &lhs, const fraction &rhs);fraction operator+ (const fraction &lhs, intrhs);/subtraction operatorsfracti
10、on operator- (const fraction &lhs, const fraction &rhs);fraction operator- (const fraction &lhs, intrhs);/multiplication operatorsfraction operator* (const fraction &lhs, const fraction &rhs);fraction operator* (const fraction &lhs, intrhs);/division operatorsfraction operator/ (const fraction &lhs,
11、 const fraction &rhs);fraction operator/ (const fraction &lhs, intrhs);/power operatorfraction operator (const fraction &base, intexp); /(幂)运算符重载/comparison operatorsbool operator= (const fraction &lhs, const fraction &rhs);bool operator!= (const fraction &lhs, const fraction &rhs);bool operator= (c
12、onst fraction &lhs, const fraction &rhs);bool operator (const fraction &lhs, const fraction &rhs);bool operator= (const fraction &lhs, intrhs);bool operator (const fraction &lhs, intrhs);bool operator (const fraction &lhs, intrhs);/ i/o operators/functionsostream& operator (istream&is, fraction &f);
13、 / 输入运算符重载/*#endif*/* fraction.cppfractions class - implementation file-分数类执行文件开始*/#include fraction.hfraction:fraction() : n(0), d(1) ; /缺省构造函数(=0/1)fraction:fraction(intinitn, intinitd) : n(initn), d(initd) ;int fraction:numerator() const /取分子return n;int fraction:denominator() const /取分母return d;
14、double fraction:decimal() const /分数转换小数return double(n) / double(d);fraction fraction:absval() const /取分数绝对值fraction returnvalue(abs(n), abs(d); /通过构造函数取分母分子绝对值returnreturnvalue;void fraction:setnum(intnewnum) /设置分子的值n = newnum;void fraction:setden(intnewden) /设置分母的值if(newden != 0) /分母非零时设置d = newde
15、n;else /若分母为零,显示错误信息并退出cout 错误:除数为零!n 按任意键终止!;getch(); abort(); /退出void fraction:simplify() /分数约分int r = gcf(n, d);n /= r;d /= r;void fraction:recip() /分子分母交换int temp = n;n = d;d = temp;const fraction & fraction:operator+= (intrhs) /重载+= fraction newrhs(rhs, 1); /将作为参数的整数rhs转换为分数类的对象return (*this+ne
16、wrhs); /int gcf(int x, int y) /辗转相除求x,y的最大公约数int r = x%y;if(r=0)return y;elsereturn gcf(y, r);fraction operator+ (const fraction &lhs, const fraction &rhs) /重载+,完成两分数相加情况fraction sum; /定义分数类对象,通过两参数对象对其赋值intnewnum = (lhs.numerator() * rhs.denominator()+(rhs.numerator() * lhs.denominator();/得到相加后的分子i
17、ntnewden = (lhs.denominator() * rhs.denominator(); /得到相加后的分母sum.setnum(newnum); /设置分子sum.setden(newden); /设置分母sum.simplify(); /分数约分return sum;fraction operator+ (const fraction &lhs, intrhs) /重载+分数与整数相加 fraction newrhs(rhs, 1); /将rhs转换为分数类对象return lhs + newrhs;fraction operator- (const fraction &lhs
18、, const fraction &rhs)/重载-完成两分数相减fractionnewrhs = rhs;newrhs.setnum(-rhs.numerator(); /设置分母为其相反数return lhs + newrhs; /利用+的重载fraction operator- (const fraction &lhs, intrhs) /重载-完成分数与整数的相减fractionnewrhs(rhs, -1); return lhs + newrhs; /利用+的重载fraction operator* (const fraction &lhs, const fraction &rhs
19、) /重载*完成两分数相乘fraction product;intnewnum = lhs.numerator() * rhs.numerator(); /分子相乘intnewden = lhs.denominator() * rhs.denominator(); /分母相乘product.setnum(newnum); /设置分子product.setden(newden); /设置分母product.simplify(); /分数约分return product;fraction operator* (const fraction &lhs, intrhs) /重载*完成分数与整数的相乘
20、fraction prod(lhs.numerator() * rhs, lhs.denominator(); /通过构造函数完成赋值prod.simplify(); /分数约分return prod;fraction operator/ (const fraction &lhs, const fraction &rhs) /重载/完成两分数相除 if(rhs = 0) /若分母为零,显示错误信息并退出 cout error: division by zero attempted!n press any key to terminate;getch(); abort(); /退出 fracti
21、onnewrhs = rhs;newrhs.recip(); /将作分母的分数倒置return lhs * newrhs; /利用分数乘法fraction operator/ (const fraction &lhs, intrhs) /重载/完成分数与整数的相除 if(rhs = 0) /若分母为零,显示错误信息并退出 cout 错误:除数为零!n= (const fraction &lhs, const fraction &rhs) /重载=判断前分数是否大于等/于后分数returnlhs.decimal() = rhs.decimal();bool operator= (const fr
22、action &lhs, const fraction &rhs) /重载=判断前分数是否小于等/于后分数returnlhs.decimal() (const fraction &lhs, const fraction &rhs) /重载判断前分数是否大于/后分数returnlhs.decimal() rhs.decimal();bool operator (const fraction &lhs, const fraction &rhs) /重载判断前分数是否小于/后分数returnlhs.decimal() = (const fraction &lhs, intrhs) /重载=前分数是否
23、大于等于整数returnlhs.decimal() = rhs;bool operator= (const fraction &lhs, intrhs) /重载=前分数是否小于等于整数returnlhs.decimal() (const fraction &lhs, intrhs) /重载前分数是否大于整数returnlhs.decimal() rhs;bool operator (const fraction &lhs, intrhs) /重载前分数是否小于整数returnlhs.decimal() = rhs;ostream& operator 0 &denom 0) | (numer 0
24、 &denom 0) &f != 0) os -; /分子分母不同号就输出-if(temp.numerator() = 0 | temp.denominator() = 1)ostemp.numerator(); / 分子为0或分母为1时就输出分子elseostemp.numerator() / (istream&is, fraction &f) /is:输入流,f:待输入的分数intnewnum, newden;char slash = ;doisnewnum slash newden; / while(slash != /);f.setnum(newnum);f.setden(newden
25、);return is; /准备工作结束,下面开始主函数。void main()int choice;char cls;coutcls;if(cls=y|cls=y)system(cls); /getch();cout 欢迎使用分数计算器!n;cout n;cout n;cout 简单计算 n; cout n;cout n;cout 分数测试 n;cout n;cout n;cout 分数混合运算 n;cout n;cout n;cout n;coutchoice;if(choice6|choice1) cout输入无效,请重新选择:n; main(); /回到主菜单 else switch(
26、choice) /进入函数case 1: simple();break;case 2: test();break;case 3: complex();break; /main(); /- void simple() /简单计算函数fraction f1;fraction f2;fraction sum;charfuhao,yn;int f3,kind;choose:cout 分数与分数n;cout 分数与整数n;cout 返回n;coutkind; if(kind=1) /分数之间计算 coutf1;coutf2;coutfuhao;f1.simplify(); /分数约分f2.simplif
27、y();switch(fuhao) /进入计算case +:coutnsum=f1+f2endl;break;case -:coutnsum=f1-f2endl;break;case *:coutnsum=f1*f2endl;break;case /:coutnsum=f1/f2endl;break; else if(kind=2) /分数与整数之间运算coutf1;coutf3;coutfuhao;f1.simplify();switch(fuhao) /进入计算case +:coutnsum=f1+f3endl;break;case -:coutnsum=f1-f3endl;break;c
28、ase *:coutnsum=f1*f3endl;break;case /:coutnsum=f1/f3endl;break;/case :coutnsum= f1 f3 endl;break;else if(kind=3)main(); /返回else cout输入错误!请重新选择:n;goto choose;getch();coutendl;coutyn;if(yn=y|yn=y)simple(); else main(); /返回菜单 /- void test() /测试函数charyn;fraction f1; fraction f2; /定义两个分数f1,f2 / clrscr();
29、 /利用重载输入f1,f2cout f1;cout f2;f1.simplify();f2.simplify();cout对两分数进行+,-,*,/运算n; fraction sum = f1 + f2; fraction diff = f1 - f2;fraction prod = f1 * f2;fractionquot;if(f2 != 0)quot = f1 / f2;cout f1 + f2 = sum n;cout f1 - f2 = diff n;cout f1 * f2 = prod n;cout f1 / f2 = ;if(f2 != 0)coutquot n;elsecou
30、t 无意义!nn;cout boolean operator tests (1 = true, 0 = false)n;cout f1 = f2 : (f1 = f2) n;cout f1 != f2 : (f1 != f2) n;cout f1 = f2 : = f2) n;cout f1 = f2 : (f1 = f2) n;cout f1 f2 : f2) n;cout f1 f2 : (f1 f2) nn;cout分数测试完毕!n;getch(); /return 0;coutendl;coutyn;if(yn=y|yn=y)test();else main(); /- void co
31、mplex() /混合运算函数fraction f1;fraction f2;fraction sum;char op1,op,yn; /sum.fraction();f2.fraction(); op1= ;coutf1op;while(op!=#) cinf2;switch(op) case +:case -:switch(op1) case :sum=f1;break;case +:sum=sum+f1;break;case -:sum=sum-f1;break; op1=op;f1=f2;break;case *:f1=f1*f2;break;case /:if(f2!=0)f1=f1
32、/f2;break; elsecout除数为零!n;goto end;default:coutop; switch(op1)case :sum=f1;break;case +:sum=sum+f1;break;case -:sum=sum-f1;break; cout=sumn;end:;coutendl;coutyn;if(yn=y|yn=y) complex();elsegetch();main(); 6.程序测试:调试部分:(1):刚开始编写gcd()函数时,未保存最大公约数的值,导致分数的化简结果错误,后来保存了最大公约数的值以后成功解决;(2):重载输入输出流时未加引用,导致输入输出
33、结果错误,加了引用以后成功解决;(3):刚开始包含的头文件是#include,using namespace std;导致结果错误,改成#include,并去掉using namespace std后成功解决;测试部分:(分别测试该计算器每一部分的功能) (1):简单计算:(以2/3*4/5为例) 进入界面;(图见下页);选择简单计算,并选择分数与分数的计算,输入2/3与4/5;输入运算符*,然后求得结果8/15;并询问是否继续运算;(2):分数测试:(以2/3和4/5为例):进入界面选择分数测试,并输入测试分数;测试完毕并输出结果;(0为假,1为真);并询问是否继续;(3):分数混合运算:这里以1/2+2/3*3/4-4/5/4/5为例,包含了加减乘除四则运算,(图见下页); 进入界面选择分数混合运算,输入上式以#结束回车即可输出正确答案0;并会询问是否继续;7.程序使用说明:当用户运行程序过后,首先要在界面中选择需要进行的运算,共有三项选择:(1):简单计算;(2):分数测试;(3):分
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二四年度居间智能家居项目合同
- 二零二四年度货运代理服务合同要点3篇
- 食堂炊事员聘用合同范本
- 2024版体育场馆设施建设合同2篇
- 二零二四年度物流行业信息系统集成合同3篇
- 年度工程监理合同范本(2024版)
- 煤矿合作协议合同范本完整版
- 二零二四年度工程款项第三方支付托管服务合同
- 公司搬家合同协议书范本2篇
- 2024年度钢管出口贸易与运输承包合同2篇
- (2024版)小学语文新课标解读:更加注重阅读与写作
- 华为信用管理手册
- 薄壁注塑工艺
- 校园踩踏安全教育课件
- 农业风险识别及防范措施
- 专业群建设总结汇报
- 思科网络设备模拟器Packet-Tracer使用教程
- 五社联动培训课件
- 《数学分析》课件
- 精装修成品保护
- 山东省青岛实验学校2023-2024学年七年级上学期期末数学试题
评论
0/150
提交评论