哈库菈马塔塔

导航

2020软件工程作业03

这个作业属于哪个课程https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1
这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10494
这个作业的目标 画自己最想学的技术的学习路线图
作业正文 https://www.cnblogs.com/linjin0806/p/12582098.html
其他参考文献 https://www.baidu.com

 

 

 

 

 

Github项目地址:https://github.com/linjin66/sudoku

PSP表格

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning 计划  120  120
Estimate 估计这个任务需要多少时间  3600  7200
Development 开发  60  120
Analysis 需求分析 (包括学习新技术)  60  120
Design Spec 生成设计文档  60  120
Design Review 设计复审  60  60
Coding Standard 代码规范 (为目前的开发制定合适的规范)  60  60
Design 具体设计 120   120
Coding 具体编码 120  240
Code Review 代码复审  120  240
Test 测试(自我测试,修改代码,提交修改)  60  60
Reporting 报告 120  120
Test Repor 测试报告  30  30
Size Measurement 计算工作量  30  30
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划  60  120
合计    4620  8760

 

 

 

 

 

 

 

 

 

 

 

 

解题思路

   我的主要思路就是对整个每一个宫格进行一个一个的检查,我定义了一个三维数组,前两个是用来存每一个宫格的盘面,第三个是用来存这个格子所能填的数字。对每一个各自进行检查,检查这个格子的行和列还有小宫格有哪些数字已经出现过,将其标记。最后检查哪些格子只有一个数字没有被标记就直接将其填入这个格子。然后重复上面的操作。当格子里没有0的时候就停止,输出。

代码实现

 

主函数实现

int main(int argc, char* argv[])
{
    int i, n, j, k;
    int id = 0;
    ifstream ifp;
    ofstream ofp;
    N = atoi(argv[2]);
    N = N + 1;
    n = atoi(argv[4]);
    ifp.open(argv[6]);
    if (!ifp.is_open())//判断文件是否成功打开
        cout << "File open failed" << endl;
    ofp.open(argv[8]);
    if (!ofp.is_open())
        cout << "File open failed" << endl;
    int count = 0;
    while (n--)
    {
        for (i = 1; i < N; i++)
            for (j = 1; j < N; j++)
                ifp >> sudu[i][j][0];

        for (i = 1; i < N; i++)
            for (j = 1; j < N; j++)
                for (k = 1; k < 10; k++)
                    sudu[i][j][k] = 1;
        inti();
        ofp << endl;
        int q = 5;
        while (q--)
        {
            for (i = 1; i < N; i++)
            {
                for (j = 1; j < N; j++)
                    if (sudu[i][j][0] == 0)
                        inti();
            }
            for (i = 1; i < N; i++)
                for (j = 1; j < N; j++)
                    if (sudu[i][j][0] == 0)
                        count++;
            if (count == 0)
                break;
            count = 0;
        }

        for (i = 1; i < N; i++)
            for (j = 1; j < N; j++)
            {
                if (sudu[i][j][0] == 0)
                    id++;
            }
        if (id != 0)
            solve(id);
        for (i = 1; i < N; i++)
        {
            for (j = 1; j < N; j++)
            {
                ofp << sudu[i][j][0] << ' ';
            }
            ofp << endl;
        }
    }
    return 0;
}

实现代码

 1 void intgongge()
 2 {
 3     int i, j, k;
 4     int cnt = 0;
 5     for (i = 1; i < N; i++)
 6         for (j = 1; j < N; j++)
 7         {
 8             if (sudu[i][j][0] == 0)
 9             {
10                 for (k = 1; k < N; k++)
11                 {
12                     if (sudu[i][k][0] != 0)
13                         sudu[i][j][sudu[i][k][0]] = 0;
14                 }
15                 for (k = 1; k < N; k++)
16                 {
17                     if (sudu[k][j][0] != 0)
18                         sudu[i][j][sudu[k][j][0]] = 0;
19                 }
20                 if (N == 5 || N == 7 || N == 9 || N == 10)
21                 {
22                     if (N == 10)
23                         ninesudu(i, j);
24                     if (N == 9)
25                         eightsudu(i, j);
26                     if (N == 7)
27                         sixsudu(i, j);
28                     if (N == 5)
29                         foursudu(i, j);
30                 }
31                 for (k = 1; k < N; k++)
32                 {
33                     if (sudu[i][j][k] != 0)
34                         cnt++;
35                 }
36                 if (cnt == 1)
37                 {
38                     for (k = 1; k < 10; k++)
39                     {
40                         if (sudu[i][j][k] != 0)
41                         {
42                             sudu[i][j][0] = k;
43                             break;
44                         }
45                     }
46                 }
47             }
48             cnt = 0;
49         }
50 }

 递归函数

 1 void fillnumber(int number, int i, int j) {
 2     for (int k = 1; k < N; k++) {
 3         sudu[i][k][number]++;
 4         sudu[k][j][number]++;
 5     }
 6     /*for (int n = 0; n < 3; n++) {
 7         for (int m = 0; m < 3; m++) {
 8             sudu[i / 3 * 3 + n][j / 3 * 3 + m][number]++;
 9         }
10     }*/
11 }
12 void  resetnumber(int number, int i, int j) {
13     for (int k = 1; k < N; k++) {
14         sudu[i][k][number]--;
15         sudu[k][j][number]--;
16     }
17     /*for (int n = 0; n < 3; n++) {
18         for (int m = 0; m < 3; m++) {
19             sudu[i / 3 * 3 + n][j / 3 * 3 + m][number]--;
20         }
21     }*/
22 }
23 void solve(int id)
24 {
25     if (id == 0)
26         return;
27     for (int i = 1; i < N; i++)
28     {
29         for (int j = 1; j < N; j++)
30         {
31             if (sudu[i][j][0] == 0)
32             {
33                 for (int number = 1; number < 10; number++)
34                 {
35                     if (sudu[i][j][number] == 0)
36                     {
37                         fillnumber(number, i, j);
38                         sudu[i][j][0] = number;
39                         solve(id - 1);
40                         sudu[i][j][0] = 0;
41                         resetnumber(number, i, j);
42                     }
43                 }
44                 return;
45             }
46         }
47     }
48 }

 

代码静态检查

性能分析

 

 

我在性能分析的时候不知道为什不能进行它的性能分析上次作业也是这样还没搞清楚。

总结

   在这次的作业中,感觉自己不足的地方还有好多,本次作业感觉对于我来说有点难,因为自己的能力还不够,做起来有点吃力,老师讲的内容也运用不到实际应用上来,本次主要遇到的问题是参数难导入,自己在进行性能分析优化的时候总是出现问题,还没有完全解决,我的电脑在进行性能优化的时候总是遇到一些错误不知道是我的版本问题还是我的代码问题,但总的来说通过此次作业还是学到了不少的东西,最起码自己迈出了做代码的静态检查,性能优化的尝试,还有单元测试,虽然还有问题没解决没做到,但起码在不断进步。

自我评价

 

 

作业名称:2020软件工程作业03
作业内容:
学号 姓名 作业头 Github项目地址

代码要求经过code Quality  analysis工具的分析并消除所有警告

PSP表格 解题思路描述 设计实现过程 改进程序性能 代码说明

结合构建之法谈心路历程和感想

总分
估计 实际 代码如何组织 关键函数画出流程图 单元测试的设计 找出瓶颈性能 改进 展示关键代码 解释思路与注释说明
2分 1分 2分 0.5分 0.5分 1分 0.5分 1分 0.5分 0.5分 0.5分 0.5分 0.5分 1分 12分
20177595 林金 2分 1分 1分 0.5分 0.5分 1分  0.5分  0分 0分  0.5分  0.5分  0.5分  0分  0.5分  8.5分 

posted on 2020-03-29 17:21  哈库菈马塔塔  阅读(216)  评论(0编辑  收藏  举报