1、二级 C语言分类模拟题 231及答案解析(总分:100.00,做题时间:90 分钟)一、程序填空题(总题数:1,分数:30.00)1.函数 fun的功能是:把形参 a所指数组中的最大值放在 a0中,接着求出 a所指数组中的最小值放在a1中;再把 a所指数组元素中的次大值放在 a2中,把 a数组元素中的次小值放在 a3中;其余以此类推。例如:若 a所指数组中的数据最初排列为:1、4、2、3、9、6、5、8、7,则按规则移动后,数据排列为:9、1、8、2、7、3、6、4、5。形参 n中存放 a所指数组中数据的个数。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:源程
2、序存放在 下的 BLANK1.C中。 不得增行或删行,也不得更改程序的结构! #include stdio.h #define N 9 /*found*/ void fun(int _,int n) int i,j,max,min,px,pn,t; /*found*/ for(i=0;in-1;i+=_) max=min=ai; px=pn=i; /*found*/ for(j=_;jn;j+) if(maxaj) max=aj;px=j; if(minaj) min=aj;pn=j; if(px!=i) t=ai;ai=max;apx=t; if(pn=i) pn=px; if(pn!=i+
3、1) t=ai+1;ai+1=min;apn=t; main() int bN=1,4,2,3,9,6,5,8,7,i; printf(“/nThe original data:/n“); for(i=0;iN;i+) printf(“%4d“,bi); printf(“/n“); fun(b,N); printf(“/nThe data after moving:/n“); for(i=0;iN;i+) printf(“%4d“,bi); printf(“/n“); (分数:30.00)_二、程序修改题(总题数:1,分数:30.00)2.给定程序 MODI1.C中函数 fun的功能是:按顺序
4、给 s所指数组中的元素赋予从 2开始的偶数,然后再按顺序对每五个元素求一个平均值,并将这些值依次存放在 w所指的数组中。若 s所指数组中元素的个数不是5的倍数,多余部分忽略不计。 例如,s 所指数组有 14个元素,则只对前 10个元素进行处理,不对最后的 4个元素求平均值。 请改正程序中的错误,使它能得出正确结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构。 #include stdio.h #define SIZE 20 fun(double *s,double *w) int k,i;double sum; for(k=2,i=0;iSIZE;i+) si=k;k
5、+=2; /*found*/ sun=0.0; for(k=0,i=0;iSIZE;i+) sum+=si; /*found*/ if(i+1%5=0) wk=sum/5;sum=0;k+; return k; main() double aSIZE,bSIZE/5; int i,k; k=fun(a,b); printf(“The original data:/n“); for(i=0;iSIZE;i+) if(i%5=0) printf(“/n“); printf(“%4.0f“,ai); printf(“/n/nThe result:/n“); for(i=0;ik;i+) printf
6、(“%6.2f“,bi); printf(“/n/n“); (分数:30.00)_三、程序设计题(总题数:1,分数:40.00)3.学生的记录由学号和成绩组成,N 名学生的数据已在主函数中放入结构体数组 s中,请编写函数 fun,它的功能是:把低于平均分的学生数据放在 b所指的数组中,低于平均分的学生人数通过形参 n传回,平均分通过函数值返回。 注意:部分源程序在文件 PROG1.C中。 请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 #include stdio.h #define N 8 typedef struct char num10;
7、 double s; STREC; double fun(STREC *a,STREC *b,int *n) main() STREC sN=“GA05“,85,“GA03“,76,“GA02“,69,“GA04“,85,“GA01“,91,“GA07“,72,“GA08“,64,“GA06“,87; STREC hN,t;FILE *out; int i,j,n;double ave; ave=fun(s,h, printf(“The %d student data which is lower than %7.3f:/n“,n,ave); for(i=0;in;i+) printf(“%s
8、 %4.1f/n“,hi.num,hi.s); printf(“/n“); out=fopen(“out.dat“,“w“); fprintf(out,“%d/n%7.3f/n“,n,ave); for(i=0;in-1;i+) for(j=i+1;jn;j+) if(hi.shj.s)t=hi;hi=hj;hj=t; for(i=0;in;i+) fprintf(out,“%4.1f/n“,hi.s); fclose(out); (分数:40.00)_二级 C语言分类模拟题 231答案解析(总分:100.00,做题时间:90 分钟)一、程序填空题(总题数:1,分数:30.00)1.函数 fu
9、n的功能是:把形参 a所指数组中的最大值放在 a0中,接着求出 a所指数组中的最小值放在a1中;再把 a所指数组元素中的次大值放在 a2中,把 a数组元素中的次小值放在 a3中;其余以此类推。例如:若 a所指数组中的数据最初排列为:1、4、2、3、9、6、5、8、7,则按规则移动后,数据排列为:9、1、8、2、7、3、6、4、5。形参 n中存放 a所指数组中数据的个数。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:源程序存放在 下的 BLANK1.C中。 不得增行或删行,也不得更改程序的结构! #include stdio.h #define N 9 /*fo
10、und*/ void fun(int _,int n) int i,j,max,min,px,pn,t; /*found*/ for(i=0;in-1;i+=_) max=min=ai; px=pn=i; /*found*/ for(j=_;jn;j+) if(maxaj) max=aj;px=j; if(minaj) min=aj;pn=j; if(px!=i) t=ai;ai=max;apx=t; if(pn=i) pn=px; if(pn!=i+1) t=ai+1;ai+1=min;apn=t; main() int bN=1,4,2,3,9,6,5,8,7,i; printf(“/nT
11、he original data:/n“); for(i=0;iN;i+) printf(“%4d“,bi); printf(“/n“); fun(b,N); printf(“/nThe data after moving:/n“); for(i=0;iN;i+) printf(“%4d“,bi); printf(“/n“); (分数:30.00)_正确答案:()解析:(1)*a (2)2 (3)i+1 答案考生文件夹 解析 本题中函数的功能是将数组中的元素下标为偶数的元素按照从大到小排序,下标为奇数的元素按照从小到大排序,相当于 2个排序过程。在 fun函数中,采用选择排序法进行排序,分别用
12、 max和 min存储每次寻找的最大值和最小值,px 和 pn记录每次查找到的最大值和最小值的下标位置。 第一空:主函数内 fun函数的调用“fun(b,N);”,其中 b为整型数组名,故 fun函数的第一参数为整型指针,又根据“max=aj”可知第一个参数名为 a,故第一空处为“*a”。 第二空:根据题意 a所指数组中的最大值放在 a0中,接着求出 a所指数组中的最小值放在 a1中;再把 a所指数组元素中的次大值放在 a2中,把 a数组元素中的次小值放在 a3中,升序排序和降序排序的下标变化是每次在前一次的基础上+2,即 a0、a2、a4降序排序,a1、a3、a5升序排序,故第二空应为“2”
13、。 第三空:选择排序法中的升序排序,首先从数组中挑选一个最小的元素,把它和第一元素交换,接着从剩下的 n-1个元素中再挑出一个最小的元素,把它和第二个元素交换,不断重复以上过程,直到比较完最后两个元素。故内层循环变量 j应该从 i+1开始,因此第三空处应为“i+1”。 考点 一维数组、循环的嵌套。二、程序修改题(总题数:1,分数:30.00)2.给定程序 MODI1.C中函数 fun的功能是:按顺序给 s所指数组中的元素赋予从 2开始的偶数,然后再按顺序对每五个元素求一个平均值,并将这些值依次存放在 w所指的数组中。若 s所指数组中元素的个数不是5的倍数,多余部分忽略不计。 例如,s 所指数组
14、有 14个元素,则只对前 10个元素进行处理,不对最后的 4个元素求平均值。 请改正程序中的错误,使它能得出正确结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构。 #include stdio.h #define SIZE 20 fun(double *s,double *w) int k,i;double sum; for(k=2,i=0;iSIZE;i+) si=k;k+=2; /*found*/ sun=0.0; for(k=0,i=0;iSIZE;i+) sum+=si; /*found*/ if(i+1%5=0) wk=sum/5;sum=0;k+; ret
15、urn k; main() double aSIZE,bSIZE/5; int i,k; k=fun(a,b); printf(“The original data:/n“); for(i=0;iSIZE;i+) if(i%5=0) printf(“/n“); printf(“%4.0f“,ai); printf(“/n/nThe result:/n“); for(i=0;ik;i+) printf(“%6.2f“,bi); printf(“/n/n“); (分数:30.00)_正确答案:()解析:(1)sum=0.0; (2)if(i+1)%5=0) 答案考生文件夹 解析 本题函数的功能是对
16、每 5个元素求一个平均值。首先要依顺序读取每 5个元素,并对这 5个元素取平均值。 (1)在第一标识下“sun=0.0;”,根据题意,这是给 sum赋值,而 sun没有定义编译时会提示错误,应改为“sum=0.0;”。 (2)错误标识下的 if判断语句是依顺序取 5个字符,if 中的逻辑表达式语法有误,由于 1%5恒等于 1,所以 i+1%5也就等价于 i+1了,所以将“if(i+1%5=0)”改为“if(i+1)%5=0)”,此处主要注意的是运算符的优先级。 考点 一维数组、for 循环结构。三、程序设计题(总题数:1,分数:40.00)3.学生的记录由学号和成绩组成,N 名学生的数据已在主
17、函数中放入结构体数组 s中,请编写函数 fun,它的功能是:把低于平均分的学生数据放在 b所指的数组中,低于平均分的学生人数通过形参 n传回,平均分通过函数值返回。 注意:部分源程序在文件 PROG1.C中。 请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 #include stdio.h #define N 8 typedef struct char num10; double s; STREC; double fun(STREC *a,STREC *b,int *n) main() STREC sN=“GA05“,85,“GA03“,76,
18、“GA02“,69,“GA04“,85,“GA01“,91,“GA07“,72,“GA08“,64,“GA06“,87; STREC hN,t;FILE *out; int i,j,n;double ave; ave=fun(s,h, printf(“The %d student data which is lower than %7.3f:/n“,n,ave); for(i=0;in;i+) printf(“%s %4.1f/n“,hi.num,hi.s); printf(“/n“); out=fopen(“out.dat“,“w“); fprintf(out,“%d/n%7.3f/n“,n
19、,ave); for(i=0;in-1;i+) for(j=i+1;jn;j+) if(hi.shj.s)t=hi;hi=hj;hj=t; for(i=0;in;i+) fprintf(out,“%4.1f/n“,hi.s); fclose(out); (分数:40.00)_正确答案:()解析:int i; double ave=0.0; *n=0; for(i=0;iN;i+)ave=ave+ai.s; ave /=N; /*计算平均值*/ for(i=0;iN;i+) if(ai.save) /*把低于平均值的记录存放到 b所指的数组中*/ b*n=ai; (*n)+; /*人数加 1*/ return ave; /*返回平均值*/ 答案考生文件夹 解析 该程序功能是把低于平均分的学生数据放在 b所指的数组中,低于平均分的学生人数通过形参 n传回,平均分通过函数值返回。 (1)首先,通过循环求总分,然后求得平均分。 (2)在循环中,进行平均分与每个成绩进行比较,并将满足条件的数据存入数组及对其进行累加。 考点 结构体数组、指针作为函数的参数。