zoukankan      html  css  js  c++  java
  • 2020软件工程作业03

    软件工程 https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1
    作业要求 https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10458
    作业目标
    完成一个数独命令行程序
    作业正文
    见下文
    参考文献
    https://www.CSDN.com/

    一.github地址

    进行穿越

    二.PSP表格

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

    三. 解题思路

    刚拿到作业,光是看题目并且弄懂都用了不下十分钟,数独吗?没玩过,年轻人都爱玩这个了?行吧行吧,玩两把体会下...(过了良久)这玩是会玩了,但是怎么让代码去玩呢?题目是三到九宫格,3,5,7不考虑宫,只判断每行每列不重复,而4,6,8,9都要考虑。总体看来,首先要实现算法,然后解决输入文件名以命令行参数传入。头脑风暴下,知道的算法有采用区块摒除法,唯一余数法,递归调用,回溯法,还是用回溯法(其实是别的不熟悉)(参考详解八皇后问题)能进则进,不进则退,退一步海阔天空,尽管回溯法也算是暴力方法,但也不是特别暴力,特别暴力的相关部门都不让播,能播的都是可以接受的暴力。就在沾沾自喜问题解决一大半时,才发现这只是个开始,最麻烦的其实是文件读写和命令行传参,于是此处参考( Java读取txt文件和写入txt文件)。

    四.设计与实现过程

    1.各方法函数

    2.流程图

    五.代码改进

    1.静态分析(阿里巴巴代码规范工具)


    经过一顿操作,而后属实大快人心,也发现了主要不规范的地方是方法命名和注释的规范,还有未定义的常量,所以应该
    多注意,养成良好的编程习惯。

    2.性能分析(jprofile11.1试用10天本来要到了,感谢瑞哥带来的key)




    3.单元测试
    本次单元测试采用静态测试,即通过人工分析证明的方式来确认程序是否有问题。
    3 ,5 ,7宫格



    4宫格

    6宫格

    8宫格

    9宫格

    关于异常处理

    原来是数组越界问题,显然这个数不在我建的数组范围之内,所以提示数组越界

    把代码改成int generateSudoku[][]=new int[10][10];

    成功!!

    六.代码说明

    1.cheak方法

        for (int i = 0; i < m; i++) {
            /**如果行中列中有重复数,则返回false,用于3,5,7宫格*/        	                
                 if (i != x && Shudu[i][y] == n) {
                     return false;
                 }                
    
                 if (i != y && Shudu[x][i] == n) {
    
                     return false;
    
                 }
             }
        
        if(m==3)
        {
        	return true;
        }
        
        else if(m==4){
            
            int tempRow = x / 2 * 2;
            int templine = y / 2 * 2;
    
            for (int i = tempRow; i < tempRow+2; i++) {
    
                for (int j = templine; j <templine+2; j++) {
    
                    if (i != x && j != y && Shudu[i][j] == n) {
    
                        return false;
    
                    }
                }
            }
        }
        
        else if(m==5){
        	return true;
        }
        
        else if(m==6){
           
            int tempRow = x / 2*2;
            int templine = y / 3*3;
    
            for (int i =tempRow; i < tempRow + 2; i++) {
    
                for (int j = templine; j < templine + 3; j++) {
    
                    if (i != x && j != y && Shudu[i][j] == n) {
    
                        return false;
    
                    }
                }
            }
        }
        
        else if(m==7){
        	return true;
        }
        
        else if(m==8){
    
            int tempRow = x / 4 * 4;
            int templine = y / 2 * 2;
     
            for (int i = tempRow; i < tempRow + 4; i++) {
                for (int j = templine; j < templine + 2; j++) {
    
                    if (i != x && j != y && Shudu[i][j] == n) {
    
                        return false;
    
                    }
                }
            }
        }
        
        else if(m==9){
    
            int temprow = x / 3 * 3;
            int templine = y / 3 * 3; 
    
            for (int i = temprow; i < temprow + 3; i++) {
            for (int j = templine; j < templine + 3; j++) {
               
                    if (i != x && j != y && Shudu[i][j] == n) {
    
                        return false;
                   }
                }
            }
        }
                  
        return true;
    }
    

    用cheak方法先判断行列中有重复数,符合3.5.7宫格,然后再此基础上判断不同小宫是否有重复,如9宫格可以分为9个小的3宫格,以此推理出其他宫格。当然,在你划分小宫时有不同的方法,可以从点出发,也可以从行列的角度出发,依据个人喜好。

    2.回溯法matrixbackTrace

       int x = k / m;
        int y = k % m;
    
        if (matrix[x][y] == 0) {
            for (int i = 1; i <= m; i++) {
                matrix[x][y] = i;
                if (cheak(matrix,x, y,i, m)) {
                	matrixbackTrace(k + 1,m);
                }
            }
            matrix[x][y] = 0;
    
        } else {
    
        	matrixbackTrace(k + 1,m);
        }
    }
    

    回溯法是本次代码的解数独关键,在代码中,如果matrix[x][y]==0,这个点是空的,那么才进入给空格填值的逻辑,判断给(x,y)这个位置放1-m中的任意一个数是否能满足规则,然后将该值赋给该空格,然后进入下一个空格,如果该位置已经有值了,就直接进入下一个空格进行计算。参考( 回溯算法解数独问题)。

    3.写入文件

            try{
           String outfile="E:\output9.txt";
            FileWriter fw = new FileWriter(outfile,true);          
            for(int i=0;i<m;i++){
            for(int j=0;j<m;j++){ 
                fw.write(matrix[i][j]+" ");
                }
                fw.write("
    ");
            }
             fw.write("
    ");            
             fw.close(); /** 关闭 */
            }
    

    }

    调用回溯法解数独。

    七.心路历程

    结束了,首先就把PSP表格里的单位分钟改为了小时,不是为了偷懒少打数字,而是真的只能以小时为单位。学到了很多东西,也找到以前存在却没发现的错误,刚开始输入命令行参数,一直都显示是无用命令,突发奇想,输入java和Javac试试,果然发现问题就是javac。因为路径被覆盖了找不到,于是( javac不能运行怎么办?),怎么说呢,百度确实是个好工具。复习了一遍Java的文件读写操作知识和其他语法的使用,受益匪浅,也对算法有了新的认识,继续码农,多学多练。

  • 相关阅读:
    Oracle Haip无法启动问题学习
    OGG-Veridata如何对比没有主键的表?
    除PerfDog之外,还有什么性能测试工具。
    test
    Android系统WiFi网络架构
    audit2allow 添加SELinux权限
    select、poll、epoll之间的区别总结
    属性问题展开的selinux权限介绍
    android property属性property_set()&& property_get() selinux权限问题
    关于网络&wifi基础内容
  • 原文地址:https://www.cnblogs.com/codesasan/p/12577097.html
Copyright © 2011-2022 走看看