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.
Ludwig Krippahl, 2007 3
Comparações
Igual • ==
Maior, menor, ou igual • >, <, >=, <=
Negação ! Diferente
• !=
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)
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
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
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
Ludwig Krippahl, 2007 8
Controlo condicional: if
Exemplo: se x<25 soma y
if x<25
x=x+y;
endif
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
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 &
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
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
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
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
Ludwig Krippahl, 2007 15
Ciclo for
Exemplo: fazer algo 10 vezes:
for f = 1:10
alguma coisa
endfor
Ludwig Krippahl, 2007 16
Ciclo for
Exemplo: Substituir todos os caracteres de s por *
for f = 1:length(s)
s(f) = “*”;
endfor
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
Ludwig Krippahl, 2007 18
1º passo: perceber como fazer
Percorrer a fórmula• CH3COOH
Identificar o que é elemento
Ludwig Krippahl, 2007 19
1º passo: perceber como fazer
Percorrer a fórmula• CH3COOH
E o que não é elemento
Ludwig Krippahl, 2007 20
1º passo: perceber como fazer
Criar a lista• C, H, C, O, O, H
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
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á.
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
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
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
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
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
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.
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
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
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
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
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>
Ludwig Krippahl, 2007 34
Função [el, resto]=umelem(s)
Entra aqui
[e, resto] = umelem(resto)
Ludwig Krippahl, 2007 35
Função [el, resto]=umelem(s)
Entra aqui
[e, resto] = umelem(resto)
Sai aqui o novo fragmento
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á.
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
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
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
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
Ludwig Krippahl, 2007 41
Função tabela=addelem(el,tabela)
Se tabela vazia, fica logo el
if tabela==“”...
else
endif
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
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
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.
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á
Ludwig Krippahl, 2007 46
Dúvidas
Top Related