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

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

Upload: internet

Post on 17-Apr-2015

107 views

Category:

Documents


1 download

TRANSCRIPT

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

Ludwig Krippahl, 2008

Programação para as Ciências Experimentais

2007/8

Teórica 3

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

Ludwig Krippahl, 2008 2

Revisão: Funções

function res=soma(a,b)

res=a+b

endfunction

Declaração da função

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

Ludwig Krippahl, 2008 3

Revisão: Funções

function res=soma(a,b)

res=a+b

endfunction Nome da funçãoE nome do ficheiro:

soma.m

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

Ludwig Krippahl, 2008 4

Revisão: Funções

function res=soma(a,b)

res=a+b

endfunctionArgumentos da função.

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

Ludwig Krippahl, 2008 5

Revisão: Funções

function res=soma(a,b)

res=a+b

endfunctionNome da variável (na função) com o valor a devolver

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

Ludwig Krippahl, 2008 6

Revisão: Funções

function res=soma(a,b)

res=a+b

endfunctiona e b contém cópias dos valores dados.

Todas as variáveis são locais (só existem na função).

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

Ludwig Krippahl, 2008 7

Revisão: Funções

function res=soma(a,b)

res=a+b;

endfunctionO ; “silencia” os cálculos intermédios.É útil omitir durante o desenvolvimento.

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

Ludwig Krippahl, 2008 8

Aulas práticas

Antes de perguntar:• help nome_da_função

• consultar o manual

• experimentar

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

Ludwig Krippahl, 2008 9

Controlo da execução

Pegar no pão Se faca na bancada,

• Pegar na faca Caso contrário

• Ir buscar faca à gaveta Cortar fatia, pôr na torradeira, ligar Enquanto não está pronta

• Esperar

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

Ludwig Krippahl, 2008 10

Controlo da execução

Pegar no pão Se faca na bancada,

• Pegar na faca Caso contrário

• Ir buscar faca à gaveta Cortar fatia, pôr na torradeira, ligar Enquanto não está pronta

• Esperar

Sequência

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

Ludwig Krippahl, 2008 11

Controlo da execução

Pegar no pão Se faca na bancada,

• Pegar na faca Caso contrário

• Ir buscar faca à gaveta Cortar fatia, pôr na torradeira, ligar Enquanto não está pronta

• Esperar

Condição

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

Ludwig Krippahl, 2008 12

Controlo da execução

Pegar no pão Se faca na bancada,

• Pegar na faca Caso contrário

• Ir buscar faca à gaveta Cortar fatia, pôr na torradeira, ligar Enquanto não está pronta

• Esperar Ciclo

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

Ludwig Krippahl, 2008 13

Na aula de hoje...

Comparações (Booleanos) Condições (if...then...else Ciclo condicional (while) Ciclo for e break.

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

Ludwig Krippahl, 2008 14

Comparações

Igual • == (ATT: um igual, =, é atribuição)

Maior, menor, ou igual • >, <, >=, <=

Negação ! Diferente

• !=

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

Ludwig Krippahl, 2008 15

Booleanos e comparações Booleano (verdadeiro ou falso), exemplos: octave:34> 1==2ans = 0octave:35> 1==1ans = 1octave:36> [1,2,3]==[3,2,1]ans = 0 1 0 (compara cada elemento)octave:37> "paulo"=="paula"ans = 1 1 1 1 0 (compara cada elemento)

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

Ludwig Krippahl, 2008 16

Booleanos

Booleano (verdadeiro ou falso), • 0 é falso.

• Tudo o resto é verdadeiro Constantes já definidas no Octave: octave:38> truetrue = 1octave:39> falsefalse = 0

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

Ludwig Krippahl, 2008 17

Comparar strings

Strings são vectores de caracteres.

“abc”==“abd”

ans= 1 1 0

“abc”==“abde”

*erro* (não têm o mesmo tamanho)

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

Ludwig Krippahl, 2008 18

Comparar strings

para comparar strings usar função

strcmp(s1,s2)

strcmp(“ab”,”abc”)

ans = 0

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

Ludwig Krippahl, 2008 19

Operadores Booleanos (e, ou)

& e

| ou

“Curto-circuito”: (só avalia o necessário)

&& A && B, se A falso não faz B

|| A II B, se A verdadeiro, não faz B

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

Ludwig Krippahl, 2008 20

Controlo condicional: if

Executa o bloco de instruções se a expressão for diferente de 0 (0 é falso)

if expressão

...

else

...

endif

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

Ludwig Krippahl, 2008 21

Controlo condicional: if

Exemplo: se x<25 soma y

if x<25

x=x+y;

endif

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

Ludwig Krippahl, 2008 22

Controlo condicional: if

Exemplo: se x e y diferentes de 25, soma y

if x!=25 & y!=25

x=x+y;

endif

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

Ludwig Krippahl, 2008 23

Controlo condicional: if

Exemplo: se s não é vazia e se o primeiro caracter é A

if !strcmp(s,“”) && s(1)==“A”

...

endif

Importante não verificar a segunda parte se

s for vazia (dá erro...): && em vez de &

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

Ludwig Krippahl, 2008 24

Ciclo condicional: while

Executa o bloco de instruções enquanto a expressão for diferente de 0

while expressão

...

...

endwhile

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

Ludwig Krippahl, 2008 25

Ciclo condicional: while

Exemplo: dividir x por dois até ter um número menor que 5 (enquanto >=5)

while x>=5

x=x/2;

endwhile

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

Ludwig Krippahl, 2008 26

Ciclo for

Executa o bloco de instruções uma vez para cada valor da variável.

for var = vector

...

...

endfor

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

Ludwig Krippahl, 2008 27

Ciclo for

Exemplo: somar a x os números 3, 5, e 8.

for f = [3, 5, 8]

x=x+f

endfor

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

Ludwig Krippahl, 2008 28

Ciclo for

Exemplo: fazer algo 10 vezes:

for f = 1:10

alguma coisa

endfor

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

Ludwig Krippahl, 2008 29

Ciclo for

Exemplo: Substituir todos os caracteres de s por *

for f = 1:length(s)

s(f) = “*”;

endfor

Nota: não é preciso usar o contador dentro do ciclo.

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

Ludwig Krippahl, 2008 30

Problema

Decompor uma fórmula química (string):• e.g. CH3COOH

Numa tabela com os seus elementos (matriz):C

H

O

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

Ludwig Krippahl, 2008 31

1º passo: perceber como fazer

Percorrer a fórmula• CH3COOH

Identificar o que é elemento

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

Ludwig Krippahl, 2008 32

1º passo: perceber como fazer

Percorrer a fórmula• CH3COOH

E o que não é elemento

(assumir que elemento só tem um caracter)

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

Ludwig Krippahl, 2008 33

1º passo: perceber como fazer

Criar a lista• C, H, C, O, O, H

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

Ludwig Krippahl, 2008 34

1º passo: perceber como fazer

Criar a lista• C, H, C, O, O, H

• Mas pôr só se não estiver já na lista

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

Ludwig Krippahl, 2008 35

2º passo: dividir o problema em problemas mais simples

Precisamos de 2 coisas:• Tirar o primeiro elemento da fórmula

• Acrescentar à tabela se não estiver lá.

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

Ludwig Krippahl, 2008 36

Tirar o primeiro elemento

• Uma função que:• Recebe a fórmula

• Devolve o primeiro elemento e o resto da fórmula

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

Ludwig Krippahl, 2008 37

Tirar o primeiro elemento

• Uma função que:• Recebe a fórmula

• Devolve o primeiro elemento e o resto da fórmula:

• CH3COOH

• C H3COOH

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

Ludwig Krippahl, 2008 38

Tirar o primeiro elemento

• Uma função que:• Recebe a fórmula

• Devolve o primeiro elemento e o resto da fórmula

• Podemos usar várias vezes

• H3COOH

• H 3COOH

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

Ludwig Krippahl, 2008 39

Tirar o primeiro elemento

• Uma função que:• Recebe a fórmula

• Devolve o primeiro elemento e o resto da fórmula

• Podemos usar várias vezes

• 3COOH

• C OOH

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

Ludwig Krippahl, 2008 40

Tirar o primeiro elemento

• Uma função que:• Recebe a fórmula

• Devolve o primeiro elemento e o resto da fórmula

• Podemos usar várias vezes

• OOH

• O OH

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

Ludwig Krippahl, 2008 41

Função: vários valores

Como declarar a função (Manual, 11.2)

function [v1, v2, v3]=nome(arg1, arg2)

.....

endfunction

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

Ludwig Krippahl, 2008 42

Função: vários valores

Exemplo

function [s,p]=sumprod(a,b)

s=a+b;

p=a*b;

endfunction

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

Ludwig Krippahl, 2008 43

Função [el, resto]=umelem(s)

Aqui também várias coisas:• Tirar os números no inicio, se necessário:

• 3COOH

• Guardar em el o primeiro caracter, se houver.

• Guardar em resto os outros, se houver.

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

Ludwig Krippahl, 2008 44

Função [el, resto]=umelem(s)

1: Tirar os números no inicio, se necessário: Enquanto s não for vazio e s(1) for um dígito:

• s = s(2:length(s)).

Não vazio:!strcmp(s,“”)

é algarismo: função isdigit(c)

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

Ludwig Krippahl, 2008 45

Função [el, resto]=umelem(s)

1: Tirar os números no inicio, se necessário: Enquanto s não for vazio e s(1) for um dígito:

• s = s(2:length(s)).

Enquanto:

while condição....

endwhile

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

Ludwig Krippahl, 2008 46

Função [el, resto]=umelem(s) 2: Guardar em el o primeiro caracter, se

houver• Só serve para elementos com 1 caracter.

Comentar isso no código (%). Se, então, caso contrário:if condição

....else

....

endif

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

Ludwig Krippahl, 2008 47

Função [el, resto]=umelem(s) 3: Guardar o resto se houver mais caracteres

em s ou seja, se length(s) > 1

Se, então, caso contrário:if condição

....else

....

endif

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

Ludwig Krippahl, 2008 48

Função [el, resto]=umelem(s) Testar:octave:22> [e,r]=umelem("CH3COOH")e = Cr = H3COOHoctave:23> [e1,r]=umelem(r)e1 = Hr = 3COOHoctave:24> [e1,r]=umelem(r)e1 = Cr = OOHoctave:25>

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

Ludwig Krippahl, 2008 49

Função [el, resto]=umelem(s)

Entra aqui

[e, resto] = umelem(resto)

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

Ludwig Krippahl, 2008 50

Função [el, resto]=umelem(s)

Entra aqui

[e, resto] = umelem(resto)

Sai aqui o novo fragmento

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

Ludwig Krippahl, 2008 51

1º passo: partir em mais simples

Precisamos de 2 coisas:• Tirar o primeiro elemento da fórmula

• Acrescentar à tabela se não estiver lá.

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

Ludwig Krippahl, 2008 52

Acrescentar à lista

• Uma função que:• Recebe o elemento e a tabela

• Acrescenta se não estiver

• Podemos usar várias vezes

• C, “”

• C

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

Ludwig Krippahl, 2008 53

Acrescentar à lista

• Uma função que:• Recebe o elemento e a tabela

• Acrescenta se não estiver

• Podemos usar várias vezes

• H, “C”

• C

• H

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

Ludwig Krippahl, 2008 54

Acrescentar à lista

• Uma função que:• Recebe o elemento e a tabela

• Acrescenta se não estiver

• Podemos usar várias vezes

• C, [“C”;”H”] Já está, não faz nada

• C

• H

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

Ludwig Krippahl, 2008 55

Função tabela=addelem(el,tabela)

Também várias coisas:• Se tabela vazia, fica logo el

• Caso contrário, ver se há el na tabela.

• Se não há, acrescenta no fim

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

Ludwig Krippahl, 2008 56

Função tabela=addelem(el,tabela)

Se tabela vazia, fica logo el

if strcmp(tabela,“”)...

else

endif

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

Ludwig Krippahl, 2008 57

Função tabela=addelem(el,tabela)

Caso contrário, ver se há na tabela• Assumir que não há (usar variável = false)

• Percorrer todas as linhas

• Se encontra, afinal há, pára de procurar.

for f=1:rows(tabela)...

if ... break

endfor

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

Ludwig Krippahl, 2008 58

Função tabela=separaelems(s)

Já temos as peças, agora é juntar• Inicializar a tabela a vazio.

• Enquanto s não for vazio• Tirar o primeiro elemento com umelem

• Guardar na tabela com addelem (se houver)

while !strcmp(s,“”)

...

endwhile

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

Ludwig Krippahl, 2008 59

Nesta aula

Os detalhes (if, for, etc..) são para ir praticando.

O importante desta aula é o método:• Perceber o problema e conceber o algoritmo

• Se é complicado, dividir em partes mais simples

• Fazer o mesmo com as partes mais simples até ter partes triviais.

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

Ludwig Krippahl, 2008 60

Dividir para conquistar

separaelem• umelem

• tirar os dígitos

• guardar o el, se algum

• guardar o resto, se existe

• addelem• se tabela vazia, basta pôr

• caso contrário, procura, e põe se não está lá

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

Ludwig Krippahl, 2008 61

Dividir para conquistar

separaelem• Enquanto fórmula não vazia (while)

• Retirar um elemento (umelem)

• Acrescentar à tabela (addelem)

• A nova fórmula é o que sobra

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

Ludwig Krippahl, 2008 62

Dúvidas