这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/CSGrade22-34 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13230 |
这个作业的目标 | 实现四则运算程序,掌握结对合作完成项目的技巧 |
项目地址
GitHub地址
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 60 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 30 |
Development | 开发 | 240 | 240 |
· Analysis | · 需求分析 (包括学习新技术) | 60 | 80 |
· Design Spec | · 生成设计文档 | 20 | 20 |
· Design Review | · 设计复审 | 10 | 10 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
· Design | · 具体设计 | 60 | 40 |
· Coding | · 具体编码 | 100 | 90 |
· Code Review | · 代码复审 | 10 | 10 |
· Test | · 测试(自我测试,修改代码,提交修改) | 50 | 120 |
Reporting | 报告 | 30 | 60 |
· Test Repor | · 测试报告 | 10 | 20 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 40 | 40 |
· 合计 | 740 | 840 |
效能分析
设计实现
代码说明
检测输入
// 检查输入的题目数量与数值范围是否可实现,并修改static boolean able(int n, int r) {if (n>10000) {error = "最大题数为10000";return false;} else if (n<=0) {error = "题数不合法";return false;} else if (range == 0) {error = "请给定数值范围,详细操作通过 -h 查看";return false;} else if (range<0) {error = "数值范围不合法";return false;} else if (range<5) {error = "数值范围过小,至少为5";return false;}return true;}
表达式生成
// 生成表达式,并存入题目列表static void subject() {// 运算符个数 1-3 个List<String> exp = new ArrayList<String>();int opr_n = (int) (Math.random()*3 + 1);switch(opr_n) {case 1:exp.add(createnum());exp.add(createopr1());exp.add(createnum());break;case 2:// 括号起始位置int bkt_s = (int) (Math.random()*3);// 括号结束位置int bkt_e = 0;// 无括号if (bkt_s == 0) {bkt_e = 0;} else {bkt_e = bkt_s + 1;}for (int i = 1; i <= 3; i++) {if (bkt_s == i) {exp.add("(");}exp.add(createnum());if (bkt_e == i) {exp.add(")");}exp.add(createopr1());}// 处理括号无意义情况checkbkt(bkt_s, bkt_e,exp);exp.remove(exp.size()-1); // 删除最后多加入的一个运算符break;case 3:// 括号起始位置bkt_s = (int) (Math.random()*4);// 无括号if (bkt_s == 0) {bkt_e = 0;} else if (bkt_s == 3){bkt_e = 4;} else {bkt_e = bkt_s + (int) (Math.random()*2 + 1); // [1,3)}for (int i = 1; i <= 4; i++) {if (bkt_s == i) {exp.add("(");}exp.add(createnum());if (bkt_e == i) {exp.add(")");}exp.add(createopr1());}// 处理括号无意义情况checkbkt(bkt_s, bkt_e,exp);exp.remove(exp.size()-1); // 删除最后多加入的一个运算符break;}e.add(exp);System.out.println(toString(exp));// exp.clear();}
随机数获取
// 产生随机数public static String createnum() {ThreadLocalRandom rand = ThreadLocalRandom.current();int a = rand.nextInt(range);int b = rand.nextInt(range);if (a == 0) {a += (int) (Math.random()*range + 1);}if (b == 0) {b += (int) (Math.random()*range + 1);}if (b == range) {b = b-1;}num n = new num(a,b);easy(n);if (n.a == n.b) {return Integer.toString(1);}if (n.b == 1) {return Integer.toString(n.a);}return n.tostring();}
测试运行
题目及答案
项目小结
在本项目中,我们成功实现了一个命令行程序,能够根据给定参数自动生成小学四则运算题目,并记录相关答案。以下是我们在项目实施过程中总结的经验和教训:
成功经验
-
功能实现完整性:程序能够按照用户指定的数量和范围生成题目,且确保每道题目的计算过程不产生负数,符合真分数的运算规则。这增强了程序的可靠性。
-
用户友好的参数设计:我们设计了简洁的命令行参数,用户只需输入数量和范围即可生成题目,使用方便,减少了用户的操作负担。
-
高效的数据存储:题目和答案被有效地存储在文本文件中,便于后续的阅卷和统计。这种设计使得题目生成与评分分离,逻辑清晰。
-
准确性和可扩展性:程序支持生成高达一万道题目的功能,这使得我们的程序具有较高的可扩展性,满足不同用户需求。
遇到的挑战与教训
-
逻辑复杂性:在设计题目生成的逻辑时,我们遇到了如何避免重复题目的问题。经过多次讨论和调整,我们实现了通过运算符和括号的组合来有效避免重复,确保题目的多样性。
-
性能优化的时间消耗:在优化程序性能时,我们发现某些计算逻辑存在冗余,花费了不少时间进行代码分析与调整。最终,我们通过简化运算过程和减少不必要的重复计算,提高了整体性能。
-
团队协作的挑战:虽然我们的分工明确,但在一些关键功能的实现上,沟通不足导致了一些重复的工作。后期我们调整了沟通方式,增加了代码审查,最终提高了效率。
合作感受
在整个项目中,合作的过程让我体会到了团队合作的重要性。我们共同讨论、互相学习,弥补了各自的不足。通过分工合作,我们不仅提升了个人技能,还增强了团队协作能力。
总结
本项目不仅增强了我们的编程能力,更让我们体会到了从需求分析到最终实现的全过程的重要性。通过此次经历,我们意识到良好的沟通、合理的时间管理和对细节的关注是成功的关键。在未来的项目中,我们将继续保持这种合作精神,追求更高的编程水平和项目质量。