我需要做一个计算项目,计算用户输入的任何分子的摩尔质量。 例如,如果用户键入CO2,我的程序需要识别C(与质量相关的矩阵),然后确定O(与其质量相关)并将其乘以2,然后将它们相加。C中的分子质量计算器程序
我正在考虑为每个元素使用字符串。
我在编程方面很新颖,而且我已经非常了解基础知识。
你们会如何推荐我这么做? Im相当失去
非常感谢您
我需要做一个计算项目,计算用户输入的任何分子的摩尔质量。 例如,如果用户键入CO2,我的程序需要识别C(与质量相关的矩阵),然后确定O(与其质量相关)并将其乘以2,然后将它们相加。C中的分子质量计算器程序
我正在考虑为每个元素使用字符串。
我在编程方面很新颖,而且我已经非常了解基础知识。
你们会如何推荐我这么做? Im相当失去
非常感谢您
这似乎是很大的挑战这里解析文本,这样你就可以通过全要素的功能做你的计数。你需要一个字符串来接受输入,但我强烈建议你远离std字符串。
而是尝试一个字符数组。
有些事情要考虑:
多大确实阵列需要是什么?
我会接受什么样的角色? (空格?)
如何知道用户何时完成输入? (东西以null结尾......)
我将如何移动数组?
什么定义了一个元素? (如果是大写字母,请查看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
随着strncpy
的符号复制到一个临时数组/字符串:
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
的字符串中的下盖,并重复:
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
祝你好运,让我知道你是否需要额外的帮助件装配在一起。
1.合适原子名称及其质量的表格 - 一个'struct'。 2.扫描大写字母,然后选择多个小写字母。 3.扫描数字。 4.相乘并添加。 5.冲洗并重复,直到绳子结束。 6.利润。 – usr2564301