还是那个计算器的问题,我加了点东西之后又出现一中情况,让我很不解
它是求类似表达式:S(S(256))+A(4,2)+C(4,2)+3/2-5+3!#的值的
S()表示求数的开方,A()求排列,C()求组合...
下面是程序的一部分:
void turn() //将表达式转换为后缀表达式并把它放入结构体exp[]中 { int i,j,k,t,top,num,temp,sum1,sum2,flag=1,n=1; float sum,su,tem; char expr[MAX],stack[10]; //expr[]用于存放初始表达式,stack[]做栈使用 link exp[50]; //结构体 i=0;k=0;t=0;top=1; printf("请输入要求值的表达式并以'#'结束:\n"); do { i++; scanf("%c",&expr[i]); }while(expr[i]!='#'&&i<=MAX); num=i; //num为字符个数 printf("原表达式为:\n"); for(i=1;i<=num;i++) //输出 printf("%c",expr[i]); printf("\n"); i=1; //第一个 while(expr[i]!='#') //循环 { switch(expr[i]) { case'S':sum=0.0;su=0.0;tem=0.1; i=i+2; if(expr[i]>='0'&&expr[i]<='9') { while(expr[i]>='0'&&expr[i]<='9') //整数部分 { sum=sum*10+expr[i]-48; i++; } //while end if(expr[i]=='.') { i++; while(expr[i]>='0'&&expr[i]<='9') //小数部分 { su=su+(expr[i]-48)*tem; tem=tem*(0.1); i++; } //while end } //if end i=i+n; sum=sum+su; exp[++k].value =operS(sum,n); //求值后把值放入结构体中 exp[k].charc[1]='#'; //结构体成员charc[5]第一个值置为'#' sum=0.0;su=0.0; //重新置值 break; } if(expr[i]=='S') //递归情况 { n++; //n记录递归次数 break; } if(expr[i]=='-') { printf("被开方数不能为负数,请重新输入!\n"); flag=0; expr[i]='#'; break; }
..............//未变
if(flag==1)//flag=1表示无错误情况发生 { t=1; while(exp[k].charc[t]!='#') { t++; } while(top>1) //把栈中剩下的符号放进exp[].charc[]中 exp[k].charc[t++]=stack[top--]; exp[k].charc[t]='#'; printf("转换成后缀表达式并放入表后的分布:\n"); for(i=1;i<=k;i++) printf("%10f",exp[i].value); printf("\n"); for(i=1;i<=k;i++) for(j=1;exp[i].charc[j]!='#'&&j<5;j++) if(exp[i].charc[j]=='+'||exp[i].charc[j]=='-'||exp[i].charc[j]=='*'||exp[i].charc[j]=='/') printf("%3c",exp[i].charc[j]); printf("\n");
}
}
为加粗部分是未做S()的递归情况及报错等情况的,没问题
但加了粗体部分后,程序就有问题了
程序每执行一条语句,top的值便会随着加1 ,导致后面的程序执行有误!
请问大家,这是什么原因呢???