1、初级程序员下午试题-75 及答案解析(总分:90.00,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:15.00)1.阅读以下说明和流程图,回答问题将解答填入对应栏。 说明 下面的流程图,用来完成计算一组数组中的中值,其方法是:将数组中的一个值与其他值比较,并计算大于等于被比较数的数值的个数,以及小于等于被比较数的数值的个数,如果两数都大于 n/2,则已经找到了中值,否则继续之前的步骤。 注:流程中循环开始的说明按照“循环变量:循环初值,循环终值,增量”格式描述; 问题 将流程图的(1)(5)处补充完整。(分数:15.00)填空项 1:_二、B试题二/B(总题数:1,分数:15.0
2、0)2.阅读以下函数说明和 C语言函数,将应填入U (n) /U处的字句写在对应栏内。 说明 1 L为一个带头结点的循环链表。函数 LinkList deletenode(LinkList L,int c)的功能是删除 L中数据域 data的值大于 C的所有结点,并由这些结点组建成一个新的带头结点的循环链表,其头指针作为函数的返回值。C函数 1 LinkList deletenode(LinkList L,int c) LinkList Lc,P,pre; pre=L; p=U (1) /U;Lc=(LinkList)malloc(sizeof(Listnode); Lc-next=Lc; w
3、hile(P!=L) if(p-dataC) U (2) /U; U (3) /U; Lc-next=p; p=pre-next; else pre=p; p=pre-next; return Lc; 说明 2 递归函数 dec_to_k_2(int n,int k)的功能是将十进制正整数 n转换成进制数,并打印。 C函数 2 dec to k 2(int n,int k) if(n!=O) dec to k 2(U (4) /U,k); printf(“%d“, U(5) /U); (分数:15.00)填空项 1:_三、B试题三/B(总题数:1,分数:15.00)3.阅读以下函数说明和 C语
4、言函数,将应填入U (n) /U处的字句写在对应栏内。 说明 函数int psort(int a,int n)实现将含 n个整数的数组 a的不同元素按从小到大顺序存于数组 a中。实现方法是从未确定的元素列中找到最小元素并将 a的第 i最小元素交换至 ai位置。如该最小元素比已确定的最后一个最小元素大,则将它接在已确定的元素序列的后面;否则,忽视该元素。 C 函数 int psort(int a,int n) int i,J,k,P; for(i=0,k=0;iU (1) /U;i+) for(j=i+1, U(2) /U;jn; j+) if(apaj) p=j; if(p!=i) t=ap;
5、 ap=ai; ai=t; if(U (3) /U) k+; else if(U (4) /Uai) U (5) /U=ai; return k; int a=5,7,5,6,4,3,4,6,7; main() int k,n; for(k=0;k(Sizeof a)/Sizeof(int);k+) printf(“%5d“,ak); printf (“/n/n“); n=psort(a,(sizeof(a)/sizeof(int); for(k=0;kn;k+) printf(“%5d“,ak); printf(“/n/n“); (分数:15.00)填空项 1:_四、B试题四/B(总题数:1
6、,分数:15.00)4.阅读以下函数说明和 C语言函数,将应填入U (n) /U处的字句写在对应栏内。 说明 这是一个求解 Josephus问题的函数。用整数序列 1,2,3,n 表示顺序围坐在圆桌周围的人,并采用数组表示作为求解过程中使用的数据结构。Josephus 问题描述,设 n个人围坐在一个圆桌周围,现在从第s个人开始报数,数到第 m个人,让他出局;然后从出局的下一个人重新开始报数,数到第 m个人,再让他出局,如此反复直到所有的人全部出局为止。 C函数 void Josephus(int A,int n,s,m) (int i,j,k,temp; if(m=O) printf(“m=0
7、是无效的参数!/n“); return; for(i=0;in;i+) Ai=i+1; / *初始化,执行 n次 */ i=U (1) /U /*报名起始位置 */ for(k=n;k1;k-) if(U (2) /U) i=0; i=U (3) /U /*寻找出局位置 */ if(i!=k-1) tmp=Ai; for(j=i;Jk-1;j+)U (4) /U; U(5) /U; for(k=0;kn/2;k+) tmp=Ak;Ak=An-k+1;An-k+1=tmp; (分数:15.00)填空项 1:_五、B试题五/B(总题数:1,分数:15.00)5.阅读以下说明和 C+程序,将应填入U
8、 (n) /U处的字句写在对应栏内。 说明 下面程序实现十进制向其它进制的转换。 C+程序 #include“ioStream.h“ #include“math.h“ #include typedef struct node int data; node*next; Node; Class Transform DUDlic: void Trans(int d,int i); /d为数字;i 为进制 void print(); private: Node*top; ; void Transform:Trans(int d,int i) int m,n=0; Node*P; while(d0) U
9、 (1) /U; d=d/i; p=new Node; if(!n) p-data=m; U (2) /U; U (3) /U; n+; else p-data=m; U (4) /U; U (5) /U; void Transform:print() Node*P; while(top!=NULL) p=top; if(p-data9) coutdata+55; else coutdata; top=p-next; delete p; (分数:15.00)填空项 1:_六、B试题六/B(总题数:1,分数:15.00)6.阅读以下说明和 Java程序,将应填入U (n) /U处的字句写在对应栏
10、内。 说明 下面程序实现十进制向其它进制的转换。 Java 程序 ClasS Node int data; Node next; class Transform private Node top; public void print() Node p; while(top!=null) P=top; if(P.data9) System.out.print(char)(P.data+55); else System.out.print(p.data); top=p.next; public void Trans(int d,int i)/d为数字;i 为进制 int m; U (1) /Un=
11、false; Node p; while(d0) U (2) /U; d=d/i; p=new Node(); if(U (3) /U) p.data=m; U (4) /U; top=P; n=true; else p.data=m; U (5) /U; top=P; (分数:15.00)填空项 1:_初级程序员下午试题-75 答案解析(总分:90.00,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:15.00)1.阅读以下说明和流程图,回答问题将解答填入对应栏。 说明 下面的流程图,用来完成计算一组数组中的中值,其方法是:将数组中的一个值与其他值比较,并计算大于等于被比较数的数
12、值的个数,以及小于等于被比较数的数值的个数,如果两数都大于 n/2,则已经找到了中值,否则继续之前的步骤。 注:流程中循环开始的说明按照“循环变量:循环初值,循环终值,增量”格式描述; 问题 将流程图的(1)(5)处补充完整。(分数:15.00)填空项 1:_ (正确答案:j=-1; (2) xj!=xi; (3) count_lower+;)解析:(4) count_lower(n/2.0)|count higher(n/2.0); (5) xj; 解析 本题目考查流程图。 算法描述在题目中已经详细给出,通过阅读题目可知 j用来定位数组中一个被比较的数,i 用来循环遍历数组中所有的数。j 应
13、该从第 0个数开始,又由于要执行一步 j=j+1,所以(1)中应填入“j=-1”,counUligher+说明遍历的数比被比较的数大,即(2)中应填入“xj!=xi”相应的,(3)中就应填入“count_lower+”,题目说明中已经指出,当 count_lower和 count_higher都大于 n/2时,就说明找到了中值,所以(4)应当填入“count_lower(n/2.0)count_higher(n/2.0)”,最后,如果循环结束,则xi就应该是中值,(5)中应填入“xj”。二、B试题二/B(总题数:1,分数:15.00)2.阅读以下函数说明和 C语言函数,将应填入U (n) /U
14、处的字句写在对应栏内。 说明 1 L为一个带头结点的循环链表。函数 LinkList deletenode(LinkList L,int c)的功能是删除 L中数据域 data的值大于 C的所有结点,并由这些结点组建成一个新的带头结点的循环链表,其头指针作为函数的返回值。C函数 1 LinkList deletenode(LinkList L,int c) LinkList Lc,P,pre; pre=L; p=U (1) /U;Lc=(LinkList)malloc(sizeof(Listnode); Lc-next=Lc; while(P!=L) if(p-dataC) U (2) /U;
15、 U (3) /U; Lc-next=p; p=pre-next; else pre=p; p=pre-next; return Lc; 说明 2 递归函数 dec_to_k_2(int n,int k)的功能是将十进制正整数 n转换成进制数,并打印。 C函数 2 dec to k 2(int n,int k) if(n!=O) dec to k 2(U (4) /U,k); printf(“%d“, U(5) /U); (分数:15.00)填空项 1:_ (正确答案:pre-next 或 L-next (2) pre-neXt=p-next (3) p-next=Lc-next)解析:(4)
16、 n/k (5) n%k 解析 函数 1是考察链表的删除和插入的操作。(1)空所在语句是对指针 P赋初值,应填“pre-next”或“L-next”,通过下面的程序可以判断指针 pre所指的结点是指针 p所指结点前驱结点。(2)、(3)空所在的语句块是处理当指针 p所指的结点是一个大于 C的结点,则将该结点从链表 L中删除,再将它插入到链表 Lc中。分别填“pre-next=p-next”和“p-next=-Lc-next” 。 函数 2是一个递归函数,采用除 k取余法。最开始得到余数作为 k进制数的最低位,最后得到的余数作为k进制数的最高位。用递归法求解时,先将 n/k转换成 k进制,再输出
17、 n%k。因此(4)填“n/k”,(5)填“n%k”。三、B试题三/B(总题数:1,分数:15.00)3.阅读以下函数说明和 C语言函数,将应填入U (n) /U处的字句写在对应栏内。 说明 函数int psort(int a,int n)实现将含 n个整数的数组 a的不同元素按从小到大顺序存于数组 a中。实现方法是从未确定的元素列中找到最小元素并将 a的第 i最小元素交换至 ai位置。如该最小元素比已确定的最后一个最小元素大,则将它接在已确定的元素序列的后面;否则,忽视该元素。 C 函数 int psort(int a,int n) int i,J,k,P; for(i=0,k=0;iU (
18、1) /U;i+) for(j=i+1, U(2) /U;jn; j+) if(apaj) p=j; if(p!=i) t=ap; ap=ai; ai=t; if(U (3) /U) k+; else if(U (4) /Uai) U (5) /U=ai; return k; int a=5,7,5,6,4,3,4,6,7; main() int k,n; for(k=0;k(Sizeof a)/Sizeof(int);k+) printf(“%5d“,ak); printf (“/n/n“); n=psort(a,(sizeof(a)/sizeof(int); for(k=0;kn;k+)
19、printf(“%5d“,ak); printf(“/n/n“); (分数:15.00)填空项 1:_ (正确答案:n-1 (2) P=i (3) k=0 (4) ak-1 (5) ak+)解析:解析 本程序排序方法是从未确定的元素列中找到最小元素并将 a的第 i最小元素交换至 ai位置。如该最小元素比已确定的最后一个最小元素大,则将它接在已确定的元素序列的后面;否则,忽视该元素。这是采用选择法对数组元素进行排序,因此空(1)填“n-1”,空(2)填“p=i”。若该最小元素比已确定的最后一个最小元素大,则将它接在已确定的元素序列的后面;否则,忽视该元素。因此,空(3)填“k=0”;而当 ak-
20、1ai时”,则 ak+=ai;否则忽略元素 ai。所以空(4)填“ak-1”空(5)填“ak+”。四、B试题四/B(总题数:1,分数:15.00)4.阅读以下函数说明和 C语言函数,将应填入U (n) /U处的字句写在对应栏内。 说明 这是一个求解 Josephus问题的函数。用整数序列 1,2,3,n 表示顺序围坐在圆桌周围的人,并采用数组表示作为求解过程中使用的数据结构。Josephus 问题描述,设 n个人围坐在一个圆桌周围,现在从第s个人开始报数,数到第 m个人,让他出局;然后从出局的下一个人重新开始报数,数到第 m个人,再让他出局,如此反复直到所有的人全部出局为止。 C函数 void
21、 Josephus(int A,int n,s,m) (int i,j,k,temp; if(m=O) printf(“m=0是无效的参数!/n“); return; for(i=0;in;i+) Ai=i+1; / *初始化,执行 n次 */ i=U (1) /U /*报名起始位置 */ for(k=n;k1;k-) if(U (2) /U) i=0; i=U (3) /U /*寻找出局位置 */ if(i!=k-1) tmp=Ai; for(j=i;Jk-1;j+)U (4) /U; U(5) /U; for(k=0;kn/2;k+) tmp=Ak;Ak=An-k+1;An-k+1=tmp
22、; (分数:15.00)填空项 1:_ (正确答案:s-1 (2) i=k (3) (i+m-1)%k (4) Aj=Aj+1 (5) Ak-1=tmp)解析:解析 JosephuS 问题是一个经典的顺序表问题,所用到的数据结构就是一维数组。整个算法过程实际上就是一个从 n到 1的循环。当还剩下 k个人的时候,首先找到出局位置,然后将出局者交换到第k-1位置。循环结束,将数组逆置,即得到出局序列。空(1)是赋报名起始位置,应填“s-1”:(2)填“i=k”。空(3)是寻找出局位置,应填“(i+m-1)%k”。数组 A的元素要循环向右移动一个位置,则(4)填“Aj=Aj+1(5)填“Ak-1=t
23、mp”。五、B试题五/B(总题数:1,分数:15.00)5.阅读以下说明和 C+程序,将应填入U (n) /U处的字句写在对应栏内。 说明 下面程序实现十进制向其它进制的转换。 C+程序 #include“ioStream.h“ #include“math.h“ #include typedef struct node int data; node*next; Node; Class Transform DUDlic: void Trans(int d,int i); /d为数字;i 为进制 void print(); private: Node*top; ; void Transform:T
24、rans(int d,int i) int m,n=0; Node*P; while(d0) U (1) /U; d=d/i; p=new Node; if(!n) p-data=m; U (2) /U; U (3) /U; n+; else p-data=m; U (4) /U; U (5) /U; void Transform:print() Node*P; while(top!=NULL) p=top; if(p-data9) coutdata+55; else coutdata; top=p-next; delete p; (分数:15.00)填空项 1:_ (正确答案:m=d%i (
25、2) top=p (3) top-next=NULL (4) p-next=top (5) top=p)解析:解析 本题考查 C+编程,主要考查了链表的使用。 所有的问题只出在函数 Trans中,它的功能是完成将十进制数 d转换为任意进制 i的数,并存在数组中。函数中首先定义了一个指向链表结点的指针,然后开始进行转换,进制转换应该是一个很常见的问题,就是不断的求模运算,所以(1)处应填入“m=d%i”。然后,我们要把求模的结果保存到链表结点中,并使链表首指针指向该结点,结点中指向下一个结点”的指针设为空,所以(2)处应填入“top=p”,(3)处应填入“top-next=NULL”。由于求模运
26、算是从低位到高位逐位求出的,所以在我们在进行完第二次求模运算后,应该将第二次运算的结果放到链表首位,所以(4)处应填入“P-next=top”,(5)处应填入“top=p”。六、B试题六/B(总题数:1,分数:15.00)6.阅读以下说明和 Java程序,将应填入U (n) /U处的字句写在对应栏内。 说明 下面程序实现十进制向其它进制的转换。 Java 程序 ClasS Node int data; Node next; class Transform private Node top; public void print() Node p; while(top!=null) P=top;
27、if(P.data9) System.out.print(char)(P.data+55); else System.out.print(p.data); top=p.next; public void Trans(int d,int i)/d为数字;i 为进制 int m; U (1) /Un=false; Node p; while(d0) U (2) /U; d=d/i; p=new Node(); if(U (3) /U) p.data=m; U (4) /U; top=P; n=true; else p.data=m; U (5) /U; top=P; (分数:15.00)填空项 1
28、:_ (正确答案:boolean (2) m=d%i (3) !n (4) top-next=null (5) p-next=top)解析:解析 本题考查 Java编程,主要考查了链表的使用。 所有的问题只出在函数 Trans中,它的功能是完成将十进制数 d转换为任意进制 i的数,并存在数组中。变量 n被赋值为 false,说明 n是布尔型变量,Java 中布尔型变量关键字为 boolean。故(1)应填“boolean”。函数中首先定义了一个指向链表结点的指针(实为链栈),然后开始进行转换,进制转换应该是一个很常见的问题,就是不断地求模运算,所以(2)处应填入“m=d%i”。然后,我们要把求模的结果保存到链栈中。对于链栈,第一个结点比较特殊,需要特殊处理,从 if块中的语句“n=true”可知,此处正是处理第一个结点的特殊情况,故(3)应填“!n”,(4)处应填入“top-next=null”。这里采用的链栈,所以(5)处应填入“p-next=top”。