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

这个Java程序设计了一个数学测试应用,用户输入ID后可以选择开始测试、查看分数或退出。测试包含10道随机生成的加减乘除数学题,确保结果在1到100之间且可整除。程序记录答题时间并根据正确率计算分数,最后将成绩和时间保存到文件record.txt中。用户可以查看自己的历史成绩记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【基本要求】
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”中列出该学生的所有历史成绩( 其他学生的不显示 )。
import java.io.*;
import java.util.*;
import java.util.regex.*;

public class MathTest {
	static List<Character> operate = new ArrayList<Character>(Arrays.asList(new Character[10]));
	static int[] a = new int[10];
	static int[] b = new int[10];
	static int[] ans = new int[10];
	static int[] correct = new int[10];
	static String PATH = "record.txt";
	
	public static void main(String[] args) {
		System.out.println("请输入用户ID号:");
		Scanner sc = new Scanner(System.in);
		String id = sc.next();
		Pattern p = Pattern.compile("^[A-Z]{2}[0-9]{4}$");//校验用户名是否合格
		Matcher m = p.matcher(id);
		while(!m.find()) {
			System.out.println("请输入正确的用户ID号:");
			id = sc.next();
			m = p.matcher(id);
		}
		int option = 3,score = 0;
		long time = 0;
		do {
			System.out.println("(1)开始测试\n(2)检查分数\n(3)退出");
			option = sc.nextInt();
			if(option == 1) {
				testpaperMaking(); // 准备试题
				time = test(); //开始答题,并记录答题时间
				printResult(); //答题结果格式化打印
				score = getScore(); //计算分数
				saveToFile(id,score,time); //保存在文件中
			}
			if(option == 2)
				pastRecords(id);//查看历史记录
		} while(option != 3);
	}
	//根据id查找历史记录
	public static void pastRecords(String 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)) {
	            	System.out.println(line);
	            }
	        }
	        fileInputStream.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void saveToFile(String id,int score,long time) {
		try {
			//第二个参数true表示以追加形式写文件
			FileWriter writer = new FileWriter("record.txt", true);
			String content = id + " " + score + " " + time + "秒\n";
			writer.write(content);  //将结果写入文件中
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	//打印答题结果
	public static void printResult() {
		Formatter f = new Formatter(System.out);
		//问题 | 正确答案 | 你的答案
		f.format("%-10s|%-4s|%-4s\n", "问题","正确答案","你的答案");
		for (int i = 0; i < operate.size(); i++) { //格式化输出结果
			f.format("%-12s| %4d | %4d\n", 
				a[i] + " " + operate.get(i).toString() + " " + b[i], correct[i], ans[i]);
		}
		
	}
	//计算分数
	public static int getScore() {
		int sum = 0;
		for (int i = 0; i < correct.length; i++) {
			if(correct[i] == ans[i])
				sum += 10;
		}
		return sum;
	}
	//答题
	public static long test() {
		long startTime = new Date().getTime();
		Scanner sc = new Scanner(System.in);
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i] +" "+ operate.get(i).toString() +" "+ b[i] + " = ");
			ans[i] = sc.nextInt();
			System.out.println();
		}
		long endTime = new Date().getTime();
		return (endTime - startTime) / 1000;
	}
	//答卷生成
	public static void testpaperMaking() {
		operation();
		for (int i = 0; i < operate.size(); i++) {
			if(operate.get(i).equals('+')) {
				a[i] = (int)(Math.random()*98)+1; //产生一个1到98的随机数
				b[i] = (int)(Math.random()*(99-a[i]))+1 ;// 产生一个1到99-a[i]的随机数
				correct[i] = a[i] + b[i];
			}
			if(operate.get(i).equals('-')) {
				a[i] = (int)(Math.random()*98)+2; //产生一个2到99的随机数
				b[i] = (int)(Math.random()*(a[i]-1))+1 ;// 产生一个1到a[i]-1的一个随机数
				correct[i] = a[i] - b[i];
			}
			if(operate.get(i).equals('*')) {
				int A = (int)(Math.random()*99) + 1; //产生一个1到99的随机数
				int B = (int)(Math.random()*99) + 1 ;// 产生一个1到99的一个随机数
				int dividend = A > B ? A : B;
				a[i]= A < B ? A : B;
				b[i] = dividend / a[i];
				correct[i] = a[i] * b[i];
			}
			if(operate.get(i).equals('/')) {
				int A = (int)(Math.random()*99) + 1; //产生一个1到99的随机数
				int B = (int)(Math.random()*99) + 1 ;// 产生一个1到99的一个随机数
				int dividend = A > B ? A : B; //大的做被除数
				b[i] = A < B ? A : B; // 小的做除数
				correct[i] = dividend / b[i];
				a[i] = b[i] * correct[i];
			}
		}
	}
	//生成运算符
	public static void operation() {
		for (int i = 0; i < 10; i++) {
			int flag = ((int)(Math.random()*100+1))%4;
			switch(flag) {
				case 0: operate.set(i, '+'); break;
				case 1: operate.set(i, '-'); break;
				case 2: operate.set(i, '*'); break;
				case 3: operate.set(i, '/'); break;
			}
			if(i > 0 && (operate.get(i) == operate.get(i-1))) {
				i--;
			}
		}
		Set<Character> set = new HashSet<Character>(operate);//将产生的运算符序列放入Set中
		if(set.size() < 4) {//小于4说明有运算符没有生成 重新生成一次
			operation();
		}
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值