1、国家二级 C语言机试(操作题)模拟试卷 690及答案与解析 一、程序填空题 1 函数 fun的功能是:在有 n个元素的结构体数组 std中,查找有不及格科目的学生,找到后输出学生的学号:函数的返回值是有不及格科目的学生人数。例如,主函数中给出了 4名学生的数据,则程序运行的结果为: 学号: N1002 学号: N1006 共有 2位学生有不及格科目 请在程序的下划线处填入正确的内容,并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的 BLANK1 C中。 不得增行或删行,也不得更改程序的结构 ! 1 #include stdio h 2 typedef struct 3
2、char num8; 4 double score2; 5 *found* 6 _(1)_; 7 int fun(STU std, int n) 8 int i, k=0; 9 for(i=0; i n; i+) 10 *found* 11 if(stdi score0 60_(2)_stdi score1 60) 12 k+; prfntf(学号: s, stdi num); 13 *found* 14 return_-(3)_; 15 16 main() 17 STU std4=N1001, 76 5, 82 0, N1002, 53 5, 73 0, N1005,80 5, 66 0,
3、N1006, 81 0, 56 0; 18 printf( n共有 d位学生有不及格科目 n, fun(std, 4); 19 二、程序修改题 2 给定程序 MODI1 C中,函数 fun的功能是判断整数 n是否是 “完数 ”。当一个数的因子之和恰好等于这个数本身时,就称这个数为 “完数 ”。例如: 6的因子包括1、 2、 3,而 6=1+2+3,所以 6是完数。如果是完数,函数返回值为 1,否则函数返回值为 0。数组 a中存放的是找到的因子,变量 k中存放的是因子的个数。 请改正函数 fun中指定部位的错误,使它能得出正确的结果。 注意:不要改动 main函数,不 得增行或删行,也不得更改程
4、序的结构。 1 #include stdio h 2 int fun(int n, int a, int *k) 3 int m=0, i, t; 4 t=n; 5 *found* 6 for(i=0; i n; i+) 7 if(n i=0) 8 am=i; m+; t=t-i; 9 *found* 10 k=m; 11 *found* 12 if(t=0)return 1; 13 else return 0; 14 main() 15 int n, a10, flag, i, k; 16 printf(请输入一个整数: ); scanf( d“, 1 n); 17 flag=fun(n,
5、a, k); 18 if(flag) 19 prfntf( d是完数,其因子是: ,n); 20 for(i=0, i k, i+)printf( d, ai); 21 printf( n); 22 else printf( d不是完数 n, n); 23 三、程序设计题 3 请编写函数 fun:在形参指针所指的 4个整数中找出最大值和最小值,最大的放在 a中,最小的放在 d中。 注意:部分源程序存在 PROG1 C中,请勿改动主函数 mare和其他函数中的任何内容,仅在函数 fun的花括号中填入所编写的若干语句。 1 #include stdio h 2 void NONO(); 3 voi
6、d fun(int *a, int *b, int *c, int*d) 4 5 6 main() 7 int a, b, c, d; 8 printf(请输入 4个整数: ); 9 scanf( d d d d, a, 27 fclose(wf); 国家二级 C语言机试(操作题)模拟试卷 690答案与解析 一、程序填空题 1 【正确答案】 (1)STU (2) (3)k 【试题解析】 本题中函数 fun的功能是在有 n个元素的结构体数组 std中,查找有不及格科目的学生,找到后输出学生的学号;函数的返回值是有不及格科目的学生人数。这里用到了结构体,结构体在对于个人信息处理是有很方便的作用。只
7、需要用到学生的分数和学号,所以这里的结构体的成员表列比较少。然后根据题目要求是要统计出不及格学生的人数并且查找和统计他们的学号,这里用到 if条件语句即可进行统计,要注意的是这里学科数,要求只要有一门学科不及格即进入统计,所以要正确地给出条件语句。最后输出学号和人数。 第一空: “ (1)_ ; ”这一空出现在定义结构体时,这里使用了 typedef就是很明显地要声明结构体类型,而这里则是要填写结构体类型名。这里就要知道typedef的作用了, typedef是用来命名已有类型的,相当于给已经知道的类型 (如intfloat)一个新的类型名,而这里命名的是一个结构体,这不同于结构体的类型定义,
8、大括号后面填写的不是变量名表列,而是结构体类型名,相当于给一个名称或者一种新的类型。而根据后面程序已给出的部分,我们能清楚的看到定义的结构体类型名是 STU,所以这一空应该填的是 “STU”。 第二空: “if(stdi score0 60_(2)_stdi score1 60); ”这一空出现在fun函数中的 if条件语句中,根据 if后面的执行语句我们可以看到执行的人数的统计,所以这里应该就是在判断学生学科分数是否及格的条件语句。对于一开始的结构体定义我们能够发现成员 score是长度为 2的数组,所以每个学生应该是有两门学科的分数需要来判定和统计的,而这两门学科中任意一门分数不够的话都定
9、义为不及格,然后统计进入人数中,这里所填空的两边是两门学科的分数低于 60分,既然前面说了是任意一 门低于 60即进入统计,那这里就应该是 “或 ”符号才符合要求,所以这一空应该填 “ ”。 第三空: “return_(3)_; ”这一空出现在 fun函数中,这里要填写的是 fun函数执行后的返回值。根据题目的要求函数是要查找不及格的科目的学生,找到学生学号,然后返回学生的人数,这一空前面已经执行了查找,统计人数和学号的输出,所以这里应该返回的就是不及格学生的人数。而根据前面的定义,人数统计的变量名应该是 k,所以这一空应该要填写的是 “k”。 二、程序修改题 2 【正确答案】 (1)for(
10、i=0; i n; i+)改为 for(i=1; i n; i+) (2)k=m;改为 *k=m; (3)if(t=0)改为 if(t=0) 【试题解析】 本题的 fun函数主要功能是:是判断整数 n是否是 “完数 ”。当一个数的因子之和恰好等于这个数本身时,就称这个数为 “完数 ”。 (例如: 6的因子包括 1、 2、 3,而 6=1+2+3,所以 6是完数 )如果是完数,函数返回值为 1,否则函数返回值为 0。数组 a中存放的是找到的因子,变量 k中存放的是因子的个数。这里是一个条件判断问题,原理上利用条件 if条件语句和 for循环得到结果,结果则是用数组 输出完数的因子,用 k变量输出
11、因子的个数。 这里 fun()函数为了判定这个数字是否为完数,一定要使用正确的循环,这个判断条件还是需要一定的步骤的。最重要的就是注意细节 (1)第一个错误在 fun()函数的 for循环中,这里的循环的就是输入数字 n的因式,很明显的一个问题就是循环的起始值有问题,这从 i=0开始就违反了最基本的四则运算, 0不可能是其他整数的因式,也没有意义。所以这里应该将 “i=0”改为“i=1”。 (2)第二个错误在 fun()函数中数字经过 for循环过后,这里 “k=m”,是为了 得到“k”的值,也就是因子的个数。但是要注意的细节是在 fun()函数中的参数是 “k”,也就是说 k只是一个指针变量
12、,而不是我们所需要的因子个数的变量,所以这里我们应该使用的是 “*k”,即将 “k=m”改为 “*k=m”。 (3)第三个错误在 fun函数第二个 if条件语句中,这里 “f(t=0)return 1; ”的 t是数字减掉因子和的值,也就是说只要是 t等于 0就代表输入的数字是一个完数,这里原本的意图就是在得到因子的和之后判断数字是否为完数。但是又有一个细节没有注意到的就是在 if条件语句中,等于号应该是 “=”,而不是普通的 “=”,所以这里应该将 “if(t=0)”改为 “if(t=0”。 ) 三、程序设计题 3 【正确答案】 1 void fun(int*a, int*b, int*c,
13、 int*d) 2 int t; 3 if(*a *b)t=*a; *a=*b; *b=t; 4 if(*a *c)(t=*a; *a=*c; *c=t; 5 if(*a *d)t=*a; *a=*d; *d=t; 6 if(*b *c)t=*b; *b=*c; *c=t; 7 if(*b *d)t=*b; *b=*d; *d=t; 8 if(*c *d)t=*c; *c=*d; *d=t; 【试题解析】 本题中的函数功能主要是在形参指针所指的 4个整数中找出最大值和最小值,最大的放在 a中,最小的放在 d中。这个题目类似于排序,但是又不是严格的排序,只要重新排序最大值和最小值的位置即可。所以
14、类似于排序,这一题需要相互比较 4个数字,然后进行位置的调换。 基本思路就是比较相邻的两个数字,如果靠近 a的数字比靠近 d的数字要大,就不用进行交换,如果靠近 a的数字比靠近 d的数字小,就进行交换,这样的话最大的数字就 会慢慢交换到 a的位置,然后最小的数字就会慢慢交换到 d的位置。所以根据分析我们就要用到 if语句来进行判断和处理,只要经过几轮的 if判断大小然后交换,就能实现题目条件所给出的位置的重置,得到要求的结果。 首先在主函数 main中我们需要的就是四个数字,这四个数字需要手动输入,件程序代码第 13 15行,四个数字输入完城后就可以进入 fun函数进行数据处理了。进入到 fun函数中,只要从 a到 d进行比较,按照一开始的规则即可,如果 a大于 b,不变,比较 a与 c,若 a小 b, a与 b交换位置,交换过后 a就大于 b了,这样就进行 a与 c的比较; a与 c的比较同理,这样的循环比较,就能发现,每比较一次,较大的数字就能交换到 a的位置,较小的数字就离 a越来越远,也就是到了 d的位置,这样就完成了题目所给出的要求了,最大的数字放在 a中,最小的数字放在 d中。当新的排序排好后,就可以返回主函数进行输出了。
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1