结对项目
软件工程 | 网络工程1934 |
---|---|
作业要求 | 结对项目 |
作业目标 | 结对编程,合作编写程序 |
合作者
3219000147 林于群
3219005360 朱丹彤
Github地址
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
Estimate | 估计这个任务需要多少时间 | 30 | 30 |
Development | 开发 | ||
Analysis | 需求分析 (包括学习新技术) | 120 | 120 |
Design Spec | 生成设计文档 | 30 | 20+? |
Design Review | 设计复审 | 60 | 60 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 5 | 5 |
Design | 具体设计 | 20 | 15 |
Coding | 具体编码 | 60 | 80 |
Code Review | 代码复审 | 30 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 90 |
Reporting | 报告 | ||
Test report | 测试报告 | 60 | 60 |
Size Measurement | 计算工作量 | 20 | 10 |
Postmortem & Process Improvement | 事后总结, 并提出过程改进计划 | 10 | 30 |
Total | 合计 | 505 | 580+? |
设计思路
1.我们首先想到的是先把整数化分数的运算,再对分子分母进行化简,我们试图生成两个分子和两个分母来实现让整数和分数的计算可以同步。
2.键盘录入题目数值的范围是range,生成题目的数量questionNum,num(1,2,3,4)由分子分母生成分数(真分数,带分数,整数)
3.我们采用for循环来控制题目数量,每次循环产生一条题目
4.题目运算符+-/随机生成,至少1个,至多3个,用字符数组char[] operator = {'+','-','×','÷'} 来装+-×÷
5.每条题目的数值最多4个,随机4个分子和4个分母出来,用变量molecule(1,2,3,4)存放分子;denominator(1,2,3,4)存放分母;然后通过函数Fraction(分子,分母)得到分数num1/2/3/4 {当分母为1时就得到整数了,当分子>分母得到带分数}
6.通过if条件来判断运算符个数,根据运算符个数的不同开始分类讨论
(1)当运算符个数为1个时
(2)当运算符个数为2个时
(3)当运算符个数为3个时
7.结束当前题目并返回for循环开始下一个题目
代码结构
1.创建一个分数类型Fraction:Fraction a = new Fraction(分子,分母),该类支持分数和整数的存储。
2.创建计算器类Calculator,主要进行四则运算表达式的计算并返回一个fractionStack.pop计算结果
(1)Stack
(2)Stack
(3)Fraction calculate(String numStr),解析并计算四则运算表达式,返回计算结果
3.创建题目和答案txt文件
下面代码是题目txt文件,答案文件代码是类似的
QuestionWrite qw = new QuestionWrite();
qw.Write(question);//这样就直接存入txt了
AnswerWrite aw = new AnswerWrite();
aw.Write(answer);
4.main函数
运行四则运算平台, 调用其余三个controller包下的方法实现完整的运算流程
(1)用for循环来出题目
(2)变量molecule(1,2,3,4)存放分子;denominator(1,2,3,4)存放分母;num(1,2,3,4)由分子分母生成分数(真分数,带分数,整数)
(3)通过if条件来判断运算符个数,根据运算符个数的不同开始分类讨论
(4)题目与答案存入目录文件里,QuestionWrite qw = new QuestionWrite();AnswerWrite aw = new AnswerWrite();
System.out.println("请输入题目中数值的范围");
int range = scanner.nextInt();
System.out.println("请输入你想生成的题目的数量");
int questionNum = scanner.nextInt();
//用for循环来出题目
for(int i = 0;i<questionNum;i++){
Random r = new Random();
/* 运算符 */
int operatorNum = r.nextInt(3) + 1; //随机生成运算符个数,每次1~3个
char[] operator = {'+','-','×','÷'}; //用字符来表示运算符+-*/
//用operator[j]来随机产生+-×÷
int j1 = r.nextInt(4);//如果j1是1,那第一个运算符operator[j1]是-
int j2 = r.nextInt(4);
int j3 = r.nextInt(4);
/* 数值 */
//至多4个数值,建立4个分数的分子分母(整数可以看成分母为1的分数)
int molecule1 = r.nextInt(range); //第1个分子
int molecule2 = r.nextInt(range);
int molecule3 = r.nextInt(range);
int molecule4 = r.nextInt(range);
int denominator1 = r.nextInt(range)+1; //第1个分母,+1是为了防止为0
int denominator2 = r.nextInt(range)+1;
int denominator3 = r.nextInt(range)+1;
int denominator4 = r.nextInt(range)+1;
//由分子分母生成分数(真分数,带分数,整数)
Fraction num1 = new Fraction(molecule1,denominator1);
Fraction num2 = new Fraction(molecule2,denominator2);
Fraction num3 = new Fraction(molecule3,denominator3);
Fraction num4 = new Fraction(molecule4,denominator4);
/*根据运算符个数的不同开始分类讨论*/
if(operatorNum == 1){ //当运算符数目是1个的时候
//使用字符串输出题目
String question = num1 + " " + operator[j1]+ " " + num2 + " = ";
//除号后面不能是0
if(operator[j1] == '÷' && num2.molecule == 0) {
i--;
continue;
}
//使用计算器算出题目答案
Fraction answer=Calculator.calculator.calculate(question);
//出现负数就重新产生题目
if(answer.molecule < 0 || answer.denominator < 0) {
i--;
continue;
}
//输出题目
System.out.println("题目" + (i+1) + ": " + question);
//题目与答案存入目录文件里
QuestionWrite qw = new QuestionWrite();
qw.Write(question);
AnswerWrite aw = new AnswerWrite();
aw.Write(answer);
}
//运算符为2时,同上,只有str这里不同
if(operatorNum == 2) {
String question = num1 + " " + operator[j1] + " "+ num2 + " " + operator[j2] + " " + num3 + " = ";
}
//运算符为3时,同上,只有str这里不同
if(operatorNum == 2) {
String question = num1 + " " + operator[j1] + " " + num2 + " " + operator[j2] + " " + num3 + " " + operator[j3] + " " + num4 + " = ";
}
程序类图
测试运行
题目文件
标准答案文件
性能分析
内存空间占用
项目小结
这次项目让我们体会到了结对编程的优点,一个人编程思维有时候可能会比较局限跳不出来,和队友合作的话可以沟通交流、产生思维碰撞
,有利于问题的解决,例如在栈有关算法上,需要对分数进行处理这方面;而且有时候一些小bug队友帮忙查看的话解决也会快特别多。总之,团队合作相比一个人解决问题会轻松很多,但是前提是要有好的合作分工,所以有效沟通交流就显得尤其重要。
建议分享:我们两个一开始就有比较明确的分工,合作也很默契,遇到困难会及时交流沟通,所以整套流程下来合作很愉快,也都学会了很多东西。