qq_40722210 2017-10-20 16:59 采纳率: 0%
浏览 349

关于c语言编计算器的问题

写了的小程序但总有情况出错求大神帮我看看问题出在哪。不考虑括号情况
#include
#include
#include
typedef struct{
double top;
double *base; //定义一个数据栈
} datastack;
typedef struct{
char *top;
char *base; //定义一个符号栈
} opstack;
void initiatedatastack(datastack *data){
data->top=data->base=(double
)malloc(100*sizeof(double));
(data->top)=(data->base)=EOF;
}
void initiateopstack(opstack op){ //栈初始化
op->top=op->base=(char
)malloc(100*sizeof(char));
*(op->base)=EOF;
}
void pushdata(datastack *data,double c) //数字压入栈函数
{ data->top++;
*data->top=c;

}
void pushop(opstack *op,char c) { //符号压入函数
op->top++;
*op->top=c;

}

int main(void)
{char a[200],k;
double r=0.0,d=0.0,c=0.0,m=0.0,n=0.0;int i=0;
datastack data;
opstack *op;
data=(datastack
)malloc(100*sizeof(datastack));
op=(opstack*)malloc(100*sizeof(opstack));
initiateopstack(op);
initiatedatastack(data);
printf("请输入:");
fgets(a,1000,stdin);
for(i=0;a[i]!=EOF;i++){
if(a[0]=='-'){
i=i+1;
while(a[i]<='9'&&a[i]>='0'){ //第一位为负号
c=a[i]-48;
d=d*10+c;
i++;}printf("%d",i);
if(a[i]=='.'){
i++; //小数情况
while(a[i]<='9'&&a[i]>='0'){

  r=10.0;
  d=d+((a[i]-48)/r);
  r=r*10.0;
  i++;}} 

d=0.0-d;
pushdata(data,d);i--;
d=0.0;
a[0]='?';
i--;printf("%d",i);
continue;
}
if(a[i]!='\n'){
while(a[i]<='9'&&a[i]>='0'){ //取数字
c=a[i]-48;
d=d*10+c;
i++;

}
if(a[i]=='.'){
i++; //小数情况
while(a[i]<='9'&&a[i]>='0'){

  r=10.0;
  d=d+((a[i]-48)/r);
  r=r*10.0;
  i++;}

}
pushdata(data,d);printf("x");
d=0.0;}
if(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/')
{

if(*op->top=='*'){
m=*data->top;
data->top--; // 乘除运算
n=*data->top;
m=m*n;
data->top=m;
op->top--;
pushop(op,a[i]);
}
else if(*op->top=='/'){
m=*data->top;
data->top--; // 乘除运算
n=*data->top;
m=n/m;
*data->top=m;
op->top--;
pushop(op,a[i]);}
else if(a[i+1]=='-'&&(a[i]=='+'||a[i]=='-'||a[i]=='
'||a[i]=='/'))
{ pushop(op,a[i]) ;
i=i+2;
while(a[i]<='9'&&a[i]>='0'){ //负数情况
c=a[i]-48;
d=d*10+c;
i++;}

d=0-d;
pushdata(data,d);
i--;
d=0.0;

}
else
{
pushop(op,a[i]);
}
}
if(a[i]=='\n'){
m=*data->top;
(data->top)--;
while(*(data->top)!=*(data->base)){
n=*data->top;
if(*op->top=='/'){m=n/m;*data->top=m;data->top--;op->top--;}
else if(*op->top=='*'){m=n*m;*data->top=m;data->top--;op->top--;}
else if(*op->top=='+'){m=n+m;*data->top=m;data->top--;op->top--;}
else if(*op->top=='-'){m=n-m;*data->top=m;data->top--;op->top--;}

}i--;
a[i+1]=EOF; } } //加减运算
printf(" ANSWER:%lf ",m);
return 0;
}

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 基于卷积神经网络的声纹识别
    • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
    • ¥100 为什么这个恒流源电路不能恒流?
    • ¥15 有偿求跨组件数据流路径图
    • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
    • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
    • ¥15 CSAPPattacklab
    • ¥15 一直显示正在等待HID—ISP
    • ¥15 Python turtle 画图
    • ¥15 stm32开发clion时遇到的编译问题