2024年4月1日发(作者:)

初级程序员下午试题-75

(总分90, 做题时间90分钟)

试题一

1.

阅读以下说明和流程图,回答问题将解答填入对应栏。

[说明]

下面的流程图,用来完成计算一组数组中的中值,其方法是:将数组中的

一个值与其他值比较,并计算大于等于被比较数的数值的个数,以及小于等于

被比较数的数值的个数,如果两数都大于n/2,则已经找到了中值,否则继续

之前的步骤。

注:流程中循环开始的说明按照“循环变量:循环初值,循环终值,增

量”格式描述;

[问题]

将流程图的(1)~(5)处补充完整。

SSS_FILL

分值: 15

答案:j=-1; (2) x[j]!=x[i]; (3) count_lower++;

(4) count_lower<(n/2.0)||count higher(n/2.0); (5) x[j];

[解析]

本题目考查流程图。

算法描述在题目中已经详细给出,通过阅读题目可知j用来定位数组中一

个被比较的数,i用来循环遍历数组中所有的数。j应该从第0个数开始,又由

于要执行一步j=j+1,所以(1)中应填入“j=-1”,counUligher++说明遍历的

数比被比较的数大,即(2)中应填入“x[j]!=x[i]”相应的,(3)中就应填入

“count_lower++”,题目说明中已经指出,当count_lower和count_higher

都大于n/2时,就说明找到了中值,所以(4)应当填入“count_lower<

(n/2.0)][count_higher(n/2.0)”,最后,如果循环结束,则x[i]就应该是中

值,(5)中应填入“x[j]”。

试题二

1.

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

[说明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= (1) ;

Lc=(LinkList)malloc(sizeof(Listnode));

Lc->next=Lc;

while(P!=L)

if(p->data>C){

(2) ;

(3) ;

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( (4) ,k);

printf("%d", (5) );

}

}

SSS_FILL

分值: 15

答案:pre->next或L->next (2) pre->neXt=p->next (3) p->

next=Lc->next

(4) 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进制,再输出n%k。因此(4)填“n/k”,(5)填“n%k”。

试题三

1.

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

[说明]

函数int psort(int a[],int n)实现将含n个整数的数组a[]的不同元素

按从小到大顺序存于数组a[]中。实现方法是从未确定的元素列中找到最小元

素并将a[]的第i最小元素交换至a[i]位置。如该最小元素比已确定的最后一

个最小元素大,则将它接在已确定的元素序列的后面;否则,忽视该元素。

[C函数]

int psort(int a[],int n)

{int i,J,k,P;

for(i=0,k=0;i< (1) ;i++){

for(j=i+1, (2) ;j<n; j++)

if(a[p]>a[j])

p=j;

if(p!=i){

t=a[p];

a[p]=a[i];

a[i]=t;

}

if( (3) ) k++;

else if( (4) <a[i])

(5) =a[i];

}

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",a[k]);

printf ("nn");

n=psort(a,(sizeof(a))/sizeof(int));

for(k=0;k<n;k++)

printf("%5d",a[k]);

printf("nn");

}

SSS_FILL

分值: 15

答案:n-1 (2) P=i (3) k==0 (4) a[k-1] (5) a[k++]

[解析]

本程序排序方法是从未确定的元素列中找到最小元素并将a[]的第i最小

元素交换至a[i]位置。如该最小元素比已确定的最后一个最小元素大,则将它

接在已确定的元素序列的后面;否则,忽视该元素。这是采用选择法对数组元

素进行排序,因此空(1)填“n-1”,空(2)填“p=i”。若该最小元素比已确定

的最后一个最小元素大,则将它接在已确定的元素序列的后面;否则,忽视该

元素。因此,空(3)填“k==0”;而当a[k-1]<a[i]时”,则a[k++]=a[i];否

则忽略元素a[i]。所以空(4)填“a[k-1]”空(5)填“a[k++]”。

试题四

1.

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

[说明]

这是一个求解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是无效的参数!n");

return;

}

for(i=0;i<n;i++) A[i]=i+1; /

*

初始化,执行n次

*

/

i= (1) /

*

报名起始位置

*

/

for(k=n;k>1;k-){

if( (2) ) i=0;

i= (3) /

*

寻找出局位置

*

/

if(i!=k-1){

tmp=A[i];

for(j=i;J<k-1;j++) (4) ;

(5) ;

}

}

for(k=0;k<n/2;k++){

tmp=A[k];A[k]=A[n-k+1];A[n-k+1]=tmp;

}

}

SSS_FILL

分值: 15

答案:s-1 (2) i==k (3) (i+m-1)%k (4)

A[j]=A[j+1] (5) A[k-1]=tmp

[解析]

JosephuS问题是一个经典的顺序表问题,所用到的数据结构就是一维数

组。整个算法过程实际上就是一个从n到1的循环。当还剩下k个人的时候,

首先找到出局位置,然后将出局者交换到第k-1位置。循环结束,将数组逆

置,即得到出局序列。空(1)是赋报名起始位置,应填“s-1”:(2)填