面向对象程序设计
----简单计算器的设计
一、问题描述
简单计算器的基本功能如下:
1.四则运算,例如加减乘除等;
2.除了整数的运算也可实现小数的各类运算;
3.判断非法操作,例如判定1/0为非法操作;
4.其他特性;
这个简易计算器只实现以上所述功能,即实现简单计算。
二、设计思路
计算器起始运行在归零状态,此时只接受数字输入,当按下一个数字按钮时,计算器只显示用户输入第一个操作数,用户在该状态下可以继续输入数字。
1.当第一个数字输入完成后,可以接受第二个操作数。
2.在数字输入结束进行运算后,按下=按钮可以根据前面按下的操作符计算结果显示,表示计算完成。
3.在上述计算过程中都可以接受双击等号回到清零状态。
三、功能函数设计:
1.数字按钮
这个是通过最基本的OnButton()将0~9十个数字按钮的单击消息处理函数用类向导全部关联到此,适文本框应该只是显示当前单击的数字;
2.小数点按钮函数OnDecimal
这个函数主要是实现小数点在计算器的相关功能
3.列表在算法的函数OnSelchangeOperatorList()
这一类按钮包括“+”“-”“*”“/”,它们的单击消息在同一个处理函数中进行处理,以同样的方
法把这四个按钮的单击操作关联到此函数中,使四则运算法则在列表中通过选择去实现。
4.“=”符号函数OnEnquall()
实现计算器中等号的功能,双击时也可使编辑框的数字归零。
四、编码实现:
int calculator_type_i;
double count=10,value=0;
double Input_data_int=0,Input_data_dec=0;
double Inputdata1=0,Inputdata2=0;
char datatostr_buffer[10];
bool decimal=FALSE;
以上代码是添加的全局变量,为正确获取键盘输入供所有按钮函数使用。
// TODO: Add extra initialization here
m_OperatorBox.AddString("-");
m_OperatorBox.AddString("*");
m_OperatorBox.AddString("/");
m_OperatorBox.AddString("+");
以上代码是初始化列表框,并使其在程序运行时具有“加”“减”“乘”“除”可选择功能。
void CMyCalculatorDlg::On1Button()
{
if(decimal)
{
Input_data_dec=Input_data_dec+1/count;
count=10*count;
}
else Input_data_int=10*Input_data_int+1;
value=Input_data_int+Input_data_dec;
_gcvt(value,10,datatostr_buffer);
m_ShowResultEdit=(LPCTSTR)datatostr_buffer;
// TODO: Add your control notification handler code here
UpdateData(false);
}
void CMyCalculatorDlg::On2Button()
{
if(decimal)
{
Input_data_dec=Input_data_dec+2/count;
count=10*count;
}
else Input_data_int=10*Input_data_int+2;
value=Input_data_int+Input_data_dec;
_gcvt(value,10,datatostr_buffer);
m_ShowResultEdit=(LPCTSTR)datatostr_buffer; // TODO: Add your control notification handler code here
UpdateData(false);
}
void CMyCalculatorDlg::On3Button()
{if(decimal)
{
Input_data_dec=Input_data_dec+3/count;
count=10*count;
}
else Input_data_int=10*Input_data_int+3;
value=Input_data_int+Input_data_dec;
_gcvt(value,10,datatostr_buffer);
m_ShowResultEdit=(LPCTSTR)datatostr_buffer;
// TODO: Add your control notification handler code here UpdateData(false);
}
void CMyCalculatorDlg::On4Button()
{if(decimal)
{
Input_data_dec=Input_data_dec+4/count;
count=10*count;
}
else Input_data_int=10*Input_data_int+4;
value=Input_data_int+Input_data_dec;
_gcvt(value,10,datatostr_buffer);
m_ShowResultEdit=(LPCTSTR)datatostr_buffer;
// TODO: Add your control notification handler code here UpdateData(false);
}
void CMyCalculatorDlg::On5Button()
{if(decimal)
{
Input_data_dec=Input_data_dec+5/count;
count=10*count;
}
else Input_data_int=10*Input_data_int+5;
value=Input_data_int+Input_data_dec;
_gcvt(value,10,datatostr_buffer);
m_ShowResultEdit=(LPCTSTR)datatostr_buffer;
// TODO: Add your control notification handler code here UpdateData(false);
}
void CMyCalculatorDlg::On6Button()
{if(decimal)
{
Input_data_dec=Input_data_dec+6/count;
count=10*count;
}
else Input_data_int=10*Input_data_int+6;
value=Input_data_int+Input_data_dec;
_gcvt(value,10,datatostr_buffer);
m_ShowResultEdit=(LPCTSTR)datatostr_buffer;
// TODO: Add your control notification handler code here
UpdateData(false);
}
void CMyCalculatorDlg::On7Button()
{
if(decimal)
{
Input_data_dec=Input_data_dec+7/count;
count=10*count;
}
else Input_data_int=10*Input_data_int+7;
value=Input_data_int+Input_data_dec;
_gcvt(value,10,datatostr_buffer);
m_ShowResultEdit=(LPCTSTR)datatostr_buffer; // TODO: Add your control notification handler code here UpdateData(false);
}
void CMyCalculatorDlg::On8Button()
{if(decimal)
{
Input_data_dec=Input_data_dec+8/count;
count=10*count;
}
else Input_data_int=10*Input_data_int+8;
value=Input_data_int+Input_data_dec;
_gcvt(value,10,datatostr_buffer);
m_ShowResultEdit=(LPCTSTR)datatostr_buffer;
// TODO: Add your control notification handler code here
UpdateData(false);
}
void CMyCalculatorDlg::On9Button()
{if(decimal)
{
Input_data_dec=Input_data_dec+9/count;
count=10*count;
}
else Input_data_int=10*Input_data_int+9;
value=Input_data_int+Input_data_dec;
_gcvt(value,10,datatostr_buffer);
m_ShowResultEdit=(LPCTSTR)datatostr_buffer;
// TODO: Add your control notification handler code here
UpdateData(false);
}
void CMyCalculatorDlg::On0Button()
{if(decimal)
{
Input_data_dec=Input_data_dec+0/count;
count=10*count;
}
else Input_data_int=10*Input_data_int+0;
value=Input_data_int+Input_data_dec;
_gcvt(value,10,datatostr_buffer);
m_ShowResultEdit=(LPCTSTR)datatostr_buffer;
// TODO: Add your control notification handler code here UpdateData(false);
}
void CMyCalculatorDlg::OnDecimalButton()
{decimal=TRUE;
// TODO: Add your control notification handler code here }
void CMyCalculatorDlg::OnEqualButton()
{Inputdata2=Input_data_int+Input_data_dec;
decimal=FALSE;
Input_data_int=0;
Input_data_dec=0;
count=10;
switch(calculator_type_i)
{case 0:
value=Inputdata1-Inputdata2;
break;
case 1:
value=Inputdata1*Inputdata2;
break;
case 2:
if(Inputdata2==0)
{MessageBox("除数不能为0!");
break;
}
else
{ value=Inputdata1/Inputdata2;
break;
}
case 3:
value=Inputdata1+Inputdata2;
break;
}
_gcvt(value,10,datatostr_buffer);
m_ShowResultEdit=(LPCTSTR)datatostr_buffer;
UpdateData(false);
}
void CMyCalculatorDlg::OnChangeShowResultEdit()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
}
void CMyCalculatorDlg::OnErrspaceShowResultEdit()
{
// TODO: Add your control notification handler code here
}
void CMyCalculatorDlg::OnSelchangeOperatorList()
{Inputdata1=Input_data_int+Input_data_dec;
decimal=FALSE;
Input_data_int=0;
Input_data_dec=0;
count=10;
calculator_type_i=m_OperatorBox.GetCurSel();
// TODO: Add your control notification handler code here}
五、运行测试
截图如下:
1、计算器初始状态如下:
2、下面计算45+35,输入45,显示如下:
3、输入“-”,然后接着输入“35”,显示如下:
4、输入“=”,显示如下:
六、课程设计心得
做个这个课程设计,让我学习到了一些Visual C++6.0的基本使用步骤,以及对如何运用MFC 去进行应用程序的设计有一个初步的了解,此外让我从实践中掌握到了C++中类和相关函数,全局变量的应用。对于简单计算器功能的实现更是让我体验到了学习专业知识的重要性。