ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:162.83KB ,
资源ID:7492025      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7492025.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(下半年程序员考试真题及答案下午卷.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

下半年程序员考试真题及答案下午卷.docx

1、下半年程序员考试真题及答案下午卷2016下半年程序员考试真题及答案-下午卷试题一(共15分)阅读以下说明和流程图,填补流程图中的空缺,将解答填入答题纸的对应栏内。【说明】设有整数数组A1:N(N1),其元素有正有负。下面的流程图在该数组中寻找连续排列的若干个元素,使其和达到最大值,并输出其起始下标K、元素个数L以及最大的和值M。例如,若数组元素依次为3,-6,2,4,-2,3,-1,则输出K=3,L=4,M=7。该流程图中考察了A1:N中所有从下标i到下标j(ji)的各元素之和S,并动态地记录其最大值M。 【流程图】注:循环开始框内应给出循环控制变量的初值和终值,默认递增值为1,格式为:循环控

2、制变量=初值,终值1、i,N2、S+Aj3、S4、j-i+15、S要想在数组中寻找连续排列的若干个元素,使其和达到最大值,并输出其起始下标K、元素个数L以及最大的和值M。那么,会将数组从第一个元素出发,依次比较A1,A1 +A2,A1 +A2+A3,A1 +A2+AN,然后再比较A2, A2 +A3,A2 +A3+A4,A2 +A3+AN,然后再比较A3 +A4,A3 +A4+A5,A3 +A4+AN,直到最后一个元素AN.按照这种逻辑,要使用两个循环,且要保存之前求和项。一个是i循环,从1到N递增,另一个是j循环,j表示的是求和项的最大下标值,那么j从i开始,且要小于N。 S+AjS不断保留

3、Ai+ Ai+1+Aj的值,直到j循环结束。并将S的值与之前保存的M的值进行比较,如果SM,则将S的值赋给M,并求出L值,在这里,i是最小下标值,j是最大下标值,那么L=j-i+1。如果SM,则跳出循环。试题二(共15分)阅读以下代码,回答问题:1至问题3 ,将解答填入答题纸的对应栏内。【代码1】#includevoid swap(int x, int y) int tmp =x; x= y; y= tmp;int maim() int a= 3, b= 7; printf(a1= %d b1=%dn,a,b);Swap( a, b);Printf(a2 = %d b2=%dn”,a,b);r

4、eturn 0;【代码2】#include#define SPACE /空格字符Int main()char str128 =”Nothing is impossible! “;int i,num =0,wordMark=0;for(i=0;stri;i+)If(stri=SPACE)WordMark=0;elseIf(wordMark=0)wordMark=1;Mun+;Printf(“%d/n”,num)retun 0;【代码3】#include#define SPACE “/空格字符int countStrs(char *);int main()char str128 = Nothing

5、 is impossible! ;Printf(%d/n,(1)(str)retum 0;int countStrs(char *p)int num=0, wordMark= 0;for(;(2);p+) If((3)=SPACE) wordMark= 0;elseif( !wordMark ) wordMark = 1;+numreturn(4) 【问题1】(4分)写出代码1运行后的输出结果。a1=3b1=7a2=3b2=7【问题2】(3分)写出代码2运行后的输出结果。 3【问题3】(8分)代码3的功能与代码2完全相同,请补充3中的空缺,将解答写入答题纸的对应栏内。1) CountStr2)

6、 *p3) *p4) num此题考查C语言程序设计能力,要求掌握形参与实参,值传递与引用传递的区别1、 本题考查函数中值传递与引用传递,在实参与形参传递过程中可以是值传递,值传递时,形参的改变不会影响实参,引用传递是地址的传递,实参将地址传递给形参时,形参的改变会影响实参的改变。在本题中的第一次输出a,b变量的值时,结果是直接输出,所以a1=3,b1=7,而在调用swap函数时,实参a,b传递的是值传递,在函数swap(int x,int y)中形参x,y也是值类型,在函数swap内部是交换两个变量的值,交换完毕后x=y,y=x,但这个改变不会影响实参a,b,所以第二次输出a2,b2时,a,b

7、的值不变还是3,7,所以输出结果是:a1=3 b1=7 a2=3 b2=72、 本题是计算出字符数组中有多少个单词,单词之间是以空格 为标识,即遇到空格时变量wordMark=0,程序中再判断wordMark是否等于0,若等于0,则变量workMark置为1,同时变量num是用于统计单词个数,此时num加1,最后输出num的值就是统计的单词个数。程序运行结果是3。3、 本题是将上面的功能通过调用函数来完成的。第1处就应该直接填写调用函数的函数名,即countStrs,调用者将数组名作为实参,数组名代表的是数组的首地址,所以这里是引用传递,函数countStrs的形参p是一个指针变量,它接收实参

8、str数组的首地址,这样实参与形参都是指针变量。在函数countStrs内部,定义两个局部变量num用于统计个数,WordMark用于标识空格,在for循环中,第2处应该设置终止条件,即*p,表示指针指向的内容不为空,第3处是判断当前的指向元素是否等于SPACE,即当前的*p是否是空格 ,如果是则将标识变量WordMark等于0,否则变量num自增,最后函数应该返回num的值,所以4处应该填num。答案是:1) countStrs 2) pi!=0或者是pi 3) pi 4) num试题三(共15分)阅读以下说明和代码,填补代码中的空缺,将解答填入答题纸的对应栏内。【说明】下面的程序利用快速排

9、序中划分的思想在整数序列中找出第k小的元素(即将元素从小到大排序后,取第k个元素)。对一个整数序列进行快速排序的方法是:在待排序的整数序列中取第一个数作为基准值,然后根据基准值进行划分,从而将待排序的序列划分为不大于基准值者(称为左子序列)和大于基准值者(称为右子序列),然后再对左子序列和右子序列分别进行快速排序,最终得到非递减的有序序列。例如,整数序列“19, 12, 30, 11,7,53, 78, 25的第3小元素为12。整数序列“19, 12,7,30, 11, 11,7,53. 78, 25, 7的第3小元素为7。函数partition(int a, int low,int high

10、)以alow的值为基准,对alow、alow+l、ahigh进行划分,最后将该基准值放入ai (lowihigh),并使得alow、alow+l、,、Ai-1都小于或等于ai,而ai+l、ai+2、ahigh都大于ai。函教findkthElem(int a,int startIdx,int endIdx,inr k)在astartIdx、astartIdx+1、.、aendIdx中找出第k小的元素。 【代码】#include #include Int partition(int a ,int low, int high)/对 alow.high进行划分,使得alow.i中的元素都不大于ai+

11、1.high中的元素。int pivot=alow; /pivot表示基准元素Int i=low,j=high;while((1))While(ipivot)-j;ai=ajWhile(ipivot)+i;aj=ai(2); /基准元素定位return i;Int findkthElem(int a,int startIdx,int endIdx, int k)/整数序列存储在astartldx.endldx中,查找并返回第k小的元素。if (startldx0 |endIdxendIdx | kendIdx |k-1startIdx)Return-1; /参数错误if(startIdxend

12、ldx)int loc=partition(a, startIdx, endldx); 进行划分,确定基准元素的位置if (loc=k-1) 找到第k小的元素 return (3) ;if(k-l loc) /继续在基准元素之前查找return findkthElem(a, (4) ,k);else 继续在基准元素之后查找return findkthElem(a, (5) ,k);return astartIdx;int main()int i, k;int n;int a = 19, 12, 7, 30, 11, 11, 7, 53, 78, 25, 7;n= sizeof(a)sizeof

13、(int) /计算序列中的元素个数for (k=1;kn+1;k+)for(i=0;in;i+)printf(“%d/t”,ai);printf(“n”);printf(“elem %d=%dn,k,findkthElem(a,0,n-1,k);/输出序列中第k小的元素return 0;1、!i=j或者ij2、ai=pivot3、aloc4、startIdx,loc-15、loc+1,endIdx 此题考查排序算法的应用,快速排序的思想是:通过一趟排序将待排序的记录划分为独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后利用递归再分别对这两部分记录继续进行排序,以达到整个序列

14、有序。一趟排序的具体做法是:设两个变量low和high,初值分别指向序列的第一个和最后一个,通常将第一个记录的关键字设为pivotkey,首先从high所指位置向前搜索,找到第一个关键字小于pivotkey的记录并互相交换,然后从low位置向后搜索,找到第一个大于pivotkey的记录并互相交换,重复这两步直到low=high为止。 本题是要找出第K个元素,要求将元素从小到大排序,然后取第K个元素。如数组中的元素是19,12,7,30,11,11,7,53,78,25,7,则第1,2,3个元素都是7,第4,5个元素是11,第6个元素是12,第11个元素是78,本题就是要找出前K个元素中第K个元

15、素,K是不断变化的,K的取值范围是从1到数组长度,第K个元素也是不断变化的。 Partition函数是找到基准元素的位置,根据快速排序算法,循环判断的条件是最小值和最大值不相等,即1处应该填i!=j或者i=pivot,则j-,直到遇到第一个pivotaj,则停止移动,将aj赋值给ai,同时依次比较数据的low与基准pivot的大小,如果ai=pivot,则i+,直到遇到第一个pivotai,则停止移动,将ai赋值给aj,直到i等于j,则完成一次快速排序,此时找到了基准元素的位置,将基准元素移到正确的位置,赋给ai,并返回i的值,作为函数partition的结果。 FindthElem函数是查找

16、并返回第k小的元素,它实际上是将原来应该在快速排序中递归完成的功能换成了FindthElem函数去完成,形参k用来接收partition函数中的i,第3处上面的if(loc=k-1)判断成立的时候表明此时找到了第k个的元素,所以直接返回数组第loc位置的元素,所以3处填aloc,第4处,第5处是当没有确定基准元素位置时,重复调用自己,重复调用时要判断k与loc的大小,小于loc时,表明要向前移动,大于loc时,要向后移动,所以处4处填startIdx,loc-1,第5处填loc+1,endIdx。答案是:1)i!=j或者ij 2)ai=pivot 3)aloc 4)startIdx,loc-1

17、 5)loc+1,endIdx,整个程序运行结果是:试题四阅读以下说明和代码,填补代码中的空缺,将解答填入答题纸的对应栏内。【说明】图是很多领域中的数据模型,遍历是图的一种基本运算。从图中某顶点v出发进行广度优先遍历的过程是:访问顶点v;访问V的所有未被访问的邻接顶点W1 ,W2 ,.,Wk;依次从这些邻接顶点W1 ,W2 ,.,Wk出发,访问其所有未被访问的邻接顶点;依此类推,直到图中所有访问过的顶点的邻接顶点都得到访问。显然,上述过程可以访问到从顶点V出发且有路径可达的所有顶点。对于从v出发不可达的顶点u,可从顶点u出发再次重复以上过程,直到图中所有顶点都被访问到。例如,对于图4-1所示的

18、有向图G,从a出发进行广度优先遍历,访问顶点的一种顺序为a、b、c、e、f、d。设图G采用数组表示法(即用邻接矩阵arcs存储),元素arcsij定义如下:图4-1的邻接矩阵如图4-2所示,顶点af对应的编号依次为05.因此,访问顶点a的邻接顶点的顺序为b,c,e。函数BFSTraverse(Graph G)利用队列实现图G的广度优先遍历。相关的符号和类型定义如下:#define MaxN:50 *图中最多顶点数*typedef int AdjMatrixMaxNMaxN;typedef structint vexnum,edgenum; *图中实际顶点数和边(弧)数*AdjMatrix ar

19、cs; *邻接矩阵*)Graph;typedef int QElemType;enum ERROR=0;OK=l;代码中用到的队列运算的函数原型如表4-1所述,队列类型名为QUEUE。表4-1 实现队列运算的函数原型及说明 【代码】int BFSTraverse(Graph G)/图G进行广度优先遍历,图采用邻接矩阵存储unsigned char*visited; /visited用于存储图G中各顶点的访问标志,0表示未访问int v,w;u;QUEUEQ Q;申请存储顶点访问标志的空间,成功时将所申请空间初始化为0visited=(char*)calloc(G.vexnum, sizeof(

20、char);If((1))retum ERROR;(2) ; /初始化Q为空队列for( v=0; vG.vexnum; v+)if(!visitedv) /从顶点v出发进行广度优先遍历printf(%d”,v); /访问顶点v并将其加入队列visitedv=l;(3) ;while(!isEmpty(Q)(4) ; /出队列并用u表示出队的元素for(v=0;vG.vexnum; w+)if(G.arcsuw!=0& (5) ) /w是u的邻接顶点且未访问过printf(%d”,w); /访问顶点wvisitedw=1;EnQueue(&Q, w);free(visited);return

21、OK;)/BFSTraverse1、visited=NULL2、InitQueue(&Q)3、EnQueue(&Q,v)4、DeQueue(&Q,&u)5、visitedw=0本题考查图的遍历问题,图的存储有邻接矩阵和邻接链表两种,图的遍历有深度遍历和广度遍历两种,广度遍历是尽可能进行横向搜索,即最先访问的顶点的邻接点也先被访问,为此需要引入队列来保存已访问过的顶点序列,即每当一个顶点被访问后,就将其放入队中,当队头顶点出队时,就访问其未被访问的邻接点并令这些邻接顶点入队。在广度优先遍历中,每个顶点至多进行一次队列。题目中已经提供队列的有关操作,如初始化队列,入队,出队等。程序中第1处应该填v

22、isited=NULL,表示分配内存函数calloc分配内存空间是否成功,如果失败,则程序返回0。第2处填InitQueue(&Q),表示初始化队列,函数InitQueue的形参是一个指针变量,接收一个指向QUEUE的变量,所以实参应该是一个地址,即&Q,第3处是顶点v入队,入队函数EnQueue有两个形参,一个是指针变量*Q,一个是元素qe,所以此处填EnQueue(&Q,v),第4处是出队,出队函数也有两个参数,一个是指向队列的指针变量*Q,另一个参数是int类型的指针变量*te,表示要通过参数te带回出队的元素,即知道是哪个元素出队了,所以实参在传递时应该使用引用传递,因此第4处填DeQ

23、ueue(&Q,&u),第5处是判断图Garcs中w顶点是否被访问过,visited数组是用于存储图G中各顶点的访问标志,0表示未访问,1表示已访问,此处是要判断w顶点是否被访问过,即visitedw是否等于0,所以第5处填visitedw=0,如果没有访问过,则将w顶点置为1,并入队。试题五阅读以下说明和Java程序,填补代码中的空缺,将解答填入答题纸的对应栏内。【说明】以下Java代码实现一个简单的聊天室系统(ChatRoomSystem),多个用户(User)可以向聊天室( ChatRoom)发送消息,聊天室将消息展示给所有用户。类图如图5-1所示。 【Java代码】class Chat

24、Room public static void showMessage(User user, Strmg message) System.out.println( + user.getName() + : + message);classUserprivate String name;public String getName() return name;public void setName(String name) this.name = name;public User(String name) (1) =name;public void sendMessage(String messa

25、ge) (2) (this, message);public class Chat:RoomSystem public void startup() User zhang= new User(John);User li =new User(Leo);zhang.sendMessage(Hi! Leo! );1i.sendMessage(Hi! John!);public void join(User user) (3) (Hello Everyone! I am + user.getName();public static void main(String args) ChatRoomSyst

26、em crs= (4) ;Crs.startup();Crs.join( (5) )(“Wayne”);/*程序运行结果:John:Hi! LeolLeo:Hi! John!Wayne】:Hello Everyone!Iam Wayne*/1、this.name2、ChatRoom.showMessage3、user.sendMessage4、new ChatRoomSystem()5、new User本题考查java程序基本知识,涉及到类的定义,方法调用及封装等。第1处填this.name,User类中定义了一个私有变量name,及两个属性getName,setName,一个构造方法User

27、(String name),因为构造方法中的参数名与变量同名,所以要加this区别,因此第1处填this.name,第2处定义了一个方法sendMessage,此处要调用ChatRoom类中的showMessage方法,传递两个参数,以实现某个人说了某句话,所以第2处填ChatRoom.showMessage,另外类ChatRoomSystem定义了方法join,传入一个User类型的用户变量user,此处必须调用User类中的sendMessage方法,第3处填user.sendMessage,第4处是实例化ChatRoomSystem类,并赋给变量crs,所以第4处填new ChatRoo

28、mSystem(),第5处是调用ChatRoomSystem类的join方法,要求传入一个User类型的变量,而User类有个构造方法,要求有初始值,所以第5处填写New User。试题六阅读下列说明和C+代码,填补代码中的空缺,将解答填入答题纸的对应栏内。【说明】以下C+代码实现一个简单的聊天室系统(ChatRoomSystem),多个用户(User)可以向聊天室(ChatRoom)发送消息,聊天室将消息展示给所有用户。类图如图6-1所表示。 【C+代码】#include#include using namespace std;class User private:string name;public:User(string name)(1) =name;User() void setName(string name) this-name=name;string getName()return name;void sendMessage(string message);class ChatRoom .public:static void showMessage(User* user, string message) coutgetName() : messageendl;void User:sendMessage(string message) (2) (

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1