我需要做一个项目来计算用户输入的任何分子的摩尔质量。例如,如果用户输入 CO2,我的程序需要识别 C(与矩阵及其质量相关联),然后识别 O(与其质量相关联)并将其乘以 2,然后将它们相加。
我正在考虑为每个元素使用字符串。
我在编程方面很新,我已经学到了很多基础知识。
你们会建议我怎么做?我很迷茫
非常感谢
似乎这里最大的挑战是解析文本,因此您可以将完整元素传递给函数来进行计数。您需要一个字符串来获取输入,但我强烈提醒您远离 std 字符串。
相反,请尝试一个 char 数组。
需要考虑的一些事项:
阵列需要多大?
我会接受什么样的角色?(空格?)
我如何知道用户何时完成输入?(一些以空值结尾的东西......)
我将如何通过阵列?
什么定义了元素?(如果是大写字母,请查看 ASCII 值以进行比较)
当我找到一个元素时,我该怎么办?
你要求一个起点,所以我不愿意给出任何具体的代码。查看 Jongware 的评论,了解您的程序需要做什么。一次解决一个问题(回答这篇文章中的问题,你就可以输入了),完成后从你的大纲中检查它。祝你好运!
虽然您有一个答案,但我建议您仔细查看您的问题后发布的第一条评论。无论您如何对其进行切片,您都必须以字符串的形式解析用户输入。虽然解析诸如"Li3Co4CO2"
获取每个元素的原子量,将其乘以正确的乘数并保持运行总和似乎令人生畏,但可以使用 2 个指针和嵌套的 while 循环来完成。
以您的用户输入为例argv[1]
并将其分配给指针p
:
char *p = argv[1];
您现在只需要一个while
循环来检查字符串中的每个字符:
while (*p) {
在循环中,您需要做的就是在下一个 Cap 或空终止字符(字符串结尾)之前识别每个元素一个大写字母,后跟任何小写字母和一个终止数字(如果有)。因此,分配一个结束指针并使用嵌套循环ep
处理字符串。while
(我们将添加一个乘数来保存数字,以及一个符号长度以供稍后使用)我们跳过p
, ( char *ep = p + 1;
) 中的第一个字符,因此我们还将初始化符号长度1
(乘数始终从 1 开始):
char *ep = p + 1; /* end pointer */
char m = 1; /* multiplier */
size_t symlen = 1; /* symbol len */
...
/* for each char in p until next CAP */
while (*ep && (*ep < 'A' || 'Z' < *ep)) {
/* if digit */
if ('0' <= *ep && *ep <= '9')
m = *ep - '0'; /* set multiplier */
else
symlen++; /* increment len */
ep++;
}
您现在拥有复制/搜索符号所需的所有信息,然后将权重添加到运行总和中。要完成隔离符号,您可以简单地使用symlen
withstrncpy
将符号复制到临时数组/字符串中:
char srchsym[8] = {0}; /* search sym */
strncpy (srchsym, p, symlen);
srchsym[symlen] = 0; /* null-terminate */
(从技术上讲,自从您初始化以来就不需要手动终止空值srchsym[8] = {0};
,但这是一个好习惯)
现在剩下的就是srchsym
在周期表(结构数组)中搜索并返回一个指针,该指针指向与您的搜索符号(原子符号)匹配的元素对应的数组元素。一旦有了指向周期表中数据的指针,保存运行总和就很wt
简单:
wt += (float)m * ptp->atwt;
(其中ptp
- 指向元素周期表的指针和结构的元素atwt
是原子量。)完成第一个元素的计算后,只需将指针p
移到字符串中的下一个 Cap,然后重复:
p = ep;
}
完成后,您可以打印结果:
printf ("\n %s (atomic weight) : %.3f\n\n", argv[1], wt);
如果您愿意,您还可以让循环打印出它添加到总和中的每个元素,因为它是由您的搜索返回的srchsym
。假设的一个例子"Li3Co4CO2"
是:
$ ./bin/ptable Li3Co4CO2
element : Lithium
symbol : Li
atomic num : 3
atomic wt. : 6.941
element : Cobalt
symbol : Co
atomic num : 27
atomic wt. : 58.933
element : Carbon
symbol : C
atomic num : 6
atomic wt. : 12.011
element : Oxygen
symbol : O
atomic num : 8
atomic wt. : 15.999
Li3Co4CO2 (atomic weight) : 300.565
祝你好运,如果你需要额外的帮助将这些部件组装在一起,请告诉我。