【真题1】 下列给定程序中,函数fun()的功能是:按顺序给s 所指数组中的元素赋 予从2 开始的偶数,然后再按顺序对每5 个元素求一个平均值,并将这些值依次存 放在w 所指的数组中。若s 所指数组中元素的个数不是5 的倍数,多余部分忽略不 计。例如,s所指数组有14 个元素,则只对前10个元素进行处理,不对最后的4 个元素求平均值。 试题程序: #include < stdio.h >#define SIZE 20 fun (double *s,double *w) { int k,i; double sum; for(k=2,i=0;i< SIZE;i++) {s[i]=k;k+=2;} sum=0.0; for(k=0,i=0;i< SIZE;i++) {sum+=s[i]; if((i+1)___1__5==0) {w[k]=sum/5; sum=0;k++;} } ___2__ k; } main() { double a[SIZE],b[SIZE/5]; int i, k; k=fun(a,b); printf("The original data:\n"); for(i=0;i< SIZE;i++) { if(i%5==0) printf("\n"); printf("%4.0f",a[i]); } printf("\n\nThe result:\n"); for(i=0;i< k;i++) printf("%6.2f",___3___); printf("\n\n"); } (2011年2月) 解析: 填空1:根据题目的意思,这里是执行按顺序对每5 个元素求一个平均 值的操作,所以应该使用取余符号"%",如果是5 的倍数,则该式子的值为 零。 填空2:根据C 语言的规定,除了使用关键字void的任何一个子函数都应该有 返回值,所以应该使用关键字return把变量k 的值返回主函数。 填空3:由题目的意思可知这里是把存在数组b中的内容依次循环输出,所以 后面的变量名应该使用b[i] 。 答案:【1】% 【2】return 【3】b[i] 【真题2】 给定程序modi.c 中函数fun的功能是:为一个偶数寻找两个素数,这 两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数。 请改正函数fun 中指定部位的错误,使它能得出正确的结果。 注意:不要改动main 函数, #include < stdio.h >#include < math.h >void fun(int a,int *b,int *c) { int i,j,d,y; for(i=3;i< =a/2;i=i+2) { /**************found**************/ y=0; for(j=2;j< =sqrt((double)i);j++) if(i%j==0) y=0; if(y==1) { /**************found**************/ d=i-a; for(j=2;j< =sqrt((double)d);j++) if(d%j==0) y=0; if(y==1) { *b=i; *c=d; } } } } main() { int a,b,c; do { printf("\nInput a: "); scanf("%d",&a); } while(a%2); fun(a,&b,&c); printf("\n\n%d = %d + %d\n",a,b,c); } (2011年2月) 解析: 首先,我们必须先读懂题中程序的大致意思,这是发现并改正程序中错 误的重要前提。 程序中的重要思想如下: 1、首先,要了解素数的意思,素数是指只能被1和它自身整除的数; 2、题目中要求为一个偶数寻找两个素数,这两个素数之和等于该偶数。 本题中的第一个错误:由下面的程序"if(i%j==0) y=0;"可知,如果不为素 数,y值为0,所以应当开始给y赋值为1,做找到标志; 本题中的第二个错误:根据上下文及题意思可知,a为偶数,*b与*c为所求的 两个素数,而*b与*c 由"{ *b=i; *c=d; }"得出,所以a=i+d,即"d=ai;" 。 【真题3】 程序定义了N×N 的二维数组,并在主函数中赋值。请编写函数fun,函 数的功能是:给数组周边元素置0 值。 例如: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| |0 0 0 0 0| |0 4 7 9 0| 则返回主程序后a 数组中的值应为|0 3 18 18 0| |0 8 6 5 0| |0 0 0 0 0| 注意:部分源程序存在文件prog.c 中。 请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编 写的若干语句。 #include < stdio.h >#include < conio.h >#include < stdlib.h >#define N 5 fun( int w[][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()%10;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语言中的嵌套循环语句和条件判断语句的使用。 解题思路:二维数组的周边元素的特点是:它有一个下标为0 或为数组上界。 所以我们只须判断数组的下标是否为0或数组上界即可。按行、列进行循环可 以保证符合条件的元素只被运算一次。 本评析仅供参考。 fun ( int w[][N] ) { int i, j; for (i = 0; i < N; i++)/*以先行后列的顺序将数组的周边元素置0*/ for (j = 0; j < N; j++) if ((i == 0)||(i == N- 1)||(j == 0)||(j == N - 1) )/*判断下标为i的元 素是否为二维数组中的周边元素*/ w[i][j]=0; } |