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