下半年程序员考试真题及答案下午卷Word文档格式.docx
- 文档编号:20603777
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:17
- 大小:162.83KB
下半年程序员考试真题及答案下午卷Word文档格式.docx
《下半年程序员考试真题及答案下午卷Word文档格式.docx》由会员分享,可在线阅读,更多相关《下半年程序员考试真题及答案下午卷Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
inttmp=x;
x=y;
y=tmp;
}
intmaim()
inta=3,b=7;
printf("
a1=%db1=%d\n"
a,b);
Swap(a,b);
Printf("
a2=%db2=%d\n”,a,b);
return0;
【代码2】
stdio.h>
#defineSPACE¨
//空格字符
Intmain()
{
charstr[128]=”Nothingisimpossible!
“;
inti,num=0,wordMark=0;
for(i=0;
str[i];
i++)
If(str[i]=SPACE)
WordMark=0;
else
If(wordMark=0){
wordMark=1;
Mun++;
Printf(“%d/n”,num)
retun0;
【代码3】
#defineSPACE“//空格字符
intcountStrs(char*);
intmain()
charstr[128]="
Nothingisimpossible!
"
;
Printf(‘%d/n,
(1)(str))
retum0;
intcountStrs(char*p)
intnum=0,wordMark=0;
for(;
(2);
p++){
If((3)=SPACE)
wordMark=0;
if(!
wordMark){
wordMark=1;
++num
return(4)
【问题1】
(4分)
写出代码1运行后的输出结果。
a1=3
b1=7
a2=3
b2=7
【问题2】
(3分)
写出代码2运行后的输出结果。
3
【问题3】
(8分)
代码3的功能与代码2完全相同,请补充3中的空缺,将解答写入答题纸的对应栏内。
1)CountStr
2)*p
3)*p
4)num
此题考查C语言程序设计能力,要求掌握形参与实参,值传递与引用传递的区别
1、本题考查函数中值传递与引用传递,在实参与形参传递过程中可以是值传递,值传递时,形参的改变不会影响实参,引用传递是地址的传递,实参将地址传递给形参时,形参的改变会影响实参的改变。
在本题中的第一次输出a,b变量的值时,结果是直接输出,所以a1=3,b1=7,而在调用swap函数时,实参a,b传递的是值传递,在函数swap(intx,inty)中形参x,y也是值类型,在函数swap内部是交换两个变量的值,交换完毕后x=y,y=x,但这个改变不会影响实参a,b,所以第二次输出a2,b2时,a,b的值不变还是3,7,所以输出结果是:
a1=3b1=7a2=3b2=7
2、本题是计算出字符数组中有多少个单词,单词之间是以空格’‘为标识,即遇到空格时变量wordMark=0,程序中再判断wordMark是否等于0,若等于0,则变量workMark置为1,同时变量num是用于统计单词个数,此时num加1,最后输出num的值就是统计的单词个数。
程序运行结果是3。
3、本题是将上面的功能通过调用函数来完成的。
第1处就应该直接填写调用函数的函数名,即countStrs,调用者将数组名作为实参,数组名代表的是数组的首地址,所以这里是引用传递,函数countStrs的形参p是一个指针变量,它接收实参str数组的首地址,这样实参与形参都是指针变量。
在函数countStrs内部,定义两个局部变量num用于统计个数,WordMark用于标识空格,在for循环中,第2处应该设置终止条件,即*p,表示指针指向的内容不为空,第3处是判断当前的指向元素是否等于SPACE,即当前的*p是否是空格’‘,如果是则将标识变量WordMark等于0,否则变量num自增,最后函数应该返回num的值,所以4处应该填num。
答案是:
1)countStrs2)p[i]!
='
\0'
或者是p[i]3)p[i]4)num
试题三(共15分)
阅读以下说明和代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
下面的程序利用快速排序中划分的思想在整数序列中找出第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(inta[],intlow,inthigh)以a[low]的值为基准,对a[low]、a[low+l]、…、
a[high]进行划分,最后将该基准值放入a[i](low≤i≤high),并使得a[low]、a[low+l]、,..、
A[i-1]都小于或等于a[i],而a[i+l]、a[i+2]、..、a[high]都大于a[i]。
函教findkthElem(inta[],intstartIdx,intendIdx,inrk)在a[startIdx]、a[startIdx+1]、...、a[endIdx]中找出第k小的元素。
【代码】
#include<
stdlib.h>
Intpartition(inta[],intlow,inthigh)
{//对a[low..high]进行划分,使得a[low..i]中的元素都不大于a[i+1..high]中的元素。
intpivot=a[low];
//pivot表示基准元素
Inti=low,j=high;
while(
(1)){
While(i<
j&
&
a[j]>
pivot)--j;
a[i]=a[j]
a[i]>
pivot)++i;
a[j]=a[i]
//基准元素定位
returni;
IntfindkthElem(inta[],intstartIdx,intendIdx,intk)
{//整数序列存储在a[startldx..endldx]中,查找并返回第k小的元素。
if(startldx<
0||endIdx<
0||startIdx>
endIdx||k<
1||k-l>
endIdx||k-1<
startIdx)
Return-1;
//参数错误
if(startIdx<
endldx){
intloc=partition(a,startIdx,endldx);
∥进行划分,确定基准元素的位置
if(loc==k-1)∥找到第k小的元素
return(3);
if(k-l<
loc)//继续在基准元素之前查找
returnfindkthElem(a,(4),k);
else//继续在基准元素之后查找
returnfindkthElem(a,(5),k);
returna[startIdx];
inti,k;
intn;
inta[]={19,12,7,30,11,11,7,53,78,25,7};
n=sizeof(a)/sizeof(int)//计算序列中的元素个数
for(k=1;
k<n+1;
k++){
i<n;
i++){
printf(“%d/t”,a[i]);
printf(“\n”);
printf(“elem%d=%d\n,k,findkthElem(a,0,n-1,k));
//输出序列中第k小的元素
return0;
1、!
i=j或者i<
j
2、a[i]=pivot
3、a[loc]
4、startIdx,loc-1
5、loc+1,endIdx
此题考查排序算法的应用,快速排序的思想是:
通过一趟排序将待排序的记录划分为独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后利用递归再分别对这两部分记录继续进行排序,以达到整个序列有序。
一趟排序的具体做法是:
设两个变量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个元素,K是不断变化的,K的取值范围是从1到数组长度,第K个元素也是不断变化的。
Partition函数是找到基准元素的位置,根据快速排序算法,循环判断的条件是最小值和最大值不相等,即1处应该填i!
=j或者i<
j,当开始位置和结束位置不相等时则从数组的两端分别向中间扫描。
扫描的方法是:
依次比较数组的high与基准pivot的大小,如果a[j]>
=pivot,则j--,直到遇到第一个pivot>
a[j],则停止移动,将a[j]赋值给a[i],同时依次比较数据的low与基准pivot的大小,如果a[i]<
=pivot,则i++,直到遇到第一个pivot<
a[i],则停止移动,将a[i]赋值给a[j],直到i等于j,则完成一次快速排序,此时找到了基准元素的位置,将基准元素移到正确的位置,赋给a[i],并返回i的值,作为函数partition的结果。
FindthElem函数是查找并返回第k小的元素,它实际上是将原来应该在快速排序中递归完成的功能换成了FindthElem函数去完成,形参k用来接收partition函数中的i,第3处上面的if(loc==k-1)判断成立的时候表明此时找到了第k个的元素,所以直接返回数组第loc位置的元素,所以3处填a[loc],第4处,第5处是当没有确定基准元素位置时,重复调用自己,重复调用时要判断k与loc的大小,小于loc时,表明要向前移动,大于loc时,要向后移动,所以处4处填startIdx,loc-1,第5处填loc+1,endIdx。
1)i!
j2)a[i]=pivot3)a[loc]4)startIdx,loc-15)loc+1,endIdx,整个程序运行结果是:
试题四
图是很多领域中的数据模型,遍历是图的一种基本运算。
从图中某顶点v出发进行广度优先遍历的过程是:
①访问顶点v;
②访问V的所有未被访问的邻接顶点W1,W2,..,Wk;
③依次从这些邻接顶点W1,W2,..,Wk出发,访问其所有未被访问的邻接顶点;
依此类推,直到图中所有访问过的顶点的邻接顶点都得到访问。
显然,上述过程可以访问到从顶点V出发且有路径可达的所有顶点。
对于从v出发不可达的顶点u,可从顶点u出发再次重复以上过程,直到图中所有顶点都被访问到。
例如,对于图4-1所示的有向图G,从a出发进行广度优先遍历,访问顶点的一种顺序为a、b、c、e、f、d。
设图G采用数组表示法(即用邻接矩阵arcs存储),元素arcs[i][j]定义如下:
图4-1的邻接矩阵如图4-2所示,顶点a~f对应的编号依次为0~5.因此,访问顶点a的邻接顶点的顺序为b,c,e。
函数BFSTraverse(GraphG)利用队列实现图G的广度优先遍历。
相关的符号和类型定义如下:
#defineMaxN:
50/*图中最多顶点数*/
typedefintAdjMatrix[MaxN][MaxN];
typedefstruct{
intvexnum,edgenum;
/*图中实际顶点数和边(弧)数*/
AdjMatrixarcs;
/*邻接矩阵*/
)Graph;
typedefintQElemType;
enum{ERROR=0;
OK=l};
代码中用到的队列运算的函数原型如表4-1所述,队列类型名为QUEUE。
表4-1实现队列运算的函数原型及说明
intBFSTraverse(GraphG)
{//图G进行广度优先遍历,图采用邻接矩阵存储
unsignedchar*visited;
//visited[]用于存储图G中各顶点的访问标志,0表示未访问
intv,w;
u;
QUEUEQQ;
∥申请存储顶点访问标志的空间,成功时将所申请空间初始化为0
visited=(char*)calloc(G.vexnum,sizeof(char));
If(
(1))
retumERROR;
(2);
//初始化Q为空队列
for(v=0;
v<
G.vexnum;
v++){
if(!
visited[v]){//从顶点v出发进行广度优先遍历
%d”,v);
//访问顶点v并将其加入队列
visited[v]=l;
(3);
while(!
isEmpty(Q)){
(4);
//出队列并用u表示出队的元素
for(v=0;
v<
w++){
if(G.arcs[u][w]!
=0&
(5)){//w是u的邻接顶点且未访问过
%d”,w);
//访问顶点w
visited[w]=1;
EnQueue(&
Q,w);
free(visited);
returnOK;
)//BFSTraverse
1、visited==NULL
2、InitQueue(&
Q)
3、EnQueue(&
Q,v)
4、DeQueue(&
Q,&
u)
5、visited[w]==0
本题考查图的遍历问题,图的存储有邻接矩阵和邻接链表两种,图的遍历有深度遍历和广度遍历两种,广度遍历是尽可能进行横向搜索,即最先访问的顶点的邻接点也先被访问,为此需要引入队列来保存已访问过的顶点序列,即每当一个顶点被访问后,就将其放入队中,当队头顶点出队时,就访问其未被访问的邻接点并令这些邻接顶点入队。
在广度优先遍历中,每个顶点至多进行一次队列。
题目中已经提供队列的有关操作,如初始化队列,入队,出队等。
程序中第1处应该填visited==NULL,表示分配内存函数calloc分配内存空间是否成功,如果失败,则程序返回0。
第2处填InitQueue(&
Q),表示初始化队列,函数InitQueue的形参是一个指针变量,接收一个指向QUEUE的变量,所以实参应该是一个地址,即&
Q,第3处是顶点v入队,入队函数EnQueue有两个形参,一个是指针变量*Q,一个是元素qe,所以此处填EnQueue(&
Q,v),第4处是出队,出队函数也有两个参数,一个是指向队列的指针变量*Q,另一个参数是int类型的指针变量*te,表示要通过参数te带回出队的元素,即知道是哪个元素出队了,所以实参在传递时应该使用引用传递,因此第4处填DeQueue(&
u),第5处是判断图Garcs中w顶点是否被访问过,visited[]数组是用于存储图G中各顶点的访问标志,0表示未访问,1表示已访问,此处是要判断w顶点是否被访问过,即visited[w]是否等于0,所以第5处填visited[w]==0,如果没有访问过,则将w顶点置为1,并入队。
试题五
阅读以下说明和Java程序,填补代码中的空缺,将解答填入答题纸的对应栏内。
以下Java代码实现一个简单的聊天室系统(ChatRoomSystem),多个用户(User)可以向聊天室(ChatRoom)发送消息,聊天室将消息展示给所有用户。
类图如图5-1所示。
【Java代码】
classChatRoom{
publicstaticvoidshowMessage(Useruser,Strmgmessage){
System.out.println("
["
+user.getName()+"
]:
+message);
classUser{
privateStringname;
publicStringgetName(){
returnname;
publicvoidsetName(Stringname){
this.name=name;
publicUser(Stringname){
(1)=name;
publicvoidsendMessage(Stringmessage){
(2)(this,message);
publicclassChat:
RoomSystem{
publicvoidstartup(){
Userzhang=newUser("
John"
);
Userli=newUser("
Leo"
zhang.sendMessage("
Hi!
Leo!
1i.sendMessage("
John!
"
publicvoidjoin(Useruser){
(3)("
HelloEveryone!
Iam"
+user.getName());
publicstaticvoidmain(String[]args){
ChatRoomSystemcrs=(4);
Crs.startup();
Crs.join((5))(“Wayne”));
/*
程序运行结果:
[John]:
Leol
[Leo]:
[Wayne】:
IamWayne
*/
1、this.name
2、ChatRoom.showMessage
3、user.sendMessage
4、newChatRoomSystem()
5、newUser
本题考查java程序基本知识,涉及到类的定义,方法调用及封装等。
第1处填this.name,User类中定义了一个私有变量name,及两个属性getName,setName,
一个构造方法User(Stringname),因为构造方法中的参数名与变量同名,所以要加this区别,因此第1处填this.name,第2处定义了一个方法sendMessage,此处要调用ChatRoom类中的showMessage方法,传递两个参数,以实现某个人说了某句话,所以第2处填ChatRoom.showMessage,另外类ChatRoomSystem定义了方法join,传入一个User类型的用户变量user,此处必须调用User类中的sendMessage方法,第3处填user.sendMessage,第4处是实例化ChatRoomSystem类,并赋给变量crs,所以第4处填newChatRoomSystem(),第5处是调用ChatRoomSystem类的join方法,要求传入一个User类型的变量,而User类有个构造方法,要求有初始值,所以第5处填写NewUser。
试题六
阅读下列说明和C++代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
以下C++代码实现一个简单的聊天室系统(ChatRoomSystem),多个用户(User)可以向聊天室(ChatRoom)发送消息,聊天室将消息展示给所有用户。
类图如图6-1所表示。
【C++代码】
iostream>
string>
usingnamespacestd;
classUser{
private:
stringname;
public:
User(stringname){
~User(){}
voidsetName(stringname){
this->
name=name;
stringgetName(){
voidsendMessage(stringmessage);
};
classChatRoom{.
staticvoidshowMessage(User*user,stringmessage){
cout<
<
user->
getName()"
message<
endl;
voidUser:
:
sendMessage(stringmessage){
(2)(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 下半年 程序员 考试 答案 下午
![提示](https://static.bdocx.com/images/bang_tan.gif)