您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页初级程序员下午试题-100_真题(含答案与解析)-交互

初级程序员下午试题-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)处补充完整。

SSS_FILL 1.

分值: 3 答案:pos=-1; SSS_FILL 2.

分值: 3 答案:s[i]!='\\0'; SSS_FILL 3.

分值: 3 答案:[j]=t[k]; SSS_FILL 4.

分值: 3

答案:k>0; SSS_FILL 5.

分值: 3 答案:pos=i;

[解析] 本试题考查流程图。

题目中说明,如果s中不包含t,则返回-1,由流程图可以看出,如果空(2)的条件不满足,流程图会直接跳到最后Return pos,所以,在开始进行查找之前,就要先将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说明]

函数void sort(int arry[],int n)的功能是对数组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[],int n) int i,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 int data;

struct node *left;

struct node *right; NODE;

NODE *SearchSortTree(NODE *tree,int e) if (tree ! =NULL) if (tree->data<e) (4) ; else if(tree->data>e) (5) ;

else return tree;

return tree;

SSS_FILL1.

分值: 3 答案:j%2 SSS_FILL 2.

分值: 3 答案:i+=2 SSS_FILL 3.

分值: 3

答案:tag>2或tag==3或tag>=3 SSS_FILL

4.

分值: 3

答案:return SearchSortTree(tree->left,e) SSS_FILL 5.

分值: 3

答案:return SearchSortTree(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)为return SearchSortTree(tree->left,e),如果值大的话,就在右子树中查找,空(5)为return SearchSortTree(tree->right, e),如果相等的话就返回树根指针。 试题三

阅读以下函数说明和C语言函数,将应填入 (n) 处的字句写在对应栏内。 [说明]

已知一棵二叉树用二叉链表存储,t指向根结点,p指向树中任一结点。下列算法为输出从t到p之间路径上的结点。 [函数]

#define MaxSize 1000 typedef struct node TelemType data;

struct node *lchild,*rchild; BiNode, *BiTree;

void Path(BiTree t, BiNode *p)

BiTree *stack EMaxsize], *stack1 [maxsize], *q; int tag[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--;

SSS_FILL 1.

分值: 3 答案:top++ SSS_FILL2.

分值: 3 答案:q=q->lchild SSS_FILL 3.

分值: 3 答案:while(top>0) SSS_FILL 4.

分值: 3

答案:stack1[top1]=q SSS_FILL 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,int end)

int i,c=0, color=s[start],step=(start>end)?-1:1; for i=start; s[i] ==color; i+=step)

if (step>0 && i>end || (1) ) break; (2) ;

return c:

void main()

char t,s[120];

int i,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);

SSS_FILL 1.

分值: 3

答案:step<0 && <end SSS_FILL2.

分值: 3 答案:++c SSS_FILL 3.

分值: 3 答案:s,len-1,c SSS_FILL 4.

分值: 3 答案:s[j-1]=s[j] SSS_FILL 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

#ifndef POINT_H # define POINT_H class Point public:

Point (float x=0,float y=0) ; void setPoint (float, float) ; float getX () const return x; float getY () const return y; protected:

float :x,y; ;

#endif

//POINT.CPP

#include <iostream.h> #include \" point .h \"

Point :: Point (float a, float b) x=a; y=b

void Point::setPoint(float a,float b) x=a; y=b

//CIRCLE . H #ifndef CIRCLE_H #define CIRCLE_H #include \"point.h\"

class Circle: (1) public :

Circle (float r=0.0, float x=0, float y=0) ; void setRadius (float) ; float getRadius () const; float area() const;

protected:

float radius; ;

//CIRCLE.CPP

#include \"iostream.h\" #include \"circle .h \"

Circle::Circle(float r,float a,float b) : (2) radius=r;

void Circle::setRadius (float r) radius=r;

float Circle::getRadius () const return radius;

float Circle::area () const

return 3 .14159*radius*radius ; //text.cpp

#include <iostream.h> #include \" point .h \" #include \" circle .h \" main ()

Circle c(2.5,3.7,4.3) ;

cout<< \"X coordinate is \"<<c.getX () <<\\n Radius is: \"<<c.getRadius ();

(3) ; //设置新的圆心 (2,2) 。 Point &pRef=c;

cout<<\"\\n Circle printed as a point is:\"

<<\"]\"<< (4) <<\".\"<< (5) <<\"]\";

SSS_FILL 1.

分值: 3 答案:public Point SSS_FILL 2.

分值: 3 答案:Point(a,b) SSS_FILL 3.

分值: 3

答案:c.setPoint(2,2) SSS_FILL4.

分值: 3 答案:pRef.getX(), SSS_FILL 5.

分值: 3 答案:pRef.getY()

[解析] 本题以C++语言为载体,考查面向对象程序设计中的几个重要概念——派生类型,构造函数,以及对象的引用。

首先,根据主函数中的c.getX()调用,我们可以判断类Circle对类Point的继承为公有继承,空(1)处应填入public Pointo空(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程序]

import java.io.*;

public class ContinuateInput

public (1) void main(String[] args) (2) IOException int ch;

int counter=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) ;

SSS_FILL1.

分值: 3 答案:static SSS_FILL 2.

分值: 3 答案:throws SSS_FILL3.

分值: 3 答案:read() SSS_FILL 4.

分值: 3 答案:char SSS_FILL5.

分值: 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)。

1

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务