Upload
internet
View
104
Download
0
Embed Size (px)
Citation preview
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
Ludwig Krippahl, 2009 3
Objectivo
Acertar reacções químicas
?H2 + ?O2 ?H2O
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.
Ludwig Krippahl, 2009 5
Objectivo
Acertar reacções químicas
?H2 + ?O2 ?H2O
2H2 + O2 2H2O
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
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
Ludwig Krippahl, 2009 8
Partir o problema
Ler o ficheiro Estruturar cada reacção Procurar coeficientes
• Testar se acertou
Gravar resultados
Ludwig Krippahl, 2009 9
Testar coeficientes
?H2 + ?O2 ?H2O
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)
Ludwig Krippahl, 2009 11
Testar coeficientes
?H2 + ?O2 ?H2O
Geração e teste Pesquisa exaustiva
• Muito ineficiente
• Mas fácil de implementar
Ludwig Krippahl, 2009 12
Testar coeficientes
?H2 + ?O2 ?H2O Vector de coeficientes:
• [1 1 1]
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
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
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
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
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
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
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...
Ludwig Krippahl, 2009 20
Procurar coeficientes
• [1 1 1]
Ludwig Krippahl, 2009 21
Procurar coeficientes
• [1 1 1]
• [2 1 1] [1 2 1] [1 1 2]
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: ...
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
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.
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
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.
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.
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)
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)
Ludwig Krippahl, 2009 30
Procurar, 3ª
procura([3 1], 0, lista)
é 0, por isso testa, devolve resultado
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)
Ludwig Krippahl, 2009 32
Procurar, 3ª
procura([2 2], 0, lista)
é 0, por isso testa, devolve resultado
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)
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)
Ludwig Krippahl, 2009 35
Partir o problema
Ler o ficheiro Estruturar cada reacção Procurar coeficientes
• Testar se acertou
Gravar resultados
Ludwig Krippahl, 2009 36
Ler o ficheiro
fopen: abrir o ficheiro fclose: fechar no fim fgetl, fgets: ler linha Secção 14.2
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)
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
Ludwig Krippahl, 2009 39
Estruturar a informação
• 2Al+6HCl reagentes
• 2AlCl3+3H2 produtos
Partir pelo +• 2Al
• 6HCl
• 2AlCl3
• 3H2
Lembrar quantos reagentes!
Ludwig Krippahl, 2009 40
Estruturar a informação
Decompor cada termo• elemento
• quantidade
Dica: já fizemos isto...
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)
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.
Ludwig Krippahl, 2009 43
Partir o problema
Ler o ficheiro Estruturar cada reacção Procurar coeficientes
• Testar se acertou
Gravar resultados
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.
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.
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.
Ludwig Krippahl, 2009 47
Dúvidas durante o trabalho
Não tirem dúvidas com os colegas, só com os docentes.• Aulas
• Atendimento (com marcação)
Fraude• Reprovação imediata à disciplina
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.
Ludwig Krippahl, 2009 49
Fotos
Quem não tem, ponha no CLIP• Facilita a avaliação do trabalho
Ludwig Krippahl, 2009 50
Dúvidas