计算机二级C语言上机真题(47)【附详解】
【真题1】 给定程序的功能是将十进制正整数m转换成k 进制(2≤k≤9)数的数
字输出。
例如,若输入8 和2,则应输出1000(即十进制数8 转换成二进制表示是
1000)。
#include < stdio.h >void fun( int m, int k )
{ int aa[20], i;
for( i = 0; m; i++ ) {
/**********found**********/
aa[i] = ___1___;
/**********found**********/
m /= ___2___;
}
for( ; i; i-- )
/**********found**********/
printf( "%d", ___3___[ i-1 ] );
}
main()
{ int b, n;
printf( "\nPlease enter a number and a base:\n" );
scanf( "%d %d", &n, &b );
fun( n, b );
}
(2011年2月)
解析: 本题的考核点是数制的转换。
将十进制正整数转换为k 进制(2≤k≤9)数的方法:
将已知的十进制正整数反复除k,余数为k-1,相应位为k-1;余数为0,相应
位为0。从低位向高位逐次进行,一直到用k 去除后,商为0 时为止,最后一
次除法所得的余数为Xn,则XnXn-1Xn-2…X1X0。
题中第一个空填"m%k":此语句是将十进制的整型数据m 转换为k 进制数据
时,将余数保存在数组aa中。
题中第二个空填"k":此语句是将十进制的整型数据m 转换为k进制数据时,
每除一次k 后,把商重新赋值给正整数m,以便重复取余。
题中第三个空填"aa":在for 循环之后,i即为转换成的k进制数的位数,所以
根据题意要求,此语句应该是:"printf("%d", aa[i - 1]);"。
答案:【1】m%k 【2】k 【3】aa
【真题2】 给定程序modi.c 中,函数fun 的功能是:求出a 所指数组中最大数和
次最大数(规定最大数和次最大数不在a[0]和a[1]中,依次和a[0]、a[1]中的数
对调。
例如数组中原有的数为:7、10、12、0、3、6、9、11、5、8,
输出的结果为:12、11、7、0、3、6、9、10、5、8。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main 函数,
#include < conio.h >#include < stdio.h >#define N 20
int fun(int *a,int n)
{ int i,m,t,k;
for (i=0;i< 2;i++)
{
/************found************/
m=0;
for (k=i;k< n;k++)
/************found************/
if(a[k] >a[m]) k=m;
t=a[i];a[i]=a[m];a[m]=t;
}
}
main()
{ int x,b[N]={11,5,12,0,3,6,9,7,10,8},n=10,i;
clrscr();
for (i=0;i< n;i++) printf("%d ",b[i]);
printf("\n");
fun(b,n);
for(i=0;i< n;i++) printf("%d ",b[i]);
printf("\n");
}
(2011年2月)
解析: 本题的考核点是循环语句和常用算法。
本题要求将最大数和a[0]中的数对调,把次最大数和a[1]中的数对调。题目给
程序fun 函数定义了变量t作为中间元素,因此对调过程应如下:t = a;a =b;b = t;然而fun 函数中两次对调均没有形成三角型赋值,是错误的。应该把"
t= a[0]; a[m1]=a[0]; a[m1] = t;"语句 和"t= a[1]; a[m2]=a[1];
a[m2] = t;"语句改为"t = a[0]; a[0] = a[m1]; a[m1] = t; "和"t= a[1];
a[1]=a[m2]; a[m2] = t;"语句或相同作用的语句。
【真题3】 编写函数int fun(int lim, int aa[MAX]),该函数的功能是求出小于或
等于lim 的所有素数并放在aa 数组中,该函数返回所求出的素数的个数。
注意:部分源程序给出如下。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入所编
写的若干语句。
试题程序:
#include< conio.h >#include< stdio.h >#define MAX 100
int fun(int lim, int aa[MAX])
{ ……}
main()
{ int limit,i,sum;
int aa[MAX];
clrscr();
printf("输入一个整数");
scanf("%d",&limit);
sum=fun(limit,aa);
for(i=0;i< sum;i++)
{
if(i%10==0&&i!=0) /*每行输出10 个数*/
printf("\n ");
printf("%5d ",aa[i]);
}
}
解析: int fun(int lim, int aa[MAX])
{
int i,j,k=0;
for(i=2;i< =lim;i++) /*求出小于或等于lim的全部素数*/
{ for(j=2;j< i;j++)
if(i%j==0) break;
if(j >=i)
aa[k++]=i; /*将求出的素数放入数组aa中*/
}
return k; /*返回所求出的素数的个数*/
}
在做这道题时,我们只需掌握素数的基本算法就可以了,一般判断素数的方法
如下:
现判定i变量中存放的值是否为素数:
main( )
{int i,j;
printf(“请输入一个整数:\n”);
scanf(“%d”,&i);
for(j=2;j< i;j++)
if(i%j==0) break;
if(j==i)
printf(“%d为素数!”,i);
else
printf(“%d不为素数”,i);
}
字输出。
例如,若输入8 和2,则应输出1000(即十进制数8 转换成二进制表示是
1000)。
#include < stdio.h >void fun( int m, int k )
{ int aa[20], i;
for( i = 0; m; i++ ) {
/**********found**********/
aa[i] = ___1___;
/**********found**********/
m /= ___2___;
}
for( ; i; i-- )
/**********found**********/
printf( "%d", ___3___[ i-1 ] );
}
main()
{ int b, n;
printf( "\nPlease enter a number and a base:\n" );
scanf( "%d %d", &n, &b );
fun( n, b );
}
(2011年2月)
解析: 本题的考核点是数制的转换。
将十进制正整数转换为k 进制(2≤k≤9)数的方法:
将已知的十进制正整数反复除k,余数为k-1,相应位为k-1;余数为0,相应
位为0。从低位向高位逐次进行,一直到用k 去除后,商为0 时为止,最后一
次除法所得的余数为Xn,则XnXn-1Xn-2…X1X0。
题中第一个空填"m%k":此语句是将十进制的整型数据m 转换为k 进制数据
时,将余数保存在数组aa中。
题中第二个空填"k":此语句是将十进制的整型数据m 转换为k进制数据时,
每除一次k 后,把商重新赋值给正整数m,以便重复取余。
题中第三个空填"aa":在for 循环之后,i即为转换成的k进制数的位数,所以
根据题意要求,此语句应该是:"printf("%d", aa[i - 1]);"。
答案:【1】m%k 【2】k 【3】aa
【真题2】 给定程序modi.c 中,函数fun 的功能是:求出a 所指数组中最大数和
次最大数(规定最大数和次最大数不在a[0]和a[1]中,依次和a[0]、a[1]中的数
对调。
例如数组中原有的数为:7、10、12、0、3、6、9、11、5、8,
输出的结果为:12、11、7、0、3、6、9、10、5、8。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main 函数,
#include < conio.h >#include < stdio.h >#define N 20
int fun(int *a,int n)
{ int i,m,t,k;
for (i=0;i< 2;i++)
{
/************found************/
m=0;
for (k=i;k< n;k++)
/************found************/
if(a[k] >a[m]) k=m;
t=a[i];a[i]=a[m];a[m]=t;
}
}
main()
{ int x,b[N]={11,5,12,0,3,6,9,7,10,8},n=10,i;
clrscr();
for (i=0;i< n;i++) printf("%d ",b[i]);
printf("\n");
fun(b,n);
for(i=0;i< n;i++) printf("%d ",b[i]);
printf("\n");
}
(2011年2月)
解析: 本题的考核点是循环语句和常用算法。
本题要求将最大数和a[0]中的数对调,把次最大数和a[1]中的数对调。题目给
程序fun 函数定义了变量t作为中间元素,因此对调过程应如下:t = a;a =b;b = t;然而fun 函数中两次对调均没有形成三角型赋值,是错误的。应该把"
t= a[0]; a[m1]=a[0]; a[m1] = t;"语句 和"t= a[1]; a[m2]=a[1];
a[m2] = t;"语句改为"t = a[0]; a[0] = a[m1]; a[m1] = t; "和"t= a[1];
a[1]=a[m2]; a[m2] = t;"语句或相同作用的语句。
【真题3】 编写函数int fun(int lim, int aa[MAX]),该函数的功能是求出小于或
等于lim 的所有素数并放在aa 数组中,该函数返回所求出的素数的个数。
注意:部分源程序给出如下。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入所编
写的若干语句。
试题程序:
#include< conio.h >#include< stdio.h >#define MAX 100
int fun(int lim, int aa[MAX])
{ ……}
main()
{ int limit,i,sum;
int aa[MAX];
clrscr();
printf("输入一个整数");
scanf("%d",&limit);
sum=fun(limit,aa);
for(i=0;i< sum;i++)
{
if(i%10==0&&i!=0) /*每行输出10 个数*/
printf("\n ");
printf("%5d ",aa[i]);
}
}
解析: int fun(int lim, int aa[MAX])
{
int i,j,k=0;
for(i=2;i< =lim;i++) /*求出小于或等于lim的全部素数*/
{ for(j=2;j< i;j++)
if(i%j==0) break;
if(j >=i)
aa[k++]=i; /*将求出的素数放入数组aa中*/
}
return k; /*返回所求出的素数的个数*/
}
在做这道题时,我们只需掌握素数的基本算法就可以了,一般判断素数的方法
如下:
现判定i变量中存放的值是否为素数:
main( )
{int i,j;
printf(“请输入一个整数:\n”);
scanf(“%d”,&i);
for(j=2;j< i;j++)
if(i%j==0) break;
if(j==i)
printf(“%d为素数!”,i);
else
printf(“%d不为素数”,i);
}