(有错误滴滴我!
【问题描述】
编写一个帮助小学生练习数学的程序,帮助小学生练习 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