Помощь по программе Magic Square на Java - PullRequest
0 голосов
/ 23 февраля 2019

Это домашняя работа, которую мы получили на моем уроке информатики, посвященном 2D-массивам.Я пытался понять код, но, к сожалению, мне трудно понять код.Вот код, который нам предоставили:

public class Magic {
    public static void main(String[] args) {

        // Initializing a variable named n and assigning the integer 3 to it
        int n = 3;
        // Initializing a multi-dimensional array with 3 rows and 3 columns max
        int m[][] = new int[n][n]; // 3 by 3

        int i, j;
        // Assigning 1 to variable num
        int num = 1;

        int nn = n * 3 / 2; //4


        for (i = 0; i < n; i++) {
            for (j = 0; j < n; j++) {
                m[(j - i + nn) % n][(i * 2 - j + n) % n] = num++; 

                System.out.println(num);
            } // next j
        } //next i

        for (i = 0; i < n; i++) {
            for (j = 0; j < n; j++) {
                System.out.print(m[i][j] + "\t");
            } // next j
            System.out.println();
        } //next i
    } //end main()
} //end class Magic

Теперь моя проблема в том, что я не понимаю этот фрагмент кода специально:

for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
        m[(j - i + nn) % n][(i * 2 - j + n) % n] = num++;
    } 
}

Что означает эта строка кодаделать в цикле?Я не уверен, почему модуль также используется в этой строке.Есть ли ограничение диапазона генерируемых чисел?

m[(j - i + nn) % n][(i * 2 - j + n) % n] = num++;

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

m, «многомерный» массив (на самом деле это просто массив массивов), имеет размер n на n, поэтому максимальные индексы в массиве n-1 и n-1 (потому чтоиндексация начинается с 0).

Умный способ безопасно выполнить индексацию в m - использовать оператор по модулю %.Вы можете думать о результате a % b как о «остатке» при делении a / b (подробнее об операторе модуля Java здесь ).

Когда вы выполняете a % b гдеa >= 0 и b > 0, результат будет всегда и будет строго меньше b.Поэтому в нашем случае модуль используется для индексации в m с числом, строго меньшим n (что мы и хотим, иначе мы бы получили исключение за пределами границ!)

0 голосов
/ 23 февраля 2019

Вы можете получить представление, посмотрев на сгенерированный магический квадрат, он выглядит так:

8   3   4   
1   5   9   
6   7   2

Первые координаты (где i = 0 и j = 0) равны 4% 3 = 1 и3% 3 = 0.Для следующей координаты j увеличивается на единицу и переводит координаты влево и одну вниз.Оператор модуля гарантирует, что координаты остаются внутри квадрата.После того, как j был увеличен в три раза, i увеличивается, а j сбрасывается в 0, так что каждое третье движение направо.После девяти ходов квадрат заполняется.

...