-1

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

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

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

你们会建议我怎么做?我很迷茫

非常感谢

4

2 回答 2

1

似乎这里最大的挑战是解析文本,因此您可以将完整元素传递给函数来进行计数。您需要一个字符串来获取输入,但我强烈提醒您远离 std 字符串。

相反,请尝试一个 char 数组。

需要考虑的一些事项:

  • 阵列需要多大?

  • 我会接受什么样的角色?(空格?)

  • 我如何知道用户何时完成输入?(一些以空值结尾的东西......)

  • 我将如何通过阵列?

  • 什么定义了元素?(如果是大写字母,请查看 ASCII 值以进行比较)

  • 当我找到一个元素时,我该怎么办?

你要求一个起点,所以我不愿意给出任何具体的代码。查看 Jongware 的评论,了解您的程序需要做什么。一次解决一个问题(回答这篇文章中的问题,你就可以输入了),完成后从你的大纲中检查它。祝你好运!

于 2015-11-10T00:34:53.647 回答
1

虽然您有一个答案,但我建议您仔细查看您的问题后发布的第一条评论。无论您如何对其进行切片,您都必须以字符串的形式解析用户输入。虽然解析诸如"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++;
    }

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

    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

祝你好运,如果你需要额外的帮助将这些部件组装在一起,请告诉我。

于 2015-11-10T04:33:40.877 回答