| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 706 人关注过本帖
标题:表达式求值 不知道那错了
只看楼主 加入收藏
fenzhi4297
Rank: 2
等 级:论坛游民
帖 子:34
专家分:13
注 册:2009-8-31
结帖率:60%
收藏
 问题点数:0 回复次数:2 
表达式求值 不知道那错了
#include <stdio.h>
#include    <string.h>
#include    <stdlib.h>
typedef struct
{
   char *data;
   int  top;
}OPTR;
typedef struct
{
   float *elem;
   int top;
}OPND;
OPTR optr;
OPND opnd;
char chchar;
float shuzi;
char BUFF[50]={'\0'};
int initStack()
{
  optr.data=(char *)malloc(sizeof(char));
  opnd.elem=(float *)malloc(sizeof(float));
  if(!optr.data||!opnd.elem)
  {
    printf("初始化失败");
  }
  optr.data[0]='(';
  optr.top=1;
  opnd.top=0;
  return 1;
}
void push_optr()
{
  optr.data[optr.top++]=chchar;
}
void push_opnd()
{
  opnd.elem[opnd.top++]=shuzi;
}
char pop_optr()
{   
    return optr.data[--optr.top];
}
float pop_opnd()
{
 return opnd.elem[--opnd.top];
}
char getoptr()
{  
  int wtop;
  wtop=optr.top;
  wtop--;
  return optr.data[wtop];
}
char bujiao(char optr1,char optr2)
{
  if((optr1=='+'||optr1=='-')||(optr1=='*'||optr1=='/'))
   return '<';
  else if(optr1=='('||optr2=='(')
   return '<';
  else if(optr2==')')
   return '=';
  else
    return '>';
}
void pow(int k)
{
    int        i = 0 , temp = 1;

    for(; i < k ; i++)
        temp = temp *10;
    shuzi = shuzi / temp;
}
int getfrombuff()
{
  static int dwpos=0;
  int dwf1=0,dwf2=0;
  int k=0;
  char ch;
  shuzi=0;
  ch=BUFF[dwpos];
  if(ch=='\0') return 0;
  while(ch=='.'||(ch>='0'&&ch<='9'))
  {
    dwf2=1;
    if(ch=='.')
    {
      dwf1=1;
    }
    else
    {
      shuzi=shuzi*10+(ch-'-');
      if(dwf1) k++;
    }
    dwpos++; ch=BUFF[dwpos];
  }
  if(dwf2)
  {
    pow(k);
    return 1;
  }
  chchar=ch;dwpos++;
  return 2;
}
float jiansuan(float va1,float va2,char ch)
{
  switch(ch)
  {
    case '+': return va1+va2;
    case '-': return va1-va2;
    case '*': return va1*va2;
    case '/': return va1/va2;
  }
}
int main(int argc, char *argv[])
{
    int        temp , length;
    float    value1 , value2 ;
    char    ch;
    if(!initStack())   exit(1);
    puts("输入");
    scanf("%s",BUFF);
    length=strlen(BUFF); BUFF[length]=')';
   
    while(temp=getfrombuff())
    {
      if(1==temp)
      {
        push_opnd();
      }
      else
      {
LOOP:        ch=getoptr();
        switch( bujiao(ch,chchar) )            /*比较优先级*/
            {   
                case '<':     push_optr();
                             break;
                case '>':     ch = pop_optr();
                             value1 = pop_opnd();    value2 = pop_opnd();
                             
                            shuzi = jiansuan(value1,value2,ch);
                             push_opnd();
                             goto    LOOP;
                case '=':    while((ch = pop_optr())!= '(')
                            {
                                value1 = pop_opnd();    value2 = pop_opnd();                        
                            shuzi = jiansuan(value1,value2,ch);
                                push_opnd();
                            }
                            break;
            }//end switch
      }
    }
    printf("表达式结果为(保留三位小数):%.3f\n",opnd.elem[0]);
    return 0;
}
哪错了啊
搜索更多相关主题的帖子: 表达 求值 
2010-03-02 22:32
fenzhi4297
Rank: 2
等 级:论坛游民
帖 子:34
专家分:13
注 册:2009-8-31
收藏
得分:0 
问题 自己找见了   你 点着不见??
2010-03-03 12:08
猫叔
Rank: 2
等 级:论坛游民
帖 子:15
专家分:11
注 册:2009-7-16
收藏
得分:0 
//end switch删了就行了
2010-03-25 22:13
快速回复:表达式求值 不知道那错了
数据加载中...
 
   



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

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