本次作业的github项目地址,使用的开发工具为CodeBlocks以及VS2017;开发语言为C/C++。
项目相关要求为:
利用程序随机构造出N个已解答的数独棋盘 。
输入
数独棋盘题目个数N
输出
随机生成N个 不重复 的 已解答完毕的 数独棋盘,并输出到sudoku.txt中
---引自第二次作业——个人项目实战
遇到的困难及解决方法
· 困难描述:
这个个人项目的主体就是要首先写出产生一个随机数独的代码,其他的项目要求都可以看成一些小需求。基于这个要求,我最开始设计了一个数独类,三个函数(生成数独,检验行、列、宫中数字是否合格,打印数独),随着代码的完善,又增加了一个判断命令行传入的参数是否为数字的函数。
检验的函数分为两个判断,先检测9x9范围内是否合格,然后在检测3x3范围内是否合格。生成数独的函数用到了伪随机数,具体代码在下面。
在测试完了代码确实能够生成随机且合格的数独之后,我想只要加上一个for循环应该就能实现打印多个不同的数独了吧。然而事实上他生成的全部都是一样的。百度了一下,在CSDN上发现了出现该问题的原因。
srand在哪里?
不能放在循环体内以及循环体内的函数内,因为代码执行速度很快,即便你是在循环体内执行srand(time(0))时间种子基本不会改变导致伪随机数是一样的。
---引自随机生成多个数独的程序问题
于是我把 srand(time(NULL)); 从函数中拿出改为放在main的起始,终于可以生成不同的数独了。之后根据项目的要求又一步步的加入了从命令行中传入参数、将数独输出到文本中的功能。
关键代码OR设计说明
关键代码也就是上面生成数独的代码了吧:
bool sudoku :: get_num(int r,int c) {
if(r==0 && c==9)
return true;
int random_number = (rand() % 9 + 1);//生成一个一到九之间的伪随机数。
if( num_check(r,c,random_number)/*使用了检验该数是否合格的函数*/){
board[r][c]=random_number;
if ((get_num((r+1)%9, (r+1)%9==0?c+1:c) )){
return true;
} else{
board[r][c]=0;//不能填则置为0
}
}
for(int i=(random_number%9 +1); i != random_number; i=(i%9 +1))
{
if( num_check(r,c,i)){
board[r][c]=i;
if ((get_num((r+1)%9, (r+1)%9==0?c+1:c) )){
return true;
} else{
board[r][c]=0;
}
}
}
return false;
}
测试运行:
在命令行输入命令后,结果会输出到 sudoku.txt 中并且在此之前先清除文本中之前的结果。当输入的参数不是数字时,会报错并终止。
在vs上进行性能测试时,不论是对项目进行检测还是对可执行文件进行检测均报相同的错误提示,在网上也没有找到合适的解决办法,很遗憾这一项没有完成。。。
PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 480 | 640 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 20 |
Development | 开发 | 480 | 640 |
· Analysis | · 需求分析 (包括学习新技术) | 120 | 70 |
· Design Spec | · 生成设计文档 | 120 | 60 |
· Design Review | · 设计复审 (和同事审核设计文档) | 60 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 0 |
· Design | · 具体设计 | 120 | 100 |
· Coding | · 具体编码 | 480 | 600 |
· Code Review | · 代码复审 | 60 | 20 |
· Test | · 测试(自我测试,修改代码,提交修改) | 120 | 200 |
Reporting | 报告 | 160 | 300 |
· Test Report | · 测试报告 | 60 | 30 |
· Size Measurement | · 计算工作量 | 30 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 30 |
合计 | 2380 | 2760 |
对执行力以及泛泛而谈的理解
所谓执行力,就是在自己对某方面有计划或者收到其他人的命令后去完成这些计划或命令的能力。影响执行力的因素,既有所谓的拖延症,也有自己的能力不足无从下手。
泛泛而谈,就是对任何事只说表面的东西,没有实质性的描述。出现这种情况,要么是不是很理解,要么是害怕出错。
记录自己的学习进度条
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
0 | 150 | 150 | 48 | 48 | 了解了软件工程的一般方法,学会用工程的视角看待项目 |