四则运算改进版
Posted 自由jay
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了四则运算改进版相关的知识,希望对你有一定的参考价值。
需求分析:
随机生成四则运算公式,包括括号并能对题目进行回答,在对所答题目进行判断对错,如果答错了显示正确答案。
代码设计:
后缀表达式:
void houzhuibds(char str[100])//后缀表达式 { stack<char>s1; stack<Number>s2; int i=0,j=0; for(i=0;str[i]!=‘\0‘;i++) { if(str[i]>=‘0‘&&str[i]<=‘9‘) { Number num; num.a=0; num.b=0; while(str[i]<=‘9‘&&str[i]>=‘0‘) num.a=(str[i++]-‘0‘)+num.a*10; s2.push(num); i--; } else { if(str[i]==‘)‘) { while(s1.top()!=‘(‘) { Number num; num.b=1; num.a=s1.top(); s2.push(num); s1.pop(); } s1.pop(); } else if(s1.empty()||s1.top()==‘(‘||str[i]==‘(‘) { s1.push(str[i]); } else { if((str[i]==‘*‘||str[i]==‘/‘)&&(s1.top()==‘+‘||s1.top()==‘-‘)) s1.push(str[i]); else { Number num; num.b=1; num.a=s1.top(); s2.push(num); s1.pop(); i--; } } } } while(!s1.empty()) { Number num; num.b=1; num.a=s1.top(); s2.push(num); s1.pop(); } while(!s2.empty()) { s3.push(s2.top()); s2.pop(); } }
求值运算:
double qiuzhi() { stack<double>s4; while(!s3.empty()) { Number c1=s3.top(); s3.pop(); if(c1.b==0) s4.push(c1.a); else { double c2=s4.top(); s4.pop(); double c3=s4.top(); s4.pop(); double c4; switch((int)c1.a) { case ‘+‘:c4=c3+c2;break; case ‘-‘:c4=c3-c2;break; case ‘*‘:c4=c3*c2;break; case ‘/‘:c4=c3/c2;break; } s4.push(c4); } } return s4.top(); }
判定数字后元素:
void aftersz(char str[100],int t,int n)//数字后面是+-/*(0-4) 右括号(5-9) { int i=rand()%10; if(i<=4) { int j=rand()%4; switch(j) { case 0:str[t]=‘+‘;break; case 1:str[t]=‘-‘;break; case 2:str[t]=‘*‘;break; case 3:str[t]=‘/‘;break; } afterfh(str,++t,n); } else//右括号 { if(y>0&&(str[t-2]!=‘(‘||str[t-3]!=‘(‘&&(str[t-2]<=‘0‘&&str[t-2]>=‘9‘))) { str[t]=‘)‘; y--; aftersz(str,++t,n); } else aftersz(str,t,n); } }
判定符号后元素:
void afterfh(char str[100],int t,int n)//+-*/之后 { int p=rand()%10; if(p>=3)//数字 { int num=rand()%100; if(num>=10) { int a=num%10; str[t++]=num/10+‘0‘; str[t]=a+‘0‘; } else str[t]=‘0‘+num; n++; if(n==4) { str[++t]=‘\0‘; return ; } aftersz(str,++t,n); } else//左括号 { str[t]=‘(‘; y++; afterfh(str,++t,n); } }
主函数:
int main() { char str[100]; int s=0; for(int i=0;i<20;i++) { int t=0; int n=0; afterfh(str,t,n); int len=strlen(str); while(y) { if(str[len-2]==‘(‘) { str[len-2]=str[len-1]; len--; } else if(str[len-3]==‘(‘) { str[len-3]=str[len-2]; str[len-2]=str[len-1]; len--; } else str[len++]=‘)‘; y--; } str[len]=‘\0‘; houzhuibds(str); double ans=qiuzhi(); for(int i=0;str[i]!=‘\0‘;i++) printf("%c",str[i]); printf("=\n?"); double s; scanf("%lf",&s); if(abs(s-ans)<0.01) { s++; printf("答对了,你真是天才\n"); } else printf("再想想吧,答案似乎是%.2lf喔!\n",ans); } printf("你一共答对%d道题,共20道题。\n",s); return 0; }
运行结果:
ssh:[email protected]:ziyoujay/sizeyunsuan1.git
以上是关于四则运算改进版的主要内容,如果未能解决你的问题,请参考以下文章