资源描述
课 程 设 计 报 告
课程名称 算法与程序设计
课题名称 分数计算器设计
专 业 信息与计算科学
班 级 1601班
学 号 14 28
姓 名 王世成 许依哲
指导教师 王祝君、赵钍焱
2018年 01 月 04日
湖 南 工 程 学 院
课 程 设 计 任 务 书
课程名称 算法与程序设计
课 题 分数计算器设计
专业班级 信息与计算科学1601班
学生姓名 王世成 许依哲
学 号 14 28
指导老师 王祝君、赵钍焱
审 批
任务书下达日期 2017 年 12 月 18日
任务完成日期 2018 年 01 月 04日
一.设计要求:
1、问题描述
定义一个整数类。
定义一个分数类,由整数类派生。能对分数进行各种计算和输入/输出。
2、功能要求
(1)定义整数类和分数类。其中,包括构造函数、析构函数、显示函数等。
(2)输入/输出:对流提取和流插入运算符进行重载。
(3)计算功能:可进行分数的加、减、乘和除法运算。
(4)化简功能:将分数化简为最简分数。
(5)异常处理功能:分数中分母不能为零。
(6)菜单功能:每种功能的操作都是在菜单中进行相应选择。
3、问题的解决方案
根据系统功能要求,可以将问题解决分为以下步骤:
应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;
(2)分析系统中的各个实体及它们之间的关系;
(3)根据问题描述,设计系统的类层次;
(4)完成类层次中各个类的描述;
(5)完成类中各个成员函数的定义;
(6)完成系统的应用模块;
(7)功能调试;
(8)完成系统总结报告。
l 前言
在网站上找了一个源代码对它进行了分析,我们一起读懂这个程序在这个过程当中碰到我不懂的和他不懂的地方,但是经过两个人的合作最终把程序全部都读懂了,如由开始的定义整数类,不清楚为什么要定义两个,后来慢慢看下去之后就知道了,因为这个要由整数类派生出分数类,在后面也碰到王看不懂的地方如约分,经过我给他举实例然后再通过用程序代码打上去,慢慢就对这个分数计算器的计算功能全部了解了,包括后面的层次图,我通过上网百度层次图的结构,他则对整个程序进行分析,从整个层面上看。
拿到这个课题之后我们一起查找资料,源代码有很多不理解的地方,我们一起学习,一点点的理解。还有层次图的设计,系统的调试,分析,一个个过程慢慢摸索,两个人互相帮助下,完成了这个课题。系统调试过程出现一些问题,后来经过询问来老师,上网搜索的方法纠正了错误,让程序顺利进行。
目录
(一)需求分析 6
(二)总体设计 6
(三)详细设计 7
(四)系统调试 8
(六)使用说明及编程体会 10
(七)关键源程序(带注释) 10
二、设计内容
(一)需求分析
系统设计目的与意义:
制作一个分数计算器,以完成分数与分数,整数与分数之间的四则运算,以及分数的化简,并对分数进行输入/输出。
(二)总体设计
系统功能分析;
(1)定义整数类和分数类。其中,包括构造函数、析构函数、显示函数等。
(2)输入/输出:对流提取和流插入运算符进行重载。
(3)计算功能:可进行分数的加、减、乘和除法运算。
(4)化简功能:将分数化简为最简分数。
(5)异常处理功能:分数中分母不能为零。
(6)菜单功能:每种功能的操作都是在菜单中进行相应选择。
系统功能模块划分与设计(系统功能模块图):
头文件
声明派生类
声明整数类
成员函数定义
主函数
定义成员函数
定义类的对象
(三)详细设计
类层次图
加法运算
分数类
乘法运算
约分
整数类
除法运算
除法运算
减法运算
乘法运算
减法运算
加法运算
(四)系统调试
系统主界面
进行分数与整数运算调试
进行分数约分调试
进行分数与分数运算调试
退出调试
进行分母为0的调试
(六)使用说明及编程体会
按照屏幕上的提示进行操作,输入整数与分数,其次按照页面弹出来的文字进行分数与分数的四则运算或者整数与分数的四则运算,在调试的过程中我们忽略了这是由多个文件合并而来的大文件,之间合并在一起去操作,导致怎么运行都是出现一个错误,最后拆分开来就调试成功了,包括后面的处理整个过程真的有点麻烦,最后还是坚持下来了,觉得挺好的,当然完成这个课设也让我们再次感觉到这么学科的好处以及学习的乐趣
(七)关键源程序(带注释)
//分数计算器h.h:
#include<iostream.h>
class Integer //整数类
{
protected:
int fz;
int fm;
public:
Integer(int a=0,int b=1):fz(a),fm(b){}
~Integer(){}
void display();
};
class Fraction:public Integer //分数类,进行计算和输入输出
{
public:
Fraction(int a=0,int b=1):Integer(a,b){}
friend istream & operator>>(istream & ,Fraction & ); //重载输入流
friend ostream & operator<<(ostream & ,Fraction & ); //重载输出流
Fraction operator+(Fraction &c); //重载+运算符(分数与分数)
Fraction operator+(int n); //重载+运算符(整数与分数)
Fraction operator-(Fraction &c); //重载-运算符(分数与分数)
Fraction operator-(int n); //重载-运算符(整数与分数)
friend Fraction operator-(int n,Fraction &c);
Fraction operator*(Fraction &c); //重载*运算符(分数与分数)
Fraction operator*(int n); //重载*运算符(整数与分数)
Fraction operator/(Fraction &c); //重载/运算符(分数与分数)
Fraction operator/(int n); //重载/运算符(整数与分数)
friend Fraction operator/(int n,Fraction &c);
Fraction predigest(); //约分函数
void display();
};
//实现函数(分数计算器设计)
#include<iostream.h>
//#include"分数计算器h.h"
void Integer::display ()
{
cout<<endl;
cout<<" ------------------分数计算器-----------------"<<endl<<endl;
cout<<" 请选择功能: "<<endl;
cout<<" 1 分数与整数的四则运算。 "<<endl<<endl;
cout<<" 2 整数与分数的四则运算。 "<<endl<<endl;
cout<<" 3 分数与分数的四则运算。 "<<endl<<endl;
cout<<" 0 输入0退出。 "<<endl<<endl;
}
Fraction Fraction::predigest()//定义约分函数
{
int n,d,t,sign=1;
Fraction temp;
if(fz<0 && fm<0)
{
fz=-fz;
fm=-fm;
}
if(fz>0 && fm<0)
{
fm=-fm;
sign=-1;
}
if(fz<0 && fm>0)
{
fz=-fz;
sign=-1;
}
n=fz;
d=fm;
int r;
if(n<d) //辗转相除,求分子n与分母d的最大公约数
{t=n;n=d;d=t;}
r=n%d;
while(r!=0)
{
n=d;
d=r; //d为最大公约数
r=n%d;
}
temp.fz=sign*(fz/d);
temp.fm=fm/d;
return temp;
}
Fraction Fraction::operator+(Fraction &c)//重载两个分数的加法运算符
{
Fraction temp;
temp.fz=fz*c.fm+fm*c.fz;
temp.fm=fm*c.fm;
return temp;
}
Fraction Fraction::operator+(int n)//重载分数和整数的加法运算
{
Fraction temp;
temp.fz=fm*n+fz;
temp.fm=fm;
return temp;
}
Fraction operator-(int n,Fraction &c)
{
Fraction temp;
temp.fz=c.fm*n-c.fz ;
temp.fm=c.fm;
return temp;
}
Fraction Fraction::operator-(int n) //重载分数减整数的减法运算符
{
Fraction temp;
temp.fz=fz-fm*n;
temp.fm=fm;
return temp;
}
Fraction Fraction::operator-(Fraction &c) //重载两个分数的减法运算符
{
Fraction temp ;
temp.fz =fz*c.fm -fm*c.fz;
temp.fm =fm*c.fm;
return temp;
}
Fraction Fraction::operator*(Fraction &c) //重载两个分数的乘法运算符
{
Fraction temp;
temp.fz=fz*c.fz;
temp.fm=fm*c.fm;
return temp;
}
Fraction Fraction::operator *(int n) //重载分数与整数的乘法运算符
{
Fraction temp;
temp.fz=fz*n;
temp.fm=fm;
return temp;
}
Fraction Fraction::operator/(Fraction &c) //重载两个分数的除法运算符
{
Fraction temp;
temp.fz=fz*c.fm;
temp.fm=fm*c.fz;
return temp;
}
Fraction Fraction::operator/(int n) //重载分数除以整数的除法运算符
{
Fraction temp;
temp.fz=fz;
temp.fm=fm*n;
return temp;
}
Fraction operator /(int n,Fraction &c)
{
Fraction temp;
temp.fz =n*c.fm ;
temp.fm =c.fz ;
return temp;
}
ostream& operator<<(ostream &output,Fraction &t) //重载输出运算符,输出分数
{
int a,b,c;
a=t.fz;
b=t.fm;
if(a==0||b==0) //当分子,或者分母为0时,输出0
cout<<"0";
if(b==1) //当分母为1时,输出分子
cout<<a;
if(a>b&&b!=1) //判断分数为假分数
{
c=a/b;
a=a%b;
cout<<c;
if(a!=0)
cout<<"又"<<a<<'/'<<b;
}
if(a<0&&-a>b&&b!=1) //当分数为负时,判断为假分数
{
c=-a/b;
a=-a%b;
c=-c;
cout<<'='<<c;
if(a!=0)
cout<<"又"<<a<<'/'<<b<<endl;
}
if(t.fz>0&&t.fz<t.fm && t.fm!=0&&t.fm!=1) //判断为真分数
output<<t.fz<<'/'<<t.fm;
if(t.fz<0 && -t.fz<t.fm && t.fm!=0 && t.fm!=1) //判断为真分数
output<<"("<<t.fz<<'/'<<t.fm<<")";
return output;
}
istream& operator>>(istream &input,Fraction &t) //重载输入运算符,输入分数
{ int a,c;
char b;
input>>a>>b>>c;
if(b=='/' && c!=0 )
{
t.fz=a;
t.fm=c;
}
else
cout<<"错误!!!输入格式错误或分母为0!请退出重新输入!"<<endl;
return input;
}
#include<iostream.h>
int main() //main函数
{
Integer dis;
Fraction a,b,result,real;
int m,z;
char c; //数据类型
dis.display ();
while(m!=0)
{
cout<<" 请输入:(0-3): ";
cin>>m;
if(m==1) //分数与整数的运算
{
cout<<endl<<" 请输入一个分数: ";
cin>>a;
cout<<endl<<" 请输入运算符: ";
cin>>c;
cout<<endl<<" 输入一个正整数: ";
cin>>z;
if(c=='+')
result=a+z;
if(c=='-')
result=a-z;
if(c=='*')
result=a*z;
if(c=='/')
result=a/z;
real=result.predigest();
cout<<"运算式规范为: "<<a<<c<<z<<'='<<a.predigest ()<<c<<z<<'='<<real<<endl;
cout<<endl;
}
if(m==2) //整数与分数的运算
{
cout<<endl;
cout<<endl<<" 请输入一个正整数: ";
cin>>z;
cout<<endl<<" 请输入运算符: ";
cin>>c;
cout<<endl<<" 请输入一个分数: ";
cin>>b;
if(c=='+')
result=b+z;
if(c=='-')
result=z-b;
if(c=='*')
result=b*z;
if(c=='/')
result=z/b;
real=result.predigest();
cout<<"运算式规范为: "<<z<<c<<b<<'='<<z<<c<<b.predigest ()<<'='<<real<<endl;
cout<<endl;
}
if(m==3) //分数与分数的运算
{
cout<<endl;
cout<<endl<<" 请输入一个分数: ";
cin>>a;
cout<<endl<<" 请输入运算符: ";
cin>>c;
cout<<endl<<" 请输入一个分数: ";
cin>>b;
if(c=='+')
result=a+b;
if(c=='-')
result=a-b;
if(c=='*')
result=a*b;
if(c=='/')
result=a/b;
real=result.predigest();
cout<<"运算式规范为: "<<a<<c<<b<<'='<<a.predigest ()<<c<<b.predigest ()<<'='<<real<<endl;
cout<<endl;
}
}
return 0;
}
l 书写格式
a.要求用A4纸打印成册
b.正文格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。
c.正文的内容:正文总字数要求在3000字左右(不含程序原代码)。
d.封面格式如下页。
l 考核方式
指导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新精神和设计报告等进行综合考评,并按优秀、良好、中等、及格和不及格五个等级给出每位同学的课程设计成绩。具体考核标准包含以下几个部分:
a.平时出勤 (占10%)
b.系统需求分析、功能设计、数据结构设计及程序总体结构合理与否(占10%)
c.程序能否完整、准确地运行,个人能否独立、熟练地调试程序(占40%)
d.设计报告(占30%)
注意:不得抄袭他人的报告(或给他人抄袭),一旦发现,成绩为零分。
e.独立完成情况(占10%)。
l 课程验收要求
a.判定算法设计的合理性,运行相关程序,获得正确的数值结果。
b.回答有关问题。
c.提交课程设计报告。
d.提交软盘(源程序、设计报告文档)。
e.依内容的创新程度,完善程序情况及对程序讲解情况打分。
二、教材及参考书
朱战立等著, C++面向对象程序设计,人民邮电出版社;
郑莉著, C++ 语言程序设计(含实验指导书)。 清华大学出版社 ( 结构化程序设计部分 )
钱能主编 ,C++ 程序设计教程,清华大学出版社, 2000.11
戴锋编著, Visual C++ 程序设计基础 , 清华大学出版社 ,2001.4
吕日著, C++ 程序设计教程,清华大学出版社,
C++ 大学教程,美国 Harvey M.Deitel 等
三、进度安排
1、 班级: 信息与计算科学:1601、1602
2、 主讲教师:
3、 辅导教师:
4、 时间安排:
第 18周
星期一 8时:30分——11时:30分;14时:00分——17时:00分
星期二 8时:30分——11时:30分;14时:00分——17时:00分
星期三 8时:30分——11时:30分;14时:00分——17时:00分
星期四 8时:30分——11时:30分;14时:00分——17时:00分
星期五 8时:30分——11时:30分;14时:00分——17时:00分
附:选题方案:
所选题目根据学生学号确定,学号模7加1,即(学号%9+1)。如你的学号为17,则所选题目号为:17%7+1==4(题目4)。
同班的同学自由组合,可以最多三个选同一题的同学共同完成一项作业。
学有余力的同学可以自由组合做题目8,可以自由设计吉祥物的图案。
理学院课程设计评分表
课程名称: 算法与程序设计
项 目
评 价
设计方案的合理性与创造性
设计与调试结果
设计说明书的质量
答辩陈述与回答问题情况
课程设计周表现情况
综合成绩
教师签名:
日 期:
21
展开阅读全文