结对作业1

学号1:211606328 姓名:田先强 学号2:211606331 姓名:王鑫

一、预估与实际

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划
Estimate 估计这个任务需要多少时间 0.5 1
Development 开发 30 25
Analysis 需求分析 (包括学习新技术) 90 180
Design Spec 生成设计文档 80 120
Design Review 设计复审 60 70
Coding Standard 代码规范 (为目前的开发制定合适的规范) 30 30
Design 具体设计 50 50
Coding 具体编码 600 1800
Code Review 代码复审 60 50
Test 测试(自我测试,修改代码,提交修改) 100 90
Reporting 报告 30 25
Test Repor 测试报告 40 55
Size Measurement 计算工作量 15 15
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 40 60
合计 1225.5 2571

二、需求分析

我通过百度的方式了解到,小学三年级数学有如下的几个特点:

  • 特点1:涉及到加减乘除的混合运算,且有括号
  • 特点2:都是整数,没有小数
  • 特点3:没有负数
  • 特点4:四则运算中除法运算不能有余数
  • 特点5:数字已经在1000以上了

经过分析,我认为,这个程序应当:

  • 除法不能有余数
  • 生成减法时注意结果不能为负数
  • 应该有存在加括号的四则运算

三、设计

1. 设计思路

  • 程序有一个类,主要有这几个方法,用于实现以下几个目的:
    • 根据传入的两个数及运算符计算出结果
    • 生成含有两个运算符的题目
    • 生成含有三个运算符的题目
    • 生成含有四个运算符的题目
    • 根据传入的数和一个运算符,生成另外一个数
    • 将题目与答案写入文档中
  • 算法的关键:
    • 如何根据一个数和运算符生成符合条件的下一个数
    • 当存在括号运算符时该如何生成题目

2. 实现方案

  • 准备工作:先在Github上创建仓库,克隆到本地,编写代码后通过git远程上传到Github上
  • 思路:随机生成一个数判断所出题目所需的运算符个数,再通过三个方法生成含有不同运算符个数的题目,然后循环生成题目,最后写入文档
  • 技术关键点:如何正确生成符合条件的题目、题目中出现括号运算符时该如何分配括号的位置以及判断运算符的优先级

四、编码

出现的问题:1.开始时,不知道怎么判断生成的一道题该从哪里开始计算,我们通过将运算符保存在两个不同数组中从而区分其的计算优先级;2.随机生成一个数后,无法生成符合条件的数,例如出现除号时,我们通过一个方法将传入的参数和运算符进行判断,运算符不同时采用不同的方法来生成符合条件的数字;3.最难的还是当出现括号运算符时,括号该加在什么地方,只有三个运算符的时候,括号只能加在两个地方,而有四个运算符时则有五个地方,当时没想到什么好方法,就只能通过穷举的方式来判别括号的位置

1. 调试日志

1.刚开始测试时遇到有除法运算时,总是无法整除,我们写了一个求因数的方法,遇到除号时便从它的因数数组中随机生一个除数,保证一定能够整除;2.当遇到括号运算,括号里的结果为0可能会作为除数,系统便会进行报错,目前没有想到什么好办法,只能将所有可能生成0的计算给排除了

2. 关键代码

		int number;
		if(s1.equals("+")) {
			 number=(int)(Math.random()*1000);
			 return number;
		}
		if(s1.equals("-")) {
			 number=(int)(Math.random()*1000)+answer+1;
			 return number;
		}
		if(s1.equals("×")) {
			number=(int)(Math.random()*(1000/answer))+1;
			return number;
		}
		if(s1.equals("÷")) {
			if (answer!=0) {
			number=(int)(Math.random()*(3000/answer)+1)*answer;
			return number;}
			else {
				out3();
			}
		}
		return 0;
	}
	
	public static int sc1(String s2,int answer) {
		int number3 ;
		if(s2.equals("+")) {
			 number3=(int)(Math.random()*1000);
			 return number3;
		}
		if(s2.equals("-")) {
			 number3=(int)(Math.random()*(answer));
			 return number3;
		}
		if(s2.equals("×")) {
			if(answer!=0) {
			number3=(int)(Math.random()*(1000/answer))+1;
			return number3;}
			else {
				number3=(int)(Math.random()*(1000));}
		}
		if(s2.equals("÷")) {
			if(answer==0) number3=(int)(Math.random()*1000)+1;
			else{int[] yin=yinshu(answer);
			number3=yin[(int)(Math.random()*(yin.length))];
			return number3;}
		}
		return 0;
	}```
已知一个数和运算符,如何生成符合条件的另一个数

### 3. 代码规范

请给出本次实验使用的代码规范:

- 第一条:在 if/else/for/while/do 语句中必须使用大括号。 即使只有一行代码,避免使用单行的形式: if (condition) statements;
- 第二条:表达异常的分支时, 少用 if-else 方式。如果非得使用 if()...else if()...else...方式表达逻辑,避免后续代码维护困难, 请勿超过 3 层
- 第三条:有 try 块放到了事务代码中, catch 异常后,如果需要回滚事务,一定要注意手动回滚事务
- 第四条:在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度
- 第五条:Java中,除了包名,静态常量等特殊情况,大部分情况下标识符使用骆驼法则,即单词之间不使用特殊符号分割,而是通过首字母大写来分割。
- 第六条:方法名首字母小写


## 五、测试
- 输入:10
              1(正确)
- 输入:10 0/001/asdad/   545 45 4/
			  1(请输入正确的题数)
- 输入:10
			1 0/001/asdasd/3(请输入正确的年级)
- 输入:10 0/001/wqd/     4554  5 6 /
			1 0/002/4/   1     /4  55  6/(请输入正确的题数与年级)
-输入:5
			3	结果:3 + 4 - 6 = 1,( 25 + 5 )✖ 60 = 1800, 45 + 55 ➗ 11 - 40 = 10		
## 六、总结
这次的作业是真的有点难好吧,主要问题是在如何正确生成符合条件的算式以及如何计算出正确的答案,最难的还是四个运算符的计算,包括括号的位置、怎么计算,情况复杂,这也是自己第一次花这么多时间在写一个代码作业上,也是第一次体会到了熬夜写代码的感受,这次的结对编程和之前也有所不同,通过和队友的沟通有时一些自己很难想到的方法很快就能有头绪,也能学到一些别人会而自己却没有掌握的东西,取长补短,所以与他人的沟通是很重要的总比自己一个人在一边苦想要更快有思路。
![](https://img2018.cnblogs.com/blog/1472494/201809/1472494-20180919193218736-543489498.jpg)