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 leubeck
      Boa noite a todo(a)s do Fórum , sou novo aqui e venho solicitar uma ajuda na criação de uma matriz para ser exibida na tela pelo java.
      Estou com dificuldades por nunca ter programado na vida, e confesso estar gostando muito por sinal.
      Mas foi passado uma tarefa na faculdade que achei até um pouco difícil e acredito que para vocês que já são experts não será, sem delongas vou ao assunto de pedido de ajuda.
       
      1 - Eu preciso criar uma matriz que ela determine se é quadrada ou não.
       
      2 - Se ela não for apresente uma mensagem de erro e feche o programa.
       
      3 - Se ela for uma matriz quadrada, que determine se é do tipo : Diagonal, Identidade, Simétrica, Triangular superior ou Inferior.
       
      Então é isto gente, espero que consiga ajuda de vocês, eu estou usando o programa (eclipse).
      Tenham uma boa noite e fiquem com deus.
    • Por DrDjou
      Boa tarde pessoal estou com muita dificuldade para fazer esse códigos:
      1) Cléo Kuhn contratou você para desenvolver um programa (utilize funções) que leia a quantidade de chuva em milímetros, por dia durante um mês. Sabendo que, podemos ter meses com 28, 30 e 31 dias, (ignorando o ano bissexto). Primeiramente deve ser possível informar o mês que deseja lançar as informações, depois deve ser possível informar a precipitação diária de chuva. Após a inserção dos dados deve ser possível verificar a média mensal de precipitação em milímetro, quantidade de dias que choveu, e a quantidade de dias que não choveu.
      este já começei:
      #include<stdio.h>
      #include<stdlib.h>
      int main(void){
          int mes,a,b,c,m,soma=0,i;
          printf("Digite o mes que voce quer informar a chuva:\n");
          scanf("%d",&mes);
                  if(mes=1,mes=3,mes=5,mes=7,mes=8,mes=10,mes=12){
                      for(m=0;m<=31;m++){
          printf("Milimetros de chuva\nse nao choveu digite'0'.Dia %d:",i);
          scanf("%d",&m);
          }
                  if(mes=4,mes=6,mes=9,mes=11){
                      for(m=0;m<=30;m++){
          printf("Informe quantos milimetros choveu neste dia se nao choveu digite'0':\n");
          scanf("%d",&m);
          }
                  if(mes=2){
                      for(m=0;m<=28;m++){
          printf("Informe quantos milimetros choveu neste dia se nao choveu digite'0':\n");
          scanf("%d",&m);
          }    if(m>=0)
                          Printf("Não choveu");
                          scanf("%d",&a);
                          if(m<0)
                          Printf("Choveu");
                          scanf("%d",&b);
          a=soma+m;
           b=soma+m;
                      printf("choveu %d, nao choveu %d.",b,a);
              
                  }                                    
                      
                      system("pause");
                      }}}
       
       
       
      2) (2 pontos) Implemente um programa que utilize funções para calcular o valor a ser pago no acerto de uma prestação de conta. O programa deverá solicitar ao usuário o valor da prestação e o número de dias em atraso e passar estes valores para a função que calcula o valor a ser pago, e devolverá este valor ao programa que a chamou. O programa deverá então exibir o valor a ser pago na tela, e deverá voltar a pedir outro valor de prestação e assim continuar até que seja informado um valor igual a zero para a prestação. Neste momento o programa deverá ser encerrado, exibindo o relatório do dia, que conterá a quantidade e o valor total de prestações pagas no dia. O cálculo do valor a ser pago é feito da seguinte forma. Para pagamentos sem atraso, cobrar o valor da prestação. Quando houver atraso, cobrar 2% de multa, mais 0,2% de juros por dia de atraso.
    • Por Rondz
      Faça um programa que receba dados do tipo inteiro suficientes para preencher uma matriz com dimensão 2 x 5, calcule e mostre a quantidade de números ímpares.
       
      Faça um programa que receba 15 valores reais que devem ser armazenados em um vetor. Após a digitação de todos os valores, mostre-os na tela, altere todos os valores para sua metade respectiva e imprima os resultados atuais.
    • Por Programador Legal Olha Só
      Escreva um algoritmo que leia 6 números e os armazene em um vetor.
      Utilize a função rand para gerar 6 números aleatórios que sejam armazenados em um vetor
      Compare os dois vetores e informe ao usuário se ele acertou ou nao os numeros
      Os números digitados podem ser de 1 a 60, assim como os números gerados.
      Utilize funções para cada algoritmo de seu programa.
    • Por enzofornetti
      Olá pessoas. Estou começando em programação, c++. Fui tentar realizar um loop em uma programação antiguinha minha. Mas, no final, o programa não "usa" o scanf e volta para o começo. Podem me dizer o problema? Já agradeço a paciência aushuahs
       
       
      #include <stdio.h>
      #include <conio.h>
      #include <stdlib.h>
      #include <math.h>
      int main()
      {
          float v;
          float i;
          float r;
          char op,ob;
          int banana = 1;
          
          while(banana = 1)
          {
          
          printf("Eae meu brother, o que deseja calcular?\n\nCorrente - digite 'i' e pressione Enter\nDDP - digite 'v' e pressione Enter\nResistencia - digite 'r' e pressione Enter\n");
          scanf("%c",&op);
          
          if(op == 'v')
          {
              printf("Resistencia: ");
              scanf("%f", &r);
              
              printf("Corrente: ");
              scanf("%f", &i);
              
              v=r*i;
              
              printf("DDP: %0.8f",v);
              
              printf("\nEletro > Info > Mecanica");
          }
          else
          {
              if(op == 'i')
              {
                  printf("DDP: ");
                  scanf("%f",&v);
                  
                  printf("Resistencia: ");
                  scanf("%f",&r);
                  
                  i=v/r;
                  
                  printf("Corrente: %0.8f",i);
                  printf("\nEletro > Info > Mecanica");
              }
              else
              {
                  if(op == 'r')
                  {
                      printf("Corrente: ");
                      scanf("%f",&i);
                      
                      printf("DDP: ");
                      scanf("%f",&v);
                      
                      r=v/i;
                      
                      printf("Resistencia: %0.8f",r);
                      printf("\nEletro > Info > Mecanica");
                   
                  }
                  else
                  {
                      printf("Brother, recomece");
                  }
              }
              
          }
          printf("\n\nDeseja calcular novamente?\n\nn - Nao\ns - Sim\n");
          scanf("%c",&ob);
          
          if(ob == 's')
          {
              banana = 1;
          }
          else
          {
              banana = 2;
          }
      }
      }
×

Informação importante

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