[ Foro de Java ]

Calculo del peso molecular

01-Mar-2015 14:39
Invitado (Anonimo)
1 Respuestas

Hola buenas tardes.
Quería preguntar a la comunidad acerca de este ejercicio utilizando expresiones regulares:
Añada a la clase StringUtils un método public y static llamado molWeigth que devuelva un resultado de tipo double. El método tendrá un parámetro de la clase String.

El parámetro pasado al método representará la fórmula molecular de un compuesto químico, y el método devolverá el peso molecular de dicho compuesto.

Una fórmula molecular es una ristra formada por una secuencia de subristras que representan elementos químicos. Cada subristra que representa un elemento está formada por dos partes, la primera obligatoria y la segunda opcional:

*la primera parte es el símbolo del elemento, formado por una letra mayúscula, o una letra mayúscula seguida de una letra minúscula
*la segunda parte es un número entero (de una o varias cifras) que indica cuántos átomos de ese elemento entran en una molécula del compuesto. Si solo entra un átomo, no se pone el número

Ejemplo

"NaCl"

1 átomo de Na (p.a. 22.9898) + 1 átomo de Cl (p.a. 35.453)=58,4428

"H2O"

2 átomos de H (p.a. 1.0079) + 1 átomo de O (p.a. 15.999)=18,0148

El peso molecular de un compuesto químico se calcula sumando los pesos atómicos de cada elemento, multiplicados por el número de átomos de ese elemento presentes en una molécula del compuesto.

Para calcular los pesos atómicos de los elementos, se dispone de un método llamado Chemistry.atomWeigth que devuelve el peso atómico de (tipo double) un elemento que se le pasa como parámetro en forma de objeto String.

El método debe usar expresiones regulares para aislar los componentes de la fórmula.

Dada una ristra de caracteres s que representa un número entero, se puede obtener el valor de dicho número de la siguiente forma:

int n = Integer.parseInt(s);

La cosa es que no sé si voy por buen camino o lo que estoy haciendo es una burrada,  siempre me devuelve 0.0  y no  el Peso molecular. Cualquier aportación se agradecerá, Gracias.


package es.rjlt.ii.strings;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StringUtils {
    public static double molWeigth (String s1){
        //Parámetros
        double pm = 0.0;
        double pa = 0.0;
        int mult = 0;
        String codigo = "";
        String numero = "";
        //Regex
        Pattern pat = Pattern.compile("(([A-Z][a-z]?)(\\d*))+");
        Matcher m = pat.matcher(s1);    
        while (m.find()){
            codigo = m.group(1);
            pa = Chemistry.atomWeigth(codigo);
            numero = m.group(2);
            if(numero == null){
                mult = 1;
                pm = pa* mult;
                return pm;
            }else{
                pm = pa* mult;
                return pm;
            }
        }
        return pm;
    }
}



01-Mar-2015 23:47
Nacho Cabanes (+83)

La apariencia es buena, salvo por la doble barra que aparece antes de la "d" de tu expresión regular, que me suena que tiene que ser una única barra, pero puede ser un problema de formateo de los fuentes en el foro.

Deberías añadir puntos de interrupción (si tu entorno de desarrollo lo permite) o "System.out.println" (en caso contrario), que te muestren los valores de "codigo", "numero", etc., para ver si el problema realmente está en ese fragmento de programa o no.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)