[试题]

试题五

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

(程序5说明)

下列文法可用来描述化学分子式的书写规则(例如,Al2(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[];/*元素名*/

doublev;/*原子量*/

}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,nTb[i].name)==0)returnnTbl[i].v;

printf("\n元素表中没有所输入的元素:\t%s\n",w);retur n-1.0;

}elseif(c==′(′){

if((num= (1) )<0.0)return-1.0;/*包括可能为空的情况*/

if(*pos++!=′)′){printf("分子式中括号不匹配!/n");return-1.0;}

returnnum;

}

printf("分子式中存在非法字符:\t%c\n",c);

return-1.0;

}

double mAtom()/*处理文法符号β*/

{double num;int n=1;

if((num= (2) )<0.0)return-1.0;

c=*pos++;

if(c>=′0′&&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((num=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.dat";/*元素名及其原子量文件*/

int i;double num;

if((fp=fopen(fname,"r"))==NULL){/*以读方式打开正文文件*/

printf("Can not 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=fator())>0.0)

if(*pos!=′\0′)printf("分子式不完整!\n");

else printf("分子式的分子量为%f\n",num);

}

}

参考答案与解析:

相关试题

试题五 阅读下列程序说明和C£«£«代码,将应填入(n)处的字句写在答卷的对应

[试题]试题五阅读下列程序说明和C++代码,将应填入(n)处的字句写在答卷的对应栏内。(说明)①定义类Table的私有数据成员x和y,分别用于表示九九表中的两个乘数(x*y),它们都是int型的数据。②完成类Table的成员函数print()的定义,该函数以"x*y=z"的格式打印出九九表中的一个乘法算式,请使用格式化输出函数printf实现。③完成类Table9的成员函数print()的定义,该函数调用基类Table的print()函数,将九九表输出到屏幕。④补充主函数,在屏幕上输出九九表,以便测试

  • 查看答案
  • 试题五 阅读下列程序说明和C£«£«代码,将应填入(n)处的字句写在答卷的对应

    [试题]试题五阅读下列程序说明和C++代码,将应填入(n)处的字句写在答卷的对应栏内。(说明)①在类体中添加函数move(double ax, double ay)的定义,使得点的坐标x和y分别移动ax和ay个单位。②在类定义外完成重载的两个构造函数CPosition()和CPosition(double dx, double dy),其中前者为不带参数的构造函数,使CPosition对象的默认值为x=0,y=0,后者为带参数的构造函数,把数据成员x和y分别初始化为参数dx和dy的值。③完成函数doubl

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

    [试题]试题五阅读下列程序说明,将应填入(n)处的字句写在答卷纸的对应栏内。(程序说明)对于一个公司的雇员来说,无非有3种:普通雇员、管理人员和主管。这些雇员有共同的数据:名字、每小时的工资,也有一些共同的操作:数据成员初始化、读雇员的数据成员及计算雇员的工资。但是,他们也有不同。例如,管理人员除有这些共同的特征外,有可能付固定薪水,主管除有管理人员的共同特征外,还有其他物质奖励等。3种雇员中,管理人员可以看作普通雇员的一种,而主管又可以看作管理人员的一种。我们很容易想到使用类继承来实现这个问题:普通雇员

  • 查看答案
  • 试题六 阅读下列程序说明和C£«£«代码,将应填入(n)处的字句写在答卷的对应

    [试题]试题六阅读下列程序说明和C++代码,将应填入(n)处的字句写在答卷的对应栏内。(程序6说明)本程序实现两个多项式的乘积运算。多项式的每一项由类Item描述,而多项式由类List描述。类List的成员函数有:createList():创建按指数降序链接的多项式链表,以表示多项式。reverseList():将多项式链表的表元链接顺序颠倒。multiplyList(List L1,List L2):计算多项式L1和多项式L2的乘积多项式。(程序6)#include<iostream.h>c

  • 查看答案
  • 试题六 阅读下列程序说明和C£«£«代码,将应填入(n)处的字句写在答卷的对应

    [试题]试题六阅读下列程序说明和C++代码,将应填入(n)处的字句写在答卷的对应栏内。(说明)①为类Circle增加一个构造函数,该函数有一个参数,并在构造时将该参数值赋给成员radius。将该函数实现为一个非内联函数,并且使用参数列表的方式将类成员赋值。②为类Circle增加一个成员函数print(),使得可以输出有关圆的信息,比如下列程序C.ircle c;C.SetRadius (5) ;C.Print();将输出:The circle has radius of 5!③完成友元函数void Com

  • 查看答案
  • 试题六 阅读下列程序说明和C£«£«代码,将应填入(n)处的字句写在答卷的对应

    [试题]试题六阅读下列程序说明和C++代码,将应填入(n)处的字句写在答卷的对应栏内。(说明)源程序中定义了Circle类与Money类,Circle类可对半径为r的圆进行周长与面积的计算,而Money类用于计算一圆形游泳池的造价。游泳池四周有原形过道,过道外围上栅栏,过道宽度为3米,根据键入的游泳池半径,每米栅栏价格及每平方米过道价格,即可计算出游泳池的造价。请按要求完成下列操作,将程序补充完整。①定义符号常量PI(值为3.14159f)与WIDTH(值为3.00f),分别用于表示圆周率与过道的固定宽度

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

    [试题]试题四阅读下列程序说明和C程序,将应填入(n)处的字句写在答卷纸的对应栏内。(程序说明)该程序定义了两个子函数strsort和strmerge。它们分别实现了将一个字符串按字母顺序排序和将两个字符串合并排序,并删去相同字符。在主函数里,先输入两个字符串s1和s2,然后调用strsort函数对它们分别排序,然后调用strmerge函数将s1和s2合并,将合并后的字符串赋给字符串s3,最后输出字符串s3。(程序)#include<stdio.h>void strmerge(char*a,c

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

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

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

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

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

    [主观题]阅读下列程序说明和C代码,把应填入其中n处的字句写在答卷的对应栏内。(说明)程序利用选择排序算法对数组a中的N个整数按照从小到大的顺序排列,并将排序结果显示出来。(程序)define N 10main(){void (1);int i,a[N];for(i=0;i<10,i++) /*输入*/scanf(“%d”,&a[i]);(2);for(i=0;i<N,i++) /*输出*/printf(“%3d”,a[i]);}void selectSon(int x[],int n){int

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