项目 | 内容 |
---|---|
这个作业属于哪个课程 | 软件工程 |
作业要求 | 作业要求 |
作业目标 | 生成四则运算题目 |
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。这次结对编程让我体会到思维的多样性和创造性,我们应该学会主动适应同伴的思维,同时也发挥出自己独特的能力。