46
Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3

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

Embed Size (px)

Citation preview

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

Ludwig Krippahl, 2007

Programação para as Ciências Experimentais

2006/7

Teórica 3

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

Ludwig Krippahl, 2007 2

Na aula de hoje...

Comparações (Booleanos) Controlo condicional

• if...then...else

• While

Ciclo for, e break.

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

Ludwig Krippahl, 2007 3

Comparações

Igual • ==

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

Negação ! Diferente

• !=

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

Ludwig Krippahl, 2007 4

Booleanos 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 5: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3

Ludwig Krippahl, 2007 5

Booleanos

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

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

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

Ludwig Krippahl, 2007 6

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 7: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3

Ludwig Krippahl, 2007 7

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

Ludwig Krippahl, 2007 8

Controlo condicional: if

Exemplo: se x<25 soma y

if x<25

x=x+y;

endif

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

Ludwig Krippahl, 2007 9

Controlo condicional: if

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

if x!=25 & y!=25

x=x+y;

endif

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

Ludwig Krippahl, 2007 10

Controlo condicional: if

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

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

...

endif

Importante não verificar a segunda parte se

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

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

Ludwig Krippahl, 2007 11

Ciclo condicional: while

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

while expressão

...

...

endwhile

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

Ludwig Krippahl, 2007 12

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 13: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3

Ludwig Krippahl, 2007 13

Ciclo for

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

for variável = vector

...

...

endfor

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

Ludwig Krippahl, 2007 14

Ciclo for

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

for f = [3, 5, 8]

x=x+f

endfor

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

Ludwig Krippahl, 2007 15

Ciclo for

Exemplo: fazer algo 10 vezes:

for f = 1:10

alguma coisa

endfor

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

Ludwig Krippahl, 2007 16

Ciclo for

Exemplo: Substituir todos os caracteres de s por *

for f = 1:length(s)

s(f) = “*”;

endfor

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

Ludwig Krippahl, 2007 17

Problema

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

Numa tabela com os seus elementos (matriz):C

H

O

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

Ludwig Krippahl, 2007 18

1º passo: perceber como fazer

Percorrer a fórmula• CH3COOH

Identificar o que é elemento

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

Ludwig Krippahl, 2007 19

1º passo: perceber como fazer

Percorrer a fórmula• CH3COOH

E o que não é elemento

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

Ludwig Krippahl, 2007 20

1º passo: perceber como fazer

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

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

Ludwig Krippahl, 2007 21

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 22: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3

Ludwig Krippahl, 2007 22

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 23: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3

Ludwig Krippahl, 2007 23

Tirar o primeiro elemento

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

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

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

Ludwig Krippahl, 2007 24

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 25: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3

Ludwig Krippahl, 2007 25

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 26: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3

Ludwig Krippahl, 2007 26

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 27: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3

Ludwig Krippahl, 2007 27

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 28: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3

Ludwig Krippahl, 2007 28

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 29: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3

Ludwig Krippahl, 2007 29

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:s != “”

é digit: função isdigit

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

Ludwig Krippahl, 2007 30

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 31: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3

Ludwig Krippahl, 2007 31

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 32: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3

Ludwig Krippahl, 2007 32

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 33: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3

Ludwig Krippahl, 2007 33

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 34: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3

Ludwig Krippahl, 2007 34

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

Entra aqui

[e, resto] = umelem(resto)

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

Ludwig Krippahl, 2007 35

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

Entra aqui

[e, resto] = umelem(resto)

Sai aqui o novo fragmento

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

Ludwig Krippahl, 2007 36

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 37: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3

Ludwig Krippahl, 2007 37

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 38: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3

Ludwig Krippahl, 2007 38

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 39: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3

Ludwig Krippahl, 2007 39

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 40: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3

Ludwig Krippahl, 2007 40

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 41: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3

Ludwig Krippahl, 2007 41

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

Se tabela vazia, fica logo el

if tabela==“”...

else

endif

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

Ludwig Krippahl, 2007 42

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 Interrompe um ciclo (for ou while)

endfor

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

Ludwig Krippahl, 2007 43

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 s!=“”

...

endwhile

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

Ludwig Krippahl, 2007 44

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 45: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3

Ludwig Krippahl, 2007 45

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 46: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3

Ludwig Krippahl, 2007 46

Dúvidas