Jump to content
amvm

Duvida em somar elementos da diagonal secundária de uma matriz

Recommended Posts

amvm

boas... tou aqui com um probleminho: o enunciado é o seguinte

Um quadrado mágico é uma matriz quadrada de números inteiros onde a soma dos números de

qualquer linha, de qualquer coluna e das duas diagonais dá sempre o mesmo valor.

Exemplo dum quadrado mágico:

8 1 6

3 5 7

4 9 2

Elabore uma aplicação que permita verificar se uma dada matriz é um quadrado mágico.

eu ja tenho o programa meio feito, nao faço a minima ideia se aquilo q está, está direito, mas a minha duvida era fazer a soma dos elementos de uma diagonal secundaria de uma matriz: mostro o q ja tenho feito

package aprogpl7_comp1;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        //Um quadrado mágico é uma matriz quadrada de números inteiros onde a soma dos números de
//qualquer linha, de qualquer coluna e das duas diagonais dá sempre o mesmo valor.
        Scanner ler = new Scanner (System.in);
        int nc, nl;
        do {
            System.out.println("Insira o numero de linhas");
            nl = ler.nextInt();
            System.out.println("Insira o numero de colunas");
            nc = ler.nextInt();
        } while (nl < 1 && nc < 1 && (nc != nl));
        int matriz[][] = new int[nl][nc];
        lerMatriz(nl, nc, matriz);
        SomaLinhasColunasDiagonais(nl, nc, matriz);

    }

    public static void lerMatriz(int nl, int nc, int matriz[][]) {
        Scanner ler = new Scanner(System.in);
        for (int i = 0; i < nl; i++) {
            for (int j = 0; j < nc; j++) {
                System.out.println("Insira o elemento que corresponde á linha " + (i + 1) + " e á coluna " + (j + 1));
                matriz[i][j] = ler.nextInt();
            }
        }
    }

    public static void SomaLinhasColunasDiagonais(int nl, int nc, int matriz[][]) {
        int somaL[] = new int[nl];
        int somaC[] = new int[nc];
        int somaD[] = new int[2];
        int s = 0;
        int sc = 0, sd = 0;
        for (int i = 0; i < nl; i++) {
            for (int j = 0; j < nc; j++) {
                somaL[i] = (s + matriz[i][j]);
                somaC[j] = (sc + matriz[i][j]);
                if (i == j) {
                    somaD[i] = (sd + matriz[i][j]);
                }
            }
        }
        for (int w = 0; w < somaL.length; w++) {
            if (somaL[w] == somaC[w] && somaD[0] == somaD[1] && somaC[0] == somaD[0]) {
                System.out.println("é um quadrado mágico");
            } else {
                System.out.println("Não é um quadrado mágico");
            }
        }
    }
}

cumps

Share this post


Link to post
Share on other sites
daj

Olá,

System.out.println("Insira o numero de linhas");
nl = ler.nextInt();
System.out.println("Insira o numero de colunas");
nc = ler.nextInt();
Porque pedes ao utilizador o número de linhas e colunas? É um quadrado, logo os números serão iguais. Sugeria que pedisses apenas a "dimensão".
somaL[i] = (s + matriz[i][j]);
somaC[j] = (sc + matriz[i][j]);
if (i == j) {
   somaD[i] = (sd + matriz[i][j]);
}
As variáveis s, sc e sd nunca são afectadas, nem parecem ser necessárias. Podes fazer
somaL[i] += matriz[i][j]);
// ...
Para o caso da diagonal principal, estás a enganar-te na indexação. Deveria ser somaD[0].

Já agora, uma propriedade que te pode ser útil para a diagonal secundária é que a soma dos índices (a começarem em 0) corresponde à dimensão - 1.

if (i + j == dim - 1) {
   // diagonal secundária
}
Exemplo para uma matriz de dimensão 3:
for (int w = 0; w < somaL.length; w++) {
   if (somaL[w] == somaC[w] && somaD[0] == somaD[1] && somaC[0] == somaD[0]) {
      System.out.println("é um quadrado mágico");
   } else {
      System.out.println("Não é um quadrado mágico");
   }
}
Tu queres é ver se todos são iguais e só no fim apresentar a mensagem, não é ir apresentando várias mensagens. Para além disso não estás realmente a ver se são todos iguais.

Tive que ir ver a especificação para confirmar que int somaL[] era uma declaração válida em Java, e pelos vistos é. No entanto parece-me mais "idiomático" escrever int[] somaL.

Boa sorte para o teu trabalho.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.