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

同样的程序,在windows xp 和 windows2000下输出结果不一样!该怎么处理

2012-02-04 
同样的程序,在windows xp 和 windows2000下输出结果不一样!同样的程序,在windowsxp和windows2000下输出结

同样的程序,在windows xp 和 windows2000下输出结果不一样!
同样的程序,在windows   xp   和   windows2000下输出结果不一样!
不知道哪个高手能帮我解决这个问题.
以下的代码,输入:
*(+(a,b),-(c,/(e,f)))
在windows   xp下可以正确输出:(a+b)*(c-e/f)
在windows   2000   下输出:((a)+b)*((c)-(e)/f)   ,多了很多括号.
把xp编译好的程序copy到2000下,同样多了这些括号,所以应该不是编译器的原因.

代码如下:
#include   <stdio.h>
#include   <stdlib.h>
#include   <string.h>
#define   N   100
typedef   struct   node
{
        struct   node   *left,*right;
        char   op;
}NODE,*TREE;        
int   compare(char   op1,char   op2)
{
        int   l1,l2;
        switch(op1)
        {
                case   '- ':
                case   '+ ':l1=1;
                break;
                case   '* ':
                case   '/ ':l1=2;
                break;
        }
          switch(op2)
        {
                case   '- ':
                case   '+ ':l2=1;
                break;
                case   '* ':
                case   '/ ':l2=2;
                break;
        }      
        if(l1> l2)
        return   1;
        else   if(l1==l2)
        return   0;
        else
        return   -1;
}
void   printext(TREE   t)
{
        int   brack;
        if(t-> left)
        {
                brack=(compare(t-> op,t-> left-> op)==1);
                if(brack)
                printf( "( ");
                printext(t-> left);
                if(brack)
                printf( ") ");
        }        
        printf( "%c ",t-> op);
        if(t-> right)
        {
                brack=(compare(t-> op,t-> right-> op)!=-1);
                if(brack)
                printf( "( ");
                printext(t-> right);
                if(brack)


                printf( ") ");
        }        
}

void   creatbtree(NODE*   &bt,char   *str)
{
NODE   *st[N],*p=NULL;
int   top=-1,k,j=0;
char   ch;
bt=NULL;
ch=str[j];
while(ch!= '\0 ')
{
      switch(ch)
      {
              case   '( ':top++;st[top]=p;k=1;
              break;
              case   ') ':top--;break;
              case   ', ':k=2;break;
              default:p=(NODE*)malloc(sizeof(NODE));
              p-> op=ch;
              p-> left=p-> right=NULL;
              if(bt==NULL)
              bt=p;
              else
              {
                      switch(k)
                      {
                              case   1:st[top]-> left=p;break;
                              case   2:st[top]-> right=p;break;
                      }
              }                                
      }        
    j++;
    ch=str[j];
}
}  

int   main()
{
        //freopen( "1020.in ", "r ",stdin);
        //freopen( "1020.out ", "w ",stdout);
        NODE   *b;
        char   gy[N];
        scanf( "%s ",&gy);
        creatbtree(b,gy);
        printext(b);
        printf( "\n ");
        return   0;
}        


[解决办法]
首先应该把scanf的那个错误改过来,虽然实际中并没有影响结果。

我用g++在Windows 2000下运行就是对的,但用VC 6就错了(多括号)。

所以还是程序本身有隐蔽的问题。通过DEBUG发现,你的表达式树输出时调用了compare函数比较优先级,但对于字母就没有设置优先级,而直接使用了l1, l2的未初始化的值!这个值如果是一个大的正整数,则没有括号;如果是一个大的负整数,就有括号。而程序在不同的操作系统下对变量的未初始化值可能不同,结果就是这样的“怪异错误”。

在你的compare函数中加一句DEBUG代码,运行一下,你自己也能看出问题所在:

int compare(char op1, char op2)
{
int l1, l2;
switch (op1) {
case '- ':
case '+ ':
l1 = 1;
break;
case '* ':
case '/ ':
l1 = 2;
break;
}
switch (op2) {
case '- ':
case '+ ':
l2 = 1;
break;
case '* ':
case '/ ':
l2 = 2;


break;
}

////////// 加入的代码
printf( "\n DEBUG: l1(%c) = %d, l2(%c) = %d\n ", op1, l1, op2, l2);

if (l1 > l2)
return 1;
else if (l1 == l2)
return 0;
else
return -1;
}

热点排行