结对编程 第二阶段

帅比萌擦擦* 提交于 2020-04-04 18:05:49

一、实验目标:

1)体验敏捷开发中的两人合作。

2)进一步提高个人编程技巧与实践。

二 、实验内容:

1)根据以下问题描述,练习结对编程(pair programming)实践;

2)要求学生两人一组,自由组合。每组使用一台计算机,二人共同编码,完成实验要求。

3)要求在结对编程工作期间,两人的角色至少切换 4 次;

4)编程语言不限,版本不限。建议使用 Python 或 JAVA 进行编程。

三、问题描述(二选一)

1)生命游戏

    生命游戏是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机,它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死亡的细胞。一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量。如果相邻方格活着的细胞数量过多,这个细胞会因为资源匮乏而在下一个时刻死去;相反,如果周围活细胞过少,这个细胞会因太孤单而死去。

    游戏在一个类似于围棋棋盘一样的,可以无限延伸的二维方格网中进行。例如,设想每个方格中都可放置一个生命细胞,生命细胞只有两种状态:“生”或“死”。图中,用黑色的方格表示该细胞为“死”, 其它颜色表示该细胞为“生” 。

    游戏开始时, 每个细胞可以随机地(或给定地)被设定为“生”或“死”之一的某个状态, 然后,再根据如下生存定律计算下一代每个细胞的状态:

  • 每个细胞的状态由该细胞及周围 8 个细胞上一次的状态所决定;

  • 如果一个细胞周围有 3 个细胞为生,则该细胞为生,即该细胞若原先为死则转为生,若原先为生则保持不变;

  • 如果一个细胞周围有 2 个细胞为生,则该细胞的生死状态保持不变;

  • 在其它情况下,该细胞为死,即该细胞若原先为生则转为死,若原先为死则保持不变。

2)开发一个自动生成小学四则运算题目的命令行 “软件”。实现 输入你要出题的个数,随机产生四则运算,然后用户回答,并且进行打分。

规则:用随机数实现100以内的加、减、乘、除运算,其中和与积不能超过100,差不为负(即须大减小),商不为小数或分数(即必须整除)。要求总计输出10个运算式,每输出一个运算式,等待输入结果,然后进行对错判断并输出。最后输出统计答对的题数与分

四、其他要求

1)在博客园https://www.cnblogs.com/注册个人账号,记录二个人的编程实现过程,遇到的问题及解决方法。

2)在github上托管二个人项目的代码,采用git对项目代码进行管理。

 

实验过程记录

1、代码规范

(1)代码编排

  ①缩进。4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格。
  ②每行最大长度79,换行可以使用反斜杠,最好使用圆括号。换行点要在操作符的后边敲回车。
  ③ 类和top-level函数定义之间空两行;类中的方法定义之间空一行;函数内逻辑无关段落之间空一行;其他地方尽量不要再空行。

(2)文档编排
  ①模块内容的顺序:模块说明和docstring—import—globals&constants—其他定义。其中import部分,又按标准、三方和自己编写顺序依次排放,之间空一行。
  ②不要在一句import中多个库。
  ③如果采用from XX import XX引用库,可以省略‘module.’,都是可能出现命名冲突,这时就要采用import XX。

 (3)空格的使用(总体原则,避免不必要的空格)

   ①各种右括号前不要加空格。

   ②逗号、冒号、分号前不要加空格。

   ③函数的左括号前不要加空格。
   ④序列的左括号前不要加空格。
   ⑤ 操作符左右各加一个空格,不要为了对齐增加空格。
   ⑥函数默认参数使用的赋值符左右省略空格。
   ⑦ 不要将多句语句写在同一行,尽管使用‘;’允许。
   ⑧if/for/while语句中,即使执行语句只有一句,也必须另起一行。

(4)注释

    ①总体原则,错误的注释不如没有注释。所以当一段代码发生变化时,第一件事就是要修改注释!
    ②注释必须使用英文,最好是完整的句子,首字母大写,句后要有结束符,结束符后跟两个空格,开始下一句。如果是短语,可以省略结束符。

(5)文档描述
   ①为所有的共有模块、函数、类、方法写docstrings;非共有的没有必要,但是可以写注释(在def的下一行)。
   ②如果docstring要换行。

(6)命名规范

   ①模块命名尽量短小,使用全部小写的方式,可以使用下划线。
   ② 包命名尽量短小,使用全部小写的方式,不可以使用下划线。
   ③类的命名使用CapWords的方式,模块内部使用的类采用_CapWords的方式。
   ④异常命名使用CapWords+Error后缀的方式。
   ⑤全局变量尽量只在模块内有效,类似C语言中的static。
   ⑥函数命名使用全部小写的方式,可以使用下划线。
   ⑦常量命名使用全部大写的方式,可以使用下划线。
   ⑧类的属性(方法和变量)命名使用全部小写的方式,可以使用下划线。
   ⑨类的属性若与关键字名字冲突,后缀一下划线,尽量不要使用缩略等其他方式。
   ⑩类的方法第一个参数必须是self,而静态方法第一个参数必须是cls。

 

2、程序的总体设计

 

 3、程序结对编程过程(附图)及功能实现情况(附代码和图)

       结对编程过程,同组成员陈莉同学对四则运算编程课题比较有经验,因此实验进行比较方便迅速,由我在来找主体代码,然后二人进行修改直到达到要求,两人商量代码以及修改编写过程中,是通过腾讯QQ平台进行屏幕远程控制以及语音通话进行的,在当前的特殊环境下虽然比较麻烦,但是还是克服了困难完成了本次结对编程主要的部分。本次结对编程与以往不同的是,我们要在github上托管代码,这是我们之前没有接触过的,因此对于github的一些操作我们也进行了充分的讨论,一开始两个人并不是很懂怎样在github上提交自己的代码,以及如何通过git把队友修改的代码弄到自己的电脑上,后来经过请教老师和同学也完成了这些。在这里谢谢他们!

下面是我们github上我们进行交互的截图

 

 

 一开始的源代码并不全面,因此这次我们结对编程的主要目的是完善代码,熟悉github操作,完成实验。我们组进行的主要讨论如下

第一次交互:由陈莉同学添加产生随机数和随机产生四则运算的代码,我负责负责通过桌面分享与语音通话进行审查。随机产生比较简单,只需添加随机函数就可以,所以这部分进行的比较迅速。由于第一次进行这样的实验,本次讨论进行时间较短,目的为了熟悉流程。

第二次交互:由我进行代码修改,负责控制和与积不能超过一百,除法整除的问题,陈莉同学负责审查。因为运算数是随机产生的0-100内的整数,并不知道哪一次产生的运算数符合要求,经过讨论,我们决定使用while循环来控制,和、积、求余作为循环条件,当和与积大于等于100且求余不等于0时,执行循环操作,直至产生符合条件的运算数,结果由return带回。这次由于我编程能力不足,并没有按照进程把代码修改成功,准备留到下一次由陈同学完成。

第三次交互:陈莉同学负责代码部分,我负责审查。本次交互是为了满足课题的差不能为负且整除的问题,我们引用了max()与min()函数来取其中的最大值与最小值,结果赋值给运算数。

第四次交互:此时代码基本功能已经可以基本是下,剩下的就是优化部分,代码部分由我负责,陈莉同学负责审查。按照课题要求,该程序要能输出使用者对了多少题目,错了多少题目以及最后得分,这部分不难,只需要定义两个变量控制题数与做对的题目,由输出函数printf输出即可。

 以下是两个人远程控制以及语音通话的截图

 

 课题要求功能的主要代码:

根据要求运算式的和与积不能超过100,差不为负(即须大减小),商不为小数或分数(即必须整除),主要代码:

if f == 0: # 加法

while n1 + n2 >=100:
n1 = random.randint(1, 100)

n2 = random.randint(1, 100)

result = int(n1 + n2)

elif f == 1: # 减法,要先比较大小,防止输出负数

n1, n2 = max(n1, n2), min(n1, n2)

result = n1 - n2

elif f == 2: # 乘法

while n1 * n2 >=100:
n1 = random.randint(1, 100)

n2 = random.randint(1, 100)

result = int(n1 * n2)

elif f == 3: # 除法,要比较大小,并循环取整除

n1, n2 = max(n1, n2), min(n1, n2)

while n1 % n2 != 0:
n1 = random.randint(1, 100)

n2 = random.randint(1, 100)

n1, n2 = max(n1, n2), min(n1, n2)

result = int(n1 / n2)

print(n1, ysf[f], n2, '= ', end='')

return result

随机产生运算式及运算数代码:

ysf = ['+', '-', '×', '÷']

f = random.randint(0, 3)

n1 = random.randint(1, 100)

n2 = random.randint(1, 100)

result = 0

结果输出代码:

m=0
n=10 #输出运算式的个数
while n>0:
result = szys()
j = input()
s = int(j)
if s == result:
print('right')
m = m + 1
else:
print('error.the answer is', result)
n=n-1
print('统计结果:','正确', m,'道题目,','错误', 10-m,'道题目。')
print('统计得分:',m*10,'分。')

程序运行截图

 

 4、项目github地址

https://github.com/Wuyusen-Niko/my-travel-plans

 

5. 实验总结

       原本两人商量,打算用C语言来完成,但是考虑到代码的简洁性,最终选择了python语言,python是一个非常方便实用的语言,这种语言在逐渐成为主流语言,相信未来一定会有很大的发展空间,以后我会对python语言进行更深入的学习,希望自己能掌握这门语言。其次就是github,这个平台是学了这门课之后第一次接触到,目前还对其功能不够了解希望在以后的学习中能更加熟练操作使用。

       最后是对结对编程的感想,这种编程方式很新颖,很能锻炼两个人的能力,而且这种编程方式不会让人感到无聊,反而能激起两个人的兴趣,让学习更加有趣,编程更加有意思。

(4)注释

    ①总体原则,错误的注释不如没有注释。所以当一段代码发生变化时,第一件事就是要修改注释!
    ②注释必须使用英文,最好是完整的句子,首字母大写,句后要有结束符,结束符后跟两个空格,开始下一句。如果是短语,可以省略结束符。

(5)文档描述
   ①为所有的共有模块、函数、类、方法写docstrings;非共有的没有必要,但是可以写注释(在def的下一行)。
   ②如果docstring要换行。

(6)命名规范

   ①模块命名尽量短小,使用全部小写的方式,可以使用下划线。
   ② 包命名尽量短小,使用全部小写的方式,不可以使用下划线。
   ③类的命名使用CapWords的方式,模块内部使用的类采用_CapWords的方式。
   ④异常命名使用CapWords+Error后缀的方式。
   ⑤全局变量尽量只在模块内有效,类似C语言中的static。
   ⑥函数命名使用全部小写的方式,可以使用下划线。
   ⑦常量命名使用全部大写的方式,可以使用下划线。
   ⑧类的属性(方法和变量)命名使用全部小写的方式,可以使用下划线。
   ⑨类的属性若与关键字名字冲突,后缀一下划线,尽量不要使用缩略等其他方式。
   ⑩类的方法第一个参数必须是self,而静态方法第一个参数必须是cls。

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!