【真题1】 函数fun 的功能是:将形参a所指数组中的前半部分元素中的值和后半 部分元素中的值对换。形参n 中存放数组中数据的个数,若n 为奇数,则中间的元 素不动。 例如:若a 所指数组中的数据依次为:1、2、3、4、5、6、7、8、9,则调换后 为:6、7、8、9、5、1、2、3、4。 #include < stdio.h >#define N 9 void fun(int a[], int n) { int i, t, p; /**********found**********/ p = (n%2==0) n/2:n/2+___1___; for (i=0; i< n/2; i++) { t=a[i]; /**********found**********/ a[i] = a[p+___2___]; /**********found**********/ ___3___ = t; } } main() { int b[N]={1,2,3,4,5,6,7,8,9}, i; printf("\nThe original data :\n"); for (i=0; i< N; i++) printf("%4d ", b[i]); printf("\n"); fun(b, N); printf("\nThe data after moving :\n"); for (i=0; i< N; i++) printf("%4d ", b[i]); printf("\n"); } (2011年2月) 解析: 本题的考核点是c 语言中循环语句的使用。 解题思路:本程序先通过n%2 是否为0 判断数组中元素的个数是奇数还是偶 数,然后再通过"t=a[i];a[i] = a[p+i];a[p+i] = t;"三个语句对换数组中的前 半部分元素中的值和后半部分元素中的值。 答案:【1】1 【2】i 【3】i 【真题2】 给定程序modi.c 中,函数fun 的功能是:将十进制正整数m 转换成 k(2≤k≤9)进制数,并按位输出。 例如,若输入8 和2,则应输出1000(即十进制数8 转换成二进制表示是 1000)。 请改正程序中的错误,使它能得出正确结果。 注意:不要改动main 函数, #include < conio.h >#include < stdio.h >void fun(int m,int k) { int aa[20],i; for (i=0;m;i++) {/************found************/ aa[i]=m/k; m/=k; } /************found************/ for(;i;i--) printf("%d",aa[i]); } main() { int b,n; clrscr(); printf("\nPlease enter a number and a base:\n"); scanf("%d %d",&n,&b); fun(n,b); printf("\n"); } (2011年2月) 解析: 本题的考核点是数制的转换。 k进制数有以下特点: 1.有0 到k-1共k个数码。 2.逢k进1,借1 当k。 k进制数某一位上的数码实际上代表该数码乘上该位上的权,如十进制数12, 1 实际代表1*10。原程序给出的fun 函数中,第一个for 循环用来将十进制的 整型数据m转换为k进制数据,并将结果按从低位到高位的顺序保存在数组 aa中。在for 循环之后,i 即为转换成的k进制数的位数,所以根据题义要求, 第一处应改为"aa[i]=m%k;"或相同作用的语句。 第二个错误处为:从后往前打印存有i个数的数组中的值,其下标应该为[i-1] 到[0]。所以"for(;i;i--)"应当改为" for(i=i-1;i >=0;i--)"。 【真题3】 学生的记录由学号和成绩组成,N 名学生的数据已在主函数中放入结构 体数组s 中,请编写函数fun,它的功能是:把分数最高的学生数据放在h 所指的数 组中,注意:分数最高的学生可能不止一个,函数返回分数最高的学生人数。 注意:部分源程序存在文件prog.c 中。 请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编 写的若干语句。 本题的考核点是找出分数最高的学生数据的算法。 解题思路:先从所有的学生数据中找出最高的分值,然后将所有学生分数中与最高分 值相等的学生数据放到另一数组中,最后统计分数最高的学生人数并返回。 #include < stdio.h >#define N 16 typedef struct { char num[10]; int s; } STREC; int fun(STREC *a,STREC *b) {……} main() { STREC s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},{"GA01",9 1},{"GA07",72}, {"GA08",64},{"GA06",87},{"GA015",85},{"GA013",91},{"GA012",64},{ "GA014",91},{"GA011",91},{"GA017",64},{"GA018",64},{"GA016",72} }; STREC h[N]; int i,n;FILE *out; n=fun(s,h); printf("The %d highest score:\n",n); for(i=0;i< n;i++) printf("%s %4d\n",h[i].num,h[i].s); printf("\n"); out=fopen("out15.dat","w"); fprintf(out,"%d\n",n); for (i=0;i< n;i++) fprintf(out,"%s %4d\n",h[i].num,h[i].s); fclose(out); } (2011年2月) 解析: 本评析仅供参考。 int fun(STREC *a,STREC *b) {int i,j=0,max,k,f=0; max=(*a).s; for (i=1;i< N;i++) if (a[i].s >max) max=a[i].s; /*从所有的学生数据中找出最高的分值*/ for (i=0;i< N;i++) if (a[i].s==max) { f++; /*统计分数最高的学生人数*/ for (k=0;k< 10;k++) b[j].num[k]=a[i].num[k]; /*将所有学生分数中与最高分值相等的学生数据 放到另一数组b中*/ b[j].s=a[i].s; j++; } return(f); /*返回分数最高的学生人数*/ } |