Buscar

ALGORITMO Subalgoritmos

Prévia do material em texto

Algoritmos e Estruturas de Dados I
1
Algoritmos e 
Estruturas de Dados I
Subalgoritmos:
Funções e Procedimentos
Profa. Márcia Cristina Moraes
Profa. Milene Selbach Silveira
Material para estudo:
Forbellone, A. e Eberspächer, H. (2005) 
� capítulo 6 (conceitos de modularização e escopo de
variáveis)
Subalgoritmos
� Muitos problemas com soluções complexas 
podem ser divididos, sucessivamente em 
problemas menores, com lógica mais 
simples e de compreensão mais fácil. Em 
vez de escrever um algoritmo grande, 
escrevem-se vários algoritmos menores, os 
quais em conjunto resolvem o problema 
proposto.
Algoritmos e Estruturas de Dados I
2
Subalgoritmos e Modularização
� Trechos de algoritmo que efetuam cálculos 
determinados, são chamados de 
subalgoritmos.
� O processo de dividir problemas grandes em 
um conjunto de problemas menores é 
chamado de modularização.
Modularização: vantagens
� Dividir problemas grandes em vários problemas 
menores, de menor complexidade, principalmente por 
terem um número pequeno de variáveis e poucos 
caminhos de controle (caminhos do início ao fim do 
programa).
� Possibilidade de usar soluções gerais para classes de 
problemas em lugar de soluções específicas para 
problemas particulares.
� Evitar a repetição dentro de um mesmo algoritmo, de 
uma sequência de ações em diferentes pontos.
� Permite delimitar o escopo (nível de abrangência) de 
variáveis.
[Orth 2001]
Algoritmos e Estruturas de Dados I
3
Modularização: escopo de 
váriáveis
� As variáveis definidas no interior de um módulo 
são denominadas de variáveis locais. As 
variáveis deste tipo são ativadas somente quando 
aquele módulo começa a ser executado. Ocupam 
memória somente até o final da execução do 
módulo ao qual pertencem. Isto permite uma 
otimização do uso da memória.
Modularização:
Variáveis Locais x Variáveis Globais
� Variáveis Globais: possuem seu valor válido 
durante todo o algoritmo
� Variáveis Locais: somente são válidas dentro 
do subalgoritmo ao qual fazem parte
Algoritmo Exemplo
inteiro: a, b, c
Início
inteiro: x, y, z
....
Fim
Variáveis globais, válidas para o
Algoritmo exemplo e todos os sub-
algoritmos que podem ser criados
Variáveis locais, somente são válidas
para o algoritmo exemplo, não valem 
para nenhum subalgoritmo criado
Até o momento somente estávamos usando variáveis globais, agora vamos usar
variáveis locais.
Algoritmos e Estruturas de Dados I
4
Subalgoritmos: tipos
� A maioria das linguagens possui 2 formas de 
implementar e usar subalgoritmos
(módulos):
� Função: calculam um único valor em função de 
um ou mais parâmetros recebidos
� Procedimento: podem calcular um número 
qualquer de valores, calculados ou não em 
função dos parâmetros recebidos
Função
tipo Função NomeF(tipo: Arg1, tipo: Arg2, ..., tipo: Argn)
Início
{Definição das variáveis locais}
.....
{conjunto de comandos}
NomeF � Expressão
Retorne
Fim
Retorno para o programa principal
da expressão calculada na função
Algoritmos e Estruturas de Dados I
5
Função
� Tipo: tipo de retorno da função (qualquer um dos 
tipos existentes, por exemplo, inteiro, real, literal)
� NomeF: nome da função
� O número de argumentos depende do que se quer 
fazer na função. O nome do argumento sempre vem 
precedido do seu tipo
� NomeF ���� Expressão: indica o retorno da 
expressão calculada na função para o programa 
principal
� Retorne: indica o término da execução do 
subalgoritmo e o retorno do controle para o 
programa principal
Exemplo
Inteiro Função Soma(inteiro: a, b)
Início
inteiro: res
res � a + b
Soma � res
Retorne
Fim
a e b: argumentos de entrada
res: variável local, armazena o valor que
será retornado pela função
Como o valor calculado retorna para o 
algoritmo principal?
Soma ���� res
Retorne
Como passamos os argumentos para a 
função? Através de passagem de
parâmetros.
Algoritmos e Estruturas de Dados I
6
� Passagem por valor: passa o valor das 
variáveis para os argumentos
� inteiro Função Soma(inteiro: a, inteiro: b)
� a e b são argumentos passados por valores do tipo 
inteiro
� Função Soma também pode ser escrita da seguinte 
maneira:
� Inteiro Função Soma(inteiro: a,b)
� Quando mais de um valor é do mesmo tipo eles podem ser 
separados por vírgulas
Passagem de Parâmetros
Passagem de Parâmetros
� Passagem por referência: passa o 
endereço de memória da variável para o 
argumento
� Inteiro Função Soma2(inteiro: ref a, inteiro: b)
� a é um argumento passado por referência e b é um 
argumento passado por valor
� Isto significa que a recebe/armazena um endereço de 
memória relacionada a uma variável e não o valor de 
uma variável
Vamos com calma!! 
Aprofundaremos este conceito 
quando virmos Procedimentos
Algoritmos e Estruturas de Dados I
7
� Por enquanto só vimos a declaração de 
uma função
� Para que ela seja efetivamente usada ela 
precisa ser declarada e chamada
� Iremos chamar a função dentro do algoritmo 
principal da seguinte maneira:
� NomeF(parâmetros)
� Parâmetros são os nomes das variáveis que 
queremos enviar para a função
Chamada da Função
Passo a passo
Algoritmo Principal
Inteiro: x, y, resultado
Início
leia(x, y)
resultado � Soma(x, y)
escreva(resultado)
Fim
Inteiro Função Soma (inteiro: a, b)
Início
inteiro: res
res � a + b
Soma � res
Retorne
Fim
10 3
Algoritmos e Estruturas de Dados I
8
Chamada da Função
Chama a função soma passando o valor
de x que é 10 e o valor de y que é 3
Sabe que é passagem por valor
Porque não tem ref na frente de a
e nem de b
Algoritmo Principal
Inteiro: x, y, resultado
Início
leia(x, y)
resultado ���� Soma(x, y)
escreva(resultado)
Fim
Inteiro Função Soma (inteiro: a, b)
Início
inteiro: res
res � a + b
Soma � res
Retorne
Fim
Algoritmo Principal
Inteiro: x, y, resultado
Início
leia(x, y)
resultado ���� Soma(x, y)
escreva(resultado)
Fim
Inteiro Função Soma (inteiro: a, b)
Início
inteiro: res
res � a + b
Soma � res
Retorne
Fim
Chamada da Função
a recebe o valor de x, ou seja 10
b recebe o valor de y ou seja 3
Declara a variável res que é uma
variável local, ou seja, somente 
é válida dentro da função Soma
Parâmetros a e b somente são 
válidos dentro da função Soma
Algoritmos e Estruturas de Dados I
9
Chamada da Função
res recebe a soma de 10 e 3, 
ou seja, recebe 13
Algoritmo Principal
Inteiro: x, y, resultado
Início
leia(x, y)
resultado � Soma(x, y)
escreva(resultado)
Fim
Inteiro Função Soma (inteiro: a, b)
Início
inteiro: res
res ���� a + b
Soma � res
Retorne
Fim
Chamada da Função
Nome da função recebe o valor a ser retornado
Algoritmo Principal
Inteiro: x, y, resultado
Início
leia(x, y)
resultado � Soma(x, y)
escreva(resultado)
Fim
Inteiro Função Soma (inteiro: a, b)
Início
inteiro: res
res � a + b
Soma ���� res
Retorne
Fim
Algoritmos e Estruturas de Dados I
10
Chamada da Função
Retorna o controle para o programa principal
Algoritmo Principal
Inteiro: x, y, resultado
Início
leia(x, y)
resultado � Soma(x, y)
escreva(resultado)
Fim
Inteiro Função Soma (inteiro: a, b)
Início
inteiro: res
res � a + b
Soma � res
Retorne
Fim
Chamada da Função
Resultado recebe o valor retornado por 
Soma, ou seja, 13
Algoritmo Principal
Inteiro: x, y, resultado
Início
leia(x, y)
resultado ���� Soma(x, y)
escreva(resultado)
Fim
Inteiro Função Soma (inteiro: a, b)
Início
inteiro: res
res � a + b
Soma � res
Retorne
Fim
Algoritmos e Estruturas de Dados I
11
Chamada da Função
Escreve o valor de resultado, ou seja, 13
Algoritmo Principal
Inteiro: x, y, resultado
Início
leia(x, y)resultado � Soma(x, y)
escreva(resultado)
Fim
Inteiro Função Soma (inteiro: a, b)
Início
inteiro: res
res � a + b
Soma � res
Retorne
Fim
Chamada da Função
Poderia substituir 
estas 2 linhas por
escreva (Soma(x,y))
Algoritmo Principal
Inteiro: x, y, resultado
Início
leia(x, y)
resultado ���� Soma(x, y)
escreva(resultado)
Fim
Inteiro Função Soma (inteiro: a, b)
Início
inteiro: res
res � a + b
Soma � res
Retorne
Fim
Algoritmos e Estruturas de Dados I
12
Exercício
Faça um algoritmo que lê um número inteiro e chama uma
função que verifica se este é um número par. O algoritmo
deve escrever o resultado da função (se retornou que o
número é par ou não).
Faça, também, a função que recebe o valor inteiro e
verifica se ele é um número par. A função deve retornar 1
caso o número seja par e 0 no caso contrário.
Procedimento
� Pode calcular um número qualquer de 
valores
� Pode retornar valores se os mesmos são 
passados por referência para o 
subalgoritmo, caso contrário, o procedimento 
não retorna nenhum valor
Algoritmos e Estruturas de Dados I
13
Procedimento
Procedimento NomeP(tipo: Arg1, tipo: Arg2,..., tipo:Argn)
Início
{Definição das variáveis locais}
.....
Fim
Pode retornar valores nos argumentos desde que eles sejam passados 
por referência para o procedimento. Neste caso deve-se ter ao final do 
procedimento uma atribuição para os argumentos que se deseja 
retornar valores calculados dentro do procedimento.
Pode retornar valores nos argumentos desde que eles sejam passados 
por referência para o procedimento. Neste caso deve-se ter ao final do 
procedimento uma atribuição para os argumentos que se deseja retornar 
valores calculados dentro do procedimento.
Diferença para 
a função??
Procedimento
Procedimento NomeP(tipo: Arg1, tipo: Arg2,..., tipo:Argn)
Início
{Definição das variáveis locais}
.....
Fim
Algoritmos e Estruturas de Dados I
14
Procedimento
� NomeP: nome do procedimento
� Da mesma forma que na função o 
procedimento também deve ser chamado no 
algoritmo principal
� NomeP(parâmetros)
� Na hora que o procedimento é chamado, os 
valores (parâmetros) da chamada são 
passados para os argumentos 
correspondentes
Procedimento
� Argumentos de definição e parâmetros de 
chamada devem corresponder em número, e 
tipo e estar na mesma ordem
� Enquanto os argumentos de definição devem 
ser obrigatoriamente variáveis, os 
parâmetros de chamada podem ser 
expressões.
Algoritmos e Estruturas de Dados I
15
Exemplo – Procedimento que 
não retorna valor
Procedimento Soma(inteiro: a, b)
Início
inteiro: res
res � a + b
Escreva (“Resultado da soma = ”, res)
Fim
Chamada do Procedimento 
Soma
Algoritmo Principal
inteiro: x, y
Início
Leia(x, y)
Soma(x,y)
Escreva(x,y)
Fim
Valores de x e y não são alterados, pois
a passagem de parâmetros é por valor
Chamada do procedimento soma passando
os parâmetros x e y por valor
Algoritmos e Estruturas de Dados I
16
Passo a Passo (1/6)
Algoritmo Principal
inteiro: x, y
Início
leia(x, y)
Soma(x, y)
escreva(x,y)
Fim
Procedimento Soma(inteiro: a, b)
Início
inteiro: res
res � a + b
Escreva(res)
Fim
10 3
Chama o procedimento soma passando o 
valor de x que é 10 e o valor de y que é 3
Sabe que é passagem por valor
Porque não tem ref na frente de 
a e nem de b
Algoritmo Principal
inteiro: x, y
Início
leia(x, y)
Soma(x, y)
escreva(x,y)
Fim
Procedimento Soma(inteiro: a, b)
Início
inteiro: res
res � a + b
Escreva(res)
Fim
Passo a Passo (2/6)
Algoritmos e Estruturas de Dados I
17
Algoritmo Principal
inteiro: x, y
Início
leia(x, y)
Soma(x, y)
escreva(x,y)
Fim
Procedimento Soma(inteiro: a, b)
Início
inteiro: res
res � a + b
Escreva(res)
Fim
a recebe o valor de x, ou seja 10
b recebe o valor de y, ou seja 3
Declara a variável res que é uma
variável local, ou seja, somente 
é valida dentro da função Soma
Passo a Passo (3/6)
res recebe a soma de 10 e 3, 
ou seja, recebe 13
Algoritmo Principal
inteiro: x, y
Início
leia(x, y)
Soma(x, y)
escreva(x,y)
Fim
Procedimento Soma(inteiro: a, b)
Início
inteiro: res
res ���� a + b
Escreva(res)
Fim
Passo a Passo (4/6)
Algoritmos e Estruturas de Dados I
18
Escreve o resultado
Algoritmo Principal
inteiro: x, y
Início
leia(x, y)
Soma(x, y)
escreva(x,y)
Fim
Procedimento Soma(inteiro: a, b)
Início
inteiro: res
res � a + b
Escreva(res)
Fim
Passo a Passo (5/6)
Escreve o valor de x e y, ou seja, 10 e 3
Algoritmo Principal
inteiro: x, y
Início
leia(x, y)
Soma(x, y)
escreva(x,y)
Fim
Procedimento Soma(inteiro: a, b)
Início
inteiro: res
res � a + b
Escreva(res)
Fim
Passo a Passo (6/6)
Algoritmos e Estruturas de Dados I
19
Retomando...
� Passagem por referência: passa o endereço 
de memória da variável para o argumento
� Procedimento Soma2(inteiro: ref a, inteiro: b)
� a é um argumento passado por referência e b é um 
argumento passado por valor
� Isto significa que a recebe/armazena um endereço de 
memória relacionada a uma variável e não o valor de 
uma variável
� O valor do argumento a retorna alterado para o 
algoritmo principal
Exemplo – procedimento 
retorna valor na variável a
Procedimento Soma2(inteiro: ref a, b)
Início
res: inteiro
res � a + b
a � res
Fim
Passagem por Referência:
Recebe o endereço de memória da variável
Algoritmos e Estruturas de Dados I
20
Chamada do Procedimento 
Soma2
Algoritmo Principal
inteiro: x, y
Início
Leia(x, y)
Soma2(x,y)
Escreva(x,y)
Fim
Valor de x retorna alterado, não é mais o 
valor que possuía antes da chamada
Valor de y volta inalterado, pois foi passado
por valor
Chamada do procedimento Soma2 passando
os parâmetros x e y
Passo a Passo - Soma2 (1/5)
Algoritmo Principal
inteiro: x, y
Início
leia(x, y)
Soma2(x, y)
escreva(x,y)
Fim
Procedimento Soma2(inteiro: ref a, b)
Início
inteiro: res
res � a + b
a � res
Fim
10 3
Algoritmos e Estruturas de Dados I
21
Algoritmo Principal
inteiro: x, y
Início
leia(x, y)
Soma2(x, y)
escreva(x,y)
Fim
Procedimento Soma2(inteiro: ref a, b)
Início
inteiro: res
res � a + b
a � res
Fim
Chamada do procedimento Soma2
Passa x por referência e y por valor
Endereço de x vai para a
Valor de y vai para b
x y
[150] 10 3 [200]
a b
[150] 3
Passo a Passo - Soma2 (2/5)
res recebe o conteúdo do endereço de memória
apontado por a mais o valor de b. 
Conteúdo apontado por a é 10 mais
valor de b que é 3
x y
[150] 10 3 [200]
a b res
[150] 3 13
Algoritmo Principal
inteiro: x, y
Início
leia(x, y)
Soma2(x, y)
escreva(x,y)
Fim
Procedimento Soma2(inteiro: ref a, b)
Início
inteiro: res
res ���� a + b
a � res
Fim
Passo a Passo - Soma2 (3/5)
Algoritmos e Estruturas de Dados I
22
Endereço de memória apontado por a recebe o valor 
de res
x y
[150] 13 3 [200]
a b res
[150] 3 13
Algoritmo Principal
inteiro: x, y
Início
leia(x, y)
Soma2(x, y)
escreva(x,y)
Fim
Procedimento Soma2(inteiro: ref a, b)
Início
inteiro: res
res � a + b
a ���� res
Fim
Passo a Passo - Soma2 (4/5)
x y
[150] 13 3 [200]
Escreve o valor de x e de y
Valor de x foi alterado dentro do procedimento!
Algoritmo Principal
inteiro: x, y
Início
leia(x, y)
Soma2(x, y)
escreva(x,y)
Fim
Procedimento Soma2(inteiro: ref a, b)
Início
inteiro: res
res � a + b
a � res
Fim
Passo a Passo - Soma2 (5/5)
Algoritmos e Estruturas de Dados I
23
Exercício 1
� Faça um procedimento que dado dois 
valores N e X, escreve os N primeiros 
pares acima de X.
Passagem 
porvalor ou 
por referência?
Exercício 2
� Faça um procedimento que recebe 2 
parâmetros do tipo inteiro e retorna os 
valores dos parâmetros trocados para o 
algoritmo principal. Construa o algoritmo 
principal e faça uma chamada este 
procedimento.
E 
agora?
Algoritmos e Estruturas de Dados I
24
Exercício 3
� Faça um procedimento que recebe 3 valores 
inteiros por parâmetro e retorna-os ordenados 
em ordem crescente. Use o procedimento 
definido no exercício 2. Construa o algoritmo 
principal e faça uma chamada a este 
procedimento.
Bibliografia
� Orth, Afonso Inácio. Algoritmos e 
Programação. Editora AIO. 2001.
� Forbellone, A. e Eberspacher, H. Lógica 
de Programação: A Construção de 
Algoritmos e Estruturas de Dados. 
Makron Books, São Paulo, 3ª edição. 
2005.

Continue navegando