Modularização na Lógica de Programação (Parte II)

Em um artigo já publicado, estudamos os conceitos iniciais da modularização na criação de algoritmos. Agora vamos entender alguns termos importantes dentro desse assunto.

Avatar


31 de Maio de 2022

Fala, meus consagrados! Tudo beleza com vocês?

Em um artigo já publicado, estudamos os conceitos iniciais da modularização na criação de algoritmos. Agora vamos entender alguns termos importantes dentro desse assunto.

Teoria

Estudamos que a modularização é a forma de dividir as tarefas ou algoritmos em módulos, também chamados subprogramas ou componentes.

Os módulos:

  • Cuidam de uma parte separada de um problema;
  • Realizam uma tarefa específica dentro duma solução do problema;
  • São unidades funcionais de um algoritmo;
  • São grupos de comandos com uma funcionalidade ou um objetivo bem definida; e
  • Devem ser o mais independentes possível das outras partes do algoritmo.

Também estudamos dois tipos de módulos:

  • Procedimentos são módulo que não produzem um valor de saída;
    • Exemplos:
      • Imprimir o maior elemento de um grupo elementos;
      • Ler um elemento;
  • Funções são módulos que produzem um valor de saída;
    • Exemplos:
      • Retornar o menor (ou maior) valor de um grupo de elementos;
      • Retornar um valor booleano caso um valor está dentro de um grupo de elementos.

Agora iremos estudar mais assuntos sobre modularização:

  • Variáveis globais e variáveis locais;
  • Parâmetros formais e parâmetros reais; e
  • Passagem por valor e passagem por referência.

Quando falamos de variáveis globais e variáveis locais, estamos falando de escopo de variáveis:

  • Variáveis globais:
    • São declaradas no programa principal;
    • Podem ser manipuladas em:
      • Todo programa principal; ou
      • Qualquer módulo;
  • Variáveis locais:
    • São declaradas em um módulo específico; e
    • São manipuladas dentro desse módulo apenas.

Como boa prática de programação, deve-se evitar a declarar variáveis globais com o mesmo nome das variáveis dos módulos.

Figura 1: variável global A e variáveis locais B e C.

Na figura 1, temos a variável global A. Ela pode ser vista tanto no programa principal quanto nos módulos 1 e 2. Já a variável local B é só vista no módulo 1 e a variável C, no módulo 2 apenas.

Em relação aos parâmetros, temos os parâmetros formais e parâmetros reais.

Os parâmetros formais aão definidos no cabeçalho do módulo e possuem escopo do módulo onde estão definidos.

Exemplo:

função media(x: real, y: real): real
início da função
    retorne (x + y) / 2;
fim da função

No exemplo acima, os parâmetros x e y são formais, pois estão na definição da função media.

Os parâmetros reais representam o valor (ou endereço) das variáveis ou constantes usadas na chamada do subprograma.

Exemplo:

a := media(8, 7);

Já no exemplo acima, os parâmetros 8 e 7 são reais, pois são usados na chamada da função media.

Finalizando, veremos a passagem por valor e a passagem por referência.

A passagem por valor acontece quando se transmite o valor do parâmetro real para o parâmetro formal correspondente. A cópia física do valor do parâmetro real é feita durante a ativação do módulo.

Exemplo:

Algoritmo ordenacaoCrescente;
    var i, j: inteiro;
    procedimento ordena(m: inteiro; n: inteiro)
        var aux: inteiro;
        início do procedimento
        se (m > n) então:
            aux := m;
            m := n;
            n := aux;
        fim do se
    fim do procedimento
início
    leia(i, j);
    ordena(i, j);
    escreva(“Números ordenados: ”, i, “, “, j);
fim

Vamos supor que, no exemplo acima, as variáveis i e j tenham valores 15 e 10, respectivamente. Esses valores irão ser usados na chamada do procedimento ordena, como parâmetros reais.

Dentro do procedimento:

  • Os parâmetros formais m e n receberão esses valores (15 e 10, respectivamente) por cópia; e
  • Como o valor do parâmetro m é maior do que do parâmetro n, haverá uma troca de valores;
    • Sendo assim ordenados.

No final do procedimento, os valores das variáveis globais x e y não serão modificados, pois houve uma cópia de seus valores na passagem.

Todos os exemplos que vimos neste artigo e no artigo anterior sobre modularização a passagem foi por valor.

Já na passagem por referência, se transmite o endereço (caminho de acesso) do parâmetro real para o parâmetro formal correspondente. É uma passagem mais eficiente porque é sem cópia e sem armazenamento duplicado.

Exemplo:

Algoritmo ordenacaoCrescente;
    var i, j: inteiro;
    procedimento ordena(ref m: inteiro; ref n: inteiro)
        var aux: inteiro;
        início do procedimento
        se (m > n) então:
            aux := m;
            m := n;
            n := aux;
        fim do se
    fim do procedimento
início
    leia(i, j);
    ordena(i, j);
    escreva(“Números ordenados: ”, i, “, “, j);
fim

O exemplo acima é bem parecido com o exemplo da passagem por valor, porém, há o uso da palavra-chave ref, que identifica a passagem por referência.

Contiuaremos com suposição das variáveis globais i e j tenham valores 15 e 10, respectivamente. Agora não se irá passar esses valores como parâmetro. Serão passadas as referências dessas variáveis para os parâmetros formais m e n. Sendo assim, i e m apontam para o mesmo espaço de armazenamento, assim como j e n também apontam para o mesmo espaço.

Dentro do procedimento agora:

  • Os parâmetros formais m e n receberão as referências das variáveis globais i e j, respectivamente;
  • Como o valor apontado pelo parâmetro de m é maior do que do parâmetro n, haverá uma troca de valores;
    • Sendo assim ordenados.

No final do procedimento, os valores das variáveis globais x e y serão modificados, pois houve a passagem por referência.

Então é isso!
[]s e até a próxima!
_________________________
Professor Rogerão Araújo

Avatar


31 de Maio de 2022