You are on page 1of 13

UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE

ESCOLA DE CIÊNCIAS E TECNOLOGIA

ECT1103 - INFORMÁTICA FUNDAMENTAL

Laboratório 6 – Subalgoritmos
(Funções e Procedimentos)
*Material adaptado dos roteiros da disciplina de Lógica de Programação e Algoritmos
produzidos pelos autores: Nélio Alessandro Azevedo Cacho (neliocacho@ect.ufrn.br) e
Keivillany Janielle de Lima Coelho (keivycoelho@hotmail.com).

APRESENTAÇÃO
Em nossas aulas, até o momento, você conheceu as instruções
primitivas, estruturas de controle e, nas aulas mais recentes, conheceu as
estruturas de dados homogêneas, que são os vetores e as matrizes. Você sabe
que existem problemas com diversos graus de complexidade e, com todos os
conhecimentos que adquiriu até aqui, é certo que você já é capaz de construir
algoritmos que resolvam problemas de diversos tipos.
Nesta aula, você verá que, para reduzir a complexidade de um
algoritmo, é interessante sabermos utilizar o nosso raciocínio lógico para dividir
um problema grande em diversos problemas menores. Desta forma, a
complexidade é reduzida, favorecendo a compreensão.
E é nesse contexto que entram os subalgoritmos, que são trechos de
programas que podem ser utilizados dentro de um programa maior, sempre
que necessário ou conveniente.
Nesta aula, conheceremos os conceitos acerca de subalgoritmos,
classificando-os em funções e procedimentos. Vamos conhecer os conceitos,
sintaxe e aplicações das funções e procedimentos. Veremos como criá-los,
declará-los e em que parte do algoritmo eles devem ficar posicionados.
Aprenderemos, também, como fazer a chamada de funções dentro do
algoritmo principal e os conceitos de escopo de variáveis, definindo variáveis
globais e locais e a comunicação entre as funções e o algoritmo através dessas
variáveis.
SUBALGORITMOS
Com os conhecimentos que você adquiriu até hoje, você sabe que é
capaz de construir algoritmos que podem resolver problemas de diversos tipos.
Além da diversidade de tipos de problemas, nos algoritmos, poderemos
nos deparar com diversas situações diferentes dentro de um mesmo problema.
E quanto maior essa diversidade, podemos dizer que maior é a complexidade
do algoritmo.
Para reduzir essa complexidade é interessante utilizarmos a nossa
habilidade de raciocínio lógico para decompor os problemas grandes e
complexos em diversos problemas menores e mais simples.
Dessa forma, fica mais fácil manter o foco em cada „subproblema‟ por
vez, aumentando a compreensão.
Em algoritmos, essa decomposição é possível, quando utilizamos os
subalgoritmos.

Um subalgoritmo é um trecho de programa que contém início e fim,


executa um determinado conjunto de instruções e possui um identificador, por
meio do qual pode ser chamado em qualquer parte do algoritmo, como se
fosse um comando.

Imagine que um determinado algoritmo precisa realizar um mesmo


conjunto de ações repetidas vezes ao longo de sua execução. Ao invés de
escrevermos esse conjunto de ações várias vezes ao longo do algoritmo,
criamos um subalgoritmo e o algoritmo principal o „chama‟ sempre que precisar
dele.
Por exemplo: ao preencher um formulário com dados de diversas
pessoas, o usuário digita, em dado momento, o ano de nascimento da pessoa
e, automaticamente, é preenchido o campo seguinte, com a idade da pessoa.
Em um programa que não utiliza subalgoritmos, a expressão „idade <-
ano_atual – ano_nascimento’ é calculada cada vez que novos dados são
inseridos. Se utilizarmos um subalgoritmo que realize esse cálculo, apenas
chamamos o subalgoritmo no momento necessário.
Ao terminar a execução do subalgoritmo chamado, o fluxo de execução
natural do algoritmo principal prossegue.
Dessa forma, quando um algoritmo é muito complexo, a estratégia é
dividi-lo em um algoritmo principal e diversos (tantos quantos forem
necessários) subalgoritmos.
Se, ainda assim, algum nível de complexidade for mantido, é possível os
subalgoritmos chamarem outros subalgoritmos.
A utilização de subalgoritmos facilita o trabalho do programador, pois,
além de melhorar a compreensão e reduzir a complexidade, permite que se
detectem e corrijam eventuais falhas com maior precisão e agilidade e
favorece, também, a reutilização de subalgoritmos que foram implementados
em outros programas. Dessa forma, reduzimos, além da complexidade, o
tempo gasto para escrever o programa.

ATIVIDADE 01
1. O que é um subalgoritmo? Quando é interessante utilizar subalgoritmos?
2. Quais as vantagens de se utilizar subalgoritmos?

ELEMENTOS DE UM SUBALGORITMO
Os elementos de um subalgoritmo são o corpo e o cabeçalho.
No corpo, são definidas as instruções, ou seja, as ações que o
subalgoritmo vai executar cada vez que for chamado dentro do algoritmo
principal.
No cabeçalho, definimos o nome, os parâmetros, as variáveis locais e o
tipo. Veja a descrição de cada um desses elementos, abaixo:
a) Nome – é o identificador pelo qual o subalgoritmo será chamado
no algoritmo principal.
b) Parâmetros – são os dados que permitem as relações entre o
subalgoritmo e o algoritmo. Ou seja, são os dados que o
subalgoritmo precisa receber para executar suas instruções e os
dados que ele retorna quando termina de executar. Por exemplo,
para realizar uma soma, os parâmetros recebidos são os números
que serão somados. Ao efetuar a soma, retornamos o resultado
dessa soma.
c) Variáveis locais – são as variáveis declaradas no subalgoritmo e
que só podem ser utilizadas dentro dele.
d) Tipo – os subalgoritmos podem ser de dois tipos: funções ou
procedimentos. A diferença entre ambos está no número de valores
que retornam ao final da execução. Uma função retorna sempre um
único valor. Um procedimento retorna vários valores ou nenhum.

ATIVIDADE 02
1. Quais os elementos de um subalgoritmo?
2. Quais os tipos de subalgoritmos? Qual a diferença entre os tipos?
3. Explique o que são variáveis locais. E parâmetros?

ESCOPO DE VARIÁVEIS

As variáveis que criamos no início de um algoritmo podem ser utilizadas


em qualquer lugar dentro do algoritmo. Se desejarmos utilizar tais variáveis
dentro de um subalgoritmo, por exemplo, podemos fazer isso sem problemas.
Essas variáveis são as variáveis globais.
Ao criarmos um subalgoritmo, porém, criamos variáveis específicas para
utilizarmos em seu interior. Tais variáveis são inicializadas no momento em que
o subalgoritmo está sendo executado e são válidas somente em seu interior.
Elas não são visualizadas fora dos limites do subalgoritmo. São as variáveis
locais.
A essa visibilidade das variáveis (se ela é local ou global) damos o nome
de escopo de variáveis. Trata-se da abrangência de uma variável, ou seja, em
que limites do algoritmo ela é visível e pode ser utilizada.
Veja, na Figura 1, como podemos ilustrar a hierarquia da visibilidade das
variáveis.
Figura 1: Hierarquia no escopo de variáveis
Fonte: Adaptação de Manzano (2005, p 186)

Veja que as variáveis A e B estão declaradas no algoritmo principal.


Logo, elas são variáveis globais que podem ser utilizadas em qualquer
subalgoritmo do conjunto que vemos na Figura 1.
Porém, declaramos a variável A novamente, em outro contexto, no
subalgoritmo 1. Essa nova variável A, nesse caso, não é a mesma que foi
criada no algoritmo principal. Trata-se de uma variável local do subalgoritmo 1
e que pode ser utilizada no subalgoritmo 1.1 (ou em qualquer subalgoritmo
interno ao subalgoritmo 1). A variável X é, também, local ao subalgoritmo 1 e
pode ser utilizada no subalgoritmo 1.1.
É declarada, no subalgoritmo 2.1, outra variável X, que é local naquele
subalgoritmo (ela não tem relação alguma com a variável X do subalgoritmo 1).
A variável M é local ao subalgoritmo 2 e pode ser utilizada no subalgoritmo 2.1.
a variável W é local ao subalgoritmo 1.1 e somente neste subalgoritmo pode
ser visualizada.

Uma variável local pode ter o mesmo nome de uma variável global.
Porém, uma vez declaradas em contextos diferentes, elas são distintas.

Além de melhorar o desempenho do algoritmo, essa divisão entre


variáveis locais e globais serve para definir os parâmetros de um subalgoritmo.
Ou seja, elas estabelecem a comunicação entre o subalgoritmo e o algoritmo
principal, que o chamou.
As variáveis globais do algoritmo servem como dados de entrada para o
subalgoritmo e as variáveis locais do subalgoritmo armazenam os dados
recebidos para, com eles, efetuar os cálculos necessários.
No caso das funções, como veremos adiante, a variável (local) de
retorno (através do comando retorne) serve como dado de saída da função
para o algoritmo principal e uma variável global recebe e armazena essa
informação. Ao acessar essa variável global, temos acesso ao valor de retorno
da função.
A maneira com que tratamos as variáveis dentro do algoritmo pode
afetar de forma direta o desempenho do programa, pois uma variável local é
liberada (um espaço na memória é liberado) assim que o subalgoritmo que a
utiliza termina de executar. Dessa forma, se uma variável vai ser utilizada
somente no interior de um subalgoritmo, não há necessidade de declará-la
como variável global.
Você pode utilizar variáveis globais nos subalgoritmos que você criar.
Porém, é recomendável que você utilize variáveis locais, pois isso permite que
o subalgoritmo seja executado sem interferir em outros subalgoritmos que
possam estar utilizando as mesmas variáveis.

ATIVIDADE 03
1. O que você entende por „escopo de variáveis‟?
2. Defina variável global e variável local.
3. Uma variável local pode ter o mesmo nome de uma variável local?
Explique por que.

FUNÇÕES
As funções, em algoritmos, seguem o mesmo princípio das funções
matemáticas que aprendemos na escola. Quando dizemos que f(x)=x+1, temos
duas variáveis (x e f(x)) e, com base no valor de uma delas, encontramos o
valor da outra.
Você viu, há pouco, que um subalgoritmo tem, como elementos, dentre
outros, os parâmetros, que são os dados que ele recebe para poder executar
suas instruções (as variáveis globais). Dessa forma, em uma função soma,
teríamos como parâmetros os números a serem somados (no caso da função
matemática acima, o x, que é informado pelo usuário) e como valor de retorno
o resultado da soma entre os números (nesse mesmo caso, o f(x), que é a
variável local onde fica armazenado o valor de retorno).

Uma função é um subalgoritmo que é chamado dentro do algoritmo


através da citação de seu nome (identificador) e deve retornar um único valor.

As funções, assim como as variáveis, devem ser declaradas antes de


serem inicializadas. Essa declaração deve estar posicionada no espaço após a
declaração das variáveis e antes do início da execução do algoritmo. Assim:

Algoritmo “<nome do algoritmo>”


Var
<declaração de variáveis do algoritmo>

<declaração da função>

Inicio
<corpo do algoritmo>
fimalgoritmo

A sintaxe da criação de uma função é a seguinte:


//cabeçalho, com o nome, os parâmetros e o tipo de retorno
Função <identificador> (<lista de parâmetros>:<tipo dos parâmetros>): <tipo
de retorno>
//declaração das variáveis da função
Var
<declaração das variáveis locais da função>
//inicio da execução da função
Inicio
<instruções>
//valor a ser retornado no algoritmo, ao chamar a função
retorne <valor de retorno>
fimfuncao

Veja o algoritmo abaixo, que utiliza uma função que soma dois números:

algoritmo "Funçao soma"


var
a,b, soma: inteiro //declaração das variáveis globais

funcao fsoma(a1, b1: inteiro):inteiro //declaração da função


var
resultado : inteiro //declaração de variáveis locais
Função criada
Inicio
resultado<-a1+b1 //instruções
retorne resultado //valor de retorno
fimfuncao

inicio
leia (a)
leia (b) Corpo do algoritmo
principal
soma <- fsoma(a,b) //chamada da função
escreva ("soma: ", soma)
fimalgoritmo

Observe que, após a declaração das variáveis globais do algoritmo (os


números a e b a serem somados e a variável soma, para armazenar o
resultado), criamos a função. O nome da função é fsoma. Os parâmetros são
os números inteiros que serão armazenados nas variáveis a1 e b1(variáveis
locais de fsoma). O tipo de retorno da função é inteiro. Outra variável local é a
variável resultado, onde será armazenado o resultado da soma entre a1 e b1.
No algoritmo principal, são recebidos dois números inteiros, que são
armazenados nas variáveis a e b. Chamamos, então, em uma expressão de
atribuição (nesse caso), a função fsoma, que armazenará em a1 e b1 os
valores de a e b, digitados, e retornará o valor encontrado na soma, que está
armazenado na variável resultado. Esse valor é, então, armazenado na variável
soma (por atribuição) e exibido, em seguida.
É importante salientar que:
a) Os parâmetros da função são separados por vírgula (como na declaração
de variáveis), se forem do mesmo tipo. Se forem de tipos diferentes,
devemos separá-los por ponto-e-vírgula (;).
b) O tipo de retorno da função, bem como todas as suas variáveis locais,
pode ser qualquer um entre os tipos de dados básicos que conhecemos:
inteiro, real, lógico, literal ou caractere. Porém, o VisuAlg não suporta
variáveis compostas (vetores e matrizes) como parâmetros de
subalgoritmos.
c) O comando retorne é utilizado para informar o valor de retorno da função
ao algoritmo, no momento em que a função é chamada.
d) A função é chamada sempre em uma expressão, em que o valor
armazenado na variável de retorno da função é atribuído a uma variável do
algoritmo.
e) Sempre que chamar a função é imprescindível que os parâmetros
passados (no caso do nosso exemplo, os valores das variáveis globais a e
b) devem, obrigatoriamente, estar entre parêntesis, na mesma ordem, ser
do mesmo tipo e em igual quantidade aos parâmetros da função (variáveis
locais a1 e b1).

ATIVIDADE 04
1. Determine o conceito de função.
2. Em que local do algoritmo a função deve ser definida?
3. Explique a sintaxe da criação de uma função.
4. De que forma é realizada a chamada de uma função?
5. Qual a utilidade do comando retorne?
6. Experimente remover a declaração da variável local resultado da função
que criamos em nosso exemplo e utilizar a variável global soma no
cálculo da expressão de soma e no retorno. Execute. O algoritmo
funcionou? Explique o motivo.
PROCEDIMENTOS
Um procedimento é um subalgoritmo, assim como a função. A principal
diferença entre ambos é a quantidade de valores retornados ao algoritmo que
os chama.
Um procedimento é um subalgoritmo que é chamado dentro do algoritmo
através da citação de seu nome (identificador) e deve retornar vários ou
nenhum valor.
Você viu, que uma função retorna um único valor, enquanto um
procedimento retorna vários ou nenhum. Existem, porém outras diferenças
importantes entre os dois:
Funções Procedimentos
Os procedimentos sempre retornarão
As funções retornam o seu valor de
seus valores por meio dos
forma explícita, por meio do comando
parâmetros. Não existe comando
retorne.
retorne.
Os procedimentos são chamados em
As chamadas às funções ocorrem comandos isolados, com as
sempre em expressões ou instruções instruções de entrada e saída de
de atribuição. dados (leia e escreva), e nunca em
expressões ou atribuições.

Os procedimentos devem ser criados e declarados na mesma posição


que as funções: após a declaração de variáveis dos algoritmos e antes do
início da execução do mesmo. Veja:

Algoritmo “<nome do algoritmo>”


Var
<declaração de variáveis do algoritmo>

<declaração do procedimento>

Inicio
<corpo do algoritmo>
fimalgoritmo
A sintaxe da criação de um procedimento é a seguinte:
//cabeçalho, com o nome e os parâmetros
procedimento <identificador> (var <lista de parâmetros>:<tipo dos
parâmetros>)
//inicio da execução do procedimento
Inicio
<instruções>
fimprocedimento

Veja o algoritmo abaixo, que utiliza um procedimento que calcula a área


de um triângulo:

algoritmo "Procedimento triangulo"


var
altura, base, área : real //declaração das variáveis globais

procedimento ptriangulo (var h,b,ar : real) //declaração do procedimento


inicio
Procedimento
ar <- (b*h)/2 //instruções criado
fimprocedimento

inicio
escreval ("Digite o valor da base: ")
leia (base)
escreval ("Digite o valor da altura: ") Corpo do algoritmo
principal
leia (altura)
ptriangulo(altura,base, area) //chamada ao procedimento
escreval (area,"m²")
fimalgoritmo

Veja que o procedimento é criado após a declaração das variáveis


globais do algoritmo. No momento da declaração do procedimento, seus
parâmetros (variáveis locais) são informados entre parêntesis, precedidos da
palavra chave var. Isso ocorre porque os procedimentos, como vimos há
pouco, retorna valores por meio dos parâmetros, diferente das funções, que
utilizam a instrução retorne. Como vimos anteriormente, os parâmetros
permitem a comunicação entre o subalgoritmo e o algoritmo que o chama.
Dessa forma, o procedimento recebe os valores através das variáveis
globais (no caso, altura e base) e os armazena em suas variáveis locais (h e b).
Após realizar o cálculo da área, o valor resultante é retornado, por meio da
variável local ar, e armazenado na variável global area.
Por isso, ao chamarmos o procedimento no algoritmo principal, devemos
fornecer os parâmetros (variáveis globais do algoritmo), entre parêntesis, na
mesma ordem, quantidade e tipo que os parâmetros (variáveis locais) do
procedimento.

ATIVIDADE 05
1. Explique, com suas palavras o que é um procedimento e quais as
diferenças entre procedimentos e funções, no que concerne às formas
de retorno e à chamada no algoritmo principal.

ATIVIDADES PARA ENTREGAR


1. Escreva um algoritmo e crie, nele, uma função que receba um número e
retorne a soma dos números inteiros positivos e menores que o número
digitado. Se o número digitado for negativo ou nulo, não chama a função
e mostra uma mensagem de erro.
2. Escreva um procedimento que mostre a área e o perímetro de um
retângulo, dados os valores de seus lados.
3. Escreva um algoritmo que receba um número inteiro e chame um
procedimento para calcular o quadrado desse número e outro
procedimento para calcular a raiz quadrada do mesmo.
4. Escreva um algoritmo que leia um número não determinado de pares de
valores x,y (x obrigatoriamente deve ser menor que y), todos inteiros e
positivos, um par de cada vez. Para cada par, chame uma função que
determine a soma dos números primos entre x e y (inclusive). O
algoritmo deverá mostrar os valores de x e y, seguidos pelo somatório
calculado. A leitura de pares terminará quando os valores digitados para
x e y forem iguais.
REFERÊNCIAS

TONET, Bruno; KOLIVER, Cristian. Introdução aos Algoritmos. Universidade


de Caxias do Sul. NAPRO – Núcleo de Apoio à Aprendizagem de
Programação. 2004. Disponível em:
<http://www.guanabara.info/logica/Apostilas/VisuAlg_Ref.pdf> . Acesso em: 21
Dez. 2009.

COSTA Yandre M e G. Funções em C. Notas de aula. Universidade Estadual


de Maringá. MG, 2009. Disponível em: <
http://www.din.uem.br/~yandre/AEDEP/funcoes-C-grande.pdf >. Acesso em: 04
Jan. 2010.

SUBALGORITMOS. Disponível em:


<http://www.dimap.ufrn.br/~dario/arquivos/dim320-apostila-3.pdf>. Acesso em:
04 Jan. 2010.

MANZANO, José A N G; OLIVEIRA, Jair F de. Algoritmos: Lógica para


desenvolvimento e programação de computadores.17ed. São Paulo: Erica,
2005.

PREUSS, Evandro. Algoritmos e Estruturas de Dados I. Universidade


Regional Integrada do Alto Uruguai e das Missões. 2002. Disponível em: <
http://www.dca.ufrn.br/~nogueira/dca0800/material/algoritmos.doc >. Acesso
em 08 Jan. 2010.

You might also like