计算器功能实现——基于MFC

计算器功能实现——基于MFC

前言

前一篇blog讲述了计算器基于C++的核心算法的实现,主要运用到的式双栈操作计算表达式的值。虽然用C++写出来了完整代码,但是不能用Dev C++来实现与用户的交互,这时候及需要用到基于C++的MFC软件来实现。

1.MFC入门

首先MFC的安装环境是win10/64,基于的平台是Visual studio 2019,安装免费,教程网上也有,不做过多的赘述。当创建好一个MFC文件的时候我们需要认识并且了解该软件的功能,B站和CSDN上面诸如此类的教程也很多。我主要学习的是B站的up主JiUI极视觉的MFC教程。
本次实验所用到的模块比较少。首先创建一个项目,点击资源管理视图点击你创建好的文件子目录下的dialog文件夹,如图所示,打开IDD_XXXX_DIALOG这个模块。
VS操作界面
然后在那个MFC的框架中插入模块,这次主要用到的是button模块和Edit Control模块,第一个负责实现按钮输入的功能,第二个是实现显示字符串与运行结果的功能。先插入和排版实现计算器的一些基本功能,包含数字0到9和加减乘除,括号,删除以及归零等button模块。(如图所示)
在这里插入图片描述

2. 计算机数值模块,符号模块的提取与转换

处理好界面以及模块的设计之后,我们需要进行的操作就是双击该模块然后为每个模块需要实现的功能编写代码。数字键的代码设置我是在上面提到的B站的视频上学习的。有一点需要注意,因为代码需要的每一个模块的ID地址,所以在命名的时候我们需要尽量命名成有特殊含义的名字,方便记忆和查找。例如输入1数字button按键的代码如下图所示。
在这里插入图片描述
我们先定义一个cs的CString变量来存放字符串,GetDlgItemText这个函数用法是从Edit Control中的显示中提取一个字符串赋值给cs,然后GetDlgItemText是在提取出来的cs字符串后面可以输入一个+来表示添加的内容,比如加1,这时候因为“1”是char类型的不能直接添加,要用到_T来进行转化,把char类型的1转换为CString类型添加到Edit Control模块上然后显示出来,就完成了。与上述相似,将每一个模块的代码都添加上去。不过对于‘CE’,‘⬅’和‘=’需要实现其他功能。

3. 计算机特殊功能的实现

对于‘⬅’需要实现删除一个字符的功能,所以可以让屏幕上所有显示的字符长度减1来实现,具体代码如图。
在这里插入图片描述
而对与清零的’CE’键,需要将所有的屏幕的显示都清空,也就是将屏幕上的显示内容都变成空字符。代码如图所示。在这里插入图片描述
而对于‘=’按键功能的代码,需要实现将字符串提取出来,转换为string类型然后赋值给上面的C++求表达值的函数,然后可以求出来表达式的值。求出来表达式的值应该是double类型和int类型,然后要转换为CString类型在屏幕上显示出来。
在这里插入图片描述

4. 完整的程序实现

已经介绍了全部方法,实现起来还需要上次是讲到的C++求表达式值的函数。我们所应用到的MFC只是一个为用户创建交互工具的界面,所有求值之类的函数还是需要框架之中C++代码实现的。

int priority(int state, char a){
   
		int rank;
		switch (a) {
   
		case '+':
		case '-':
			rank = 1;//+,-优先级为1。 
			break;
		case '*':
		case '/':
			rank = 2;//*,/优先级为2。 
			break;
		case '(':// 保证“(”直接入栈 ,也不会干扰其他运算符判断。 
			if (state == 0)
				rank = 3;
			else
				rank = 0;
			break;
		case '#':
			rank = 0;//#表示结束。 
			break;
		default:
			break;
		}
		return rank;
	}//priority函数主要来判断栈里面运算符的优先级。 
double calculate(char op, double num1, double num2)
	{
   
		double anwser;
		switch (op) {
   
		case '+':
			anwser = num1 + num2;
			break;
		case '-':
			anwser = num1 - num2;
			break;
		case '*':
			anwser = num1 * num2;
			break;
		case '/':
			anwser = num1 / num2;
			break;
		default:
			break;
		}
		return anwser;
	}//calculate函数主要是实现两个数字的运算(包括加减乘除),以op来读取OP栈里面的运算符。 
double result(string s,int a,int &sign) {
   
	stack<char> OP;//定义OP栈来存放操作运算符。 
	stack<double> OPND;//定义OPND来存放需要运算的数字(包括小数)。
	OP.push('#');//先在运算符的栈之中放入一个中止运算符。 
	OPND.push(0);
	string num;//用来保存一个完整的运算数字。 
	for (int i = 0; i<a; i++) {
   //读取整个s字符串。	
		if ((s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/') && (s[i + 1] == '+' || s[i + 1] == '-' || s[i + 1] == '*' || s[i + 1] == '/'))
		{
   
			sign = 0;
			break;
		}
		if (isdigit(s[i])) {
   //判断是否为0到9的数字。 
			while (isdigit(s[i]) || s[i] == '.') {
   
				num.push_back(s[i]);//判断输入小数点之后,在末尾增加一个小数点。 
				i++;//继续后移一位,读入小数点后面的部分。 
			}
			double a = atof(num.c_str());//把上面读取出来的整个数字字符串转化为双精度类型的数字赋值给a。 
			OPND.push(a);// 将a这个数字放入OPND的栈之中。 
			num.clear();//清除num中的数字。 
			i--;
  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值