软工实践第三次作业

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


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

我的GitHub

PSP表格

Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
计划3030
估计这个任务需要多少时间1010
开发200300
需求分析 (包括学习新技术)300360
生成设计文档1030
设计复审1010
代码规范 (为目前的开发制定合适的规范)1010
具体设计2020
具体编码120180
代码复审3020
测试(自我测试,修改代码,提交修改)300300
报告6030
测试报告6030
计算工作量2020
事后总结, 并提出过程改进计划2030
合计11901380

题目分析

解数独:有一个二维数组里存放数独题目,空位置用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
1797323-20190925180655582-222556258.png
能指出我代码那里写的不够规范 比如没有引用包名啥的 ,但其实这次作业引用了包名助教那边运行应该会找不到主类,所以这些错误我只改了几个
主要是英文看不懂


##心得体会##

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

转载于:https://www.cnblogs.com/zoe-1/p/11581939.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言实训心得总结.doc C语言实训心得 10903090113 李新程 在初学C语言的一个学期后,我们进行了C语言实训阶段,尝试编写一个比较复杂的程序系统。在为期两周的时间中,我们同组的同学共同的感受是:C语言实训和平时上课所接触的程序是有很大不同的,所经受的考验和克服的困难是平时所无法比拟的。好在同组的搭档们精诚合作,分工明确,有问题共同解决,攻克了C语言实训的复杂程序。在这里,我作为其中的参与者,感触良多。 在这次实训中,我对对C语言有了一个更深的了解认识,也对这个学期学的知识得到巩固,还尝试运行编程,每次运行程序成功,让我对下面的项目就充满信心。通过自己与同学合作编写程序,最终把最初的理论知识转化基本技能。这次的实训,使我对C语言的学习产生浓厚的兴趣。 还是这次实训,最令人激动的就是合作做项目,虽然那只是一个很小很小的项目。每天大家来得很早,大家在一起学习,取长补短,我们很好的在实训中长知识,提高我们的学习热情。实训中深切体会到了老师认真负责的伟大的精神和热情为同学指导的促学方式,虽然对有些时候老师没给我们指出解决问题的方法有些小抱怨,但是到了结束时才知道,这种教学让我们自己学会了自学,学会了去看懂别人的代码。更多是老师给的感动,每天在我们来之前就到了教室,在讲课中海给我们分享他在公司上班的一些心得和体会,还有那些我们应该注意的事项,这些是平时上课时无法学到的,是更深层次的巨大收获。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值