廖文霖 廖文霖
关注数: 10 粉丝数: 61 发帖数: 2,084 关注贴吧数: 7
怎么简化这个程序,做成包含加减乘除括号的表达式计算? #include<stdio.h> #include<conio.h> #include<math.h> /*****************************************/ /* 将数字字符转化成浮点型实数进行计算 */ /* */ /*****************************************/ double readnum(char f[],int*i) { double x=0.0; int k=0; while(f[*i]>='0'&&f[*i]<='9') { x=x*10+(f[*i]-'0'); (*i)++; } if(f[*i]=='.') { (*i)++; while(f[*i]>='0'&&f[*i]<='9') { x=x*10+(f[*i]-'0'); (*i)++; k++; } } while(k-->0) { x=x/10.0; } return (x); } /*******************************/ /* 计算后缀表达式的值 */ /*******************************/ double evalpost(char f[]) { double obst[10]; int top=0; int i=0; double x1,x2; while(f[i]!='=') { if(f[i]>='0'&&f[i]<='9') {obst[top]=readnum(f,&i);top++;} else if(f[i]==' ') i++; else if(f[i]=='+') { x1=obst[--top]; x2=obst[--top]; obst[top]=x1+x2; i++; top++; } else if(f[i]=='-') { x1=obst[--top]; x2=obst[--top]; obst[top]=x2-x1; i++; top++; } else if(f[i]=='*') { x1=obst[--top]; x2=obst[--top]; obst[top]=x1*x2; i++; top++; } else if(f[i]=='*') { x1=obst[--top]; x2=obst[--top]; obst[top]=x1*x2; i++; top++; } else if(f[i]=='/') { x1=obst[--top]; x2=obst[--top]; obst[top]=x2/x1; i++; top++; } } return obst[0]; } /***********************************/ /* 判断字符是否为操作字符 */ /***********************************/ int is_operation(char op) { switch(op) { case'^': case'K': case'+': case'-': case'*': case'/': return 1; default: return 0; } } /*****************************/ /* 判断字符的优先级 */ /*****************************/ int priority(char op) { switch(op) { case'=': return -1; case'(': return 0; case'+': case'-': return 1; case'*': case'/': return 2; default: return -1; } } /******************************/ /* 中缀表达式转化成后缀表达式*/ /******************************/ void postfix(char e[],char f[]) { int i=0,j=0,k=0; char opst[100]; int top=0; opst[0]='=';top++; while(e[i]!='=') { if((e[i]>='0'&&e[i]<='9')||e[i]=='.') f[j++]=e[i]; else if(e[i]=='(') { opst[top]=e[i];top++;} else if(e[i]==')') { k=top-1; while(opst[k]!='(') {f[j++]=opst[--top];k=top-1;} top--; } else if(is_operation(e[i])) { f[j++]=' '; while(priority(opst[top-1])>=priority(e[i])) f[j++]=opst[--top]; opst[top]=e[i]; top++; } i++; } while(top) f[j++]=opst[--top];f[j]='\0'; } void print_1() { printf("|_______________________________________ | \n"); printf("|| | | \n"); printf("|| 欢迎使用多功能计算器 | | 本计算器能够进行 \n"); printf("||_____________________________________| | +,-,×,÷,\n"); printf("|| 图案仅供参考 | | () \n"); printf("||_____________________________________| | \n"); printf("| 设计人: | \n"); printf("|___ ___ ___ ___ ___ ___ ___ ___ | \n"); printf("|________ ________ ________ ________ | \n"); printf("|| ⑨ | | ⑧ | | ⑦ | | × | | \n"); printf("||______| |______| |______| |______| | \n"); printf("|________ ________ ________ ________ | \n"); printf("|| ⑥ | | ⑤ | | ④ | | - | | \n"); printf("||______| |______| |______| |______| | \n"); printf("| _______ ________ ________ ________ | \n"); printf("|| ③ | | ② | | ① | | + | | \n"); printf("||______| |______| |______| |______| | \n"); printf("|________ ________ ________ ________ | \n"); printf("|| 〇 | | = | | AC | | ÷ | | \n"); printf("||______| |______| |______| |______| | \n"); getch(); system("cls"); } void printf_2() {system("cls"); printf("\n\n\n\n\n\n\n\n\t\t\t ##############################\n"); printf("\t\t\t # #\n"); printf("\t\t\t #----------谢谢使用----------#\n"); printf("\t\t\t # #\n"); printf("\t\t\t ##############################\n"); printf("\t\t\t --制作\n "); } /****************/ /* 转化 */ /****************/ void zhuanhuan(char g[],char e[]) { int k,i,j=0; for(i=0;g[i]!='=';i++) { k=i+1; if(g[i]=='('&&g[k]=='-') { e[j++]=g[i]; e[j++]='0'; } else e[j++]=g[i]; } e[j]='='; } int main() { int wei; char e[100],f[100],g[100]; int sign;int flag; print_1(); do { printf("输入所要经计算的表达式(如:a*b/(c-d)=):\n"); scanf("%s",g); zhuanhuan(g,e); postfix(e,f); printf("输出保留几位小数:\n"); scanf("%d",&wei); printf("%.*lf\n",wei,evalpost(f)); while(1) { flag=3 ; printf("继续计算/退出?1/0?"); sign=getch(); printf("%c\n",sign); switch(sign) { case '1':flag=1;getch();break; case '0':flag=0;getch();break; default: printf("非法输入,请重新输入:\n"); } if(flag==1||flag==0)break; } }while(flag==1); printf_2(); return 0; }
刚才接到班主任兼数学老师打来的电话,然后就悲剧了!!!! 电话内容如下: 悲剧的我:娄老师?。。。(胆怯的) 老湿:嗯,你数学考了多少分呀?!!!(严厉的) 悲剧的我:不。。。不知道。。。 老湿:你估的分呢?!!! 悲剧的我:没。。。没估分。。。 老湿:怎么?不敢估?!!! 悲剧的我:嗯。。嗯。。。我及格没呀?。。。 老湿:你的要求就这么低?!!!(暴跳如雷的) 悲剧的我:。。。。。 老湿:要不要我告诉你分数呀?(阴险狡诈的) 悲剧的我:嗯。。。嗯。。。好吧。。。(忐忑的) 老湿:128!!!(生气的) 悲剧的我:(意外的)啊?!!!【画外音——尼玛,我怎么可能考这么高?但是转念一想,还是问一下最高分吧!】 (胆怯的)那全班最高分??。。。 老湿:129!!! 悲剧的我:(懊恼的)啊!!!要不是那个5分的填空题我就全班第一啦!!!【画外音——那个填空题实在简单,我都算出来了,比大小的时候比错了。真是有种想拍死自己的冲动】 老湿:(狂躁的)你就知道那5分!!!倒数第二题13分!!!你妹的一分都没拿到有木有啊!!!那么简单的题!!!你要是拿到满分就141了有木有啊!!!你妹的画图题你画的太难看了被扣了2分有木有啊!!!最后一题偷懒不写过程摆个答案有毛线用啊!!!又扣了两分有木有啊!!!再加上5分的填空题尼玛就满分了有木有啊!!!我们班这次没有一个人上130!!!你说你要是考了满分我们班就超过二班了有木有!!!你说你哪一分是应该丢的!!!全都会做还不能得满分啊!!!你个不中用的2货!!!气死老娘了!!!【画外音——好吧,这一段被我黑化了。。和原话意思一样,语气更强,突出可怜的我的悲剧色彩】 悲剧的我:。。。。。。(弱弱的)128和130也没差多少嘛。。。 老湿:别以为你这回分数还行就了不起了,我明天要在班上狠狠地批评你!!!你先给我面壁思过去!!!好,就说到这里!!! 悲剧的我:。。。。。(哭丧着脸)老湿拜拜 哎,可怜的我没日没夜的写数学,不管是语文英语还是理化生,所有课的时间都牺牲了让给数学,这次好不容易考了全班第二还被骂的这么惨,想死的心都有了啊!!!
1 下一页