软件工程实践2017第二次作业
-
解题思路
题目要求生成终盘的数独,数独这个游戏上学期恰好有在手机app上玩过,也知道了游戏的规则,所以就不用再花时间去了解游戏规则。想了一会想不出什么思路,于是就去网上找资料,毕竟要站着巨人的肩膀上学习会更高效。于是找了很久,可是阅读代码的能力很弱,很多代码都看不懂,所以这次作业的代码当然是我自己打的。。
有看到一个思路:
第一格随机生成一个数字->生成第一行不重复的1~9排列
->从第二行到最后一行为一个外层循环,内层是每行第一到第九个数字,每次生成数字时检索该行左边和该列上边部分,还有所在格子的第一个小格子到该格前一个所有出现过的数字,将其移除,在剩余的数字中选择一个
->注意仅这样做不够,因为实测时会发现有时候9个数字都出现了,这样就没有数字可供选择,于是进行一个判断
出自http://blog.sina.com.cn/s/blog_6b7b1eb90102vrvu.html
在看过许多其他思路之后发现这个思路比较好实现(编码能力实在较弱),于是就决定按着这个思路去编码。
-
设计实现
1 该项目只有1个类,5个函数包括,3个判断条件函数,1个主函数,1个输出函数。
2 首先由于我的学号后两位是14,所以数独的左上角的数字应该为6,所以先初始化9×9的矩阵,并把a[0][0]置为1,其他未填的置0表示
3 将第一行剩余8个格随机用除了6的其他1-9的不重复数字填入
4 从第二行开始,从左到右依次填入数据,若填入1-9的数据都不符合要求,则回溯到前一个格子,直至完成数独。 -
代码说明
首先在第一个问题就是在第一行生成1-9不重复的数字,我想应该会有一个可以实现他的函数,网上找似乎是有一个函数,可不会用,就只能自己实现了。
for(int i=1;i<9;i++)
{
a[i][0]=rand()%9+1;
while(b [a[i][0]-1] ==1)
{
a[i][0]=a[i][0]%9+1;
}
b [a[i][0]-1]=1;
}
用了这样的方法进行随机,但是有一个毛病就是随机性可能会差一点但是效率会比完全随机高一些。
另外一个核心代码是3个判断,一个是行判断,判断所填入的位置之前的行是否已经出现这个数字了,如果出现了就把数字+1继续判断
一个是列判断,判断当前要填入的数字在同列中是否出现过,若出现过,则+1继续判断
另外一个是宫判断,判断当前填入的数字在同一个宫内是否已经出现过,若出现过,则+1继续判断。(当然是在1-9直接判断,+1的数字要先模9再加1)
bool judgerow(int x[][9],int i,int j) //行判断
{
for(int k=0;k<j;k++)
{
if(x[k][i]==x[j][i])
return false;
}
return true;
}
bool judgeline(int x[][9],int i,int j) //列判断
{
for(int k=0;k<i;k++)
{
if(x[j][k]==x[j][i])
return false;
}
return true;
}
bool judgehouse(int x[][9],int i,int j)// 宫判断
{
int t=i-i%3+3;
int s=j-j%3+3;
for(int l=i-i%3;l<t;l++)//行
{
for(int k=j-j%3;k<s;k++)//列
{
if(i==l && j==k)
return true;
if(x[j][i]==x[k][l])
return false;
}
}
}
然后在填入数字的时候,可能1-9都没办法填入,说明之前的填入是错误的,应该回溯,重新选择填入前一个格子的数字。
- 测试运行
目前还不能在命令行测试,正在改进代码。。
- 性能分析
性能分析工具无法使用,或者没学会怎么使用。要学的还有很多很多。
- PSP文档
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 20 |
· Estimate | · 估计这个任务需要多少时间 | 20 | 20 |
Development | 开发 | 520 | 450 |
· Analysis | · 需求分析 (包括学习新技术) | 100 | 120 |
· Design Spec | · 生成设计文档 | 0 | 0 |
· Design Review | · 设计复审 (和同事审核设计文档) | 0 | 0 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 0 | 0 |
· Design | · 具体设计 | 120 | 90 |
· Coding | · 具体编码 | 120 | 120 |
· Code Review | · 代码复审 | 90 | 90 |
· Test | · 测试(自我测试,修改代码,提交修改) | 90 | 30 |
Reporting | 报告 | 240 | 180 |
· Test Report | · 测试报告 | 120 | 60 |
· Size Measurement | · 计算工作量 | 60 | 60 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 60 |
合计 | 780 | 650 |
- 总结
拿到这个作业后,我就直奔题目去了,没注意后面有个计划表,于是也没预估该项目各个部分所耗费的时间。第一次做软工项目,许多该做的步骤也没有做,比如生成设计文档、设计复审等等。在《构建之法》书中写道:软件=程序+软件工程,程序=数据结构+算法。这次作业中我更像只做了程序,在最后要用命令行进行测试时居然不知道怎么测试了。平时积累太少,水平不高。像这门课说的,learning by doing 吧,希望通过这次软工实践能让我学会更多,了解更多。