问题 | 内容 |
---|---|
这个作业属于哪个课程 | 课程链接 |
这个作业要求在哪里 | 作业要求 |
这个作业的目标 | 实现一个自动生成小学四则运算题目的命令行程序 |
姓名 | 学号 |
---|---|
何松 | 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 |
性能图
实现过程
代码组织
Main 类:
程序的入口类,包含 main 方法。负责解析命令行参数并调用相应的功能。
功能函数:
generateExercises:生成指定数量的题目,并保存到文件中。
generateExercise:生成单个随机的四则运算题目。
calculateAnswer:计算题目的答案。
gradeAnswers:对比用户答案和正确答案,并生成统计结果。
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 计算答案。
最后将题目和答案保存到文件中。
项目小结
闪光点:
何松->洪徐博:在代码优化和边界情况处理上表现出色,提出了分数简化的实现方案。
洪徐博->何松:在文件操作和命令行参数解析上贡献突出,确保了程序的易用性。
小结
本项目成功实现了四则运算题目的生成和答案检查功能,代码逻辑清晰,功能完整。
通过结对编程,我们不仅提高了代码质量,还加深了对彼此编程风格的理解。