Módulos ou Subrotinas:
PARTE II
Objetivos da Aula
Compreender a necessidade e a importância de
modularizar
Aprender a criar e utilizar (chamar) seus
próprios módulos
Refletindo ...
Até o momento temos escrito nossos programas no
PortugolStudio de maneira “sequencial” dentro da
Refletindo ...
À medida que os problemas vão se tornando mais
complexos,
os programas (solução) tendem a ficar
mais
extensos.
Modularizar permite “quebrar” o problema em
subproblemas.
Para cada subproblema podemos, por exemplo,
escrever um
módulo específico
(função)
PROBLEMA
EXEMPLO
Escreva um programa ler dois vetores (A e B) de
10 elementos cada. Após a entrada de dados, o
programa deve:
Obter e exibir a soma dos elementos do vetor A
Obter e exibir a soma dos elementos do vetor B
Calcular e exibir a média dos elementos dos dois
vetores (uma única média)
Imprimir o vetor A e depois o vetor B
Mostrar os elementos de A e B que são acima da média
de ambos
Escreva um programa ler dois vetores (A e B) de 10
elementos cada. Após a entrada de dados, o programa
deve:
Obter e exibir a soma dos elementos do vetor A Obter e exibir a soma dos elementos do vetor B
Calcular e exibir a média dos elementos dos dois vetores (uma única média)
Imprimir o vetor A e depois o vetor B
Mostrar os elementos de A e B que são acima da média de ambos
SAÍDA:
soma do vetor A (somaA), soma do vetor B (soma B),
media dos dois vetores (mediaAB), exibir vetor A, exibir vetor
B, exibir elementos de A e B acima de mediaAB.
Escreva um programa ler dois vetores (A e B) de 10
elementos cada. Após a entrada de dados, o programa
deve:
Obter e exibir a soma dos elementos do vetor A Obter e exibir a soma dos elementos do vetor B
Calcular e exibir a média dos elementos dos dois vetores (uma única média)
Imprimir o vetor A e depois o vetor B
ENTRADA DE DADOS:
os vetores A e B
Escreva um programa
ler dois vetores
(A e B) de 10
elementos cada. Após a entrada de dados, o programa
deve:
Obter e exibir a soma dos elementos do vetor A Obter e exibir a soma dos elementos do vetor B
Calcular e exibir a média dos elementos dos dois vetores (uma única média)
Imprimir o vetor A e depois o vetor B
PROCESSAMENTO [1]:
Note que poderíamos usar um ÚNICO laço de repetição para somar os DOIS vetores. Propositalmente, optou-se por tratar cada problema (de somar cada vetor) como um problema específico.
- Obter e exibir a soma dos elementos do vetor A - Obter e exibir a soma dos elementos do vetor B
PROCESSAMENTO [2]
- Calcular e exibir a média dos elementos dos dois vetores (uma única média)PROCESSAMENTO [3]
Mostrar os elementos de A e B que são acima da média de ambos
O programa completo possui cerca de 53 linhas
Há diversos trechos no programa que são
“repetitivos”
,
ou seja, fazem a “mesma” coisa,
mudando-se apenas a “variável”
Trecho repetitivo:
ENTRADA DE DADOS
O “mesmo trecho” para ENTRADA DE DADOS dos vetores! Muda apenas o nome da variável.
Trecho repetitivo:
SOMA ELEMENTOS VETOR
O “mesmo trecho” para SOMA DOS ELEMENTOS dos vetores! Muda apenas o nome da variável.
Trecho repetitivo:
IMPRIME VETOR
O “mesmo trecho” para IMPRIMIR VETOR! Muda apenas o nome da variável.
Trecho repetitivo:
ELEMENTOS ACIMA MEDIA
O “mesmo trecho” para MOSTRAR ELEMENTOS ACIMA DA MÉDIA! Muda apenas o nome da variável.
Trechos repetitivos é um convite ao
REUSO!
Cada “parte” do programa tem uma
FINALIDADE
ESPECÍFICA
:
Ler o vetor
(subproblema 1)
Somar os elementos do vetor
(subproblema 2)
Imprimir os elementos do vetor
(subproblema 3)
Exibir os elementos acima da media
(subproblema 4)
Reuso
e
Problemas com finalidade específica é um
convite a
MODULARIZAÇÃO!!!
SOLUÇÃO
MODULARIZADA
Primeiro vamos ver a solução
modularizada, para entendermos suas
vantagens! Em seguida vamos aprender a
Primeiro, vamos pegar cada
trecho específico
, um
a um, e transformá-lo numa
função
Modularizando
MODULARIZANDO A ROTINA
O que difere entre os dois trechos é apenas a
variável do
“leia”
Note que os trechos são IDÊNTICOS!
Apenas “criamos” uma nova função, demos um nome a ela
(Leitura_Vetor)
e agora podemos CHAMÁ-LA
Daqui a pouco entenderemos melhor os detalhes da criação da função: nome, parâmetros, etc.
Existindo a função podemos CHAMÁ-LA como fazemos
com funções existentes (potencia, raiz, etc)
Note que “Leitura_Vetor” é chamada duas vezes: uma para
A e outra para B
MODULARIZANDO A ROTINA
O que difere os dois trechos?
Note que os trechos são IDÊNTICOS!
Apenas “criamos” uma nova função, demos um nome a ela
(Soma_Vetor)
e agora podemos CHAMÁ-LA
Daqui a pouco entenderemos melhor os detalhes da criação da função : nome, parâmetros, etc.
Existindo a função podemos CHAMÁ-LA como fazemos
com funções existentes (potencia, raiz, etc)
Note que “Soma_Vetor” é chamada duas vezes: uma para A
e outra para B
MODULARIZANDO A ROTINA
O que difere os dois trechos?
Note que os trechos são IDÊNTICOS!
Apenas “criamos” uma nova função, demos um nome a ela
(Imprime_Vetor)
e agora podemos CHAMÁ-LA
Daqui a pouco entenderemos melhor os detalhes da criação da função : nome, parâmetros, etc.
Existindo a função podemos CHAMÁ-LA como fazemos
com funções existentes (potencia, raiz, etc)
Note que “Imprime_Vetor” é chamada duas vezes: uma para
A e outra para B
MODULARIZANDO A ROTINA
O que difere os dois trechos?
Note que os trechos são IDÊNTICOS!
Apenas “criamos” uma nova função, demos um nome a ela
(Imprime_Acima_Media)
e agora podemos CHAMÁ-LA
Daqui a pouco entenderemos melhor os detalhes da criação da função : nome, parâmetros, etc.
Existindo a função podemos CHAMÁ-LA como fazemos
com funções existentes (potencia, raiz, etc)
Note que “Imprime_Acima_Media” é chamada duas vezes:
uma para A e outra para B
FUNÇÃO INÍCIO
Note como o
programa está mais
ENXUTO (código
mais limpo)
FUNÇÕES DE USUÁRIO (CRIADAS)
AS FUNÇÕES
CRIADAS E QUE
FORAM CHAMADAS
VANTAGENS DA
MODULARIZAÇÃO
Modularização - Vantagens
Reaproveitamento de código
(reuso)
Organização
Legibilidade
Flexibilidade
COMO ESCREVER E ATIVAR
MÓDULOS
(FUNÇÕES)
Módulos – Estrutura e Sintaxe
Um programa modularizado tem:
um
módulo principal
(função início) e
outros módulos que vamos chamar de
Módulos - Sintaxe
Sintaxe parecida com O módulo principal
1- Palavra funcao (obrigatório)
2- Valor de retorno (caso exista)
3- Identificador (obrigatório) 4- Parênteses com parâmetros (caso exista)
PARÂMETROS
São os valores ou variáveis
enviadas ao
módulo
, para que ele possa realizar o seu
processamento
Podemos passar nenhum ou vários parâmetros
para o módulo
Tudo depende da finalidade do módulo (e de
como ele foi construído)
RETORNO
O Retorno de um módulo é o valor (ou valores) que o
módulo retorna para o local em que ele foi chamado
Módulos – Sintaxe - Portugol
palavra
funcao
valor de retorno (caso exista) Identificador (nome da função) Parâmetros da função) tipo do retorno da função
Módulos – Sintaxe - Portugol
palavra funcao
NOTE QUE ESSA FUNÇÃO NÃO TEM RETORNO Identificador (nome da função)
Módulos – Sintaxe - Portugol
Sempre dentro das chaves, para Delimitar o BLOCO do módulo
EXECUÇÃO E CHAMADA
DOS MÓDULOS
Módulos – Execução de um Módulo
A chamada (ou ativação) de um módulo, representa a
execução das ações contidas nele, em seguida a
execução retorna para a instrução seguindo ao ponto
da sua chamada (que poderá ser o módulo principal ou
noutros módulos)
Não existe ordem para a definição dos módulos
Quem determina a execução de um MÓDULO (ou
função) é a sua chamada.
Módulos – Execução (chamada)
O módulo principal
(função início)
É o primeiro a ser chamado quando um
programa é executado
Os outros módulos são ativados (executados)
toda vez que forem chamados (pelo nome)
A chamada de um módulo deve respeitar sua
definição (nome, parâmetros, etc)
Note as chamadas à função
SOMA_VETOR
: passando dois
parâmetros e atribuindo o valor do
retorno
para somaA e somaB
Note as chamadas à função
IMPRIME_VETOR
: passando dois
parâmetros. Não há atribuição pois a função
não retorna
nada!
Módulos – Execução de um Módulo
Qualquer função pode chamar outra função.
Um módulo pode chamar ele próprio?
Escreva um programa para exibir o peso ideal de uma pessoa utilizando a formula a seguir:
Problema
Masculino: 72.7 x altura – 58
Feminino: 62.1 x altura – 44.7
A entrada e saída de dados poderá ser feito no módulo principal
(função início). No entanto, o calculo do peso ideal deve ser feito em uma função específica.
Escreva um programa para exibir o peso ideal de uma pessoa utilizando a formula a seguir:
Problema
SAÍDA:
peso ideal
Masculino: 72.7 x altura – 58
Feminino: 62.1 x altura – 44.7
A entrada e saída de dados poderá ser feito no módulo principal
(função início). No entanto, o calculo do peso ideal deve ser feito em uma função específica.
Escreva um programa para exibir o peso ideal de uma pessoa utilizando a formula a seguir:
Problema
SAÍDA:
peso ideal
Masculino: 72.7 x altura – 58
Feminino: 62.1 x altura – 44.7
A entrada e saída de dados poderá ser feito no módulo principal
(função início). No entanto, o calculo do peso ideal deve ser feito em uma função específica.
Solução
A entrada e saída de dados poderá ser feito no módulo principal
(função início). No entanto, o calculo do peso ideal deve ser feito em uma função específica.
Construção da Função
A entrada e saída de dados poderá ser feito no módulo principal
(função início). No entanto, o calculo do peso ideal deve ser feito em uma função específica.
Masculino: 72.7 x altura – 58
Feminino: 62.1 x altura – 44.7
Para construir o módulo (função) precisamos:
1.
Definir identificador (nome da função)
2.
Definir os parâmetros (tipo e nome), se necessário
Construção da Função
Masculino: 72.7 x altura – 58
Feminino: 62.1 x altura – 44.7
1.
Definir identificador (nome da função)
Calcula_Peso_Ideal
2.
Definir os parâmetros (tipo e nome), se necessário
A função precisa receber o SEXO e ALTURA por parâmetro (já que eles foram lidos fora da função)
3.
Definir tipo do retorno, se necessário
Construção da Função
Masculino: 72.7 x altura – 58
Construção da Função
Masculino: 72.7 x altura – 58
Solução Completa
Blocos
Um BLOCO é delimitado por um par de chaves
{ }
Um BLOCO define o ESCOPO das variáveis.
A variável só existe dentro do “bloco” em que
Módulos – Escopo
LOCAL
Escopo local – VARIÁVEL existe somente no
módulo em que foi declarada.
Quando a execução do módulo (função) é
finalizada a variável é “liberada” (da memória) e
os valores perdidos.
Caso os valores devam “sair” da função (antes
de serem perdidos) eles precisam ser
Escopo Global
Escopo global – são variáveis que podem ser utilizadas
nos módulos em que foram declaradas e também nos
módulos internos aos módulos que foram declarados
Evitem utilizar variáveis globais!
Ocupam mais espaço de memória, pois ocupam a
memória enquanto o programa estiver sendo
executado
PASSAGEM DE PARÂMETRO POR VALOR
Ocorre a passagem do VALOR (conteúdo) para a
variável correspondente na função, por correspondência
de posição: o primeiro valor é passado para a primeira
variável, o segundo valor é passado para a segunda
posição, e assim por diante
Caso haja alterações no parâmetro correspondente
(dentro da função) essas
mudanças
são perdidas
(a não
ser que os valores sejam retornados).
PASSAGEM DE PARÂMETRO POR REFERÊNCIA
Ocorre a passagem do
ENDEREÇO
da variável (e não
apenas o conteúdo). É criado uma CONEXÃO entre as
variáveis correspondentes.
Caso haja alterações no parâmetro correspondente
(dentro da função) essas mudanças alteram a variável
passada por parâmetro (similar a um “retorno”)
NO PORTUGOL STUDIO a passagem de parâmetros
por REFERÊNCIA é feita colocando-se um
&
antes do
nome da variável
PASSAGEM DE PARÂMETRO POR REFERÊNCIA
Note que na função Leitura_Vetor o
primeiro parâmetro usa o & pois o
VETOR é modificado dentro da função e
essa modificação precisa ser refletida
fora da função
PASSAGEM DE PARÂMETRO POR VALOR
Note que na função Imprime_Vetor a passagem é
feita por VALOR (sem o &) pois a função NÃO
Coisas para recordar
Obrigatório existir um módulo principal
O módulo principal é criado automaticamente
Para criar seus módulos você precisa pensar:
No objetivo do módulo
Identificador
Número e tipo de parâmetros
Valor de retorno
Coisas para não esquecer
Um bloco é delimitado pelos CHAVES { e }.
Uma variável que é declarada dentro de um módulo é
chamada de
variável local
e existe apenas dentro do
módulo.
O módulo fica na memória durante a sua execução sendo
destruido quando última instrução é executada (ou após
um retorne).
Uma variável criada fora de qualquer módulo é chamada
de
variável global
.
A variável global existe dentro de qualquer módulo criado
dentro do programa.
AGORA É
Modularização – Exercício
Escreva a função
Valida_Inteiro para solicitar um número
inteiro e validá-lo de forma que o mesmo esteja dentro de
um intervalo. Os limites do intervalo serão passados por
parâmetro. Escreva também a função principal (início) para
fazer a chamada da função com os seguintes valores:
Valida_Inteiro (0, 100) // aceitar valores entre 0 e 100
Valida_Inteiro (-50, 50) // aceitar valores entre -50 e 50
Atenção: A comunicação dos valores entre a função e o meio externo dever ser