1.作业基本信息
这个作业属于哪个课程 | 软件工程3班 |
---|---|
这个作业要求在哪里 | 结对编程:小学四则运算 |
项目成员 | 周盟棋 3121005065 刘伟键 3121005045 |
这个作业的目标 | 实现一个自动生成小学四则运算题目的命令行程序 |
代码仓库 | arithmetic |
2.PSP表格
PSP | Personal Software Process Stages | 预计耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 30 |
· Estimate | 估计这个任务需要多少时间 | 20 | 30 |
Development | 开发 | 920 | 1070 |
· Analysis | 需求分析 (包括学习新技术) | 30 | 60 |
· Design Spec | 生成设计文档 | 20 | 10 |
· Design Review | 设计复审 | 20 | 10 |
· Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 20 | 10 |
· Design | 具体设计 | 30 | 30 |
· Coding | 具体编码 | 500 | 600 |
· Code Review | 代码复审 | 120 | 150 |
· Test | 测试(自我测试,修改代码,提交修改) | 180 | 200 |
Reporting | 报告 | 110 | 120 |
· Test Report | 测试报告 | 60 | 60 |
· Size Measurement | 计算工作量 | 20 | 30 |
· Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 30 |
合计 | 1050 | 1220 |
3.效能分析
//消耗最大的函数:生成题目函数
public MathTopic generateOneMathProblem(int range) {
MathTopic mathTopic = new MathTopic();
//获得随机运算法数量
int operatorNum = RandomTopicUtils.getRandomNum(1, 3);
List<String> operatorList = new ArrayList<String>();
String operator = null;
//给运算符赋值
for (int i = 0; i < operatorNum; i++) {
operator = OperatorConstant.operatorMap.get((Integer) RandomTopicUtils.getRandomNum(1, 4));
operatorList.add(operator);
}
//给运算值赋值
List<String> numList = new ArrayList<String>();
int flag = 0;
for (int i = 0; i < operatorList.size() + 1; i++) {
flag = RandomTopicUtils.getRandomNum(0, 1);
if (flag == 0) {
//生成分数
numList.add(RandomTopicUtils.generateFraction(range));
} else {
//生成自然数
numList.add(RandomTopicUtils.generateNaturalNumber(range));
}
}
mathTopic.setData(numList);
mathTopic.setOperator(operatorList);
mathTopic.setTopicString(null);
//答案为负则再次生成
if(getAnswer(mathTopic).contains("-")){
return generateOneMathProblem(range);
}else{
mathTopic.setTopicString(generateExerciseStr(mathTopic));
mathTopic.setAnswer(getAnswer(mathTopic));
return mathTopic;
}
}
4.设计实现过程
类 | 方法 | 备注 |
---|---|---|
OperatorConstant | 保存常量 | |
MathTopic | 数学题目对象 | |
MathException | notImproperFraction() | 承载错误信息 |
MathTopicGenerator |
| 生成题目器 |
FileUtils |
| 文件工具类 |
RandomTopicUtils |
| 随机生成题目工具 |
Main | main(String[] args) | 主程序运行类 |
5.代码说明
//关键代码展示
public MathTopic generateOneMathProblem(int range) {
MathTopic mathTopic = new MathTopic();
//获得随机运算法数量
int operatorNum = RandomTopicUtils.getRandomNum(1, 3);
List<String> operatorList = new ArrayList<String>();
String operator = null;
//给运算符赋值
for (int i = 0; i < operatorNum; i++) {
operator = OperatorConstant.operatorMap.get((Integer) RandomTopicUtils.getRandomNum(1, 4));
operatorList.add(operator);
}
//给运算值赋值
List<String> numList = new ArrayList<String>();
int flag = 0;
for (int i = 0; i < operatorList.size() + 1; i++) {
flag = RandomTopicUtils.getRandomNum(0, 1);
if (flag == 0) {
//生成分数
numList.add(RandomTopicUtils.generateFraction(range));
} else {
//生成自然数
numList.add(RandomTopicUtils.generateNaturalNumber(range));
}
}
mathTopic.setData(numList);
mathTopic.setOperator(operatorList);
mathTopic.setTopicString(null);
//答案为负则再次生成
if(getAnswer(mathTopic).contains("-")){
return generateOneMathProblem(range);
}else{
mathTopic.setTopicString(generateExerciseStr(mathTopic));
mathTopic.setAnswer(getAnswer(mathTopic));
return mathTopic;
}
}
6.测试运行
7.项目小结
在这次经历的结对项目中,我们双方能够明确地知道正在工作的目标,并一起为了实现这个目标而努力工作。过程中也有一些bug,会通过双方的交流去解决,这是个人项目所不能体验的,所以这次的结对编程对我们来说是一个宝贵的经验。