数独sudoku(一)题目分析
大家好,今天我开始更新博客了。
这系列博客我将逐步介绍我在完成sudoku这个课程大作业的进展,以及一些个人所思与收获。这是我第二次发表博客,也是第一次写技术博客。肯定有不少同学和我一样是因大作业任务要求开始写博客,我觉得这步跨越很有意义,写博客能让我们将输入转化为输出,加深理解与记忆,把问题分析得更加透彻。sudoku是软件工程的大作业,这个任务并不难,也有很多资料可循,但是通过这个不算难的任务掌握软件设计的流程是更关键的。这是我第一次接触软件开发,会接触很多新的知识与技巧,万事开头难,但我将尽己所能做得更好。
首先给出任务的详细要求:https://github.com/surpasss/software-engineering/blob/master/项目要求.pdf
分三个子任务:
1. 生成终局,命令行输入形式为:sudoku.exe -c n(n为生成不重复终局的数量,1<=n<=1000000),生成的终局保存在sudoku.txt文本文件中。
2. 求解数独,命令行输入形式为:sudoku.exe -s path,从路径中读取数独题目,将每个题目的一个可行解保存在sudoku.txt文本文件中。
3. GUI游戏,随机生成初始数独棋局,玩家提交后得到反馈是否做对。
另外还需要性能优化、代码质量分析、软件测试等,即按照软件开发的流程完成这个项目。
这里我补充解释下什么是数独,数独由9个3×3小棋盘组成的9×9的大棋盘,小棋盘包含19这9个数字,大棋盘的每一行、每一列的9个数字均不相同,即每一行、每一列都包含19这9个数字。
之前也花了一些时间在网上看了一些相关资料,谈谈当前我对这三个子任务的简单理解。首先是生成终局,这是有规律可循的,要不然1e6这个数字也太大了,至于规律之后再细说;第二个求解数独的任务需要用到算法上的回溯与递归,代码量可能比较庞大;而最后的GUI游戏,并没有涉及到什么算法上的知识,很容易判定玩家是否做对,关键是如何生成这个游戏页面,我在网上看到用C#和Java实现的比较多。
GUI游戏和前两个子任务的关联并不是很大,因为不是调用同一个接口,这也是道附加题,所以之后的诸多阶段就先不考率GUI游戏了,等把前两个任务完成后再来单独处理。而对于前两个子任务,是选择结构化语言C还是面向对象语言C++呢,这是要针对具体问题具体分析的。在我个人看来,C++相比于C是把属性和方法封装在一起,构成一个类,具有封装性、继承性和多态性。而在数独这个项目中,涉及到的实体并不多,主要是通过一些函数完成特定功能,所以我觉得C++的继承性和多态性体现不出来,而出于算法性能和代码结构的考虑,我还是选择底层且高效的C语言。但是由于C++中的很多接口函数使用起来方便高效,所以会选择使用STL库中的合适函数。
因为项目要求文档已经描述得很清楚了,基本可以包含需求分析的最终产物——软件规格说明书,同样都是回答“必须要做什么”,所以我就用题目分析来代替需求分析。下面给出结构化分析阶段的数据流图。


总而言之,这个大作业并不算难,但是对于我这个软件开发的新手来说,还是很具有挑战性和有意义的。下面给出开始实现程序之前的PSP表格,这上面的预估计时并不会影响我实际的花费时间,与实际耗时可能有较大出入,因为很多东西都是现学,初学阶段过程和方法最重要。

先这样了,后续内容敬请期待。

浙公网安备 33010602011771号