计算机二级C语言上机真题(65)【附详解】
【真题1】 给定程序的功能是将n 个人员的考试成绩进行分段统计,考试成绩放在
a 数组中,各分段的人数存到b 数组中:成绩为60 到69 的人数存到b[0]中,成绩
为70 到79 的人数存到b[1],成绩为80 到89的人数存到b[2],成绩为90 到
99 的人数存到b[3],成绩为100 的人数存到b[4],成绩为60 分以下的人数存到
b[5]中。
例如,当a 数组中的数据是:93、85、77、68、59、43、94、75、98。
调用该函数后,b 数组中存放的数据应是:1、2、1、3、0、2。
#include < stdio.h >void fun(int a[], int b[], int n)
{ int i;
for (i=0; i< 6; i++) b[i] = 0;
/**************found**************/
for (i=0; i< ___1___; i++)
if (a[i] < 60) b[5]++;
/**************found**************/
___2___ b[(a[i]- 60)/10]++;
}
main()
{ int i, a[100]={ 93, 85, 77, 68, 59, 43, 94, 75, 98}, b[6];
/**************found**************/
fun(___3___, 9);
printf("the result is: ");
for (i=0; i< 6; i++) printf("%d ", b[i]);
printf("\n");
}
(2011年2月)
解析: 本题的考核点是统计成绩段的算法。
提示思路:本题先对数组b初始化,通过for循环(a[i]- 60)/10,将成绩减去
60 再整除10后存放到数组b中,再通过b[(a[i]- 60)/10]++运算进行累
加,即实现了各个成绩段的人数的统计。
答案:【1】strlen 【2】else 【3】a,b
【真题2】 文件modi.c 中程序的功能是:读入一个整数m(1≤m≤20)和m位
学生的学号、数学课考分和计算机课考分,并从中查找第一个数学课考分<80 且计
算机课考分<70 的学生,若有则输出他的学号和两门课分数,否则输出"Not
found!"。
例如,
若输入"4"和 101 91 86 | 若输入"5"和 101 91 86
213 87 75 | 213 87 75
345 79 67 | 345 79 81
420 83 87 | 420 83 87
| 537 65 77
则输出 The one found: | 则输出 Not found.
345 79 67 |
请改正程序中的错误或在横线处填上适当的内容(并把横线删除),使它能计算出正
确的结果。
#include < conio.h >#include < stdio.h >#define M 10
struct student { int num; int math; int cmpt; };
int Find( int n, struct student ss[] )
{ int i;
for( i = 0; i < n; i++ )
if( ( ss[i].math < 80 )&&( ss[i].cmpt < 70 ) )
break;
/*************found************/
____________________
}
main()
{ int i, m;
struct student tt[M];
clrscr();
printf( "\nPlease enter number of students: " );
scanf( "%d", &m );
printf( "\nPlease enter their num and marks of math and cmpt: \n" );
/*************found************/
for( i = 0; i < m; i++ )
scanf( "%d %d %d", tt[i].num, tt[i].math, tt[i].cmpt );
printf( "\nThe students' num and marks entered: " );
for( i = 0; i < m; i++ )
printf( "\n%3d %3d %3d", tt[i].num, tt[i].math, tt[i].cmpt );
if( ( i = Find( m, tt ) ) == -1 )
printf( "\nNot found!\n" );
else
{ printf( "\nThe one found:" );
printf( "\n%3d %3d %3d\n", tt[i].num, tt[i].math, tt[i].cmpt );
}
}
(2011年2月)
解析: 本题的考核点是C语言中循环语句和常用函数的使用。
从主函数中可以看出,如果Find函数没有找到符合条件的记录,返回-1,否则
返回相应的记录号。Find函数的for 循环用来寻找符合条件的记录,如果找到
则中断循环,此时循环变量的值即为符合条件的记录号。所以原程序横线处应
填入"return((i==n)?-1:i);"或相同作用的语句。
另外,在使用scanf函数时,应该把要输入的数据的地址作为参数传入函数,
所以应该把程序中的"scanf( "%d %d %d", tt[i].num, tt[i].math,
tt[i].cmpt );"语句改为"scanf("%d %d %d", &tt[i].num, &tt[i].math,
&tt[i].cmpt);"。
【真题3】 程序定义了N×N 的二维数组,并在主函数中自动赋值。请编写函数
fun(int a[][N]),函数的功能是:使数组左下半三角元素中的值乘以n。
例如:若n 的值为3,a 数组中的值为
|1 9 7|
a= |2 3 8|,则返回主程序后a数组中的值应为
|4 5 6|
|3 9 7 |
|6 9 8 |
|12 15 18|
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#include < conio.h >#include < stdlib.h >#define N
5
int fun(int a[][N],int n)
{……}
main()
{ int a[N][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()%10;printf("%4d",a[i][j]);}
printf("\n");
}
do n=rand()%10;while(n >=3);
printf("n=%4d\n",n);
fun(a,n);
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语言中循环嵌套和 if 语句的使用。
解题思路:对于本题,我们给出的参考函数采取的算法是:使用嵌套循环,外
循环是行循环,内循环是列循环,这样可以对整个数组中的元素进行符合条件
的运算。本题要求是对数组下半三角元素中的值乘以n,观察二维数组可以看
出,数组下半三角中的元素 ,行坐标值都大于等于列坐标值。
本评析仅供参考。
int fun ( int a[][N], int n )
{ int i,j;
/*先行后列对数组左下半三角元素中的值乘以n*/
for (i=0;i< N;i++)
for (j=0;j< =i;j++)
a[i][j] *=n;
}
main ( )
{ int a[N][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()%10; printf( "%4d", a[i][j] ); }/*随机产生比10 小的
整数存放在a数组中*/
printf("\n");
}
do n = rand()%10 ; while ( n >=3 );/*随机产生大于等于3且小于10 的
整数作为左下半三角元素的乘数n 的值*/
printf("n = %4d\n",n);
fun ( a, n );
printf ("***** THE RESULT *****\n");
for ( i =0; i< N; i++ )
{ for ( j =0; j< N; j++ ) printf( "%4d", a[i][j] );
printf("\n");
}
}
a 数组中,各分段的人数存到b 数组中:成绩为60 到69 的人数存到b[0]中,成绩
为70 到79 的人数存到b[1],成绩为80 到89的人数存到b[2],成绩为90 到
99 的人数存到b[3],成绩为100 的人数存到b[4],成绩为60 分以下的人数存到
b[5]中。
例如,当a 数组中的数据是:93、85、77、68、59、43、94、75、98。
调用该函数后,b 数组中存放的数据应是:1、2、1、3、0、2。
#include < stdio.h >void fun(int a[], int b[], int n)
{ int i;
for (i=0; i< 6; i++) b[i] = 0;
/**************found**************/
for (i=0; i< ___1___; i++)
if (a[i] < 60) b[5]++;
/**************found**************/
___2___ b[(a[i]- 60)/10]++;
}
main()
{ int i, a[100]={ 93, 85, 77, 68, 59, 43, 94, 75, 98}, b[6];
/**************found**************/
fun(___3___, 9);
printf("the result is: ");
for (i=0; i< 6; i++) printf("%d ", b[i]);
printf("\n");
}
(2011年2月)
解析: 本题的考核点是统计成绩段的算法。
提示思路:本题先对数组b初始化,通过for循环(a[i]- 60)/10,将成绩减去
60 再整除10后存放到数组b中,再通过b[(a[i]- 60)/10]++运算进行累
加,即实现了各个成绩段的人数的统计。
答案:【1】strlen 【2】else 【3】a,b
【真题2】 文件modi.c 中程序的功能是:读入一个整数m(1≤m≤20)和m位
学生的学号、数学课考分和计算机课考分,并从中查找第一个数学课考分<80 且计
算机课考分<70 的学生,若有则输出他的学号和两门课分数,否则输出"Not
found!"。
例如,
若输入"4"和 101 91 86 | 若输入"5"和 101 91 86
213 87 75 | 213 87 75
345 79 67 | 345 79 81
420 83 87 | 420 83 87
| 537 65 77
则输出 The one found: | 则输出 Not found.
345 79 67 |
请改正程序中的错误或在横线处填上适当的内容(并把横线删除),使它能计算出正
确的结果。
#include < conio.h >#include < stdio.h >#define M 10
struct student { int num; int math; int cmpt; };
int Find( int n, struct student ss[] )
{ int i;
for( i = 0; i < n; i++ )
if( ( ss[i].math < 80 )&&( ss[i].cmpt < 70 ) )
break;
/*************found************/
____________________
}
main()
{ int i, m;
struct student tt[M];
clrscr();
printf( "\nPlease enter number of students: " );
scanf( "%d", &m );
printf( "\nPlease enter their num and marks of math and cmpt: \n" );
/*************found************/
for( i = 0; i < m; i++ )
scanf( "%d %d %d", tt[i].num, tt[i].math, tt[i].cmpt );
printf( "\nThe students' num and marks entered: " );
for( i = 0; i < m; i++ )
printf( "\n%3d %3d %3d", tt[i].num, tt[i].math, tt[i].cmpt );
if( ( i = Find( m, tt ) ) == -1 )
printf( "\nNot found!\n" );
else
{ printf( "\nThe one found:" );
printf( "\n%3d %3d %3d\n", tt[i].num, tt[i].math, tt[i].cmpt );
}
}
(2011年2月)
解析: 本题的考核点是C语言中循环语句和常用函数的使用。
从主函数中可以看出,如果Find函数没有找到符合条件的记录,返回-1,否则
返回相应的记录号。Find函数的for 循环用来寻找符合条件的记录,如果找到
则中断循环,此时循环变量的值即为符合条件的记录号。所以原程序横线处应
填入"return((i==n)?-1:i);"或相同作用的语句。
另外,在使用scanf函数时,应该把要输入的数据的地址作为参数传入函数,
所以应该把程序中的"scanf( "%d %d %d", tt[i].num, tt[i].math,
tt[i].cmpt );"语句改为"scanf("%d %d %d", &tt[i].num, &tt[i].math,
&tt[i].cmpt);"。
【真题3】 程序定义了N×N 的二维数组,并在主函数中自动赋值。请编写函数
fun(int a[][N]),函数的功能是:使数组左下半三角元素中的值乘以n。
例如:若n 的值为3,a 数组中的值为
|1 9 7|
a= |2 3 8|,则返回主程序后a数组中的值应为
|4 5 6|
|3 9 7 |
|6 9 8 |
|12 15 18|
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#include < conio.h >#include < stdlib.h >#define N
5
int fun(int a[][N],int n)
{……}
main()
{ int a[N][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()%10;printf("%4d",a[i][j]);}
printf("\n");
}
do n=rand()%10;while(n >=3);
printf("n=%4d\n",n);
fun(a,n);
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语言中循环嵌套和 if 语句的使用。
解题思路:对于本题,我们给出的参考函数采取的算法是:使用嵌套循环,外
循环是行循环,内循环是列循环,这样可以对整个数组中的元素进行符合条件
的运算。本题要求是对数组下半三角元素中的值乘以n,观察二维数组可以看
出,数组下半三角中的元素 ,行坐标值都大于等于列坐标值。
本评析仅供参考。
int fun ( int a[][N], int n )
{ int i,j;
/*先行后列对数组左下半三角元素中的值乘以n*/
for (i=0;i< N;i++)
for (j=0;j< =i;j++)
a[i][j] *=n;
}
main ( )
{ int a[N][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()%10; printf( "%4d", a[i][j] ); }/*随机产生比10 小的
整数存放在a数组中*/
printf("\n");
}
do n = rand()%10 ; while ( n >=3 );/*随机产生大于等于3且小于10 的
整数作为左下半三角元素的乘数n 的值*/
printf("n = %4d\n",n);
fun ( a, n );
printf ("***** THE RESULT *****\n");
for ( i =0; i< N; i++ )
{ for ( j =0; j< N; j++ ) printf( "%4d", a[i][j] );
printf("\n");
}
}