1、国家二级 C语言机试(操作题)模拟试卷 62及答案与解析 一、程序填空题 1 程序通过定义学生结构体变量,存储了学生的学号、姓名和 3门课的成绩。所有学生数据均以二进制:疗式输出到文件中。函数 fun的功能是从形参 filename所指的文件中读入学生数据,并按照学号从小到大排序后,再用二进制方式把排序后的学生数据输出到 filename所指的文件中,覆盖原来的文件内容。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的 BLANK1 C中。 不得增行或删行,也不得更改程序的结构 ! #inolude #define N 5 typede
2、f struct student long sno; char name10; float scoee3; STU; void fun(char *filerlame) FILE*fp; int i, j; STU sN, t; /*found*/ fp=fopen(filename, _1_); fread(s, sizeof(STU), N, fp); fclose(fp); for(2=0; i #include void fun(char s, int n) char a80, *p; int i; /*found*/ s=p; for(i=0, i #define N 50 #def
3、ime M 11 void fun(int*a, int*b) double rnd() static t=29, c=217, m=1024, r=0 ; r=(r*t+c) m; return(double)r/m); main() int ageN, i, dM; void NONO (int dM); for(i=0; i (3)fwrite 【试题解析】 第一空:根据题干要求, “fp=fopen(filename, 1); ”是打开filename所指文件,读出学生数据 “fread(s, sizeof(STU), N, fp); ”,然后关闭文件 “fclose(fp)”,故第一
4、空处是只读方式打开文件,因此第一空处应为 “rb“”。 第二空:根据题意, for循环是将学生数据按照学号从小到大排序后,这里采用的是冒泡法排序,如果发现前面的数据比后面的大则交换,故第二空处应为 “”。 第三空:文件是以只写方式 (“wb”)打开,执行 “_3_(s, sizeof(STU), N,fp); ”后,关闭文件,即第三处是一次把所有学生数据写入文件,这是执行数据块写函数 fwrite,故第三空处为 “fwrite”。 二、程序修改题 2 【正确答案】 (1)p=s ; (2)while(*p+); 【试题解析】 (1)变量初始化应是将形参数组地址 s传给工作指针 p。因此,应将“
5、s=p; ”改为 “p=s; ”。 (2)do while循环的目的是把 p指向的字符串内容拷贝到 a字符串的后面,但第二标识下 while语句没有使用分号,故第二标识下应改成 “while(*p+); ”。 三、程序设计题 3 【正确答案】 #include #define N 50 #define M 11 void fun(int*a, int*b) /指针变量 a接收存放年龄数组的数组的地址, b接收统计数组的地址 int i, j; for(i=0; i=10) b10+; else bj+; 【试题解析】 (1)首先,初始化不 同年龄段的计数统计器。 (2)然后在 for循环中,首先取得数组中的元素除以 10,保存在 j中,由于年龄在0 150之间,因此 j的值有 0, 1, 2,3,4,5,6,7,8,9,以及 10和大于 10。凡是大于10则统计在下标为 10的单元中,而其它的则统计在相应的 i表示的下标单元中。