Algoritmo não obedece estrutura condicional na matriz

Escreva um algoritmo que leia uma matriz de tamanho 3 x 3 e, ao final, imprima se esta matriz é ou não um quadrado mágico…
Fiz o programa mas ele não obedece a estrutura condicional para informar que o quadrado é mágico .
Segue código…

package matrizes;
/*   Um quadrado  mágico é  uma  matriz  quadrada
     em  que  a  soma  das  suas  linhas é  igual
     a  soma  das sua  colunas  e  que  também  é 
     igual  a  soma  da  diagonal  principal  e  da  
     diagonal  secundária.  A matriz abaixo é  um 
     de  quadrado mágico, pois a somatória, em todos os 
     casos, é  igual a 15.  Escreva um algoritmo que 
     leia uma matriz de tamanho 3 x 3 e, ao  final, imprima
     se esta matriz é ou não um quadrado mágico
 */

import java.util.Scanner;

public class Questao13 {

	public static void main(String[] args) {

		int[][] num = new int[3][3];

		int somaLinha = 0, somaColuna = 0, somaDiagonal = 0;
		int diagonal2 = 0;

		Scanner input = new Scanner(System.in);

		// SOMAR AS LINHAS

		System.out.println("Informe os números:");

		for (int i = 0; i < num.length; i++) {

			for (int j = 0; j < num.length; j++) {

				num[i][j] = input.nextInt();

				somaLinha = somaLinha + num[i][j];

			}
		}

		// SOMAR AS COLUNAS

		for (int j = 0; j < num.length; j++) {

			for (int i = 0; i < num.length; i++) {

  				somaColuna = somaColuna + num[j][i];

			}
		}

		// SOMAR A DIAGONAL PRINCIPAL

		for (int i = 0; i < num.length; i++) {

			for (int j = 0; j < num.length; j++) {

				if (i == j) {

					somaDiagonal = somaDiagonal + num[i][j];

				}

			}
		}

		// SOMAR DIAGONAL INTERNA

		for (int i = 0; i < num.length; i++) {

			for (int j = num.length ; j > 0; j--) {

				if (i == j) {

					diagonal2 = diagonal2 + num[i][j];
				}
			}
		}

		if ((somaLinha == somaColuna) && (somaColuna == somaDiagonal) && (somaDiagonal == diagonal2)) {

			System.out.println(" É um quadrado mágico!! ");

		} else {

			System.out.println(" Não é um quadrado mágico!! ");
		}

	}
}


Informe os números:
2
2
2
2
2
2
2
2
2
 Não é um quadrado mágico!! 

Alguém pode me ajudar?

Não precisa percorrer várias vezes a matriz, dá pra fazer tudo de uma vez:

public static boolean verificaQuadradoMagico(int[][] arr) {
    int somaPrimeiraLinha = 0, somaOutrasLinhas = 0, somaColuna = 0, somaDiagonal = 0, somaDiagonalSec = 0;
    for (int i = 0; i < arr.length; i++) {
        somaDiagonal += arr[i][i];
        somaDiagonalSec += arr[i][arr.length - i - 1];
        for (int j = 0; j < arr.length; j++) {
            if (arr.length != arr[i].length) {
                return false; // tamanho diferente, não é matriz quadrada
            }
            if (i == 0) {
                somaPrimeiraLinha += arr[i][j];
            } else {
                somaOutrasLinhas += arr[i][j];
            }
            somaColuna += arr[j][i];
        }
        // aqui eu terminei a linha, então se não for a primeira, eu comparo as somas
        if (i > 0 && somaOutrasLinhas != somaPrimeiraLinha) {
            return false; // se deu diferente, já sei que não é
        }
        // aqui também terminou a coluna
        if (somaPrimeiraLinha != somaColuna) {
            return false; // se deu diferente, já se que não é
        }
        somaColuna = somaOutrasLinhas = 0; // zera, para somar a próxima linha e coluna
    }
    // é mágico se a soma da primeira linha for igual a soma das diagonais
    return somaPrimeiraLinha == somaDiagonal && somaPrimeiraLinha == somaDiagonalSec;
}

Eu calculo a soma da primeira linha, e depois comparo com a soma das outras linhas, colunas e das diagonais. Se no meio encontrar alguma diferente, interrompo o loop (não faz sentido continuar se já encontrei uma soma diferente). Também coloquei uma verificação de tamanho, só para garantir que a matriz é quadrada mesmo.

Agora é só usar este método:

int[][] num = new int[3][3];

// ler os números com Scanner, etc

if (verificaQuadradoMagico(num)) {
    System.out.println(" É um quadrado mágico!! ");
} else {
    System.out.println(" Não é um quadrado mágico!! ");
}
1 curtida

Obrigado @hugokotsubo , vou debugar o código para entendê-lo.

Fiz uma outra versão também

import java.util.Scanner;

public class QuadradoMagico {
    public static void main(String[] args) {
        int[][] matriz = new int[3][3];
        Scanner sc = new Scanner(System.in);
        
        // Lê a matriz
        for(int i = 0; i < 3; i++) {
            for(int j = 0; j < 3; j++) {
                System.out.printf("Informe o elemento da posição [%d][%d]: ", i, j);
                matriz[i][j] = sc.nextInt();
            }
        }
        
        // Calcula a soma da primeira linha
        int soma = matriz[0][0] + matriz[0][1] + matriz[0][2];
        
        // Verifica as outras linhas
        for(int i = 1; i < 3; i++) {
            int somaLinha = matriz[i][0] + matriz[i][1] + matriz[i][2];
            if(somaLinha != soma) {
                System.out.println("A matriz não é um quadrado mágico.");
                return;
            }
        }
        
        // Verifica as colunas
        for(int j = 0; j < 3; j++) {
            int somaColuna = matriz[0][j] + matriz[1][j] + matriz[2][j];
            if(somaColuna != soma) {
                System.out.println("A matriz não é um quadrado mágico.");
                return;
            }
        }
        
        // Verifica as diagonais
        int somaDiagonal1 = matriz[0][0] + matriz[1][1] + matriz[2][2];
        int somaDiagonal2 = matriz[0][2] + matriz[1][1] + matriz[2][0];
        if(somaDiagonal1 != soma || somaDiagonal2 != soma) {
            System.out.println("A matriz não é um quadrado mágico.");
            return;
        }
        
        System.out.println("A matriz é um quadrado mágico.");
    }
}