题目:字符串四则运算的实现
有字符串表示的一个四则运算表达式,要求计算出该表达式的正确数值。四则运算即:加减乘除"+-*/",另外该表达式中的数字只能是1位(数值范围0~9),运算不用括号。另若有不能整除的情况,按向下取整处理,eg: 8/3得出值为2。
举例:字符串"8+7*2-9/3",计算出其值为19。
考点:数字的字符形式变换为数字形式的方法。
分析:输入的值是字符形式的,输出的值是整型的,解决这个问题的关键就是将数字和运算符号的字符型转化成整型运算。在网上的大多解决方式都用到了栈且代码量较长,本次采用的方法思路比较直接,代码量也相对减少了很多。
#include <iostream>
#include <string>
using namespace std;
int main()
{
int i = 0;
string str;
cin >> str;
int n = str.length();
char *num = new char[n];
strcpy(num, str.c_str());
//char num[10] = "8+7*2-9/3";
int num2[15] = {0};
for (i=0;i<n;i++)
{
if (num[i] >= '0'&&num[i] <= '9')
{
num2[i] = num[i]-48;//char转换成int
}
}
for (i = 0; i < n; i++)
{
if (num[i] == '*')
{
num2[i - 1] = num2[i - 1] *num2[i + 1];
for (int j = i; j <(n-2); j++)
{
num[j] = num[j + 2];//长度-2
num2[j] = num2[j + 2];
}
}
if (num[i] == '/')
{
num2[i - 1] = num2[i - 1] /num2[i + 1];
for (int j = i; j <(n-2); j++)
{
num[j] = num[j + 2];//长度-2
num2[j] = num2[j + 2];
}
}
}
for (i = 0; i < n; i++)
{
if (num[i] == '+')
{
num2[i - 1] = num2[i - 1]+num2[i + 1];
for (int j = i; j <(n-2); j++)
{
num[j] = num[j + 2];//长度-2
num2[j] = num2[j + 2];
}
}
if (num[i] == '-')
{
num2[i - 1] = num2[i - 1] -num2[i + 1];
for (int j = i; j <(n-2); j++)
{
num[j] = num[j + 2];//长度-2
num2[j] = num2[j + 2];
}
}
}
cout << num2[0] << endl;
return 0;
}
输入“8+7*2-9/3”,num 和 num2 变量如图所示:
变量名| i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
num | 8 | + | 7 | * | 2 | - | 9 | / | 3 |
num2 | 8 | 0 | 7 | 0 | 2 | 0 | 9 | 0 | 3 |
先算乘除,后算加减,计算“ * ”运算后变量变成:
变量名| i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
num | 8 | + | 7 | - | 9 | / | 3 | / | 3 |
num2 | 8 | 0 | 14 | 0 | 9 | 0 | 3 | 0 | 3 |
计算“ / ”后:
变量名| i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
num | 8 | + | 7 | - | 9 | / | 3 | / | 3 |
num2 | 8 | 0 | 14 | 0 | 3 | 0 | 3 | 0 | 3 |
最后计算加减“ + - ”,num2[0] 就成了8+14-3=19.
运行如图所示: