2 u011172887 u011172887 于 2013.06.30 20:17 提问

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

#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
oyljerry   Ds   Rxr 2015.01.03 11:09

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

John_ToString
John_ToString   2015.12.05 16:36

有注释就自己去看吧 ,,,自己去调试并阅读每一行代码///

John_ToString
John_ToString   2015.12.05 16:36

有注释就自己去看吧 ,,,自己去调试并阅读每一行代码///

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!