u011172887 2013-06-30 12:17 采纳率: 20%
浏览 2013

谁能帮忙解释一下这个程序

#include
#include
#include //运用malloc函数申请空间
double jisuan(char a[])
{
int i=1,j,k,m,cnt=0,t1=0,t2=0,t3=0;//变量初始化//
char nibo[50],zhan2[50];//定义字符型数组
double x,n,l,z=0,zhan3[20];//定义双精度变量
typedef struct //结构体定义
{
double d1; //定义d1
int d2; //定义d2
}
dd;
typedef struct //结构体定义
{ dd data[50];
int top; //定义栈类型头指针
}
zhan1;//定义指针变量
zhan1 shu;//声明变量
shu.top=0;//初始化头指针
while(a[i]!='\0')// 如果a[i]的值是\0,跳出循环
{ if(a[i]>='0'&&a[i]<='9')
{ z=0;
j=i+1;
while(a[j]>='0'&&a[j]<='9')
{
j++;
}
j--;
for(k=i;k<=j;k++)
{ z=z*10+a[k]-'0'; }
j=j+1;
x=z;
if(a[j]=='.')
{
l=1;
i=j+1;
j=i+1;
while(a[j]>='0'&&a[j]<='9')
{j++;}
j--;
for(k=i;k<=j;k++)
{ n=pow(0.1,l);
l=l+1;
x=x+n*(a[k]-'0');
}
i=j+1;
}
else i=j;
shu.data[++shu.top].d1=x;
shu.data[shu.top].d2=++cnt;
nibo[++t1]='0'+shu.data[shu.top].d2;
nibo[t1+1]='\0'; }
else
if(a[i]=='(')
{
zhan2[++t2]=a[i];
i++;
}
else if(a[i]==')')
{
j=t2;
while(zhan2[j]!='(')
{
nibo[++t1]=zhan2[j];
nibo[t1+1]='\0';
j--;
}
t2=j-1;
i++;
}
else //对加法的定义
if(a[i]=='+')
{
while(t2>0&&zhan2[t2]!='(')//加号和"("同时出现时
{
nibo[++t1]=zhan2[t2];//将zhan2[t2]赋给nibo[++t2]
nibo[t1+1]='\0';
t2--;
}
zhan2[++t2]=a[i];
i++;
}
else//对减法定义
if(a[i]=='-')
{ if(a[i-1]=='$')
{ a[0]='0'; i=0; }
else if(a[i-1]=='(')
{ a[i-1]='0';
a[i-2]='(';
i=i-2; }
else
{
while(t2>0&&zhan2[t2]!='(')
{
nibo[++t1]=zhan2[t2];
nibo[t1+1]='\0';
t2--;
}
zhan2[++t2]=a[i];
i++;
}
}
else if(a[i]=='*'||a[i]=='/')
{
while(zhan2[t2]=='*'||zhan2[t2]=='/'||zhan2[t2]=='^'||zhan2[t2]=='@')//逻辑运算
{
nibo[++t1]=zhan2[t2];
nibo[t1+1]='\0';
t2--;
}
zhan2[++t2]=a[i];
i++;
}
else if(a[i]=='^'||a[i]=='@')
{
while(zhan2[t2]=='^'||zhan2[t2]=='@')
{
nibo[++t1]=zhan2[t2];
nibo[t1+1]='\0';
t2--;
}
zhan2[++t2]=a[i];
i++;
}
}
while(t2>0)
{
nibo[++t1]=zhan2[t2];//将zhan2[t2]值赋给nibo[++ti]
nibo[t1+1]='\0';//遇到\0结束运算
t2--;
}
t1=1;
while(nibo[t1]!='\0')
{ if(nibo[t1]>='0'&&nibo[t1]<='9')
{ for(i=0;i<=shu.top;i++)
{ if(nibo[t1]-'0'==shu.data[i].d2)
{ m=i; break; }
}
zhan3[++t3]=shu.data[m].d1; }
else if(nibo[t1]=='+')//加法
{ zhan3[t3-1]=zhan3[t3-1]+zhan3[t3];
t3--; }
else if(nibo[t1]=='-')//减法
{ zhan3[t3-1]=zhan3[t3-1]-zhan3[t3];
t3--;
} else if(nibo[t1]=='*')//乘法
{

zhan3[t3-1]=zhan3[t3-1]*zhan3[t3];
t3--; }
else if(nibo[t1]=='/')//除法
{
zhan3[t3-1]=zhan3[t3-1]/zhan3[t3];
t3--;
}
else if(nibo[t1]=='^')//幂运算
{
zhan3[t3-1]=pow(zhan3[t3-1],zhan3[t3]);//zhan3[t3-1]存储底数,zhan3[t3]存储幂数
t3--;
}
else if(nibo[t1]=='@')//开方
{ zhan3[t3]=sqrt(zhan3[t3]);//把zhan3[3]开方后的值赋给zhan3[3]
}
t1++;
}
return zhan3[1];
}
//主函数//
void main()
{
for(;;)
{ char x,a[50];
double jieguo;
int i=0;
a[0]='$';
printf("@表示开方,^表示乘方\n");
printf("请输入表达式,退出请输入q:\n\n");
scanf("%c",&x);
if(x=='q') break;
while(x!='\n')
{
a[++i]=x;
scanf("%c",&x);
}
a[i+1]='\0';
jieguo=jisuan(a);
printf("\n");
printf("结果为:%lf",jieguo);
printf("\n\n");
}
}

  • 写回答

3条回答 默认 最新

  • oyljerry 2015-01-03 03:09
    关注

    注释都很清楚了,进行各种四则运算

    评论

报告相同问题?

悬赏问题

  • ¥20 删除和修改功能无法调用
  • ¥15 kafka topic 所有分副本数修改
  • ¥15 小程序中fit格式等运动数据文件怎样实现可视化?(包含心率信息))
  • ¥15 如何利用mmdetection3d中的get_flops.py文件计算fcos3d方法的flops?
  • ¥40 串口调试助手打开串口后,keil5的代码就停止了
  • ¥15 电脑最近经常蓝屏,求大家看看哪的问题
  • ¥60 高价有偿求java辅导。工程量较大,价格你定,联系确定辅导后将采纳你的答案。希望能给出完整详细代码,并能解释回答我关于代码的疑问疑问,代码要求如下,联系我会发文档
  • ¥50 C++五子棋AI程序编写
  • ¥30 求安卓设备利用一个typeC接口,同时实现向pc一边投屏一边上传数据的解决方案。
  • ¥15 SQL Server analysis services 服务安装失败