| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2217 人关注过本帖
标题:应该是进制转换的问题,专门都转换了,最后输出结果还是一直是0,求教
只看楼主 加入收藏
姚萌萌
Rank: 2
来 自:湖北
等 级:论坛游民
帖 子:40
专家分:55
注 册:2016-12-25
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:8 
应该是进制转换的问题,专门都转换了,最后输出结果还是一直是0,求教
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define Y 3.1415926535/*圆周率*/
#define N 100/*数组大小*/
#define MAXOP 13
struct sum
{
    char data[N];
    int top;
}op;/*存放运算符*/
struct
{
    float data[MAXOP];/*存放数字*/
    int top;/*栈顶指针*/
}st;/*定义运算数栈*/
char exp0[N];/*存放读入的表达式*/
char postexp[N];/*存放后缀表达式*/
struct/*设置优先级*/
{
    char ch;/*运算符*/
    int pri;/*优先级*/
} lpri[]={{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6},{'T',5},{'S',5},{'C',5},{'P',5},{'E',5},{'J',7}},
  rpri[]={{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1},{'T',6},{'S',6},{'C',6},{'P',6},{'E',6},{'J',6}};
  /*T代表tan,S代表sin,C代表cos,P代表次方,E代表开方,J代表阶乘*/
float fact(int x)/*求x的阶乘*/
{
    int i;
    int all=1;
    for(i=1;i<=x;i++)
    all*=i;
    return (float)all;                           
}
int leftpri(char op)/*返回左运算符优先级*/
{
    int i;
    for(i=0;i<MAXOP;i++)
    if(lpri[i].ch==op)
    return lpri[i].pri;
}    
int rightpri(char op)/*返回右运算符优先级*/
{
    int i;
    for(i=0;i<MAXOP;i++)
    if(rpri[i].ch==op)
    return rpri[i].pri;
}
bool InOp(char ch)/*判断是数字还是字符,返回真则是数字*/
{
    if((ch>='0'&&ch<='9')||ch=='.')
    return true;
    else
    return false;
}
int Precede(char ch1,char ch2)/*比较两个运算符的优先级*/
{
    if(leftpri(ch1)==rightpri(ch2))
    return 0;
    if(leftpri(ch1)<rightpri(ch2))
    return -1;
    if(leftpri(ch1)>rightpri(ch2))
    return 1;
}
void trans(char* exp,char postexp[] )/*将算数表达式exp转换成后缀表达式*/
{
    int i=0;
    op.top=-1;
    op.top++;
    op.data[op.top]='=';
    while(*exp!='\0')
    {
        if(InOp(*exp))/*读取数字*/
        {
            while((*exp>='0'&&*exp<='9')||*exp=='.')
            {
                postexp[i]=*exp;
                i++;
                exp++;
               
            }
            postexp[i]='#';
            i++;
        }
        else
        switch(Precede(op.data[op.top],*exp))/*判断运算符*/
        {
            case 0:
                  op.top--;
                  exp++;
                  break;
            case 1:
                  postexp[i]=op.data[op.top];
                  i++;
                  op.top--;
                  break;
            case -1:
                    op.top++;
                    op.data[op.top]=*exp;
                    exp++;
                    break;
        }
    }
    while(op.data[op.top]!='=')
    {
        postexp[i]=op.data[op.top];
        i++;
        op.top--;
    }
    postexp[i]='\0';/*字符串结尾*/
}
float compvalue(char *postexp)/*后缀表达式计算*/
{
    float a,b,c,d,i ;
    st.top=-1;
    while(*postexp!='\0')
    {
        switch(*postexp)
        {
            case '+':
                    a=st.data[st.top];
                    st.top--;
                    b=st.data[st.top];
                    st.top--;
                    c=a+b;
                    st.top++;
                    st.data[st.top]=c;
                    break;
            case '-':
                    a=st.data[st.top];
                    st.top--;
                    b=st.data[st.top];
                    st.top--;
                    c=b-a;
                    st.top++;
                    st.data[st.top]=c;
                    break;
            case '*':
                    a=st.data[st.top];
                    st.top--;
                    b=st.data[st.top];
                    st.top--;
                    c=a*b;
                    st.top++;
                    st.data[st.top]=c;
                    break;
            case '/':
                    a=st.data[st.top];
                    st.top--;
                    b=st.data[st.top];
                    st.top--;
                    if(a!=0)
                    {
                        c=b/a;
                        st.top++;
                        st.data[st.top]=c;
                    }
                    else
                    {
                        printf("\n\t除零错误!\n");
                        exit(0);
                    }
                    break;
            case 'T':/*三角函数*/
                    a=st.data[st.top];
                    st.top--;
                    c=tan(a);
                    st.top++;
                    st.data[st.top]=c;
                    break;
            case 'S':
                    a=st.data[st.top];
                    st.top--;
                    c=sin(a);
                    st.top++;
                    st.data[st.top]=c;
                    break;
            case 'C':
                    a=st.data[st.top];
                    st.top--;
                    c=cos(a);
                    st.top++;
                    st.data[st.top]=c;
                    break;
            case 'P':/*次方*/
                    a=st.data[st.top];
                    st.top--;
                    b=st.data[st.top];
                    st.top--;
                    c=powf(b,a);
                    st.top++;
                    st.data[st.top]=c;
                    break;
            case 'E':/*开放*/
                    a=st.data[st.top];
                    st.top--;
                    b=st.data[st.top];
                    st.top--;
                    c=powf(a,1.0/b);
                    st.top++;
                    st.data[st.top]=c;
                    break;
            case 'J':/*阶乘*/
                    a=st.data[st.top];
                    st.top--;
                    c=fact((int)a);
                    st.top++;
                    st.data[st.top]=c;
                    break;
            default:/*数字转换*/
                    i=0.0;
                    d=0.0;
                    while((*postexp>='0'&&*postexp<=9)||*postexp=='.')
                    {
                        if(*postexp=='.')/*计算小数点后的数*/
                        {
                            postexp++;
                            while((*postexp>='0'&&*postexp<=9)||*postexp=='.')
                            {
                                i++;
                                d+=((float)(*postexp-'0'))/(powf(10.0,i));
                                postexp++;
                            }
                        }
                        else
                        {
                        d=d*10.0+(float)(*postexp-'0');
                        postexp++;
                        }
                       
                    }
                    st.top++;
                    st.data[st.top]=d;
                    break;
                   
        }/*调出switch*/
        postexp++;
    }/*调出while*/
    return (st.data[st.top]);
}
int main()
{
    float num;
    printf("请输入计算式:\n");
    scanf("%s",exp0);
    trans(exp0,postexp);
    printf("中缀表达式:%s\n",exp0);
    printf("后缀表达式:%s\n",postexp);
    num=compvalue(postexp);
    printf("计算式的值是:%.3f\n",num);
    return 0;
   
}
个人感觉是精度的问题,但是不知道哪里出问题了,几个精度改变的地方我专门转换了,可是好像还是有问题,却又找不出来到底是为什么,结果一直是0.在c-free上编译的,求教大神为什么结果一直是0.还是我转换的时候错了?
搜索更多相关主题的帖子: 圆周率 
2017-04-15 15:08
姚萌萌
Rank: 2
来 自:湖北
等 级:论坛游民
帖 子:40
专家分:55
注 册:2016-12-25
收藏
得分:0 
回复 楼主 姚萌萌
运行完全没问题,我转换后的后缀表达式也是对的,就是算结果出来错了麻烦帮忙看一下float compvalue(char *postexp)/*后缀表达式计算*/函数里面转换哪里出错了,就是这一步有问题
2017-04-15 15:49
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:7 
后缀表达式没有优先级一说,优先级取决于输入符号的顺序。

你这是中缀转后缀?

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-15 19:05
姚萌萌
Rank: 2
来 自:湖北
等 级:论坛游民
帖 子:40
专家分:55
注 册:2016-12-25
收藏
得分:0 
回复 3楼 renkejun1942
嗯,后缀表达式是对的,我用简单的加减法试过,但是计算结果一直是0,所以我感觉转换表达式没问题,但是计算的时候不知道为什么都是0
2017-04-15 21:34
姚萌萌
Rank: 2
来 自:湖北
等 级:论坛游民
帖 子:40
专家分:55
注 册:2016-12-25
收藏
得分:0 
回复 3楼 renkejun1942
我感觉应该是这里的问题,但是我自己写的找不出来
程序代码:
float compvalue(char *postexp)/*后缀表达式计算*/
{
    float a,b,c,d,i ;
    st.top=-1;
    while(*postexp!='\0')
    {
        switch(*postexp)
        {
            case '+':
                    a=st.data[st.top];
                    st.top--;
                    b=st.data[st.top];
                    st.top--;
                    c=a+b;
                    st.top++;
                    st.data[st.top]=c;
                    break;
            case '-':
                    a=st.data[st.top];
                    st.top--;
                    b=st.data[st.top];
                    st.top--;
                    c=b-a;
                    st.top++;
                    st.data[st.top]=c;
                    break;
            case '*':
                    a=st.data[st.top];
                    st.top--;
                    b=st.data[st.top];
                    st.top--;
                    c=a*b;
                    st.top++;
                    st.data[st.top]=c;
                    break;
            case '/':
                    a=st.data[st.top];
                    st.top--;
                    b=st.data[st.top];
                    st.top--;
                    if(a!=0)
                    {
                        c=b/a;
                        st.top++;
                        st.data[st.top]=c;
                    }
                    else
                    {
                        printf("\n\t除零错误!\n");
                        exit(0);
                    }
                    break;
            case 'T':/*三角函数*/
                    a=st.data[st.top];
                    st.top--;
                    c=tan(a);
                    st.top++;
                    st.data[st.top]=c;
                    break;
            case 'S':
                    a=st.data[st.top];
                    st.top--;
                    c=sin(a);
                    st.top++;
                    st.data[st.top]=c;
                    break;
            case 'C':
                    a=st.data[st.top];
                    st.top--;
                    c=cos(a);
                    st.top++;
                    st.data[st.top]=c;
                    break;
            case 'P':/*次方*/
                    a=st.data[st.top];
                    st.top--;
                    b=st.data[st.top];
                    st.top--;
                    c=powf(b,a);
                    st.top++;
                    st.data[st.top]=c;
                    break;
            case 'E':/*开放*/
                    a=st.data[st.top];
                    st.top--;
                    b=st.data[st.top];
                    st.top--;
                    c=powf(a,1.0/b);
                    st.top++;
                    st.data[st.top]=c;
                    break;
            case 'J':/*阶乘*/
                    a=st.data[st.top];
                    st.top--;
                    c=fact((int)a);
                    st.top++;
                    st.data[st.top]=c;
                    break;
            default:/*数字转换*/
                    i=0.0;
                    d=0.0;
                    while((*postexp>='0'&&*postexp<=9)||*postexp=='.')
                    {
                        if(*postexp=='.')/*计算小数点后的数*/
                        {
                            postexp++;
                            while((*postexp>='0'&&*postexp<=9)||*postexp=='.')
                            {
                                i++;
                                d+=((float)(*postexp-'0'))/(powf(10.0,i));
                                postexp++;
                            }
                        }
                        else
                        {
                        d=d*10.0+(float)(*postexp-'0');
                        postexp++;
                        }
                      

                    }
                    st.top++;
                    st.data[st.top]=d;
                    break;
                 

        }/*调出switch*/
        postexp++;
    }/*调出while*/
    return (st.data[st.top]);
}
2017-04-15 21:36
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:7 
回复 5楼 姚萌萌
场面有点太宏大了

我觉得应该分模块调试  譬如:加法100% 减法100% 。。。。。。。。

DO IT YOURSELF !
2017-04-15 23:07
姚萌萌
Rank: 2
来 自:湖北
等 级:论坛游民
帖 子:40
专家分:55
注 册:2016-12-25
收藏
得分:0 
回复 6楼 wp231957
问题找出来了,是圆周率的问题,这里面每一个数都是字符,并且只代表一位数字,读取出来后转换成正常的数,但是圆周率是宏定义的,直接是数字,读取出来就有问题,不输入圆周率的话计算都没问题,所以想请教一下,圆周率该如何处理?或者就是指不能直接输入,宏定义的数字该如何处理呢?
2017-04-16 23:04
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
宥字符到数值以及数值到字符的转换函数

DO IT YOURSELF !
2017-04-16 23:25
初学编程的人
Rank: 2
等 级:论坛游民
威 望:2
帖 子:90
专家分:84
注 册:2017-3-12
收藏
得分:7 
宏展开在编译之前,看你这程序的意思是打算在运行时用Y来替代圆周率,这样是不行的,因为这个时候程序已经不会进行宏展开了,想要用Y替代圆周率要有一个字符检测选择的过程,就像你对T、S、C、P、E、J类似的操作一样。譬如你用字符Y作为检测,当输入Y的时候让程序用实数替换。
2017-04-17 11:48
快速回复:应该是进制转换的问题,专门都转换了,最后输出结果还是一直是0,求教
数据加载中...
 
   



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

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