Ir ao conteúdo
  • Cadastre-se

C Verificação de quadrado perfeito em Matriz


Posts recomendados

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
Link para o comentário
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
Link para o comentário
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
Link para o comentário
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
Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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
Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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.

 

 

 

 

 

  • Curtir 1
Link para o comentário
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 2
Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...

Ola boa noite , passou bastante tempo desde que resolveram essa questão , mas para mim tem a mesma questão e tentei fazer sozinho não consegui , copiei esse ultimo código do Daniel só que ta dando bastante erro, dizendo que as expressões precisam de um valor constante não sei como resolver, estou usando Visual Studio 2019 , alguém ai ?

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

11 horas atrás, Bruno Ritter disse:

copiei esse ultimo código do Daniel só que ta dando bastante erro, dizendo que as expressões precisam de um valor constante não sei como resolver, estou usando Visual Studio 2019

 

O compilador provavelmente reclamou desta linha:

    int matriz[lin][col], somalin[col], somacol[lin],somadiag1=0, somadiag2=0;

Pois usa matriz/vetores de comprimento variável, ou seja, os comprimentos das dimensões da matriz/vetor são definidos por variáveis, ao invés de serem valores fixos.

 

O compilador MSVC do Visual Studio só tem conformidade com a versão C89/C90 (de 1989/1990) da linguagem C, e não conforma as versões mais recentes da linguagem, entretanto vetores de comprimento variável foram adicionados na versão C99 da linguagem C. (O C++ foi criado baseando-se na versão C89/C90 da linguagem C, e não possui vetores de comprimento variável, existem outros recursos próprios do C++ para fazer algo similar.)

 

A Microsoft não tem interesse em implementar as versões mais recentes da linguagem C, pois o interesse deles para o Visual Studio é o C++ (a parte do compilador C basicamente está lá mais para disponibilizar os recursos do C que também fazem parte do C++).

 

Então você tem algumas opções... Você poderia por exemplo colocar valores fixos nas dimensões dessa matriz e vetores para conseguir compilar no MSVC, desde que sejam grandes o suficiente o programa funcionará corretamente. Ou então, precisará usar outro compilador que tenha conformidade com versões mais recentes da linguagem como o MinGW/GCC ou Clang, que é a única opção se quiser programar usando recursos atuais da linguagem C.

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

13 minutos atrás, vangodp disse:

tecnicamente se você passar uma constante não vai gritar.

Uma constante, porém uma constante + uma variável ainda é VLA, eu penso que sim.

adicionado 2 minutos depois
1 minuto atrás, vangodp disse:

prova isso em c++

Já vi que essa conversa não vai chegar a lugar nenhum.

Link para o comentário
Compartilhar em outros sites

então tá né

adicionado 39 minutos depois
39 minutos atrás, AnsiC disse:

Já vi que essa conversa não vai chegar a lugar nenhum. 

  1. Não sei o por que aceita ou não(E sinceramente nem me importa.), só sei que onde n aceitar, essa é uma forma de saltar a restrição, não fique irritado se a gambiarra não funcionar, mas não despreze o comentário dos outros sem verificar, porque ao final o ignorante vai continuar sendo você. Só sei que isso ja me salvou em mais de uma ocasião.
adicionado 45 minutos depois

Já provei com mingw -w64 e funciona sem fazer gambiarras, mas antes sim tive esse problema. Sinceramente não vou correr a ler a documentação para resolver esse problema, simplesmente trata-se de um recurso. E eu também n uso o compilador por default que vem no codeblocks, como falei uso o mingw -w64, e n sei se isso tem algo a ver, simplesmente passo do problema, porque para mim é bem melhor usar malloc e tudo certo.
Mas me faça um favor. Se um dia lhe for útil o truque me convide a uma taça de café shuesuehsuhe

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!