Programação para as Ciências Experimentais 2007/8 Teórica 6 Ludwig Krippahl, 2008 Na aula de hoje... Estruturas. Vectores de estruturas (structure arrays). Leitura formatada. Recursividade Gráficos 3D Ludwig Krippahl, 2008 2 Estruturas Vectores e matrizes guardam valores de um só tipo. Estruturas podem guardar valores de vários tipos. Sintaxe: • variável.campo Ludwig Krippahl, 2008 3 Estruturas Exemplo: octave:7> prato.nome="filetes"; octave:8> prato.preco=12.5; octave:9> prato.pedidos=[10,2,3,5,9,5,9]; octave:10> prato prato = { nome = filetes pedidos = 10 2 3 5 9 5 9 preco = 12.500 } Ludwig Krippahl, 2008 4 Estruturas prato = { nome = filetes pedidos = 10 2 3 5 9 5 9 preco = 12.500 } Estrutura Ludwig Krippahl, 2008 5 Estruturas prato = { nome = filetes pedidos = 10 2 3 5 9 5 9 preco = 12.500 } Campos Ludwig Krippahl, 2008 6 Estruturas prato = { nome = filetes pedidos = 10 2 3 5 9 5 9 preco = 12.500 } Valores Ludwig Krippahl, 2008 7 Estruturas Recapitulando • • • • nome_da_variavel.campo1=val1 nome_da_variavel.campo2=val2 nome_da_variavel.campo3=val3 Cada campo pode ter um valor de tipo diferente, incluindo ser outra estrutura. Ludwig Krippahl, 2008 8 Estruturas Estrutura de estrutura... octave:13> cliente.nome="Vitor Meireles"; octave:14> cliente.prato=prato cliente = { nome = Vitor Meireles prato = { nome = filetes pedidos = 10 2 3 5 9 5 9 preco = 12.500 } } Ludwig Krippahl, 2008 9 Structure arrays • Podemos criar vectores de estruturas, desde que as estruturas tenham os mesmos campos (os valores podem ser de tipos diferentes) x.a=1 x.b=2 y.a=3 y.b=“s” V=[x,y] Ludwig Krippahl, 2008 10 Structure arrays Não podemos criar vectores de estruturas se os campos forem diferentes y.c=4 V=[x,y] Ludwig Krippahl, 2008 (acrescentamos um campo c ao y) (dá erro...) 11 Structure arrays Um vector de estruturas funciona como um vector. for f=1:10 x(f).a=f; endfor x(2:2:10) Nota: podemos criar um vector atribuindo valores aos seus elementos: v(1)=1, v(2)=1... Ludwig Krippahl, 2008 12 Structure arrays Se acrescentarmos um campo a um elemento acrescenta a todos, mas vazio. for f=1:10 x(f).a=f; endfor x(2:2:10) x(2).b=0 Ludwig Krippahl, 2008 13 Structure arrays Podemos também atribuir um valor a um campo de todos (ou alguns) elementos do vector x(:).b=1 x(1:5).b=2 Ludwig Krippahl, 2008 14 Exemplo: massa molecular Uma função que receba uma fórmula química e devolva a massa molecular. massamol(“CHCl3”) ans = 119.38 Ludwig Krippahl, 2008 15 Exemplo: massa molecular Precisamos de: • • • Saber as massas atómicas Decompor a fórmula guardando o número de átomos (e.g. Cl3 são 3 àtomos de Cl) Somar tudo. Ludwig Krippahl, 2008 16 Exemplo: massa molecular Saber as massas atómicas • Ficheiro elementos.txt (SQ Nome NA Massa G P) Ac Ag Al Am 0 11 13 0 7 5 3 7 Ludwig Krippahl, 2008 Actinium 89 Silver 47 Aluminium 13 Americium 95 227 107.8682 26.9815386 243 17 Exemplo: massa molecular Saber as massas atómicas •Ficheiro elementos.txt •Separado por tabs Ludwig Krippahl, 2008 18 Exemplo: massa molecular Leitura formatada (fscanf) [simb,nome,na,massa,grupo,periodo]= fscanf(id,"%s%s%d%f%d%d","C"); Variáveis onde guardar os valores. Ludwig Krippahl, 2008 19 Exemplo: massa molecular Leitura formatada (fscanf) [simb,nome,na,massa,grupo,periodo]= fscanf(id,"%s%s%d%f%d%d","C"); Identificador do ficheiro Ludwig Krippahl, 2008 20 Exemplo: massa molecular Leitura formatada (fscanf) [simb,nome,na,massa,grupo,periodo]= fscanf(id,"%s%s%d%f%d%d","C"); Formatação dos valores a ler (string, string, inteiro, fraccionário, inteiro, inteiro) Ludwig Krippahl, 2008 21 Exemplo: massa molecular Leitura formatada (fscanf) O fscanf considera qualquer espaço em branco (espaço, tab, nova linha) como separando os valores e ignora-o. Por isso não precisamos dizer onde estão os tabs, etc. Mas se houver um espaço numa string o fscanf “pensa” que são duas. Ludwig Krippahl, 2008 22 Exemplo: massa molecular Leitura formatada (fscanf) [simb,nome,na,massa,grupo,periodo]= fscanf(id,"%s%s%d%f%d%d","C"); Para os códigos da formatação ver printf (14.2.4) Ludwig Krippahl, 2008 23 Exemplo: massa molecular Leitura formatada (fscanf) [simb,nome,na,massa,grupo,periodo]= fscanf(id,"%s%s%d%f%d%d","C"); Indica que é para funcionar como na linguagem C. É importante não esquecer isto. Ludwig Krippahl, 2008 24 Exemplo: massa molecular function els=lerelementos(nome) id=fopen(nome,"r"); f=1; while !feof(id) [simb,nome,na,massa,grupo,periodo]=fscanf(id,"%s%s%d%f%d%d","C"); els(f).simb=simb; els(f).nome=nome; els(f).na=na; els(f).massa=massa; els(f).grupo=grupo; els(f).periodo=periodo; f=f+1; endwhile fclose(id); endfunction Ludwig Krippahl, 2008 25 Exemplo: massa molecular function els=lerelementos(nome) id=fopen(nome,"r"); f=1; while !feof(id) [simb,nome,na,massa,grupo,periodo]=fscanf(id,"% .... els(f).simb=simb; Abre o ficheiro [...] f=f+1; endwhile fclose(id); endfunction Ludwig Krippahl, 2008 26 Exemplo: massa molecular function els=lerelementos(nome) id=fopen(nome,"r"); f=1; while !feof(id) [simb,nome,na,massa,grupo,periodo]=fscanf(id,"% .... els(f).simb=simb; Enquanto não chega ao [...] fim lê cada linha para f=f+1; endwhile várias variáveis fclose(id); endfunction Ludwig Krippahl, 2008 27 Exemplo: massa molecular function els=lerelementos(nome) id=fopen(nome,"r"); f=1; while !feof(id) [simb,nome,na,massa,grupo,periodo]=fscanf(id,"% .... els(f).simb=simb; e constrói o elemento f [...] do vector de estruturas f=f+1; endwhile fclose(id); endfunction Ludwig Krippahl, 2008 28 Exemplo: massa molecular function els=lerelementos(nome) id=fopen(nome,"r"); f=1; while !feof(id) [simb,nome,na,massa,grupo,periodo]=fscanf(id,"% .... els(f).simb=simb; Incrementa f para o [...] próximo elemento f=f+1; endwhile fclose(id); endfunction Ludwig Krippahl, 2008 29 Exemplo: massa molecular Precisamos de: • • • Saber as massas atómicas Decompor a fórmula guardando o número de átomos Somar tudo. Ludwig Krippahl, 2008 30 Exemplo: massa molecular Decompor a fórmula: • • • Retirar da primeira letra até à primeira maiúscula. Decompor o resto, se sobrar. Função recursiva. Ludwig Krippahl, 2008 31 Exemplo: massa molecular Decompor a fórmula: • • • Retirar da primeira letra até à primeira maiúscula. Decompor o resto, se sobrar. Função recursiva. Decompor CH3Cl é • C, e decompor H3Cl Ludwig Krippahl, 2008 32 Recursividade Factorial: • • N! = N * (N-1) * (N-2) *.. N! = N * (N-1)! Ludwig Krippahl, 2008 33 Recursividade Factorial: function f=factorial(n) if n<=1 Condição de paragem. É f=1; importante ser primeiro! else f=n*factorial(n-1); endif endfunction Ludwig Krippahl, 2008 34 Recursividade Factorial: function f=factorial(n) if n<=1 Chamada recursiva. f=1; N!= N* (N-1)! else f=n*factorial(n-1); endif endfunction Ludwig Krippahl, 2008 35 Exemplo: massa molecular function le=decompor(formula) le=[]; if length(formula)>0 Guarda o 1º elemento, incluindo o número. Em p guarda a posição do próximo elemento if p<=length(formula) le=[le,decompor(formula(p:length(formula)))]; endif endif endfunction Ludwig Krippahl, 2008 36 Exemplo: massa molecular le(1).el=formula(1); quant=""; p=length(formula)+1; for f=2:length(formula) if isdigit(formula(f)) quant=[quant,formula(f)]; elseif islower(formula(f)) le(1).el=[le(1).el,formula(f)]; else p=f; Guarda 1ª letra. A quantidade break; é string vazia e assume que endif não há próxima endfor Ludwig Krippahl, 2008 37 Exemplo: massa molecular le(1).el=formula(1); quant=""; p=length(formula)+1; for f=2:length(formula) if isdigit(formula(f)) quant=[quant,formula(f)]; elseif islower(formula(f)) le(1).el=[le(1).el,formula(f)]; else p=f; A partir do 2º caracter, break; digito vai para a string endif quantidade endfor Ludwig Krippahl, 2008 se for da 38 Exemplo: massa molecular le(1).el=formula(1); quant=""; p=length(formula)+1; for f=2:length(formula) if isdigit(formula(f)) quant=[quant,formula(f)]; elseif islower(formula(f)) le(1).el=[le(1).el,formula(f)]; else p=f; senão, se for minúscula break; para o elemento. endif endfor Ludwig Krippahl, 2008 vai 39 Exemplo: massa molecular le(1).el=formula(1); quant=""; p=length(formula)+1; for f=2:length(formula) if isdigit(formula(f)) quant=[quant,formula(f)]; elseif islower(formula(f)) le(1).el=[le(1).el,formula(f)]; else p=f; Caso contrário há próximo. break; Guarda-se a posição em p e endif termina-se este ciclo endfor Ludwig Krippahl, 2008 40 If, caso geral (if, elseif, else) if cond1 se a cond1 for verdadeira elseif cond2 se a cond1 for falsa e a cond2 verdadeira elseif ... .... else caso nenhuma seja verdadeira endif Ludwig Krippahl, 2008 41 Exemplo: massa molecular if !strcmp(quant,"") le(1).quant=str2num(quant); else le(1).quant=1; endif Terminado o ciclo guarda-se o número na quantidade, ou 1 se nenhuma quantidade foi encontrada Ludwig Krippahl, 2008 42 Exemplo: massa molecular Precisamos de: • • • Saber as massas atómicas Decompor a fórmula guardando o número de átomos Somar tudo. Ludwig Krippahl, 2008 43 Exemplo: massa molecular Encontrar a massa de um elemento na tabela function m=massael(simbolo,lista) m=0; for f=1:length(lista) if strcmp(lista(f).simb,simbolo) m=lista(f).massa; break endif endfor endfunction Ludwig Krippahl, 2008 44 Exemplo: massa molecular Calcular tudo function m=massamol(formula) lista=lerelementos("elementos.txt") c=decompor(formula); m=0; for f=1:length(c) m=m+massael(c(f).el,lista)*c(f).quant; endfor endfunction Ludwig Krippahl, 2008 45 Gráficos 3D Função meshgrid: cria matrizes para x, y • [xx,yy]=meshgrid(1:3,4:6) xx = 1 2 3 1 2 3 1 2 3 yy = 4 4 4 5 5 5 6 6 6 Ludwig Krippahl, 2008 46 Gráficos 3D Função mesh: traça o gráfico 3D “rede” x=-10:10; y=-10:10; [xx,yy]=meshgrid(x,y); mesh(xx,yy,xx.^2-yy.^2+xx.*yy) Ludwig Krippahl, 2008 47 Gráficos 3D Ludwig Krippahl, 2008 48 Gráficos 3D Função surf: traça o gráfico 3D “sólido” x=-10:10; y=-10:10; [xx,yy]=meshgrid(x,y); surf(xx,yy,xx.^2-yy.^2+xx.*yy) Ludwig Krippahl, 2008 49 Gráficos 3D Ludwig Krippahl, 2008 50 Gráficos 3D Resumo: • usar meshgrid para criar as matrizes para o x • • • e y a partir dos vectores. calcular o z a partir das matrizes criadas com o meshgrid. mesh(x,y,z) para desenhar a rede surf(x,y,z) para superfície sólida. Ludwig Krippahl, 2008 51 Resumindo... Estruturas e vectores de estruturas • Secção 6.1 Data Structures Leitura formatada • Secção 14.2 C-Style I/O Functions if – elseif – else • Secção 10 Statements (10.1 para o if) Recursividade Gráficos 3D • Secção 15.1 Plotting Basics Ludwig Krippahl, 2008 52 Dúvidas Ludwig Krippahl, 2008 53