初级程序员下午试题100真题含答案与解析交互.docx
《初级程序员下午试题100真题含答案与解析交互.docx》由会员分享,可在线阅读,更多相关《初级程序员下午试题100真题含答案与解析交互.docx(18页珍藏版)》请在冰豆网上搜索。

初级程序员下午试题100真题含答案与解析交互
初级程序员下午试题-100
(总分90,做题时间90分钟)
试题一
阅读以下说明和流程图,填补流程图中的空缺
(1)~(5),将解答填入对应栏内。
[说明]
下面的流程图,用来完成求字符串t在s中最右边出现的位置。
其思路是:
做一个循环,以s的每一位作为字符串的开头和t比较,如果两字符串的首字母是相同的,则继续比下去,如果一直到t的最后一个字符也相同,则说明在s中找到了一个字符串t;如果还没比较到t的最后一个字符,就已经出现字符串不等的情况,则放弃此次比较,开始新一轮的比较。
当在s中找到一个字符串t时,不应停止寻找(因为要求的是求t在s中最右边出现的位置),应先记录这个位置pos,然后开始新一轮的寻找,若还存在相同的字符串,则更新位置的记录,直到循环结束,输出最近一次保存的位置。
如果s为空或不包含t,则返回-1。
注:
返回值用pos表示。
[问题]
将流程图的
(1)~(5)处补充完整。
1.
分值:
3
答案:
pos=-1;
2.
分值:
3
答案:
s[i]!
='\0';
3.
分值:
3
答案:
[j]=t[k];
4.
分值:
3
答案:
k>0;
5.
分值:
3
答案:
pos=i;
[解析]本试题考查流程图。
题目中说明,如果s中不包含t,则返回-1,由流程图可以看出,如果空
(2)的条件不满足,流程图会直接跳到最后Returnpos,所以,在开始进行查找之前,就要先将pos置-1,所以空
(1)填入pos=-1。
循环开始,空
(2)保证的条件应该是s[i]不是空的,即空
(2)填入s[i]!
='\0'。
下面就开始进行比较,由于要输出的是最右边出现的位子,所以当第一次比较到相同的字符时是不能输出,只要暂时把保存着,即空(5)填入pos=i,然后进行下一次循环,当又出现相同的字符串时,就将pos的值更新,如果一直到最后都没有再次出现相同的字符串,就把pos输出。
当比较到第一个相同的字符时,要继续比较下去,看是不是t和s的每一个字符全相同,所以(3)应填入s[j]=t[k]。
在什么情况下能说明t和s完全相同呢?
就是当t-直比较到最后一个字符即空格时,并且k大于0(因为如果k等于0,则说明第一个字母就不相同,根本没有开始比较),所以(4)应填入k>0。
试题二
阅读以下函数说明和C语言函数,将应填入 (n) 处的字句写在对应栏内。
。
[函数2.1说明]
函数voidsort(intarry[],intn)的功能是对数组a中的arry[0]~arry[n-1]这n个元素进行排序。
排序过程如下:
第一趟对所有的偶数下标x,比较arr[x]和arry[x+1],若arry[x]>arry[x+1],则将两者交换;第二趟对所有的奇数下标y,比较arry[y]和arry[y+1],若arry[y]>arry[y+1],则将两者交换;第三趟对偶数下标,第四趟对奇数下标,……,依次类推,直至整个数组元素有序排列为止。
[函数2.1]
void sort(int arry[],intn)
inti,j,tag=1;
for(j=0;j<n;j++)
for(i=
(1) ;i<n-1;
(2) )
if(arry[i]>arry[i+1])
t=arry[i];
arry[il=arry[i+1];
arry[i+1]=t;
tag=0;
tag++;
if( (3) )break;
[函数2.2说明]
这是一棵二叉树排序查找元素的程序,查找的方法是:
首先与树的根结点的元素进行比较,若相等则找到,返回此结点的地址;若要查找的元素小于根结点的元素值,则指针指向此结点的左子树,继续查找;若要查找的元素大于根结点的元素值,则指针指向此结点的右子树,继续查找。
直到指针为空,表示此树中不存在所要查找的元素。
本题使用递归方法实现。
[函数2.2]
typedef struct node
intdata;
structnode*left;
struct node *right;
NODE;
NODE*SearchSortTree(NODE*tree,inte)
if(tree!
=NULL)
if(tree->data<e)
(4) ;
elseif(tree->data>e)
(5) ;
else returntree;
returntree;
1.
分值:
3
答案:
j%2
2.
分值:
3
答案:
i+=2
3.
分值:
3
答案:
tag>2或tag==3或tag>=3
4.
分值:
3
答案:
returnSearchSortTree(tree->left,e)
5.
分值:
3
答案:
returnSearchSortTree(tree->right,e)
[解析]对于函数1,空
(1)和空
(2)要求填写内循环变量初值和增量。
循环变量的初值是由外循环的循环变量决定的。
因为第一趟初值为0,第二趟为1,第三趟又为0,因此空
(1)为j%2,因为一次比较两个元素,所以循环增量为2,空
(2)为i+=2。
当连续两趟没有数据交换时就说明该数组已经有序了,可以提前退出循环,由tag标注,空(3)为tag>2或tag==3或tag>=3。
对于函数2,首先查找键值e与树根结点的关键字比较,如果值小的话,就在左子树中查找,空(4)为returnSearchSortTree(tree->left,e),如果值大的话,就在右子树中查找,空(5)为returnSearchSortTree(tree->right,e),如果相等的话就返回树根指针。
试题三
阅读以下函数说明和C语言函数,将应填入 (n) 处的字句写在对应栏内。
[说明]
已知一棵二叉树用二叉链表存储,t指向根结点,p指向树中任一结点。
下列算法为输出从t到p之间路径上的结点。
[函数]
#defineMaxSize1000
typedef struct node
TelemTypedata;
structnode*lchild,*rchild;
BiNode,*BiTree;
voidPath(BiTreet, BiNode*p)
BiTree *stackEMaxsize],*stack1[maxsize],*q;
inttag[Maxsizel,top=0,top1;
q=t;
/*通过前序遍历发现P*/
do while(q!
=NULL&&q!
=p)
/*扫描左孩子,且相应的结点不为p*/
(1) ;
stack[top]=q;
tag[top]=0;
(2) ;
if(top>0)
if(stack[top]==P) break; /*找到p,栈底到栈顶为t到p*/
if(tag[top]==1) top--;
else q=stack[top];
q=q->rchild;
tag[top]=1;
(3) ;
top--; top1=0;
while(top>0)
q=stack[top]; /*反向打印准备*/
top1++;
(4) ;
top--;
while( (5) ) /*打印栈的内容*/
q=stack1[top1];
printf(q->data);
top1--;
1.
分值:
3
答案:
top++
2.
分值:
3
答案:
q=q->lchild
3.
分值:
3
答案:
while(top>0)
4.
分值:
3
答案:
stack1[top1]=q
5.
分值:
3
答案:
top1>0
[解析]本题本质上是对二叉树的前序遍历进行考核,但不是简单地进行前序遍历,而是仅遍历从根结点到给定的结点p为止。
本题采用非递归算法来实现,其主要思想是:
①初始化栈;②根结点进栈,栈不空则循环执行以下步骤直到发现结点p;③当前结点不为空且不为P进栈;④栈顶为p,则结束,否则转③;⑤若右子树访问过,则栈顶的右孩子为当前结点,转③。
扫描左孩子,当相应的结点不为P时进栈,所以空
(1)填top++,空
(2)填q=q->1child。
在栈不为空时则一直在do...while循环中查找,因此空(3)填while(top>0)。
在进行反向打印准备时,读取stack[top]的信息放到stack1[top1]中,即空(4)填stack1[top1]=q。
打印栈中所有内容,所以空(5)填top1>0。
试题四
阅读以下函数说明和C语言函数,将应填入 (n) 处的字句写在对应栏内。
[说明]
设一个环上有编号为0~n-1的n粒颜色不尽相同的珠子(每粒珠子颜色用字母表示,n粒珠子的颜色由输入的字符串表示)。
从环上的某两粒珠子间剪开,则环上珠子形成一个序列然后按以下规则从序列中取走珠子:
首先从序列左端取走所有连续的同色珠子;然后从序列右端在剩下的珠子中取走所有连续的同色珠子,两者之和为该剪开处可取走珠子的粒数。
在不同位置剪开,能取走的珠子也不尽相同。
本程序所求的是在环上哪个位置剪开,按上述规则可取走的珠子粒数最多。
程序中用数组存储字符串。
例如:
10粒珠子颜色对应字符串为“aaabbbadcc”,在0号珠子前剪开,序列为aaabbbadcc,从左端取走3粒a色珠子,从右端取走2粒c色珠子,共取走5粒珠子。
若在3号珠子前剪开,即bbbadccaaa,共取走6粒珠子。
[函数]
int count(char *s,int start,intend)
inti,c=0,color=s[start],step=(start>end)?
-1:
1;
fori=start;s[i]==color;i+=step)
if(step>0&&i>end||
(1) ) break;
(2) ;
returnc:
voidmain()
chart,s[120];
inti,j,c,len,maxc,cut=0;
printf("请输入环上代表不同颜色珠子字符串:
");
scanf("%s”,s);
len=strlen(s);
for(i=maxc=0;i<len;i++)( /*尝试不同的剪开方式*/
c=count(s,0,len-1);
if(c<len) c+=count( (3) );
if(c>maxc)cut=i;maxc=c;
/*数组s的元素循环向左移动一个位置*/
t=s[0];
for(j=1;j<len;j++) (4) ;
(5) ;
printf("在第%d号珠子前面剪开,可以取走%d个珠子.\n",cut,maxc);
1.
分值:
3
答案:
step<0&&<end
2.
分值:
3
答案:
++c
3.
分值:
3
答案:
s,len-1,c
4.
分值:
3
答案:
s[j-1]=s[j]
5.
分值:
3
答案:
s[len-1]=t
[解析]依据取珠子个数最多的规则,count函数每次从左或从右取出相同颜色的珠子,因此从右到左的条件为step<0&&i<end,即空(i)应填step<0&&i<end。
当是同色珠子时,计数值加一,所以空
(2)填++c。
从右到左计算时,函数count调用的实参次序为s,len-1,c。
即空(3)应填s,len-1,c。
在尝试不同的剪开方式时,数组s的元素要循环向左移动一个位置,则空(4)填s[j-1]=s[j],空(5)填s[len-1]=t。
试题五
阅读以下说明和C++程序,将应填入 (n) 处的字句写在对应栏内。
[说明]
下面程序定义了一个类Point及其成员函数,然后从类Point派生出类Circle及其成员函数。
[C++程序]
//POINT.H
#ifndefPOINT_H
#define POINT_H
class Point
public:
Point (floatx=0,floaty=0);
void setPoint(float,float);
float getX()const returnx;
float getY()const returny;
protected:
float:
x,y;
;
#endif
//POINT.CPP
#include<iostream.h>
#include "point.h"
Point:
:
Point(float a,float b)
x=a;y=b
voidPoint:
:
setPoint(floata,floatb)
x=a;y=b
//CIRCLE.H
#ifndefCIRCLE_H
#defineCIRCLE_H
#include"point.h"
classCircle:
(1)
public:
Circle(float r=0.0,float x=0,float y=0);
void setRadius(float);
float getRadius() const;
floatarea()const;
protected:
floatradius;
;
//CIRCLE.CPP
#include"iostream.h"
#include "circle.h"
Circle:
:
Circle(floatr,floata,floatb)
:
(2)
radius=r;
void Circle:
:
setRadius(float r)
radius=r;
float Circle:
:
getRadius() const
returnradius;
float Circle:
:
area() const
return 3.14159*radius*radius;
//text.cpp
#include<iostream.h>
#include "point.h"
#include "circle.h"
main()
Circlec(2.5,3.7,4.3);
cout<<"X coordinate is"<<c.getX()
<<\nRadius is:
"<<c.getRadius();
(3) ; //设置新的圆心(2,2)。
Point&pRef=c;
cout<<"\nCircleprintedasapointis:
"
<<"]"<< (4) <<"."<< (5) <<"]";
1.
分值:
3
答案:
publicPoint
2.
分值:
3
答案:
Point(a,b)
3.
分值:
3
答案:
c.setPoint(2,2)
4.
分值:
3
答案:
pRef.getX(),
5.
分值:
3
答案:
pRef.getY()
[解析]本题以C++语言为载体,考查面向对象程序设计中的几个重要概念——派生类型,构造函数,以及对象的引用。
首先,根据主函数中的c.getX()调用,我们可以判断类Circle对类Point的继承为公有继承,空
(1)处应填入publicPointo空
(2)处考查的是构造函数的初始化,在派生类的构造函数中可以调用基类的构造函数,应填入Point(a,b)。
在空(3)处我们根据题目给出的说明,要求重新设置圆心为(2,2),可以调用基类设置点的函数setPoint,所以空(3)处应填入c.setPoint(2,2)。
最后考察的是对象的引用,派生类对象可以初始化基类引用,在这种情况下,只能访问从相应基类中继承来的成员,而不允许访问从其他基类的成员或在派生类中增加的成员,所以,空(4)、空(5)处应分别填入pRef.getX()和pRef.getY()。
试题六
阅读以下说明和Java程序,将应填入(n)处的字句写在答题纸的对应栏内。
[说明]
下面Application程序用while循环从键盘读入字符,记录输入的字符数并输出读入的字符,当输入字符“0”时结束while循环,同时结束程序。
[Java程序]
importjava.io.*;
publicclassContinuateInput
public
(1) voidmain(String[]args)
(2) IOException
intch;
intcounter=0;
System.out.println("请输入字符(输入0结束)");
while((char)(ch=System.in. (3) )!
= '0')
counter++;
System.out.println(( (4) )ch);
System.out.println();
System.out.println("counted "+counter+" total bytes.");
System.out. (5) ;
1.
分值:
3
答案:
static
2.
分值:
3
答案:
throws
3.
分值:
3
答案:
read()
4.
分值:
3
答案:
char
5.
分值:
3
答案:
exit(0)
[解析]本题考查Java编程中的Application编程,包括输入输出以及异常处理。
Application的入口方法为mam方法,必须声明为公有public、静态static,以便Java解释器调用。
故空
(1)应填static。
异常抛出有两种方式,一种是用throw主动抛出一个特定异常,另一种是方法声明是用throws传播异常。
故空
(2)应填throws。
注意不要填成throw。
根据说明,空(3)是从键盘读入字符,应该调用read()方法。
故空(3)应填read()。
空(4)处用来将读入的字符输出,而ch声明为int,需要进行类型强制转换,故空(4)应填char。
根据说明,结束循环后同时结束程序,故空(5)应填exit(0)。
窗体顶端
窗体底端