黎沫

导航

201871010119-帖佼佼 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

项目 内容
课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST/
这个作业要求链接 https://www.cnblogs.com/nwnu-daizh/p/14604444.html
我的课程学习目标 (1)了解软件开发的流程。
(2) 掌握PSP流程。
(3)掌握Github发布软件项目的操作方法。
这个作业在哪些方面帮助我实现学习目标 (1)提高自己的编程能力;
(2)软件开发流程方面
(3)掌握github编写代码方面;
(4)对所学知识的综合运用能力方面
结对方学号-姓名 201871010116-祁英红
结对方本次本次作业链接 https://www.cnblogs.com/qyhq/p/14651488.html
本次项目Github的仓库链接地址
1、实验内容和步骤

任务1:阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念;

  • 代码风格规范:是指对代码格式的要求。代码风格规范的原则是简明、易读、无二异性。
    • 缩进
    • 行宽
    • 括号
    • 断行与空白的{}行
    • 分行
    • 命名
    • 下划线
    • 大小写
    • 注释
  • 代码设计规范:
    • 1 函数
    • 2 goto
    • 3 错误处理
      • 参数处理
      • 断言:使用断言来验证正确性。
    • 4 处理类
      • 类:
        • 使用类来封装面向对象的概念和多态(Polymorphism)。
        • 仅在必要时,才使用“类”。
      • class vs.struct:
        • 如果只是数据的封装,用struct即可。
      • 公共/保护/私有成员( public、protected、private):
        • 按照这样的次序来说明类中的成员: public、protected、private。
      • 数据成员:
        • 数据类型的成员用m_name说明。
      • 虚函数 (Virtual Function):
        • 使用虚函数来实现多态(Polymorphism)
        • 仅在必要时,使用虚函数。
        • 如果一个类型要实现多态,在基类(Base Class)中的析构函数应该是虚函数。
      • 构造函数(Constructors):
        • 不要在构造函数中做复杂的操作,简单初始化所有数据成员即可。
        • 构造函数不应该返回错误(事实上也无法返回)。把可能出错的操作放到HrInit()或FInit()中
      • 析构函数 (Destructor):
        • 把所有的清理工作都放在析构函数中。如果有些资源在析构函数之前就释放了,记住要重置这些成员为0或NULL。
      • new和delete:
        • 如果可能,实现自已的new/delete,这样可以方便地加上自已的跟踪和管理机制。
        • 检查new的返回值。new不一定都成功。释放指针时不用检查NULL。
      • 运算符 (Operators):
        • 在理想状态下,我们定义的类不需要自定义操作符。确有必要时,才会自定义操作符。
        • 运算符不要做标准语义之外的任何动作。例如.“==”的判断不能改变被比较实体的状态。
      • 异常(Exceptions)
        • 异常是在“异乎寻常”的情况下出现的,它的设置和处理都要花费“异乎寻常”的开销,所以不要用异常作为逻辑控制来处理程序的主要流程。
  • 代码复审:代码复审是指有意识地、有系统地与其他程序员一起检查彼此的代码是否有错误的行为,并且已经被反复证明可以像其他实践一样加速和简化软件开发过程。
    • (1)自我复审:用同伴复审的标准来要求自己使代码更加完善。
    • (2)同伴复审:共同商议。
    • (3)团队复审:有比较严格的规定和流程,提高代码的质量。
  • 结对编程概念:结对编程是一种敏捷软件开发的方法,两个程序员在一个计算机上共同工作,是极限编程的组成部分。一个人输入代码,称作驾驶员;另一个人负责审查工作,称作观察员(或导航员)。两人常互换角色。在结对编程中,观察员同时考虑工作的战略性方向,提出改进的意见,或将来可能出现的问题以便处理。
    任务2:两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价,具体要求如下:
    (1)对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究,将以上评论内容发布到博客评论区。
    https://www.cnblogs.com/qyhq/p/14575861.html

(2)克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》4.4.3节核查表复审同伴项目代码并记录。

  • 复审同伴项目代码并记录:
    1、概要部分
  • 代码符合需求
  • 代码设计考虑较周全
  • 代码比较容易维护
  • 代码的每一行都都可以执行。
    2、代码规范部分
  • 修改的部分符合代码标准和风格符合
    3、可读性
  • 代码可读性较好
    4、可测试性
  • 可以测试运行出来结果

(3)依据复审结果尝试利用github的Fork、Clone、Push、Pull request、Merge pull request等操作对同伴个人项目仓库的源码进行合作修改。

任务3:采用两人结对编程方式,设计开发一款D{0-1}KP 实例数据集算法实验平台,使之具有以下功能:

任务4:完成结对项目报告博文作业
- 需求分析陈述
- 有一个能装重量为X的背包,现有重量W和价值V各不相同的几件物品,在不超过背包容量X的情况下,如何使得背包内物品的总价值V最大。如果可以装相同的物品,称为完全背包问题,不可以装相同的物品,称为01背包问题。考虑到每种物品只有两种选择,即装入背包或不装入背包,并且物品数和背包数容量已给定,要计算装入背包物品的最大价值和最优装入方案,可以用回溯算法搜索子集数的算法进行求解。在实际商业活动中,采用0~1背包问题解决获利最大化的问题非常有必要,它可以帮我们求出最优解。所以,设计一个采用动态规划算法求解背包问题的程序很有必要。
- 软件设计说明

  • 算法设计:
    • 物品有n种,背包容量为c,分别用p[i]和w[i]存储第i种物品的价值和重量,用X[i]标记笫i种物品是否装入背包,用bestx[i]存储笫i种物品的最优装栽方案;

    • 用递归函数backtrack(i,CP,CW)来实现回溯法搜索子集村(形式参数i表示递归深度,n用来控制递归深度,形式参数cp和CW的表示当前总价值和总重量,bestp表示当前最优总价值):

    • ①若i>n,则算法搜索到一个叶结点,判断当前总价值是否最优:

      • 若tp>bestp,更新当前最优总价值为当前总价值(即bestp=cp),更新装载方案(即bestx[i]=xi);
    • ②采用for循环对物品i装与不装两种情况进行讨论(0≤j≤1:

      • 1>x[i]=j;
      • 2>若总重量不大于背包容量(即cw+x[i}w[i]<=c),则更新当前总价br="">值和总重量(即cw+=w[i]×[i],CP+=P[i]*x[i],对物品i+1调用递归函数Backtrack(i+1, cp,cw)继续进行装载;
      • 3>函教backtrack(i+1,CP,CW)调用结束后则返国当前总价值和总重量(即cw-=w[i]x[i],CP-=p[i]x[i]);
      • 4>当j>1时,for循环结束;
    • ③当i=1时,若己测试完所有装载方案,外层调用就全部结束;

    • 主函数调用一次backtrack(1,0,0)即可完成整个回溯搜索过程,最终得到的bestp和bestx[i]即为求最大总价值和最优装栽方案。

    • 软件实现及核心功能代码展示

    • 程序运行

    • 结对的过程,提供两人在讨论、细化和编程时的结对照片。

    • 此次结对作业的PSP。

PSP 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min)
Planning 估计这个任务需要多少时间,并规划大致工作步骤 8 6
Development 开发 500 800
· Analysis 需求分析 (包括学习新技术) 15 10
· Design Spec · 生成设计文档 5 5
· Design Review · 设计复审 (和同事审核设计文档) 0 0
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 5 5
· Design · 具体设计 30 30
· Coding · 具体编码 240 400
· Code Review · 代码复审 30 60
· Test · 测试(自我测试,修改代码,提交修改) 30 60
Reporting 报告 15 15
· Test Report · 测试报告 5 5
· Size Measurement · 计算工作量 5 5
· Postmortem & Process Improvement Plan · 事后总结,并提出过程改进计划 5 5
小结感受:两人合作真的能够带来1+1>2的效果吗?通过这次结对合作,请谈谈你的感受和体会。
- 我认为两人合作能够带来1+1>2的效果。通过和队友合作探讨,两个人不断的交流,分析问题设计问题的算法,从而解决问题,带来的效果也是不一样的。通过结对编程,了解和学习队友解决问题的方法以及算法的设计,发现自己的不足和缺陷,进而改正,我觉得很不错,对自己的学习有一定的影响。此次的编程任务是挺难的,但是两个人在不断地查资料不断地交流协商,最终虽然没有实现,但是在结对的过程中还是收获了很多。所以我认为两个人合作会带来1+1>2的效果。

posted on 2021-04-13 23:02  黎沫  阅读(117)  评论(0编辑  收藏  举报