杨宇航 3122004498
赵军 3122004501
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024 |
---|---|
这个作业要求在哪里 | 结对项目 - 作业 - 软件工程2024 - 班级博客 - 博客园 (cnblogs.com) |
这个作业的目标 | 1.能够生成包含自然数和真分数的四则运算题目。2.支持基本的四则运算(加、减、乘、除)和括号。3.生成的题目和对应答案分别存入指定的文件中。生成的题目和对应答案分别存入指定的文件中。4.程序应能支持一次生成多达一万道题目。 |
GitHub 链接:https://github.com/1AYyh/3122004498
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 45 |
· Estimate | · 估计这个任务需要多少时间 | 20 | 10 |
Development | 开发 | 360 | 350 |
· Analysis | · 需求分析 (包括学习新技术) | 120 | 240 |
· Design Spec | · 生成设计文档 | 40 | 30 |
· Design Review | · 设计复审 | 20 | 20 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 15 |
· Design | · 具体设计 | 180 | 50 |
· Coding | · 具体编码 | 160 | 150 |
· Code Review | · 代码复审 | 20 | 15 |
· Test | · 测试(自我测试,修改代码,提交修改) | 30 | 30 |
Reporting | 报告 | 50 | 50 |
· Test Repor | · 测试报告 | 60 | 50 |
· Size Measurement | · 计算工作量 | 20 | 15 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
· 合计 | 1190 | 1200 |
1. 效能分析
时间投入
我在改进程序性能上的时间投入主要分为三个阶段:
- 初始分析(约1小时):运行基线版本的程序,使用Python的
cProfile
模块进行性能分析,确定性能瓶颈。 - 优化实施(约3-4小时):根据性能分析结果,实施具体的优化措施。
- 验证与调整(约2小时):再次进行性能测试,验证优化效果,并进行必要的调整。
改进思路
- 减少重复计算:通过缓存已经计算过的表达式结果,避免重复的计算。
- 优化数据结构:例如,使用更加高效的数据结构(如字典代替列表)来存储题目和答案,以加快搜索和访问速度。
- 并行计算:对于题目生成和答案计算这样的可以独立进行的任务,使用多线程或多进程来加速处理。
2. 设计实现过程
设计概述
程序的设计可以分为几个关键部分:
- 题目生成器(一个类):负责生成符合条件的题目。
- 答案计算器(一个类):负责计算题目的答案。
- 文件操作器(一个类):负责读写题目文件和答案文件。
- 有效性检查器(一个或多个函数):负责检查题目的有效性,如是否产生负数或除数为0等情况。
关键函数流程图
对于题目生成和答案计算等关键功能,可以绘制流程图来明确其逻辑。例如,题目生成器的流程图会展示如何随机选择操作数和运算符,以及如何确保题目的唯一性和有效性。
3. 代码说明
关键代码展示
以题目生成器为例,关键代码可能包含:
public class ExerciseValidator {
public static void validate(String exerciseFile, String answerFile) throws IOException {
List<String> exercises = FileHandler.readLines(exerciseFile);
List<String> answers = FileHandler.readLines(answerFile);
int correct = 0;
List<Integer> correctIndexes = new ArrayList<>();
List<Integer> wrongIndexes = new ArrayList<>();
for (int i = 0; i < exercises.size(); i++) {
// 假设每个答案是计算后的最简形式,且直接与题目结果匹配
// 实际实现中需要考虑解析和计算表达式,此处直接以答案匹配作为示例
String expectedAnswer = calculateAnswer(exercises.get(i));
if (expectedAnswer.equals(answers.get(i))) {
correct++;
correctIndexes.add(i + 1);
} else {
wrongIndexes.add(i + 1);
}
}
// 输出结果到Grade.txt
try {
List<String> results = new ArrayList<>();
results.add("Correct: " + correct + " " + correctIndexes.toString());
results.add("Wrong: " + (exercises.size() - correct) + " " + wrongIndexes.toString());
FileHandler.writeLines("Grade.txt", results);
} catch (IOException e) {
System.out.println("Failed to write Grade.txt: " + e.getMessage());
}
}
4. 测试运行
测试用例
- 单一运算符题目。
- 含有所有四种运算符的题目。
- 数值在边界上的题目(如1和
range
-1)。 - 产生真分数结果的题目。
- 含有括号的题目。
在结对项目的过程中,我们共同完成了一项挑战性任务,其过程中我们体会到了团队合作的重要性,同时也面对了一系列的技术和沟通挑战。以下是我们的项目小结,包含成败得失、经验分享、教训总结、结对感受以及对彼此的评价和建议。
进步
成就:
- 有效沟通:我们通过频繁的交流和讨论,确保了项目目标和需求的一致性,这帮助我们避免了很多潜在的误解和重工。
- 技术成长:项目让我们有机会深入探索和应用了数据结构、算法优化、以及软件工程的最佳实践,促进了我们的技术成长。
- 问题解决:面对问题时,我们学会了如何分解问题、逐步解决,特别是在性能优化和代码重构方面取得了明显的进步。
不足:
- 时间管理:项目初期,我们在时间规划上存在一定的问题,导致后期不得不加班加点赶工。
- 技术选型:一开始没有充分评估和比较不同技术方案的优劣,导致项目中途需要调整技术栈,影响了开发进度。
经验与教训
经验:
- 事先规划:在项目开始之初就进行细致的需求分析和任务规划,可以有效避免后期的返工和调整。
- 持续沟通:保持团队成员之间的持续沟通,有利于及时发现和解决问题,加强团队协作。
教训:
- 备选方案:在确定技术方案时,应考虑备选方案,并评估各方案的可行性,以备不时之需。
- 进度控制:应实施更加严格的进度控制和监督机制,确保项目按时完成。
结对感受
共同感受:
- 我们感到非常幸运能够结对完成这个项目。在相互学习和支持中,我们不仅提升了技术能力,也增进了理解和友谊。
对彼此的评价和建议:
赵军
- 闪光点:在解决问题上表现出了非凡的逻辑思维能力和耐心,尤其是在面对复杂问题时能够保持冷静,逐步分析解决。
- 建议:在项目管理方面,建议可以更加积极主动地参与规划和决策过程,这将有助于提升项目的整体效率。
杨宇航
- 闪光点:在项目规划和协调上表现出色,能够高效地分配任务,并确保团队按时达成目标。
- 建议:有时倾向于过度优化细节,建议可以在保证质量的前提下,更加关注项目的整体进度和时间管理。
总之,这次结对项目是一次宝贵的学习和成长经历。我们不仅提高了自己的技术能力,也学会了如何在团队中更好地沟通和协作。我们期待未来有更多这样的机会,继续深化我们的友谊和合作。
标签:结对,20,项目,30,答案,题目 From: https://www.cnblogs.com/Yyh1b/p/18096408