首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

能帮小弟我看看小弟我这个程序什么错嘛

2012-05-21 
能帮我看看我这个程序什么错嘛H19:逆波兰算术表达式(选作)成绩: 5 / 折扣: 0.8传统的算术表达式是由操作数

能帮我看看我这个程序什么错嘛
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);   } 

热点排行