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





