ludwig krippahl, 2008 programação para as ciências experimentais 2007/8 teórica 6

53
Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

Upload: internet

Post on 17-Apr-2015

105 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

Ludwig Krippahl, 2008

Programação para as Ciências Experimentais

2007/8

Teórica 6

Page 2: 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

Page 3: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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

Page 4: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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}

Page 5: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

Ludwig Krippahl, 2008 5

Estruturas

prato =

{

nome = filetes

pedidos =

10 2 3 5 9 5 9

preco = 12.500

}

Estrutura

Page 6: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

Ludwig Krippahl, 2008 6

Estruturas

prato =

{

nome = filetes

pedidos =

10 2 3 5 9 5 9

preco = 12.500

}

Campos

Page 7: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

Ludwig Krippahl, 2008 7

Estruturas

prato =

{

nome = filetes

pedidos =

10 2 3 5 9 5 9

preco = 12.500

}

Valores

Page 8: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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.

Page 9: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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 }}

Page 10: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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]

Page 11: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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...)

Page 12: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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...

Page 13: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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

Page 14: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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

Page 15: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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

Page 16: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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.

Page 17: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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

Page 18: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

Ludwig Krippahl, 2008 18

Exemplo: massa molecular

Saber as massas atómicas•Ficheiro elementos.txt

•Separado por tabs

Page 19: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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.

Page 20: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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

Page 21: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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)

Page 22: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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.

Page 23: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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)

Page 24: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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.

Page 25: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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

Page 26: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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

Page 27: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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

Page 28: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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

Page 29: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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

Page 30: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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.

Page 31: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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.

Page 32: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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

Page 33: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

Ludwig Krippahl, 2008 33

Recursividade

Factorial:• N! = N * (N-1) * (N-2) *..

• N! = N * (N-1)!

Page 34: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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!

Page 35: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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)!

Page 36: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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

Page 37: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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

Page 38: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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

Page 39: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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.

Page 40: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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

Page 41: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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

Page 42: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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

Page 43: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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.

Page 44: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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

Page 45: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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

Page 46: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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

Page 47: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 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)

Page 48: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

Ludwig Krippahl, 2008 48

Gráficos 3D

Page 49: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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)

Page 50: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

Ludwig Krippahl, 2008 50

Gráficos 3D

Page 51: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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.

Page 52: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

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

Page 53: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6

Ludwig Krippahl, 2008 53

Dúvidas