最新程序员考试真题及答案下午卷Word格式.docx
《最新程序员考试真题及答案下午卷Word格式.docx》由会员分享,可在线阅读,更多相关《最新程序员考试真题及答案下午卷Word格式.docx(15页珍藏版)》请在冰豆网上搜索。
递归函数is_elem(charch,char*set)的功能是推断ch中的字符是否在set表示的字符集合中,假设是,那么返回1,否那么返回0。
【C代码1】
intis_elem(charch,char*set)
{
If(*set==‘\0’)
return0;
else
If(
(1))
return1;
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第二个元素开场重新递归代入函数执行
lenC=lenA;
ifis_elem(setB[i],*setA)==0)//调用is_elem推断字符是否在setA中
setC[lenC++]=setB[i];
setC[lenC+1]=‘/0’;
//设置合并后字符集的结尾标识
returnsetC;
试题三
某文本文件中保存了假设干个日期数据,格式如下〔年/月/日〕:
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<
stdio.h>
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<
lIId>
31)return0;
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;
if(d>
28)return0;
//当年份为闰年的时候,那么二月份的天数需小于或等于28。
合法那么返回1。
〔3〕if(t1<
=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。
*/
试题四
二叉查找树又称为二叉排序树,它或者是一棵空树,或者是具有如下性质的二叉树。
〔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。
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;
p=p->right;
if((3))return0;
/*二叉查找树中已包含键值kword,插入失败*/
p=(BSTree)malloc((4));
/*创立新结点用来保存键值kword*/
If(!
p)return0;
/*创立新结点失败*/
p->key=kword;
p->left=NULL;
p->right=NULL;
father)
(5)=p;
/*二叉查找树为空树时新结点作为树根插入*/
if(kword<father->key)
(6);
/*作为左孩子结点插入*/
(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());
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
v.get(i).book
213
2012
2011
试题六
阅读以下说明和C++代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
以下C++代码实现两类交通工具〔Flight和Train〕的简单订票处理,类Vehicle、Flight、Train之间的关系如图6-1所示。
图6-1
【C++代码】
iostream>
vector>
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的票数
intgetTicket();
voiddecreaseTicket(int);
classTrain:
〔3〕{
〔4〕tickets;
intTrain:
:
tickets=2016;
//初始化Train的票数为2016
intFlight:
tickets=216;
//初始化Flight的票数为216
intTrain:
:
getTicket(){returntickets;
voidTrain:
decreaseTicket(intn){tickets=tickets-n;
getTicket(){returntickets;
}
voidFlight:
decreaseTicket(intn){tickets=tickets-n;
intmain(){
vector<
Vehicle*>
v;
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++){
〔5〕(i+1);
//订i+l张票
“剩余票数:
〔*V[i]〕.getTicket()<
endl;
for(vector<
iteratorit=v.begin();
it!
=v.end();
it++){
if(NULL!
=*it){
delete*it;
*it=NULL;
v.clear();
Return0;
publicVehicle
(*v[i]).book();