软件工程基础——个人项目纪实
目录
个人项目纪实说明
本文主要记录了“软件工程个人项目——数独”的开发过程。
2018年12月6日(1小时)
下载并安装了git,登陆了GitHub账号,并创建了一个新的仓库 MySudoku 。
2018年12月12日(1.5小时)
制定项目计划,完成需求分析,并查阅相关资料,确定实现需求所需要的算法。
2018年12月13日(2小时)
学习通过 visual studio 2017 利用GitHub进行代码管理,重新建立了工程。
2018年12月14日(1小时)
完成了主函数的构建,可以对在命令行输入的命令进入对应的函数。
2018年12月16日(4小时)
完成了数度生成的需求。第一版的版本效率非常低,生成100W个数独终局需要2min多的时间。在网上找了一个博客,跑了以下代码发现,只用了不到4秒的时间就完成了。因此,通过优化不同部分的代码已达到更高的效率。
首先,发现自己写的(char*)转int对时间有一定的影响。在改成调用atoi函数后,时间比原来短了一些,但效果依然不理想。
2018年12月18日(10小时)
通过与大佬的沟通与交流,发现了耗时如此之久的原因,主要是使用了C++中的文件流来实现文件的写入。后来换成了C里的文件操作,时间降到了10s左右。
并学习了一些优化的方法。比如,写入文件时一次性写入(我原来是一行一行写入的)会降低时间的代价;移动数组的组合也会浪费时间,因为知道组合的原因,可以直接列出来是,用的时候直接通过下标找;其次,我考虑到函数调用次数多的话,时间的代价可能会增加,所以在设计通过平移排列数生成数独终局的函数的时候,我将本来只能生成一个终局的函数改为了一次最多生成144个终局的函数。
经过两天的修改、调试,数独生成器总算是告一段落了,实属不易。调试过程中,由于一些小问题,不知为什么,函数并没有按照我设想的调用执行,后来静态审查了一遍代码,才发现了问题。
2018年12月19日(2小时)
使用python实现了一下生成数独题目的功能,以便后期解数独用。
发现atoi函数对于非法输入的处理不正确,又改回了原来的做法。atoi函数顺序处理字符串中的字符,当遇见不能转换为int的则终止,如123a456,返回值即为123,而非0或者其他处理。
2018年12月20日(2小时)
思考使用什么方法进行数独的求解,初步构建了解数独时的数据结构,并初步完成了解数独的框架,完成了数独题目的读入。
2018年12月25日(8小时)
完成了解数独的代码,并初步做了优化。
初始完成时的第一版本,解决一百万个数独谜题需要2分钟左右。把输入由fscanf函数改为fgets函数后,时间在80s左右,时间缩短了近一倍。
2018年12月26日(5小时)
改进优化求解数独的程序,尝试使用不同的方法测试效率的高低,以找到较为适合的方式。
2018年12月27日(3小时)
修改代码格式,编写博客,修整GitHub的代码管理。