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

上传人:b****8 文档编号:11458558 上传时间:2023-03-01 格式:DOCX 页数:14 大小:655.98KB
下载 相关 举报
上半年程序员考试真题及答案下午卷3.docx_第1页
第1页 / 共14页
上半年程序员考试真题及答案下午卷3.docx_第2页
第2页 / 共14页
上半年程序员考试真题及答案下午卷3.docx_第3页
第3页 / 共14页
上半年程序员考试真题及答案下午卷3.docx_第4页
第4页 / 共14页
上半年程序员考试真题及答案下午卷3.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

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

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

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

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

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

试题一

下面的流程图可在正文字符串T(1:

L)中计算关键词字符串K(l:

m)出现的次数〔用n表示)。

其中,L为字符串T的长度,m为字符串K的长度(m

〞可以匹配任意一个字符。

在该流程图中,先从T中取出长度为m的子串存入A中,再将A与K进展逐个字符的比较〔其中,K可以包含字符“?

〞)。

注意:

从正文字符串中取出的关键词字符串不允许穿插。

例如,“aaaaaa〞中有3个关键词字符串“aa〞。

【流程图】

阅读以下说明和流程图,填补流程图中的空缺〔1)〜〔5),将解答填入答题纸的对应栏内。

(1)L-m+1或等价表示

(2)i+m-1或等价表示

(3)j+1或等价表示

(4)n+1或等价表示

(5)A(j)=K(j)或等价表示

根据题意,正文字符串中的各个字符依次存放在T

(1),T

(2),…,T(L)中,关键词字符串中的各个字符依次存放在K

(1),K

(2),,",K(m)*。

显然i是字符数组T的动态下标指针。

为了与关键词字符串进展比较,题中需要每次从数组T中连续取出m个元素放在数组A中。

第1次将T(l:

m)存入A(1:

m),第2次将T(2:

m+1)存入A(1:

m),…,第i次就应将T(i:

m+i-1)存入A(1:

m),最后一次应将T(L-m+1:

L)存入A(l:

m)。

因此,流程图的〔2)中应填m+i-1,由于m+i-1必须小于或等于L。

当m+i-1>L时,即当i>L-m+1时,就不应该再取子串了。

因此流程图的〔1)处应填L-m+1。

流程图右下方一片描绘了字符数组A(i),A(i+1),…,A(i+m-1)与字符数组K

(1),K

(2),…,K(m)的比较过程。

题中用j表示数组K的动态下标指针,j=1,2,……,m。

显然,数组A的动态下标指针为i+j-1〔j=1,2,……,m)。

两个字符数组都从左到右逐个字符地进展比较,假设发现有不一致的字符,就完毕比较,将i增1后准备继续从数组T中取新的子串放在A中。

假设一直到比较完毕,发现两个数组中对应的各个字符都是一致的,那么,就找到了一处关键词。

此时,找到关键词的计数器n应增l(n+1—n)。

因此,流程图的〔4)处应填n+1

字符数组A与K的比较过程关键是逐个字符A(j)与K(j)的比较。

由于允许模糊査找,即K(j)中的字符"?

"可以与任何字符匹配。

因此,可以写成判断“A(j)=K(j)orK(j)="?

""是否为真。

只要K(j)="?

"",比较结果就一定为真。

因此,流程图的〔5)处应填A(j)=K(j)。

假设比较结果为真,那么还需要执行j+1→j,准备继续往下比较。

因此流程图的〔3)处应填j+1。

 

试题二

函数substring(constcharstr[],intindex,intlength)的功能是求出字符串str中指定序号index开始且长度为length的子串,并返回所取出的子串。

以字符串“Chinatoday〞为例,其第一个字符“C〞的序号为1(而其在字符数组str中的下标为0),从序号5开始且长度为3的子串为“at〞。

【问题1】

函数substring中有两处错误,请指出这些错误所在代码的行号,并在不增加和删除代码行的情况下进展修改,写出修改正确后的完好代码行〔有注释时,注释可省略)。

本问题考察字符串运算及常见编程错误的处理。

求子串运算substring的原型如下:

根据题目说明,参数index为子串的位置序号〔从1开始),length为子串的长度。

显然,在函数substring中,首先应判断参数的合理性,即index应不小于1,length应不小于0,同时,从index开始可以得到长度为length的子串,即index+length-1应不大于最后一个字符的序号。

因此,第6行的代码是正确的。

第7行申请动态内存块的语句是正确的。

第9行的代码判断内存申请是否成功,其中,判断指针tptr的表达式tptr=0有错误,即误用了“==〞与“=〞,导致无论内存申请操作是否成功,在此都将tptr赋值为空指针,造成内存泄漏。

第10、11行代码用于从字符串str中复制子串,代码是正确的。

第12行的代码设置字符串的完毕标志,为错误代码。

由于所获得字符串的长度为length,其在动态数组tptr的下标从0开始,因此,下标length-1为最后一个字符的下标,tptr[length-l]=’\0’会导致丧失最后一个字符,因此该语句中tptr的下标应为length。

【问题2】

请根据说明2,填充C函数2中的空缺〔1)和〔2)。

(1)n!

=0或n>0

(2)n/10

本问题考察整数运算。

从题中给出的运算过程可知,在所运算的整数不为0时,运算过程会继续,因此空

(1)处应填入“11!

=0〞。

除以10后要丢掉个位数的处理那么由空〔2)处进展,即填入“n/10〞。

【问题3】

请说明以62354879643作为实参调用函数reverse时返回结果出错的原因。

运算结果溢出〔或超出范围,或其他含义相近的描绘)。

本问题考察溢出问题。

由于程序语言提供的根本数据类型都有其表示范围的限制,因此在运算过程中需要注意是否发生溢出。

通过分析,上面的运算过程并没有问题,而且前三个数据的处理结果都是正确的,因此最后一个数据出错的原因是其超出整型的表示范围造成的。

试题三

对于具有n个元素的整型数组a,需要进展的处理是删除a中所有值为0的数组元素,并将a中所有非0元素按照原顺序连续地存储在数组空间的前端。

下面分别用函数CompactArr_vl和CompactArr_v2来实现上述处理要求,函数的返回值为非零元素的个数。

函数CompactArr_vl(inta[],intn)的处理思路是:

首先申请一个与数组a的大小一样的动态数组空间,然后顺序扫描数组.a的每一个元素,将遇到的非0元素依次复制到动态数组空间中,最后再将动态数组中的元素传回数组a中。

函数CompaetArr_v2(inta[],intn)的处理思路是:

利用下标i(初值为0)顺序扫描数组a的每一个元素,下标k(初值为0)表示数组a中连续存储的非0元素的下标。

扫描时,每遇到一个数组元素,i就增1,而遇到非0元素并将其前移后k才增1。

【问题1】

请根据说明中函数CompactArr_vl的处理思路填补空缺

(1)〜(3),根据CompactArr_v2的处理思路填补空缺〔4)。

(1)sizeof(int)

(2)temp[k++]或*(temp+k++)或等价表示

(3)i

(4)a[k++]或*(a+k++)或等价

本问题考査C程序构造、数组及运算的应用知识。

根据题目中对函数CompactArr_vl的处理思路描绘,空〔1)处应填入sizeof(int)。

以下代码将数组a中的非0元素复制到动态数组temp中。

显然,k应作为temp的下标索引变量使用,因此空〔2)处应填入temp[k++],当该循环语句完毕后,k的值也就是a中非0元素的个数。

据此,空〔3)处应填入i

【问题2】

请说明函数CompactArr_vl存在的缺点。

可能由于动态内存申请操作失败而导致函数功能无法实现,没有释放动态数组空间(存在内存泄漏问题),时间和空间效率低。

本问题考察程序分析根本才能。

解决同一个问题会有多种不同的方法,务种方法都有其特点。

在本问题中,相比于函数CompactArr_v2,CompactArrvl的处理思路容易理解,由于数组a的数据需要复制给temp,然后再复制回来,因此需要更多的空间支持,处理速度时间也更长。

另外,其代码执行时也可能由于申请内存空间的要求得不到满足,从而导致函数的功能不能实现,虽然发生这种情况的概率很低,但也有可能发生。

此外,数完毕前也没有释放所申请的内存块。

试题四

假设一个算术表达式中可以包含以下三种括号:

“(〞和“)〞、“[〞和“]〞及和“}〞,并且这三种括号可以按照任意的次序嵌套使用。

下面仅考虑表达式中括号的匹配关系,其他问题暂时忽略。

例如,表达式[a-(b-5)]*c[{}]中的括号是完全匹配的,而表达式[a-(b-5]))*c中的括号不是完全匹配的,因为“(〞与“]〞不能匹配,而且多了一个“)〞,即缺少一个与“)〞相匹配的“(〞。

函数ifMatched(charexpr[])的功能是用栈来判断表达式中的括号是否匹配,表达式以字符串的形式存储在字符数组expr中。

假设表达式中的括号完全匹配,那么该函数的返回值为Matched,否那么返回值为Mismatched。

该函数的处理思路如下:

(1)设置一个初始为空的栈,从左至右扫描表达式。

(2)假设遇上左括号,那么令其入栈;假设遇上右括号,那么需要与栈顶的左括号进展匹配。

(3)假设所遇到的右括号能与栈顶的左括号配对,那么令栈顶的左括号出栈'然后继续匹配过程;否那么返回Mismatched,完毕判断过程。

(4)假设表达式扫描完毕,同时栈变为空,那么说明表达式中的括号能完全匹配,返回Matchedo

函数ifMatched中用到了两种用户自定义数据类型BOOL和STACK,其中,BOOL类型的定义如下:

填补C函数中的空缺〔1)〜〔5)

 

(1)cptrH-或++cptr或cptr+=1或cptr=cptr+-l

(2)Push(&S,*cptr)

(3)Top(S)

(4)Pop(&S)

(5)IsEmpty(S)

 

此题考察c程序设计根本才能。

由于已经将表达式以字符串的形式存入字符数组expr,因此指针cptr就用于指示表达式中的每个字符。

显然,以下for语句用于扫描expr中的每个字符:

for(cptr=expr;*cptr!

=1\0';

(1))

因此,空〔1)处应填入cpti++或其等价形式。

空〔2)处进展处理的前提是遇到了左括号,因此,根据题目中对函数ifMatched的处理思路描绘,这时应进展压栈操作,即应填入Push(&S,*cptr),这里要注意函数调用时实参的形式。

由于弹栈操作不能返回栈顶元素,因此根据注释,空〔3)处需要读取栈顶元素,即应填入Top(S),空〔4)处填入Pop(&S)。

由于表达式扫描完毕且同时栈变为空,才说明表达式中的括号能完全匹配,因此,for语句的条件表达式*cptr!

=W不成立时表达式完毕,此时控制流可以到达空〔5)所在语句,在此需要判断栈的状态来决定括号是否完全匹配,即空〔5)处应填入IsEmpty(S)。

试题五

对某几何图形绘制工具进展类建模的结果如图5-1所示,其中Shape为抽象类(应至少包含一个纯虚拟〔virtual)函数),表示通用图形,Box表示矩形,Ellipse表示椭圆,Circle表示圆〔即特殊的椭圆〕,Line表示线条。

下面的C++代码用于实现图5-1所给出的设计思路,将其空缺处填充完好并编译运行,输出结果为:

填补C++代码中的空缺〔1)〜〔5)

(1)virtual

(2):

publicShape 

(3):

publicEllipse

(4)newDiagram

(5)delete

此题考察C++语言程序设计的才能,涉及类和抽象类、对象、函数和虚函数的定义和相关操作,以及继承关系。

要求考生根据给出的案例和执行过程说明,认真阅读理清程序思路,然后完成题目。

先考察类图整体构造。

此题中根据类图定义了类:

Diagram、Shape、Box、Ellipse、Line和Circle。

其中Shape为抽象类,表示通用图形,抽象类中应至少包含一个纯虚拟(virtual)函数。

Box表示矩形,Ellipse表示椭圆,Line表示线条,三者都是Shape的子类,继承了Shape类,Circle表示圆〔即特殊的椭圆〕,继承了Ellipse。

抽象类Shape的定义中,需要通过使用virtual标识虚函数,voidpaintO=0;表示paint()是纯虚函数,其定义前必须添加virtual进展表示。

类Ellipse为Shape的子类,Circle为Ellipse的子类,需要在代码中表达出继承。

另外,在子类的构造函数中,调用父类的构造函数,所以继承的权限为public。

其语法为:

public后加类名。

类Diagram中没有定义构造函数,编译器生成一个缺省的构造函数,调用是釆用new关键字加类名。

使用完成之后,通过delete进展释放。

因此空〔1)需要表现出paint()函数为纯虚函数,即为virtual;空〔2)和空〔3)处添加继承父类,并且权限为public,即为:

publicShape和:

publicEllipse;空(4)处补充通过使用编译器生成的缺省构造函数创立对象,即newDiagram;空〔5)处通过delete释放new创立的对象diagram。

试题六

对某几何图形绘制工具进展类建模的结果如图6-1所示,其中Shape为抽象(abstract)类,表示通用图形,Box(矩形)、Ellipse(椭圆〕和Line(线条〕继承〔extends)了Shape类,其中,Circle表示圆〔即特殊的椭圆〕。

下面的Java代码用于实现图6-1所给出的设计思路,将其空缺处填充完好并编译运行,输出结果为:

填补Java代码中的空缺〔1)〜〔6)

(1)abstract或publicabstract

(2)abstract或publicabstract或protectedabstract

(3)extendsShape

(4)extendsEllipse

(5)eraseAShape(shapes[i])

(6)newDiagram()

此题考察Java语言程序设计的才能,涉及类和抽象类、对象、方法和抽象方法的定义和相关操作,以及继承关系。

要求考生根据给出的案例和执行过程说明,认真阅读理清程序思路,然后完成题目。

先考察类图整体构造。

此题中根据类图定义了类:

Diagram、Shape、Box、Ellipse、Line和Circle。

其中Shape为抽象类,表示通用图形,抽象类中应至少包含一个抽象(abstract)方法。

Box表示矩形,Ellipse表示椭圆,Line表示线条,三者都是Shape的子类,继承了Shape类,Circle表示圆〔即特殊的椭圆〕,继承了Ellipse。

抽象类Shape的定义中,需要通过使用abstract标识抽象方法,方法voidpaintO;没有实现体,表示paintO是抽象方法,其定义前必须添加abstract进展表示。

类Ellipse为Shape的子类,Circle为Ellipse的子类,需要在代码中表达出继承。

另外,在子类的构造方法中,需调用父类的构造方法,而在父类中没有不带参数的构造方法,必须使用super关键字显式地进展调用。

在Java中,继承的语法为extends后加类名。

类Diagram中没有定义构造方法,编译器生成一个缺省的构造方法,调用时釆用new关键字加缺省构造器方法。

因此空〔1)和

(2)需要表现出Shape为抽象类,paint()方法为抽象方法,即为abstract;.和〔3)处添加继承父类Shape,即extendsShape;空〔4)处补充继承父类Ellipse,即extendsEllipse;空〔5)处删除图形,即eraseAShape(shapes[i]),调用空〔6)通过使用编译器生成的缺省构造方法创立对象,即newDiagram()。

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

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1