Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: amgarciac en 3 Marzo 2016, 16:43 pm



Título: Problema de los átomos - Concurrencia
Publicado por: amgarciac en 3 Marzo 2016, 16:43 pm
Supongamos que tenemos un sistema compuesto por infinitas unidades de átomos de
hidrógeno y oxígeno, que lo único que quieren hacer es combinarse para formar moléculas de agua.

Para ello dispondremos de una clase denominada Aire, que recibirá peticiones de los átomos mediante un método denominado combinar (id), donde id nos dirá si lo que quiere combinarse es un átomo de oxígeno o de hidrógeno.

- Cuando un átomo quiere combinarse hay que comprobar si ya existen otros 2 átomos
complementarios. En ese caso, la molécula se forma.
- Si no están todavía sus otros 2 átomos complementarios, entonces debe bloquearse y
esperar a que lleguen los 2 que faltan o el que falta. Sólo cuando lleguen los que faltan
entonces pueden seguir los tres átomos.
- Los átomos que llegan pero no pueden formar molécula porque ya hay uno (en el caso
del oxígeno

Para resolver dicho problema, he desarrollado así la clase Aire:

Código:

public class Aire {

int atomosHidrogeno = 0;
int atomosOxigeno = 0;
int atomosH_esperando;
int atomosO_esperando;

public Aire(int atH, int atO2) {
this.atomosHidrogeno = atH;
this.atomosOxigeno = atO2;
this.atomosH_esperando = 0;
this.atomosO_esperando = 0;
}

public void combinar(int id) {
if (id == 0) // Hidrogeno
{
synchronized (this) {
while (this.atomosH_esperando == 2 || (this.atomosHidrogeno < 1 && this.atomosOxigeno < 0)) {
try {
wait();
this.atomosH_esperando++;
} catch (InterruptedException ie) {
}
}
notify();
}
this.atomosH_esperando--;
System.out.println("Molécula formada");
} else if (id == 1) // Oxigeno
{
synchronized (this) {
while (this.atomosH_esperando == 2 || (this.atomosHidrogeno < 2)) {
try {
wait();
this.atomosO_esperando++;
} catch (InterruptedException ie) {
}
}
notify();
}
this.atomosO_esperando--;
System.out.println("Molécula formada");
}
}
}

MI PROBLEMA ES QUE SIEMPRE HAY ÁTOMOS SUFICIENTES PARA TODAS LAS MOLÉCULAS, PONGA LO QUE PONGA

(Sinceramente, soy novato en concurrente y...)


Título: Re: Problema de los átomos - Concurrencia
Publicado por: Lekim en 10 Marzo 2016, 21:26 pm
Supongamos que tenemos un sistema compuesto por infinitas unidades de átomos de
hidrógeno y oxígeno,...
...
MI PROBLEMA ES QUE SIEMPRE HAY ÁTOMOS SUFICIENTES PARA TODAS LAS MOLÉCULAS, PONGA LO QUE PONGA

(Sinceramente, soy novato en concurrente y...)

...un sistema compuesto por infinitas unidades de átomos de
hidrógeno y oxígeno..
lógico...
.... SIEMPRE HAY ÁTOMOS SUFICIENTES ...

Tienes que crear variables a modo de BOMBOS, en lugar de bolas (átomos) introduces una cantidad
H= 20
O= 10
OH= 0
H2O=0

Ahora:
...Solo cuando H> 2 y  O>0 --> H2 + O-->H2O
...si se unen H2 y O entonces  H= H-2; O= O-1; H2O= H2O + 1

...ahora:
H=18
O=9
H2O=1


Para el caso de moléculas incompletas...

...Solo cuando H> 0 y O>0  -->O + H -> OH+ (hidróxido)
...si se forma OH entonces
H= H-1
O= O-1
OH= OH+1

...ahora:
H=17
O=8
OH=1


Para el caso de OH + H

...Solo cuando H>0 y OH>0  -->  H + OH+ --> H2O
...si se unen (H + OH ) entonces
OH= OH-1
H= H-1
 H2O=H2O+1

...ahora:
OH=0
 H=16
H2O= 2


No programo en C así que, lo siento, pero espero que la lógica que planteo sirva.



Sl2s


Hace tiempo que estudié química en bachillerato y bueno ya no recuerdo mucho. Esto no es tan simple como esto, ya que también se puede formar H3O, supongo que según condiciones temperatura, presión y esas cosas.  La cosa iba por moles, masa... 2H2 + O2  --> 2 H2O representa dos moles de H2 y uno de O2. Es decir y espero no equivocarme... par cada mol de O2 se necesitan dos moles de H2 para formar 2 moles de H2O.
Supongo que el problema no se plantea desde un punto de vista estequiométrico si no que se trata de reproducir la reacción virtualmente.

Además el oxígeno en condiciones normales forma moléculas O2, es decir, creo que sería incorrecto poner

O  + OH --> H2O
 
Creo que debería ser

2 H2 +  O2 --> 2 H2O

Así que tendrías que partir de moléculas de O2 y H2 y no de átomos libres.

A ver si contesta alguien que sepa más del tema y como aplicarlo al problema que planteas

S2s