Tópicos avançados sobre funções (cont.)

Documentos relacionados
Funções em Matlab. Subprogramas em Matlab são funções.

Tópicos avançados sobre funções

Programação em MATLAB

Programação em MATLAB

Cell arrays e estruturas: exemplos

Computação e Programação

Computação e Programação 2009 / 2010

Computação e Programação

Computação e Programação

Computação e Programação

Estruturas de dados complexas: cell arrays e structures

Computação e Programação

Programação em MATLAB

Computação e Programação

Algoritmos de ordenação. e de procura

Computação e Programação

Estruturas de dados complexas: cell arrays e structures

Computação e Programação

Manipulação de strings e conversão entre tipos de dados

1.a) Qual a diferença entre uma linguagem de programação de alto nível e uma linguagem de programação de baixo nível?

Exemplo: função cálculo distancia

Sistemas e Sinais. Laboratório 0 (parte c) Miguel Pedro Silva e João Reis

Manipulação de strings e conversão entre tipos de dados

Computação e Programação

Computação e Programação (2010/2011-1º Semestre)

RESOLUÇÃO. Computação e Programação (2009/2010-1º Semestre) 1º Teste (11/11/2009) Nome. Número. Leia com atenção os pontos que se seguem:

MATLAB. Programação básica

Correção do 1º Exame de INTRODUÇÃO À PROGRAMAÇÃO Licenciatura em Engenharia Mecânica 30 de Junho de 2006, 2º Semestre

Computação e Programação 201*/201* - 1º Semestre

Computação e Programação

Computação e Programação

COMPUTAÇÃO E PROGRAMAÇÃO

Manipulação avançada de ficheiros

Computação e Programação

Computação e Programação 2009 / 2010

MATLAB. Programação básica. Abordagem topo-base. Início. Definição das. Divisão em Sub-problemas. Divisão em Sub-problemas. Abordagem topo-base

COMPUTAÇÃO E PROGRAMAÇÃO 1º Semestre 2010/2011 MEMec, LEAN

1º Exame de INTRODUÇÃO À PROGRAMAÇÃO Licenciatura em Engenharia Mecânica 30 de Junho de º Semestre

Manipulação avançada de ficheiros

Matrizes como imagens Funções definidas pelo programador: Âmbito das variáveis Apresentação do projecto

MATLAB Avançado. Melissa Weber Mendonça

MATLAB. Sumário. Tópicos Avançados. 1. Estruturas 2. Células. J. R. Caldas Pinto, J. M. da Costa Sousa 357

Sistemas e Sinais. Laboratório 0 (parte a) (Iniciação ao MATLAB ) Miguel Pedro Silva e João Reis

Computação e Programação

Computação e Programação. Exame Época Normal

Computação e Programação

Computação e Programação

Computação e Programação

Computação e Programação. MEMec - LEAN 1º Semestre

Funções definidas pelo programador: Passagem de argumentos Formas de Funções comuns Programas modulares

Computação e Programação (2009/2010-1º Semestre)

Programação em MATLAB

Computação e Programação Exame Época de recurso

Computação e Programação Exame Época de recurso

COMPUTAÇÃO E PROGRAMAÇÃO 1º Semestre 2010/2011 MEMec, LEAN

Computação e Programação

Instituto Superior Técnico, Dep. de Engenharia Mecânica - ACCAII Objectivos e tarefas

Computação e Programação

Computação e Programação

Capítulo 10 Estruturas de controle de fluxo. Introdução ao MATLAB p.1/21

Computação e Programação Exame 2ª Época

Projecto e Desenvolvimento de Programas

Computação e Programação Exame Resolvido 1ª Época

Computação e Programação (2009/2010-1º Semestre)

(LEAmb, LEMat, LQ, MEBiol, MEQ) Exame 2 28 de Janeiro de 2008, 9h00

Nome: Número: Computação e Programação Mestrado Integrado em Engenharia Civil Licenciatura Bolonha em Engenharia Geológica e de Minas

Informática para Ciências e Engenharias 2013/14. Teórica 7

UNIVERSIDADE LUSÓFONA DE HUMANIDADES E TECNOLOGIAS 1º Semestre 2011/2012

Exercícios Data Modeling

Algoritmia e Programação

Introdução ao MatLab Princípios de Programação

Computação e Programação (2010/2011-1º Semestre)

Engenharia Biomédica Jorge Henriques, Fevereiro, 2007

2º Laboratório de Sistemas e Sinais (LEIC Alameda 2005/06)

Pragmática das Linguagens de

Informática para Ciências e Engenharias 2014/15. Teórica 7

Prática 10 - Funções

Input/Output em Matlab

Notas de Aula MatLab - 2

INTRODUÇÃO AO AMBIENTE DE PROGRAMAÇÃO MATLAB

Nome: Número: Computação e Programação Mestrado Integrado em Engenharia Civil Licenciatura Bolonha em Engenharia Geológica e de Minas

Computação e Programação

Valdex Santos. 09 de junho de 2011

Fundamentos de programação

MATLAB Avançado. Melissa Weber Mendonça

COMPUTAÇÃO E PROGRAMAÇÃO

Estudando com o MATLAB

Introdução ao MATLAB. 2 - Apresentação de resultados em gráfico. 3 - Controlo de fluxo 3.1. Tipos de controlo 3.2. Expressões Lógicas

Nome: Número: Computação e Programação Mestrado Integrado em Engenharia Civil Licenciatura Bolonha em Engenharia Geológica e de Minas

Problema 2 (1 valor) M = [50:2:248 ; 249:-2:51] Problema 3 (1 valor)

Controlo de Execução. K&R: Capitulo 3

Introdução ao Scilab

Métodos de Programação I Ana Maria de Almeida

Processo de Desenvolvimento

Resolução De Problemas Em Informática. Docente: Ana Paula Afonso Resolução de Problemas. 1. Analisar o problema

Introdução ao MATLAB. Parte 2

Computação e Programação. Exame Época de Recurso

Computação e Programação

Conceitos Fundamentais de MatLab/Octave. Prof. Responsáveis Wagner Santos C. de Jesus

Um algoritmo deve conter passos não ambíguos, executáveis e que sejam terminados quando seguidos.

Transcrição:

Tópicos avançados sobre funções (cont.) Definição de function handle Utilização de function handles Funções anónimas Funções em que os argumentos são funções (function functions) Funções com número de parâmetros variáveis Nº de parâmetros de entrada variável Nº de parâmetros de saída variável Funções encadeadas (nested functions) Funções privadas Funções recursivas Instituto Superior Técnico, Dep. de Engenharia Mecânica - ACCAII

Funções com número de parâmetros variáveis As funções na sua definição podem ter um número de parâmetros de entrada e saída variáveis: Existe um cell array pré-definido (built-in) que permite armazenar um número de parâmetros de entrada variável: Denominação: varargin Existe um cell array pré-definido (built-in) que permite armazenar um número de parâmetros de saída variável: Denominação: varargout Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 2

Funções com número de parâmetros variáveis Existe uma função pré-definida (built-in) que retorna o número de argumentos de entrada com que a função foi chamada: Denominação: nargin Existe uma função pré-definida (built-in) que retorna o número de argumentos de saída que a função deve devolver: Denominação: nargout Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 3

Nº de parâmetros de saída variável As funções na sua definição podem ter um número de parâmetros de entrada e saída variáveis: Existe um cell array pré-definido (built-in) que permite armazenar um número de parâmetros de entrada variável: Denominação: varargin Existe um cell array pré-definido (built-in) que permite armazenar um número de parâmetros de saída variável: Denominação: varargout Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 4

Nº de parâmetros de saída variável Problema 1: Escreva uma função que receba um array como argumento e que devolva uma string contendo uma das seguintes hipóteses: escalar, vector, matriz. Existe um ou dois argumentos saída opcionais que retornam a dimensão do argumento de entrada, quando este for um vector ou uma matriz. Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 5

Nº de parâmetros de saída variável Problema 1 (codificação): Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 6

Nº de parâmetros de saída variável Problema 1 (exemplos de execução: >> typesize(10) ans = escalar >> [tipo, comp] = typesize([1:1:10]) tipo = vector comp = 10 >> [tipo, lin, col] = typesize(ones(3,4)) tipo = matriz lin = 3 col = 4 Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 7

Nº de parâmetros de saída variável Problema 1: Escreva uma função que receba um array como argumento e que devolva uma string contendo uma das seguintes hipóteses: escalar, vector, matriz. Existe um ou dois argumentos saída opcionais que retornam a dimensão do argumento de entrada, quando este for um vector ou uma matriz. Neste problema 1 assumiu-se que os argumentos de saída opcionais podiam ser um ou dois! Assuma agora, que no Problema 2, o argumento opcional é apenas um! Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 8

Nº de parâmetros de saída variável Problema 2 (codificação): Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 9

Nº de parâmetros de saída variável Problema 2 (exemplos de execução: >> [tipo, dim] = typesize_2(ones(5,6)) tipo = matriz dim = 5 6 >> [tipo] = typesize_2(ones(5,6)) tipo = matriz >> [tipo, dim, zzz] = typesize_2(ones(5,6)) Error in ==> typesize_2 at 4 [r c] = size(inputval);??? Output argument "varargout{2}" (and maybe others) not assigned during call to "D:\Users\Miguel\Documents\MATLAB\Aulas\CP_2009_2010\AT19\ typesize_2.m>typesize_2". Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 10

Nº de parâmetros de saída variável A função nargout pode ser utilizada para determinar quantos argumentos de saída foram utilizados na chamada a uma função. Problema 3: Escreva uma função denominada mysize que receba um array e que devolva o número de linhas, o número de colunas e opcionalmente o número de elementos que o array contem. Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 11

Nº de parâmetros de saída variável Problema 3 (codificação): Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 12

Nº de parâmetros de saída variável Problema 3 (exemplos de execução: >> [r c] = mysize(zeros(3,5)) r = 3 c = 5 >> [r c elem] = mysize(zeros(3,5)) r = 3 c = 5 elem = 15 Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 13

Nº de parâmetros de saída variável Problema 4: Escreva uma função denominada mysize_2 que receba um array e que se comporte exactamente como a função size prédefinida no MATLAB. Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 14

Nº de parâmetros de saída variável Problema 4 (codificação): Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 15

Nº de parâmetros de saída variável Problema 4 (exemplos de execução: >> [dim]=mysize_2(zeros(3,5)) dim = 3 5 >> [lin col]=mysize_2(zeros(3,5)) lin = 3 col = 5 Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 16

Funções encadeadas (nested functions) 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 de funções encadeadas: 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 Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 17

Funções encadeadas (nested functions) Regras de âmbito: funcao_principal host_function func_interna_1 nested_function_1 end % func_interna_1 end % nested_function_1 nested_function_2 func_interna_2 end end % % nested_function_2 func_interna_2 end %% host_function funcao_principal As variáveis definidas na função principal são visíveis em todas as funções internas. Variables defined in the host function are visible inside any nested functions. As variáveis definidas nas funções internas não são visíveis na função Variables defined within nested functions are not visible in the host function. principal. nested_function_1 can be called from within host_function or nested_function_2. func_interna_1 pode ser chamada por funcao_principal e por func_interna_2 nested_function_2 can be called from within host_function or nested_function_1. func_interna_2 pode ser chamada por funcao_principal e por func_interna_1 Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 18

Funções encadeadas (nested functions) Funções encadeadas (exemplo 1): >> outvol=nestedvolume(1,2,2) outvol = 4 Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 19

Funções encadeadas (nested functions) Funções encadeadas (exemplo 2): function res = testa_internas % Nivel mais alto. Define variaveis a = 1; b = 2; x = 0; y = 9; % Escreve valor das variaveis antes de chamar funcao1 fprintf('antes de chamar funcao1:\n'); fprintf('a, b, x, y = %2d %2d %2d %2d\n', a, b, x, y); % Chama funcao interna funcao1 x = funcao1(x); % Escreve valor das variaveis depois de chamar funcao1 fprintf('\ndepois de chamar funcao1:\n'); fprintf('a, b, x, y = %2d %2d %2d %2d\n', a, b, x, y); %Declara funcao interna funcao1 function res = funcao1(y) % Variaveis no inicio de funcao1 fprintf('\nno inicio de funcao1:\n'); fprintf('a, b, x, y = %2d %2d %2d %2d\n', a, b, x, y); Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 20

Funções encadeadas (nested functions) Funções encadeadas (exemplo 2) (cont.): y = y + 5; a = a + 1; res = y; % Variaveis no fim de funcao1 fprintf('\nno fim de funcao1:\n'); fprintf('a, b, x, y = %2d %2d %2d %2d\n', a, b, x, y); end % funcao funcao1 end % funcao testa_internas retorna: >> testa_internas Antes de chamar funcao1: a, b, x, y = 1 2 0 9 No inicio de funcao1: a, b, x, y = 1 2 0 0 No fim de funcao1: a, b, x, y = 2 2 0 5 Depois de chamar funcao1: a, b, x, y = 2 2 5 9 Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 21

Funções privadas As funções privadas estão em sub-directorias com o nome de private. Estas funções só são visíveis nas funções da directoria de raíz (parent directory). Estas directorias com o nome específico de private podem ser criadas pelo programador, utilizando os procedimentos habituais de criação de directorias ou folders no computador. Estas directorias private não devem ser colocadas na path! Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 22

Avaliação de funções 1. O Matlab verifica se existe uma função interna com um dado nome. Se existir, executa-a. 2. É procurada uma subfunção com o nome dado. Se existir, executa essa subfunção. 3. É procurada uma função com o nome dado na directoria private. Será executada se existir. 4. É procurada uma função com o nome dado na directoria de trabalho. Se existir, é executada. 5. Finalmente, é procurado no MATLAB path. Se existir uma função no path, será executada. Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 23

Funções recursivas Considere-se a função para calcular o factorial 1 se n is 0 n! 1 2... n se n > 0 Pode ser definida de forma recursiva: 1 se n is 0 n! n ( n 1)! se n > 0 Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 24

Funções recursivas Uma definição recursiva tem duas partes 1. Uma âncora ou base (caso mais simples) 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. 1 se n is 0 n! n ( n 1)! se n > 0 Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 25

Funções recursivas Para calcular 5! seguem-se os seguintes passos: Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 26

Funções recursivas Código da função factorial, programada de forma recursiva: function resultado = factorial(n) if (n < 0 round(n)~=n) error('o argumento deve ser um inteiro >=0.'); elseif (n == 0) resultado = 1; else resultado = n * factorial(n-1); end Passo inductivo Caso mais simples Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 27

Funções recursivas Execução da função recursiva: Sequência de passos recursivos quando é chamada numero = factorial(4); resultado = resultado = Chamadas recursivas sucessivas Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 28

Funções recursivas Execução da função recursiva: Quando factorial(n 1) envia por fim o valor 0 como parâmetro, é executada a instrução âncora Não há mais chamadas recursivas... resultado = resultado = resultado=1 Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 29

Funções recursivas Execução da função recursiva: Os valores calculados vão sendo retornados: resultado = resultado = resultado = resultado = resultado=1 6 2 1 24 Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 30

Funções recursivas Exercício A famosa sequência de Fibonacci, foi descrita por Leonardo de Pisa, também conhecido como Fibonacci (1170-1250), para descrever o crescimento de uma população de coelhos. Os números descrevem o número de casais numa população de coelhos depois de n meses, considerando um conjunto pressupostos. (ver: http://pt.wikipedia.org/wiki/n%c3%bamero_de_fibonacci) A sequência é dada pela seguinte expressão: Primeiros termos: (0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,...), Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 31

Funções recursivas Exercício Implemente uma função recursiva (denominada fibo.m) que calcule o enésimo termo da sequência de Fibonacci. Teste a função com um script. Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 32

Funções recursivas Exercício function [termo_n] = fibo(n) % A função FIBO recebe % como parâmetro de entrada: % um valor n inteiro >=1; % A função retorna: % o enésimo termo da sequência de Fibonacci. if (n < 0 round(n) ~= n) error('o valor tem que ser um inteiro maior ou igual a 1.'); end switch (n) case 0, termo_n = 0; case 1, termo_n = 1; otherwise, termo_n = fibo(n-1) + fibo(n-2); end Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 33

Funções recursivas Exercício %Este script testa a função FIBO clc; clear all; close all; disp('este script testa a função FIBO'); %pede o termo N até ao qual se pretende calcular a sequência valor_incorrecto = true; while (valor_incorrecto) N = input(['introduza o termo N até onde pretende calcular ',... 'a seq. de Fibonacci: ']); valor_incorrecto = (N < 0 round(n) ~= N); end seq=[]; for k=0:n seq=[seq,fibo(k)]; end figure(20); stem(0:n, seq), grid on; title(['sequência de Fibonacci até ao termo ' int2str(n)]); Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 34

Referências Capítulo 9 de Stormy Attaway (2009), Matlab: A Practical Introduction to Programming and Problem Solving, Elsevier. Getting started with MATLAB: http://www.mathworks.com/access/helpdesk/help/pdf_doc/ matlab/getstart.pdf Miguel Pedro Silva José Borges Computação e Programação 2009 / 2010 35