这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/CSGrade22-34 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13230 |
这个作业的目标 | 实现四则运算程序,掌握结对合作完成项目的技巧 |
成员一 | 王佳伟3122004880 |
成员二 | 范圣林3122004735 |
项目地址
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();
}
测试运行
题目及答案
项目小结
在本项目中,我们成功实现了一个命令行程序,能够根据给定参数自动生成小学四则运算题目,并记录相关答案。以下是我们在项目实施过程中总结的经验和教训:
成功经验
-
功能实现完整性:程序能够按照用户指定的数量和范围生成题目,且确保每道题目的计算过程不产生负数,符合真分数的运算规则。这增强了程序的可靠性。
-
用户友好的参数设计:我们设计了简洁的命令行参数,用户只需输入数量和范围即可生成题目,使用方便,减少了用户的操作负担。
-
高效的数据存储:题目和答案被有效地存储在文本文件中,便于后续的阅卷和统计。这种设计使得题目生成与评分分离,逻辑清晰。
-
准确性和可扩展性:程序支持生成高达一万道题目的功能,这使得我们的程序具有较高的可扩展性,满足不同用户需求。
遇到的挑战与教训
-
逻辑复杂性:在设计题目生成的逻辑时,我们遇到了如何避免重复题目的问题。经过多次讨论和调整,我们实现了通过运算符和括号的组合来有效避免重复,确保题目的多样性。
-
性能优化的时间消耗:在优化程序性能时,我们发现某些计算逻辑存在冗余,花费了不少时间进行代码分析与调整。最终,我们通过简化运算过程和减少不必要的重复计算,提高了整体性能。
-
团队协作的挑战:虽然我们的分工明确,但在一些关键功能的实现上,沟通不足导致了一些重复的工作。后期我们调整了沟通方式,增加了代码审查,最终提高了效率。
合作感受
在整个项目中,合作的过程让我体会到了团队合作的重要性。我们共同讨论、互相学习,弥补了各自的不足。通过分工合作,我们不仅提升了个人技能,还增强了团队协作能力。
总结
本项目不仅增强了我们的编程能力,更让我们体会到了从需求分析到最终实现的全过程的重要性。通过此次经历,我们意识到良好的沟通、合理的时间管理和对细节的关注是成功的关键。在未来的项目中,我们将继续保持这种合作精神,追求更高的编程水平和项目质量。
标签:10,题目,项目,int,生成,bkt,range,结队 From: https://www.cnblogs.com/aste/p/18436808