这是老生常谈的奇异题目。原题如下:
模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。
输入格式:
输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。
输出格式:
在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。
输入样例:
1+2*10-10/2=
输出样例:
10
其中一种写法如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
// 头文件和调教VS
int main() {
// 定义一个变量保存上一个计算法则
// 最开始输入数字而没有符号的话,默认为加法运算
char type = '+';
// 定义变量,sum为全局总和,temp为待操作数
int sum = 0, temp = 0;
// 派蒙大循环,必定为真,一直执行
while (1) {
// 每次循环重新定义并读入一个字符
// 这个字符是单独一个数字或运算符,或等号
char inp;
scanf("%c", &inp);
// 判断是否为简单运算支持的运算符号,包括0-9数字(注意数字以 %c 传入不是数值本身)和四个运算符号、一个等号
if (
!(
(inp == '+' || inp == '-' || inp == '*' || inp == '/' || inp == '=')
||
(inp >= '0' && inp <= '9')
)
) {
// 如果不支持直接自爆并返回0,退出程序
printf("ERROR");
return 0;
}
// 判断是否遇到的是运算符号
if (inp == '+' || inp == '-' || inp == '*' || inp == '/' || inp == '=') {
// 如果是运算符号,就把临时数字运算到总和中
if (type == '+') {
sum += temp;
}
else if (type == '-') {
sum -= temp;
}
else if (type == '*') {
sum *= temp;
}
else if (type == '/') {
sum /= temp;
}
// 如果遇到等号,则准备输出结果
if (inp == '=') {
// 输出最终结果并自爆,退出程序
printf("%d", sum);
return 0;
}
// 更新运算法则,并重新对临时数字置零
type = inp;
temp = 0;
}
// 输入被支持但不是上述符号,则是数字,那么当数字处理
else {
// 如果除0,自爆并退出
// 判断除0的条件为:上一个运算符是0,这次输入的数字是0,且这个输入是临时数字的第一个数字
if (inp == '0' && temp == 0 && type == '/') {
printf("ERROR");
return 0;
}
// 把输入的字符转换为真实数字,并添加到临时数字末尾
// 对临时数字乘10,再加输入的数字
// 比如临时数字是 123,要把 4 加到末尾
// 就是 123 * 10 + 4 = 1234
temp = temp * 10 + (inp - 48);
}
}
}