[C] Verificação de quadrado perfeito em Matriz - C/C#/C++ - Clube do Hardware
Por Daniel De Marco Fucci, 23 de fevereiro em C/C#/C++
Daniel De Marco Fucci 7
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:
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++){
scanf ("%d", &matriz[j]);
for (i=0; i<lin; i++) {
aux += matriz [j];
somalin = aux;
for (j=0; j<lin; j++){
somacol = aux;
aux += matriz ;
somadiag1 += aux;
for (i=col - 1; i<=0; i--) {
somadiag2 += aux;
if (somadiag1 != somadiag2){
printf ("Nao eh quadrado magico!\n");
if (somalin =! somacol){
if (somalin[0] != somadiag1){
printf ("A matriz é um quadrado magico!\n");
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
Pessoal, na verdade se trata de QUADRADO MÁGICO e não "perfeito".
Testou se as somas estão corretas, fez isso de maneira individual? Poste o código usando o code tag <> para melhor visualização.
Vou me basear no seu código para fazer um também em C e verificarmos o seu erro. Atualizo já aqui.
//leiura dos elementos
aux += matriz [i][j];
somalin[i] = aux;
//somatorio de cada coluna
somacol[i] = aux;
//somatorio diagonal principal ( linha == coluna ou i == j)
aux += matriz[i][j];
somadiag1 = aux;
//somatorio diagonal secundaria (inferior esquerda para superior direita)
for (i = 0, j = col - 1; i < lin; ++i, --j) {
somadiag2 = aux;
//comparação dos valores das diagonal principal e secundaria
//comparação do somatório de cada linha com o somatório de cada coluna
for(j = 0; j<col; j++){
if (somalin[i] =! somacol[j]){
//comparação do somatório de uma linha/coluna qualquer com o de uma diagonal qualquer
Teste agora. Fiz um teste aqui com a matriz deste link (https://pt.wikipedia.org/wiki/Quadrado_mágico) e funcionou!
Eu fiz o teste aqui porque gostei desse exercício.
Desculpa dizer mais não funcionou.
Poderias compilar e postar @Olinad212 ?
Um momento que vou atualizar aqui! Vou te ajudar!!
Daniel De Marco Fucci
Pessoal, achei o erro. Era um sinal ">" onde deveria ser "<" em uma das estruturas de teste no final.
12 minutos atrás, Daniel De Marco Fucci disse:
Poderia postar o código corrigido? Estou modificando esta versão postada, e aí o tópico fica com as versões corretas!
1 hora atrás, Daniel De Marco Fucci disse:
A que bom! Você mesmo resolveu!
51 minutos atrás, Olinad212 disse:
Eu não me aguentei de ansiedade e resolvi implementar uma versão
quadmagico2.c
/*  Programa: quadmagico2.c
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.*/
// 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 QUADRADO[l][c], i, j;
while (l > ++i) {
while (c > ++j) scanf(" %d",QUADRADO[i]+j);
printf("%ceh MAGICO.\n", quadrado_magico(l, c, QUADRADO)? '\b':'~');
// 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;
slinhas = scolunas = 0;
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;
slinhas =  q[i][j] + slinhas;
scolunas=  q[j][i] + scolunas;
if (scolunas != slinhas) return 0;
return(sdigprincipal == sdigsegundaria);
@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 :
int i,j,lin;
int matriz[lin][lin],somalin[lin],somacol[lin],somadiag1=0,somadiag2=0;
printf ("       Digite os elementos: \n");
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);
somalin[i] += matriz[i][j];/* somatorio das linhas */
if(i==j)somadiag1 += matriz[i][j];/* somatorio da diagonal principal */
for(i=0;i<lin;i++)/* somatorio das colunas */
somacol[i] += matriz[j][i];
printf("%d ",matriz[i][j]);
printf(" %d\n",somalin[i]);;
printf("%d ",somacol[i]);
j=lin-1;
somadiag2=0;
for (i=0;i<lin;i++) /* somatorio diagonal secundária */
somadiag2 += matriz[i][j];
if (somadiag1 != somadiag2)
printf ("Nao eh quadrado magico!\n\n");
if((somalin[i] != somalin[0])||(somacol[i] !=somalin[0])||
(somadiag1!=somalin[i])||(somadiag2!=somalin[i]))
printf ("A matriz é um quadrado magico!\n\n");
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.
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:
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:
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.:
O que tem de mágico nisso???
Uma excelente explicação, um pouco mais completa e inclusive com vídeo, achei aqui:
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.
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.
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
É 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
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".
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:
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)
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: