快乐的二人组

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 | 三年级题目是否符合规范 |是 |

六、总结

通过这次实验,培养了我们团队合作完成项目的能力。在遇到难题时,可以有懂得项目的人相互交流,从而提高解决问题的效率。同时,作业难度的提高,使得我们更加心有余而力不足,事实证明,我们的操作水平还是有所欠缺,有很大的提高潜力。

七、结对照片

posted on 2018-09-19 00:00  瞎子换盆  阅读(168)  评论(1编辑  收藏  举报