Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 UNIDADE 4: SUBROTINAS 4.1 Conceitos de Modularização 2 Modularização de Algoritmos • Para o ser humano é difícil descrever, em um processo completo, todas as instruções mais detalhadas, de forma que se consiga memorizar várias instruções complexas ao mesmo tempo • De outro lado, para o computador, as instruções de um programa (processo completo) devem ser detalhadas a um nível tal que o computador seja capaz de interpretá- las e resolvê-las de maneira adequada Modularização de Algoritmos • A solução para o homem resolver esse tipo de problema é dividir um problema complexo em vários outros subproblemas elementares, de tal forma que o homem consiga assimilá-los com maior facilidade • Procedimentos e Funções são módulos, subprogramas com estrutura própria e com destinação específica 3 4.2, 4.3 Procedimentos, Funções Procedimento • O procedimento (procedure) apenas executa uma ação, sem devolver um valor • Declaração: Procedimento <NOME>(<LISTA_DE_PARÂMETROS>) //declaração dos objetos locais //conjunto de ações Fimprocedimento; 4 Função • A função (function) é semelhante ao procedimento, no entanto se diferencia pela característica de retornar um valor com um tipo associado ‒Uma função deve ser ativada em um contexto de expressão • Declaração: Função <NOME>(<LISTA_DE_PARÂMETROS>): <TIPO> //declaração dos objetos locais //conjunto de ações retorna (<VALOR>|<VARIÁVEL>) Fimfunção; Escopo das Variáveis • Variável global: Todas as variáveis usadas no algoritmo encontram-se declaradas em seu início, o que as torna passíveis de aplicação por qualquer procedimento ou função integrante • Variável local: Em alguns casos, uma variável é usada apenas por um procedimento/função específico, o que não justifica uma definição global 5 Parâmetros • A passagem de parâmetros é o meio de comunicação entre as unidades de um programa • Ela pode acontecer com um dos seguintes propósitos: �Apenas fornecer um valor para que a subrotina realize um processamento �Apenas retornar um valor processado pela subrotina �Fornecer um valor para processamento pela subrotina, e também ser responsável pelo retorno de um valor processado Passagem de Parâmetro • As variáveis de um programa podem ser transferidas a um subprograma por duas maneiras: ‒Passagem de Parâmetro Explícita ‒Passagem de Parâmetro Implícita 6 Passagem de Parâmetro Explícita • Explícita é quando a troca é realizada por meio de argumentos ‒Passagem de Parâmetro Por Valor * Variáveis independentes (passadas por cópia), ocupam uma posição de memória diferente durante a execução do módulo * As alterações nos conteúdos dessas variáveis NÃO REFLETEM fora do módulo Passagem de Parâmetro Explícita ‒Passagem de Parâmetro por Referência * Essas variáveis ocupam a mesma posição alocada na memória, ou seja, passam do programa ao subprograma na mesma posição * As alterações nos conteúdos dessas variáveis REFLETEM fora do módulo * É usado o termo Var na passagem dessas variáveis * É necessário cuidado ao usar esse tipo de passagem de parâmetro 7 Passagem de Parâmetro Explícita Passagem de Parâmetro Implícita • Implícita é quando a troca é feita pela utilização de variáveis globais –Esta forma funciona de modo similar à passagem de argumentos por referência, pois não necessita de nova alocação de memória e qualquer alteração realizada durante a execução do módulo afeta o conteúdo da variável para os demais módulos –Não há passagem de argumentos 8 Passagem de Parâmetros Procedimento inicializa (var A,B: real; C: real; var D: inteiro); explícita por referência explícita por valor Procedimento 1 algoritmo "p1" var a,b,c: inteiro procedimento um(var x: inteiro) inicio a:=x x:=x+1 fimprocedimento inicio a:=1 b:=2 c:=5 um(c) escreval(a,b,c) um(b) escreval(a,b,c) um(a) escreval(a,b,c) fimalgoritmo 9 Procedimento 1 algoritmo "p1" var a,b,c: inteiro procedimento um(var x: inteiro) inicio a:=x x:=x+1 fimprocedimento inicio a:=1 b:=2 c:=5 um(c) escreval(a,b,c) um(b) escreval(a,b,c) um(a) escreval(a,b,c) fimalgoritmo Chamada do procedimento “um” passando como argumento o conteúdo da variável “c” Procedimento 1 algoritmo "p1" var a,b,c: inteiro procedimento um(var x: inteiro) inicio a:=x x:=x+1 fimprocedimento inicio a:=1 b:=2 c:=5 um(c) escreval(a,b,c) um(b) escreval(a,b,c) um(a) escreval(a,b,c) fimalgoritmo A primeira posição do parâmetro receberá a passagem explícita por referência (devido à cláusula “Var”), ou seja, as alterações nos conteúdos dessas variáveis refletem fora do procedimento 10 Procedimento 1 algoritmo "p1" var a,b,c: inteiro procedimento um(var x: inteiro) inicio a:=x x:=x+1 fimprocedimento inicio a:=1 b:=2 c:=5 um(c) escreval(a,b,c) um(b) escreval(a,b,c) um(a) escreval(a,b,c) fimalgoritmo Passagem de parâmetro implícita: A variável “a”, que já foi declarada no escopo global, receberá tanto o valor quanto a referência AO MESMO ESPAÇO na memória, logo essa variável terá seu valor alterado fora do módulo Procedimento 1 algoritmo "p1" var a,b,c: inteiro procedimento um(var x: inteiro) inicio a:=x x:=x+1 fimprocedimento inicio a:=1 b:=2 c:=5 um(c) escreval(a,b,c) um(b) escreval(a,b,c) um(a) escreval(a,b,c) fimalgoritmo De volta ao bloco principal, a variável “a”, que recebeu a mesma referência e valor “5” da variável “x” (do parâmetro), terá como saída na tela o valor “5” 11 Procedimento 1 algoritmo "p1" var a,b,c: inteiro procedimento um(var x: inteiro) inicio a:=x x:=x+1 fimprocedimento inicio a:=1 b:=2 c:=5 um(c) escreval(a,b,c) um(b) escreval(a,b,c) um(a) escreval(a,b,c) fimalgoritmo Como a variável “x” do procedimento recebeu o valor e a referência ao mesmo espaço de memória da variável “c”, a sua modificação na operação x:=x+1 também se refletiu na variável “c”, que terá como saída o valor “6” Procedimento 1 algoritmo "p1" var a,b,c: inteiro procedimento um(var x: inteiro) inicio a:=x x:=x+1 fimprocedimento inicio a:=1 b:=2 c:=5 um(c) escreval(a,b,c) um(b) escreval(a,b,c) um(a) escreval(a,b,c) fimalgoritmo Saída do algoritmo: 5 2 6 2 3 6 3 3 6 12 Procedimento 2 algoritmo "p2" var a,b: real procedimento a1(a:inteiro; var c:inteiro; p,b:inteiro) inicio a:=c p:=b+c c:=c+100 escreval(a,b,c,p) fimprocedimento procedimento a2(var a:inteiro) inicio a:=30 escreval(a,b) fimprocedimento inicio a:=20 b:=10 a1(a,b,b,a) escreval(a,b) a2(b) escreval(a,b) a1(a,a,b,b) escreval(a,b) fimalgoritmo Procedimento 2 algoritmo "p2" var a,b: real procedimento a1(a:inteiro; var c:inteiro; p,b:inteiro) inicio a:=c p:=b+c c:=c+100 escreval(a,b,c,p) fimprocedimento procedimento a2(var a:inteiro) inicio a:=30 escreval(a,b) fimprocedimento inicio a:=20 b:=10 a1(a,b,b,a) escreval(a,b) a2(b) escreval(a,b) a1(a,a,b,b) escreval(a,b) fimalgoritmo Passará os argumentos ao procedimento “a1” 13 Procedimento 2 algoritmo "p2" var a,b: real procedimento a1(a:inteiro; var c:inteiro; p,b:inteiro) inicio a:=c p:=b+c c:=c+100 escreval(a,b,c,p) fimprocedimento procedimento a2(var a:inteiro) inicio a:=30 escreval(a,b) fimprocedimento inicio a:=20 b:=10 a1(a,b,b,a) escreval(a,b) a2(b) escreval(a,b) a1(a,a,b,b) escreval(a,b) fimalgoritmo Receberá a passagem por referência, a variável global “b” passará o valor e a referência ao mesmo espaço na memória. Todas as alterações em “c” irão refletir em “b” Procedimento 2 algoritmo "p2" var a,b: real procedimento a1(a:inteiro; var c:inteiro;p,b:inteiro) inicio a:=c p:=b+c c:=c+100 escreval(a,b,c,p) fimprocedimento procedimento a2(var a:inteiro) inicio a:=30 escreval(a,b) fimprocedimento inicio a:=20 b:=10 a1(a,b,b,a) escreval(a,b) a2(b) escreval(a,b) a1(a,a,b,b) escreval(a,b) fimalgoritmo Receberão a passagem por valor, as alterações nessas variáveis não refletem fora do módulo 14 Procedimento 2 algoritmo "p2" var a,b: real procedimento a1(a:inteiro; var c:inteiro; p,b:inteiro) inicio a:=c p:=b+c c:=c+100 escreval(a,b,c,p) fimprocedimento procedimento a2(var a:inteiro) inicio a:=30 escreval(a,b) fimprocedimento inicio a:=20 b:=10 a1(a,b,b,a) escreval(a,b) a2(b) escreval(a,b) a1(a,a,b,b) escreval(a,b) fimalgoritmo 20 10 10 20 Procedimento 2 algoritmo "p2" var a,b: real procedimento a1(a:inteiro; var c:inteiro; p,b:inteiro) inicio a:=c p:=b+c c:=c+100 escreval(a,b,c,p) fimprocedimento procedimento a2(var a:inteiro) inicio a:=30 escreval(a,b) fimprocedimento inicio a:=20 b:=10 a1(a,b,b,a) escreval(a,b) a2(b) escreval(a,b) a1(a,a,b,b) escreval(a,b) fimalgoritmo 10 20 10 10 20 15 Procedimento 2 algoritmo "p2" var a,b: real procedimento a1(a:inteiro; var c:inteiro; p,b:inteiro) inicio a:=c p:=b+c c:=c+100 escreval(a,b,c,p) fimprocedimento procedimento a2(var a:inteiro) inicio a:=30 escreval(a,b) fimprocedimento inicio a:=20 b:=10 a1(a,b,b,a) escreval(a,b) a2(b) escreval(a,b) a1(a,a,b,b) escreval(a,b) fimalgoritmo 10 20 10 10 20 30 Procedimento 2 algoritmo "p2" var a,b: real procedimento a1(a:inteiro; var c:inteiro; p,b:inteiro) inicio a:=c p:=b+c c:=c+100 escreval(a,b,c,p) fimprocedimento procedimento a2(var a:inteiro) inicio a:=30 escreval(a,b) fimprocedimento inicio a:=20 b:=10 a1(a,b,b,a) escreval(a,b) a2(b) escreval(a,b) a1(a,a,b,b) escreval(a,b) fimalgoritmo 10 20 10 10 20 30 110 16 Procedimento 2 algoritmo "p2" var a,b: real procedimento a1(a:inteiro; var c:inteiro; p,b:inteiro) inicio a:=c p:=b+c c:=c+100 escreval(a,b,c,p) fimprocedimento procedimento a2(var a:inteiro) inicio a:=30 escreval(a,b) fimprocedimento inicio a:=20 b:=10 a1(a,b,b,a) escreval(a,b) a2(b) escreval(a,b) a1(a,a,b,b) escreval(a,b) fimalgoritmo 10 20 10 10 20 30 110 Saída: 10 20 110 30 Procedimento 2 algoritmo "p2" var a,b: real procedimento a1(a:inteiro; var c:inteiro; p,b:inteiro) inicio a:=c p:=b+c c:=c+100 escreval(a,b,c,p) fimprocedimento procedimento a2(var a:inteiro) inicio a:=30 escreval(a,b) fimprocedimento inicio a:=20 b:=10 a1(a,b,b,a) escreval(a,b) a2(b) escreval(a,b) a1(a,a,b,b) escreval(a,b) fimalgoritmo 10 20 10 10 20 30 110 Saída: 20 110 � Como a variável “a” do procedimento foi explicitamente declarada para receber passagem de parâmetro por valor, a atribuição “a:=c” não se refletiu fora do módulo � Obs.: A saída de “b” foi 110 pois ela foi passada duas vezes na linha “a1(a,b,b,a)”, sendo que a variável “c” que a recebeu foi por referência Saída: 10 20 110 30 17 Função Algoritmo "f1" Var A,B,C: Real Funcao Exemplo(var X:Real; Y:Real): Real Var C: Real Inicio C:=X+Y C:=C+X retorne C escreval(X,Y,C) Fimfuncao Inicio A:=5 B:=6 C:=Exemplo(B,A)+Exemplo(A,B)+B escreval(A,B,C) Fimalgoritmo Função Algoritmo "f1" Var A,B,C: Real Funcao Exemplo(var X:Real; Y:Real): Real Var C: Real Inicio C:=X+Y C:=C+X retorne C escreval(X,Y,C) Fimfuncao Inicio A:=5 B:=6 C:=Exemplo(B,A)+Exemplo(A,B)+B escreval(A,B,C) Fimalgoritmo Comando que retornará o valor ao chamador da função Tipo de dado associado à função a ser retornado Variável declarada do tipo do retorno da função Saída do algoritmo: 6 5 17 5 6 16 5 6 39 Ativação em contexto de expressão
Compartilhar