lab1 写了近两周才完成,着实有些拖沓,一方面是不适应英语阅读,对软件的要求理解的很慢,另一方面源于对Java的不熟悉,已经一个学期没有用Java写过东西了,不过因为学过,还是很快就习惯了Java的语法规则。
通过这次实验,一共四个任务,我学到很多东西,总结一下,巩固记忆。
part Ⅰ Magic Squares
这个实验就是写一个小程序,我猜想老师设计这个实验的目的是让我们熟悉一下Java编程,整体来看没什么难度,但是涉及到的一些方法实现,如读写文件,数组的遍历等等,还是花了一些时间去学习。
程序要求是从txt中读取一个矩阵判断是不是magicsquare,所谓magic square就是每行、每列、每个对角线的和都相等的矩阵。因为只要有一点不符合要求就判定为false,所以处处设卡,一旦出现问题则返回false,全部都通过即为true。这就是整体的思路。现在具体分析一下代码。
/**
* Determine whether the square is a legal magic square.
*
* @param fileName
* a file.
* @return
* true or false
*/
public boolean isLegalMagicSquare(String fileName) {
File file = new File(fileName);
BufferedReader reader = null;
try {
int row = 0;
reader = new BufferedReader(new FileReader(file));
String tempString = null;
tempString = reader.readLine();//读文件的第一行
String[] a = tempString.split("\t");
int N = a.length;//确定第一行有多少数字,生成二维数组存储矩阵
int[][] square = new int[N][N];
for (int i = 0; i < N; i++) {
if (isNumer(a[i])) {//对每个读取到的string,判断它是不是一个整数
square[row][i] = Integer.valueOf(a[i]);
} else
return false;
}
while ((tempString = reader.readLine()) != null) {//依次读取文件的接下来部分
row++;
String[] b = tempString.split("\t");
if (b.length != N)//如果这个条件不满足则不是一个矩阵
return false;
for (int i = 0; i < N; i++) {
if (isNumer(b[i])) {
square[row][i] = Integer.valueOf(b[i]);
} else
return false;
}
}
reader.close();
if (row != N - 1)//如果行数和列数不等则不可能是magic square
return false;
if (!isEqualSquare(square, N))//判断是否满足每行每列每个对角线的和都相等
return false;
} catch (IOException e) {
e.printStackTrace();
}
return true;//执行到这一步说明说明它是一个magic square
}
这里面涉及到两个方法isNumer和isEqualSquare,isNumer我采用正则表达式匹配,isEqualSquare就是各个方向求和比较即可,都很简单。