初级程序员下午试题-75
(总分90, 做题时间90分钟)
试题一
1.
阅读以下说明和流程图,回答问题将解答填入对应栏。
[说明]
下面的流程图,用来完成计算一组数组中的中值,其方法是:将数组中的一个值与其他值比较,并计算大于等于被比较数的数值的个数,以及小于等于被比较数的数值的个数,如果两数都大于n/2,则已经到了中值,否则继续之前的步骤。
注:流程中循环开始的说明按照“循环变量:循环初值,循环终值,增量”格式描述;
[问题]
将流程图的(1)~(5)处补充完整。
分值: 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) );
}
}
分值: 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]; while语句流程图的例题
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 ("\n\n");
n=psort(a,(sizeof(a))/sizeof(int));
for(k=0;k<n;k++)
printf("%5d",a[k]);
printf("\n\n");
}
分值: 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-){
这是一个求解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;
}
}
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;
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论