1、武汉理工大学面向对象程序设计课程设计说明书1实用计算器程序1.基本功能描述计算器是人们日常生活中非常实用的计算工具。预期设计目标与实际计算器为标准,Windows 10 系统提供的计算器为范例进行设计。实用计算器 要实现单目运算和双目运算。单目运算主要包括阶乘、正弦、余弦;双目运算主要包括加、减、乘、除、乘幂等。计算器要能够对输入的各种数据进行处理,包括小数、整数、负数等数据进行操作。实际过程中要能够对不同的数据灵活判断执行。同时要能够对不满足运算符的操作数,提示出错信息以方便用户进行处理。用户的修改包括清屏和退格。程序设计的重点和难点在于:第一,能够对于不同的操作数和操作符进行连续运算,运算
2、过程中要有优先级的判断,根据优先级执行不同的运算顺序;第二,能够用一个编辑框实现运算表达式的显示和结果的输出。编程环境采用 Visual Studio 2017 提供的 MFC 建立对话框应用程序,设计界面要简单大方,并提供程序所有功能的接口。2.设计思路表 1 操作符优先级设计优先级 操作符1 阶乘、正弦、余弦2 乘幂3 乘、除4 加、减对对话框编辑框关联一个变量从中读取数据,按下数字键时对数据数组 num进行更新,其中 num0表示的是当前已经存储变量的个数。由于算法设计为四层优先级,且单目运算的优先级最高。当按下相应单目运算符,首先将当前数据数组的最后一个存储(防止按下 Backspac
3、e 退格发生错误) ,并将此位数据执行运算后重新赋值。但按下双目运算符相应按键后,将计数 num0+,同时将运算符的类型和位置记录。当按下等于之前,这样就将一个单目双目混合的运算表达式转化为双目运算。如果没有按下等号键,则继续执行循环。在按下等号按钮之后,按照先乘幂、再乘除、后加减的运算顺序执行武汉理工大学面向对象程序设计课程设计说明书2运算,将最后结果保存并显示。 (在实际的计算器中,执行完运算之后,按下运算符的操作键,最终结果将按照左操作数的形式出现,故需要保存变量。 )如果用户没有结束程序,在运行初始化程序,进行下一次运算,否则直接退出。开 始参 数 初 始 化是 否 为 数 值更 新
4、数 值 数 组是是 否 单 目 运 算是存 储 相 应 变 量 和 运算 符执 行 相 应 运 算否存 储 相 应 运 算 符是 否 按 下 等 于是按 照 优 先 级 执 行 运算是 否 结 束否否是结 束图 1 程序流程图武汉理工大学面向对象程序设计课程设计说明书33.软件设计3.1 设计步骤 1)创建基于对话框的程序利用 AppWizard 建立应用程序框架,创建一个基于对话框的 MFC 工程,命名为“fengwanjincalculator”,如图 2 所示。在图 3 显示的应用程序类型中选择基于对话框。创建成功后,系统自动生成相应程序文件。图 2 创建 MFC 工程图图 3 应用程序
5、类型选择图武汉理工大学面向对象程序设计课程设计说明书42)定义成员变量添加相应变量和标志位,以方便程序的编写,主要变量如表 2 所示:表 2 成员变量表变量名 变量类型 变量作用mystr CString 编辑框关联变量m_editFont CFont 设置编辑框字体num float 存储操作数flagdian bool 点号标志位flagdengyu bool 等号标志位flagerror bool 错误标志位Jiajian int 存储加减运算符的位置4)添加事件处理程序MFC 应用程序是通过消息响应来进行各项操作的,必须在对话类中加入消息处理函数来处理这些事件。当点击相应控件,在进入
6、WinMain 函数之前,每个可以响应消息的MFC 类都生成了一个消息映射表,程序运行时通过查询该表判断是否需要响应某条消息。在相应控件单击右键,弹出图 4,选择添加事件处理程序,在图 5 的事件处理程序向导中选择 fengwanjincalculatorDlg 类,消息类型选择为 BN_CLICKED,即左键单击。图 4 添加事件处理程序武汉理工大学面向对象程序设计课程设计说明书5图 5 选择添加事件处理程序类型在完成上述操作后 MFC 使用 ClassWizard 帮助实现消息映射,它在源码中添加一些消息映射的内容,并声明和实现消息处理函数。首先,在类的定义(头文件)里,它增加了消息处理函
7、数声明,并添加一行声明消息映射的宏 DECLARE_MESSAGE_MAP。在类的实现(实现文件)里,实现消息处理函数,并使用 IMPLEMENT_MESSAGE_MAP宏实现消息映射。BEGIN_MESSAGE_MAP*END_MESSAGE_MAP3.2 界面设计图 5 向对话框添加控件武汉理工大学面向对象程序设计课程设计说明书6在项目的资源视图中找到位于 Dialog 下的对话框,如图 4 所示。添加相应控件,完成用户界面设计。图 6 用户界面设计其中编辑框行为下 Multiline 属性设置为 True,作为多行编辑框。第一行显示算式,第二行结果。整体上将控件分为四组,数值控件区 NU
8、M,加减乘除一般运算控件区NORMAL,阶乘、乘幂、正余弦科学运算控件区 SCIENCE 以及清零退格控件。设计完成后的界面如图 7 所示。图 7 用户界面武汉理工大学面向对象程序设计课程设计说明书7设计的界面中只有编辑框关联 Cstring 类型变量 mystr。其余控件关联相应的消息处理函数。3.3 关键功能的实现程序主要分为数值、单目运算、双目运算、清除等。1) 数值控件消息处理函数void CfengwanjincalculatorDlg:OnBnClickedButton1()shuzihanshu(L1, 1);考虑到 09 数字的处理函数有很大的相似处,所以都采用调用 shuzh
9、ihanshu 函数的方法执行。shuzhihanshu 包含两个参数,分别是数值对应字符和相应数值。其具体实现如下:void CfengwanjincalculatorDlg:shuzihanshu(char shuzi, int shuzhi)/09 对应函数UpdateData(TRUE);if (flagdengyu)OnBnClickedButtonClear();flaglast = 0;mystr += shuzi;data = shuzhi;changevalue();UpdateData(FALSE);首先,判断再点击数值控件之前是否按下等号键,如果按下执行OnBnClick
10、edButtonClear(),即执行清除函数,然后将单击的数值显示在编辑框中。如果之前没有单击等号,则直接将数值添加到显示字符串的最后,通过 UpdateData(FALSE)更武汉理工大学面向对象程序设计课程设计说明书8新编辑框控件。同时需要将数值传递给 data,通过 changevalue()函数改变数值数组中的数值。2)双目运算消息处理函数void CfengwanjincalculatorDlg:OnBnClickedButtonJia()/加sincos();if (flaglast = 0)|(flaglast = jiecheng)shuangmusuanfu(L+, jia
11、);flaglast = jia;jiajian0+;jiajianjiajian0 = 1;双目运算首先设置相应标志和参数的改变,其主要的函数体部分由 shuangmusuanfu函数概括,其中 jia 参量为用枚举定义的一个常量。枚举定义如下:enum suit jia = 1 , jian , cheng , chu , jiecheng , zhishu , Sin , Cos ;shuangmusuanfu 中函数实现部分:函数体中首先对是否按下等号是否有表达式错误进行判断,如果相应标志为 1,则转到相应处理函数,否则将算符存储,数值计数器 num0加一。3)清除函数void Cfe
12、ngwanjincalculatorDlg:OnBnClickedButtonClear()UpdateData(TRUE);mystr = L“;flagdian = 0;beishu = 1;flagerror = 0;data = 0;武汉理工大学面向对象程序设计课程设计说明书9flagdengyu = 0;for (int i = 0; i LoadIcon(IDR_MAINFRAME);/ 自添加flagdian = 0;beishu = 1;flagerror = 0;data = 0;flagdengyu = 0;for (int i = 0; i SetFont( / 设置新字
13、体5、清屏函数void CfengwanjincalculatorDlg:OnBnClickedButtonClear()/ TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);mystr = L“;flagdian = 0;beishu = 1;flagerror = 0;data = 0;flagdengyu = 0;for (int i = 0; i = 48 mizhi0-)nummizhimizhi0 = pow(nummizhimizhi0, nummizhimizhi0+1);for (int i = mizhimizhi0+1; i mizhimizhi0
14、)if (chengchui 0)武汉理工大学面向对象程序设计课程设计说明书23chengchui -= 1;elsechengchui += 1;for (; chengchu0 0; chengchu0-)if (chengchuchengchu0 0)numchengchuchengchu0 *= numchengchuchengchu0 + 1;elseif (num-chengchuchengchu0 + 1 = 0)AfxMessageBox(_T(“除数不能为 0!“);flagerror = 1;OnBnClickedButtonClear();break;elsenum-ch
15、engchuchengchu0 /= num-chengchuchengchu0 + 1;武汉理工大学面向对象程序设计课程设计说明书24for (int i = abs(chengchuchengchu0) + 1; i num0; i+)numi = numi + 1;num0-;float sum = num1;for (int i = 2; i = num0; i+)sum += jiajiani-1 * numi;for (int i = 0; i 10; i+)numi = 0;num1 = sum;num0 = 1;8、双目算符对应函数void Cfengwanjincalcula
16、torDlg:shuangmusuanfu(char zifu,int shuzhi)/ 双目算符对应函数UpdateData(TRUE);if (flagdengyu = 1)mystr = L“;flagdian = 0;beishu = 1;flagdengyu = 0;for (int i = 0; i 10; i+)武汉理工大学面向对象程序设计课程设计说明书25jiajiani = 0;chengchui = 0;mizhii = 0;flaglast = 0;if (!flagerror)mystr.Format(_T(“%g“), num1);elsefor (int i = 0
17、; i 10; i+)numi = 0;flagdengyu = 0;num0+;/数值个数+if (!flagerror)mystr += zifu;flagdian = 0;beishu = 1;flagerror = 0;UpdateData(FALSE);武汉理工大学面向对象程序设计课程设计说明书269、09 对应函数void CfengwanjincalculatorDlg:shuzihanshu(char shuzi, int shuzhi)/09 对应函数UpdateData(TRUE);if (flagdengyu)OnBnClickedButtonClear();flagla
18、st = 0;mystr += shuzi;data = shuzhi;changevalue();UpdateData(FALSE);10、各控件消息响应函数void CfengwanjincalculatorDlg:OnBnClickedButton1()/ TODO: 在此添加控件通知处理程序代码shuzihanshu(L1, 1);void CfengwanjincalculatorDlg:OnBnClickedButton2()/ TODO: 在此添加控件通知处理程序代码shuzihanshu(L2, 2);武汉理工大学面向对象程序设计课程设计说明书27void Cfengwanji
19、ncalculatorDlg:OnBnClickedButton3()/ TODO: 在此添加控件通知处理程序代码shuzihanshu(L3, 3);void CfengwanjincalculatorDlg:OnBnClickedButton4()/ TODO: 在此添加控件通知处理程序代码shuzihanshu(L4, 4);void CfengwanjincalculatorDlg:OnBnClickedButton5()/ TODO: 在此添加控件通知处理程序代码shuzihanshu(L5, 5);void CfengwanjincalculatorDlg:OnBnClickedB
20、utton6()/ TODO: 在此添加控件通知处理程序代码shuzihanshu(L6, 6);void CfengwanjincalculatorDlg:OnBnClickedButton7()武汉理工大学面向对象程序设计课程设计说明书28/ TODO: 在此添加控件通知处理程序代码shuzihanshu(L7, 7);void CfengwanjincalculatorDlg:OnBnClickedButton8()/ TODO: 在此添加控件通知处理程序代码shuzihanshu(L8, 8);void CfengwanjincalculatorDlg:OnBnClickedButto
21、n9()/ TODO: 在此添加控件通知处理程序代码shuzihanshu(L9, 9);void CfengwanjincalculatorDlg:OnBnClickedButton0()/ TODO: 在此添加控件通知处理程序代码shuzihanshu(L0, 0);void CfengwanjincalculatorDlg:OnBnClickedButtonDian()武汉理工大学面向对象程序设计课程设计说明书29/ TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);if (flagdengyu)OnBnClickedButtonClear();elseif(fl
22、agdian=0)mystr += L“.“;flagdian = 1;flaglast = 0;UpdateData(FALSE);void CfengwanjincalculatorDlg:sincos()if (nextdata2 * (int)nextdata0 - 1 = Sin)nextdata2 * (int)nextdata0 = num(int)num0;num(int)num0 = sin(num(int)num0);nextdata2 * (int)nextdata0 - 1 = -Sin;if (nextdata2 * (int)nextdata0 - 1 = Cos)
23、武汉理工大学面向对象程序设计课程设计说明书30nextdata2 * (int)nextdata0 = num(int)num0;num(int)num0 = cos(num(int)num0);nextdata2 * (int)nextdata0 - 1 = -Cos;void CfengwanjincalculatorDlg:OnBnClickedButtonJia()/加/ TODO: 在此添加控件通知处理程序代码sincos();if (flaglast = 0)|(flaglast = jiecheng)shuangmusuanfu(L+, jia);flaglast = jia;jiajian0+;jiajianjiajian0 = 1;void CfengwanjincalculatorDlg:OnBnClickedButtonJian()/减/ TODO: 在此添加控件通知处理程序代码sincos();if (flaglast = 0) | (flaglast = jiecheng)