用來描敘化學分子式的書寫規則(例如:AL2(CO3)3 ,Cu(OH)2)
a-->mn/(c)
mn 為一個大寫字母和一個小寫字母
c-->b/bc
c為一個分子式
b-->a/an
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 300
#define GMLEN 10
struct elem{
char name[2];
double v;
}nTbl[MAXN];
char *pos;
char cmstr[GMLEN];
FILE *fp;
int c;
double FACTOR();
double ATOM() //處理文法 a
{
int i=0;
char W[3];
double num;
int j;
while((c=*pos++)==" "||c=="/t");
if(c=="/n")
return 0.0;
if(c>="A"&&c<="Z")
W[i]=c;
c=*pos++;
if(c>="a"&&c<="z")
W[++i]=c;
W[i]="/0";
for(j=0;nTbl[j].v>0.0;j++)
if(strcmp(W,nTbl[j].name)==0)
return nTbl[j].v;
printf("元素表中沒有所輸入的元素!/n");
}
else if(c=="(")
if((num=FACTOR())<0.0)
return -1.0;
if((c=*pos++)!=")")
printf("括號不必配!/n");
return num;
printf("分子式中存在非法字元!/n");
double MATOM() //處理文法 b
int n=1;
if((num=ATOM())<0.0)
if(c>="0"&&c<="9")
n=0;
while(c>="0"&&c<="9")
n=n*10+c-"0";
pos--;
return num*n;
double FACTOR() //處理文法c
double num,d;
if((num=MATOM())<0.0)
while(*pos>="A"&&*pos<="Z"||*pos=="(")
if((d=MATOM())<0.0)
num+=d;
int main(int argc, char *argv[])
char fname[]="atom.dat";
if((fp=fopen(fname,"r"))==NULL)
printf("開啟檔案%s失敗!/n",fname);
return 0;
while(i<MAXN&&fscanf(fp,"%s%f",nTbl[i].name,&nTbl[i].v)==2)
i++;
fclose(fp);nTbl[i].v=-1.0;
while(1)
printf("輸入分子式!(空一下)/n");
gets(cmstr);
pos=cmstr;
if(cmstr[0]=="/0")
break;
if((num=FACTOR())>0.0)
if(*pos!="/0")
printf("分子式不完整!/n");
else
printf("分子式的分子量為%f:/n",num);
用來描敘化學分子式的書寫規則(例如:AL2(CO3)3 ,Cu(OH)2)
a-->mn/(c)
mn 為一個大寫字母和一個小寫字母
c-->b/bc
c為一個分子式
b-->a/an
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 300
#define GMLEN 10
struct elem{
char name[2];
double v;
}nTbl[MAXN];
char *pos;
char cmstr[GMLEN];
FILE *fp;
int c;
double FACTOR();
double ATOM() //處理文法 a
{
int i=0;
char W[3];
double num;
int j;
while((c=*pos++)==" "||c=="/t");
if(c=="/n")
return 0.0;
if(c>="A"&&c<="Z")
{
W[i]=c;
c=*pos++;
if(c>="a"&&c<="z")
W[++i]=c;
W[i]="/0";
for(j=0;nTbl[j].v>0.0;j++)
if(strcmp(W,nTbl[j].name)==0)
return nTbl[j].v;
printf("元素表中沒有所輸入的元素!/n");
return 0.0;
}
else if(c=="(")
{
if((num=FACTOR())<0.0)
return -1.0;
if((c=*pos++)!=")")
printf("括號不必配!/n");
return num;
}
printf("分子式中存在非法字元!/n");
return -1.0;
}
double MATOM() //處理文法 b
{
double num;
int n=1;
if((num=ATOM())<0.0)
return -1.0;
c=*pos++;
if(c>="0"&&c<="9")
{
n=0;
while(c>="0"&&c<="9")
{
n=n*10+c-"0";
c=*pos++;
}
pos--;
return num*n;
}
}
double FACTOR() //處理文法c
{
double num,d;
if((num=MATOM())<0.0)
{
return -1.0;
}
while(*pos>="A"&&*pos<="Z"||*pos=="(")
{
if((d=MATOM())<0.0)
return -1.0;
num+=d;
}
return num;
}
int main(int argc, char *argv[])
{
int i=0;
double num;
char fname[]="atom.dat";
if((fp=fopen(fname,"r"))==NULL)
{
printf("開啟檔案%s失敗!/n",fname);
return 0;
}
while(i<MAXN&&fscanf(fp,"%s%f",nTbl[i].name,&nTbl[i].v)==2)
i++;
fclose(fp);nTbl[i].v=-1.0;
while(1)
{
printf("輸入分子式!(空一下)/n");
gets(cmstr);
pos=cmstr;
if(cmstr[0]=="/0")
break;
if((num=FACTOR())>0.0)
{
if(*pos!="/0")
printf("分子式不完整!/n");
else
printf("分子式的分子量為%f:/n",num);
}
}
return 0;
}