• 软件工程第三次作业


    软件工程第三次作业

    Github地址:https://github.com/Ivanpppp/031702145

    题目解析:

    数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理
    在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。
    每个数字在每行、每列只出现一次

    PSP表格

    Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
    计划 30 120
    估计这个任务需要多少时间 60 120
    开发 60 380
    需求分析 (包括学习新技术) 60 500
    生成设计文档 60 300
    设计复审 30 120
    代码规范 (为目前的开发制定合适的规范) 60 120
    具体设计 120 240
    具体编码 60 240
    代码复审 30 30
    测试(自我测试,修改代码,提交修改) 120 120
    报告 30 60
    测试报告 30 30
    计算工作量 30 30
    事后总结, 并提出过程改进计划 15 50
    总计 795 2460

    本次的时间计算不是特别详细,下次会加以改进,每个环节其实没有记得那么清楚

    代码

    先讲一下遇到的问题吧。
    因为之前没有接触过数独,所以先去了解了一下数独的原理,玩了几局游戏
    又因为拖延症晚期,导致都快到ddl了才写了博客和代码。

    1.首先是不会用命令行传递参数,此处是参考了同学的代代码
    发现main()函数中的参数要写上去
    像这样的int main(int argc, char* argv[]),参数从那个arfv[]中读取,一开始是看见可以用fstream进行读写操作,但是自己操作起来总是有问题
    后面问了同学用了fopen,于是就用了fopen

    2.传进去的参数是字符串类型,需要转换为int类型,此处也是上网查了下资料发现atoi()函数可以直接进行类型转换

    3.对于数独的算法没有什么思路,一直在浏览网页看之前的数独程序,发现了两种方法,回溯法和深度搜索算法

    4.数据结构的内容忘得差不多了,又回去学了一会儿的深度搜索算法,重新理解了下,就是一直在进行递归操作

    5.对于GitHub的使用不是很熟悉,才开始接触GitHub,上传文件耗时都比较长了,百度出来的是用命令行开ssh传
    也是问了同学才知道可以拖拽进去...

    int DFS(int n)//用深搜来解决数独
    {
        if (n >= m * m)
        {
            sign = true;
            print();
            return 0;
        }
        if (num[n / m][n % m] != 0)
        {
            DFS(n + 1);
        }
        else
        {
            for (int i = 1; i <= m; i++)
            {
                if (Check(n, i) == true)
                {
                    num[n / m][n % m] = i;
                    DFS(n + 1);
                    if (sign == true) return 0;
                    num[n / m][n % m] = 0;
                }
            }
        }
    }
    

    这个方法可能是大部分同学都在使用的,一直递归,这里内嵌了一个Check()函数来判断填入的数字是否ok

    bool Check(int n, int shuzi)//检测如果填入的shuzi在这个位置是否合理
    {
        for (int i = 0; i < m; i++)
        {
            int j = n / m;
            if (num[j][i] == shuzi) return false;
        }
        for (int i = 0; i < m; i++)
        {
            int j = n % m;
            if (num[i][j] == shuzi) return false;
        }
        return true;
    }
    

    主程序中就用一个for循环来判断有多少个矩阵数独需要解决

    这里也用到了之前提到的atoi()函数,进行类型强制转换

    int main(int argc, char* argv[])
    {
    
        m = atoi(argv[2]);//强制将传入的字符串类型转换为int,阶数
        n = atoi(argv[4]);//强制将传入的字符串类型转换为int,数独数量
    
        char* inputfile = argv[6];//传入参数的文件名,从同学那里看来的
        char* outputfile = argv[8];
    
        fp1 = fopen(inputfile, "r");//打开输入文件
    
        for (int i = 0; i < n; i++) {
            memset(num, 0, sizeof(num));
            sign = 0;
            for (int k = 0; k < m; k++)
            {
                for (int j = 0; j < m; j++)
                {
                    fscanf(fp1, "%d", &num[k][j]);
                }
            }
            fp2 = fopen(outputfile, "a");
            DFS(0);
            if (i != n) {
                fprintf(fp2, "
    ");//一个数独解完后换行
            }
            fclose(fp2);
        }
        fclose(fp1);
        return 0;
    }
    

    总结

    本次的软工作业对我来说感觉还是有难度了,很多东西都不太明白,本来想用java来做的,但是java几天前才搭建好环境
    刚入门感觉做不了这次作业,所以还是先用c++写的

    还有对于PSP表格不是特别熟悉,时间那方面没有进行一个详细的记录,只是写了一个大概的实践,之后会进行改进

    之后java的学习进度也需要加快了;对于像用命令行传递参数的操作不熟悉,对GitHub的不熟悉,之后也会加紧学习

  • 相关阅读:
    SQL中内连接和外连接
    MySQL执行计划解读
    排序算法
    Edge浏览器安装sci-hub插件及使用教程
    MATLAB R2020B 使用教学——窗口布局设置
    PHP半年了,已经可以独立支撑项目,几点心得记录
    看1000行代码不如自己写10行代码
    PHP逻辑运算符中的and和&&以及or和||是有区别的
    自学PHP的野方法
    PHP中SQL查询语句的id=%d解释
  • 原文地址:https://www.cnblogs.com/mlz031702145/p/11586993.html
Copyright © 2020-2023  润新知