软件工程实践2019第三次做业

1、GitHub项目地址

https://github.com/noapanda/031702603ios


2、PSP表

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

3、解题思路

一、从第一行开始行遍历,找到空格,并遍历空格所在的行和列,并记录行列中大于0的数

二、若该空格的候选数惟一,则写出,不然,跳过

三、固然,会出现一次遍历填不完表盘的状况,因此利用一个死循环完成表盘。当表盘中的空格数为0时,跳出循环。

#define _CRT_SECURE_NO_DEPRECATE
#include <fstream>
#include<iostream>
#include<stdio.h>
using namespace std;
int main(int argc, char *argv[])
{
    
    int m, n;
    FILE* fp1;
    FILE* fp2;
    m = atoi(argv[2]);//命令行输入的第三个参数:宫格阶级
    n = atoi(argv[4]);//命令行输入的第五个参数:待解答盘面数目
    //cin >> m >> n;
    
    //以文本只读方式打开intput.txt
    fp1 = fopen("input.txt", "r");
    if (fp1 == NULL) //打开文件失败
        return -1;
    //打开output.txt,并当即关闭,目的:清空文本内容
    fp2 = fopen("output.txt", "w");
    if (fp2 == NULL) //打开文件失败
        return -1;
    fclose(fp2);//关闭文件
    int i, j, k, num, w, p, q;
    int sudoku[10][10];
    int sign[4] = { 0 };//存放行列中已经出现的数,例如:某行或列出现3,则sign[3]=1
    fp2 = fopen("output.txt", "a");
    for (num = 0; num < n; num++)
    {
        //输入表盘的二维数组
        for (i = 0;i < m; i++)
        {
            for (j = 0;j < m;j++)
            {
                fscanf(fp1, "%d", &sudoku[i][j]);
                //cin >> sudoku[i][j];
            }

        }
        while (1)
        {
            w = 0;
            //判断表盘中是否还有空格
            for (i = 0;i < m;i++)
            {
                for (j = 0;j < m;j++)
                {
                    if (sudoku[i][j] == 0)
                    {
                        w++;
                    }

                }
            }
            if (w == 0)//表示表盘已经填完
            {
                break;
            }
            for (i = 0;i < m;i++)
            {
                for (j = 0;j < m;j++)
                {
                    if (sudoku[i][j] != 0)
                        continue;
                    //若该空格为填入,则进行行列遍历,找到已出现的数
                    if (sudoku[i][j] == 0)
                    { 
                        //行遍历
                        for (q = 0;q < 3;q++)
                        {
                            if (sudoku[i][q] != 0)
                            {
                                sign[sudoku[i][q]] = 1;
                            }
                        }
                        //列遍历
                        for (q = 0;q < 3;q++)
                        {
                            if (sudoku[q][j] != 0)
                            {
                                sign[sudoku[q][j]] = 1;
                            }
                        }
                        p = 0;//p用于记录该空格的候选数数量
                        for (q = 1;q < 4;q++)
                        {
                            if (sign[q] == 0)//表示该空格所在行列中均没有q
                            {
                                p++;
                                k = q;
                            }
                        }
                    }
                    if (p == 1)
                    {
                        sudoku[i][j] = k;
                        //cout<<k<<endl;
                    }
                    //初始化sign[]
                    for (q = 0;q < 4;q++)
                    {
                        sign[q] = 0;
                    }
                }
            }

        }
        //输出完整表盘
        for (i = 0;i < 3;i++)
        {
            for (j = 0;j < 3;j++)
            {
                fprintf(fp2, "%d ", sudoku[i][j]);
                //cout << sudoku[i][j] << " ";
                if (j == 2)
                    fprintf(fp2, "\n");
                    //cout << endl;
            }
        }
        fprintf(fp2, "\n");
    }
    return 0;
}

4、调试以及文本输入输出

以前出现了一个错误,就是在把表盘写入output.txt时,忘记打开文件了,就是语句

fp2 = fopen("output.txt", "a");

5、心路历程与收获

(自闭大钟表演在线开花)

由于以前没有玩过数独,只是简单了解过,好比《意林》杂志倒数几页的“趣味数学”模块,以及《爱情公寓》里的数独高手陆展博,等等。因此一接触到此次的做业题目,下意识就想作作数独题感觉一下,因而就下载了APP “全民数独”,作了60几题以为本身摸清楚规律了,而后就去作高难题,结果由于眼高手低,屡屡碰壁。不甘心的我决定去网上找找解题技巧(毕竟我以为数独游戏仍是很烧脑的),因而发现了惟一法和候选数法。但我比较理解候选数法的解法因此就是用这种方法写的实现多盘三宫格代码。虽然她仍是个菜鸟,可是毕竟也是我在推翻一种种解法最后获得的。最困扰个人除了代码只能跑三宫格以及还没来得及优化之外,就是vs编辑器的用法,其中上面出现的报错就让我头疼了好久,多亏了舍友大大们帮学得已经长草的我debug,发现问题并解决后,心情真的就像荒草里开花同样明朗。此次的编程体验,说实话对我来讲影响不小,我也终于认清本身简单事情复杂化、作事情总爱一股傻劲儿往前的坏毛病,固然仍是要再次感谢室友们,让我再次真切的体会到协做的力量。学习是永无止境的,但同时也是有根据有计划的,谨记于己。

相关文章
相关标签/搜索