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
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 Arcgis相交分析无法绘制一个或多个图形