最新程序员考试真题及答案下午卷.docx
- 文档编号:6088165
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:15
- 大小:271.25KB
最新程序员考试真题及答案下午卷.docx
《最新程序员考试真题及答案下午卷.docx》由会员分享,可在线阅读,更多相关《最新程序员考试真题及答案下午卷.docx(15页珍藏版)》请在冰豆网上搜索。
最新程序员考试真题及答案下午卷
2016上半年程序员考试真题及答案-下午卷
试题一
阅读以下说明和流程图,填补流程图和问题中的空缺
(1)~(5),将解答填入答题纸的对应栏内。
【说明】
设整型数组A[1:
N]每个元素的值都是1到N之间的正整数。
一般来说,其中会有一些元素的值是重复的,也有些数未出现在数组中。
下面流程图的功能是查缺查重,即找出A[1:
N]中所有缺的或重复的整数,并计算其出现的次数〔出现次数为0时表示缺〕。
流程图中采纳的算法思想是将数组A的下标与值看作是整数集[1:
N]加上的一个映射,并用数组C[1:
N]记录各整数出现的次数,需输出所有缺少的或重复的数及其出现的次数。
【流程图】
【问题】
如果数组A[1:
5]的元素分别为{3,2,5,5,1},那么算法流程完毕后输出结果为:
(5)输出格式为:
缺少或重复的元素,次数〔0表示缺少〕
参考答案:
(1)A[i]
(2)C[k]+1
(3)0
(4)k
和C[k]
(5)4,{1,1,1,0,2}
试题分析:
(1)A[i]
//A[i]赋给K,
(2)C[k]+1//C[k]值加1,i循环中,将A{i}中存在的值在C[k]中相应位数上加1。
以A[1:
5]={3,2,5,5,1}为例,当i=1时,k=A[1]=3,那么C[3]+1,即C[1:
5]变成{0,0,1,0,0}。
(3)0
//推断C[k]值是否为0,为零这说明k未缺少值
(4)k
和C[k]
//k位重复数,C[k]为重复次数
(5)在范例中,4没有出现,1、2、3分别出现了1次,5出现了两次。
试题二
阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
【说明1】
递归函数is_elem(charch,char*set)的功能是推断ch中的字符是否在set表示的字符集合中,假设是,那么返回1,否那么返回0。
【C代码1】
intis_elem(charch,char*set)
{
If(*set==‘\0’)
return0;
else
If(
(1))
return1;
else
returnis_elem(
(2))
}
【说明2】
函数char*combine(char*setA,char*setB)的功能是将字符集合A〔元素互异,由setA表示〕和字符集合B〔元素互异,由setB表示〕合并,并返回合并后的字符集合。
【C代码2】
char*combine(char*setA,char*setB)
{
inti,lenA,lenB,lenC;
lenA=strlen(setA);
lenB=strlen(setB);
char*setC=(char*)malloc(lenA+lenB+1);
if(!
setC)
returnNULL;
strncpy(setC,setA,lenA);//将setA的前lenA个字符复制后存入setC
lenC=(3);
for(i=0;i<lenB;i++)
if((4))//调用is_elem推断字符是否在setA中
setC[lenC++]=setB[i];
(5)=‘/0’;//设置合并后字符集的结尾标识
returnsetC;
}
参考答案:
〔1〕set[0]==ch
〔2〕ch,*set-1
〔3〕lenA
〔4〕is_elem(setB[i],*setA)==0
〔5〕setC[lenC+1]
试题分析:
If(set[0]==ch)//取出set第一个元素与ch字符比拟是否相等
returnis_elem(ch,*set-1)//从set第二个元素开场重新递归代入函数执行
strncpy(setC,setA,lenA);//将setA的前lenA个字符复制后存入setC
lenC=lenA;
for(i=0;i<lenB;i++)
ifis_elem(setB[i],*setA)==0)//调用is_elem推断字符是否在setA中
setC[lenC++]=setB[i];
setC[lenC+1]=‘/0’;//设置合并后字符集的结尾标识
returnsetC;
试题三
阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
【说明】
某文本文件中保存了假设干个日期数据,格式如下〔年/月/日〕:
2005/12/1
2013/2/29
1997/10/11
1980/5/15
....
但是其中有些日期是非法的,例如2013/2/29是非法日期,闰年〔即能被400整除或者能被4整除而不能被100整除的年份〕的2月份有29天,2013年不是闰年。
现要求将其中自1985/1/1开场、至2010/12/31完毕的合法日期挑选出来并输出。
下面的C代码用于完成上述要求。
【C代码】
#include
typedefstruct{
intyear,month,day;/*年,月,日*/
}DATE;
intisLeapYear(inty)/*推断y表示的年份是否为闰年,是那么返回1,否那么返回0*/
{
return((y%4==0&&y%100!
=0)Il(y%400==0));
}
intisLegal(DATEdate)/*推断date表示的日期是否合法,是那么返回1,否那么返回0*/
{
inty=date.year,m=date.month,d=date.day;
if(y<1985IIy>2010IIm<1IIm>12IId
if((m==4llm==6llm==9IIm==11)&&
(1))return0;
If(m==2){
if(isLeapYear(y)&&
(2))return1;
else
if(d28)return0;
}
return1;
}
IntLteq(DATEd1,DATEd2)
/*比拟日期d1和d2,假设d1在d2之前或一样那么返回1,否那么返回0*/
{
Longt1,t2;
t1=d1.year*10000+d1.month*100+d1.day;
t2=d2.year*10000+d2.month*100+d2.day;
if((3))return1;
elsereturn0;
}
intmain()
{
DATEdate,start={1985,1,1},end={2010,12,30};
FILE*fp;
fp=fopen(“d.txt〞,〞r〞);
If((4))
return-1;
while(!
feof(fp)){
if(fscanf(fp,〞%d%d%d〞,date.year,date.month,date.day)!
=3)
break;
if((5))/*推断是否为非法日期*/
continue;
if((6))/*调用Lteq推断是否在起至日期之间*/
printf(“%d%d%d\n〞,date.year,date.month,date.day);
}
fclose(fp);
Return0;
}
参考答案:
〔1〕d>30/d==31或其等价表示
〔2〕d<29或其等价表示
〔3〕t1<=t2/t1-t2<=0或其等价表示
〔4〕fp==null/!
fp或其等价表示
〔5〕isLegal(date)或其等价表示
〔6〕Lteq(start,date)==1Lteq(date,end)==1或其等价表示
试题分析:
〔1〕〔2〕理解:
if((m==4llm==6llm==9IIm==11)&&d>30/d==31)return0;//如果月份是4,6,9,11并且天数等于31那么返回不合法,这几个月最多为30天,不可能等于31。
If(m==2){
if(isLeapYear(y)&&d<29)return1;
else
if(d>28)return0;//当年份为闰年的时候,那么二月份的天数需小于或等于28。
合法那么返回1。
〔3〕if(t1<=t2/t1-t2<=0)return1;//d1在d2之前,那么说明日期经换算成t1、t2后,t1<=t2。
〔4〕If(fp==null/!
fp)//先要推断文件是否为空;
〔5〕〔6〕理解:
if(isLegal(date))/*推断是否为非法日期*/
continue;
if(Lteq(start,date)==1&&Lteq(date,end)==1)/*调用Lteq推断是否在起至日期之间,Lteq〔t1,t2〕的含义是比拟日期d1和d2,假设d1在d2之前或一样那么返回1,否那么返回0。
*/
试题四
阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
【说明】
二叉查找树又称为二叉排序树,它或者是一棵空树,或者是具有如下性质的二叉树。
〔1〕假设它的左子树非空,那么左子树上所有结点的值均小于根结点的值。
〔2〕假设它的右子树非空,那么右子树上所有结点的值均大于根结点的值。
〔3〕左、右子树本身就是两棵二叉查找树。
二叉查找树是通过依次输入数据元素并把它们插入到二叉树的适当位置上构造起来的,具体的过程是:
每读入一个元素,建立一个新结点,假设二叉查找树非空,那么将新结点的值与根结点的值相比拟,如果小于根结点的值,那么插入到左子树中,否那么插入到右子树中;假设二叉查找树为空,那么新结点作为二叉查找树的根结点。
根据关键码序列{46,25,54,13,29,91}构造一个二叉查找树的过程如图4-1所示。
设二叉查找树采纳二叉链表存储,结点类型定义如下:
typedefintKeyType;
typedefstructBSTNode{
KeyTypekey;
structBSTNode*left,*right;
}BSTNode,*BSTree;
图4-1(g)所示二叉查找树的二叉链表表示如图4-2所示。
函数intInsertBST(BSTree*rootptr,KeyTypekword)功能是将关键码kword插入到由rootptr指示出根结点的二叉查找树中,假设插入成功,函数返回1,否那么返回0。
【C代码】
intlnsertBST(BSTree*rootptr,KeyTypekword)
/*在二叉查找树中插入一个键值为kword的结点,假设插入成功返回1,否那么返回0;
*rootptr为二叉查找树根结点的指针
*/
{
BSTreep,father;
(1)/*将father初始化为空指针*/
p=*rootptr;/*p指示二叉查找树的根节点*/
while(p&&〔2〕){/*在二叉查找树中查找键值kword的结点*/
father=p;
if(kword<p->key)
p=p->left;
else
p=p->right;
}
if((3))return0;/*二叉查找树中已包含键值kword,插入失败*/
p=(BSTree)malloc((4));/*创立新结点用来保存键值kword*/
If(!
p)return0;/*创立新结点失败*/
p->key=kword;
p->left=NULL;
p->right=NULL;
If(!
father)
(5)=p;/*二叉查找树为空树时新结点作为树根插入*/
else
if(kword<father->key)
(6);/*作为左孩子结点插入*/
else
(7);/*作右孩子结点插入*/
return1;
}/*InsertBST*/
father=(void*)0
keyword!
=p-key
p
sizeof(BSTNode)
*rootptr
father-left=p
father-right=p
试题五
阅读以下说明和Java代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
【说明】
以下Java代码实现两类交通工具〔Flight和Train〕的简单订票处理,
类Vehicle、Flight、Train之间的关系如图5-1所示。
图5-1
【Java代码】
importjava.util.ArrayList;
importjava.util.List;
abstractclassVehicle{
voidbook(intn){//订n张票
if(getTicket0()>=n){
decreaseTicket(n);
}else{
System.out.println(“余票缺乏!
!
“);
}
}
abstractintgetTicket();
abstractvoiddecreaseTicket(intn);
};
classFlight〔1〕{
Private〔2〕tickets=216;//Flight的票数
IntgetTicket(){
Returntickets;
}
voiddecreaseTicket(intn){
tickets=tickets-n;
}
}
classTrain〔3〕{
Private〔4〕tickets=2016;//Train的票数
intgetTicket(){
returntickets;
}
voiddecreaseticket(intn){
tickets=tickets-n;
}
}
publicclassTest{
publicstaticvoidmain(String[]args){
System.out.println〔“欢送订票!
");
ArrayListVehiclev=newArrayListVehicle();
v.add(newFlight());
v.add(newTrain());
v.add(newFlight());
v.add(newTrain());
v.add(newTrain());
for(inti=0;iv.size();i++){
〔5〕〔i+1〕;//订i+1张票
System.out.println〔“剩余票数:
〞+v.get(i).getTicket());
}
}
}
运行该程序时输出如下:
欢送订票!
剩余票数:
215
剩余票数:
2014
剩余票数:
〔6〕
剩余票数:
〔7〕
剩余票数:
〔8〕
extendsVehicle
int
extendsVehicle
int
v.get(i).book
213
2012
2011
试题六
阅读以下说明和C++代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
【说明】
以下C++代码实现两类交通工具〔Flight和Train〕的简单订票处理,类Vehicle、Flight、Train之间的关系如图6-1所示。
图6-1
【C++代码】
#include
#include
usingnamespacestd;
classVehicle{
public:
virtual~Vehicle(){}
voidbook(intn){//订n张票
if(getTicket()>=n){
decreaseTicket(n);
}else{
coutn“余票缺乏!
!
〞;
}
}
virtualintgetTicket()=0;
virtualvoiddecreaseTicket(int)=0;
};
ClassFlight:
〔1〕{
private:
〔2〕tickets;//Flight的票数
public:
intgetTicket();
voiddecreaseTicket(int);
};
classTrain:
〔3〕{
private:
〔4〕tickets;//Train的票数
public:
intgetTicket();
voiddecreaseTicket(int);
};
intTrain:
:
tickets=2016;//初始化Train的票数为2016
intFlight:
:
tickets=216;//初始化Flight的票数为216
intTrain:
:
getTicket(){returntickets;}
voidTrain:
:
decreaseTicket(intn){tickets=tickets-n;}
intFlight:
:
getTicket(){returntickets;}
voidFlight:
:
decreaseTicket(intn){tickets=tickets-n;}
intmain(){
vector
v.push_back(newFlight());
v.push_back(newTrain());
v;push_back(newFlight());
v.push_back(newTram());
v.push_back(newTrain());
cout<<"欢送订票!
〞< for(inti=0;i 〔5〕(i+1);//订i+l张票 cout<<“剩余票数: 〞<<〔*V[i]〕.getTicket()< } for(vector : iteratorit=v.begin();it! =v.end();it++){ if(NULL! =*it){ delete*it; *it=NULL; } } v.clear(); Return0; } 运行该程序时输出如下: 欢送订票! 剩余票数: 215 剩余票数: 2014 剩余票数: 〔6〕 剩余票数: 〔7〕 剩余票数: 〔8〕 publicVehicle int publicVehicle int (*v[i]).book(); 213 2012 2011
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 程序员 考试 答案 下午