CAII
Modularização
André Luís Duarte
"E quem não toma a sua cruz, e não segue após mim, não é digno de mim." Mateus 10:38
Modularizando Algoritmos
Decomposição de problemas
Módulos ou subalgoritmos
Parametrização
Decomposição de Problemas
Visa reduzir a complexidade de um
problema
Complexidade é sinônimo de variedade,
ou a quantidade de situações que um problema pode apresentar
Permite focar a atenção em problemas
Decomposição de Problemas
Ações:
Dividir o problema em suas partes principais Analisar a divisão para garantir a coerência Se alguma parte permanece complexa,
decompô-la também
Analisar o resultado novamente
Outros nomes: refinamento sucessivo ou
Representação Hierárquica
ProblemaEntrada Processamento
Cálculo 1 ... Cálculo n
Módulos ou Subprogramas
Declaração
Para modularizar nossos algoritmos temos que definir uma sintaxe para isso
módulo <Identificador>
<declaração de variáveis internas>; <comandos internos>;
Módulos ou Subprogramas
Ativação
Um módulo é ativado, quando seu
identificador é usado em um ponto do algoritmo
módulo fSoma
inteiro : n1,n2,soma; soma <- n1 + n2
Exemplo 1
inicio inteiro : n1, n2, soma; módulo fSoma soma <- n1 + n2; fimmódulo; escreva("Digite n1:"); leia(n1); escreva("Digite n2"); leia(n2); fSoma escreva("soma = ", soma);Cuidado
inicio Inteiro : n1, n2, soma; módulo soma soma <- n1 + n2; fimmódulo; escreva("Digite n1:"); leia(n1); escreva("Digite n2"); leia(n2); soma; escreva("soma = ", soma); fim;;Exemplo 2
inicio real : a,b,c,delta,x1,x2; ... módulo CalculaDelta delta <- b^2 – 4*a*c; fimmódulo; ... CalculaDelta; ...Escopo de Variáveis
Variáveis globais
Variáveis declaradas no inicio do algoritmo principal são visíveis por todos os módulos Podem ser manipuladas (leitura e escrita)
pelos módulos declarados no algoritmo São sobrepostas pelas variáveis locais
Escopo de Variáveis
Variáveis locais
Variáveis declaradas internamente dentro do módulo
Podem ser manipuladas (leitura e escrita) somente pelo módulo que a declarou ou por eventuais módulos internos à este
Sobrepõem as variáveis globais quando possuírem o mesmo nome
Visibilidade da Variável
É o seu escopo ou abrangência
Denota o conhecimento e acesso por
parte dos módulos integrantes
É relativa à hierarquia
Variável global: visível a todos os módulos hierarquicamente inferiores
Variável local: não é visível aos módulos hierarquicamente superiores
Exemplo 3
Algoritmo a,b,c,x1,x2,delta Entrada Cálculo Delta Raízes SaídaVariáveis Globais
Vantagem
Todos os módulos compartilham as mesmas variáveis, logo, o mesmo espaço de memória Desvantagem
As variáveis só serão desalocadas após o término do algoritmo principal
Módulos podem manipular (leitura e escrita ) de
forma errada uma variável que será usada por outro módulo
Exemplo 4
Algoritmo Entrada a,b,c Cálculo Delta delta Raízes x1,x2 SaídaVariáveis locais
Vantagem
As variáveis são desalocadas no final do módulo que as usou liberando memória
Posso decidir a forma de manipulação (leitura e escrita) de cada módulo
Código fica muito fácil de ler, corrigir ou alterar porque o significado semântico da variável esta encapsulado no bloco
Desvantagem
Exercícios de Fixação
Crie um algoritmo modularizado que calcule o fatorial de um número qualquer
Crie um algoritmo modularizado, e sua representação hierárquica, que permita a entrada do total de vendas de cinco
empregados e calcule seus salários. No final
exiba também o total gasto pela empresa com a folha de pagamento.
Exercícios de Fixação
Crie um algoritmo modularizado, e sua
representação hierárquica, que calcule as raízes de uma equação do 2º grau qualquer
Crie um algoritmo modularizado, e sua representação hierárquica, que permita a entrada dos dados de um aluno (chamada, matricula, nome, 4 notas) e indique quais
bimestres ele perdeu média e o seu resultado final (aprovado, reprovado)
Parametrização
Algoritmos específicos podem resolver
bastante problemas, porém, problemas específicos
módulo quadrado
resultado <- n1 * n1;
Parametrização
Algoritmos genéricos podem resolver
muito mais problemas do que algoritmos específicos, pois se adaptam a um
contexto
módulo potencia(inteiro : x, y)
resultado <- x ^ y;
fimmódulo;
Módulo é considerado generalizado se for
Parametrização
A utilização de parâmetros é similar ao uso em funções matemáticas
𝑓 𝑥, 𝑦 = 𝑥𝑦, onde x e y são os parâmetros da função
f
A função f foi definida em função de x e y, logo para calcular a função para um valor particular de x e y, devemos substituí-los pelo argumento
Parametrização
Observações:
Uma correspondência é estabelecida entre os parâmetros da função e os argumentos
utilizados
No exemplo o parâmetro x foi substituído pelo
argumento 3 e o parâmetro y foi substituído pelo argumento 2
A ordem da correspondência é importante pois 𝑓(3,2) ≠ 𝑓(2,3)
Parametrização
Declaração
módulo <Identificador>(tipo : <lista_1
variáveis,...,tipo : <lista_n de variáveis) <declaração de variáveis internas>;
<comandos internos>; fimmódulo;
Parametrização
Exemplo
módulo delta(inteiro : a,b,c) delta <- b^2-4*a*c;
fimmódulo;
Obs.: a linha "delta(inteiro : a,b,c)" também é conhecida como assinatura do módulo ou interface do módulo
Interface
Interface: in·ter·fa·ce substantivo feminino
1. [Informática] Dispositivo (material e lógico) graças ao qual se .efetuam as trocas de
informações entre dois sistemas.
2. [Didático] Limite comum a dois sistemas ou duas unidades que permite troca de
informações.
"interface", in Dicionário Priberam da Língua Portuguesa [em linha], 2008-2013, http://www.priberam.pt/DLPO/interface [consultado em 08-09-2014].
Parametrização
Ativação
Um módulo é ativado, quando seu identificador é usado em um ponto do algoritmo juntamente com os argumentos a serem passados para ele
Os argumentos podem ser constantes ou variáveis do mesmo tipo dos parâmetros
A correspondência ocorre na mesma ordem em que se encontram os parâmetros do módulo
Exemplo 5
inicio inteiro : n1,n2,soma; módulo fSoma(a,b:inteiro) soma <- a + b; fimmódulo; fSoma(10,-5); escreva("soma = ", soma); fim; Ativação do módulo soma com argumentosconstantes
A ordem de passagem segue a ordem dos parâmetros: 1º argumento 10 é copiado para
Exemplo 6
iniciointeiro : n1,n2,soma;
módulo fsoma(inteiro : a,b)
soma <- a + b; fimmódulo; escreva("Digite n1:"); leia(n1); escreva("Digite n2"); leia(n2); fSoma(n1,n2); escreva("soma = ", soma); fim;; Ativação do módulo soma com argumentos
variáveis
Ordem de passagem:
Valor de n1 é copiado para a Valor de n2 é copiado para b
Exercícios de Fixação
Construa um algoritmo modularizado que
permita ao usuário digitar dois valores e a operação desejada (soma, subtração,
multiplicação, divisão, raiz e exponencial) e exiba o resultado baseado nas escolhas e valores digitados.
Tipos de Módulos
Um módulo é um subalgoritmo que deve
ser bem simples por natureza
Usado normalmente para solucionar um
problema específico de modo geral
Obedece a mesma estruturação do
conjunto total
Exemplo 7
Algoritmo Entrada a,b,c verEqGrau2 a delta a,b,c,delta raízes a,b,delta,x1,x2 Saída x1,x2Descrição dos Módulos
Algoritmo: módulo principal
Entrada: obtém a entrada manual do usuário armazenando os valores a, b e c
verEqGrau2: verifica se a equação é uma equação do segundo grau realmente
delta: calcula o delta para a equação
raízes: calcula as raízes da equação
Exemplo 8
Algoritmo Entrada a,b,c verEqGrau2 a delta a,b,c,delta raízes a,b,delta,x1,x2 Saída x1,x2Pode ativar todos os módulos inferiores
Não possui cálculo ou verificação importante
para outros módulos
Possui cálculo
Possui verificação importante para a ativação do módulo
saída
Sua ativação pelo módulo "principal" depende de outros
Exemplo 9
Algoritmo Entrada a,b,c verEqGrau2 a delta a,b,c,delta raízes a,b,delta,x1,x2 Saída x1,x2Tipos de Parametrização
Nos exemplos até agora, usamos
variáveis globais mescladas com variáveis locais
Para melhorar o código devemos evitar,
sempre que possível, o uso de variáveis globais
Obs.: pense no encapsulamento da segurança para as variáveis no caso da equação do 2º grau
Tipos de Parametrização
Para podermos transferir valores para
serem manipulados em módulos,
podemos usar dois tipos de passagens de parâmetros:
Passagem por valor (por cópia)
Passagem por valor
Na passagem por valor, o valor passado
como argumento para função é copiado para os parâmetros da função
No caso de variáveis como argumento, o
valor delas é copiado para os parâmetros
Alterações feitas nas variáveis parâmetros
não refletem alterações nas variáveis argumento
Exemplo 10
inicio Inteiro : n1,n2; módulo fTroca(inteiro:a,b) aux: inteiro; aux a; a b; b aux; fimmódulo; n1 2; n2 3; escreva(n1,n2); fTroca(n1,n2); escreva(n1,n2); Execute o teste de mesa no algoritmo e mostre qual será o estado final das variáveis e asPassagem por referência
Na passagem por referência, uma
referência para a variável argumento é passada para os parâmetros da função
Qualquer alteração feita nas variáveis que
são parâmetros reflete na variável que foi passado como argumento
Passagem por referência
Como em algoritmo não existe uma
representação formal para indicar
passagem de parâmetro por referência, usaremos a representação do Pascal que é inserir a palavra "var" antes da
Exemplo 11
iniciointeiro : n1,n2;
módulo fTroca(var inteiro:a,b)
aux: inteiro; aux a; a b; b aux; fimmódulo; n1 2; n2 3; escreva(n1,n2); fTroca(n1,n2); Execute o teste de mesa no algoritmo e mostre qual será o estado final das variáveis e as
Passagem de vetores
Vetores são passados essencialmente por
referência para serem manipulados por módulos
Para realizar esta passagem, devemos
criar um tipo vetor e usá-lo na declaração do parâmetro
Exemplo 12
iniciotipo TVetor = vetor [0..9] de inteiro;
TVetor : vet1;
módulo fPreenche(var Tvetor:vet2, inteiro:i)
enquanto(i >= 0)faça; vet2[i] i; i i – 1; fim;enquanto; fimmódulo; fPreenche(vet1,9); fim;;
Tipos de Módulos
Os módulos podem ser de dois tipos
baseados principalmente na sua essência ou objetivo para o qual será usado e que norteia seu conjunto de ações
Os tipos são denominados contexto
Contexto de Ação
Contexto de Ação
Se preocupa com um processo em
particular
Seu conjunto de ações ditam a sua
semântica dentro do algoritmo
Sua essência visa executar uma ação
completa internamente ao módulo
Exemplo 13
módulo entrada(var Tvetor:vet, inteiro:tam)
inteiro : i, aux;
para i de 0 até tam faça
escreva("vet[",i, "]="); leia(vet[i]);
fim;para; fimmódulo;
Exemplo 14
módulo desloca(var Tvetor:vet, inteiro:tam)
inteiro : i, aux;
para i de 0 até tam faça
aux <- vet[i];
vet[i] <- vet[i + 1]; vet[i + 1] <- aux;
fim;para; fimmódulo;
Exemplo 15
módulo inverte(var Tvetor:vet, inteiro:tam)
inteiro : i, aux; i 0; enquanto(tam-i > i)faça aux <- vet[tam-i]; vet[tam-i] <- vet[i]; vet[i] <- aux; i i + 1; fim;enquanto; fimmódulo;
Exemplo 17
módulo saida(var Tvetor:vet, inteiro:tam)
inteiro : i, aux;
para i de 0 até tam faça
escreva("vet[",i, "]=",vet[i]);
fim;para; fimmódulo;
Exemplo 18
iniciotipo TVetor = vetor [0..9] de inteiro
LVet:TVetor
+ módulo entrada(var TVetor:vet, inteiro:tam); + módulo inverte(var TVetor:vet, inteiro:tam); + módulo saída(var TVetor:vet, inteiro:tam); entrada(LVet);
inverte(LVet); saida(LVet);
Contexto de Resultado
Se preocupa com um valor em particular Seu conjunto de ações visam calcular um
resultado no algoritmo
Sua essência visa calcular um valor
internamente e "retornar" este valor ao ponto de sua ativação
Para isso usa-se a instrução "retorne" Exemplos: delta e raízes
Exemplo 19
módulo fModulo(real : num)
valorModulo: real;
valorModulo <- sqrt(num ^ 2);
retorne valorModulo; fimmódulo;
módulo fParImpar(inteiro : num) se num mod 2 = 0 então
retorne 1; senão
retorne 0; fimmódulo;
Exemplo 20
inicioreal : num,nModulo;
+ módulo fModulo(valor: real); escreva("Digite um número"); leia(num);
nModulo fModulo(num);
escreva("|",num, "|=",nModulo);
inicio real:num,nModulo; + módulo fModulo(real:valor); escreva("Digite um número"); leia(num); fModulo(num); escreva("|",num, "|=",nModulo); fim;;
Cuidado
A ativação do módulo resulta em um retorno. Se o valor retornado não for armazenado em uma posição ouusado em uma expressão aritmética,
Contexto de Resultado
Todo módulo nesse contexto deve
retornar uma valor
O uso do retorno deste módulo deve ser
compatível ao tipo de dado necessário
A ativação de um módulo nesse contexto
pode substituir o dado de mesmo tipo em qualquer expressão
Exemplo 21
inicioreal:px,py,qx,qynum,nModulo,distancia; + módulo fModulo(real:valor);
escreva("Digite as coordenadas do ponto p"); leia(px,py);
escreva("Digite as coordenadas do ponto q"); leia(qx,qy);
distancia fModulo(px-qx)+fModulo(py-qy);
escreva("Distância entre p e q é:",distancia);
Módulos e memória
A memória do computador é dividida em
três partes quando um programa é executado:
Espaço estático: contém variáveis globais e o código do programa
Heap: usada para alocação dinâmica
Módulos e memória
Quando um módulo é ativado, suas
variáveis locais são armazenadas no topo da pilha
Após terminar a execução do módulo,
suas variáveis locais são removidas da pilha e o espaço ocupado por elas é
Exemplo 22
inicio módulo m1(inteiro:a,b) c: inteiro; c 5; retorne (c+a+b); fimmódulo; módulo m2(inteiro:a,b) c: inteiro; c m1(b,a); retorne c; fimmódulo; m2(2,3); Pilha TopoExemplo 22
inicio módulo m1(inteiro:a,b) c: inteiro; c 5; retorne (c+a+b); fimmódulo; módulo m2(inteiro:a,b) c: inteiro; c m1(b,a); retorne c; fimmódulo; m2(2,3); fim; Pilha Topo 2 3 a b c m2Exemplo 22
inicio módulo m1(inteiro:a,b) c: inteiro; c 5; retorne (c+a+b); fimmódulo; módulo m2(inteiro:a,b) c: inteiro; c m1(b,a); retorne c; fimmódulo; m2(2,3); Pilha Topo 2 3 a b c m2 3 2 5 a b c m1Exemplo 22
inicio módulo m1(inteiro:a,b) c: inteiro; c 5; retorne (c+a+b); fimmódulo; módulo m2(inteiro:a,b) c: inteiro; c m1(b,a); retorne c; fimmódulo; m2(2,3); fim; Pilha Topo 2 3 a b c m2 3 2 5 a b c m1Exemplo 22
inicio módulo m1(inteiro:a,b) c: inteiro; c 5; retorne (c+a+b); fimmódulo; módulo m2(inteiro:a,b) c: inteiro; c m1(b,a); retorne c; fimmódulo; m2(2,3); Pilha Topo 2 3 10 a b c m2Exemplo 22
inicio módulo m1(inteiro:a,b) c: inteiro; c 5; retorne (c+a+b); fimmódulo; módulo m2(inteiro:a,b) c: inteiro; c m1(b,a); retorne c; fimmódulo; m2(2,3); fim; Pilha Topo 2 3 10 a b c m2Exemplo 22
inicio módulo m1(inteiro:a,b) c: inteiro; c 5; retorne (c+a+b); fimmódulo; módulo m2(inteiro:a,b) c: inteiro; c m1(b,a); retorne c; fimmódulo; m2(2,3); Pilha TopoExercícios de Fixação
Construa um módulo que conte a quantidade de dígitos de um número inteiro
Entrada: 123
Saída: 3
Construa um módulo que retorne o inverso de
um número inteiro
Entrada: 965
Exercícios de Fixação
Construa um algoritmo que dado uma
conta corrente com cinco dígitos, calcule o dígito verificador
Somar nº da conta com seu inverso Multiplicar cada dígito por sua ordem
posicional e somar o resultado Exemplos: conta 25678
Exercícios de Fixação
Construa um módulo que calcule o resto
da divisão entre dois números inteiros sem usar o operador mod
Construa um módulo que verifique se um
número é par ou impar usando o módulo anterior
Indique o que ocorre na pilha de execução