50
Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Embed Size (px)

Citation preview

Page 1: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009

Programação para as Ciências Experimentais

2008/9

Teórica 6

Page 2: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 2

Na aula de hoje...

Apresentação do trabalho prático 1

Page 3: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 3

Objectivo

Acertar reacções químicas

?H2 + ?O2 ?H2O

Page 4: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 4

Objectivo

Acertar reacções químicas

?H2 + ?O2 ?H2O

Reacções simples (não redox, etc) Nenhum termo com parêntesis

• Ca(NO3)2 fica CaN2O6.

Page 5: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 5

Objectivo

Acertar reacções químicas

?H2 + ?O2 ?H2O

2H2 + O2 2H2O

Page 6: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 6

Objectivo

Acertar reacções químicas Ficheiro de entrada com reacções

H2 + N2 = NH3

H2 + O2 = H2O

Al + HCl = AlCl3 + H2

HCl + NaOH = NaCl + H2O

2 Al + 6 HCl = 2 AlCl3 + 3 H2

NO2+ H2O = HNO3 + NO

Page 7: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 7

Objectivo

Acertar reacções químicas Resultado: reacções acertadas

3H2+N2=2NH3

2H2+O2=2H2O

A reacção Al+HCl=AlCl3+H2 não foi acertada.

HCl+NaOH=NaCl+H2O

2Al+6HCl=2AlCl3+3H2

3NO2+H2O=2HNO3+NO

Page 8: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 8

Partir o problema

Ler o ficheiro Estruturar cada reacção Procurar coeficientes

• Testar se acertou

Gravar resultados

Page 9: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 9

Testar coeficientes

?H2 + ?O2 ?H2O

Page 10: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 10

Testar coeficientes

?H2 + ?O2 ?H2O

Forma mais correcta• Resolver sistema de equações

Alguns problemas• Sistemas sub-determinados

• Identificar casos impossíveis (mal escrita)

Page 11: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 11

Testar coeficientes

?H2 + ?O2 ?H2O

Geração e teste Pesquisa exaustiva

• Muito ineficiente

• Mas fácil de implementar

Page 12: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 12

Testar coeficientes

?H2 + ?O2 ?H2O Vector de coeficientes:

• [1 1 1]

Page 13: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 13

Testar coeficientes

?H2 + ?O2 ?H2O Vector de coeficientes:

• [1 1 1]

Estequiometria para cada elemento• H 1 * 2 + 1 * 0 = 1 * 2

• O 1 * 0 + 1 * 2 = 1 * 1

Page 14: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 14

Testar coeficientes

?H2 + ?O2 ?H2O Vector de coeficientes:

• [1 1 1]

Estequiometria para cada elemento• H 1 * 2 + 1 * 0 = 1 * 2

• O 1 * 0 + 1 * 2 = 1 * 1

Page 15: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 15

Testar coeficientes

?H2 + ?O2 ?H2O Vector de coeficientes:

• [1 1 1]

Codificar em vectores tb• H: [2 0 -2]

• O: [0 2 -1] (produtos a negativo)

Testar se sum(co.*el)==0

Page 16: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 16

Testar coeficientes

?H2 + ?O2 ?H2O Vector de coeficientes:

• [1 1 1]

Codificar em vectores tb• H: [2 0 -2]

• O: [0 2 -1] (produtos a negativo)

• sum ([1 1 1] .* [0 2 -1]) == 1

Page 17: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 17

Testar coeficientes

2H2 + O2 2H2O Vector de coeficientes:

• [2 1 2]

• H: sum([2 1 2] .* [2 0 -2])==0

• O: sum([2 1 2] .* [0 2 -1])==0

Page 18: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 18

Procurar coeficientes

Testar os que vêm com a reacção• Pode já estar certa.

2 Al + 6 HCl = 2 AlCl3 + 3 H2

Page 19: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 19

Procurar coeficientes

Testar os que vêm com a reacção Se não está certa, começar com [1 1 1..]

• Depois somar 1, todas as combinações

• Depois somar 2, todas as combinações,

• Depois somar 3...

Page 20: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 20

Procurar coeficientes

• [1 1 1]

Page 21: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 21

Procurar coeficientes

• [1 1 1]

• [2 1 1] [1 2 1] [1 1 2]

Page 22: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 22

Procurar coeficientes

• 0: [1 1 1]

• 1: [2 1 1] [1 2 1] [1 1 2]

• 2: [3 1 1] [2 2 1] [2 1 2]

[2 2 1] [1 3 1] [1 2 2]

[2 1 2] [1 2 2] [1 1 3]

• 3: ...

Page 23: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 23

Procurar coeficientes

• 0: [1 1 1]

• 1: [2 1 1] [1 2 1] [1 1 2]

• 2: [3 1 1] [2 2 1] [2 1 2]

[2 2 1] [1 3 1] [1 2 2]

[2 1 2] [1 2 2] [1 1 3]

• 3: ...

• Nota: há repetições. Pode-se melhorar o algoritmo evitando-as.• Fica por vossa conta, para quem quiser 20

Page 24: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 24

É recursivo

Se o número a somar é 0, testa. Se o número a somar é maior que 0

• Diminui 1 no número a somar

• Para cada coeficiente• Soma 1 a esse

• Chama a mesma função com novo vector e novo número a somar, para fazer todas as combinações com esse vector, mas agora somando menos 1.

Page 25: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 25

Testar

Para testar coeficientes:• Argumentos

• Vector com coeficientes

• Lista ou matriz com estequiometria dos elementos.

• { el=“H”, esteq = [2 0 -2]} { el=“O”, ....

• [2 0 -2 ; 0 2 -1]

• Devolve• Verdadeiro ou falso, conforme encontrou

Page 26: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 26

Procurar

Para procurar coeficientes:• Argumentos

• Vector de partida

• Quanto somar

• Lista ou matriz com estequiometria dos elementos.

• Devolve• Verdadeiro ou falso, conforme encontrou

• Vector que estava a testar.

Page 27: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 27

Procurar

[enc, vec]=procura(vini, soma, lista)

Se soma=0, vec=vini e enc=teste(vini, lista)

Caso contrário,

para cada valor em vini

v = vini com esse valor +1

[enc, vec]=procura(v,soma-1,lista)

se enc, termina tudo.

Page 28: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 28

Procurar, 1ª

procura([1 1], 2, lista)

não é 0, por isso

Cria um v, [2, 1]

chama procura([2 1], 1, lista)

Page 29: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 29

Procurar, 2ª

procura([2 1], 1, lista)

não é 0, por isso

Cria um v, [3, 1]

chama procura([3 1], 0, lista)

Page 30: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 30

Procurar, 3ª

procura([3 1], 0, lista)

é 0, por isso testa, devolve resultado

Page 31: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 31

Procurar, 2ª

procura([2 1], 1, lista)

não é 0, por isso

Cria um v, [3, 1]

chama procura([3 1], 0, lista)

Cria um v, [2 2]

chama procura([2 2], 0, lista)

Page 32: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 32

Procurar, 3ª

procura([2 2], 0, lista)

é 0, por isso testa, devolve resultado

Page 33: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 33

Procurar, 2ª

procura([2 1], 1, lista)

não é 0, por isso

Cria um v, [3, 1]

chama procura([3 1], 0, lista)

Cria um v, [2 2]

chama procura([2 2], 0, lista)

Page 34: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 34

Procurar, 1ª

procura([1 1], 2, lista)

não é 0, por isso

Cria um v, [2, 1]

chama procura([2 1], 1, lista)

Cria um v, [1, 2]

chama procura([1 2], 1, lista)

Page 35: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 35

Partir o problema

Ler o ficheiro Estruturar cada reacção Procurar coeficientes

• Testar se acertou

Gravar resultados

Page 36: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 36

Ler o ficheiro

fopen: abrir o ficheiro fclose: fechar no fim fgetl, fgets: ler linha Secção 14.2

Page 37: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 37

Estruturar a informação

Dada uma reacção (string)• 2 Al + 6 HCl = 2 AlCl3 + 3 H2

Tirar os espaços em branco, tabs, mudança de linha etc.• Guardar só os caracteres >“ “ (espaço)

Page 38: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 38

Estruturar a informação

Reacção sem espaços• 2Al+6HCl=2AlCl3+3H2

Partir pelo =• 2Al+6HCl reagentes

• 2AlCl3+3H2 produtos

Page 39: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 39

Estruturar a informação

• 2Al+6HCl reagentes

• 2AlCl3+3H2 produtos

Partir pelo +• 2Al

• 6HCl

• 2AlCl3

• 3H2

Lembrar quantos reagentes!

Page 40: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 40

Estruturar a informação

Decompor cada termo• elemento

• quantidade

Dica: já fizemos isto...

Page 41: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 41

Estruturar a informação

Criar uma lista com os elementos todos da reacção• elemento (string)

• quantidades (vector, negativo se for produto)

Page 42: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 42

Estruturar a informação

Para adicionar cada elemento é preciso• elemento, procurar na lista.

• quantidade no termo e índice do termo• Podemos ter de somar várias vezes (CH3COOH)

• quantos termos no total• para criar o vector se for um elemento novo.

Page 43: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 43

Partir o problema

Ler o ficheiro Estruturar cada reacção Procurar coeficientes

• Testar se acertou

Gravar resultados

Page 44: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 44

Gravar os resultados

Abrir o ficheiro, etc fprintf, fputs Não esquecer de avisar quando não se

conseguiu acertar• Dica: criar uma função que recebe a reacção e

devolve a reacção acertada se conseguir ou uma string vazia, “”, se não conseguir.

Page 45: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 45

Datas

Enunciado online: • 26-3 (amanhã)

Entrega da versão intermédia• Domingo, 19-4 (12:00h)

Entrega da versão final:• 26-4 (12:00h)

Não aceito entregas depois da resolução.

Page 46: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 46

Aulas de dúvidas

As práticas destas duas semanas• 29-3 a 3-4; 21-4 a 24-4

• (O trabalho é para fazer em casa)

A teórica de 15-4 vai ser só para dúvidas• A teórica de 1-4 vai ser aula normal, porque

prevejo que haverá mais dúvidas na última semana.

Page 47: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 47

Dúvidas durante o trabalho

Não tirem dúvidas com os colegas, só com os docentes.• Aulas

• Email

• Atendimento (com marcação)

Fraude• Reprovação imediata à disciplina

Page 48: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 48

Avaliação Concepção, 5 valores

• Esquema do programa. Como pensaram resolver o problema.

Implementação, 10 valores• O programa em si, de preferência a funcionar.

Testes, 3 valores• Como garantiram que cada funções estava bem

implementada.. Crítica, 2 valores

• Breve comentário a mostrar que compreenderam o programa que fizeram.

Page 49: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 49

Fotos

Quem não tem, ponha no CLIP• Facilita a avaliação do trabalho

Page 50: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 6

Ludwig Krippahl, 2009 50

Dúvidas