Módulo 1: Introdução ao MatLab Programação II Programação II (scripts e functions) Interfaces Gráficas (GUIs)
Programação Anonymous functions São funções definidas de um modo ad-hoq, numa linha de comando. Podem ser guardadas, tal como as variáveis, nos ficheiros '*.mat' Síntaxe: <function handle> = @([<var1>, <var2>,...]) <function_def([<var1>,<var2>,...])> Exemplo: Criar uma função que calcule a distância entre 2 pontos (x1,y1)-(x2,y2): Dist = @(x1,y1,x2,y2) sqrt((x1-x2).^2+(y1-y2).^2) % criar a function handle 'Dist' Invocar a função: A = Dist(1,1,2,2) % invocar a function como se fosse uma função nativa do MatLab
Programação Scripts Scripts são listas de instruções. - São gravadas em formato ASCII, num ficheiro com extensão "*.m" - Não têm variáveis internas - Manipulam as variáveis do workspace Exemplo 1: - Fazer um script para perguntar ao utilizador um item de tabuada de 1 a 10, de uma forma aleatória
Programação Scripts Exemplo 1: %Script "Tabuada" clc; % limpa o comand window a = randi(10); % gera um n. inteiro aleatório entre 1 e 10 b = randi(10); % idem c = a.*b; % faz a multiplicação Mess=sprintf ('Qual o resultado de %.0f x %.0f?',a,b); % "string print formatted" % alternativa: Mess=['Qual o resultado de ',num2str(a),' x ',num2str(b),'?']; disp (Mess) % apresenta a pergunta Resp=input('Resposta: '); % aguarda a resposta if Resp==c % testa a resposta Mess='A resposta está correcta.'; else Mess=['A resposta está errada (a resposta certa seria ', num2str(c),')']; % alternativa: Mess=sprintf ('A resposta está errada (a resposta certa seria %.0f)',c); end disp( Mess) % apresenta a mensagem adequada %Fim do Script "Tabuada"
Programação Functions Functions são estruturas de programação com código fechado. - São gravadas em formato ASCII, num ficheiro <fname> com extensão "*.m" - Têm cabeçalho: function[[<outvars>]]=<fname>([<invars>]) <outvars> - lista de variáveis de saída <invars> - lista de variáveis de entrada - As variáveis locais são internas (não mexem no workspace) - A informação é passada de e para o exterior apenas através das <outvars> e <invars> - A function é invocada no programa principal com a síntaxe: [<var1>,<var2>,...]=<fname>([<varx>, <vary>,...]) O nome da (primeira) function deve coincidir com o nome do ficheiro. Exemplo 2: - Fazer uma function que forneça o resultado para a multiplicação de dois quaisquer números de 1 a 10 Variável de saída: Mess (mensagem string com o resultado) Variáveis de entrada: a, b - números a multiplicar
Programação Functions Exemplo 2: function [Mess] = f_tabuada(a,b) % function "f_tabuada" % calcula a tabuada clc; c=a.*b; Para invocar a function : num1=4; num2=6; num3=f_tabuada(num1,num2) Mess=sprintf ('O produto de %.0f por %.0f é %.0f',a,b,c); % alternativa: Mess=['O produto de ',num2str(a),' por ', num2str(b),' é ',num2str(c)]; end Exemplo 3: Function sem troca de informação com o exterior: function [] = f_dummy() % function sem troca de informação com o exterior... M='Ora bolas!'; clc disp(m); end Para invocar a function: f_dummy
Graphical User Interfaces GUIs são interfaces gráficas de interacção com o utilizador. Têm o aspecto de uma janela do Windows ( ). São constituídas por duas componentes (dois ficheiros): - Uma parte gráfica (ficheiro com extensão '.fig') - Uma parte funcional (ficheiro com extensão '.m')
Parte gráfica A parte gráfica é construída num editor próprio: GUIDE GUI Design Environment (file > new > GUI > Blank GUI) Pode ser constituída por elementos de 14 espécies diferentes: Push button Radio button Edit text Pop-up menu Toggle button Axes (graph) Button group Slider Check box Static text List box Table Panel ActiveX control
Parte gráfica Cada elemento tem vários atributos, acedidos através de duplo clique. São categorizados a seguinte forma:
Parte gráfica As base properties tem os seguintes atributos: Controla o nome que aparece na parte funcional Controla se o item é visível Atributo Valor
Parte gráfica A data tem os seguintes atributos: Controla o que aparece na apresentação/conteúdo do item Valor que aparece por defeito (no início)
Parte gráfica A style/appearance tem os seguintes atributos: Controla a font Valor por defeito (no início)
Parte funcional A parte funcional é gerada automáticamente quando se grava a parte gráfica. É constituída por um conjunto de funções. Dessas, apenas algumas devem ser modificadas pelo programador: As funções que se relacionam com atributos dos items gráficos ex.: Callback Por exemplo, se queremos programar um push-button cuja tag é 'pushbutton1' para fechar a GUI, procuramos a função pushbutton1_callback e acrescentamos a instrução 'close [<nome da GUI>]' Por exemplo, para fazer o seguinte: 1. Quando é pressionado o pushbutton cuja tag é pushbutton1' deve 2. Ler o que está numa edit text cuja tag é 'edit1' e 3. Colocar o que foi lido na static text cuja tag é 'text1'. Procuramos a função pushbutton1_callback e acrescentamos as instruções: H=guidata(<nome da GUI>); % Coloca em 'H' o handling da GUI leitura=get(h.edit1,'string'); % coloca em 'leitura' o que está em 'edit1' set(h.text1,'string',leitura); % coloca em 'text1' o que está em 'leitura'
Parte funcional Mais exemplos... Por exemplo, para fazer o seguinte: 1. Se a 'checkbox1' estiver marcada, fazer o plot de y=x 2 (-10<x<10) em 'axes1'. 2. Se a 'checkbox1' estiver desmarcada, fazer o plot de y=x 3 (-10<x<10) em 'axes1'. Procuramos a função checkbox1_callback e acrescentamos as instruções: H=guidata(<nome da GUI>); % Coloca em 'H' o handling da GUI leitura=get(h.checkbox1,'value'); % coloca em 'leitura' o que está no atributo %'value' da 'checkbox1' if leitura==1 %testa se a 'checkbox1' está marcada (sim = 1) dados=[[-10:10]',[-10:10]'.^2]; % sim else dados=[[-10:10]',[-10:10]'.^3]; % não end plot(h.axes1,dados(:,1),dados(:,2)); % põe o gráfico em 'axes1'
Mais exemplos... tag: 'Numero' tag: 'Ler' Criar uma nova GUI tag: 'Msg' Funcionamento pretendido: tag: 'Escrever' tag: 'Fim' - Se clicar em OK, pretende-se que a GUI passe o número para uma variável de nome 'Resultado' que será criada no workspace. - Se clicar em WS, pretende-se que a GUI passe o número que estiver na variável de nome 'Resultado' presente no workspace, para a edit-text. - Se clicar em Cancel, a GUI deverá fechar.
Na parte funcional... tag: 'Numero' tag: 'Ler' Localizar Escrever_Callback e acrescentar as instruções: tag: 'Msg' tag: 'Escrever' tag: 'Fim' myhandles = guidata(<nome da GUI>); % Variável de handling da GUI 'GuiWS' é a 'myhandles' Txt= get(myhandles.numero,'string'); % Lê na GUI, no item cuja tag é 'Numero', o atributo 'string' e põe na variável interna Txt Txt=str2num(Txt); set(myhandles.numero,'string',txt); assignin('base', 'Resultado', Txt); % converte 'Txt' para número % coloca o valor de Txt no atributo 'string' do item cuja tag é Numero. Não-números dão. % Manda para o Workspace ('base') a variável 'Resultado' com o valor de 'Txt'.
Na parte funcional... tag: 'Numero' tag: 'Ler' Localizar Ler_Callback e acrescentar as instruções: tag: 'Msg' tag: 'Escrever' tag: 'Fim' myhandles = guidata(<nome da GUI>); try %tenta ler a var 'Resultado' Txt=evalin('base','Resultado'); catch %se dá erro (não existe) então cria a variável assignin('base', 'Resultado', ''); end Num=str2num(num2str(evalin('base','Resultado'))); % filtragem para ter apenas números set(myhandles.numero,'string',num2str(num)); % Coloca na string de tag 'Numero' o valor de 'Num'. Localizar Fim_Callback e acrescentar: close [<nome da GUI>]
Parte funcional Notas finais... 1. Todas as variáveis criadas dentro de uma function são variáveis locais. 2. Para passar variáveis entre functions, elas devem ser declaradas como "globais", logo após o cabeçalho, nessas functions: function <nometag1>_callback(hobject, eventdata, handles) global var1 var2 var3 var3=var1+var2... function <nometag2>_callback(hobject, eventdata, handles) global var1 var2 var3 var2=var1.*var3...
- Resolução da ficha n.º 4