偶写了个计算器程序,出了点问题,请大家看一下!
主要是看最后面的那几句,当我输入A(5,1)时,(即是求5的1阶排列:5*1)
能得到后缀表达式5 #(数字之间用空格隔开),但输入A(5,2)或是A(5,3)..时,能得到部分求值后的表达式,即是20#,60#..但不能得到后缀表达式! 死了!
输入的是A(4,*)时,就全部都可以!像A(*,1)的也可以,其他的就不行了!!!
搞不懂???
请大家帮忙看一下!
谢了!
.......
对不起!忘了把程序放上去啦!
下面是程序的一部分:
double global=0.0; #define MAX 100 #include<stdio.h> #include<stdlib.h> #include<math.h>
void operS(float c) { global=sqrt(c); }
int operA(int a,int b) { int i,sn; sn=1; for(i=a;i>=a-b+1;i--) sn=sn*i; return(sn); }
int operC(int a,int b) { int temp,i,sn,tn; sn=1; for(i=a;i>=a-b+1;i--) sn=sn*i; tn=1; for(i=b;i>0;i--) tn=tn*i; temp=sn/tn; return(temp); }
int operX(int a,int b) { int i,sn=1; for(i=1;i<=b;i++) sn=sn*a; return(sn); }
int operN(int a) { int i,sn; sn=1; for(i=a;i>0;i--) sn=sn*i; return(sn); }
void turn(char str[]) { int i,j,top; char stack[MAX],exp[MAX]; i=1;j=1;top=1;stack[1]='\0'; while(str[i]!='#') { switch(str[i]) { case'(':stack[++top]=str[i++]; break; case')':while(stack[top]!='('&&top!=1) exp[j++]=stack[top--]; top--;//跳过左括号 i++; break; case'*': case'/':while(stack[top]=='*'||stack[top]=='/') exp[j++]=stack[top--]; stack[++top]=str[i++]; break; case'+': case'-':while(stack[top]!='('&&top!=1) exp[j++]=stack[top--]; stack[++top]=str[i++]; break; case'S':exp[j++]=str[i++];break; default:while(str[i]=='.'||str[i]>'0'&&str[i]<'9') exp[j++]=str[i++]; exp[j++]=' '; } } while(top!=1) exp[j++]=stack[top--]; exp[j]='#'; printf("后缀表达式为:\n"); for(i=1;i<=j;i++) printf("%c",exp[i]); printf("\n"); }
void analyse() { int i,j,k,num,temp,t1,t2,sum1,sum2,hund,deca,sing; float sum,su; char expr[MAX]; i=0; printf("请输入要求值的表达式:\n"); do { i++; scanf("%c",&expr[i]); }while(expr[i]!='#'&&i<=MAX); num=i; printf("原表达式为:\n"); for(i=1;i<=num;i++) printf("%c",expr[i]); printf("\n"); for(i=1;expr[i]!='#';i++) switch(expr[i]) { case'S':sum=0.0;su=0.0;t1=0;t2=0; for(k=i+2;expr[k]!='.';k++) { t1++; sum=sum*10+expr[k]-48; } for(k=k+1;expr[k]!=')';k++) { t2++; su=su+(expr[k]-48)*(0.1); } sum=sum+su; operS(sum); expr[i]='S'; for(j=i+t1+t2+4;j<=num;j++) expr[j-t1-t2-3]=expr[j]; num=num-t1-t2-3; break; case'A':sum1=0;sum2=0;t1=0;t2=0; for(k=i+2;expr[k]!=',';k++) { t1++; sum1=sum1*10+expr[k]-48;; } for(k=i+t1+3;expr[k]!=')';k++) { t2++; sum2=sum2*10+expr[k]-48; } temp=operA(sum1,sum2); if(temp>0&&temp<9) { expr[i]=temp+48; for(j=i+4+t1+t2;j<=num;j++) expr[j-t1-t2-3]=expr[j]; num=num-t1-t2-3; break; } if(temp>9&&temp<100) { deca=temp/10; expr[i]=deca+48; expr[i+1]=(temp-deca*10)+48; for(j=i+4+t1+t2;j<=num;j++) expr[j-t1-t2-2]=expr[j]; num=num-t1-t2-2; break; } if(temp>99&&temp<1000) { hund=temp/100; deca=temp/10%10; sing=temp%10; expr[i]=hund+48; expr[i+1]=deca+48; expr[i+2]=sing+48; for(j=i+4+t1+t2;j<=num;j++) expr[j-t1-t2-1]=expr[j]; num=num-t1-t2-1; break; } case'C':sum1=0;sum2=0;t1=0;t2=0; for(k=i+2;expr[k]!=',';k++) { t1++; expr[k]=expr[k]-48; sum1=sum1*10+expr[k]; } for(k=i+t1+3;expr[k]!=')';k++) { t2++; sum2=sum2*10+expr[k]-48; } temp=operC(sum1,sum2); if(temp>0&&temp<10) { expr[i]=temp+48; for(j=i+4+t1+t2;j<=num;j++) expr[j-t1-t2-3]=expr[j]; num=num-t1-t2-3; break; } if(temp>9&&temp<100) { deca=temp/10; expr[i]=deca+48; expr[i+1]=temp%10+48; for(j=i+4+t1+t2;j<=num;j++) expr[j-t1-t2-2]=expr[j]; num=num-t1-t2-2; break; } if(temp>99&&temp<1000) { hund=temp/100; deca=temp/10%10; sing=temp%10; expr[i]=hund+48; expr[i+1]=deca+48; expr[i+2]=sing+48; for(j=i+4+t1+t2;j<=num;j++) expr[j-t1-t2-1]=expr[j]; num=num-t1-t2-1; break; } case'^':sum1=0;sum2=0;t1=0;t2=0;temp=1; for(k=i-1;expr[k]>='0'&&expr[k]<='9';k--) { t1++; sum1=sum1+(expr[k]-48)*temp; temp=temp*10; } for(k=i+1;expr[k]>='0'&&expr[k]<='9';k++) { t2++; expr[k]=expr[k]-48; sum2=sum2*10+expr[k]; } temp=operX(sum1,sum2); if(temp>0&&temp<10) { expr[i-t1]=temp+48; for(j=i+t2+1;j<=num;j++) expr[j-t1-t2]=expr[j]; num=num-t1-t2; break; } if(temp>9&&temp<100) { deca=temp/10; expr[i-t1]=deca+48; expr[i-t1+1]=temp%10+48; for(j=i+1+t2;j<=num;j++) expr[j-t1-t2+1]=expr[j]; num=num-t1-t2+1; break; } if(temp>99&&temp<1000) { hund=temp/100; deca=temp/10%10; sing=temp%10; expr[i-t1]=hund+48; expr[i-t1+1]=deca+48; expr[i-t1+2]=sing+48; for(j=i+1+t2;j<=num;j++) expr[j-t1-t2+2]=expr[j]; num=num-t1-t2+2; break; } case'!':sum1=0;t1=0;temp=1; for(k=i-1;expr[k]>'0'&&expr[k]<'9';k--) { t1++; sum1=sum1+(expr[k]-48)*temp; temp=temp*10; } expr[i-t1]=operN(sum1)+48; for(j=i+1;j<=num;j++) expr[j-t1]=expr[j]; num=num-t1; break; default:break; } printf("部分求值后的表达式为:\n"); for(i=1;i<=num;i++) printf("%c",expr[i]); printf("\n"); turn(expr); }