b) Iden9ficar, caracterizar e generalizar cada sub-problema. [1]
• Problema: Criar a tabela periódica.
• Entrada: Nada (assume-se o nome do ficheiro). • Saída: (dict) tabela periódica
5. Para cada sub-problema, desenhar o algoritmo para o resolver.
Sub-problema: Criar a tabela periódica
1. Inicializar a tabela a vazio
2. Abrir o ficheiro para leitura.
3. Desprezar a primeira linha.
4. Para cada linha do ficheiro
§ Criar um dicionário com informação de cada elemento
§ Acrescentá-lo à tabela
Resolução – Implementação [3]
6. Para cada sub-problema (começando pelos mais simples), implementar
o respe9vo algoritmo e testar o “sub-programa”.
• Sub-problema: Leitura da tabela periódica
def lerTabelaPeriodica():
""" ... """
tabela = {}
fich = open(‘tabela_periodica.txt’, 'r’) fich.readline() # despreza a primeira linha
for line in fich.readlines(): linha = line.split('\t’) chave = linha[1]
info = {'nAtom’: int(linha[0]),\
'nome' : linha[2], 'mAtom': float(linha[3])} elem = {chave : info}
tabela.update(elem) fich.close()
return tabela
number symbol name mass 1 H Hydrogen 1.00794 1\tH\tHydrogen\t1.00794\n
Resolução – Implementação [3]
6. Para cada sub-problema (começando pelos mais simples), implementar
o respetivo algoritmo e testar o “sub-programa”.
• Sub-problema: Leitura da tabela periódica
In : tabela = lerTabelaPeriodica() In : tabela
Out: {'H': {'nAtom’: 1, 'nome': 'Hydrogen', 'mAtom': 1.00794}, 'He': {'nAtom’: 2, 'nome': 'Helium', 'mAtom': 4.002602},
'Li': {'nAtom': 3, 'nome': 'Lithium', 'mAtom': 6.941},
'Be': {'nAtom': 4, 'nome': 'Beryllium', 'mAtom': 9.012182}, 'B': {'nAtom': 5, 'nome': 'Boron', 'mAtom': 10.811},
'C': {'nAtom': 6, 'nome': 'Carbon', 'mAtom': 12.0107}, 'N': {'nAtom': 7, 'nome': 'Nitrogen', 'mAtom': 14.0067}, 'O': {'nAtom': 8, 'nome': 'Oxygen', 'mAtom': 15.9994},
'F': {'nAtom': 9, 'nome': 'Fluorine', 'mAtom': 18.9984032}, ...
In : tabela['N'].nAtom Out: 7
In : tabela['O'].mAtom Out: 15.9994
number symbol name mass
1 H Hydrogen 1.00794 2 He Helium 4.002602 3 Li Lithium 6.941 4 Be Beryllium 9.012182 5 B Boron 10.811 6 C Carbon 12.0107 7 N Nitrogen 14.0067 8 O Oxygen 15.9994 9 F Fluorine 18.9984032 10 Ne Neon 20.1797 …….. tabela_periodica.txt
Resolução – Algoritmo [2]
b) Identificar, caracterizar e generalizar cada sub-problema. [1]
• Problema: Obter Componentes do composto. • Entrada: (string) fórmula química do composto
• Saída: (lista) lista de componentes, em que cada um é um tuplo (Símbolo Químico, Número)
Por exemplo de ‘H20’ obter [(’H’,2), (‘O’,1)]
Algoritmo:
Início = 0 Partes = []
Enquanto não se chegar ao fim da fórmula,
Ler o componente que começa na posição Início atualizando esse Início Desdobrar o componente em símbolo químico e número de átomos Acrescentar o componente à lista das partes
Resolução – Implementação [3]
6. Para cada sub-problema (começando pelos mais simples), implementar
o respe9vo algoritmo e testar o “sub-programa”.
• Sub-problema: Obter as componentes do composto
• Antes de testar esta função tem de se definir as sub-funções
obterParteDesde e desdobrar.
def decomporFormula(composto): """ ... """
partes = [] inicio = 0
while inicio < len(composto):
(parte,inicio) = obterParteDesde(composto,inicio) atom_numb = desdobrar(parte)
partes.append(atom_numb)
Resolução – Implementação [3]
6. Para cada sub-problema (começando pelos mais simples), implementar
o respe9vo algoritmo e testar o “sub-programa”.
• Problema: Obter uma parte do composto a par9r da posição i. • Entrada: (string) fórmula do composto e (int) posição inicial
• Saída: (string) formula química da componente e (int) posição inicial da próxima parte
Algoritmo:
Começar a parte com o caracter (maiúsculo) na posição inicial Avançar a posição
Enquanto não se chegar ao fim da fórmula e não se encontrar uma letra maiúscula,
Avançar a posição
Resolução – Implementação [3]
6. Para cada sub-problema (começando pelos mais simples), implementar
o respetivo algoritmo e testar o “sub-programa”.
• Sub-problema: Obter uma componentes do composto a partir de
uma dada posição
• Testar:
def obterParteDesde(composto, i): """ ... """
parte = composto[i] i = i + 1
while i < len(composto) and not composto[i].isupper():
part = part + composto[i] i = i + 1 return (part, i) In : obterParteDesde('H2O',0) Out: ('H2', 2) In : obterParteDesde('H2O',2) Out: ('O', 3)
Resolução – Implementação [3]
6. Para cada sub-problema (começando pelos mais simples), implementar
o respe9vo algoritmo e testar o “sub-programa”.
• Problema: Desdobrar uma componente do composto. • Entrada: (string) fórmula da componente
• Saída: tuplo (simbolo, número) ;
e.g. de ’H2’ obter (‘H’,2) e de ‘O’, obter (‘O’,1) .
def desdobrar(parte): """ ... """
atom = parte[0] i = 1
n = len(parte)
while i < n and not parte[i].isdigit():
atom = atom + parte[i] i = i + 1
if i == n: num = 1 else:
num = int(parte[i:n])
Resolução – Implementação [3]
6. Para cada sub-problema (começando pelos mais simples), implementar
o respe9vo algoritmo e testar o “sub-programa”.
• Podemos agora testar as várias funções que implementamos para
obter as partes de uma fórmula.
In : desdobrar('H2') Out: ('H', 2) In : desdobrar('O') Out: ('O', 1) In : decomporFormula('H2O') Out: [('H', 2), ('O', 1)] In : decomporFormula('H2SO4') Out: [('H', 2), ('S', 1), ('O', 4)] In : decomporFormula('C2H5OH') Out: [('C', 2), ('H', 5), ('O', 1), ('H', 1)]
Resolução – Implementação [3]
6. Para cada sub-problema (começando pelos mais simples), implementar o
respe9vo algoritmo e testar o “sub-programa”.
• Problema: Obter a massa de um componente • Entrada: (tuplo) componente e (dict) tabela • Saída: (float) massa do componente
Algoritmo:
Consultar a tabela e obter a massa atómica do elemento do componente Obter o número de átomos do elemento no componente
Mul9plicar os valores para obter a massa
{'H’ : {'nAtom': '1', 'nome': 'Hydrogen’, 'mAtom': 1.00794}, 'He': {'nAtom': '2', 'nome': 'Helium’, 'mAtom': 4.002602}, 'Li': {'nAtom': '3', 'nome': 'Lithium’, 'mAtom': 6.941},
Resolução – Implementação [3]
6. Para cada sub-problema (começando pelos mais simples), implementar
o respe9vo algoritmo e testar o “sub-programa”.
• Problema: Obter a massa de um componente • Entrada: (tuplo) componente e (list) tabela • Saída: (float) massa do componente
def obterMassaComponente(componente, tabela): """ ... """
mAtomic = tabela[componente[0]]['mAtom'] nAtoms = componente[1]
massa = nAtoms * mAtomic
return massa
{'H’ : {'nAtom': '1', 'nome': 'Hydrogen’, 'mAtom': 1.00794}, 'He': {'nAtom': '2', 'nome': 'Helium’, 'mAtom': 4.002602}, 'Li': {'nAtom': '3', 'nome': 'Lithium’, 'mAtom': 6.941},
Resolução – Implementação [3]
6. Para cada sub-problema (começando pelos mais simples), implementar
o respe9vo algoritmo e testar o “sub-programa”.
• Problema: Obter a massa de um componente • Entrada: (tuplo) componente e (list) tabela • Saída: (float) massa do componente
In : tabela = lerTabelaPeriodica() In : obterMassaComponente(('H',2), tabela) Out: 2.01588 In : obterMassaComponente(('Li',3), tabela) Out: 20.823 In : obterMassaComponente(('S',1), tabela) Out: 32.065
{'H’ : {'nAtom': '1', 'nome': 'Hydrogen’, 'mAtom': 1.00794}, 'He': {'nAtom': '2', 'nome': 'Helium’, 'mAtom': 4.002602}, 'Li': {'nAtom': '3', 'nome': 'Lithium’, 'mAtom': 6.941},
Resolução – Implementação [3]
Finalmente podemos integrar os vários componentes na função principal
6. Para cada sub-problema (começando pelos mais simples), implementar o
respe9vo algoritmo e testar o “sub-programa”.
• Problema: Obter a massa do composto
• Entrada: (str) fórmula química do composto • Saída: (float) massa do composto
Algoritmo:
Ler a tabela periódica
Desdobrar a fórmula em componentes Inicializar a massa do composto a 0 Para cada componente da fórmula
Obter a massa do componente
Resolução – Implementação [3]
Finalmente podemos integrar os vários componentes na função principal
6. Para cada sub-problema (começando pelos mais simples), implementar o
respe9vo algoritmo e testar o “sub-programa”.
• Problema: Obter a massa de o composto
• Entrada: (str) fórmula química do composto • Saída: (float) massa do composto
def calcularMassa(composto): """ ... """
tabela = lerTabelaPeriodica()
partes = decomporFormula(composto) massa = 0
for parte in partes:
massa = massa + calcularMassa(parte, tabela)
Resolução – Implementação [3]
Podemos agora testar o pograma implementado, com vários compostos
In : água = 'H2O' In : calcularMassa(agua) Out: 18.01528 In : ácidoSulfúrico = 'H2SO4' In : calcularMassa(ácidoSulfúrico) Out: 98.07848 In : etanol = 'C2H5OH' In : calcularMassa(etanol) Out: 46.068439999999995 In : glicose = 'C6H12O6' In : calcularMassa(glicose) Out: 180.15588