收藏 分享(赏)

面向对象编程技术课程设计.doc

上传人:dreamzhangning 文档编号:2770486 上传时间:2018-09-27 格式:DOC 页数:20 大小:132KB
下载 相关 举报
面向对象编程技术课程设计.doc_第1页
第1页 / 共20页
面向对象编程技术课程设计.doc_第2页
第2页 / 共20页
面向对象编程技术课程设计.doc_第3页
第3页 / 共20页
面向对象编程技术课程设计.doc_第4页
第4页 / 共20页
面向对象编程技术课程设计.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

1、面向对象编程技术课程设计报告书软 0841XXXX XXXXXXXXX: 2010 年 6 月 班 级: 姓 名: 学 号:日 期:2010 年 6 月1目录1 学校对员工奖金的计算 .11.1 问题认识与分析 11.2 程序功能说明,程序结构图 .21.3 类层次图 .31.4 代码说明 31.4.1 开发环境 .31.4.2 主要开发步骤 .31.4.3 代码说明 .41.5 操作说明 .71.6 设计开发过程中,遇到的主要问题以及解决方法 72. 计算器(MFC) .92.1 问题认识与分析 92.2 程序功能说明,程序结构图 .92.3 类层次图(以下为操作键对应的操作函数) 102.

2、4 代码说明 112.4.1 开发环境 .112.4.2 主要开发步骤 .112.4.3 代码说明 .112.5 设计开发过程中,遇到的主要问题以及解决方法 172.6 存在的主要问题,拟解决的方法 17参考文献资料 .1811 学校对员工奖金的计算1.1 问题认识与分析某学校对员工的奖金按下面方法计算:对管理人员按其职务发固定的岗位奖,对专职教师按其职称和月任课时数计发业绩奖,对既有管理工作又兼授课的人员按岗位奖加月任课时数乘某系数之和为奖金数。分析应用要求,建立一个抽象类,具有员工的基本数据成员,计算月奖金和显示信息的成员函数。由于不同人员的奖金计算方法不同,所以将这两个成员函数声明为虚函

3、数。以抽象类为基类派生出三种不同人员类,有派生类对月奖金和显示信息函数进行重载。主函数实现动态调用,计算个人员的月奖金。21.2 程序功能说明,程序结构图employeepublic:virtual void pay()=0;virtual void Show()=0;void setname(char *names) strcpy(name,names); private:char name20;managerpublic: void pay();void Show();private:int monthlypay;teacherpublic:void pay();void Show();v

4、oid setworkhours(int wh);private:int hourrate ; int workhours;teachermanagerpublic:void pay();void Show();31.3 类层次图virtual(虚基类) virtual(虚基类)( 共同派生 )1.4 代码说明1.4.1 开发环境Microsoft visual C+ 6.0 1.4.2 主要开发步骤1.先设计一个抽象类,在里面写上主要虚函数。2.因为后面要共同派生出一个 teachermanager,所以抽象类派生的要设为虚基类3.最后在主函数中,设置虚函数实现动态调用。 (利用了多态)抽象

5、类 employeemanager teacherteachermanager41.4.3 代码说明/employee.hclass employeeprotected:char name20;int individualEmployeeNo;int grade;float accumpay;static int employeeno;public:employee();virtual void pay()=0;virtual void show()=0;void setname(char *);char * getname();int getindividualEmployeeNo();cl

6、ass manager:virtual public employeeprotected:float monthlypay;public:manager();void pay();void show();class teacher:virtual public employeepublic :teacher();void setworkhours(int wh);void pay();void show();protected:int workhours;float hourrate;class teachermanage:public teacher,public managepublic:

7、5teachermanage();void pay();void show();/employee.cpp#include#include#include“employee.h“using namespace std;int employee:employeeno=1000;employee:employee()individualEmployeeNo=+employeeno;accumpay=0;void employee:setname(char *names)strcpy(name,names);char * employee:getname()return name;teacher:t

8、eacher()hourrate=120;void teacher:setworkhours(int wh)workhours=wh;void teacher:pay()accumpay=hourrate*workhours;manage:manager()6monthlypay=5000;void manage:pay()accumpay=monthlypay;void manage:show()coutnamestr;empi-setname(namestr);coutww;t1.setworkhours(ww);7for(i=0;ipay();coutgetname();coutgeti

9、ndividualEmployeeNo()show();cout连接 执行其他步骤如下图:1.6 设计开发过程中,遇到的主要问题以及解决方法1.文件的连接问题:在编辑时,将 employee.h 和 employee.cpp 两文件写在同一工程下,编译器将会自动调用。2.同名成员的唯一标识问题:基类 employee,声明了数据成员8name,individulemployeeno ,和函数 pay(),show()等,公有派生了teacher 类和 manager 类,再以 teacher 类和 manager 类共同公有派生了 teachermanager 类,这时在 teacherman

10、ager 类中,同名数据在内存中拥有多个拷贝,同一函数会有多个映射。我们将共同基类设置为虚基类,这时在 teachermanager 类中从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。这样就解决了成员的唯一标识问题。92. 计算器(MFC)2.1 问题认识与分析需求分析设计一个与 windows 操作系统自带的标准型计算器功能相同的计算器,至少有+ 、- 、*、/、清零、backspace 的功能。2.2 程序功能说明,程序结构图本计算器可以实现普通的四则运算,功能与 windows 自带的计算器基本一致,但是有以下几点不同及需要注意的地方:1. 输入负

11、数的时候,请先输入数字然后点+/- 键,如果先点+/- 键可能会出现问题。2. 加法、减法和乘法的最终结果的整数和小数部分分别能容纳10长达 100(可以预设)位的精确数值,超出这个范围可能会出错。3. 除法的被除数可以是 100 位整数以内的任何数值,但是除数的有效数字位数不能超过 64 位,超过会出错。除法最大的精确位数为 PRE 位(预设为 40)位,超过这个位数则采用四舍五入法进位。4. 加、减、乘和除法的结果显示的全部为精确的数字。5. 由于开方二分查找算法的本身的痼疾,使得开方的精确度很低,在与 windows 自带的计算器比较之后发现,结果只能精确到小数点后一位或者两位甚至有些情

12、况只能精确到整数个位,也就是说后面的数字全是没有价值的,因此用此计算器计算的开方结果只能作为一个参考值供大家使用。2.3 类层次图( 以下为操作键对应的操作函数)void CCalculatorDlg:OnAdd() /加void CCalculatorDlg:OnMinus()/减void CCalculatorDlg:OnMutiply()/乘void CCalculatorDlg:OnDivid()/除void CCalculatorDlg:OnSign() /处理正负号void CCalculatorDlg:OnEqual()/处理等号void CCalculatorDlg:OnSqr

13、t()/处理开根号void CCalculatorDlg:OnRecip() /求倒数void CCalculatorDlg:OnPoint()/处理小数点void CCalculatorDlg:Calculate()/处理计算void CCalculatorDlg:Run_Func()/处理求根和求倒void CCalculatorDlg:UpdateDisplay()/处理显示112.4 代码说明2.4.1 开发环境Microsoft visual C+ 6.0 2.4.2 主要开发步骤1、创建基于对话框的 MFC(EXE)应用程序 Calculator;2、在对话框窗体上顺序创建 0 到

14、 9 十个数字按钮,并设置其标识符分别为 IDC_0 到 IDC_9,其它按钮按下表设置属性:3、按表 2 添加各运算按钮的消息处理函数4、为使 0 到 9 十个数字按钮响应相同的消息处理函数,定义宏ON_COMMAND_RANGE5、在头文件 CalculatorDlg.h 中添加类型、成员变量及成员函数6、部分变量的初始化7、添加各功能代码2.4.3 代码说明1.为使 0 到 9 十个数字按钮响应相同的消息处理函数,定义宏ON_COMMAND_RANGE(1) / CalculatorDlg.h/AFX_MSG(CCalculatorDlg)virtual BOOL OnInitDialo

15、g();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnAdd();12afx_msg void OnMinus();afx_msg void OnMutiply();afx_msg void OnDivid();afx_msg void OnClear();afx_msg void OnSign();afx_msg void OnPoint();afx_msg void OnEqual();afx

16、_msg void OnSqrt();afx_msg void OnRecip();afx_msg void OnOperandInput(UINT iID);/注意先向类中添加 protected 型成员函数,然后再屏蔽掉,在此位置添加此说明/AFX_MSG(2)/CalculatorDlg.cppBEGIN_MESSAGE_MAP(CCalculatorDlg, CDialog)/AFX_MSG_MAP(CCalculatorDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_ADD, OnAd

17、d)ON_BN_CLICKED(IDC_MINUS, OnMinus)ON_BN_CLICKED(IDC_MUTIPLY, OnMutiply)ON_BN_CLICKED(IDC_DIVID, OnDivid)ON_BN_CLICKED(IDC_CLEAR, OnClear)ON_BN_CLICKED(IDC_SIGN, OnSign)ON_BN_CLICKED(IDC_POINT, OnPoint)ON_BN_CLICKED(IDC_EQUAL, OnEqual)ON_BN_CLICKED(IDC_SQRT, OnSqrt)ON_BN_CLICKED(IDC_RECIP, OnRecip)O

18、N_COMMAND_RANGE(IDC_0,IDC_9,OnOperandInput)/使用一个消息函数来处理对某个 ID 范围内所有控件的命令响应/AFX_MSG_MAPEND_MESSAGE_MAP()2.在头文件 CalculatorDlg.h 中添加类型、成员变量及成员函数(1)自定义类型enum Operator OpNone,OpAdd,OpSubtract,OpMultiply,OpDivide;enum CalcError ErrNone,ErrDivideByZero;enum Func FuncSin, FuncTan, FuncCos, FuncSqrt, FuncSqr

19、e, FuncLn, FuncLog,FuncN, FuncRec, FuncExp, FuncNone;(2)成员变量及函数float m_operand; /存储当前输入的操作数float m_accum; /存储当前的计算结果13BOOL m_bCoff; /标识当前输入是否是小数float m_coff; / 小数输入时的系数Operator m_operator; /enum 型变量用以标识当前运算符CalcError m_errorState; /enum 型变量用以标识当前运算状态Func m_func; /enum 型变量用以标识当前运算函数类型BOOL m_bOperandA

20、vail; /标识当前输入是否为新输入数字void Calculate(); /处理普通计算void UpdateDisplay(); /处理显示void Run_Func(); /处理函数运算(3)为编辑框添加 Cstring 变量 m_result (选中编辑框,按住 ctrl+w 即可)3.部分变量的初始化CCalculatorDlg:CCalculatorDlg(CWnd* pParent /*=NULL*/): CDialog(CCalculatorDlg:IDD, pParent)/AFX_DATA_INIT(CCalculatorDlg)m_result = _T(“);/AFX

21、_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);m_coff=0.1;m_bCoff=0;m_errorState = ErrNone;m_bOperandAvail=FALSE;m_operator=OpNone;另:在文件 CalculatorDlg.cpp 中添加#include “math.h“4. 添加各功能代码(1)数字输入消息处理函数void CCalculatorDlg:On

22、OperandInput(UINT iID)ASSERT(iID = IDC_0 if(m_errorState!=ErrNone)return;if(!m_bOperandAvail)m_operand=0;if(!m_bCoff)m_operand=m_operand*10+(iID-IDC_0);14elsem_operand=m_operand+(iID-IDC_0)*m_coff;m_coff*=0.1;m_bOperandAvail=TRUE;UpdateDisplay();(2)运算符消息处理函数void CCalculatorDlg:OnAdd() /加/ TODO: Add

23、your control notification handler code hereCalculate();m_operator=OpAdd;void CCalculatorDlg:OnMinus()/减/ TODO: Add your control notification handler code hereCalculate();m_operator=OpSubtract;void CCalculatorDlg:OnMutiply()/乘/ TODO: Add your control notification handler code hereCalculate();m_operat

24、or=OpMultiply;void CCalculatorDlg:OnDivid()/除/ TODO: Add your control notification handler code hereCalculate();m_operator=OpDivide;void CCalculatorDlg:OnSign() /处理正负号/ TODO: Add your control notification handler code herem_operand*=-1;UpdateDisplay();15void CCalculatorDlg:OnEqual()/处理等号/ TODO: Add

25、your control notification handler code hereCalculate();m_operator=OpNone;void CCalculatorDlg:OnSqrt()/处理开根号/ TODO: Add your control notification handler code herem_func=FuncSqrt;Run_Func();void CCalculatorDlg:OnRecip() /求倒数/ TODO: Add your control notification handler code herem_func=FuncRec;Run_Fun

26、c();void CCalculatorDlg:OnPoint()/处理小数点/ TODO: Add your control notification handler code herem_bCoff=1;UpdateDisplay();void CCalculatorDlg:Calculate()/处理计算if(m_errorState!=ErrNone)return;if(m_bOperandAvail)if(m_operator=OpNone)m_accum=m_operand;else if(m_operator=OpMultiply)m_accum*=m_operand;else

27、if(m_operator=OpDivide)if(m_operand=0)m_errorState=ErrDivideByZero;elsem_accum/=m_operand;16else if(m_operator=OpAdd)m_accum+=m_operand;else if(m_operator=OpSubtract)m_accum-=m_operand;m_bOperandAvail=FALSE;m_bCoff=0;m_coff=0.1;UpdateDisplay();void CCalculatorDlg:Run_Func()/处理求根和求倒if (m_errorState !

28、= ErrNone)return;if (m_bOperandAvail)if(m_func=FuncSqrt)m_operand=sqrt(m_operand);if(m_func=FuncRec)m_operand=1/m_operand;UpdateDisplay();void CCalculatorDlg:UpdateDisplay()/处理显示if(GetSafeHwnd()=NULL)return;if(m_errorState!=ErrNone)m_result=“除数不能为零“;elsefloat lval=(m_bOperandAvail)?m_operand:m_accum

29、;m_result.Format(_T(“%f“),lval);int i=m_result.GetLength();while(m_result.GetAt(i-1)=0)m_result.Delete(i-1,1);i-=1;17UpdateData(FALSE);2.5 设计开发过程中,遇到的主要问题以及解决方法本次的计算器的设计,我实现了+、-、*、 /、开方、取倒数、清零、backspace 的功能,实现了要求实现的全部功能,符合全部的要求,但是还是有一些的缺点的,还有很多的地方需要继续完善。比如除法的除数的位数还需要继续的扩充,之所以除法的除数长度受到了限制,是因为在除法的函数中,

30、我用了_int64 作为除数的类型,因此除数最多只能达到 64 位,若是能改进一下程序,用我定义的结构体作为除数的类型,那么除数的位数的限制将提升至 200 位,这么多的位数已经足够多了。开方的精确度也还需要进一步的提高,唯一的提高办法是改进算法。2.6 存在的主要问题,拟解决的方法程序的另一个缺点就是,代码的复用率不高,很多的代码可以作为一个函数出现,而不断调用即可,而不是一遍一遍地写重复的代码;数据结构也有待改善,之所以我的程序很长,是因为我把整数和小数部分作为两个不同的部分来分别处理,而实际上,可以做为一个部分来处理,只要增加一个记录数字的幂的成员变量即可,做完这些改进后,相信程序的代码会大大地减少,不仅读起来方便,也有利于提高编译和执行的效率。对于在程序调试中遇到的疑难问题,各种错误,几乎都可以18用设置断点的方式找出来,在调试过程中,观测好要观察的变量,很容易就把错误定为了,非常的简单和方便。在本次的计算器设计中,我再一次熟悉了 VC 编程环境,学习了用 MFC 做图形界面,学会了用断点调试程序的方法,希望进一步学习更复杂的程序的写法。参考文献资料1 殷人昆,陶永雷,谢若阳,盛絢华。数据结构(面向对象方法与 C+描述) 。北京:清华大学出版社,1997年 7 月其它参考文献依次列出

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报