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 anderx
      Prezados, boa tarde.
       
      Eu estou fazendo um programa em C que o usuário digite uma sequencia de caracteres e imprima somente valores numéricos e também mostrar os seus respectivos valores correspondentes a tabela ASC. Eu utilizei dois vetores , um para receber os caracteres e um outro para copiar apenas os valores numéricos, mas eu não estou conseguindo transferir somente os valor numéricos para o outro vetor. Alguém tem alguma dica de como posso transferir somete os números ? O código abaixo: 
       
      #include <stdio.h>
      #include <string.h>
      int main () {
      char str1[30] ={0};
       int str2[30];
      int i=0;
      scanf ("%s",str1);
      for(i=0; i<strlen(str1);i++) {
        str1*=1;
      str2=str1;

      printf("%c : : %d\n",str2,str2);
      }
          return 0;
      }
       
    • Por EduardoLenz
      Olá, pessoal,
       
      Mexo com microcontroladores, antigamente com PIC e agora com ARM (plataforma LPCXpresso). 
      Ambos utilizam a linguagem C. 
       
      Meu problema é o seguinte: Preciso converter um caractere que vem da UART (porta de comunicação). No PIC havia uma função pronta para tal, no ARM não. 
       
      O caractere chega assim, por exemplo: P123 (tudo junto), e eu queria separar em:
      dado_recebido[]={'P', '1', '2', '3'}; 
      Para poder utilizar um switch 
      switch(dado_recebido[0])
      {
      case 'P':....
      }
       
      alguém tem alguma ideia de como posso fazer a conversão? 
       
      Agradeço desde já. 
    • Por Caioba
      Salve! Estou com problemas ao solucionar uma questão que me foi proposta na linguagem C. Já desenvolvi todo o código, mas os casos de teste não batem.
       
      Questão: 
      A agência cearense para investigações criminais denominada OBI (Operação de Baita Investigação) notou que, a exemplo do que ocorreu na Petrobrás, muito dinheiro foi desviado dos cofres públicos do estado para pagamento de propina a políticos nos últimos anos, especialmente pelo partido QU (Quadrilha Unida).
      A investigação está em andamento e a agência recrutou você para converter alguns valores que ficaram com caracteres estranhos após terem sidos descriptografados dos arquivos originais. Sua tarefa neste caso é relativamente simples: basta retirar todos os caracteres estranhos (não numéricos) de cada um dos dois valores disponíveis. Apenas tome o cuidado de separar os primeiros 11 dígitos do primeiro valor. Eles correspondem ao CPF do corrupto :)
      Entrada: A entrada é composta por duas linhas, cada uma delas contendo entre 1 e 60 caracteres ('0'-'9' e outros caracteres não numéricos ou, pelo menos, 1 caracter '0'-'9') e no máximo um ponto ".". Desconsiderando os caracteres não numéricos, o número final não deve ter mais de 17 caracteres (incluindo o ponto decimal).
      Exemplo de entrada:
      7a5a6adfg4a4adsfgsd9fg6aa904aa91#$%1
      42**&7746.67abc$
      Saída: Imprima o CPF do corrupto e o valor que foram desviados dos cofres públicos.
      Exemplo de saída
      cpf 75644969049
      propina 11427746.67
       
      Meu código abaixo:
      #include<stdio.h> #include<string.h> int main(){ char caract[60]; char caract2[60]; char cpf[10]; char propina[15]; int i=0, j=0; scanf("%s", caract); for(i = 0; caract[i] != '\0'; i++){ if(caract[i] >= 48 && caract[i] <= 57){ if(j<11){ cpf[j] = caract[i]; } j++; } } cpf[11] = '\0'; cpf[12] = '\0'; scanf("%s", caract2); for(i = 0; caract2[i] != '\0'; i++){ if((caract2[i] >= 48 && caract2[i] <= 57) || caract2[i] == 46){ propina[j] = caract2[i]; j++; } } cpf[10] = '\0'; printf("cpf %s", cpf); printf("propina %s", propina); }  
    • Por TutoDS
      Boa tarde pessoal.
      Sou novo a programar em C, programo diariamente em PHP e já programei em C#.
      Porém agora tenho que fazer um projeto para a minha Licenciatura em C, um programa estilo Via Verde.
      Mas estou com dificuldades, pois o meu pensamento está mais virado para Base de Dados.
      Se alguém me puder tirar as seguintes dúvidas agradeço:
      Como recomendam estruturar os ficheiros para guardar os dados do cliente, os veículos e as viagens? Como posso fazer a pesquisa num ficheiro, por exemplo inserir 123456789 e aparecer me os dados do cliente com esse NIF? Obrigado
    • Por LucasCBSouto
      Pessoal, estou com dificuldades na solução deste problema:  
       
      Seja um número N natural maior ou igual a 1. Fazer um algoritmo que calculo S = 1 + 1/2+ 1/3 + 1/4 + ... + 1/N.
       
      Meu código está assim:
       
      #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int i, n; float soma; print("Entre com n: "); scanf("%d", &n); soma = 0; { for (i=1; i<=&n; i++) soma = soma + (1/i); } printf("\n O somatorio das fracoes eh: %f", soma); }  
      Alguém pode me dizer por que não funcionando? O que deve mudar ou o que falta inserir?
       
      Solução:
      https://forum.imasters.com.br/topic/316721-resolvido soma-com-fração/
×

Informação importante

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