标题:【求帮忙找错误】我写的表达式求值的程序 帮帮忙啦
取消只看楼主
pmy931117
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-7-14
结帖率:33.33%
已结贴  问题点数:20 回复次数:3 
【求帮忙找错误】我写的表达式求值的程序 帮帮忙啦
#include <cstdlib>
#include <iostream>
#include <malloc.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define Status int
#define SElemType char
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 12
using namespace std;
typedef struct
{char *base;
 char *top;
 int stacksize;}SqStackR;
 typedef struct
 {float *base;
  float *top;
  int stacksize;}SqStackD;
 char InitStackR(SqStackR &S)
 {S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
  if(!S.base) exit(OVERFLOW);
   S.top=S.base;
   S.stacksize=STACK_INIT_SIZE;
   return OK;
   }//初始化 算符栈
  float InitStackD(SqStackD &S)
  {S.base=(float*)malloc(STACK_INIT_SIZE*sizeof(float));
  if(!S.base) exit(OVERFLOW);
   S.top=S.base;
   S.stacksize=STACK_INIT_SIZE;
   return OK;
   }
   
float Operate(float a,char theta,float b)
{  float n;
 switch(theta)
  {case'+':n=a+b;return n;break;
   case'-':n=a-b;return n;break;
   case'*':n=a*b;return n;break;
   case'/':if(b==0){n==0;break;}
           else n=a/b;return n;
                 break;
   default:printf("error\n");
  }}
char Precede(char w,char m)                          
{if((w='+'||'-')&&(m='+'||'-'||')'||'#'))
 return ('>');
 if((w='+'||'-')&&(m='*'||'/'||'('))
 return ('<');
 if((w='*'||'/')&&(m='+'||'-'||'*'||'/'||')'||'#'))
 return ('>');
 if((w='*'||'/')&&(m='('))
 return ('<');
 if((w='(')&&(m='+'||'-'||'*'||'/'||')'||'#'))
 return ('>');
 if((w='(')&&(m=')'))
 return ('=');
 if((w=')')&&(m='+'||'-'||'*'||'/'||')'||'#'))
 return ('>');
 if((w='#')&&(m='+'||'-'||'*'||'/'||'('))
 return ('<');
 if((w='#')&&(m='#'))
 return ('=');
 if((w='(')&&(m='#'))
 return ERROR;
 if((w=')')&&(m='('))
 return ERROR;
 if((w='#')&&(m=')'))
 return ERROR;
}
float GetTopD1(SqStackD S,float &e)
{if(S.base==S.top) return ERROR;
 e=*(S.top-1);
 return e;
 return OK;
 }//GetTop 第一个数据
 
 float GetTopD2(SqStackD S,float &e)
 {if(S.base==S.top) return ERROR;
 e=*(S.top-2);
 return e;
 return OK;}//GetTop 第二个数据
 char GetTopR(SqStackR S,char &e)
 {if(S.base==S.top)return ERROR;
  e=*(S.top-1);
  return e;
  return OK;} //GetTop 算符
 
 float PopD(SqStackD &S,float &e)
 {if(S.top==S.base)return ERROR;
  e=*--S.top;
  return OK;}//删除操作 数据 PopD
 
char PopR(SqStackR &S,SElemType &e)
{if(S.top==S.base)return ERROR;
 e=*--S.top;
 return OK;
}//删除操作 算符 PopR
 float PushD(SqStackD &S,float e)
 {if(S.top-S.base>=S.stacksize)//
   {S.base=(float *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(float));
   if(!S.base)exit (OVERFLOW);
   S.top=S.base+S.stacksize;
   S.stacksize+=STACKINCREMENT;}
   *S.top++=e;
   return OK;}
 
 char PushR(SqStackR &S,char e)
 {if(S.top-S.base>=S.stacksize)//
   {S.base=(char *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
   if(!S.base)exit (OVERFLOW);
   S.top=S.base+S.stacksize;
   S.stacksize+=STACKINCREMENT;}
   *S.top++=e;
   return OK;}//插入 算符
   
   
   
  int IN(char c,char OP)
   {OP='+'||'-'||'*'||'/'||'('||')'||'#';
    if (c='+'||'-'||'*'||'/'||'('||')'||'#');
    return 1;
   }
int main()
/*OperandType EvaluaExpression()*/
{char c;
 char OP;
 float n;
 float z;
 int i;
 char theta;
 char s[100],j;
 float a,b;
 OP='+'||'-'||'*'||'/'||'('||')'||'#';
 SqStackR OPTR;
 SqStackD OPND;            
 InitStackR(OPTR);
 PushR (OPTR,('#'));
 InitStackD(OPND);
 printf("请输入表达式:\n");
 gets(s);
 for (j=0;j<100;j++)
 {c=s[j];
 
 
    while (c!='#'||GetTopR(OPTR,c)!='#'){
        
           if(!IN(c,OP)){PushD(OPND,c);c=getchar();a=GetTopD1(OPND,a);
               b=GetTopD2(OPND,b);}
           else
           switch (Precede(GetTopR(OPTR,c),c))//为什么都是c
                {case'>':
                  
                  n=Operate(a,theta,b);
                  PopR(OPTR,theta);
                  PopD(OPND,a);PopD(OPND,b);
                  PushD(OPND,n);
                  z=GetTopD1(OPND,z);
                  printf("%f",z);
                  break;
                 case'<':
                  PushR(OPTR,c);c=getchar();
                  z=GetTopD1(OPND,z);
                  printf("%f",z);
                  break;
                 case'=':
                  PopR(OPTR,c);c=getchar();//我也写c了
                  z=GetTopD1(OPND,z);
                  printf("%f",z);
                  break;}}system("pause");}}
搜索更多相关主题的帖子: include top 表达式 
2012-10-19 14:26
pmy931117
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-7-14
得分:0 
回复 2楼 寒风中的细雨
哦哦 还没有养成这种习惯  以后会注意的  

但是 这程序问什么不能得出我想要的结果呢
2012-10-19 14:41
pmy931117
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-7-14
得分:0 
回复 4楼 寒风中的细雨
哇塞 原来这么弄啊   但是错误在哪里ne
2012-10-19 14:54
pmy931117
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-7-14
得分:0 
回复 6楼 寒风中的细雨
。。。。表示很痛苦    逻辑错误 总是会跟着原来的模式进去   很难发现啊
2012-10-19 15:00



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-383605-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.443669 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved