我试图从字符串中解析C#中的化学式(格式,例如:Al2O3或O3或C或C11H22O12).它工作正常,除非只有一个特定元素的原子(例如氧原子H2O).我该如何解决这个问题呢?此外,还有一种更好的解析化学式公式字符串的方法吗?
ChemicalElement是代表化学元素的类.它具有AtomicNumber(int),Name(字符串),Symbol(字符串)属性.ChemicalFormulaComponent是表示化学元素和原子计数的类(例如,公式的一部分).它具有Element(ChemicalElement),AtomCount(int)属性.
其余部分应该足够清楚(我希望),但如果我能澄清任何事情,请在回答之前告诉我.
这是我目前的代码:
/// <summary>
/// Parses a chemical formula from a string.
/// </summary>
/// <param name="chemicalFormula">The string to parse.</param>
/// <exception cref="FormatException">The chemical formula was in an invalid format.</exception>
public static Collection<ChemicalFormulaComponent> FormulaFromString(string chemicalFormula)
{
Collection<ChemicalFormulaComponent> formula = new Collection<ChemicalFormulaComponent>();
string nameBuffer = string.Empty;
int countBuffer = 0;
for (int i = 0; i < chemicalFormula.Length; i++)
{
char c = chemicalFormula[i];
if (!char.IsLetterOrDigit(c) || !char.IsUpper(chemicalFormula, 0)) …Run Code Online (Sandbox Code Playgroud) 我必须编写一个程序,将用户的化学方程式作为输入,如12 CO2 + 6 H2O - > 2 C6H12O6 + 12 O2,并观察两个站点上的原子数量是否相同.有没有办法轻松计算和解析这个?
例如:
12 CO2 + 6 H2O - > 2 C6H12O6 + 12 O2
12*2 + 6*2 - > 2*6 + 2*12 + 2*6 + 12*2
在这种情况下,应该输出"false".
这是我的代码,但它实际上只是尝试一些东西:
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
List<String> list = new ArrayList<String>();
String input = "";
while (!(input.equals("end"))) {
input = s.nextLine();
list.add(input);
}
list.remove(list.size() - 1);
for (int i = 0; i < list.size(); i++) { …Run Code Online (Sandbox Code Playgroud) 说我有一个像"C5Cl2NO2S"这样的分子式,我想用R计算分子量.我最简单的方法是使用正则表达式来分析公式并将其拆分为元素组件,然后将它们交给执行计算的单独函数.但是,我面临的问题是,当我交出RegEx的反向引用时,这些不会被评估,而是以"\\ 1","\\ 2"的形式移交.
这是我的尝试:
masses <- list(
C = 12,
H = 1.01,
Cl = 34.97,
N = 14.00,
O = 15.99,
P = 30.97,
S = 31.97
)
elementMass <- function( element, count ) {
if( count == "" ) {
count <- "1"
}
return( as.character( masses[[ element ]] * as.numeric( count ) ) )
}
sumFormula2Mass <- function( x ){
y <- 0.0
for( e in x ) {
if( e != "" ) {
y <- …Run Code Online (Sandbox Code Playgroud)