1 / 53

Programação para as Ciências Experimentais 2007/8

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.

miron
Download Presentation

Programação para as Ciências Experimentais 2007/8

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

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

  3. Estruturas • Vectores e matrizes guardam valores de um só tipo. • Estruturas podem guardar valores de vários tipos. • Sintaxe: • variável.campo

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

  6. Estruturas prato = { nome = filetes pedidos = 10 2 3 5 9 5 9 preco = 12.500 } Campos

  7. Estruturas prato = { nome = filetes pedidos = 10 2 3 5 9 5 9 preco = 12.500 } Valores

  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. 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. 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. 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. 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. 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. 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. Exemplo: massa molecular • Uma função que receba uma fórmula química e devolva a massa molecular. massamol(“CHCl3”) ans = 119.38

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

  18. Exemplo: massa molecular • Saber as massas atómicas • Ficheiro elementos.txt • Separado por tabs

  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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Exemplo: massa molecular • Precisamos de: • Saber as massas atómicas • Decompor a fórmula guardando o número de átomos • Somar tudo.

  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. 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. Recursividade • Factorial: • N! = N * (N-1) * (N-2) *.. • N! = N * (N-1)!

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

  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. 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. 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. 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. 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. 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. Exemplo: massa molecular • Precisamos de: • Saber as massas atómicas • Decompor a fórmula guardando o número de átomos • Somar tudo.

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

  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. Gráficos 3D

  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. Gráficos 3D

More Related