首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。 【程序说明】 下列文法可用来描述化学分子式的书写规则(例如,A12(C03)、Cu(OH)2): λ→β|βλ β→δ|δn δ→ξ|ξθλ 其中,λ是一个分子
阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。 【程序说明】 下列文法可用来描述化学分子式的书写规则(例如,A12(C03)、Cu(OH)2): λ→β|βλ β→δ|δn δ→ξ|ξθλ 其中,λ是一个分子
admin
2013-05-11
30
问题
阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。
【程序说明】
下列文法可用来描述化学分子式的书写规则(例如,A12(C03)、Cu(OH)2):
λ→β|βλ
β→δ|δn
δ→ξ|ξθλ
其中,λ是一个分子式;δ或是一个元素,或是一个带括号的(子)分子式,元素或是一个大写字母(记为ξ),或是一个大写字母和一个小写字母(记为ξθ);β或是一个δ,或是在δ之后接上一个整数n,δn表示β有n个δ的元素或(子)分子式。一个完整的分子式由若干个β组成。
当然一个正确的分子式除符合上述文法规则外,还应满足分子式本身的语义要求。下面的程序输入分子式,按上述文法分析分子式,并计算出该分子式的分子量。例如,元素H的原子量是1,元素O的原子量是16。输入分子式H2O,程序计算出它的分子量为重18(1×2+16)。程序中各元素的名及它的原子量从文件atom.dat中读入。
【程序】
#include <stdio.h>
#include <string.h>
#define MAXN 300
#define CMLEN 30
struct elem{
char name[3];/*元素名*/
double v; /*原子量*/
}nTbl[MAXN];
char cmStr[CMLEN], *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);
return -1.0;
}
else if(c==’(’){
if((num =(1)<0.0)return -1.0; /* 包括可能为空的情况 */
if(*pos++ !=’)’){
printf(" 分子式中括号不匹配!\n");
return -1.0;
}
return num;
}
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=*pos++;
}
}
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;
}
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", nTbl
.name, &nTbl
.v) == 2)i++;
fclose(fp);
nTbl
.v=-1.0;
while(I){ /* 输入分子式和计算分子量循环,直至输入空行结束*/
printf ("\n 输入分子式!(空行结束)\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);
}
}
选项
答案
(1) factor() (2) atom() (3) n* 10+c-’0’ (4) mAtom()或factor() (5) num+=d
解析
本题是一个文法规则的C语言实现,用来处理化学分子式。解题前应先弄清楚文法规则。
程序由main函数和atom函数、mAtom函数及factor函数构成,主程序仅用来输入、输出数据,调用相应函数,不对数据做处理。3个函数各自处理一种文法,下面进行仔细分析。
函数atom是用来处理文法符号δ的。“δ可能是一个元素,或是一个带括号的(子)分子式,元素或是一个大写字母(记为ξ),或是一个大写字母和一个小写字母(记为ξθ)。”函数先用while循环略过空白字符,接着如果遇到了回车符,说明分子式识别完成,函数返回0。若遇到的是大写字母,则将其保存在w中,并检查紧接着的字符是否是小写字母,若是则与前面的大写字母共同构成元素名;否则,元素名由单一的大写字母构成,当前pos字符指针回退一个字符(注意这点)。接着查找元素名表,若找到则返回对应原子量,否则输出错误信息。若空白字符后遇到的是左括号“(”,说明遇到了一个带括号的(子)分子式,而分子式文法符号是λ,由函数factor处理,故此处应该调用factor函数以返回(子)分子式的分子量。故空 (1)应填factor()。接着处理一些匹配错误的情况,正常情况返回分子量。
函数mAtom是用来处理文法符号β的。“β或是一个δ,或是在δ之后接上一个整数n,δn表示β有n个δ的元素或(子)分子式。”所以,函数首先应该调用处理文法符合δ的函数atom函数,得到单个δ的分子量,故空(1)应填atom()。函数接着判断紧接着的字符是否是数字,若是则进行重数n识别。识别过程由高位到低位进行,因此易得空(3)应填“n*10+c-’0’”。这应该是常有的技巧,需要记住。需要注意c是字符。另外注意,if块之后的语句pos--,需要特别注意指针的指向情况。然后返回分子量。
函数factor是用来处理文法符号λ。“λ是一个分子式,由若干个(1个或1个以上)β组成。”故函数首先调用处理文法符合β的函数mAtom,得到单个β的分子量。然后函数用循环处理多个β组成的情况:当β之后还有大写字母或左圆括号时,表示其后还有β函数继续调用处理的函数mAtom()。故空(4)应填“mAtom()”。后继β的分子量d需要累加到前面求出的β的分子量num上。故空(5)应填“num6+=d”。
转载请注明原文地址:https://jikaoti.com/ti/56f7FFFM
本试题收录于:
软件设计师上午基础知识考试题库软考中级分类
0
软件设计师上午基础知识考试
软考中级
相关试题推荐
(1)是计算机系统之间通信的层次、各对等层的通信协议以及相邻层间接口的集合。(2)是计算机网络和分布式系统在相互通信的对等层实体间交换信息所必须遵守的规则集合。(3)研究如何设计和构造协议规范,以及如何将所设计和构造的协议规范快速、准确、低成本地转化为
(1)是计算机系统之间通信的层次、各对等层的通信协议以及相邻层间接口的集合。(2)是计算机网络和分布式系统在相互通信的对等层实体间交换信息所必须遵守的规则集合。(3)研究如何设计和构造协议规范,以及如何将所设计和构造的协议规范快速、准确、低成本地转化为
Traditionalnetworklayerpacketforwardingreliesontheinformationprovidedbynetworklayer(71)protocols,orstaticrouting,
Traditionalnetworklayerpacketforwardingreliesontheinformationprovidedbynetworklayer(71)protocols,orstaticrouting,
Traditionalnetworklayerpacketforwardingreliesontheinformationprovidedbynetworklayer(71)protocols,orstaticrouting,
Routingincircuit-switchingnetworkshastraditionallyinvolvedastaticroutingstrategywiththeuseof(1)pathstorespond
Routingincircuit-switchingnetworkshastraditionallyinvolvedastaticroutingstrategywiththeuseof(1)pathstorespond
TraditionalIPpacketforwardinganalyzesthe(1)IPaddresscontainedinthenetworklayerheaderofeachpacketasthepacke
TraditionalIPpacketforwardinganalyzesthe(1)IPaddresscontainedinthenetworklayerheaderofeachpacketasthepacke
随机试题
心肌梗死的常见原因是
小儿10个月,方颅,多汗,胸骨肋膈沟,血钙正常,血磷低,X线片可见骨骺软骨增宽,干骺端临时钙化带模糊,并呈毛刷状改变,诊断为
确定客观收益一般要考虑()等条件。
物业服务差异目标市场营销策略的优点是()。
一般资料:求助者,女性,32岁,公务员。案例介绍:求助者两年前离异,一直独自带着孩子生活。一年前,求助者与多年未联系的初恋男友偶遇。初恋男友一直未婚,当得知求助者离异后便对求助者展开追求。随着时间的推移,两人相处越来越融洽。几个月前,求助者正式向
1+3+5+7+…+17=()。
随着计算机技术向着千万亿次乃至更高的级别迈进,处理器速度已经超越了传输速度,这就在应用领域产生了一个技术瓶颈,阻碍了应用的进一步发展。任何尝试过拨号上网看流媒体视频的人都有所体会,再快的处理器也不能提高文件加载速度。而在大数据和云计算的当今,在服务器之间有
简述教育国际化的主要内容。
Onemorning,Iwaswaitingatthebusstop,worriedabout【K1】______(be)lateforschool.Thereweremanypeoplewaitingattheb
Salesdidn’tchangefrom1998to2000.Salesincreasedsteadilyfrom1998to2000.
最新回复
(
0
)