310 likes | 476 Views
Universidade Federal de Alagoas – UFAL Centro de Tecnologia – CTEC. Modularização e funções. Modularização. Uma técnica para resolver problemas complexos é decompor o problema em vários subproblemas. Modularização. Algumas vantagens são:
E N D
Universidade Federal de Alagoas – UFAL Centro de Tecnologia – CTEC Modularização e funções
Modularização • Uma técnica para resolver problemas complexos é decompor o problema em vários subproblemas.
Modularização Algumas vantagens são: • Dividir a complexidade do problema original, simplificando a sua resolução; • Direcionar a atenção a problemas menores em cada vez, permitindo uma melhor compreensão do todo.
A rotina sugerida para modularização de programas é a seguinte: • Divida o problema em suas partes principais; • Analise a divisão; • Se alguma parte ainda estiver complexa, decompô-la também; • Analise o resultado, garantindo entendimento e coerência.
Após a decomposição do problema, pode-se construir sub-algoritmos (scripts) ou módulos para cada subproblema obtido. Módulos (Scripts)
Dividir o problema em suas partes principais; • Analisar a divisão; • Se alguma parte ainda estiver complexa, decompô-la também; • Analisar o resultado, garantindo entendimento e coerência.
Quando temos um problema complexo, como visto, a idéia é, então, subdividí-lo (decompor) em vários subproblemas, utilizando módulos (scripts) para representar, no algoritmo, a decomposição do problema. Construir um módulo significa construir um algoritmo em instâncias menores. O problema do exemplo visto terá 3 módulos:
Módulo 1 Entrada dos dados Módulo 2 a) Cálculo do Novo Sal.; b) Sal./Dia c) Sal./Mês d) Classe Social Módulo 3 saída dos dados
Existe, então, a necessidade de “ligar” os vários scripts do programa. Isso pode ser feito no módulo principal do programa. A execução interna do programa segue as diretrizes abaixo: • Linha 1 – comentário • Linha 2 – chama (executa) o script entrada • Executa todos os comandos desse script • Linha 3 – chama (executa) o script calculos • Executa todos os comandos desse script • Linha 4 – chama o script imprime • Executa todos os comandos desse script Executar o script entrada Módulo Principal Executar o script calculos Executar o script imprime
Para facilitar a troca e evitar uso indevido de informação entre os módulos, em vez de trabalhar a conexão de scripts, introduz-se o uso de funções. Com isso, osmódulospassam a ser funções. Módulos (Funções)
Entrada de dados usando script Entrada de dados usando função Os dois programa desempenham papéis equivalentes. No segundo, apenas foi declarada uma função.
Alguns detalhes que devem ser observados no MATLAB: • Uma função é identificada pela palavra-chave function; • Todas as funções têm um nome associado. Neste exemplo, o nome é entrada; • Cada função deve ser armazenada em um arquivo .m separado (um arquivo para cada função); • O nome do arquivo deve ser igual ao nome da função armazenada nele. No exemplo acima, o arquivo deve se chamar entrada.m; • A variável f, que neste problema é um registro, só é válida dentro da função entrada. Dizemos que ela é uma variável local. • Assimcomonos scripts, todafunçãodevetersuasvariáveisestabelecidas antes daexecução de comandosdelasdependentes. • Valores de variáveispodem ser repassadaspormeiodadeclaraçãodafunção.
Funções em MATLAB function [lista de variáveis de saída] = nome (lista de variáveis de entrada) {<instruções para inicialização de variáveis>} {<instruções de execução>} function retorno = nome (entrada) retorno = entrada+10; function W = G(Z) % Z é um vetor 1 x 2 x = Z(1); y = Z(2); W = [x^2-y^2, 2*x*y]; function y = f(x) y = exp(-x/10) + sin(x); function [x,y,z,w] = calcula_ssmd(a,b,c,d) x = a+b; y = a-b; z = c*d; w = c/d;
Na modularização de funções, existe também a necessidade de “ligar” as várias funções do programa. Isso pode ser feito no módulo principal do programa. 1 - % modulo principal 2 - d= entrada; 3 - r=calculos(d); 4 - imprime(r); A execução interna do programa segue as diretrizes abaixo: • Linha 1 – comentário • Linha 2 – chama (executa) a função entrada • Executa todos os comandos dessa função • Linha 3 – chama (executa) a função calculos • Executa todos os comandos dessa função • Linha 4 – chama a função imprime • Executa todos os comandos dessa função
Todas as variáveis criadas dentro de uma função só podem ser usadas na própria função. Elas não existem fora deste contexto. Exemplo: Uso de Variáveis Locais function imprime disp(x); disp(y); disp(z); function teste a=3; b=2; c=a*b; % modulo principal teste; imprime; Está correto??
Como podemos resolver esse problema ?? A solução para resolver problemas como este é o uso de Argumentos de Funções e Valores de Retorno de Funções. Alguns comandos usados até agora são, na realidade, funções pré-definidas pelo próprio Matlab. Como exemplo, podemos citar as funções disp, input, sqrt, mod, sin, cos, log, etc.
Argumentos de Funções • São as variáveis de entrada que as funções vão receber. É por meio delas que as funções recebem dados. Já podemos fazer um exemplo ?? Fazer um programa, usando funções, para ler, calcular e imprimir o produto de dois números.
Exemplo: Fazer um programa, usando funções, para calcular e imprimir o produto de dois números
Resumindo • a, b e c são variáveis locais na função produto; • Na primeira chamada da função produto, o valor 3 é copiado para a variável local a e o valor 5 para b; • As variáveis x e y são validas apenas no módulo principal. Elas não podem ser acessadas dentro da função produto; • Uma função pode ser chamada n vezes; • O número de argumentos de uma função deve ser compatível entre a sua definição e a sua execução.
Mas é desejável que exista uma função especifica para imprimir separadamente o valor do produto. Como resolver ?? Erro: A variável c não está declarada no escopo da função em imprime.
Valores de Retorno de Funções • São as variáveis de saída que as funções vão disponibilizar para outras aplicações. • A solução para resolver o problema acima é a utilização de Valores de Retorno de Funções.
Resumindo • Notas: • x, y e z são variáveis locais no módulo principal; • z armazena uma cópia do valor de retorno da função produto; • a, b e c são variáveis locais na função produto; • a, b e c são variáveis locais na função imprime; • essas variáveis podem conter valores diferentes em ambas as funções.
function [gerados]=nome (recebidos)gerados: lista de nomes de variáveis do programacujosvalorespermitoexportardo workspace da funçãorecebidos: lista de nomes de variáveisquecontémvaloresquenecessitoimportarpara o workspace da função g.m teste.m %modulo principal a=1;b=2;c=2*b; [w,x,y,z]=f(a,b,c); [h]=g(y,z^2); function [s1,s2,s3,s4]=f(e1,e2,e3) s1=e1+e2; s2=e2+10; s3=e3-e2; s4=e1*e3^2; function[c1,c2,c3]=g(i1,i2) c1=i1+1; c2=c1^2; c3=i2-i1; f.m %Workspace a b c
function [gerados]=nome (recebidos)gerados: lista de nomes de variáveis do programacujosvalorespermitoexportardo workspace da funçãorecebidos: lista de nomes de variáveisquecontémvaloresquenecessitoimportarpara o workspace da função g.m teste.m %modulo principal a=1;b=2;c=2*b; [w,x,y,z]=f(a,b,c); [h]=g(y,z^2); function [s1,s2,s3,s4]=f(e1,e2,e3) s1=e1+e2; s2=e2+10; s3=e3-e2; s4=e1*e3^2; function[c1,c2,c3]=g(i1,i2) c1=i1+1; c2=c1^2; c3=i2-i1; f.m %Workspace a b c %Workspace f e1 e2 e3 s1 s2 s3 s4 w x y z
function [gerados]=nome (recebidos)gerados: lista de nomes de variáveis do programacujosvalorespermitoexportardo workspace da funçãorecebidos: lista de nomes de variáveisquecontémvaloresquenecessitoimportarpara o workspace da função g.m teste.m %modulo principal a=1;b=2;c=2*b; [w,x,y,z]=f(a,b,c); [h]=g(y,z^2); function [s1,s2,s3,s4]=f(e1,e2,e3) s1=e1+e2; s2=e2+10; s3=e3-e2; s4=e1*e3^2; function[c1,c2,c3]=g(i1,i2) c1=i1+1; c2=c1^2; c3=i2-i1; f.m %Workspace a b c w x y z
function [gerados]=nome (recebidos)gerados: lista de nomes de variáveis do programacujosvalorespermitoexportardo workspace da funçãorecebidos: lista de nomes de variáveisquecontémvaloresquenecessitoimportarpara o workspace da função g.m teste.m %modulo principal a=1;b=2;c=2*b; [w,x,y,z]=f(a,b,c); [h]=g(y,z^2); function [s1,s2,s3,s4]=f(e1,e2,e3) s1=e1+e2; s2=e2+10; s3=e3-e2; s4=e1*e3^2; function[c1,c2,c3]=g(i1,i2) c1=i1+1; c2=c1^2; c3=i2-i1; f.m %Workspace a b c %Workspace g c3 c2 c1 i1 i2 h w x y z
function [gerados]=nome (recebidos)gerados: lista de nomes de variáveis do programacujosvalorespermitoexportardo workspace da funçãorecebidos: lista de nomes de variáveisquecontémvaloresquenecessitoimportarpara o workspace da função g.m teste.m %modulo principal a=1;b=2;c=2*b; [w,x,y,z]=f(a,b,c); [h]=g(y,z^2); function [s1,s2,s3,s4]=f(e1,e2,e3) s1=e1+e2; s2=e2+10; s3=e3-e2; s4=e1*e3^2; function[c1,c2,c3]=g(i1,i2) c1=i1+1; c2=c1^2; c3=i2-i1; f.m %Workspace a b c h w x y z
function [gerados]=nome (recebidos)gerados: lista de nomes de variáveis do programacujosvalorespermitoexportardo workspace da funçãorecebidos: lista de nomes de variáveisquecontémvaloresquenecessitoimportarpara o workspace da função g.m teste.m %modulo principal a=1;b=2;c=2*b; [w,x,y,z]=f(a,b,c); [h]=g(y,z^2); function [s1,s2,s3,s4]=f(e1,e2,e3) s1=e1+e2; s2=e2+10; s3=e3-e2; s4=e1*e3^2; function[c1,c2,c3]=g(i1,i2) c1=i1+1; c2=c1^2; c3=i2-i1; f.m %Workspace a b c %Workspace f e1 e2 e3 s1 s2 s3 s4 %Workspace g c3 c2 c1 i1 i2 h w x y z