项目 内容
课程班级博客链接 班级博客
这个作业要求链接 作业要求
我的课程学习目标 1.体验软件项目开发中的两人合作,练习结对编程(Pair programming)。
2.掌握Github协作开发程序的操作方法。
这个作业在哪些方面帮助我实现学习目标 1.熟练结对编程过程
2.两人结对易于实现过程
项目Github的仓库链接地址 我的仓库
结对编程对象 陈园园-201871010104
结对方本次作业 博客作业
任务1:阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念;
  • 已阅读完,相关概念如下:
    • 1、代码风格规范
        (1)代码风格的原则是:简明,易读,无二义性。
        (2)缩进:4个空格,不用Tab键是因为在不同的情况下显示的长度可能不一样。
        (3)行宽:限定为100字符。
        (4)括号:在复杂的条件表达式中,可以清晰地表示逻辑优先级。
        (5)断行与空白的{}行:断行在程序调试时可以清晰的表达变量的变化情况,{}来判断程序的结构。
        (6)分行:不要把多个变量定义在一行上。
        (7)命名:
          ①在变量名中不要提到类型或其他语法方面的描述。
          ②避免过多的描述。
          ③如果信息可以从上下文中得到,那么此类信息就不必写在变量名中。
          ④避免可要可不要的修饰词。
        (8)下划线:用来分割变量名字中的作用域标注和变量的语义。
        (9)大小写:
          ①所有类型/类/函数名都用Pascal形式(所有单词第一个字母都大写)。
          ②所有变量都用Camel形式(第一个单词全部小写,随后单词用Pascal形式)。
          ③类/类型/变量:名词或组合名词。
          ④函数则用动词或动宾组合词来表示。
        (10)注释:注释是为了解释程序做什么(What),为什么这样做(Why)以及要特别注意的地方。
    • 2、代码设计规范
        (1)概念:代码设计规范不光是程序书写的格式问题,而且涉及到程序设计、模块之间的关系、设计模式等方方面面,又有不少内容与具体程序设计语言息息相关(如C,C++,JAVA,C#),但是也有通用的原则。
        (2)函数:原则:只做一件事,并且要做好。
        (3)goto:函数最好有单一出口,为了达到这一目的,可以使用goto。
        (4)错误处理:
          ①参数处理:在Debug版本中,所有的参数都要验证其正确性,在正式版本中,对从外部(用户或别的模块)传递过来的参数,要验证其正确性。
          ②断言:验证正确性就要用断言。
        (5)如何处理C++中的类
          ①类:
            a.使用类来封装面向对象的概念和多态。
            b.避免传递类型实体的值,应该用指针传递。换句话说,对于简单的数据类型,没有必要要用类来实现。
            c.对于有显示的构造和析构的类,不要建立全局的实体,因为不知道它们在何时创建和消除。
            d.仅在有必要时,才是用“类”。
          ②class vs.struct:如果只是数据的封装,用struct即可。
          ③公共/保护/私有成员:按照这样的次序来说明类中的成员。
          ④数据成员:
            a.数据类型的成员用m_name说明。
            b.不要使用公共的数据成员,要用inline访问函数,这样可兼顾封装和效率。
          ⑤虚函数
            a.使用虚函数来实现多态。
            b.仅在很有必要时,才使用虚函数。
            c.如果一个类型要实现多态,在基类中的析构函数应该是虚函数。
          ⑥构造函数
            a.不要在构造函数中做复杂的操作,简单初始化所有成员即可。
            b.构造函数不应该返回错误。
          ⑦析构函数
            a.把所有的清理工作都放在析构函数中。如果有些析构函数在之前就释放了,要重置这些成员为0或NULL。
            b.析构函数也不应该出错。
          ⑧new和delete
            a.如果可能,实现自己的new/delete,这样可以方便地加上自己的跟踪和管理机制。自己的new/delete可以包装系统提供的new/delete。
            b.检查new的返回值。new不一定都成功。
            c.释放指针时不用检查NULL。
          ⑨运算符
            a.在理想情况下,我们定义的类不需要自定义操作符。确有必要时,才会自定义操作符。
            b.运算符不要做标准语义之外的任何动作。
            c.运算符的实现必须非常有效率,如果有复杂的操作,应定义一个单独的函数。
            d.当拿不定注意时,用成员函数,不要用运算符。
          ⑩异常
            a.不要用异常作为逻辑控制来处理程序的主要流程。
            b.当使用异常时,要注意在什么地方清理数据。
            c.异常不能跨过DLL或进程的边界来传递消息,所以异常不是万能的。
          ⑪类型继承
            a.仅在有必要时,才使用类型继承。
            b.用const标注只读的参数。
            c.用const标注不改变数据的函数。
    • 3、代码复审:看代码是否在代码规范的框架内正确的解决了问题。代码复审的形式包括:自我复审、同伴复审、团队复审。
    • 4、结对编程:结对编程中有两个角色:领航员和驾驶员。在个人编写的过程中,很多人喜欢根据个人喜好来规定代码规范,而且存在的bug自己难以发现,因此,在结对编程时,我们可以互换角色,在开始写代码之前,规定两个人都认可的一套代码规范,并且不间断地进行复审,以减少软件中存在的问题,修复bug,提高软件质量。
任务2:两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价,具体要求如下:

image

任务3:采用两人结对编程方式,设计开发一款D{0-1}KP 实例数据集算法实验平台,使之具有以下功能:
  • 1.需求分析
    遗传算法作为当今一个比较热门的研究方向,在解决最优化问题上有着良好的作用。遗传算法利用基因编码,对其进行生成、杂交、变异、选择等操作,产生不同的基因序列,使解一步一步向最优解逼近。
    背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。相似问题经常出现在商业、组合数学,计算复杂性理论、密码学和应用数学等领域中。也可以将背包问题描述为决定性问题,即在总重量不超过W的前提下,总价值是否能达到V。
    已知n个物体的容积及其价值分别为w_i 和c_i (i=1,2, …,n),背包的总容量为v。问:选择哪些物品 装入背包可以使背包在满足容量限制的前提下总价值最大?

  • 2.问题
    可选择的物品有50件,其价值c和重量v分别为
    c{220,208,198,192,180,180,165,162,160,158,155,130,125122,120,118,115,110,105,101,100,100,98,96,95,90,88,82,80,77,75,73,72,70,69,66,65,63,60,58,56,50,30,20,15,10,8, 5,3,1}
    w{80,82,85,70,72,70,66,50,55,25,50,55,40,48,50,32,22,60,30,32,40,38,35,32,25,28,30,22,50,30,45,30,60,50,20,65,20,25,30,10,20,25, 15,10,10,10,4,4,2,1}
    背包的总量不能超过1000,求解背包所能装下的最大的价值是多少

  • 3.解决思路
    利用遗传算法时,可以随机生成一个长度为50的0-1序列,其中1表示对应位置的物品装进背包,0表示对应物品不装进背包,需要注意的是,生成的序列有可能超过背包的总重量,不满足约束条件,此时需要对序列进行操作。可行的操作有两种,第一种是对于不满足约束条件的序列进行抛弃,第二种是对其进行贪心算子变换,具体操作如下:
    (1)对所有 x_1=1 的物品,按它们的价值密度排序,形成队列b(i);
    (2)依次放入价值密度最大的物品,并判断是否有超出背包限定的范围;
    (3)如果超出,则将价值密度序列中从这个位置之后的所有商品置0;

  • 4.PSP展示
    image

  • 5.部分代码
    image
    image

  • 6.部分结果
    image

  • 任务分工及结对过程

    • 结对过程
      image

    image

    • 分工
      前期的需求分析和解决方案等是两个人一起讨论完成的,PSP部分由陈园园完成,程序的复核一起完成,由于我们的编程能力有很大不足,所以部分功能未实现。
总结

两人合作真的能够带来1+1>2的效果吗?对于这个问题通过此次的结对编程体验,我认为两人合作能够带来1+1>2的效果。首先在结对编程中,因为有随时的沟通和交流,程序各方面的质量都取决于各方面水平较高的那位,这样,程序中的错误就会少得多,程序的质量就会高很多,这样写出来的软件比一个写出来的质量更加完善。其次,其中一位会的某个技术另一位会学习到,这样双方就同时拥有了一个新的知识,而且结对会激发双方的很多新的理念,提出更多的创意。最后,两人合作是坐在一起,交流方便,相互学习,共同进步,也更加懂得交流的技巧。

posted on 2021-04-14 09:50  曹玉中-201871010105  阅读(55)  评论(0编辑  收藏  举报