紫书p57 习题3-2
给出一种物质的分子式(不带括号),求分子量。本题中的分子式只包含C、H、O、N,原子量如下表。例如C2H5OH的分子量是46.068g/mol.
C | 12.01g/mol |
---|---|
H | 1.008g/mol |
O | 16.00g/mol |
N | 14.01g/mol |
思路:
本题的关键就是判断字符是数字字符还是字母字符,比如C2H5OH,先sum=0.0,从前往后遍历,第一个字符是字母C,接下来看第二位是数字2,则sum+=12.012;再看第三位是字母H,第四位是数字5,则sum+=1.0085;看看第五位,是字母O,第六位是字母H,所以这儿就sum+=16.00,最后看第六位,后面没有字符了,就sum+=1.008。sum的数值就是C2H5OH的相对分子质量。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <ctype.h>
using namespace std;
int main()
{
char s[100];
gets(s);
int t,len=strlen(s);
double sum=0.00;
for(int i=0;i<len;i++)
{
switch(s[i])//判断s[i]是哪个字母
{
case 'C':/*如是字母C*/
{
if(isdigit(s[i+1]))//如果s[i+1]是数字字符
{
t=s[++i]-'0';//先i自加1,再将数值赋值给t
while(isdigit(s[i+1]))//因为C后面的数字可以大于等于10,所以需要这些操作
{
t=t*10+(s[++i]-'0');
}
sum+=12.01*t;
}
else sum+=12.01;//如果字母C后面又是字母,只需sum+=12.01
break;
}
case 'H':
{
if(isdigit(s[i+1]))
{
t=s[++i]-'0';
while(isdigit(s[i+1]))
{
t=t*10+(s[++i]-'0');
}
sum+=1.008*t;
}
else sum+=1.008;
break;
}
case 'O':
{
if(isdigit(s[i+1]))
{
t=s[++i]-'0';
while(isdigit(s[i+1]))
{
t=t*10+(s[++i]-'0');
}
sum+=16.00*t;
}
else sum+=16.00;
break;
}
case 'N':
{
if(isdigit(s[i+1]))
{
t=s[++i]-'0';
while(isdigit(s[i+1]))
{
t=t*10+(s[++i]-'0');
}
sum+=14.01*t;
}
else sum+=14.01;
}
}
}
printf("%s:%.3fg/mol\n",s,sum);
return 0;
}
参考资料:(https://blog.csdn.net/myCsdn_Xm/article/details/81079027)