Programação para as
Ciências Experimentais
2006/7
Teórica 3
Ludwig Krippahl, 2007
Na aula de hoje...

Comparações (Booleanos)
Controlo condicional

Ciclo for, e break.

• if...then...else
• While
Ludwig Krippahl, 2007
2
Comparações

Igual

Maior, menor, ou igual

Negação !
Diferente

• ==
• >, <, >=, <=
• !=
Ludwig Krippahl, 2007
3
Booleanos
Booleano (verdadeiro ou falso), exemplos:
octave:34> 1==2
ans = 0
octave:35> 1==1
ans = 1
octave: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
4
Booleanos

Booleano (verdadeiro ou falso),
• 0 é falso.
• Tudo o resto é verdadeiro
Constantes já definidas no Octave:
octave:38> true
true = 1
octave:39> false
false = 0

Ludwig Krippahl, 2007
5
Operadores Booleanos (e, ou)
&
|
e
ou
“Curto-circuito”: (só avalia o necessário)
&&
||
Ludwig Krippahl, 2007
A && B, se A falso não faz B
A II B, se A verdadeiro, não faz B
6
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
7
Controlo condicional: if

Exemplo: se x<25 soma y
if x<25
x=x+y;
endif
Ludwig Krippahl, 2007
8
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
9
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
10
Ciclo condicional: while

Executa o bloco de instruções enquanto
a expressão for diferente de 0
while expressão
...
...
endwhile
Ludwig Krippahl, 2007
11
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
12
Ciclo for

Executa o bloco de instruções uma vez
para cada valor da variável.
for variável = vector
...
...
endfor
Ludwig Krippahl, 2007
13
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
14
Ciclo for

Exemplo: fazer algo 10 vezes:
for f = 1:10
alguma coisa
endfor
Ludwig Krippahl, 2007
15
Ciclo for

Exemplo: Substituir todos os caracteres
de s por *
for f = 1:length(s)
s(f) = “*”;
endfor
Ludwig Krippahl, 2007
16
Problema

Decompor uma fórmula química (string):

Numa tabela com os seus elementos
(matriz):
• e.g. CH3COOH
C
H
O
Ludwig Krippahl, 2007
17
1º passo: perceber como fazer

Percorrer a fórmula
• CH3COOH
Identificar o que é elemento
Ludwig Krippahl, 2007
18
1º passo: perceber como fazer

Percorrer a fórmula
• CH3COOH
E o que não é elemento
Ludwig Krippahl, 2007
19
1º passo: perceber como fazer

Criar a lista
• C, H, C, O, O, H
Ludwig Krippahl, 2007
20
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
21
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
22
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
23
Tirar o primeiro elemento
• Uma função que:
• Recebe a fórmula
• Devolve o primeiro elemento e o resto da fórmula:
• CH3COOH
•C
Ludwig Krippahl, 2007
H3COOH
24
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
Ludwig Krippahl, 2007
3COOH
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
• 3COOH
•C
Ludwig Krippahl, 2007
OOH
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
• OOH
•O
Ludwig Krippahl, 2007
OH
27
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
28
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
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)).
Enquanto:
while condição

....
endwhile
Ludwig Krippahl, 2007
30
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
31
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
32
Função [el, resto]=umelem(s)
Testar:
octave:22> [e,r]=umelem("CH3COOH")
e=C
r = H3COOH
octave:23> [e1,r]=umelem(r)
e1 = H
r = 3COOH
octave:24> [e1,r]=umelem(r)
e1 = C
r = OOH
octave:25>

Ludwig Krippahl, 2007
33
Função [el, resto]=umelem(s)

Entra aqui
[e, resto] = umelem(resto)
Ludwig Krippahl, 2007
34
Função [el, resto]=umelem(s)

Entra aqui
[e, resto] = umelem(resto)
Sai aqui o novo fragmento
Ludwig Krippahl, 2007
35
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
36
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
37
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
38
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
39
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
40
Função
tabela=addelem(el,tabela)

Se tabela vazia, fica logo el
if tabela==“”
...
else
endif
Ludwig Krippahl, 2007
41
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
42
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
43
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
44
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
45
Dúvidas
Ludwig Krippahl, 2007
46
Download

Slides da aula.