读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
Sample Output
3.00
13.36
题意描述:
输入一行表达式算出结果数值;
解题思路:
将每一个小单元计算(当遇到输入的字符是加减时表示前一个数可以做为一个小单元,遇到的是乘除是讲当前结果存到sum里面来对进行输入下一个数时进行运算)的结果存储到一个数组中去然后将结果相加就好;在计算到的时候只需要在遇到加和减时将以前的结果存储到一个单元中把输入的数进行下一次加减乘除运算;
当前我也有提到在计算的时候sum表示的是一个数,或者两个数的乘和除;
原因:因为遇到加法减法时前面计算的结果对当前的数值在最后加减是没有影响的;
实际上通过暑假这一段时间的训练明白了当你在看一段代码当你看不懂的时候不妨将样例代入查看,在用样例跑代码的时候就会明白代码的意思;
AC代码:
#include<stdio.h>
#include<string.h>
int main()
{
int t,k;
char c;
double sum,num[1000];
while(scanf("%d", &t)!=EOF)
{
memset(num,0,sizeof(num));
k=0;sum=t*1.0;
if(t==0&&(c=getchar()=='\n'))
return 0;
while((c=getchar())!='\n')
{
if(c=='*')
{
scanf("%d", &t);
sum*=t;
}
if(c=='/')
{
scanf("%d", &t);
sum/=t*1.0;
}
if(c=='+')
{
num[k++]=sum;
scanf("%d", &t);
sum=t*1.0;
}
if(c=='-')
{
num[k++]=sum;
scanf("%d", &t);
sum=-t*1.0;
}
}
num[k++]=sum;sum=0;
for(int i=0; i<k; i++)
{
sum+=num[i];
}
printf("%.2f\n", sum);
}
}