Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 3
Ludwig Krippahl, Revisão: Funções function res=soma(a,b) res=a+b endfunction Declaração da função
Ludwig Krippahl, Revisão: Funções function res=soma(a,b) res=a+b endfunction Nome da função E nome do ficheiro: soma.m
Ludwig Krippahl, Revisão: Funções function res=soma(a,b) res=a+b endfunction Argumentos da função.
Ludwig Krippahl, Revisão: Funções function res=soma(a,b) res=a+b endfunction Nome da variável (na função) com o valor a devolver
Ludwig Krippahl, Revisão: Funções function res=soma(a,b) res=a+b endfunction a e b contém cópias dos valores dados. Todas as variáveis são locais (só existem na função).
Ludwig Krippahl, Revisão: Funções function res=soma(a,b) res=a+b; endfunction O ; silencia os cálculos intermédios. É útil omitir durante o desenvolvimento.
Ludwig Krippahl, Aulas práticas Antes de perguntar: help nome_da_função consultar o manual experimentar
Ludwig Krippahl, 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, 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, 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, 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, Na aula de hoje... Comparações (Booleanos) Condições (if...then...else Ciclo condicional (while) Ciclo for e break.
Ludwig Krippahl, Comparações Igual == (ATT: um igual, =, é atribuição) Maior, menor, ou igual >, =, <= Negação ! Diferente !=
Ludwig Krippahl, Booleanos e comparações 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 = (compara cada elemento)
Ludwig Krippahl, 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, Comparar strings Strings são vectores de caracteres. abc==abd ans= abc==abde *erro* (não têm o mesmo tamanho)
Ludwig Krippahl, Comparar strings para comparar strings usar função strcmp(s1,s2) strcmp(ab,abc) ans = 0
Ludwig Krippahl, 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, 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, Controlo condicional: if Exemplo: se x<25 soma y if x<25 x=x+y; endif
Ludwig Krippahl, Controlo condicional: if Exemplo: se x e y diferentes de 25, soma y if x!=25 & y!=25 x=x+y; endif
Ludwig Krippahl, 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, Ciclo condicional: while Executa o bloco de instruções enquanto a expressão for diferente de 0 while expressão... endwhile
Ludwig Krippahl, 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, Ciclo for Executa o bloco de instruções uma vez para cada valor da variável. for var = vector... endfor
Ludwig Krippahl, Ciclo for Exemplo: somar a x os números 3, 5, e 8. for f = [3, 5, 8] x=x+f endfor
Ludwig Krippahl, Ciclo for Exemplo: fazer algo 10 vezes: for f = 1:10 alguma coisa endfor
Ludwig Krippahl, 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, Problema Decompor uma fórmula química (string): e.g. CH3COOH Numa tabela com os seus elementos (matriz): C H O
Ludwig Krippahl, º passo: perceber como fazer Percorrer a fórmula CH3COOH Identificar o que é elemento
Ludwig Krippahl, º passo: perceber como fazer Percorrer a fórmula CH3COOH E o que não é elemento (assumir que elemento só tem um caracter)
Ludwig Krippahl, º passo: perceber como fazer Criar a lista C, H, C, O, O, H
Ludwig Krippahl, º 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, º 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, Tirar o primeiro elemento Uma função que: Recebe a fórmula Devolve o primeiro elemento e o resto da fórmula
Ludwig Krippahl, Tirar o primeiro elemento Uma função que: Recebe a fórmula Devolve o primeiro elemento e o resto da fórmula: CH3COOH
Ludwig Krippahl, 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
Ludwig Krippahl, 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 COOH
Ludwig Krippahl, 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
Ludwig Krippahl, Função: vários valores Como declarar a função (Manual, 11.2) function [v1, v2, v3]=nome(arg1, arg2)..... endfunction
Ludwig Krippahl, Função: vários valores Exemplo function [s,p]=sumprod(a,b) s=a+b; p=a*b; endfunction
Ludwig Krippahl, 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, 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, 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, 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, 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, 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, Função [el, resto]=umelem(s) Entra aqui [e, resto] = umelem(resto)
Ludwig Krippahl, Função [el, resto]=umelem(s) Entra aqui [e, resto] = umelem(resto) Sai aqui o novo fragmento
Ludwig Krippahl, º 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, 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, 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, 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, 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, Função tabela=addelem(el,tabela) Se tabela vazia, fica logo el if strcmp(tabela,)... else endif
Ludwig Krippahl, 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, 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, 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, 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, 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, Dúvidas