UNIDADE 6 - PROGRAMAÇÃO MODULAR
Até o momento as estruturas de controle (seqüência, seleção e repetição)
de um algoritmo definia-o como um bloco lógico (início e fim). À medida que os
problemas a serem solucionados se tornam mais complexos, ou seja, apresentam
uma variedade maior de situações diferentes a serem resolvidas, temos, então,
uma série de pequenos problemas, cujas respectivas soluções integrarão o
conjunto de ações definitivo.
Quando tal conjunto de ações é construído, podemos nos deparar
literalmente com um amontoado de ações que afetam a legibilidade porque não
ficam claras e concisas as pequenas partes lógicas que solucionam cada pequeno
problema, o que dificulta a assimilação desta construção por outras pessoa, além
de inviabilizar uma perfeita coesão interna do algoritmo.
Modularização é a técnica que combate tais circunstâncias e explicita as
pequenas soluções.
6.1 MÓDULOS
Módulos são blocos lógicos de um algoritmo que visam aumentar a
funcionalidade das partes do conjunto solução.
6.2 BLOCOS
Um bloco consiste em um conjunto de declarações e comandos delimitados
pelas palavras início e fim.
6.3 DECLARAÇÃO
Para modularizar um algoritmo necessitamos de uma sintaxe para
expressar esta nova estrutura compreendida por módulos. Esta sintaxe será vista
mais tarde, uma vez que o módulo pode assumir mais de uma forma. Neste
momento é importante saber que ao módulo é atribuído um nome (Identificador).
De certo modo, precisamos uniformizar determinado conjunto de ações afins que
obedeçam a mesma estruturação de um algoritmo com objetivo de representar um
bloco lógico em especial.
OBS:
a) Quando construímos um módulo estamos construindo um algoritmo em
instância menor, ou seja, um pequeno conjunto solução praticamente
independente.
b) Este sub-algoritmo pode inclusive utilizar outros módulos.
c) Com o emprego de sub-algoritmos utilizados especificamente para resolver
problemas pequenos, aumentou-se o grau de clareza, facilitando a compreensão
de cada parte isoladamente, assim como o relacionamento entre elas.
6.4 MANIPULAÇÃO
A ativação de um módulo ocorre quando um determinado ponto do algoritmo
contém o identificador que foi usado na definição do módulo, o que é conhecido
por “chamada” ou “ativação” do módulo que por sua vez representa a execução
das ações deste naquele trecho do algoritmo.
6.5 ESCOPO DE VARIÁVEIS
Todas as variáveis utilizadas no algoritmo e que encontram-se declaradas
no seu início, tornam-se possíveis de aplicação por qualquer módulo integrante.
Estas variáveis são denominadas globais. Em alguns casos uma determinada
variável é utilizada apenas por um módulo específico, o que não justifica uma
definição global, pois somente se fazem necessários o conhecimento e a
utilização dessa variável dentro dos limites desse bloco lógico. Esta situação
ocorre quando a variável é declarada internamente ao módulo e é denominada
variável local.
OBS:
a) Uma variável declarada dentro de um bloco só é conhecida dentro deste bloco;
b) Se uma variável X declarada em um bloco já foi declarada como global e com o
mesmo nome declarado num bloco mais interno, a variável válida no bloco mais
interno será a declarada neste bloco.
6.6 SUBROTINAS
Uma subrotina é uma ferramenta de programação que serve basicamente a
dois objetivos:
• Evitar que certa seqüência de comandos que ocorra em vários locais de um
algoritmo tenha de ser escrita repetidamente nestes locais;
• Dividir a estrutura de um algoritmo em partes fechadas e logicamente coerentes.
Algoritmos contêm muitas vezes grupos de comandos iguais e repetidos em
várias partes de seu corpo. As subrotinas permitem economia de tempo, de escrita
e redução no tamanho de algoritmos.
Em alguns casos, os trechos de comandos repetidos são idênticos, porém
utilizam operandos diferentes. Nestes casos, a utilização de subrotinas permite,
também, uma única escrita dos comandos que ao serem executados, utilizam os
parâmetros ou operandos adequados a cada ocorrência.
Bem mais importante que esta primeira utilidade do uso de subrotinas, o
seu uso na modularização de algoritmos torna-se uma ferramenta indispensável
na elaboração de algoritmos mais complexos e de maior tamanho.
A d ivisão de estruturas de algoritmos em partes lógicas é uma técnica
indispensável em programação estruturada. A divisão de algoritmos em
subrotinas, além de facilitar a elaboração do algoritmo permite uma melhor
documentação e verificação de sua correção. Cada módulo implementado como
uma subrotina deve conter sua própria documentação e pode ser verificado
independentemente.
Adicionalmente a modularização por subrotinas pode facilitar muito o
trabalho de equipes de programadores no sentido que um algoritmo pode ser
dividido em partes, testado e catalogado separadamente.
6.7 ESTRUTURAÇÃO DOS MÓDULOS DE UM ALGORITMO
Uma subrotina nada mais é que um algoritmo hierarquicamente subordinado
a um outro algoritmo comumente chamado de módulo principal. Da mesma forma,
uma subrotina pode conter outras subrotinas aninhadas.
6.8 TIPOS BÁSICOS DE SUBROTINAS
Existem dois tipos básicos de subrotinas:
a) Procedimentos;
b) Funções.
• PROCEDIMENTOS
Os procedimentos são utilizados quando um conjunto de comandos repetese ao longo do algoritmo. Então, para não escrevermos várias vezes o mesmo
bloco de comandos, usamos os procedimentos.
Sintaxe:
procedimento IDENTIFICADOR (parâmetros);
Comandos;
fim procedimento IDENTIFICADOR;
Onde:
- IDENTIFICADOR é o nome de referência do procedimento;
- parâmetros é a lista de variáveis que serão passadas ao procedimento
para serem manipuladas no seu interior. Na definição dos parâmetros também
devem ser declarados seus tipos. Nem todo procedimento utiliza-se de
parâmetros, portanto é um item opcional.
Exemplo:
procedimento LINHA (inteiro: COMPRIMENTO);
inteiro : I;
para I ← 1 até COMPRIMENTO faça
escreva “-“;
fim para;
fim procedimento LINHA;
• FUNÇÕES
As funções constituem um tipo especial de subrotina, bastante semelhante
ao procedimento, que tem a característica especial de retornar ao algoritmo
chamador um valor associado ao nome da função. Esta característica permite uma
analogia com o conceito de função na matemática.
A utilização de outras funções no algoritmo como por exemplo, seno,
tangente ou qualquer outra função “especial”, pode ser feito declarando-se um
procedimento função.
A declaração de uma função é semelhante a de um procedimento. Difere
somente na especificação do tipo da mesma, ou seja, do tipo de valor que será
retornado. Apesar de terem sido citadas apenas funções numéricas, elas podem
ser lógicas ou literais.
Sintaxe:
função tipo de retorno: IDENTIFICADOR (parâmetros);
comandos;
fim função IDENTIFICADOR;
Onde:
- tipo de retorno é o tipo de dado que a função retornará (inteiro, real,
lógico, caracter);
- IDENTIFICADOR é o nome de referência da função;
- parâmetros é a lista de variáveis que serão passadas à função para serem
manipuladas no seu interior. Na definição dos parâmetros também devem ser
declarados seus tipos. Nem toda função utiliza-se de parâmetros, portanto é um
item opcional.
Exemplo:
função lógico: E_PAR (inteiro : N);
se (N mod 2 = 0) então
E_PAR ← verdadeiro
senão
E_PAR ← falso;
fim se;
fim função E_PAR;
6.9 PASSAGEM DE PARÂMETROS
A transferência de informações de e para subrotinas utilizando-se variáveis
globais não constitui uma boa disciplina de programação.
Estas transferências precisam ser mais formalizadas e documentadas a bem
da legitimidade, documentação e organização do programa elaborado.
Em algoritmos, a transferência de informações de e para subrotinas pode ser
feita com a utilização de parâmetros.
Esta utilização formaliza a comunicação entre módulos. Além disso, permite
que um módulo seja utilizado com operandos diferentes, dependendo do que se
deseja do mesmo.
Parâmetros de definição são objetos utilizados dentro das subrotinas que em
cada ativação representam objetos de nível mais externo. A forma de se utilizar
parâmetros em subrotinas foi apresentada anteriormente.
A chamada de uma subrotina aparece numa expressão e tem a seguinte
forma:
NOME DO PROCEDIMENTO/FUNÇÃO (Lista de parâmetros de chamada);
Exemplo:
início
real : A, B, C;
procedimento EXEMPLO (real: VALOR_1, VALOR_2, VALOR_3);
real : MAIOR_VALOR;
MAIOR_VALOR ← VALOR_1;
se (VALOR_2 > MAIOR_VALOR) então
MAIOR_VALOR ← VALOR_2;
fim se;
se (VALOR_3 > MAIOR_VALOR) então
MAIOR_VALOR ← VALOR_3;
fim se;
escreva “O maior valor é: “, MAIOR_VALOR;
fim procedimento EXEMPLO;
{corpo do programa principal}
leia “Digite 3 números:”; A, B, C;
EXEMPLO (A, B, C);
fim.
6.9.1 PASSAGEM DE PARÂMETROS POR VALOR
Na passagem de parâmetros por valor (ou por cópia) o parâmetro real é
calculado e uma cópia de seu valor é fornecida ao parâmetro formal, no ato da
invocação da subrotina. A execução da subrotina prossegue normalmente e todas
as modificações feitas no parâmetro formal não afetam o parâmetro real, pois
trabalha-se apenas com uma cópia do mesmo.
Exemplo:
início
inteiro : X;
procedimento PROC (inteiro: Y);
Y ← Y + 1;
escreva “Durante = “, Y;
fim procedimento PROC;
X ← 1;
escreva “Antes = “, X;
PROC (X);
escreva “Depois = “, X;
fim.
O algoritmo anterior fornece o seguinte resultado:
Antes = 1;
Durante = 2;
Depois = 1;
Este tipo de ação é possível porque, neste mecanismo de passagem de
parâmetros, é feita uma reserva de espaço em memória para os parâmetros
formais, para que neles seja armazenada uma cópia dos parâmetros reais.
6.9.2 PASSAGEM DE PARÂMETROS POR REFERÊNCIA
Neste mecanismo de passagem de parâmetros não é feita uma reserva de
espaço em memória para os parâmetros formais. Quando uma subrotina com
parâmetros passados por referência é chamada, o espaço de memória ocupado
pelos parâmetros reais é compartilhado pelos parâmetros formais
correspondentes.
Assim, as eventuais modificações feitas nos parâmetros formais também
afetam os parâmetros reais correspondentes. Uma mesma subrotina pode utilizar
diferentes mecanismos de passagem de parâmetros, para parâmetros distintos.
Para diferenciar uns dos outros, convencionou-se colocar o prefixo var antes da
definição dos parâmetros formais passados por referência. Se por exemplo um
procedimento tem o seguinte cabeçalho:
procedimento PROC (inteiro: X, Y; real: var Z; real: J)
Então:
- X e Y são parâmetros formais do tipo inteiro e são passados por valor;
- Z é um parâmetro formal real passado por referência;
- J é um parâmetro formal real passado por valor.
O exemplo do item anterior, alterado para que o parâmetro Y do
procedimento seja passado por referência, torna-se:
início
inteiro : X;
procedimento PROC (inteiro: var Y);
Y ← Y + 1;
escreva “Durante = “, Y;
fim procedimento PROC;
X ← 1;
escreva “Antes = “, X;
PROC (X);
escreva “Depois = “, X;
fim.
O resultado do algoritmo modificado é:
Antes = 1;
Durante = 2;
Depois = 2;
Fonte: Material retirado da Apostila de Aulas do professor Adair Santa Catarina.
Download

UNIDADE 6 - PROGRAMAÇÃO MODULAR