软件工程第三次作业
Github地址:https://github.com/Ivanpppp/031702145
题目解析:
数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理
在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。
每个数字在每行、每列只出现一次
PSP表格
Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|
计划 | 30 | 120 |
估计这个任务需要多少时间 | 60 | 120 |
开发 | 60 | 380 |
需求分析 (包括学习新技术) | 60 | 500 |
生成设计文档 | 60 | 300 |
设计复审 | 30 | 120 |
代码规范 (为目前的开发制定合适的规范) | 60 | 120 |
具体设计 | 120 | 240 |
具体编码 | 60 | 240 |
代码复审 | 30 | 30 |
测试(自我测试,修改代码,提交修改) | 120 | 120 |
报告 | 30 | 60 |
测试报告 | 30 | 30 |
计算工作量 | 30 | 30 |
事后总结, 并提出过程改进计划 | 15 | 50 |
总计 | 795 | 2460 |
本次的时间计算不是特别详细,下次会加以改进,每个环节其实没有记得那么清楚
代码
先讲一下遇到的问题吧。
因为之前没有接触过数独,所以先去了解了一下数独的原理,玩了几局游戏
又因为拖延症晚期,导致都快到ddl了才写了博客和代码。
1.首先是不会用命令行传递参数,此处是参考了同学的代代码
发现main()函数中的参数要写上去
像这样的int main(int argc, char* argv[]),参数从那个arfv[]中读取,一开始是看见可以用fstream进行读写操作,但是自己操作起来总是有问题
后面问了同学用了fopen,于是就用了fopen
2.传进去的参数是字符串类型,需要转换为int类型,此处也是上网查了下资料发现atoi()函数可以直接进行类型转换
3.对于数独的算法没有什么思路,一直在浏览网页看之前的数独程序,发现了两种方法,回溯法和深度搜索算法
4.数据结构的内容忘得差不多了,又回去学了一会儿的深度搜索算法,重新理解了下,就是一直在进行递归操作
5.对于GitHub的使用不是很熟悉,才开始接触GitHub,上传文件耗时都比较长了,百度出来的是用命令行开ssh传
也是问了同学才知道可以拖拽进去...
int DFS(int n)//用深搜来解决数独
{
if (n >= m * m)
{
sign = true;
print();
return 0;
}
if (num[n / m][n % m] != 0)
{
DFS(n + 1);
}
else
{
for (int i = 1; i <= m; i++)
{
if (Check(n, i) == true)
{
num[n / m][n % m] = i;
DFS(n + 1);
if (sign == true) return 0;
num[n / m][n % m] = 0;
}
}
}
}
这个方法可能是大部分同学都在使用的,一直递归,这里内嵌了一个Check()函数来判断填入的数字是否ok
bool Check(int n, int shuzi)//检测如果填入的shuzi在这个位置是否合理
{
for (int i = 0; i < m; i++)
{
int j = n / m;
if (num[j][i] == shuzi) return false;
}
for (int i = 0; i < m; i++)
{
int j = n % m;
if (num[i][j] == shuzi) return false;
}
return true;
}
主程序中就用一个for循环来判断有多少个矩阵数独需要解决
这里也用到了之前提到的atoi()函数,进行类型强制转换
int main(int argc, char* argv[])
{
m = atoi(argv[2]);//强制将传入的字符串类型转换为int,阶数
n = atoi(argv[4]);//强制将传入的字符串类型转换为int,数独数量
char* inputfile = argv[6];//传入参数的文件名,从同学那里看来的
char* outputfile = argv[8];
fp1 = fopen(inputfile, "r");//打开输入文件
for (int i = 0; i < n; i++) {
memset(num, 0, sizeof(num));
sign = 0;
for (int k = 0; k < m; k++)
{
for (int j = 0; j < m; j++)
{
fscanf(fp1, "%d", &num[k][j]);
}
}
fp2 = fopen(outputfile, "a");
DFS(0);
if (i != n) {
fprintf(fp2, "\n");//一个数独解完后换行
}
fclose(fp2);
}
fclose(fp1);
return 0;
}
总结
本次的软工作业对我来说感觉还是有难度了,很多东西都不太明白,本来想用java来做的,但是java几天前才搭建好环境
刚入门感觉做不了这次作业,所以还是先用c++写的
还有对于PSP表格不是特别熟悉,时间那方面没有进行一个详细的记录,只是写了一个大概的实践,之后会进行改进
之后java的学习进度也需要加快了;对于像用命令行传递参数的操作不熟悉,对GitHub的不熟悉,之后也会加紧学习