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

时间:2019-01-27 00:30:24

标签: c++ string algorithm char chemistry

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

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

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

我的第一个想法是逐步检查所有元素(存储在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 个答案:

答案 0 :(得分:-1)

这个问题肯定不是初学者的问题,但我会尽力让您了解如何做到这一点。

假设:我不考虑同位素质量相同的原子序数可能不同的同位素情况。

  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. 然后,您将搜索元素的单个质量,然后替换它们。

      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)。您的运算符可以为*+。括号也可以出现。

要查找单个质量,可以维护一个std::map<std::string, int>,其中element namekey,其massvalue

希望这会有所帮助。