如何使用字符串或字符载体(分别包含任何化学成分式)并计算其摩尔质量?
How to use a string or a char vector (containing any chemical composition respectively formula) and calculate its molar mass?
>我尝试用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);
}
}
我需要一个简单的算法来处理字母和数字。也可能使用指针,但目前我对这种技术不太熟悉。无论如何,我对这种理解持开放态度,以防有人想向我解释我如何在这里使用它们。
我将非常感谢有关此问题的任何支持,当然还有一些代码片段,因为我正在考虑很多天而没有进展......请记住,我是一个初学者而不是中级。
这个问题肯定不适合初学者,但我会尝试给你一些关于如何做到这一点的想法。
假设:我不是在考虑原子质量可以具有相同原子序数的同位素情况。
-
将其建模到现实世界。
您将如何在现实生活中解决这个问题?
比如说,如果我给你化学式:
Fe(NO3)3
,你会做的是:-
将其转换为如下所示的内容:
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)
然后, 您将搜索单个元素质量,然后替换它们。
Total Mass => 1 * 56 + 3 * (1 * 14 + 3 * 16) => 242
-
-
现在,来编程。
相信我,你也必须在编程中做同样的事情。
-
将您的化学式转换为上面讨论的形式,即将
Fe(NO3)3
转换为Fe*1+(N*1+O*3)*3
。我认为这是这个问题中最难的部分。但它也可以通过分解成步骤来完成。- 检查是否所有元素后面都有数字。如果没有,则在其后添加"1"。例如,在这种情况下,
O
后面有一个数字,它是3
。但Fe
和N
没有。
完成此步骤后,您的公式应更改为
Fe1(N1O3)3
。-
现在,将每个数字,例如上述公式
num
转换为:-
*num+
如果当前数字之后有一些元素。 -
*num
如果您在它之后遇到")"或公式结尾。
在此之后,您的公式应更改为
Fe*1+(N*1+O*3)*3
. -
- 检查是否所有元素后面都有数字。如果没有,则在其后添加"1"。例如,在这种情况下,
-
现在,您的问题是解决上述公式。对此有一个非常简单的算法。请参考:https://www.geeksforgeeks.org/expression-evaluation/。在您的情况下,操作数可以是数字(例如
2
)或元素(例如Fe
)。您的操作员可以*
和+
。括号也可以存在。
-
为了查找单个质量,您可以维护一个包含element name
作为key
及其mass
为value
的std::map<std::string, int>
。
希望这有所帮助。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- C++如何计算用户输入的数字中的偶数位数
- 如何计算数据类型的范围,例如int
- 类似枚举的计算常量
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 计算缩放多边形的比例,得到给定的多边形面积
- 在C++中如何在没有pow的情况下进行基础计算
- 计算平均值,不包括上次得分
- 如何使用字符串或字符载体(分别包含任何化学成分式)并计算其摩尔质量?