Você está na página 1de 34

Programação de

Computadores

Michael A. Pontes
Funções e Procedimentos
Abordagem
 Técnica de modularização de programas que
utiliza estruturas chamadas de
procedimentos ou funções;
 Técnica de resolução de problemas que
utiliza a recursividade;
Procedimentos e Funções
 Uma forma usual de resolver um problema complexo
é procurar “quebrá-lo” em “problemas menores” ou
subproblemas.
 dividir para conquistar.
 Ao resolver cada subproblema estamos na verdade
resolvendo uma parte do problema em questão.
 Se algum dos subproblemas for ainda muito
complexo, podemos dividi-lo em outros
subproblemas e assim sucessivamente.
 Esta abordagem de solução de problemas é
chamada de top-down, pois partimos de um nível de
abstração alto (isto é, todo o problema) e vamos
fazendo refinamentos sucessivos definindo cada um
dos subproblemas envolvidos na solução do
problema.
Procedimentos e Funções
 Da mesma forma podemos dividir
um programa em programas
menores.
 A esta técnica chamamos
modularização.
Modularização
 Estes programas menores chamaremos módulos ou
subprogramas.
 Os módulos ou subprogramas podem ser de dois
tipos: procedimentos ou funções.
 São utilizados no que chamamos programa principal,
que é aquele que “chama” (dispara a execução) os
subprogramas.
 Um subprograma pode também chamar outro
subprograma.
 Um módulo pode passar ou receber variáveis de
outro módulo. Estas variáveis recebem o nome de
parâmetros do módulo
Modularização
 A modularização consiste em dividir o
programa em subprogramas.
 Criamos módulos contendo um grupo de
comandos que irão ser executados como um
bloco.
 Se este bloco de comandos é
freqüentemente utilizado só precisamos fazer
a sua codificação uma única vez.
Programação Modular
 A programação modular consiste numa
metodologia de projeto de programas
visando facilitar:
 a escrita dos programas;
 a leitura e o entendimento dos programas
pelos programadores;
 a verificação da correção do programa;
 a manutenção e modificação dos programas.
Programação Modular
 Dentre as vantagens da modularização de
programas podemos citar:
 Partes comuns a vários programas ou que se repetem
dentro de um mesmo programa são programadas e
testadas uma única vez, mesmo que tenham que ser
executadas com variáveis diferentes;
 Podemos construir bibliotecas de programas, isto é,
uma coleção de módulos que podem ser usados em
diferentes programas sem alteração;
 A modularização dos programas permite preservar na
sua implementação os refinamentos obtidos durante o
desenvolvimento dos algoritmos;
 Economia de memória do computador, uma vez que o
módulo é armazenado uma única vez, mesmo que
utilizado em diferentes partes do programa.
Programação Modular
 Uma desvantagem que podemos citar é que
existe um acréscimo de tempo de execução
dos programas constituídos de módulos,
devido ao tratamento adicional necessário
para ativação/desativação do módulo,
embora este tempo possa ser considerado
desprezível com os processadores atuais.
 Você deve estar se perguntando: Como
dividir um programa em módulos?
Programação Modular
 A resposta a esta pergunta é: Utilize as seguintes
regras para a divisão de um programa em módulos:
 Mantenha os módulos o mais auto-suficientes
possível.
 Mantenha o número de variáveis passadas como
parâmetros de um modulo para outro o mínimo
possível.
 Faça cada modulo realizar bem uma única tarefa.
 Faça com que cada módulo possa ser visto como
uma “caixa-preta”.
 Se possível mantenha o tamanho do módulo com
no máximo 50 linhas de código.
Programação Modular
 Um algoritmo agora terá a seguinte estrutura:
inicio
declaração de constantes;
declaração de variáveis;
declaração de subprogramaA(procedimento ou função)
{ // corpo do subprograma
comandos;
}
declaração de subprogramaB(procedimento ou função)
{ // corpo do subprograma
comandos;
}
...
{ // corpo do programa principal
comando-1;
comando-2;
...
comando-n;
}
Fim.
Procedimentos
 São módulos que executam tarefas específicas.
 Os procedimentos são como programas dentro de
programas.
 Os procedimentos têm:
 um nome;
 uma lista de parâmetros;
 variáveis e constantes próprias;
 bloco de comandos.
Procedimentos
 A lista de parâmetros pode não existir em um
procedimento.
 Ela representa a “entrada de dados” do procedimento.
 Os parâmetros da lista de parâmetros são declarados
e utilizados como se fossem variáveis normais do
programa.
 A ordem em que os parâmetros aparecem na lista é
extremamente importante.
Procedimentos
 Um procedimento tem a seguinte estrutura:
procedimento nomeDoProcedimento (<lista de parâmetros>)
{
declaração de variáveis;
comandos
}
Procedimentos
 Exemplo: Construa um algoritmo que utilize um procedimento
que imprima o valor da soma de dois números inteiros,
fornecidos como parâmetros.
inicio
real num1, num2;
procedimento soma(real a, real b) Observe que para chamar
{ um procedimento
real s; basta colocar o nome do
s = a + b; procedimento em
escreva("Soma: ", s);
uma linha de comando,
}// soma seguidos dos
{ // início do algoritmo parâmetros, se definidos.
escreva(“Entre com o primeiro valor:”);
No nosso exemplo temos:
leia (num1);
soma(num1, num2);
escreva(“Entre com o segundo valor:”);
leia (num2);
soma(num1, num2);
}
Fim.
Funções
 As funções são “procedimentos” que retornam um
valor.
 Executam tarefas específicas porém, retornam um
valor para o programa ou módulo que o chamou.
 São parecidas com as funções matemáticas, pois
retornam um valor.

Note que a ênfase está na característica “retorno de valor”


Funções
 Em algum lugar da função (geralmente seu último
comando) deve existir o comando:
 retorne (expressão);
 onde será avaliada a expressão e seu valor será
retornado pela função.
Funções
 Uma função tem a seguinte estrutura:
tipoRetorno função nomeFunção (<lista de parâmetros>)
{
declaração de variáveis;
comandos;
retorne(expressão);
}
Funções
 Para executar uma função, “chamamos” a função
dentro de um comando.
 A chamada de uma função pode ser usado no lugar de
uma variável dentro de uma expressão.
 Exemplo:
se (funçãoA(x) > 0) // o resultado da função será
comparado com zero
então ...
senão ...
Funções
 Chamamos de efeito colateral quando uma função faz
mais alguma coisa além de retornar um valor.
 O efeito colateral é uma fonte potencial de problemas
nos programas.
 Idealmente uma função nunca deveria ter um efeito
colateral, isto é, nunca deveria fazer nada além de
retornar um valor.
Funções
 Como regra geral quando for criar uma função:
 Evite atribuir valores a variáveis globais
 Evite utilizar passagem de parâmetros por referencia (A
função já retorna um valor para o programa principal, o
objetivo da passagem por referência é a de alterar a
variável do programa chamador).
 Evite I/O, já que o I/O é um efeito colateral.
 A passagem por referência pode criar uma série de
dificuldades na programação. Teoricamente uma função
não deveria alterar os seus parâmetros de entrada.
Funções
 Siga as seguintes regras para uma correta utilização
dos tipos de parâmetros:
 Sempre que possível utilize a passagem de parâmetros
por valor.
 Se um procedimento necessita retornar um único valor,
transforme-o em uma função.
 Se uma função necessitar retornar mais de um valor
transforme-a em um procedimento e passe os
parâmetros por referência. (veremos mais na frente)
 Quando passar estruturas de dados grandes, prefira a
passagem por referência, pois o sistema operacional não
irá precisar copiar toda a estrutura, ele vai passar
somente o endereço da estrutura.
Funções
 Exemplo: Construa um algoritmo que utilize uma
função para efetuar a soma de dois números inteiros
fornecidos como parâmetros, e retornar o valor ao
programa principal. Em seguida, some a este valor o
conteúdo de um terceiro valor informado também pelo
usuário.
Funções
inicio
real num1, num2, num3;
inteiro função soma(inteiro a, inteiro b )
{
real s;
s . a + b;
retorne (s); Para chamar uma função devemos
} ter uma variável no módulo
{ //início do programa principal chamador responsável por receber o
escreva (`Informe o primeiro valor`)
valor a ser retornado pela função.
leia(num1);
escreva (`Informe o segundo valor`)
No nosso exemplo, temos:
leia(num2); num3 = num3 + soma(num1, num2);
escreva (`Informe o terceiro valor`)
leia(num3);
num3 . num3 + soma(num1, num2);
escreva (num3);
}
Fim.
Funções
 Quando devo utilizar uma função ou procedimento?
 As seguintes observações devem ser consideradas:
 Os procedimentos podem ser vistos como extensões
da linguagem algorítmica: podemos criar novos
comandos com eles.
 As funções permitem criar novas expressões
chamando as funções criadas pelo programador.
Escopo de Variáveis
 O escopo é a abrangência ou área de atuação de
uma variável em um algoritmo. O escopo define o
ciclo de vida de uma determinada variável dentro de
um algoritmo.
 Temos dois tipos de escopo de variáveis:
 Global
 Local
Variáveis Globais
 Existem durante toda execução do algoritmo.
 Ao iniciar o algoritmo (programa) as variáveis globais
são alocadas na memória principal, e por isso
mesmo, podem ser utilizadas tanto no corpo do
algoritmo principal como dentro de procedimentos e
funções, pois só serão desalocadas quando terminar
a execução do algoritmo.
Variáveis Locais
 Sua existência é local ao módulo onde está definida, ou seja, são
alocadas na memória principal quando executados o procedimento
ou função na qual foram definidas. Sendo desalocadas ao término
da execução do procedimento ou função.
 Observações:
 Um subprograma (procedimento ou função) pode chamar outro
subprograma;
 Um subprograma pode usar variáveis do programa principal;
 Um programa principal não pode usar variáveis definidas nos
subprogramas.
 Utilize variáveis globais somente quando um dado for utilizado
pela maioria dos módulos de um programa.
 As constantes são bons exemplos de variáveis globais.
Passagem de Parâmetros
 Na elaboração de algoritmos modularizados,
freqüentemente necessitamos passar informações
entre os módulos, isto é, criar um meio de
comunicação entre os módulos. A estas informações
passadas entre os módulos chamamos de
parâmetros.
Passagem de Parâmetros
 Os parâmetros podem ser passados de duas formas:
 por valor;
 por referência

 Na passagem de parâmetros por valor, os parâmetros


são copiados e passados para o módulo. Neste caso,
os parâmetros não sofrem alteração em seu valor
quando retornados ao módulo chamador.
 Funciona como uma atribuição de um valor a uma
variável temporária, ou seja uma modificação na
variável temporária não tem efeito na variável original.
Passagem de Parâmetros
 Exemplo
inicio
inteiro a,b,c; //Declaração de variáveis globais
{
procedimento media(inteiro m, inteiro n, inteiro o);
{
real md; Na passagem de parâmetros por
m  m + n + o; referência, o endereço do parâmetro
md . m/3; é passado para o módulo e este usa
escreva („Média: ‟, md); o objeto original (isto é, o parâmetro
} passado) em suas operações. Por isso,
{ // Programa principal o parâmetro recebido pelo módulo
a = 5; chamado pode ser modificado e retornado
b = 7; para o resto do programa.Utilizaremos a
c = 3; palavra chave ref para indicar
media(a, b, c); passagem por referência.
escreva(„a = „, a, „b = „, b, „c = „, c);
}
Passagem de Parâmetros
 Exemplo
inicio
inteiro a,b,c; //Declaração de variáveis globais
{
procedimento media(ref inteiro m, n; inteiro o)//só é ref m e n, logo a var o não será alterada
{
real md;
m  m + n + o;
n  0;
ï  0;
md  m/3;
escreva („Média: ‟, md);
Se uma função necessitar retornar
} mais de um valor transforme-a em um
{ // Programa principal procedimento e passe os parâmetros
a  5; por referência.
b  7;
c  3;
media(a, b, c);
escreva(„a = „, a, „b = „, b, „c = „, c); //ele imprimirá aqui a=15, b=0 e i=3
}
fim
Passagem de Parâmetros
 Exemplo
inicio
inteiro a,b,c;
{
procedimento media(ref inteiro m, n; inteiro o)//só é ref m e n, logo a var o não será alterada
{
m  m + n + o;
n  m/3;
}
{ // Programa principal
a  5;
b  7;
c  3;
media(a, b, c);
escreva(“a media é =”,n);

escreva(“a soma dos três números é =”,m);


}
Fim.

Você também pode gostar