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)在编写程序时要选择方便快捷的编译软件,同时程序的模块化尤为重要,大大的提高了代码的编写、代码复审和测试的速率。

任务四 完成任务3的程序开发,将项目源码的完整工程文件提交到你注册Github账号的项目仓库中。

   仓库地址

posted @ 2022-03-21 01:37  Aaclf  阅读(81)  评论(2编辑  收藏  举报