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 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/
    • Por Marcelobpc
      Boa tarde pessoal,
      estou tendo muita dificuldade para criar um algoritmo que eu entre com um numero de 0 a 100 e ele me informe quantos números pares tem no intervalo do numero que digitei até 0 e caso o numero digitado for maior que 100 ele solicite que seja digitado o numero de 0 a 100 novamente.
    • Por roberto de souza gomes
      boa noite pessoal, eu sou estudante de ADS , e sou novo na programacao, estou desenvolvendo 
      um sistema para um trabalho final do curso, um sistema de controle de entrada e saida de usuarios,
      mas nele esta acontecendo um erro, quando eu digito um numero de uma cadeira que ja esta comprada
      ele aceita, estou vendo e revendo o codigo  mas nao vejo erro.
      alguem pode apontar o meu erro?
      obrigado, segue o codigo:
       
      #include <stdio.h>
      #include <time.h>
      #include <stdlib.h>
      #define linha 11
      #define coluna 11
      #define valor_minimo 29
      #define valor_maximo 121
      int valida(int num, int *ant, int cont);
      void edita (int sort,int cont);
      void chamaSorteio();
      void CadeiraNum();//declara a funcao que preenche os lugares com numeros
      void painel();//declara a funcao que mostra a matriz
      void compra();//declara a funcao que faz a compra dos lugares
      void cad();
      int resp;
      int matriz[linha][coluna];//
      FILE *ponteiroArquivo;   
      struct cadastro{
          char nome [50];
          char cpf [15];
          char email [30];
          };
           struct cadastro aux;
      int main(){
          int opcao=0;
          int contador=0,lugares=92;
          char nomes[30];
          char timeStr[9];
          
          struct tm *data_hora_atual;
          time_t segundos;
          time(&segundos);
          data_hora_atual = localtime(&segundos); 
          
          CadeiraNum(matriz);//aqui complementa a funcao cadeiraNum(); colocando os numeros.
          
          do{
              //a partir daqui e mostrado para o usuario as opcoes do programa principal
               system("cls"); 
               printf("\n\n                      MENU  \n\n");      
               printf("                  1- Reservar Cadeira       (Ainda restam (%d) lugares)\n",lugares-contador);        
               printf("                  2- Mostrar Painel de lugares\n"); 
               printf("                  3- Sorteio\n");       
               printf("                  4- SAIR           \n");        
               printf("                   opcao: ");
               scanf("%d",&opcao);               
                             
           switch(opcao){
              case 1:
                system("cls");          
                //cad();
               // getch();
                system("cls"); 
                painel(matriz);//antes de escolher o lugar antes e chamado a matriz e o usuario pode ver o painel, inclusive com os lugares do teatro comprados atualizados.
                texto:
                printf("\n\nDigite o numero da cadeira desejada: \n");
                scanf("%d",&resp);
                 
                if ((resp<=0) || (resp>=122)){  
                    printf("Esta cadeira não existe!!!Escolha outra!\n");
                    goto texto; 
                  getch();              
              }else if ((resp>=1) && (resp<=22)){  
                    printf("Esta cadeira ja esta reservada!!!Escolha outra!\n");
                    goto texto; 
                  getch();              
              }
              else if ((resp>=23) && (resp<=28)){  
                    printf("Esta cadeira é preferencial!!!Escolha outra!\n");
                    goto texto; 
                  getch();              
              }else if (matriz[linha][coluna]==0){
                  printf("Esta cadeira esta ocupada!!! Escolha outra!\n");
                  goto texto;
                  getch();
              }
              else (printf(" \n"));
                 ponteiroArquivo=fopen("arquivo.txt","r"); 
                fgets(nomes,30,ponteiroArquivo);
                
                fclose(ponteiroArquivo);
                system("cls"); 
                
               _strtime( timeStr );
                printf_s( "\tParabens %s pela sua compra no dia %d/%d/%d as %s \n\nSeu ticket sera enviado por e-mail!!\n",aux.nome, data_hora_atual->tm_mday,data_hora_atual->tm_mon+1,data_hora_atual->tm_year+1900,timeStr);
                  printf("seu assento e %d\n",resp);
                  contador++;
                system("pause");         
                break;
              
              case 2:
                system("cls");
                system("cls");
                painel(matriz);//chama a funcao painel que contem a matriz 
                printf("\n\n");
                system("pause");
                break;
                
              case 3:
                system("cls");
                chamaSorteio();
                system("pause");
                break;
                
              //o usuario escolhendo este caso o programa retorna nada e fecha
              case 4:
                return 0;
                break;
                   
              default:
                  printf("OPCAO INVALIDA!!!\n");
                  system("pause");
              break;
           }
        }while(1==1); 
        
          
      system("pause");    
      return(0);
      }
      //esta e a funcao responsavel por preencher todos os lugares do teatro com numeros!
      void CadeiraNum(){
          int c,l;
          int num;
          num=1;
          
          for(l=1;l<=linha;l++)
           for(c=1;c<=coluna;c++){      
           matriz[l][c]=num;
             num++; 
          }
          matriz[3][1]=333; 
          matriz[3][2]=333;
          matriz[3][3]=333;
          matriz[3][4]=333;
          matriz[3][5]=333;
          matriz[3][6]=333;
          /**/
          matriz[1][1]=222; 
          matriz[1][2]=222;
          matriz[1][3]=222;
          matriz[1][4]=222;
          matriz[1][5]=222;
          matriz[1][6]=222;
          matriz[1][7]=222;
          matriz[1][8]=222;
          matriz[1][9]=222;
          matriz[1][10]=222;
          matriz[1][11]=222;
          /**/
          matriz[2][1]=222;
          matriz[2][2]=222;
          matriz[2][3]=222;
          matriz[2][4]=222;
          matriz[2][5]=222;
          matriz[2][6]=222;
          matriz[2][7]=222;
          matriz[2][8]=222;
          matriz[2][9]=222;
          matriz[2][10]=222;
          matriz[2][11]=222;   
      }
      //esta e a funcao que cria as linhas e as colunas do teatro matriz
      void painel(){
        
        int c,l;
        printf("\n            PAINEL DE OCUPACOES   \n\n");
        printf("          ");
         
        
        for(c=1;c<=coluna;c++)
          printf("\t%d",c);
        
        for(l=1;l<=linha;l++){
           printf("\n\n\t%d",l);
           for(c=1;c<=coluna;c++)
           
             
          if(matriz[l][c]==222){
               printf("\t(R)");
           }else if(matriz[l][c]==resp){
               matriz[l][c]=0;
               printf("\t(C)");
           }else if(matriz[l][c]==0){
               printf("\t(c)");
           }
           else if(matriz[l][c]==333){
               printf("\t(P)");
           }     else printf("\t(%d)",matriz[l][c]);
                  
        }
          printf("\n\n\t(29-121) - LUGAR LIVRE    (p) - Assento preferencial   (C) - CADEIRA JA COMPRADA   (R) CADEIRA RESERVADA\n");

      //funcao que marca no lugar escolhido o valor 0 guardando o lugar 
      /*void compra(int l, int c){
        
        
        if(resp==matriz[linha][linha]){
          matriz[linha][coluna] = 0;
      }
      } */
      void cad(){
          
          ponteiroArquivo=(fopen("arquivo.txt","a")); // "a"  - cria um arquivo novo, ou modifica um ja existente.
          getchar();
          printf("\t\tSEJA BEM VINDO AO TEATRO DA UNIP!!\n\n");
          printf("Antes de comprar a cadeira vamos fazer um breve cadastro........\n\npresssione ENTER para continuar......\n\n\n");
          getch();
          printf("Digite seu nome: ");
          fgets (aux.nome, 50 ,stdin);
          getchar();
          printf("Digite seu CPF: ");  
          fgets (aux.cpf, 15 ,stdin);
          getchar();
          printf("Digite seu Email: ");
          fgets (aux.email , 30 ,stdin);
          //gravando com fprintf no arquivo
          printf("\n");
          
          fprintf(ponteiroArquivo, "\n------------------------\n");
          fprintf(ponteiroArquivo,"nome: %s\n",aux.nome);
          fprintf(ponteiroArquivo,"CPF: %s\n",aux.cpf);
          fprintf(ponteiroArquivo,"Email: %s\n",aux.email);
          fclose(ponteiroArquivo);//fecha o arquivo
      }
      void chamaSorteio(){
          int i;
          int sorteados[4];
          
          srand(time(NULL));
          
          printf("---------|SORTEIO\n\n");
          
          for(i=0;i<4;i++){
              sorteados = valor_minimo+rand()%(valor_maximo-valor_minimo);
              if(i==0){
                  edita(sorteados,i);
              }
              else {
                  sorteados = valida(sorteados,sorteados,i);
                  edita(sorteados,i);
              }
          }
          printf("------------------------------------------");
              getch();
              printf("\nParabens a todos os premiados!!\n\n");
              getch();
      }
      int valida(int num, int *ant, int cont){
          int aux;
          
          for(aux=0;aux<cont;aux++){
              while(num==*(ant+aux)){
                  num=valor_minimo+rand()%(valor_maximo-valor_minimo);
              }        
          }
          return num;
      }
      void edita (int sort,int cont){
                  
              printf("\t%d°premiado usuario da caderia : %.2d\n",cont+1,sort);        
              
      }
    • Por matheus1302
      Alguem tem um programa em C que faça isso ou me de uma luz consegui fazer do infixa para posfixa mais nao consegui o contrario.
       
    • Por manoelahech
      Boa noite pessoal, estou a mais de 3 semanas com um trabalho e está impossivel resolver. Segue a questão
      // Escreva um programa que leia 4 arquivos de numeros inteiros, calcule a média.
      //Mostre o maior quadrado que seja menor que a média de todos os números maiores que a média dos números de cada um dos arquivos.
      //Ex: Média dos números do arquivo 01 = 35
      //Números do arquivo 01 que são maiores que 35 = Ni...Nn
      //Maior quadrado entre os N números do arquivo 01 = x.
      A baixo vou colocar 2 tentativas que não saem da parte de calcular a media, como posso calcular a segunda parte??
      TENTATIVA 01
      #include <stdio.h>
      #include <stdlib.h>
      main(){

      FILE *numeros, *maior, *menor, *medio;
      int numero;
      float media;
      //abertura dos arquivos
      numeros = fopen ("numeros.txt", "r");
      maior = fopen ("maior.txt", "w" );
      medio = fopen ("medio.txt" , "w");
      menor = fopen ("menor.txt" , "w");
      //leitura dos dados e gravação do arquivo 
      while (fscanf (numeros , "%i %f" , &numero , &media)!= EOF){
      if (media >= 6)
      fprintf (maior,"%i %4.1f\n",numero,media);
      else
      fprintf (medio,"%i %4.1f\n",numero,media);

      //fechando os arquivos
      fclose (numeros);
      fclose (maior);
      fclose (medio);
      fclose (menor);
      }
      TENTATIVA 02 (ACHO QUE A MELHOR)
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <stdlib.h>
      #define TAM_MED 50  //tamanho na média
      #define M 4 //número de arquivos
      #define TRUE 1
      #define FALSE 0

      int leitura( int id, int medi){
          
          int id_num, id_num2, id_num3, id_num4;
          int med;
          
          FILE* numeros = fopen ("numeros.txt","r");
          FILE* numeros2 = fopen ("numeros2.txt", "r");
          FILE* numeros3 = fopen ("numeros3.txt", "r");
          FILE* numeros4 = fopen ("numeros4.txt", "r");
          
          
          
          if (numeros != NULL){
              while (fscanf(numeros, "%d\n", &id_num, med) != EOF){  //End of file
                  printf("%d\n", id_num, med);
              }
              
                  if (numeros != NULL){
              while (fscanf(numeros2,"%d\n", &id_num2,med) != EOF){  //End of file
                  printf("%d\n", id_num2,med);
              }
              
                      if (numeros != NULL){
              while (fscanf(numeros3,"%d\n", &id_num3,med) != EOF){  //End of file
                  printf("%d\n", id_num3,med);
              }
              
                  if (numeros != NULL){
              while (fscanf(numeros4,"%d\n", &id_num4,med) != EOF){  //End of file
                  printf("%d\n", id_num4,med);
              }
          }
         fclose (numeros);
         fclose (numeros2);
         fclose (numeros3);
         fclose (numeros4);
         
         return 0;
      }
      }
      }
      }
      int main(){
          
          int id_num, id_num2, id_num3, id_num4;
          
          printf("Digite o primeiro numero: %d");
          scanf("%d", &id_num);
          printf("Digite o segundo numero: %d");
          scanf("%d", &id_num2);
          printf("Digite o terceiro numero: %d");
          scanf("%d", &id_num3);
          printf("Digite o quarto numero: %d");
          scanf("%d", &id_num4);
          
             printf("Media: %f", (float) (id_num + id_num2+ id_num3+ id_num4)/4);
             return 0;
             
             
      }
       
×

Informação importante

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