| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 398 人关注过本帖
标题:这是算数表达式的求解问题,中间有些问题,求帮忙!!谢了。
只看楼主 加入收藏
周丽娟
Rank: 1
等 级:新手上路
帖 子:5
专家分:3
注 册:2013-3-4
结帖率:33.33%
收藏
已结贴  问题点数:20 回复次数:7 
这是算数表达式的求解问题,中间有些问题,求帮忙!!谢了。
#include<malloc.h>
#include <string.h>
#include<stdlib.h>
#define max 100
typedef float SElemType;
typedef struct
{
    char stack[max];
    int top;
}Stack1;  //创建运算符栈
typedef struct
{
    SElemType stack[max];
    int top;
}Stack2;  //创建操作数栈*/
int In(char c)//判断c是否为七种运算符之一
{
    switch(c)
    {
    case'+':
    case'-':
    case'*':
    case'/':
    case'(':
    case')':
    case'#':
        return 1;
        break;
    default:
        return 0;
    }//switch
}
void initStack1(Stack1 *S)  //初始化栈Stack1
{
  S->top=-1;
}
void initStack2(Stack2 *S)
{
   S->top=-1;
}

void Push1(Stack1 *S,char ch)  //将运算符进栈
{
       if((S->top<max-1)&&(S->top>=-1))
    {
        (S->top)++;
        S->stack[S->top]=ch;
    }
    else   
{    printf("error!\n");}
}
void Push2(Stack2 *S,SElemType ch)   //将操作数进栈
{
     if((S->top<max-1)&&(S->top>=-1))
    {
        (S->top)++;
        S->stack[S->top]=ch;
   
    }
    else  
    printf("error!\n");
}

char Precede(char ch1,char ch2)  //比较运算符的优先级
{
  char ch;  //定义ch表示操作符比较后的值赋值给ch:'>'和'<'
  switch(ch1)
  {
  case'+'://此处由于加减几乎优先级一样,故放在一起
  case'-':
      if((ch2=='*')||(ch2=='/')||(ch2='(')||(ch2='#'))
          ch='<';
      else
          ch='>';
      break;
  case'*':
  case'/':
      if((ch2=='*')||(ch2='/')||(ch2=')'))
          ch='>';
      else
          ch='<';
      break;
    case'(':
      if(ch2=')')
      ch='=';
      else if(ch2='#')
      {printf("没有左括号!\n");}
      else
         ch='>';
       break;
     case')':
         if(ch2=='(')
         {
             printf("括号匹配错误!\n");
         }
             else
                 ch='<';
             break;
    case'#':
    switch(ch2)
    {
    case'#':
        ch='=';
        break;
    case'(':
        printf("error!没有右括号");
        break;
    default:
        ch='>';
    }

  }
  return ch;
}

void Pop1(Stack1 *S,char *p)  //比较后将优先级较高的运算符出栈
{
    if(S->top>=0)
    {
      *p=S->stack[S->top];
      (S->top)--;
     
    }
    else
       printf("error!\n");
}
void Pop2(Stack2 *S,SElemType *p)   //将操作数出栈
{

    if(S->top>=0)
    {
      *p=S->stack[S->top];
      (S->top)--;
     
    }
    else
    printf("error!\n");
   
}

char gettop1(Stack1 *S)   //运算符取栈顶元素
{
   return S->stack[S->top];
 
}
float gettop2(Stack2 *S)  //操作数取栈顶元素
{

    return S->stack[S->top];
 
}

void ClearStack1(Stack1 *S) //清空栈
{
   S->top=-1;
}
void ClearStack2(Stack2 *S)
{
   S->top=-1;
}

SElemType Operate(SElemType a,char a1,SElemType b)   //表达式的计算
{
  // char n=char(a1);
    float s;
   switch(a1)
   {
   case'+':
       s=a+b;
       break;
   case'-':
       s=a-b;
       break;
   case'*':
       s=a*b;
   case'/':
      if(b==0)
       {
         printf("\n表达式输入错误!\n");
       }
       else
       { s=a/b;}
       break;
   }
   return s;
}

SElemType Expression()
{
    char Data[20];      //定义此数组为了存放整数或小数

    SElemType a,b,a1;

    char c,x;
    Stack1 optr1,*optr=&optr1;
     Stack2 opnd1,*opnd=&opnd1;
     initStack1(optr);   //初始化运算符栈
      Push1(optr,'#');     //表达式起始符进栈
     initStack2(opnd);   //初始化操作数栈
     c=getchar();
    x=gettop1(optr);

     while((c!='#')||(gettop1(optr)!='#'))  //'#'也是表达式的截止符
    {   
        if(in(c))   
        {   
           switch(Precede(gettop1(optr),c))  // 若当前输入字符为运算符,比较其与optr栈顶运算符的优先级
           {
          case'<':  //表示当前运算符的优先级大于optr栈顶元素的优先级,则当前运算符进栈
            Push1(optr,c);
             c=getchar();
            break;
          case'=':
             Pop1(optr,&x);  //操作符栈顶元算出栈
            c=getchar();
            break;
          case'>':
            Pop1(optr,&x);  //操作符栈顶元素出栈
            Pop2(opnd,&b);   //操作数栈顶元素出栈
            Pop2(opnd,&a);   //操作数栈顶元素出栈
           Push2(opnd,Operate(a,x,b));   //运算结果进栈
            break;
           }
        }
            
        else if(c>='0'&&c<='9'||c=='.')
        {
            int i=0;
            while(c>='0'&&c<='9'||c=='.')
            {
                Data[i]=c;
                i++;
                c=getchar();
            }
            Data[i]='\0';///数字没有存满,输入字符串结束符
            a1=atof(Data);//此处是把数组里的数字,实际上是按字符串;转换为double类型,然后把浮点型数字入栈
            Push2(opnd,a1);//atof函数的形参是指针类型,故用数组名
        }  
        else
        {printf("error!输入错误!\n");}
        gettop1(optr);
     }
    return  gettop2(opnd);
   
 
}
 
int main()
{
 // char s[max];
   SElemType result;
   char choice;
 printf("************欢迎进去表达式求解程序************\n");
L: printf("请输入您的算术表达式,且以#结束:\n");
  // gets(s);
    result=Expression();
    printf("\n表达式的计算结果为:%d\n",result);
     printf("Do you want to continue:");
      scanf(" %c",&choice);
     if(choice=='Y'||choice=='y')
        goto L;
     else
     printf("\n************感谢使用表达式求解程序************\n");
   return 0;
}


麻烦大家帮帮忙,可以吗?真的很急用,这两天就答辩了,拜托了

[ 本帖最后由 周丽娟 于 2013-3-4 18:11 编辑 ]
搜索更多相关主题的帖子: default include return 表达式 
2013-03-04 16:52
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6814
专家分:42393
注 册:2010-12-16
收藏
得分:3 
SElemType Expression()
 {
……
……
 
     while((c!='#')||(gettop1(optr)!='#'))  //'#'也是表达式的截止符
     {   
         if(in(c))   // in() 函数在哪里定义了?
         {   
            switch(Precede(gettop1(optr),c))

还有一个不确定你的max 会不会重定义了

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-03-04 18:14
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:3 
唉....

仰望星空...........不忘初心!
2013-03-04 18:17
周丽娟
Rank: 1
等 级:新手上路
帖 子:5
专家分:3
注 册:2013-3-4
收藏
得分:0 
回复 2楼 yuccn
关于in()函数的我刚刚改了,显示没有错了,而且可以运行,但无论输出什么表达式,结果都是error,且不可以再往下输入,怎么回事呀?
2013-03-04 18:33
小xiong
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:388
专家分:1722
注 册:2013-2-8
收藏
得分:3 
呵呵
2013-03-04 18:53
模糊
Rank: 2
等 级:论坛游民
帖 子:56
专家分:53
注 册:2013-2-26
收藏
得分:3 
回复 楼主 周丽娟
#include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 #define max 100
 typedef float SElemType;
 typedef struct
 {
    char stack[max];
     int top;
 }Stack1;  //创建运算符栈
 typedef struct
 {
    SElemType stack[max];
     int top;
 }Stack2;  //创建操作数栈*/
 int In(char c)//判断c是否为七种运算符之一
 {
     switch(c)
     {
     case'+':
     case'-':
     case'*':
     case'/':
     case'(':
     case')':
     case'#':
         return 1;
         break;
     default:
         return 0;
     }//switch
 }
 void initStack1(Stack1 *S)  //初始化栈Stack1
 {
   S->top=-1;
 }
 void initStack2(Stack2 *S)
 {
    S->top=-1;
 }

void Push1(Stack1 *S,char ch)  //将运算符进栈
 {
        if((S->top<max-1)&&(S->top>=-1))
     {
        (S->top)++;
         S->stack[S->top]=ch;
     }
     else
 {    printf("error!\n");}
 }
 void Push2(Stack2 *S,SElemType ch)   //将操作数进栈
 {
      if((S->top<max-1)&&(S->top>=-1))
     {
        (S->top)++;
         S->stack[S->top]=ch;

    }
     else
     printf("error!\n");
 }

char Precede(char ch1,char ch2)  //比较运算符的优先级
 {
   char ch;  //定义ch表示操作符比较后的值赋值给ch:'>'和'<'
   switch(ch1)
   {
   case'+'://此处由于加减几乎优先级一样,故放在一起
   case'-':
       if((ch2=='*')||(ch2=='/')||(ch2='(')||(ch2='#'))
           ch='<';
       else
           ch='>';
       break;
   case'*':
  case'/':
       if((ch2=='*')||(ch2='/')||(ch2=')'))
           ch='>';
       else
           ch='<';
       break;
     case'(':
       if(ch2==')')
       ch='=';
      else if(ch2=='#')
       {printf("没有左括号!\n");}
       else
          ch='>';
        break;
      case')':
          if(ch2=='(')
          {
              printf("括号匹配错误!\n");
          }
              else
                  ch='<';
              break;
     case'#':
     switch(ch2)
     {
     case'#':
        ch='=';
         break;
     case'(':
         printf("error!没有右括号");
         break;
     default:
         ch='>';
     }

  }
   return ch;
 }

void Pop1(Stack1 *S,char *p)  //比较后将优先级较高的运算符出栈
 {
     if(S->top>=0)
     {
       *p=S->stack[S->top];
       (S->top)--;

     }
     else
       printf("error!\n");
 }
 void Pop2(Stack2 *S,SElemType *p)   //将操作数出栈
 {

    if(S->top>=0)
     {
       *p=S->stack[S->top];
       (S->top)--;

     }
     else
    printf("error!\n");

}

char gettop1(Stack1 *S)   //运算符取栈顶元素
 {
    return S->stack[S->top];

 }
 float gettop2(Stack2 *S)  //操作数取栈顶元素
 {

    return S->stack[S->top];

 }

void ClearStack1(Stack1 *S) //清空栈
 {
    S->top=-1;
 }
 void ClearStack2(Stack2 *S)
 {
    S->top=-1;
 }

SElemType Operate(SElemType a,char a1,SElemType b)   //表达式的计算
 {
   // char n=char(a1);
     float s;
    switch(a1)
    {
    case'+':
        s=a+b;
        break;
    case'-':
        s=a-b;
        break;
    case'*':
        s=a*b;
    case'/':
       if(b==0)
        {
          printf("\n表达式输入错误!\n");
        }
        else
       { s=a/b;}
        break;
    }
    return s;
 }

SElemType Expression()
 {
    char Data[20];      //定义此数组为了存放整数或小数

    SElemType a,b,a1;

    char c,x;
    Stack1 optr1,*optr=&optr1;
      Stack2 opnd1,*opnd=&opnd1;
      initStack1(optr);   //初始化运算符栈
       Push1(optr,'#');     //表达式起始符进栈
      initStack2(opnd);   //初始化操作数栈
     c=getchar();
     x=gettop1(optr);

     while((c!='#')||(gettop1(optr)!='#'))  //'#'也是表达式的截止符
     {
         if(In(c))
         {
            switch(Precede(gettop1(optr),c))  // 若当前输入字符为运算符,比较其与optr栈顶运算符的优先级
            {
           case'<':  //表示当前运算符的优先级大于optr栈顶元素的优先级,则当前运算符进栈
             Push1(optr,c);
              c=getchar();
             break;
           case'=':
              Pop1(optr,&x);  //操作符栈顶元算出栈
             c=getchar();
             break;
           case'>':
             Pop1(optr,&x);  //操作符栈顶元素出栈
             Pop2(opnd,&b);   //操作数栈顶元素出栈
             Pop2(opnd,&a);   //操作数栈顶元素出栈
            Push2(opnd,Operate(a,x,b));   //运算结果进栈
             break;
            }
         }

         else if((c>='0'&&c<='9')||c=='.')
         {
             int i=0;
             while((c>='0'&&c<='9')||c=='.')
             {
                 Data[i]=c;
                 i++;
                 c=getchar();
             }
             Data[i]='\0';///数字没有存满,输入字符串结束符
             a1=atof(Data);//此处是把数组里的数字,实际上是按字符串;转换为double类型,然后把浮点型数字入栈
             Push2(opnd,a1);//atof函数的形参是指针类型,故用数组名
         }
         else
         {printf("error!输入错误!\n");}
         gettop1(optr);
      }
     return  gettop2(opnd);


}

 int main()
 {
// char s[max];
    SElemType result;
    char choice;
 printf("************欢迎进去表达式求解程序************\n");
 L: printf("请输入您的算术表达式,且以#结束:\n");
   // gets(s);
     result=Expression();
     printf("\n表达式的计算结果为:%f\n",result);
      printf("Do you want to continue:");
       scanf(" %c",&choice);
      if(choice=='Y'||choice=='y')
         goto L;
      else
      printf("\n************感谢使用表达式求解程序************\n");
    return 0;
 }
没语法错误了 结果啥的没注意看
2013-03-04 20:30
tongyuedidi
Rank: 2
等 级:论坛游民
帖 子:35
专家分:33
注 册:2013-2-20
收藏
得分:3 
晕菜~不知道为啥~
2013-03-04 21:14
shmilyflf
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:356
专家分:1008
注 册:2012-12-9
收藏
得分:3 
怎么都喜欢贴这么长的代码,自己调试一下什么地方有问题再截代码不好吗。调试是必须要学的……
2013-03-04 21:26
快速回复:这是算数表达式的求解问题,中间有些问题,求帮忙!!谢了。
数据加载中...
 
   



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

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