1、国家二级 C语言机试(函数和数组)模拟试卷 15及答案与解析 一、选择题 1 有下列程序: #include *fun函数的功能是将 a所指数组元素从大到小排序 * void fun(int*a, int n) main() int t, i, j; int c10=1, 2, 3, 4, 5, 6, 7, 8, 9, 0), i; for(i=0; i main() int c6=10, 20, 30, 40, 50, 60, *p, *s; p=c: s=&c5; printf(“ d n“, s-p); 程序运行后的输出结果是 ( A) 50 ( B) 6 ( C) 5 ( D) 60
2、3 以下叙述中正确的是 ( A)一条语句只能定义一个数组 ( B)数组说明符的一对方括号中只能使用整型常量,而不能使用表达式 ( C)每个数组包含一组具有同一类型的变量,这些变量在内存中占有连续的存储单元 ( D)在引用数组元素时,下标表达 式可以使用浮点数 4 以下叙述中正确的是 ( A)语句 int a=0;是不合法的,遗漏了数组的大小 ( B)语句 char a2=“A“, “B“;是合法的,定义了一个包含两个字符的数组 ( C)语句 int a8=0;是合法的 ( D)语句 char a3; a=“AB“:是合法的,因为数组有三个字符空间的容量,可以保存两个字符 5 如果定义 floa
3、t a10, x;则以下叙述中正确的是 ( A)表达式 a+1是非法的 ( B)语句 a=&x:是非法的 ( C)三个表达式 a1、 *(a+1)、 *&a1表示的意思完全不同 ( D)表达式 * a1是非法的,应该写成 *( (a1) 6 有以下程序 #include main() int a=10, 20, 30, 40), *p=a, i; for(i=0; i main()int i, j=0; char a=“How are you!“, b10; for(i=0; ai; i+) if(ai=)bj+: ai+1; bj= 0; printf(“ s n“, b); 则程序的输出结
4、果是 ( A) Howareyou ( B) Hay! ( C) Howareyou! ( D) ay 9 若有以下程序 #include char*a=“you“, b=“welcome#you#to#China!“; main()int i, j=0; char*p; for(i=0; bi!= 0; i+) if(*a=bi) p= bi; for(j=0; aj!= 0; j+) if(aj!=*p)break; p+; if(aj= 0)break; printf(“ s n“, p); 则程序的输出结果是 ( A) #you#to#China! ( B) me#you#to#Chi
5、na! ( C) #China! ( D) #to#China! 10 以下能正确定义二维数组是 ( A) int a3; ( B) int a3=2*3; ( C) int a3= ( D) int a23=1, 2), 3, 4); 11 若有以下说明和语句 int c451, (*p)5; p=c; 能够正确引用 c数组元素的是 ( A) p+1 ( B) *(p+3) ( C) *(p+1)+3 ( D) *(p0+2) 12 若有定义语句: int k23, *pk3;,则以下语句中正确的是 ( A) pk=k; ( B) pk0=k12; ( C) pk=k0; ( D) ok=k
6、; 13 若有定义语句: int a36;,按在内存中的存放顺序, a数组的第 10个元素是 ( A) a04 ( B) a13 ( C) a03 ( D) a14 14 若有定义语句: int a23, *p3;,则以下语句中正确的是 ( A) p=a; ( B) p0=a; ( C) p0=a12; ( D) p1=a; 15 若有定义: int a23;,以下选项中对 a数组元素正确引用的是 ( A) a2!1 ( B) a23 ( C) a03 ( D) a12!1 16 以下数组定义中错误的是 ( A) int x3=0; ( B) int x23=1, 2, 3, 4, 5, 6;
7、 ( C) int x3=1, 2, 3, 4, 5, 6; ( D) int x23=1, 2, 3, 4, 5, 6; 17 有以下程 序 #include #define N 4 void fun(int aN, int b) int i; for(i=0; i,则输出结果为 ( A) 2 0 0 ( B) 2 4 0 ( C) 2 0 4 ( D) 2 4 6 21 有以下程序 #include int fun(int(*s)4, int n, int k) int m, i; m=s0k; for(i=1; im)m=sik; return m; ) main() int a44=1
8、, 2, 3, 4), 11, 12, 13, 14, 21, 22, 23, 24, 31, 32,33, 34; printf(“ d n“, fun(a, 4, 0); 程序的运行结果是 ( A) 31 ( B) 34 ( C) 4 ( D) 32 22 有下列程序: main() int a44=1, 4, 3, 2, 8, 6, 5, 7, 3, 7, 2, 5, 4, 8, 6, 1), i,j, k, t; for(i=0; iaki)t=aji; aji=aki; aki=t; *按列排序 * for(i=0; i #define N 3 void fun(int aN, in
9、t b) main() int ij; int xNN=1, 2, 3, 4, 5, 6, 7, 8, 9, yN, i; for(i=0; i2的值为 0, !1的值为 0,因此选项 D实际是访问a00。 【知识模块】 函数和数组 16 【正确答案】 B 【试题解析】 二维数组的初始化有以下几种形式: 分行进行初始化; 不分行的初始化; 部分数组元素初始化; 省略第一维的定义,不省略第二维的定义。在选项 B中赋值号左边定义了一个 3行 2列的二维数组,而右边用 2行 3列的数字进行赋初值。所以出现了边界的越界溢出而出错。 【知识模块】 函数和数组 17 【正确答案】 B 【试题解析】 fun
10、函数的功能是求出二维数组 a中第 i行第 i个元素与第 N-1-i元素的差,赋给 bi。在主函数中,把实参二 维数组 x和一维数组 y传递给形参 a和b,最后输出一维数组 y中元素的值。 【知识模块】 函数和数组 18 【正确答案】 D 【试题解析】 这道题主要考查的是二维数组的有关知识。在两层 for循环语句中,每次执行变量 t的累加时,二维数组元素 b的第二下标的值与第一下标相同的值,所以程序执行的过程为 t=1+b11+b22=1+1+2=4。 【知识模块】 函数和数组 19 【正确答案】 D 【试题解析】 在选项 D的数组定义中,赋值号左边定义了一个 2行 4列的二维数组,而在右边 定
11、义了一个 3行 2列的二维数组。 【知识模块】 函数和数组 20 【正确答案】 C 【试题解析】 语句 x32=0表示将二维数组 x的所有元素赋初值 0,而循环语句 for(i=0; i时,数组元素 x00=2、 x10=4、x20=6,因此,输出数组元素 x00=2、 x01=0、 x10=4的值 204。 【知识模块】 函数和数组 21 【正确答案】 A 【试题解析】 函数 funl(int(*s)4, int, int k)的功能是返回二维数组第 k列的最大元素。在主函数中由于二维数组 a44已经初始化,所以 fun(a, 4, 0)的值是二维数组 a第 1列中的最大元素 31。 【知识
12、模块】 函数和数组 22 【正确答案】 B 【试题解析】 最外层的 for语句的自变量 i是列下标,而内部的两个 for语句的自变量 i和 k是行下标。所以由程序段可知,这是利用三重循环对二维数组 a44的元素按列从小到大进行排序,所以最后排完序的结果为 a44=1, 4, 2, 1),3, 6, 3, 2, 4, 7, 5, 5, 8, 8, 6, 7,最后一个 for语句的功能是输出数组 a44主对角线上的元素,因而输出为 1, 6, 5, 7。 【知识模块】 函数和数组 23 【正确答案】 D 【试题解析】 由于在程序中定义了二维数组 t3=9, 8, 7, 6, 5, 4, 3, 2,
13、1:由二维数组的存储方式按行存储,即初始化完第一行的所有列再初始化下一行的元素。可知这是一个 3行 3列的二维 数组,第一行的元素为 9, 8, 7),第二行的元素为 6, 5, 4),第三行的元素为 3, 2, 1。然后用 for循环输出 t20、t11、 t02,它们的值分别为 3、 5、 7。 【知识模块】 函数和数组 24 【正确答案】 D 【试题解析】 利用二重 for循环对二维数组 a44的主对角线上的元素 1, 6,2, 1实现按列从大到小排序,所以数组 a44的值变为 6, 4, 3, 2, , 8,2, 5, 7, 3, 7, 1, 5, 4, 8, 6, 1,最后输出数组
14、a44第一行上的元素,所以输出结果为 6, 4, 3, 2。 【知识模块】 函数和数组 25 【正确答案】 C 【试题解析】 在 C语言中,二维数组的名字表示的是二维数组的地址,对于二维数组 im w35,可以认为 w为一个一维数组,含有 3个元素,而每个元素为一个含有 5个元素的一维数组。而 (w+1)为一个含有两个元素的一维数组,首先和(w+1)4结合非法, 4超出了二维数组的边界,取值也就是非法的了。 【知识模块】 函数和数组 26 【正确答案】 D 【试题解析】 一维数组定义和初 始化是允许省略行下标,不允许省略列下标。 【知识模块】 函数和数组 27 【正确答案】 C 【试题解析】
15、在理解二维数组的时候,可以把一个二维数组看成是一个一维数组,每个数组元素又是包含有若干个元素的一维数组,也就是具有行列的结构,二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值。 【知识模块】 函数和数组 28 【正确答案】 B 【试题解析】 二维数组的元素在内存中占一系列连续的存储单元。数组元素在内存中的排列顺序是先存放第 0行的 元素,再存放第 1行的元素 称这种存放顺序为按行存放。可以把一个二维数组看成是一个一维数组,每个数组元素又是包含有若干个元素的一维数一组。另外在给二维数组赋初值时可以不用含花括号对。例如, inta43=1, 2, 4, 5;在编译时,系统将按 a数组元素在内存中排列的顺序,将花括号内的数据一一对应地赋给各个元素,若数据不足,系统将给后面的元素自动补初值 0。以上将给 a数组第一行的元素和第二行的第一个元素依次赋予 1、 2、 4、 5,其他元素的初值都为 0。 【知识模块】 函数和数组 29 【正确答案】 D 【试题解析】 函数 fun()的作用是求出二维数组 aN中每一行中的最大元素,所以在 main()函数中执行完 fun(x, y)后,数组 y中的元素为二维数组 xNN每一行的最大元素。 【知识模块】 函数和数组