Você está na página 1de 17

UNIDADE 4:

SUBROTINAS

4.1 Conceitos de
Modularização

1
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

2
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;

3
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

4
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

5
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

6
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

7
Passagem de Parâmetros

explícita
por referência

Procedimento inicializa (var A,B: real; C: real; var D: inteiro);

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

8
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 Chamada do procedimento “um” passando como
c:=5
um(c)
argumento o conteúdo da variável “c”
escreval(a,b,c)
um(b)
escreval(a,b,c)
um(a)
escreval(a,b,c)
fimalgoritmo

Procedimento 1
algoritmo "p1"
var
a,b,c: inteiro

procedimento um(var x: inteiro)


inicio
a:=x
x:=x+1
fimprocedimento A primeira posição do parâmetro receberá a
inicio
passagem explícita por referência (devido à
a:=1
b:=2
cláusula “Var”), ou seja, as alterações nos
c:=5 conteúdos dessas variáveis refletem fora do
um(c)
escreval(a,b,c) procedimento
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 Passagem de parâmetro implícita: A variável “a”, que
fimprocedimento
já foi declarada no escopo global, receberá tanto o
inicio
a:=1 valor quanto a referência AO MESMO ESPAÇO na
b:=2
c:=5
memória, logo essa variável terá seu valor alterado
um(c) fora do módulo
escreval(a,b,c)
um(b)
escreval(a,b,c)
um(a)
escreval(a,b,c)
fimalgoritmo

Procedimento 1
algoritmo "p1"
var
a,b,c: inteiro

procedimento um(var x: inteiro)


inicio
a:=x
x:=x+1
fimprocedimento
De volta ao bloco principal, a variável “a”,
inicio que recebeu a mesma referência e valor “5”
a:=1
b:=2 da variável “x” (do parâmetro), terá como
c:=5
um(c) saída na tela o valor “5”
escreval(a,b,c)
um(b)
escreval(a,b,c)
um(a)
escreval(a,b,c)
fimalgoritmo

10
Procedimento 1
algoritmo "p1"
var
a,b,c: inteiro

procedimento um(var x: inteiro)


inicio
a:=x
x:=x+1
fimprocedimento
Como a variável “x” do procedimento
inicio recebeu o valor e a referência ao mesmo
a:=1
b:=2 espaço de memória da variável “c”, a sua
c:=5
um(c) modificação na operação x:=x+1 também se
escreval(a,b,c)
um(b)
refletiu na variável “c”, que terá como saída
escreval(a,b,c) o valor “6”
um(a)
escreval(a,b,c)
fimalgoritmo

Procedimento 1
algoritmo "p1"
var
a,b,c: inteiro

procedimento um(var x: inteiro)


inicio
a:=x
x:=x+1
fimprocedimento

inicio
a:=1
Saída do algoritmo:
b:=2
c:=5
526
um(c)
escreval(a,b,c) 236
um(b)
escreval(a,b,c) 336
um(a)
escreval(a,b,c)
fimalgoritmo

11
Procedimento 2
algoritmo "p2" inicio
var a:=20
a,b: real b:=10
a1(a,b,b,a)
procedimento a1(a:inteiro; var c:inteiro; p,b:inteiro) escreval(a,b)
inicio a2(b)
a:=c escreval(a,b)
p:=b+c a1(a,a,b,b)
c:=c+100 escreval(a,b)
escreval(a,b,c,p) fimalgoritmo
fimprocedimento

procedimento a2(var a:inteiro)


inicio
a:=30
escreval(a,b)
fimprocedimento

Procedimento 2
algoritmo "p2" inicio
var a:=20
a,b: real b:=10
a1(a,b,b,a)
procedimento a1(a:inteiro; var c:inteiro; p,b:inteiro) escreval(a,b)
inicio a2(b)
a:=c escreval(a,b)
p:=b+c a1(a,a,b,b)
c:=c+100 escreval(a,b)
escreval(a,b,c,p) fimalgoritmo
fimprocedimento

procedimento a2(var a:inteiro)


inicio
a:=30 Passará os argumentos
escreval(a,b)
fimprocedimento
ao procedimento “a1”

12
Procedimento 2
algoritmo "p2" inicio
var a:=20
a,b: real b:=10
a1(a,b,b,a)
procedimento a1(a:inteiro; var c:inteiro; p,b:inteiro) escreval(a,b)
inicio a2(b)
a:=c escreval(a,b)
p:=b+c a1(a,a,b,b)
c:=c+100 escreval(a,b)
escreval(a,b,c,p) fimalgoritmo
fimprocedimento

procedimento a2(var a:inteiro) Receberá a passagem por referência, a variável


inicio
a:=30
global “b” passará o valor e a referência ao
escreval(a,b)
fimprocedimento
mesmo espaço na memória. Todas as
alterações em “c” irão refletir em “b”

Procedimento 2
algoritmo "p2" inicio
var a:=20
a,b: real b:=10
a1(a,b,b,a)
procedimento a1(a:inteiro; var c:inteiro; p,b:inteiro) escreval(a,b)
inicio a2(b)
a:=c escreval(a,b)
p:=b+c a1(a,a,b,b)
c:=c+100 escreval(a,b)
escreval(a,b,c,p) fimalgoritmo
fimprocedimento

procedimento a2(var a:inteiro) Receberão a passagem por valor,


inicio
a:=30 as alterações nessas variáveis
escreval(a,b)
fimprocedimento não refletem fora do módulo

13
Procedimento 2
algoritmo "p2" inicio
var a:=20
a,b: real b:=10
20 10 10 20 a1(a,b,b,a)
procedimento a1(a:inteiro; var c:inteiro; p,b:inteiro) escreval(a,b)
inicio a2(b)
a:=c escreval(a,b)
p:=b+c a1(a,a,b,b)
c:=c+100 escreval(a,b)
escreval(a,b,c,p) fimalgoritmo
fimprocedimento

procedimento a2(var a:inteiro)


inicio
a:=30
escreval(a,b)
fimprocedimento

Procedimento 2
algoritmo "p2" inicio
var a:=20
a,b: real b:=10
20 10 10 20 a1(a,b,b,a)
procedimento a1(a:inteiro; var c:inteiro; p,b:inteiro) escreval(a,b)
inicio a2(b)
10 a:=c escreval(a,b)
p:=b+c a1(a,a,b,b)
c:=c+100 escreval(a,b)
escreval(a,b,c,p) fimalgoritmo
fimprocedimento

procedimento a2(var a:inteiro)


inicio
a:=30
escreval(a,b)
fimprocedimento

14
Procedimento 2
algoritmo "p2" inicio
var a:=20
a,b: real b:=10
20 10 10 20 a1(a,b,b,a)
procedimento a1(a:inteiro; var c:inteiro; p,b:inteiro) escreval(a,b)
inicio a2(b)
10 a:=c escreval(a,b)
30 p:=b+c a1(a,a,b,b)
c:=c+100 escreval(a,b)
escreval(a,b,c,p) fimalgoritmo
fimprocedimento

procedimento a2(var a:inteiro)


inicio
a:=30
escreval(a,b)
fimprocedimento

Procedimento 2
algoritmo "p2" inicio
var a:=20
a,b: real b:=10
20 10 10 20 a1(a,b,b,a)
procedimento a1(a:inteiro; var c:inteiro; p,b:inteiro) escreval(a,b)
inicio a2(b)
10 a:=c escreval(a,b)
30 p:=b+c a1(a,a,b,b)
110 c:=c+100 escreval(a,b)
escreval(a,b,c,p) fimalgoritmo
fimprocedimento

procedimento a2(var a:inteiro)


inicio
a:=30
escreval(a,b)
fimprocedimento

15
Procedimento 2
algoritmo "p2" inicio
var a:=20
a,b: real b:=10
20 10 10 20 a1(a,b,b,a)
procedimento a1(a:inteiro; var c:inteiro; p,b:inteiro) escreval(a,b)
inicio a2(b)
10 a:=c Saída: escreval(a,b)
30 p:=b+c a1(a,a,b,b)
110 c:=c+100 10 20 110 30 escreval(a,b)
escreval(a,b,c,p) fimalgoritmo
fimprocedimento

procedimento a2(var a:inteiro)


inicio
a:=30
escreval(a,b)
fimprocedimento

Procedimento 2
algoritmo "p2" inicio
var a:=20
a,b: real b:=10
20 10 10 20 a1(a,b,b,a)
procedimento a1(a:inteiro; var c:inteiro; p,b:inteiro) escreval(a,b)
inicio a2(b)
10 a:=c Saída: escreval(a,b)
30 p:=b+c a1(a,a,b,b)
110 c:=c+100 10 20 110 30 escreval(a,b)
escreval(a,b,c,p) fimalgoritmo
fimprocedimento
Saída: 20 110
procedimento a2(var a:inteiro) Como a variável “a” do procedimento foi explicitamente
inicio
a:=30 declarada para receber passagem de parâmetro por
escreval(a,b) valor, a atribuição “a:=c” não se refletiu fora do módulo
fimprocedimento
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

16
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 Tipo de dado associado à função a
Funcao Exemplo(var X:Real; Y:Real): Real ser retornado
Var
C: Real
Inicio Variável declarada do tipo do
C:=X+Y Saída do algoritmo:
C:=C+X
retorno da função
retorne C 6 5 17
escreval(X,Y,C) Comando que retornará o
Fimfuncao 5 6 16
valor ao chamador da
Inicio função 5 6 39
A:=5
B:=6
C:=Exemplo(B,A)+Exemplo(A,B)+B Ativação em contexto de
escreval(A,B,C)
Fimalgoritmo expressão

17

Você também pode gostar