计算机二级C语言上机真题(58)【附详解】
【真题1】 给定程序中,函数fun()的功能是:使数组中的元素的值增加10 倍。
试题程序:
#include< stdio.h >#include< conio.h >int m[10];
__1__ fun(void)
{
int j;
printf("In subfunc after calling\n");
for(j=0; 2__;j++)
{
m[j]= 3__;
printf("%3d", m[j]);
}
}
main()
{int i;
printf("In main before calling\n");
for(i=0;i< 10;i++)
{
m[i]=i;
printf("%3d",m[i]);
}
fun();
printf("\nIn main after calling\n");
for(i=0;i< 10;i++)
printf("%3d",m[i]);
getch();
}
(2011年2月)
解析: 填空1:通过对C语言的学习我们知道这里要填一个函数类型,可以看
到这个函数没有返回语句,所以应该是void型的,要注意的是void虽然是空
类型,但必须写,因为不写时默认是整型。
填空2:这里问的是结束判断语句,函数的作用是将数组中每一个数乘以10,
可见这里应填j< 10。
填空3:这个函数很简单,循环的作用就是依次处理每一个数据,这里要完成函
数对数组的操作。
答案:【1】void 【2】j< 10 【3】m[j]*10
【真题2】 给定程序modi.c 的功能是:读入一个整数k(2≤k≤10000),打印它的
所有质因子(即所有为素数的因子)。例如,若输入整数:2310,则应输出:2、
3、5、7、11。
请改正程序中的语法错误,使程序能得出正确的结果。
注意:不要改动main 函数,
#include "conio.h"
#include "stdio.h"
/************found************/
Isprime(int n);
{ int i,m;
m=1;
for(i=2;i< n;i++)
/************found************/
if !(n%i)
{ m=0;break;}
return(m);
}
main()
{int j,k;
clrscr();
printf("\nPlease enter an integer number between 2 and
10000:");scanf("%d",&k);
printf("\n\nThe prime factor(s) of %d is (are):",k);
for(j=2;j< =k;j++)
if ((!(k%j))&&(Isprime(j))) printf("\n %4d",j);
printf("\n");
}
(2011年2月)
解析: 本题的考核点是C语言的一些基本用法以及 if 语句的使用。
本题中Isprime(int n);是函数的定义,定义语句不应用分号结束。所以,
"Isprime(int n);"应改为"Isprime(int n) "。
根据 if 语句的语法规则,if 后的表达式必须由括号括起来。由题意看出,n 整
除 i 时,也就是说 "n%i==0"时,循环才继续进行。因此,"if !(n%i) "应改
为"if (!(n%i)) "或相同作用的语句。
【真题3】 程序定义了N×N 的二维数组,并在主函数中自动赋值。请编写函数
fun(int a[][N]),函数的功能是:使数组中第一行元素中的值与倒数第一行元素中
的值对调、第二行元素中的值与倒数第二行元素中的值对调、……、其他依次类推。
例如:a数组中的值为
|0 11 12 7 9|
|1 9 7 4 5|
|20 13 18 3 1|
a= |14 5 6 8 2|
|15 9 17 4 1|
|15 9 17 4 1|
|14 5 6 8 2|
则返回主程序后a 数组中的值应为|20 13 18 3 1|
|1 9 7 4 5|
|0 11 12 7 9|
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#define N 5
int fun ( int a[][N] )
{……}
main ( )
{ int a[N][N], i, j;
clrscr();
printf("***** The array *****\n");
for ( i =0; i< N; i++ )
{ for ( j =0; j< N; j++ )
{ a[i][j] = rand()%30; printf( "%4d", a[i][j] ); }
printf("\n");
}
fun ( a );
printf ("***** THE RESULT *****\n");
for ( i =0; i< N; i++ )
{ for ( j =0; j< N; j++ ) printf( "%4d", a[i][j] );
printf("\n");
}
}
(2011年2月)
解析: 本题的考核点是C语言中循环嵌套语句的使用。
提示思路:对于本题,我们给出的参考函数采取的算法是:使用嵌套循环,外
循环是行循环,内循环是列循环。将第一行各元素的值与倒数第一行各元素的
值对调,第二行元素中的值与倒数第二行元素中的值对调,……,因为一次互换
两个元素,所以 for 循环语句执行N/2 次(N 是数组行的长度)就可以把全部
元素值互换一遍。
int fun ( int a[][N] )
{ int i, j,k;
for (i=0;i< N/2;i++)
for (j=0;j< N;j++)
{ /*将a[i][j]与a[N-i-1][j]中的元素进行对换*/
k=a[ i ][ j ];
a[ i ][ j ]=a[ N-i-1 ][ j ];
a[ N-i-1][ j ]=k;
}/*按先行后列的顺序,对数组a中的元素以中间行为对称线进行倒置*/
}
试题程序:
#include< stdio.h >#include< conio.h >int m[10];
__1__ fun(void)
{
int j;
printf("In subfunc after calling\n");
for(j=0; 2__;j++)
{
m[j]= 3__;
printf("%3d", m[j]);
}
}
main()
{int i;
printf("In main before calling\n");
for(i=0;i< 10;i++)
{
m[i]=i;
printf("%3d",m[i]);
}
fun();
printf("\nIn main after calling\n");
for(i=0;i< 10;i++)
printf("%3d",m[i]);
getch();
}
(2011年2月)
解析: 填空1:通过对C语言的学习我们知道这里要填一个函数类型,可以看
到这个函数没有返回语句,所以应该是void型的,要注意的是void虽然是空
类型,但必须写,因为不写时默认是整型。
填空2:这里问的是结束判断语句,函数的作用是将数组中每一个数乘以10,
可见这里应填j< 10。
填空3:这个函数很简单,循环的作用就是依次处理每一个数据,这里要完成函
数对数组的操作。
答案:【1】void 【2】j< 10 【3】m[j]*10
【真题2】 给定程序modi.c 的功能是:读入一个整数k(2≤k≤10000),打印它的
所有质因子(即所有为素数的因子)。例如,若输入整数:2310,则应输出:2、
3、5、7、11。
请改正程序中的语法错误,使程序能得出正确的结果。
注意:不要改动main 函数,
#include "conio.h"
#include "stdio.h"
/************found************/
Isprime(int n);
{ int i,m;
m=1;
for(i=2;i< n;i++)
/************found************/
if !(n%i)
{ m=0;break;}
return(m);
}
main()
{int j,k;
clrscr();
printf("\nPlease enter an integer number between 2 and
10000:");scanf("%d",&k);
printf("\n\nThe prime factor(s) of %d is (are):",k);
for(j=2;j< =k;j++)
if ((!(k%j))&&(Isprime(j))) printf("\n %4d",j);
printf("\n");
}
(2011年2月)
解析: 本题的考核点是C语言的一些基本用法以及 if 语句的使用。
本题中Isprime(int n);是函数的定义,定义语句不应用分号结束。所以,
"Isprime(int n);"应改为"Isprime(int n) "。
根据 if 语句的语法规则,if 后的表达式必须由括号括起来。由题意看出,n 整
除 i 时,也就是说 "n%i==0"时,循环才继续进行。因此,"if !(n%i) "应改
为"if (!(n%i)) "或相同作用的语句。
【真题3】 程序定义了N×N 的二维数组,并在主函数中自动赋值。请编写函数
fun(int a[][N]),函数的功能是:使数组中第一行元素中的值与倒数第一行元素中
的值对调、第二行元素中的值与倒数第二行元素中的值对调、……、其他依次类推。
例如:a数组中的值为
|0 11 12 7 9|
|1 9 7 4 5|
|20 13 18 3 1|
a= |14 5 6 8 2|
|15 9 17 4 1|
|15 9 17 4 1|
|14 5 6 8 2|
则返回主程序后a 数组中的值应为|20 13 18 3 1|
|1 9 7 4 5|
|0 11 12 7 9|
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#define N 5
int fun ( int a[][N] )
{……}
main ( )
{ int a[N][N], i, j;
clrscr();
printf("***** The array *****\n");
for ( i =0; i< N; i++ )
{ for ( j =0; j< N; j++ )
{ a[i][j] = rand()%30; printf( "%4d", a[i][j] ); }
printf("\n");
}
fun ( a );
printf ("***** THE RESULT *****\n");
for ( i =0; i< N; i++ )
{ for ( j =0; j< N; j++ ) printf( "%4d", a[i][j] );
printf("\n");
}
}
(2011年2月)
解析: 本题的考核点是C语言中循环嵌套语句的使用。
提示思路:对于本题,我们给出的参考函数采取的算法是:使用嵌套循环,外
循环是行循环,内循环是列循环。将第一行各元素的值与倒数第一行各元素的
值对调,第二行元素中的值与倒数第二行元素中的值对调,……,因为一次互换
两个元素,所以 for 循环语句执行N/2 次(N 是数组行的长度)就可以把全部
元素值互换一遍。
int fun ( int a[][N] )
{ int i, j,k;
for (i=0;i< N/2;i++)
for (j=0;j< N;j++)
{ /*将a[i][j]与a[N-i-1][j]中的元素进行对换*/
k=a[ i ][ j ];
a[ i ][ j ]=a[ N-i-1 ][ j ];
a[ N-i-1][ j ]=k;
}/*按先行后列的顺序,对数组a中的元素以中间行为对称线进行倒置*/
}