| 项目 | 内容 |
| 课程班级博客链接 | 19卓越工程师班 |
| 这个作业要求链接 | 实验二作业要求 |
| 实验目的与要求 | 1、掌握软件项目个人开发流程。 |
| 2、掌握Github发布软件项目的操作方法 | |
| 这个作业在哪些方面帮助我实现学习目标 | 1、软件设计与代码编写 |
| 2、需要有自己独立的思考 | |
| 项目Github的仓库链接地址 | Github地址 |
实验内容和步骤
-
任务1:
阅读教师博客“常用源代码管理工具与开发工具(HTTPS://WWW.CNBLOGS.COM/NWNU-DAIZH/P/14521534.HTML)”内容要求,点评班级博客(https://edu.cnblogs.com/campus/xbsf/2019nwnucs)中本次已提交作业至少3份。
作业点评对象 点评链接 谢宇涵 相关内容请点击查看 王凯英 相关内容请点击查看 王亚亚 相关内容请点击查看 -
任务2:总结详细阅读《构建之法》第1章、第2章,掌握PSP流程
1、《构建之法》第1章内容总结
- 软件=程序+软件工程
- 软件企业=软件+商业模式
- 软件的特殊性:复杂性、不可见性、易变性、服从性、非连续性
2、《构建之法》第2章内容总结
| 个人软件开发流程(PSP) | 具体内容 |
|---|---|
| PSP原理 | 每个程序员都不同,为了使工作更有效率,程序员必须在其自己的历史数据基础上制定工作计划;为了达到持续不断的更改,程序员必须实施过程并进行度量;程序员必须追求质量最优化;提早发现缺陷并改正;提早发现缺陷并改正可以减少付出成本;用最快速、最直接的工作方式。 |
| PSP定位 | PSP的定位是每一位开发人员。通过制定过程、计划、度量、跟踪,进行相应的过程改进。指导开发人员更有效的估计、计划、跟踪,完全在进度、质量、成本内的项目,并实现不断的过程改进。 |
| PSP说明 | a. PSP流程的建立需要管理者和执行者共同参加。 |
| b. 在PSP中关注开发人员的5点:规模估计、工作量估计、产品质量、流程质量和个人生产率 | |
| c. 通过统计学和历史数据可以使规模、工作量估计更加的有效; | |
| d. 对于产品质量,提出尽早的发现并解决bug。可以很大的减少成本,增加客户满意度; | |
| e. 通过更有效的计划和产品质量的提高,可以减少重工时间,从而减少生命周期的时间。 | |
| PSP流程 | PSP有七个等级,PSP的开始点是开发人员选择改进哪些他们自己的工作流程。每个等级都是在它之前等级的基础上增加的,为了最小化的减少流程改变对工程师的影响,开发人员可以慢慢的实现每一个等级。 |
3、PSP绘制如下:
| PSP2.1 | 任务内容 | 计划完成需要的时间(min) | 实际完成需要的时间(min) |
|---|---|---|---|
| -Planning | 计划 | 20 | 18 |
| -Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 10 | |
| -Development | 开发 | 480 | 460 |
| - Analysis | - 需求分析(包括学习新技术) | 12 | 8 |
| - Design Spec | - 生产设计文档 | 6 | 7 |
| - Design Review | - 设计复审(和同事审核设计文档) | 6 | 5 |
| - Coding Standard | - 代码规范(为目前的开发指定合适的规范) | 6 | 7 |
| - Design | - 具体设计 | 10 | 12 |
| - Coding | - 具体编码 | 300 | 450 |
| - Code Review | - 代码复审 | 26 | 30 |
| - Test | - 测试(自我测试,修改代码,提交修改) | 60 | 70 |
| -Reporting | 报告 | 50 | 50 |
| - Postmortem & Process Improvement Plan | - 事后总结,并提出过程改进计划 | 20 | 18 |
- 任务3:项目开发背景
1、需求分析
背包问题(Knapsack Problem,KP)是NP Complete问题,也是一个经典的组合优化问题,有着广泛而重要的应用背景。{0-1}背包问题({0-1 }Knapsack Problem,{0-1}KP)是最基本的KP问题形式,它的一般描述为:从若干具有价值系数与重量系数的物品(或项)中,选择若干个装入一个具有载重限制的背包,如何选择才能使装入物品的重量系数之和在不超过背包载重前提下价值系数之和达到最大?
2、功能设计
{0-1}KP数据集是研究{0-1}背包问题时,用于评测和观察设计算法性能的标准数据集;动态规划算法、回溯算法是求解{0-1}背包问题的经典算法。查阅相关资料,设计一个采用贪心算法、动态规划算法、回溯算法求解{0-1}背包问题的程序,程序基本功能要求如下:
1.可正确读入实验数据文件的有效{0-1}KP数据;
2.能够绘制任意一组{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图;
3.能够对一组{0-1}KP数据按重量比进行非递增排序;
4.用户能够自主选择贪心算法、动态规划算法、回溯算法求解指定{0-1} KP数据的最优解和求解时间(以秒为单位);
5.任意一组{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件。
3、设计实现
(1)ReadTheFil类 :通过文件路径来创建文件实例,把FileInputStream实例 传递到 BufferedInputStream,目的是能快速读取文件,最后,使用available检查是不是读到了文件末尾。
(2)ScatterDiagram类 :创建二维数组data存储profit价值和height重量,以重量为横轴、价值为纵轴,建立直角坐标系画出散点图。
(3)WeightRatio类 :分别定义int类型数组profit和weight数组将价值和重量存储,因为所给数据全部为int型,再定义比值ratio为double类型,再将其int类型数组强制转换为double进行比值运算,最后运用冒泡排序将比值进行降序排序。
(4)Time类 :使用动态规划算法:在0/1背包问题中,物品i或者被装入背包,或者不被装入背包,设xi表示物品i装入背包的情况,则当xi=0时,表示物品i没有被装入背包,xi=1时,表示物品i被装入背包。
程序流程图

4、测试运行
(1)读取文件

(2)散点图绘制

(3)计算最优解

5、粘贴自己觉得比较独特的或满意的代码片段,用博客园的代码控件来显示。
数据读入:
try{
//第一步 通过文件路径来创建文件实例
fis = new FileInputStream(file);
/*把FileInputStream实例 传递到 BufferedInputStream目的是能快速读取文件*/
bis = new BufferedInputStream(fis);
/*available检查是不是读到了文件末尾 */
while( bis.available() > 0 ){
System.out.print((char)bis.read());
}
}catch(FileNotFoundException fnfe)
{
System.out.println("文件不存在" + fnfe);
}
catch(IOException ioe)
{
System.out.println("I/O 错误: " + ioe);
}
绘制散点图:
int h = getHeight();//重量
int w = getWidth(); //价值
// 横坐标
g2.draw(new Line2D.Double(PAD, w-PAD, h-PAD, w-PAD));
// 纵坐标
g2.draw(new Line2D.Double(PAD, PAD, PAD, w-PAD));
double xInc = (double)(w - 2*PAD)/(data.length-1);
double scale = (double)(h - 2*PAD)/getMax();
// 数据点(坐标)
g2.setPaint(Color.blue);//点的颜色
for(int i = 0; i < data.length; i++) {
double x = PAD + i*xInc;
double y = h - PAD - scale*data[i];
g2.fill(new Ellipse2D.Double(x-2, y-2, 4, 4));
重量比排序
//冒泡排序
double tmp;
for (int a= 1; a < ratio.length; a++) {
for (int j = 0; j < ratio.length-1; j++) {
if(ratio[j] < ratio[j+1]){
tmp = ratio[j];
ratio[j] = ratio[j+1];
ratio[j+1] = tmp;
}
}
计算最优解
//1.创建二维数组
//v[i][j]表示在前i个物品中能够装入容量为j的背包中的最大价值
int[][] v=new int[n+1][m+1];
//存放记录数组
int[][] path=new int[n+1][m+1];
//2.初始化第一行第一列(已经处理了,因为默认是0)
//3.根据公式来动态规划处理
for (int i = 1; i < v.length; i++) {
for (int j = 1; j < v[0].length; j++) {
//公式
if(w[i-1]>j){//因为我们程序i是从1开始的,因此原来的公式中的w[i]修改成w[i-1]
v[i][j]=v[i-1][j];
}else{
//v[i][j]=Math.max(v[i-1][j],val[i-1]+v[i-1][j-w[i-1]]);
if(v[i-1][j]<val[i-1]+v[i-1][j-w[i-1]]){
v[i][j]=val[i-1]+v[i-1][j-w[i-1]];
path[i][j]=1;
}else{
v[i][j]=v[i-1][j];
}
}
}
}
6、总结:你设计的程序如何实现软件设计的“模块化”原则。
首先对整个程序需求进行分析,将代码进行规划,分成不同模块,如 界面模块、散点图模块、运算模块等等。分别对不同模块的代码进行编写,最后进行汇总,程
序实现。
-
任务4:完成任务3的程序开发,将项目源码的完整工程文件提交到你注册Github账号的项目仓库中。
开发须知:
项目必须包含src文件夹;代码上传成功
7、如果所有环节你都认真做了,此处你应该有很多经验愿意与大家分享。
在本次实验中我充分认识到了自己的不足之处,尤其是代码的编写能力。希望在下次实验中我的代码编写能力会有所进步,并且对于博客的撰写会更加熟练。
浙公网安备 33010602011771号