A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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

Apresentações semelhantes


Apresentação em tema: "Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6."— Transcrição da apresentação:

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

2 Ludwig Krippahl, 2008 2 Na aula de hoje... Estruturas. Vectores de estruturas (structure arrays). Leitura formatada. Recursividade Gráficos 3D

3 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

4 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> prato prato = { nome = filetes pedidos = 10 2 3 5 9 5 9 preco = 12.500 }

5 Ludwig Krippahl, 2008 5 Estruturas prato = { nome = filetes pedidos = 10 2 3 5 9 5 9 preco = 12.500 } Estrutura

6 Ludwig Krippahl, 2008 6 Estruturas prato = { nome = filetes pedidos = 10 2 3 5 9 5 9 preco = 12.500 } Campos

7 Ludwig Krippahl, 2008 7 Estruturas prato = { nome = filetes pedidos = 10 2 3 5 9 5 9 preco = 12.500 } Valores

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

9 Ludwig Krippahl, 2008 9 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 }

10 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]

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

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

13 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

14 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

15 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

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

17 Ludwig Krippahl, 2008 17 Exemplo: massa molecular Saber as massas atómicas Ficheiro elementos.txt (SQNomeNAMassaGP) AcActinium8922707 AgSilver47107.8682115 AlAluminium1326.9815386133 AmAmericium9524307

18 Ludwig Krippahl, 2008 18 Exemplo: massa molecular Saber as massas atómicas Ficheiro elementos.txt Separado por tabs

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

20 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

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

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

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

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

25 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,"%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

26 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

27 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

28 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

29 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

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

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

32 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

33 Ludwig Krippahl, 2008 33 Recursividade Factorial: N! = N * (N-1) * (N-2) *.. N! = N * (N-1)!

34 Ludwig Krippahl, 2008 34 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!

35 Ludwig Krippahl, 2008 35 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)!

36 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 endfunction

37 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

38 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

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

40 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

41 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

42 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

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

44 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 endfor endfunction

45 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; endfor endfunction

46 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 yy = 4 4 4 5 5 5 6 6 6

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

48 Ludwig Krippahl, 2008 48 Gráficos 3D

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

50 Ludwig Krippahl, 2008 50 Gráficos 3D

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

52 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

53 Ludwig Krippahl, 2008 53 Dúvidas


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

Apresentações semelhantes


Anúncios Google