• 201871010105-曹玉中 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告


    项目 内容
    课程班级博客链接 班级博客
    这个作业要求链接 作业要求
    我的课程学习目标 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的效果。首先在结对编程中,因为有随时的沟通和交流,程序各方面的质量都取决于各方面水平较高的那位,这样,程序中的错误就会少得多,程序的质量就会高很多,这样写出来的软件比一个写出来的质量更加完善。其次,其中一位会的某个技术另一位会学习到,这样双方就同时拥有了一个新的知识,而且结对会激发双方的很多新的理念,提出更多的创意。最后,两人合作是坐在一起,交流方便,相互学习,共同进步,也更加懂得交流的技巧。

  • 相关阅读:
    日期格式图片在转换整个输入字符串之前结束
    查看Oracle的表中有哪些索引
    Oracle 中删除表后,表的索引,授权,同义词 会自动删除吗?
    Android自定义进度条颜色
    Android 属性动画(Property Animation) 完全解析 (上)
    开源项目地址
    Android Studio如何设置代码自动提示
    Android Studio 三种添加插件的方式,androidstudio
    强烈推荐android studio用的几个插件
    android studio 中的编码问题
  • 原文地址:https://www.cnblogs.com/nwnucyz/p/14604880.html
Copyright © 2020-2023  润新知