Módulos ou Subrotinas: PARTE II Criando seus próprios módulos
Objetivos da Aula Compreender a necessidade e a importância de modularizar Aprender a criar e utilizar (chamar) seus próprios módulos
Refletindo... Bacharelado em Ciência e Tecnologia Até o momento temos escrito nossos programas no PortugolStudio de maneira sequencial dentro da função início
Refletindo... Bacharelado em Ciência e Tecnologia À 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
Problema 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 DE DADOS?
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 Mostrar os elementos de A e B que são acima da média de ambos ENTRADA DE DADOS: os vetores A e B
SOLUÇÃO 1
DECLARAÇÃO DE VARIÁVEIS E ENTRADA DE DADOS
PROCESSAMENTO [1]: - Obter e exibir a soma dos elementos do vetor A - Obter e exibir a soma dos elementos do vetor B 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.
PROCESSAMENTO [2] - 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 [3] Mostrar os elementos de A e B que são acima da média de ambos
SOLUÇÃO COMPLETA (53 LINHAS DE PROGRAMA)
SOLUÇÃO COMPLETA (53 LINHAS DE PROGRAMA)
SOLUÇÃO COMPLETA
Análise da Solução Bacharelado em Ciência e Tecnologia 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.
ANÁLISE DA SOLUÇÃO Bacharelado em Ciência e Tecnologia 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 escrever os módulos (funções)
Modularizando Primeiro, vamos pegar cada trecho específico, um a um, e transformá-lo numa função Comecemos pela ENTRADA DE DADOS
MODULARIZANDO A ROTINA LEITURA VETOR
Modularizando ENTRADA DE DADOS O que difere entre os dois trechos é apenas a variável do leia
Modularizando ENTRADA DE DADOS 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.
Modularizando - ENTRADA DE DADOS 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 SOMA VETOR
Modularizando SOMA VETOR O que difere os dois trechos?
Modularizando SOMA VETOR 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.
Modularizando - SOMA VETOR 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 IMPRIME VETOR
Modularizando IMPRIME VETOR O que difere os dois trechos?
Modularizando IMPRIME VETOR 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.
Modularizando - IMPRIME VETOR 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 IMPRIME ACIMA MEDIA
Modularizando IMPRIME ACIMA DA MÉDIA O que difere os dois trechos?
Modularizando IMPRIME ACIMA DA MÉDIA 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.
Modularizando - IMPRIME ACIMA DA MÉDIA 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
SOLUÇÃO COMPLETA
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 (E REUSADAS)
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 funções de usuário
Módulos - Sintaxe Sintaxe parecida com O módulo principal 4- Parênteses com parâmetros (caso exista) 3- Identificador (obrigatório) 1- Palavra funcao (obrigatório) 2- Valor de retorno (caso exista)
PARÂMETROS Bacharelado em Ciência e Tecnologia 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) (2) PARÂMETROS
RETORNO O Retorno de um módulo é o valor (ou valores) que o módulo retorna para o local em que ele foi chamado (3) RETORNO
Módulos Sintaxe - Portugol palavra funcao tipo do retorno da função Identificador (nome da função) Parâmetros da função) valor de retorno (caso exista)
Módulos Sintaxe - Portugol palavra funcao Identificador (nome da função) Parâmetros da função) NOTE QUE ESSA FUNÇÃO NÃO TEM RETORNO
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)
Modularização - CHAMADA Note as chamadas à função SOMA_VETOR: passando dois parâmetros e atribuindo o valor do retorno para somaa e somab
Modularização - CHAMADA 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? Recursividade! Fora do escopo da disciplina
EXEMPLO
Problema Escreva um programa para exibir o peso ideal de uma pessoa utilizando a formula a seguir: 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. SAÍDA:???
Problema Escreva um programa para exibir o peso ideal de uma pessoa utilizando a formula a seguir: 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. SAÍDA: peso ideal
Problema Escreva um programa para exibir o peso ideal de uma pessoa utilizando a formula a seguir: 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. SAÍDA: peso ideal ENTRADA: sexo e altura
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 Bacharelado em Ciência e Tecnologia 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 3. Definir tipo do retorno, 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 A função deverá RETORNAR o peso ideal calculado
Construção da Função Masculino: 72.7 x altura 58 Feminino: 62.1 x altura 44.7
Construção da Função Masculino: 72.7 x altura 58 Feminino: 62.1 x altura 44.7
Solução Completa CHAMADA DA FUNÇÃO
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 ela foi declarada.
Módulos Escopo LOCAL Bacharelado em Ciência e Tecnologia 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 RETORNADOS: retorne
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 Dê preferência pelas variáveis locais!
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). ESSA É A PASSAGEM DE PARÂMETRO PADRÃO!
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 modifica o conteúdo do vetor
Coisas para recordar Bacharelado em Ciência e Tecnologia 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 É PRATICAR!!!
Exercícios
Modularização Exercício Bacharelado em Ciência e Tecnologia 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 feita por passagem de parâmetros (e não por variáveis globais)