C++课程设计实验报告学号姓名院系专业一、课题名称简易的计算器设计。
二、问题陈述编写一个计算器程序,能够进行四则运算、取模等运算要求:1、个人完成;2、运用对话框编写,界面上只能有一个输出框,数据通过按钮输入到程序,并显示在输出框中;当按下运算符后再输入数据,输出框中应显示新数据;运算结果也显示在输出框中。
3、四则运算、取模运算是最低要求,程序能正确执行;4、界面设计美观、合理;5、独立完成;三、设计目标和设计任务编写一个计算器程序,能够进行四则运算、取模、乘方、立方,并且给计算器程序添加背景。
四、解题算法思想1.创建一个基于对话框的项目2. 给对话框加入相应的操作按钮3. 给按钮加上代码,设置属性4. 为实现四则运算、取模等操作添加必要函数五、程序算法过程①选择File→New菜单命令,选择Project选项卡,并选择MFC AppWizard(exe), name 命名为calculator;选择应用程序基于对话框,即Dialog based。
多次单击next,最后单击Finish后,系统弹出一对话框,如下图:②使用按钮控件、文本编辑框控件和组控件,将他们加入到对话框中,并通过更改按钮控件的属性中的标题部分。
选中所有按钮,在属性中的Extended Style中选中Modal frame,使其达到下图效果:(注意,在布局按钮时,为了使按钮总体整齐美观,可以先创建一行或一列按钮,使他们保持整齐后,按住Ctrl键,选中这一行或一列按钮,再移动鼠标,即可生成另一行或一列按钮;也可以通过Layout菜单中的指令对其进行布局)③鼠标右击按钮控件,选择属性,即可对其ID进行更改,各ID与标题内容对应如下:ID 标题ID 标题IDC_BUTTON0 0 IDC_BUTTONCLS 清零IDC_BUTTON1 1 IDC_ADD +IDC_BUTTON2 2 IDC_PLUS -IDC_BUTTON3 3 IDC_MULTIPL Y *IDC_BUTTON4 4 IDC_DEVIDE /IDC_BUTTON5 5 IDC_EQUALL =IDC_BUTTON6 6 IDC_QUM 取模|IDC_BUTTON7 7 IDC_SQU 平方IDC_BUTTON8 8 IDC_CUB 立方IDC_BUTTON9 9④在对话框非控件部分单击鼠标右键,打开类向导ClassWizard,将数字按钮0~9关联到函数OnEnternum(),方法为单击数字按钮ID,然后单击Message中的BN_CLICKED,最后单击右侧的Add Function,在其中输入函数名即可。
如下图:用相同的方法,将运算符+、-、*、/ 按钮关联到函数OnComputer(),将清零按钮关联到函数OnButtoncls(),将等号按钮关联到函数OnEquall(),将取模按钮关联到函数OnQum (),将平方按钮关联到函数OnSqu(),将立方按钮关联到函数OnCub()。
⑤为文本编辑框IDC_EDIT1添加关联float型变量m_nnum。
方法为打开类向导,单击Member Variables选项卡,选中IDC_EDIT1,单击右侧的Add Variable...,在弹出的对话框中添加变量。
如下图:添加类成员变量,它们的名称及用途为:private:BOOL m_bnext;//记录在键入数据后是否键入过运算符int m_ncomflag;//记录键入运算符次数float m_numold;//记录上次运算的结果operation m_oper;//记录上次运算符号方法为在Class View 选项卡中打开CCalculatorDlg,在class CCalculatorDlg : public CDialog 中添加上述代码。
如下图:同时添加代码:typedef enum{add,plus,multiply,devide}operation;//定义一个数据类型,该类型的变量值只//能在enum定义的范围内取,即add,plus,multiply,devide。
⑥接下来为各个函数添加代码。
代码内容及解释如下:void CCalculatorDlg::OnEnternum(){// TODO: Add your control notification handler code hereCString strnum,strold;//定义两个CString类型的变量,方便之后字符串的拼接。
this->GetDlgItemText(IDC_EDIT1,strold);//获得编辑框控件内显示的标题,并将它赋//给strold。
this->GetFocus()->GetWindowText(strnum);//将所按下的数字符的标题内容赋给strnum。
if(m_bnext)//bnext变量在此的作用是判断输入数字符前,是否已输入操作符。
m_bnext//的初始值为TURE。
{this->SetDlgItemText(IDC_EDIT1,strnum);//如果m_bnext的值为TURE,即已输入//操作符,则将编辑框控件内的正文直接重置为strnum的值。
m_bnext=FALSE;//由于按下了数字符,故将m_bnext的值设为FALSE,为下一次数//字的输入做好准备。
}else{if(strold=="0")this->SetDlgItemText(IDC_EDIT1,strnum);//若编辑框内的数字显示为零(即第一次//按下的数字符是0),也要将编辑框的正文重置。
elsethis->SetDlgItemText(IDC_EDIT1,strold+strnum);//将编辑框控件内的正文设//置为strold+strnum,即将新按下的数字符拼接在原编辑框正文之后。
}UpdateData(TRUE);//将编辑框显示的内容传递给m_nnum。
}void CCalculatorDlg::OnComputer(){// TODO: Add your control notification handler code hereCString stroper;m_ncomflag++;//变量m_ncomflag的作用是记录操作符的键入次数。
m_bnext=TRUE;//由于按下了操作符,故将m_bnext的值置为TRUE。
if(m_ncomflag>1)//以下代码是为了应对出现的连续运算而设计的。
{m_numold=computer(m_numold,m_oper);//m_numold的作用是记录下上次运算的结//果。
this->GetFocus()->GetWindowText(stroper);//将所按下的操作符的标题内容赋给//stroper。
if(stroper=="+")m_oper=add;if(stroper=="-")m_oper=plus;if(stroper=="*")m_oper=multiply;if(stroper=="/")m_oper=devide;//四种符号对应四种运算,方便接下来在computer函数//中的运算执行过程。
}else//以下代码应对出现的简单运算过程,例如执行1+1= 。
{ this->GetFocus()->GetWindowText(stroper);if(stroper=="+")m_oper=add;if(stroper=="-")m_oper=plus;if(stroper=="*")m_oper=multiply;if(stroper=="/")m_oper=devide;m_numold=m_nnum;//将当前m_nnum的值保存在m_numold中。
}m_nnum=m_numold;//这句代码也是为了能将连续运算中的中间结果显示到编辑框内//而设计的。
UpdateData(FALSE);//刷新编辑框的显示内容。
}其中函数computer()是添加的一个成员函数,其代码为:float CCalculatorDlg::computer(float num,operation m_oper)//computer函数是运算的实际执行//函数。
{float result;switch(m_oper)//根据键入的不同操作符,执行不同的操作。
其中,m_nnum为当前编辑框//的显示内容。
{case add:result=num+m_nnum;break;case plus:result=num-m_nnum;break;case multiply:result=num*m_nnum;break;case devide:if(m_nnum==0){AfxMessageBox("除数为零,出错!");result=0;exit;//考虑到除数为零的情况。
}elseresult=num/m_nnum;break;}return result;//返回运算结果。
}还要在class CCalculatorDlg : public CDialog中添加对该函数的原型声明:float computer(float num,operation oper);//函数的原型声明。
void CCalculatorDlg::OnButtoncls() //清零函数。
{// TODO: Add your control notification handler code here this->SetDlgItemText(IDC_EDIT1,"0");m_numold=0;}void CCalculatorDlg::OnQum() //执行取模操作{// TODO: Add your control notification handler code here if(m_numold>=0)m_nnum=m_numold;elsem_nnum=-m_numold;m_numold=m_nnum;UpdateData(FALSE);}void CCalculatorDlg::OnSqu() //执行平方操作{// TODO: Add your control notification handler code here m_nnum=m_nnum*m_nnum;UpdateData(FALSE);}void CCalculatorDlg::OnCub() //执行立方操作{// TODO: Add your control notification handler code here m_nnum=m_nnum*m_nnum*m_nnum;UpdateData(FALSE);}此外,要在对话框类的初始化函数中,对变量进行初始化: BOOL CCalculatorDlg::OnInitDialog(){...//TODO:Add extra initialization herem_ncomflag=0;m_nnum=0;UpdateData(FALSE);}⑦最后,为了是对话框美观,添加背景图片。