ludwig krippahl, 2008 programação para as ciências experimentais 2007/8 teórica 3
TRANSCRIPT
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
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
Ludwig Krippahl, 2008 4
Revisão: Funções
function res=soma(a,b)
res=a+b
endfunctionArgumentos da função.
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
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).
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.
Ludwig Krippahl, 2008 8
Aulas práticas
Antes de perguntar:• help nome_da_função
• consultar o manual
• experimentar
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
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
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
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
Ludwig Krippahl, 2008 13
Na aula de hoje...
Comparações (Booleanos) Condições (if...then...else Ciclo condicional (while) Ciclo for e break.
Ludwig Krippahl, 2008 14
Comparações
Igual • == (ATT: um igual, =, é atribuição)
Maior, menor, ou igual • >, <, >=, <=
Negação ! Diferente
• !=
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)
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
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)
Ludwig Krippahl, 2008 18
Comparar strings
para comparar strings usar função
strcmp(s1,s2)
strcmp(“ab”,”abc”)
ans = 0
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
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
Ludwig Krippahl, 2008 21
Controlo condicional: if
Exemplo: se x<25 soma y
if x<25
x=x+y;
endif
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
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 &
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
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
Ludwig Krippahl, 2008 26
Ciclo for
Executa o bloco de instruções uma vez para cada valor da variável.
for var = vector
...
...
endfor
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
Ludwig Krippahl, 2008 28
Ciclo for
Exemplo: fazer algo 10 vezes:
for f = 1:10
alguma coisa
endfor
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.
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
Ludwig Krippahl, 2008 31
1º passo: perceber como fazer
Percorrer a fórmula• CH3COOH
Identificar o que é elemento
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)
Ludwig Krippahl, 2008 33
1º passo: perceber como fazer
Criar a lista• C, H, C, O, O, H
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
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á.
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
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
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
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
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
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
Ludwig Krippahl, 2008 42
Função: vários valores
Exemplo
function [s,p]=sumprod(a,b)
s=a+b;
p=a*b;
endfunction
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.
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)
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
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
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
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>
Ludwig Krippahl, 2008 49
Função [el, resto]=umelem(s)
Entra aqui
[e, resto] = umelem(resto)
Ludwig Krippahl, 2008 50
Função [el, resto]=umelem(s)
Entra aqui
[e, resto] = umelem(resto)
Sai aqui o novo fragmento
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á.
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
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
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
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
Ludwig Krippahl, 2008 56
Função tabela=addelem(el,tabela)
Se tabela vazia, fica logo el
if strcmp(tabela,“”)...
else
endif
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
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
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.
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á
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
Ludwig Krippahl, 2008 62
Dúvidas