thinkabout Posted March 8, 2015 at 06:01 PM Report Share #578964 Posted March 8, 2015 at 06:01 PM (edited) Boa Tarde, O exercício inicial era para um quadrado 3*3, contudo segue uma versão mais genérica para N*N (sem ser o user a fazer input). Ideias para possíveis melhoramento no código. http://pt.wikipedia.org/wiki/Quadrado_m%C3%A1gico #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #define x 3 /* Um quadrado mágico é uma matriz 3×3 contendo valores entre 1 e 9 (sem repetições), de tal forma que a soma dos elementos de qualquer uma das linhas, colunas e diagonais é sempre igual. A figura seguinte mostra um exemplo de um quadrado mágico: 6 1 8 7 5 3 2 9 4 Desenvolva uma função que verifique se uma matriz 3×3 passada como argumento é um quadrado mágico. A função devolve 1 se isso se verificar ou 0 no caso contrário. http://pt.wikipedia.org/wiki/Quadrado_m%C3%A1gico */ int g0e08(int matriz[x][x]) { int linha[x], coluna[x]; int i, j, diagonalprincipal = 0, diagonalsecundaria=0; // Faz a impressão do quadrado for (i = 0; i<x; i++) { for (j = 0; j < x; j++) { printf("%d\t", matriz[i][j]); } printf("\n"); } // Faz a soma das duas diagonais for (i = 0; i<x; i++) { for (j = 0; j<x; j++) { if (i == j) diagonalprincipal += matriz[i][j]; if (x - 1 == (x - 1)-j) diagonalsecundaria += matriz[i][j]; /* Última posição mais a esquerda (x - 1) e conforme vou andando nas colunas vou decrementado uma coluna de forma que ele vai subindo as linhas (percorrer a diagonal ao contrário) O x-1 é porque o tamanho do array começa em 0 e não em 1*/ } } //printf("\nValor da diagonalprincipal -> %d e o valor da diagonalsecundaria -> %d \n", diagonalprincipal, diagonalsecundaria); if (diagonalprincipal != diagonalsecundaria) { // Se as diagonais forem diferentes não é quadrado mágico. return 0; } // Vou fazer as somas for (i = 0; i<x; i++) { linha[i] = 0; coluna[i] = 0; for (j = 0; j<x; j++) { linha[i] += matriz[i][j]; //soma linhas coluna[i] += matriz[j][i]; //soma da colunas (inversão de linha por colunas) } if (linha[i] != coluna[i]) { return 0; } //printf("\n Valor da soma das linhas %d", linha[i]); //printf("\n Valor da soma das linhas %d", coluna[i]); } return 1; } void main(){ int matriz[x][x] = { { 6, 1, 8 }, { 7, 5, 3 }, { 2, 9, 4 } }; // Quadrado magico 3*3 //int matriz[x][x] = { { 4, 14,15,1 }, { 9,7 ,6,12 }, { 5,11,10,8 }, { 16,2 ,3,13 } }; int verifica; verifica = g0e08(matriz); if (verifica == 0) puts("\nNao e um quadrado magico"); else puts("\nE quadrado magico"); } Edited March 8, 2015 at 06:03 PM by thinkabout Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 8, 2015 at 07:50 PM Report Share #578971 Posted March 8, 2015 at 07:50 PM presumo que o código apresentado é para a verificação se a matrix é válida e não a criação de um quadrado mágico IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
thinkabout Posted March 8, 2015 at 08:46 PM Author Report Share #578978 Posted March 8, 2015 at 08:46 PM presumo que o código apresentado é para a verificação se a matrix é válida e não a criação de um quadrado mágico Correcto. Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 8, 2015 at 09:37 PM Report Share #578982 Posted March 8, 2015 at 09:37 PM (edited) sendo assim, um código mais arrumado, minimizado e com um bug corrigido : #include <stdio.h> #define SIZE 3 int g0e08(int matrix[size][size]) { int rcount = 0, ccount = 0; int d1count = 0, d2count = 0; // somar as diagonais for (int i = 0; i < SIZE; ++i) { d1count += matrix[i][i]; d2count += matrix[i][size - i - 1]; } // verificar se a soma é gual if (d1count != d2count) return 0; // somar as linhas e colunas for (int i = 0; i < SIZE; ++i) { rcount = ccount = 0; // soma da linha e coluna "i" for (int j = 0; j < SIZE; ++j) { rcount += matrix[i][j]; ccount += matrix[j][i]; } // verificar se as somas são iguais if (rcount != ccount || rcount != d1count) return 0; } return 1; } void print_matrix(int matrix[size][size]) { for (int row = 0; row < SIZE; ++row) { for (int column = 0; column < SIZE; ++column) printf("%d ", matrix[row][column]); printf("\n"); } printf("\n"); } int main(void) { int matrix[size][size] = { { 6, 1, 8 }, { 7, 5, 3 }, { 2, 9, 4 } }; print_matrix(matrix); if (g0e08(matrix) == 0) printf("Nao e um quadrado magico\n"); else printf("E quadrado magico\n"); return 0; } Edited March 8, 2015 at 09:37 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now