[计算机类试卷]2014年下半年软件水平考试(初级)程序员下午(应用技术)真题试卷及答案与解析.doc
《[计算机类试卷]2014年下半年软件水平考试(初级)程序员下午(应用技术)真题试卷及答案与解析.doc》由会员分享,可在线阅读,更多相关《[计算机类试卷]2014年下半年软件水平考试(初级)程序员下午(应用技术)真题试卷及答案与解析.doc(13页珍藏版)》请在麦多课文档分享上搜索。
1、2014年下半年软件水平考试(初级)程序员下午(应用技术)真题试卷及答案与解析 1 阅读以下说明和流程图,填补流程图中的空缺 (1) (5),将解答填入答题纸的对应栏内。【说明】 本流程图旨在统计一本电子书中各个关键词出现的次数。假设已经对该书从头到尾依次分离出各个关键词 A(i)|i=1, , n)(n 1),其中包含了很多重复项,经下面的流程处理后,从中挑选出所有不同的关键词共 m个K(=(i)|j=1, , m),而每个关键词 K(j)出现的次数为 NK(j), j=1, , m。【流程图】 2 阅读以 下说明和 C函数,填补代码中的空缺 (1) (5),将解答填入答题纸的对应栏内。 【
2、说明】 函数 removeDuplicates(char*str)的功能是移除给定字符串中的重复字符,使每种字符仅保留一个,其方法是:对原字符串逐个字符进行扫描,遇到重复出现的字符时,设置标志,并将其后的非重复字符前移。例如,若 str指向的字符串为“aaabbbbscbsss”,则函数运行后该字符串为 “absc”。 【 C代码】 void remoVeDuplicates(char*str) int i, len=strlen(str); *求字符串长度 * if( (1) )return; *空串或长度为 1的字符串无需处理 * for(i=0; i len; i+) int flag=
3、0; *字符是否重复标志 * int m; for(m= (2) ; m len; m+) if(stri=strm) (3) ; break; if(flag) int n, idx=m; *将字符串第 idx字符之后、与 stri不同的字符向前移 * for(n=idx+1; n len; n+) if(strn!=stri) stridx=strn; (4) ; str (5) = 0; *设置字符串结束标志 * 3 阅读以下说明和 C函数,填补函数代码中的空缺 (1) (5),将解答填入答题纸的对应栏内。【说明】 队列是一种常用的数据结 构,其特点是先入先出,即元素的插入在表头、删除在
4、表尾进行。下面采用顺序存储方式实现队列,即利用一组地址连续的存储单元存放队列元素,同时通过模运算将存储空间看作一个环状结构 (称为循环队列 )。 设循环队列的存储空间容量为 MAXQSIZE,并在其类型定义中设置base、 rear和 length三个域变量,其中, base为队列空间的首地址, rear为队尾元素的指针, length表示队列的长度。 #define MAXQSIZE 100 typedef struct QElemType*base; *循环队列的存 储空间首地址 * int rear; *队尾元素索引* int length; *队列的长度 * SqQueue; 例如,容
5、量为 8的循环队列如图 3-1所示,初始时创建的空队列如图 3-1(a)所示,经过一系列的入队、出队操作后,队列的状态如图 3-1(b)所示 (队列长度为 3)。下面的 C函数 1、 C函数2和 C函数 3用于实现队列的创建、插入和删除操作,请完善这些代码。 【 C函数1】创建一个空的循环队列。 int InitQueue(SqQueue*Q) *创建容量为 MAXQSIZE的空队列,若成功则返回 1;否则返回 0* Q一base=(QElemType*)malloc(MAXQSIZE* (1) ); if(!Q- base)return 0; Q一length=0; Q- rear=0; r
6、eturn 1; *InitQueue* 【 C函数 2】元素插入循环队列。 int EnQueue(SqQueue*Q, QElemType e) *元素 e入队,若成功则返回 1;否则返回 0* if(Q- length=MAXQSIZE)return 0; Q一 rear= (2) ; Q- baseQ一 rear=e; (3) , return 1; ) *EnQueue* 【 C函数 3】元素出循环队列。 int DeQueue(SqQueue*Q, QElemType*e) *若队列不空,则删除队头元素,由参数 e带回其值并返回 1;否则返回 0* if( (4) )return
7、0; *e=Q一 base(Q- rearQ- length+1+MAXQSIZE) MAXQSIZE; (5); return 1; *DeQueue* 4 阅读以下说明和 C函数,填补代码中的空缺 (1) (6),将解答填入答题纸的对应栏内。【说明】 二叉树的宽度定义为含有结点数最多的那一层上的结点数。函数GetWidth()用于求二叉树的宽度。其思路是根据树的高度设置一个数组 counter,counteri存放第 i层上的结点数,并按照层次顺序来遍历二叉树中的结点,在此过程中可获得每个结点的层次值,最后从 counter中取出最大的元素就是树的宽度。 按照层次顺序遍历二叉树的实现方法是
8、借助一个队列,按访问结点的先后顺序来记录结点,离根结点越近的结点越先进入队列,具体处理过程为:先令根结点及其层次号 (为 1)进入初始为空的队列,然后在队列非空的情况下,取出队头所指示的结点及其层次号,然后将该结点的左子树根结点及层次号入队列 (若左子树存在 ),其次将该结点的右子树根结点及层次号入队列 (若右子树存在 ),然后再取队头,重复该过程直至完成遍历。 设二叉树采用二叉链表存储,结点类型定义如下: typedef struct BTNode TElemType data; struct BTNode *left, *right; )BTNode,*BiTree; 队列元素的类型定义如
9、下: typedef struct BTNode*ptr; int LevelNumbe r; )QElemType; GetWidth()函数中用到的函数原型如下所述,队列的类型名为 QUEUE:【 C函数】 int GetWidth(BiTree root) QUEUE Q; QElemType a, b; int width,height=GetHeight(root); int i, *counter=(int*)calloc(height+l, sizeof(int); if( (1) ) return一 1; *申请空间失败 * if(!root) return 0; *空树的宽度
10、为 0* if( (2) ) return一 1; *初始化队列失败时返回 * a ptr=root; a LeveiNumber=1; if(!EnQueue( Q, a)return一 1 ; *元素入队列操作失败时返回 * while(!isEmpty(Q) if( (3) )return一 1; *出队列操作失败时返回 * counterb LevelNumber+; *对层号为 b LevelNumber的结点计数 * if(b ptr- left) *若左子树存在,则左子树根结点及其层次号入队 * a ptr=b ptr一 left; a LevelNumber= (4) ; if
11、(!EnQueue( Q, a)return一 1; i f(b ptr一right) *若右子树存在,则右子树根结点及其层次号入队 * a ptr=b ptr一right ; a LevelNumber= (5) ; if(!EnQueue( int main () DeckofCards*d= (5) ; 生成一个牌桌 (6) ; 打印一副扑克牌中每张牌的点数和花色 delete d; return 0; 6 阅读以下说明和 Java程序,填补代码中的空缺 (1) (6),将解答填入答题纸的对应栏内。 【说明】 很多依托扑克牌进行的游戏都要先洗牌。下面的 Java代码运行时先生成一副扑克牌
12、,洗牌后再按顺序打印每张牌的点数 和花色。 Java代码 import java uti1 List; import java uti1 Arrays; import java uti1 Collections; clasS Card扑克牌类 publiC StatiC enum FaceAce t Deuce , Three , Four , Five , Six, Seven, Eight, Nine, Ten, Jack, Queen, King); 枚举牌点 public static enum Suit(Clubs, Diamonds, Hearts, Spades;枚举花色 pri
13、vate final Face face ; private final Suit suit; public Card(Face face, Suit suit) (1) face=face; (2) suit=suit; public Face getFace() return face; public suit qetSLlit() return suit; public String getCard()( 返回 String来表示一张牌 return String format(“ S, S”, face, suit); 牌桌类 clas S DeckOfCards private Li
14、stlist; 声明 List以存储牌 public DeckOfCards() 初始 化牌桌并进行洗牌 Carddeck=new Card52; int count=0; 牌数 用 Card对象填充牌桌 for(Card Suit suit: Card Suit values() for(Card Face face: Card Face values() (3) =new Card(face, suit); list=Arrays asList(deck); Collections shuffle(list); 洗牌 public void printCards() 按 4列显示 52张牌
15、 for(int i=0; i list Size(); i+) System.out.printf(”一 19s s”, list (4) , (i+1) 4=0)?“ n”: “); public class Dealer public static void main(Stringargs) DeckOfCards player= (5) ; (6) printCards(); 2014年下半年软件水平考试(初级)程序员下午(应用技术)真题试卷答案与解析 1 【正确答案】 (1)1 (2)K(j) (3)NK(j)+1NK(j) 或 NK(j)+ 或等价表示 (4)m+1m 或 m+ 或
16、等价表示 (5)A(i) 【试题解析】 流程图中的第 1框显然是初始化。 A(1)一 K(1)意味着将本书的第 1个关键词作为选出的第 1个关键词。 1一 NK(1)意味着此时该关键词的个数置为1。 m是动态选出的关键词数目,此时应该为 1,因此 (1)处应填 l。 本题的算法是对每个关键词与已选出的关键词进行逐个比较。凡是遇到相同的,相应的计数就增加 1;如果始终没有遇到相同关键词的,则作为新选出的关键词。 流程图第 2框开始对 i=2,n循环,就是对书中其他关键词逐个进行处理。流程图第 3框开始 j=1, m循环,就是按已选出的关键词依次进 行处理。 接着就是将关键词 A(i)与选出的关键
17、词 K(j)进行比较。因此 (2)处应填 K(j)。 如果 A(i)=K(j),则需要对计数器: NK(j)增 1,即执行 NK(j)+1NK(j) 。因此 (3)处应填 NK(j)+1NK(j) 。执行后,需要跳出 j循环,继续进行 i循环,即根据书中的下一个关键词进行处理。 如果 A(i)不等于 NKj),则需要继续与下个 NK(j)进行比较,即继续执行 j循环。如果直到 j循环结束仍没有找到匹配的关键词,则要将该 A(i)作为新的已选出的关键词。因此,应执行 A(i)K(m+1) 以及 m+1m 。更优的做法是先将计数器m增 1,再执行 A(i)K(m) 。因此 (4)处应填 m+1m
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
2000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 试卷 2014 年下 半年 软件 水平 考试 初级 程序员 下午 应用技术 答案 解析 DOC
