结队编程

软件工程实践第二次作业——结队编程

 

小学老师要每周给同学出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。

描述功能如下:

  1. 用户在输入出题个数后,软件会自动生成对应个数的题目;
  2. 题目由两个操作符构成,且没有给出答案;
  3. 题目的答案自动生成在工程目录下的文件中;
  4. 题目的答案大于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的窗口过程不是很理解,所以没有实现输入计算结果判断是否正确的功能(好像只能用窗口写)。虽然这次的作业花了很长时间(不是很熟悉代码(~ ̄▽ ̄)~), 但是对我收获颇多。

 

posted @ 2019-03-19 20:46  丁壹  阅读(224)  评论(0编辑  收藏  举报