1、国家二级 C语言机试(操作题)模拟试卷 483及答案与解析 一、程序填空题 1 下列给定程序中,函数 fun的功能是:将形参 a所指数组中的前半部分元素中的值与后半部分元素中的值对换。形参 n中存放数组中数据的个数,若 n为奇数,则中间的元素不动。 例如,若 a所指数组中的数据为: 1, 2, 3, 4, 5, 6, 7, 8, 9,则调换后为:6, 7, 8, 9, 5, 1, 2, 3, 4。 请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。 注意:部分源程序给出如下。 不得增行或删行,也不 得更改程序的结构 ! 试题程序: #include stdio h #def
2、ine N 9 void fun(int a, int r1) int i, t, p; /*found*/ P=(n 2=0)? n/2: n/2+ 【 1】 ; for(i=0; i n/2; i+) t=ai; /*found*/ ai=ap+【 2】 ; /*found*/ 【 3】 =t; main() int bN=1, 2, 3, 4, 5, 6, 7, 8, 9, i; printf(“nThe original data: n“); for(i=0; i N; i+) printf(“ 4d“, bi); printf(“n“); fun(b, N); printf(“nTh
3、e data after moving: n“); for(i=0; i N; i+) printf(“ 4 d“, bi); printf(“n“); 二、程序修改题 2 下列给定程序中函数 fun的功能是:把从主函数中输入的 3个数,最大的数放在a中,中间的数放在 b中,最小的数放在 c中。 例如,若输入的数为: 55 12 34,输出的结果应当是: a=55 0, b=34 0,c=12 0。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构 ! 试题程序: #include stdio h void fun(float*a,
4、 float*b, float* c) /*found*/ float*k; if(*a *b) k=*a; *a=*b; * b=k; ) /*found*/ if(*a * c) k=*c; *c=*a; *a=k; if(*b *c) k=*b; *b=*c; *c=k; main() float a, b, c; printf(“Input a b c: “); scanf(“ f f f“, &a, &b, &c); printf(“a= 4 1 f, b= 4 1 f, c= 4 1 fnn“, a, b, c); fun(&a, &b, &c); printf(“a= 4 1 f
5、, b= 4 1 f, c= 4 1 fnn“, a, b, c); 三、程序设计题 3 学生的记录由学号和成绩组成, N名学生的数据已放入主函数中的结构体数组 s中,请编写函数 fun,其功能是:把分数最高的学生数据放在 b所指的数组中。 注意:分数最高的学生可能不止一个,函数返回分数最高的学生人数。 注意:部分源程序给出如下。 请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 试题程序: #include stdio h #define N 1 6 typedef struct char hum10; int s; STREC; int fu
6、n(STREC*a, STREC*b) void main() STREC sN=“GA005“, 85, “GA003“, 76, “GA002“, 69, “GA004“, 85, “GA001“, 91, “GA007“, 72, “GA008“, 64, “GA006“, 87, “GA015“, 85, “GA013“, 91, “GA012“, 64, “GA014“, 91, “GA011“, 77, “GA017“, 64, “GA018“, 64, “GA016“, 72; STREC hN; int i, n; n=fun(s, h); printf(“The d high
7、est score: n“, n); for(i=0; i n; i+) printf(“ s 4dn“, hi nHin, hi s); /*输出最高分学生的学号和成绩 */ printf(“n“); 国家二级 C语言 机试(操作题)模拟试卷 483答案与解析 一、程序填空题 1 【正确答案】 (1)1 (2)i (3)ap+i或 *(a+p+i) 【试题解析】 条件运算符组成条件表达式的一般形式:表达式 1 7表达式 2:表达式 3。其求值规则为:如果表达式 l的值为真,则以表达式 2的值作为条件表达式的值,否则以表达式 3的值作为整个条件表达式的值。 填空 1:该处是判断数组元素的个数是
8、奇数还是偶数,为奇数时要使当前位置加1,使 p指向数组中间位置。 填空 2和填空 3:这里是一个比较常见的数组位置调换程序,应填入 i和 ap+i或*(a+p+i)。 变量交换算法:如果变量 a、 b互换,需借助第 3个变量 temp完成,即 temp=a;a=b; b=temp;。 二、程序修改题 2 【正确答案】 (1)float k; (2)if( *a *c) 【试题解析】 本题考查:变量定义,根据给定程序语句确定变量类型; if语句条件表达式。 (1)观察程序中的 k,在赋值语句中, k是以变量的形式进行赋值而非指针,所以将k定义为指针是错误的。 (2)此处 if语句是为了将小于 *
9、c的值放入 *c中,所以改为 if( *a *c)。 三、程序设 计题 3 【正确答案】 int fun (STREC *a, STREC *b) int i,j =0,max =a0 s; for(i=0; i N; i+) if (max ai s)/*找出最大值 */ max =ai s; for(i=0; i N; i+) if(max=ai s) bj+=ai; /*找出成绩与 max相等的学生的记录,存入结构体 b中 */ return j; /*返回最高成绩的学生人数 */ 【试题解析】 本题考查:结构体数组操 作;用循环判断结构查找数组中的最大值。 该程序使用两个循环判断语句,第 1个循环判断语句的作用是找出最大值;第 2个循环判断语句的作用是找出与 max相等的成绩(即最高成绩)的学生记录,并存入 b中。 对于如何找出数组中最大值(多个相等)的方法,我们已经不陌生。如何对结构体数组进行类似操作呢? 掌握以下语句: if (max ai s) max =ai s;