第二次作业——个人项目实战

第二次作业——个人项目实战

本次作业deadline:2017-9-10 23:00PM

0、前言

阅读了大家对于本课程的目标和规划之后,想必很多同学都跃跃欲试,迫不及待想要提高自身实践能力,那么就从第一个个人项目开始吧,题目要求见下。

1、阅读

阅读《构建之法》第一章至第三章的内容,并在下方作业里体现出阅读后的成果。特别是第2章中的效能分析及个人软件开发流程(PSP)。

《构建之法》是 软工实践课程的教材。因为软工实践是选修课,所以学校没有统一订教材。需要大家自己购买。多看 上有正版的 构建之法 电子版 第二版。 纸质书 推荐购买 第三版。

2、题目描述

背景

数独介绍:(摘自百度百科

数独是源自18世纪瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复。

数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。

数独


工具清单


项目需求

利用程序随机构造出N个已解答的数独棋盘 。

输入

数独棋盘题目个数N(0<N<=1000000)

输出

随机生成N个 不重复已解答完毕的 数独棋盘,并输出到sudoku.txt中,输出格式见下输出示例。

[2017.9.4 新增要求] 在生成数独矩阵时,左上角的第一个数为:(学号后两位相加)% 9 + 1。例如学生A学号后2位是80,则该数字为(8+0)% 9 + 1 = 9,那么生成的数独棋盘应如下(x表示满足数独规则的任意数字):

9 x x x x x x x x
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x

输入示例

3

输出示例(输出文件示例https://files.cnblogs.com/files/easteast/%E7%A4%BA%E4%BE%8B%E8%BE%93%E5%87%BA.rar

2 6 8 4 7 3 9 5 1
3 4 1 9 6 5 2 7 8
7 9 5 8 1 2 3 6 4
5 7 4 6 2 1 8 3 9
1 3 9 5 4 8 6 2 7
8 2 6 3 9 7 4 1 5
9 1 7 2 8 6 5 4 3
6 8 3 1 5 4 7 9 2
4 5 2 7 3 9 1 8 6

4 5 1 7 8 2 3 6 9
7 8 6 4 9 3 5 2 1
3 9 2 1 5 6 4 8 7
5 2 7 6 4 9 8 1 3
9 6 8 5 3 1 2 7 4
1 3 4 2 7 8 6 9 5
8 1 5 3 6 7 9 4 2
6 7 3 9 2 4 1 5 8
2 4 9 8 1 5 7 3 6

9 5 8 3 6 7 1 2 4
2 3 7 4 5 1 9 6 8
1 4 6 9 2 8 3 5 7
6 1 2 8 7 4 5 9 3
5 7 3 6 1 9 4 8 2
4 8 9 2 3 5 6 7 1
7 2 4 5 9 3 8 1 6
8 9 1 7 4 6 2 3 5
3 6 5 1 8 2 7 4 9

测试须知

测试机为 Windows环境 ,所以提交到Github上的项目均需要建立一个名字为BIN的文件夹,里面必须含有可执行文件(以exe为后缀)与相关的依赖库,请注意以下两点:

  • 确保可执行文件的名字命名为 sudoku.exe。
  • 确保生成的棋盘文件 sudoku.txt 与可执行文件在同一目录下,生成文件时请使用 相对路径

一个示例组织目录如下所示:

/ SudokuProject(工程名字自行指定即可)
     / main.cpp
     / generator.cpp
/ BIN
     / Lib.dll (exe运行需要的动态链接库文件,可以没有)
     / sudoku.exe
     / sudoku.txt (运行exe后生成的文件)

助教在测试时,将以命令行运行可执行文件的方式进行批量测试,参数及其约定如下:

参数名字 参数意义 用法示例
-c 生成的数独棋盘的数量 sudoku.exe -c 20

值得一提的是,测试数据中有可能出现错误,比如出现 sudoku.exe -c abc 这样的命令,你的程序需要自行处理错误情况,并给出合适的错误提示信息。


附加题(选做)

1)现在已经有了一个数独游戏的生成器,如果想让大家都能实际使用它,还需要一个简单的游戏界面。为数独游戏的生成器做一个 GUI 界面,并附上一个简单的使用说明。界面需实现下述功能,会按点给分:

  • 生成任意数量的数独题目并将初始数独棋局依次显示。初始数独棋盘需要挖空,要求为:99棋盘上挖空不少于30个,不多于60个。每个33的小棋盘中挖空不少于2个。比如下面这就是一个规范的棋局(5')

  • 用户可以在界面上通过点击或输入完成数独题目(3')
  • 用户完成数独题目后可以得到反馈,知道自己的题目是否做对(2')

【注意】选择完成本附加题目的同学,需要将GUI与数独游戏生成器作为两个工程开发,后者可以作为依赖库为前者提供调用接口,但 不可以把两个工程直接混在一起 。 GUI相关的部分也需要提供新的可执行文件,放在根目录的GUIBIN文件夹下。

2)程序的基础要求是完成一个数独题目生成程序,但数独棋局中是要求有独解性的。所以数独比赛中为了保障解题的趣味性与难度,一般会手工构造有唯一解的数独程序。这种数独题目的要求如下:

  • 在9*9的棋盘中,初始棋盘最少有30个空
  • 该数独题目有且仅有唯一解

现在请你在之前程序的基础上改进一下,完成上述需求。(10')

【注意】选择完成本附加题目的同学,需要将改进版与原版作为两个工程开发,后者可以作为依赖库为前者提供调用接口,但 不可以把两个工程直接混在一起 。 改进版相关的部分需要提供新的可执行文件,放在根目录的GAMEBIN文件夹下。这部分程序的正确性与性能测试独立于基础测试,按通过的测试点给分。

输入

数独棋盘题目个数N(0<N<=1000000)

输出

随机生成N个 不重复有唯一解 的数独棋盘。挖空处用数字0表示,每个数独棋盘中至少要有 30 个以上的0。输出格式见下输出示例,输出需要到文件sudoku.txt中。

2 0 0 0 0 0 9 0 1
3 4 0 0 6 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 2 0 0 3 0
0 0 9 5 0 8 0 0 7
0 0 6 0 0 0 0 0 0
0 0 0 0 0 0 5 4 0
0 0 0 1 0 0 0 0 0
0 0 0 7 0 9 0 0 0

4 0 0 0 0 0 0 0 0
7 0 6 0 9 0 5 0 0
0 0 0 1 0 0 0 0 0
0 2 0 0 0 0 0 1 3
0 0 0 0 0 0 0 0 0
0 0 0 0 7 8 0 0 0
8 1 0 3 0 0 0 0 0
0 0 0 0 0 0 0 5 0
0 0 0 0 0 0 7 0 6

0 0 0 0 0 7 0 2 0
0 0 0 0 0 0 0 0 0
1 4 6 0 0 0 0 0 0
0 0 0 0 0 0 5 0 0
0 7 3 0 0 9 0 0 0
0 0 0 0 0 0 6 0 1
0 2 0 5 0 0 0 0 0
0 9 0 0 0 0 0 3 0
0 0 0 1 8 0 0 0 0

3、要求与说明

  • 分析并理解题目要求,独立完成整个项目。

  • 使用单元测试对项目进行测试,并使用插件查看测试分支覆盖率等指标。

  • 完成项目的首个版本之后,使用 性能分析工具 找出代码中的性能瓶颈并进行改进。

  • 【项目要求】在项目实践过程中使用Github管理源代码,将遵循上述 测试须知 中规范的最新的项目代码发布到Github上。

  • 【博客要求】按照要求发布博客,利用在构建之法中学习到的相关内容,结合个人项目的实践经历,撰写解决项目的心路历程与收获。

  • 结合上次作业的评分总结,在博客中谈谈你关于 执行力泛泛而谈 的理解,好与不好都必须列举实际例子、数据或推理加以说明。

4、博文规范

将博文发布到个人博客上,且需包含以下8个内容。

1)在文章开头给出 Github项目地址 。(1‘)

2)在开始实现程序之前,在下述PSP表格记录下你 估计 将在程序的各个模块的开发上 耗费的时间 。(0.5‘)

3)解题思路 描述。即刚开始拿到题目后,如何思考,如何找资料的心路历程。(3‘)

4)设计实现 过程。设计包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?(4‘)

5)代码说明 。展示出项目关键代码,并解释思路与注释说明。(5‘)

6)测试运行 。程序必须是可运行的,展示出程序运行的截图。PS:如果有扩展需求或者更高级的需求,请秀出来,有额外加分。(3‘)

7)记录在改进程序 性能上所花费的时间 ,描述你 改进的思路 ,并展示一张 性能分析图 ,并展示你程序中消耗最大的函数。PS:如果采用Visual Studio Community 2015开发,使用C++或者C#语言实现,VS 2015的性能分析工具可自动生成。(3‘)

8)在你实现完程序之后,在下述PSP表格记录下你在程序的各个模块上 实际花费的时间 。(0.5‘)

附:PSP 2.1表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划
· Estimate · 估计这个任务需要多少时间
Development 开发
· Analysis · 需求分析 (包括学习新技术)
· Design Spec · 生成设计文档
· Design Review · 设计复审 (和同事审核设计文档)
· Coding Standard · 代码规范 (为目前的开发制定合适的规范)
· Design · 具体设计
· Coding · 具体编码
· Code Review · 代码复审
· Test · 测试(自我测试,修改代码,提交修改)
Reporting 报告
· Test Report · 测试报告
· Size Measurement · 计算工作量
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划
合计

附:博客参考模板

http://www.cnblogs.com/vertextao/p/7469789.html

5、评分规则

本次个人项目分数由三部分组成,分别是

  • (1)博客 —— 40分
    • 20分组成在 博文规范
    • 其余20分组成
      • 执行力泛泛而谈 的理解 —— 5分
      • 遇到的困难及解决方法 —— 5分
      • 关键代码or设计说明 —— 5分
      • PSP + 学习进度条更新 —— 5分
  • (2)程序 —— 40分
    • 5分为源代码管理评分,该评分主要通过源代码管理中的commit注释信息,增量修改的内容,是否有运行说明等给分。
    • 25分为正确性评分,正确性测试中输入范围限制在 1-1000,要求程序在 60 s 内给出结果,超时则认定运行结果无效。
    • 10分为性能评分,性能测试中输入范围限制在 10000-1000000,没有时间的最小要求限制。
    • 当程序的正确性评分大于20分时才可以参与性能评分环节,所以请各位同学务必保证自己程序的正确性。
    • 性能评分将采取档级评分制度,助教将根据同学们的程序跑同一数据耗费的时间长度将程序分为若干档,每一档的同学得到的分数为 10/档级数。
  • (3)【可选】附加题 —— 20分,分数组成已在 附加题 中写到,附加题不参与总分映射。
  • (4)注意事项:
    • 按时间完成并提交 —— 正常评分
    • 晚交一周以内 —— 0分
    • 晚交一周以上或不交 —— 倒扣本次作业分数
    • 抄袭 —— 倒扣 2倍本次作业分数严禁代码与博客等一切形式的抄袭!
  • (5)补考的同学,在截止时间,必须先提交部分博客和部分代码,允许在最后一门补考结束后的48小时内,补充完整。
  • 【说明】
    • 本次作业先按百分制评分(含附加题)
    • 必做部分最后映射分数至 [1, 10] 分
    • 附加题单独映射到 [0, 2] 分

6、疑惑解疑

若有对题意不清或者有不理解的地方,可在该博客下方留言,或者在微信群中直接提问。

7、参考

posted @ 2017-09-04 11:06  0x1000  阅读(590)  评论(0编辑  收藏