cuadrado mágico

Estoy haciendo un cuadrado mágico y hasta ahora he hecho esto, pero cuando se crea el array me da un error error que me sale en la ejecución del programa

Esto es lo que he hecho:

   boolean Filas = false, Columnas = false;
    Scanner teclado = new Scanner(System.in);
    int dato1 = 0;
    int dato2 = 0;
    int sumaColumna = 0;
    int sumaFila = 0;
    int cuadradoMagico = 0;
    int numero = cuadradoMagico;
    int c = 0; //constante "magica"

    System.out.println("Introduce números y el programa determinará si es un cuadrado magico ó no.   ");
    cuadradoMagico = teclado.nextInt();

    int[][] cuadro = new int[cuadradoMagico][cuadradoMagico];

    for (int j = 0; j < cuadradoMagico; j++) {
        for (int i = 0; i < cuadradoMagico; i++) {
            System.out.println("valor añadido correctamente en el array, en la posición : " + j + "," + i);
            cuadro[j][i] = Integer.parseInt(teclado.next());
        }
    }
    for (int j = 0; j < cuadradoMagico; j++) {
        for (int i = 0; i < cuadradoMagico; i++) {
            System.out.print(cuadro[j][i] + " ");

        }
        System.out.println();

    }
    for (int j = 0; j < cuadradoMagico; j++) {

        dato1 = dato1 + cuadro[j][j];
        dato2 = dato2 + cuadro[(numero - 1) - j][(numero - 1) - j];
    }

    if (dato1 == c && dato2 == c) {
        Filas = true;
    } else {
        Filas = false;
    }

    for (int j = 3; j < numero; j++) {
        for (int i = 0; i < numero; i++) {
            sumaColumna = sumaColumna + cuadro[j][i];
            sumaFila = sumaFila + cuadro[i][j];
        }
        if (sumaColumna != c && sumaFila != c) {
            Columnas = false;

        } else {
            sumaColumna = 0;
            sumaFila = 0;
        }
    }
    Columnas = true;

    if (Columnas == true && Filas == true) {
        System.out.println(" Es un cuadrado mágico");
    } else {
        System.out.println(" No es un cuadrado magico");
    }

}

}

No se dónde tengo el error, pero siempre me sale el error "ArrayIndexOutOfBoundsException"

0
задан 07.11.2016, 17:35
3 ответа
int cuadradoMagico = 0;
int numero = cuadradoMagico;
cuadradoMagico = teclado.nextInt();

Сколько стоит? numero? 0.

Любая последующая операция, в которой ты использовал бы numero будешь давать странный результат, потому что он не стоит того, что ты ждешь. Как например:

for (int j = 0; j < cuadradoMagico; j++) {
    dato1 = dato1 + cuadro[j][j];
    dato2 = dato2 + cuadro[(numero - 1) - j][(numero - 1) - j]; // <<--- AQUI!!!
}

Ассигнование numero будь должен делаться, распределив стоимость в cuadradoMagico:

cuadradoMagico = teclado.nextInt();
int numero = cuadradoMagico;

С другой стороны, видя использование, которое ты делаешь cuadradoMagico и numero кажись, что переменная numero будь излишним, так как у него всегда будет та же стоимость, которая cuadradoMagico. Замени numero из-за cuadradoMagico и ты сможешь иметь немного более читабельный код и с меньшим количеством переменных.

2
ответ дан 24.11.2019, 12:43
  • 1
    У тебя есть raz и # 243; n, сейчас, когда я нашел ошибку я буду оптимизировать программу, чтобы не использовать столько переменных. Большое спасибо из-за твоего ответа – kitkat 07.11.2016, 17:25

Проблема, которая у тебя есть, состоит в том, что я нумерую предварительные гонорары в магический квадрат перед тем, как менять ему стоимость в магический квадрат.

int cuadradoMagico = 0;
int numero = cuadradoMagico;

следовательно изменчивая число равно 0.

Позже, поскольку ты вновь не выравниваешь переменную numero в cuadradoMagico эта будет продолжать стоить 0 в течение всего выполнения программы. Следовательно, когда ты сделаешь siguente выполнение:

dato2 = dato2 + cuadro[(numero - 1) - j][(numero - 1) - j];

Будешь пробовать соглашаться на положение numero - 1 array, а именно, в положение-1 из array, что невозможно.

Поскольку ты можешь наблюдать ошибку, он показывает тебе эту же самую ошибку:

java.lang. ArrayIndexOutOfBoundsException:-1

Просто, когда ты получишь стоимость cuadradoMagico ты будешь должен вновь распределять снова стоимость в переменную numero:

cuadradoMagico = teclado.nextInt();
numero = cuadradoMagico;
2
ответ дан 24.11.2019, 12:43
  • 1
    Спасибо за отвечание, уже я смог решать проблему – kitkat 07.11.2016, 17:25
  • 2
    @bpico Не за что! я радуюсь, что он служил тебе утилитой:). Просто как совет для следующего раза: обычно ошибка обычно является достаточным количеством identificativo, с которым он происходит с тобой. Например, ArrayIndexOutOfBoundsException дает понять, что ты вытек l и # 237; mite array (с ними и #237; ndices). – Francisco Romero 07.11.2016, 17:29
  • 3
    Спасибо за отвечание каждый раз, когда я печатаю вопрос:), я - начинающая в Java и в любой ошибке я ослепляю себя и не вижу больше xD – kitkat 07.11.2016, 17:32
  • 4
    @bpico нет ничего, за что можно быть благодарен, это удовольствие:). Не беспокойся, он произошел со всеми сначала (tambi и # 233; n в м и # 237;), но сейчас это мой излюбленный язык. Все терпеливо в конце концов выходит ^^ – Francisco Romero 07.11.2016, 17:42

Ошибка это будет давать здесь:

for (int j = 0; j < cuadradoMagico; j++) {

    dato1 = dato1 + cuadro[j][j];
    dato2 = dato2 + cuadro[(numero - 1) - j][(numero - 1) - j]; //Aqui da el ERROR
}

так как переменная numero ты инициализируешь ее сначала выравнивая ее в переменную cuadradoMagico что стоит 0

int cuadradoMagico = 0;
int numero = cuadradoMagico;

из-за которого, когда ты подбираешь из-за клавиатуры стоимость cuadradoMagico

cuadradoMagico = teclado.nextInt();

ты был бы должен инициализировать переменную numero также:

numero = cuadradoMagico;
1
ответ дан 24.11.2019, 12:43
  • 1
    Спасибо, я смог решить ошибку. – kitkat 07.11.2016, 17:23
  • 2
    @bpico я радуюсь тому, что он служил тебе помощью. Привет! – Joacer 07.11.2016, 17:35