提示:MFC实现计算器系列,后一篇均在前一篇基础上改进

两个工作:加上小数点,实现小数计算;实现键盘输入功能;

加上小数点,实现小数计算:
1、添加小数点按钮,添加事件处理程序;
2、修改Tool类的相关函数,让其支持小数运算,-- 在转后缀表达式时,把小数点当作数字处理即可,在计算后缀表达式时,遇到小数点,则把小数点后面的数据部分按照小数来整合;
3、修改运算符控制函数,开头是小数点,也需强制加前导0;小数点前面是运算符,即运算符后面按下了小数点,则在两个符号之间插入一个0;此外,需要添加一个标志,用来控制一个数据串里面只能存在一个小数点;
4、在除法数据校验中,数据的组成要注意小数点,同时设定小于ie-25为0,当除号后面跟的数据小于这个阈值,判定为输出的被除数为0,弹出警告,做出相应处理;(不过这里会有问题的,计算精度完全跟不上,显然是不能直接用这种给出的数据类型去做这超大数的计算的,需要用一些别的方法,曾经遇到过一些计算大数的计算方法,忘记了,日后有时间补上来)

实现键盘输入功能:
同样,利用PreTranslateMessage和OnChar函数,MFC实现计算器01之单文档之前在单文档实现计算器中提到过了,OnChar函数中的参数UINT nChar,所存储的就是当前按下键盘的字符的ASCII码,然后判断这个按键是代表的哪一个个字符,然后便可以调用函数进行处理,借用之前点击按钮写的代码,即可方便实现。
 1 // 响应WM_CHAR消息
 2 // nChar -> 字符的ASCII码
 3 void CJSQ0718Dlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
 4 {
 5     // TODO: 在此添加消息处理程序代码和/或调用默认值
 6     if ((nChar >= 48 && nChar <= 57) || nChar == 46)        // 0123456789.
 7     {
 8         OnButtonData(char(nChar));
 9     }
10     else if (nChar == 47 || nChar == 42 || nChar == 43 || nChar == 45)        // +-*/
11     {
12         OnButtonOperator(char(nChar));
13     }
14     else if (nChar == 61)                    // = 
15     {
16         OnButtonEqualSign();
17     }
18     else if (nChar == 8)
19     {
20         OnButtonDelete();
21     }
22     else
23     {
24         MessageBox(L"请输入正确字符!");
25     }
26     CDialogEx::OnChar(nChar, nRepCnt, nFlags);
27 }

代码冗余问题:解决表达式构建,即每一个按钮(0-9、*/+-)对应的事件处理程序的重复代码,在事件处理程序里面,调用下面两个函数就可以实现了,不必每个都写一堆重复代码。

 1 // 运算符
 2 void CJSQ0718Dlg::OnButtonOperator(char ch_op)
 3 {
 4     flag = FALSE;
 5     SymbolControl(ch_op);                // 运算符控制 -- 及加入表达式
 6     DivisionDataCheck();                // 除法数据校验
 7     Text_result.SetWindowText(result);
 8 }
 9 
10 // 数字+小数点
11 void CJSQ0718Dlg::OnButtonData(char ch_data)
12 {
13     flag = FALSE;
14     if(ch_data == '.')
15         SymbolControl(ch_data);            // 控制小数点的输入
16     else
17         result += ch_data;
18     Text_result.SetWindowText(result);
19 }

其实还是有很多都没说清楚,不过大致的结构与设计就是这样了,剩下的编写代码都是需要自己研究琢磨一下,如何控制,有时间会把项目放上来,等我勤快的那一天。。。
其中Tool是处理表达式,计算表达式的程序,主要完成中缀转后缀,计算的任务,其间也做了一下改动,避免计算过程出现被除数为0。
CJSQ0718Dlg就是这个对话框类了,主要代码都在这里,有些地方写的有点乱,尽量写详细注释。。。MFC实现计算器05之重构+健壮性

就此结束了

2022-08-10(0718。。)

posted on 2022-08-10 11:39  长风青云  阅读(512)  评论(0)    收藏  举报