1、国家二级 C语言机试( C语言程序设计)模拟试卷 17及答案与解析 一、选择题 1 若有定义语句: int m 5, 4, 3, 2, 1, i 4;,则下面对 m数组元素的引用中错误的是 ( A) m-i ( B) m2*2 ( C) mm0 ( D) mmi 2 若有定义语句: double x5 1 0, 2 0, 3 0, 4 0, 5 O), *p x;则错误引用 x数组元素的是 ( A) *P ( B) x5 ( C) *(p 1) ( D) *x 3 若要定义一个具有 5个元素的整型数组 ,以下错误的定义语句是 ( A) int a5 0; ( B) int b 0, 0, 0,
2、 0, 0; ( C) int c2 3 ( D) int i 5, di; 4 以下能正确定义一维数组的选项是 ( A) int a5 0, 1, 2, 3, 4, 5; ( B) char a: 0, 1, 2, 3, 4, 5; ( C) char a A, B, C; ( D) int a5 “0123“; 5 有以下程序 void fun(int a, int n) int i, t; for(i 0; i n 2; i ) t ai; ai an 1 i; an 1 i t; main() int k10 1,2, 3, 4, 5, 6, 7, 8, 9, 10, i; fun(k
3、, 5); for(i 2; i 8; i )printf(“ d“, ki); printf(“ n“); 程序的运行结果是 ( A) 876543 ( B) 321678 ( C) 1098765 ( D) 345678 6 下列定义数组的语句中,正确的是 ( A) intN 10; int xN; ( B) #define N 10 int xN; ( C) int x0, 10; ( D) int x; 7 有以下程序 #include void main() int a 2, 3, 5, 4, i; for(i 0; i 4; i ) switch(i 2) case 0: swit
4、ch(ai 2) case 0: ai; break; case 1: ai-; break; case 1: ai 0; for(i 0; i 4; i ) printf(“ d“, ai); printf(“ n“); 程序运行后的输出结果是 ( A) 2 0 5 0 ( B) 3 3 4 4 ( C) 3 0 4 0 ( D) 0 3 0 4 8 有以下程序 #inelude void fun(int a, int b) int t; t a; a b; b t; main() int c10 1, 2, 3, 4, 5, 6, 7, 8, 9, 0), i; for(i 0; i 10
5、; i 2) fun(ci, ci 1); for(i 0; i 10; i ) printf(“ d, “, ci); printf(“ n“); 程序的运行结果是 ( A) 2, 1, 4, 3, 6, 5, 8, 7, 0, 9, ( B) 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, ( C) 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, ( D) 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9 有下列程序: main() int i,s 0,t=l, 2, 3, 4, 5, 6, 7, 8, 9); for(i 0; i 9; i 2)s
6、*(t i); printf(“ d n“, s); 程序执行后的输出、结果是 ( A) 20 ( B) 45 ( C) 36 ( D) 25 10 下列选项中,能正确定义数组的语句是 ( A) int num; ( B) int N 2008; int numN; ( C) int num0 2008; ( D) #define N 2008 int numN; 11 若要求定义具有 10个 int型元素的一维数组 a,则以下定义语句中错误的是 ( A) #define n 5 int a2*n; ( B) int a5 5; ( C) #define N 10 int aN; ( D) i
7、nt n 10, an; 12 下列程序中函数 f的功能是:当 flag为 1时,进行由小到大排序;当 flag为 0时,进行由大到小排序。 void f(int b, int n, int flag) int i, j, t; for(i 0; i n 1; i ) for(j i 1; j n; j ) if(flag?bi bj: bi bj) t bi; bi bj; bj t; main() int a10 5, 4, 3, 2, 1, 6, 7, 8, 9, 10, i; f(i n 1;j ) for(j i 1;j n;j ) if(ai aj)t ai; ai aj; aj
8、t; main() int c10 1, 2, 3, 4, 5, 6, 7, 8, 9, 0), i; fun(c 4, 6); for(i 0; i 10; i )printf(“ d, “, ci); printf(“ n“); 程序的运行结果是 ( A) 1, 2, 3, 4, 9, 8, 7, 6, 5, 0, ( B) 0, 9, 8, 7, 6, 5, 1, 2, 3, 4, ( C) 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, ( D) 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 15 有以下程序 #include main() int c6 10
9、, 20, 30, 40, 50, 60, *p, *s; P c; S c5; printf(“ d n“, s P); 程序运行后的输出结果是 ( A) 50 ( B) 6 ( C) 5 ( D) 60 16 以下叙述中正确的是 ( A)一条语句只能定义一个数组 ( B)数组说明符的一对方括号中只能使用整型常量,而不能使用表达式 ( C)每个数组包含一组具有同一类型的变量,这些变量在内存中占有连续的存储单元 ( D)在引用数组元素时,下标表达式可以使用浮点数 17 以下叙述中正确的是 ( A)语句 int a 0;是不合法的,遗漏了数组的大小 ( B)语句 char a2 “A“, “B“
10、;是合法的,定义了一个包含两个字符的数组 ( C)语句 int a8 0;是合法的 ( D)语句 char a3; a “AB“;是合法的,因为数组有三个字符空间的容量,可以保存两个字符 18 如果定义 float a10, x;则以下叙述中正确的是 ( A)表达式 a 1是非法的 ( B)语句 a x;是非法的 ( C)三个表达式 a1、 *(a 1)、 * a1表示的意思完全不同 ( D)表达式 *&a1是非法的,应该写成 *(&(a1) 19 有以下程序 #include main() int a 10, 20, 30, 40, *p a, i; for(i 0; i 3; i )ai
11、*p; p; printf(“ d n“, a2); 程序运行后的输出结果是 ( A) 20 ( B) 30 ( C) 10 ( D) 40 20 若有以下程序 main() int i,j 0; char a “How are you!“; for(i 0; ai; i ) if(ai! “) aj ai; aj 0; printf(“ s n“, a); 则程序的输出结果是 ( A) Howareyou ( B) Hay! ( C) Howareyou! ( D) How are you! 21 若有以下程序 #include main() int i, j 0; char a “How
12、are you!“, b10; for(i 0; ai; i ) if(ai=“)bj ai 1; bj 0; printf(“ s n“, b); 则程序的输出结果是 ( A) Howareyou ( B) Hay! ( C) Howareyou! ( D) ay 22 若有以下程序 #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
13、= 0)break; printf(“ s n“, p); 则程序的输出结果是 ( A) #you#to#China! ( B) me#you#to#China! ( C) #China! ( D) #to#China! 23 以下能正确定义二维数组是 ( A) int a3; ( B) int a3 2*3; ( C) int a3 ; ( D) int a23 1), 2, 3, 4); 24 若有以下说明和语句 int c45, (*p)5; p c; 能够正确引用 c数组元素的是 ( A) p 1 ( B) *(p 3) ( C) *(p 1) 3 ( D) *(p0 2) 25 若有
14、定义语句: int k23, *pk3;,则以下语句中正确的是 ( A) pk k; ( B) pk0 k12; ( C) pk k0; ( D) pk1 k; 26 若有定义语句: int a36;,按在内存中的存放顺序, a数组的第 10个元素是 ( A) a04 ( B) a13 ( C) a03 ( D) a14 27 若有定义语句: int a23, *p3;,则以下语句中正确的是 ( A) p a; ( B) p0 a; ( C) p0 a12; ( D) p1 a; 28 若有定义: int a23;,以下选项中对 a数组元素正确引用的是 ( A) a211 ( B) a23 (
15、 C) a03 ( D) a1 211 29 以下数组定义中错误的是 ( A) int x3 0; ( B) int x23 1, 2, 3, 4, 5, 6; ( C) int x3 1, 2, 3, 4, 5, 6; ( D) int x23 1, 2, 3, 4, 5, 6; 30 有以下程序 #include #define N 4 void fun(int aN, int b) int i; for(i 0; i N; i )bi aii aiN 1 i; void main() int xNN 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1
16、4,15, 16, yN, i; fun(x, y); for(i 0; i N; i )printf(“ d, “, yi); printf(“ n“); 程序运行后的输出结果是 ( A) 12, 3, 0, 0, ( B) 3,一 1, 1, 3, ( C) 0, 1, 2, 3, ( D) 3, 3, 3, 3, 31 有以下程序 #include main() int b33 0, 1, 2, 0, 1, 2, 0, 1, 2, i, j, t,1; for(i 0; i i; j ) t biji; printf(“ d n, t); 程序运行后的输出结果是 ( A) 3 ( B)
17、1 ( C) 9 ( D) 4 32 以下定义数组的语句中错误的是 ( A) int num3 1, 2, 3, 4, 5, 6; ( B) int num 1, 2, 3, 4, 5, 6; ( C) int num4 1, 2, 3, 4, 5, 6; ( D) int num24 1, 2), 3, 4), 5, 6; 33 有 下列程序: main() int x32 0, i; for(i 0; i 3; i )scanf(“ d“, xi); printf(“ 3d 3d 3d n“,x00, x01, x10); 若运行时输入: 2 4 6,则输出结果为 ( A) 2 0 0 (
18、 B) 2 4 0 ( C) 2 0 4 ( D) 2 4 6 国家二级 C语言机试( C语言程序设计)模拟试卷 17答案与解析 一、选择题 1 【正确答案】 C 【试题解析】 本题考查数组的使用。 m是一个一维数组,长度为 5,因此下标范围是 0-4。选项 A中 i是先自减,然后使用 i,因此访问的是元素 m3;选项 B访问的是元素 m4;选项 C中内部的 m0值是 5,因此实际访问是的 m5,下标超出范围;选项 D中 mi的值是 1,访问元素 m1。 【知识模块】 C语言程序设计 2 【正确答案】 B 【试题解析】 本题考查数组和指向数组的指针。 x是一个一维 double类型的数组,长度
19、为 5,下标范围是 0 4,指针 P指向数组 x。选项 A中 *p是取数组首元素 x0的值;选项 B下标超出范围;选项 C, p 1表示 x1的地址,因此 *(p 1)是取 x1元素值;选项 D中,数组名 x本身代表数组的首地址,因此 *x表示取元素 x0的值。 【知识模块】 C语言程序设计 3 【正确答案】 D 【试题解析】 本题考查一维数组的定义, C语言中一维数组的定义方式为:类型说明符数组名 常量表达式 ;选项 A正确;选项 B初始化了 5个元素,因此数组长度为 5;选项 C常量表达式 2 3的值为 5,正确;选项 D数组长度不是常量表达式,错误。 【知识模块】 C语言程序设计 4 【
20、正确答案】 B 【试题解析】 本题考查一维数组的定义, C语言中一维数组的定义方式为:类型说明符数组名 常量表达式 ;选项 A定义的数组长度为 5,大括号里面的元素个数为 6,超过数组长度,错误;选项 B正确,编译器会根据初始化元素的个数自动计算数组的长度。选项 C中没有使用 “”,不能定义一维数组;选项 D中数组元素的初始化必须使用大括号。 【知识模块】 C语言程序设计 5 【正确答案】 B 【试题解析】 函数 fun(int a, int n)的功能是实现整型数组 a元素的逆置操作 。在主函数中当执行 fun(k, 5)时,对 k10中的子数组 k5 1, 2, 3, 4, 5的首尾元素进
21、行逆置,此时 k10 5, 4, 3, 2, 1, 6, 7, 8, 9, 10。所在循环语句中输出从第 2 7个数组元素时,其值分别为 321678。 【知识模块】 C语言程序设计 6 【正确答案】 B 【试题解析】 数组说明的一般形式为:类型说明符数组名 常量表达式 ;其中类型说明符可以是任一种基本数据类型或构造数据类型,数组名是定义的数组标识符。常量表达式表示数据元素的个数,也就是数组的长度,必须是 整型常量。 【知识模块】 C语言程序设计 7 【正确答案】 C 【试题解析】 在主函数的 for循环语句中,当循环变量 i的值等于 0, 2时,执行switch中的 case 0语句,分别对
22、数组元素 a0和 a2加 1和减 1,所以 a0的值等于 3, a2等于 4。当循环变量 i的值等于 1, 3时,执行 switch中的 case 1语句,把数组元素 a1和 a3的值赋为 0。所以输出数组 a的元素,其结果为 3040。 【知识模块】 C语言程序设计 8 【正确答案】 C 【试题解析】 C语言 规定,实参变量对形参变量的数据传递是 “值传递 ”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。由此可知,在本题中,函数 fun(inta, int b)的功
23、能是实现形参整形变量 a和 b值的互换。当在主函数中调用 fun(ci, ci 1)时,把实参变量 ci和 ci 1的值赋给形参变量 a和 b,执行完函数 fun(ci, ci 1)时,形参变量 a和 b的值发生了互换,实参变量 ci和 ci 1的值并没有发生互换,所以输出的值为 1, 2, 3, 4, 5, 6, 7, 8, 9, 0。 【知识模块】 C语言程序设计 9 【正确答案】 D 【试题解析】 本题在主函数中定义了一维整型数组 t 1, 2, 3, 4, 5, 6,7, 8, 9;然后在 for循环语句中自变量 i从 0开始,每次自加 2,执行 s *(t i)语句,因为 C语言规定
24、数组名代表数组的首地址,也就是第一个元素的地址。因此 *(t i)代表数组的第 i 1个元素。所以程序运行的结果是 1 3 5 7 925,即变量 s的值等于 25。 【知识模块】 C语言程序设计 10 【正确答案】 D 【试题解析】 在定义一维数组时,数组的下标应该是一个确定的整数值。要注意的是在定义二维数组时,其第一维下标可以省略,但第二维下标不能省略。 【知识模块】 C语言程序设计 11 【正确答案】 D 【试题解析】 在 C语言中,定义一维数组的语句形式为:类型名数组名 整型常量表达式 。在选项 D中, n是一个整型的变量。 【知识模块】 C语言程序设计 12 【正确答案】 B 【试题
25、解析】 主函数中进行了两次 f函数的调用。第 一次传递给形参数组 b的地址为元素 a2的地址, n接收数据位 5,因此数组 b中元素为 3, 2, 1, 6, 7,此时 flag的值为 0,进行由大到小排序,而数组 b和实参数组 a共用一段存储空间,第一次调用结束以后,数组 a的值为 5, 4, 7, 6, 3, 2, 1, 8, 9, 10。第二次调用 f函数,形参数组接收实参数组 a的首地址,取 5个元素,由小到大排序,调用结束以后,数组 a的值为 3, 4, 5, 6, 7, 2, 1, 8, 9, 10。 【知识模块】 C语言程序设计 13 【正确答案】 A 【试题解析】 本题考查 f
26、or语句的循环控制 ,首先定义了两个数组并赋予了初始值,第一个 for循环语句循环 12次遍历 s数组的各个元素,将 s中的原素值作为c数组中的下标,使相应的值自加。例如当 i 0, cs0为 c1,其值变为 1,当执行 i 1, 2, .11后, c1、 c2、 c3、 c4分别为 4、 3、 3、 2,故选项 A为正确的运行结果。 【知识模块】 C语言程序设计 14 【正确答案】 A 【试题解析】 fun()函数的功能是对数组 a的元素从大到小进行排序。所以在主函数执行 fun(c 4, 6)语句时, 将从数组 c的第 5个元素开始的后 6个元素进行从大到小排序。排序之后,数组 c的内容变
27、为 1, 2, 3, 4, 9, 8, 7, 6, 5, 0。 【知识模块】 C语言程序设计 15 【正确答案】 C 【试题解析】 主函数中指针变量 P指向数组 c, s保存了数组最后一个元素的地址,那么 s P为两个地址之间的元素差 5。 【知识模块】 C语言程序设计 16 【正确答案】 C 【试题解析】 数组的定义格式:类型说明符数组名 整型常量表达式 .;可以同时定义多个类型相同的数组,之间以逗号分隔开,数组的类 型表明了数组中元素的数据类型,数组中所有元素的类型相同,数组经过定义以后就可使用,编译程序将对其分配一片连续的存储空间进行连续存储。 C语言中只能单个引用数组元素而不能一次引用
28、整个数组。引用格式为:数组名 下标 ,引用元素时,需要注意下标只能为整型常量或整型表达式。 【知识模块】 C语言程序设计 17 【正确答案】 C 【试题解析】 当系统为所定义的数组在内存中开辟一串连续的存储单元时,这些存储单元中并没有确定的值,可以在定义语句中为所定义数组的各个元素赋初值。数组初始化赋值是指在数组定义时给 数组元素赋予初值。初始化赋值的一般形式为:类型说明符数组名 常量表达式 值,值, .,值 ;需要注意的是当所赋初值多于所定义数组的元素个数时,在编译时将给出出错信息,在指定初值时,第一个初值必定赋给下标为 0的元素,然后按这些数值的排列顺序赋初值,只能给元素逐个赋值,不能给数
29、组整体赋值。如果给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。 【知识模块】 C语言程序设计 18 【正确答案】 B 【试题解析】 定义语句 float a10, x;以后,数组名 a表示了数组元素的首地址 ,是常量在程序中不能更改,因此选项 A是的描述是正确的。而指向运算符和取址运算符,是互反运算符优先级相同, *&a1和 *(&a1)含义相同。 【知识模块】 C语言程序设计 19 【正确答案】 B 【试题解析】 因为指针变量 P的初始值指向数组 a,所以执行 for循环语句后,数组 a中的元素的值不变。 【知识模块】 C语言程序设计 20 【正确答案】 C 【试题解析】 主函数
30、中利用 for循环访问字符串的每一个字符,判断当前字符是否为空格,如果是空格则删除。因此删除字符串 “How are you“中空格以后,字符串为 Howareyou!。 【知识模块】 C语言程序设计 21 【正确答案】 D 【试题解析】 主函数中利用 for循环访问字符串 a的每一个字符,判断当前字符是否为空格,如果是空格则保存该空格后面的一个字符存放到字符数组 b中。在字符串 “How are you!“中,第一个空格后面字符为 a,第二个空格后面字符为y。 【知识模块】 C语言程序设计 22 【正确答案】 D 【试题解析】 程序中循环部分的主要功能是,在字符串 b中寻找是否含有子串a,如
31、果含有则退出,字符指针 P指向该匹配子串后面的位置,利用 printf函数输出则从该位置开始一直输出到字符串 b的结尾。 【知识模块】 C语言程序设计 23 【正确答案】 B 【试题解析】 C语言中定义二维数组,必须指定二维数组每一维的大小。选项 A没有指定数组 a行的大小,错误;选项 B,虽然没有指定行大小,但是可以通过大括号里面的元素个数计算出行的大小为 1,因此是正确的;选项 C同样没有指定行的大小,也不能通过元素个数计算行的个数,错误;选项 D定义的是二行三列数组,但是后面数据是三行,超出范围,所 以错。 【知识模块】 C语言程序设计 24 【正确答案】 D 【试题解析】 本题考查数组
32、和指针,在本题中 c是二维数组,指针 p指向二维数组 c, P其实是指向 c数组的第一行。因此选项 【知识模块】 C语言程序设计 25 【正确答案】 B 【试题解析】 本题考查多维数组和数组指针。 k是一个二维数组, pk是一个指针数组,该数组有 3个元素,每个元素都是一个指向整型对象的指针。选项 A中 p 1指向 c数组的第二行;选项 B中, p 3表示 P指向 c数组的第三行,因此 *(p 3)表示取出 c数组第三行首 元素的地址;选项 C和选项 B类似,表示取出数组 c第二行首元素地址然后加 3;选项 D中 p0 2表示数组第一行第三列元素的地址,因此 *(p0 2)是取出该元素的值。
33、【知识模块】 C语言程序设计 26 【正确答案】 B 【试题解析】 本题考查多维数组的定义和使用。 a是一个二维数组,有 3行 6列,即每行 6个元素, a的第 10个元素位于第二行的第四个位置,即 a13。 【知识模块】 C语言程序设计 27 【正确答案】 C 【试题解析】 本题考查多维数组和数组指针。 a是一个二维数 组, p是一个指针数组,该数组有 3个元素,每个元素都是一个指向整型对象的指针。选项 A错误,等号的左边是一个数组地址,不是变量;选项 B数据类型不匹配, p0是指向一个整型对象,而 a是一个二维数组首地址;选项 C正确,是把元素 a12赋值给 p0:选项 D和选项 B一样属
34、于数据类型不匹配, p1是指向一个整型对象,而 a是一个二维数组首地址。 【知识模块】 C语言程序设计 28 【正确答案】 D 【试题解析】 本题考查数组的使用, C语言中数组的下标从 0开始。本题中 a是一个二维数组,两个下标的范 围分别是 0 1和 0 2。选项 A中第一个下标越界,超出了范围;选项 B中第一个和第二个下标都超出了范围;选项 C中第二个下标超出范围;选项 D中, 1 2的值为 0, !1的值为 0,因此选项 D实际是访问a00。 【知识模块】 C语言程序设计 29 【正确答案】 B 【试题解析】 二维数组的初始化有以下几种形式: 分行进行初始化; 不分行的初始化; 部分数组
35、元素初始化; 省略第一维的定义,不省略第二维的定义。 在选项 A中赋值号左边定义了一个 3行 2列的二维数组,而右边用 2行 3列的数字进行赋初值 。所以出现了边界的越界溢出而出错。 【知识模块】 C语言程序设计 30 【正确答案】 B 【试题解析】 fun函数的功能是求出二维数组 a中第 i行第 i个元素与第 N 1 i元素的差,赋给 bi。在主函数中,把实参二维数组 x和一维数组 y传递给形参 a和 b,最后输出一维数组 y中元素的值。 【知识模块】 C语言程序设计 31 【正确答案】 D 【试题解析】 这道题主要考查的是二维数组的有关知识。在两层 for循环语句中,每次执行变量 t的累加
36、时,二维数组元素 b的第二下标的值与第一下标相同的值,所以程序执行的过程为 t 1 b10 b22 1 1 2 4。 【知识模块】 C语言程序设计 32 【正确答案】 D 【试题解析】 在选项 D的数组定义中,赋值号左边定义了一个 2行 4列的二维数组,而在右边定义了一个 3行 2列的二维数组。 【知识模块】 C语言程序设计 33 【正确答案】 C 【试题解析】 语句 x32 0表示将二维数组 x的所有元素赋初值 0,而循环语句 for(i 0; i 3; i )scanf(“ d“, xi)表示对数组元素 x00、 x10、x20赋值。所以当运行程序时,输入 246 CR时,数组元素 x00 2、x10 4、 x20 6,因此,输出数组元素 x00 2、 x01 0、 x10 4的值 204。 【知识模块】 C语言程序设计