我需要做一个计算我用户输入的任何分子的摩尔质量的proyect。 例如,如果用户键入CO2,我的程序需要识别C(与具有质量的矩阵相关联),然后识别O(与其质量相关联)并将其乘以2,并将它们相加。
我正在考虑为每个元素使用字符串。
我在编程方面非常新,而且我已经学到了很多基础知识。
你会怎么推荐我这样做的?我很丢失非常感谢
答案 0 :(得分:1)
这里的重大挑战似乎是解析文本,因此您可以将完整元素传递给函数来进行计数。你需要一个字符串来接受输入,但我强烈建议你远离std字符串。
相反,请尝试使用char数组。
需要考虑的一些事项:
阵列需要多大?
我会接受哪种角色? (空格?)
如何知道用户何时完成输入? (某些东西以空值终止......)
我将如何浏览阵列?
元素的定义是什么? (如果是大写字母,请查看ASCII值以进行比较)
找到元素后如何处理?
你问了一个起点,所以我不愿透露任何具体的代码。查看Jongware的评论,了解您的程序需要做什么。一次解决这个问题(回答这篇文章中的问题,输入就可以了)并在完成后检查它的大纲。祝你好运!
答案 1 :(得分:1)
虽然您有一个答案,但我建议您仔细查看问题后发布的第一条评论。无论您如何对其进行切片,您都必须以字符串的形式解析用户输入。虽然解析像"Li3Co4CO2"
这样的东西以获得每个元素的原子量似乎是令人生畏的,但是将它乘以正确的乘数并保持运行总和,可以使用2个指针和嵌套的while循环来完成。
以argv[1]
中的用户输入为例,并将其分配给指针p
:
char *p = argv[1];
现在您只需要一个while
循环来检查字符串中的每个字符:
while (*p) {
在循环中,您需要做的就是识别每个元素大写字母后跟任何小写和终止数字(如果有的话)之前next Cap或以null结尾的字符(字符串的结尾)。因此,分配结束指针说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
到字符串中的下一个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
祝你好运,如果您需要额外的帮助,请告诉我们。