Baixe o app para aproveitar ainda mais
Prévia do material em texto
Universidade Federal da Grande Dourados Faculdade de Ciências Exatas e de Tecnologias Curso de Bacharelado em Sistemas de Informação Algoritmos Modularidade (2) Profª Janne Oeiras Lachi 1 Plano de aula ` Variáveis globais e locais ` Passagem de parâmetro: por valor e por referência ` Parâmetros formais e reais Exemplo 1: Quais são as variáveis usadas neste algoritmo? programa EXEMPLO2 função DOBRO (v: real): real início DOBRO Å v*2 fim var i: inteiro n, res: real início para i de 1 ate 3 passo 1 faça escreva “Informe um numero” leia n res Å DOBRO(n) escreva “O dobro eh: ”, res fim_para fim Exemplo 1: Quais são as variáveis usadas neste algoritmo? programa EXEMPLO2 função DOBRO (v: real): real início DOBRO Å v*2 fim var i: inteiro n, res: real início para i de 1 ate 3 passo 1 faça escreva “Informe um numero” leia n res Å DOBRO(n) escreva “O dobro eh: ”, res fim_para fim Escopo de variáveis ` O escopo de uma variável, ou sua abrangência operacional, está vinculado à forma de sua visibilidade no algoritmo em relação aos subprogramas que o compõem. ` Visibilidade neste contexto quer dizer quais partes de seu algoritmo podem ver ou usar uma variável ` Normalmente, toda variável tem um alcance global: uma vez definida, cada parte do seu algoritmo pode acessá-la. Exemplo 1: Quais são as variáveis usadas neste algoritmo? programa EXEMPLO2 função DOBRO (v: real): real início DOBRO Å v*2 fim var i: inteiro n, res: real início para i de 1 ate 3 passo 1 faça escreva “Informe um numero” leia n res Å DOBRO(n) escreva “O dobro eh: ”, res fim_para fim Entenderemos que v somente é vista dentro da função DOBRO Entenderemos que i, n e res somente são vistas dentro do algoritmo principal Escopo de variáveis ` Agora estamos estudando modularização. Nesse contexto é muito útil ser capaz de limitar o escopo de uma variável de modo que ela seja visível somente DENTRO de um subprograma ` Dessa forma, as mudanças dentro do subprograma não podem afetar o algoritmo principal de forma inesperada. Escopo de variáveis ` O escopo de uma variável, ou sua abrangência operacional, está vinculado à forma de sua visibilidade no algoritmo em relação aos subprogramas que o compõem. ` Variáveis Locais: quando são declaradas dentro de um subprograma e, portanto, são válidas somente dentro dele. O algoritmo principal e outros subprogramas não conseguem “enxergá-la” ou saber da sua existência. ` Variáveis Globais: quando são declaradas no início de um algoritmo antes de um conjunto de subprogramas. Têm o escopo visível por todos os subprogramas subordinados à rotina chamadora. Exemplo 1: escopo de variáveis locais programa EXEMPLO2 função DOBRO (v: real): real início DOBRO Å v*2 fim var i: inteiro n, res: real início para i de 1 ate 3 passo 1 faça escreva “Informe um numero” leia n res Å DOBRO(n) escreva “O dobro eh: ”, res fim_para fim v somente é vista dentro da função DOBRO. Portanto é uma variável local É como se v fosse declarada dentro da função. Por isso somente é vista SOMENTE dentro dela. Exemplo 1: escopo de variáveis locais programa EXEMPLO2 função DOBRO (v: real): real início DOBRO Å v*2 fim var i: inteiro n, res: real início para i de 1 ate 3 passo 1 faça escreva “Informe um numero” leia n res Å DOBRO(n) escreva “O dobro eh: ”, res fim_para fim i, n e res estão declaradas após a função DOBRO. Por isso que são vistas somente dentro do algoritmo principal. A função DOBRO não tem acesso a elas. E elas são locais ao algoritmo principal Exemplo em Português estruturado programa CALCULADORA() procedimento ROTSOMA var R1, A1, B1 : real início escreva “Rotina de Adição” escreva “Entre o 1º. Valor:” leia A1 escreva “Entre o 2º. Valor:” leia B1 R1 Å A1 + B1 escreva “O resultado da adição é:”, R1 fim procedimento ROTSUBTRACAO() var R2, A2, B2 : real início escreva “Rotina de Subtração” escreva “Entre o 1º. Valor:” leia A2 escreva “Entre o 2º. Valor:” leia B2 R2 Å A2 - B2 escreva “O resultado da subtração é:”, R2 fim Variáveis locais, pois foram declaradas DENTRO dos procedimentos Exemplo em Português estruturado procedimento ROTMULTIPLICACAO() var R3, A3, B3 : real início escreva “Rotina de Multiplicação” escreva “Entre o 1º. Valor:” leia A3 escreva “Entre o 2º. Valor:” leia B3 R3 Å A3 * B3 escreva “O resultado da multiplicação é:”, R3 fim procedimento ROTDIVISAO() var R4, A4, B4 : real início escreva “Rotina de Divisão” escreva “Entre o 1º. Valor:” leia A4 escreva “Entre o 2º. Valor:” leia B4 se (B4 = 0) então escreva “Erro: divisão por zero!” senão R4 Å A4 / B4 escreva “O resultado da divisão é:”, R4 fim_se fim Variáveis locais, pois foram declaradas DENTRO dos procedimentos Exemplo em Português estruturado programa CALCULADORA procedimento ROTSOMA ... fim procedimento ROTSUBTRACAO ... fim procedimento ROTMULTIPLICACAO ... fim procedimento ROTDIVISAO ... fim var OPCAO: inteiro início OPCAO Å 0 enquanto (OPCAO <> 5) faça escreva “1. Adição” escreva “2. Subtração” escreva “3. Multiplicação” escreva “4. Divisão” escreva “5. Sair do algoritmo” escreva “Escolha uma opção:” leia OPCAO Variável local, pois foi declarada DEPOIS dos procedimentos. Os procedimentos ROTSOMA. ROTSUBTRACAO, ROTMULTIPLICACAO e ROTDIVISAO não tem acesso ao seu conteúdo. Exemplo em Português estruturado programa CALCULADORA var OPCAO: inteiro procedimento ROTSOMA() ... fim procedimento ROTSUBTRACAO() ... fim procedimento ROTMULTIPLICACAO() ... fim procedimento ROTDIVISAO() ... fim início OPCAO Å 0 enquanto (OPCAO <> 5) faça escreva “1. Adição” escreva “2. Subtração” escreva “3. Multiplicação” escreva “4. Divisão” escreva “5. Sair do algoritmo” escreva “Escolha uma opção:” leia OPCAO Se fosse declarada aqui, ANTES dos procedimentos, a variável OPCAO seria uma variável do tipo GLOBAL, isto é, seu conteúdo poderia ser acessado por todos os procedimentos definidos no algoritmo. Escopo de variáveis ` Quando utilizamos módulos, as variáveis no nosso algoritmo como um todo (algoritmo principal + módulos) podem ser de dois tipos: ` Locais ou Privadas ` Exemplo: nas sub-rotinas temos as variáveis R1, R2, R3, R4, A1, A2, A3, A4, B1, B2, B3, B4 e OPCAO ` Globais ou Públicas ` No exemplo dado não há variáveis globais. Escopo de variáveis: exemplo ` Desenvolver um algoritmo que leia dois valores do tipo inteiro para armazenamento nas variáveis A e B. Efetuar a troca dos valores de forma que a variável A passe a possuir o valor da variável B e vice-versa. Apresentar os valores das variáveis A e B após a troca. programa TROCA var A, B, T : inteiro início leia A, B T Å A A Å B B Å T escreva A, B fim Espaços ocupados por variáveis ` As três variáveis (A, B e T) são criadas com escopo global no exemplo, pois podem ser acessadas de qualquer parte do algoritmo. ` Variáveis globais permanecem “vivas” até o final da execução do algoritmo. ` As variáveis A e B são usadas na fase de entrada e saída. ` Note que a variável T é usada apenas na operação de processamento. O espaço de memória reservado para T poderia, portanto, ficar parcialmente livre. Repensando o uso de memória programa TROCA_2 var A, B : inteiro procedimento TROCA_VARS( ) var T: inteiro início T Å A A Å B B Å T fim início leia A, B TROCA_VARS( ) escreva A, B fim Variáveis globais Variável local O espaço de memória alocado para A e B ficam ocupados enquanto o algoritmo é executado. Já o espaço de memória paraa variável T é alocado quando a sub- rotina é chamada e desalocado quando a sub-rotina acaba. Repensando o uso de memória programa TROCA_2 var A, B : inteiro procedimento TROCA_VARS( ) var T: inteiro início T Å A A Å B B Å T fim início leia A, B TROCA_VARS( ) escreva A, B fim Memória A 1 B 2 T e m p o d e e x e c u ç ã o Memória A 1 2 B 2 1 T 1 Memória A 1 B 2 T Memória A 2 B 1 T 1 Memória A 2 B 1 T 1 Memória A 1 B 2 T 1 Economia de memória do computador ` As variáveis existem apenas enquanto o seu subprograma existir. ` Variáveis globais devem ser criadas somente quando devem ser acessadas por mais de um subprograma. Escopo de variáveis: exemplo W Y X Rotina principal A,B Rotina 1 Rotina 2 Rotina 1.1 Rotina 1.2 Rotina 2.1 A,X M Variáveis globais, visíveis para todas as sub-rotinas Variável A aqui é diferente da declarada anteriormente. W e Y são variáveis locais Variável local para a Rotina 2, mas global em relação à Rotina 2.1 Variável local para a Rotina 2.1. Esta sub- rotina tem acesso às variáveis A, B e M. Escopo de variáveis: exemplo W Y X Rotina principal A,B Rotina 1 Rotina 2 Rotina 1.1 Rotina 1.2 Rotina 2.1 A,X M Memória A B Memória A B A X Memória A B A X W Memória A B A X W Memória A B A X W Y Memória A B A X W Y Escopo de variáveis: exemplo W Y X Rotina principal A,B Rotina 1 Rotina 2 Rotina 1.1 Rotina 1.2 Rotina 2.1 A,X M Memória A B A X W Y Memória A B A M W Y Memória A B A M W X Escopo de variáveis: exemplo W Y X Rotina principal A,B Rotina 1 Rotina 2 Rotina 1.1 Rotina 1.2 Rotina 2.1 A,X M Memória A B A M W X Memória A B A M W X Memória A B A M W X Declaração de variáveis e escopo programa TROCA_2 var A, B : inteiro procedimento TROCA_VARS( ) var T: inteiro início T Å A A Å B B Å T fim início leia A, B TROCA_VARS( ) escreva A, B fim programa TROCA_3 procedimento TROCA_VARS( ) var T: inteiro início T Å A A Å B B Å T fim var A, B : inteiro início leia A, B TROCA_VARS( ) escreva A, B fim A, B são globais, acessíveis por TROCA A, B são locais, NÃO acessíveis por TROCA Declaração de variáveis e escopo (cont.) programa TROCA_4 procedimento TROCA_VARS( ) var T, A, B: inteiro início T Å A A Å B B Å T fim var A, B : inteiro início leia A, B TROCA_VARS( ) escreva A, B fim Declaração de A e B em duas rotinas. NÃO SÃO AS MESMAS VARIÁVEIS. Quando TROCA_VARS for chamada, novas variáveis A e B serão criadas e não serão usados os valores das variáveis A e B declaradas na rotina principal. ERRADO!!! Exemplo 1 programa TROCA_4 procedimento TROCA_VARS( ) var T, A, B: inteiro início T Å A A Å B B Å T fim var A, B : inteiro início leia A, B TROCA_VARS( ) escreva A, B fim O problema neste exemplo é que a pessoa sabe que precisa dos valores de A e B dentro do procedimento para efetuar a troca de valores. A tentativa que ocorreu é incluir essas variáveis dentro do procedimento, mas ao declarar as variáveis A e B, houve um engano porque elas são OUTRAS variáveis, diferentes de A e B. Exemplo 1 Memória A 0 B 3 programa TROCA_4 procedimento TROCA_VARS( ) var T, A, B: inteiro início T Å A A Å B B Å T fim var A, B : inteiro início leia A, B TROCA_VARS( ) escreva A, B fim Lixo de memória Momento em que as variáveis A e B, são alocadas. Usuário digitou os valores 1 e 2. E as variáveis T, A e B foram alocadas.Exemplo 1 programa TROCA_4 procedimento TROCA_VARS( ) var T, A, B: inteiro início T Å A A Å B B Å T fim var A, B : inteiro início leia A, B TROCA_VARS( ) escreva A, B fim Memória A 0 B 3 Memória A 1 B 2 T 3 A 5 B 6 Lixo de memória Exemplo 1 Memória A 0 B 3 programa TROCA_4 procedimento TROCA_VARS( ) var T, A, B: inteiro início T Å A A Å B B Å T fim var A, B : inteiro início leia A, B TROCA_VARS( ) escreva A, B fim Memória A 1 B 2 T 3 A 5 B 6 Memória A 1 B 2 T 5 A 6 B 5 Memória A 1 B 2 T 5 A 6 B 5 Lixo de memória Procedimento faz a troca de valores das variáveis com base no lixo de memória. Exemplo 1 Memória A 1 B 2 programa TROCA_4 procedimento TROCA_VARS( ) var T, A, B: inteiro início T Å A A Å B B Å T fim var A, B : inteiro início leia A, B TROCA_VARS( ) escreva A, B fim Memória A 1 B 2 T 3 A 5 B 6 Memória A 1 B 2 T 5 A 6 B 5 Memória A 1 B 2 T 5 A 6 B 5 Lixo de memória No momento de escrever o resultado, estarão “vivas” as variáveis A e B, ou seja, o resultado na tela não é o esperado. Retomando o problema... programa TROCA_4 procedimento TROCA_VARS( ) var T, A, B: inteiro início T Å A A Å B B Å T fim var A, B : inteiro início leia A, B TROCA_VARS( ) escreva A, B fim Podemos ajeitar este código para que ele funcione utilizando passagem de parâmetros. Passagens de parâmetros ` É um processo que permite estabelecer uma linha de comunicação entre os conteúdos dos trechos de subprogramas e dos trechos de algoritmo que chamam esses subprogramas, principalmente se usam variáveis com escopo local. ` Dois tipos: ` Passagem de parâmetro por valor ` Passagem de parâmetro por referência Passagem de parâmetro por valor ` Ocorre a CÓPIA do conteúdo enviado para uma variável do mesmo tipo daquela que foi enviada, que existirá apenas no procedimento/função. ` Com isso, podem ser feitos processamentos, avaliações e atribuições sem que haja qualquer tipo de alteração na variável que se encontra no algoritmo chamador. Exemplo 1: incluindo parâmetros programa TROCA_4 procedimento TROCA_VARS( ) var T, A, B: inteiro início T Å A A Å B B Å T fim var A, B : inteiro início leia A, B TROCA_VARS( ) escreva A, B fim programa TROCA_4 procedimento TROCA_VARS (A, B: inteiro) var T: inteiro início T Å A A Å B B Å T escreva A, B fim var A, B : inteiro início leia A, B TROCA_VARS(A,B) fim Note em vermelho a inclusão de parâmetros Versão sem parâmetros Exemplo 1: incluindo parâmetros programa TROCA_4 procedimento TROCA_VARS( ) var T, A, B: inteiro início T Å A A Å B B Å T fim var A, B : inteiro início leia A, B TROCA_VARS( ) escreva A, B fim programa TROCA_4 procedimento TROCA_VARS (C, D: inteiro) var T: inteiro início T Å C C Å D D Å T escreva C, D fim var A, B : inteiro início leia A, B TROCA_VARS(A,B) fim Note que poderiam ter outro nome, no caso C e D, já que recebem uma CÓPIA do valor de A e B Sintaxe incluindo parâmetros programa <nome_do_seu_programa> procedimento <nome_do_procedimento> (<lista de parâmetros>) var <variáveis do procedimento> início <instruções do procedimento> fim var <variáveis do seu programa> início <instruções> <sub-rotina> <instruções> fim Nesta lista, defina os parâmetros e o tipo deles. Ex.: (a: logico, b,c: real) (x, y: inteiro, w: real, z: caractere) Tipos de parâmetros ` Temos dois tipos: ` Formal: são aqueles utilizados na criação do procedimento para definir a sua lista de parâmetros ` Real: são aqueles que aparecem na chamada do procedimento ` Servem para fazer passar dados entre a sub-rotina e a rotina principal Exemplo 1: incluindoparâmetros programa TROCA_4 procedimento TROCA_VARS (A, B: inteiro) var T: inteiro início T Å A A Å B B Å T escreva A, B fim var A, B : inteiro início leia A, B TROCA_VARS(A,B) fim Parâmetros formais Parâmetros reais Exemplo 1: passagem por valor programa TROCA_4 procedimento TROCA_VARS (A, B: inteiro) var T: inteiro início T Å A A Å B B Å T escreva A, B fim var A, B : inteiro início leia A, B TROCA_VARS(A,B) fim Recebem uma cópia de A e B Memória A 1 B 2 A 1 B 2 T 4 Após ler os valores de A e B, chamamos o procedimento TROCA_VARS passando os valores de A e B Exemplo 1: passagem por valor programa TROCA_4 procedimento TROCA_VARS (A, B: inteiro) var T: inteiro início T Å A A Å B B Å T escreva A, B fim var A, B : inteiro início leia A, B TROCA_VARS(A,B) fim Memória A 1 B 2 A 1 B 2 T 4 Memória A 1 B 2 A 1 2 B 2 1 T 1 Memória após a troca Exemplo 1: passagem por valor programa TROCA_4 procedimento TROCA_VARS (A, B: inteiro) var T: inteiro início T Å A A Å B B Å T escreva A, B fim var A, B : inteiro início leia A, B TROCA_VARS(A,B) fim Note que a escrita dos valores é feita dentro do procedimento. Memória A 1 B 2 A 2 B 1 T 1 Exemplo 1: observação programa TROCA_4 procedimento TROCA_VARS (A, B: inteiro) var T: inteiro início T Å A A Å B B Å T escreva A, B fim var A, B : inteiro início leia A, B TROCA_VARS(A,B) fim Precisa escrever aqui dentro porque estamos trabalhando com um procedimento e não temos como mandar de volta os valores para o algoritmo principal escrevê-los. Memória A 1 B 2 A 2 B 1 T 1 Exemplo 1: observação programa TROCA_4 procedimento TROCA_VARS (A, B: inteiro) var T: inteiro início T Å A A Å B B Å T escreva A, B fim var A, B : inteiro início leia A, B TROCA_VARS(A,B) fim Precisa escrever aqui dentro porque estamos trabalhando com um procedimento e não temos como mandar de volta os valores para o algoritmo principal. programa TROCA_4 procedimento TROCA_VARS (A, B: inteiro) var T: inteiro início T Å A A Å B B Å T fim var A, B : inteiro início leia A, B TROCA_VARS(A,B) escreva A, B fim Como é feita a cópia, se você escrever dentro da rotina principal, serão impressos os valores originais. Memória A 1 B 2 A 2 B 1 T 1 Exemplo 1: passagem por valor programa TROCA_4 procedimento TROCA_VARS (A, B: inteiro) var T: inteiro início T Å A A Å B B Å T fim var A, B : inteiro início leia A, B TROCA_VARS(A,B) escreva A, B fim Memória A 1 B 2 A 1 B 2 T 4 Se você deixar para escrever dentro do algoritmo principal neste exemplo, após a chamada do procedimento, as variáveis A e B do algoritmo principal não mudaram de valor e são esses valores que o algoritmo principal tem acesso para imprimir. Memória A 1 B 2 A 1 2 B 2 1 T 1 Memória A 1 B 2 A 2 B 1 T 1 Exemplo 1: observação programa TROCA_4 procedimento TROCA_VARS (A, B: inteiro) var T: inteiro início T Å A A Å B B Å T TROCA_VARS Å A, B fim var A, B : inteiro início leia A, B escreva TROCA_VARS(A,B) fim ERRADO!!! 1) Procedimento NÃO retorna valor. 2) Se fosse uma função estaria errado do mesmo jeito porque está tentando retornar 2 valores! Exercício 1 ` O procedimento abaixo está escrito corretamente? procedimento imprimeMenor (x,y: inteiro) início se (a < b) então escreva a senão escreva b fim_se fim Os parâmetros são x e y. Aqui deveria ser usado x e y em todo o procedimento. Exercício 1 ` O procedimento abaixo está escrito corretamente? procedimento imprimeMenor (a, b) início se (a < b) então escreva a senão escreva b fim_se fim Faltam os tipos dos parâmetros. O correto seria (a, b: inteiro) Exercício 1 ` O procedimento abaixo está escrito corretamente? procedimento imprimeMenor (a,b: inteiro) início se (a < b) então imprimeMenor Å a senão imprimeMenor Å b fim_se fim Procedimento não retorna valor! Exercício 1 ` O procedimento abaixo está escrito corretamente? procedimento imprimeMenor (a,b: inteiro) var a, b: inteiro início se (a < b) então escreva a senão escreva b fim_se fim Redeclarou as variáveis a e b aqui que foram declaradas previamente como parâmetros. Exercício 1 ` O procedimento abaixo está escrito corretamente? procedimento imprimeMenor (a,b: inteiro) início se (a < b) então escreva a senão escreva b fim_se fim Exercício 2 a, b: inteiro leia (a, b) imprimeMenor (inteiro a, inteiro b) ` Qual fragmento de código chama o procedimento do exercício anterior corretamente? a, b: inteiro leia (a, b) imprimeMenor (a, b) a, b: inteiro imprimeMenor (leia (a), leia(b)) imprimeMenor (inteiro x, inteiro y) a, b, menor: inteiro leia (a, b) menor Å imprimeMenor (a, b) Exercício 3 ` Considere o algoritmo a seguir e marque qual será sua saída se as entradas forem 3.14 e 1.54, respectivamente. programa exercício3 procedimento lerDados (x, y: real) início leia x leia y fim var x, y: real início x Å 0.00 y Å 2.34 lerDados (x, y) escreva (“x é: ”, x, “e y é: ”,y) fim a) x é -3.14 e y é 3.88 b) x é 3.14 e y é 2.34 c) x é 3.14 e y é 1.54 d) x é 0.00 e y é 2.34 e) x é 3.14 e y é -1.54 Exemplo 2: passagem por valor programa EXEMPLO2 função FATORIAL (v: inteiro): inteiro var FAT, I: inteiro inicio FAT Å1 se (v > 0) então para I de 1 até v passo 1 faça FAT Å FAT * I fim_para fim_se FATORIAL Å FAT fim var n: inteiro início escreva “Informe um número n>=0:” leia n se (n < 0) então escreva “Numero invalido!” senão escreva “O fatorial de”,n, “eh:”, FATORIAL(n) fim-se fim v recebe uma cópia do valor de n. RESOLUÇÃO COM FUNÇÃO programa EXEMPLO2 procedimento FATORIAL (v: inteiro) var FAT, I: inteiro inicio FAT Å1 se (v > 0) então para I de 1 até v passo 1 faça FAT Å FAT * I fim_para fim_se escreva “O fatorial de”,v, “eh:”, FAT fim var n: inteiro início escreva “Informe um número n>=0:” leia n se (n < 0) então escreva “Numero invalido!” senão FATORIAL(n) fim-se fim v recebe uma cópia do valor de n. RESOLUÇÃO COM PROCEDIMENTO Exemplo 2: passagem por valor programa EXEMPLO2 procedimento FATORIAL (v: inteiro) var FAT, I: inteiro inicio FAT Å1 se (v > 0) então para I de 1 até v passo 1 faça FAT Å FAT * I fim_para fim_se escreva “O fatorial de”,v, “eh:”, FAT fim var n: inteiro início escreva “Informe um número n>=0:” leia n se (n < 0) então escreva “Numero invalido!” senão FATORIAL(n) fim-se fim Precisa imprimir aqui dentro porque FAT é local e não é acessível pelo algoritmo principal para ser impressa nele. Não é uma boa prática. Melhor a resolução com função. Exemplo 2: passagem por valor Passagem de parâmetro por referência ` Não existe cópia do conteúdo. É enviada a referência de onde a variável da rotina chamadora se encontra. ` Com isso, qualquer alteração na variável na sub-rotina refletirá em alterações na variável da rotina chamadora. Exemplo 1: vamos usar passagem por referência para resolver este problema programa TROCA_4 procedimento TROCA_VARS (A, B: inteiro) var T: inteiro início T Å A A Å B B Å T escreva A, B fim var A, B : inteiro início leia A, B TROCA_VARS(A,B) fim Precisa escrever aqui dentro porque estamos trabalhando com um procedimento e não temos como mandar de volta os valores para o algoritmo principal. programa TROCA_4 procedimento TROCA_VARS(A, B: inteiro) var T: inteiro início T Å A A Å B B Å T fim var A, B : inteiro início leia A, B TROCA_VARS(A,B) escreva A, B fim Como é feita a cópia, se você escrever dentro da rotina principal, serão impressos os valores originais. Memória A 1 B 2 A 2 B 1 T 1 ERRADO Exemplo 1: vamos usar passagem por referência para resolver este problema programa TROCA_4 procedimento TROCA_VARS (var A, var B: inteiro) var T: inteiro início T Å A A Å B B Å T fim var A, B : inteiro início leia A, B TROCA_VARS(A,B) escreva A, B fim Em Português estruturado um parâmetro passado por referência será identificado pelo uso da palavra var antes de seu nome Exemplo 1: entendendo o que ocorre na memória programa TROCA_4 procedimento TROCA_VARS (var A, var B: inteiro) var T: inteiro início T Å A A Å B B Å T fim var A, B : inteiro início leia A, B TROCA_VARS(A,B) escreva A, B fim Memória Endere ço Nome da variável Valor 100 A 1 110 B 2 120 A 100 130 B 110 140 T 1 Cada variável possui um endereço de memória. Quando passamos um parâmetro por referência, estamos passando o ENDEREÇO da variável e não o seu valor. Exemplo 1: entendendo o que ocorre na memória programa TROCA_4 procedimento TROCA_VARS (var A, var B: inteiro) var T: inteiro início T Å A A Å B B Å T fim var A, B : inteiro início leia A, B TROCA_VARS(A,B) escreva A, B fim Memória Endere ço Nome da variável Valor 100 A 1 110 B 2 120 A 100 130 B 110 140 T 1 Quando o procedimento for executado neste trecho, a troca de valores ocorrerá no endereço indicado pelos parâmetros Exemplo 1: entendendo o que ocorre na memória programa TROCA_4 procedimento TROCA_VARS (var A, var B: inteiro) var T: inteiro início T Å A A Å B B Å T fim var A, B : inteiro início leia A, B TROCA_VARS(A,B) escreva A, B fim Memória Endere ço Nome da variável Valor 100 A 1 110 B 2 120 A 100 130 B 110 140 T 1 Primeiro, T recebe o valor que consta no endereço contido na variável A. Ou seja, A contém o endereço 100, e nesse endereço consta o valor 1. então T, recebe o valor 1. Exemplo 1: entendendo o que ocorre na memória programa TROCA_4 procedimento TROCA_VARS (var A, var B: inteiro) var T: inteiro início T Å A A Å B B Å T fim var A, B : inteiro início leia A, B TROCA_VARS(A,B) escreva A, B fim Memória Endere ço Nome da variável Valor 100 A 1 2 110 B 2 120 A 100 130 B 110 140 T 1 Depois, o endereço indicado na variável A deve receber o valor contido no endereço indicado pela variável B. Ou seja, A contém o endereço 100 e esse endereço deve receber o valor que está contido no endereço 110 indicado em B, isto é, o valor 2. Exemplo 1: entendendo o que ocorre na memória programa TROCA_4 procedimento TROCA_VARS (var A, var B: inteiro) var T: inteiro início T Å A A Å B B Å T fim var A, B : inteiro início leia A, B TROCA_VARS(A,B) escreva A, B fim Memória Endere ço Nome da variável Valor 100 A 1 2 110 B 2 1 120 A 100 130 B 110 140 T 1 Por fim, o endereço indicado na variável B deve receber o valor contido na variável T. Ou seja,o endereço indicado por B (110) deve receber o valor que está contido em T, isto é, o valor 1. Exemplo 1: entendendo o que ocorre na memória programa TROCA_4 procedimento TROCA_VARS (var A, var B: inteiro) var T: inteiro início T Å A A Å B B Å T fim var A, B : inteiro início leia A, B TROCA_VARS(A,B) escreva A, B fim Memória Endere ço Nome da variável Valor 100 A 1 2 110 B 2 1 120 A 100 130 B 110 140 T 1 Agora sim, podemos escrever os valores de A e B aqui no final do algoritmo principal. Exemplo 2: passagem de parâmetro por referência ` Escreva um procedimento chamado media que receba como parâmetros a média final de 5 alunos e calcule a maior e a menor média. Atenção: esse resultado não deve ser escrito dentro do procedimento. Use passagem de parâmetros por referência para que o seu programa principal possa escrever a maior e a menor nota. Solução sem procedimento programa EXEMPLO1 var media, maior, menor: real i: inteiro início escreva “Informe a 1ª media:” leia media maior Å media menor Å media para i de 2 ate 5 passo 1 faça escreva “Informe a”, i, “ª media:” leia media se (media < menor) então menor Å media fim_se se (media > maior) então maior Å media fim_se fim_para escreva “A maior media eh:”, maior escreva “A menor media eh:”, menor fim Solução COM procedimento programa EXEMPLO2 procedimento maior_menor () inicio fim var media, maior, menor: real i: inteiro início escreva “Informe a 1ª media:” leia media maior Å media menor Å media para i de 2 ate 5 passo 1 faça escreva “Informe a”, i, “ª media:” leia media se (media < menor) então menor Å media fim_se se (media > maior) então maior Å media fim_se fim_para escreva “A maior media eh:”, maior escreva “A menor media eh:”, menor fim Vamos criar o corpo principal do procedimento. Solução COM procedimento ` Escreva um procedimento chamado media que receba como parâmetros a média final de 5 alunos e calcule a maior e a menor média. Atenção: esse resultado não deve ser escrito dentro do procedimento. Use passagem de parâmetros por referência para que o seu programa principal possa escrever a maior e a menor nota. Note que o enunciado do problema diz que é para calcular a maior e a menor média e que elas devem ser escritas dentro do ALGORITMO PRINCIPAL. Ou seja, já sabemos que vamos ter que usar passagem de PARÂMETROS POR REFERÊNCIA porque não é possível usar uma função para retornar os 2 valores solicitados. Solução COM procedimento programa EXEMPLO2 procedimento maior_menor () inicio escreva “Informe a 1ª media:” leia media maior Å nota menor Å nota para i de 2 ate 5 passo 1 faça escreva “Informe a”, i, “ª media:” leia media se (media < menor) então menor Å media fim_se se (media > maior) então maior Å media fim_se fim_para fim var media, maior, menor: real i: inteiro início escreva “A maior media eh:”, maior escreva “A menor media eh:”, menor fim Copiamos para o corpo principal do procedimento o trecho que estava no algoritmo principal. Solução COM procedimento programa EXEMPLO2 procedimento maior_menor () var media: real i: inteiro inicio escreva “Informe a 1ª media:” leia media maior Å media menor Å media para i de 2 ate 5 passo 1 faça escreva “Informe a”, i, “ª media:” leia media se (media < menor) então menor Å media fim_se se (media > maior) então maior Å media fim_se fim_para fim var media, maior, menor: real i: inteiro início escreva “A maior media eh:”, maior escreva “A menor media eh:”, menor fim Vamos declarar a variável média dentro do procedimento. Também vamos declarar a variável i que está sendo usada somente dentro do procedimento Solução COM procedimento programa EXEMPLO2 procedimento maior_menor (var maior, var menor: real) var media: real i: inteiro inicio . . . fim var maior, menor: real início maior_menor(maior, menor) escreva “A maior media eh:”, maior escreva “A menor media eh:”, menor fim Vamos chamar dentro do algoritmo principal o procedimento media e passar por referência as variáveis menor e maior. Vamos também definir os parâmetros formais do procedimento. Exercício 4 programa EXEMPLO2 procedimento maior_menor (var maior, var menor: real) var media:real i: inteiro inicio escreva “Informe a 1ª media:” leia media maior Å media menor Å media para i de 2 ate 5 passo 1 faça escreva “Informe a”, i, “ª media:” leia media se (media < menor) então menor Å media fim_se se (media > maior) então maior Å media fim_se fim_para fim var maior, menor: real início maior_menor(maior, menor) escreva “A maior media eh:”, maior escreva “A menor media eh:”, menor fim Execute o algoritmo mostrando a alocação e desalocação de variáveis na memória. Suponha que os valores lidos sejam 4.0, 7.0, 5.0, 8.0, 2.0. Suponha que as variáveis maior e menor no algoritmo principal tenham o endereço 100 e 110 respectivamente. Exercício 5 programa EXEMPLO2 procedimento maior_menor (var maior, var menor: real) var media: real i: inteiro inicio escreva “Informe a 1ª media:” leia media maior Å media menor Å media para i de 2 ate 5 passo 1 faça escreva “Informe a”, i, “ª media:” leia media se (media < menor) então menor Å media fim_se se (media > maior) então maior Å media fim_se fim_para fim var maior, menor: real início maior_menor(maior, menor) escreva “A maior media eh:”, maior escreva “A menor media eh:”, menor fim Modifique este algoritmo e utilize uma função no lugar do procedimento. O que deve mudar? Como ficaria a passagem de parâmetros? Exercício 5: possível solução programa EXEMPLO2 função maior_menor (var menor: real):real var maior, media: real i: inteiro inicio escreva “Informe a 1ª media:” leia media maior Å media menor Å media para i de 2 ate 5 passo 1 faça escreva “Informe a”, i, “ª media:” leia media se (media < menor) então menor Å media fim_se se (media > maior) então maior Å media fim_se fim_para maior_menor Å maior fim var menor: real início escreva “A maior media eh:”, maior_menor(menor) escreva “A menor media eh:”, menor fim Vantagens da modularização ` Evitar que blocos de programa fiquem grande demais e, consequentemente, mais difíceis de entender; ` Separar o programa em partes logicamente compreendidas de forma isolada; ` Permitir reaproveitamento de código, evitando “copy / paste” de trechos bem similares; ` Evitar que trechos idênticos sejam repetidos inúmeras vezes, minimizando os erros e facilitando futuras alterações. Referências ` Algoritmos – Fundamento e Prática. Everton Coimbra de Araújo. Florianópolis: Visual Book, 2007. ` Algoritmos - Lógica para desenvolvimento de programação de computadores. José Augusto N. G. Manzano, Jayr Figueiredo de Oliveira. São Paulo: Érica, 2006. 77 Algoritmos Plano de aula Exemplo 1: Quais são as variáveis usadas neste algoritmo? Exemplo 1: Quais são as variáveis usadas neste algoritmo? Escopo de variáveis Exemplo 1: Quais são as variáveis usadas neste algoritmo? Escopo de variáveis Escopo de variáveis Exemplo 1: escopo de variáveis locais Exemplo 1: escopo de variáveis locais Exemplo em Português estruturado Exemplo em Português estruturado Exemplo em Português estruturado Exemplo em Português estruturado Escopo de variáveis Escopo de variáveis: exemplo Espaços ocupados por variáveis Repensando o uso de memória Repensando o uso de memória Economia de memória do computador Escopo de variáveis: exemplo Escopo de variáveis: exemplo Escopo de variáveis: exemplo Escopo de variáveis: exemplo Declaração de variáveis e escopo Declaração de variáveis e escopo (cont.) Exemplo 1 Exemplo 1 Exemplo 1 Exemplo 1 Exemplo 1 Retomando o problema... Passagens de parâmetros Passagem de parâmetro por valor Exemplo 1: incluindo parâmetros Exemplo 1: incluindo parâmetros Sintaxe incluindo parâmetros Tipos de parâmetros Exemplo 1: incluindo parâmetros Exemplo 1: passagem por valor Exemplo 1: passagem por valor Exemplo 1: passagem por valor Exemplo 1: observação Exemplo 1: observação Exemplo 1: passagem por valor Exemplo 1: observação Exercício 1 Exercício 1 Exercício 1 Exercício 1 Exercício 1 Exercício 2 Exercício 3 Exemplo 2: passagem por valor Passagem de parâmetro por referência Exemplo 1: vamos usar passagem por referência para resolver este problema Exemplo 1: vamos usar passagem por referência para resolver este problema Exemplo 1: entendendo o que ocorre na memória Exemplo 1: entendendo o que ocorre na memória Exemplo 1: entendendo o que ocorre na memória Exemplo 1: entendendo o que ocorre na memória Exemplo 1: entendendo o que ocorre na memória Exemplo 1: entendendo o que ocorre na memória Exemplo 2: passagem de parâmetro por referência Solução sem procedimento Solução COM procedimento Solução COM procedimento Solução COM procedimento Solução COM procedimento Solução COM procedimento Exercício 4 Exercício 5 Exercício 5: possível solução Vantagens da modularização Referências
Compartilhar