1、国家二级 C 语言程序设计机试(选择题)模拟试卷 4 及答案解析(总分:80.00,做题时间:90 分钟)一、选择题(总题数:40,分数:80.00)1.下列叙述中正确的是( )。(分数:2.00)A.程序执行的效率与数据的存储结构密切相关B.程序执行的效率只取决于程序的控制结构C.程序执行的效率只取决于所处理的数据量D.以上说法均错误2.软件按功能可以分为应用软件、系统软件和支撑软件(或工具软件)。下列各项中属于应用软件的是( )。(分数:2.00)A.学生成绩管理系统B.C 语言编译程序C.UNIX 操作系统D.数据库管理系统3.通常软件测试实施的步骤是( )。(分数:2.00)A.集成测
2、试、单元测试、确认测试B.单元测试、集成测试、确认测试C.确认测试、集成测试、单元测试D.单元测试、确认测试、集成测试4.下列叙述中错误的是( )。(分数:2.00)A.系统总体结构图支持软件系统的详细设计B.软件设计是将软件需求转换为软件表示的过程C.数据结构与数据库设计是软件设计的任务之一D.PAD 图是软件详细设计的表示工具5.对长度为 n 的线性表作快速排序,在最坏情况下,比较次数为( )。(分数:2.00)A.nB.n 一 1C.n(n1)D.n(n 一 1)26.某二叉树共有 7 个结点,其中叶子结点只有 1 个,则该二叉树的深度为(假设根结点在第 1 层)( )。(分数:2.00
3、)A.3B.4C.6D.77.下列关于栈的叙述中,正确的是( )。(分数:2.00)A.栈顶元素最先能被删除B.栈顶元素最后才能被删除C.栈底元素永远不能被删除D.栈底元素最先能被删除8.在数据库中,数据模型包括数据结构、数据操作和( )。(分数:2.00)A.数据约束B.数据类型C.关系运算D.查询9.一名教师可讲授多门课程,一门课程可由多名教师讲授。则实体教师和课程间的联系是( )。(分数:2.00)A.1:1 联系B.1:m 联系C.m:1 联系D.m:n 联系10.支持子程序调用的数据结构是( )。(分数:2.00)A.栈B.树C.队列D.二叉树11.以下正确的说法是( )。(分数:2
4、.00)A.用户若需要调用标准库函数,调用前必须重新定义B.用户可以重新定义标准库函数,但若重新定义,该函数将失去原有意义C.用户系统根本不允许用户重新定义库函数D.用户若需要调用库函数,调用前不必使用预编译命令将该函数所在文件包括到用户源文件中,系统会自动寻找该文件12.下列叙述中错误的是( )。(分数:2.00)A.C 程序可以由一个或多个函数组成B.C 程序可以由多个程序文件组成C.一个 C 语言程序只能实现一种算法D.一个 C 函数可以单独作为一个 C 程序文件存在13.设有定义:int a;float b;执行 scanf(”2df,C.X41;D.OX4116.有以下程序: #in
5、clude main() int a=3: a+=a 一=a*a: prinff(“dn”,a); 程序的输出结果是( )。(分数:2.00)A.0B.9C.3D.一 1217.设有定义:char s81;int i=0;以下不能将一行(不超过 80 个字符)带有空格的字符串正确读入的语句或语句组是( )。(分数:2.00)A.gets(s);B.while(si+=getchar()!=n);si=0;C.scanf(“s”,s);D.doscanf(“c”,si); while(si+!=n);si=0;18.有以下程序: #include main() char c1,c2,c3,c4,
6、c5,c6; scanf(“cccc”,C.X41;D.OX41解析:解析:xhh表示 1 到 2 位十六进制所代表的字符,故答案为 A。16.有以下程序: #include main() int a=3: a+=a 一=a*a: prinff(“dn”,a); 程序的输出结果是( )。(分数:2.00)A.0B.9C.3D.一 12 解析:解析:等号“=”运算符是从右到左,且与“+、一、*”运算符比,优先级较低。首先计算 a*a,结果为 9,执行 a=a 一 9 后 a 的值为一 6,然后执行 a+=a,即 a=a+a=一 6+(一 6),所以值为一 12。17.设有定义:char s81;
7、int i=0;以下不能将一行(不超过 80 个字符)带有空格的字符串正确读入的语句或语句组是( )。(分数:2.00)A.gets(s);B.while(si+=getchar()!=n);si=0;C.scanf(“s”,s); D.doscanf(“c”,si); while(si+!=n);si=0;解析:解析:函数 scanf()输入字符串时默认空格为间隔符,所以不能输入空格,答案选 C。18.有以下程序: #include main() char c1,c2,c3,c4,c5,c6; scanf(“cccc”,&c1,&c2&c3,&c4); c5=getchar(); c6=ge
8、tchar(); putchar(e1); putchar(c2); prinff(“cen”,c5,c6); 程序运行后,若从键盘输入(从第 1 列开始): 123 45678 则输出结果是( )。(分数:2.00)A.1256B.1245 C.1278D.1267解析:解析:对于字符型数据的输入而言,从键盘上输入的字符,不管是否可以输出,都会被读入字符型变量中。因此,c1=1,c2=2,c3=3,c4=回车,c5=4,c6=5,输出 c1,c2,c5,c6 的结果为 1245,答案选 B。19.有以下程序: #include main( ) im a,b; for(a=0;a,则输出结果是
9、( )。(分数:2.00)A.2 3 3 4 5 6 B.2 3 4C.2 2 3 4 4 4D.2 3 4 3 4 4解析:解析:这是一个循环结构嵌套选择结构,按照外层循环,内层选择一步一步处理即可。本题重点注意,switch 语句中并没有出现 break 语句,所以内层循环是不会跳出的。20.对于 if(表达式)语句,以下叙述中正确的是( )。(分数:2.00)A.“表达式”的值可以是任意合法的数值 B.变量不能出现在“表达式”中C.常量不能出现在“表达式”中D.如果“表达式”的值不是逻辑值,程序会出编译错误解析:解析:B、C、D 选项描述比较片面。21.若有以下程序: #include
10、main() int c; c=13 115; printf(“dn”,c); 则程序的输出结果是( )。(分数:2.00)A.13B.15 C.18D.5解析:解析:本题考查位运算中按位或运算符,或运算只要两个比较的位中有一个为 1,其结果是 1,否则结果为 0。13 用二进制表示为 00001101,15 用二进制表示为 00001111,或运算后结果为 00001111,即15,故 B 选项正确。22.有以下程序: #include main() int a=1,b=0; if(一一 a)b+; else if(a=0)b+=2; else b+=3; printf(“dn”,b); 程
11、序运行后的输出结果是( )。(分数:2.00)A.0B.1C.2 D.3解析:解析:“+”和“一一”运算,当以前缀形式出现时,则先进行加 1 或减 1 操作,再进行其他运算;当以后缀形式出现时,则先进行其他运算,再进行加 1 或减 1 操作。a 初始定义为 1,b 为 0,执行一一a,a 的值变为 0,即 if 判断为假,执行 b+=2,输出 b 的值为 2。23.有以下程序: #include main( ) int i,array6=1,5,0,4; for(i=0;iA.0 4 0 4 0B.1 5 0 4 0 C.1 5 5 4 0D.1 2 1 2 0解析:解析:本题主要考查一维数组
12、的输出。由于数组中有 6 个元素,但初始化数组的时候只给出 4 个元素,所以 array5=0,array6=0,前面几位元素依次输出,不够位数补 0,所以选项 B 正确。24.以下叙述中正确的是( )。(分数:2.00)A.数组说明符的一对方括号中只能使用整型常量,而不能使用表达式B.一条语句只能定义一个数组C.每个数组包含一组具有同一类型的变量,这些变量在内存中占有连续的存储单元 D.在引用数组元素时,下标表达式可以使用浮点数解析:解析:同类元素的集合称为数组,数组元素在内存中占据连续的存储空间,C 选项正确。方括号中可以为整型变量或者常量表达式,A 选项错误。在使用逗号运算符的情况下,一
13、条语句可以定义多个数组,B 选项错误。数组元素在数组中的下标为整型常量或者变量构成的整型表达式,不能为浮点数,D 选项错误。答案选 C。25.若有定义语句:int m3=1,2,3,4,5,6,7;,则与该语句等价的是( )。(分数:2.00)A.int m3=1,2,3,4,5,6,7;B.int m 3=1,2,3,4,5,6,7;C.int m3=1,2,3,4,5,6,7; D.int m 3=1,2,3,4,5,6,7;解析:解析:考查二维数组的初始化。初始化二维数组的时候,若给数组的全部元素均赋初值,此时第一维的元素个数可以不指定,部分赋值时,最后一行元素不写完整,此时数组第一维元
14、素个数仍然可以不指定。题中为按行给数组 m 赋值,最后一行只有部分赋初值,答案选 C。26.以下叙述中正确的是( )。(分数:2.00)A.char,c1,c2,*c3,c440;是合法的变量定义语句 B.数组下标的下限由数组中第一个非零元素的位置决定C.数组下标的下限由数组中第一个被赋值元素的位置决定D.数组下标的下限是 1解析:解析:A 选项正确,char c1,c2,*c3,c440表示定义了两个字符变量 c1、c2,一个字符指针c3,一个字符数组 c4。数组的下限永远为 0,选项 B、C、D 错,答案选 A。27.有以下程序: #include main() int a=3: d0 p
15、rintf(“d,”,a 一=2); while(!(一一 a);printf(“n”); 程序运行后的输出结果是( )。(分数:2.00)A.1,一 3,B.1,一 2, C.3,0,D.1,0,解析:解析:本题重点考查 dowhile 语句,该循环语句的特点是,先执行循环中的语句,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。因此,dowhile 循环至少要执行一次循环语句。变量 a 赋初值为 3,每循环一次需执行语句 a 一=2 一次,同时循环条件使变量 a 自减 1,所以第一次循环后变量 a 变为 1,第 2 次循环后变量 a 变为一 2。故 B 选项正确。28.
16、若有定义: char s30=0; 运行时输入: This is a string 则以下不能正确读入整个字符串This is a string到字符数组 s 中的语句组是( )。(分数:2.00)A.scanf(“s”,s); B.gets(s);C.for(i=0;(c=getchar()!=n;+)si=c;D.i=0;while(C=getchar()!=n)ji+=c;解析:解析:考查基本的字符串输入控制语句。29.有以下程序: #include main() int X; for(X=3;XA.*3#*5 B.#3*4#5C.*3*4#5D.*3#4#5解析:解析:条件运算符组成条
17、件表达式的一般形式为:表达式 1?表达式 2:表达式 3。其求值规则为:表达式 1 值为真,则以表达式 2 的值作为条件表达式的值,否则以表达式 3 的值作为整个条件表达式的值。本题中语句 printf(x2)?(“*dt):(“#dI,x);含义为变量 x 对 2 求余,如果结果为真,则按照“*d”出,否则按照“#d”出。故 A 选项正确。30.有以下程序: #include 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;iA.1 2 3 4 5 6 7 8 9
18、0 B.2 1 4 3 6 5 8 7 0 9C.0 9 8 7 6 5 4 3 2 1D.0 1 2 3 4 5 6 7 8 9解析:解析:函数 fun()属于值传参,形参的变化不会影响实参,所以函数调用结束后,数组 c 没有任何变化,输出结果为选项 A。31.有以下程序: #include int fun(int n) int a; if(n=1)return 1; a=n+fun(n 一 1); return(a); main() printf(“dn”,fun(5); 程序的输出结果是( )。(分数:2.00)A.10B.14C.15 D.9解析:解析:考查递归函数。函数 fun()的
19、功能是计算 1 到 n 之间的数字之和,所以计算结果为 15,答案选 C。32.以下选项中,没有编译错误的是( )。(分数:2.00)A.char str3=d,e,b,u,g,0; B.char strl5=“pass”,str26;str2=strl:C.char name10;name=“china”;D.char str4;str4=“hello world”;解析:解析:B 选项中,不能直接将字符数组名直接赋值给另一个字符数组名。C 选项赋值错误,不能将一个字符串常量赋值给一个字符指针。D 选项定义 str4 时需要定义其长度。故 A 选项正确。33.有以下程序: #include
20、int add(int a,int b) return(a+b); main() int k,(*f)(),a=5,b=10; f=add; 则以下函数调用语句中错误的是( )。(分数:2.00)A.k=*f(a,b); B.k=add(a,b);C.k=(*f)(a,b);D.k=f(a,b);解析:解析:int(*f)()为一个函数指针变量,返回值为整型,f 为一个指针变量,指向一个已经定义的函数,在调用该函数的时候需要把参数写在相应的小括号内,即(*指针名)(参数或参数列表),所以选项A 调用错误,答案选 A。34.以下关于 C 语言函数参数传递方式的叙述中正确的是( )。(分数:2.0
21、0)A.数据只能从实参单向传递给形参 B.数据可以在实参和形参之间双向传递C.数据只能从形参单向传递给实参D.C 语言的函数参数既可以从实参单向传递给形参,也可以在实参和形参之间双向传递,可视情况选择使用解析:解析:数据只能由实参单向传递给形参称为“值传递”,而不能由形参传回来给实参,A 选项正确;数组名、指针等作参数,实参传递给形参地是地址值,这样形参和实参就指向同一段内存单元,在函数体内对形参数据的改变也将影响到实参。实参和形参之间不可双向传递,BD 选项错误。数据不能从形参传递给实参,C 选项错误。35.设已有定义:float x;则以下对指针变量 P 进行定义且赋初值的语句中正确的是(
22、 )。(分数:2.00)A.float*p=&;x; B.int*P=(float)x;C.float p=&;x;D.float*P=1024:解析:解析:考查指针变量的初始化。只能把对应类型的变量的地址赋值给指针,选项 B 错误;定义指针时要加上“*”标明该变量为一个指针变量,选项 C 错误;不能把一个整数直接赋值给指针变量,选项 D错误;所以答案选 A。36.以下叙述中正确的是( )。(分数:2.00)A.在 C 语言中,预处理命令行都以#开头 B.预处理命令行必须位于 C 源程序的起始位置C.#include 必须放在 C 程序的开头D.C 语言的预处理不能实现宏定义和条件编译的功能解
23、析:解析:c 语言中,凡是以“#”开头的都被称为编译预处理行,选项 A 正确;预处理行可以放在 C源程序的任何位置,习惯放在起始位置,选项 B 错误;语句“#include”必须放在使用文件 stdioh 中相关方法的语句之前,但是不一定非要放在 C 程序开头,选项 C 错误;预处理包括宏定义、文件包含和条件编译等,选项 D 错误。答案选 A。37.有以下程序: #include int funl(int a,int b) return a+b; int flun2(int a,int b) retum ab; int fun(int(*t)(int,int),int x,int y) ret
24、urn(*t)(x,y); main() int x; x=fun(funl,9,3); x+=fun(fun2,8,3); printf(“dn”,x); 程序运行后的输出结果是( )。(分数:2.00)A.24B.23C.17 D.22解析:解析:本题主要考查函数作为形参时的使用,由 x=fun(funl,9,3);可得到 x=9+3=12,而后直接传入函数 flin2,x=x+83=12+5=17。故 C 选项正确。38.有以下程序: #include void sp(int*a) int b=2; a=b: *a=*a*2: prinff(“d,”,*a); main() int k=
25、3,*p=&k; sp(p); pfinff(“d,dn”,k,*p); 则程序的输出结果是( )。(分数:2.00)A.4,3,3 B.4,3,4C.6,3,6D.6,6,6解析:解析:首先在主函数中给整型变量 k 赋值为 3,将变量 k 的地址赋给指针变量 p,调用 sp 函数,将实参 p 的值传给形参 a,在 sp 函数中,指针变量 a 又获得变量 b 的地址,通过运算后,输出 a 的值为 4,返回主函数,输出 k 的值和 p 的值为 3 和 3。故 A 选项正确。39.有以下程序: #include void my() char ch: ch=getchar(); if(ch!=c)m
26、y(); putchaur(ch); main() my(); 执行时,输入 abc,则输出结果是( )。(分数:2.00)A.abcB.ababcC.bcaD.cba 解析:解析:my()递归,直到输入了 c 开始返回。递归使用的是栈的思想,因此最后输入进去的最先返回并输出。所以结果是 cba。40.有以下程序: #include mmn() unsigned chaur a=8,c; c=a3: pnnff(“dn”,c); 程序运行后的输出结果是( )。(分数:2.00)A.32B.16C.1 D.0解析:解析:字符常量与其 ASC码值一一对应,在计算的时候,可以使用该字符的 ASC码参与运算,输出时会根据格式控制符输出对应的字符或者 ASC码。右移运算符“”的运算规则是把左边运算数的各二进制位全部右移 n 位,n 取决于“”右边的数值。字符 a 的 ASC码值为 8,对应二进制为 1000,所以 a3=1,输出的字符 c 的 ASC码值为 1,答案选 C。