我尝试用C ++编写一个简单的控制台应用程序,该应用程序可以读取任何化学式,然后计算其摩尔质量,例如:
问题是我不知道如何处理输入流。我认为在这种情况下,读取输入并将其存储到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);
}
}
我需要一个可以处理字母和数字的简单算法。也有可能使用指针,但是目前我对这种技术还不太熟悉。无论如何,我愿意接受这种理解,以防有人想向我解释如何在这里使用它们。
我将非常感谢您的支持,当然也有一些有关此问题的代码段,因为我一直在思考这几天而没有任何进展……请记住,我不是初学者,而是中级。
答案 0 :(得分:-1)
这个问题肯定不是初学者的问题,但我会尽力让您了解如何做到这一点。
假设:我不考虑同位素质量相同的原子序数可能不同的同位素情况。
将其建模为现实世界。
您将如何解决现实生活中的问题?
说,如果我给您化学式: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
。我认为这是这个问题中最难的部分。但这也可以通过分解为多个步骤来完成。
O
后面有一个数字3
。但是Fe
和N
没有它。此步骤之后,您的公式应更改为Fe1(N1O3)3
。
现在,将上面公式的num
中的每个数字转换为:
*num+
如果当前编号后面有一些元素。
*num
如果遇到')'或之后的公式结尾。
此后,您的公式应更改为Fe*1+(N*1+O*3)*3
。
现在,您的问题是解决上述公式。为此有一个非常简单的算法。请参阅:https://www.geeksforgeeks.org/expression-evaluation/。在您的情况下,您的操作数可以是数字(例如2
)或元素(例如Fe
)。您的运算符可以为*
和+
。括号也可以出现。
要查找单个质量,可以维护一个std::map<std::string, int>
,其中element name
为key
,其mass
为value
。
希望这会有所帮助。