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