标题:【求帮忙找错误】我写的表达式求值的程序 帮帮忙啦
只看楼主
pmy931117
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-7-14
结帖率:33.33%
已结贴  问题点数:20 回复次数:7 
【求帮忙找错误】我写的表达式求值的程序 帮帮忙啦
#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
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:0 
回复 楼主 pmy931117
发帖的时候 尽量把程序弄‘整洁’   方便查看
2012-10-19 14:30
pmy931117
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-7-14
得分:0 
回复 2楼 寒风中的细雨
哦哦 还没有养成这种习惯  以后会注意的  

但是 这程序问什么不能得出我想要的结果呢
2012-10-19 14:41
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:0 
程序代码:
#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");
    }
} 
2012-10-19 14:41
pmy931117
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-7-14
得分:0 
回复 4楼 寒风中的细雨
哇塞 原来这么弄啊   但是错误在哪里ne
2012-10-19 14:54
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:14 
回复 5楼 pmy931117
这个需要你自己弄了

发现问题  和  解决问题
2012-10-19 14:57
pmy931117
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-7-14
得分:0 
回复 6楼 寒风中的细雨
。。。。表示很痛苦    逻辑错误 总是会跟着原来的模式进去   很难发现啊
2012-10-19 15:00
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:0 
表示逻辑错误 写代码的时候验证就可以改正过来   怕的是爆出个堆栈信息    这个就是真的痛苦
2012-10-19 15:04



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




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

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