阅读下列程序说明和C代码,将应填人(n)处的字句写在对应栏内。 [程序5说明] 下列文法可用来描述化学分子式的书写规则(例如,A12(CO3)3”Cu(OH)2): λ→β\βλ β→δ\δn δ→ξ\ξθ\(λ) 其中

admin2009-02-15  66

问题 阅读下列程序说明和C代码,将应填人(n)处的字句写在对应栏内。
   [程序5说明]
   下列文法可用来描述化学分子式的书写规则(例如,A12(CO3)3”Cu(OH)2):
   λ→β\βλ
   β→δ\δn
   δ→ξ\ξθ\(λ)
   其中:λ是—个分子式;δ或是一个元素,或是一个带括号的(子)分子式,元素或是一个大写字母(记为ξ),或是一个大写字母和一个小写字母(记为ξθ)β或是一个δ,或是在δ之后接上一个整数n,δn表示β有n个δ的元素或(子)分子式。—个完整的分子式由若干个β组成。
   当然一个正确的分子式除符合上述文法规则外,还应满足分子式本身的语义要求。
   下面的程序输入分子式,按上述文法分析分子式,并计算出该分子式的分子量。例如:元素H的原子量是1,元素O的原子量是16。输入分子式H2O,程序计算出它的分子量为18 (1×2+16)。程序中各元素的名及它的原子量从文件atom.dat中读入。
   [程序5]
    #include < stdio. h >
    #include < string. h >
    #define MAXN 300
    #define GMLEN 30
    struct elem { char name[ ]; /* 元素名*/
                   double v;/*原子量*/
                   } nTbl [MAXN];
    char cmStr [GMLEN], * pos;
    int c;FILE * fp;
    double factor( );
    double atom( )  /* 处理文法符号δ*/
    {char w [3];int i; double num;
       while((c = * pos++) ==’||c ==’\t’); /*略过空白字符*/
       if(c == ’\n’) return 0.0;
       if(c>=’A’ && C <=’Z’) {/*将元素名存入W */
       w[i =0]=c;c= * pos ++
       if(c >=’a’&& c <=’z’)w[ ++i] =c;else pos--;
       w[ ++i] =’\0’,
       for(i =0;nTbl . v >0.0;i ++)
          if(strcmp (w,nTbl. name) ==0) return nTbl . v;
       printf (" \n元素表中没有所输入的无素: \t%s\n’,w); retur n - 1.0;
       } elseif (c = =’(’) {
      if((num=(1)) <0.0)return -l.0; /*包括可能为空的情况*/
     if( * pos ++ ! = ’)’) { printf (" 分子式中括号不匹配!/n") ;return - 1.0; }
     return num;
     }
  printf ("分子式中存在非法字符:\t%c\n" ,c);
  return - 1.0;
  }
  double mAtom( )  /* 处理文法符号β*/
   { double num ;int n = ];
   if((num=(2)) <0.0)return-l.0;
   c= *pos++;
   if(c >=’O’&&c <=’9’) {
    n = 0; while(c > = 0&&c < =’9’)
                 {n=(3);
                  c= *poss ++;
                 }
   }
   pos --;
   return num * n;
}
double factor( )  /*处理文法符号λ*/
{ double num =0.0,d;
  if(( hum = mAtom ( )) < 0.0) return - 1.0;
  while( * pos >= ’A’&& * pos <= ’Z’||* pos == ’(’) {
        if((d=(4)) <0.0)return-1.0;
         (5);
  } return num;
void main( )
{ char fname[ ] ="atom. dst"; /*元素名及其原子量文件*/
int i;double num;
if((fp=fopon(fname,"r" )) == NULL) {  /*以读方式打开正文文件*/
prinff("Can net open%s file. \n’ ,fname) ;return /*程序非正常结束 */
i=0;
while(i < MAXN&&fscanf (fp," %s%lf,bTbl. name,&nTbl. v) ==2)
   i++;
fclose(fp) ;nTbl. v =-1.0;
while(1) [/*输入分子式和计算分子量循环,直至输入空行结束*/
   printf(" \n 输入分子式! (空行结束) \n" ) ;gets(cmStr);
   pos = cmStr;
   if(cmStr[0] == ’\0’) break;
   if( (num = later( ) ) > 0.0)
   if( * pos! = ’\0’)printf("分子式不完整! \n" );
    else printf("分子式的分子量为%f\n",num);
  }     

选项

答案(1)factor()(2)atom()(3)n*10+c-’0’(4)mAtom()(5)num+=d

解析 (1)查找“(”后的子分子式的分子量。(2)得到元素的原子量。(3)计算元素后面的数字。(4)计算文法符号的分子量。(5)将分子式的各个部分的分子量进行累加。atom()查找输入字符串一个元素,并输出它的原子量;遇到括号时,使用递归对括号后的元素进行识别和计算,输出后,检查是否括号匹配;遇到其他字符则直接返回-1;0表示失败。mAtom()对元素及其后面的数字进行辨识,并调用atom()计算它们的原子量。Factor()对整个分子式进行辨识并计算其分子量。
转载请注明原文地址:https://kaotiyun.com/show/NgDZ777K
0

随机试题
最新回复(0)