如何使用字符串或字符载体(分别包含任何化学成分式)并计算其摩尔质量?

How to use a string or a char vector (containing any chemical composition respectively formula) and calculate its molar mass?

本文关键字:计算 分式 化学 字符 字符串 何使用 何化学 包含任      更新时间:2023-10-16

>我尝试用C++编写一个简单的控制台应用程序,该应用程序可以读取任何化学式,然后计算其摩尔质量,例如:

  • Na2CO3,或类似的东西:
  • La0.6Sr0.4CoO3,或带括号:
  • 铁(NO3)3

问题是我不知道如何处理输入流。我认为在这种情况下,读取输入并将其存储到 char 向量中可能比使用公共字符串更好。

我的第一个想法是逐步检查所有元素(存储在字符向量中):当大写字母后没有小写字母时,我发现了例如碳"C"而不是"Co"(钴)或"Cu"(铜)这样的元素。基本上,我已经尝试了isupper(...),islower(...)或isalpha(...)的方法。

// first idea, but it seems to be definitely the wrong way
// read input characters from char vector 
// check if element contains only one or two letters
// ... and convert them to a string, store them into a new vector
// ... finally, compute the molar mass elsewhere
// but how to deal with the numbers... ? 
for (unsigned int i = 0; i < char_vec.size()-1; i++)
{
if (islower(char_vec[i]))
{
char arr[] = { char_vec[i - 1], char_vec[i] };
string temp_arr(arr, sizeof(arr));
element.push_back(temp_arr);
}
else if (isupper(char_vec[i]) && !islower(char_vec[i+1]))
{
char arrSec[] = { char_vec[i] };
string temp_arrSec(arrSec, sizeof(arrSec));
element.push_back(temp_arrSec);
}
else if (!isalpha(char_vec[i]) || char_vec[i] == '.')
{
char arrNum[] = { char_vec[i] };
string temp_arrNum(arrNum, sizeof(arrNum));
stoechiometr_num.push_back(temp_arrNum);
}
}

我需要一个简单的算法来处理字母和数字。也可能使用指针,但目前我对这种技术不太熟悉。无论如何,我对这种理解持开放态度,以防有人想向我解释我如何在这里使用它们。

我将非常感谢有关此问题的任何支持,当然还有一些代码片段,因为我正在考虑很多天而没有进展......请记住,我是一个初学者而不是中级。

这个问题肯定不适合初学者,但我会尝试给你一些关于如何做到这一点的想法。

假设:我不是在考虑原子质量可以具有相同原子序数的同位素情况。

  1. 将其建模到现实世界。

    您将如何在现实生活中解决这个问题?

    比如说,如果我给你化学式:Fe(NO3)3,你会做的是:

    1. 将其转换为如下所示的内容:

      Total Mass => [1 of Fe] + [3 of NO3] => [1 of Fe] + [ 3 of [1 of N + 3 of O ] ]
      => 1 * Fe + 3 * (1 * N + 3 * O)
      
    2. 然后,
    3. 您将搜索单个元素质量,然后替换它们。

      Total Mass => 1 * 56 + 3 * (1 * 14 + 3 * 16)
      => 242
      
  2. 现在,来编程。

    相信我,你也必须在编程中做同样的事情。

    1. 将您的化学式转换为上面讨论的形式,即将Fe(NO3)3转换为Fe*1+(N*1+O*3)*3。我认为这是这个问题中最难的部分。但它也可以通过分解成步骤来完成。

      1. 检查是否所有元素后面都有数字。如果没有,则在其后添加"1"。例如,在这种情况下,O后面有一个数字,它是3。但FeN没有。

      完成此步骤后,您的公式应更改为Fe1(N1O3)3

      1. 现在,将每个数字,例如上述公式num转换为:

        1. *num+如果当前数字之后有一些元素。

        2. *num如果您在它之后遇到")"或公式结尾。

        在此之后,您的公式应更改为Fe*1+(N*1+O*3)*3.

    2. 现在,您的问题是解决上述公式。对此有一个非常简单的算法。请参考:https://www.geeksforgeeks.org/expression-evaluation/。在您的情况下,操作数可以是数字(例如2)或元素(例如Fe)。您的操作员可以*+。括号也可以存在。

为了查找单个质量,您可以维护一个包含element name作为key及其massvaluestd::map<std::string, int>

希望这有所帮助。