经过大半学期的学习和练习, 我们把学到的东西综合起来。
在作业2 ( ) 中, 同学们用各种方法 (主要是动态规划,外加一些遍历)计算了一维和二维数组中最小最大子数组的和。 当然,程序在飞快地运行的时候,我们可以通过debug 工具中的 单步执行 命令看到中间结果。 中间结果一般有这些数据:
这个数组目前暂定的最大子数组的范围是哪里? 目前的值是多少?
目前计算到哪些部分, 目前的牵涉到的子数组的和是多少?
我们的要求是,设计并实现一个系统,让一个普通用户就能通过单步执行的方式看到你的算法是如何工作的。 一个典型的流程是:
1. 用户用你的程序读入一个数组文件 (就像我们以前做过的那样),显示初始状态 (就像围棋打谱程序那样)
1.1. 用户也可以自行定义数组的大小,或者要求随机生成一个数字矩阵。
2. 用户这时候有两个选择
2.1 按 单步执行 键, 在 GUI 看到你的程序是如何一步一步算出目前最大子数组的范围,当前计算到的临时子数组是在哪里,等等。 最好用不同的颜色标识不同的状态。
2.2 按 自动运行 键, 在 GUI 看到程序自动运行,并自动显示过程, 每次改变状态的时候要稍作停留 (例如 1 秒钟的时间)
3. 咳,我没看清楚! 这时最好有一个 倒带 / 回滚 的键, 让用户可以看清楚关键的几步。
(当然,用户可以选择是普通模式还是扩展定义的连通模式)
要求: 这个要求的各个方面我们都已经单独写代码试验过了,把它们合起来也不是太难。 要求还那样: 写程序和单元测试,签入GitHub,写博客描述,总结所花费的时间和估计。
评分:
功能 (分数范围 –30 到 30分): 在PC 桌面上运行 (满分 20 分); 如果能在程序能直接在网上显示 (例如使用 Javascript 在网页上让用户直接看到过程),则满分是 30 分。
代码质量 (分数范围: -30 分到 30 分): 同学们在课程中已经看了很多书,实践了不少原理,也看过烂的代码 (很多同学还大义凛然地鄙视过烂代码),并且纷纷表示要写高效/好懂/可扩展的算法。现在就来试试看,请写博客,截图,画图描述:
注释,命名: 有一致规范的规范,合适的注释
结构: 结构清晰,各种类/结构的定义 正确地反映了现实世界实体,以及实体之间的关系.
单元测试: 有单元测试保证 非UI 模块的正确性 (UI 模块不要求单元测试自动覆盖),有代码覆盖率。
(注: 以上的各个部分,达不到基本要求的,倒扣分,扣到 –30 分为止。 抄袭按学校规定处理)
附加题: 你已经做了这么多,不妨再进一步: 如果博客中描述了动态规划的原理,并通过录制屏幕的方式让一般的读者 (例如,正在学习算法的大学生)能通过你的动态程序理解动态规划的算法,以及这个算法的扩展,那么可以得到附加分 10 分。你可以宣传你的博客,让大家都来学习