第四周作业

第四周作业任务

一、理论学习

1、完成了《软件工程》第4、5章的学习

           第四周作业_第1张图片

第四周作业_第2张图片

 

2、完成了《构建之法》讲义中“软件过程”和“团队中角色与合作”的学习

  过程方法是系统的识别和管理组织内所使用的过程,以保证更有效的获得期望的结果。是一个组织和管理工作活动的有效手段,其目的是更好的为用户创造价值。管理过程,实现过程,支持过程是实现软件开发必不可少的步骤。软件过程是为了开发高质量软件而产生的活动,其中包括问题定义、需求开发、软件设计、软件构造和软件测试等一系列实现活动。软件开发过程中的模型包括瀑布模型、原化模型、迭代式模型和可转换模型。随着互联技术和应用的快速发展,软件开发过程面临着越来越多的挑战,这时候开发了现在比较流行的敏捷开发过程,采用增量和迭代的开发过程,强调团队额的紧密协作,是一种有效的开发过程方法。

  在面对越来越复杂化的需求以及市场竞争日趋激烈的情况下,团队开发产生的合力更能发挥团队中每个人的优势,更有效率,更高品质的实现软件开发的过程。其中团队开发分为萌芽阶段、磨合阶段、散伙阶段、规范阶段以及创造阶段。经过正确的引导,一个团队在优秀领导人的带领下能绽放出比个人多得多的光芒来。

 

二、实践学习

  本次实践练习是由我和陆遥共同协作完成,在确定分组并经过经过商讨后,我们决定以码云作为我们的共同开发平台,并建立了一个共同操作的代码仓库https://gitee.com/lixiaohua_03/joint_development_project。在随后一段时间的讨论中,我们决定本周的操作对象为陆遥编写的计算器程序。由于我初学python时对语言不够熟悉,没能完成计算器程序的编程任务,所以除了学会共同操作同一仓库,熟悉协作开发外,本次实践的另一目的是帮助我熟悉并学会计算器程序的编写以及进一步优化该计算器程序。仓库的具体提交记录如下:

第四周作业_第3张图片 

  根据本次实践学习的目的,我们分工如下:我负责为该程序进行详细的注解,添加说明文档,以及简单修改该程序以增加可读性;陆遥负责对该程序进一步优化,包括逻辑部分的优化,程序bug的消除等。具体内容如下:

1、构建共同的代码仓库并进行协同操作的测试: 

第四周作业_第4张图片

2、由于原程序比较复杂,逻辑性很强,并且没有相关注解,在阅读的过程中很难理解,因此我修改了calulation函数中判断语句的顺序以增强程序的可读性,随后为该程序添加了更详细的注解。部分修改如下图所示: 

 第四周作业_第5张图片

3、完成注释后陆遥对整个程序进行了优化,主要修复了不能计算带空格算式的问题;优化了sys和decimal模块的引用以及删除了部分重复性语言等内容。部分修改内容如下: 

  

4、我对完善后的程序撰写了帮助理解的阅读说明,内容如下:

第四周作业_第6张图片

5、最终得到的程序代码如下:

  1 # -*- coding: utf-8 -*-
  2 # Author: Lu Yao and Li Xiaohua
  3 from sys import argv
  4 from decimal import Decimal, getcontext, InvalidOperation
  5 
  6 
  7 def del_blank(temp_exp):  # 删除算式中的空格
  8     no_blank = ""
  9     for i in temp_exp:
 10         if i != " ":
 11             no_blank = no_blank + i
 12     return no_blank
 13 
 14 
 15 def priority(operator_1, operator_2):  # 判断运算符的优先级
 16     priority_array = (
 17         # '+'   '-'   '*'  '/'  '('   ')'   '^'  '#'
 18         ('>', '>', '<', '<', '<', '>', '<', '>'),  # '+'
 19         ('>', '>', '<', '<', '<', '>', '<', '>'),  # '-'
 20         ('>', '>', '>', '>', '<', '>', '<', '>'),  # '*'
 21         ('>', '>', '>', '>', '<', '>', '<', '>'),  # '/'
 22         ('<', '<', '<', '<', '<', '=', '<', ' '),  # '('
 23         ('>', '>', '>', '>', ' ', '>', '>', '>'),  # ')'
 24         ('>', '>', '>', '>', '<', '>', '>', '>'),  # '^'
 25         ('<', '<', '<', '<', '<', ' ', '<', '=')  # '#'
 26     )
 27     operator_num = {
 28         '+': 0,
 29         '-': 1,
 30         '*': 2,
 31         '/': 3,
 32         '(': 4,
 33         ')': 5,
 34         '^': 6,
 35         '#': 7
 36     }
 37 
 38     return priority_array[operator_num[operator_1]][operator_num[operator_2]]
 39 
 40 
 41 def operation(num_1, num_2, operator):  # 定义两个数的基本运算
 42     if operator == '+':
 43         result = num_1 + num_2
 44     elif operator == '-':
 45         result = num_1 - num_2
 46     elif operator == '*':
 47         result = num_1 * num_2
 48     elif operator == '/':
 49         if num_2 == 0:
 50             result = "VALUE ERROR"
 51         else:
 52             result = num_1 / num_2
 53     elif operator == '^':
 54         if num_1 == 0 and num_2 == 0:
 55             result = "VALUE ERROR"
 56         else:
 57             result = num_1 ** num_2
 58     return result
 59 
 60 
 61 def calculation(real_exp):  # 对整个算式的运算
 62     real_exp = real_exp + '#'  # 以运算优先级最低的'#'作为结尾,用来触发没有括号后的运算
 63     operator_set = "+-*/^()#"
 64     stack_of_operator, stack_of_num = ['#'], []
 65     position, temp_answer, index, length = 0, 0, 0, len(real_exp)
 66     while index < length:  # 将一个数值存在一个列表中等待运算
 67         symbol = real_exp[index]
 68         if symbol not in operator_set:
 69             position = index
 70             while not real_exp[index] in operator_set:
 71                 index = index + 1
 72             temp = real_exp[position:index]
 73             last = index - 1
 74             if '.' in temp:
 75                 while real_exp[last] == '0':
 76                     last = last - 1
 77                 temp = real_exp[position:last + 1]
 78             try:
 79                 temp = Decimal(temp)
 80             except InvalidOperation:
 81                 return "INPUT ERROR"
 82             stack_of_num.append(temp)
 83         else:  # 判断最新运算符与前一运算符的优先级,若优先级高继续进行循环,若优先级底,进行上一级运算
 84             top_operator = stack_of_operator.pop()  # 运算规则是先作最里面括号的运算,然后作外面括号的运算,整个运算结束
 85             compare = priority(top_operator, symbol)
 86             if compare == '>':
 87                 try:
 88                     num_2 = stack_of_num.pop()
 89                     num_1 = stack_of_num.pop()
 90                 except IndexError:
 91                     return "FORMAT ERROR"
 92                 temp_answer = operation(num_1, num_2, top_operator)
 93                 if temp_answer == "VALUE ERROR":
 94                     return temp_answer
 95                 stack_of_num.append(temp_answer)
 96             elif compare == '<':
 97                 stack_of_operator.append(top_operator)
 98                 stack_of_operator.append(symbol)
 99                 index = index + 1
100             elif compare == '=':
101                 index = index + 1
102             elif compare == ' ':
103                 return "FORMAT ERROR"
104 
105     if len(stack_of_num) == 1 and stack_of_operator == []:
106         return stack_of_num.pop()
107 
108 
109 def main():
110     target_exp = ""
111     for i in range(len(argv) - 1):
112         target_exp += argv[i + 1]
113     getcontext().prec = 10
114     target_exp = del_blank(target_exp)
115     answer = calculation(target_exp)
116     print(answer)
117 
118 
119 if __name__ == "__main__":
120     main()

 

  我们经过讨论,选择了“石墨文档”进行在线协同的文档编辑,实践学习部分的内容就是我们共同在线编写的,链接为:https://shimo.im/docs/J8GK99HpPcx86PPC。同时,我们还选定了“坚果云”作为软件开发流程图的在线编辑工具,为后面的软件开发做好准备

  总结通过过本次实践,我们学会了如何双人合作对代码进行编写,可能起初双方交流太少,走了一些弯路。刚开始我建立了组织和一个共同操作的仓库,没有将陆遥同学纳入管理员,陆遥同学是采用fork + pull request的方法来进行代码的协同编辑,但是在提交的过程中时时会发生冲突(这是由于在fork的仓库修改代码的时候,被fork父仓库内的同一个文件的代码发生了变化,所以发生了冲突)。通过一步步的商量解决问题,由于只有两人,我们决定采用双方都是管理员的方式,来直接对一个代码仓库进行管理。我们自己的IDE下,会在每次修改代码前先pull一下,再进行编辑,而且尽可能的在双方都不重合的时间段去修改代码,如果不能避免时间段重合,那么一旦上传出错,可以merge上传;如果还不行,就pull,手动合并再上传。这样能有效避免两人协同进行软件开发的冲突。最终在熟悉流程之后,双方能共同协作,互相帮助,顺利完成了本次任务,可以说学有所获。

 

三、学习记录

学习阶段 学习内容 学习收获
2019.3.10 14:00-17:00 软件工程

对软件过程和软件模型有了基本了解

2019.3.11 14:00-17:00 《构建之法》讲义 了解团队开发的过程以及成长阶段
2019.3.12 14:00-17:00 python基础学习 学习python的基本语法
2019.3.14 09:00-17:00 实践学习 学会协作开发软件
2019.3.15 09:00-2100

 

实践学习

学会网上协作开发软件以及共同编辑文档

 

 

 

 

 

 

 

 

 

 

 

 

 

四、总结

  在本周学习过程中我了解了什么是软件的过程方法以及相关的过程模型。学会了如何进行现阶段较为流行的敏捷开发过程。并且通过合作,和陆遥同学共同建立了仓库,共同完成了对计算器程序的修改,对我个人的能力提升很大,同时也明白了双人协作开发的优势,可谓受益匪浅。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

你可能感兴趣的:(第四周作业)