2020软件工程作业03

软件工程 https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1
作业要求 https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10494
作业目标 PSP表格、描述解题思路、设计实现过程、改进程序性能、展示关键代码,收获和感悟
作业正文 如下文
参看文献 CSDN,百度,同学建议

Github项目地址:
https://github.com/17jkxyq/RG02

PSP2.1 Personal Software Process Stage 预估耗时(小时) 实际耗时(小时)
Planning 计划 90 60
Estimate 估计这个任务需要多少时间 4835 5580
Development 开发 2500 3000
Analysis 需求分析(包括学习新技术) 360 300
Design Spec 生成设计文档 90 75
Design Review 设计复审(和同事审核设计文档) 25 35
Coding Standard 代码规范(为目前的开发制定合适的规范) 25 15
Design 具体设计 180 200
Coding 具体编码 1200 1500
Code Review 代码复审 90 60
Test 测试(自我测试,修改代码,提交修改) 150 200
Reporting 报告 45 45
Test Report 测试报告 30 30
Size Measurement 计算工程量 20 25
Postmortem & Process Improvement Plan 事后总结提出过程改进计划 30 35
合计 4835 5580

思路描述
一开始看到题目,当时想到的方法就是每一行都随机生成一个1-9的全排列。但是题中最多需要生成的数独终局可能达到1000000,显然从时间角度来看,这种方法不现实。
于是开始上网查询相关方法。在查询的过程中发现,发现一个数独终局可以由第一行的特定平移序列构成,且交换前三行的任意两行,中间三行的任意两行或最后三行的任意两行,
都会生成一个新的终局。基本上解开数独题都是通过深度搜索和回溯法来完成的。也因此,定下了最后代码的基调也是以此来完成。

流程图

关键代码
借鉴test_only(int m,int i,int j,int test)函数,采用了余数的方法来的得出当前在的小宫的位置,并加以运算获得该从何处开始何处停止的信息。

test_only()使用余数这点来指明小宫格的具体位置以及运算出其循环判断时需要的范围

delete_all(int m)函数,用于一个数独盘完成解答输出后清除数据,为下一个数独做准备。
void delete_all(int m) //for next loop
{
int i,j;
for(i=1;i<=m;i++)
for(j=1;j<=m;j++)
a[i][j]=0;
}

性能分析

单元测试

改进
在实现数独第一行的全排列时,采用的是蛮力法,直接使用多个循环实现,大大消耗了时间,因此进行了优化。
参考了网上的方法建议,考虑到无解也应该报告,于是特地加了 if(flag==0) f<<"Error: No answer!"<<endl;
如图 无解也会进行了相应的报告

收获和感悟:
刚开始并不知道从哪里下手,询问了同学也参考了网上的方法,决定从简单的三宫格入手,但是还是不尽如人意。最后还是通过各种渠道的资料查询
多方借鉴才勉强做完,这里也是看出来自己的只适合技术储备存在较大缺口,需要着实进行提升和改进,在编程语言的选择上,之前一直都是偏向java,
但这次选择了C,也是想尝试不同的语言,来进行多方面的提升,个人还是会偏向java一些。但是无论是什么样的编程语言,编程能力始终是最大的考验。
通过这几次的作业,我发现自己在编程和软件使用上面越来越薄弱了,也是希望借着这样的作业更好地提升自己的能力吧。

评价

原文地址:https://www.cnblogs.com/xieyuqi/p/12594252.html