zl程序教程

您现在的位置是:首页 >  其它

当前栏目

简单计算器

简单 计算器
2023-09-27 14:28:32 时间

给定一个包含正整数、加(+)、减(-)、乘()、除(/)的算数表达式(括号除外),计算其结果。表达式仅包含非负整数,+, - ,,/ 四种运算符和空格 。 整数除法仅保留整数部分。

示例 1:
输入: "3+2*2"
输出: 7
 
示例 2:
输入: " 3/2 "
输出: 1
 
示例 3:
输入: " 3+5 / 2 "
输出: 5

思路:
使用五个参数,从表达式前三个数开始计算,每计算完两个数的结果,就向后补齐成三个数的表达式直至表达式计算完成。

详解:
在不需要使用‘()’的简单计算器中,一个四则运算的表达式可以拆分为含有两个操作符,三个数字的简单表达式,num1 opt1 num2 opt2 num2 (类比:1 + 2 - 3):

1.当opt1(+)的优先级大于opt2(-)时。先算 n1 + n2 ,得到结果作为新表达式的 n1 ,而原opt2 变成新表达式的 opt1、原n3变n2。

n1 + n2 - n3;
(n1+n2)-n3;
n1-n2;	// 此时的n1是原n1+n2

2.当opt1(+)的优先级小于opt2(*)时。先算 n2 * n3 ,得到结果作为新表达式的 n2。

n1 + n2 * n3;
n1+(n2*n3);
n1-n2;	// 此时的n2是原n2*n3

3.每进行一次运算,数字和操作符各自减少一个,我们把表达式中剩余的式子按顺序取一个操作符和数字变成新的opt2,和num3 。此时,有组成了 n1 opt1 n2 opt2 n3的组合。

循环以上过程可以计算完整个表达式。

bool MaxOpter(char a, char b)
{
	if (a == '*' || a == '/')
	{
		return true;
	}
	else
	{
		if (b == '+' || b == '-')
			return true;
		else
			return false;
	}
}
int execute(int a, char opt, int b)
{
	int ret = 0;
	if (opt == '+')
	{
		ret = a + b;
	}
	else if (opt == '-')
	{
		ret = a - b;
	}
	else if (opt == '*')
	{
		ret = a * b;
	}
	else if (opt == '/')
	{
		ret = a / b;
	}
	else
	{
		perror("opter is error");
	}
	return ret;
}


int Calc()
{
	int num1, num2, num3;
	char opt1, opt2;
	scanf("%d", &num1);		// 接受第一个数
	opt1 = getchar();
	scanf("%d", &num2);
	opt2 = getchar();
	while (opt2 != '\n')
	{
		scanf("%d", &num3);
		if (MaxOpter(opt1, opt2))	// opt1 > opt2
		{
			num1 = execute(num1, opt1, num2);	// 和 成为新表达式的第一项,num1,opt1 
			opt1 = opt2;
			num2 = num3;	// 本次计算,num3没有参与,
						// 计算num1+num2后成为新的num1,则原来num3成为num2

		}
		else
		{
			num2 = execute(num2, opt2, num3);
		}
		opt2 = getchar();
	}
	return execute(num1, opt1, num2);
}


int main()
{

	while (1)
	{
		printf("%d \n", Calc());

	}


	return 0;
}

除此之外,我们还可以使用后缀式进行计算,详情请参考:C++ | 栈的应用(逆波兰算法) | 计算器