首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
阅读以下应用程序说明和C程序,将C程序段中(1)~(7)空缺处的语句填写完整。 【说明】 以下【C程序】的功能是从文件text_01.ini中读入一篇英文短文,统计该短文中不同单词和它的出现次数,并按词典编辑顺序将单词及它的出现次数输出到文件
阅读以下应用程序说明和C程序,将C程序段中(1)~(7)空缺处的语句填写完整。 【说明】 以下【C程序】的功能是从文件text_01.ini中读入一篇英文短文,统计该短文中不同单词和它的出现次数,并按词典编辑顺序将单词及它的出现次数输出到文件
admin
2009-02-15
41
问题
阅读以下应用程序说明和C程序,将C程序段中(1)~(7)空缺处的语句填写完整。
【说明】
以下【C程序】的功能是从文件text_01.ini中读入一篇英文短文,统计该短文中不同单词和它的出现次数,并按词典编辑顺序将单词及它的出现次数输出到文件word_xml.out中。
该C程序采用一棵有序二叉树存储这些单词及其出现的次数,一边读入一边建立。然后中序遍历该二叉树,将遍历经过的二叉树上节点的内容输出。
程序中的外部函数
int getword(FILE *fpt,char *word)
从与fpt所对应的文件中读取单词置入word,并返回1;若已无单词可读,即到文件尾部时,则函数返回0。
【C程序】
#include <stdio.h>
#include <malloc.h>
#include <ctype.h>
#include <string.h>
#define INF "TEXT_01.INI"
#define OUTF "WORD_XML.OUT"
typedef struct treenode {
char *word;
int count;
struct treenode *left, *right;
} BNODE;
int getword(FILE *fpt,char *word);
void binary tree(BNODE **t,char *word)
{ BNODE *ptr, *p;
int cmpres;
p = NULL;
(1);
while (ptr) { /*寻找插入位置*/
cmpres = strcmp(word, (2)); /* 保存当前比较结果*/
if (!cmpres) {
(3)
return;
}
else {
(4);
ptr = cmpres > 0 ? ptr->right : ptr->left;
}
}
ptr = (BNODE *)malloc(sizeof(BNODE));
ptr->right = ptr->left = NULL;
ptr->word = (char *)malloc(strlen(word)+1);
strcpy(ptr->word,word);
ptr->count = 1;
if (p == NULL)
(5) ;
else
if (cmpres > 0)
p->right = ptr;
else
p->left = ptr; }
}
void midorder(FILE *fpt, BNODE *t)
{ if ((6))
return;
midorder(fpt , t->left);
fprintf(fpt , " %s %d\n " , t->word , t->count);
midorder(fpt , t->right); }
void main()
{ FILE *fpt;
char word[40];
BNODE *root = NULL;
if ((fpt = fopen(INF , "r")) == NULL) {
printf("Can’t open file %s\n",INF);
return;
}
while (getword(fpt,word) == 1)
binary_tree( (7) );
fclose(fpt);
fopen(OUTF,"w");
midorder(fpt, root);
fclose(fpt);
}
选项
答案
(1)ptr=*t (2)ptr->word (3)ptr->count++或其等价形式 (4)P=ptr (5)*t=ptr (6)t==NULL 或 !t (7)&root,word
解析
这是一道要求读者掌握二叉树应用的程序设计题。本题的解答思路如下。
对于以下结构体定义语句。
typedef struct treenode {
char *word;
int count;
struct treenode *left,*right;
} BNODE;
显然,这是定义了一个用于构造二叉树的数据结构,从结构成员的名字上看,字符指针成员word是用来保存单词的,整型成员count是用来保存该单词在文章中出现次数的。
通过快速浏览程序,不难发现函数binary_tree()大体上是在二叉树中为单词寻找位置并插入,由于没有其他函数进行显式的二叉树创建工作,因此该函数可能还要承担创建二叉树的任务。函数midorder是一个典型的递归算法的中序遍历二叉树,对函数binary_tree()处理的结果进行中序遍历,并将每一个节点的内容写入文件word_xml.out中。而函数mam()则调用这两个函数完成全部处理工作。
首先从main()函数读起。(7)空缺处所在的语句是一个循环的循环体,是对函数binary_tree()的调用。我们看,在这个循环体中,函数getword()每从文章中抽取一个单词,便由函数binary_tree()插入二叉树中,循环结束时已经完成了创建二叉树以及把所有单词都插入二叉树的工作。因为此后已经是对二叉树的中序遍历了。
由于已经明确(7)空缺处需要填写的是函数binary_tree()调用的实际参数表,因此就需要研究函数 binary_tree()的形式参数——“BNODE**t,char*word”。首先,该函数的第2个参数(即char *word)是要插入的单词(这从函数对该参数的使用中也可以看出)。考虑到实际参数是一个数组(即char word[40];),而形式参数需要的是一个字符串指针,只要把数组首地址传入即可。因此(7)空缺处所填写的实际参数就应该是“word”。
函数binary_tree()的第1个参数要求是BNODE类型的,通读函数main(),只有一个BNODE类型的变量root(即BNODE *root=NULL;),那么在(7)空缺处是以何种方式将root传入函数binary_tree()中的()呢?由于形式参数需要一个二级指针,而实际参数是一个指针,因此(7)空缺处所对应的实际参数只能填写"&root",即把root的地址作为一个常量二级指针传递给函数binary_tree()。
综上所述,(7)空缺处所填写的实际参数是“&root,word”。
阅读函数binary_tree()可知,所传入的BNODE类型变量(*root)需要被函数中的BNODE型变量(*prt)接收。那么这个操作应该在何处完成?由于语句“ptr=cmpres>0? ptr->right:ptr->left;”是在二叉树中查找的典型算法。因此BNODE类型变量接收问题是在进入while循环之前完成的,即(1)空缺处所填写的内容是完成该BNODE类型变量接收任务的语句。综合考虑形式参数中所传入变量的类型和ptr的类型可知,(1)空缺处所填写的语句是“ptr=*t”。
在C语言中,如果要比较两个字符串,则可以使用库函数Strcmp()。该函数可以比较两个字符串并根据结果返回一个整数值,具体语法如下:
int strcmp(string str1,string str2);
其中,str1和str2是两个已声明并已初始化的字符数组,该函数返回负数表示str1小于str2;返回正数表示str1大于str2:返回0表示两个字符串相同。
(2)空缺处所在的语句中“word”要和谁比较,当然是ptr->word了,即(2)空缺处所填写的内容是“ptr->word”。若比较结果相同时,则需要把该单词的计数加1,即(3)空缺处所填写的语句是“ptr->count++”或其等价形式。
(4)空缺处所填写的语句作用比较模糊,可以暂时跳过,继续阅读之后的程序。很明显,(4)、(5)空缺处之间的语句是建立了一个新节点,并将左右链接置空,写入word,写入计数1。
对于(5)空缺处所在的条件判断语句,即
if (p == NULL) (5) ;
elSe if (cmpres > 0) p->right = ptr;
elSe p->left = ptr;
其中,(5)空缺处所在的这个if判断也比较难理解。而else部分的if...else体(即p->right=ptr;和p->left =ptr;),显然是将新建节点接入二叉树的操作,指针p到底指向哪里?从该句可以判断指针p是查找位置而未找到时的最后一个节点,即ptr由此执行p->fight=ptr或者p->left=ptr,操作后ptr值为NULL,然后退出while循环。那么指针p和ptr的这种关系是怎样建立起来的?从程序的流程来看,只能是在遍历二叉树的过程中建立起来的,因为p需要随时跟踪ptr的变化。而遍历二叉树部分的C代码并没有实现这样的功能,因此需要在(4)空缺处填写完成这个任务的语句,即“p=ptr”。
有了以上的理解,就不难理解条件判断“p==NULL”的含义了。因为只有在没有进入while循环而直接执行循环以后的语句才会形成这种情况。换言之,p==NULL表示这是第一次调用函数,即ptr是新建的树。此时就需要将新建树的树根回传,以便以后程序调用时使用,因此(5)空缺处所填写的语句是“*t=ptr”(提醒读者想一想,为什么不是t=ptr?)。
(6)空缺处是判断一个条件,以结束对递归函数midorder()的调用。递归函数midorder()何时结束呢?显然当传入的t为空时结束,因为这包含以下两种可能要求结束调用的条件:
1)首次传入的二叉树为空。对于一棵空的二叉树,自然是无须遍历的。
2)遍历结束。遍历结束后再调用递归函数midorder()时,传入的t->left或者t->fight为空,自然遍历就应该就此结束。
其实以上两个条件表达的意思一样,即(6)空缺处所填写的判断条件是“t==NULL”或“!t”。
转载请注明原文地址:https://kaotiyun.com/show/rbjZ777K
本试题收录于:
程序员下午应用技术考试题库软考初级分类
0
程序员下午应用技术考试
软考初级
相关试题推荐
结构化程序中的基本结构不包括(28)。
某社区有12个积极分子A~L,他们之间的联系渠道见下图。居委会至少需要通知他们之中(67)________________个人,才能通过联系渠道通知到所有积极分子。
在Excel2010的A1单元格中输入函数“=ABS(ROUND(-1.478,2))”,按回车键后,A1单元格中的值为________________。
在收集、整理、存储大数据时,删除重复数据的作用不包括________________。
在实施项目过程中,信息处理员小王在“时间T-项目剩余工作量R”平面坐标系上动态地记录了项目实施进度,并与计划进度做了对比。在项目实施中途,从图上可以看出该项目()。
信息系统通常会自动实时地将所有用户的操作行为记录在日志中,其目的是使系统安全运维()。
某单位的统计报表比较多,采用表号(报表的编号)的好处是______。
在Windows环境中,选择某一部分信息(例如一段文字、一个图形)移动到别处,可以首先执行“编辑”菜单下的(5)命令。
在Excel2007中,(43)________________不是计算从A1到A6单元格中数据之和的公式。
据某地区统计,今年中小学生中肥胖学生约占10%,而且,肥胖学生人数正在以8%的速度增长。假设近年中小学生的总量变化不大,据此我们可以推算出,明年该地区中小学生中肥胖学生的比例约为(64)。
随机试题
现行宪法规定,国家的立法机关是()。
简述ISO9000族标准的主要核心标准的构成及其关系。
男,51岁。重症肺炎患者,入院后次日病情加重,突发持续性呼吸急促,发绀,伴烦躁,呼吸频率38次/分,心率108次/分,律齐,两肺可闻及湿啰音。血气分析:pH7.34,PaO250mmHg,PaCO230mmHg。胸片示两中下肺纹理增多模糊,斑片状阴影,
在评价内分泌激素水平的临床意义时应注意
制定、调整、公布医疗器械分类目录开办第一类医疗器械的经营企业的备案部门
我国的民事诉讼法允许合同当事人在书面协议中选择()人民法院管辖。
利息保障倍数不能低于()。
补写出下列名句名篇中的空缺部分。(1)________________,直挂云帆济沧海。(李白《行路难》)(2)________________,不尽长江滚滚来。(杜甫《登高》)(3)乱石穿空,惊涛拍岸,________________。(苏轼《赤壁
Thetechnologyindustryisatwaroverintellectualproperty.OnMay7ththefirst【C1】______ofathree-partfightbetweenOracle
AlthoughtheOlympicCharter,theofficialconstitutionoftheOlympicmovement,proclaimsthattheOlympicsarecontestsamong
最新回复
(
0
)