Ir ao conteúdo
  • Cadastre-se
Daniel De Marco Fucci

C Verificação de quadrado perfeito em Matriz

Recommended Posts

Boa tarde colegas programadores,

Estou resolvendo um exercício de matriz , o programa deve verificar se a matriz é ou não um quadrado perfeito mágico, segue o enunciado:

 

"Dizemos que uma matriz quadrada inteira é 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.
Dada uma matriz qudrada A (n) (n), verificar se A é um quadrado mágico."


O meu código já está praticamente pronto, mas o programa sempre acusa que a matriz NÃO é quadrada, mesmo quando ela é. Segue o código:

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


int main () {
    int  i, j,lin,col;
    printf ("Digite as dimensoes da matriz:\n");
    scanf ("%d %d", &lin, &col);
    int matriz[lin][col], somalin[col], somacol[lin],somadiag1=0, somadiag2=0, aux=0;
    printf ("Digite os elementos: \n");
    for (i=0; i<lin; i++){
        for (j=0; j<col; j++){
            scanf ("%d", &matriz[j]);
        }
    }

    for (i=0; i<lin; i++) {
        for (j=0; j<col; j++){
            aux += matriz [j];

        }
        somalin = aux;
        aux = 0;
    }
    for (i=0; i<col; i++) {
        for (j=0; j<lin; j++){
            aux += matriz [j];

        }
        somacol = aux;
        aux = 0;
    }
    for (i=0; i<lin; i++) {

        aux += matriz ;


        somadiag1 += aux;
        aux = 0;
    }
    j = 0;
    for (i=col - 1; i<=0; i--) {

        aux += matriz [j];


        somadiag2 += aux;
        aux = 0;
        j++;
    }
    if (somadiag1 != somadiag2){
        printf ("Nao eh quadrado magico!\n");
        return 0;
    }
    for (i=0; i<lin; i++){
        if (somalin =! somacol){
            printf ("Nao eh quadrado magico!\n");
            return 0;
        }
    }
    if (somalin[0] != somadiag1){
        printf ("Nao eh quadrado magico!\n");
        return 0;
    }
    printf ("A matriz é um quadrado magico!\n");

    system ("PAUSE");
    return 0;


} 

 

 

Estou verificando etapa por etapa mas ainda não encontrei o erro. Alguém consegue entender o porquê de não estar funcionando corretamente? 
Desde já agradeço a disposição, abraços
 

 

adicionado 6 minutos depois

Pessoal, na verdade se trata de QUADRADO MÁGICO e não "perfeito".

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Testou se as somas estão corretas, fez isso de maneira individual? Poste o código usando o code tag <> para melhor visualização.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <stdlib.h>
#include <stdio.h>


int main () {
    int  i, j,lin,col;
   
    printf ("Digite as dimensoes da matriz:\n");
    scanf ("%d %d", &lin, &col);
   
    int matriz[lin][col], somalin[col], somacol[lin],somadiag1=0, somadiag2=0, aux=0;
   
    printf ("Digite os elementos: \n");
   
   //leiura dos elementos
    for (i=0; i<lin; i++){
        for (j=0; j<col; j++){
            scanf ("%d", &matriz[i][j]);
        }
    }

	//somatorio de cada linha
    for (i=0; i<lin; i++) {
        for (j=0; j<col; j++){
            aux += matriz [i][j];

        }
        somalin[i] = aux;
        aux = 0;
    }
    
    //somatorio de cada coluna
    for (i=0; i<col; i++) {
        for (j=0; j<lin; j++){
            aux += matriz [i][j];

        }
        somacol[i] = aux;
        aux = 0;
    }
    
    //somatorio diagonal principal ( linha == coluna ou i == j)
    for (i=0; i<lin; i++) {
		for(j = 0; j < col; j++){
			if(i == j){
				aux += matriz[i][j];
			}
		}
    }
    somadiag1 = aux;
    aux = 0;
    
    //somatorio diagonal secundaria (inferior esquerda para superior direita)
    for (i = 0, j = col - 1; i < lin; ++i, --j) {
        aux += matriz[i][j];
 
    }
    somadiag2 = aux;
    
    
    //comparação dos valores das diagonal principal e secundaria
    if (somadiag1 != somadiag2){
        printf ("Nao eh quadrado magico!\n");
        return 0;
    }
    
    //comparação do somatório de cada linha com o somatório de cada coluna
    for (i=0; i<lin; i++){
        for(j = 0; j<col; j++){
        	if (somalin[i] =! somacol[j]){
            	printf ("Nao eh quadrado magico!\n");
            	return 0;
			}
    	}
    }
    
    //comparação do somatório de uma linha/coluna qualquer com o de uma diagonal qualquer
    if (somalin[0] != somadiag1){
        printf ("Nao eh quadrado magico!\n");
        return 0;
    }
    printf ("A matriz é um quadrado magico!\n");

    system ("PAUSE");
    return 0;
} 

Teste agora. Fiz um teste aqui com a matriz deste link (https://pt.wikipedia.org/wiki/Quadrado_mágico) e funcionou! 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu fiz o teste aqui porque gostei desse exercício.

:eek: Desculpa dizer mais não funcionou.

 

Poderias compilar e postar @Olinad212 ?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
12 minutos atrás, Daniel De Marco Fucci disse:

Pessoal, achei o erro. Era um sinal ">" onde deveria ser "<" em uma das estruturas de teste no final.

Obrigado a todos pelas respostas!
 

Poderia postar o código corrigido? Estou modificando esta versão postada, e aí o tópico fica com as versões corretas! :D

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, Daniel De Marco Fucci disse:

Pessoal, achei o erro. Era um sinal ">" onde deveria ser "<" em uma das estruturas de teste no final.

Obrigado a todos pelas respostas!

A que bom! Você mesmo resolveu!

 

51 minutos atrás, Olinad212 disse:

Poderia postar o código corrigido? Estou modificando esta versão postada, e aí o tópico fica com as versões corretas! :D

Sim! Concordo

 

Eu não me aguentei de ansiedade e resolvi implementar uma versão

quadmagico2.c

/*  Programa: quadmagico2.c
    Escrito por: Mauro Britivaldo
    Data da Criação: 23-02-18

    Propósito: Dizemos que uma matriz quadrada inteira é 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.
    Dada uma matriz qudrada A (n) (n), verificar se A é um quadrado mágico.*/

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

  
// Protótipos de Funções
// Protótipo de Função que escanear vetor bidimensional e soma seus elementos.
int quadrado_magico (int l/*linhas*/,int c/*Colunas*/, int[l][c]/*Matriz*/);


int main (void) {
    int l,c;

    scanf("%d %d",&l,&c);
    int QUADRADO[l][c], i, j;

    i= -1;
    while (l > ++i) {
        j= -1;
        while (c > ++j) scanf(" %d",QUADRADO[i]+j);
        }

    printf("%ceh MAGICO.\n", quadrado_magico(l, c, QUADRADO)? '\b':'~');
    return 0;
    }

// Função que retorna 1-verdadeiro ou 0-falso para quadrado mágico.
int quadrado_magico (int l, int c, int q[l][c]) {
    int i, j, slinhas,scolunas,sdigprincipal,sdigsegundaria;


    sdigprincipal = sdigsegundaria = 0;
    i = -1;
    while (l > ++i) {
        slinhas = scolunas = 0;
        j = -1;
        while (c > ++j) {
            // Diagonal principal.
            if (i == j) sdigprincipal = q[i][j] + sdigprincipal;

            // Diagonal segundaria
            if ((i+j) == (l-1)) sdigsegundaria = q[i][j] + sdigsegundaria;

            // Linhas
            slinhas =  q[i][j] + slinhas;

            // Colunas
            scolunas=  q[j][i] + scolunas;
            }
      	if (scolunas != slinhas) return 0;
        }
    return(sdigprincipal == sdigsegundaria);
    }

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Daniel De Marco Fucci       essa matriz  para ser um quadrado mágico precisa  ter o mesmo número de colunas e linhas senão não será um quadrado mágico,  então  no primeiro scanf que pega o tamanho da matriz, só precisa pegar um valor e esse valor será  o número de linhas e também o número de colunas, por isso que é um quadrado, pois se tiver o número de linhas diferente do número de colunas então não é um quadrado, podendo ser então um retângulo  .  

       então fiz algumas modificações no seu código e ele ficou assim :

#include <stdlib.h>
#include <stdio.h>
#include <locale.h>
int main()
{
    int i,j,lin;
    setlocale(LC_ALL,"");
    printf("Digite as dimensoes da matriz: ");
    scanf("%d",&lin);
    int matriz[lin][lin],somalin[lin],somacol[lin],somadiag1=0,somadiag2=0;
    printf ("       Digite os elementos: \n");
    for(i=0;i<lin;i++)
    {
        somalin[i]=0;
        for(j=0;j<lin;j++)
        {
            if(i==0)somacol[j]=0;
            printf ("Digite o %dº elemento da %dº Linha: ",j+1,i+1);
            scanf("%d",&matriz[i][j]);
            somalin[i] += matriz[i][j];/* somatorio das linhas */
            if(i==j)somadiag1 += matriz[i][j];/* somatorio da diagonal principal */
        }
        printf("\n");
    }
    for(i=0;i<lin;i++)/* somatorio das colunas */
        for(j=0;j<lin;j++)
            somacol[i] += matriz[j][i];

    for(i=0;i<lin;i++)
    {
        for(j=0;j<lin;j++)
            printf("%d ",matriz[i][j]);

        printf(" %d\n",somalin[i]);;
    }
    printf("\n");
    for(i=0;i<lin;i++)
        printf("%d ",somacol[i]);

    printf("\n\n");
    j=lin-1;
    somadiag2=0;
    for (i=0;i<lin;i++) /* somatorio diagonal secundária */
    {
        somadiag2 += matriz[i][j];
        j--;
    }
    if (somadiag1 != somadiag2)
    {
        printf ("Nao eh quadrado magico!\n\n");
        return 0;
    }
    for(i=0;i<lin;i++)
    {
        if((somalin[i] != somalin[0])||(somacol[i] !=somalin[0])||
           (somadiag1!=somalin[i])||(somadiag2!=somalin[i]))
        {
            printf ("Nao eh quadrado magico!\n");
            return 0;
        }
    }
    printf ("A matriz é um quadrado magico!\n\n");
    system ("PAUSE");
    return 0;
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @Daniel De Marco Fucci. Seja bem vindo ao Fórum do Clube do Hardware.

 

Por favor, poste seu código atual para analisarmos e também poder servir de base para outro usuários.

 

 

 

 

ADENDO:

Observação inicial, por favor, poste seu código atual, independente do que levantarei abaixo. ;)

 

Em 23/02/2018 às 13:25, Daniel De Marco Fucci disse:

"Dizemos que uma matriz quadrada inteira é 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.
Dada uma matriz qudrada A (n) (n), verificar se A é um quadrado mágico."

Creio eu que a explicação do enunciado está errada... ou pelo menos está incompleta... veja, para ser um "quadrado mágico" não basta "a soma dos elementos de cada linha, coluna e diagonais principal e secundária iguais". Faltou um grande detalhe: Os números não podem ser repetidos. Pesquise sobre "quadros mágicos" em qualquer lugar, e verás que todos* são assim... a maioria das pessoas nem se tocam em citar (na verdade não vi ninguém citando, tive que procurar um pouco mais para achar a citação abaixo) que não pode ser repetido, rs. (acredito eu, que em algum lugar alguém não citou, e o restante "apenas" copiou... só pode).

 

 

Nesse sentido, uma melhor definição seria essa:

Citação

Imaginemos um quadrado dividido em um certo número de pequenos quadrados iguais, que chamaremos de “casas”. Colocando em cada casa um número inteiro, sem repetição, de modo a obtermos a mesma soma, seja adicionando horizontalmente por “linhas”, seja verticalmente por “colunas”, ou seja, ainda obliquamente por “diagonais”, formamos o que se denomina “quadrado mágico”. Esta soma chama-se de “constante” do quadrado. “Módulo”, ou usualmente “base”, ou ainda “ordem”, de um quadrado mágico é o numero de casas de seu lado (número de linhas ou de colunas).
 

Fonte: https://pt.scribd.com/doc/201233483/QUADRADO-MAGICO

 

Vejam, sem essa característica, todo e qualquer quadrado com número iguais seriam mágicos. Ex.:

7  7  7  7
7  7  7  7
7  7  7  7
7  7  7  7

O que tem de mágico nisso??? :tw_cry:

 

Uma excelente explicação, um pouco mais completa e inclusive com vídeo, achei aqui:

http://www.profcardy.com/cardicas/quadrado-magico.php

 

 

obs.: veja que no texto também não reforça que não pode ser repetido, mas todo o contexto levaria também a essa conclusão.

 

 

RESUMINDO:

Se levar em consideração apenas a definição do enunciado está no caminho certo, caso seja na (provável) definição "real", precisaria desenvolver um pouco mais. É relativamente simples, mas que faz muita diferença.

  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, esse exercício vale nota para mim, meu professor usa um método de vasculhar o código do aluno na internet para identificar cópias, se eu postar o código aqui no site, será que ao fazer a busca ele vai apontar que é cópia? Se não for o caso eu posto aqui como ficou o resultado final, eu enxuguei bastante ele e fiz algumas modificações, mas se for o caso, vou precisar excluir o tópico! Obrigado pela compreensão

  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

É fácil, espera ele dar a nota e depois você coloca ele >_<. E ainda tem mais... você não precisa por ele como testo, comprime ele e sobe ele em um rar. >_< Duvido muito que seu professor seja tão inteligente como para encontrar ele dentro de um rar :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @Daniel De Marco Fucci.

 

10 horas atrás, Daniel De Marco Fucci disse:

se eu postar o código aqui no site, será que ao fazer a busca ele vai apontar que é cópia?

Nesse sentido não... pois você estaria "copiando" de você mesmo, logo, não sendo uma cópia... talvez o problema esteja em terceiros copiarem, ai depende da "filosofia" do professor. Alguns ameaçam que se 2 ou mais forem iguais, todos tomam zero (ou é descontado x pontos).

 

Então, se código é seu, você que desenvolveu, e sabe explicar como funciona e como chegou as determinadas conclusões no algoritmo, eu particularmente não vejo problema algum em usar um fórum. Por sinal, poderia citar interagiu com um para professor e verificar o que ele acha.

 

Outra coisa: não se engane... o professor costumar saber (para não dizer "sempre sabe") se o aluno copiou ou não. Entendo que a a questão não é "ser pego ou não", mas sim "ter copiado de fato ou não".

 

 

RESUMINDO:

Por mim poderia postar o código normalmente, mas vai de você.

 

Se entender que não tem problemas, posta o código. Ai os colaboradores revisam e tentam te passar novas dicas ou sugestões de correções.

 

 

PS: sobre o que citei:

19 horas atrás, Simon Viegas disse:

Os números não podem ser repetidos.

Sugiro que tenha dois programas:

- Um sem essa verificação, já que a explicação do enunciado não fala sobre isso;

- Outro, que seria basicamente uma copia do primeiro, com uma alteração para verificar se existe algum número repetido. Se tiver repetido, NÃO SERÁ quadrado mágico. (vide explicação no meu comentário anterior)

 

 

No aguardo.

 

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde a todos!

Na próxima aula vou falar com o professor e explicar que postei aqui o código para discutir soluções, segue o código enxugado e aprimorado:

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


int main () {
    int  i, j,lin,col, retorno;
    //do while garante que a matriz seja quadrada
    do {
        printf ("Digite as dimensoes da matriz:\n");
        scanf ("%d %d", &lin, &col);
    }while (lin != col);
    int matriz[lin][col], somalin[col], somacol[lin],somadiag1=0, somadiag2=0;
    //zerando vetores
    for (i=0; i<lin; i++){
        somalin[i] = 0;
        somacol[i] = 0;
    }
    printf ("Digite os elementos: \n");
    //lendo por linhas os elementos da matriz
    for (i=0; i<lin; i++){
        for (j=0; j<col; j++){
            scanf ("%d", &matriz[i][j]);
        }
    }
    //somando linhas
    for (i=0; i<lin; i++) {
        for (j=0; j<col; j++){
            somalin[i] += matriz[i][j];

        }

    }
    //somando colunas
    for (i=0; i<col; i++) {
        for (j=0; j<lin; j++){
            somacol[i] += matriz[j][i];

        }
    }
    //somando diagonal principal
    for (i=0; i<lin; i++) {

        somadiag1 += matriz[i][i];

    }
    //somando diagonal secundaria
    for (i=0; i<lin; i++) {
        for(j=0;j<lin;j++){

            if(j==(lin-1)-i){
                somadiag2 += matriz[i][j];
            }

        }

    }
    //testando se eh quadrado magico
    retorno = 1;
    if (somadiag1 != somadiag2){
        retorno = 0;
    }
    for (i=0; i<lin; i++){
        if (somalin[i] != somacol[i]){
            retorno = 0;
        }

    }
    for (i=0; i<lin-1; i++){
        if (somalin[i] != somalin[i+1] || somacol[i] != somacol[i+1]){
            retorno = 0;
        }
    }
    if (somalin[0] != somadiag1){
        retorno = 0;
    }
    if (retorno == 0){
        printf ("Nao eh quadrado magico!\n");
    }
    else {
        printf ("Eh quadrado magico!\n");
    }

    system ("PAUSE");
    return 0;






}

 

  • Curtir 1

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





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×