不平凡的自己 2015-11-07 02:59 采纳率: 0%
浏览 1308

c实现算数设计,可是查不出程序有什么问题!

#include
#include
#include
#define STACK_INIT_SIZE 100 //栈
#define STACKINCREMENT 10 //栈的存储单位长度
#define OVERFLOWER -2 //定义
#define ERROR 0 //定义
#define OK 1 //定义
#define SElemType char //定义SElemType 为char类型
typedef int Status; //Status等同于int 定义

typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;//数据结构的定义

Status InitStack(SqStack &S)//栈的初始化
{
S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof (SElemType));//分配首地址
if(!S.base)exit(OVERFLOWER);//分配失败
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;//栈的大小
return(OK);
}

Status Push(SqStack &S,SElemType e)//进栈
{
if(S.top-S.base>=S.stacksize)
{
S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof (SElemType));
if(!S.base)
exit(OVERFLOWER);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return(OK);
}

Status Pop(SqStack &S,SElemType &e)//出栈
{
if(S.top==S.base)
return (ERROR);
e=*--S.top;
return(OK);
}

SElemType GetTop(SqStack S)//取栈顶元素
{
SElemType e;
if(S.base==S.top)
return(ERROR);
e=*(S.top-1);
return (e);
}

Status In(SElemType c)//判断c是否为运算符
{
switch(c)
{
case'+':
case'-':
case'*':
case'/':
case'(':
case')':
case'#':
return (OK);
default:return (ERROR);
}
}

char Precede(char c1,char c2)//符号优先级别的判断
{
switch(c1)
{
case '+':
case '-':
if(c2=='*'||c2=='('||c2=='/')
return('<');
else
return('>');
break;
case'*':
case'/':
if(c2=='(')
return('<');
else return('>');
break;
case'(':
if(c2==')')
return('=');
else if(c2=='#')
return(ERROR);
else
return('<');
case')':
if(c2=='(')
return(ERROR);
else
return('>');
case'#':
if(c2==')')
return(ERROR);
else if(c2=='#')
return('=');
else
return('<');
default:
exit(0);
}
}

SElemType Operate(int a,char theta,int b)//实现四则运算
{
int result;
a=a-'0';
b=b-'0';
switch(theta)
{
case'+':
result=a+b;
break;
case'-':
result=a-b;
break;
case'*':
result=a*b;
break;
case'/':
result=a/b;
break;
}
result=result+'0';//!注意,这里的result可能也不是相应的数值字符!
return(result);
}

SElemType EvalutaExpression()//实现运算式的求值
{
SqStack OPTR,OPND;
InitStack(OPTR);//符号栈
InitStack(OPND);//数栈
char c[100],x,theta,a,b;
int i=0,s;
c[i]=getchar();
while(c[i]!='#'||GetTop(OPTR)!='#')
{
if(c[i]>='0'&&c[i]<='9')
{
s=c[i]-48;
i++;
c[i]=getchar();
while(c[i]>='0'&&c[i]<='0')
{
s=s*10;
s=s+(c[i]-48);
i++;
c[i]=getchar();
}
s=s+'0';
Push(OPND,s);
s=0;
}
if(In(c[i])){
switch(Precede(GetTop(OPTR),c[i]))
{
case'<':Push(OPTR,c[i]);
i++;
c[i]=getchar();
break;
case'=':Pop(OPTR,x);
i++;
c[i]=getchar();
break;
case'>':theta=GetTop(OPTR);
b=GetTop(OPND);
a=GetTop(OPND);
Push(OPND,Operate(a,theta,b));
break;
}
}
}

return(GetTop(OPND)-'0');

}
int main()//实现输入表达式格式的判断和多位数的表达式计算
{
int i;
printf("请输入您需要计算的表达式,以“#”结束:\n");
i=EvalutaExpression();
printf("The result is %d",i);
printf("\n");
}

  • 写回答

2条回答 默认 最新

  • Meditator_hkx 2015-11-07 05:26
    关注

    Mark,可否提供一下报错信息~
    另外,这个小项目可以通过进入函数调试来逐步解决bug的。

    评论

报告相同问题?

悬赏问题

  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序