Buscar

Funções em Scilab - aula 9

Prévia do material em texto

1 
1 
Universidade	
  Federal	
  de	
  Ouro	
  Preto	
  -­‐	
  UFOP	
  	
  
Departamento	
  de	
  Computação	
  	
  -­‐	
  DECOM	
  
Programação	
  de	
  Computadores	
  I	
  –	
  BCC701	
  
www.decom.ufop.br/moodle	
  
}  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 
DCC001 2013-1 2 
2 
}  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 
DCC001 2013-1 4 
3 
}  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 
 
 
 
 
 
devemos adaptá-lo para o cálculo dos 
fatoriais de n, n-k e k 
fat = 1; 
for i = 1:n 
 fat = fat*i; 
end 
6 DCC001 2013-1 
4 
7 
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) 
 nComb = fatorial(n)/(fatorial(n-k) * fatorial(k)) 
 
 function fat = fatorial(n) 
 fat = 1; 
 for i = 1:n 
 fat = fat*i; 
 end 
 endfunction 
Função combinacoes 
Função Fatorial Uso do Módulo 
Detalhes 
do Módulo 
8 DCC001 2013-1 
5 
DCC001 2013-1 9 
 function fat = fatorial(n) 
 fat = 1; 
 for i = 1:n 
 fat = fat*i; 
 end 
 endfunction 
10 DCC001 2013-1 
6 
 function fat = fatorial(n) 
 fat = 1; 
 for i = 1:n 
 fat = fat*i; 
 end 
 endfunction Parâmetro de Saída 
É calculado pela 
função 
Parâmetro de 
Entrada 
É fornecido na 
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 
[raiz1,raiz2] = eq2g(x,y,z) 
Chamada da função eq2g 
12 DCC001 2013-1 
7 
}  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 sobre os 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 
8 
}  Os valores dos parâmetros de saída 
da função são retornados para a 
expressão em que a função foi 
chamada 
}  O controle de execução do 
programa é devolvido para o ponto 
de chamada 
15 DCC001 2013-1 
DCC001 2013-1 16 
//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) 
9 
DCC001 2013-1 17 
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 
DCC001 2013-1 18 
10 
function nComb = Combinacoes(n,k) 
 nComb = fatorial(n)/... 
 (fatorial(n-k) * fatorial(k)) 
endfunction 
exec("Combinacoes.sci") 
exec("fatorial.sci") 
n=input("n="); k=input("k="); 
printf("nComb(%d,%d) = %d",n,k,Combinacoes(n,k)) 
Nosso 
programa 
transformado 
em função 
Programa principal 
19 DCC001 2013-1 
DCC001 2013-1 20 
Programa 
Principal 
Função 
nComb 
Função 
Fatorial 
11 
}  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 
DCC001 2013-1 22 
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); 
12 
DCC001 2013-1 23 
}  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 
13 
25 DCC001 2013-1 
}  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 
 exec("fatorial.sci") 
 n=input("n="); k=input("k="); 
 nComb = fatorial(n)/... 
 fatorial(n-k)*fatorial(k) 
26 DCC001 2013-1 
14 
DCC001 2013-1 27 
}  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 
DCC001 2013-1 28 
15 
}  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 
16 
}  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 
17 
}  Função MenorFator 
◦  Encontra o menor fator de um número 
◦  Usa a função modulo, que é fornecida pelo Scilab 
DCC001 2013-1 33 
function f = menorFator(q) 
 f = 2; 
 while modulo(q,f) ~= 0 
 f = f + 1; 
 end 
endfunction 
}  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çõespermite o desenvolvimento 
gradual de programas por refinamentos sucessivos 
34 DCC001 2013-1 
18 
 
 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 
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

Continue navegando