1、国家二级 C语言机试(操作题)模拟试卷 490及答案与解析 一、程序填空题 1 函数 fun的功能是:在有 11个元素的结构体数组 std中,查找有不及格科目的学生,找到后输出学生的学号;函数的返回值是有不及格科目的学生人数。例如,主函数中给出了 4名学生的数据,则程序运行的结果为: 学号: N1002 学号: N1006 共有 2位学生有不及格科目 请在程序的下划线处填入正确的内容,并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的 BLANK1 C中。 不得增行或删 行,也不得更改程序的结构 ! #include typedelf struct char num8;
2、double score2; *found*/ 【 1】 ; int fun(STU std, int n) int i, k=0; for(i=0; i int fun(int n, int a, int *k) int m=0, i, t; t=n; *found* for(i=0; i void NONO(); void fun(int *a, int *b, int *c, int *d) main() int a, b, c, d; printf(“请输入 4个整数: “); scanf(“ d d d d“, a, b, c, d); printf(“原始顺 序: d, d, d,
3、 d n“, a, b, c, d); fun( a, b, c, d); printf(“处理 后: d, d, d, d n“, a, b, c, d); NONO(); void NONO() * 本函数用于打开文件,输入数据, 调用函数,输出数据,关闭文件。 * FTLE *fp, *wf; int i, a, b, c, d; fp=fopen(“in dat“, “r“); wf=fopen(“out dat“, “w“); for(i=0; i5; i+) fscanf(fp, “ d d d d“, a, b, c, d); fun( a, b, c, d); fprintf(
4、wf, “a= d, d= d n“, a, d); fclose(fp); fclose(wf); 国家二级 C语言机试(操作题)模拟试卷 490答案与解析 一、程序填空题 1 【正确答案】 (1)STU (2) (3)k 【试题解析】 第一空: “(1) ; ”这一空出现在定义结构体时,这里使用了typedef就是很明显地要声明结构体类型,而这里则是要填写结构体类型名。这里就要知道 typedef的作用了, typedef是用来命名已有类型的,相当于给已经知道的类型 (如 intfloat)一个新的类型名,而这里命名的是一个结构体,这不同于结构体的类型定义,大括号后面填写的不是变量名表列,
5、而是结构体类型名,相当于给一个名称或者一种新的类型。而根据后面程序已给出的部分,我们能清楚的看到定义的结构体类型名是 STU,所以这一空应该填的是 “STU”。 第二空: “if(stdi score060(2) stdi score160); ”这一空出现在 fun函数中的 if条件语句中,根据 if后面的执行语句我们可以看到执行的人数的统计,所以这里应该就是在判断学生学科分数是否及格的条件语句。对于一开始的结构体定义我们能够发现成员 score是长度为 2的数组,所以每个学生应该是有两门学科的分数需要来判定和统计的,而这两门学科中任意一门分数不够的话都定义为不及格,然后统计进入人数中,这里
6、所填空的两边是两门学科的分数低于 60分,既然前面说了是任意一门低于 60即进入统计,那这里就应该是 “或 ”符号才符合要求,所以这一空应该填 “”。 第三空: “return(3); ”这一空出现在 fun函数中,这里要填写的是 fun函数执行后的返回值。根据题目的要求函数是要查找不及格的科目的学生,找到学生学号,然后返回学生的人数,这一空前面已经执行了查找,统计 人数和学号的输出,所以这里应该返回的就是不及格学生的人数。而根据前面的定义,人数统计的变量名应该是 k,所以这一空应该要填写的是 “k”。 二、程序修改题 2 【正确答案】 (1)for(i=0; in; i+)改为 for(i=
7、1; in; i+) (2)k=m;改为 *k=m; (3)if(t=0)改为 if(t=0) 【试题解析】 (1)第一个错误在 fun()函数的 for循环中,这里的循环的就是输入数字 n的因式,很明显的一个问题就是循环的起始值有问题,这从 i=0开始就违反了最基本的四则运 算, 0不可能是其他整数的因式,也没有意义。所以这里应该将“i=0”改为 “i=1”。 (2)第二个错误在 fun()函数中数字经过 for循环过后,这里 “k=m”,是为了得到“k”的值,也就是因子的个数。但是要注意的细节是在 fun()函数中的参数是“*k”,也就是说 k只是一个指针变量,而不是我们所需要的因子个数的
8、变量,所以这里我们应该使用的是 “*k”,即将 “k=m”改为 “*k=m”。 (3)第三个错误在 fun函数第二个 if条件语句中,这里 “f(t=0)return 1; ”的 t是数字减掉因子和的值, 也就是说只要是 t等于 0就代表输入的数字是一个完数,这里原本的意图就是在得到因子的和之后判断数字是否为完数。但是又有一个细节没有注意到的就是在 if条件语句中,等于号应该是 “=”,而不是普通的 “=”,所以这里应该将 “if(t=0)”改为 “if(t=0”。 ) 三、程序设计题 3 【正确答案】 void fun (int*a, int*b,int*c, int *d) int t;
9、if(*a*b)t=*a; *a=*b;*b=t; if(*a*c)t=*a; *a=*c;*c=t; if(*a*d)t=*a; *a=*d;*d=t; if(*b*c)t=*b; *b=*c;*c=t; if(*b*d)t=*b; *b=*d;*d=t; if(*c*d)t=*c; *c=*d;*d=t; 【试题解析】 首先在主函数 main中我们需要的就是四个数字,这四个数字需要手动输入,件程序代码第 1315行,四个数字输入完城后就可以进入 fun函数进行数据处理了。进入到 fun函数中,只要从 a到 d进行比较,按照一开始的规则即可,如果 a大于 b,不变,比较 a与 c,若 a小 b, a与 b交换位置,交换过后 a就大于 b了,这样就进行 a与 c的比较; a与 c的比较同理,这样的循环比较,就能发现,每比较一次,较大的数字就能交换到 a的位置,较小的数字就离 a越来越远,也就是到了 d的位置,这样就完成了题目所给出的要求了,最大的数字放在 a中,最小的数字放在 d中。当新的排序排好后,就可以返回主函数进行输出了。