软工实践第三次作业

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


  • 目录
    • PSP表格
    • 题目分析
    • 方法实现
    • 流程图
    • 单元测试样例
    • 主要代码
    • 异常处理
    • 运行时分析
    • 代码分析
    • 心得体会

我的GitHub

PSP表格##

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

题目分析

解数独:有一个二维数组里存放数独题目,空位置用0替代。刚开始我想的是用傻瓜算法,一个一个试总能试出来(就是我生成许多种二维数组,看哪个能对的上)。后来看到网上的回溯法,用的是dfs深度优先算法,碰到0就从1-m开始试,不行就回退换一个再试。(实话说这个算法怎么实现忘记了,还是去同学那里借了一本算法书才慢慢想起来,知识还需要好好巩固呀)

读入文件:在学习Java的过程中学到了Filereader类和Filewriter类,是一种专门用来读写文本的类,而且是按字符读取,不是按字节,按字符读取的话我们可以用循环,遇到空格回车就跳过,然后读到我们编译器里的二维数组里

多个盘面:这也是一个问题,处理多个盘面的话我看到有些同学用了三维数组,其实Java里的泛型容器类的get()方法可以用来存多个二维数组,返回一个二维数组的对象。

写入文件:这个和读入差不多,写入也是用个循环,控制好循环的逻辑就好。

异常处理:Java的io读写都是不稳定的,常常会遇到读不到文件或者数组下标越界的异常,所以要用try-catch捕捉异常

(刚开始确实没啥思路,也不知道要怎么处理文本才好,不知道核心算法怎么写,又怕没有整理好思路就开始瞎搞,就一直百度百度百度,能把这个任务完成我觉得我花了10个小时在百度上)

方法实现##

接口设计###

avatar


流程图###


avatar


单元测试样例##


测试样例是群里助教发的,每个宫格数有5个样例,从3宫格到9宫格都可以
avatar

主要代码##


//成员变量

private static String input;//输入文件名
private static String output;//输出文件名
private static int gong;//宫格数
private static int n;//盘面数
private static  int trans[][] = new int [9][9];//中间数组
static ArrayList<int[][]> shudu = new ArrayList<>();//待解决的数组
static ArrayList<int[][]> result = new ArrayList<>();//已解决的数组

//分割命令行,加载参数

 public static void loadArgs(String args[]) { //接收这个args[]数组
      input=args[5];  				//String类型
      output=args[7]; 				//String类型
      gong  = Integer.valueOf(args[1]).intValue();			//int型
      n = Integer.valueOf(args[3]).intValue(); 			//int型

}

//深度优先搜索

public static  Boolean dfs(int num,int m){
    if(num==(m*m))			//m*m个宫格都写完了
        return true;
    int i=num/m,j=num%m;
    if(trans[i][j]!=0) return dfs(num+1,m);
    for(int nn=1; nn<=m; nn++)
    {
        if(islegal(trans,i,j,nn,m)) //这个islegal()函数是合法性检查,检查行、列、宫格填入数字是否合法
        {
            trans[i][j]=nn;
            if(dfs(num+1,gong)) return true;
            trans[i][j]=0;

        }
    }
    return false;
}

//读文件

try {
        File file=new File(input);
        //用filereader类逐字符读入文本
        BufferedReader br = new BufferedReader(new FileReader((file)));
        for(int tag = 0; tag < n; tag++){
            int array[][] = new int[9][9];
            int temp;
            //连续读入 遇到空格或者回车就跳过
            for(int i = 0;i < gong ; i++){
                for(int j = 0 ;j < gong ;j++){

                    temp = br.read();
                    if ( (((char) temp) != '\n') &&(((char) temp) != ' '))
                        array[i][j]= ((char) temp)-48;

                    else
                        j--;

                }
                br.readLine();
            }
            br.readLine();
            shudu.add(array);
        }
        br.close();

    } catch(Exception e){
        e.printStackTrace();
    }

//写文件

try{
        File file = new File(output);
        BufferedWriter bw = new BufferedWriter(new FileWriter(file));
        for(int tag=0;tag<result.size();tag++){
            int [][] Final  = result.get(tag);
                for (int i = 0;i<gong;i++){
                    for(int j =0 ; j<gong ;j++){
                        bw.write(Final[i][j]+"");
                        bw.write(" ");
                    }
                    bw.newLine();
                }
                bw.newLine();
                bw.flush();//把流缓冲冲入到文本中
            }
            bw.close();

    } catch (IOException e) {
        e.printStackTrace();
    }
}

异常处理##

avatar
在这次作业中开始遇到了几个异常,主要是agrs[]数组下标越界,但我输出我的成员变量时读取的数据确实没错,而且是args[5]找不到,明明args[7]都可以找得到。就很迷。。。。
后来百度是运行时错误,运行时给的参数不够多。

运行时分析##

我用的是Jprofile工具
avatar
avatar
avatar

代码分析##

我代码分析用的是一个代码分析的网页 Codacy

能指出我代码那里写的不够规范 比如没有引用包名啥的 ,但其实这次作业引用了包名助教那边运行应该会找不到主类,所以这些错误我只改了几个
主要是英文看不懂


心得体会##


emmmmm,怎么说呢,感觉大佬好多,有喜欢做视频的莫多大佬,有把播客主页弄得很好看的小李子大佬,主要就是感觉到周围大佬很多吧,进步就是现在遇到bug时比以前从容了许多,debug也比以前强了一些,很多都是以前犯过的错误,输出的东西看一看,异常提示啥的看一看,再仔细想一想问题就能迎刃而解。最主要的是能从个人编程作业中学到新东西,特别是学了Java之后懂得了更多面向对象的编程思想。
最最大的体会是我英语咋这么烂呢,当时干嘛不好好学英语,啥都看不懂

posted @ 2019-09-24 23:41  Zoe丨  阅读(221)  评论(3编辑  收藏  举报