如何使用字符串或字符向量(分别包含任何化学成分公式)并计算其摩尔质量? 我尝试编写一个简单的控制台应用程序,在C++中可以读取任何化学公式,然后计算其摩尔质量,例如: Na2CO3或类似物: La0.6Sr0.4CoO3或带括号: FeNO33

如何使用字符串或字符向量(分别包含任何化学成分公式)并计算其摩尔质量? 我尝试编写一个简单的控制台应用程序,在C++中可以读取任何化学公式,然后计算其摩尔质量,例如: Na2CO3或类似物: La0.6Sr0.4CoO3或带括号: FeNO33,c++,string,algorithm,char,chemistry,C++,String,Algorithm,Char,Chemistry,问题是我不知道如何详细处理输入流。我认为在这种情况下,读取输入并将其存储到char向量可能比使用公共字符串更好 我的第一个想法是,一步一步地检查存储在char向量中的所有元素:当大写字母后没有小写字母时,我就找到了一个元素,比如碳“C”,而不是钴或铜。基本上,我试过的方法是上…,下。。。或者伊莎法 我需要一个简单的算法,可以处理字母和数字。也有可能使用指针,但目前我不太熟悉这种技术。无论如何,如果有人想向我解释如何在这里使用它们,我愿意接受这种理解 我将非常感谢任何支持,当然还有一些关于这个问题

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

我的第一个想法是,一步一步地检查存储在char向量中的所有元素:当大写字母后没有小写字母时,我就找到了一个元素,比如碳“C”,而不是钴或铜。基本上,我试过的方法是上…,下。。。或者伊莎法

我需要一个简单的算法,可以处理字母和数字。也有可能使用指针,但目前我不太熟悉这种技术。无论如何,如果有人想向我解释如何在这里使用它们,我愿意接受这种理解


我将非常感谢任何支持,当然还有一些关于这个问题的代码片段,因为我已经思考了很多天,没有任何进展……请记住,我是一个初学者,而不是中级

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

假设:我不考虑同位素的情况,在这种情况下,原子质量可以和相同的原子序数不同

模拟现实世界

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

比方说,如果我给你化学式:FeNO33,你要做的是:

将其转换为如下内容:

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
现在,来看看编程

相信我,在编程中你也必须这样做

将您的化学式转换为上述形式,即将FeNO33转换为Fe*1+N*1+O*3*3。我认为这是这个问题中最难的部分。但也可以通过分解成步骤来实现

检查是否所有元素后面都有编号。如果不是,则在其后面添加1。例如,在本例中,O后面有一个数字,即3。但是Fe和N没有。 完成此步骤后,您的公式应更改为Fe1N1033

现在,将上述公式中的每个数字转换为:

*num+如果当前编号后有某个元素

*num,如果您遇到或在其后面结束公式

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

现在,你的问题是解决上面的公式。这有一个非常简单的算法。请参阅:。在本例中,操作数可以是数字(如2)或元素(如Fe)。运算符可以是*和+。括号也可以存在

为了查找单个质量,可以维护一个std::map,其中包含元素名称作为键,其质量作为值


希望这有点帮助。

可能重复欢迎使用堆栈溢出。这不是一个初学者的项目。如果你需要这个程序,我建议你请一个程序员帮你写,也许是以物易物的方式来教化学。如果你真的想自己做,我建议你从简单的练习开始,比如解析一个没有括号的公式到它的组件,比如CuO2=>[Cu,O,2]。这需要时间。我不知道为什么这个问题会得到这么多的反对票。它清楚地陈述并包含了自己的工作尝试。对一个问题投否决票,因为你认为这个任务对初学者来说太难了,这是没有用的。特别是在没有进一步解释的情况下。@datell你关于为什么被否决的选民被否决的猜测更多地说明了你而不是被否决的选民。@Florian你可以使用C++14或17吗?这与其说是一个答案,不如说是一系列的评论。答案应在要求的范围内具体回答问题。这并不能提供问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论。-@安德鲁,我认为OP要求的是一个简单的算法。我认为它能起作用。你可以看到标题并决定它是否能完成这项工作。@PasserBy因为OP是一个初学者,我认为阅读它比阅读代码更容易。无论你怎么做,这个想法都应该传达出来。@Andrew如果你仍然认为这个答案可以改进,请在这个答案下面发表你的评论。我对此持开放态度。
Total Mass => 1 * 56 + 3 * (1 * 14 + 3 * 16)
           => 242