Upload
internet
View
105
Download
0
Embed Size (px)
Citation preview
Ludwig Krippahl, 2008
Programação para as Ciências Experimentais
2007/8
Teórica 6
Ludwig Krippahl, 2008 2
Na aula de hoje...
Estruturas. Vectores de estruturas (structure arrays). Leitura formatada. Recursividade Gráficos 3D
Ludwig Krippahl, 2008 3
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 4
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> pratoprato ={ nome = filetes pedidos = 10 2 3 5 9 5 9 preco = 12.500}
Ludwig Krippahl, 2008 5
Estruturas
prato =
{
nome = filetes
pedidos =
10 2 3 5 9 5 9
preco = 12.500
}
Estrutura
Ludwig Krippahl, 2008 6
Estruturas
prato =
{
nome = filetes
pedidos =
10 2 3 5 9 5 9
preco = 12.500
}
Campos
Ludwig Krippahl, 2008 7
Estruturas
prato =
{
nome = filetes
pedidos =
10 2 3 5 9 5 9
preco = 12.500
}
Valores
Ludwig Krippahl, 2008 8
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 9
Estruturas Estrutura de estrutura...
octave:13> cliente.nome="Vitor Meireles";octave:14> cliente.prato=pratocliente ={ nome = Vitor Meireles prato = { nome = filetes pedidos = 10 2 3 5 9 5 9 preco = 12.500 }}
Ludwig Krippahl, 2008 10
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 11
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...)
Ludwig Krippahl, 2008 12
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 13
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 14
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 15
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 16
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 17
Exemplo: massa molecular
Saber as massas atómicas• Ficheiro elementos.txt
(SQ Nome NA Massa GP)
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
Ludwig Krippahl, 2008 18
Exemplo: massa molecular
Saber as massas atómicas•Ficheiro elementos.txt
•Separado por tabs
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");
Variáveis onde guardar os valores.
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");
Identificador do ficheiro
Ludwig Krippahl, 2008 21
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 22
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 23
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 24
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 25
Exemplo: massa molecularfunction 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 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;
[...]
f=f+1;
endwhile
fclose(id);
endfunction
Abre o ficheiro
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;
[...]
f=f+1;
endwhile
fclose(id);
endfunction
Enquanto não chega ao fim lê cada linha para várias variáveis
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;
[...]
f=f+1;
endwhile
fclose(id);
endfunction
e constrói o elemento f do vector de estruturas
Ludwig Krippahl, 2008 29
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
Ludwig Krippahl, 2008 30
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 31
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 32
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 33
Recursividade
Factorial:• N! = N * (N-1) * (N-2) *..
• N! = N * (N-1)!
Ludwig Krippahl, 2008 34
Recursividade
Factorial:function f=factorial(n) if n<=1 f=1; else f=n*factorial(n-1); endifendfunction
Condição de paragem. É importante ser primeiro!
Ludwig Krippahl, 2008 35
Recursividade
Factorial:function f=factorial(n) if n<=1 f=1; else f=n*factorial(n-1); endifendfunction
Chamada recursiva.
N!= N* (N-1)!
Ludwig Krippahl, 2008 36
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 endifendfunction
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; break; endif endfor
Guarda 1ª letra. A quantidade é string vazia e assume que não há próxima
Ludwig Krippahl, 2008 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; break; endif endfor
A partir do 2º caracter, se for digito vai para a string da quantidade
Ludwig Krippahl, 2008 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; break; endif endfor
senão, se for minúscula vai para o elemento.
Ludwig Krippahl, 2008 40
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
Ludwig Krippahl, 2008 41
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 42
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 43
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 44
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 endforendfunction
Ludwig Krippahl, 2008 45
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; endforendfunction
Ludwig Krippahl, 2008 46
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 47
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 48
Gráficos 3D
Ludwig Krippahl, 2008 49
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 50
Gráficos 3D
Ludwig Krippahl, 2008 51
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 52
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 53
Dúvidas