2023年9月27号

今天将该任务完全完成了,其代码如下。

工具类:

复制代码
import java.io.*;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class tools {
    public static void menu(int a,int b){
        System.out.println("*****四则运算练习*****");
        System.out.println("***1.二年级四则运算***");
        System.out.println("***2.三年级四则运算***");
        System.out.println("***3.四年级四则运算***");
        System.out.println("***4.退出系统********");
        System.out.println("*******************");
        int tclass=tools.getTextClass();//年级(1代表二年级,渐增)
        switch (tclass) {
            case 1:
                Two two = new Two();
                two.OpenText(a,b);
                break;
            case 2:
                Three three = new Three();
                three.OpenText(a,b);
                break;
            case 3:
                Four four = new Four();
                four.OpenText(a,b);
                break;
            case 4:
                System.out.println("期待下次见面!");
                break;
        }
    }
    public static char getOperator(){
        char operator = 0;
        Random ran = new Random();
        int i = ran.nextInt(4);
        switch(i){
            case 0:
                operator = '+';
                break;
            case 1:
                operator = '-';
                break;
            case 2:
                operator = '*';
                break;
            case 3:
                operator = '/';
                break;
        }
        return operator;
    }//获得运算符
    public static int getNumber(int max){
        int number = 0;
        Random ran = new Random();
        number = ran.nextInt(max+1);
        return number;
    }//获得随机数

    //根据运算符个数随机得到子节点个数
    public static boolean[] getChildPlace(int num){
        int d = 0;
        int size = 0, j=1;
        while(num >= (int)Math.pow(2, j)){
            j++;
        }
        d = (int)Math.pow(2, j) - 1 - num;
        size = (int)Math.pow(2, j-1);
        boolean[] k = new boolean[size];
        for(int i = 0; i < size; i++){
            k[i] = true;
        }
        for(int i = 0; i < d; i++){
            Random ran = new Random();
            int f = ran.nextInt(size);
            while(k[f] == false)
            {
                f = ran.nextInt(size);
            }
            k[f] = false;
        }
        return k;
    }
    public static int getTextClass(){
        Scanner sc=new Scanner(System.in);
        System.out.print("请选择:");
        int num= sc.nextInt();
        return num;
    }//选择年级
    public static int judgeTextdanger(){
        Scanner sc=new Scanner(System.in);
        System.out.print("请选择是否带乘除(1.是 2.否):");
        int tb=sc.nextInt();
        return tb;
    }//判断是否带乘除
    public static int judgeTextKuo(){
        Scanner sc=new Scanner(System.in);
        System.out.print("请选择是否带括号(1.是 2.否):");
        int tb=sc.nextInt();
        return tb;
    }//判断是否带括号(四年级)
    public static int getTextNum(){
        Scanner sc=new Scanner(System.in);
        System.out.print("请输入做题数量:");
        int num= sc.nextInt();
        return num;
    }//获得做题数量
    public static int getTextMax(int k){//k为几年级
        Scanner sc=new Scanner(System.in);
        if(k==2)
            System.out.print("请选择数值范围(1-100):");
        else if(k==3)
            System.out.print("请选择数值范围(1-1000):");
        else System.out.print("请选择数值范围(1-1000):");
        int tb=sc.nextInt();
        return tb;
    }//获得操作数范围
    public static int getTextOperator(int k){//k为年级,3/4
        Scanner sc=new Scanner(System.in);
        if(k==3)
            System.out.print("请选择操作数(2-4):");
        else
            System.out.print("请选择操作数(2-5):");
        int tb=sc.nextInt();
        return tb;
    }//获得操作数的数量
    public static void output(int n,int num){
        double ret=n*100/num;
        System.out.println("错题数:"+(num-n));
        System.out.println("正确率:"+ret+"%");
    }

    //存入文件操作
    public static void outputText(int i,String s,int k){
        //写入文件操作
        File file1=new File("src\\练习册.txt");//在该类的位置创建一个新文件
        File file2=new File("src\\错题本.txt");//在该类的位置创建一个新文件
        FileWriter f=null;//创建文件写入对象
        BufferedWriter f1=null;//创建字符流写入对象
        try {
            //这里把文件写入对象和字符流写入对象分开写了
            if(k==0) {
                if (i == 0) {
                    f = new FileWriter("src\\练习册.txt");
                } else {
                    f = new FileWriter("src\\练习册.txt", true);//创建一个名为练习册.txt的文件
                }
                f1 = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file1, true)));
                //通过循环遍历上面的String 数组中的元素
                f.write(s + " ");
                if (i % 3 == 0) {
                    f1.newLine();
                }
            }else{
                f = new FileWriter("src\\错题本.txt", true);//创建一个名为错题本.txt的文件
                f1 = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file2, true)));
                //通过循环遍历上面的String 数组中的元素
                f.write(s+" ");
                f1.newLine();
            }
        } catch (Exception e) {
            // TODO: handle exception
        }finally {//如果没有catch 异常,程序最终会执行到这里
            try {
                f1.close();
                f.close();//关闭文件
            } catch (Exception e2) {
                // TODO: handle exception
            }
        }
    }

    //读取文件操作
    public static void inputText(ArrayList<String> problem,ArrayList<String> result,int a,int b){
        ArrayList<String> results=new ArrayList<String>();
        String filePath = "src\\练习册.txt";
        FileInputStream fin=null;
        String strTmp = "";
        System.out.println("答题情况如下:");
        try {
            fin = new FileInputStream(filePath);
            InputStreamReader reader = new InputStreamReader(fin);
            BufferedReader buffReader = new BufferedReader(reader);
            while ((strTmp = buffReader.readLine()) != null) {
                System.out.println(strTmp);
                results.add(strTmp);
            }
            buffReader.close();
        }
        catch (Exception e) {
            // TODO: handle exception
        }
        int x=0,y=0;
        String ts="";
        boolean flsh=false;
        for(int j=0;j<results.size();j++){
            char t[]=results.get(j).toCharArray();
            for(int k=0;k<t.length;k++){
                if(t[k]=='='){
                    flsh=true;
                } else if (t[k]==' ') {
                    flsh=false;
                    if(!ts.equals(result.get(x))){
                        y++;
                        tools.outputText(0,problem.get(x),1);
                    }
                    ts="";
                    x++;
                }else if(flsh){
                    ts+=t[k];
                }
            }
        }
        double rat=(double)(result.size()+a-y-b)/(result.size()+a);
        tools.outputText(0,"今日正答率:"+(rat*100)+"%",1);
        Displayerror(result.size()+a,y+b);
    }

    //判断是否完成题目
    public static int judgeFinish(){
        Scanner sc=new Scanner(System.in);
        System.out.print("是否在文件内完成题目(1.是/2.否):");
        int k=sc.nextInt();
        return k;
    }
    //还未写/////////
    public static void Displayerror(int a,int b){
        Scanner sc=new Scanner(System.in);
        System.out.println("错题已存入错题本,请选择是否进行下一套试题(1.是/2.否):");
        int k=sc.nextInt();
        if(k==1){
            tools.menu(a,b);
        }else{
            System.out.println("期待下次见面!");
        }
    }//查看错题本(显示正答率和错题,并选择是否对错题二次答题)
}
复制代码

主函数:

import java.util.ArrayList;
public class Main {
    public static void main(String[] args) {
        tools.menu(0,0);
    }
}

二,三,四年级:

复制代码
import java.io.*;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;


public class Two {
    //题目
    ArrayList<String> problem=new ArrayList<String>();
    //正确答案
    ArrayList<String> results=new ArrayList<String>();
    public void OpenText(int a,int b) {
        Random ra = new Random();
        Scanner sc=new Scanner(System.in);
        int textnum=tools.getTextNum();//题目数量
        int maxnum=tools.getTextMax(2);
        boolean jud1=true;//是否带乘除
        if(tools.judgeTextdanger()==1) jud1=true;
        else jud1=false;
        int n=0,num=0;//n为符合运算法则的式子,num为作对的题目数
        doTree dTree;
        for(int i = 0; i < textnum; i++) {
            dTree = new doTree(1);
            dTree.CreateTree(maxnum);
            String result = dTree.TestProblem();
            results.add(result);
            System.out.println(dTree.toString() + "=");
            String s=dTree.toString() + "=";
            problem.add(s);
            //写入文件操作
            tools.outputText(i,s,0);
        }
        int bool=tools.judgeFinish();
        if(bool==1) {
            //读取文件操作
            tools.inputText(problem,results,a,b);
        }
        //tools.output(maxnum,num);
    }
}
复制代码
复制代码
import java.util.ArrayList;
import java.util.Random;

import java.util.Scanner; public class Three { //题目 ArrayList<String> problem=new ArrayList<String>(); //正确答案 ArrayList<String> results=new ArrayList<String>(); //用户输入答案 ArrayList<String> results2=new ArrayList<String>(); public void OpenText(int a,int b){ Random ra = new Random(); Scanner sc=new Scanner(System.in); int textnum=tools.getTextNum();//题目数量 int opernum=tools.getTextOperator(3);//获得操作数数量 int maxnum=tools.getTextMax(3);//获得最大范围 boolean jud1=true;//是否带乘除 if(tools.judgeTextdanger()==1) jud1=true; else jud1=false; int n=0,num=0;//n为符合运算法则的式子,num为作对的题目数 doTree dTree; for(int i = 0; i < textnum; i++) { dTree = new doTree(opernum-1); dTree.CreateTree(maxnum); String result = dTree.TestProblem(); results.add(result); System.out.println(dTree.toString() + "="); String s=dTree.toString() + "="; problem.add(s); //写入文件操作 tools.outputText(i,s,0); } //读取文件操作 int bool=tools.judgeFinish(); if(bool==1) { //读取文件操作 tools.inputText(problem,results,a,b); } //tools.output(maxnum,num); } }
复制代码
复制代码
import java.io.*;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;


public class Four {
    //题目
    ArrayList<String> problem=new ArrayList<String>();
    //正确答案
    ArrayList<String> results=new ArrayList<String>();
    public void OpenText(int a,int b){
        Random ra = new Random();
        Scanner sc=new Scanner(System.in);
        int textnum=tools.getTextNum();//题目数量
        int opernum=tools.getTextOperator(4);//获得操作数数量
        int maxnum=tools.getTextMax(4);//获得最大范围
        boolean jud1=true;//是否带乘除
        if(tools.judgeTextdanger()==1) jud1=true;
        else jud1=false;
        int n=0,num=0;//n为符合运算法则的式子,num为作对的题目数
        doTree dTree;
        for(int i = 0; i < textnum; i++) {
            dTree = new doTree(opernum-1);
            dTree.CreateTree(maxnum);
            String result = dTree.TestProblem();
            results.add(result);
            System.out.println(dTree.toString() + "=");
            String s=dTree.toString() + "=";
            problem.add(s);
            //写入文件操作
            tools.outputText(i,s,0);
        }
        //读取文件操作
        int bool=tools.judgeFinish();
        if(bool==1) {
            //读取文件操作
            tools.inputText(problem,results,a,b);
        }
        //tools.output(maxnum,num);
    }
}
复制代码

 

posted @   贾贾鱼  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示