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

上传人:b****0 文档编号:9332095 上传时间:2023-05-18 格式:DOCX 页数:19 大小:275.09KB
下载 相关 举报
上半年程序员考试真题及答案下午卷.docx_第1页
第1页 / 共19页
上半年程序员考试真题及答案下午卷.docx_第2页
第2页 / 共19页
上半年程序员考试真题及答案下午卷.docx_第3页
第3页 / 共19页
上半年程序员考试真题及答案下午卷.docx_第4页
第4页 / 共19页
上半年程序员考试真题及答案下午卷.docx_第5页
第5页 / 共19页
上半年程序员考试真题及答案下午卷.docx_第6页
第6页 / 共19页
上半年程序员考试真题及答案下午卷.docx_第7页
第7页 / 共19页
上半年程序员考试真题及答案下午卷.docx_第8页
第8页 / 共19页
上半年程序员考试真题及答案下午卷.docx_第9页
第9页 / 共19页
上半年程序员考试真题及答案下午卷.docx_第10页
第10页 / 共19页
上半年程序员考试真题及答案下午卷.docx_第11页
第11页 / 共19页
上半年程序员考试真题及答案下午卷.docx_第12页
第12页 / 共19页
上半年程序员考试真题及答案下午卷.docx_第13页
第13页 / 共19页
上半年程序员考试真题及答案下午卷.docx_第14页
第14页 / 共19页
上半年程序员考试真题及答案下午卷.docx_第15页
第15页 / 共19页
上半年程序员考试真题及答案下午卷.docx_第16页
第16页 / 共19页
上半年程序员考试真题及答案下午卷.docx_第17页
第17页 / 共19页
上半年程序员考试真题及答案下午卷.docx_第18页
第18页 / 共19页
上半年程序员考试真题及答案下午卷.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

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

《上半年程序员考试真题及答案下午卷.docx》由会员分享,可在线阅读,更多相关《上半年程序员考试真题及答案下午卷.docx(19页珍藏版)》请在冰点文库上搜索。

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

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

2017上半年程序员考试真题及答案-下午卷

试题一(共20分)

阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。

【说明】

设有二维整数数组(矩阵)A[1:

m,1:

n],其每行元素从左至右是递增的,每列元素从上到下是递增的。

以下流程图旨在该矩阵中需找与给定整数X相等的数。

如果找不到则输出“false”;只要找到一个(可能有多个)就输出“True”以及钙元素的下标i和j(注意数组元素的下标从1开始)。

例如,在如下矩阵中查找整数8,则输出伟:

True,4,1

2469

45910

671012

891113

流程图中采用的算法如下:

从矩阵的右上角元素开始,按照一定的路线逐个取元素与给定整数X进行比较(必要时向左走一步或向下走一步取下一个元素),直到找到相等的数或超出矩阵范围(找不到)。

【流程图】

【问题】该算法的时间复杂数是()

供选择答案:

A.O

(1)B.O(m+n)C.(m*n)D,O(m²+n²)

(1)n

(2)j-1→j

(3)i+1→I

(4)j

(5)B

读题,可以看出元素查找的过程为从右上角开始,往右或者往下进行查找。

因此,初始值i=1,j=n。

如果查找值小于右上角值,则往右移动一位再进行比较。

所以,第二空填j-1→j。

接下来是判断什么时候跳出循环。

此时,终止循环的条件是:

j=0,也就是其从最右端移到了最左端。

再看X

此时,也就是说第一行的最大值都小于查找值,因此需往下移动一行。

所以第三空填i+1→I。

试题二(共15分)

阅读下列说明和C函数,填补函数中的空缺,将解答填入答案纸的对应栏目内。

【说明】

函数isLegal(char*ipaddr)的功能是判断以点分十进制数表示的iPV4地址是否合法。

参数ipadddr给出表示iPV4地址的字符串的首地址,串中仅含数字字符和“.”。

若iPV4地址合法则返回1,否则反馈0.判定伟合法的条件是:

每个十进制数的值位于整数区间[0,25],两个相邻的树之间用“.”分隔,共4个数、3个“.”。

;例如,192.168.0.15、1.0.0.1是合法的,192.168.1.256、1.1..1是不合法的。

【函数】

intisLegal(char*ipaddr)

intflag;

intcurVal;//curVal表示分析出的一个十进制数

intdecNum=0,dotNum=0;//decNum用于记录十进制数的个数

//dotNum用户记录点的个数

Char*p=()

for(;*p;p++)﹛

curVal=0;flag=0

While(isdigit(*p))﹛//判断是否伟数字字符

CurVal=()+*p-′0′;

()

flag=1;

if(curVal>255)﹛

return0;

if(flag)﹛

()

﹜if(*p=′.′﹛

dotNum++;

if()﹛

return1;

return0;

(1)ipaddr

(2)curval*10

(3)p++

(4)decNum++

(5)decNum==4&&dotNum==3

此题判断IPV4地址是否合法,主要是判断其每个十进制数的大小和总个数以及“.”个数来进行判别。

首先用isdigital函数判断是否为十进制数,是则保留值。

指针移到地址的下一个字符。

每找到一个十进制数都需要和前一次找到的值进行组合,即前一次的结果要乘以10。

每找完一个完整数字和“.”都需要记录,所以要有decNum++和dotNum++。

最后,如果IP地址正确,则返回1。

即:

decNum=4和dotNum=3时成立。

【试题三】

阅读下列说明和C函数,填补C函数中的空缺,将解答填入答案纸的对应栏目内。

【说明】

字符串是程序中常见的一种处理对象,在字符串中进行子串的定位、插入和删除是常见的运算。

设存储字符串时不设置结束标志,而是另行说明串的长度,因此串类型定义如下:

Typedefstruct﹛

Char*str//字符串存储空间的起始地址

intlehgth//字符串长

intcapacity//存储空间的容量

﹜SString;

【函数1说明】

函数indexStr(S,T,pos)的功能是:

在S所表示的字符串中,从下标pos开始查找T所表示字符串首次出现的位置。

方法是:

第一趟从S中下标为pos、T中下标伟0的字符开始,从左往右逐个对于来比较S和T的字符,直到遇到不同的字符或者到达T的末尾。

若到达T的末尾,则本趟匹配的起始下标pos为T出现的位置,结束查找;若遇到了不同的字符,则本趟匹配失效。

下一趟从S中下标pos+1处的字符开始,重复以上过程。

若在S中找到T,则返回其首次出现的位置,否则返回-1。

例如,若S中的字符串伟″studentsents″,T中的字符串伟″ent″,pos=0,则T在S中首次出现的位置为4。

【C函数1】

intindexStr(SStringS,SStringT,intpos)

inti,j:

i(S.length<1||S.length

return-1;

for(i=pos,j=0;i

if(S.str[i]==T.str[j])﹛

i++;j++;

﹜else﹛

i=();j=0

if()returni-T.length;

return-1;

【函数2说明】

函数eraseS位(S,T}的功能是删除字符串S中所有与T相同的子串,其处理过程为:

首先从字符串S的第一个字符(下标为0)开始查找子串T,若找到〈得到子串在S中的起始位置),则将串S中子串T之后的所有字符向前移动,将子串T覆盖,从而将其删除,然后重新开始查找下一个子串T,若找到就用后面的宇符序列进行覆盖,重复上述过程,直到将S中所有的子串T删除。

例如,若字符串S为“12ab345abab678”、T为“ab”。

第一次找到"ab"时(位置为

(2),将"345abab678"前移,S中的串改为"12345abab678",第二次找到"ab"时(位置为5);将ab678前移,S中的串改为"12345ab678",第三次找到"ab"时(位置为5);将“678‘前移,S中的串改为"12345678"。

【C函数2】

VoideraseStr(SString*S,SStringT)

inti;

intpos;

if(S->length<||T.length<1||S->length

return;

Pos=0

for(;;)﹛

//调用indexStr在S所表示串的pos开始查找T的位置

Pos=indexStr();

if(pos=-1)//S所表示串中不存在子串T

return;

for(i=pos+T.length;ilength;i++)//通过覆盖来删除自串T

S->str[()]=S->str[i];

S->length=();//更新S所表示串的长度

(1)i-j+1

(2)j==T.length

(3)S,T,pos

(4)i-T.length

(5)S->length-T.length

函数1为字符串匹配,算法为:

先判断字符串S和T的长度,如果为空则不用循环,另外,如果字符串S的长度<字符串T的长度,那字符串S中也不能含有字符串T,也无需进行匹配。

那当上述情况都不存在时,即需要进行循环。

即从S的第一个字符开始,与T的第一个字符进行比较,如果相等,则S的第二个字符和T的第二字符进行比较,再相等就再往后移动一位进行比较,依次直到字符串T的结尾,也就是说j=T.length。

当某一个字符与T的字符不相等时,那么字符串S就应从下一个字符开始比较,此时i=i-j+1,(如果前面有匹配成功的话,i的值已经增加了j位,因此需要重新回到之前比较的位置的后一个字符进行比较)再次进行与T的第一个字符进行比较,此时j恢复初始值,j=0。

函数2为字符串的删除运算。

首先,要调用函数indexStr,需要三个参数,字符串S、字符串T和pos。

从函数2的调用VoideraseStr(SString*S,SStringT)可以看到,此处字符串S为指针变量,因此字符串前需使用*。

然后删除的字符串的位置为删除初始点的位置到其位置点+字符串T的长度,并将后面的字符串前移。

而删除T字符串后,字符串S的总长度变化,需减去字符串T的长度。

试题四(共15分)

阅读以下说明和C函数,填补函数中的空缺,将解答填入答题纸的对应栏内。

【说明】

简单队列是符合先进先出规则的数据结构,下面用不含有头结点的单向循环链表表示简单队列。

函数enqueue(queue*q,KeyTypenew_elem)的功能是将元素new_elem加入队尾。

函数Dnqueue(queue*q,KeyType*elem)的功能使将非空队列的队头元素出队(从

队列中删除),并通过参数带回刚出队的元素。

用单向循环链表表示的队列如图4-1所示。

图4-1单向循环链表表示的队列示意图

队列及链表结点等相关类型定义如下:

enum{errOr,OK};

typedefintKeyType;

typedefstructqNode﹛

KeyTypedata;

StructqNode*next;

﹜qNode,*Linkqueue;

Typedefstruct﹛

intsize;

Link:

queuerear;

}queue;

【C函数】

intenqueue(queue*q,KeyTypenew_elem)

﹛//元素new_elem入队列

qNode*p;

P=(qNode*)malloc(sizeof(qNode));

if(!

p)

returnerrOr;

P->data=new_elem;

if(q->rear)﹛

P->next=q->rear->next;

();

else

P->next=p;

﹙﹚;

q->size++;

returnOK;

intDequeue(queue*q,KeyType*elem)

﹛//出队列

qNode*p;

if(0==q->size)//是空队列

returnerrOr;

P=();//令p指向队头元素结点

*elem=p->data;

q->rear->next=();//将队列元素结点从链表中去除

if(())//被删除的队头结点是队列中唯一结点

q->rear=NULL//变成空队列

free(p);

q->size--;

returnOK;

(1)Q→rear→next=p

(2)Q→rear=p

(3)Q→rear→next

(4)p→next

(5)Q→rear==p或Q→rear→next==p或p→next==p或Q→size==1

本题考察C语言指针与链表的知识,为入队列和删除队列问题。

对于入队列,那么当队列Q不为空时,P的队尾t要指向原Q的队尾指向的元素,即:

P->next=Q->rear->next,Q的队尾要指向p,即:

Q→rear→next=p。

当队列Q为空时,插入p元素,则p的队尾指向p自身,即:

p→next=p,且整个队列Q的队尾也是p,即:

Q→rear=p。

对于队列删除元素p,先判断Q是否为空,为空队列则返回ERROR;

If(0==q->size)//是空队列

ReturnERROR;

另p指向队头元素结点,队头元素结点可用Q→rear→next表示。

此时,p转化为头结点,p出列,则需要Q的队尾指向p的下一个元素,因此第4空填:

p→next。

最后,判断被删除的队头结点是否是队列中的唯一结点,可采用:

Q→rear==p或Q→rear→next==p→next或Q→size==1等表示方法。

试题五(共15分)

阅读以下说明和Java程序,填补代码中的空缺,将解答填入答题纸的对应栏内。

【说明】

以下Jave代码实现一个简单客户关系管理系统(CrM)中通过工厂(Customerrfactory)对象来创建客户(Customer)对象的功能。

客户分为创建成功的客户(realCustomer)和空客户(NullCustomer)。

空客户对象是当不满足特定条件时创建或获取的对象。

类间关系如图5-1所示。

【Java代码】

AbstractclassCustomer﹛

ProtectedStringname;

()booleanisNil()

()StringgetName();

ClassrealCustomer()Customer﹛

PublicrealCustomer(Stringname)﹛returnfalse;﹜

ClassNullCustomer()Customer﹛

PublicStringgetName()﹛return″NotAvailableinCustomerDatabase″;﹜

PublicbooleanisNil()﹛returntrue;﹜

classCustomerfactory{

publicString[]names={"rob","Joe","Julie"};

publicCustomergetCustomer(Stringname){

for(inti=0;i

if(names[i].())﹛

returnnewrealCusωmer(name);

return()

PublicclassCrM﹛

PublicviodgetCustomer()﹛

Customerfactory()

Customercustomer1-cf.getCustomer(″rob″);

Customercustomer2=cf.getCustomer(″rob″);

Customercustomer3=cf.getCustomer(″Julie″);

Customercustomer4=cf.getCustomer(″Laura″);

System.out.println(″customer1.getName());

System.out.println(″customer2getName());

System.out.println(″customer3.getName());

System.out.println(″customer4.getName());

Publicstaticviodmain(String[]arge)﹛

CrMcrm=newCrM();

Crm,getCustomer();

/*程序输出为:

Customer

rob

NotAvailableinCustomerDatabase

Julie

NotAvailableinCustomerDatable

*/

intmain()﹛

CrM*crs=newCrM();

Crs->getCustomer();

Crs->getCustomer();

Deletecrs;

return();

/*程序输出为:

Customer

rob

NotAvailableiniCustomerDatabase

Julie

NotAvailableinCustomerDatabase

1)abstract

2)abstract

3)extends

4)extends

5)equals(name)

6)newNullCustomer()

7)cf=NewCustomerFactory();

本题考察Java程序设计客户关系管理系统。

1)abstract定义可访问方法

2)abstract

3)extends继承Customer类

4)extends

5)equals(name)判断名字是否在数组集合内

6)newNullCustomer()当不满足条件时创建一个空对象

7)cf=NewCustomerFactory();实例化对象cf

试题六(共15分)

阅读下列说明和C++代码,填补代码中的空缺,将解答填入答题纸的对应栏内。

【说明】

以下C++代码实现一个简单客户关系管理系统(CrM)中通过工厂(Customerfactory)对象来创建客户(Customer)对象的功能。

客户分为创建成功的客户(realCustomer)和空客户(NullCustomer)。

空客户对象是当不满足特定条件时创建或获取的对象。

类间关系如图6-1所示。

【C++代码】

#include

#include

usingnamespacestd;

classCustomer{

protected:

stringname;

public:

(1)bollisNil()=0;

(2)stringgetName()=0;

﹜;

classrealCustomer(3){

public:

realCustomer(stringname){this->name=name;﹜

boolisNil(){returnfalse;﹜

stringgetName(){returnname;﹜

﹜;

classNullCustomer(4){

public:

boolisNil(){returntrue;﹜

stringgetName(){return〝NotAvailableinCustomerDatabase〞;﹜

﹜;

classCustomerfactory{

public:

stringnames[3]={〝rob〞,〝Joe〞,〝Julie〞﹜;

public:

Customer*getCustomer(stringname){

for(inti=0;i<3;i++){

if(names[i].(5)){

returnnewrealCustomer(name);

return(6);

﹜;

classCrM{

public:

voidgetCustomer(){

Customerfactory*(7);

Customer*customer1=cf->getCustomer(〝rob〞);

Customer*customer2=cf->getCustomer(〝Bob〞);

Customer*customer3=cf->getCustomer(〝Julie〞);

Customer*customer4=cf->getCustomer(〝Laura〞);

cout<<〝Customers〞<

cout<getName()<

cout<getName()<

cout<getName()<

cout<getName()<

deletecf;

﹜;

intmain(){

CrM*crs=newCrM();

crs->getCustomer();

deletecrs;

return0;

/*程序输出为:

Customers

rob

NotAvailableinCustomerDatabase

Julie

NotAvailableinCustomerDatabase

*/

1)virtual

2)virtual

3):

publicCustomer

4):

publicCustomer

5)compare(name)==0

6)newNullCustomer()

7)cf=NewCustomerFactory();

本题考察使用C++代码实现实际问题。

在C++中,动态绑定是通过虚函数来实现的。

此题中用到了虚函数,所以要在成员函数原型缺钱加一个关键字virtual。

类RealCustomer和类NullCustomer是类Customer的派生类,因此3、4空都填publicCustomer。

进行对比数据库中的人名compare(name)==0

第6空与前面语句是相反的,一个是返回newRealCustomer(name),那么此处应填:

newNullCustomer()

第7空,用工厂创建对象,cf=NewCustomerFactory();

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2