问题描述:输入一个不含括号的四则运算表达式,输出计算结果。
方法:四则运算只有两种优先级,在输入两步计算(三个操作数)之后一定能得到一个结果。如1-2*3,无论3后的操作符是什么,2*3都可以先计算。则1-2*3=1-6,继续读取操作符,如1-6+2,继续重复上面操作。
编译环境:vc++6.0
#include <stdio.h>
#include <stdlib.h>
double get_oprand() //获取操作数
{
double value;
scanf("%lf", &value);
return value;
}
char get_operator() //获取四则运算符
{
char op;
do
{
scanf("%c", &op);
} while (op == ' ');
return op;
}
int prior(char op1, char op2) //判断运算符优先级
{
int flag;
if (op1 == '*' || op1 == '/')
if (op2 == '+' || op2 == '-')
flag = 1;
else flag = 0;
else if (op2 == '*' || op2 == '/')
flag = -1;
else flag = 0;
return flag;
}
double evaluates(double left, char op, double right) //四则运算
{
{
switch (op)
{
case '+':return left + right; break;
case '-':return left - right; break;
case '*':return left * right; break;
case '/':
if (right != 0)
return left / right;
else
{ //除数为零
printf("除数不合法,检查是否为零\n");
exit(1); //强制结束程序
}
default:return 0.0;
}
}
}
int main()
{
double value1, value2, value3, result;
char op1, op2; //四则运算符
value1 = get_oprand();
op1 = get_operator();
value2 = get_oprand();
op2 = get_operator();
while (op2 != '\n') //没有结束时
{
value3 = get_oprand();
if (prior(op2, op1))
value2 = evaluates(value2, op2, value3);
else
{
value1 = evaluates(value1, op1, value2);
op1 = op2;
value2 = value3;
}
op2 = get_operator();
}
result = evaluates(value1, op1, value2); //最后两个数之和
printf("结果为%lf\n", result);
return 0;
}
测试案例: