应该是进制转换的问题,专门都转换了,最后输出结果还是一直是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.还是我转换的时候错了?