Informática para Ciências e Engenharias...

Preview:

Citation preview

Informática para Ciências e Engenharias

2013/14

Teórica 7

2

Na aula de hoje... Controlo de execução

• ciclos condicionais while … end

• Exemplos• raiz quadrada while

• histograma while e matrizes

• fórmula química while e strings

Processamento de strings• comparação

• decompor URL findstr

3

«Algoritmo» 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

4

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

5

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

6

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 condicional

7

Controlo da execução

Controlo de execução• sequência

• ciclos for … end

• condições if … elseif … else … end• valores e operadores booleanos

• ciclos condicionais while … end

8

Ciclo condicional: while

Executa o bloco de instruções enquanto a condição for verdadeira (não for 0)

while condicao......

end

9

Ciclo condicional: while

Exemplo: dividir x por dois até ter um número menor que 5 (enquanto >=5)

while x>=5x=x/2;

end

10

Exemplo 1: cálculo da raiz quadrada

11

Exemplo 1, raiz quadrada

Calcular raiz quadrada • método babilónico

http://en.wikipedia.org/wiki/Methods_of_computing_square_roots

12

Exemplo 1, raiz quadrada

Calcular raiz quadrada • método babilónico

• quando parar?• infinito não é prático

• |xn-x

n+1| pequeno

• quão pequeno?

13

Exemplo 1, raiz quadrada

Calcular raiz quadrada • método babilónico

• quando parar?• infinito não é prático

• |xn-x

n+1| pequeno

• quão pequeno?

• argumento com precisão

14

Exemplo 1, raiz quadrada

Calcular raiz quadrada, assinatura function x=raiz(S,prec)

15

Exemplo 1: raiz (babilónico)

16

Exemplo 1: raiz (babilónico)

Primeira estimativa (x1)

metade de xPrimeiro x

2

média entre x1 e x/x

1

Precisamos de ambos para acondição do while

17

Exemplo 1: raiz (babilónico)

Enquanto os dois valoresforem demasiado diferentes: guardamos o corrente calculamos o próximo (nas mesmas duas variáveis)4

18

Exemplo 1: raiz (babilónico)

Quando o ciclo terminar, devolvemos o x corrente

.

19

Exemplo 1: raiz (babilónico)octave:22> help raiz`raiz' is a function from the file ...

raiz(S,prec) calcula a raiz quadrada de S a uma precisao determinada por prec

octave:23> raiz(4,0.001)ans = 2octave:24> raiz(9,0.001)ans = 3.0000octave:25> raiz(17,0.001)ans = 4.1231octave:26> ans^2ans = 17.000

20

Exemplo 1: raiz (babilónico)

octave:27> raiz(297,0.001)x = 75.250x = 39.598x = 23.549x = 18.081x = 17.254x = 17.234x = 17.234ans = 17.234octave:28> ans^2ans = 297.00

• Outro teste:• tiramos o ; das linhas x = ...

Raiz

21

Exemplo 2: presenças (histograma)

22

Exemplo 2: contar presenças

Numa matriz temos o registo de presenças dos 30 alunos de um turno prático• o número do aluno e o

número da aula

50014 1 50016 1 50019 1 ... 50014 4 50016 4 50019 4 50023 4 ... 50035 5 50049 5 50051 5 ...

23

Exemplo 2: contar presenças

Queremos obter• uma matriz com as

presenças dos alunos

50027 9 50028 10 50030 10 ... 50071 8 50077 10 50081 12 50084 10 50086 11 50090 11 50099 9 ...

24

Exemplo 2: contar presenças

Perceber o problema• Temos de contar as ocorrências de cada

aluno na primeira coluna da matriz de entrada

• O resultado será um histograma dos alunos, agrupado pelo número

25

Exemplo 2: contar presenças

Generalizar o problema• Resolve-se este problema, e outros

semelhantes, com uma função que calcule o histograma• basta calcular o histograma da primeira coluna da

matriz de entrada

26

Exemplo 2: contar presenças

Conceber o algoritmo• Queremos uma matriz com n linhas e 2

colunas:• elemento e número de ocorrências

• pode começar a zeros

• Para cada elemento do vector de entrada• verificar se já existe na matriz do histograma

• se existe somar uma ocorrência nessa linha

• se não existe acrescentar uma linha com uma ocorrência desse elemento

27

Exemplo 2: contar presenças

Conceber o algoritmo

50014 50016 50014 50016 50019 50023

50014 1 0 0 0 0 0 0 0 0 0 0

28

Exemplo 2: contar presenças

Conceber o algoritmo

50014 50016 50014 50016 50019 50023

50014 1 50016 1 0 0 0 0 0 0 0 0

29

Exemplo 2: contar presenças

Conceber o algoritmo

50014 50016 50014 50016 50019 50023

50014 2 50016 1 0 0 0 0 0 0 0 0

30

Exemplo 2: contar presenças

Conceber o algoritmo

50014 50016 50014 50016 50019 50023

50014 2 50016 2 0 0 0 0 0 0 0 0

31

Exemplo 2: contar presenças

Conceber o algoritmo

50014 50016 50014 50016 50019 50023

50014 2 50016 2 50019 1 0 0 0 0 0 0

32

Exemplo 2: contar presenças

Conceber o algoritmo

50014 50016 50014 50016 50019 50023

50014 2 50016 2 50019 1 50023 1 0 0 0 0

33

Exemplo 2: contar presenças

Conceber o algoritmo

50014 50016 50014 50016 50019 50023

50014 2 50016 2 50019 1 50023 1

34

Exemplo 2: contar presenças

Conceber o algoritmo• Tarefas:

• obter a posição na primeira coluna do histograma, ou zero se não existe

• generalizando: pesquisar elemento num vector

• criar o histograma, usando a função de pesquisar

35

Exemplo 2: contar presenças

Assinaturas:function pos=pesquisa(vector,elemento)

function hist=histograma(sequencia)

36

Exemplo 2: contar presenças

37

Exemplo 2: contar presenças

Começando do primeiro, enquanto não encontramos nem saímos do vector vamos incrementando posição.

38

Exemplo 2: contar presenças

Se não saímos do vector é porque encontrámos, caso contrário devolvemos 0.

Mas isto parece complicar desnecessariamente.

Podemos criar uma versão mais simples, pensando ao contrário.

39

Exemplo 2: contar presenças

Se começarmos do fim e formos decrementando a posição, fica automaticamente no 0 quando não encontra.

A única diferença é que devolve a posição do último elemento. Podemos avisar isso na documentação.

40

Exemplo 2: contar presenças

Moral da história: nem sempre a primeira implementação é a melhor...

41

Exemplo 2: contar presenças

Testar a função:

octave:15> help pesquisa`pesquisa' is a function from the file ...

pesquisa(vector,elemento) devolve a posicao do ultimo elemento no vector, ou 0 se nao existe

octave:16> pesquisa([1,2,3],2)ans = 2octave:17> pesquisa([1,2,3],4)ans = 0

42

Exemplo 2: contar presenças

43

Exemplo 2: contar presenças

Criamos a matriz do histograma, toda a zeros (basta depois somar 1 a cada ocorrência)ultimaLinha indica a última linha que contém uma entrada (a partir daí a matriz está vazia)

44

Exemplo 2: contar presenças

Para cada elemento da sequencia vamos pedir a posição na primeira coluna

45

Exemplo 2: contar presenças

Se ainda não existe (pesquisa devolveu 0), então vamos acrescentar uma linha ao histograma e marcar lá o elemento na primeira coluna.Vamos apontar a linha para essa linha também.

46

Exemplo 2: contar presenças

Assim garantimos que, em qualquer dos casos, linha está a apontar para a linha certa. Basta então somar 1 na segunda coluna (porque a matriz começa a 0).

47

Exemplo 2: contar presenças

No final amputamos o que não interessa da matriz do histograma, guardando só até à última linha.

48

Exemplo 2: contar presenças

Testar:octave:19> histograma([1,2,1,2,1,2,4,5,4])ans = 1 3 2 3 4 2 5 1

octave:20> help histograma ... hist = histograma( sequencia ) Devolve o histograma da sequencia numa matriz com uma linha por cada elemento diferente da sequencia, e nas colunas o elemento e o numero de ocorrencias.

49

Exemplo 2: contar presenças

Resolver o problema

octave:21> presencas=histograma(aulas(:,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 ...

50

Exemplo 3: fórmula química

51

Exemplo 3: fórmula química

Decompor uma fórmula química (string):• e.g. CH3COOC6H4COOH

Numa tabela de caracteres com os elementos diferentes (vector coluna):

C

H

O

Simplificação: assumimos que os símbolos químicos presentes têm apenas uma letra.

52

Exemplo 3: fórmula química

1º passo: perceber o que se pede• identificar cada elemento

• elemento é uma letra

• o que não é letra não é elemento

• (assumimos só um carácter)

• acrescentar à tabela• mas só se não existe

• a tabela será um vector coluna de caracteres

53

Exemplo 3: fórmula química

2º passo: decompor o problema• Para cada carácter na fórmula

• verificar se é elemento

• se for, verificar se já está na tabela

• se não está, acrescentar

54

Exemplo 3: fórmula química

3º passo: algoritmo e assinaturas• verificar se está na tabela

• já está feita:

function pos = pesquisa(vector,elemento)

• tanto faz se o vector é string ou não, horizontal ou vertical. A função pesquisa não distingue isso

• criar a tabelafunction tabela = elementos(formula)

55

Exemplo 3: fórmula química

A tabela começa vazia e vamos percorrer a fórmula.

56

Exemplo 3: fórmula química

Para cada carácter da fórmula, se for maiúscula e não estiver na tabela, acrescenta-se numa nova linha.

57

Exemplo 3: fórmula química

Testar e aplicar ao nosso problemaoctave:70> elementos('CH4')ans =CHoctave:71> elementos('H3PO4')ans =HPOoctave:72> elementos('CH3COOC6H4COOH')ans =CHO

58

processar strings

59

Processar strings

Na próxima aula vamos ver como ler e escrever ficheiros• vamos precisar de processar strings para

separar o seu conteúdo quando for mais complexo do que o str2num processa

60

Exemplo 4: comparar strings

Vamos comparar 2 strings• função strcmp já faz isto

• mas nós queremos considerar que ? conta como igual a qualquer carácter

octave:30> compara('abc','a?c')ans = 1octave:31> compara('abc','a?d')ans = 0octave:32> compara('abc','???')ans = 1

61

Exemplo 4: comparar strings

Assinatura da função:

function igual=compara(s1,s2)

62

Exemplo 4: comparar strings

63

Exemplo 4: comparar strings

Se as strings têm o mesmo comprimento, vale a pena compará-las.Caso contrário, então é falso que sejam iguais.

64

Exemplo 4: comparar strings

Avançamos do primeiro carácter enquanto não ultrapassámos o fim do vector e os elementos são iguais ou algum é um ?

65

Exemplo 4: comparar strings

As strings são iguais se o ciclo while acabou por ultrapassarmos o fim do vector.Nota: o operador > devolve true ou false

66

Exemplo 4: comparar strings

Teste

octave:33> compara('xpto','xptt')ans = 0octave:34> compara('xpto','xpt?')ans = 1octave:35> compara('xpto','??b?')ans = 0octave:36> compara('xpto','??t?')ans = 1octave:37> compara('xp?o','??x?')ans = 1

67

Exemplo 5: decompor URL

68

Exemplo 5: decompor URL

Queremos decompor um URL• e.g. http://ssdi.di.fct.unl.pt/ice/b/index.html

• nestes componentes• protocolo: http

• máquina: ssdi.di.fct.unl.pt

• caminho: ice/b

• ficheiro: index.html

69

Exemplo 5: decompor URL

Queremos decompor um URL• e.g. http://ssdi.di.fct.unl.pt/ice/b/index.html

• nestes componentes• protocolo: http

• máquina: ssdi.di.fct.unl.pt

• caminho: ice/b

• ficheiro: index.html

• Função útil: findstr

70

Exemplo 5: decompor URL

findstr:

octave:23> findstr('aaaaxaaaxaaa','x')ans = 5 9

octave:24> findstr('x','aaaaxaaaxaaa')ans = 5 9

octave:25> findstr('axa','aaaaxyaaxaaa')ans = 8

71

Exemplo 5: decompor URL

72

Exemplo 5: decompor URL

Guardar em barras a posição das barras '/'

73

Exemplo 5: decompor URL

O protocolo é a parte do início à primeira barra menos 2 caracteres

http://ssdi.di.fct.unl.pt/ice/b/index.html

74

Exemplo 5: decompor URL

A máquina está especificada na parte a seguir à segunda barra até antes da terceira.

http://ssdi.di.fct.unl.pt/ice/b/index.html

75

Exemplo 5: decompor URL

O caminho começa a seguir à terceira barra e acaba antes da última.Nota: poderia incluir a última barra também..

http://ssdi.di.fct.unl.pt/ice/b/index.html

76

Exemplo 5: decompor URL

O ficheiro começa a seguir à última barra e acaba no final do URL

http://ssdi.di.fct.unl.pt/ice/b/index.html

77

Exemplo 5: decompor URL

Teste

octave:39> [protocolo,maquina,caminho,ficheiro]= ...> decompoeurl('http://ssdi.di.fct.unl.pt/ice/b/index.html')protocolo = httpmaquina = ssdi.di.fct.unl.ptcaminho = ice/bficheiro = index.html

78

Resumindo...

79

Resumo

while• ciclo 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 (islower, ischar, isalpha, ...)

80

Exemplo: 1º Teste 2012/13

> F('http://www.abc.edu/geology/tectonics.html', '/')

81

Teste

> F('http://www.abc.edu/geology/tectonics.html', '/')ans = tectonics.html

82

Para estudar esta aula

Tentar fazer os exemplos• e alterações ao código

Consultar o manual Octave• while, 10.3

• funções para caracteres, 5.7

83

Cálculo da massa molecular O que já sabemos fazer

• operações e variáveis (números e strings)

• decompor problemas• funções, scripts, código fonte

• manipular vectores e matrizes • números e texto

• controlar a execução• sequência, condições (if … elseif … else)

• ciclos for se sabemos quantas vezes iterar

• ciclos while se sabemos a condição

84

Dúvidas