Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda - Matriz quadrado mágico


RS25

Pergunta

Desenvolver um programa que dada uma matriz qualquer de n linhas e m colunas dizer se a mesma e um quadrado mágico.

Lembrando que em um 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 todas iguais.

E o programa não pode ser feito utilizando alocação dinâmica

Segue o que tentei fazer:

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

int main( )
{
    int linhas,colunas, i, j;
    int somaDP, somaDS, calculaSD, somaLinhas, somaColunas;
    
    //Inicialização das variáveis
    somaDP = 0;
    somaDS = 0;
    calculaSD = 0;
    somaLinhas = 0;
    somaColunas = 0;

    /*Entrar com a dminsão da matriz desejada*/
    printf("Entre com o numero de linhas: ");
    scanf("%d",&linhas);
    printf("Entre com o numero de colunas: ");
    scanf("%d",&colunas);

    /*declaração das matrizes que serão usadas no programa*/
    int mat1[linhas][colunas];
    
        /*laço de repetição para entrar com os valores da matriz 1*/
        for (i=0; i<linhas; i++)
           for(j=0; j<colunas; j++)
          {
          printf(" Entre com os elementos da matriz 1 [%d][%d]:",i+1,j+1);
          scanf("%d",&mat1[i][j]);
          }      
          
                /*laço para somar as linhas*/
                for (i=0; i<linhas; i++) 
                   for(j=0; j<colunas; j++)
                   {
                   somaLinhas = somaLinhas + mat1[i][j];
                   somaColunas += somaColunas + mat1[i][j];
                                                  
                   //condições
                   if (i==j) 
                   somaDP += mat1[i][j]; 
              
                     if(j=i-2) 
                     somaDS=+mat1[i][j]; 
                   }  
                 
                   //verifica se a soma é igual
                    if (somaDP == somaDS && somaLinhas == somaColunas) 
                    printf("E quadrado");
                     else if (somaDP!= somaDS) 
                     printf("não é quadrado"); 
             
           /*Mostra a matriz 1 criada*/
           printf("\n\nA matriz 1 criada é: \n\n");
             for (i=0; i<linhas; i++)
             {
                for(j=0; j<colunas;j++)
                printf("%3.d\t",mat1[i][j]);
                printf("\n\n");
             }

               printf("\n\n\n");
              getch();
              return 0;

}

O programa da erro de execução quando vai imprimir a matriz e não mostra se e um quadrado magico.

Alguém poderia ajudar?

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Cara, tem alguns problemas ai que eu já identifiquei...

/*laço para somar as linhas*/

for (i=0; i<linhas; i++)

for(j=0; j<colunas; j++)

{

somaLinhas = somaLinhas + mat1[j];

somaColunas += somaColunas + mat1[j];

Eu não conhecia o operando "+=", mas, pelo que eu percebi, seria isso:

"a = a + b " é igual a " a += b", certo?

se for isso, acho que ta errada a utilização do +=... !!

E... nesse caso, percebe, você ta percorrendo a matriz INTEIRA, e armazenando tanto em "somaLinhas" como em "somaColunas" o valor de todos os elementos da matriz somados! e não é isso que você tem que fazer!

Como TODAS as somas de linhas tem que ser iguais, eu sugeriria algo assim, com "magico" sendo uma variavel indicadora de passagem.

O pensamento é partir do principio que esse é, sim, um quadrado mágico, e, caso encontrarmos alguma condição que diga o contrario, podemos parar de fazer todas as contas e dizer que o quadrado não é magico!

portanto, o que eu sugeriria pro caso da "somaLinhas" (e que pra "somaColunas" seria equivalente):

magico = 1; // 1 = SIM -> estou supondo que o quadrado é magico
nmagico = 0; //nmagico vai ser o meu "numero magico". Vou supor que a primeira soma da primeira linha é o nmagico. Se for um quadrado magico, minha suposicao não estará errada!
   for(j=0; j<colunas; j++)
        {
                   nmagico = nmagico + mat1[0][j];
         }

for (i=1; i<linhas && magico==1; i++) 
   {
        somaLinhas = 0;
        for(j=0; j<colunas; j++)
        {
                   somaLinhas = somaLinhas + mat1[i][j];
         }
          if (nmagico != somaLinhas)
                 magico = 0; // Aqui, descobri que o quadrado não é magico, e mudo a variavel indicadora de passagem para 0 ( 0 = não )
   }
Daí, a partir desse ponto, você não precisa mais do primeiro for que eu fiz, pra achar o nmagico. Caso todas as "somaLinha" sejam iguais a "nmagico", você passa pras colunas, faz a soma dos elementos das colunas, no final de cada soma compara com "nmagico", e não se esqueça de zerar "somaColunas" antes de iniciar cada soma! Depois disso, soma a diagonal principal, e... bom, pra diagonal secundaria temos um probleminha! Pra começar, e voltando um pouco, se estamos falando de quadrados, não precisamos de uma variavel "linhas" e outra "colunas", uma vez que esse numero é igual! portanto, apenas pegar um "n" para o quadrado, e usar esse numero como o numero maximo de linhas e de colunas já é o suficiente! Dai, é só percorrer a matriz toda e perguntar
if (i==j) 
                   somaDP += mat1[i][j]; 
              
                     if(j=i-2) 
                     somaDS=+mat1[i][j];
Então, essa segunda condicao ta errada, não? a conficao certa seria
if (j + i= n) // ou if (j = n-i)

Não sei de onde você tirou esse "j = i-2", mas enfim, o certo seria isso daí que eu postei!

E, de resto, voce pode colocar, como adendo, em todas as condições analisadas, um " && magico ==1", pois caso voce ache, em algum ponto do programa, que não é um quadrado mágico, então todas as comparações e contas podem ser deixadas de lado, e na hora de imprimir se é um quadrado magico ou não, basta perguntar "if (magico ==1)"

Editado por Felipe Amadio
Link para o comentário
Compartilhar em outros sites

  • 0

Fiz algumas modificações

mas agora o erro e de lopping infinito

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

int main( )
{
    int linhas,colunas, i, j;
    int somaDP, somaDS, calculaSD, somaLinhas, somaColunas;
    
    //Inicialização das variáveis
    somaDP = 0;
    somaDS = 0;
    calculaSD = 0;
    somaLinhas = 0;
    somaColunas = 0;
    int somainicial=0;
    int somainicial1 = 0;
    int somainicial2 = 0;
    int somainicial3 = 0;
    int somainicial4 = 0;
    int somainicial5 = 0;
    int verdadeiro=1;

    
    /*Entrar com a dminsão da matriz desejada*/
    printf("Entre com o numero de linhas: ");
    scanf("%d",&linhas);
    printf("Entre com o numero de colunas: ");
    scanf("%d",&colunas);

    /*declaração das matrizes que serão usadas no programa*/
    int mat1[linhas][colunas];
    
        /*laço de repetição para entrar com os valores da matriz 1*/
        for (i=0; i<linhas; i++)
           for(j=0; j<colunas; j++)
          {
          printf(" Entre com os elementos da matriz 1 [%d][%d]:",i+1,j+1);
          scanf("%d",&mat1[i][j]);
          }      
          
            
                 for (i=0; i<linhas; i++) {
                    for(j=0; j<colunas; j++)
                    {
                        
                        //somando a diagonal principal
                        if (i==j)
                        somaDP +=mat1[i][j];
                        printf("\nsoma da diagonal principal %d\n\n",somaDP);
                        
                        //somando a diagonal principal
                        if(j=i-2) 
                        somaDS=+mat1[i][j]; 
                        printf("\nsoma da diagonal secundaria %d\n\n",somaDS);
                    
                    }      
                 }          
                
               //somando a 1 coluna  
               for (i=0; i<colunas; i++)
               somainicial +=mat1[i][0];
               printf("\nsoma da coluna 1 %d\n\n",somainicial);
               
               //somando a 2 coluna 
               for (i=0; i<colunas; i++)
               somainicial1 +=mat1[i][1];
               printf("\nsoma da coluna 2 %d\n\n",somainicial1);
                  
               //somando a 3 coluna
               for (i=0; i<colunas; i++)
               somainicial2 +=mat1[i][2];
               printf("\nsoma da coluna 3 %d\n\n",somainicial2);
               
               //somando a 1 linha  
               for (i=0; i<linhas; i++)
               somainicial3 +=mat1[0][j];
               printf("\nsoma da linha 1 %d\n\n",somainicial3);
               
               //somando a 2 linha 
               for (i=0; i<linhas; i++)
               somainicial4 +=mat1[1][j];
               printf("\nsoma da linha 2 %d\n\n",somainicial4);
                  
               //somando a 3 linha
               for (i=0; i<linhas; i++)
               somainicial5 +=mat1[2][j];
               printf("\nsoma da linha 3 %d\n\n",somainicial5);
               
                //testando as colunas
                for (i=0; i<linhas; i++){
                somaColunas=0; 
                   for(j=0; j<colunas; j++)
                   {
                   somaColunas+= mat1[i][j];
                   }  
                   
                 if(somaColunas!=somainicial)
                  verdadeiro=0;
                 }
                 
                 
           /*Mostra a matriz 1 criada*/
           if(verdadeiro==1)
           printf("\n\nA matriz 1 criada é: quadrado magico \n\n");
           else
           printf("\n\nA matriz 1 criada não é: quadrado magico \n\n");
           
           
           
             for (i=0; i<linhas; i++)
             {
                for(j=0; j<colunas;j++)
                printf("%3.d\t",mat1[i][j]);
                printf("\n\n");
             }

               printf("\n\n\n");
              getch();
              return 0;

}
Cara, tem alguns problemas ai que eu já identifiquei...
/*laço para somar as linhas*/ for (i=0; i<linhas; i++) for(j=0; j<colunas; j++) { somaLinhas = somaLinhas + mat1[j]; somaColunas += somaColunas + mat1[j];
Eu não conhecia o operando "+=", mas, pelo que eu percebi, seria isso: "a = a + b " é igual a " a += b", certo? se for isso, acho que ta errada a utilização do +=... !! E... nesse caso, percebe, você ta percorrendo a matriz INTEIRA, e armazenando tanto em "somaLinhas" como em "somaColunas" o valor de todos os elementos da matriz somados! e não é isso que você tem que fazer! Como TODAS as somas de linhas tem que ser iguais, eu sugeriria algo assim, com "magico" sendo uma variavel indicadora de passagem. O pensamento é partir do principio que esse é, sim, um quadrado mágico, e, caso encontrarmos alguma condição que diga o contrario, podemos parar de fazer todas as contas e dizer que o quadrado não é magico! portanto, o que eu sugeriria pro caso da "somaLinhas" (e que pra "somaColunas" seria equivalente):
magico = 1; // 1 = SIM -> estou supondo que o quadrado é magico
nmagico = 0; //nmagico vai ser o meu "numero magico". Vou supor que a primeira soma da primeira linha é o nmagico. Se for um quadrado magico, minha suposicao não estará errada!
   for(j=0; j<colunas; j++)
        {
                   nmagico = nmagico + mat1[0][j];
         }

for (i=1; i<linhas && magico==1; i++) 
   {
        somaLinhas = 0;
        for(j=0; j<colunas; j++)
        {
                   somaLinhas = somaLinhas + mat1[i][j];
         }
          if (nmagico != somaLinhas)
                 magico = 0; // Aqui, descobri que o quadrado não é magico, e mudo a variavel indicadora de passagem para 0 ( 0 = não )
   }
Daí, a partir desse ponto, você não precisa mais do primeiro for que eu fiz, pra achar o nmagico. Caso todas as "somaLinha" sejam iguais a "nmagico", você passa pras colunas, faz a soma dos elementos das colunas, no final de cada soma compara com "nmagico", e não se esqueça de zerar "somaColunas" antes de iniciar cada soma! Depois disso, soma a diagonal principal, e... bom, pra diagonal secundaria temos um probleminha! Pra começar, e voltando um pouco, se estamos falando de quadrados, não precisamos de uma variavel "linhas" e outra "colunas", uma vez que esse numero é igual! portanto, apenas pegar um "n" para o quadrado, e usar esse numero como o numero maximo de linhas e de colunas já é o suficiente! Dai, é só percorrer a matriz toda e perguntar
if (i==j) 
                   somaDP += mat1[i][j]; 
              
                     if(j=i-2) 
                     somaDS=+mat1[i][j];
Então, essa segunda condicao ta errada, não? a conficao certa seria
if (j + i= n) // ou if (j = n-i)

Não sei de onde você tirou esse "j = i-2", mas enfim, o certo seria isso daí que eu postei!

E, de resto, voce pode colocar, como adendo, em todas as condições analisadas, um " && magico ==1", pois caso voce ache, em algum ponto do programa, que não é um quadrado mágico, então todas as comparações e contas podem ser deixadas de lado, e na hora de imprimir se é um quadrado magico ou não, basta perguntar "if (magico ==1)"

Link para o comentário
Compartilhar em outros sites

  • 0

Cara, você não pode fazer isso que voce fez!

De fazer a soma das 3 primeiras linhas e das 3 primeiras colunas!

Pois se a matriz tiver 2 linhas, então você está usando elementos não definidos nessa matriz! simplesmente use para "somaInicial" o valor da primeira linha, e isso já basta! as outras somas, de fato, nem estão sendo usadas no seu programa, então sugiro que você não as realize! tire todos esses for que fazem as somas dessas somainicial1, 2, 3, 4, 5! deixe só o primeiro, da "somainicial".

Depois, voce não está analisando o caso das linhas! você somente verifica se todas as colunas estão consistentes! E voce, apesar de realizar a soma da diagonal principal e da secundaria, voce não está comparando esses valores com somaInicial!

Quanto ao loop infinito, não sei dizer aonde ele ocorre! como seu programa possui poucos "for's", sugiro que voce espalhe alguns system("pause") pelo seu programa, um em cada for, pelo menos, a antes de cada system("pause") coloque um printf para o programa exibir as variaveis do critério de parada do loop! só pra entender por que não está parando...

Link para o comentário
Compartilhar em outros sites

  • 0

Então cara, achei aqui nos meus arquivos antigos da faculdade, mas não sei se está completa essa versão que vou mandar aqui. De qualquer forma, pode ajudar bastante =) Ela funciona só para matrizes quadradas (obviamente).

/*******************************************/
/* Fabricio Carraro Magalhaes                  */
/* 03/10/06                                            */
/*                                                       */
/* Lab 8:                                           */
/*     Utilizacao de funcoes e matrizes     */
/*     Programa que determina se uma         */
/*     matriz quadrada dada é ou não       */
/*     um quadrado magico.                  */
/********************************************/

#include <stdio.h> /*Biblioteca*/
#include <stdlib.h> 

/*Funcao que faz a leitura da dimensao e dos elementos de uma matriz*/
void leitura(int *n, int matriz[100][100]){
     int i, j; /*Declaracao de variaveis*/
     
     printf("Digite a dimensao da matriz quadrada: ");
     scanf("%d", n); /*Leitura da dimensao*/
     
     printf("Digite os elementos da matriz:\n");
     for(i = 0; i < *n; i++){
           for(j = 0; j < *n; j++)
                 scanf("%d", &matriz[i][j]); /*Leitura dos elementos*/
     }
}


/*Funcao que calcula a soma da diagonal principal de uma matriz*/
int diagonalprincipal(int n, int matriz[100][100]){
     int i, somapri = 0; /*Declaracao de variaveis*/
     
     for(i = 0; i < n; i++)
           somapri += matriz[i][i]; /*Soma da diagonal principal*/
           
     return somapri; /*Retorna o valor encontrado*/
}


/*Funcao que calcula a soma da diagonal secundaria de uma matriz*/
int diagonalsecundaria(int n, int matriz[100][100]){
     int i, j, somasec = 0; /*Declaracao de variaveis*/
     
     for(i = 0; i < n; i++){
           for(j = n; j > 1; j--)
                 somasec += matriz[i][j]; /*Soma da diagonal secundaria*/
     }
     return somasec; /*Retorna o valor encontrado*/
}


/*Funcao que calcula e compara soma da diagonal de uma matriz com...*/
/*...a soma de cada uma de suas linhas, e retorna "1"(um) se for igual*/
int linha(int n, int matriz[100][100], int somadiag){
     int i, j = 0, somalin; /*Declaracao de variaveis*/
     
     while (j < n){
           somalin = 0;
           for(i = 0; i < n; i++)
                 somalin += matriz[i][j]; /*Soma das linhas*/
                 
           if(somalin == somadiag)
                 j++;
           else return -1; /*Retorna "-1" se não for igual*/
     }
     return 1; /*Retorna "1"(um) se for igual*/
}


/*Funcao que calcula e compara soma da diagonal de uma matriz com...*/
/*...a soma de cada uma de suas colunas, e retorna "1"(um) se for igual*/
int coluna(int n, int matriz[100][100], int somadiag){
     int i = 0, j, somacol; /*Declaracao de variaveis*/
     
     while (i < n){
           somacol = 0;
           for(j = 0; j < n; j++)
                 somacol += matriz[i][j]; /*Soma das colunas*/
                 
           if(somacol == somadiag)
                 i++;
           else return -1; /*Retorna "-1" se não for igual*/
     }
     return 1; /*Retorna "1"(um) se for igual*/
}



int main(){
    int matriz[100][100], n, somadiag; /*Declaracao de variaveis*/
    
    leitura(&n, matriz); /*Chama a funcao que le a matriz*/
    somadiag = diagonalprincipal(n, matriz);
    if(somadiag == diagonalsecundaria(n, matriz)){
                if(linha(n, matriz, somadiag) == 1){ /*Se for "1", ou seja, igual*/
                            if(coluna(n, matriz, somadiag) == 1) /*Se for "1"*/
                                         printf("é magico!\n");
                            else printf("não é magico!\n");
                }
                else printf("não é magico!\n");
    }
    else printf("não é magico!\n");
    
    system("pause");
    return 0;
}

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...