上半年程序员考试真题及答案下午卷Word文档下载推荐.docx
《上半年程序员考试真题及答案下午卷Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《上半年程序员考试真题及答案下午卷Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
![上半年程序员考试真题及答案下午卷Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-11/22/9bd40707-b805-4058-a5e6-a68a19baa5e5/9bd40707-b805-4058-a5e6-a68a19baa5e51.gif)
试题二
阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
说明1】
递归函数is_elem(charch,char*set)
的功能是判断ch中的字符是否在set表示的
C代码1】
intis_elem(charch,char*set)
return0;
else
If(
(1))
return1;
returnis_elem(
(2))
函数char*combine(char*setA,char
*setB)的功能是将字符集合A(元素互异,由setA
表示)和字符集合B(元素互异,由setB表示)合并,并返回合并后的字符集合。
C代码2】
char*combine(char*setA,char*setB)
inti,lenA,lenB,lenClenA=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++)
setC[lenC++]=setB[i];
returnsetC;
lenC=lenA;
ch,*set-1
lenA
is_elem(setB[i],*setA)==0
setC[lenC+1]
If(set[0]==ch)//取出set第一个元素与ch字符比较是否相等
returnis_elem(ch,*set-1)
//从set第二个元素开始重新递归代入函数执行
returnsetC;
试题三
说明】
某文本文件中保存了若干个日期数据,格式如下(年/月/日)
2005/12/12013/2/291997/10/111980/5/15
但是其中有些日期是非法的,例如2013/2/29是非法日期,闰年(即能被400整除或者
能被4整除而不能被100整除的年份)的2月份有29天,2013年不是闰年。
现要求将其中自1985/1/1开始、至2010/12/31结束的合法日期挑选出来并输出。
面的C代码用于完成上述要求。
【c代码】
typedefstruct{
}DATE;
回0*/
return((y%4==0&
&
y%100!
=0)Il(y%400==0))
inty=date.year,m=date.month,d=date.day;
if(y<
1985IIy>
2010II
m<
1IIm>
12IId<
lIId>
31)return
0;
)return0;
if((m==4llm==6llm==9IIm==11)&
(1)
If(m==2){
if(isLeapYear(y)&
(2))return1
if(d28)return0
1,否则返回0*/
/*比较日期d1和d2,若d1在d2之前或相同则返回
Longt1,t2;
t1=d1.year*10000+d1.month*100+d1.day;
t2=d2.year*10000+d2.month*100+d2.day;
if((3))return1;
elsereturn0;
int
main()
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))/*
printf(
fclose(fp);
Return0;
d>
30/d==31
调用Lteq判断是否在起至日期之间*/
%d%d%dn”,date.year,date.month,date.day);
或其等价表示
d<
29或其等价表示
t1<
=t2/t1-t2<
=0或其等价表示
fp==null/!
fp或其等价表示
isLegal(date)或其等价表示
Lteq(start,date)==1Lteq(date,end)==1
if((m==4llm==6llm==9IIm==11)&
d>
30/d==31)return0;
//如果月份是4,6,9,11并且天数等于31则返回不合法,这几个月最多为30天,不可能等于31。
if(isLeapYear(y)&
d<
29)return1;
if(d>
28)return0;
//当年份为闰年的时候,那么二月份的天数需小于或等于28。
合法则返回1。
(3)if(t1<
=0)期经换算成t1、t2后,t1<
=t2。
(4)If(fp==null/!
fp)//
(5)(6)理解:
if(isLegal(date))
continue
2)理解:
//d1
在d2之前,那么表明日
/*
先要判断文件是否为空;
判断是否为非法日期*/
if(Lteq(start,date)==1&
Lteq(date,end)==1)/*调用Lteq判断是否在起至日期之间,Lteq(t1,t2)的含义是比较日期d1和d2,若d1在d2之前或相同则返回1,否则返回0。
*/
试题四
阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
二叉查找树又称为二叉排序树,它或者是一棵空树,或者是具有如下性质的二叉树。
(1)若它的左子树非空,则左子树上所有结点的值均小于根结点的值。
(2)若它的右子树非空,则右子树上所有结点的值均大于根结点的值。
(3)左、右子树本身就是两棵二叉查找树。
二叉查找树是通过依次输入数据元素并把它们插入到二叉树的适当位置上构造起来的,具体的过程是:
每读入一个元素,建立一个新结点,若二叉查找树非空,则将新结点的值与根结点的值相比较,如果小于根结点的值,则插入到左子树中,否则插入到右子树中;
叉查找树为空,则新结点作为二叉查找树的根结点。
设二叉查找树采用二叉链表存储,结点类型定义如下:
typedefintKeyType
typedefstructBSTNode{
KeyTypekey;
structBSTNode*left,*right
}BSTNode,*BSTree;
root
left
46
L
25I.
A
541X
Z
\
J3(a
11a|
291A1
1a|
911A1
功能是将关键码kword插入
函数intInsertBST(BSTree*rootptr,KeyTypekword)
到由rootptr指示出根结点的二叉查找树中,若插入成功,
函数返回
1,否则返回0。
【C代码】
intInsertBST(BSTree*rootptr
,KeyTypekword)
/*在二叉查找树中插入一个键值为kword的结点,若插入成功返回1,否则返回0;
*rootptr为二叉查找树根结点的指针
*/
BSTreepfather;
(1)/*将father
初始化为空指针*/
p=*rootptr;
/*p
while(P&
(2)){
father=p;
指示二叉查找树的根节点*/
/*在二叉查找树中查找键值kword的结点*/
if(kword<
p->
key)
p=p->
left
right
if((3))return0;
/*
二叉查找树中已包含键值kword,插入失败*/
p=(BSTree)malloc((4));
创建新结点用来保存键值kword*/
p->
key=kword;
left=NULL;
right=NULL;
If(!
father)
(5)=p;
/*二叉查找树为空树时新结点作为树根插入*/
father->
return1;
}/*InsertBST*/father=(void*)0keyword!
=p-keysizeof(BSTNode)*rootptrfather-left=pfather-right=p
试题五
阅读以下说明和Java代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
【说明】以下Java代码实现两类交通工具(Flight和Train)的简单订票处理,类Vehicle、Flight、Train之间的关系如图5-1所示。
VehWe
图5-1
[Java代码】importjava.util.ArrayList;
importjava.util.List;
if(getTicketO()>
=n){
decreaseTicket(n);
}else{
};
classFlight
(1){
Private
(2)tickets=216;
//Flight的票数
IntgetTicket(){
Returntickets
tickets=tickets-n
classTrain(3){
intgetTicket(){
returntickets;
tickets=tickets-n;
publicstaticvoidmain(String[]args){
System.out.println(“欢迎订票!
"
);
ArrayListVehiclev=newArrayListVehicle();
v.add(newFlight());
v.add(newTrain());
for(inti=0;
iv.size();
i++){
5)(i+1);
//订i+1张票
System.out.println(“剩余票数:
”+v.get(i).getTicket())
运行该程序时输出如下:
欢迎订票!
剩余票数:
7)
8)
extends
Vehicle
v.get(i).book
213
2012
2011
试题六
阅读下列说明和C++弋码,填补代码中的空缺,将解答填入答题纸的对应栏内。
以下C++代码实现两类交通工具(Flight和Train)的简单订票处理,类Vehicle、Flight、
Train之间的关系如图6-1所示。
图6-1
【C++代码】
usingnamespacestd;
classVehicle{
public:
virtual~Vehicle(){}if(getTicket()>
=n){
decreaseTicket(n);
}else{
coutn"
余票不足!
!
”
virtualintgetTicket()=0;
virtualvoid
decreaseTicket(int)=0
};
ClassFlight:
1){
private:
2)tickets;
//Flight的票数
public:
intgetTicket();
intTrain:
:
tickets
=2016;
//初始化Train的票数为2016
intFlight:
tickets=
216;
//
初始化Flight的票数为216
intTrain:
:
getTicket(){return
tickets;
}
voidTrain:
decreaseTicket(int
n){tickets=tickets-n;
}
getTicket(){returntickets;
voidFlight:
decreaseTicket(intn){
tickets=tickets-n;
intmain(){
v.push_back(newFlight());
v.push_back(newTrain());
v;
push_back(newFlight());
v.push_back(newTram());
cout《”欢迎订票!
”《endl:
for(inti=0;
i<
v.size();
i++){
cout《“剩余票数:
”<
<
(*V[i]).getTicket()<
endl;
for(vector<
Vehicle*>
:
iteratorit=v.begin();
it!
=v.end();
it
++){
if(NULL!
=*it){
delete*it;
*it=NULL;
v.clear();
Return0;
运行该程序时输出如下:
剩余票数:
(8)publicVehicleintpublicVehicleint(*v[i]).book();
21320122011