computação e programação - fenix.tecnico.ulisboa.pt 21.pdf · aula teórica 21 computação e...

17
1 Instituto Superior Técnico, Dep. de Engenharia Mecânica - ACCAII Aula Teórica 21 Computação e Programação MEMec - LEAN 1º Semestre 2010-2011 Miguel Silva, José Borges Computação e Programação 2010/2011 3 Tópicos Avançados sobre Funções Utilização de function handles como funções anónimas como argumentos de funções Funções encadeadas (nested functions) Funções recursivas Alinhamento da AT 21

Upload: hacong

Post on 02-Dec-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

1

Instituto Superior Técnico,

Dep. de Engenharia Mecânica - ACCAII

Aula Teórica 21

Computação e ProgramaçãoMEMec - LEAN

1º Semestre 2010-2011

Miguel Silva, José Borges Computação e Programação 2010/2011 3

• Tópicos Avançados sobre Funções

• Utilização de function handles

• como funções anónimas

• como argumentos de funções

• Funções encadeadas (nested functions)

• Funções recursivas

Alinhamento da AT 21

2

Miguel Silva, José Borges Computação e Programação 2010/2011 4

• Tópicos Avançados sobre Funções

• Utilização de function handles

• como funções anónimas

• como argumentos de funções

• Funções encadeadas (nested functions)

• Funções recursivas

Alinhamento da AT 21

Miguel Silva, José Borges Computação e Programação 2010/2011

Template de uma callback para GUIs

5

HANDLES STRUCTURE (handles): apontador para

uma estrutura com atributos e propriedades (osmesmos visualizáveis no Property Inspector) de todasas componentes existentes na GUI, bem como dadosespecíficos da aplicação.

OBJECT HANDLE (hObject): estrutura com atributose propriedades (os mesmos visualizáveis noProperty Inspector) da componente que disparou acallback

3

Miguel Silva, José Borges Computação e Programação 2010/2011 6

• Tópicos Avançados sobre Funções

• Utilização de function handles

• como funções anónimas

• como argumentos de funções

• Funções encadeadas (nested functions)

• Funções recursivas

Alinhamento da AT 21

Miguel Silva, José Borges Computação e Programação 2010/2011

Definição de function handle

7

• O function handle é um tipo de dados do MATLAB,que cria uma apontador para uma função, ouconjunto de instruções, e permite fazer a chamada aessa função de um modo indirecto.

• É possível utilizar um function handle comoargumento de funções.

• No momento em que se cria o function handle énecessário que a função associada esteja definida nopath (caminho) e/ou no âmbito actual.

4

Miguel Silva, José Borges Computação e Programação 2010/2011 8

Descrição: Um function handle retorna um handle (apontador) para a função especificada

Sintaxe:

handle = @(arglist)conjuntoDeInstrucoes

ou

handle = @functionname

ou

handle = str2func(functionname)

Function handle genérico

Miguel Silva, José Borges Computação e Programação 2010/2011

Definição de function handle

9

• Quando são criadas, as function handle guardam todaa informação necessária para a função ser executada.

• Na chamada à função, utilizando o seu functionhandle, as condições anteriores não têm que severificar, e portanto a função pode ser executadaposteriormente.

• Por exemplo, pode-se executar uma sub-função forado seu âmbito (.m file onde está definida) utilizandoum function handle, desde que o handle tenha sidocriado no âmbito da sub-função (.m file onde estádefinida).

5

Miguel Silva, José Borges Computação e Programação 2010/2011

Funções anónimas

10

Descrição: Uma função anónima é uma função muito simples que não necessita de ser guardada num ficheiro.m. Utiliza-se para simplificar programas ,quando os cálculos são muito simples. Podem ser criadas na linha de comandos, ou num script.

Sintaxe: fnhandle = @(arglist)codigoDaFuncao

Miguel Silva, José Borges Computação e Programação 2010/2011

Exemplos

11

>> h_areaRect = @(larg,alt)larg*alt;

>> area=h_areaRect(2,4)

area =

8

>> myFun1 = @(x) x.^2 - 2*x + 1;

>> myFun1(4)

ans =

9

6

Miguel Silva, José Borges Computação e Programação 2010/2011

Exemplos

12

>> printAnonim=@()fprintf('%.2f\n',rand);

>> printAnonim()

0.81

>> printAnonim

printAnonim =

@()fprintf('%.2f\n',rand)

Miguel Silva, José Borges Computação e Programação 2010/2011

Exemplos

13

>> driverMyfun2

>> Introduza uma expressão em ordem a x: x^2 + 2

Introduza um valor para x: 2

O valor de myFun2(2.00): 6.00

7

Miguel Silva, José Borges Computação e Programação 2010/2011

Bibliotecas de funções anónimas

14

• É possível guardar num ficheiro .mat, funções anónimaslogicamente relacionadas, de modo a ser possível reutilizá-las.

>> areaRect = @(larg,alt) larg*alt;

>> areaCirc = @(raio) pi*raio^2;

>> save funcAnonimAreas areaRect areaCirc

>> clear

>> whos

Miguel Silva, José Borges Computação e Programação 2010/2011

Bibliotecas de funções anónimas

15

>> load funcAnonimAreas

>> whos

Name Size Bytes Class Attributes

areaCirc 1x1 16 function_handle

areaRect 1x1 16 function_handle

8

Miguel Silva, José Borges Computação e Programação 2010/2011

Function handles usados com funções

16

• Os function handles podem ser criadas para funções builtin(pré-definidas) ou para funções definidas pelo programador

>> h_fact = @factorial;

>> h_fact(5)

ans =

120

Miguel Silva, José Borges Computação e Programação 2010/2011

Exemplos de utilização

17

>> hndl = @myFun3

hndl =

@myFun3

>> hndl = str2func('myFun3')

hndl =

@myFun3

>> myFun3(5)

ans =

16

>> hndl(5)

ans =

16

9

Miguel Silva, José Borges Computação e Programação 2010/2011

Function handle como argumento

18

>> hndl = @myFun3;

>> fnfnexamp(myFun3)

??? Input argument "x" is undefined.

Error in ==> myFun3 at 3

res = x.^2 - 2*x + 1;

>> fnfnexamp(hndl)

Miguel Silva, José Borges Computação e Programação 2010/2011 19

• Tópicos Avançados sobre Funções

• Utilização de function handles

• como funções anónimas

• como argumentos de funções

• Funções encadeadas (nested functions)

• Funções recursivas

Alinhamento da AT 21

10

Miguel Silva, José Borges Computação e Programação 2010/2011

Function handle criado na função

20

>> fnstrfn2('sin')

Miguel Silva, José Borges Computação e Programação 2010/2011

A função feval

21

Descrição: Avalia a função especificada por um function handleou pelo nome da função, nos argumentos fornecidos.

Sintaxe: [y1,..,yn] = feval(F,x1,...,xn)

>> z = feval('sin',[0,pi/2,pi,3*pi/2])

z =

0 1.0000 0.0000 -1.0000

>> q = feval(@cos,[0,pi/2,pi,3*pi/2])

q =

1.0000 0.0000 -1.0000 -0.0000

11

Miguel Silva, José Borges Computação e Programação 2010/2011

Utilização da função eval

22

>> fnstrfn('cos')

Miguel Silva, José Borges Computação e Programação 2010/2011

Vantagens dos function handles

23

• Os function handle podem ser passadas como argumentos defunções.

• Desempenho melhora quando as funções são executadasvárias vezes.

• As funções privadas, encadeadas e as sub-funções podem seracessíveis em qualquer parte se forem criadas as respectivasfunction handle.

• Logo, uma função (implementada numa m-file) pode ter váriasfunções acessíveis fora do contexto dessa m-file.

12

Miguel Silva, José Borges Computação e Programação 2010/2011 24

• Tópicos Avançados sobre Funções

• Utilização de function handles

• como funções anónimas

• como argumentos de funções

• Funções encadeadas (nested functions)

• Funções recursivas

Alinhamento da AT 21

Miguel Silva, José Borges Computação e Programação 2010/2011 25

Descrição: Funções encadeadas significa que uma função está definida dentro do corpo de outra função. Neste caso todas as funções devem terminar com a palavra chave end.

Formato geral:

Cabeçalho da função exterior

Corpo da função exterior

Cabeçalho da função interior

Corpo da função interior

end % da função interior

Continuação do corpo da função exterior

end % da função exterior

Funções encadeadas (nested functions)

13

Miguel Silva, José Borges Computação e Programação 2010/2011

Funções encadeadas (nested functions)

26

Regras de âmbito:

As variáveis definidas na função principal são visíveis em todas as funções internas.

As variáveis definidas nas funções internas não são visíveis na função principal.

func_interna_1 pode ser chamada por funcao_principal e por func_interna_2

func_interna_2 pode ser chamada por funcao_principal e por func_interna_1

Miguel Silva, José Borges Computação e Programação 2010/2011

Funções encadeadas (nested functions)

27

>> outvol=nestedvolume(1,2,2)

outvol =

4

14

Miguel Silva, José Borges Computação e Programação 2010/2011 28

• Tópicos Avançados sobre Funções

• Utilização de function handles

• como funções anónimas

• como argumentos de funções

• Funções encadeadas (nested functions)

• Funções recursivas

Alinhamento da AT 21

Miguel Silva, José Borges Computação e Programação 2010/2011

Funções recursivas

29

• Considere-se a função para calcular o factorial

• Pode ser definida de forma recursiva,

15

Miguel Silva, José Borges Computação e Programação 2010/2011

Funções recursivas

30

• Uma definição recursiva tem duas partes:

1. Âncora ou caso base

O valor é especificado para um ou mais valores dos parâmetro(s).

2. Um passo inductivo ou recursivo.

O valor do parâmetro é especificado em função dos valores ou parâmetros mais simples.

Miguel Silva, José Borges Computação e Programação 2010/2011

Funções recursivas

31

• Para calcular 5! seguem-se os seguintes passos:

16

Miguel Silva, José Borges Computação e Programação 2010/2011

Exemplo: cálculo do factorial

32

Miguel Silva, José Borges Computação e Programação 2010/2011

Exemplo: cálculo do factorial

33

• Sequência de passos recursivos quando é feita a chamada àfunção recursiva myFact.m

res =

4 *

myFact(3)

n: 4

myFact(4)

res =

3 *

myFact(2)

n: 3

myFact(3)

res =

2 *

myFact(1)

n: 2

myFact(2)

res =

1 *

myFact(0)

n: 1

myFact(1)

res =

1

n: 0

myFact(0)

numero = 24

numero = myFact(4)

17

Miguel Silva, José Borges Computação e Programação 2010/2011

Referências

34

• Capítulo 9 de Stormy Attaway (2009), “Matlab: A Practical Introduction to Programming and Problem Solving”, Elsevier.