問題描述:輸入一個不含括號的四則運算表達式,輸出計算結果。
方法:四則運算只有兩種優先級,在輸入兩步計算(三個操作數)之後一定能得到一個結果。如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;
}
測試案例: