【真题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"); } } |