Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
Sample Output
3.00
13.36
#include<stdio.h>
#include<string.h>
int main()
{
char sj1[201]; //字符串数据
double sj2[201]; //字符串转数值数据
char ysf[201]; //运算符储存
int i=0,j=0; //循环i,j。
while(gets(sj1)!=NULL)
{
int len=strlen(sj1);//长度
int flag=0;
/*
if(sj1[i]=='0') //这题有坑 数据有可能是输入多个空格然后输入一个0
{
break;
}
*/
for(i=0;i<len;i++)//同上,填坑,统计空格和0,大于等于长度就结束
{
if(sj1[i]==' '||sj1[i]=='0')
{
flag++;
}
}
if(flag>=len)
{
break;
}
int k=0; //下标统计
double x=0,y=0; //x用于最先录入数值,y用于后录入的数值,数据储存
double res=0; //结果储存
for(i=0;i<len;i++) //遍历sj1
{
if(sj1[i]>='0'&&sj1[i]<='9') //先输入的数值,整数不能避免多位数。看不懂尽量手算一遍,例如:字符串123,在此遍历完就为整数123。
{
x=sj1[i]-'0';
for(j=i+1;j<len;j++)
{
if(sj1[j]==' ')
{
break;
}
else
{
x=x*10+sj1[j]-'0';
}
}
i=j; //统一下标
}
if(sj1[i]=='+'||sj1[i]=='-') //储存加减号,此地方只用于储存。
{
sj2[k]=x; //此x是上面先储存的数据,如果它之后是加减号就将数据储存到sj2中,用于下面的计算。
ysf[k++]=sj1[i];//k位次+1,相邻错位,用于最后结果数据的加减。
}
if(sj1[i]=='*'||sj1[i]=='/') //先乘除,遇到乘除号则进行计算。
{
if(sj1[i+2]>='0'&&sj1[i+2]<='9')//此处也为将字符串数字转换为整数,i+2下标按照4 + 2 * 5 - 7 / 11这个数据对应一下。
{
y=sj1[i+2]-'0';
for(j=i+3;j<len;j++)
{
if(sj1[j]==' ')
{
break;
}
else
{
y=y*10+sj1[j]-'0';
}
}
if(sj1[i]=='*') //数据提取完进行乘除计算
{
x=x*y;
}
else
{
x=x*1.0/y;
}
}
i=j;//统一下标
}
}
sj2[k]=x; //将乘除结果赋值给sj2。
res=sj2[0];//将sj2[0]{即上面(第一次sj2[k]=x语句)第一次遇到加减时赋值给sj2的数值}
//赋值给res。
for(i=0;i<k;i++)//最后进行加减运算,求出最终结果。
{
if(ysf[i]=='+')//上面的相邻错位
{
res+=sj2[i+1];
}
else
{
res-=sj2[i+1];
}
}
printf("%.2lf\n",res);
}
return 0;
}