| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 846 人关注过本帖
标题:写了个计算器的代码,但没能调通,请大神帮忙看看
只看楼主 加入收藏
晴雨135
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2014-3-19
结帖率:0
收藏
 问题点数:0 回复次数:14 
写了个计算器的代码,但没能调通,请大神帮忙看看
#include <stdio.h>
#include <math.h>
#include <string.h>  
typedef struct Expression //定义表达式结构体
{  
    int num[64];
    char ch[64];
}Exper;  
typedef struct node           //定义字栈
{   
    char e[100];
    int top;  
}linkstack;  
typedef struct Node           //定义整数栈
{  
    int c[100];
    int top;  
}link;   
char precede(char a,char b)    //符号判断
{  
    int i=0,j=0;
    char sign[]="+-*/()^%";
    char  prec[8][8]={{'>','>','<','<','(',')','<','<'},{'>','>','<','<','(',')','<','<'},{'>','>','>','>','(',')','<','<'},{'>','>','>','>','(',')','<','<'},{'(','(','(','(','~','~','(','('},{')',')',')',')','~','~',')',')'},{'>','>','>','>','(',')','>','>'},{'>','>','>','>','(',')','>','>'}};
    if (b=='=')
    {
        return 0;
    }  
    while(sign[i]!=a)
    {  
        i++;
    }
    while (sign[j]!=b)
    {  
        j++;
    }
    return(prec[i][j]);
}   
void push1(linkstack *p,char c)    //字符入栈
{  
    p->e[p->top++]=c;
}
void push2(link *p,int num)        //整数入栈
{  
    p->c[p->top++]=num;
}  
char gettop(linkstack *s)          //读字符栈顶的元素
{   
    char c;
    c=s->e[s->top-1];
    return(c);
}   
char pop1(linkstack *s)            //字符出栈
{
    char c;
    c=s->e[--s->top];
    return(c);
}   
int pop2(link *N)                  //整数入栈
{  
    int num;
    num=N->c[--N->top];
    return(num);
}   
int operate(int a, char oper,int b)//进行运算
{
    int num;
    switch (oper)
    {
  case '+': num=a+b;
      break;  
  case '-': num=a-b;
      break;  
  case '*': num=a*b;
      break;  
  case '/': num=a/b;
      break;  
  case '^': num=pow(a,b);
      break;
  case '%': num=a%b;
      break;
    }
    return num;
}   
Exper number(char *n_w)                 //把输入的字符转换成整数和字符,并分别存在数组中
{
    int i=0;
    int j=0;
    int k=0;
    int temp;
    Exper n_exper;
    while (n_w[i]!='\0')
    {
        if (n_w[i]>='0'&& n_w[i]<='9')
        {   
            temp=n_w[i]-'0';  
            i++;  
            while (n_w[i]>='0'&& n_w[i]<='9')  
            {   
                temp=temp*10+n_w[i]-'0';
                i++;   
            }  
            n_exper.num[j]=temp;
            j++;  
        }   
        n_exper.ch[k]=n_w[i];
        k++;
        i++;
    }
    return n_exper;
}   
void Calculate(Exper C_exper)//计算函数
{
    int i=0,j=0,k=1;
    int br=0;  
    int temp1,temp2;
    //临时变量
    char dec,CH;
    linkstack cha;
    //定义字符栈
    link Num;
    //定义整数栈
    Num.top=0;
    cha.top=0;
    push1(&cha,'#');
    do  {  
        if (j==0 && C_exper.ch[j]=='(')  
        {  
            br++;
        }
        if (C_exper.ch[j]!='=')  
        {   
            if (k==1)  
            {   
                push1(&cha,C_exper.ch[j]);
                push2(&Num,C_exper.num[i]);
                push2(&Num,C_exper.num[++i]);
                dec==precede(gettop(&cha),C_exper.ch[++j]);
            }  
            else  
            {   
                dec=precede(gettop(&cha),C_exper.ch[j]);
            }     
        }  
        else   
        {  
            temp1=pop2(&Num);  
            temp2=pop2(&Num);  
            push2(&Num,operate(temp2,pop1(&cha),temp1));
            printf("%d\n\n",pop2(&Num));   
            break;
        }   
        switch(dec)
        {  
        case '<':
            {  push1(&cha,C_exper.ch[j]);
            push2(&Num,operate(pop2(&Num),pop1(&cha),C_exper.num[++i]));
            j++;   
            k++;  
            break;   
            }     
        case '>':   
            {      temp1=pop2(&Num);   
            temp2=pop2(&Num);  
            push2(&Num,operate(temp2,pop1(&cha),temp1));  
            push1(&cha,C_exper.ch[j]);   
            push2(&Num,C_exper.num[++i]);
            j++;
            k++;   
            break;
            }  
        case '(':   
            {     
                if (br==1)   
                {   
                    push1(&cha,C_exper.ch[j]);
                    br++;   
                    j++;   
                    k++;   
                    i++;   
                }      
                else   
                {     
                    push1(&cha,C_exper.ch[j]);
                    push1(&cha,C_exper.ch[++j]);  
                    push2(&Num,C_exper.num[++i]);  
                    j++;  
                    k++;   
                }         
                break;   
            }   
        case ')':  
            {   
                push1(&cha,C_exper.ch[j]);  
                CH=pop1(&cha);
                CH=pop1(&cha);  
                temp1=pop2(&Num);   
                temp2=pop2(&Num);   
                push2(&Num,operate(temp2,CH,temp1));
                CH=pop1(&cha);   
                j++;   
                k++;   
                if (gettop(&cha)=='#')
                {     
                    push1(&cha,C_exper.ch[j]);   
                    push2(&Num,C_exper.num[i]);
                    j++;   
                }     
                break;   
            }   
        default: break;  
        }  
    }
    while (gettop(&cha)!='#');  
  }
  int main()
  {  
      char w[128];
      Exper m_exper;
      printf("请输入表达式:\n");
      scanf("%s",w);
      printf("\n%s",w);
      m_exper=number(w);
      Calculate(m_exper);  
      getchar();
      return 0;
  }

[ 本帖最后由 晴雨135 于 2014-3-31 10:41 编辑 ]
搜索更多相关主题的帖子: 计算器 include 表达式 结构体 
2014-03-30 23:06
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
错误信息呢

DO IT YOURSELF !
2014-03-30 23:27
Andrew_Lee
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:185
专家分:626
注 册:2014-3-21
收藏
得分:0 
void Calculate(Exper C_exper)//计算函数 中,大概第25行,这个push2(&Num,C_exper.num[++i])=precede(gettop(&cha),C_exper.ch[++j]);是嘛意思?
2014-03-31 09:09
晴雨135
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2014-3-19
收藏
得分:0 
回复 3楼 Andrew_Lee
case '^': num=pow(a,b);错误提示显示对重载函数的调用不明确,应该怎么改?
2014-03-31 10:30
晴雨135
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2014-3-19
收藏
得分:0 
回复 4楼 晴雨135
不好意思,粘贴错误,是push2(&Num,C_exper.num[++i]);
                dec=precede(gettop(&cha),C_exper.ch[++j]);
2014-03-31 10:38
晴雨135
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2014-3-19
收藏
得分:0 
回复 2楼 wp231957
case '^': num=pow(a,b);错误提示显示对重载函数的调用不明确,应该怎么改?
2014-03-31 10:39
Andrew_Lee
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:185
专家分:626
注 册:2014-3-21
收藏
得分:0 
pow函数原型是extern float pow(float x,float y);你传递的参数是int的了,试下 case '^': num=(int)(pow((float)a,(float)b));
2014-03-31 10:49
晴雨135
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2014-3-19
收藏
得分:0 
回复 7楼 Andrew_Lee
能运行了,但输入表达式后不能得出结果,只是再次输出表达式,这是怎么回事?
2014-03-31 11:26
Andrew_Lee
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:185
专家分:626
注 册:2014-3-21
收藏
得分:0 
我下午调调看
2014-03-31 11:51
晴雨135
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2014-3-19
收藏
得分:0 
回复 9楼 Andrew_Lee
谢谢,辛苦了
2014-03-31 12:03
快速回复:写了个计算器的代码,但没能调通,请大神帮忙看看
数据加载中...
 
   



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

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