Java幻方-求和列和行错误

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

我被分配了一个学校作业,在用户生成的N*N矩阵的2d数组中制作并检查“幻方”

到目前为止,我已经获得了大部分正确的代码(我已经分别测试了每个方法)。但是,我无法纠正“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 ;
}
有些人摆弄“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
  • 在main方法中,似乎只提供了一个参数,
    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 ;
    }