计算机二级C语言上机真题(66)【附详解】
【真题1】 函数fun 的功能是:统计长整数n 的各个位上出现数字1、2、3 的次
数,并通过外部(全局)变量c1、c2、c3返回主函数。例如,当n=123114350
时,结果应该为:c1=3 c2=1 c3=2。
#include < stdio.h >int c1,c2,c3;
void fun(long n)
{ c1 = c2 = c3 = 0;
while (n) {
/**********found**********/
switch(___1___)
{
/**********found**********/
case 1: c1++;___2___;
/**********found**********/
case 2: c2++;___3___;
case 3: c3++;
}
n /= 10;
}
}
main()
{ long n=123114350L;
fun(n);
printf("\nThe result :\n");
printf("n=%ld c1=%d c2=%d c3=%d\n",n,c1,c2,c3);
}
解析: 本题的考核点是统计长整数n的各个位上出现数字1、2、3 的次数。
提示思路:通过while循环,检验长整数n 中的每一个字符,再使用switch分
支判断语句,累加计算出各个数字的个数。
答案:【1】n%10 【2】break 【3】break
【真题2】 给定程序modi.c 中,fun 函数的功能是:先从键盘上输入一个3 行3
列矩阵的各个元素的值,然后输出主对角线元素之积。
请改正程序中的错误,或在横线处填上适当的内容并把横线删除,使它能得出正确的
结果。
注意:不要改动main 函数,
#include < stdio.h >int fun()
{ int a[3][3],sum;
int i,j;
/************found************/
_______;
for (i=0;i< 3;i++)
{ for (j=0;j< 3;j++)
/************found************/
scanf("%d" a[i][j]);
}
for (i=0;i< 3;i++)
sum=sum*a[i][i];
printf("Sum=%d\n",sum);
}
main()
{ fun(); }
(2011年2月)
解析: 本题的考核点是C语言的基本语句的使用。
由题意可知,程序中通过sum 变量累计对角线元素的积,在初始化时需先为
sum 赋初始值,所以应在横线处填入:"sum=1;"。
根据scanf语句的语法规则,格式控制与输入项地址表之间需用逗号分隔,所
以 "scanf("%d" a[i][j]);"应改为"scanf("%d,",&a[i][j]);"或相同作用的语
句。
【真题3】 请编写一个函数fun(),它的功能是:求出一个4×M整型二维数组中最
小元素的值,并将此值返回调用函数。
注意:部分源程序给出如下。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入所编
写的若干语句。
试题程序:
#define M 4
#include < stdio.h >fun (int a[][M])
{……}
main()
{int arr[4][M]={11,3,9,35,42,-4,24,32,6,48,-32,7,23,34,12,-7};
printf("min=%d\n",fun(arr));
}
(2011年2月)
解析: fun (int a[][M])
{ int i,j,min=a[0][0];
for(i=0;i< 4;i++)
for(j=0;j< M;j++)
if(min >a[i][j])
min=a[i][j]; /*求出二维数组的最小值*/
return min;
}
【解析】此类求最大值或最小值的C语言问题,我们可以采用逐个比较的方
式。要求数组中的所有元素走动一遍,并从中找出最大、最小值,要注意一开
始应使min存放数组中的第一个元素的值。可按逐行查找也可按逐列查找的方
式,本题采用的是逐行查找的方式。即行下标在外层循环,列下标在内层循
环,因为在循环的嵌套中越在内层循环,循环变化就越快。
数,并通过外部(全局)变量c1、c2、c3返回主函数。例如,当n=123114350
时,结果应该为:c1=3 c2=1 c3=2。
#include < stdio.h >int c1,c2,c3;
void fun(long n)
{ c1 = c2 = c3 = 0;
while (n) {
/**********found**********/
switch(___1___)
{
/**********found**********/
case 1: c1++;___2___;
/**********found**********/
case 2: c2++;___3___;
case 3: c3++;
}
n /= 10;
}
}
main()
{ long n=123114350L;
fun(n);
printf("\nThe result :\n");
printf("n=%ld c1=%d c2=%d c3=%d\n",n,c1,c2,c3);
}
解析: 本题的考核点是统计长整数n的各个位上出现数字1、2、3 的次数。
提示思路:通过while循环,检验长整数n 中的每一个字符,再使用switch分
支判断语句,累加计算出各个数字的个数。
答案:【1】n%10 【2】break 【3】break
【真题2】 给定程序modi.c 中,fun 函数的功能是:先从键盘上输入一个3 行3
列矩阵的各个元素的值,然后输出主对角线元素之积。
请改正程序中的错误,或在横线处填上适当的内容并把横线删除,使它能得出正确的
结果。
注意:不要改动main 函数,
#include < stdio.h >int fun()
{ int a[3][3],sum;
int i,j;
/************found************/
_______;
for (i=0;i< 3;i++)
{ for (j=0;j< 3;j++)
/************found************/
scanf("%d" a[i][j]);
}
for (i=0;i< 3;i++)
sum=sum*a[i][i];
printf("Sum=%d\n",sum);
}
main()
{ fun(); }
(2011年2月)
解析: 本题的考核点是C语言的基本语句的使用。
由题意可知,程序中通过sum 变量累计对角线元素的积,在初始化时需先为
sum 赋初始值,所以应在横线处填入:"sum=1;"。
根据scanf语句的语法规则,格式控制与输入项地址表之间需用逗号分隔,所
以 "scanf("%d" a[i][j]);"应改为"scanf("%d,",&a[i][j]);"或相同作用的语
句。
【真题3】 请编写一个函数fun(),它的功能是:求出一个4×M整型二维数组中最
小元素的值,并将此值返回调用函数。
注意:部分源程序给出如下。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入所编
写的若干语句。
试题程序:
#define M 4
#include < stdio.h >fun (int a[][M])
{……}
main()
{int arr[4][M]={11,3,9,35,42,-4,24,32,6,48,-32,7,23,34,12,-7};
printf("min=%d\n",fun(arr));
}
(2011年2月)
解析: fun (int a[][M])
{ int i,j,min=a[0][0];
for(i=0;i< 4;i++)
for(j=0;j< M;j++)
if(min >a[i][j])
min=a[i][j]; /*求出二维数组的最小值*/
return min;
}
【解析】此类求最大值或最小值的C语言问题,我们可以采用逐个比较的方
式。要求数组中的所有元素走动一遍,并从中找出最大、最小值,要注意一开
始应使min存放数组中的第一个元素的值。可按逐行查找也可按逐列查找的方
式,本题采用的是逐行查找的方式。即行下标在外层循环,列下标在内层循
环,因为在循环的嵌套中越在内层循环,循环变化就越快。