Java幻方-求和列和行错误
我被分配了一个学校作业,在用户生成的N*N矩阵的2d数组中制作并检查“幻方” 到目前为止,我已经获得了大部分正确的代码(我已经分别测试了每个方法)。但是,我无法纠正“sumColumn”和“sumRow”方法中不断出现的最后两个错误。以下是我对上述两种方法的代码:Java幻方-求和列和行错误,java,arrays,methods,compiler-errors,magic-square,Java,Arrays,Methods,Compiler Errors,Magic Square,我被分配了一个学校作业,在用户生成的N*N矩阵的2d数组中制作并检查“幻方” 到目前为止,我已经获得了大部分正确的代码(我已经分别测试了每个方法)。但是,我无法纠正“sumColumn”和“sumRow”方法中不断出现的最后两个错误。以下是我对上述两种方法的代码: public static int sumColumn(int[][] square, int columnNumber) { int sum = 0 ; for (int j = 0; j < square.l
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 ;
}
有些人摆弄“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)
在解决此问题时,任何帮助都将不胜感激!谢谢
附言:我上个月才开始编程,所以要友善: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;
boolean status=true;
整数和=平方和(平方);
if(平方和二次对角线)!=和)
{
状态=假;
}
其他的
{
对于(int row=0;(row
您的sumColumn
方法需要两个参数:
int[][]正方形
int columnNumber
int[][]
,而忘记了将columnNumber作为第二个参数
这同样适用于sumRow
方法
我根据您发布的错误消息得出上述结论:
类型MagicSquares中的方法sumRow(int[][],int)不适用于squares.MagicSquares.validmagicsquares(MagicSquares.java:105)处的参数(int[][])
它说,在MagicSquares.java文件的第105行中,调用
sumRow
方法。它进一步指出,(MagicSquares类型中的方法sumRow(int[]],int)
,即您实现的方法,不能用于/不适用于第105行带有参数的调用。(int[]])
。您显示的代码没有语法错误
但你的例外是:
MagicSquares类型中的方法sumRow(int[][],int)不适用于squares.MagicSquares.ValidMagicSquares(MagicSquares.java:105)中的参数(int[][)
调用它们时,您没有正确调用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++)
附加组件的安全检查:只要您可以给出任何
列号
或行号
,这些方法就可以抛出索引自动边界
异常。
解决方案为了避免这种情况,请检查给定的索引是否在数组中 人性化:要对第一行或第一列求和,必须给出0值。因此,为了使用户能够以人工方式引用行和列(如果第一列是第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 ;
}
公共静态int-sumColumn(int[][]平方,int-columnNumber){
//人性化
columnNumber=columnNumber-1;
//安全检查
如果((列数)>平方长度)
返回0;
整数和=0;
对于(int i=0;i平方[0]。长度)
返回0;
整数和=0;
对于(int i=0;i
感谢您的快速回复:)是的,去掉“int columnNumber”和“int rowNumber”可以解决问题。不幸的是,根据我的赋值规则,我无法更改任何方法(包括主方法)的标题grrr我必须在我的方法中使用int columnNumber和rowNumber):我正在努力将这两个变量合并到它们各自的方法中,因为它们看起来是“冗余的”。代码不错!但我的矩阵可以是2*2矩阵,也可以是无限数。参数必须以这样一种方式,它将对任意给定数量的N分别求和行。这就是我的代码所做的,如果不是,请。。。。您可以在那里插入任何需要与列求和的2d数组,my code没有检查的是rowNumber
和columnNumber
的有效值,因此,如果插入5x5数组并尝试对第6列求和,将抛出IOOBException
Hmmm,这与我的代码不同。我编辑了我的问题,让你明白我的意思。我不知道如何用语言准确地解释它。>你看过演示了吗?您知道如何获取方法返回的值吗?为什么你说我的代码不同???您的代码必须有两个方法来求给定列或行的和。。。这就是我最后的两个方法所做的。。。。如果你不明白,就说出来。。。但是这不起作用或者在我的代码中是不同的。我们没有给我们任何关于你的问题的线索。谢谢你的快速回复!是的,我不确定如何将“int rowNumber”和“int columnNumber”包含到各自的方法中。根据我的作业规则,我不能去除这些变量,也不能以任何方式改变main方法):我不是建议你去除它们。相反,在你的主要方法中,你
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 ;
}
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 ;
}