快乐的二人组
211506368霍金池211606359戴俊涵
一、预估与实际
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 600 | 700 |
? Estimate | ? 估计这个任务需要多少时间 | 600 | 700 |
Development | 开发 | 500 | 530 |
? Analysis | ? 需求分析 (包括学习新技术) | 300 | 300 |
? Design Spec | ? 生成设计文档 | 60 | 60 |
? Design Review | ? 设计复审 | 30 | 30 |
? Coding Standard | ? 代码规范 (为目前的开发制定合适的规范) | 90 | 100 |
? Design | ? 具体设计 | 400 | 420 |
? Coding | ? 具体编码 | 20 | 20 |
? Code Review | ? 代码复审 | 60 | 40 |
? Test | ? 测试(自我测试,修改代码,提交修改) | 60 | 80 |
Reporting | 报告 | 30 | 60 |
? Test Repor | ? 测试报告 | 15 | 30 |
? Size Measurement | ? 计算工作量 | 10 | 15 |
? Postmortem & Process Improvement Plan | ? 事后总结, 并提出过程改进计划 | 10 | 10 |
合计 | 800 |
二、需求分析
我通过万能的度娘了解到,小学一年级数学有如下的几个特点:
- 特点1
都是正整数,范围在0-100以内
- 特点2
乘除应该满足乘法表且不能有余数
- 特点3
小学三年级四则混合运算包括随机的括号产生
经过分析,我认为,这个程序应当:
- 还要判断输入的不是正常数的报错情况
- 得数不能有小数
- 小学二年级是10以内的乘法口诀表的乘除法
- 小学三年级的运算需要判断符号优先级
三、设计
1. 设计思路
- 首先输入参数判断年级还有题数,判断参数的输入是否符合题目要求
- 随机生成符号,并且当出现负数小数时舍去的情况
- 四则运算方法,以及分母为0的情况等
- out.txt文本的建立和写入
2. 实现方案
写出具体实现的步骤
- 准备工作:先在Github上创建仓库,然后fork,clone到本地并且下载git创建文件等
- 技术关键点:关于文本创建的一系列方法,清空文本的数据方法,以及判断是一年级还是二年级的方法
- 对于三年级括号的添加运算
- 对于优先级的判断为:输出:如果第二位符号是乘除法 要做特殊处理,即第一运算符号左右的数字前后加上括号,运算:
四、编码
- 扫描键盘输入
- 创建文件
- 判断题目数量范围是否正确是否符合
- 定义四则运算方法
- 判断文件创建是否异常
1. 调试日志
结果出现小数,然后我们直接调整为整数
题目中出现负数,没有想到解决办法,我们在随机数中定义了范围,结果不起作用
优先级出现问题,排版有点乱,找了一会改好的
2. 关键代码
...
*/
private static String[][] buildQuestion(int count, int grade){
//运算符号范围
int operate = 0;
//如果题目数量为负数
if(count < 0){
count = 1;
}
//如果年级为负数
if(grade <= 1){
operate = 0;
}else if(grade == 2){
operate = 2;
}else{
operate = 3;
}
//基数
int limited = 149 - grade / 25;
//随机数工具
Random random = new Random();
int firstNum = 0;
int secondNum = 0;
int thirdNum = 0;
int firstOperate = 0;
int secondOperate = 0;
int result = 0;
//二维数组, 其第二维度 依次存放的是 数字、运算、数字、运算、数字、结果
String[][] titleArr = new String[count][6];
for (String[] arr : titleArr) {
//第一位运算数字
firstNum = random.nextInt(99) + 1;
//第二位运算数字
secondNum = random.nextInt(99) + 1;
//第三位运算数字
thirdNum = random.nextInt(99) + 1;
//第一位符号 0:+ 1:- 2:× 3:÷
firstOperate = random.nextInt(4);
//第二位符号 0:+ 1:- 2:× 3:÷ 4:四则运算
secondOperate = random.nextInt(2) + operate;
if(grade == 3){
secondOperate = 4;
}
switch(secondOperate){
case 0:
//加法
firstOperate = secondOperate;
arr[firstOperate_index] = paraseOperateStr(firstOperate);
arr[firstNum_index] = String.valueOf(firstNum);
arr[thirdNum_index] = String.valueOf(secondNum);
arr[result_index] = calculate(firstNum, secondNum, firstOperate);
break;
case 1:
//减法
firstOperate = secondOperate;
arr[firstOperate_index] = paraseOperateStr(firstOperate);
arr[firstNum_index] = String.valueOf(firstNum);
arr[secondNum_index] = String.valueOf(secondNum);
arr[result_index] = calculate(firstNum, secondNum, firstOperate);
break;
case 2:
//乘法
firstOperate = secondOperate;
arr[firstOperate_index] = paraseOperateStr(firstOperate);
arr[firstNum_index] = String.valueOf(firstNum);
arr[secondNum_index] = String.valueOf(secondNum);
arr[result_index] = calculate(firstNum, secondNum, firstOperate);
break;
case 3:
//除法
firstOperate = secondOperate;
arr[firstOperate_index] = paraseOperateStr(firstOperate);
//判断分母不能为0,如果是0,则重新取值
while(secondNum == 0){
secondNum = random.nextInt(limited) + 1;
}
//余数
int remainder = (firstNum % secondNum);
if(remainder == 0){
arr[result_index] = calculate(firstNum, secondNum, firstOperate);
}else{
arr[result_index] = calculate(firstNum, secondNum, firstOperate) + "..." + String.valueOf(remainder);
}
arr[firstNum_index] = String.valueOf(firstNum);
arr[secondNum_index] = String.valueOf(secondNum);
break;
case 4:
//运算符重新取值
secondOperate = random.nextInt(4);
//如果第一个符号的优先相等或高,则不用做括号处理
if(compareOperate(firstOperate, secondOperate) >= 0){
//如果第一位符号是除法 要做特殊处理
if(firstOperate == 3){
while((firstNum % secondNum) != 0 || result == 0){
firstNum = random.nextInt(limited);
//防止除数为0
secondNum = random.nextInt(limited) + 1;
result = firstNum / secondNum;
}
result = firstNum / secondNum;
//第二位是乘法和除法
if(secondOperate == 3 || secondOperate == 2){
//如果第二位符号是除法 要做特殊处理
if(secondOperate == 3){
while((result % thirdNum)!=0 || result/thirdNum==0){
thirdNum = random.nextInt(limited) + 1;
}
}
//填充数据
arr[secondNum_index] = String.valueOf(secondNum);
arr[thirdNum_index] = String.valueOf(thirdNum);
arr[result_index] = calculate(result, thirdNum, secondOperate);
}else{
//加法和减法的操作处理
result = Integer.valueOf(calculate(secondNum, thirdNum, secondOperate));
//逆推
int temp = random.nextInt(20);
firstNum = temp * result;
arr[secondNum_index] = "( " + String.valueOf(secondNum);
arr[thirdNum_index] = String.valueOf(thirdNum) + " )";
arr[result_index] = String.valueOf(temp);
}
}else{
result = Integer.valueOf(calculate(firstNum, secondNum, firstOperate));
//填充数据
arr[secondNum_index] = String.valueOf(secondNum);
arr[thirdNum_index] = String.valueOf(thirdNum);
arr[result_index] = calculate(result, thirdNum, secondOperate);
}
arr[firstNum_index] = String.valueOf(firstNum);
arr[firstOperate_index] = paraseOperateStr(firstOperate);
arr[secondOperate_index] = paraseOperateStr(secondOperate);
}else{
//优先级低的处理,既加括号
result = Integer.valueOf(calculate(secondNum, thirdNum, secondOperate));
if(firstOperate == 3){
//如果此时result等于0,则重新取值
while(result == 0){
secondNum = random.nextInt(limited);
//防止出现除数为0的情况
thirdNum = random.nextInt(limited) +1;
result = Integer.valueOf(calculate(secondNum, thirdNum, secondOperate));
}
//此时除数可能很大,所以应该逆推
int temp = random.nextInt(20);
arr[firstNum_index] = calculate(result, temp, 2);
arr[result_index] = String.valueOf(temp);
}else{
if(secondNum == 3){
while(secondNum % thirdNum !=0){
secondNum = random.nextInt(limited) + 1;
thirdNum = random.nextInt(limited) + 1;
}
}else{
arr[firstNum_index] = String.valueOf(firstNum);
arr[result_index] = calculate(firstNum, result, firstOperate);
}
}
arr[secondNum_index] = String.valueOf(secondNum);
arr[thirdNum_index] = String.valueOf(thirdNum);
arr[firstOperate_index] = paraseOperateStr(firstOperate);
arr[secondOperate_index] = paraseOperateStr(secondOperate);
}
break;
}
...
3. 代码规范
请给出本次实验使用的代码规范:
1.左大括号前不换行,后换行,右括号前换行。
2.源代码文件以文件内容中的最顶层的Java类命名,而且大小写敏感,文件扩展名为 .java,同时,文件的编码格式统一为UTF-8。
五、测试
输入 | 输出 | 是否符合要求 | |
---|---|---|---|
100,3 | 题目数量是否正确 | 是 | |
100,1 | 一年级题目是否符合规范 | 是 | |
100,2 | 二年级题目是否符合规范 | 是 | |
100,3 | 三年级题目是否符合规范 | 是 |
六、总结
通过这次实验,培养了我们团队合作完成项目的能力。在遇到难题时,可以有懂得项目的人相互交流,从而提高解决问题的效率。同时,作业难度的提高,使得我们更加心有余而力不足,事实证明,我们的操作水平还是有所欠缺,有很大的提高潜力。
七、结对照片
原文地址:https://www.cnblogs.com/xzhp/p/9672239.html