ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

201971020204-曹霖枫 实验二 软件工程个人项目《0-1背包问题》项目报告

2022-03-21 02:03:06  阅读:151  来源: 互联网

标签:10 20 win 算法 软件工程 tk 201971020204 曹霖


项目 内容
课程班级博客链接 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账号的项目仓库中。

   仓库地址

标签:10,20,win,算法,软件工程,tk,201971020204,曹霖
来源: https://www.cnblogs.com/Aaclf/p/16030302.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有