Informática para Ciências e Engenharias (B) 2015/16 Teórica 5
Na aua de hoje Controo de execução cicos condicionais whie end Exempos raiz quadrada whie Histograma whie e matrizes fórmua química whie e strings Processamento de strings comparação decompor URL findstr
«Agoritmo» da torrada 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
«Agoritmo» da torrada 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 Condicão
«Agoritmo» da torrada 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 Cico Condiciona
Controo de execução Controo de execução Sequência Cicos for end condições if eseif ese end vaores e operadores booeanos cicos condicionais whie end
Cico condiciona: whie Executa um boco de instruções (o corpo do whie) enquanto a condição for verdadeira (não for 0 - zero) whie condição... (corpo)... end
Cico condiciona: whie Exempo: dividir x por dois até se obter um vaor menor que 5 (enquanto >=5) whie x >= 5 end x = x/2;
Raiz Quadrada Exempo 1: cácuo da raiz quadrada
Raiz Quadrada Método babiónico Ideias base 1. Se x é aproximação de s 1/2 então s/x é uma aproximação peo outro ado. Seja s = 100 e s 1/2 = 10. Se 5 = 100 1/2-5 < 10 então 100/5 = 20 = 100 1/2 + 10 > 10 Se 20 = 100 1/2 + 10 > 10 então 100/20 = 5 = 100 1/2-5 < 10 5 10 20
Raiz Quadrada Método babiónico 2. Se y é uma aproximação de s 1/2 e x também x s/y s/x. Seja s = 100 e s 1/2 = 10. y s/x então Se 5 < 8 < 20 então 5 < 100/8 = 12.5 < 20 Se 5 < 12.5 < 20 então 5 < 100/12.5 = 8 < 20 5 8 10 12.5 20
Raiz Quadrada Método babiónico 3. Dada uma aproximação x 0, pode obter-se uma mehor aproximação peo vaor médio do intervao x 0... s/x 0. x 1 = (x 0 + s/x 0 ) /2 Se x 0 = 5 < 10 < 20 então (5+20)/2 = x 1 = 12.5 donde 5 < 8 < 10 < 12.5 < 20 5 10 12.5 20... e mehorar essa aproximação em sucessivas iterações x 2 = (x 1 + s/x 1 ) /2, x 3 = (x 2 + s/x 2 ) /2,...
Raiz Quadrada Método babiónico Exempo: raiz(8100) i x n s/x n x n +s/x n (x n +s/x n )/2 1 4050.00000 2.00000 4052.00000 2026.00000 2 2026.00000 3.99803 2029.99803 1014.99901 3 1014.99901 7.98030 1022.97932 511.48966 4 511.48966 15.83610 527.32576 263.66288 5 263.66288 30.72105 294.38393 147.19196 6 147.19196 55.03018 202.22214 101.11107 7 101.11107 80.10992 181.22099 90.61050 8 90.61050 89.39362 180.00411 90.00206 9 90.00206 89.99794 180.00000 90.00000
Raiz Quadrada Agoritmo (Método babiónico) Começar com uma aproximação x 0 Enquanto??? No fina temos http://en.wikipedia.org/wiki/methods_of_computing_square_roots
Raiz Quadrada Agoritmo (Método babiónico) Quando parar? infinito não é prático Aternativa: quando x n -(x n +1) for pequeno Quão pequeno? Possibiidade: estabeecer a precisão pretendida
Raiz Quadrada Cacuar raiz quadrada, assinatura function x=raiz(s,prec)
Raiz Quadrada Cacuar raiz quadrada function x=raiz(s,prec) Primeira estimativa: x 1 metade de x Segunda estimativa: x 2 média entre x 1 e s/x 1 Precisamos de ambos para a condição do whie
Raiz Quadrada Cacuar raiz quadrada function x=raiz(s,prec) Enquanto os dois vaores forem muito diferentes: guardamos o corrente; e cacuamos o próximo Nota: reutiizam-se as mesmas duas variáveis
Raiz Quadrada Cacuar raiz quadrada function x=raiz(s,prec) Quando o cico terminar, retorna-se a útima aproximação obtida.
Raiz Quadrada octave:22> hep raiz `raiz' is a function from the fie... raiz(s,prec) cacua a raiz quadrada de S a uma precisao determinada por prec octave:23> raiz(4,0.001) ans = 2 octave:24> raiz(9,0.001) ans = 3.0000 octave:25> raiz(17,0.001) ans = 4.1231 octave:26> ans^2 ans = 17.000
Raiz Quadrada Outro teste: Retirando-se os ; das inhas que cacuam os vaores sucessivos de x, pode observar-se a evoução das sucessivas aproximações octave:27> raiz(297,0.001) x = 75.250 x = 39.598 x = 23.549 x = 18.081 x = 17.254 x = 17.234 x = 17.234 ans = 17.234 octave:28> ans^2 ans = 297.00
Histograma Exempo 2: contar presenças (histograma)
Histograma Numa matriz temos o registo de presenças dos 30 aunos de um turno prático Couna 1: o número do auno Couna 2: o número da aua 50014 1 50016 1 50019 1... 50014 4 50016 4 50019 4 50023 4... 50035 5 50049 5 50051 5...
Histograma Pretende-se obter um histograma das presenças dos aunos, i.e. uma matriz com as presenças dos aunos Couna 1: o número do auno Couna 2: o número de presenças 50027 9 50028 10 50030 10... 50071 8 50077 10 50081 12 50084 10 50086 11 50090 11 50099 9...
Histograma Perceber o probema Temos de contar as ocorrências de cada auno na primeira couna da matriz de entrada O resutado será um histograma dos aunos, agrupado peo número
Histograma Generaizar o probema Resove-se este probema, e outros semehantes, com uma função que cacue o histograma basta cacuar o histograma da primeira couna da matriz de entrada
Histograma Conceber o agoritmo Queremos uma matriz com n inhas e 2 counas: eemento e número de ocorrências pode começar a zeros Para cada eemento do vector de entrada verificar se já existe na matriz do histograma se existe somar uma ocorrência nessa inha se não existe acrescentar uma inha com uma ocorrência desse eemento
Histograma Conceber o agoritmo 50014 50016 50014 50016 50019 50023 50014 1 0 0 0 0 0 0 0 0 0 0
Histograma Conceber o agoritmo 50014 50016 50014 50016 50019 50023 50014 1 50016 1 0 0 0 0 0 0 0 0
Histograma Conceber o agoritmo 50014 50016 50014 50016 50019 50023 50014 2 50016 1 0 0 0 0 0 0 0 0
Histograma Conceber o agoritmo 50014 50016 50014 50016 50019 50023 50014 2 50016 2 0 0 0 0 0 0 0 0
Histograma Conceber o agoritmo 50014 50016 50014 50016 50019 50023 50014 2 50016 2 50019 1 0 0 0 0 0 0
Histograma Conceber o agoritmo 50014 50016 50014 50016 50019 50023 50014 2 50016 2 50019 1 50023 1 0 0 0 0
Histograma Conceber o agoritmo 50014 50016 50014 50016 50019 50023 50014 2 50016 2 50019 1 50023 1
Histograma Conceber o agoritmo Tarefas: obter a posição na primeira couna do histograma, ou zero se não existe generaizando: pesquisar eemento num vector criar o histograma, usando a função de pesquisar
Histograma Assinaturas: function pos=pesquisa(vector,eemento) function hist=histograma(sequencia)
Histograma
Histograma Começando do primeiro, enquanto não encontramos nem saímos do vector vamos incrementando posição.
Histograma Se não saímos do vector é porque encontrámos, caso contrário devovemos 0. Mas isto parece compicar desnecessariamente. Podemos criar uma versão mais simpes, pensando ao contrário.
Histograma Se começarmos do fim e formos decrementando a posição, fica automaticamente no 0 quando não encontra. A única diferença é que devove a posição do útimo eemento. Podemos avisar isso na documentação.
Histograma Mora da história: nem sempre a primeira impementação é a mehor...
Histograma Testar a função: octave:15> hep pesquisa `pesquisa' is a function from the fie... pesquisa(vector,eemento) devove a posicao do utimo eemento no vector, ou 0 se nao existe octave:16> pesquisa([1,2,3],2) ans = 2 octave:17> pesquisa([1,2,3],4) ans = 0
Histograma Podemos agora passar para a outra função: function hist=histograma(sequencia)
Histograma Podemos agora passar para a outra função: function hist=histograma(sequencia)
Histograma Podemos agora passar para a outra função: function hist=histograma(sequencia) Cria-se s a matriz do histograma, toda a zeros basta depois somar 1 a cada ocorrência A variáve utimalinha indica a útima inha que contém uma entrada a partir daí a matriz está vazia;
Histograma Podemos agora passar para a outra função: function hist=histograma(sequencia) Para cada eemento da sequencia vamos pedir a posição na primeira couna
Histograma Podemos agora passar para a outra função: function hist=histograma(sequencia) Se ainda não existe (pesquisa devoveu 0), então vamos acrescentar uma inha ao histograma e marcar á o eemento na primeira couna. Vamos apontar a inha para essa inha também.
Histograma Podemos agora passar para a outra função: function hist=histograma(sequencia) Assim garantimos que, em quaquer dos casos, inha está a apontar para a inha certa. Basta então somar 1 na segunda couna (porque a matriz começa a 0).
Histograma Podemos agora passar para a outra função: function hist=histograma(sequencia) No fina amputamos o que não interessa da matriz do histograma, guardando só até à útima inha.
Histograma Testar: octave:19> histograma([1,2,1,2,1,2,4,5,4]) ans = 1 3 2 3 4 2 5 1 octave:20> hep histograma... hist = histograma( sequencia ) Devove o histograma da sequencia numa matriz com uma inha por cada eemento diferente da sequencia, e nas counas o eemento e o numero de ocorrencias.
Histograma Resover o probema: octave:21> presencas=histograma(auas(:,1)) presencas = 50014 10 50016 10 50019 11 50023 9 50035 9 50049 10... 50014 1 50016 1 50019 1... 50014 4 50016 4 50019 4 50023 4... 50035 5 50049 5 50051 5...
Fórmua Química Exempo 3: fórmua química
Fórmua Química Probema: Identificar os eementos de uma fórmua química (string): e.g. CH3COOC6H4COOH Decompor a fórmua, coocando numa tabea de caracteres (vector couna) os diferentes eementos nea referidos. C H O... Simpificação: assumimos que os símboos químicos presentes têm apenas uma etra:
Fórmua Química 1º passo: perceber o que se pede identificar cada eemento eemento é uma etra o que não é etra não é eemento (assumimos eementos com um só um carácter) acrescentar à tabea mas só se não existe a tabea será um vector couna de caracteres
Fórmua Química 2º passo: decompor o probema Para cada carácter na fórmua verificar se é eemento se for, verificar se já está na tabea se não está, acrescentar
Fórmua Química 3º passo: agoritmo e assinaturas verificar se está na tabea já está feita: function pos = pesquisa(vector,eemento) tanto faz se o vector é string ou não, horizonta ou vertica, pois a função pesquisa é suficientemente gera para tratar todas essas situações usar essa função para criar a tabea function tabea = eementos(formua)
Fórmua Química A tabea começa vazia...... e vamos percorrer a fórmua para anaisar os seus componentes
Fórmua Química Para cada carácter da fórmua, se for maiúscua e... não estiver na tabea, então acrescenta-se numa nova inha.
Fórmua Química Testar e apicar à fórmua inicia: octave:70> eementos('ch4') ans = C H octave:71> eementos('h3po4') ans = H P O octave:72> eementos('ch3cooc6h4cooh') ans = C H O
Comparar Strings Exempo 4: Comparar strings
Comparar Strings Numa próxima aua vamos ver como er e escrever ficheiros vamos precisar de processar strings para separar o seu conteúdo quando for mais compexo do que o str2num processa
Comparar Strings Vamos comparar 2 strings função strcmp já faz isto mas nós iremos querer considerar que o caracter? conta como igua a quaquer carácter (wid card) octave:30> compara('abc','a?c') ans = 1 octave:31> compara('abc','a?d') ans = 0 octave:32> compara('abc','???') ans = 1 Assinatura da função function igua=compara(s1,s2)
Comparar Strings
Comparar Strings Se as strings têm o mesmo comprimento, vae a pena compará-as. Caso contrário, então é faso que sejam iguais.
Comparar Strings Começa-se no primeiro carácter. Enquanto não utrapassámos o fim do vector; e os caracteres são iguais ou agum é um? Avança-se uma posição
Comparar Strings As strings são iguais se no cico whie se utrapassar o fim do vector. Nota: o operador > devove true ou fase
Comparar Strings Testar: octave:33> compara('xpto','xptt') ans = 0 octave:34> compara('xpto','xpt?') ans = 1 octave:35> compara('xpto','??b?') ans = 0 octave:36> compara('xpto','??t?') ans = 1 octave:37> compara('xp?o','??x?') ans = 1
Decompor URL Exempo 5: decompor um URL
Decompor URL Pretende-se decompor um URL e.g. http://ssdi.di.fct.un.pt/ice/b/index.htm nos seus componentes protocoo: http máquina: ssdi.di.fct.un.pt caminho: ice/b ficheiro: index.htm Função úti: findstr
Decompor URL Função findstr: exempos octave:23> findstr('aaaaxaaaxaaa','x') ans = 5 9 octave:24> findstr('x','aaaaxaaaxaaa') ans = 5 9 octave:25> findstr('axa','aaaaxyaaxaaa') ans = 8
Decompor URL Guardar em barras a posição das barras '/'
Decompor URL O protocoo é a parte do início à primeira barra menos 2 caracteres http://ssdi.di.fct.un.pt/ice/b/index.htm
Decompor URL A máquina está especificada na parte a seguir à segunda barra até antes da terceira. http://ssdi.di.fct.un.pt/ice/b/index.htm
Decompor URL caminho começa a seguir à terceira barra e acaba antes da útima. Nota: poderia incuir a útima barra também.. http://ssdi.di.fct.un.pt/ice/b/index.htm
Decompor URL O ficheiro começa a seguir à útima barra e acaba no fina do URL http://ssdi.di.fct.un.pt/ice/b/index.htm
Comparar Strings Testar: octave:39> [protocoo,maquina,caminho,ficheiro]=... > decompoeur('http://ssdi.di.fct.un.pt/ice/b/index.htm') protocoo = http maquina = ssdi.di.fct.un.pt [caminho = ice/b ficheiro = index.htm
Resumo Resumindo...
Resumo whie cico para repetir instruções enquanto uma condição se verifica para quando não sabemos à partida quantas iterações são necessárias, mas sabemos verificar se é necessário continuar Processamento de strings findstr, isupper (isower, ischar, isapha,...)
Resumo Teste: > F('http://www.abc.edu/geoogy/tectonics.htm', '/') ans = tectonics.htm
Resumo Para estudar esta aua Tentar fazer os exempos e aterações ao código Consutar o manua Octave whie, 10.3 funções para caracteres, 5.7
Resumo O que já sabemos em programação operações e variáveis (números e strings) decompor probemas funções, scripts, código fonte manipuar vectores e matrizes números e texto controar a execução sequência, condições (if eseif ese) cicos for se sabemos quantas vezes iterar cicos whie se sabemos a condição de paragem
Dúvidas?