Química Programada - Ordenação por Bolha aplicada à Química : Organizando Gases pelo Fator de Compressibilidade em JavaScript e Python

Seções

1. Introdução

Em algumas situações, podemos ter uma estrutura de dados que se apresenta desordenada. A forma sistemática para colocar os dados em ordem são os algoritmos de ordenação. Existem diferentes abordagens para realizar essa organização dos dados. Nessa postagem vamos apresentar e aplicar num caso prático a ordenação por bolha, também conhecida pela expressão inglesa bubblesort.

Na ordenação por bolha, é realizada a iteração na estrutura de dados e os valores adjacentes são comparados. Se as posições não estiverem ordenadas, o maior valor é jogado para posição posterior, e assim é feito com cada par até o final da sequência de dados. O efeito é como se os valores maiores fossem borbulhando para as posições finais.

Na Figura 1 é apresentado o algoritmo em JavaScript. Primeiramente é criado um array arr com uma sequência de números desordenados. É criado, posteriormente, uma função chamada ordporbolha que recebe uma array como argumento. O primeiro passo do algoritmo é criar uma variável chamada troca que servirá para executar a troca de posições entre os valores desordenados do array. Criamos também dois laços for : o primeiro deles serve para percorrer todas as posições do array da posição 0 até a posição final arr.length-1; o segundo deles serve para comparar valores adjacentes e realizar a troca, percorrendo o array da posição 0 até a posição arr.length-1-i. Essa diferença entre os laços for é devido ao fato de que quando i=0, todo o array está desordenado. Quando i=1, a última posição do array já foi ordenada. Dessa forma, o segundo laço for só necessita avançar até a posição arr.length-1-i.

Para realizar a troca das posições é usado o algoritmo fundamental de troca explicado em Lições de programação - Algoritmos fundamentais de Gilson Pereira. Num primeiro momento, a variável auxiliar troca guarda o valor arr[j] da posição j que está fora de ordem. Depois disso, o valor da posição j+1 é substituído pelo valor da posição j . Para finalizar, o valor guardado em troca é usado para substituir o valor da posição j + 1 e estabelecer a ordem entre arr[j] e arr[j+1] . Bubble sort não é eficiente para grandes volumes, mas é excelente para fins didáticos.

Algoritmo ordenação por bolha
Figura 1: Algoritmo da ordenação por bolha.

Na Figura 2 é apresentada a saída do algoritmo com os valores ordenados.

Algoritmo ordenação por bolha
Figura 2: Saída do algoritmo da ordenação por bolha.

2. Apresentação do problema

O problema que queremos resolver nessa postagem é organizar a sequência de substâncias apresentada na Tabela 1. Nessa tabela é apresentada uma sequência, organizada ordem alfabética, com o respectivo valor de coeficiente de compressibilidade crítica (Zc). O coeficiente de compressibilidade crítico é um coeficiente adimensional que descreve o desvio do gás em relação ao comportamento ideal no ponto crítico.

Nosso objetivo é ordenar essa sequência de gases em ordem crescente de dificuldade de liquefazer. Um critério simplificado para fazer essa ordenação é a ordem crescente de fator de compressibilidade crítico : quando mais afastado de 1 for o Zc (menor), maior serão as forças de interação entre as moléculas do gás e mais fácil será para realizar sua liquefação. Trata-se de uma abordagem didática: em um tratamento mais rigoroso, deveriam ser considerados também a temperatura crítica, a pressão crítica e o fator acêntrico. Ainda assim, o Zc fornece uma boa indicação inicial do grau de não idealidade e, portanto, da tendência à liquefação.

Tabela 1. Fator de compressibilidade crítico
Substância Zc (coeficiente de compressibilidade crítico)
Acetileno 0,274
Água 0,233
Amônia 0,242
Argônio 0,290
Benzeno 0,274
Butano 0,274
Dióxido de carbono 0,276
Dióxido de enxofre 0,268
Etano 0,285
Etanol 0,249
Etileno 0,270
Hélio 0,300
Hidrogênio 0,304
Metano 0,290
Metanol 0,220
Monóxido de carbono 0,294
Nitrogênio 0,291
Octano 0,258
Oxigênio 0,290
Propano 0,276
Propileno 0,276
Refrigerante 12 0,278
Refrigerante 22 0,267
Refrigerante 134 a 0,260

3. Adaptação do algoritmo de ordenação por bolha ao problema proposto

Na Figura 3 é apresentado o algoritmo de ordenação por bolha modificado proposto para resolver o problema que foi descrito na seção 2. Os dados listados na Tabela 1 são organizados na forma de um dicionário chamado gases. Para que os dados possam ser percorridos de forma sequencial com um laço for, eles precisam estar organizados na forma de um objeto cujas posições possam ser percorridas com um ponteiro. Isso não é possível num dicionário. Em JavaScript temos o comando Object.entries() que transforma um dicionário em um objeto no formato de uma lista composta por listas no formato [chave, valor]. Esse objeto pode ser percorrido com dois índices n e m na forma lista_dados[n][m].

O resto do algoritmo é semelhante à ordenação por bolha original apresentado na seção 1 : temos a variável auxiliar troca , temos dois laços for para percorrer a lista e o algoritmo de troca para alterar a posição dos elementos. Para finalizar, como queremos apenas o nome do gás ordenado, sem o valor Zc impresso na saída, usamos o comando lista_dados.map(item => item[0]) para percorrer a lista de dados já ordenada, imprimindo apenas o elemento da posição 0 (item[0]). Mais claramente, a função map permite criar um novo vetor contendo apenas os nomes dos gases, a partir da lista de pares [gás, Zc]. Ela aplica uma transformação a cada elemento do array, devolvendo um novo array transformado. Na Figura 4 temos a saída do algoritmo, com a lista de gases ordenados segundo critério simplificado para classificá-los de acordo com dificuldade de liquefazer.

Este exercício mostra como um conceito clássico de ciência da computação pode ser aplicado a um problema da engenharia química, reforçando a interdisciplinaridade entre áreas.

Algoritmo ordenação por bolha com dicionario
Figura 3: Algoritmo da ordenação por bolha modificado.
Algoritmo ordenação por bolha com dicionario
Figura 4: Saída do algoritmo da ordenação por bolha modificado.

4. Como fica esse algoritmo em Python?

Na Figura 5 temos o mesmo algoritmo da seção 3 programado em Python. Como podemos ver, as chaves do dicionário gases devem ser colocadas entre aspas "" para serem lidas como strings, diferentemente de JavaScript. Para transformação do dicionário de dados em uma lista que possa ser percorrida pelo laço for, usamos o comando list(dados.items()) . Em JavaScript é criada uma lista de listas a partir do dicionário; em Python é criada uma lista de tuplas. Para percorrer a lista com ponteiros, em Python usamos o range com a série de comandos for i in range (len(lista_dados)-1). Igualmente ao programa em JavaScript, queremos imprimir apenas o nome do gases. Em Python o comando para imprimir as chaves é [gases for gases, zc in lista_dados] .

Algoritmo ordenação por bolha com dicionario
Figura 5: Algoritmo da ordenação por bolha modificado em Python.

5. Referências

logo2
Imagem gerada a partir de fotos do desenvolvedor do site modificadas com o Copilot e ChatGPT.

Desenvolvimento : Química Programada