原题:给出一种物质的分子式(不带括号),求分子量。 本题中的分子式只包含4种原子,分别为C, H, O, N,原子量分别为12.01, 1.008, 16.00, 14.01(单位:g/mol)。 例如,C6H5OH的分子量为94.108g/mol。
代码和注释如下,对于输入除了数字和CHON之外的字符可以进行报错处理,这里没有考虑。
c++,vc6正常运行,希望大家多多指教。
#include <iostream>
#include <cstring>
#include <cctype>
using namespace std;
int main()
{
char a;
int count[4];
for (int k = 0; k<4; k++ )count[k]=0;//每种元素的个数数组,创建并清零
int currentcount = 0,num=0;//currentcount指的是当前是何种元素,num指的是当前这种元素后面跟了什么数字,若没跟数字就是1
//可以实现在线执行,不必读入整个数组,思路是逐个读入字符,
//1.若是读入字母(设定字母只有一位CHON),则当前元素改为该字母对应的currentcount
//2.若是读入数字,数字可以有多位,而且会分别读入,所以引入了onend变量
//3.为了实现能够在线输入,所以代码要准备好随时结束输入,那么就要对每一个输入更新我们的元素数组,
//可以对每一个字符都修改num,如果之前加的num是不完全的num,可以减去之,修改后在最后进行累加
for(int onend=0; cin>>a; )//这里定义了onend变量,是为了确定当前读入的数字字符是否属于连续,即同一个数字
{
if(isalpha(a))
{
if(a=='C')currentcount=0;
if(a=='H')currentcount=1;
if(a=='O')currentcount=2;
if(a=='N')currentcount=3;
num =1; //读入字母时num设为1
onend=0; //数字连续读入中断,设为0
}
else if(isdigit(a))
{
count[currentcount]-=num; //因为读入了数字,所以上一步的num加的是错误的,应该减去,并对num进行修改
if(onend==1)num=num*10+(a-48);
else num=(a-48);
onend=1; //读入数字进入连续。设为1
}
else break; //读到的是错误的字符
count[currentcount]+=num; //用新的num加到个数上
}
double mass = count[0]*12.01+count[1]*1.008+count[2]*16.00+count[3]*14.01;//计算质量
cout<<mass<<endl;
return 0;
}