实现计算器的输入数据和求和功能
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实例5实现计算器的输入数据和求和功能
实现步骤:
1.创建对话框工程MyCaculator。
2.设计对话框界面。注意:将按钮0、1、2连续设置。如图所示:
3.设置各个控件的属性;参考如下:
4.添加消息处理函数
首先利用ClassWizard为编辑框控件增加CString型成员变量m_result,该变量用于显示结果。然后再增加相关的消息处理函数。参考如下:
5.On_COMMAND_RANGE宏
可以用上面同样的方法为数字按钮添加消息处理函数,使之响应鼠标单击而进行数据输入。但是对于数字输入来说,对不同的数字按钮所做的处理十分相似,如果采用上述方法就显得很烦琐。
6.我们可以利用On_COMMAND_RANGE宏,来处理一系列控件对同一消息处理函数的响应。不过,必须手动加入函数声明,分别在在CMyCaculatorDlg.h和CMyCaculatorDlg.cpp 中添加下面的语句:
CMyCaculatorDlg.h中:afx_msg void OnOperandInput(UINT nID);
位置在//{{AFX_MSG(CMyCaculatorDlg)和//}}AFX_MSG之间
CMyCaculatorDlg.cpp中:ON_COMMAND_RANGE(IDC_0,IDC_2,OnOperandInput) //注
//意:这句末尾不要分号
位置在//{{AFX_MSG_MAP(CMyCaculatorDlg)和//}}AFX_MSG_MAP之间。
说明:ON_COMMAND_RANGE(IDC_0,IDC_2,OnOperandInput)中的IDC_0表示按钮控件ID的起始值(这里是指控件“0”开始);IDC_2表示按钮控件的结束值(这里是指控件“2”);OnOperandInput 标识处理输入的函数。
7.在CMyCalculatorDlg的声明处(即CMyCaculatorDlg.h中)添加成员函数和成员变量,参考如下:
int m_operand; //存储当前输入的操作数
int m_accum; //存储当前的计算处理结果
Operator m_operator; //enum型变量用以标识当前运算符
CalcError m_errorState;//enum型变量用以标识当前运算状态
BOOL m_bOperandAvail; //标识当前输入是否是新输入数字
void Calculate(); //处理计算
void UpdateDisplay();//处理显示
其中Operator为enum型结构,用来存储计算符,必须要在CMyCaculatorDlg.h中按照下面的方式定义:
enum Operator { OpNone, OpAdd}; //操作符可以为加法,可以为无
8.完善代码:
①处理输入
●使用m_operrand来存储当前的输入。
●使用OnOperandInput函数来处理,每次单击数字按钮就会调用该函数。
在每次输入时都必须将输入的数字累加入m_operand中,对于整数的累加方式:
m_operand=m_operand*10+(nID-IDC_0); //n为输入的数字
●需要判断当前是不是进行新的计算输入,函数中使用布尔变量
m_bOperandAvail作为标识。当按下任意一个计算符按钮,在响应的消息处理
函数中将m_bOperandAvail设为假(0),即表示开始新的计算数输入。
●初始化部分变量。根据面向对象德概念,初始化工作可以放在构造函数实现,
本程序CMyCaculatorDlg的构造函数中添加:
m_operator=OpNone; //刚开始没有任何计算符
m_bOperandAvail=FALSE;//初始化m_bOperandAvail,表示没有新的输入●数字输入处理函数OnOperandInput()的实现参考代码:
void CMyCaculatorDlg::OnOperandInput(UINT nID)
{
ASSERT(nID >= 0 && nID <= IDC_2);//ASSER宏,用来判断传递给它的
//条件表达式。
if (!m_bOperandAvail) //是不是输入新的计算数,0-否,1-是
{m_operand = 0;}
m_operand=m_operand*10+(nID-IDC_0);// 将输入的数字累加入m_operand
m_bOperandAvail=TRUE;
UpdateDisplay();//更新显示
}
●处理“+”按钮函数OnAdd()
void CMyCaculatorDlg::OnAdd()
{
// TODO: Add your control notification handler code here
Calculate();
m_operator = OpAdd;
}
●处理“=”按钮函数OnEqual()
void CMyCaculatorDlg::OnEqual()
{
// TODO: Add your control notification handler code here
Calculate();
m_operator = OpNone;
}
●处理计算函数Caculate()
分析说明:该函数是完成计算器应用程序功能的主要部分,在该函数中完成了计算的中间处理和结果。每当运算符被按下,应用程序就会调用该函数。
当该函数被调用时,首先判断当前是否满足运算条件,即两个计算数和一个运算符,若满足条件就进行计算,否则将当前计算数m_operand赋给m_accum 后返回。参考代码如下:
void CMyCaculatorDlg::Calculate()
{
if (m_bOperandAvail)
{
if (m_operator == OpNone)//若没有计算符就将m_operand值赋给m_accum m_accum = m_operand;
else if (m_operator == OpAdd)
m_accum += m_operand;
}