




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于OOP技术的计算器设计摘 要:OOP编程技术以其良好的共享性、可维持性被逐步广泛采用。本文以OOP技术理念,采用OOP方法,利用Visual C+6.0集成开发工具,制作了一个简易计算器。为深入理解OOP概念,熟练操作开发环境作了有益的尝试。关键词:OOP VC 类目 录1 引言- 1 -1.1 OOP概念- 1 -1.2 Visual C+6.0简介- 1 -2 系统目标- 1 -2.1良好的人机界面- 1 -2.2需要实现的功能- 2 -2.3使用面向对象技术- 2 -3 程序功能与结构- 2 -3.1 系统功能分析- 2 -3.1.1 加、减、乘、除四则运算- 2 -3.1.2 三角函数运算- 2 -4 系统实现- 2 -4.1 开发平台的确定- 2 -4.2 应用程序设计- 2 -4.2.1、整体思路- 2 -4.2.2、CCalculatorDlg类的设计- 3 -4.2.3 重要功能的代码分析- 6 -5 程序源代码(部分)- 11 -5.1 CalculatorDlg类定义单元- 11 -5.2 CalculatorDlg类实现单元- 14 -6 程序调试- 29 -7结论- 29 -参考文献:- 29 -1 引言1.1 OOP概念OOP(Object Oriented Programming)即面向对象程序设计,是通过为数据和代码建立分块的内存区域,以便提供对程序进行模块化的一种程序设计方法,这些模块可以被用作样板,在需要时再建立其副本。面向对象是将世界看成是由一组彼此相关并能相互通信的实体即对象组成的。程序中的对象映射现实世界中对象。在面向对象的程序中,对象之间只能通过函数调用相互通信。本文通过设计制作一个简易计算器来实践面向对象程序设计方法。1.2 Visual C+6.0简介Visual C+6.0是微软公司推出的开发Win32应用程序的、面向对象的可视化集成工具,环境提供了功能强大的MFC(Microsoft Foundation Classes)类库。MFC是微软提供的,用于在C+环境下编写应用程序的一个框架和引擎,是一个很大的C+类层次结构,其中封装了大量的类及其函数,很多Windows程序所共有的标准内容可以由MFC的类来提供,MFC类为这些内容提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓,这将简化编程工作,大大的减少程序员编写的代码数量,使编程工作变得更加轻松容易。本设计利用集成环境的MFC App向导来生成程序主框架,大大提高了开发效率。2 系统目标2.1良好的人机界面为使操作简洁,用户易学易用,便于人机交互,程序采用如图一所视GUI界面。图一 运行界面2.2需要实现的功能1.四则运算作为计算器的最基本功能必需具备,要完整支持小数操作。2.在日常工作中,要经常进行三角函数运算,因此程序要有基本的三角函数运算功能。3.用户使用计算器时,都习惯用数字键区操作,程序除使用鼠标操作外,要能接收键盘输入以实现四则运算。2.3使用面向对象技术OOP技术是C的灵魂,整个设计要能较好的体现C的技术特性。3 程序功能与结构3.1 系统功能分析3.1.1 加、减、乘、除四则运算1.操作数的输入。2.实现指定的四则运算。3.结果的显示。包括输入操作数、运算结果、及出错信息的显示3.1.2 三角函数运算1.操作数的输入。2.实现指定的三角函数运算。3.结果的显示。包括输入操作数、运算结果及出错信息的显示4 系统实现4.1 开发平台的确定微软的Microsoft VC+6.0集成开发环境全面支持OOP编程,并且有强大的MFC,是目前比较流行的C开发环境,本设计选用Microsoft VC+6.0作为编程环境。4.2 应用程序设计4.2.1、整体思路1、本程序界面相对较为简单,从CDialog类直接派生出计算器对话框类CCalculatorDlg。2、在IDD_CALCULATOR_DIALOG对话框上添加操作控件,作为人机交互。3、实现CCalculatorDlg类。4.2.2、CCalculatorDlg类的设计1、通过MFC AppWizard(EXE)新建一个基于对话框的工程,工程名为:Calculator,向导会生成CAboutDlg,CCalculatorApp,CCalculatorDlg三个类,并自动添加初始代码,此时的CCalculatorDlg类骨架已由系统生成,下段将按我们的功能要求来逐步完善这个类。2、将对话框IDD_CALCULATOR_DIALOG按照计算器界面要求进行布局。图二 界面布局3、定义程序操作状态中用到的数据类型;在计算器四则运算中,运算操作主要有加、减、乘、除。/运算类型enum OperatorOpNone, OpAdd, OpSubtract, OpMultiply, OpDivide ;常用的三角函数运算有正弦、余弦、正切等,其他函数主要有对数、阶乘等。/函数类型enum Func FuncSin, FuncTan, FuncCos, FuncSqrt, FuncSqre, FuncLn, FuncLog, FuncN, FuncRec, FuncExp, FuncNone;四则运算中存在的错误主要是除零等。/运算错误类型enum CalcError ErrNone, ErrDivideByZero ;4、在CCalculatorDlg类中添加成员变量及方法。根据类封装性要求,成员尽量定义为私有类型。图三CCalculatorDlg类定义为Edit编辑框及角度选框按钮添加成员变量m_result,m_iDegree,以进行界面与数据交互。图四 添加成员变量系统自动生成的代码如下所示图五 生成的成员变量在类CCalculatorDlg构造函数中初始化各变量图六CCalculatorDlg类构造函数在BOOL CCalculatorDlg:OnInitDialog()方法中加入如下代码图七 对话框初始化4.2.3 重要功能的代码分析1.运算操作数输入void CCalculatorDlg:OnOperandInput(UINT nID)图八 操作数输入方法方法根据数字0-9按钮的ID号,将其转换成操作数。2.显示结果方法void CCalculatorDlg:UpdateDisplay()图九 更新显示方法先将要显示的内容赋给成员变量m_result,再调用UpdateData(FALSE)函数,将m_result的内容在Edit编辑框中显示出来。3.函数运算过程void CCalculatorDlg:Run_Func()图十 函数运算方法类成员函数根据成员变量m_func的内容,选择不同的分支执行,最后调用UpdateDisplay()将执行结果进行显示。4.四则运算过程void CCalculatorDlg:Calculate()图十一 四则运算方法方法根据成员变量m_operator中的内容,选择不同的操作进行运算,最后调用UpdateDisplay()方法,进行结果显示。5.键盘输入的实现 插入一个新的Accelerator到资源里,将键盘与对应的响应控件关联图十二 添加Accelerator资源 在类CCalculatorDlg中进行声明:图十三 申明资源在类CCalculatorDlg构造函数中初始化m_hAccel。图十四 资源初始化重载类CCalculatorDlg的PreTranslateMessage函数图十五 重载PreTranslateMessage函数在类CCalculatorDlg中加入消息处理方法定义图十六 定义消息在类CCalculatorDlg实现中,加入如下代码:图十七 键盘输入处理方法方法根据按键来选择执行分支,完成不同的运算。5 程序源代码(部分)5.1 CalculatorDlg类定义单元/文 件 名:CalculatorDlg.h/功 能:定义CalculatorDlg类/程序设计:杨斌峰/编码时间:2008/10/12/#if !defined(AFX_CALCULATORDLG_H_8F15023D_4EA7_11D3_860D_A73AED693C48_INCLUDED_)#define AFX_CALCULATORDLG_H_8F15023D_4EA7_11D3_860D_A73AED693C48_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000/运算类型enum OperatorOpNone, OpAdd, OpSubtract, OpMultiply, OpDivide;/函数类型enum FuncFuncSin, FuncTan, FuncCos, FuncSqrt, FuncSqre, FuncLn, FuncLog,FuncN, FuncRec, FuncExp, FuncNone;/运算错误类型enum CalcErrorErrNone, ErrDivideByZero;#define PI 3.1415926/定义值class CCalculatorDlg : public CDialogprivate: double m_dOperand;/操作数double m_dTempOperand;/操作数或结果暂存BOOL m_bDecimally;/小数标志double m_dRatio;/小数倍率 double m_dDegToRad;/角度转弧度Operator m_operator;/操作类型 OpNone, OpAdd, OpSubtract, OpMultiply, OpDivide Func m_func;/当前函数CalcError m_errorState;/出错类型BOOL m_bOperandAvail;/操作数可用标志void Calculate();/四则运算void Run_Func();/函数计算void UpdateDisplay();/更新显示内容protected:HICON m_hIcon;HACCEL m_hAccel;/资源申明/ Generated message map functions/AFX_MSG(CCalculatorDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnOperandInput(UINT nID); afx_msg void OnAdd();afx_msg void OnMinus();afx_msg void OnDivid();afx_msg void OnMultiply();afx_msg void OnEqual();afx_msg void OnSqrt();afx_msg void OnSign();afx_msg void OnReciprocal();afx_msg void OnPoint();afx_msg void OnClear(); afx_msg BOOL Keyboard(LPCTSTR szButton);afx_msg void OnLog();afx_msg void OnLn();afx_msg void OnFactorial();afx_msg void OnExp();afx_msg void OnSin();afx_msg void OnSquar();afx_msg void OnTan();afx_msg void OnDegree();afx_msg void OnRad();afx_msg void OnCos();/AFX_MSGDECLARE_MESSAGE_MAP()public:CCalculatorDlg(CWnd* pParent = NULL);/ standard constructor/ Dialog Data/AFX_DATA(CCalculatorDlg)enum IDD = IDD_CALCULATOR_DIALOG ;CStringm_result;/待显示字符串intm_iDegree;/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CCalculatorDlg)public:virtual BOOL PreTranslateMessage(MSG* pMsg);protected:virtual void DoDataExchange(CDataExchange* pDX);/ DDX/DDV support/AFX_VIRTUAL/ Implementation;/AFX_INSERT_LOCATION/ Microsoft Visual C+ will insert additional declarations immediately before the previous line.#endif / !defined(AFX_CALCULATORDLG_H_8F15023D_4EA7_11D3_860D_A73AED693C48_INCLUDED_)5.2 CalculatorDlg类实现单元/文 件 名:CalculatorDlg.cpp/功 能:CalculatorDlg类实现/程序设计:杨斌峰/编码时间:2008/10/12/#include stdafx.h#include Calculator.h#include CalculatorDlg.h#include math.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialogpublic:CAboutDlg();/ Dialog Data/AFX_DATA(CAboutDlg)enum IDD = IDD_ABOUTBOX ;/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:/AFX_MSG(CAboutDlg)/AFX_MSGDECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)/AFX_DATA_INIT(CAboutDlg)/AFX_DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAboutDlg)/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)/ No message handlers/AFX_MSG_MAPEND_MESSAGE_MAP()/ CCalculatorDlg dialogCCalculatorDlg:CCalculatorDlg(CWnd* pParent /*=NULL*/): CDialog(CCalculatorDlg:IDD, pParent)/AFX_DATA_INIT(CCalculatorDlg)m_result = _T();/运算结果属性m_iDegree = -1;/角度弧度指示属性/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);m_hAccel = LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDD);m_dDegToRad=(2*PI)/360;/初始时为角度,1角度相当于(2*PI)/360弧度 m_dRatio=0.1;/小数输入时初始倍率m_bDecimally=false;/非小数m_errorState = ErrNone;/运算无错误m_bOperandAvail=FALSE;/操作数不可用m_operator=OpNone;/运算不可用void CCalculatorDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CCalculatorDlg)DDX_Text(pDX, IDC_DISPLAY, m_result);DDX_Radio(pDX, IDC_DEGREE, m_iDegree);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CCalculatorDlg, CDialog)/AFX_MSG_MAP(CCalculatorDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_COMMAND_RANGE(IDC_0, IDC_9, OnOperandInput)ON_BN_CLICKED(IDC_ADD, OnAdd)ON_BN_CLICKED(IDC_MINUS, OnMinus)ON_BN_CLICKED(IDC_DIVID, OnDivid)ON_BN_CLICKED(IDC_MULTIPLY, OnMultiply)ON_BN_CLICKED(IDC_EQUAL, OnEqual)ON_BN_CLICKED(IDC_SQRT, OnSqrt)ON_BN_CLICKED(IDC_SIGN, OnSign)ON_BN_CLICKED(IDC_RECIPROCAL, OnReciprocal)ON_BN_CLICKED(IDC_POINT, OnPoint)ON_BN_CLICKED(IDC_CLEAR, OnClear)ON_BN_CLICKED(IDC_LOG, OnLog)ON_BN_CLICKED(IDC_LN, OnLn)ON_BN_CLICKED(IDC_FACTORIAL, OnFactorial)ON_BN_CLICKED(IDC_EXP, OnExp)ON_BN_CLICKED(IDC_SIN, OnSin)ON_BN_CLICKED(IDC_SQUAR, OnSquar)ON_BN_CLICKED(IDC_TAN, OnTan)ON_BN_CLICKED(IDC_DEGREE, OnDegree)ON_BN_CLICKED(IDC_RAD, OnRad)ON_BN_CLICKED(IDC_COS, OnCos)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CCalculatorDlg message handlersBOOL CCalculatorDlg:OnInitDialog()CDialog:OnInitDialog();/ Add About. menu item to system menu./ IDM_ABOUTBOX must be in the system command range.ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ TODO: Add extra initialization herem_result=0.;/初始显示内容m_iDegree=0;/角度单选框选中UpdateData(FALSE);/变量到控件return TRUE; / return TRUE unless you set the focus to a controlvoid CCalculatorDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);/ If you add a minimize button to your dialog, you will need the code below/ to draw the icon. For MFC applications using the document/view model,/ this is automatically done for you by the framework.void CCalculatorDlg:OnPaint() if (IsIconic()CPaintDC dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公共关系学试题及答案解析网红趋势2025
- 水电工程预算管理试题及答案
- 关键知识点市政学试题及答案
- 确保通过的2025年行政管理试题及答案
- 自考行政管理的全方位备考指南试题及答案
- 2025年行政管理自考读书笔记与试题及答案
- 2025年高考第二次模拟考试物理一(江苏卷)(参考答案) -
- 2025年高考第三次模拟考试物理(安徽卷)(考试版)
- 2024年水利水电工程金融支持试题及答案
- 行政管理学与道德伦理试题及答案
- 2023年湖北省武汉第二中学高考英语一模试卷(含答案解析)
- 增值税转型改革及增值税条例课件
- 2023届高考语文复习:西藏男孩丁真 课件
- 挖掘机司机技能理论考试题库大全(600题版)
- 穿支动脉梗死的病因和机制课件
- 吡格列酮联合二甲双胍治疗2型糖尿病的循证证据
- 布草间管理制度(3篇)
- 高校电子课件:产业经济学(第五版)
- 法商小课堂传承保险法商课婚姻保险法商课32张幻灯片
- 毕业设计-栲胶法脱硫
- 人教九年级化学学生分组实验
评论
0/150
提交评论