2014-11-27 9 views
-3

Я пытаюсь написать программу, которая рассчитает молекулярную массу данной молекулы на основе ее химической формулы.Вычислите молекулярную массу по химической формуле

Этот код может разделить молекулярную формулу как "CH3OH" на массив {C H 3 O H}, но отсюда, что было бы хорошим способом использовать разделенный текст для расчета молекулярного веса?

string input = MoleculeTextbox.text; 
string pattern = @"([0-9]?\d*|[A-Z][a-z]{0,2}?\d*)"; 
string[] sunstrings = Regex.Split(input,pattern); 
+7

Его молекулярная масса зависит от того, отображается текстовое поле на CRT, LCD или плазма, в каком разрешении отображается это и то, что DPI ... Если вы хотите набрать имя молекулы и отобразить вес, вам придется иметь некоторую таблицу поиска, содержащую атомы и их веса, и объединить их с молекулой, введенной пользователем. – CodeCaster

+3

Мы не можем помочь с проблемой, которую вы не объяснили, мы понятия не имеем, в чем проблема. Отправьте свой код и объясните, в чем проблема. –

+0

Я попытался regex.split разделить текст. Это может разбить его так, как должно, но проблема состоит в том, чтобы вычислить его, что не работает с regex.split. – Trexten

ответ

1

Прежде всего, вам нужно разобрать строку и превратить «H3» в «HHH» и т.д. Это может выглядеть примерно так:

var x = "CH3OH".replace(/([a-z])([2-9])/gi, function(_,c,n) { return new Array(1+parseInt(n)).join(c); }); 

Первая группа может быть согласованный символ, а вторая группа - количество повторений.

Теперь у вас есть строка, которая выглядит как "CHHHOH". Вы можете разбить эту строку на массив с одним символом по каждому индексу, .split('') и сопоставить каждое значение с его молекулярной массой. Для этого вам нужно определить какую-то таблицу поиска. Я использую reduce заботиться картографирования и добавление в один присест:

var mass = { C: 12.011, H: 1.008, O: 15.999 }; 
var weight = x.split('').reduce(function(sum,element) { return sum + mass[element]; }, 0); 
+0

У кого-нибудь есть окончательный рабочий код? –

 Смежные вопросы

  • Нет связанных вопросов^_^