定制小学运算题进阶版

图片名称

增加功能:可实现在线答题,全部完成后显示答题结果和正确率,错题;实现错题重练功能和记录错题次数功能(倒计时功能原本写了,但是找不到了,无伤大雅哈哈。。。。)
这已经不是一个普通的函数了,这是个大函数!我们普通人的思维已经顾及不了这么多方面,我们需要为自己减负!!

用民哥的话说是:复杂问题简单化,简单问题流程化。
用我的话说就是:函数分解。
另外,如果将函数分解后问题还是复杂————可以将功能多的类划分成不同的类,然后继承或者引入这个类中的函数,这样层级分明————是为大聪明。

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()+"次");
		}

	}

}


posted @ 2021-09-25 16:00  zhuangzhongxu  阅读(71)  评论(0编辑  收藏  举报