结对编程1

结对作业1

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

一、预估与实际

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;
	}```
已知一个数和运算符,如何生成符合条件的另一个数,其中SC1是求运算符后面的数,SC2是求前面的数

### 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/1480191/201809/1480191-20180920232136620-450682989.png)

posted on 2018-09-20 23:23  世界第一楠木殿下  阅读(160)  评论(0编辑  收藏  举报

导航