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

上传人:仙人指路1688 文档编号:2386232 上传时间:2023-02-17 格式:DOC 页数:20 大小:82.50KB
返回 下载 相关 举报
面向对象编程技术课程设计.doc_第1页
第1页 / 共20页
面向对象编程技术课程设计.doc_第2页
第2页 / 共20页
面向对象编程技术课程设计.doc_第3页
第3页 / 共20页
面向对象编程技术课程设计.doc_第4页
第4页 / 共20页
面向对象编程技术课程设计.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《面向对象编程技术课程设计.doc》由会员分享,可在线阅读,更多相关《面向对象编程技术课程设计.doc(20页珍藏版)》请在三一办公上搜索。

1、面向对象编程技术课程设计报告书班 级: 软0841姓 名: XXX学 号:X XXXXXXXXX日 期:2010年 6 月: 2010年 6 月 目录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.4代码说明112.4.1开发环境112.4.2主要开发步骤112.4.

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

3、的月奖金。1.2 程序功能说明,程序结构图 employeepublic:virtualvoid pay()=0;virtualvoid Show()=0;void setname(char *names) strcpy(name,names); private:char name20;teacherpublic:void pay();void Show();void setworkhours(int wh);private:int hourrate ; int workhours; managerpublic: void pay();void Show();private:int month

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

5、ass 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();class manager:virtual public employeeprotected:float monthlypay;p

6、ublic: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:teachermanage();void pay();void show();/employee.cpp#include#i

7、nclude#includeemployee.husing 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:teacher() hourrate=120;void teacher:setworkhours(int wh) work

8、hours=wh;void teacher:pay() accumpay=hourrate*workhours;manage:manager() monthlypay=5000;void manage:pay()accumpay=monthlypay;void manage:show() coutthe accumpay isaccumpayendl;teachermanage:teachermanage() monthlypay=4000; hourrate=80;void teachermanage:pay() accumpay=monthlypay+hourrate*workhours;

9、void teachermanage:show() cout本月工资accumpayendl;void main() teacher t1; manage m1; teachermanage tm; char namestr20; employee *emp3=&t1,&m1,&tm; int i; for(i=0;i3;i+) cout请输入下一个员工的姓名namestr; empi-setname(namestr); cout请输入教师t1.getname()本月的任课时数:ww; t1.setworkhours(ww); for(i=0;ipay(); coutgetname();cou

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

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

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

13、开方结果只能作为一个参考值供大家使用。2.3 类层次图(以下为操作键对应的操作函数)void CCalculatorDlg:OnAdd() /加void CCalculatorDlg:OnMinus()/减void CCalculatorDlg:OnMutiply()/乘void CCalculatorDlg:OnDivid()/除void CCalculatorDlg:OnSign() /处理正负号void CCalculatorDlg:OnEqual()/处理等号void CCalculatorDlg:OnSqrt()/处理开根号void CCalculatorDlg:OnRecip()

14、/求倒数void CCalculatorDlg:OnPoint()/处理小数点void CCalculatorDlg:Calculate()/处理计算void CCalculatorDlg:Run_Func()/处理求根和求倒void CCalculatorDlg:UpdateDisplay()/处理显示2.4代码说明2.4.1开发环境Microsoft visual C+ 6.0 2.4.2主要开发步骤1、创建基于对话框的MFC(EXE)应用程序Calculator;2、在对话框窗体上顺序创建0到9十个数字按钮,并设置其标识符分别为IDC_0到IDC_9,其它按钮按下表设置属性:3、按表2添

15、加各运算按钮的消息处理函数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 OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg voi

16、d OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnAdd();afx_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_msg void OnSqrt();afx_msg void OnRecip();afx_msg void OnOperandInpu

17、t(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, OnAdd)ON_BN_CLICKED(IDC_MINUS, OnMinus)ON_BN_CLICKED(IDC_MUTIPLY, OnMutip

18、ly)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)ON_COMMAND_RANGE(IDC_0,IDC_9,OnOperandInput)/使用一个消息函数来处理对某个ID范围内所有控件的命

19、令响应/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, FuncSqre, FuncLn, FuncLog, FuncN, FuncRec, FuncExp, FuncNone;(2)成员变量及函数float m_o

20、perand;/存储当前输入的操作数float m_accum; /存储当前的计算结果BOOL m_bCoff;/标识当前输入是否是小数float m_coff; /小数输入时的系数Operator m_operator;/enum型变量用以标识当前运算符CalcError m_errorState; /enum型变量用以标识当前运算状态Func m_func; /enum型变量用以标识当前运算函数类型BOOL m_bOperandAvail; /标识当前输入是否为新输入数字void Calculate();/处理普通计算void UpdateDisplay();/处理显示void Run_F

21、unc();/处理函数运算(3)为编辑框添加Cstring 变量m_result (选中编辑框,按住ctrl+w即可)3.部分变量的初始化CCalculatorDlg:CCalculatorDlg(CWnd* pParent /*=NULL*/): CDialog(CCalculatorDlg:IDD, pParent)/AFX_DATA_INIT(CCalculatorDlg)m_result = _T();/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon

22、= AfxGetApp()-LoadIcon(IDR_MAINFRAME);m_coff=0.1;m_bCoff=0;m_errorState = ErrNone;m_bOperandAvail=FALSE;m_operator=OpNone;另:在文件CalculatorDlg.cpp中添加#include math.h4. 添加各功能代码(1)数字输入消息处理函数void CCalculatorDlg:OnOperandInput(UINT iID)ASSERT(iID = IDC_0 & iID = IDC_9);if(m_errorState!=ErrNone)return;if(!m

23、_bOperandAvail)m_operand=0;if(!m_bCoff)m_operand=m_operand*10+(iID-IDC_0);elsem_operand=m_operand+(iID-IDC_0)*m_coff;m_coff*=0.1;m_bOperandAvail=TRUE;UpdateDisplay();(2)运算符消息处理函数void CCalculatorDlg:OnAdd() /加/ TODO: Add your control notification handler code hereCalculate();m_operator=OpAdd;void CCa

24、lculatorDlg:OnMinus()/减/ TODO: Add your control notification handler code hereCalculate();m_operator=OpSubtract;void CCalculatorDlg:OnMutiply()/乘/ TODO: Add your control notification handler code hereCalculate();m_operator=OpMultiply;void CCalculatorDlg:OnDivid()/除/ TODO: Add your control notificati

25、on handler code hereCalculate();m_operator=OpDivide;void CCalculatorDlg:OnSign() /处理正负号/ TODO: Add your control notification handler code herem_operand*=-1;UpdateDisplay();void CCalculatorDlg:OnEqual()/处理等号/ TODO: Add your control notification handler code hereCalculate();m_operator=OpNone;void CCal

26、culatorDlg: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_Func();void CCalculatorDlg:OnPoint()/处理小数点/ TODO: Add your control notification handl

27、er 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 if(m_operator=OpDivide)if(m_operand=0)m_errorState=ErrDivideByZero;elsem_accum/=m_

28、operand;else 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 != ErrNone)return;if (m_bOperandAvail)if(m_func=FuncSqrt)m_operand=sqrt(m_operand);if

29、(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;m_result.Format(_T(%f),lval);int i=m_result.GetLength();while(m_result.GetAt(i-1)=0)m

30、_result.Delete(i-1,1);i-=1;UpdateData(FALSE);2.5设计开发过程中,遇到的主要问题以及解决方法本次的计算器的设计,我实现了+、-、*、/、开方、取倒数、清零、backspace的功能,实现了要求实现的全部功能,符合全部的要求,但是还是有一些的缺点的,还有很多的地方需要继续完善。比如除法的除数的位数还需要继续的扩充,之所以除法的除数长度受到了限制,是因为在除法的函数中,我用了_int64作为除数的类型,因此除数最多只能达到64位,若是能改进一下程序,用我定义的结构体作为除数的类型,那么除数的位数的限制将提升至200位,这么多的位数已经足够多了。开方的精

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

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

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号