【问题描述】
从标准输入中读入一个整数算术运算表达式,如5 - 1 * 2 * 3 + 12 / 2 / 2 = 。计算表达式结果,并输出。
要求:
1、表达式运算符只有+、-、*、/,表达式末尾的’=’字符表示表达式输入结束,表达式中可能会出现空格;
2、表达式中不含圆括号,不会出现错误的表达式;
3、出现除号/时,以整数相除进行运算,结果仍为整数,例如:5/3结果应为1。
【输入形式】
在控制台中输入一个以’=’结尾的整数算术运算表达式。
【输出形式】
向控制台输出计算结果(为整数)。
【样例1输入】
5 - 1 * 2 * 3 + 12 / 2 / 2 =
【样例1输出】
2
【样例2输入】
500 =
【样例2输出】
500
【样例1说明】
输入的表达式为5 - 1 * 2 * 3 + 12 / 2 / 2 =,按照整数运算规则,计算结果为2,故输出2。
【样例2说明】
输入的表达式为500 = ,没有运算符参与运算,故直接输出500。
算法之一提示:
1、可以利用gets函数,读取整行表达式;
2、对于空格,可以考虑首先去除表达式中的所有空格
3、可以设一计数器用来记录已读取、但未参加运算的运算符的个数,根据该计数器来判断如何进行运算;
4、可以设计一函数:实现二元整数算术运算。
解法一:
#include<stdio.h>int cal(int a, int b, char op); // 做运算
int readNum(); // 读一个数
char readOp(); // 读一个运算符int main()
{int a[2]; // 放置开始的两个数值char b[1]; // 放置第一个操作符int num; // 下一个数char op; // 下一个操作符a[0] = readNum();b[0] = readOp();if (b[0] != '=')a[1] = readNum();while (b[0] != '='){if (b[0] == '*' || b[0] == '/') // 表示可以马上运算,运算后,又回到初始状态{a[0] = cal(a[0], a[1], b[0]);b[0] = readOp();if (b[0] != '=')a[1] = readNum();}else // 说明第一个运算是加减法,需要看后面的运算{op = readOp();if (op == '+' || op == '-' || op == '='){a[0] = cal(a[0], a[1], b[0]);b[0] = op;if (op != '=')a[1] = readNum();}else if (op != '=') // 第二个是高优先级运算符,需要先计算{num = readNum();a[1] = cal(a[1], num, op);}else // op == '='b[0] = op;}}// b[0] == '=', 结束printf("%d\n", a[0]);return 0;
}int cal(int a, int b, char op)
{int result;if (op == '+')result = a + b;else if (op == '-')result = a - b;else if (op == '*')result = a * b;elseresult = a / b;return result;
}int readNum()
{int num;scanf(" %d", &num);return num;
}
char readOp()
{char op;scanf(" %c", &op);return op;
}
解法二:
#include <stdio.h>
#include <string.h>
char str[1028], fir[1028], type[1028], pmtype[2018];
int numb[1028], pmnumb[1028];int main() {fgets(str, 1028, stdin);for (int i = 0, j = 0; i < strlen(str); i++) {if (str[i] != ' ')fir[j++] = str[i];} // printf("%s",fir);for (int i = 0, j = 0, k = 0, l = 0; i < strlen(fir); i++, j++) {if (fir[i] == '+' || fir[i] == '-' || fir[i] == '*' || fir[i] == '/' ||fir[i] == '=')type[k++] = fir[i];if (fir[i] >= 48 && fir[i] <= 57) {for (int length = 1; length < 11; length++) {if (fir[i + length] >= 48 && fir[i + length] <= 57)continue;int n = 1, num = 0, w;for (w = length; w > 0; w--) {num += (fir[i + w - 1] - '0') * n;n *= 10;}numb[l++] = num;i += length - 1;break;if (fir[i + length] < 48 || fir[i + length] > 57)break;}}}/*for(int i=0;i<strlen(type);i++){printf("%c ",type[i]);}for(int i=0;i<strlen(type)+1;i++){printf("%d ",numb[i]);}*/for (int i = 0, j = 0; i < strlen(type) + 1; i++) {if (type[i] == '+' || type[i] == '-' || type[i] == '=') {pmnumb[j] = numb[i];pmtype[j] = type[i];j++;}if (type[i] == '*') {numb[i + 1] *= numb[i];}if (type[i] == '/') {numb[i + 1] = numb[i] / numb[i + 1];}}int put = pmnumb[0];for (int i = 0; i < strlen(pmtype); i++) {if (pmtype[i] == '+') {put += pmnumb[i + 1];}if (pmtype[i] == '-') {put -= pmnumb[i + 1];}}printf("%d", put);return 0;
}