Java 幻方 - 求和列和求和行错误
Java Magic Square - Sum Column and Sum Row Errors
我被分配了一项学校作业,要在用户生成的 N*N 矩阵中的二维数组中制作和检查 'Magic Square'。
到目前为止,我已经正确地编写了大部分代码(我已经单独测试了每个方法)。但是,我无法更正在 'sumColumn' 和 'sumRow' 方法中不断出现的两个最终错误。这是我对上述两种方法的代码:
public static int sumColumn(int[][] square, int columnNumber)
{
int sum = 0 ;
for (int j = 0; j < square.length ; j++)
{
for (int i = 0; i < square.length; i++)
{
sum = sum + square[i][j] ;
}
}
return sum ;
}
public static int sumRow(int[][] square, int rowNumber)
{
int sum = 0 ;
for (int i = 0; i < square.length; i++)
{
for (int j = 0; j < square.length; j++)
{
sum = sum + square[i][j] ;
}
}
return sum ;
}
这里是输出以及从 main 方法调用时出现的错误:
Please enter a value for N:
1
Please enter 1 numbers:
1
This is the square you input:
+-+
|1|
+-+
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
The method sumRow(int[][], int) in the type MagicSquares is not applicable for the arguments (int[][]) at squares.MagicSquares.validMagicSquare(MagicSquares.java:105)
The method sumColumn(int[][], int) in the type MagicSquares is not applicable for the arguments (int[][]) at squares.MagicSquares.main(MagicSquares.java:167)
一些摆弄 'sumRow' 和 'sumColumn' 会产生另一个错误:
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
rowNumber cannot be resolved to a variable at squares.MagicSquares.validMagicSquare(MagicSquares.java:105)
colNumber cannot be resolved to a variable at squares.MagicSquares.main(MagicSquares.java:167)
如果能解决这个问题,我们将不胜感激!谢谢!
PS:我上个月才开始编程,所以请多关照 :3
编辑:这里是检查每行、每列以及主对角线和副对角线是否等于幻方的方法。
boolean status = true ;
int sum = sumDiagonal(square) ;
if (sumSecondaryDiagonal(square) != sum)
{
status = false ;
}
else
{
for (int row = 0; (row < square.length) && status; row ++)
{
if (sum != sumRow(square, square.length))
{
status = false ;
}
}
for (int col = 0; (col < square.length) && status; col ++)
{
if (sum != sumColumn(square, square.length))
{
status = false ;
}
}
}
return status;
您的 sumColumn
方法需要两个参数:
int[][] square
int columnNumber
在您的 main 方法中,您似乎只提供了一个参数 int[][]
,而您忘记将 columnNumber 作为第二个参数。
同样适用于 sumRow
方法。
我根据您发布的错误消息做出了上述发现:
The method sumRow(int[][], int) in the type MagicSquares is not applicable for the arguments (int[][]) at squares.MagicSquares.validMagicSquare(MagicSquares.java:105)
它说,在您的 MagicSquares.java 文件中,第 105 行,您调用了 sumRow
方法。它进一步表明 (The method sumRow(int[][], int) in the type MagicSquares)
,您实现的方法,不能 used/is 不适用于第 105 行带有参数 (int[][])
的调用。
您显示的代码没有语法错误。
但是你的例外:
The method sumRow(int[][], int) in the type MagicSquares is not applicable for the arguments (int[][]) at squares.MagicSquares.validMagicSquare(MagicSquares.java:105)
您在调用 sumColumn
和 sumRow
时没有正确调用它们:
int[][] matrix = // your matrix;
sumRow(matrix); // bad call
sumRow(matrix, 1); // good call!!!!
但实际上,如果你检查你不使用 columnNumber
和 rowNumber
的方法,所以如果你想对所有列/行求和,重新声明你的方法,因为现在是这样写的:
public static int sumAllColumns(int[][] square)
public static int sumAllRows(int[][] square)
并确保第二个循环遍历列!!!
for (int j = 0; j < square[0].length; j++)
I MUST not change the heading of any methods.
因此,只需使用已经存在的方法,但请确保使用 columnNumber
和 rowNumber
变量。如果方法描述正确,您只需要对给定的行/列求和,因此不需要嵌套循环。
public static int sumColumn(int[][] square, int columnNumber) {
int sum = 0 ;
for (int i = 0; i < square.length; i++)
sum = sum + square[columnNumber][i] ;
return sum ;
}
public static int sumRow(int[][] square, int rowNumber)
{
int sum = 0 ;
for (int i = 0; i < square[0].length; i++)
sum = sum + square[i][rowNumber] ;
return sum ;
}
添加
安全检查:只要你能给出任何columnNumber
或rowNumber
方法就可以抛出一个IndexOutOfBounds
异常。
解决方案
为避免这种情况,请检查给定索引是否在数组内部。
HUMANIZING:要对第一行或第一列求和,您必须给出 0 值。因此,为了让用户以 human 方式引用行和列(如果是第一个,则为第 1 列)
解决方案
为避免这种情况,请在您的方法和检查中使用给定的行/列 - 1:
public static int sumColumn(int[][] square, int columnNumber) {
// humanize
columnNumber = columnNumber - 1;
// safe check
if ((columnNumber) > square.length)
return 0;
int sum = 0 ;
for (int i = 0; i < square.length; i++)
sum = sum + square[columnNumber][i] ;
return sum ;
}
public static int sumRow(int[][] square, int rowNumber)
{
// humanize
rowNumber = rowNumber - 1;
// safe check
if ((rowNumber) > square[0].length)
return 0;
int sum = 0 ;
for (int i = 0; i < square[0].length; i++)
sum = sum + square[i][rowNumber] ;
return sum ;
}
我被分配了一项学校作业,要在用户生成的 N*N 矩阵中的二维数组中制作和检查 'Magic Square'。
到目前为止,我已经正确地编写了大部分代码(我已经单独测试了每个方法)。但是,我无法更正在 'sumColumn' 和 'sumRow' 方法中不断出现的两个最终错误。这是我对上述两种方法的代码:
public static int sumColumn(int[][] square, int columnNumber)
{
int sum = 0 ;
for (int j = 0; j < square.length ; j++)
{
for (int i = 0; i < square.length; i++)
{
sum = sum + square[i][j] ;
}
}
return sum ;
}
public static int sumRow(int[][] square, int rowNumber)
{
int sum = 0 ;
for (int i = 0; i < square.length; i++)
{
for (int j = 0; j < square.length; j++)
{
sum = sum + square[i][j] ;
}
}
return sum ;
}
这里是输出以及从 main 方法调用时出现的错误:
Please enter a value for N:
1
Please enter 1 numbers:
1
This is the square you input:
+-+
|1|
+-+
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
The method sumRow(int[][], int) in the type MagicSquares is not applicable for the arguments (int[][]) at squares.MagicSquares.validMagicSquare(MagicSquares.java:105)
The method sumColumn(int[][], int) in the type MagicSquares is not applicable for the arguments (int[][]) at squares.MagicSquares.main(MagicSquares.java:167)
一些摆弄 'sumRow' 和 'sumColumn' 会产生另一个错误:
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
rowNumber cannot be resolved to a variable at squares.MagicSquares.validMagicSquare(MagicSquares.java:105)
colNumber cannot be resolved to a variable at squares.MagicSquares.main(MagicSquares.java:167)
如果能解决这个问题,我们将不胜感激!谢谢!
PS:我上个月才开始编程,所以请多关照 :3
编辑:这里是检查每行、每列以及主对角线和副对角线是否等于幻方的方法。
boolean status = true ;
int sum = sumDiagonal(square) ;
if (sumSecondaryDiagonal(square) != sum)
{
status = false ;
}
else
{
for (int row = 0; (row < square.length) && status; row ++)
{
if (sum != sumRow(square, square.length))
{
status = false ;
}
}
for (int col = 0; (col < square.length) && status; col ++)
{
if (sum != sumColumn(square, square.length))
{
status = false ;
}
}
}
return status;
您的 sumColumn
方法需要两个参数:
int[][] square
int columnNumber
在您的 main 方法中,您似乎只提供了一个参数 int[][]
,而您忘记将 columnNumber 作为第二个参数。
同样适用于 sumRow
方法。
我根据您发布的错误消息做出了上述发现:
The method sumRow(int[][], int) in the type MagicSquares is not applicable for the arguments (int[][]) at squares.MagicSquares.validMagicSquare(MagicSquares.java:105)
它说,在您的 MagicSquares.java 文件中,第 105 行,您调用了 sumRow
方法。它进一步表明 (The method sumRow(int[][], int) in the type MagicSquares)
,您实现的方法,不能 used/is 不适用于第 105 行带有参数 (int[][])
的调用。
您显示的代码没有语法错误。
但是你的例外:
The method sumRow(int[][], int) in the type MagicSquares is not applicable for the arguments (int[][]) at squares.MagicSquares.validMagicSquare(MagicSquares.java:105)
您在调用 sumColumn
和 sumRow
时没有正确调用它们:
int[][] matrix = // your matrix;
sumRow(matrix); // bad call
sumRow(matrix, 1); // good call!!!!
但实际上,如果你检查你不使用 columnNumber
和 rowNumber
的方法,所以如果你想对所有列/行求和,重新声明你的方法,因为现在是这样写的:
public static int sumAllColumns(int[][] square)
public static int sumAllRows(int[][] square)
并确保第二个循环遍历列!!!
for (int j = 0; j < square[0].length; j++)
I MUST not change the heading of any methods.
因此,只需使用已经存在的方法,但请确保使用 columnNumber
和 rowNumber
变量。如果方法描述正确,您只需要对给定的行/列求和,因此不需要嵌套循环。
public static int sumColumn(int[][] square, int columnNumber) {
int sum = 0 ;
for (int i = 0; i < square.length; i++)
sum = sum + square[columnNumber][i] ;
return sum ;
}
public static int sumRow(int[][] square, int rowNumber)
{
int sum = 0 ;
for (int i = 0; i < square[0].length; i++)
sum = sum + square[i][rowNumber] ;
return sum ;
}
添加
安全检查:只要你能给出任何columnNumber
或rowNumber
方法就可以抛出一个IndexOutOfBounds
异常。
解决方案
为避免这种情况,请检查给定索引是否在数组内部。
HUMANIZING:要对第一行或第一列求和,您必须给出 0 值。因此,为了让用户以 human 方式引用行和列(如果是第一个,则为第 1 列)
解决方案
为避免这种情况,请在您的方法和检查中使用给定的行/列 - 1:
public static int sumColumn(int[][] square, int columnNumber) {
// humanize
columnNumber = columnNumber - 1;
// safe check
if ((columnNumber) > square.length)
return 0;
int sum = 0 ;
for (int i = 0; i < square.length; i++)
sum = sum + square[columnNumber][i] ;
return sum ;
}
public static int sumRow(int[][] square, int rowNumber)
{
// humanize
rowNumber = rowNumber - 1;
// safe check
if ((rowNumber) > square[0].length)
return 0;
int sum = 0 ;
for (int i = 0; i < square[0].length; i++)
sum = sum + square[i][rowNumber] ;
return sum ;
}