2015-11-09 30 views
-1

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

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

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

你们会如何推荐我这么做? Im相当失去

非常感谢您

+2

1.合适原子名称及其质量的表格 - 一个'struct'。 2.扫描大写字母,然后选择多个小写字母。 3.扫描数字。 4.相乘并添加。 5.冲洗并重复,直到绳子结束。 6.利润。 – usr2564301

回答

1

这似乎是很大的挑战这里解析文本,这样你就可以通过全要素的功能做你的计数。你需要一个字符串来接受输入,但我强烈建议你远离std字符串。

而是尝试一个字符数组。

有些事情要考虑:

  • 多大确实阵列需要是什么?

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

  • 如何知道用户何时完成输入? (东西以null结尾......)

  • 我将如何移动数组?

  • 什么定义了一个元素? (如果是大写字母,请查看ASCII值以便比较它们)

  • 当我找到它时,如何处理元素?

你问了一个出发的地方,所以我不愿意给出任何特定的代码。看看Jongware的评论,为您的程序需要做的一个很好的概述。一次处理它一块(回答这篇文章中的问题,你会很好的输入),当你完成后检查你的轮廓。祝你好运!

1

虽然您有一个答案,但我会建议您仔细看看您的问题后发布的第一条评论。不管你如何分片,你都必须以字符串的形式解析用户输入。虽然解析类似"Li3Co4CO2"的东西来得到每个元素的原子权重似乎令人望而生畏,但将其乘以正确的乘数并保持运行总和,可以用2个指针和一个嵌套的while循环完成。

就拿在argv[1]用户输入并指定为指针p

char *p = argv[1]; 

你现在需要的是一个while循环来检查字符串中的每个字符:

while (*p) { 

在循环,您需要做的就是识别每个元素大写字母后跟任意小写终止数字(如果有)在下一个Cap或空终止字符(字符串的结尾)之前。因此,分配一个结束指针ep并处理与嵌套while循环的字符串。 (我们将添加乘数来保存数字,以及稍后使用的符号长度)我们跳过pchar *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 

祝你好运,让我知道你是否需要额外的帮助件装配在一起。