初级程序员下午试题100真题含答案与解析交互.docx

上传人:b****9 文档编号:25161908 上传时间:2023-06-05 格式:DOCX 页数:18 大小:23KB
下载 相关 举报
初级程序员下午试题100真题含答案与解析交互.docx_第1页
第1页 / 共18页
初级程序员下午试题100真题含答案与解析交互.docx_第2页
第2页 / 共18页
初级程序员下午试题100真题含答案与解析交互.docx_第3页
第3页 / 共18页
初级程序员下午试题100真题含答案与解析交互.docx_第4页
第4页 / 共18页
初级程序员下午试题100真题含答案与解析交互.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

初级程序员下午试题100真题含答案与解析交互.docx

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

初级程序员下午试题100真题含答案与解析交互.docx

初级程序员下午试题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)。

窗体顶端

窗体底端

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

当前位置:首页 > 成人教育 > 自考

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

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