●试题一
阅读下列说明和流程图,将应填入(n)处的语句写在答题纸的对应栏内。
【说明】
下列流程图用于从数组K中找出一切满足:K(I)+K(J)=M的元素对(K(I),K(J))(1≤I≤J≤N)。假定数组K中的N个不同的整数已按从小到大的顺序排列,M是给定的常数。
【流程图】
此流程图1中,比较"K(I)+K(J)∶M"最少执行次数约为 (5) 。
图1
第1题:
阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。
[说明]
函数Printprime(int UpBound)的功能是输出1到UpBound以内的全体素数。
[函数2.1]
void PrintPrime(int UpBound)
printf("2," );
for(i=3; i<UpBound; i+ =2) {
int k = sqrt(i);
for(j=3; j<= k;(1)) /*检查i是否有3到k以入的奇因数*/
if((2)) break;
fi((3)) printf("%d", i);
[函数2.2说明]
递归函数invert(int a[],int k),int k)的功能是将数组a中的前k个元素逆置。
[函数2.2]
void invert(int a[ ], int k)
{ int t;
if ((4)) {
invert((5));
t=a[0];
a[0] =a[k-1];
a[k-l]=t;
}
}
第2题:
以下程序段是函数返回a所指数组中最大的值所在的下标值,横线处的语句为( )。 fun(int*a, int n) { int i,j=0,k; k=j; for(i=j;i<n;i++) if[a[i]>a[k])______; return(k); }
A.k=i
B.k=j
C.i=j
D.i=n
第3题:
试题二(共 15分)
阅读以下说明和C函数,将应填入 (n) 处的字句写在答题纸的对应栏内。
【说明 1】
函数Counter(int n, int w[])的功能是计算整数n的二进制表示形式中1的个数,同时用数组w记录该二进制数中1所在位置的权。
例如,十进制数22的二进制表示为10110。对于该二进制数,1的个数为3,在w[0]中存入2(即21)、w[1]中存入4(即22)、w[2]中存入16(即24)。
【C函数 1】
int Counter(int n, int w[])
{ int i = 0, k = 1;
while ( (1) ) {
if (n % 2) w[i++] = k;
n = n / 2; (2) ;
}
return i;
}
【说明 2】
函数 Smove(int A[], int n)的功能是将数组中所有的奇数都放到所有偶数之前。其过程为:设置数组元素下标索引i(初值为0)和j(初值为n-1),从数组的两端开始检查元素的奇偶性。若 A[i]、A[j]都是奇数,则从前往后找出一个偶数,再与 A[j]进行交换;
若 A[i]、A[j]都是偶数,则从后往前找出一个奇数,再与A[i]进行交换;若 A[i]是偶数而A[j]是奇数,则交换两者,直到将所有的奇数都排在所有偶数之前为止。
【C函数 2】
void Smove(int A[], int n)
{ int temp, i = 0, j = n-1;
if ( n < 2 ) return;
while ( i < j ) {
if ( A[i] % 2 == 1 && A[j] % 2 == 1 ) { (3) ; }
else if ( A[i] % 2 == 0 && A[j] % 2 == 0 ) { (4) ; }
else {
if ( (5) ) {
temp = A[i]; A[i] = A[j]; A[j] = temp;
}
i++, j--;
}
}
}
试题二参考答案
(1)n!=0,或其等价形式 (3分)
若考生解答为n>0,给1分
(2)k=k*2,或k*=2,或k+=k,或k=k +k,或其等价形式 (3分)
(3)i++,或++i,或i+=1,或i=i+1,或其等价形式 (3分)
(4)j--,或--j,或j-=1,或j=j-1,或其等价形式 (3分)
(5)A[i]%2==0&&A[j]%2==1 (3分)
或A[i]%2==0&&A[j]%2
或!(A[i]%2)&&A[j]%2,或其等价形式
第4题:
阅读以下说明和C++ 程序,将应填入(n)处的字句写在对应栏内。
[说明]
试从含有n个int 型数的数组中删去若干个成分,使剩下的全部成分构成一个不减的子序列。设计算法和编写程序求出数组的不减子序列的长。
[C++ 程序]
include<stdio.h>
define N 100
int b[]={9,8,5,4,3,2,7,6,8,7,5,3,4,5,9,1};
int a [N];
define n sizeofb/sizeofb[0]
void main ( )
{
kit k,i,j;
(1)
(2)
for (i=1;i<n; i++ )
{
for ( j=k;(3); j--);
(4); /*长为 j+1 的子序列的终元素存储在 a[j+1]*/
if ((5)k++; /*最长不减子序列长 k 增1*/
}
printf ( "K = %d\n ",k );
}
第5题:
阅读下列说明和流程图,将应填入(n)处的语句写在对应栏内。
【说明】
下列流程图用于从数组K中找出一切满足:K(I)+K(J)=M的元素对(K(I),K(J))(1≤I≤J≤N)。假定数组K中的N个不同的整数已按从小到大的顺序排列,M是给定的常数。
【流程图】
此流程图1中,比较“K(I)+K(J):M”最少执行次数约为(5)。
第6题:
阅读下列程序说明和C代码,把应填入其中n处的字句写在答卷的对应栏内。
【说明】
程序利用选择排序算法对数组a中的N个整数按照从小到大的顺序排列,并将排序结果显示出来。
【程序】
define N 10
main()
{
void (1);
int i,a[N];
for(i=0;i<10,i++) /*输入*/
scanf(“%d”,&a[i]);
(2);
for(i=0;i<N,i++) /*输出*/
printf(“%3d”,a[i]);
}
void selectSon(int x[],int n)
{
int i,j,k,t;
for(int i=0; (3);i++)
{
k=i;
for(j=i+1;j<n;j++)
if (4) k=j;
if (5)
{t=x[i];x[i]=x[k];x[k] =t;}
}
}
第7题:
已知有一维数组A[0...m*n-1],若要对应为m行、n列的矩阵,则下面的对应关系______可将元素A[k](0≤k<m*n)表示成矩阵的第i行、第j列的元素(0≤i<m,0≤j<n)。
A.i=k/n,j=k%m
B.i=k/m,j=k%m
C.i=k/n,j=k%n
D.i=k/m,j=k%n
第8题:
●试题二
阅读下列函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明2.1】
以下C语言函数用二分插入法实现对整型数组a中n个数的排序功能。
【函数2.1】
void fun1(int a[])
{int i,j,k,r,x,m;
for(i=2;i<=n;i++)
{ (1) ;
k=1;r=i-1;
while(k<=r)
{m=(k+r)/2;
if(x<a[m])r=m-1;
else (2) ;
}
for(j=i-1;j>=k;j--)
a[j+1]=a[j];
(3) ;
}
}
【说明2.2】
以下程序可以把从键盘上输入的十进制数(1ong型)以二~十六进制形式输出。
【程序2.2】
#include<stdio.h>
main()
{char b[16]={′0′,′1′,′2′,′3′,′4′,′5′,′6′,′7′,′8′,′9′,′A′,′B′,′C′,′D′,′E′,′F′};
int c[64],d,i=0,base;
long n;
printf(″enter a number:′n″);
scanf(″%1d″,&n);
printf(″enter new basc:kn″);
scanf(″%d″,&base);
do
{c[i]= (4) ;
i++;n=n/base;
}while(n!=0);
printf("transmite new base:\n");
for(--i;i>=0;--i)
{ d=c[i];
printf("%c", (5) );
}
}
●试题二
【答案】(1)x=a[i](2)a[k]=x(3)k=m+1(4)n%base(5)b[d]
【解析】函数3.1的思想是依次将数组中的每一个元素插入到有序段中,使有序段的长度不断地扩大。对于待插入元素,先用二分查找法找出应该插入的位置。然后将元素插入。对数组来说,就是将该位置以后的元素依次后移,然后将待插入元素放到移出来的空位中。
程序3.2用的思想是除base(base在二~十六进制之间)取余法求得相应进制数,然后再转换输出。
第9题:
阅读以下函数说明和C语言函数,将应填入(n)处的语句写在对应栏内。
【函数2.1说明】
有1、2、3、4四个数字,输出由这些数字组成的互不相同且无重、复数字的三位数。
【函数2.1】
main()
{
int i,j,k;
printf("\n");
for((1)) /*以下为三重循环*/
for(j=1; j<5;j++)
for (k=1;k<5;k++)
{
if ((2)) /*确保i, j, k 三位互不相同*/
printf("%d,%d,%d\n",i,j,k);
}
}
【函数2.2说明】
计算并输出100之内的素数,每行输出10个,超过10个则换行。
【函数2.2】
include <stdio.h>
include "math.h"
define N 101
main()
{
int i,j,line,a[N];
for(i=2;i<N;i++)(3);
for(i=2;i<sqrt(N);i++)
for(j=i+1;j<N;j++)
{
if(a[i]!=0&&a[j]!=0)
if(a[j]%a[i]==0)
(4);
}
printfC\n");
for(i=2,line=0;i<N;i++)
{
if(a[i]!=0)
{
prinff("%5d",a[i]);
(5);
}
if(line==10)
{
prinff("\n");
line=0;
}
}
}
第10题:
阅读以下说明和C++程序,将应填(n)处的字句写在对应栏内。
[说明]
设计一程序,输入10个整数到一个数组中,调整这10个数在数组中的位置,使得其中最小的一个数成为数组的首元素,最大的一个数成为数组的末元素。
[C++程序]
include <iostream.h>
define SIZE 10
void main ( )
{
int data [SIZE];
int m;
cout<<"请输入"<<SIZE<<"个整数:";
for ( m=0;m<SIZE; m++ ) (1);
int j=0,k=0;
for ( int i=1;i<SIZE; i++ )
if ((2)) j=i;
else if ( data[i]<data[k] ) (3);
if (j>0 ) {
int d=data[0];
(4);
data[k]=d;
}
if ( k<SIZE-1 )
{
int d=data [SIZE- 1 ];
data[SIZE- 1 ]=data[j];
(5);
}
cout<<end1<<" 排序后: ";
for ( m=0;m<SIZE; m++ ) cout<<data[m]<<" " ;
}