C语言的分子质量计算器程序
Molecule mass calculator program in C
我需要做一个项目来计算用户输入的任何分子的摩尔质量。
例如,如果用户键入 CO2,我的程序需要识别 C(与矩阵及其质量相关联),然后识别 O(与其质量相关联)并将其乘以二,然后将它们相加。
我正在考虑为每个元素使用字符串。
我是编程新手,我只学到了很多基础知识。
你们建议我怎么做?我迷路了
非常感谢
这里最大的挑战似乎是解析文本,因此您可以将完整的元素传递给一个函数来进行计数。您需要一个字符串来获取输入,但我强烈建议您远离 std 字符串。
改为尝试使用字符数组。
需要考虑的一些事项:
数组需要多大?
我会接受什么样的角色? (空格?)
我如何知道用户何时完成输入? (一些以 null 结尾的东西...)
我将如何在数组中移动?
什么定义了一个元素? (如果是大写字母,看ASCII值比较)
找到元素后我该怎么做?
你问的是起点,所以我不愿意给出任何具体的代码。查看 Jongware 的评论,了解您的程序需要做什么。一次处理一个部分(回答此 post 中的问题,输入就没问题了),完成后将其从大纲中勾选出来。祝你好运!
虽然您有一个答案,但我建议您认真查看您的问题后发布的第一条评论。不管你如何分割它,你都必须以字符串的形式解析用户输入。虽然解析 "Li3Co4CO2"
之类的东西以获得每个元素的原子量似乎令人生畏,但将其乘以正确的乘数并保持 运行 总和,它可以使用 2 个指针和一个嵌套的 while 来完成循环。
以您在 argv[1]
中的用户输入为例,并将其分配给指针 p
:
char *p = argv[1];
您现在只需要一个 while
循环来检查字符串中的每个字符:
while (*p) {
在循环中,您需要做的就是识别每个元素一个大写字母后跟任何小写字母和一个终止数字(如果有)在下一个 Cap 或空终止字符(字符串结尾)之前。因此,分配一个 end-pointer 说 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++;
}
您现在拥有了 copy/search 交易品种所需的所有信息,然后将权重添加到 运行 总和。要完成隔离符号,您可以简单地使用 symlen
和 strncpy
将符号复制到临时 array/string:
char srchsym[8] = {0}; /* search sym */
strncpy (srchsym, p, symlen);
srchsym[symlen] = 0; /* null-terminate */
(自从您初始化 srchsym[8] = {0};
以来,技术上不需要手动空终止,但这是一个好习惯)
现在剩下的就是在周期性 table(结构数组)中搜索 srchsym
和 return 指向对应于 element 的数组元素的指针匹配您的搜索符号(原子符号)。一旦您有了指向周期性 table 中数据的指针,将 运行 总和保持在 wt
中就很简单:
wt += (float)m * ptp->atwt;
(其中 ptp
- 指向周期性 table 的指针,结构的元素 atwt
是原子量。)完成第一个元素的计算后,只需推进你的指针 p
指向字符串中的下一个 Cap,并重复:
p = ep;
}
完成后,您可以打印结果:
printf ("\n %s (atomic weight) : %.3f\n\n", argv[1], wt);
如果您愿意,您还可以让循环打印出它添加到总和中的每个元素,因为它是通过您使用 srchsym
搜索得到的 return。假设的 "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
祝你好运,如果你需要额外的帮助将各个部分组合在一起,请告诉我。
我需要做一个项目来计算用户输入的任何分子的摩尔质量。 例如,如果用户键入 CO2,我的程序需要识别 C(与矩阵及其质量相关联),然后识别 O(与其质量相关联)并将其乘以二,然后将它们相加。
我正在考虑为每个元素使用字符串。
我是编程新手,我只学到了很多基础知识。
你们建议我怎么做?我迷路了
非常感谢
这里最大的挑战似乎是解析文本,因此您可以将完整的元素传递给一个函数来进行计数。您需要一个字符串来获取输入,但我强烈建议您远离 std 字符串。
改为尝试使用字符数组。
需要考虑的一些事项:
数组需要多大?
我会接受什么样的角色? (空格?)
我如何知道用户何时完成输入? (一些以 null 结尾的东西...)
我将如何在数组中移动?
什么定义了一个元素? (如果是大写字母,看ASCII值比较)
找到元素后我该怎么做?
你问的是起点,所以我不愿意给出任何具体的代码。查看 Jongware 的评论,了解您的程序需要做什么。一次处理一个部分(回答此 post 中的问题,输入就没问题了),完成后将其从大纲中勾选出来。祝你好运!
虽然您有一个答案,但我建议您认真查看您的问题后发布的第一条评论。不管你如何分割它,你都必须以字符串的形式解析用户输入。虽然解析 "Li3Co4CO2"
之类的东西以获得每个元素的原子量似乎令人生畏,但将其乘以正确的乘数并保持 运行 总和,它可以使用 2 个指针和一个嵌套的 while 来完成循环。
以您在 argv[1]
中的用户输入为例,并将其分配给指针 p
:
char *p = argv[1];
您现在只需要一个 while
循环来检查字符串中的每个字符:
while (*p) {
在循环中,您需要做的就是识别每个元素一个大写字母后跟任何小写字母和一个终止数字(如果有)在下一个 Cap 或空终止字符(字符串结尾)之前。因此,分配一个 end-pointer 说 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++;
}
您现在拥有了 copy/search 交易品种所需的所有信息,然后将权重添加到 运行 总和。要完成隔离符号,您可以简单地使用 symlen
和 strncpy
将符号复制到临时 array/string:
char srchsym[8] = {0}; /* search sym */
strncpy (srchsym, p, symlen);
srchsym[symlen] = 0; /* null-terminate */
(自从您初始化 srchsym[8] = {0};
以来,技术上不需要手动空终止,但这是一个好习惯)
现在剩下的就是在周期性 table(结构数组)中搜索 srchsym
和 return 指向对应于 element 的数组元素的指针匹配您的搜索符号(原子符号)。一旦您有了指向周期性 table 中数据的指针,将 运行 总和保持在 wt
中就很简单:
wt += (float)m * ptp->atwt;
(其中 ptp
- 指向周期性 table 的指针,结构的元素 atwt
是原子量。)完成第一个元素的计算后,只需推进你的指针 p
指向字符串中的下一个 Cap,并重复:
p = ep;
}
完成后,您可以打印结果:
printf ("\n %s (atomic weight) : %.3f\n\n", argv[1], wt);
如果您愿意,您还可以让循环打印出它添加到总和中的每个元素,因为它是通过您使用 srchsym
搜索得到的 return。假设的 "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
祝你好运,如果你需要额外的帮助将各个部分组合在一起,请告诉我。