软工实践第三次作业
软件工程实践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个小时在百度上)
方法实现##
接口设计###
流程图###
单元测试样例##
测试样例是群里助教发的,每个宫格数有5个样例,从3宫格到9宫格都可以
主要代码##
//成员变量
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();
}
}
异常处理##
在这次作业中开始遇到了几个异常,主要是agrs[]数组下标越界,但我输出我的成员变量时读取的数据确实没错,而且是args[5]找不到,明明args[7]都可以找得到。就很迷。。。。
后来百度是运行时错误,运行时给的参数不够多。
运行时分析##
我用的是Jprofile工具
代码分析##
我代码分析用的是一个代码分析的网页 Codacy
能指出我代码那里写的不够规范 比如没有引用包名啥的 ,但其实这次作业引用了包名助教那边运行应该会找不到主类,所以这些错误我只改了几个
主要是英文看不懂
心得体会##
emmmmm,怎么说呢,感觉大佬好多,有喜欢做视频的莫多大佬,有把播客主页弄得很好看的小李子大佬,主要就是感觉到周围大佬很多吧,进步就是现在遇到bug时比以前从容了许多,debug也比以前强了一些,很多都是以前犯过的错误,输出的东西看一看,异常提示啥的看一看,再仔细想一想问题就能迎刃而解。最主要的是能从个人编程作业中学到新东西,特别是学了Java之后懂得了更多面向对象的编程思想。
(最最大的体会是我英语咋这么烂呢,当时干嘛不好好学英语,啥都看不懂)