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

2：带一层括号的分子式求解

# 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;
}

• 点赞 2
• 评论
• 分享
x

海报分享

扫一扫，分享海报

• 收藏 1
• 手机看

分享到微信朋友圈

x

扫一扫，手机阅读

• 打赏

打赏

H.千面

你的鼓励将是我创作的最大动力

C币 余额
2C币 4C币 6C币 10C币 20C币 50C币
• 一键三连

点赞Mark关注该博主, 随时了解TA的最新博文
11-19

02-28 1229
07-24 1308
11-15 1201
05-20 555
09-12 768
04-08 191
01-31 91