Ir ao conteúdo
  • Cadastre-se

C identificação de um quadrado perfeito


roibomdia

Posts recomendados

Então eu estou aprendendo programação do zero e meu foi lançado um desafio pra descobrir se os numeros colocados na matrix são ou n um quadrado perfeito, porém não está dando certo kkk, sera que alguém poderia me ajudar??

 

 

#include <stdio.h>
#define TAM 4

int main(){
    
    int mat[TAM][TAM],i,j,l[TAM],c[TAM],d1[TAM],d2[TAM],k=0;
    
    for(i=0;i<TAM;i++){
        for(j=0;j<TAM;j++){
            printf("Digite o %dº valor inteiro: ",k+1);
            scanf("%d",&mat[i][j]);
            k++;
        } 
    }
    
    for(i=0;i<TAM;i++){
        l[i]=0;
        c[i]=0;
        d1[i]=0;
        d2[i]=0;
    }
    
    k=TAM-1;
    
    for(i=0;i<TAM;i++){
        for(j=0;j<TAM;j++){
          l[i]+=mat[i][j];
          c[i]+=mat[j][i];
          d1[i]+=mat[i][i];
          d2[i]+=mat[k][i];
          k--;
        }
    }
    
    if((l[0]==c[1]) && (d1[1]==d2[0]) && (d2[0]==l[1])){
        printf("\nÉ um quadrado mágico!!");
    }
    
    for(i=0;i<TAM;i++){
        for(j=0;j<TAM;j++){
            printf("\t%d,",mat[i][j]);
        } 
    }

    return 0;
}

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@roibomdia Não precisa tantos vetores. Você pode guardar as somas em um com o tamanho 2 * TAM + 1. Assim terá espaço para armazenar os totais da diagonal, linhas e colunas, p.ex,

 

const int stam = 2 * TAM + 1;
int soma[stam] = { 0 };

for (int i = 0; i < TAM; i += 1) {
    for (int j = 0; j < TAM; j += 1) {
        soma[k] += mat[i][j];
        soma[k + TAM] += mat[j][i];
    }
    soma[stam - 1] += mat[i][i];
    k += 1;
}

 

Depois é só fazer outro loop para testar se todos os elementos são iguais.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@roibomdia     o enunciado diz para descobrir se os números na matriz são um número perfeito , mas seu código está  detectando se uma Matriz é um Quadrado Mágico ,   e esse laço 

for(i=0;i<TAM;i++){
        l[i]=0;
        c[i]=0;
        d1[i]=0;
        d2[i]=0;
    }

não precisa , pode se inicializar um vetor ou matriz no momento da criação , 

int  l[TAM] = { 0 };
int  c[TAM] = { 0 }; /// TODAS AS posições COM VALOR ZERO
int d1[TAM] = { 0 };
int d2[TAM] = { 0 };

e essas comparações

if((l[0]==c[1]) && (d1[1]==d2[0]) && (d2[0]==l[1]))
{
  printf("\nÉ um quadrado mágico!!");
}

não foram o suficiente para esse objetivo  ,  pois precisa comparar com todas as linhas e todas as colunas e a diaGonal priNcipal e a diagoNal sEcundaria 

if( i && ( l[i] != l[i-1] || l[i] != c[i-1] ) )    /// bool i eh TRUE   ( != 0 ) ou FALSE  ( == 0 ) 

e seu código com modificações ficou assim  :

/*
  Uma Matriz Quadrado MAgico eh formada quando a soma de 
  todos os nUmeros de cada linha e cada coluna e da 
  diagonal principal e da diagonal secundaria sAo iguais
*/
/*
  Um NUmero eh um QuadraDo Perfeito Quando lhe extraindo a Raiz Quadrada eh exata
*/
#include <stdio.h>
#include <conio.h>
#include <math.h>
#define TAM 4
#define cls system("cls||clear");      /// Linux  e Windows
int pausar();
int main()
{
  float f = 15.48;  /// matriz com nUmeros selecionados especIficos para Quadrado MaGico
  int mat[TAM][TAM] = {20,6,7,17,9,15,14,12,13,11,10,16,8,18,19,5};
  printf("normal sQrt DE 15.48 = %5.2f\n",      sqrt(f)   );
  printf("ABS    sQrt DE 15.48 = %5.2f\n", abs( sqrt(f) ) );
  printf("Int    sQrt DE 15.48 = %5d\n\n",(int) sqrt(f)   );
  if( sqrt(f) == (int) ( sqrt(f) ) )
    printf("eh raiz exata !\n");
  else
    printf("não eh raiz exata . Aguarde . . . !\n\n");
  pausar();
  pausar();
  int sair          =  0 ;
  char ax[10] = {""};
  do
  {
    int l  [TAM]      = {0};             /// linha Horizontal
    int c  [TAM]      = {0};             /// coluna Vertical
    int dP            =  0 ;             /// DiaGonaL Pricipal
    int dS            =  0 ;             /// DiaGonaL secundAria
    int i             =  0 ;
    int j             =  0 ;
    cls
  	printf("\t\tTecle ESC para Parar . . . !\n\n");
    int flg           =  0 ;
    printf("Quer escolher os Numeros da Matriz ? ( S / N ) ");
    scanf("%s",ax);
    for(i=0; i<TAM; i++)
    {
      l[i] = 0;
      c[i] = 0;                          /// inicializa cada posiCAo desse Vetor com valor zero
      for(j=0; j<TAM; j++)
      {
        printf("Digite o %3d%c valor inteiro: %3d Enter\n",i*4+j+1,167,mat[i][j]);
        if(ax[0] == 's' || ax[0] == 'S')
          scanf("%d" , & mat [i] [j]  );          
        else
          mat[i][j] = rand() % 500  + 1; /// Gera num Aleatorios apenaS para testar , dps      use  scanf
        l[i] += mat[i][j];               /// armazena a soma de todos os numeros dessa   linha  da matriz
        c[i] += mat[j][i];               /// Acumula  a soma de todos os numeros dessa   colUna da matriz
      }
      dP += mat[i][  i];                 /// Guarda   a soma de todos os numeros da Diag Princ  da matriz
      dS += mat[i][3-i];                 /// Fixa     a soma de todos os numeros da Diag SecunD da matriz
      if( i && ( l[i] != l[i-1] || l[i] != c[i-1] ) )    /// bool i eh TRUE   ( != 0 ) ou FALSE  ( == 0 ) 
      {
        flg = 1;
      }
    }
    printf("\n");
    if( l[0] != dP || l[0] != dS )
	  flg = 1;
    for(i=0; i<TAM; i++)
    {
      for(j=0; j<TAM; j++)
      {
		printf("\t%03d ",mat[i][j]);
        if(j<TAM-1)printf(",");
      }
      printf("\n");
    }
    if( flg )
	{
	  printf("\nEssa não Eh Uma Matriz Do Tipo QuaDrado mAGgico . . . !\n");
    }
    else
    {
      printf("\nEssa Sim , Eh Uma Matriz Do Tipo QuaDrado mAGgico . . . !\n\n");
	  return 1;
	}
    sair = pausar();
    printf("\t Tecle . . . !\n");
    getch();
  }  while( sair != 27 );
  if( sair == 27 ) return 32768;
}
int pausar()
{
  int r = 0;
  for(int f=0; f<6; f++)
    for(int n=0; n<6000; n++)
      if( kbhit()) { r = getch();break; }
  return r;    
}

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!