读书人

中值表达式隐含异常勘误

发布时间: 2013-01-04 10:04:18 作者: rapoo

中值表达式隐含错误勘误
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 50

typedef struct{
char * base;
char * top;
int stacksize;
}optrstack;//定义符号栈

typedef struct{
float * base;
float * top;
int stacksize;
}opndstack;//定义数字栈

optrstack initoptr()
{
optrstack optr;
optr.base = (char * )malloc( N * sizeof(char) );
if(!optr.base)
{
printf("error!\n");
exit (0);
}
optr.top = optr.base;
optr.stacksize = N;
return (optr);
}//符号栈初始化

opndstack initopnd()
{
opndstack opnd;
opnd.base = (float * )malloc( N * sizeof(float) );
if(!opnd.base)
{
printf("error!\n");
exit (0);
}
opnd.top = opnd.base;
opnd.stacksize = N;
return (opnd);
}//数字栈初始化

int optrempty(optrstack optr)
{
if(optr.top==optr.base)
return 1;
else return 0;
}//符号栈空否?

/*int opndempty(opndstack opnd)
{
if(opnd.top==opnd.base)
return 1;
else return 0;
}//数字栈空否?*/

void optrpush(optrstack optr,char newelem)
{
* optr.top++ =newelem;
}//符号栈插入

char optrpop(optrstack optr)
{
char oldelem;
oldelem = * --optr.top;
return oldelem;
}//符号栈弹出

void opndpush(opndstack opnd,float newelem)
{
* opnd.top++ =newelem;
}//数字栈插入

float opndpop(opndstack opnd)
{
float oldelem;
oldelem = * --opnd.top;
return oldelem;
}//数字栈弹出

float gettopopnd(opndstack opnd)
{
float e;
if(opnd.top==opnd.base)
{exit (0);}
e = * (opnd.top-1);
return e;
}//数字gettop

char gettopoptr(optrstack optr)
{
char e;
if(optr.top==optr.base)
{exit (0);}
e = * (optr.top-1);
return e;
}//符号gettop

char precede(char firstchar,char secondchar)
{
if((firstchar=='+')||(firstchar=='-'))
{
if((secondchar=='(')||(secondchar=='#'))
{
return '<';
}
else
{
return '>';
}
}
if((firstchar=='*')||(firstchar=='/'))
{
if((secondchar=='*')||(secondchar=='/')||(secondchar==')'))
{
return '>';
}
else
{
return '<';
}
}
if(firstchar=='(')
{
return '<';
}
if(firstchar==')')
{
if(secondchar=='(')
{
return '=';
}
else
{
return '>';
}
}
if(firstchar=='#')
{
if(secondchar=='#')
{
return '=';
}
else
{
return '>';
}
}
}//判别优先性,firstchar表示最新见的的字符,secondchar表示被pop出来的字符

float calculate(float num1,char op,float num2)
{
if(op=='+') return (num1+num2);
if(op=='-') return (num1-num2);
if(op=='*') return (num1*num2);
if(op=='/') return (num1/num2);
}//计算函数

void operate(char object[N],optrstack optr,opndstack opnd)
{
int i;
float num,adder1=0.0,adder2=0.0;
char firstchar,secondchar,cmp,temp;


optrpush(optr,'#');
for(i=0;(i<strlen(object))&&(optrempty(optr)!=1);i++)
{
if((object[i]<='9')&&(object[i]>='0'))
{
num =(object[i]-'0')*1.0;
opndpush(opnd,num);
continue;
}//新数字入栈&跳出循环
if((object[i]<'0')||(object[i]>'9'))
{
firstchar=object[i];
printf("\n%c\n",firstchar);
}//提取符号
secondchar=gettopoptr(optr);
cmp=precede(firstchar,secondchar);
if(cmp=='<')
{
optrpush(optr,firstchar);//新符号入栈
continue;
}
if(cmp=='=')
{
temp=optrpop(optr);
continue;
}
if(cmp=='>')
{
temp=optrpop(optr);
adder1=opndpop(opnd);
adder2=opndpop(opnd);
opndpush(opnd,calculate(adder2,temp,adder1));
if(precede(firstchar,gettopoptr(optr))=='=')
{
temp=optrpop(optr);
}
else
{
optrpush(optr,firstchar);
}
continue;
}
}
printf("\nthe answer is %f\n",gettopopnd(opnd));
}//end 操作函数

int main()
{
char object[N];
optrstack optr;
opndstack opnd;
optr=initoptr();
opnd=initopnd();
printf("Please input the arithmetic expression:\n\n");
gets(object);
operate(object,optr,opnd);
return 0;
}//end main

RT,请问为什么不能输出结果呢?我暂时设定表达式中的数据都是个位数…
[解决办法]

引用:
C/C++ code123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293……


输入的时候在末尾加个#就对了...

读书人网 >C++

热点推荐