作业链接
http://www.cnblogs.com/easteast/p/7469291.html
评分细则
本次个人项目分数由三部分组成,分别是
(1)博客 — 20分,分数组成如下:
- 在文章开头给出Github项目地址。(1‘)
- 在开始实现程序之前,在下述PSP表格记录下你估计将在程序的各个模块的开发上耗费的时间。(0.5')
- 解题思路描述。即刚开始拿到题目后,如何思考,如何找资料的心路历程。(3')
- 设计实现过程。设计包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?(4')
- 代码说明。展示出项目关键代码,并解释思路与注释说明。(5')
- 测试运行。程序必须是可运行的,展示出程序运行的截图。PS:如果有扩展需求或者更高级的需求,请秀出来,有额外加分。(3')
- 记录在改进程序性能上所花费的时间,描述你改进的思路,并展示一张性能分析图,并展示你程序中消耗最大的函数。PS:如果采用Visual Studio Community 2015开发,使用C++或者C#语言实现,VS 2015的性能分析工具可自动生成。(3')
- 在你实现完程序之后,在下述PSP表格记录下你在程序的各个模块上实际花费的时间。(0.5')
(2)程序 — 40分,分数组成如下:
- 源代码管理评分,该评分主要通过源代码管理中的commit注释信息,增量修改的内容,是否有运行说明等给分。(5')
- 项目评分,分为两个部分的评分:
- 正确性测试,输入范围限制在 1-1000,要求程序在 60 s 内给出结果,超时则认定运行结果无效。(20')
- 错误处理测试。(5')
- 性能评分,性能测试中输入范围限制在 10000-1000000,没有时间的最小要求限制。(10')
(3)附加题 — 20分,分数组成已在原作业的附加题中写到。
(4)注意事项:
- 按时间完成并提交——正常评分
- 晚交一周以内——0分
- 晚交一周以上或不交——倒扣本次作业分数
- 抄袭——倒扣2倍本次作业分数【严禁代码与博客等一切形式的抄袭!博客园支持了对博客的查重功能,我们也有专用的代码查重系统进行代码查重。请各位同学千万不要触碰底线,勿谓言之不预也!】
(5)补考的同学,在截止时间,必须先提交部分博客和部分代码,允许在最后一门补考结束后的48小时内,补充完整。
项目总结
项目得分明细
t1 对应测试点 -c 1
t2 对应测试点 -c 5
t3 对应测试点 -c 100
t4 对应测试点 -c 500
t5 对应测试点 -c 1000
t6 对应测试点 -c 50000
t7 对应测试点 -c 1000000
学号 | 项目 | t1 | t2 | t3 | t4 | t5 | t6 | t7 | 正确得分 | 错误处理 | 系数 | 总得分 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
11500908 | Git | 0.089 | 0.056 | 0.09 | 0.149 | 0.166 | 1.641 | 27.658 | 27.5 | 5 | 0.9 | 29.25 |
31501102 | Git | 0.906 | 0.07 | 0.207 | -6 | -6 | -9 | -9 | 12 | 0 | 0.95 | 11.4 |
31502106 | Git | 0.063 | 0.042 | 0.05 | 0.107 | 0.144 | 0.244 | 3.188 | 30 | 5 | 0.9 | 31.5 |
31502109 | Git | 0.146 | 0.064 | 0.171 | 0.665 | 1.243 | -6 | -4 | 20 | 4 | 1 | 24 |
31502113 | Git | 0.18 | 0.063 | -6 | -6 | -6 | -9 | -9 | 8 | 3 | 0.95 | 10.45 |
31502142 | Git | 0.203 | 0.085 | 0.194 | 0.373 | 0.492 | -6 | -4 | 20 | 1 | 1 | 21 |
31502209 | Git | 0.131 | 0.065 | 0.24 | -6 | -6 | -9 | -9 | 12 | 4 | 1 | 16 |
31502210 | Git | -8 | -8 | -8 | -8 | -8 | -9 | -9 | 0 | 3 | 1 | 3 |
31502212 | Git | 0.181 | 0.149 | 0.15 | 0.248 | 0.284 | 3.844 | 46.544 | 27.5 | 5 | 1 | 32.5 |
31502216 | Git | 1.502 | 0.135 | 0.172 | 0.271 | 0.364 | 8.946 | 151.643 | 26.6 | 2 | 1 | 28.6 |
31502220 | Git | -7 | -7 | -7 | -7 | -7 | -9 | -9 | 0 | 5 | 1 | 5 |
31502232 | Git | -8 | -8 | -8 | -8 | -8 | -9 | -9 | 0 | 3 | 0.85 | 2.55 |
31502240 | Git | 0.203 | 0.088 | 0.209 | -6 | -6 | -9 | -9 | 12 | 3 | 1 | 15 |
31502243 | Git | 0.087 | 0.179 | 3.41 | 14.05 | 26.767 | -8 | -4 | 20 | 5 | 0.9 | 22.5 |
31502245 | Git | 0.703 | 0.093 | 0.166 | 0.331 | 0.542 | 17.344 | 345.512 | 26 | 4 | 1 | 30 |
31502308 | Git | 0.116 | 0.046 | 0.059 | 0.095 | 0.119 | 0.481 | 7.485 | 30 | 5 | 1 | 35 |
31502309 | Git | 0.152 | 0.057 | 0.184 | 0.719 | 1.371 | 60.468 | -8 | 22.5 | 2 | 1 | 24.5 |
31502310 | Git | 0.287 | 0.172 | 0.174 | 0.295 | 0.295 | 3.677 | 71.698 | 27.5 | 5 | 1 | 32.5 |
31502312 | Git | 0.205 | 0.059 | 0.173 | 0.652 | -6 | -6 | -4 | 16 | 0 | 1 | 16 |
31502314 | Git | 0.221 | 0.078 | -6 | -6 | -6 | -9 | -9 | 8 | 0 | 0.95 | 7.6 |
31502315 | Git | 0.123 | 0.053 | 0.073 | 0.2 | 0.402 | -6 | -4 | 20 | 5 | 1 | 25 |
31502316 | Git | 0.114 | 0.095 | 0.275 | 0.739 | 1.302 | 59.361 | -8 | 22.5 | 3 | 0.85 | 21.675 |
31502324 | Git | 0.068 | 0.052 | 0.071 | 0.099 | 0.114 | 0.334 | 5.739 | 30 | 5 | 1 | 35 |
31502328 | Git | 0.246 | 0.078 | 0.125 | 0.263 | 0.419 | 10.755 | 240.792 | 26.25 | 3 | 1 | 29.25 |
31502331 | Git | 0.169 | 0.075 | 0.079 | 0.222 | 0.353 | 12.966 | 255.108 | 26.25 | 3 | 0.85 | 24.8625 |
31502332 | NULL | -10 | -10 | -10 | -10 | -10 | -9 | -9 | 0 | 0 | 1 | 0 |
31502333 | Git | -7 | -7 | -7 | -7 | -7 | -9 | -9 | 0 | 5 | 1 | 5 |
31502334 | Git | 0.174 | 0.077 | 0.101 | 0.203 | 0.319 | 13.168 | 218.133 | 26.25 | 3 | 0.85 | 24.8625 |
31502336 | Git | 0.122 | 0.145 | 0.155 | 0.242 | 0.263 | 1.372 | 25.888 | 27.5 | 4 | 1 | 31.5 |
31502337 | NULL | 0.339 | 0.576 | 6.496 | 35.755 | -8 | -8 | -4 | 16 | 4 | 0.85 | 17 |
31502339 | Git | 0.116 | 0.057 | 0.181 | -6 | -6 | -9 | -9 | 12 | 1 | 0.85 | 11.05 |
31502340 | Git | 0.142 | 0.069 | 0.06 | 0.122 | 0.148 | 2.399 | 45.828 | 27.5 | 0 | 1 | 27.5 |
31502344 | Git | 0.167 | 0.103 | 0.103 | 0.116 | 0.156 | 2.685 | 51.668 | 27.5 | 0 | 0.85 | 23.375 |
31502348 | Git | 0.156 | 0.05 | 0.087 | 0.222 | 0.353 | 12.313 | 243.152 | 26.25 | 0 | 1 | 26.25 |
31502404 | Git | 0.151 | 0.111 | 0.474 | 2.205 | 4.259 | 206.795 | -8 | 21.6 | 0 | 0.85 | 18.36 |
31502409 | Git | -7 | -7 | -7 | -7 | -7 | -9 | -9 | 0 | 0 | 0.95 | 0 |
31502411 | Git | 0.269 | 0.199 | 0.159 | 0.238 | 0.266 | 2.114 | 34.045 | 27.5 | 4 | 1 | 31.5 |
31502412 | Git | -2 | -2 | -2 | -2 | -2 | -9 | -9 | 0 | 0 | 1 | 0 |
31502414 | Git | 0.23 | 0.053 | -6 | -6 | -6 | -9 | -9 | 8 | 3 | 1 | 11 |
31502420 | Git | 0.203 | 0.102 | 0.28 | 0.244 | 0.282 | 6.153 | 121.379 | 26.6 | 5 | 1 | 31.6 |
31502421 | Git | 0.189 | 0.096 | 0.177 | 0.434 | 0.547 | 19.238 | 381.466 | 26 | 2 | 1 | 28 |
31502424 | Git | 0.236 | 0.139 | 0.175 | 0.321 | 0.433 | 10.131 | 201.502 | 26.25 | 4 | 0.95 | 28.7375 |
31502430 | Git | 0.155 | 0.111 | 0.3 | 0.314 | 0.603 | 19.101 | 382.472 | 26 | 5 | 1 | 31 |
31502442 | Git | 0.349 | 0.083 | 0.087 | 0.114 | 0.145 | 0.169 | 2.489 | 30 | 5 | 1 | 35 |
31502443 | Git | 0.159 | 0.087 | 1.946 | 18.66 | 52.905 | -8 | -4 | 20 | 3 | 1 | 23 |
31502506 | Git | 0.189 | 0.052 | 0.077 | 0.163 | 0.23 | 5.987 | -6 | 25 | 0 | 1 | 25 |
31502512 | Git | 60.134 | 60.05 | 60.05 | -8 | -8 | -9 | -9 | 12 | 0 | 1 | 12 |
31502513 | Git | 0.403 | 0.154 | -8 | -8 | -8 | -9 | -9 | 8 | 1 | 1 | 9 |
31502517 | Git | 0.128 | 0.05 | 0.204 | -6 | -6 | -9 | -9 | 12 | 5 | 1 | 17 |
31502518 | Git | 0.202 | 0.063 | 0.142 | 0.325 | 0.66 | 21.757 | -6 | 22.5 | 0 | 0.7 | 15.75 |
31502519 | Git | -2 | -2 | -2 | -2 | -2 | -9 | -9 | 0 | 0 | 1 | 0 |
31502522 | Git | 0.175 | 0.056 | 0.067 | 0.106 | 0.126 | 0.817 | 17.371 | 30 | 3 | 0.9 | 29.7 |
31502533 | Git | 0.165 | 0.079 | 0.552 | 2.571 | 4.975 | 243.812 | -8 | 21.6 | 0 | 1 | 21.6 |
31502537 | Git | 4.545 | 0.135 | 0.177 | 0.344 | 0.454 | 13.772 | 270.73 | 26.25 | 3 | 1 | 29.25 |
31502538 | Git | 0.196 | 0.237 | 3.684 | -7 | -8 | -9 | -9 | 12 | 0 | 0.95 | 11.4 |
31502541 | Git | 0.189 | 0.112 | 0.164 | 0.23 | 0.297 | 7.437 | 147.79 | 26.6 | 3 | 1 | 29.6 |
31502609 | Git | 0.111 | 0.068 | 0.249 | 1.289 | -6 | -6 | -4 | 16 | 2 | 0.9 | 16.2 |
31502610 | Git | 0.151 | 0.063 | 0.071 | 0.128 | 0.199 | 3.273 | 64.282 | 27.5 | 2 | 0.9 | 26.55 |
31502614 | Git | 0.787 | 0.069 | 0.081 | 0.117 | 0.158 | 1.964 | 41.557 | 27.5 | 2 | 0.75 | 22.125 |
31502623 | Git | -2 | -2 | -2 | -2 | -2 | -9 | -9 | 0 | 0 | 1 | 0 |
31502626 | Git | 0.122 | 0.051 | 0.076 | 0.344 | 0.412 | 6.011 | 115.51 | 26.6 | 2 | 0.75 | 21.45 |
31502627 | Git | -1 | -1 | -1 | -1 | -1 | -9 | -9 | 0 | 0 | 1 | 0 |
31502629 | Git | 0.367 | 0.149 | 0.135 | 0.38 | 0.308 | 7.989 | 156.629 | 26.6 | 1 | 1 | 27.6 |
31502630 | Git | 0.219 | 0.115 | 0.198 | 0.163 | 0.354 | 3.393 | 64.817 | 27.5 | 0 | 1 | 27.5 |
31502631 | Git | -2 | -2 | -2 | -2 | -2 | -9 | -9 | 0 | 0 | 1 | 0 |
31502634 | Git | -10 | -10 | -10 | -10 | -10 | -9 | -9 | 0 | 0 | 1 | 0 |
31502639 | Git | 0.193 | 0.101 | 0.165 | 0.445 | 0.554 | 17.85 | 358.343 | 26 | 5 | 1 | 31 |
31502641 | Git | 0.137 | 0.095 | 1.88 | 18.646 | 50.606 | -8 | -4 | 20 | 1 | 1 | 21 |
31502642 | Git | 0.149 | 0.125 | 1.215 | 5.805 | 11.537 | 558.842 | -8 | 21.6 | 3 | 0.95 | 23.37 |
31502643 | Git | 0.155 | 0.157 | 0.124 | 0.241 | 0.352 | 10.227 | 200.909 | 26.25 | 2 | 1 | 28.25 |
31502644 | Git | 0.197 | 0.108 | 0.136 | 0.328 | 0.541 | 17.124 | 342.226 | 26 | 1 | 1 | 27 |
61500513 | Git | 60.246 | 60.038 | 60.056 | 60.035 | 60.044 | 600.075 | 600.031 | 22.6 | 3 | 1 | 25.6 |
71503427 | Git | 60.189 | 60.039 | 60.318 | 60.032 | 60.03 | 600.055 | 600.044 | 22.6 | 3 | 1 | 25.6 |
81500124 | Git | 0.226 | 0.185 | 0.291 | 1.004 | 1.152 | 52.701 | -8 | 22.5 | 5 | 0.85 | 23.375 |
31502306 | NULL | -11 | -11 | -11 | -11 | -11 | -9 | -9 | 0 | 0 | 1 | -30 |
31502341 | NULL | -11 | -11 | -11 | -11 | -11 | -9 | -9 | 0 | 0 | 1 | -30 |
31502415 | NULL | -11 | -11 | -11 | -11 | -11 | -9 | -9 | 0 | 0 | 1 | -30 |
31502431 | NULL | -11 | -11 | -11 | -11 | -11 | -9 | -9 | 0 | 0 | 1 | -30 |
31502433 | NULL | -11 | -11 | -11 | -11 | -11 | -9 | -9 | 0 | 0 | 1 | -30 |
31502435 | NULL | -11 | -11 | -11 | -11 | -11 | -9 | -9 | 0 | 0 | 1 | -30 |
31502446 | NULL | -11 | -11 | -11 | -11 | -11 | -9 | -9 | 0 | 0 | 1 | -30 |
31502509 | NULL | -11 | -11 | -11 | -11 | -11 | -9 | -9 | 0 | 0 | 1 | -30 |
31502529 | NULL | -11 | -11 | -11 | -11 | -11 | -9 | -9 | 0 | 0 | 1 | -30 |
51502125 | NULL | -11 | -11 | -11 | -11 | -11 | -9 | -9 | 0 | 0 | 1 | -30 |
数据
- 至发布博客时,有效选课人数76人
- 提交了有效的作业链接:74人
- Github上的项目有效:73人
- 正确地使用源代码管理:32人
- 完成
-c 50000
测试的同学:42人 - 完成
-c 1000000
测试的同学:34人
评分
本次项目评分主要从四个部分:
- 正确得分(5个测试点,满分20分)
- 效率得分(2个测试点,满分10分)
- 错误处理得分(5个测试点,满分5分)
- 源代码管理得分(5个要点,满分5分)
传统OJ的测试一般都是按点给分:在规定时间内过测试点给分,不过测试点就不给分。而本次个人项目测试之所以加了额外的三个方面测试,也是想让同学们从测试中体会一下完成一个软件工程题目与完成一个算法题目的区别。在Z班学生众多的情况下,这三个额外的测试带来了比较大的负担:每一项评分都需要仔细查看与复核,相比传统过测试点法付出的时间与精力要很多。值得庆幸的是自己准备得比较早,开发了一套自动测试的工具链接,减轻了不少正确性测试部分的负担。
不同方面的评价出于不同的目的,但总的目的还是想让大家感受软件工程的魅力,体会从需求分析,代码实现到单元测试的整个流程。
- 正确得分是想让用心完成项目的同学都能拿到一个至少可以及格的分数,所以虽然数据量只有1000,但也设置了一个比较宽裕的时间上限60s。
- 效率得分的设置则是为了让同学们都有动力对自己的算法迭代改进。这种按照运行时间落在档级给分的规则,也融合了一些北航团队项目“档级给分制”的思想。
- 错误处理得分是为了让同学们有意识地练习写健壮的程序。软件工程不是ACM题,不是说“打一段代码提交过了测试点”就可以的,培养学生主动考虑并处理错误情况的意识是很重要的一环。
- 源代码管理得分是为了让同学们注意到使用 Git 时需要遵循一定的规范。源代码管理不是简单地把工程打包上传到 Github 上,这只能叫存放,不能叫管理。我们期望通过这一点告诉同学们什么样的操作是好的操作,引导学生向好的做法看齐,并让他们知道该怎样改进。
诚然,每个部分都暴露了大大小小的问题,有学生的,也有我自己的。下面讲一讲遇到的这些问题,并与各位老师分享自己最后解决的经验与教训。
问题
正确性测试
正确性测试部分暴露出来的问题是最严重的,也是最超乎我想象的。主要的问题集中在三个方面:
-
没看需求,盲目下手:将近一半的同学没有仔细阅读或者没有阅读
测试须知
一节,导致个人项目第一次自动测试时许多同学的项目都无法正常测试。 - 不做完备测试,依赖助教反馈:一部分同学是使用其他平台(Linux, Mac OS)开发的,在完成自己的项目后并未通过其他途径(寻找同学,搭建虚拟机等)测试过自己的exe文件是否可运行。当然还有一部分 Windows平台下开发的同学,没有在测试前通过多方面的验证与测试确保自己的可执行文件没问题,而是寄希望于助教的测试反馈来修正。
-
需求主次不明,存在侥幸心理:少部分同学没有分清需求的主次,过分追求生成的速度而忽略了需求中的
数独棋盘必须不重复
的条件,导致测试失分。
Part1.盲目下手
第一个问题暴露出同学们拿到题目后不做需求分析,直接上手编码的坏习惯。我猜一部分同学在做这个数独题目的时候大概是这样的场景:
- 老师:恭喜大家收获作业 * 1
- 学生:开心(抑制不住悲伤)地点开了作业链接
- ...
- 10秒后,学生关掉了作业,开始百度:常见的数独求解算法
实际上,像这样匆匆扫一眼就开始码代码是软件工程里最忌讳的事情。可能会有同学说:助教,我确实是在设计了数独算法以后才开始实现的算法。但是我想说的是,在开发中设计并非第一步,需求分析才是,这一点从给大家的 PSP 表格中也能看出来。分析一个题目就跟高中做阅读理解一样:
- 粗读一遍,知晓题目背景,大概了解题目要求你做什么;
- 精读一遍,理清题目的要求,需要提交内容的规范,题目的截止时间等等;
- 最后再细过一遍,确保没有漏掉题目中任何一个有用的细节。
而本次测试中发现,约一半的同学在Github上的仓库非常“*”,并没有按照指定的规范来。有的同学的画风是这样的:
还有同学的画风是这样的:
如今面对这样的问题我也有了一些粗浅的认识:一定要把最希望学生认真读完的部分放在博客的最开始,让学生一点开博客就最先看到它。附加题,补充说明,参考链接等补充材料都放在后面,勤于思考的同学自然会去看。比如我在这个博客中所做的事情——把成绩排行榜放在了最后 :)
Part2.被动测试
第二个问题则暴露出部分同学在工程测试上比较被动、依赖于助教的心理。每位同学个人项目得多少分与助教是没有任何关系的,项目的得分只会影响自己的成绩。换句话说,这次测试如果我直接以第一次自动测试的成绩给大家评分,不给任何悔过的机会,这对我而言是没有任何损失,还大大减轻了我的工作量。
但考虑到这是同学们在软件工程课程里的第一次大展身手的机会,希望给大家悔过的机会是为了让大家能从错误里吸取教训,快速成长。但请记得,如果将来你做了一款需要靠用户来找BUG的产品,那恐怕它上线没多久就再也活不下去了。要主动,自己能够把握的事情就不要让它听天由命,*发挥。
Part3.需求权衡
第三个问题则是一个典型的权衡问题,问题同样是出现在需求分析方面。从题目中的要求我们其实不难看到:
- 随机生成N个不重复的已解答完毕的数独棋盘,并输出到sudoku.txt中。
- [2017.9.4 新增要求] 在生成数独矩阵时,左上角的第一个数为:(学号后两位相加)% 9 + 1。
题目明确提出了“不重复”“已解答完毕”“左上角数由学号确定”三点要求,它们也是题目的核心条件。而至于“10分钟内生成100万个数独棋盘”,它是只作用于效率测试的,棋盘满足前面三个条件下的额外约束。只有在满足前面三个正确性条件下,效率测试才有意义。所以同学们在完成项目时,切忌“丢了西瓜捡芝麻”,要对需求功能的优先级排个序,按照重要程度逐一实现。
Part4.生成文件路径问题
在测试同学们项目的过程中还出现了一个小插曲:有一部分同学认为题目中的“要确保 txt 文件和 exe 文件要在同个目录下”是助教特意强调的,需要对exe的运行时路径进行获取从而生成 txt文件的生成路径,其他直接使用 "./sudoku.txt" 路径的做法是存在问题的。在这里必须表扬一下这些看起来较真的同学,同时我来解释一下这个问题。
使用命令行测试exe文件有几种方式:
理想化的测试环境:使用 cd 进入了 exe 所在的目录,然后调用 exe 文件,生成了 txt 文件。操作如下图
意想不到的测试环境:当前目录并不是 exe 所在的目录,使用相对路径或绝对路径调用 exe 文件,生成了 txt 文件。操作如下图
在这里表扬这几位同学并非是因为他们因此多得了分,因为这本来并非是测试的要点。实际上,更多要表扬的是他们这种敢于质疑的态度和考虑周全的细致。没有哪个用户能确保一定在合法环境下运行软件,开发者可能要考虑更多的是在非法环境下如何做出同样的效果,或者是给出合理的提示。
在正确性测试中有不少同学是通过迭代改进才修复好BUG的,这里推荐陈涵同学的作业:他的博客详细地记载了修复BUG的过程,博客组织条理清晰,改进方法令人信服。博客最后所述通过构建之法得到的启示让我觉得非常欣慰,这才是真正学到了构建之法与软件工程的内涵。链接:http://www.cnblogs.com/kobe961231/p/7492920.html。
效率测试
在项目的效率测试方面我对同学们的表现是比较满意的,大部分同学在初个迭代版本后都有所改进。从我看过的项目与博客来看,改进多集中于三点:
- 从DEBUG到RELEASE模式
- 文件输出
- 算法核心
第一个改进是最容易的,也就是让BIN
文件夹中用于测试的二进制文件使用RELEASE模式
而非DEBUG模式
生成。在这里大概说一下两者的区别,学过编译的同学应该知道编译优化(包括循环优化,控制优化,活跃变量分析等),在DEBUG模式
下编译器是不会对程序做任何优化的,而RELEASE模式
下则会对程序进行优化。与此同时,RELEASE模式
下编译速度会下降,部分变量被优化而不好调试。更感兴趣的同学可以参看链接
DEBUG和RELEASE模式的区别。
第二个改进相信是大部分同学的选择,毕竟改进文件输出的效率要比改进算法要容易得多。常见的有两种改进的手段:
- 改进前:生成一个数独棋盘,就写入一次文件。改进后:把生成的数独棋盘保存在内存中,一次性写入文件。
- 改进前:使用 ofstream 与 << 的格式写入文件。改进后:使用 C 的函数 fwrite,fprint 或者是 puts 函数写入文件。
第一种改进手段减少了文件打开与关闭的次数,同时让缓冲区一直处于填满状态,从而加快效率。第二种手段则是因为 fwrite 等函数是 C 底层使用的基础函数,而ofstream 是 C++ 引入的输出流类。C++ 通过引入虚函数简化了编程逻辑,提高了安全性,但也因为引入过多抽象层带来了相应的性能开销,所以会慢。
第三个改进需要动到算法的核心,在阅读了同学们的代码与博客后发现生成数独的算法大多分为三种或它们的组合:
- 深度优先搜索与回溯
- 随机产生与回溯
- 矩阵置换法
从同学们作业完成的情况来看:在小数据上,随机产生与回溯的方法生成的多样性要好,但要引入额外的重复性检查方法。在大数据上,随机产生方法基本不可行,剩下两种方法中深度优先搜索的速度要比矩阵置换法快,能生成的数据也比较多。但矩阵置换法的优点在于充分利用了数独游戏的规律,避免了试错的检验过程。
在这里强烈推荐刘晨瑶同学的作业:效能分析能对程序改进起到多大的作用?从文件操作到算法改进,再到最后做实验选择合适的参数。不断迭代带来的巨大改进竟让程序加速了100多倍! 链接:http://www.cnblogs.com/thousfeet/p/7502211.html
错误处理
在题目要求中我特意提示了大家测试数据可能存在错误,但从结果来看大家的错误处理做得并不够好。本次错误处理测试了5个参数:
- "-c"
- "-c -100"
- "-abc 1"
- ""(空参数)
- "-c -c 1"
大部分同学在错误处理部分都或多或少有程序崩溃的情况出现,也有很多同学在错误出现后没有任何提示。这两者都是需要开发者极力避免的,错误处理得越好,用户体验就越好。试想一下如果你开发了一款软件,随便输入几个非法指令就能把它搞崩溃的话,还会有用户继续用么?
在错误处理部分做得非常棒的是郑浩辉同学,大家可以看看他的错误提示:
-【开始校验参数】【校验参数中】请输入生成数量
-【开始校验参数】【校验参数中】生成数量只能是数字
-【未知指令】试试 -help ?
-【请输入指令及相关参数】试试 -help ?
-【开始校验参数】【校验参数中】请勿输入多余参数
郑同学的博客排版非常棒,算法思路也很清晰,他也是本次成绩排行榜的第一名,欢迎大家围观他的博客。链接:http://www.cnblogs.com/andwho/p/7500515.html
源代码管理
可能因为不少同学都是初次接触 Git 和 Github,在源代码管理方面同学们普遍做得不好。源代码管理评分方面的具体细则如下:
-
commit
的频率与 message 中的信息。 - 项目仓库是否提供了运行说明。
- 项目仓库是否忽略了无用文件, 是否使用 gitignore 来忽略编译生成的文件。
- 项目仓库是否用了 dev/master 等分支功能实现不同版本的迭代更新。
- 项目仓库是否使用 Pull Request 的方式发起,并有规范的 code review 环节。
部分同学在源代码管理上得分为0或者1,主要是因为你们commit的次数少于2,或者大部分commit都是通过上传文件的形式完成的。
范本Github使用记录可以参考陈翔同学的博客:他的项目不仅有完整的运行说明,可读的commit信息注释,恰当的commit频率,还配置了集成测试。这个简直是一份完美的Github项目范例,推荐给各位同学。链接:http://www.cnblogs.com/qq952693358/p/7487056.html
博客成绩明细
学号 | 博客地址 | Github | PSP表 | 解题 | 设计 | 代码说明 | 测试 | 性能 | 合计 |
---|---|---|---|---|---|---|---|---|---|
11500908 | Blog | 1 | 0.5 | 2 | 1 | 4 | 2 | 1 | 11.5 |
31501102 | Blog | 1 | 0.5 | 2 | 3.5 | 3 | 1 | 0 | 11 |
31502106 | Blog | 1 | 1 | 3 | 4 | 5 | 3 | 3 | 20 |
31502109 | Blog | 1 | 0 | 2 | 0 | 3 | 1 | 0 | 7 |
31502113 | Blog | 1 | 1 | 3 | 4 | 4 | 2 | 3 | 18 |
31502142 | Blog | 1 | 1 | 3 | 2 | 2 | 1.5 | 2 | 12.5 |
31502209 | Blog | 1 | 1 | 3 | 3.5 | 4 | 2 | 2 | 16.5 |
31502210 | Blog | 1 | 1 | 2 | 1 | 1 | 1 | 1 | 8 |
31502212 | Blog | 1 | 0.5 | 2 | 1 | 1 | 1 | 1 | 7.5 |
31502216 | Blog | 1 | 0.5 | 2 | 3 | 1 | 1 | 1.5 | 10 |
31502220 | Blog | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
31502232 | Blog | 1 | 0.5 | 3 | 2 | 3 | 1 | 3 | 13.5 |
31502240 | Blog | 1 | 0.5 | 2 | 2 | 2 | 1 | 2 | 10.5 |
31502243 | Blog | 1 | 0.5 | 2 | 2.5 | 3.5 | 1 | 2 | 12.5 |
31502245 | Blog | 1 | 1 | 1 | 1 | 3 | 1 | 1 | 9 |
31502308 | Blog | 1 | 0.5 | 2 | 4 | 4 | 1 | 3 | 15.5 |
31502309 | Blog | 1 | 0.5 | 1.5 | 1 | 3 | 1 | 1.5 | 9.5 |
31502310 | Blog | 1 | 1 | 3 | 2.5 | 1 | 2 | 3 | 13.5 |
31502312 | Blog | 1 | 1 | 1.5 | 2 | 1 | 1 | 1.5 | 9 |
31502314 | Blog | 1 | 0 | 2 | 0 | 2 | 1 | 1 | 7 |
31502315 | Blog | 1 | 1 | 3 | 2.5 | 3.5 | 2 | 2 | 15 |
31502316 | Blog | 1 | 1 | 2 | 1 | 3 | 1 | 2 | 11 |
31502324 | Blog | 1 | 1 | 2 | 3 | 3.5 | 1 | 3 | 14.5 |
31502328 | Blog | 1 | 0.5 | 2 | 1 | 3 | 1 | 2 | 10.5 |
31502331 | Blog | 1 | 0.5 | 1.5 | 0 | 0.5 | 1 | 1 | 5.5 |
31502332 | Blog | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
31502333 | Blog | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
31502334 | Blog | 1 | 1 | 1.5 | 3 | 3.5 | 1 | 1.5 | 12.5 |
31502336 | Blog | 1 | 1 | 3 | 4 | 4.5 | 2 | 2 | 17.5 |
31502337 | Blog | 1 | 0.5 | 2 | 2 | 3 | 1 | 0 | 9.5 |
31502339 | Blog | 1 | 1 | 2 | 2 | 2 | 1 | 2 | 11 |
31502340 | Blog | 1 | 1 | 3 | 2.5 | 1 | 1 | 1 | 10.5 |
31502344 | Blog | 1 | 1 | 1.5 | 0 | 0 | 2 | 0 | 5.5 |
31502348 | Blog | 1 | 1 | 2 | 1.5 | 2 | 1 | 1 | 9.5 |
31502404 | Blog | 1 | 0.5 | 2 | 2 | 3 | 1 | 2 | 11.5 |
31502409 | Blog | 1 | 0.5 | 1.5 | 2.5 | 3 | 1 | 0 | 9.5 |
31502411 | Blog | 1 | 1 | 3 | 2 | 4 | 3 | 1 | 15 |
31502412 | Blog | 1 | 0.5 | 1 | 1.5 | 1 | 1 | 1 | 7 |
31502414 | Blog | 1 | 1 | 2.5 | 2.5 | 3 | 1 | 0 | 11 |
31502420 | Blog | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
31502421 | Blog | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
31502424 | Blog | 1 | 1 | 3 | 3.5 | 4 | 1 | 3 | 16.5 |
31502430 | Blog | 1 | 0.5 | 2 | 2 | 2 | 3 | 3 | 13.5 |
31502442 | Blog | 1 | 1 | 3 | 4 | 5 | 2 | 3 | 19 |
31502443 | Blog | 1 | 1 | 3 | 3.5 | 4 | 3 | 1 | 16.5 |
31502506 | Blog | 1 | 1 | 2 | 2 | 1 | 1 | 1 | 9 |
31502512 | Blog | 1 | 0.5 | 2 | 0 | 0 | 1 | 1 | 5.5 |
31502513 | Blog | 1 | 0.5 | 2.5 | 0 | 3 | 1 | 0 | 8 |
31502517 | Blog | 1 | 1 | 3 | 3 | 4 | 2 | 2.5 | 16.5 |
31502518 | Blog | 1 | 1 | 2.5 | 4 | 4 | 1 | 2 | 15.5 |
31502519 | Blog | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
31502522 | Blog | 1 | 1 | 3 | 3.5 | 3 | 2 | 5 | 18.5 |
31502533 | Blog | 1 | 0.5 | 2 | 2 | 3 | 2 | 1.5 | 12 |
31502537 | Blog | 1 | 1 | 2 | 2.5 | 3.5 | 1 | 2 | 13 |
31502538 | Blog | 1 | 0.5 | 2 | 3.5 | 3 | 1 | 2 | 13 |
31502541 | Blog | 1 | 1 | 3 | 2 | 4 | 2 | 3 | 16 |
31502609 | Blog | 1 | 0.5 | 1.5 | 1 | 2 | 1 | 1 | 8 |
31502610 | Blog | 1 | 1 | 3 | 3 | 3 | 1 | 2.5 | 14.5 |
31502614 | Blog | 1 | 1 | 1.5 | 1 | 3 | 1 | 2 | 10.5 |
31502623 | Blog | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
31502626 | Blog | 1 | 0.5 | 2.5 | 2 | 3 | 1 | 1.5 | 11.5 |
31502627 | Blog | 1 | 0 | 2 | 0 | 1 | 0 | 0 | 4 |
31502629 | Blog | 1 | 1 | 1.5 | 0 | 1 | 0 | 1 | 5.5 |
31502630 | Blog | 1 | 0.5 | 1 | 2 | 2 | 0 | 1.5 | 8 |
31502631 | Blog | 1 | 0.5 | 1 | 1 | 2 | 0 | 1 | 6.5 |
31502634 | Blog | 1 | 1 | 2 | 1 | 1 | 1 | 1 | 8 |
31502639 | Blog | 1 | 1 | 3 | 3.5 | 3.5 | 1 | 2.5 | 15.5 |
31502641 | Blog | 1 | 1 | 3 | 2 | 3 | 2 | 1.5 | 13.5 |
31502642 | Blog | 1 | 1 | 2 | 2.5 | 3.5 | 1 | 2 | 13 |
31502643 | Blog | 1 | 0.5 | 2 | 1.5 | 1.5 | 1 | 1 | 8.5 |
31502644 | Blog | 1 | 0.5 | 2 | 2 | 3.5 | 1 | 2 | 12 |
61500513 | Blog | 1 | 0.5 | 2 | 3.5 | 3.5 | 1 | 1.5 | 13 |
71503427 | Blog | 1 | 0.5 | 2 | 1 | 3 | 1 | 2 | 10.5 |
81500124 | Blog | 1 | 0.5 | 2 | 1 | 3 | 1 | 0 | 8.5 |
成绩排行榜
学号 | 博客地址 | 博客分数 | 项目地址 | 项目得分 | 源代码管理 | 总分 | 映射分 |
---|---|---|---|---|---|---|---|
31502442 | Blog | 19 | Git | 35 | 5 | 59 | 100 |
31502106 | Blog | 20 | Git | 31.5 | 3 | 54.5 | 99 |
31502324 | Blog | 14.5 | Git | 35 | 3.5 | 53 | 97 |
31502522 | Blog | 18.5 | Git | 29.7 | 4 | 52.2 | 96 |
31502308 | Blog | 15.5 | Git | 35 | 1 | 51.5 | 95 |
31502336 | Blog | 17.5 | Git | 31.5 | 2 | 51 | 94 |
31502310 | Blog | 13.5 | Git | 32.5 | 4 | 50.5 | 93 |
31502411 | Blog | 15 | Git | 31.5 | 2 | 48.5 | 91 |
31502639 | Blog | 15.5 | Git | 31 | 1 | 47.5 | 90 |
31502541 | Blog | 16 | Git | 29.6 | 1 | 46.6 | 89 |
31502424 | Blog | 16.5 | Git | 28.7375 | 1 | 46.2375 | 88 |
31502430 | Blog | 13.5 | Git | 31 | 1 | 45.5 | 87 |
31502537 | Blog | 13 | Git | 29.25 | 2 | 44.25 | 86 |
11500908 | Blog | 11.5 | Git | 29.25 | 3 | 43.75 | 85 |
31502212 | Blog | 7.5 | Git | 32.5 | 2 | 42 | 83 |
31502315 | Blog | 15 | Git | 25 | 2.5 | 42.5 | 83 |
31502610 | Blog | 14.5 | Git | 26.55 | 1 | 42.05 | 83 |
31502328 | Blog | 10.5 | Git | 29.25 | 2 | 41.75 | 82 |
31502216 | Blog | 10 | Git | 28.6 | 2 | 40.6 | 81 |
31502443 | Blog | 16.5 | Git | 23 | 1 | 40.5 | 81 |
31502245 | Blog | 9 | Git | 30 | 1 | 40 | 80 |
31502644 | Blog | 12 | Git | 27 | 1 | 40 | 80 |
61500513 | Blog | 13 | Git | 25.6 | 1 | 39.6 | 80 |
31502340 | Blog | 10.5 | Git | 27.5 | 1 | 39 | 79 |
31502348 | Blog | 9.5 | Git | 26.25 | 3 | 38.75 | 79 |
31502209 | Blog | 16.5 | Git | 16 | 5 | 37.5 | 77 |
31502334 | Blog | 12.5 | Git | 24.8625 | 0 | 37.3625 | 77 |
31502517 | Blog | 16.5 | Git | 17 | 4 | 37.5 | 77 |
31502533 | Blog | 12 | Git | 21.6 | 4 | 37.6 | 77 |
31502642 | Blog | 13 | Git | 23.37 | 1 | 37.37 | 77 |
31502643 | Blog | 8.5 | Git | 28.25 | 1 | 37.75 | 77 |
31502243 | Blog | 12.5 | Git | 22.5 | 2 | 37 | 76 |
31502630 | Blog | 8 | Git | 27.5 | 1 | 36.5 | 76 |
71503427 | Blog | 10.5 | Git | 25.6 | 1 | 37.1 | 76 |
31502309 | Blog | 9.5 | Git | 24.5 | 1 | 35 | 74 |
31502506 | Blog | 9 | Git | 25 | 1 | 35 | 74 |
31502518 | Blog | 15.5 | Git | 15.75 | 4 | 35.25 | 74 |
31502626 | Blog | 11.5 | Git | 21.45 | 2 | 34.95 | 74 |
31502641 | Blog | 13.5 | Git | 21 | 1 | 35.5 | 74 |
31502142 | Blog | 12.5 | Git | 21 | 1 | 34.5 | 73 |
31502614 | Blog | 10.5 | Git | 22.125 | 2 | 34.625 | 73 |
31502629 | Blog | 5.5 | Git | 27.6 | 1 | 34.1 | 73 |
31502109 | Blog | 7 | Git | 24 | 2 | 33 | 71 |
31502316 | Blog | 11 | Git | 21.675 | 0 | 32.675 | 71 |
31502420 | Blog | 0 | Git | 31.6 | 1 | 32.6 | 71 |
81500124 | Blog | 8.5 | Git | 23.375 | 1 | 32.875 | 71 |
31502113 | Blog | 18 | Git | 10.45 | 4 | 32.45 | 70 |
31502344 | Blog | 5.5 | Git | 23.375 | 3 | 31.875 | 70 |
31502404 | Blog | 11.5 | Git | 18.36 | 2 | 31.86 | 70 |
31502331 | Blog | 5.5 | Git | 24.8625 | 1 | 31.3625 | 69 |
31502421 | Blog | 0 | Git | 28 | 1 | 29 | 66 |
31502240 | Blog | 10.5 | Git | 15 | 3 | 28.5 | 65 |
31502337 | Blog | 9.5 | NULL | 17 | 0 | 26.5 | 63 |
31502312 | Blog | 9 | Git | 16 | 1 | 26 | 62 |
31502538 | Blog | 13 | Git | 11.4 | 1 | 25.4 | 61 |
31502609 | Blog | 8 | Git | 16.2 | 1 | 25.2 | 61 |
31501102 | Blog | 11 | Git | 11.4 | 2 | 24.4 | 60 |
31502339 | Blog | 11 | Git | 11.05 | 1 | 23.05 | 57 |
31502414 | Blog | 11 | Git | 11 | 0 | 22 | 55 |
31502512 | Blog | 5.5 | Git | 12 | 2 | 19.5 | 48 |
31502232 | Blog | 13.5 | Git | 2.55 | 2 | 18.05 | 45 |
31502513 | Blog | 8 | Git | 9 | 0 | 17 | 42 |
31502314 | Blog | 7 | Git | 7.6 | 1 | 15.6 | 39 |
31502210 | Blog | 8 | Git | 3 | 2 | 13 | 32 |
31502409 | Blog | 9.5 | Git | 0 | 0 | 9.5 | 23 |
31502634 | Blog | 8 | Git | 0 | 1 | 9 | 22 |
31502220 | Blog | 1 | Git | 5 | 2 | 8 | 20 |
31502412 | Blog | 7 | Git | 0 | 0 | 7 | 17 |
31502631 | Blog | 6.5 | Git | 0 | 0 | 6.5 | 16 |
31502333 | Blog | 1 | Git | 5 | 0 | 6 | 15 |
31502627 | Blog | 4 | Git | 0 | 1 | 5 | 12 |
31502332 | Blog | 1 | NULL | 0 | 0 | 1 | 2 |
31502519 | Blog | 0 | Git | 0 | 0 | 0 | 0 |
31502623 | Blog | 0 | Git | 0 | 0 | 0 | 0 |
31502306 | NULL | -20 | NULL | -35 | -5 | -60 | -100 |
31502341 | NULL | -20 | NULL | -35 | -5 | -60 | -100 |
31502415 | NULL | -20 | NULL | -35 | -5 | -60 | -100 |
31502433 | NULL | -20 | NULL | -35 | -5 | -60 | -100 |
31502435 | NULL | -20 | NULL | -35 | -5 | -60 | -100 |
31502446 | NULL | -20 | NULL | -35 | -5 | -60 | -100 |
31502500 | NULL | -20 | NULL | -35 | -5 | -60 | -100 |
31502509 | NULL | -20 | NULL | -35 | -5 | -60 | -100 |
31502529 | NULL | -20 | NULL | -35 | -5 | -60 | -100 |
51502125 | NULL | -20 | NULL | -35 | -5 | -60 | -100 |
BaseLine | NULL | 10 | NULL | 12 | 2 | 24 | 24 |