2017上半年程序员考试真题及答案-下午卷.doc
《2017上半年程序员考试真题及答案-下午卷.doc》由会员分享,可在线阅读,更多相关《2017上半年程序员考试真题及答案-下午卷.doc(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2017上半年程序员考试真题及答案-下午卷试题一(共 20 分)阅读下列说明和图,回答问题 1 至问题 3,将解答填入答题纸的对应栏内。【说明】设有二维整数数组(矩阵)A1:m,1:n,其每行元素从左至右是递增的,每列元素从上到下是递增的。以下流程图旨在该矩阵中需找与给定整数 X 相等的数。如果找不到则输出“false”;只要找到一个(可能有多个)就输出“True”以及钙元素的下标 i 和 j(注意数组元素的下标从 1 开始)。例如,在如下矩阵中查找整数 8,则输出伟:True,4,12 4 6 94 5 9 106 7 10 128 9 11 13流程图中采用的算法如下:从矩阵的右上角元素开
2、始,按照一定的路线逐个取元素与给定整数 X 进行比较(必要时向左走一步或向下走一步取下一个元素),直到找到相等的数或超出矩阵范围(找不到)。【流程图】【问题】该算法的时间复杂数是()供选择答案:A.O(1) B.O(m+n) C.(m*n) D,O(m+n)(1)n (2)j-1j (3)i+1I (4)j (5)B读题,可以看出元素查找的过程为从右上角开始,往右或者往下进行查找。因此,初始值i=1,j=n。如果查找值小于右上角值,则往右移动一位再进行比较。所以,第二空填j-1j 。接下来是判断什么时候跳出循环。此时,终止循环的条件是:j=0,也就是其从最右端移到了最左端。再看X255)ret
3、urn 0;if (flag)()if(*p=.dotNum+;if ()return 1;return 0;(1)ipaddr (2)curval*10 (3)p+ (4)decNum+ (5)decNum=4 & dotNum=3此题判断IPV4地址是否合法,主要是判断其每个十进制数的大小和总个数以及“.”个数来进行判别。首先用isdigital函数判断是否为十进制数,是则保留值。指针移到地址的下一个字符。每找到一个十进制数都需要和前一次找到的值进行组合,即前一次的结果要乘以10。每找完一个完整数字和“.”都需要记录,所以要有decNum+和dotNum+。最后,如果IP地址正确,则返回1
4、。即:decNum=4和dotNum=3时成立。 【试题三】阅读下列说明和 C 函数,填补 C 函数中的空缺,将解答填入答案纸的对应栏目内。【说明】字符串是程序中常见的一种处理对象,在字符串中进行子串的定位、插入和删除是常见的运算。设存储字符串时不设置结束标志,而是另行说明串的长度,因此串类型定义如下:Typedef struct Char*str 字符串存储空间的起始地址int lehgth 字符串长int capacity 存储空间的容量SString;【函数 1 说明】函数 indexStr(S,T,pos)的功能是:在 S 所表示的字符串中,从下标 pos 开始查找 T 所表示字符串首
5、次出现的位置。方法是:第一趟从 S 中下标为 pos、T 中下标伟 0 的字符开始,从左往右逐个对于来比较 S 和 T 的字符,直到遇到不同的字符或者到达 T 的末尾。若到达 T 的末尾,则本趟匹配的起始下标 pos 为 T 出现的位置,结束查找;若遇到了不同的字符,则本趟匹配失效。下一趟从 S 中下标 pos+1 处的字符开始,重复以上过程。若在 S 中找到 T,则返回其首次出现的位置,否则返回-1。例如,若 S 中的字符串伟students ents,T 中的字符串伟ent,pos=0,则 T 在 S 中首次出现的位置为 4。【C 函数 1】int index Str(SString S
6、,SString T,int pos)int i,j:i (S.length1|S.lengthpos+T.length-1)return-1;for(i=pos,j=0;iS.length &jlength|T.lengthlengthT.length)return;Pos=0for(;)调用 indexStr 在 S 所表示串的 pos 开始查找 T 的位置Pos=indexStr();if(pos-1) S 所表示串中不存在子串 Treturn;for(i=pos+T.length;ilength;i+) 通过覆盖来删除自串 TS-str()=S-stri;S-length=(); 更新
7、 S所表示串的长度(1)i-j+1 (2)j=T.length (3)S,T,pos (4)i-T.length (5)S -length -T.length函数1为字符串匹配,算法为:先判断字符串S和T的长度,如果为空则不用循环,另外,如果字符串S的长度<字符串T的长度,那字符串S中也不能含有字符串T,也无需进行匹配。那当上述情况都不存在时,即需要进行循环。即从S的第一个字符开始,与T的第一个字符进行比较,如果相等,则S的第二个字符和T的第二字符进行比较,再相等就再往后移动一位进行比较,依次直到字符串T的结尾,也就是说j=T.length。当某一个字符与T的字符不相等时,那么字符串S就
8、应从下一个字符开始比较,此时i=i-j+1,(如果前面有匹配成功的话,i的值已经增加了j位,因此需要重新回到之前比较的位置的后一个字符进行比较)再次进行与T的第一个字符进行比较,此时j恢复初始值,j=0。函数2为字符串的删除运算。首先,要调用函数 indexStr,需要三个参数,字符串S、字符串T和pos。从函数2的调用Void eraseStr(SString*S,SStringT)可以看到,此处字符串S为指针变量,因此字符串前需使用*。然后删除的字符串的位置为删除初始点的位置到其位置点+字符串T的长度,并将后面的字符串前移。而删除T字符串后,字符串S的总长度变化,需减去字符串T的长度。试题
9、四(共 15 分)阅读以下说明和 C 函数,填补函数中的空缺,将解答填入答题纸的对应栏内。【说明】简单队列是符合先进先出规则的数据结构,下面用不含有头结点的单向循环链表表示简单队列。函数 enqueue(queue *q,KeyType new_elem) 的功能是将元素new_elem 加入队尾。函数 Dnqueue(queue *q,KeyType *elem)的功能使将非空队列的队头元素出队(从队列中删除),并通过参数带回刚出队的元素。用单向循环链表表示的队列如图 4-1 所示。图 4-1 单向循环链表表示的队列示意图队列及链表结点等相关类型定义如下:enum errOr, OK;typ
10、edef int KeyType;typedef struct qNodeKeyType data;Struct qNode*next;qNode,*Linkqueue;Typedef structint size;Link:queue rear;queue;【C 函数】int enqueue(queue*q,KeyType new_elem) 元素 new_elem 入队列qNode*p;P=(qNode*)malloc(sizeof(qNode);if(!p)return errOr;P-data=new_elem;if(q-rear)P-next=q-rear-next;();elseP
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2017 上半年 程序员 考试 答案 下午
限制150内