• Nenhum resultado encontrado

Resolução – Algoritmo [2]

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

Documentos relacionados