定制小学运算题进阶版
增加功能:可实现在线答题,全部完成后显示答题结果和正确率,错题;实现错题重练功能和记录错题次数功能(倒计时功能原本写了,但是找不到了,无伤大雅哈哈。。。。)
这已经不是一个普通的函数了,这是个大函数!我们普通人的思维已经顾及不了这么多方面,我们需要为自己减负!!
用民哥的话说是:复杂问题简单化,简单问题流程化。
用我的话说就是:函数分解。
另外,如果将函数分解后问题还是复杂————可以将功能多的类划分成不同的类,然后继承或者引入这个类中的函数,这样层级分明————是为大聪明。
import java.util.*;
public class Main{
static Scanner sc=new Scanner(System.in);
static HashMap<String,Integer> mp=new HashMap<String,Integer>();
static int input() {
System.out.println("请输入式子打印数量:");
int M=sc.nextInt();
while(M>100000) {
System.out.println("输入数量太大,请重新输入");
M=sc.nextInt();
}
return M;
}
static int input_num() {
System.out.println("请输入每个式子的参与运算的数的个数:");
int num=sc.nextInt();
return num;
}
static int input_op(int[] chs) {
System.out.println("请输入运算符数量(最少为1,上限为4)");
int chnum=sc.nextInt();
if(chnum==4) {
chs[0]=0;
chs[1]=1;
chs[2]=2;
chs[3]=3;
}
else {
System.out.println("请输入"+chnum+"个指定的运算符");
System.out.println("0代表+,1代表-,2代表*,3代表/");
for(int i=0;i<chnum;i++) chs[i]=sc.nextInt();
}
return chnum;
}
static int ask() {
System.out.println("是否加上括号?(1是,0否)");
int fl=sc.nextInt();
return fl;
}
static boolean ck(String[] ss,String s,int n) {
for(int i=0;i<n;i++) {
if(ss[i].equals(s)) return true;
}
return false;
}
static void create(String[] s,int M,int num,int chs[],int ops,int flag,String[] wr) {
int cnt=0,p=0;
int[] a=new int[10010];
while(cnt<M) {
String ss="";
int x=0;
int ch=-1;
for(int i=0;i<num;i++) {
if(i==0&&flag==1) ss+='(';
int xx=(int) (Math.random()*100);
ss+=""+xx;
if(i==0) x=xx;
else if(ch==0) x=x+xx;
else if(ch==1) x=x-xx;
else if(ch==2) x=x*xx;
else x=x/xx;
if(i==1&&flag==1) ss+=')';
if(i<num-1) {
ch=chs[(int)(Math.random()*ops)];
if(ch==0) {
ss+='+';
}
else if(ch==1) {
ss+='-';
}
else if(ch==2) {
ss+='*';
}
else {
ss+='/';
}
}
}
x=func(ss);
ss+='=';
if(ck(s,ss,cnt)==false) {
System.out.println(ss);
s[cnt++]=ss;
int res=sc.nextInt();
if(res!=x) {
a[p]=x;
wr[p++]=ss;
mp.put(wr[p-1],1);
}
}
}
System.out.println("错题率:"+(double)(p)/cnt);
System.out.println("错题重练?(1是,0否)");
int x=sc.nextInt();
if(x==1) {
rep(wr,p,a);
}
}
static void rep(String[] wr,int p,int[] res) {
int n=0;
for(int i=0;i<p;i++) {
System.out.println(wr[i]);
int x=sc.nextInt();
if(x!=res[i]) {
res[n]=res[i];
wr[n++]=wr[i];
mp.put(wr[i],mp.get(wr[i])+1);
}
}
System.out.println("错题率:"+(double)(n)/p);
System.out.println("错题重练?(1是,0否)");
int x=sc.nextInt();
if(x==1) {
rep(wr,n,res);
}
}
static int func(String string){
Stack<Character> ops=new Stack<Character>();
Stack<Integer> nums=new Stack<>();//自动检测
HashMap<Character,Integer> mp=new HashMap<>();
mp.put('+',1);
mp.put('-',1);
mp.put('*',2);
mp.put('/',2);
mp.put('(',-1);
char[] str=string.toCharArray();
StringBuilder sb=new StringBuilder();
for(int i=0;i<str.length;i++){
char c=str[i];
if(Character.isDigit(c)){
sb.append(c);
int j=i+1;
while(j<str.length&&Character.isDigit(str[j])){
sb.append(str[j]);
j++;
}
nums.push(Integer.parseInt(sb.toString()));
sb.delete(0,sb.length());
i=j-1;
}
else if(c=='(') ops.push(c);
else if(c==')'){
while(ops.peek()!='(') eval(ops,nums);
ops.pop();
}
else{
while(!ops.isEmpty()&&(mp.get(ops.peek())>=mp.get(c))) eval(ops,nums);
ops.push(c);
}
}
while(!ops.empty()) eval(ops,nums);
return nums.peek();
}
static void eval(Stack<Character> ops,Stack<Integer> nums){
int num1=nums.pop();
int num2=nums.pop();
char op=ops.pop();
if(op=='+') nums.push(num1+num2);
else if(op == '-') nums.push(num2-num1);
else if(op == '*') nums.push(num1*num2);
else nums.push(num2/num1);
}
public static void main(String[] args) {
//main函数相当于servlet,调用其他函数
//其他函数相当于Dao,提供接口
int M=input();
int num=input_num();
int chs[]=new int[4],ops=input_op(chs);
int flag=ask();
String s[]=new String[10010];
String wr[]=new String[10010];
create(s,M,num,chs,ops,flag,wr);
for(Map.Entry<String,Integer>entry:mp.entrySet()){
System.out.println(entry.getKey()+"?错了"+entry.getValue()+"次");
}
}
}