提示: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。。)
浙公网安备 33010602011771号