201971020204-曹霖枫 实验二 软件工程个人项目《0-1背包问题》项目报告
项目 | 内容 |
---|---|
课程班级博客链接 | 2019级计算机科学与技术卓越班 |
这个作业要求链接 | 实验二 软件工程个人项目 |
我的课程学习目标 | (1)掌握软件项目个人开发流程 (2)掌握Github发布软件项目的操作方法。 |
这个作业在哪些方面帮助我实现学习目标 | (1)通过本次项目,已了解个人开发项目的流程 (2)同时也掌握了Github是如何发布软件 |
项目Github的仓库链接地址 | Github |
任务一 阅读教师博客“常用源代码管理工具与开发工具”内容要求,点评班级博客。
评论链接 | 评论内容 |
---|---|
201971010232-牛靖威 实验一 软件工程准备 | 博文写的条理清晰,依次向我们介绍了在学习软件工程的准备工作,同时排版给人一种规范工整的美感,背景反光太强了,阅读时字不够清晰。 |
201971010135-孙得弘 实验一 软件工程准备—熟悉博客园操作以及对课程的思考 | 博文写的的内容详细、层次分明,有着明确的学习目标 ,同时也很深刻的提出了自己的问题,值得我参考学习。 |
201971010246-王孜睿 实验一 软件工程准备—构建之法与博客首秀 | 博文写的简洁大方,语言简明扼要,严格遵守实验要求。 |
任务二 总结详细阅读《构建之法》第1章、第2章,掌握PSP流程。
1.第一章
本章主要讲述了(1)软件的两个部分:软件工程 = 程序 + 软件工程,作者分别从程序和软件工程两个方面来论证了表达式的成立。(2)软件工程的定义:①软件工程是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程。②软件工程的特殊性:复杂性、不可见性、易变性、服从性、非连续性。
2.第二章
本章主要讲述了:(1)在软件开发的团队中,我们得先要了解一些基本的概念:单元测试、回归测试和效能分析工具。(2)个人软件开发流程(PSP)的特点:①不局限于某一种软件技术。②不依赖于考试。③不能全部由程序员负责。④依赖于数据。⑤目的是记录工程师如何实现需求的效率。
任务三 项目开发
1. 需求分析
通过对项目进行分析,我们得到以下功能性需求:
数据读取:可正确读入实验数据文件的有效{0-1}KP数据。
绘制散点图:能够绘制任意一组{0-1}KP数据以价值重量为横轴、价值为纵轴的数据散点图。
重量比排序:能够对一组{0-1}KP数据按重量比进行非递增排序。
算法选择:用户能够自主选择贪心算法、动态规划算法、回溯算法求解指定{0-1} KP数据的最优解和求解时间(以秒为单位)。
数据存储:任意一组{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件。
拓展功能:增加可视化窗口,方便用户数据输入和结果输出。
2. 功能设计
3. 设计实现
(1)主函数(main):
生成可视化用户输入的窗口,调用其他函数,以.txt保存结果,再从可视化窗口输出。
(2)数据读取函数:
用户自主选择0~9号的数据,以列表a = np.loadtxt(“beibao.in”)的形式读取数据,并返回列表a。
(3)算法选择函数:
用户从三种算法中任意选择一种
① 贪心算法:定义一个 tanXin()函数,对其重量比进行排序,并计算出最大价值和解向量。
② 动态规划算法:先通过 bag()函数求出最大价值,再调用 dongTai()函数求出解向量。
③ 回溯算法:定义了一个 huiSu()函数,求出最大价值和解向量。
(4)排序函数:
使用python numpy库,对数组进行计算和排序。
(5)散点图绘制函数:
在python matplolib库下,定义一个 sanDt()函数进行图像的绘制。
4. 测试运行
(1)输入界面:
(2)散点图绘制:
(3)文件生成:
5. 代码片段:
(1)散点图:
# 散点图
def sanDt(w, v):
plt.title("value-weight", fontsize = 20) # 图名称
plt.xlabel("weight", fontsize = 10)
plt.ylabel("value", fontsize = 10)
plt.axis([0, 100, 0, 100]) # 设置x,y轴长度
plt.scatter(w, v, s = 20) # 将数据传入x,y轴
plt.show()
(1)拓展功能(可视化窗口):
# 主程序
if __name__ == '__main__':
win = tk.Tk() # 创建一个窗口
win.title('0-1背包问题')
win.geometry('400x200+400+100')
label1 = tk.Label(win,text = "请输入测试数据(0~9):", fg = "black" ,font = ("宋体",12),
width = 30, height= 1,justify = "left", anchor = "n") # 在窗口输出一个文本
label1.pack()
e1 = tk.Variable() # 创建文本输入框
entry1 = tk.Entry(win, textvariable=e1)
entry1.pack()
e1.set(" ")
label2 = tk.Label(win, text="请选择算法(1.贪心,2.动态规划,3.回溯):", fg="black", font=("宋体", 12),
width=50, height=1, justify="left", anchor="n")
label2.pack()
e2 = tk.Variable()
entry2 = tk.Entry(win, textvariable=e2)
entry2.pack()
e2.set(" ")
button2 = tk.Button(win, text="确定", command=get_click).pack() # 创建按钮
button3 = tk.Button(win, text="结束", command=exit).pack()
win.mainloop()
6. 总结:
软件设计模块化的准则是高内聚低耦合,我在程序设计过程中,按程序功能进行分块,每一个功能写入一个独立的函数,即减弱了模块之间的耦合性和提高了模块内的内聚性,从而提高了模块的独立性。通过模块化的设计,让我更加理解了软件功能需求,同时也提高了我程序完成的效率。
7. PSP展示:
PSP | 任务内容 | 计划完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 10 | 10 |
- Estimate | - 估计这个这个任务需要多少时间,并规划大致工作步骤 | 10 | 10 |
Development | 开发 | 720 | 800 |
- Analysis | - 需求分析(包括学习新技术) | 10 | 20 |
- Design Spec | - 生成设计文档 | 20 | 20 |
- Design Review | - 设计复审 | 8 | 10 |
- Coding Standard | - 代码规范 | 10 | 10 |
- Design | - 具体设计 | 12 | 20 |
- Coding | - 具体编码 | 500 | 560 |
- Code Review | - 代码复审 | 20 | 30 |
- Text | - 测试 | 140 | 130 |
Reporting | 报告 | 60 | 80 |
- Test Report | - 测试报告 | 20 | 30 |
- Size Measurement | - 计算工作量 | 10 | 10 |
- Postmortem & Process Improvement Plan | - 事后总结,并提出过程改进计划 | 30 | 40 |
8. 经验分享:
完成本次项目后,我收获颇丰:(1)最初在自己在开展项目时,没有完成计划书和PSP,导致我毫无章法可言,不知道从哪里开始下手,从而浪费了许多的时间,所以我的经验就是开展项目的第一件事就是完成项目计划,并执行。(2)在编写程序时要选择方便快捷的编译软件,同时程序的模块化尤为重要,大大的提高了代码的编写、代码复审和测试的速率。