Java实现小学数学练习系统

小学数学练习

1、问题描述

编写一个帮助小学生练习数学的程序,帮助小学生练习 100 以内的四种数学运算:加、减、乘、除。

2、要求

(1)程序应先询问用户的 ID 号(ID 号包括两个大写字母和 4 位数字),例如: 请输入用户 ID 号:AB1234,ID无误后方可进入菜单界面。

(2)对菜单的要求:必须有的功能有测试、检查历史成绩、检查答题情况、退出系统

(3)对题目的要求:学生将依次回答每一个问题(在等于号后面给出答案),然后给出下一道题。试题应包含四种数学运算:加、减、乘、除,它们是随机产生的。相邻的问题应该是不同的操作, 每个操作必须至少出现一次。每道题随机生成数字,必须确保参与运算的数字和结果都小于 100 且大于零的整数,除法时 还要注意两个整数要能整除。十道题做完后,记录学生完成这十道题所用的时间。

(4)对输出格式的要求:历史成绩包含id、分数、答题所用时间,例如AB1234 80 150 秒;检查答题情况包含问题、正确答案、使用者答案,格式如问题 | 正确答案 | 你的答案

3、对问题进行分析

首先分析对象,有学生和问题两个对象。再分析对象具有哪些属性,学生:id、分数、答题时间;问题:两个运算的数、运算符号、表达式、学生的答案、题目的正确答案。模块分析:在此我使用了四个类,学生类、问题类分别包含各自的字段、读写方法、覆写toString()方法;Dao类包含一些要使用的方法如判断id、生成10个相邻之间不相等的范围是0-3的数字、生成题目、学生参与测试、检查分数、打印历史成绩;Main类包含main()方法,实现菜单。

4、程序

首先学生类

public class Student {
    private String id;
    private int score;
    private long time;

    public Student() {
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public int getScore() {
        return score;
    }
    public void setScore(int score) {
        this.score = score;
    }
    public long getTime() {
        return time;
    }
    public void setTime(long time) {
        this.time = time;
    }
    //最终存入record文件的格式
    @Override
    public String toString() {
        return id+" "+score+" "+time+"秒";
    }
}

问题类

public class Problem {
    private int x;
    private int y;
    private int symbol;        //通过数字表示不同的运算符号
    private int result;
    private int studentResult;
    private String expression; //表达式的表现形式

    public Problem() {
    }
    public Problem(int x, int y, int symbol) {
        this.x = x;
        this.y = y;
        this.symbol = symbol;
    }

    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    public int getSymbol() {
        return symbol;
    }
    public void setSymbol(int symbol) {
        this.symbol = symbol;
    }
    public int getResult() {
        return result;
    }
    public void setResult(int result) {
        this.result = result;
    }
    public int getStudentResult() {
        return studentResult;
    }
    public void setStudentResult(int studentResult) {
        this.studentResult = studentResult;
    }
    public String getExpression() {
        return expression;
    }
    public void setExpression(String expression) {
        this.expression = expression;
    }
    //匹配方法,将不同的数字与不同的表达式相匹配
    public void matchSymbol(){
        switch (symbol){
            case 0:
                result = x+y;
                expression = x+"+"+y+"=";
                break;
            case 1:
                result = x-y;
                expression = x+"-"+y+"=";
                break;
            case 2:
                result = x*y;
                expression = x+"*"+y+"=";
                break;
            case 3:
                result = x/y;
                expression = x+"/"+y+"=";
                break;
            default:
                break;
        }
    }
    //检查分数的格式
    @Override
    public String toString() {
        return expression+"|"+result+"|"+studentResult;
    }
}

Dao类进行数据处理,主要的功能实现就在这里了

import java.io.*;
import java.util.Random;
import java.util.Scanner;

public class Dao {
    //判断id是否合理,正则表达式
    public boolean judge(String id){
        String str = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6}$";
        return id.matches(str);
    }
    //生成10个相邻之间不相等的范围是0-3的数字
    public int[] symbol(){
        Random random = new Random();
        int[] ints = new int[10];
        int a;
        for (int i = 0;i<10;i++){
            a = random.nextInt(4);
            ints[i] = a;
            //如果相邻的两个符号相同,循环进行回退
            if (i>0&&ints[i]==ints[i-1]){
                i--;
            }
        }
        return ints;
    }
    //生成题目
    public Problem[] createProblem(){
        Random rd = new Random();
        Problem[] problems = new Problem[10];
        int[] symbol = symbol();    //上方的生成10个数字的方法
        for (int i = 0;i<10;i++){
            int x = rd.nextInt(99)+1;
            int y = rd.nextInt(99)+1;
            //创建临时问题对象,满足要求后存入数组
            Problem temp = new Problem(x,y,symbol[i]);
            temp.matchSymbol();
            //如果是除法要保证两个整数能整除
            if (symbol[i]==3){
                if (x%y==0){
                    problems[i] = temp;
                }else {
                    i--;
                }
            }else {
                //结果必须保证在100以内
                if (temp.getResult()>0&&temp.getResult()<100){
                    problems[i] = temp;
                }else {
                    i--;
                }
            }
        }
        return problems;
    }
    public void test(Student s) throws IOException {
        long time1 = System.currentTimeMillis();
        int correctNum = 0;                    //设置累加变量来记录学生答对的题目数
        Scanner sc = new Scanner(System.in);
        Problem[] problems = createProblem();
        for (int i = 0;i<10;i++){
            System.out.print(problems[i].getExpression());
            problems[i].setStudentResult(sc.nextInt());
            if (problems[i].getResult()==problems[i].getStudentResult()){
                correctNum++;
            }
        }
        long time2 = System.currentTimeMillis();
        long time = (time2-time1)/1000;
        //输入用户信息
        s.setTime(time);
        s.setScore(correctNum*10);
        //将用户成绩写入文件record.txt
        FileWriter writer = new FileWriter("D:\\record.txt",true);//第二个参数是保证将内容写在文件末尾处,而不是覆盖原文件
        BufferedWriter bw = new BufferedWriter(writer);
        bw.write(s.toString());
        bw.write("\n");
        bw.flush();          //将缓冲区的内容写入
        //将题目信息写入文件problem
        FileWriter fileWriter = new FileWriter("D:\\problem.txt",true);
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
        bufferedWriter.write("\n");
        for (int i = 0;i<10;i++){
            bufferedWriter.write(problems[i].toString());
            bufferedWriter.newLine();
            bufferedWriter.flush();
        }
    }
    //检查分数
    public void check() throws IOException {
        FileReader reader = new FileReader("D:\\problem.txt");
        BufferedReader br = new BufferedReader(reader);
        StringBuffer buffer = new StringBuffer();
        if (br.ready()){
            String temp ;
            while ((temp= br.readLine())!=null){
                buffer.append(temp);
                buffer.append("\n");
            }
            System.out.println(buffer.toString());
        }else {
            System.out.println("还未有过记录");
        }
    }
    //打印历史成绩
    public void printAllData() throws IOException {
        FileReader reader = new FileReader("D:\\record.txt");
        BufferedReader bufferedReader = new BufferedReader(reader);
        StringBuffer buffer = new StringBuffer();
        if (bufferedReader.ready()){
            String temp;
            while ((temp=bufferedReader.readLine())!=null){
                buffer.append(temp);
                buffer.append("\n");
            }
            System.out.println(buffer.toString());
        }else {
            System.out.println("还未有记录");
        }
    }
}

最后进行测试

package Project11;

import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        Student student = new Student();//创建一个学生
        Dao dao = new Dao();            //创建Dao类对象来调用各种方法
        System.out.println("学生数学练习系统");
        System.out.println("请输入你的id");
        boolean flag = true;            //id的标志位
        boolean sign = true;            //菜单标志位
        while (flag){
            String id = sc.next();
            if (dao.judge(id)){
                student.setId(id);
                while (sign){
                    System.out.println("请选择使用的功能:1、2、3、4");
                    System.out.println("(1)开始测试");
                    System.out.println("(2)检查分数");//从文件problem.txt中检查
                    System.out.println("(3)历史成绩");
                    System.out.println("(4)退出");
                    int input = sc.nextInt();
                    switch (input){
                        case 1:
                            dao.test(student);
                            System.out.println("学生成绩:"+student.getScore());
                            break;
                        case 2:
                            System.out.println("问题|答案|正确答案");
                            dao.check();
                            break;
                        case 3:
                            dao.printAllData();
                            break;
                        case 4:
                            sign = false;
                            flag = false;
                            break;
                        default:
                            System.out.println("请输入正确的功能序号");
                            break;
                    }
                }
            }else {
                System.out.println("id有误");
                flag = false;
            }
        }
    }
}
  • 10
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值