能帮小弟我看看小弟我这个程序什么错嘛
能帮我看看我这个程序什么错嘛
H19:逆波兰算术表达式(选作)
成绩: 5 / 折扣: 0.8
传统的算术表达式是由操作数(又叫运算对象或运算量)和运算符以及改变运算次序的圆括号连接而成的式子。 其运算规则如下:
(1) 先计算括号内,后计算括号外;
(2) 在无括号或同层括号内,先进行乘除运算,后进行加减运算,即乘除运算的优先级高于加减运算的优先级;
(3) 同一优先级运算,从左向右依次进行。
在这种表达式的计算过程中,既要考虑括号的作用,又要考虑运算符的优先级,还要考虑运算符出现的先后次序。
波兰科学家卢卡谢维奇(Lukasiewicz)提出了算术表达式的另一种表示,即后缀表示,又称逆波兰式,其定义是把运算符放在两个运算对象的后面。在后缀表达式中,不存在括号,也不存在优先级的差别,计算过程完全按照运算符出现的先后次序进行,整个计算过程仅需一遍扫描便可完成。
例如:
3/5+6的逆波兰表达式为3 5 / 6 +
2*(3+4)的逆波兰表达式为2 3 4 + *
输入:
一个只包含加、减、乘、除和数字的逆波兰表达式
输出:
该表达式的值
#include<stdio.h>
#include<string.h>
#define N 100
void main()
{
int k,i,j,l,s;
char a[N];
gets(a);
l=strlen(a);
for(k=0;k<l;k++)
{
if(a[k]==' ')
{
for(j=k+1;j<=l;j++)
a[j-1]=a[j];
l--;
}
}
for(i=2;i<l;i++)
{
if(a[i]=='+')
{
s=a[i-1]+a[i-2]-'0'-'0';
a[i-2]=s+'0';
for(j=i+1;j<=l;j++)
a[j-2]=a[j];
l=l-2;
i=1;
}
if(a[i]=='-')
{
s=a[i-2]-a[i-1];
a[i-2]=s+'0';
for(j=i+1;j<=l;j++)
a[j-2]=a[j];
l=l-2;
i=1;
}
if(a[i]=='*')
{
s=(a[i-2]-'0')*(a[i-1]-'0');
a[i-2]=s+'0';
for(j=i+1;j<=l;j++)
a[j-2]=a[j];
l=l-2;
i=1;
}
if(a[i]=='/')
{
s=(a[i-2]-'0')/(a[i-1]-'0');
a[i-2]=s+'0';
for(j=i+1;j<=l;j++)
a[j-2]=a[j];
l=l-2;
i=1;
}
}
printf("%d\n",s);
}
------解决方案--------------------
H19:逆波兰算术表达式(选作)
成绩: 5 / 折扣: 0.8
传统的算术表达式是由操作数(又叫运算对象或运算量)和运算符以及改变运算次序的圆括号连接而成的式子。 其运算规则如下:
(1) 先计算括号内,后计算括号外;
(2) 在无括号或同层括号内,先进行乘除运算,后进行加减运算,即乘除运算的优先级高于加减运算的优先级;
(3) 同一优先级运算,从左向右依次进行。
在这种表达式的计算过程中,既要考虑括号的作用,又要考虑运算符的优先级,还要考虑运算符出现的先后次序。
波兰科学家卢卡谢维奇(Lukasiewicz)提出了算术表达式的另一种表示,即后缀表示,又称逆波兰式,其定义是把运算符放在两个运算对象的后面。在后缀表达式中,不存在括号,也不存在优先级的差别,计算过程完全按照运算符出现的先后次序进行,整个计算过程仅需一遍扫描便可完成。
例如:
3/5+6的逆波兰表达式为3 5 / 6 +
2*(3+4)的逆波兰表达式为2 3 4 + *
输入:
一个只包含加、减、乘、除和数字的逆波兰表达式
输出:
该表达式的值
#include<stdio.h>
#include<string.h>
#define N 100
void main()
{
int k,i,j,l,s;
char a[N];
gets(a);
l=strlen(a);
for(k=0;k<l;k++)
{
if(a[k]==' ')
{
for(j=k+1;j<=l;j++)
a[j-1]=a[j];
l--;
}
}
for(i=2;i<l;i++)
{
if(a[i]=='+')
{
s=a[i-1]+a[i-2]-'0'-'0';
a[i-2]=s+'0';
for(j=i+1;j<=l;j++)
a[j-2]=a[j];
l=l-2;
i=1;
}
if(a[i]=='-')
{
s=a[i-2]-a[i-1];
a[i-2]=s+'0';
for(j=i+1;j<=l;j++)
a[j-2]=a[j];
l=l-2;
i=1;
}
if(a[i]=='*')
{
s=(a[i-2]-'0')*(a[i-1]-'0');
a[i-2]=s+'0';
for(j=i+1;j<=l;j++)
a[j-2]=a[j];
l=l-2;
i=1;
}
if(a[i]=='/')
{
s=(a[i-2]-'0')/(a[i-1]-'0');
a[i-2]=s+'0';
for(j=i+1;j<=l;j++)
a[j-2]=a[j];
l=l-2;
i=1;
}
}
printf("%d\n",s);
}
------解决方案--------------------
- C/C++ code
#include<stdio.h> #include<string.h> #define N 100 int fun_calculation(int para1, char para2, char operat) { int ret = 0; switch(operat) { case '+': ret = para1 + (para2 - '0'); break; case '-': ret = para1 - (para2 - '0'); break; case '*': ret = para1 * (para2 - '0'); break; case '/': ret = para1 / (para2 - '0'); break; default: break; } return ret; } void main() { int i,j,l,result,Flag = 0; int count1 = 0;//for initilize result int count2 = 0;//continue operator count char a[N]; char b[N/2]; printf("input expression:\n"); gets(a); l = strlen(a); j = 0; //get all valid data for(i = 0;i < l; i++) { if(a[i] != ' ') b[j++] = a[i]; } //look for operator for(i = 0;i < j;i++) { if((b[i] < '0') || (b[i] > '9')) { Flag = 1; if(Flag == 1) count2++; //initilize result count1++; if(count1 == 1) { result = b[i-1] - '0'; result = fun_calculation(result,b[i-count2-1],b[i]); } else { if(count2 > 1) result = fun_calculation(result,b[i-count2*2],b[i]); else result = fun_calculation(result,b[i-1],b[i]); } } else { Flag = 0; count2 = 0; } } printf("result :%d\n",result); }