| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 571 人关注过本帖
标题:这是咋回事呢???
只看楼主 加入收藏
dimyself
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2004-10-18
收藏
 问题点数:0 回复次数:1 
这是咋回事呢???

偶写了个计算器程序,出了点问题,请大家看一下!

主要是看最后面的那几句,当我输入A(5,1)时,(即是求5的1阶排列:5*1)

能得到后缀表达式5 #(数字之间用空格隔开),但输入A(5,2)或是A(5,3)..时,能得到部分求值后的表达式,即是20#,60#..但不能得到后缀表达式! 死了!

输入的是A(4,*)时,就全部都可以!像A(*,1)的也可以,其他的就不行了!!!

搞不懂???

请大家帮忙看一下!

谢了!

2004-10-31 22:24
dimyself
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2004-10-18
收藏
得分:0 

.......

对不起!忘了把程序放上去啦!

下面是程序的一部分:

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); }

2004-10-31 22:25
快速回复:这是咋回事呢???
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016811 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved