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的效果。