| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1186 人关注过本帖
标题:表达式求值问题
只看楼主 加入收藏
keep_on
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2012-10-31
收藏
 问题点数:0 回复次数:11 
表达式求值问题
完成

[ 本帖最后由 keep_on 于 2012-12-5 18:17 编辑 ]
搜索更多相关主题的帖子: 表达式 
2012-12-03 20:44
凌云飞翔
Rank: 5Rank: 5
来 自:河北
等 级:职业侠客
威 望:6
帖 子:98
专家分:388
注 册:2012-4-7
收藏
得分:0 
当输入整数的表达式时没有错误,输入小数时不显示。。。。。。
因为:
假设,当输入 2.5*4 时也就是说输入了五个字符,2.5是三个字符而不是一个字符。
明白吗?
2012-12-04 13:16
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
用判断整数的办法判断小数是不行的,数据读取那再想想


[fly]存在即是合理[/fly]
2012-12-04 14:55
keep_on
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2012-10-31
收藏
得分:0 
回复 2楼 凌云飞翔
那请问一下要怎么改呢?我改了好久也没有改出来。。。
2012-12-04 22:20
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
程序代码:
do
{
    d[i++]=c;
    c=getchar();

 }while(c>='0'&&c<='9'||c=='.');


[fly]存在即是合理[/fly]
2012-12-04 22:58
keep_on
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2012-10-31
收藏
得分:0 
回复 5楼 azzbcc
你好厉害!你也是财大信管学院的吧?
2012-12-05 18:12
keep_on
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2012-10-31
收藏
得分:0 
回复 6楼 keep_on
已解决~~

[ 本帖最后由 keep_on 于 2012-12-30 12:49 编辑 ]
2012-12-05 18:17
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
输入的括号不匹配,当然死循环


[fly]存在即是合理[/fly]
2012-12-05 19:30
一个孩子
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:356
专家分:954
注 册:2012-10-1
收藏
得分:0 
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct
{
    float *base;
    float *top;
    int stack_size;
}sqstack;//操作数栈的声明
typedef struct
{
    char *base;
    char *top;
    int stack_size;
}Sqstack;//运算符栈的声明
/*
**运算符栈的基本操作
*/
int Initstack1(Sqstack &OPTR)
{
    OPTR.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
    if(!OPTR.base)
        return 0;
    OPTR.top=OPTR.base;
    OPTR.stack_size=STACK_INIT_SIZE;
    return 1;
}
int Push1(Sqstack &OPTR,char e)
{
    if(OPTR.top-OPTR.base>=OPTR.stack_size)
    {
        OPTR.base=(char*)realloc(OPTR.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(char));
        if(!OPTR.base)
            return 0;
        OPTR.top=OPTR.base+OPTR.stack_size;
        OPTR.stack_size+=STACKINCREMENT;
    }
    *OPTR.top++=e;
    return 1;
}
int Pop1(Sqstack &OPTR,char &e)
{
    if(OPTR.top==OPTR.base)
        return 0;
    else
        e=*--OPTR.top;
    return 1;
}
char getTop1(Sqstack &OPTR)
{
    if(OPTR.top==OPTR.base)
        return 0;
    else
        return (*(OPTR.top-1));
}

/*
** 操作数栈的基本操作
*/
int Initstack(sqstack &S)
{
    S.base=(float *)malloc(STACK_INIT_SIZE*sizeof(float));
    if(!S.base)
        return 0;
    S.top=S.base;
    S.stack_size=STACK_INIT_SIZE;
    return 1;

}
int Push(sqstack &S,float e)
{
    if(S.top-S.base>=S.stack_size)
    {
        S.base=(float *)realloc(S.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(float));
        if(!S.base)
            return 0;
        S.top=S.base+S.stack_size;
        S.stack_size+=STACKINCREMENT;
    }
    *S.top++=e;
    return 1;
}
int Pop(sqstack &S,float &e)
{
    if(S.top==S.base)
        return 0;
    e=*--S.top;
    return 1;
}
float getTop(sqstack &S)
{
    if(S.top==S.base)
        return 0;
    return(*(S.top-1));
}
int In(char c)
{
    if(c=='+'||c=='-'||c=='*'||c=='/'||c=='#'||c=='('||c==')')//这里不要漏写了,要不然影响结果!
        return 1;
    else
        return 0;

}

char Precede(char a,char b)
{
    int i,j;
    char op[8][8]={{' ','+','-','*','/','(',')','#'},{'+','>','>','<','<','<','>','>'},{'-','>','>','<','<','<','>','>'},{'*','>','>','>','>','<','>','>'},{'/','>','>','>','>','<','>','>'},
    {'(','<','<','<','<','<','=',' '},{')','>','>','>','>',' ','>','>'},{'#','<','<','<','<','<',' ','='}};
    for(i=0;i<8;i++)
    {
        if(a==op[i][0])
            break;
    }
    for(j=0;j<8;j++)
    {
        if(b==op[0][j])
            break;
    }
    return op[i][j];

}
float Operate(float a,char theta,float b)//这个没有错!
{
    float c;
    switch(theta)
    {
    case '+':
        c=a+b;
        break;
    case '-':
        c=a-b;
        break;
    case '*':
        c=a*b;
        break;
    case '/':
        c=a/b;
        break;
    }
    return c;
}
float EvalueateExpression(sqstack OPND,Sqstack OPTR)
{
    char c,x,theta;
    float a,b,i;
    Push1(OPTR,'#');
    c=getchar();
    while(c!='#'||getTop1(OPTR)!='#')
    {
        if(!In(c))
        {
            i=(float)(c-48);
            Push(OPND,i);
            c=getchar();
        }
        else
        {
            switch(Precede(getTop1(OPTR),c))
            {
            case '<':
                Push1(OPTR,c);
                c=getchar();
                break;
            case '=':
                Pop1(OPTR,x);c=getchar();
                break;
            case '>':
                Pop(OPND,b);
                Pop(OPND,a);
                Pop1(OPTR,theta);
                Push(OPND,Operate(a,theta,b));
                break;
            }
        }
    }
    return getTop(OPND);
    

}
int main()
{
    float m;
    Sqstack OPTR;
    sqstack OPND;
    Initstack(OPND);
    Initstack1(OPTR);
    printf("please input a expression end with '#',and the number is between 0-9!\n");
    m=EvalueateExpression(OPND,OPTR);
    printf("结果是:%.2f\n",m);
    return 0;
}
这是我以前写的,跟你共享下

重要的不是结果,是求一个结果的过程,哪怕千难万难,当你有想要的结果时,你已走的很远
2012-12-05 21:48
keep_on
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2012-10-31
收藏
得分:0 
回复 9楼 一个孩子
这个我知道,我已经编出来了这个,我只是想在表达式求值之前判断一下它括号是否匹配,如果不匹配就直接退出,不要计算了,这个根本就没有考虑到表达式有没有匹配,当不匹配的时候就死了
2012-12-05 21:53
快速回复:表达式求值问题
数据加载中...
 
   



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

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