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条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
    • ¥20 腾讯企业邮箱邮件可以恢复么
    • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
    • ¥15 错误 LNK2001 无法解析的外部符号
    • ¥50 安装pyaudiokits失败
    • ¥15 计组这些题应该咋做呀
    • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
    • ¥15 让node服务器有自动加载文件的功能
    • ¥15 jmeter脚本回放有的是对的有的是错的
    • ¥15 r语言蛋白组学相关问题