Github项目地址:
https://github.com/caidada/ruangong
遇到的困难及解决方法
困难描述+做过的尝试+是否解决
- git出现问题,无法正常上传文件;
重新下载配置,已解决 - 不知道该怎么进行单元测试;
好吧,还是没大看懂。 - 太久没用C++,函数都忘了怎么用;
一边看书一边敲,函数什么的就没怎么去用。 - 性能低,生成速度慢
试着优化了一些循环和计算,速度就变快了一些,写到文档里面变的更短了
- 发现自己完全忘了怎么生成文档
翻书+百度,解决。 - visual studio 发生了一些故障,不能用,要哭了/(ㄒoㄒ)/,只能先用dev c++做,所以完全不知道哪里用时比较多,哪里需要优化
重新下载了,性能分析那里还是提示有错误,大概是哪个文件没下载,只能看摘要。
有何收获
- 复习了下好久没有的c++;
- 做之前有把《构建之法》的前三章看完,里面提到需求分析的重要性,所以试着在敲代码之前把要完成的每个功能分步设计,发现这么做下来具体编码的时间确实会缩短,而且出现bug也比较好修改,对比以前只是先粗略想了下就开始敲感觉好一些。
- 小伙伴感情++,一起讨论如何解决遇到的问题,感觉很不错
- 了解了visual studio 的基础用法
- 解决了拖了好久的git问题
关键代码or设计说明
解题思路
根据题目,我们需要做的是生成N个 不重复 的 已解答完毕的 数独棋盘,于是我将其分成以下几步来实现
- 设计一个生成数独的方式
数独有9个宫格B1 | B2 | B3
B4 | B5 | B6
B7 | B8 | B9
先确定第一个宫格B1的数,将每行进行对调后则生成第二个和第三个宫格,则前三个宫格为以下所示
2 1 3 | 4 5 6 | 7 8 9
4 5 6 | 7 8 9 | 2 1 3
7 8 9 | 2 1 3 | 4 5 6
再将前三个宫格每列对调后生成第四—九个宫格,全部宫格如下所示
2 1 3 | 4 5 6 | 7 8 9
4 5 6 | 7 8 9 | 2 1 3
7 8 9 | 2 1 3 | 4 5 6
——————————1 3 2 | 5 6 4 | 8 9 7
5 6 4 | 8 9 7 | 1 3 2
8 9 7 | 1 3 2 | 5 6 4
——————————3 2 1 | 6 4 5 | 9 7 8
6 4 5 | 9 7 8 | 3 2 1
9 7 8 | 3 2 1 | 6 4 5
for(i=0;i<3;i++)
{
k=(i+1)%3; //将第一宫格的数组向上移动一行变成第二个宫格
l=(i+2)%3;
for(j=0;j<3;j++) //将第一宫格的数组向上移动两行变成第三个宫格
{
cout<<Block[i][j]<<" ";
}
for(j=0;j<3;j++)
{
cout<<Block[k][j]<<" ";
}
for(j=0;j<3;j++)
{
cout<<Block[l][j]<<" ";
}
cout<<endl;
n++;
if(i==2)
{
if(n==3||n==6) //第4-6行是通过第1-3行进行向左移动一列生成的
{
for(i=0;i<3;i++) //第7-9行是通过第1-3行进行向左移动两列列生成的
{
a=Block[i][0]; //暂存第一列的数
for(j=0;j<3;j++)
{
m=(j+1)%3;
Block[i][j]=Block[i][m];
}
Block[i][2]=a;
}
i=-1;
}
}
}
- 生成随机数
定义一个一维数组,用2进行初赋值(学号%9+1=2),调用随机函数rand()
for(i=1;i<9;i++) //从1开始,则r[0]就为初赋值的2了
{
r[i]=rand()%9+1;
for(j=1;j<9;j++)
{
g=(i+j)%9;
if(r[i]==r[g]) //与已前几个随机数进行比较判断,若有相同,则重新生成
{
r[i]=rand()%9+1;
j=0;
}
}
}
-
生成随机个数独矩阵
用万能的for循环来实现 -
去除重复
用数组记录已经生成的随机数,进行对比
for(i=0;i<dd;i++)
{
for(j=0;j<9;j++)
{
if(r[j]==rr[i][j]) //若一个数相同rr_n1加1,
rr_n1++;
}
if(rr_n1==9) //当9个都相同,则此次生成的随机数不能使用,需要重新生成
rr_n2++;
else
rr_n1=0;
}
- 将生成的数独矩阵写到文档
freopen("sudoku.txt","w",stdout);
测试运行结果如下
性能分析
程序除了rand函数,基本全是for和if循环,性能来讲确实很差,因为太久没用c++了,函数怎么用都忘了,已经尽力去减少使用循环,缩短程序运行时间,不过确实应该花点时间复习一下函数的用法,争取下次作业代码能优雅一些(命名好像也很烂?)。
PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 10 |
· Estimate | · 估计这个任务需要多少时间 | 1000 | 920 |
Development | 开发 | 950 | 1020 |
· Analysis | · 需求分析 (包括学习新技术) | 30 | 20 |
· Design Spec | · 生成设计文档 | 20 | 无 |
· Design Review | · 设计复审 (和同事审核设计文档) | 无 | 无 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 无 | 无 |
· Design | · 具体设计 | 60 | 70 |
· Coding | · 具体编码 | 180 | 160 |
· Code Review | · 代码复审 | 20 | 10 |
· Test | · 测试(自我测试,修改代码,提交修改) | 640 | 760 |
Reporting | 报告 | 90 | 115 |
· Test Report | · 测试报告 | 75 | 100 |
· Size Measurement | · 计算工作量 | 5 | 5 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 10 | 10 |
合计 | 1050 | 1135 |
学习进度条
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
1 | 138 | 138 | 36 | 36 | 复习了c++,了解了vs和git |
对执行力和泛泛而谈的理解
我理解中的执行力是尽快完成所需要做的工作,也就是没有拖延症。目标说起来都很容易,每天泡两小时图书馆啊,每天写1000行代码,但真正要做的时候,想想又觉得算了,这就是泛泛而谈和喊口号。个人觉得这跟自己定的目标和自身现阶段的能力是否相匹配有很大关系,拿自己举例,大一曾跟小伙伴夸下海口,要把图书馆的书都看完,现在觉得十分的幼稚,分析一下,当时我立下目标时,更多想的是做完这件事之后的成就感,而不是做这件事情的过程,因此容易忽略掉例如时间不够、有些书没有看的必要等等本应考虑的问题。所以,我觉得要想提高执行力、改变泛泛而谈、喊口号的现状,更多的是看清自己,坦然接受自己的不足,如三分钟热度、拖延症等,然后合理的安排适合自己的时间,合理制定自己的目标,可能刚开始进步不大,但好歹比泛泛而谈好些吧。
感谢阅读( •̀∀•́ )