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