作业三

问题 内容
这个作业属于哪个课程 课程链接
这个作业要求在哪里 作业要求
这个作业的目标 实现一个自动生成小学四则运算题目的命令行程序
姓名 学号
何松 3123004786
洪徐博 3123004747
PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划
· Estimate · 估计这个任务需要多少时间 10 10
Development 开发
· Analysis · 需求分析 (包括学习新技术) 30 30
· Design Spec · 生成设计文档 20 20
· Design Review · 设计复审 (和同事审核设计文档) 10 10
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 10 10
· Design · 具体设计 20 20
· Coding · 具体编码 60 69
· Code Review · 代码复审 30 30
· Test · 测试(自我测试,修改代码,提交修改) 20 20
Reporting 报告
· Test Report · 测试报告 10 10
· Size Measurement · 计算工作量 10 10
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 10 10
合计 240 240

性能图

image

实现过程

代码组织

Main 类:

程序的入口类,包含 main 方法。负责解析命令行参数并调用相应的功能。

功能函数:

generateExercises:生成指定数量的题目,并保存到文件中。

graph TD A[开始] --> B[初始化题目集合和列表] B --> C{是否生成足够题目?} C -- 是 --> D[保存题目和答案到文件] D --> E[结束] C -- 否 --> F[生成单个题目] F --> G{题目是否重复?} G -- 是 --> C G -- 否 --> H[添加到题目集合和列表] H --> I[计算题目答案并保存] I --> C

generateExercise:生成单个随机的四则运算题目。

calculateAnswer:计算题目的答案。

gradeAnswers:对比用户答案和正确答案,并生成统计结果。

graph TD A[开始] --> B[读取题目文件和答案文件] B --> C[初始化正确和错误题目编号列表] C --> D{是否遍历完所有题目?} D -- 是 --> E[保存统计结果到文件] E --> F[结束] D -- 否 --> G[计算当前题目的正确答案] G --> H{用户答案是否正确?} H -- 是 --> I[添加到正确题目列表] H -- 否 --> J[添加到错误题目列表] I --> D J --> D

saveToFile 和 readFile:文件的读写操作。

simplifyFraction 和 gcd:辅助函数,用于分数简化和计算最大公约数。

代码说明

main 方法

public static void main(String[] args) throws UnsupportedEncodingException {
    // 如果没有传入参数,打印帮助信息并退出
    if (args.length == 0) {
        printHelp();
        return;
    }
    // 解析命令行参数
    if (args[0].equals("-n") && args.length == 4 && args[2].equals("-r")) {
        // 生成题目模式:-n <题目数量> -r <数值范围>
        int numberOfExercises = Integer.parseInt(args[1]);
        int range = Integer.parseInt(args[3]);
        generateExercises(numberOfExercises, range);
    } else if (args[0].equals("-e") && args.length == 4 && args[2].equals("-a")) {
        // 判断答案模式:-e <题目文件> -a <答案文件>
        String exerciseFile = args[1];
        String answerFile = args[3];
        gradeAnswers(exerciseFile, answerFile);
    } else {
        printHelp();
    }
}

思路与注释:

这是程序的入口方法,负责解析命令行参数。

如果参数是 -n <题目数量> -r <数值范围>,则调用 generateExercises 生成题目。

如果参数是 -e <题目文件> -a <答案文件>,则调用 gradeAnswers 检查答案。

如果没有参数或参数格式错误,打印帮助信息。

generateExercises 方法

private static void generateExercises(int numberOfExercises, int range) {
    Set<String> exercises = new HashSet<>(); // 用于存储已生成的题目,避免重复
    List<String> exerciseList = new ArrayList<>(); // 存储题目列表
    List<String> answerList = new ArrayList<>(); // 存储答案列表

    // 生成题目,直到达到指定数量
    while (exerciseList.size() < numberOfExercises) {
        String exercise = generateExercise(range);
        // 检查题目是否重复
        if (!exercises.contains(exercise)) {
            exercises.add(exercise);
            exerciseList.add(exercise);
            // 计算题目的答案并保存
            answerList.add(calculateAnswer(exercise));
        }
    }

    // 将题目和答案保存到文件中
    saveToFile("Exercises.txt", exerciseList);
    saveToFile("Answers.txt", answerList);
}

思路与注释:

使用 Set 来存储已生成的题目,避免重复。

使用 List 存储题目和答案。

循环生成题目,直到达到指定数量。

调用 generateExercise 生成单个题目,调用 calculateAnswer 计算答案。

最后将题目和答案保存到文件中。

项目小结

闪光点:

何松->洪徐博:在代码优化和边界情况处理上表现出色,提出了分数简化的实现方案。

洪徐博->何松:在文件操作和命令行参数解析上贡献突出,确保了程序的易用性。

小结
本项目成功实现了四则运算题目的生成和答案检查功能,代码逻辑清晰,功能完整。

通过结对编程,我们不仅提高了代码质量,还加深了对彼此编程风格的理解。

posted @ 2025-03-20 11:58  faken233  阅读(37)  评论(0)    收藏  举报