[试题]

阅读下列程序说明和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 [i]. v >0.0;i ++)

if(strcmp (w,nTbl[i]. name) ==0) return nTbl [i]. 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[i]. name,&nTbl[i]. v) ==2)

i++;

fclose(fp) ;nTbl[i]. 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);

}

参考答案与解析:

相关试题

阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。(程序说明) 著名

[试题]阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。(程序说明)著名的四色定理指出任何平面区域图均可用4种颜色着色,使相邻区域着不同的颜色。本程序对给定的区域图找出所有可能的不超过4种颜色的着色方案。程序中用1~4表示4种颜色。要着色的N个区域用0~N-1编号,区域相邻关系用adj[][]矩阵表示,矩阵的i行j列的元素为1,表示区域i与区域j相邻:矩阵的i行j列的元素为0,表示区域i与区域j不相邻。数组color[]用来存储着色结果,color[i]的值为区域i所着颜色。(程序)incl

  • 查看答案
  • 阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。 (说明) “背包

    [试题]阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。(说明)“背包问题”的基本描述是:有一个背包,能盛放的物品总重量为S,设有N件物品,其重量分别为w1,w2,…,wn。希望从N件物品中选择若干件物品,所选物品的重量之和恰能放入该背包,即所选物品的重量之和等于S。如下程序均能求得“背包问题”的一组解,其中程序1是“背包问题”的递归解法,而程序2是“背包问题”的非递归解法。(程序1)include<stdio.h>define N 7define S 15int w[N+1]={0,1,4

  • 查看答案
  • 阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。[说明] 函数Pr

    [试题]阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。[说明]函数Printprime(int UpBound)的功能是输出1到UpBound以内的全体素数。[函数2.1]void PrintPrime(int UpBound)printf("2," );for(i=3; i<UpBound; i+ =2) {int k = sqrt(i);for(j=3; j<= k;(1)) /*检查i是否有3到k以入的奇因数*/if((2)) break;fi((3)) printf("%d

  • 查看答案
  • 阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。 (说明) 设M叉

    [试题]阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。(说明)设M叉树采用列表法表示,即每棵子树对应一个列表,列表的结构为:子树根节点的值部分(设为一个字符)和用“()”,括起来的各子树的列表(如有子树的话),各子列表间用“,”分隔。例如下面的三叉树可用列表a(b(c,d),e,f(g,h,i))表示。本程序输入列表,生成一棵M叉树,并由M叉树输出列表。假定输入无错误。(函数5-8)inelude<stdio.h>include<stdlib.h>define M3typedef stru

  • 查看答案
  • 阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。(说明) 设某城市

    [试题]阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。(说明)设某城市有n个车站,并有m条公交线路连接这些车站,设这些公交车都是单向的,这n个车站被顺序编号为0至n-1。输入该城市的公交线路数、车站个数,以及各公交线路上的各站编号,求得从站0出发乘公交车至站n-1的最少换车次数。程序利用输入信息构建一张有向图G(用邻接矩阵g表示),有向图的顶点是车站,若有某条公交线路经i站能到达j站,就在顶点i到顶点j之间设置一条权为1的有向边<i,j>。如是这样,从站点x至站点y的最少上车次数便对应图G

  • 查看答案
  • 阅读以下说明和C代码,将应填入(n)处的字句写在对应栏内。 [说明] 下面程序用

    [主观题]阅读以下说明和C代码,将应填入(n)处的字句写在对应栏内。[说明]下面程序用来将打乱的单词还原为原来的次序,比如将rty还原为try。单词的原来次序存储于wordlist.txt文件中,原则上可用穷举法(rty对应的穷举为:rty、ryt、try、tyr、ytr、yrt),但考虑到破译速度,采用如下方法。注意到单词列表中不存在组成字符完全相同的单词(如Hack12与Hack21包含完全相同的字符),因此将单词中的字符进行重组再进行比较,例如,try单词重组为rty(按ASCⅡ码顺序),这样不管打

  • 查看答案
  • 阅读以下说明和java代码,将应填入(n)处的字句写在对应栏内。[说明] 本程序

    [试题]阅读以下说明和java代码,将应填入(n)处的字句写在对应栏内。[说明]本程序中预设了若干个用户名和口令。用户输入正确的用户名后,可以查找对应的口令,一旦输入结束标记“end”,程序结束。[Java代码]import java. io. *:public class User {public String user;public Siring pass;public User() { }public User( String u,String p) {user=u;pass=p;}public S

  • 查看答案
  • 阅读下列Java程序和程序说明,将应填入(n)处的字句写在对应栏内。 (说明)下

    [试题]阅读下列Java程序和程序说明,将应填入(n)处的字句写在对应栏内。(说明)下面的程序先构造Point类,再顺序构造Ball类。由于在类Ball中不能直接存取类Point中的xCoordinate及yCoordinate属性值,Ball中的toString方法调用Point类中的toString方法输出中心点的值。在MovingBall类的toString方法中,super.toString调用父类Ball的toString方法输出类Ball中声明的属性值。public class Point{p

  • 查看答案
  • 阅读下列Java程序和程序说明,将应填入(n)处的字句写在对应栏内。(说明)St

    [试题]阅读下列Java程序和程序说明,将应填入(n)处的字句写在对应栏内。(说明)StringEditor类的功能是:已知一个字符串,返回将字符串中的非字母字符都删除后的字符串。public (1) {public static String removeNonLetters( (2) ){StringBuffer aBuffer=(3);char aCharacter;for(int i=0; i<original.length();i++){aCharacter=(4);if(Character.i

  • 查看答案
  • 阅读以下说明和C£«£«程序,将应填入(n)处的字句写在对应栏内。(说明) 字符

    [试题]阅读以下说明和C++程序,将应填入(n)处的字句写在对应栏内。(说明)字符串在程序设计中扮演着重要角色。现需要设计字符串基类string,包含设置字 符串、返回字符串长度及内容等功能。另有一个具有编辑功能的串类edlt_string,派生于string,在其中设置一个光标,使其能支持在光标处的插入、删除操作。(程序)include <iostream.h>include <stdio.h>include <string.h>class string{int length;char *data;pu

  • 查看答案