时间:2022-07-03 09:03:38
摘 要 在Visual C++环境中进行计算器程序设计的整体思路是:计算器的运行界面相对较为简单,从CDialog类直接派生出计算器对话框类CCalculatorDlg;在IDD_CALCULATOR_DIALOG对话框上添加操作控件,作为人机交互;最后实现CCalculatorDlg类的相关代码编写。本文对在进行计算器程序设计时CCalculatorDlg类的设计方法及步骤进行了阐述。
关键词 Visual C++;计算器;CCalculatorDlg类
中图分类号TP39 文献标识码 A 文章编号 1674-6708(2015)133-0091-02
在Visual C++中开发计算器的系统目标有四则运算作为计算器的最基本功能必需具备;在日常工作中,要经常进行三角函数运算;用户使用计算器时,都习惯用数字键区操作,程序除使用鼠标操作外,要能接收键盘输入以实现四则运算。
1 计算器系统功能分析
1)加、减、乘、除四则运算。
(1)操作数的输入。
(2)实现指定的四则运算。
(3)结果的显示。包括输入操作数、运算结果、及出错信息的显示
2)三角函数运算。
(1)操作数的输入。
(2)实现指定的三角函数运算。
(3)结果的显示。包括输入操作数、运算结果及出错信息的显示
2 计算器程序设计中CCalculatorDlg类的设计方法及相关代码分析
1)通过MFC AppWizard(EXE)新建一个基于对话框的工程,工程名为:Calculator,向导会生成CAboutDlg,CCalculatorApp,CCalculatorDlg三个类,并自动添加初始代码,此时的CCalculatorDlg类骨架已由系统生成,下段将按我们的功能要求来逐步完善这个类。
2)将对话框IDD_CALCULATOR_DIALOG按照计算器界面要求进行布局。(图1)
3)定义程序操作状态中用到的数据类型;
(1)在计算器四则运算中,运算操作主要有加、减、乘、除。
//运算类型
enum Operator {OpNone, OpAdd, OpSubtract, OpMultiply, OpDivide };
图1 界面布局
(2)常用的三角函数运算有正弦、余弦、正切等,其他函数主要有对数、阶乘等。
//函数类型
enum Func { FuncSin, FuncTan, FuncCos, FuncSqrt, FuncSqre, FuncLn, FuncLog, FuncN, FuncRec, FuncExp, FuncNone};
(3)四则运算中存在的错误主要是除零等。
//运算错误类型
enum CalcError { ErrNone, ErrDivideByZero };
4)在CCalculatorDlg类中添加成员变量及方法。
根据类封装性要求,成员尽量定义为私有类型。
//运算类型
enum Operator {OpNone, OpAdd, OpSubtract, OpMultiply, OpDivide};
//函数类型
enum Func {FuncSin, FuncTan, FuncCos, FuncSqrt, FuncSqre, FuncLn, FuncLog,FuncN, FuncRec, FuncExp, FuncNone};
//运算错误类型
enum CalcError {ErrNone, ErrDivideByZero};
#define PI 3.1415926//定义π值
class CCalculatorDlg : public CDialog
{
private:
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();//更新显示内容
为Edit编辑框及角度选框按钮添加成员变量m_result,m_iDegree,以进行界面与数据交互。
图2 添加成员变量
系统自动生成的代码如下所示。
// Dialog Data
//{{AFX_DATA(CCalculatorDlg)
enum { IDD = IDD_CALCULATOR_DIALOG };
CString m_result;//待显示字符串
int m_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
在类CCalculatorDlg构造函数中初始化各变量
// CCalculatorDlg dialog
CCalculatorDlg::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 Win32
m_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;//运算不可用
}
在BOOL CCalculatorDlg::OnInitDialog()方法中加入如下代码
图3 对话框初始化
参考文献
[1]C++Primer Plus中文版.5版.人民邮电出版社.
[2]Visual C++ 技术内幕.4版.清华大学出版社.
[3]面向对象程序设计.经济科学出版社.
[4]王健南.基于VC++的小型计算器程序设计[J].农业网络信息,2009(12).