小学数学练习(JAVA)

(有错误滴滴我!

【问题描述】

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

【基本要求】

a) 程序应先询问用户的 ID 号(ID 号包括两个大写字母和 4 位数字),例如:

请输入用户 ID 号:AB1234

程序应对输入的 ID 号验证,符合 ID 号要求的格式,然后程序提示三种选择:

(1)开始测试

(2)检查分数

(3)退出

b) 测试:该程序将给出 10 道数学题,例如:

12 * 3 =36

48 + 32 =80

56 / 28 =2 注意:

i)学生将依次回答每一个问题(在等于号后面给出答案),然后给出下一道题。

ii)试题应包含四种数学运算:加、减、乘、除,它们是随机产生的。相邻的问题应该是不同的操作, 每个操作必须至少出现一次。报告中应给出实现方法或算法。

iii)为每道题随机生成数字,但必须确保参与运算的数字和结果都小于 100 且大于零的整数,除法时 还要注意两个整数要能整除。报告中应给出实现方法或算法。

iv)十道题做完后,记录学生完成这十道题所用的时间。

v)给每个学生一个分数。将该学生的 ID、成绩和使用时间保存到一个名为 record.txt 的文件中。 vi)在屏幕上输出以下信息:(3 列信息,第 1 列是 b)中的测试题,蓝色部分)

问题 | 正确答案 | 你的答案

c) 成绩检查:从文件“record.txt”中列出该学生的所有历史成绩(其他学生的不显示)。例如:

你以前的记录是:

AB1234 80 150 秒

AB1234 50 182 秒

AB1234 90 98 秒


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

public class code01 {

    static int[] a = new int[10];
    static String[] sign = new String[10];
    static int[] b = new int[10];
    static int[] right = new int[10];      //正确答案
    static int[] ans = new int[10];        //作答答案
    static String PATH = "D:/JAVA储存/ClassDesign-2021summer/record.txt";    //创建历史成绩文件夹;文件路径必须写全!!!
    static int n;


    public static void main(String[] args) {
        int score = 0;
        long time = 0;
        String ID;

        System.out.println("以下是帮助小学生练习数学的小游戏,游戏马上开始!");      //提示程序马上开始
        System.out.println("*************************");

        //验证ID 在是否正确
        String regex = "\\p{Upper}{2}\\d{4}";       //利用正则表达式判断输入ID是否符合要求
        boolean result;     //默认值false
        do {
            System.out.print("请输入您的ID号(ID 号包括两个大写字母和 4 位数字):");
            Scanner in = new Scanner(System.in);
            ID = in.next();
            result = ID.matches(regex);
            if (!result) {
                System.out.println("您的ID格式不符合要求,请重新输入!");
            }
        } while (!result);
        System.out.println("*************************");

        //进行三种选择
        int option = 3;
        do {
            System.out.println("您将有以下三种选择:");
            System.out.println("(1)开始测试;\n(2)检查分数;\n(3)退出;");
            Scanner choose = new Scanner(System.in);
            int choice = choose.nextInt();
            option = choice;
            switch (choice) {
                case 1: {
                    System.out.println("*************************");
                    System.out.println("测试开始:");
                    time = howTime();      //记录答题时间
                    printScore();       //计算所得分数
                    score = getScore(); //计算答题结果分数
                    saveToFile(ID, score, time); //保存在文件中
                    System.out.println("*************************");
                    break;

                }
                case 2: {
                    System.out.println("*************************");
                    pastRecords(ID);        //查看历史记录
                    System.out.println("*************************");
                    break;
                }
            }
        } while (option != 3);
        System.out.println("成功退出!");
        System.out.println("*************************");
    }


    //计算所用时间
    public static long howTime() {
        long start = System.currentTimeMillis();
        calculate();
        long time = (System.currentTimeMillis() - start) / 1000;     //最终所用时间:time,单位:ms-->s
        return time;
    }


    //第一种选择“运算”开始测试
    public static void calculate() {
         int temp = 5;
        for (int i = 0; i < 10; i++) {
            do {
                n = (int) (Math.random() * 2);     //产生随机运算符号,且相邻运算不相同,!!!区间问题[0,4)!!!
            } while (temp == n);
            temp = n;
            switch (n) {
                case 0: {
                    do {
                        a[i] = (int) (1 + Math.random() * 99) + 1;      //产生1~99的随机数
                        b[i] = (int) (1 + Math.random() * 99) + 1;
                    } while (a[i] + b[i] > 100);     //保证结果在100以内
                    String add = "+";
                    sign[i] = "+";
                    System.out.print(a[i] + add + b[i] + "=");
                    right[i] = a[i] + b[i];
                    break;
                }
                case 1: {
                    do {
                        a[i] = (int) (1 + Math.random() * 99) + 1;      //产生1~99的随机数
                        b[i] = (int) (1 + Math.random() * 99) + 1;
                    } while (a[i] - b[i] < 0);       //保证减法无负数
                    String sub = "-";
                    sign[i] = "-";
                    System.out.print(a[i] + sub + b[i] + "=");
                    right[i] = a[i] - b[i];
                    break;
                }
                case 2: {
                    do {
                        a[i] = (int) (1 + Math.random() * 99) + 1;      //产生1~99的随机数
                        b[i] = (int) (1 + Math.random() * 99) + 1;
                    } while (a[i] * b[i] > 100);     //乘积在100以内
                    String mul = "*";
                    sign[i] = "*";
                    System.out.print(a[i] + mul + b[i] + "=");
                    right[i] = a[i] * b[i];
                    break;
                }
                case 3: {
                    do {
                        a[i] = (int) (1 + Math.random() * 99) + 1;      //产生1~99的随机数
                        b[i] = (int) (1 + Math.random() * 99) + 1;
                    } while (a[i] % b[i] != 0);       //保证两个数能整除
                    String div = "/";
                    sign[i] = "/";
                    System.out.print(a[i] + div + b[i] + "=");
                    right[i] = a[i] / b[i];
                    break;
                }
            }
            Scanner x1 = new Scanner(System.in);
            ans[i] = x1.nextInt();
        }
    }


    //计算分数
    public static int getScore() {
        int score = 0;
        for (int i = 0; i < 10; i++) {
            if (right[i] == ans[i])
                score += 10;
        }
        return score;
    }

    //输出分数
    public static void printScore() {
        System.out.println("*************************");
        System.out.println("以下是你本次的答题情况:");
        //问题 | 正确答案 | 你的答案
        System.out.format("%-10s|%-4s|%-4s\n", "问题", "正确答案", "你的答案");       //s:String  -:左对齐输出
        for (int i = 0; i < 10; i++) {                   //格式化输出结果...."%"表示进行格式化输出,其后是格式的定义
            System.out.format("%-12s| %4d | %4d\n", a[i] + " " + sign[i] + " " + b[i], right[i], ans[i]);
        }
    }


    //写入成绩
    public static void saveToFile(String ID, int score, long time) {

        try {
            //第二个参数true表示以追加形式写文件
            FileWriter writer = new FileWriter("D:/JAVA储存/ClassDesign-2021summer/record.txt", true);
            String content = ID + "   " + score + "   " + time + "秒\n";
            writer.write(content);  //将结果写入文件中
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //第二种选择”检查分数“
    //根据ID查找历史记录
    public static void pastRecords(String ID){
       // System.out.println(ID);
        try {
            FileInputStream fileInputStream = new FileInputStream(PATH);        //文件路径
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));     //读取文件
            String line = null;
            System.out.println("你以前的记录是:");
            while ((line = bufferedReader.readLine()) != null) {
                if(line.contains(ID)) {     //contains匹配:只要包含有该ID,就执行输出
                    System.out.println(line);
                    //System.out.println("yes");      //验证
                }
                //System.out.println("no");       //验证
            }
            fileInputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

       

小总结:

其实仔细想想这个是不难的,就是可以把整个大的分成小代码去解决,不会就查书,比如我的正则表达式就是查书(当时也没好好学,还准备一个一个验证来着,太丢人了。

里面的缺点是不能确定+-*/在一次答题循环全部出现,但是绝对没有相邻算法一样的┗|`O′|┛ 嗷~~

这个其实可以在开头就写一个+-*/一次循环蒙混一下啦

然后后,后面有注释(怕自己看不懂OvO

~~~~~极其罕见,我居然打开电脑写了这个东西额.....nOvOn

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值