文档介绍:成 绩
评卷人
姓 名
周楚
学 号
2012112821
入来到B状态,表示接受第2个操作数。B接受一个数字按钮后来到C状态,在C状态下可以继续输入数字或单操作数按钮,类似A状态下的情况。
(2)在C状态时,按下“=”按钮就可以根据A->B状态按下的操作符号计算结果显示,来到D状态,表示计算完成。在B状态也可以直接接受“=”跳转到D状态,例如用户输入“5*=”的情况,这时结果显示25,前后俩个操作数相同。
(3)D状态(计算完成)时可以对计算结果进行单数字操作符运算,状态不变。另外,还可以双数字操作符来到B状态,将结果与另一个数再做运算。还有就是可以直接输入数字,则认为用户开始了另一场运算,跳转到A状态。
(4)在A、B、C、D中的任何一个状态,当按下CE按钮后,计算器都无条件的回到CE状态。另外,在A、C状态中可以接受BACKSPACE按钮进行退位操作,并且不改变状态。此外,在A、C状态中一旦对当前数字进行啦S_OP但数字操作,将不能继续接受num按钮、BACKSPACE按钮、小数点按钮,为啦减少复杂度,在本程序中没有考虑到这些特殊特性。
该简易计算器的实现主要分为3步:实现对数字按钮0-9的响应、设置操作符、设置计算器状态。
(1)实现对数字按钮0-9的响应
数字0-9共有10个按钮,将有10个成员函数,还有10个ON_BN_CLICKED宏,而这10个函数的基本响应过程都相同,只是参数不同。MFC提供了一组宏用来处理一连串在数值上相近的消息或者控件ID的处理过程。例如,ON_CONTROL_RANGE、ON_NOTIFY_RANGE、ON_UPDATE_COMMAND_UI_RANGE、ON_COMMAND_RANGE等,本程序使用ON_CONTROL_RANGE宏。使用该宏需要手工编写代码,不能由向导帮助完成。
a.,在DECLARE_MESSAGE_MAP()宏上面的“//{{AFX_MSG(CCaculaterDlg)”和“//}}AFX_MSG”的区间添加如下代码: afx_msg void OnNum(UINT uID);
b.,添加函数实现,测试宏功能,代码如下所示:
void CCaculaterDlg::OnNum(UINT uID)//响应数字按钮
{
UINT index=uID-IDC_NUM_0;
CString num;
CString str;
int i=0;
(_T("%d"),index);
switch(st)
{
case _CE:
str=num;
(str);
st=_A;
break;
case _A:
(str);
str+=num;
(str);
break;
case _B:
str=num;
(str);
st=_C;
break;
case _C:
(str);
str+=num;
(str);
break;
case _D:
str=num;
(str);
st=_A;
break;
default:;
}
}
b.最后添加消息映射,在BEGIN_MESSAGE_MAP\END_MESSAGE_MAP()内添加如下代码:ON_CONTROL_RANGE(BN_CLICKED,IDC_NUM_0,IDC_NUM_9,OnNum)
(2)设置操作符
在CCalculatorDlg类中添加操作符枚举类型,代码如下:
enum _operator_//操作符枚举类型
{
add,
minus,
multi,
div,
mod,
none
};