项目 | 内容 |
---|---|
这个作业属于哪个课程 | 软件工程 |
作业要求 | 作业要求 |
作业目标 | 生成四则运算题目 |
- 队伍
3119005434 韦秋风 韦秋风的GitHub
3119005408 陈泽同 陈泽同的GitHub
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Estimate | 估计这个任务完成需要多少时间 | 1800 | 2020 |
Development | 开发 | 360 | 600 |
Analysis | 需求分析(包括学习新技术) | 200 | 300 |
Design Spec | 生成设计文档 | 30 | 30 |
Design Review | 设计复审(和同事审核设计文档) | 20 | 20 |
Coding Standard | 代码规范(为目前的开发指定合适的规范) | 10 | 20 |
Design | 具体设计 | 180 | 150 |
Coding | 具体编码 | 600 | 500 |
Code Review | 代码复审 | 100 | 100 |
Test | 测试(自我测试,修改代码,提交修改) | 120 | 120 |
Reporting | 报告 | 60 | 60 |
Test Report | 测试报告 | 40 | 40 |
Size Measurement | 计算工作量 | 30 | 30 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 50 | 50 |
合计 | 1800 | 2020 |
效能分析
性能分析图
实时内存使用情况
设计实现过程
由InputExpression(number);函数实现随机生成number数量满足条件的算式,并放入ArrayList中
由AddExpressionToQuestion();函数实现将ArrayList中的算式放入队列Question中
由MyFileIO.writeQueue(exerciseFile, questions);函数实现将队列中的算式一一输出到运行目录下的exerciseFile(Exercises.txt)文件
由AddExpressionToAnswer();函数实现将这些算式的结果放入队列Answer中
由MyFileIO.writeQueue(answerFile, answers);函数实现将Answer中的结果输入到运行目录下的AnswerFile(answers.txt)文件
代码说明
// 元素加法,结果放入e1中
public static void Add(Element e1, Element e2) {
if (e1.numerator == 0 && e2.numerator == 0)// 若分数部分均为0,只需对整数部分运算即可
e1.wholeNumber += e2.wholeNumber;
else {
e1.wholeNumber += e2.wholeNumber;// 带分数整数部分相加,放入e1的整数部分
int lcm = Lcm(e1.denominator, e2.denominator);// 求最小公倍数
e1.numerator *= lcm / e1.denominator;// 对e1的分子进行变换
e2.numerator *= lcm / e2.denominator;// 对e2的分子进行变换
e1.denominator = lcm;// 分母就是求得的最小公倍数
e1.numerator += e2.numerator;// e1和e2分子相加,存放在e1的分子处
// 将假分数化成带分数(也防止出现e1的值为十七又三分之三而不是十八的情况)
e1.wholeNumber += e1.numerator / e1.denominator;
e1.numerator = e1.numerator % e1.denominator;
// 最终结果要约分
int factor = Gcd(e1.numerator, e1.denominator);
e1.numerator /= factor;
e1.denominator /= factor;
}
e1.operator = e2.operator;// 由于运算已经完成,将e2的运算符赋值给e1的运算符
e1.nextElement = e2.nextElement;// 修改结点关系
}
// 元素减法,由于只有元素减法会产生负数,因此一旦有负数,return false
public static boolean Sub(Element e1, Element e2) {
if (e1.numerator == 0 && e2.numerator == 0) {// 若分数部分均为0,只需对整数部分运算即可
e1.wholeNumber -= e2.wholeNumber;
if (e1.wholeNumber < 0)
return false;
} else {
if (e1.wholeNumber < e2.wholeNumber)
return false;// 如果整数部分就不够减,return false
e1.numerator += e1.wholeNumber * e1.denominator;// 将带分数转化为假分数
e2.numerator += e2.wholeNumber * e2.denominator;// 将带分数转化为假分数
int lcm = Lcm(e1.denominator, e2.denominator);// 求最小公倍数
e1.numerator *= lcm / e1.denominator;// 对e1的分子进行变换
e2.numerator *= lcm / e2.denominator;// 对e2的分子进行变换
e1.denominator = lcm;// 分母就是求得的最小公倍数
e1.numerator -= e2.numerator;
if (e1.numerator < 0)
return false;
// 将假分数化成带分数
e1.wholeNumber = e1.numerator / e1.denominator;
e1.numerator = e1.numerator % e1.denominator;
// 最终结果要约分
int factor = Gcd(e1.numerator, e1.denominator);
e1.numerator /= factor;
e1.denominator /= factor;
} // e1和e2分子相减,存放在e1的分子处
e1.operator = e2.operator;// 由于运算已经完成,将e2的运算符赋值给e1的运算符
e1.nextElement = e2.nextElement;// 修改结点关系
return true;
}
// 元素乘法,结果放入e1中
public static boolean Multipy(Element e1, Element e2) {
if (e1.denominator == 0 || e2.denominator == 0)
return false;
if (e1.numerator == 0 && e2.numerator == 0)// 若分数部分均为0,只需对整数部分运算即可
e1.wholeNumber *= e2.wholeNumber;
else {
e1.numerator = (e1.wholeNumber * e1.denominator + e1.numerator)
* (e2.wholeNumber * e2.denominator + e2.numerator);
e1.denominator = e1.denominator * e2.denominator;
e1.wholeNumber = e1.numerator / e1.denominator;// 将假分数化成带分数
e1.numerator = e1.numerator % e1.denominator;
// 最终结果要约分
int factor = Gcd(e1.numerator, e1.denominator);
e1.numerator /= factor;
e1.denominator /= factor;
}
e1.operator = e2.operator;
e1.nextElement = e2.nextElement;
return true;
}
// 元素除法
public static void Divide(Element e1, Element e2) {
e1.numerator += e1.wholeNumber * e1.denominator;// 将带分数转化为假分数
e2.numerator += e2.wholeNumber * e2.denominator;// 将带分数转化为假分数
// 将除法运算转化为乘法运算
e1.wholeNumber = e2.wholeNumber = 0;
int temp = e2.numerator;
e2.numerator = e2.denominator;
e2.denominator = temp;
Multipy(e1, e2);
}
// 最大公因数算法
public static int Gcd(int a, int b) {
if (b == 0)
return a;
return Gcd(b, a % b);
}
// 最小公倍数算法
public static int Lcm(int a, int b) {
return a * b / Gcd(a, b);
}
项目小结
韦秋风:
惊吓收获:本次项目暴露了我编程能力的不足,特别是以为自己懂java,实际上对java的语言特性也不了解。对于面向对象的程序语言仍然不够熟悉。
惊喜收获:虽然代码形式比较丑陋,但坚持下来最终完成了核心功能。
陈泽同:
总体来说这次的项目我个人认为没有发挥到最好。和同伴一起编程的时间太少,再加上两人对模块设计思路有差异并且沟通不及时,造成了许多时间的浪费;不过逐渐熟悉对方后,我们之间的沟通变得更加有效,两人协作的效率也越来越高,在最终关头实现了1+1>2的效果,一齐发挥智慧攻克了一个困扰已久的bug。这次结对编程让我体会到思维的多样性和创造性,我们应该学会主动适应同伴的思维,同时也发挥出自己独特的能力。