Universidade Federal de Ouro Preto - UFOP
Departamento de Computação - DECOM
Programação de Computadores I – BCC701
www.decom.ufop.br/moodle
1

Modularização do código:
◦ Divisão do problema em subproblemas
◦ Encapsulamento de detalhes de implementação




Maior legibilidade do código
Maior facilidade de depuração do código
Reaproveitamento de código
Desenvolvimento de programas top-down
2
DCC001 2013-1

Já usamos muitas funções pré-definidas
◦
◦
◦
◦

modulo(x,y)
abs(x)
plot2d(X,Y)
gsort...
E agora sabemos como definir novas
funções!!!!
3
4
DCC001 2013-1

Defina uma função combinações
que receba como parâmetros 2
inteiros n e k e retorne o número de
combinações de n objetos em grupos de
k objetos, dado pela fórmula
5
DCC001 2013-1
Para reaproveitar o código
fat = 1;
for i = 1:n
fat = fat*i;
end
devemos adaptá-lo para o cálculo dos
fatoriais de n, n-k e k
6
DCC001 2013-1
n=input("n="); k=input("k=");
fat_n = 1; // Cálculo do fatorial de n
for i = 1:n
fat_n = fat_n * i;
end
fat_n_k = 1; // Cálculo do fatorial de n-k
for i = 1:(n-k)
fat_n_k = fat_n_k * i;
end
fat_k = 1; // Cálculo do fatorial de k
for i = 1:k
fat_k = fat_k * i;
end
nComb = fat_n/(fat_n_k * fat_k)
7
DCC001 2013-1
Função combinacoes
nComb = fatorial(n)/(fatorial(n-k) * fatorial(k))
Uso do
Módulo
Função Fatorial
function fat = fatorial(n)
fat = 1;
for i = 1:n
fat = fat*i;
end
endfunction
Detalhes
do Módulo
8
DCC001 2013-1
9
DCC001 2013-1
function fat = fatorial(n)
fat = 1;
for i = 1:n
fat = fat*i;
end
endfunction
10
DCC001 2013-1
function fat = fatorial(n)
fat = 1;
for i = 1:n
fat = fat*i;
Parâmetro de
end
Entrada
É fornecido na
Parâmetro
de Saída
endfunction
É calculado pela
função
chamada da
função
11
DCC001 2013-1
function [r1, r2] = eq2g(a,b,c)
delta = b^2 - 4*a*c
r1 = (-b + sqrt(delta))/(2*a)
r2 = (-b - sqrt(delta))/(2*a)
endfunction
Chamada da função eq2g
[raiz1,raiz2] = eq2g(x,y,z)
12
DCC001 2013-1



Valores dos argumentos de entrada (que
podem ser expressões) são copiados sobre
os parâmetros da função
O controle é transferido para a função, que
opera sobre os valores dos parâmetros
Os parâmetros da função somente têm
existência como variáveis durante a
execução da função
13
DCC001 2013-1



Alterações feitas pela função sobreos valores
dos parâmetros formais não afetam os
argumentos passados para a função
Variáveis utilizadas pela função não têm nada
a ver com variáveis de mesmo nome
existentes no programa que chama a função;
Estas variáveis locais ganham existência
somente durante a execução da função
14
DCC001 2013-1
Os parâmetros de saída
(normalmente termos em uma
expressão, como em y = 1 +
sin(x) ) recebem os valores
calculados pela função
 O controle é devolvido para o ponto
de chamada

15
DCC001 2013-1
//Combinações de n k a k
exec("fatorial.sci");
n = input("n = ");
k = input("k = ");
printf("\nAntes da chamada de fatorial(n)");
pause;
fat_n = fatorial(n);
printf("\nAntes da chamada de fatorial(k)");
pause;
fat_k = fatorial(k);
printf("\nAntes da chamada de fatorial(n-k)");
pause
fat_n_k = fatorial(n-k);
Comb_n_k = fat_n/(fat_k * fat_n_k);
printf("Comb(%d,%d) = %d",n,k,Comb_n_k)
16
DCC001 2013-1
function fat = fatorial(v)
printf("\nIniciando fatorial(%d)",v);
pause;
fat = 1;
for i = 1:v
fat = fat*i
end
printf("\nTerminando fatorial(%d)",v);
pause;
endfunction
17
DCC001 2013-1
18
DCC001 2013-1
function nComb = Combinacoes(n,k)
nComb = fatorial(n)/...
(fatorial(n-k) * fatorial(k))
endfunction
Nosso
programa
transformado
em função
Programa principal
exec("Combinacoes.sci")
exec("fatorial.sci")
n=input("n="); k=input("k=");
printf("nComb(%d,%d) = %d",n,k,Combinacoes(n,k))
19
DCC001 2013-1
Programa
Principal
Função
nComb
Função
Fatorial
20
DCC001 2013-1

Parâmetros de entrada e de saída de uma
função podem ser qualquer coisa:
◦
◦
◦
◦
◦
números,
strings,
booleanos,
matrizes de qualquer tipo,
e até mesmo outra função!
function plotaPontos(f,x)
y = f(x);
plot2d(x,y);
endfunction
21
DCC001 2013-1
function y = minhaFunc(x)
y = exp(- x .^ 2);
endfunction
// Testador PlotaPontos
exec(“plotaPontos.sci");
exec(“minhaFunc.sci");
x = 0:0.1:2*%pi;
plotaPontos(sin,x);
plotaPontos(minhaFunc,x);
22
DCC001 2013-1
23
DCC001 2013-1


Uma função é normalmente escrita em um arquivo
separado do arquivo com o programa principal
O arquivo com a função deve ter
◦ o mesmo nome da função
◦ a extensão

.sci (um programa tem a extensão .sce)
Para “incorporar” uma função ao Scilab, use
exec(<nome do arquivo com a função>) no
programa cliente
24
DCC001 2013-1
25
DCC001 2013-1
exec("fatorial.sci")
n=input("n="); k=input("k=");
nComb = fatorial(n)/...
fatorial(n-k)*fatorial(k)


O Scilab só toma conhecimento da existência
de uma função através do comando exec
O arquivo com a função deve estar no mesmo
diretório do programa que chama a função
26
DCC001 2013-1
27
DCC001 2013-1
Técnica: chamada da função antes de
seu desenvolvimento
 O programador deve especificar o
resultado desejado da função,
postergando o trabalho de determinar
como obter este resultado

28
DCC001 2013-1

Sabendo que o conjunto de números
primos é infinito,
◦ Construir um programa que lê uma série de
números e, para cada número lido, encontra o
menor primo que seja maior ou igual a ele
◦ Se, por exemplo, o número lido for 4, o
programa deve encontrar o número primo 5; se
for 11, o programa deve encontrar o próprio 11.
◦ O programa deve terminar quando o número
lido for menor ou igual a 1
29
DCC001 2013-1

Programa principal
◦ Cuida da interação com o usuário
◦ O problema de encontrar o menor primo ≥ n é
“empurrado” para uma função
n = input("n = ");
while n >= 2
// Encontra o menor primo >= n
// e imprime o resultado
printf("O menor primo >= %d é %d",...
n,menorPrimoMaiorOuIgual(n))
// Lê n
n = input("n = (use n < 2 se quiser parar):");
end
30 DCC001 2013-1

Função MenorPrimoMaiorOuIgual
◦ Loop de procura por um primo
◦ Não interage com o usuário
◦ Empurra o problema de saber se um número é primo
para outra função
function p = menorPrimoMaiorOuIgual(n)
p = n;
while ~primo(p)
p = p+1
end
endfunction
31
DCC001 2013-1

Função Primo
◦ Testa se um número é primo
◦ A saída é booleana: %t se for primo, %f senão
◦ Usa a função MenorFator(q) que calcula o menor
divisor de q diferente de 1
function ehPrimo = primo(k)
ehPrimo = (k == menorFator(k));
endfunction
32
DCC001 2013-1

Função MenorFator
◦ Encontra o menor fator de um número
◦ Usa a função modulo, que é fornecida pelo Scilab
function f = menorFator(q)
f = 2;
while modulo(q,f) ~= 0
f = f + 1;
end
endfunction
33
DCC001 2013-1



Funções são uma ferramenta muito útil de
modularização
Seu uso permite o reaproveitamento de código e o
encapsulamento de detalhes
O uso de funções permite o desenvolvimento
gradual de programas por refinamentos sucessivos
34
DCC001 2013-1
Escreva um programa que faça a
leitura de n valores.
Para cada valor x lido, o programa
deve calcular o valor f(x), onde f é a
função definida como f(x) = x – sqrt(x).
Os valores f(a) calculados devem ser
acumulados em um somatório.
Ao final, o programa imprime o valor
do somatório calculado.
35
Introdução
function f = myF(x)
f = x - sqrt(x);
endfunction
n = input("QUANTIDADE DE LEITURAS: ");
soma = 0;
for i = 1:n
x = input("DIGITE UM VALOR: ");
soma = soma + myF(x);
end
printf("\nSOMATÓRIO CALCULADO: %7.3f",
soma);
36
Introdução
Codifique um programa que calcule a série a seguir, onde
n é o número de parcelas.
Cada parcela contém um numerador e um denominador. O
Cálculo de ambos deve ser feito por funções definidas pelo
usuário.
Ao final o programa imprime o valor da série.
37
Introdução
function res = numerador(x)
res = x - sin(x);
endfunction
// -------------------------------------------------------------------------------------------------------
function res = denominador(x)
res = x^3 - cos(2 * x);
endfunction
// ---------------------------------------------------------------------------------------------
n = input("QUANTIDADE DE PARCELAS: ");
soma = 0;
for i = 1:n
soma = soma + numerador(i) / ...
denominador(i);
end
printf("\nSOMATÓRIO CALCULADO: %7.3f", soma);
38
Download

9. Funções: segunda parte - Decom