需求分析:
为小学生能够出四则运算的题,并且能对其所答的答案进行判断,如答错能显示正确答案。
代码设计:
生成随机数和运算符:
int convert(ZX number[100]) { stack<ZX>s2; for(int i=0;i<t;i++) { if(number[i].b==1)//操作数 s2.push(number[i]); else { if(number[i].a==‘)‘) { while(s1.top().a!=‘(‘) { s2.push(s1.top()); s1.pop(); } s1.pop(); } else if(s1.empty()||s1.top().a==‘(‘||number[i].a==‘(‘) s1.push(number[i]); else { if(number[i].b==0&&(number[i].a==‘*‘||number[i].a==‘/‘)&&(s1.top().a==‘+‘||s1.top().a==‘-‘)) s1.push(number[i]); else { s2.push(s1.top()); s1.pop(); i--; } } } } while(!s1.empty()) { s2.push(s1.top()); s1.pop(); } while(!s2.empty()) { ZX s=s2.top(); s2.pop(); s1.push(s); } ZX c1; int c2,c3,c4; stack<int>s3; while(!s1.empty()) { c1=s1.top(); s1.pop(); if(c1.b==1) s3.push(c1.a); else { c2=s3.top(); s3.pop(); c3=s3.top(); s3.pop(); switch(c1.a) { case ‘+‘:c4=c3+c2;break; case ‘-‘:c4=c3-c2;break; case ‘*‘:c4=c3*c2;break; case ‘/‘:c4=c3/c2;break; } s3.push(c4); } } return s3.top(); }
判断数字或括号前后面所跟的参数:
void passkh(ZX number[100])//去括号 { for(int i=1;i<t-1;i++) { number[i-1].a=number[i].a; number[i-1].b=number[i].b; } t-=2; } void aftersz(ZX number[100])//数字后跟什么 { int i=rand()%10; if(i<=2) { int j=rand()%4; switch(j) { case 0:number[t].a=‘+‘;break; case 1:number[t].a=‘-‘;break; case 2:number[t].a=‘*‘;break; case 3:number[t].a=‘/‘;break; } number[t].b=0; t++; afterfh(number); } else if(i>=3&&i<=6) { if(n1==1) { aftersz(number); } else return ; } else//右括号 { if(n>0&&number[t-2].a!=‘(‘&&number[t-2].b!=0) { number[t].b=0; number[t].a=‘)‘; n--; t++; aftersz(number); } else aftersz(number); } } void afterfh(ZX number[100])//括号后跟什么 { int p=rand()%10; if(p>=3)//数字 { number[t].b=1; number[t].a=rand()%100; t++; n1++; aftersz(number); } else//左括号 { number[t].b=0; number[t].a=‘(‘; n++; t++; afterfh(number); } }
随机生成四则运算试子并让学生进行答题并判断,如果答错显示正确答案。
int main() { printf("下面是数学题请同学进行答题:\n"); printf("\n"); /*随机生成一个四则运算(100以内) 第一位 左括号(0-2) 数字(3-9) 数字后面是+-/*(0-2) 什么都没有(3-6) 右括号(7-9) 右括号后面 +-/*(0-2) 什么都没有(3-6) 右括号(7-9) +-/*后面 左括号(0-2) 数字(3-9) 左括号后面 左括号(0-2) 数字(3-9) */ while(1) { n1=0,n=0; ZX number[100]; t=0; afterfh(number); while(n>0) { number[t].a=‘)‘; number[t++].b=0; n--; } while(number[0].a==‘(‘&&number[0].b==0&&number[t-1].b==0&&number[t-1].a==‘)‘) passkh(number); while(number[t-3].a==‘(‘&&number[t-3].b==0) { number[t-3].a=number[t-2].a; number[t-3].b=number[t-2].b; t-=2; } for(int i=0;i<t;i++) { if(number[i].b==0) printf("%c",number[i].a); else printf("%d",number[i].a); } printf("\n"); printf("请作答:\n"); int p,q=convert(number); scanf("%d",&p); if(p==q) printf("回答正确\n\n"); else printf("回答错误 正确结果为:%d\n\n",q); } return 0; }
测试结果:
时间: 2024-10-15 18:50:59