| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 886 人关注过本帖
标题:C语言如何计算表达式
只看楼主 加入收藏
gaofei52022
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2009-10-15
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:8 
C语言如何计算表达式
给一个固定的表达式如:6+7*5-8/9
需要一个栈和一个一维数组,首先数字进数组里,符号进栈,+-*/的进栈有优先级,+-为了1,*/%为2,只有优先级高的可进,低的或等于就要出栈,最后整个表达式就变成一个后缀表达式了,为:“675*+89/-”这是在一维数组里的,然后,在将数组里的数放到栈中,先放数,与到+-*/符号时做运算,最后输出。
那位高手会,我是新手,请帮忙一下
搜索更多相关主题的帖子: 表达 C语言 
2009-10-16 08:39
zhangxf1989
Rank: 6Rank: 6
等 级:侠之大者
帖 子:96
专家分:419
注 册:2009-9-5
收藏
得分:9 
给你贴一个我以前写我程序,和你要求的功能差不多,只是这个支持小数,允许自己输入表达式,有比较完备的错误检查。
程序代码:
#include<stdio.h> 
#include<string.h> 
#include<math.h> 
 
#define SIZE1 20   //栈的大小
#define SIZE2 100  //表达式的最大长度
 
int check(char ch[]);  //检查表达式是否合乎规则
double convert(int *place);   //将表达式中的表示数字的字符串转化为双精度数
int OPSWR(char c);  //将运算符c存入运算符栈
int OVSWR(double s);  //将数s存入数字栈
int OPSRE(char *c);   //将处于运算栈顶的运算符取出
int OVSRE(double *s);   //同上
int OPSDEL();         //将运算符栈栈顶的运算符清除
int OVSDEL();         //同上
int ERRORINF(int flag);   //检查错误信息
int CALCULATE();       //主要功能的实现部分,运算原理的实现部分
int COMP();       //数值计算
// 运算符栈,top表示栈顶的位置
struct OPSSTA { 
    char stack[SIZE1]; 
    int top; 
} OPS; 
//同上
struct OVSSTA { 
    double stack[SIZE1]; 
    int top; 
} OVS; 
double RESULT; 
char str[SIZE2],str1[SIZE1]; 
 
int main () { 
    int flag=0,sign=0; 
    OPS.top=-1; 
    OVS.top=-1; 
    printf("请输入表达式:"); 
    gets(str); 
    strcpy(str1,str);     
    flag=check(str); 
    sign=ERRORINF(flag); 
    if(sign!=1) { 
        getch(); 
        return -1; 
    } 
    flag=CALCULATE(); 
    sign=ERRORINF(flag); 
    if(sign!=1) { 
        getch(); 
        return -1; 
    } 
    else 
        printf("\n%s = %.10f",str1,RESULT);         
    getch(); 
    return 1; 
} 
int check(char ch[])  { 
    int i=0,j=0,left=0,right=0;     
    for(i=0;ch[i]!='\0';i++) { 
        if(ch[i]>='('&&ch[i]<='9') { 
            if(ch[i]=='(') 
                left++; 
            if(ch[i]==')') 
                right++;             
            if(ch[i]==44) 
                return -1;     
        } 
    } 
    ch[i]=';'; 
    ch[i+1]='\0';     
    if(left!=right) 
        return -1;     
    for(i=0;ch[i]!='\0';i++) { 
        if(ch[i]>='0'&&ch[i]<='9') 
            continue;             
        if(ch[i]=='.') 
            if(!((ch[i+1]>='0'&&ch[i+1]<='9')&&(ch[i-1]>='0'&&ch[i-1]<='9')))     
                return -1;                 
        if(ch[i]=='+'||ch[i]=='-'||ch[i]=='*'||ch[i]=='/') { 
            if(!((ch[i+1]>='0'&&ch[i+1]<='9'||ch[i+1]=='(')&&(ch[i-1]>='0'&&ch[i-1]<='9'||ch[i-1]=='('))) 
                return -1; 
            continue; 
        }         
        if(ch[i]=='(') 
            if(ch[i-1]>='0'&&ch[i-1]<='9') 
                return -1;         
        if(ch[i]==')') 
            if(ch[i+1]>='0'&&ch[i+1]<='9') 
                return -1; 
    } 
    return 1; 
} 
int ERRORINF(int flag) { 
    switch(flag) { 
        case 1: 
            return 1;         
        case -1: 
            printf("表达式格式错误!"); 
            return 0;         
        case -2: 
            printf("栈OPS溢出!"); 
            return 0;         
        case -3: 
            printf("除0!"); 
            return 0;         
        case -4: 
            printf("栈OVS溢出!"); 
            return 0;         
        case -5: 
            printf("栈OVS访问越界!"); 
            return 0;         
        case -6: 
            printf("栈OPS访问越界!"); 
            return 0;         
        default: 
            printf("程序运行错误!"); 
            return 0; 
    } 
} 
 
double convert(int *place) { 
    char num[SIZE1]; 
    int i=0,j=*place; 
     
    for(;str[j]>='0'&&str[j]<='9'||str[j]=='.';j++,i++) 
        num[i]=str[j]; 
    num[i]='\0'; 
    *place=j; 
    return atof(num); 
} 
int OPSWR(char c) { 
    OPS.top++; 
    if(OPS.top>=SIZE1) 
        return -2; 
    OPS.stack[OPS.top]=c; 
    return 1; 
} 
int OVSWR(double s) { 
    OVS.top++; 
    if(OVS.top>=SIZE1) 
        return -4; 
    OVS.stack[OVS.top]=s; 
    return 1; 
} 
int OPSRE(char *c) { 
    if(OPS.top<0) 
        return -5; 
    else { 
        *c=OPS.stack[OPS.top]; 
        OPSDEL(); 
    } 
    return 1; 
} 
int OVSRE(double *s) { 
    if(OVS.top<0) 
        return -6; 
    else { 
        *s=OVS.stack[OVS.top]; 
        OVSDEL();     
    } 
    return 1; 
} 
int OPSDEL() { 
    if(OPS.top<0) 
        return -5; 
    else { 
        OPS.stack[OPS.top]='\0'; 
        OPS.top--; 
    }     
    return 1; 
} 
int OVSDEL() { 
    if(OVS.top<0) 
        return -6; 
    else { 
        OVS.stack[OVS.top]=0; 
        OVS.top--; 
    } 
    return 1; 
} 
int CALCULATE() { 
    int place,flag=0; 
    double RES; 
    flag=OPSWR(';');     
    if(flag!=1) 
        return flag; 
    for(place=0;str[place]!='\0';place++) { 
        flag=0;         
        if(str[place]>='0'&&str[place]<='9') { 
            RES=convert(&place); 
            place--; 
            flag=OVSWR(RES); 
            if(flag!=1) 
                return flag; 
            continue; 
        }         
        if(str[place]=='(') { 
            flag=OPSWR('('); 
            if(flag!=1) 
                return flag; 
            continue; 
        }         
        if(str[place]==')')  { 
            if(OPS.stack[OPS.top]!='(') { 
                flag=COMP(); 
                if(flag!=1) 
                    return flag; 
                place--; 
                continue; 
            } 
            else { 
                flag=OPSDEL(); 
                if(flag!=1) { 
                    return flag; 
                } 
            } 
            continue; 
        }         
        if(str[place]=='+'||str[place]=='-') { 
            if(OPS.stack[OPS.top]=='('||OPS.stack[OPS.top]==';') { 
                flag=OPSWR(str[place]);     
                if(flag!=1) { 
                    return flag; 
                } 
                continue; 
            } 
            else { 
                flag=COMP(); 
                if(flag!=1) 
                    return flag; 
                place--; 
                continue; 
            }         
        }         
        if(str[place]=='*'||str[place]=='/') { 
            if(OPS.stack[OPS.top]=='*'||OPS.stack[OPS.top]=='/') { 
                flag=COMP(); 
                if(flag!=1) 
                    return flag; 
                place--; 
                continue;             
            } 
            else { 
                flag=OPSWR(str[place]); 
                if(flag!=1) 
                    return flag; 
                continue; 
            }     
        }         
        if(str[place]==';') { 
            if(OPS.stack[OPS.top]==';') { 
                RESULT=OVS.stack[OVS.top]; 
                return 1; 
            } 
            else { 
                flag=COMP(); 
                if(flag!=1) { 
                    return flag; 
                } 
                place--; 
                continue;                 
            } 
        } 
        return -1; 
    } 
    return 1; 
} 
int COMP() { 
    int flag; 
    double A,B,RES; 
    char ops;     
    flag=OPSRE(&ops); 
    if(flag!=1) { 
        return flag; 
    }     
    flag=OVSRE(&B); 
    if(flag!=1) { 
        return flag; 
    }     
    flag=OVSRE(&A); 
    if(flag!=1) { 
        return flag; 
    } 
    switch(ops) { 
        case '+': 
            RES=A+B; 
            break; 
        case '-': 
            RES=A-B; 
            break; 
        case '*': 
            RES=A*B; 
            break; 
        case '/': 
            if(B==0.0) 
                return -3; 
            RES=A/B; 
            break; 
        default: 
            return -1; 
    } 
    flag=OVSWR(RES); 
    if(flag!=1) { 
        return flag; 
    } 
    return 1; 
} 

2009-10-16 19:22
liuyuling
Rank: 1
等 级:新手上路
帖 子:10
专家分:5
注 册:2009-10-14
收藏
得分:0 
2楼好强?学C多久才能写出这样的程序呢?
2009-10-16 19:45
zhangxf1989
Rank: 6Rank: 6
等 级:侠之大者
帖 子:96
专家分:419
注 册:2009-9-5
收藏
得分:0 
少完一会游戏,多写一段代码,不在于你学了多久,而是你用心了没有。
2009-10-16 19:48
guoboqian
Rank: 1
等 级:新手上路
帖 子:4
专家分:3
注 册:2009-10-16
收藏
得分:0 
说得经典
2009-10-16 20:08
gaofei52022
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2009-10-15
收藏
得分:0 
二楼大哥真强,不过可小弟运行怎么出错呀
错误 noname.c 8: 非法字符 '? (0xf2)
提示这个出错,代码是int check(char ch[]);这个,我不知道怎么出错了
2009-10-17 11:08
zhangxf1989
Rank: 6Rank: 6
等 级:侠之大者
帖 子:96
专家分:419
注 册:2009-9-5
收藏
得分:0 
回复 6楼 gaofei52022
你是直接考过去编译的吗?我刚才直接从这个网页考到VC和TC3.0上编译了一下没有问题啊?你先把所有的注释删了再试试。
2009-10-17 20:11
zhangxf1989
Rank: 6Rank: 6
等 级:侠之大者
帖 子:96
专家分:419
注 册:2009-9-5
收藏
得分:1 
貌似在win-tc中会出现这个问题,主要是因为win-tc中的注释只能用类似/*.....*/的形式,把注释全删了就没有问题了。
2009-10-17 20:20
abc小鸭
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-05-03 17:32
快速回复:C语言如何计算表达式
数据加载中...
 
   



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

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