aula 109

QUADRADO MÁGICO com funções e procedimentos na linguagem Portugol

Na aula 100 aprendemos como identificar se uma matriz é um quadrado mágico ou não. Na aula de hoje vamos alterar nosso programa para resolver o quadrado mágico utilizando funções e procedimentos com a linguagem Portugol.

Para diminuir a quantidade de valores passados como parâmetros para nossas funções e procedimentos, vamos iniciar declarando algumas variáveis globais (uma variável global é visível em todo o programa).

A variável tam armazena a dimensão de nossa matriz. A variável jogo é a matriz de dimensões tam que queremos saber se é um quadrado mágico. As variáveis l e c serão utilizadas como índices nas estruturas de repetição para acessar linhas e colunas. A variável total irá armazenar o resultado da primeira soma calculada para ser comparada com as demais somas. Por fim, a variável igual será utilizada para indicar se temos um quadrado mágico ou não. Inicializada com o valor zero, ela continuará com zero enquanto as somas forem igual ao valor salvo na variável total. Se alguma soma for diferente, a variável igual recebe o valor um, indicando que não temos um quadrado mágico.

// variáveis globais
	const inteiro tam = 5
	inteiro jogo[tam][tam] = {{11,04,17,10,23},{24,12,05,18,06},{07,25,13,01,19},{20,08,21,14,02},{03,16,09,22,15}}
	inteiro l, c, total = 0, igual = 0

Como precisamos calcular diversas somas, vamos criar uma função para cada soma.

A seguir temos a função para calcular e retornar a soma dos elementos da diagonal principal. Como os elementos da diagonal principal são os elementos onde os índices de linha e coluna são iguais, basta uma repetição para calcularmos a soma destes valores.

	// função que calcula e retorna a soma da diagonal principal
	funcao inteiro somaDiagonalP(){
		inteiro soma = 0
		para(l = 0; l < tam; l++)
			soma += jogo[l][l]
		retorne soma
	}

De forma semelhante temos também uma função para calcular a soma dos elementos a diagonal secundária. Caso tenha dificuldade em entender os cálculos para gerar corretamente o índice da coluna (tam – 1 – l -> perceba que é o índice L e não outro 1), sugiro escrever uma matriz no papel indicando os índices de linha e coluna para cada elemento. Em seguida, escreva os índices dos elementos da diagonal secundária. O tam – 1 é simples. Se a matriz tem tamanho 5, não existe índice 5, apenas até 4. O índice l deve ser subtraído porque, enquanto o índice da linha aumenta, o índice da coluna diminui.

	// função que irá calcular e retornar a soma da diagonal secundária
	funcao inteiro somaDiagonalS(){
		inteiro soma = 0
		para(l = 0; l < tam; l++)
			soma += jogo[l][tam - 1 - l]
		retorne soma
	}

A seguir temos a função para calcular e retornar a soma de uma linha da matriz. Foi feito dessa forma para facilitar a utilização de matrizes de qualquer tamanho. Uma vez que temos esta função pronta, basta fazermos uma repetição chamando esta função para cada linha da matriz.

	// função para somar e retornar o total da linha x
	funcao inteiro somarLinha(inteiro x){
		inteiro soma = 0
		para(c = 0;  c < tam; c++)
			soma += jogo[x][c]
		retorne soma
	}

A seguir temos a função para calcular e retornar a soma de uma coluna da matriz. Foi feito dessa forma para facilitar a utilização de matrizes de qualquer tamanho. Uma vez que temos esta função pronta, basta fazermos uma repetição chamando esta função para cada coluna da matriz.

		// função para calcular e retornar a soma a coluna x
	funcao inteiro somarColuna(inteiro x){
		inteiro soma = 0
		para(l = 0; l < tam; l++)
			soma += jogo[l][x]
		retorne soma
	}

A seguir temos um procedimento (sem retorno) para calcular a soma de cada linha da matriz fazendo uso da função somarLinha. Perceba que, caso alguma linha tenha uma soma diferente da soma da diagonal principal (variável total) a variável igual recebe o valor 1, indicando que não temos um quadrado mágico.

	// procedimento para calcular a soma de todas as linhas
	funcao linhas(){
		// ----- linhas ------
		para(l = 0; l < tam; l++){
			se(total != somarLinha(l)){
				igual = 1
				escreva("\nA linha ", l, " é diferente!")
			}
		}
	}

A seguir temos um procedimento (sem retorno) para calcular a soma de cada coluna da matriz fazendo uso da função somarColuna. Perceba que, caso alguma coluna tenha uma soma diferente da soma da diagonal principal (variável total) a variável igual recebe o valor 1, indicando que não temos um quadrado mágico.

	// procedimento para calcular a soma de todas as colunas
	funcao colunas(){
		// ----- colunas ------
		para(c = 0; c < tam; c++){
			se(total != somarColuna(c)){
				igual = 1
				escreva("\nA coluna ", c, " é diferente!")
			}
		}
	}

A seguir temos um procedimento para verificar o valor da variável igual e imprimir uma mensagem na tela, dizendo se a matriz é ou não um quadrado mágico.

	// procedimento para verificar se é um quadrado mágico ou não
	funcao ehQuadradoMagico(){
		se(igual == 0)
			escreva("\n\n\tTemos um quadrado mágico!\n\n")
		senao
			escreva("\n\n\tNão temos um quadrado mágico!\n\n")
	}

A seguir temos um procedimento para imprimir a matriz na tela.

	// procedimento para imprimir a matriz
	funcao imprimirMatriz(){
		para(l = 0; l < tam; l++){
			para(c = 0; c < tam; c++){
				se(jogo[l][c] < 10)
					escreva("0") // para números entro 0 e 9
				escreva(jogo[l][c], " ")
			}
			escreva("\n")
		}
	}

Pro fim, temos nosso procedimento inicio, que faz uso das funções e procedimentos anteriores para descobrir se a matriz é ou não um quadrado mágico.

	funcao inicio(){
	
		total = somaDiagonalP()
		escreva("\n\tDiagonal principal = ", total, "\n")

		// -------- DIAGONAL SECUNDARIA ---------
		se(total != somaDiagonalS()){
			igual = 1
			escreva("Diagonal secundária é diferente!\n")
		}

		linhas() // verificando todas as linhas
		colunas() // verificando todas as colunas
		ehQuadradoMagico()
		imprimirMatriz()
	}

Código completo em Portugol para descobrir se uma matriz é um quadrado mágico ou não.

programa{
	/*	Aula 108: Quadrado mágico com funções e procedimentos
	 * 	
	 * 	11 04 17 10 23  = 65   0,4  tam - 1 - l
	 * 	24 12 05 18 06  = 65   1,3  tam - 1 - l
	 * 	07 25 13 01 19  = 65   2,2
	 * 	20 08 21 14 02  = 65   3,1
	 * 	03 16 09 22 15  = 65   4,0
	 * 	
	 * 	65 65 65 65 65  65
	 * 	
	 * 	Escrito por Wagner Gaspar
	 * 	Março de 2021
	*/

	// variáveis globais
	const inteiro tam = 5
	inteiro jogo[tam][tam] = {{11,04,17,10,23},{24,12,05,18,06},{07,25,13,01,19},{20,08,21,14,02},{03,16,09,22,15}}
	inteiro l, c, total = 0, igual = 0

	// função que calcula e retorna a soma da diagonal principal
	funcao inteiro somaDiagonalP(){
		inteiro soma = 0
		para(l = 0; l < tam; l++)
			soma += jogo[l][l]
		retorne soma
	}

	// função que irá calcular e retornar a soma da diagonal secundária
	funcao inteiro somaDiagonalS(){
		inteiro soma = 0
		para(l = 0; l < tam; l++)
			soma += jogo[l][tam - 1 - l]
		retorne soma
	}

	// função para somar e retornar o total da linha x
	funcao inteiro somarLinha(inteiro x){
		inteiro soma = 0
		para(c = 0;  c < tam; c++)
			soma += jogo[x][c]
		retorne soma
	}

	// função para calcular e retornar a soma a coluna x
	funcao inteiro somarColuna(inteiro x){
		inteiro soma = 0
		para(l = 0; l < tam; l++)
			soma += jogo[l][x]
		retorne soma
	}

	// procedimento para calcular a soma de todas as linhas
	funcao linhas(){
		// ----- linhas ------
		para(l = 0; l < tam; l++){
			se(total != somarLinha(l)){
				igual = 1
				escreva("\nA linha ", l, " é diferente!")
			}
		}
	}

	// procedimento para calcular a soma de todas as colunas
	funcao colunas(){
		// ----- colunas ------
		para(c = 0; c < tam; c++){
			se(total != somarColuna(c)){
				igual = 1
				escreva("\nA coluna ", c, " é diferente!")
			}
		}
	}

	// procedimento para verificar se é um quadrado mágico ou não
	funcao ehQuadradoMagico(){
		se(igual == 0)
			escreva("\n\n\tTemos um quadrado mágico!\n\n")
		senao
			escreva("\n\n\tNão temos um quadrado mágico!\n\n")
	}

	// procedimento para imprimir a matriz
	funcao imprimirMatriz(){
		para(l = 0; l < tam; l++){
			para(c = 0; c < tam; c++){
				se(jogo[l][c] < 10)
					escreva("0")
				escreva(jogo[l][c], " ")
			}
			escreva("\n")
		}
	}
		
	funcao inicio(){
	
		total = somaDiagonalP()
		escreva("\n\tDiagonal principal = ", total, "\n")

		// -------- DIAGONAL SECUNDARIA ---------
		se(total != somaDiagonalS()){
			igual = 1
			escreva("Diagonal secundária é diferente!\n")
		}

		linhas() // verificando todas as linhas
		colunas() // verificando todas as colunas
		ehQuadradoMagico()
		imprimirMatriz()
	}
}

Deixe um comentário

catorze − 14 =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.