1、国家二级 C语言机试(操作题)模拟试卷 247及答案与解析 一、程序填空题 1 程序通过定义学生结构体变量,存储了学生的学号、姓名和三门课的成绩。所有学生数据均以二进制方式输出到文件中。函数 fun的功能是从形参 filename所指的文件中读入学生数据,并按照学号从小到大排序后,再用二进制方式把排序后的学生数据输出到 filename所指的文件中,覆盖原来的文件内容。 请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。 注意:部分源程序在文件 BLANK1 C中。 不 得增行或删行,也不得更改程序的结构 ! 试题程序: 1 #include stdio h 2 #defi
2、ne N 5 3 typedef struct student 4 long sno; 5 char name10; 6 float score3; 7 STU; 8 void fun(char*filename) 9 FILE * fp; int i, j; 10 STU sN, t; 11 *found* 12 fp=fopen(filename, 【 1】 ); 13 fread(s, sizeof(STU), N, fp); 14 fclose(fp); 15 for(i=0; i N-1; i+) 16 for(j=i+1; j N; j+) 17 *found* 18 if(si
3、sno【 2】 sj sno) 19 t=si; si=sj; 20 sj=t; 21 fp=fopen(filename, wb); 22 *found* 23 【 3】 (s, sizeof(STU), N, fp); 24 fclose(fp); 25 26 main() 27 STU tN=10005, ZhangSan, 95, 80, 88, 10003, LiSi, 85, 70,78, 10002, CaoKai, 75, 60, 88, 10004, FangFang, 90, 82, 8 7,10001, MaChao, 91, 92, 77, ssN; 28 int i,
4、 j; FILE*fp; 29 fp=fopen(student dat, wb); 30 fwrite(t, sizeof(STU), 5, fp); 31 fclose(fp); 32 printf ( n nThe original data: n n); 33 for(j=0; j N; j+) 34 printf( nNo: id Name: -8s scores , tj sno, tj name); 35 for(i=0; i 3; i+) 36 printf( 6 2 f, tj scorei); 37 printf( n); 38 39 fun(student dat); 4
5、0 printf(n nThe data after sorting: n n); 41 fp=fopen(student dat, rb); 42 fread(ss, sizeof(STU), 5, fp); 43 fclose(fp); 44 for(j=0; j N; j+) 45 printf( nNo: 1d Name: -8s Scores , ssj sno, ssj name); 46 for(i=0; i 3; i+) 47 printf( 6 2 f, ssj scorei); 48 printf( n); 49 50 二、程序修改题 2 给定程序 MODI1 C中规定输入
6、的字符串全部为字母, fun函数的功能是:统计a所指字符串中每个字母在字符串中出现的次数 (统计时不区分大小写 ),并将出现次数最高的字母输出 (如果有多个相同,输出一个即可 )。 例如对于字符串: dadbcdbabdb,对应的输出应为: b或 d。 请改正函数 fun中指定部位的错误,使它能得出正确的结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构。 试题程序: 1 #include stdio h 2 #include stdio h 3 #include string h 4 void fun(char a) 5 int b26, i, n, max; 6 f
7、or(i=0; i=a ai=A aibi) 20 max=i; 21 printf(出现次数最多的字符是: c n, max+a); 22 23 main() 24 char a200; 25 printf(请输入一个待 统计的字符串: ); scanf( s, a); 26 fun(a); 27 三、程序设计题 3 编写函数 fun,其功能是:根据以下公式计算 s,并将计算结果作为函数值返回, n通过形参传入。 例如,若 n的值为 11时,函数的值为 1 833333。 注意:部分源程序给出如下。 请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语
8、句。 试题程序: 1 #include stdlib h 2 #include conio h 3 #include stdio h 4 #include string.h 5 float fun(int n) 6 7 8 9 void main() 10 11 int n; 12 float s; 13 system(CLS); 14 printf( nPlease enter N: ); 15 scanf( d, n); 16 s=fun(n); 17 printf (The result is: f n, s); 18 国家二级 C语言机试(操作题)模拟试卷 247答案与解析 一、程序填
9、空题 1 【正确答案】 (1)rb (2) (3)fwrite 【试题解析】 填空 l:题目中要求从形参 filename所指的文件中读入学生的数据,以此可以看出本空应该填写 rb。 填空 2:此处的 if语句是比较学号的大小,如果学号大就和学号小的换位,以此本空填写 。 填空 3:题目要求所有的学生数据均以二进制方式输出到文件中,因此本空填写fwrite。 二、程序修改题 2 【正确答案】 (1)bi =0; (2)bai-a+; (3)if(bmaxbi) 【试题解析】 要统计字符串中每个字符在这个字符串中出现的次数,可以设数组b中存放每个字符出现的次数 b0存放字符 a的次数, b1存放
10、字符 h的次数 。统计之前为数组 b各元素赋初值为 0。然后依次取出字符串的每个字符进行判断,使对应数组 b加 1。 max初始值为 0,与数组 b中的每个元素进行比较,如果小于,就把下标进行交换。 (1)数组 a存放的是字符串,数组 b为整型数组存放的是每个字符的 个数,应将数组 b每个元素初始化为 0。 (2)小写字母的 ASCII码减去 a的 ASCII即为相应字母的下标值,相应下标值的数组元素的值增加 1。 (3)最大值小于被比较数时,把被比较数的下标值赋给 max, max中存放的总是当前最大值。 三、程序设计题 3 【正确答案】 1 float fun(int n) 2 3 int
11、 i, s1=0 ; 4 float s=0 0; 5 for(i=1; i=n ; i+) 6 7 s1=s1+i ; *求每一项的分母 * 8 s=s+1 0 s1; *求多项式的值 * 9 10 return s; 11 【试题解析】 此类计算表达式值的程序,首先需要根据题意分析表达式的规律,得出通项,然后再完成程序语句。 本题中表达式的规律是 1+2+n 的倒数之和,那么可以通过 for循环语句来实现第 1项到第 n项的变化。其实就是累加算法,方法是先根据题目要求定义变量,注意该变量的数据类型,然后对其进行初始化操作,因为该变量的作用是累加器,所以初始值应为 0(或 0 0,根据 变量数据类型来确定 ),再通过 for循环语句来完成累加过程。 本题中 s1用来表示每一项的分母,每一项的分母都是由前一项分母加项数。注意,由于 s1定义成一个整型,所以在 s=s+1 0 s1语句中不能把 1 0写成 1。