软件工程实践第二次作业——结队编程
小学老师要每周给同学出300道四则运算练习题,要求:两个运算符,100以内的数字,不需要写答案。
1.结队编程中的分工:
代码编写:范杨(1759227)
复查代码、测试用例:丁文杰(1759224)
2.项目要求
①两个运算符
②100以内的数字
③不需要写出答案
④保证答案在0~100之间
⑤避免重复的题目
⑥具体定制(选择是否有乘除法、是否有括号、数值范围、加减有无负数、除法有无余数、是否支持分数、打印中每行的间隔可调整)
3.编写过程
3.1 编写前的分析:
这段程序我们选择使用JAVA语音进行编写,由于我们对JAVA还不是特别熟悉,而且有很多附加的要求,如具体定制等,编写前我们对其中一些要求并没有一个大致的算法构想,因此我们两人首先对如何编写这个代码进行了一系列的分析,把大致的算法代码构想清楚,并画了一个大致的流程图。
我们的估计编写时间为:基础功能(①~③)3小时,附加功能(④~⑥)6小时。
3.2 算法思想分析
①随机题目使用random函数进行数字和运算符号的随机输出。
②对产生的数字进行筛选,如果有减法运算,就让最后的结果f大于等于0;如果有除法运算,就让除法的结果没有余数。
③通过if让最后的结果处在0~100之间(不包括0,包括100)。
④把题目和答案用缓冲输出流输出到创建的result.txt文件中。
3.3编写及复查代码
本程序是使用了结队编程的方法,由范杨进行代码的编写,当范杨编写一部分代码后,再由丁文杰对代码进行复查,提出其中的一些问题,再由范杨进行修改。
复查过程中也遇到了一些问题。比如在对计算结果处在0~100中进行筛选的时候,由于是先出100道题,再对答案answer进行筛选,因此运行程序后,题目的数量会不足100题等问题。(*更多的问题详见 6.遇到的问题及解决方案)。
4.代码
4.1程序代码
import java.io.BufferedWriter; import java.io.FileWriter; import java.util.Scanner; public class calculator { public static void main(String[] args) throws Exception { int x, y, i=0; int d1 = 0; System.out.println("请输入题目的数量"); BufferedWriter BufferedWriterbw = new BufferedWriter(new FileWriter("result.txt")); BufferedWriterbw.write("begin\r\n"); Scanner scan2 = new Scanner(System.in); x = scan2.nextInt(); y=100; while(i<x) { int a = (int) (Math.random() * y);// 随机生成一个1-10的整数 int b = (int) (Math.random() * y);// 随机生成一个1-10的整数 int e = (int) (Math.random() * y);// 随机生成一个1-10的整数 int c = (int) (Math.random() * 4);// 随机生成一个1-4的整数,0表示加法,1表示减法,2表示乘法,3表示除法 if (c == 0) { d1 = a + b+ e; if(d1<=100&&d1>0) { i++; System.out.print(a + "+" + b + "+" + e + "= \n" ); BufferedWriterbw.write( a + "+" + b + "+" + e + "=" +d1+"\r\n" ); } } if (c == 1) { d1 = a -b +e; int f = a - b; if(d1<=100&&d1>0&&f>=0) {i++; System.out.print(a + "-" + b + "+" + e + "= \n" ); BufferedWriterbw.write( a + "-" + b + "+" + e + "=" +d1+"\r\n" ); } } if (c == 2) { d1 = a * b + e; if(d1<=100&&d1>0) {i++; System.out.print(a + "*" + b + "+" + e + "= \n" ); BufferedWriterbw.write(a + "*" + b + "+" + e + "=" +d1+"\r\n" ); } } if (c == 3) { if(b!=0) { d1 = a / b * e; int h = a%b; if(d1<=100&&d1>0&&h==0) {i++; System.out.print(a + "/" + b + "*" + e + "= \n" ); BufferedWriterbw.write(a + "/" + b + "*" + e + "=" +d1+"\r\n" ); } } } /*if ((i + 1) % 3 == 0) { System.out.println(); }*/ } BufferedWriterbw.flush(); BufferedWriterbw.close(); scan2.close(); } }
4.2 运行结果
(自动生成的计算题)
(目录下会生成一个result.txt文件)
(result.txt文件中保存着含有答案的题目)
5.测试用例
该测试用例为黑盒测试用例,假设用户使用的操作系统为Win8。
描述功能如下:
- 用户在输入出题个数后,软件会自动生成对应个数的题目;
- 题目由两个操作符构成,且没有给出答案;
- 题目的答案自动生成在工程目录下的文件中;
- 题目的答案大于0且小于等于100。
表5-1 软件测试用例
用例ID | Cal-test-01 | 用例名称 | 计算题生成软件 | ||||
用例描述 | 1. 用户在输入出题个数后,软件会自动生成对应个数的题目; 2.题目由两个操作符构成,且没有给出答案; 3.题目的答案自动生成在工程目录下的文件中; 4.题目的答案大于0且小于等于100。 | ||||||
用例入口 | 打开客户端文件,进入界面 | ||||||
| |||||||
测试用例ID | 场景 | 测试步骤 | 预期结果 | 实际结果 | |||
Cal1 | 软件界面 | 打开客户端 | 显示“请输入题目的数量”; | 与预期一致 | |||
Cal2 | 输入题目数量 | 输入题目数量100 | 显示100道计算题,题目由2个运算符构成,且没有答案; | 与预期一致 | |||
Cal3 | 题目答案文件 | 打开题目答案文件 | 显示100道计算题,且有答案 | 与预期一致 | |||
6.遇到的问题及解决方案
在进行结队编程过程中,我们也遇到了一系列的问题,好在经过讨论后,问题还是得到了解决。
① 在代码编写前,我们就“谁来编代码”进行了一番讨论,由于我俩的编程能力都不是很强,为了更好的完成作业,我们在激烈的讨论后选择由范杨来编代码,由丁文杰进行代码复查以及测试;并且我们在用什么语言进行编写代码的问题上也产生分歧,不过最后还是决定使用刚刚学习了没多久的JAVA来编写这个程序。
② 由于学艺不精,我们在一些很奇怪的地方遇到了困难,导致项目的进程被拖延,远远超出原本预计的9小时,花费了许多时间。
③ 因为eclipse没有自动添加包语句,所以出现运行错误
因此在package后面添加语句:
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.util.Scanner;
④ 由于自己学艺不精,在编写完程序之后,没有关闭输出流,虽不会影响程序的运行,结果不会改变,但是每次出题都会占用空间,导致空间上的浪费。
改正:
添加语句:
BufferedWriterbw.flush();
BufferedWriterbw.close();
scan2.close();
⑤ 起初用for循环来控制题目的数量,但只能仅仅控制数量,无法实现答案在0~100之间,虽然可以用if语句来控制,但是无法保证规定的题目数量,因为它先出题再筛选,以至于最后出的题目数不能等于规定的数量。
改正:
7.心得体会
- 本次的作业是通过结队编程完成一个程序,在之前大一小学期的时候,我们也是进行过结队编程的,当时也是两个人一组编写一个小程序,但是当时并没有结队编程的意识,不过也能算是结队编程吧。在学习了软件测试以及软件工程实践这两门课后,我也对结队编程有了一个大致的了解。
- 也许有的人会说两个人结队编程效率没有自己一个人编程来的快,我认为这只针对那些“编程大佬”而言,一个人编程有时确实非常有效率,因为没有任何其他人比自己更了解自己的代码了。而对于我们这些“菜鸟”而言,在编写代码过程中往往会产生非常多的bug,有时候一些bug一个人需要思考很久才能解决,这时候结队编程就非常有效率了,有第二个人帮你复查代码,进行软件测试,bug的出现率也会降低很多,编程的效率也大大提高了。
- 但是起初刚开始结队编程时,虽然是和非常熟悉的同学组队进行编程,但还是产生了一些分歧,包括用什么语言来编写等问题。
- 然而,本次编程也存在一些不足,最大的不足之处就是对项目预估时间的不足,由于是一个不大的小程序,我们就预计在13小时左右能完成,而实际情况却远远超过这个时间,当我们结束这项作业后,也进行了反思,为什么会比预计的时间久呢?最大的原因就是对知识运用的不足,虽然最终的代码并不长,但是我们在进行附加功能时,我们遇到了瓶颈,思考了很久,也尝试了很多方法,修改了许多bug,大大超出了我们所预估的时间;其次就是我们编写的代码量实在是太少了,因此我们没有很多的经验去估计编写一个代码所需要的时间,也就是经验的不足。
- 总的来说,结队编程是一个非常好的编程方式,大大的提高了我们编程的效率,虽然刚开始的时候会有些不顺利,但那也只是没有磨合好,在结队编写一段时间代码后,效率就会马上提高。虽然这只是我的预估,也许并不准确,但是我认为就本段代码而言,结队编程的效率要比自己编程高了一倍左右,因此我认为这是一种很好的编程方式。
- 丁文杰:结队编程不仅让我编程的效率提高了,而且也让我从结队的同学那学到了许多。不仅仅是我的编程能力得到提高了,更重要的是相互沟通,相互合作的能力得到了提高。虽然作业做完了,但是我也反思自己,为何程序完成的进度要比预期的慢呢?在这个项目中,我对团队的贡献有多少呢?
- 范杨:本来一开始对编代码是很反感的,起初我就对代码不怎么感兴趣,因为觉得C/C++太难学习了,而且编起来很复杂(主要是这两种语言不吸引我@_@),但是这次的结对编程作业似乎对我有很大的帮助,第一次觉得JAVA相对于其他语言写起来没那么长(复杂)。起初我和丁文杰在纠结谁写代码,用什么语言写,由于两个人都不是很擅长编程,但最后经过一番商量之后,我还是选择使用java语言,也只能实现混合四则运算,因为java的窗口过程不是很理解,所以没有实现输入计算结果判断是否正确的功能(好像只能用窗口写)。虽然这次的作业花了很长时间(不是很熟悉代码(~ ̄▽ ̄)~), 但是对我收获颇多。