3

我编写了这个程序来创建一个列表,然后使用该列表来填充一个数组。然后,magicCheck 方法检查矩阵是否为幻方。我最初把它写成一个大小为 4x4 的定义矩阵。当我这样做时,一切正常。现在我想让用户决定数组的大小(nxn)。添加代码以提示用户输入 n,并基于 nxn 而不是 4x4 创建矩阵后,我的 printMatrix 方法已停止工作。

当我按原样运行程序并输入 n=2, first=2, diff=2 时,这是我得到的输出:“输入数组大小(以 nxn 形式),n:4 首先输入和 diff:2 2

这不是一个魔方。”

谁能告诉我为什么 printMatrix 不再工作?另外,我知道我的 magicCheck 方法在循环方面很草率,我确信有更好的方法来处理它,但我仍然很新,并且尽我所能将它拼凑在一起以使其工作。请温柔:]

这是我的代码:

import java.util.*;

public class MagicSquare 
{
static int row, col, n;
static final int rows = n;
static final int columns = n;
static final int listSize = (n*2);
static Scanner console = new Scanner (System.in);

public static void createArithmeticSeq(int [] list)
{   
    //prompt user for array size
    System.out.println("Enter size of array (in form nxn), n:");
    n = console.nextInt();
    int first; 
    int diff;
    //prompt user for first and diff
    System.out.println("Enter first and diff : ");
    first = console.nextInt();
    diff  = console.nextInt();
    //process to create list of 16 elements 
    for (int i=0; i<listSize; i++)
    {
        list[i]=first+i*diff;
    }
}

public static void matricize (int [] list, int [][] matrix)
{
    int i = 0;
//loop through each row
    for (row=0; row<matrix.length; row++)
    {
    //loop through each column
        for (col=0; col<matrix[row].length; col++)
        {
        //populate matrix with values from list
        matrix[row][col] = list[i++];
        }
     }
}
public static void printMatrix(int [][] matrix)
{

    for (row=0; row < matrix.length; row++)
    {
        for (col=0; col < matrix[row].length; col++)
            System.out.printf("%2d" + " ", matrix[row][col]);

        System.out.println("\n");
    }
}

public static void reverseDiagonal(int [] [] matrix)
{ 
    int temp;
    for (row=0; row<matrix.length / 2; row++)
    {
        temp = matrix[row][row];
        matrix[row][row] = 
            matrix[matrix.length - 1 - row] [matrix.length - 1 - row];
        matrix[matrix.length - 1 - row][matrix.length - 1 - row] = temp;
    }
    for (row=0; row<matrix.length / 2; row++)
    {
        temp = matrix[row][matrix.length - 1 - row];
        matrix[row][matrix.length - 1 - row] = 
            matrix[matrix.length - 1 - row][row];
        matrix[matrix.length - 1 - row][row] = temp;
    }
}

public static void magicCheck(int [] list, int [] [] matrix)
{
    int sum=0, sumRow=0, sumCol=0, sumDiag1=0, sumDiag2=0, magicNumber=0;

    for(int i=0; i<listSize; i++)
    {
        sum += list[i]; 
        magicNumber = sum /= 4;

    for(row=0; row<matrix.length; row++)
    {
            //sum each row, then compare to magicNumber
        for(col=0; col<matrix[row].length; col++)
        sumRow = sumRow + matrix[row][col];
        while (sumRow == magicNumber)
        {
            for(col=0; col<matrix.length; col++)
            {
                for(row=0; row<matrix[col].length; row++)
                {
                sumCol = sumCol + matrix[row][col];
                    while (sumCol == magicNumber)
                    {
                    sumDiag1 = matrix[0][0]+matrix[1][1]+matrix[2][2]+matrix[3][3];
                        while (sumDiag1 == magicNumber)
                        {
                        sumDiag2 = matrix[3][0]+matrix[2][1]+matrix[1][2]
                        +matrix[0][3];
                            while(sumDiag2 == magicNumber)
                            System.out.println("It is a magic square.");
                        }
                    }
                }
            }
        }
    }
    }
            System.out.println("It is not a magic square.");

}

public static void main (String [] args)
{
    int [] list = new int [listSize];
    int [] [] matrix = new int [rows] [columns];
    createArithmeticSeq (list);
    matricize(list, matrix);
    printMatrix(matrix);
    System.out.print("\n");
    reverseDiagonal(matrix);
    printMatrix(matrix);
    magicCheck(list, matrix);   
}

}
4

1 回答 1

6

您声明:

static int row, col, n;
static final int rows = n;
static final int columns = n;
static final int listSize = (n*2);

beforen根据用户输入设置。
首先,final从声明中删除 。
二、看完之后:

n = console.nextInt();

做:

rows = n;
columns = n;
...

最后,在您的 main 方法中,切换行的顺序:

int [] [] matrix = new int [rows] [columns];
createArithmeticSeq (list);
于 2013-06-10T19:43:52.653 回答