Ir para conteúdo
Lelre Ferreira

Verificar se matriz é simétrica ou não "Erro de lógica."

Recommended Posts

Boa noite a todos.

 

Estou com uma atividade no qual necessito informar se a matriz é simétrica ou não com base nos valores digitados pelo usuário. O meu código está meio caminho andado. Uma matriz simétrica é a matriz na qual os valores abaixo da diagonal principal são iguais os valores acima da diagonal principal. Logo pensei, se (i < j) valores acima da diagonal e (i  > j) valores abaixo da diagonal. Fiz os testes em um FOR, onde se as condições atenderem os requisitos os valores seriam armazenados em vetores distintos, um vetor para valores acima da diagonal e outro vetor para valores abaixo.

 

Depois eu ia comprar os dois vetores para ver se os valores são iguais mas me deparei com um erro de lógica. Vou postar o código e comentar o erro.

#define TAM 3

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

    void receberMatriz(int matriz[TAM][TAM]);
    void acimaDiagonal(int matriz[TAM][TAM], int acimaD[TAM]);
    void abaixoDiagonal(int matriz[TAM][TAM], int abaixoD[TAM]);
    
    
    void TesteValorVetor(int matriz[TAM][TAM], int acimaD[TAM], int abaixoD[TAM]);

        int main(void)
        {
            setlocale(LC_ALL, "");

                int matriz[TAM][TAM] = {0};
                int abaixoD[TAM] = {0};
                int acimaD[TAM] = {0};
                

                receberMatriz(matriz);
                acimaDiagonal(matriz, acimaD);
                abaixoDiagonal(matriz, abaixoD);
                TesteValorVetor(matriz, acimaD, abaixoD);
                    
            return 0;
        }

        void receberMatriz(int matriz[TAM][TAM])
        {
            int i, j;

            for(i = 0; i < TAM; i++)
            {
                for(j = 0; j < TAM; j++)
                {
                    printf("Insira valor pos. [%i][%i]: ", i, j);
                    scanf("%i", &matriz[i][j]);
                }
            }
        }

        void acimaDiagonal(int matriz[TAM][TAM], int acimaD[TAM])
        {
            int i, j;

            for(i = 0; i < TAM; i++)
            {
                for(j = 0; j < TAM; j++)
                {
                    if(i < j)
                    {
                        acimaD[j] = matriz[i][j];
                    }
                }
            }
        }

        void abaixoDiagonal(int matriz[TAM][TAM], int abaixoD[TAM])
        {
            int i, j;

            for(i = 0; i < TAM; i++)
            {
                for(j = 0; j < TAM; j++)
                {
                    if(i > j)
                    {
                        abaixoD[j] = matriz[i][j];
                    }
                }
            }
        }

        void TesteValorVetor(int matriz[TAM][TAM], int acimaD[TAM], int abaixoD[TAM])
        {
            int i, j;

			
			system("cls");
            for(i = 0; i < TAM; i++)
            {
                for(j = 0; j < TAM; j++)
                {
                    printf("[%i] ", matriz[i][j]);
                }

				printf("\n");

            }
            
            printf("\n");

            for(i = 0; i < TAM; i++)
            {
                printf("[%i]", acimaD[i]);
            }

            printf("\n");

            for(i = 0; i < TAM; i++)
            {
                printf("[%i]", abaixoD[i]);
            }
        }

 

Nas funções:

 

        void acimaDiagonal(int matriz[TAM][TAM], int acimaD[TAM])
        {
            int i, j;

            for(i = 0; i < TAM; i++)
            {
                for(j = 0; j < TAM; j++)
                {
                    if(i < j)
                    {
                        acimaD[j] = matriz[i][j];
                    }
                }
            }
        }

        void abaixoDiagonal(int matriz[TAM][TAM], int abaixoD[TAM])
        {
            int i, j;

            for(i = 0; i < TAM; i++)
            {
                for(j = 0; j < TAM; j++)
                {
                    if(i > j)
                    {
                        abaixoD[j] = matriz[i][j];
                    }
                }
            }
        }

 

 

Eu faço a verificação (i < j), acima do diagonal e vise-versa e então armazeno em um vetor. Quando mando mostrar o vetor para ver quais valores tenho lá. Supondo que eu coloque 1, 2, 3, 4, 5, 6, 7, 8, 9... Os valores deveriam ser para o primeiro vetor: [2][3][6] referente aos valores acima da diagonal principal. E [4][7][8] valores abaixo da diagonal principal... Mas ao invés disso o código está me retornando o seguinte: [0][2][6] e [7][8][0]... Ou seja, não está atribuindo alguns valores.

 

A11, A12, A13

A21, A22, A23

A31, A32, A33

 

Eu identifiquei um erro, na primeira função void acimaDiagonal() quando ele faz a primeira verificação no A11, como a condição se só atribui se for i < j, na primeira casa do primeiro vetor ele ignora qualquer alteração deixando o [0]... Como posso corrigir isso? Fui claro na minha dúvida?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já tentei fazer isso mas de nada adiantou:

Decrementar :

acimaD[j-1] = matriz[j];

Incrementar:

abaixoD[j+1] = matriz[j];
        void acimaDiagonal(int matriz[TAM][TAM], int acimaD[TAM])
        {
            int i, j;

            for(i = 0; i < TAM; i++)
            {
                for(j = 0; j < TAM; j++)
                {
                    if(i < j)
                    {
                        acimaD[j-1] = matriz[i][j];
                    }
                }
            }
        }

        void abaixoDiagonal(int matriz[TAM][TAM], int abaixoD[TAM])
        {
            int i, j;

            for(i = 0; i < TAM; i++)
            {
                for(j = 0; j < TAM; j++)
                {
                    if(i > j)
                    {
                        abaixoD[j+1] = matriz[i][j];
                    }
                }
            }
        }

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola @Lelre Ferreira, uma resposta curta e uma longa, espero ajudar, qualquer problema da um grito.

 

RESPOSTA CURTA:

Troca isso:

void acimaDiagonal(int matriz[TAM][TAM], int acimaD[TAM])
{
  int i, j;

  for(i = 0; i < TAM; i++)
  {
    for(j = 0; j < TAM; j++)
    {
      if(i < j)
      {
        acimaD[j-1] = matriz[i][j];
      }
    }
  }
}

void abaixoDiagonal(int matriz[TAM][TAM], int abaixoD[TAM])
{
  int i, j;

  for(i = 0; i < TAM; i++)
  {
    for(j = 0; j < TAM; j++)
    {
      if(i > j)
      {
        abaixoD[j+1] = matriz[i][j];
      }
    }
  }
}

Por isso:

void acimaDiagonal(int matriz[TAM][TAM], int acimaD[TAM])
        {
            int i, j;
  			int k = 0;
			
            for(i = 0; i < TAM; i++)
            {
                for(j = 0; j < TAM; j++)
                {
                    if(i < j)
                    {
                        acimaD[k++] = matriz[i][j];
                    }
                }
            }
        }

        void abaixoDiagonal(int matriz[TAM][TAM], int abaixoD[TAM])
        {
            int i, j;
			int k = 0;
			
            for(i = 0; i < TAM; i++)
            {
                for(j = 0; j < TAM; j++)
                {
                    if(i > j)
                    {
                        abaixoD[k++] = matriz[i][j];
                    }
                }
            }
        }

 

 

RESPOSTA LONGA (não tao longa assim):

 

Você decidiu matar uma formiga com uma bazuca, criando vetores separados e depois comparando os dois. Digitando "Symmetric matrix" no google e entrando no wiki, a versão em português ta bem fraquinha, você encontra uma linha bem importante:

1) "...So if the entries are written as A = (aij), then aij = aji, for all indices i  and j."

 

Logo, todo Aij tem que ser igual ao Aji (quando você compara os vetores na real é isso q você ta fazendo), com essas duas informações em mão, vamos desenvolver nosso código.

 

OBS: Eu não sei o quanto você sabe sobre C, então vamos manter o tamanho da nossa matriz estática e sem ponteiros.

 

#include <stdio.h>
#include <stdlib.h>

#define TAM 3

void receberMatriz(int matriz[TAM][TAM])
{
	int i, j;

	for(i = 0; i < TAM; i++)
		for(j = 0; j < TAM; j++)
		{
			printf("Insira valor pos. [%i][%i]: ", i, j);
			scanf("%i", &matriz[i][j]);
		}
}

void mostraMatriz (int matriz[TAM][TAM])
{
	int i, j;
	
	for(i = 0; i < TAM; i++)
	{
		for(j = 0; j < TAM; j++)
			printf ("%d ", matriz[i][j]);
		printf("\n");
	}
}

/*O char simula um bool*/
char ehSimetrica (int m[TAM][TAM])
{
	int i, j;
	
	for (i = 0; i < TAM; i++)
		for (j = 0; j < TAM; j++)
			if (i == j)
				continue;
			else
			{
				if (m[i][j] != m[j][i])
					return 0;
			}
			
	return 1;
}

int main()
{
	int m[TAM][TAM] = {0};
	int continuar = 1;
	
	do
	{
		receberMatriz (m);
		printf ("\n\nRESPOSTA:%s\n", ehSimetrica (m) ? "Sim e simetrica" : "NAO e simetrica");
		
		mostraMatriz (m);
		
		printf ("De novo?\n");	scanf ("%d", &continuar);
	}while (continuar);
	
	return (0);
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por Matheus William
      Eu estou com o seguinte problema: receber dois números decimais e convertê-los para binário e depois realizar a soma binaria dos números que foi convertidos (considerar números negativos). Eu consegui fazer a maior parte, mas a soma esta saindo errada. Quem puder me ajudar eu agradeço.
      Segue o código do programa ate agora:
      #include <stdio.h> #define na 16 int main() { int n,n1,r[na],r1[na],i,somav[na],vaium=0,invert[na],np=1; /*Lê o número*/ printf("\n Digite o primeiro numero: "); scanf("%d", &n); /* Utiliza um número de 16 bits como base para a conversão.*/ for(i = na-1; i >= 0; i--) { r[i] = (n >> i) & 1; /*Por meio do "e" lógico ele compara se o valor na posição mais à direita é 1 ou 0 e imprime na tela até reproduzir o número binário.*/ if(r[i] & 1) printf("1",r[i]); else printf("0",r[i]); } printf("\n Digite o segundo numero: "); scanf("%d", &n1); for(i = na-1; i >= 0; i--) { r1[i] = (n1 >> i) & 1; if(r1[i] & 1) printf("1",r1[i]); else printf("0",r1[i]); } /*for (i=na-1;i>=0;i--) vaium[i]=0;*/ if(n<0) { for(i=na-1;i>=0;i--){ if(r[i]==1) invert[i]=0; else if(r[i]==0) invert[i]=1; } for (i=na-1;i>=0;i--) r[i]=invert[i]+np+vaium; if(r[i]==2){ r[i]=0; vaium++; } } else if(n1<0){ for(i=na-1;i>=0;i--){ if(r1[i]==1) invert[i]=0; else if(r1[i]==0) invert[i]=1; } for (i=na-1;i>=0;i--) r1[i]=invert[i]+np+vaium; if(r1[i]==2){ r1[i]=0; vaium++; } } for(i=na-1;i>=0;i--){ somav[i]=r[i]+r1[i]+vaium; if((somav[i]==2) || (somav[i]==3)){ somav[i]=0; vaium++; } } printf("\n Soma dos numeros binarios:"); for (i=na-1;i>=0;i--) printf("%d",somav[i]%2); return 0; }
    • Por Alan Neves
      Eu preciso apenas das resoluções pois esse é um conteúdo um pouco avançado para as aulas que eu tive, e o professor orientou que nós tentássemos resolver ou se não conseguíssemos, tentar achar a resolução na internet para entendermos a lógica usada.
       
      1- Escreva um algoritmo que calcule e escreva a soma dos dez primeiros termos da seguinte série: 2/500 - 5/450 + 2/400 - 5/350 + …
       
      2-Uma agência de publicidade quer prestar serviços somente para as maiores companhias - em número de funcionários - em cada uma das classificações: grande, média, pequena e microempresa. Para tal, consegue um conjunto de dados com o código, o número de funcionários e o porte da empresa. Construa um algoritmo que liste o código da empresa com maiores recursos humanos dentro de sua categoria. Utilize como finalizador o código de empresa igual a 0.
       
    • Por Alan Neves
      Eu preciso das resoluções pois esse é um conteúdo um pouco avançado para as aulas que eu tive, e o professor orientou que nós tentássemos resolver ou se não conseguíssemos, tentar achar a resolução na internet para entendermos a lógica usada.
       
      1- Escreva um algoritmo que calcule e escreva a soma dos dez primeiros termos da seguinte série: 2/500 - 5/450 + 2/400 - 5/350 + …
       
      2-Uma agência de publicidade quer prestar serviços somente para as maiores companhias - em número de funcionários - em cada uma das classificações: grande, média, pequena e microempresa. Para tal, consegue um conjunto de dados com o código, o número de funcionários e o porte da empresa. Construa um algoritmo que liste o código da empresa com maiores recursos humanos dentro de sua categoria. Utilize como finalizador o código de empresa igual a 0.
       
    • Por Fernanda De Camargo Fernandes
      Uma matriz quadrada inteira é chamada de "quadrado  mágico" se a soma dos elementos de cada linha, a soma dos elementos de cada coluna e a soma dos elementos das diagonais principal e secundária são todos iguais. Exemplo: A matriz abaixo representa um quadrado mágico:
      8 0 7
      4 5 6
      3 10 2
      Ler um matriz M (3,3) e informar se a mesma é um “quadrado mágico” ou não.
    • Por Fernanda De Camargo Fernandes
      Uma matriz quadrada inteira é chamada de "quadrado  mágico" se a soma dos elementos de cada linha, a soma dos elementos de cada coluna e a soma dos elementos das diagonais principal e secundária são todos iguais. Exemplo: A matriz abaixo representa um quadrado mágico:
      8 0 7
      4 5 6
      3 10 2
      Ler um matriz M (3,3) e informar se a mesma é um “quadrado mágico” ou não.
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.