C语言 求分子式的分子质量

要求:1:不带括号的分子式求解
2:带一层括号的分子式求解

不带括号的分子式
用high和low记住每次扫描的最高位和最低位,不能求解多为整数时的系数

# include<stdio.h>
# include<string.h>             

typedef struct 
{
	char w[10][2];
	int num[10];
} ele;


int  flag(char a[2],ele b)                         //原子质量b.num[m],确定m的值 
{
	int m=0,i,j;
	for(i=0;i<10;i++)
	{   if(a[1]!='\0')                             //所输入元素有两个字母
		{
		  if(a[0]==b.w[i][0])
		     if(a[1]==b.w[i][1])
		        {
				   m=i;break;
				}
	    }
		else                                       //所输入元素只有一个字母 
		{
			if(a[0]==b.w[i][0])   
			   {
			      m=i;
			      break;
			   }
		}
		
	}
	return(m);   
}
	
	
int find(char s[10],int low)                             //找到每次扫描的最高下标 
{
	int high;
	high=low+1;                                             //赋初值 
	  
	while(s[high]!='\0')
	{
		if(s[high+1]=='\0')                           
		{
			
			  if(s[high]>='A'&&s[high]<='Z')
			     return(high);
			  else
			  {
			  	high++;
			   return(high);
			  }	  
		}
		else
		  if(s[high]>='A'&&s[high]<='Z')
		    return(high);
		  else
		    high++;
	}
	if(s[high]=='\0')                                 //已经扫描到最后一位 
	{
		return(high);
	}	 
}

int sum(char s[38],ele b)                         //求总的分子量 
{
	int quality=0;
	int low=0,j=0,m,high,t;
	char a[2];
	high=find(s,0);
    do                       //s[38]
	{  
		t=1;
		a[0]='\0';
		a[1]='\0';
		 do
		    {
			     while(low<high)
		         {
		         	if(a[0]=='\0')
		         	{
		         	  a[0]=s[low];
					  low++;
					  if(s[low]>='a'&&s[low]<='z')
					     a[1]=s[low];
					  else
					    break;	
					 }
					 else
					 {
					 	low=high;
					 	break; 
					 }	         
		         } 
		    if(a[0]!='\0'&&a[1]!='\0')  
				        break;
		    }while(low<high);
		   if(s[low]!='\0')
		   {
		   	 if(a[1]>='0'&&a[1]<='9')
	          {
	          	t=a[1]-'0';
	          	a[1]='\0';
			  }
		   	if(s[low]>='0'&&s[low]<='9')
				{
				  if(s[high]!='\0')
					t=s[low]-'0';
		          else
	                {
					    a[1]='\0';
					    t=s[low]-'\0';
					}
			    }
	        else 
	          if(s[low-1]>='0'&&s[low-1]<='9')
	             t=s[low-1]-'0';                                          
				                                       //else  t=1;
		   }
		   else
		   {
		   	  low--;
		   	  if(s[low]>='0'&&s[low]<='9')
		   	    {
					t=s[low]-'0';
					a[1]='\0';
					low++;
				}
		   }
		    m=flag(a,b);
		    quality=quality+b.num[m]*t;
		    if(s[high]!='\0')
     		    high=find(s,low);
     		else break;	
	   }while(s[low]!='\0');
	return(quality);
}

int main()
{
	ele b;
	int T,i=0,quality=0;
	char s[38];
	b.w[0][0]='N'; b.num[0]=14;
	b.w[1][0]='C';b.num[1]=12;
	b.w[2][0]='O';b.num[2]=16;
	b.w[3][0]='C';b.w[3][0]='l';b.num[3]=35;
	b.w[4][0]='S';b.num[4]=32;
	b.w[5][0]='H';b.num[5]=2;
	b.w[6][0]='A';b.w[6][1]='l';b.num[6]=27;
	b.w[7][0]='C';b.w[7][1]='a';b.num[7]=40;
	b.w[8][0]='Z';b.w[8][1]='n';b.num[8]=65;
	b.w[9][0]='N';b.w[9][1]='a';b.num[9]=23;

	scanf("%d",&T);
	if(T<=1||T>8)   return 0; 
	
	while(i!=T)
	{
		scanf("%s",s);
		printf("%d\n",sum(s,b));
		i++;
	}
	
	return 0;
}

带一层括号的分子式求解,系数可为多位整数,算法思想是将原子逐个扫描。

# include<stdio.h>
# include<string.h>
 
typedef struct 
{
	char w[10][2];
	int num[10];
}ele;

int flag(char a)                                           //判断是否为大写字母 
{
	int flag=0;
	if(a>='A'&&a<='Z')
	  flag=1;
	return(flag);
}

int search(char a[2],ele b)                           //原子质量b.num[m],确定m的值 
{
	int m=0,i,j;
	if(a[1]!='\0')                              //所输入元素有两个字母
	  {
	  	for(i=5;i<10;i++)
	  	{
		  if(a[0]==b.w[i][0])
		     if(a[1]==b.w[i][1])
		        {
				   m=i;break;
				} 
	    }
	  }
	else                                       //所输入元素只有一个字母 
	  {
		 for(i=0;i<5;i++)
		 {
		 	if(a[0]==b.w[i][0])   
			   {
			      m=i;
			      break;
			   }	
		 }	
	  }	
	return(m);   
}

int cala(char s[38],ele b)
{
	char a[2];                                       
	int i,m,sum=0,sum1=0,x=0;                                              //sum1为括号内的分子质量 
	while(s[i]!='\0')
	{
	    a[0]='\0';a[1]='\0';                                       //初始化
		if(flag(s[i]))                                            //s[i]大写字母                                     
		{
		    if(flag(s[i+1]))                                     //连着两个大写字母 
		    {
		    	a[0]=s[i];
			    i++; 	
			}
		    else                                               //s[i+1]为数字,小写字母,括号,'\0' 
		     {
		       	  while(!flag(s[i+1]))                       //扫描到大写字母以前 
		          {
			        if(s[i]>='A'&&s[i]<='Z')
			          a[0]=s[i];
			        i++;
			        /*if(s[i]>='a'&&s[i]<='z')
			          a[1]=s[i];*/
			        if(s[i]=='(')    break;
			        if(s[i]=='\0')
			          break;
			       if(s[i]>='a'&&s[i]<='z')
			       {
			       	  a[1]=s[i];
			       	  i++;
				   }  
			       if(a[1]!='\0')   
				     break;
				   if(s[i]>='0'&&s[i]<='9')
				     break; 
		          }     
		    } 
		m=search(a,b); 
		if(s[i]>='0'&&s[i]<='9') 
		  {
		  	while(s[i]>='0'&&s[i]<='9')
		  	{
		  		x=x*10+s[i]-'0';
		  		i++;
			}
			sum=sum+b.num[m]*x;
			x=0;
		  }                          
		else                                                           //下一位是括号或者大写字母 
		  sum=sum+b.num[m];
		}
	          
	    if(!flag(s[i]))                                                     //s[i]为小写字母或者'(' 
		{     
		   if((s[i]=='('))
		    {                                                               //计算括号内的和sum1                               
			  i++;   
		  	  while(s[i]!=')')
		  	   {
				a[0]='\0';a[1]='\0';
				if(flag(s[i]))                                             //大写字母 
				{
					if(flag(s[i+1]))                                    //两个大写字母 
					{
					   a[0]=s[i];
			           i++; 
					}
					else
					{
					  while(!flag(s[i+1]))
		  		       {
		  			      if(s[i]>='A'&&s[i]<='Z')
			                a[0]=s[i];
						  i++;    
						  if(s[i]==')')
						    break;
					
			              if(s[i]>='a'&&s[i]<='z')
			              {
			              	a[1]=s[i];
			              	i++;
						  }
			              if(a[1]!='\0')   break; 
			              if(s[i]>='0'&&s[i]<='9')
			                break;
				       }               		
					}
				} 	                               
		  	   	m=search(a,b);
		       if(s[i]>='0'&&s[i]<='9') 
		         {
		         	while(s[i]>='0'&&s[i]<='9')
		         	{
		         		x=x*10+s[i]-'0';
		         		i++;
					}
			       sum1=sum1+b.num[m]*x;
			       x=0;
			       if(s[i]==')')   break;  
		         }                          
		        else                         //下一位是大写字母 
				   sum1=sum1+b.num[m];                                      	  	
			}
			i++;
		  }
		  if(s[i-1]==')')
		  {
		  	
		  	if(s[i]>='0'&&s[i]<='9')                              //括号外有系数 
		  	  {
				while(s[i]>='0'&&s[i]<='9')
			     {
			  	   x=x*10+s[i]-'0';
			  	   i++;
			     } 
		  	  	sum1=sum1*x;
			    x=0;
			   }	
		  }  
		}                                   
		sum=sum+sum1;
		sum1=0;                                                 //清零 	                                            
	}  
	return(sum);	
}

int main()
{
	ele b;
	int T,i=0,quality=0;
	char s[38];
	b.w[0][0]='N'; b.num[0]=14;
	b.w[1][0]='C';b.num[1]=12;
	b.w[2][0]='O';b.num[2]=16;
	b.w[3][0]='S';b.num[3]=32;
	b.w[4][0]='H';b.num[4]=2;
	b.w[5][0]='C';b.w[5][1]='l';b.num[5]=35;
	b.w[6][0]='A';b.w[6][1]='l';b.num[6]=27;
	b.w[7][0]='C';b.w[7][1]='a';b.num[7]=40;
	b.w[8][0]='Z';b.w[8][1]='n';b.num[8]=65;
	b.w[9][0]='N';b.w[9][1]='a';b.num[9]=23;
    //printf("输入分子数:"); 
	scanf("%d",&T);
    if(T<2||T>8)  return 0;
	//printf("输入分子式:\n");
	while(i!=T)
	{
		scanf("%s",s);
		printf("%d\n",cala(s,b));
		i++;
	}
	
	return 0;
}
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页