C

时间:2015-11-09 23:56:03

标签: c chemistry

我需要做一个计算我用户输入的任何分子的摩尔质量的proyect。 例如,如果用户键入CO2,我的程序需要识别C(与具有质量的矩阵相关联),然后识别O(与其质量相关联)并将其乘以2,并将它们相加。

我正在考虑为每个元素使用字符串。

我在编程方面非常新,而且我已经学到了很多基础知识。

你会怎么推荐我这样做的?我很丢失

非常感谢

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++;
    }

您现在拥有复制/搜索符号所需的所有信息,然后将权重添加到运行总和中。要完成隔离符号,只需使用symlenstrncpy将符号复制到临时数组/字符串:

    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

祝你好运,如果您需要额外的帮助,请告诉我们。