Lab1实验过程记录
1.Magic Square
第一题实现MagicSquare数组的检测与实现。题目较为简单,考察的是Java语言的基本函数编写,同时还用到了文件操作,异常处理的相关知识。
第一部分,实现MagicSquare数组的检测,内容较为简单。
先通过FileReader打开文件,注意处理相应的FileNotFoundException及IOException,报错并返回。
打开文件后,则按照给定格式对文件中的数组元素进行读取。若正常完成读取,元素将被存储在数组arrays[][]中以便后续计算。对于不满足要求数据存储格式的文件,读取会出错,根据错误类型报错并返回即可。
当全部数组元素正常读取后,则可进一步进行计算。先计算存储数组第一行元素之和,再依次遍历各行,各列及各对角线,将所得元素和与其进行比较,即可完成对MagicSquare数组的判断,根据判断结果返回相应布尔值,完成。
第二部分,对给定的generateMagicSquare()方法进行测试,分析实现过程,添加入口参数检测和文件写入操作。
方法的生成逻辑如上图。根据其生成的MagicSquare数组数据的分析,很容易知道其生成逻辑是斜向遍历数组并依次以等差数列赋值,完成一个斜向后跳转到下一个斜向,直至数组元素全部赋值。同时该生成逻辑也限制了数组行列数必须为奇数,否则会导致数组下标越界。
相应的代码注释如下:
public static boolean generateMagicSquare(int n) {
int[][] magic = new int[n][n]; // 数组下标必为非负数,限制输入n只能为正数
int row = 0, col = n / 2, i, j, square = n * n; // 从0行 n/2列开始赋值, 首个值为1
for (i = 1; i <= square; i++) {
magic[row][col] = i; // 每次为一个元素赋值,后+1
if (i % n == 0)
row++; // 当一组(row+col)取模相等(在数组中为斜向的一系列元素)
else { // 的元素全部完成赋值后,调整到下一行对应的组。此处限制了输入n只能为奇数
if (row == 0) // 循环下行数row每次减一取模
row = n - 1;
else
row--;
if (col == (n - 1)) // 循环下列数col每次加一取模
col = 0;
else
col++;
}
}
return true;
}
文件操作和入口参数检测已略去。