豪文丶

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、具体情况概要

结对编程成员:1759221周文豪、1731519张杨

结对编程项目:小学老师要每周给同学出300道四则运算练习题

项目实现所用编程语言:Python3

项目预计完成时间:2-3小时

项目实际完成时间:3小时(编程)+1小时(问题分析+实验报告等)

 

二、结对编程概要

定义:结对编程(Pair Programming)是软件开发过程中所使用的一种技术,两名程序开发人员共享同一台工作站。其中一个扮演驾驶者(Driver)的角色,进行代码编写,另一个扮演观察员(Observer)或导航员(Navigator)的角色,对代码进行评测。

现状:结对编程的概念已经存在很长一段时间,已经有许多公司认同这种编程方式,但也有许多公司表示他们不考虑采用。原因是结对编程需要花费的时间可能比个人编程更长,但产生的 bug 比个人编程少;它需要公司付出多一倍的人力,但编程的效率会比个人编程高。所以这是一个比较有争议的编程方式,不同公司的需求不同,对结对编程的看法就不一样。

正因为结对编程有其自身优缺点鲜明的特点才会有争议,因此在结对编程开始之前我和张杨先了解其优缺点:

优点:

1、互相鼓励,不容易心态爆炸

2、互相监督,不易偷懒

3、互相学习编程技巧,能力互补

4、多双眼睛,少点 bug  等等...

缺点:

1、与合不来的人一起编程容易发生争执 

2、一山不容二虎,开发者之间可能就某一问题发生分歧,造成不必要的内耗

3、开发人员可能会在工作时交谈一些与工作无关的事,分散注意力,造成效率低下  等等...

在了解结对编程优缺点以后我和张杨对结对编程有了更充分的认识,在接下来的编程中会尽量有意识的避免发生影响效率的事,即使出现分歧也会迅速探讨并得出结论继续编程。

 

三、源码

import random
import os
os.chdir("/home/hao/Documents")
f=open('arithmetic.txt','a')
x=0
z='='
var=1
while var == 1:
    a = random.randint(1, 100)
    b = random.randint(1, 100)
    c = random.randint(1, 100)
    d = random.choice('+-*/')
    e = random.choice('+-*/')
    if d == '+' and e == '+':
        if a + b + c <= 100:
            f.write(str(a) + d + str(b) + e + str(c) + z + '\n')
            x += 1
    elif d == '+' and e == '-':
        if a + b - c <= 100 and a + b - c >= 0:
            f.write(str(a) + d + str(b) + e + str(c) + z + '\n')
            x += 1
    elif d == '+' and e == '*':
        if a + b * c <= 100:
            f.write(str(a)+d+str(b)+e+str(c)+z+'\n')
            x += 1
    elif d == '+' and e == '/':
        if b % c == 0 and a + b / c <= 100:
            f.write(str(a) + d + str(b) + e + str(c) + z + '\n')
            x += 1
    elif d == '-' and e == '+':
        if a - b + c <= 100 and a - b + c >= 0:
            f.write(str(a) + d + str(b) + e + str(c) + z + '\n')
            x += 1
    elif d == '-' and e == '-':
        if a - b - c <= 100 and a - b - c >= 0:
            f.write(str(a) + d + str(b) + e + str(c) + z + '\n')
            x += 1
    elif d == '-' and e == '*':
        if a - b * c <= 100 and a - b * c >= 0:
            f.write(str(a) + d + str(b) + e + str(c) + z + '\n')
            x += 1
    elif d == '-' and e == '/':
        if b % c == 0 and a - b / c <= 100:
            f.write(str(a) + d + str(b) + e + str(c) + z + '\n')
            x += 1
    elif d == '*' and e == '+':
        if a * b + c <= 100:
            f.write(str(a) + d + str(b) + e + str(c) + z + '\n')
            x += 1
    elif d == '*' and e == '-':
        if a * b - c <= 100 and a * b - c >= 0:
            f.write(str(a) + d + str(b) + e + str(c) + z + '\n')
            x += 1
    elif d == '*' and e == '*':
            if a * b * c <= 100:
                f.write(str(a) + d + str(b) + e + str(c) + z + '\n')
                x += 1
    elif d == '*' and e == '/':
        if (b % c == 0 or a % c == 0) and a * b / c <= 100:
            f.write(str(a) + d + str(b) + e + str(c) + z + '\n')
            x += 1
    elif d == '/' and e == '+':
        if a % b == 0 and a / b + c <= 100:
            f.write(str(a) + d + str(b) + e + str(c) + z + '\n')
            x += 1
    elif d == '/' and e == '-':
        if a % b == 0 and a / b - c <= 100 and a / b - c >= 0:
            f.write(str(a) + d + str(b) + e + str(c) + z + '\n')
            x += 1
    elif d == '/' and e == '*':
        if (a % b == 0 or (a * c) % b == 0) and a / b * c <= 100:
            f.write(str(a) + d + str(b) + e + str(c) + z + '\n')
            x += 1
    elif d == '/' and e == '/':
        if b!=c and b!=1 and c!=1:
            if (a%b==0 and (a/b)%c==0) or (a%c==0 and (a/c)%b==0):
                f.write(str(a) + d + str(b) + e + str(c) + z + '\n')
                x+=1
    if x == 300:
            break
f.write('\n')
f.close()

 

四、运行结果

(1)程序编译成功截图

 

(2)在txt文件里的输出片段截图

 

 

五、遇到的问题

已解决问题和细节:

1、在开始的时候,我们在百度上搜索出来等号并不是运算符,出于严谨考虑,最后我们决定出的四则运算题是有三个数字和两个运算符(加减乘除)的混合运算题

2、通过多个随机函数来取多个不同的随机数避免了题目的重复

3、可定制:输出的题目都保存在了txt文件里,可以直接打印,且输出每三百题之间留有间隔

4、因为服务对象是小学生,所以我们确保出的每道题目中的除法都没有余数,同时也意味着不支持分数

5、加减时的最终结果一定大于等于0且小于等于100(中间结果可能大于100或小于0)

未解决问题和细节:

1、通过反复测试发现随机出的题中,有些种类混合运算题如连乘题(a*b*c)出现的概率过于低(因为结果要在100以内),暂时还无法平衡混合运算题中各种题目出现的概率

2、由于水平有限,我们并不能在题目里加上括号

3、可拓展性仍需商榷

 

六、思考及反思

编程完以后我和张杨认真思考了一下我们写的程序得出以下结论

(1)优点是:经过编程时的反复测试得出严谨性较高的判断条件,基本保证不会出现错题

(2)缺点是:判断条件太多显得整段程序比较low,可读性不高,计算量偏大,写完以后发现可以通过switch语句优化程序

(3)可扩展性:以后我们可以写一个客户端,让学生可以在客户端上做题并判断对错,且每个人做的题目都不会重复

 

七、心得体会

  通过这次作业,切实体验到了结对编程的过程,我们发现,在我们得出设计思路,并将它们初次转化成代码后,其实只完成了一部分。由于个人的疏忽,输入的错误,以及设计思路的偏差,往往会让我们的程序出现bug,修改bug会消耗我们大量的时间。而结对编程的好处就在于此,由于身边有个领航员角色的存在,在编写代码时,一旦出现输入错误,就会有人及时的提醒。不仅如此,在设计代码时,有个同伴可以一起讨论,融合两个人不同的见解和观点,我们往往可以得出更加准确且更加高效的设计思路。就我们本次实验的编程而言,有了领航员的存在,我们在完成代码后,几乎没有花什么时间在修改bug上,这提高了我们编程的效率,而且我们二人一起讨论出来的编程思路,也使得我们的代码功能更全面,更严谨。所以我们认为,结对编程的优势主要就在于设计思路的共享,还有及时修改自己在编程时犯下的小错误,这些错误在另一个人眼中会十分明显。而且两人轮流编程,不会太过疲惫,结对编程可以很大程度上提高编程效率,因此十分适合敏捷开发。如果未来我们从事软件开发的工作,我们会十分乐于进行结对编程,因为这会极大的改善我们的编程体验。

 

posted on 2019-03-20 00:08  豪文丶  阅读(125)  评论(0编辑  收藏  举报