4

我被分配了一项学校作业,以制作和检查用户在 N*N 矩阵中生成的二维数组中的“魔方”。

到目前为止,我已经正确地编写了大部分代码(我已经单独测试了每种方法)。但是,我无法纠正在我的“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;
4

2 回答 2

0

您的sumColumn方法需要两个参数:

  1. int[][] square
  2. int columnNumber

在您的 main 方法中,您似乎只提供了一个参数, the 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方法。在第 105 行,它进一步表明,(The method sumRow(int[][], int) in the type MagicSquares)您实现的方法不能用于/不适用于带参数的调用。(int[][])

于 2015-08-31T08:52:26.250 回答
0

您显示的代码没有语法错误。

但你的例外:

MagicSquares 类型中的方法sumRow(int[][], int)不适用于squares.MagicSquares.validMagicSquare(MagicSquares.java:105) 处的参数 (int[][] )

您没有正确拨打电话sumColumn以及sumRow拨打电话时:

int[][] matrix = // your matrix;
sumRow(matrix);     // bad call
sumRow(matrix, 1);  // good call!!!!

但实际上,如果您检查您不使用的方法columnNumberrowNumber因此如果您想对所有列/行求和,请重新声明您的方法,因为现在这样写:

public static int sumAllColumns(int[][] square)
public static int sumAllRows(int[][] square)

并确保第二个循环遍历列!!!

for (int j = 0; j < square[0].length; j++)

我不能改变任何方法的标题。

因此,只需使用已经存在的方法,但请确保使用columnNumberandrowNumber变量。如果方法描述是正确的,您只需对给定的行/列求和,因此不需要嵌套循环。

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 ;
}

在这里检查一个工作演示

添加的

安全检查:只要您可以给出任何方法columnNumberrowNumber方法都可以抛出IndexOutOfBounds异常。 解决方案
为避免这种情况,请检查给定索引是否在数组内。

人性化:要对第一行或第一列求和,您必须给出 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 ;
}
于 2015-08-31T08:55:53.980 回答