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
Download

Slides