| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 675 人关注过本帖
标题:表达式求值调试有错,求高手解决啊??
只看楼主 加入收藏
Nield
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2013-4-23
结帖率:0
收藏
 问题点数:0 回复次数:0 
表达式求值调试有错,求高手解决啊??
#include<stdio.h>
#define OPSETSIZE 7
#define Size 50
typedef struct
{
    char stack[Size];
    int top;
}StackChar;
typedef struct
{
    float stack[Size];
    int top;
}StackFloat;
unsigned char Prior[7][7] =
{     // 表3.1  算符间的优先关系
        '>','>','<','<','<','>','>',
      '>','>','<','<','<','>','>',
      '>','>','>','>','<','>','>',
      '>','>','>','>','<','>','>',   
      '<','<','<','<','<','=',' ',
      '>','>','>','>',' ','>','>',
      '<','<','<','<','<',' ','='
};        
float Operate(float a, unsigned char theta, float b);
char OPSET[OPSETSIZE]={'+' , '-' , '*' , '/' ,'(' , ')' , '#'};
int In(char Test,char* TestOp);
char precede(char Aop, char Bop);
void InitStackchar(StackChar *s);
void InitStackfloat(StackFloat *s);
void Pushchar(StackChar *s,char ch);
void Pushfloat(StackFloat *s,int t);
char GetTopchar(StackChar *s);
float GetTopfloat(StackFloat *s);
void Popchar(StackChar *s, char ch);
void Popfloat(StackFloat *s, float t);
        
float EvaluateExpression()
{  // 算法3.4
   // 算术表达式求值的算符优先算法。
   // 设OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合。
   StackChar   OPTR;    // 运算符栈,字符元素
   StackFloat  OPND;    // 运算数栈,实数元素
   char TempData[20];
   float Data,a,b;
   char theta,c,x;
   
   InitStackchar(&OPTR);
   Pushchar (&OPTR, '#');
   InitStackfloat(&OPND);
   c = getchar();
   while (c!= '#' || GetTopChar(&OPTR)!= '#')
   {
      if (!In(c, OPSET))
      {
          Pushchar(&OPND,c);
          c=getchar();
      }
      else
      {   // 不是运算符则进栈
         switch (precede(GetTopChar(&OPTR), c))
         {
            case '<':   // 栈顶元素优先权低
                 Pushchar(&OPTR, c);  
                 c=getchar();
                 break;
            case '=':   // 脱括号并接收下一字符
                 Popchar(&OPTR, x);   
                 c=getchar();
                 break;
            case '>':   // 退栈并将运算结果入栈
                 Popchar(&OPTR, theta);
                 Popfloat(&OPND, b);  
                 Popfloat(&OPND, a);                     
                 Pushfloat(&OPND, Operate(a, theta, b));
                 break;
         } // switch
      }
   } // while
   return GetTopFloat(&OPND);
} // EvaluateExpression

float Operate(float a,unsigned char theta, float b)
{
   switch(theta)
   {
      case '+': return a+b;
      case '-': return a-b;
      case '*': return a*b;
      case '/': return a/b;
      default : return 0;
   }
}   

int In(char Test,char* TestOp)
{
   int Find=0,i;
   for (i=0; i< OPSETSIZE; i++)
   {
      if (Test == TestOp[i])
          Find= 1;
   }
   return Find;
}


int ReturnOpOrd(char op,char* TestOp)
 {
   int i;
   for(i=0; i< OPSETSIZE; i++)
   {
      if (op == TestOp[i])
          return i;
   }
   return 0;
}

char precede(char Aop, char Bop)
{
   return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];
}

void InitStackchar(StackChar *s)
{
    s->top=-1;
}

void InitStackfloat(StackFloat *s)
{
    s->top=-1;
}

void Pushchar(StackChar *s,char ch)
{
        s->top++;
        s->stack[s->top]=ch;
}

void Pushfloat(StackFloat *s,int t)
{
        s->top++;
        s->stack[s->top]=t;
}

char GetTopchar(StackChar *s)
{
    char ch='0';
    if(s->top==-1)
        return ch;
    else
    {
        ch=s->stack[s->top];
        return ch;
    }
}

float GetTopfloat(StackFloat *s)
{
    float t;
    t=s->stack[s->top];
    return t;
}

void Popchar(StackChar *s, char ch)
{
    ch=s->stack[s->top];
    s->top--;
}

void Popfloat(StackFloat *s, float t)
{
    t=s->stack[s->top];
    s->top--;
}
void main()
{
    float x;
    printf("请输入一个表达式:\n");
    x=EvaluateExpression();
    printf("表达式的结果是:%f\n",x);
}
搜索更多相关主题的帖子: 关系 include 表达式 
2013-05-17 08:44
快速回复:表达式求值调试有错,求高手解决啊??
数据加载中...
 
   



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

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