Programação para as
Ciências Experimentais
2008/9
Teórica 6
Ludwig Krippahl, 2009
Na aula de hoje...

Apresentação do trabalho prático 1
Ludwig Krippahl, 2009
2
Objectivo

Acertar reacções químicas
?H2 + ?O2  ?H2O
Ludwig Krippahl, 2009
3
Objectivo

Acertar reacções químicas
?H2 + ?O2  ?H2O

Reacções simples (não redox, etc)
Nenhum termo com parêntesis

• Ca(NO3)2
Ludwig Krippahl, 2009
fica CaN2O6.
4
Objectivo

Acertar reacções químicas
?H2 + ?O2  ?H2O
2H2 + O2  2H2O
Ludwig Krippahl, 2009
5
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
6
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
7
Partir o problema

Ler o ficheiro
Estruturar cada reacção
Procurar coeficientes

Gravar resultados


• Testar se acertou
Ludwig Krippahl, 2009
8
Testar coeficientes
?H2 + ?O2  ?H2O
Ludwig Krippahl, 2009
9
Testar coeficientes
?H2 + ?O2  ?H2O

Forma mais correcta

Alguns problemas
• Resolver sistema de equações
• Sistemas sub-determinados
• Identificar casos impossíveis (mal escrita)
Ludwig Krippahl, 2009
10
Testar coeficientes
?H2 + ?O2  ?H2O


Geração e teste
Pesquisa exaustiva
• Muito ineficiente
• Mas fácil de implementar
Ludwig Krippahl, 2009
11
Testar coeficientes

?H2 + ?O2  ?H2O
Vector de coeficientes:
• [1 1 1]
Ludwig Krippahl, 2009
12
Testar coeficientes

?H2 + ?O2  ?H2O
Vector de coeficientes:

Estequiometria para cada elemento
• [1 1 1]
•H1*2+1*0=1*2
•O1*0+1*2=1*1
Ludwig Krippahl, 2009
13
Testar coeficientes

?H2 + ?O2  ?H2O
Vector de coeficientes:

Estequiometria para cada elemento
• [1 1 1]
•H1*2+1*0=1*2
•O1*0+1*2=1*1
Ludwig Krippahl, 2009
14
Testar coeficientes

?H2 + ?O2  ?H2O
Vector de coeficientes:

Codificar em vectores tb

• [1 1 1]
• H: [2 0 -2]
• O: [0 2 -1]
(produtos a negativo)
Testar se sum(co.*el)==0
Ludwig Krippahl, 2009
15
Testar coeficientes

?H2 + ?O2  ?H2O
Vector de coeficientes:

Codificar em vectores tb
• [1 1 1]
• H: [2 0 -2]
• O: [0 2 -1] (produtos a negativo)
• sum ([1 1 1] .* [0 2 -1]) == 1
Ludwig Krippahl, 2009
16
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
17
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
18
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
19
Procurar coeficientes
• [1 1 1]
Ludwig Krippahl, 2009
20
Procurar coeficientes
• [1 1 1]
• [2 1 1] [1 2 1] [1 1 2]
Ludwig Krippahl, 2009
21
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
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: ...
• Nota: há repetições. Pode-se melhorar o
algoritmo evitando-as.
• Fica por vossa conta, para quem quiser 20
Ludwig Krippahl, 2009
23
É 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
24
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
25
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
26
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
27
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
28
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
29
Procurar, 3ª
procura([3 1], 0, lista)
é 0, por isso testa, devolve resultado
Ludwig Krippahl, 2009
30
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
31
Procurar, 3ª
procura([2 2], 0, lista)
é 0, por isso testa, devolve resultado
Ludwig Krippahl, 2009
32
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
33
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
34
Partir o problema

Ler o ficheiro
Estruturar cada reacção
Procurar coeficientes

Gravar resultados


• Testar se acertou
Ludwig Krippahl, 2009
35
Ler o ficheiro




fopen: abrir o ficheiro
fclose: fechar no fim
fgetl, fgets: ler linha
Secção 14.2
Ludwig Krippahl, 2009
36
Estruturar a informação

Dada uma reacção (string)

Tirar os espaços em branco, tabs,
mudança de linha etc.
• 2 Al + 6 HCl = 2 AlCl3 + 3 H2
• Guardar só os caracteres >“ “ (espaço)
Ludwig Krippahl, 2009
37
Estruturar a informação

Reacção sem espaços

Partir pelo =
• 2Al+6HCl=2AlCl3+3H2
• 2Al+6HCl
• 2AlCl3+3H2
Ludwig Krippahl, 2009
reagentes
produtos
38
Estruturar a informação
• 2Al+6HCl
• 2AlCl3+3H2
reagentes
produtos

Partir pelo +

Lembrar quantos reagentes!
• 2Al
• 6HCl
• 2AlCl3
• 3H2
Ludwig Krippahl, 2009
39
Estruturar a informação

Decompor cada termo

Dica: já fizemos isto...
• elemento
• quantidade
Ludwig Krippahl, 2009
40
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
41
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
42
Partir o problema

Ler o ficheiro
Estruturar cada reacção
Procurar coeficientes

Gravar resultados


• Testar se acertou
Ludwig Krippahl, 2009
43
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
44
Datas

Enunciado online:

Entrega da versão intermédia

Entrega da versão final:

Não aceito entregas depois da resolução.
• 26-3 (amanhã)
• Domingo, 19-4 (12:00h)
• 26-4 (12:00h)
Ludwig Krippahl, 2009
45
Aulas de dúvidas

As práticas destas duas semanas

A teórica de 15-4 vai ser só para dúvidas
• 29-3 a 3-4; 21-4 a 24-4
• (O trabalho é para fazer em casa)
• A teórica de 1-4 vai ser aula normal, porque
prevejo que haverá mais dúvidas na última
semana.
Ludwig Krippahl, 2009
46
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
Ludwig Krippahl, 2009
47
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
48
Fotos

Quem não tem, ponha no CLIP
• Facilita a avaliação do trabalho
Ludwig Krippahl, 2009
49
Dúvidas
Ludwig Krippahl, 2009
50
Download

Slides