Molecular Formula

Time Limit : 2000/1000ms (Java/Other) Memory Limit : 60000/30000K (Java/Other)

Problem Description
Your mission in this problem is to write a computer program that manipulates molecular formulae in virtual chemistry. As in real chemistry, each molecular formula represents a molecule consisting of one or more atoms. However, it may not have chemical reality.
The following are the definitions of atomic symbols and molecular formulae you should consider.

An atom in a molecule is represented by an atomic symbol, which is either a single capital letter or a capital letter followed by a small letter. For instance H and He are atomic symbols.

A molecular formula is a non-empty sequence of atomic symbols. For instance, HHHeHHHe is a molecular formula, and represents a molecule consisting of four H’s and two He’s.

For convenience, a repetition of the same sub-formula X…X, where n is an integer between 2 and 99 inclusive, can be abbreviated to (X)n. Parentheses can be omitted if X is an atomic symbol. For instance, HHHeHHHe is also written as H2HeH2He, (HHHe)2, (H2He)2, or even ((H)2He)2.

The set of all molecular formulae can be viewed as a formal language. Summarizing the above description, the syntax of molecular formulae is defined as follows.

Molecule -> Atom | Atom Number | ( Molecule ) Number | Molecule Molecule
Atom -> CapitalLetter | CapitalLetter SmallLetter
Number -> 2 | 3 | 4 | . . . | 97 | 98 | 99
CapitalLetter -> A | B | C | . . . | X | Y | Z
SmallLetter -> a | b | c | . . . | x | y | z

Each atom in our virtual chemistry has its own atomic weight. Given the weights of atoms, your program should calculate the weight of a molecule represented by a molecular formula. The molecular weight is defined by the sum of the weights of the constituent atoms. For instance, assuming that the atomic weights of the atoms whose symbols are H and He are 1 and 4, respectively, the total weight of a molecule represented by (H2He)2 is 12.

Input
The input consists of two parts. The first part, the Atomic Table, is composed of a number of lines, each line including an atomic symbol, one or more spaces, and its atomic weight which is a positive integer no more than 1000. No two lines include the same atomic symbol.

The first part ends with a line containing only the string END_OF_FIRST_PART.

The second part of the input is a sequence of lines. Each line is a molecular formula, not exceeding 80 characters, and contains no spaces. A molecule contains at most 10^5 atoms. Some atomic symbols in a molecular formula may not appear in the Atomic Table.

The sequence is followed by a line containing a single zero, indicating the end of the input.

Output
The output is a sequence of lines, one for each line of the second part of the input. Each line contains either an integer, the molecular weight for a given molecular formula in the corresponding input line if all its atomic symbols appear in the Atomic Table, or UNKNOWN otherwise. No extra characters are allowed.

Sample Input
H 1
He 4
C 12
O 16
F 19
Ne 20
Cu 64
Cc 333
END_OF_FIRST_PART
H2C
(MgF)2As
Cu(OH)2
H((CO)2F)99
0

Sample Output
14
UNKNOWN
98
7426

处理多个括号比较麻烦,细心点if-else就可以了

C

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#pragma warning(disable:4996)
char atom[200][50];
int weight[200],sum[100],top;
int main(void)
{
	int digit,res,i,j,length,l=0,unknow=1;
	char input[81],temp[81];
	while(scanf("%s",input)&&strcmp(input,"END_OF_FIRST_PART"))//先读入原子名字和质量
	{
		strcpy(atom[l],input);
		scanf("%d",&weight[l]);
		l++;
	}
	while(scanf("%s",&input)&&input[0]!='0')
	{
		memset(sum,0,sizeof(sum));
		top=0;
		length=strlen(input);
		for(unknow=1,res=0,i=0,digit=0;i<=length-1;i++)
		{
			memset(temp,0,sizeof(temp));
			if(isupper(input[i]))  //如果第一个字母是大写的,如H,He
			{
				temp[0]=input[i];
				if(i+1<=length-1&&islower(input[i+1]))//判断第二个字母是不是小写,如He
				{
					temp[1]=input[i+1];
					for(j=0;j<l;j++)
						if(strcmp(temp,atom[j])==0)//找一下有没有这个原子的质量,没有就break
						{
							res=weight[j];
							break;
						}
					if(j==l)
					{
						printf("UNKNOWN\n");
						unknow=0;
						break;
					}
					if(i+2<=length-1&&isdigit(input[i+2]))//如果有原子的质量,继续判断,后面有2个数字,还是1个,还是没有
					{
						if(i+3<=length-1&&isdigit(input[i+3]))
						{
							digit=(input[i+2]-'0')*10+input[i+3]-'0';
							i+=3;
						}
						else
						{
							digit=input[i+2]-'0';
							i+=2;
						}
						sum[top++]=res*digit;
						continue;
					}
					sum[top++]=res;//将原子质量的值暂时存起来
					i++;
					continue;
				}
				for(j=0;j<l;j++)//这里是只有一个大写字母的情况,如H,O
					if(strcmp(temp,atom[j])==0)
					{
						res=weight[j];
						break;
					}
				if(j==l)
				{
					printf("UNKNOWN\n");
					unknow=0;
					break;
				}
				if(i+1<=length-1&&isdigit(input[i+1]))
				{
					if(i+2<=length-1&&isdigit(input[i+2]))
					{
						digit=(input[i+1]-'0')*10+input[i+2]-'0';
						i+=2;
					}
					else
					{
						digit=input[i+1]-'0';
						i++;
					}
					sum[top++]=res*digit;
					continue;
				}
				sum[top++]=res;
			}
			else if(input[i]=='(')//这里和如果是')'里的while循环一起看容易理解,先把这项标记为-1
				sum[top++]=-1;
			else if(input[i]==')')//根据题意,用括号的情况,括号后面一定有数字
			{
				res=0;
				if(i+2<=length-1&&isdigit(input[i+2]))
				{
					digit=(input[i+1]-'0')*10+input[i+2]-'0';
					i+=2;
				}
				else
				{
					digit=input[i+1]-'0';
					i++;
				}
				top--;  //因为我在前面用sum[top]存值的时候都有用top++,所以应该前退一项,从有意义的值开始累加
				while(sum[top]!=-1)
				{
					res+=sum[top];
					top--;//注意是top--
				}
				sum[top]=res*digit;
				top++;
			}
		}
		if(unknow)//前面有标记,如果一个原子的质量找不到,unknow会被赋值为0,如果unknow不为0,证明所有原子的质量都存在,进行累加,输出答案
		{
			for(res=0,i=0;i<top;i++)
				res+=sum[i];
			printf("%d\n",res);
		}
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
要在代码中添加从 PubChem 检索化合物沸点的功能,你可以使用 PubChemPy 提供的 `get_properties` 函数来获取化合物的属性信息,包括沸点。以下是修改后的代码示例: ```python import pubchempy import pandas as pd with open('C:\\Users\\szy\\Desktop\\work\\name2.txt', 'r', encoding='utf-8-sig') as file1: file_lines = file1.readlines() name_list = [] cid_list = [] boiling_point_list = [] for i in file_lines: j = i.strip() name_list.append(str(j)) for name in name_list: try: # 获取化合物信息 compounds = pubchempy.get_compounds(name, 'name') for compound in compounds: cid_list.append(compound.cid) # 获取化合物的属性信息 properties = pubchempy.get_properties('Boiling Point', compound.cid, 'cid') if properties: # 提取沸点值 boiling_point = properties[0].get('Boiling Point', None) boiling_point_list.append(boiling_point) else: boiling_point_list.append(None) except (pubchempy.BadRequestError, TimeoutError, ValueError): pass dataframe = pd.DataFrame({'name': name_list, 'cid': cid_list, 'boiling_point': boiling_point_list}) dataframe.to_csv("C:\\Users\\szy\\Desktop\\work\\database.csv", index=False, sep=',') ``` 这个代码将从指定文件中读取化合物名称,然后使用 PubChemPy 获取每个化合物的 CID,并且通过使用 `get_properties` 函数获取其沸点信息。最后,将化合物名称、CID 和沸点数据保存到一个 CSV 文件中。 请注意,可能会有一些化合物在 PubChem 中没有沸点数据,因此在处理时需要考虑到这种情况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值