简单计算器

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 17641    Accepted Submission(s): 6181


Problem Description


读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。


 


 


Input


测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。


 


 


Output


对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。


 


 


Sample Input


1 + 2 4 + 2 * 5 - 7 / 11 0


 


 


Sample Output


3.00 13.36


 


 


Source


​浙大计算机研究生复试上机考试-2006年​


 


 


Recommend


JGShining   |   We have carefully selected several similar problems for you:   ​​1230​​​  ​​​1235​​​  ​​​1229​​​  ​​​1231​​​  ​​​1228​​ 


 

结束时是ch="0"     -.-

 

代码:

#include<cstdio>
#include<stack>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
char ch[1010];
int chang,i,a,b;
char lp;
double sh()
{
int kkp=0;
for (;ch[i]<='9'&&ch[i]>='0';i++)
kkp=kkp*10+ch[i]-'0';
i--;
return kkp;
}
double suan()
{
double a,b;
stack<char> fu;
stack<double> shu;
stack<char> hfu;
stack<double> hshu;
chang=strlen(ch);
for (i=0;i<chang;i++)
{
// printf("%d ==%c== 66\n",i,ch[i]);
if (ch[i]==' ')
continue;
if (ch[i]>='0'&&ch[i]<='9')
shu.push(sh());
else if (fu.empty())
fu.push(ch[i]);
else
{
lp=fu.top();
fu.pop();
if (lp=='*'||lp=='/')
{
a=shu.top();
shu.pop();
b=shu.top();
shu.pop();
if (lp=='*')
b*=a;
else
b/=a;
shu.push(b);
}
else
{
fu.push(lp);
}
fu.push(ch[i]);
}
}
if (!fu.empty())
{
lp=fu.top();
fu.pop();
if (lp=='*'||lp=='/')
{
a=shu.top();
shu.pop();
b=shu.top();
shu.pop();
if (lp=='*')
b*=a;
else
b/=a;
shu.push(b);
}
else
{
fu.push(lp);
}
}
while (!fu.empty())
{
lp=fu.top();
fu.pop();
hfu.push(lp);
}
while (!shu.empty())
{
a=shu.top();
shu.pop();
hshu.push(a);
}
while (!hfu.empty())
{
lp=hfu.top();
hfu.pop();
a=hshu.top();
hshu.pop();
b=hshu.top();
hshu.pop();
if (lp=='+')
a+=b;
else
a-=b;
hshu.push(a);
}
a=hshu.top();
return a;
}
int main()
{
while (gets(ch))
{
if (ch[0]=='0'&&strlen(ch)==1)
break;
double s=suan();
printf("%.2lf\n",s);
}
return 0;
}



简洁数组过:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
double a,shu[200];char hao[5];
while (~scanf("%lf",&shu[0]))
{
int kp=1,op=0;
while (getchar()!='\n')
{
op=1;
scanf("%s%lf",hao,&a);
if (hao[0]=='+')
shu[kp++]=a;
else if (hao[0]=='-')
shu[kp++]=-a;
else if (hao[0]=='/')
shu[kp-1]/=a;
else if (hao[0]=='*')
shu[kp-1]*=a;
}
if (!op) break;
double s=0;
for (int i=0;i<kp;i++)
s+=shu[i];
printf("%.2lf\n",s);
}
return 0;
}