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()
}
}
