530 likes | 629 Views
Programação para as Ciências Experimentais 2007/8. Teórica 6. Na aula de hoje. Estruturas. Vectores de estruturas (structure arrays). Leitura formatada. Recursividade Gráficos 3D. Estruturas. Vectores e matrizes guardam valores de um só tipo.
E N D
Programação para as Ciências Experimentais2007/8 Teórica 6 Ludwig Krippahl, 2008
Na aula de hoje... • Estruturas. • Vectores de estruturas (structure arrays). • Leitura formatada. • Recursividade • Gráficos 3D
Estruturas • Vectores e matrizes guardam valores de um só tipo. • Estruturas podem guardar valores de vários tipos. • Sintaxe: • variável.campo
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 }
Estruturas prato = { nome = filetes pedidos = 10 2 3 5 9 5 9 preco = 12.500 } Estrutura
Estruturas prato = { nome = filetes pedidos = 10 2 3 5 9 5 9 preco = 12.500 } Campos
Estruturas prato = { nome = filetes pedidos = 10 2 3 5 9 5 9 preco = 12.500 } Valores
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.
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 } }
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]
Structure arrays • Não podemos criar vectores de estruturas se os campos forem diferentes y.c=4 (acrescentamos um campo c ao y) V=[x,y] (dá erro...)
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...
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
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
Exemplo: massa molecular • Uma função que receba uma fórmula química e devolva a massa molecular. massamol(“CHCl3”) ans = 119.38
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.
Exemplo: massa molecular • Saber as massas atómicas • Ficheiro elementos.txt (SQ Nome NA Massa G P) Ac Actinium 89 227 0 7 Ag Silver 47 107.8682 11 5 Al Aluminium 13 26.9815386 13 3 Am Americium 95 243 0 7
Exemplo: massa molecular • Saber as massas atómicas • Ficheiro elementos.txt • Separado por tabs
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.
Exemplo: massa molecular • Leitura formatada (fscanf) [simb,nome,na,massa,grupo,periodo]= fscanf(id,"%s%s%d%f%d%d","C"); Identificador do ficheiro
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)
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.
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)
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.
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
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; [...] f=f+1; endwhile fclose(id); endfunction Abre o ficheiro
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; [...] f=f+1; endwhile fclose(id); endfunction Enquanto não chega ao fim lê cada linha para várias variáveis
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; [...] f=f+1; endwhile fclose(id); endfunction e constrói o elemento f do vector de estruturas
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; [...] f=f+1; endwhile fclose(id); endfunction Incrementa f para o próximo elemento
Exemplo: massa molecular • Precisamos de: • Saber as massas atómicas • Decompor a fórmula guardando o número de átomos • Somar tudo.
Exemplo: massa molecular • Decompor a fórmula: • Retirar da primeira letra até à primeira maiúscula. • Decompor o resto, se sobrar. • Função recursiva.
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
Recursividade • Factorial: • N! = N * (N-1) * (N-2) *.. • N! = N * (N-1)!
Recursividade • Factorial: function f=factorial(n) if n<=1 f=1; else f=n*factorial(n-1); endif endfunction Condição de paragem. É importante ser primeiro!
Recursividade • Factorial: function f=factorial(n) if n<=1 f=1; else f=n*factorial(n-1); endif endfunction Chamada recursiva. N!= N* (N-1)!
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
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; break; endif endfor Guarda 1ª letra. A quantidade é string vazia e assume que não há próxima
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; break; endif endfor A partir do 2º caracter, se for digito vai para a string da quantidade
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; break; endif endfor senão, se for minúscula vai para o elemento.
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; break; endif endfor Caso contrário há próximo. Guarda-se a posição em p e termina-se este ciclo
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
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
Exemplo: massa molecular • Precisamos de: • Saber as massas atómicas • Decompor a fórmula guardando o número de átomos • Somar tudo.
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
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
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
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)
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)