首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
阅读以下应用程序说明和C程序,将C程序段中(1)~(7)空缺处的语句填写完整。 【说明】 以下【C程序】的功能是从文件text_01.ini中读入一篇英文短文,统计该短文中不同单词和它的出现次数,并按词典编辑顺序将单词及它的出现次数输出到文件
阅读以下应用程序说明和C程序,将C程序段中(1)~(7)空缺处的语句填写完整。 【说明】 以下【C程序】的功能是从文件text_01.ini中读入一篇英文短文,统计该短文中不同单词和它的出现次数,并按词典编辑顺序将单词及它的出现次数输出到文件
admin
2009-02-15
44
问题
阅读以下应用程序说明和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
程序员下午应用技术考试
软考初级
相关试题推荐
如果已知一个Excel表格B1单元格是空格,B2单元格的内容为数值2,B3单元格的内容为数值3,B4单元格的内容为数值4.5,B5单元格的内容为数值5.5,B6单元格的内容为“=COUNT(B1:B5)”,那么,B6单元格显示的内容应为(55)。
在Excel2003中,A1到E6单元格的值如下图所示,若在A7单元格中输入函数“=COUNTA(A1:E6)”,按回车键后,则A7单元格显示的值为(44)。
信息处理技术员资格考试的试卷包括信息处理基础知识、计算机基础知识、法律法规知识、专业英语、办公软件使用技能五个方面。某次考试后,对这五个方面分别统计了各考生的得分率以及全国的平均得分率。为了直观展现每个考生在各个方面的水平以及该考生的整体水平,并与全国平均
许多企业常把大量暂时不用的过期数据分类归档转存于(8)________________中。
在Excel2010中,设单元格A1、B1、C1、A2、B2、C2中的值分别为1、2、3、4、5、6,若在单元格D1中输入函数“=MAX(A1:A2,B1:C2)”,按回车键后,则D1单元格中的值为(
Word2010中的格式刷可用于复制段落的格式,若要将选中的当前段落格式重复应用多次,应()。
某地区去年粮食产量资料如下表:根据该表可以推算出,该地区去年薯类的产量为()万吨。
在Excel的A1单元格中输入函数“=ROUND(3.1415,2)”,则A1单元格中显示的值为(57)。
框架在网页布局中主要起什么作用?主页中定义了几个框架,分别显示哪个文档?假设连接的数据记录集当前指向的记录如下:写出以下ASP代码经过IIS服务器解释后的结果。<tdalign-"center"width="20%"><ahref
阅读下列说明和HTML文本,分析其中嵌入的JavaScrlpt脚本,将应填入<u>(n)</u>处的语句写在对应栏内。[说明]本题实现用鼠标拖拽图片在Web页内移动的功能。将鼠标放在图片上,按下左键,移动鼠标便可带动图片一起移动。[
随机试题
社区健康教育以何种人群为对象
选择给药途径的依据有
【2011年第4题】题26~30:某新建办公建筑,高126m,设避难层和屋顶直升机停机坪。请回答下列问题,并列出解答过程。说明在本建筑物中的下列哪个部位应设置备用照明?
有围护结构的(),应按其围护结构外围水平面积计算。
按建标[2003]206号文件的规定,下列各项中属于规费的是()。
汉赋名作《子虚赋》是()的代表作。
从下列两题中任选一题作答,如果两题都答,只按第Ⅰ道的成绩计入总分。学生小王总是在快要考试时才会花很多时间看书,平时儿乎从不花时间来复习老师的课堂教学内容。在复习时,小王常常是课本上有什么内容就看什么内容,什么内容在前就先看什么内容,什么内容在后就后看
使用枪支的犯罪比其他类型的犯罪更容易导致命案。但是,大多数使用枪支的犯罪并没有导致命案。因此,没有必要在刑法中把非法使用枪支作为一种严重刑事犯罪,同其他刑事犯罪区分开来。上述论证中的逻辑漏洞,与以下哪项中出现的最为类似?
待排序的关键码序列为(33,18,9,25,67,82,53,95,12,70),要按关键码值递增的顺序排序,采取以第一个关键码为基准元素的快速排序法,第一趟排序后关键码33被放到第()个位置。
请在【答题】菜单下选择【进入考生文件夹】命令,并按照题目要求完成下面的操作。注意:以下的文件必须都保存在考生文件夹下。文档“北京政府统计工作年报.docx”是一篇从互联网上获取的文字资料,请打开该文档并按下列要求进行排版及保存操作:
最新回复
(
0
)