Você está na página 1de 13
UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE ESCOLA DE CIÊNCIAS E TECNOLOGIA ECT1103 - INFORMÁTICA
UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE ESCOLA DE CIÊNCIAS E TECNOLOGIA ECT1103 - INFORMÁTICA
UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE ESCOLA DE CIÊNCIAS E TECNOLOGIA ECT1103 - INFORMÁTICA

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

e

Keivillany Janielle de Lima Coelho (keivycoelho@hotmail.com).

produzidos

pelos

autores:

Nélio

Alessandro

Azevedo

Cacho

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

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

Inicio resultado<-a1+b1 //instruções retorne resultado //valor de retorno fimfuncao

inicio

leia (a)

leia (b)

soma <- fsoma(a,b) //chamada da função

escreva ("soma: ", soma) fimalgoritmo

Função criada

Corpo do algoritmo principal

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

As funções retornam o seu valor de forma explícita, por meio do comando retorne.

Os procedimentos sempre retornarão seus valores por meio dos parâmetros. Não existe comando retorne.

As chamadas às funções ocorrem sempre em expressões ou instruções de atribuição.

Os procedimentos são chamados em comandos isolados, com as instruções de entrada e saída de 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

ar <- (b*h)/2 //instruções

fimprocedimento

inicio ar <- (b*h)/2 //instruções fimprocedimento Procedimento criado inicio escreval ("Digite o valor da

Procedimento

criado

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

Corpo do algoritmo principal

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

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.