第三次作业

姓名 学号
申珊 3223004342
这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/homework/13326
这个作业的目标 学习合作完成项目

PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 预估耗时(分钟)
Planning 计划 90 100
· Estimate · 估计这个任务需要多少时间 60 120
Development 开发 120 160
· Analysis · 需求分析 (包括学习新技术) 79 60
· Design Spec · 生成设计文档 40 80
· Design Review · 设计复审 20 30
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 60 60
· Design · 具体设计 100 130
· Coding · 具体编码 80 60
· Code Review · 代码复审 90 60
· Test · 测试(自我测试,修改代码,提交修改) 90 110
Reporting 报告 20 40
· Test Repor · 测试报告 60 40
· Size Measurement · 计算工作量 20 30
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 60 80
· 合计

设计思路:

  1. 参数输入
    程序需要通过命令行参数接收 n(生成题目的数量)和 -r(控制数值范围)。n 用于指定生成的题目数量,-r 用于指定题目中数值的最大范围。
    如果没有提供 -r 参数,程序需要报错并显示帮助信息。
  2. 生成题目表达式
    生成四则运算题目时,需要考虑:
    数值范围:生成的数值范围要根据 -r 参数进行设置,确保题目中的数值符合要求。
    自然数与真分数:
    自然数范围是从 1 开始。
    真分数是类似 1/2, 2/3, 3/4 等。
    运算符:题目中的运算符为 +, -, *, ÷。
    括号:题目可以包含括号,但不能包含负数结果。
    生成数学表达式时,运算符的个数不能超过 3 个。需要通过生成两个操作数并加入一个运算符来构造基本的四则运算表达式。然后,使用递归或循环构造更多的表达式。
  3. 确保没有负数结果
    在生成题目的过程中,要确保每个子表达式的计算结果为正数。特别是:
    减法:生成题目时,要避免生成类似 a - b 这样的表达式,其中 a < b,因为这样会得到负数结果。
    除法:除法的分母不能为 0,并且要避免生成类似 a / b 结果为负数的情况。
    确保每次生成的运算符组合不会导致不合法的负数结果。
  4. 处理真分数
    在题目中,部分加法和除法的结果会是真分数。比如 2 + 1/2 需要得到 5/2。
    需要特别注意加法和除法的结果,确保它们可以转化为真分数而不是负数。
  5. 生成不重复的题目
    题目不能通过简单交换操作(比如交换加法和乘法两边的数字)生成重复题目。需要利用集合(Set)来确保生成的题目是唯一的。
    比如 23 + 45 = 和 45 + 23 = 视为重复题目,所以在生成题目时,可以规范化题目的顺序,确保不会因为交换而产生重复。
    对于包含括号的题目,可以在生成表达式时考虑运算符的优先级,避免表达式等价于其他形式。
  6. 输出题目与答案
    题目和答案应分别存储在 Exercises.txt 和 Answers.txt 文件中。
    在保存题目时,题目格式为 e =,其中 e 为算术表达式。
    在保存答案时,答案格式为 e = 答案,计算结果为整数或者真分数。
  7. 检查用户答案
    读取 Exercises.txt 和 Answers.txt 文件,按顺序将题目和答案存储到内存中。
    然后,逐一询问用户每道题目的答案,与文件中的答案进行对比,统计正确和错误的题目编号。
  8. 核心算法与逻辑
    需要生成合法的数学表达式,并且确保运算符和操作数数量符合题目要求。
    使用递归或者循环生成多个操作数和运算符组合。对于每个表达式进行合法性验证(如避免负数结果,确保分母不为0,确保加法结果为真分数等)。
    使用 Set 来存储唯一的题目,避免重复。
    代码结构:
    输入参数:处理命令行参数 n 和 -r,确保输入合法。
    题目生成:根据输入的范围和题目数量生成题目。
    保存题目和答案:将生成的题目和答案分别写入两个文件。
    检查答案:从文件中读取题目和答案,交给用户逐题回答并判断正确性。
    结果保存:
    Exercises.txt 中保存题目。
    Answers.txt 中保存答案。
    关键函数设计:
    generateNumber(int rangeMax):生成一个在 1 到 rangeMax-1 范围内的随机自然数。
    generateExpression(int rangeMax):生成一个合法的四则运算表达式,运算符的个数不超过 3。
    generateUniqueExpressions(int n, int rangeMax):生成 n 个唯一的数学题目,确保没有重复。
    evaluateExpression(String expression):计算表达式的值,支持加法、减法、乘法和除法,并处理真分数。
    saveExercisesAndAnswers(List questions):保存题目和答案到文件。
    checkAnswers():与用户进行答案对比,统计正确和错误的题目。

代码展示:
import java.io.*; import java.util.*;

public class AutoMathQuiz {
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("请输入题目数量: ");
    int n = scanner.nextInt();
    System.out.print("请输入数值范围(不包含): ");
    int r = scanner.nextInt();
           if (r <= 1) {
        System.out.println("错误: 数值范围必须是大于1的自然数");
        return;
    }

List<String> questions = 
generateUniqueExpressions(n, r);
    saveExercisesAndAnswers(questions);
    checkAnswers();
}
private static int generateNumber(int rangeMax) {
    return new Random().nextInt(rangeMax - 1) + 1;    }

private static void checkAnswers() {
    try (BufferedReader exReader = new BufferedReader(new FileReader("Exercises.txt"));
         BufferedReader ansReader = new BufferedReader(new FileReader("Answers.txt"))) {
        Map<Integer, String> answers = new HashMap<>();
        String line;
        while ((line = ansReader.readLine()) != null) {
            String[] parts = line.split(". ");
            answers.put(Integer.parseInt(parts[0]), parts[1]);
        }
        
        Scanner scanner = new Scanner(System.in);
        List<Integer> correct = new ArrayList<>();
        List<Integer> wrong = new ArrayList<>();
        
        for (Map.Entry<Integer, String> entry : answers.entrySet()) {
            System.out.print("请输入题目 " + entry.getKey() + " 的答案: ");
            String userAnswer = scanner.nextLine().trim();
            if (userAnswer.equals(entry.getValue())) {
                correct.add(entry.getKey());
            } else {
                wrong.add(entry.getKey());
            }
        }
        System.out.println("Correct: " + correct);
        System.out.println("Wrong: " + wrong);
    } catch (IOException e) {
        System.out.println("错误: 请先生成题目和答案文件。");
    }
}}
posted @ 2025-03-21 22:21  sscxc  阅读(60)  评论(0)    收藏  举报