习题3-2 分子量

3-2分子量(Molar Mass)


给出一种物质的分子式(不带括号),求分子量。本题中的分子式只包含4种原子,分别为C, H, O, N,原子量分别为12.01, 1.008, 16.00, 14.01(单位:g/mol)。例如,C6H5OH的分子量为94.108g/mol。

这个代码没有放到UVa上面AC,只是自己写一下练一连的,如果要AC,应该要根据UVa上的输入输出样例稍微改一下

思路:

本题难度不大,是属于字符串处理一类的问题。有两个关键点。

  1. 输入量中可能是字母+数字也可能是字母+另一个字母,想要处理这样的情况就要在处理当前字符之前,判断下一个字符是字母还是数字,以此来做不同的处理。
  2. 另一个关键点就是,字母后面可能是两位,三位甚至四位,而不仅仅是题目里给出的C6H5OH,比如还可能是C20H50O10,当然这个是随便列举的,但输入很有可能是这种情况,所以也需要注意。
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <ctype.h>

char buffer[100];   //存放输入量
double s[30];       //用来存放对应的原子量


int main()
{
    
  
    s['C' - 'A'] = 12.01;   //对应的位置存放C的原子量   
    s['H' - 'A'] = 1.008;   //对应的位置存放H的原子量  
    s['O' - 'A'] = 16.00;   //对应的位置存放O的原子量  
    s['N' - 'A'] = 14.01;   //对应的位置存放N的原子量  

    while(scanf("%s",buffer) == 1) {
        double mass = 0;           //总的原子量
        int n = strlen(buffer);     //输入的字符串长
        double molar = 0;         //当前处理的原子量
	     
        /*
          对原子量的计算
        */ 
        for ( int i = 0; i < n; i++ ) {
            if(isdigit(buffer[i])) continue;               //碰到数字直接跳,至于为什么,看后面
            if(isalpha(buffer[i])) {                          //如果是字母就进行处理
                if(isalpha(buffer[i+1]) || i == n - 1) {   //该字符下一个字符如果还是字母,那说明它就一个元素,加一下对应的原子量就直接处理下一个字符,还要注意判断是不是最后一个字符,也是同理
                    mass += s[buffer[i] - 'A'];            
                    continue;    
                }

                molar = s[buffer[i] - 'A'];           //如果字母后面跟的是数字的话,就会执行到这里,将对应的原子量放在molar变量里,提高代码的可读性
                int num = 1,sum = 0;        
               
                while(isdigit(buffer[i + num])) num++;    //剩下的就是计算带数字的原子量了,看看就懂了
                for(int j = 1; j < num; j++ ) {
                    sum = sum * 10;
                    sum += (buffer[i+j] - '0');
                }

                mass += (molar * sum);
            }
        }

        printf("%s的分子质量为%.3lfg/mol\n",buffer,mass);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值