Opinião - Matriz

6 respostas
serjones

Pessoal, boa tarde.

Preciso fazer um programinha que leia uma matriz 20x20(negociavel) e que inform se é simetrica ou não. Eu fiz o seguinte.

import java.util.Scanner; 
public class Ex009 { 

	public static Scanner entr=new Scanner(System.in); 
	public static int menu(Scanner entr) { 
	System.out.println("1 - Determinar se a matriz é simétrica "); 
	System.out.println("0 - sair"); 
	return entr.nextInt(); 
	} 
		
	public static void simetrica(int[][]matriz, int linhas) {
	
	int i,j,colunas; 
	colunas=linhas; 
	
	for (i=0; i<linhas; i++)
		{	for (j=i+1; j<colunas; j++)
			{	if (matriz[i][j]!=matriz[j][i]) 
				break; 
			} 
			if(j<colunas)
			break; 
		} 
			
	System.out.println(); 
	
	if (i<linhas) 
	System.out.println("A Matriz não é simétrica"); 
	else 
	System.out.println("A Matriz é simétrica"); 
	
	} 

	public static void main(String[] args) { 
	int i,j,colunas,linhas ,menu; 
	System.out.println("Informe o número de linhas ( = número de colunas)"); 
	linhas=entr.nextInt(); 
	colunas=linhas; 
	System.out.println("Informe os números que constituem as linhas da matriz"); 
	int matriz[][]=new int[linhas][colunas]; 
	for (i=0; i<linhas; i++) 
	for (j=0; j<colunas; j++) 
	matriz[i][j]=entr.nextInt(); 
	
	for(i=0; i<linhas; i++) 
	{	for(j=0; j<colunas;j++) 
		{ 
		System.out.print(matriz[i][j]+" "); 
		} 
		System.out.println(); 
	} 
		System.out.println(); 
		
		while((menu=menu(entr))!=0) 
		{ 
				switch (menu) 
			{ 
				case 0: break; 
				case 1: simetrica(matriz,linhas); break; 
				default: System.out.println("Ação inválida"); 
			} 
		}
	 } 
			
}

O que vocês mudariam? Acrescentariam?

Sei que tem outras formas mais simples, mais rápida e menor do que o exemplo acima.

Opiniões e criticas são bem vindas, ajuda no apredizado.

6 Respostas

T

Normalmente, dentro da medida do possível, é bom separar a impressão da obtenção dos resultados. Por exemplo, você poderia fazer algo assim:

public static boolean ehSimetrica (int[][] matriz, int linhas) {
     int colunas = linhas;

     for (int i = 0; i < linhas; ++i) {
         for (int j = 0; j < colunas; ++j) {
             if (matriz[i][j] != matriz[j][i]) { 
                 return false;
             }
         }
      }
      return true;
}

public static void simetrica(int[][]matriz, int linhas) {  
     if (ehSimetrica (matriz, linhas)) {       
         System.out.println("A Matriz não é simétrica");   
     } else {
         System.out.println("A Matriz é simétrica");   
     }
}

Isso tem a vantagem de deixar seu código mais legível e menos "linguição".

serjones

thingol:
Normalmente, dentro da medida do possível, é bom separar a impressão da obtenção dos resultados. Por exemplo, você poderia fazer algo assim:

public static boolean ehSimetrica (int[][] matriz, int linhas) {
     int colunas = linhas;

     for (int i = 0; i < linhas; ++i) {
         for (int j = 0; j < colunas; ++j) {
             if (matriz[i][j] != matriz[j][i]) { 
                 return false;
             }
         }
      }
      return true;
}

public static void simetrica(int[][]matriz, int linhas) {  
     if (ehSimetrica (matriz, linhas)) {       
         System.out.println("A Matriz não é simétrica");   
     } else {
         System.out.println("A Matriz é simétrica");   
     }
}

Isso tem a vantagem de deixar seu código mais legível e menos "linguição".

Obrigado pelo retorno. Já fiz a alteração e anotei a dica no caderno.

Ao ler o exercicio novamente vi que é melhor usar o RANDOM mas aida estou perdido.

B

serjones:
Obrigado pelo retorno. Já fiz a alteração e anotei a dica no caderno.

Ao ler o exercicio novamente vi que é melhor usar o RANDOM mas aida estou perdido.

Se você quiser preencher a tua matriz com dados aleatórios até dá, mas vai ser difícil ela ficar simétrica assim :slight_smile:

Aliás, o que é simetria de uma matriz?

serjones

Bruno Laturner:
serjones:
Obrigado pelo retorno. Já fiz a alteração e anotei a dica no caderno.

Ao ler o exercicio novamente vi que é melhor usar o RANDOM mas aida estou perdido.

Se você quiser preencher a tua matriz com dados aleatórios até dá, mas vai ser difícil ela ficar simétrica assim :slight_smile:

Aliás, o que é simetria de uma matriz?

Exemplo de uma matriz simétrica:

0 1 0
1 0 1
1 1 0

Isso ai em cima é uma matriz simétrica.

serjones
Bruno Laturner:
serjones:
Obrigado pelo retorno. Já fiz a alteração e anotei a dica no caderno.

Ao ler o exercicio novamente vi que é melhor usar o RANDOM mas aida estou perdido.

Se você quiser preencher a tua matriz com dados aleatórios até dá, mas vai ser difícil ela ficar simétrica assim :)

Aliás, o que é simetria de uma matriz?

Bruno,

Na verdade no Random rola matriz simétrica sim, da uma olhada neste exemplo. Só falta colocar o metodo para imprimir e o Random.

import javax.swing.JOptionPane;
import java.util.StringTokenizer;
import java.util.Random;
public class Ex09L05
{	float v[];
	int m[][];
	
	void numerosAleatorios ()
	{	Random q =new Random ();
		m=new int [3][3];
		int teste=0;
		for(int i=0;i<3;i++)
		{	for(int j=0;j<i;j++)
			{	m[i][j]=q.nextInt (50);
				m[j][i]=m[i][j];
			}
		}
	}
	public static void main(String [] args)
	{	Ex09L05 A=new Ex09L05 ();
		A.numerosAleatorios();
		System.out.println(" ");
		A.imprimirMatriz();
		System.out.println(" ");
		
	}
	void imprimirMatriz()
	{	for(int i=0;i<3;i++)
		{	for(int j=0;j<3;j++)
			{	System.out.print(m[i][j] + " ");
			}
			System.out.println(" ");
		}	
	}
	
	
}
>
B

serjones:
Exemplo de uma matriz simétrica:

0 1 0
1 0 1
1 1 0

Isso ai em cima é uma matriz simétrica.


Certeza? :?

Criado 20 de maio de 2009
Ultima resposta 20 de mai. de 2009
Respostas 6
Participantes 3