1、国家二级 C语言机试(选择题)模拟试卷 81及答案解析(总分:80.00,做题时间:90 分钟)一、选择题(总题数:40,分数:80.00)1.算法的空间复杂度是指( )。(分数:2.00)A.算法程序的长度B.算法程序中的指令条数C.算法程序所占的存储空间D.算法执行过程中所需要的存储空间2.下列叙述中正确的是( )。(分数:2.00)A.一个逻辑数据结构只能有一种存储结构B.逻辑结构属于线性结构,存储结构属于非线性结构C.一个逻辑数据结构可以有多种存储结构,且各种存储结构不影响数据处理的效率D.一个逻辑数据结构可以有多种存储结构,且各种存储结构影响数据处理的效率3.下列关于类、对象、属性和
2、方法的叙述中,错误的是( )。(分数:2.00)A.类是对一类具有相同的属性和方法对象的描述B.属性用于描述对象的状态C.方法用于表示对象的行为D.基于同一个类产生的两个对象不可以分别设置自己的属性值4.在软件开发中,需求分析阶段产生的主要文档是( )。(分数:2.00)A.数据字典B.详细设计说明书C.数据流图说明书D.软件需求规格说明书5.数据库设计的四个阶段是:需求分析、概念设计、逻辑设计和( )。(分数:2.00)A.编码设计B.测试阶段C.运行阶段D.物理设计6.在下列关系运算中,不改变关系表中的属性个数但能减少元组个数的是( )。(分数:2.00)A.并B.交C.投影D.除7.下列
3、叙述中,正确的是( )。(分数:2.00)A.软件交付使用后还需要进行维护B.软件一旦交付使用就不需要再进行维护C.软件交付使用后其生命周期就结束D.软件维护是指修复程序中被破坏的指令8.设一棵满二叉树共有 15个结点,则在该满二叉树中的叶子结点数为( )。(分数:2.00)A.7B.8C.9D.109.设 R是一个 2元关系,有 3个元组,S 是一个 3元关系,有 3个元组。如 T=RS,则 T的元组的个数为( )。(分数:2.00)A.6B.8C.9D.1210.下列选项中,不属于数据库管理的是( )。(分数:2.00)A.数据库的建立B.数据库的调整C.数据库的监控D.数据库的校对11.
4、对于一个正常运行的 C程序,下列叙述中正确的是( )。(分数:2.00)A.程序的执行总是从 main函数开始,在 main函数结束B.程序的执行总是从程序的第一个函数开始,在 main函数结束C.程序的执行总是从 main函数开始,在程序的最后一个函数中结束D.程序的执行总是从程序中的第一个函数开始,在程序的最后一个函数中结束12.以下选项中与 if(a=1)a+;else a=b;语句功能不同的语句是( )。(分数:2.00)A.switch(a) case 0:a=b;break; default:a+; B.switch(a=1) case 0:a+; default:a=b; C.s
5、witch(a) default:a=b;break; case l:a+; D.a=(a=1)?(a+);b13.以下不合法的用户标识符是( )。(分数:2.00)A.804zhangB._hhC.yy614D.If14.已知 char a;int b;float c;double d;则表达式 a-b+c-d结果为( )型。(分数:2.00)A.doubleB.floatC.intD.char15.假设有语句 sizeof(double),则它是( )。(分数:2.00)A.一个整型表达式B.一个双精度浮点型表达式C.一种函数调用D.一种函数定义16.若变量都已正确说明,则以下程序段输出结
6、果为( )。 #includestdioh main() char a=a; intb=2; printf(ab?*a=d:#b=d,a,b); (分数:2.00)A.*a=3B.#b=3C.*a=3#b=5D.全部错误17.若有以下定义(设 int类型变量占 2个字节) int i=8,j=9; 则以下语句: printf(i=d,j=dn,i,j); 输出的结果是( )。(分数:2.00)A.i=8,j=9B.i=d,j=8C.i=d,j=dD.8,918.设 a和 b均为 int型变量,且 a=6,b=11,则能使值为 3的表达式是( )。(分数:2.00)A.b(a4)B.b(a-a5
7、)C.ba-a5D.(ba)-(a4)19.有关 return语句说法不正确的是( )。(分数:2.00)A.系统默认的返回值类型为整型,故当函数的返回值为 int型时,在函数定义时,返回值的类型说明可以省略。B.当函数有返回值时,凡是允许表达式出现的地方,都可以调用该函数。C.当函数没有返回值时,函数的返回值类型可以说明为 void型,它表示“无类型”或“空类型”。D.函数的返回值类型必须与 return语句中的表达式值的类型一致,但 C语言也允许不同;这时,系统以函数定义时的返回值类型说明为准,并自动地将 return语句中表达式的值转换为函数的返回值类型。20.有以下程序: #inclu
8、destdio.h main() int i=0,a=0; while(i20) for(;) if(i5)=0)break; else i-; i+=13,a+=i; printf(dLrl“,a); 程序的输出结果是( )。(分数:2.00)A.62B.63C.23D.3621.在下列选项中,没有构成死循环的程序段是 ( )。(分数:2.00)A.int i=100; for(;) i=i10+1; if(i10)break; B.while(1);C.int k=0; do+k;while(k=10);D.int s=12; while(s); -s;22.若已定义的函数有返回值,则以下
9、关于该函数调用的叙述中错误的是( )。(分数:2.00)A.函数调用可以作为独立的语句存在B.函数调用可以作为一个函数的实参C.函数调用可以出现在表达式中D.函数调用可以作为一个函数的形参23.以下程序的输出结果是( )。 #includestdio.h main() int a=1,b=3; ifi(+a0)b解析:解析:ifelse 语句的含义是,如果变量 a的值等于 1,变量 a的值加 1,否则,则把变量 b的值赋给变量 a。在本题的 4个选项中,与其含义不同的是选项 B,因为没有 break语句,当 a=1的时候,会顺序执行两条语句,最终结果是将 b的值赋给 a。13.以下不合法的用户
10、标识符是( )。(分数:2.00)A.804zhang B._hhC.yy614D.If解析:解析:C 语言规定,标识符是由字母、数字或下划线组成,并且它的第一个字符必须是字母或下划线。14.已知 char a;int b;float c;double d;则表达式 a-b+c-d结果为( )型。(分数:2.00)A.double B.floatC.intD.char解析:解析:C 语言中允许进行不同数据类型的混合运算,但在实际运算时,要先将不同类型的数据转化成同一类型再进行运算。类型转换的一般规则是:运算中将所有 char型转换成 int型,float 型转换成 double型;低级类型服从
11、高级类型,并进行相应的转换,数据类型由低到高的顺序为:char-int-unsigned-long-float-double;赋值运算中最终结果的类型,以赋值运算符左边变量的类型为准,即赋值运算符右端值的类型向左边变量的类型看齐,并进行相应转换。15.假设有语句 sizeof(double),则它是( )。(分数:2.00)A.一个整型表达式 B.一个双精度浮点型表达式C.一种函数调用D.一种函数定义解析:解析:sizeof(double)是 C语言内部规定的一个计算参数(double)在计算机的内存中所占用的字节数量的函数,它返回一个整数值。16.若变量都已正确说明,则以下程序段输出结果为(
12、 )。 #includestdioh main() char a=a; intb=2; printf(ab?*a=d:#b=d,a,b); (分数:2.00)A.*a=3B.#b=3C.*a=3#b=5D.全部错误 解析:解析:本题考查 printf函数的格式和三目运算符“?:”的使用。printf 函数中格式说明符之前插入的任何字符都原样输出。本题中“ab”为真,所以返回“*a=97”。17.若有以下定义(设 int类型变量占 2个字节) int i=8,j=9; 则以下语句: printf(i=d,j=dn,i,j); 输出的结果是( )。(分数:2.00)A.i=8,j=9B.i=d,j
13、=8 C.i=d,j=dD.8,9解析:解析:本题考查 printf函数的格式。printf 函数中格式说明符之前插入的任何字符都按原样输出。对于 printf函数,有两个说明,第一个后面的内容要按原样输出。18.设 a和 b均为 int型变量,且 a=6,b=11,则能使值为 3的表达式是( )。(分数:2.00)A.b(a4)B.b(a-a5)C.ba-a5D.(ba)-(a4) 解析:解析:表达式“ab”表示的是求 a除以 b的余数。因此,选项 A:(64)=2,112=1;选项B:(6-65)=5,115=1;选项 C:11665=4;选项 D:(116)-(64)=3。19.有关 r
14、eturn语句说法不正确的是( )。(分数:2.00)A.系统默认的返回值类型为整型,故当函数的返回值为 int型时,在函数定义时,返回值的类型说明可以省略。B.当函数有返回值时,凡是允许表达式出现的地方,都可以调用该函数。C.当函数没有返回值时,函数的返回值类型可以说明为 void型,它表示“无类型”或“空类型”。D.函数的返回值类型必须与 return语句中的表达式值的类型一致,但 C语言也允许不同;这时,系统以函数定义时的返回值类型说明为准,并自动地将 return语句中表达式的值转换为函数的返回值类型。 解析:解析:函数的返回值类型一般与 return语句中的表达式值的类型一致,但 C
15、语言也允许不同;这时,系统以函数定义时的返回值类型说明为准,并自动地将 return语句中表达式的值转换为函数的返回值类型。20.有以下程序: #includestdio.h main() int i=0,a=0; while(i20) for(;) if(i5)=0)break; else i-; i+=13,a+=i; printf(dLrl“,a); 程序的输出结果是( )。(分数:2.00)A.62B.63C.23D.36 解析:解析:本题考查 while循环。当 i20 时,进入 while循环体,循环体内的 for循环实现的功能是,当 i值是 0或 5的倍数时,执行“i+=13;a
16、+i;”这两条语句;若 i值不是 5的倍数则一直执行 for循环。当 i=0时,执行“i+=13;a+=i;i=13,a=13”;判断“i=1320”,进入 while循环体,i=10 时,跳出 for循环,执行“i+=13;a+=i;i=23,a=36”;判断“i=2320”,循环结束。21.在下列选项中,没有构成死循环的程序段是 ( )。(分数:2.00)A.int i=100; for(;) i=i10+1; if(i10)break; B.while(1);C.int k=0; do+k;while(k=10); D.int s=12; while(s); -s;解析:解析:本题考查死
17、循环的知识。选项 A中,for 循环没有任何控制语句就会一直执行下去,所以不可能通过控制表达式的值结束循环。循环体内,“i=i10+1”这个表达式的值永远不会大于 10,所以永远不会跳出循环,是死循环;选项 B中,while 中表达式永远是非 0,不会结束循环;选项 C中,当k10 时,结束循环;选项 D中,“while(s);”后面没有任何表达式而是直接加了一个分号,会一直执行,形成死循环。22.若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是( )。(分数:2.00)A.函数调用可以作为独立的语句存在B.函数调用可以作为一个函数的实参C.函数调用可以出现在表达式中D.函数调用可
18、以作为一个函数的形参 解析:解析:本题考查函数调用的有关知识点。函数调用可以出现在表达式中;可以作为独立的语句存在;可以作为一个函数的实参。23.以下程序的输出结果是( )。 #includestdio.h main() int a=1,b=3; ifi(+a0)&!(b-=0) printf(d,dn,a,b); else printf(d,dn,b,a); (分数:2.00)A.2,2B.1,3C.3,2 D.3,1解析:解析:解答本题的关键在于 if语句条件中的表达式。初始时“a=1,b=3”,所以“+a=20”,因此“+a0”为假;因为是进行逻辑与(&)运算,在的一个运算对象为假的前提
19、下不用判断第二个运算对象的真假,就可以直接得出整个表达式的值为逻辑 0,所以执行 else语句。24.有以下程序: #includestdioh main() int x; scanf(dt,&x); if(x=0);else if(x!=5)printf(dn,x); 程序运行时,输入的值在哪个范围才会有输出结果( )。(分数:2.00)A.不等于 5的整数B.大于 0且不等 5的整数 C.大于 0或等于 5的整数D.小于 5的整数解析:解析:题目中,虽然 else和第二个 if不在同一行上,但等价于在同一行上,因此,程序的意思是当 x大于 0且不等于 5时将其打印出来。25.若执行下述程序
20、时,若从键盘输入 6和 8,结果为( )。 main() int a,b,s; scanf(dd,&a,&b); s=a: if(s-b)s*=s; printf(d,s); (分数:2.00)A.36B.64 C.48D.以上都不对解析:解析:首先通过 scanf函数把从键盘读入的数据赋给变量 a和 b,if 语句判断如果 a和 b不等,执行 s=s*s=64。26.若运行时给变量 x输入 12,则以下程序的运行结果是( )。 main() int x,y; scanf(d,&x); y=x127x+10:x-12; printff(dn,y); (分数:2.00)A.0 B.22C.12D
21、.10解析:解析:本题考查三目条件运算符“?:”。表达式“x127x+10:x-12”即,如果 x12 成立,则x+10的值即为此表达式的值,否则 x12 即为此表达式的值。因为 x=12,所以 x12 不成立,所以执行“y=x-12=0”。27.运行下面程序时,从键盘输入字母 A,则输出结果是( )。 #includestdioh main() char ch; ch=getchar(); switch(ch) caseA:printf(AAAAn); caseB:printf(BBBBkn);default:printf(CCCCn); (分数:2.00)A.AAAAB.AAAA BBBB
22、C.AAAA BBBB CCCC D.AAAA CCCC解析:解析:本题考查“switch”语句。因为“ch=A”,所以第一个 switch语句,执行“caseA”后面的语句,输出 AAAA,没有遇到 break语句,所以接着再执行“case B”和 default,分别输出 BBBB和CCCC。28.以下叙述正确的是( )。(分数:2.00)A.只能在循环体内和 switch语句体内使用 break语句 B.contiune语句的作用是结束整个循环的执行C.在循环体内使用 break语句或 continue语句的作用相同D.从多层循环嵌套中退出时,只能使用 goto语句解析:解析:本题考查循
23、环的 4个知识点:break 语句可以出现在循环体内及 switch语句体内,不能用于其他的语句;continue 语句的作用是结束本次循环,即跳过循环体中下面尚未执行的语句,而接着转去判定循环条件是否成立,从而确定下一次循环是否继续执行,也就是说执行 contiune语句不会使整个循环终止;在循环体内使用 break语句会使循环提前终止;从多层循环嵌套中退出时,可以使用goto语句或者 break语句。29.下列叙述中错误的是( )。(分数:2.00)A.在 C语言中,对二进制文件的访问速度比文本文件快B.在 C语言中,随机文件以二进制代码形式存储数据C.语句 FILE fp;定义了一个名为
24、 fp的文件指针 D.C语言中的文本文件以 ASCII码形式存储数据解析:解析:在 C语言中,文件指针实际上是指向一个结构体类型的指针,一般称这个结构体类型名为FILE,可以用此类型名来定义文件指针。定义文件类型指针变量的一般形式为:FILE *指针变量名;选项C中少了“*”,所以选项 C错误。30.若输入abcdef、abdef,以下程序的输出结果为( )。 #includestdioh #includestringh main() int n; char s1201,s220,*p1,*p2; scanf(s,s1); scanf(s,s2); p1=s1; p2=s2; n=strcmp
25、(p1,p2); printf(dn,n);(分数:2.00)A.- B.0C.abcdefD.abdef解析:解析:本题考查两个知识点:字符串比较函数 strcmp(s1,s2),若 s1s2,则返回 1;若s1=s2,则返回 0;若 s1s2,则返回-1。字符串依次比较的是它们相同位置上字符的 ASCII码值。31.以下语句定义正确的是( )。(分数:2.00)A.int a14=1,2,3,4,5;B.float a3=1,2,3;C.long a23=l,l,2,1,2,3,0,0;D.double a3=0; 解析:解析:本题考查的是如何对二维数组进行赋值。选项 A中数组第二维的大小
26、是 4,但却给赋了 5个元素;选项 B中 C语言规定,对于二维数组,只可以省略第一个方括号中的常量表达式而不可以省略第二个方括号中的常量表达式;选项 C中数组第一维的大小是 2,但是赋值却超过了 2;选项 D中在对二维数组元素赋初值时,可以只对部分元素赋初值,未赋初值的元素自动取 0。32.下述程序的输出结果是( )。 #includestdioh void main() int a5=1,2,3,4,5; int*p=a,*q=&p; printf(d,*(p+); printf(“,*q); (分数:2.00)A.22B.11C.34D.12 解析:解析:程序首先定义了一个指向一维数组 a
27、的指针 p,一个指向指针变量 p的指针变量 q,输出*(p+)是先输出*p 即 a0的值,再将指针 p指向数组的下一个元素 a1,输出*q 是输出指针 p所指向单元的内容,即 a1的值。33.字符串ABCDEF的长度是( )。(分数:2.00)A.11B.10 C.5D.3解析:解析:本题涉及字符串的两个最基本的概念。字符串的长度是指字符串中字符的个数,但不包含字符串结束符;以反斜线“”开头的特殊字符序列,意思是把反斜线后面的字符序列转换成特定的含义,而不是原来的含义,不包含在字符串长度之内,“”连同后面的字符为一个长度。34.若二维数组 a有 m列,则在 aij前的元素个数为( )。(分数:
28、2.00)A.j*m+iB.i*m+j C.j*m+i+1D.i*m+j+1解析:解析:二维数组的元素可以看成是按矩阵形式存放的,总是先存放第一行的元素,再存放第二行的元素。数组第一维的下标是 i,说明它前面还有 i行,有 i*m个元素,数组第二维的下标是 i,说明它前面还有 j列,有 j个元素,所以共有 i*m+j个元素。35.下列程序的运行结果是( )。 #includestdioh void fun(int*s,int*p) static int t=3; *p=st; t-; void main() int a=2,3,4,5,k,x; for(k=0;k4;k+) fun(a,&x)
29、;printf(d,x); (分数:2.00)A.5,4,3,2, B.2,3,4,5,C.2,2,2,2,D.5,5,5,5,解析:解析:分析 fun函数程序段,可知 fun函数要实现的功能是将 s中第(t+1)个元素以前的元素逆置赋给数组 p。由于 fun函数定义了静态变量 t=-3,因此,在主函数中调用函数 fun(a,&x)时,就是要将数组 a中前 4个元素逆置赋给数组 x,最后输出 x数组。36.以下有关宏替换的叙述不正确的是( )。(分数:2.00)A.双引号中出现的宏名不替换B.使用宏定义可以嵌套C.宏定义仅仅是符号替换D.宏名必须用大写字母表示 解析:解析:本题考查宏替换的规则
30、。宏替换分为简单的字符替换和带参数的宏替换两类。使用宏时应注意以下几点:宏定义仅仅是符号替换,不是赋值语句,因此不做语法检查;为了区别程序中其他的标识符,宏名的定义通常用大写字母,但不是必须用大写;双引号中出现的宏名不替换;使用宏定义可以嵌套,即后定义的宏中可以使用先定义的宏。37.设有定义:char*c;,以下选项中能够使字符型指针 c正确指向一个字符串的是( )。(分数:2.00)A.char str=string;c=str; B.scanf(s,c);C.c=getchar();D.char str=string;strcpy(c,str)解析:解析:在题目的题干中定义了字符指针变量
31、c,在选项 A中,首先定义字符数组 str,然后再把字符数组 str的首地址赋给字符指针变量 c。所以选项 A是正确的。在选项 B中,指针 c没有正确初始化,指向的地址是为止的,因此不能在 scanf函数中使用;在选项 C中,getchar 函数的返回值是用户输入的第一个字符的 ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕,如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续 getchar调用读取,即 c只能指向一个字符而不能指向字符串;在选项 D中,strcpy 函数用于字符串拷贝,函数有两个参数,因此 strcpyt:c,str“)书写错误,所以选项
32、 D是错误的。38.有以下程序: #includestdio.h #includestringh struct A int a;char b10;double c; void f(struct A*t); main() struct A a=1001,“ZhangDa,10980; f(&a);printf(d,s,61fn,a,a,a,b,ac); void f(struct A*t) t-a=1002;strcpy(t-b,ChangRong); t-c=12020; 程序运行后的输出结果是( )。(分数:2.00)A.1001,zhangDa,10980B.1002,ChangRong,
33、12020 C.1001,ChangRong,10980D.1002,zhangDa,12020解析:解析:本题主要考查是的函数调用时参数之间的传递问题。在 C语言中参数之间的传递是传值,也就是把实参的值复制一份传递给形参,而实参的值不发生变化。但对于指针调用来说,函数直接对实参的地址操作,因此在这种情况下实参变化。39.下述程序的输出结果是( )。 #includestdio.h void main() char a=1,b=2; char c=ab2: printf(nd,c); (分数:2.00)A.9 B.10C.12D.2解析:解析:本题主要考查 C语言最基本的算术运算“左移()”和
34、“异或()”。 “左移”或“右移”运算表达式的一般形式为:xn 或 xn。“左移()”运算的规则是将 x的二进制位全部向左移动 n位,将左边移动的高位舍弃,右边空出的位补 0; “右移()”运算的规则是将 x的二进制位全部向右移动 n位,将右边移出的低位舍弃,左边高位空出要根据原来符号位的情况进行补充,对无符号数则补 0,对有符号数,若正数则补 0,若为负数则补 1。 “异或”运算是当两个运算量的相应位相同时结果为 0,不相同时结果为 1。b=2 的二进制为(00000010)b2 后为 00001000,a=1 的二进制为00000001,所以 c=ab2 为 00001001,转化为十进制
35、后为 9。40.已知一个文件中存放若干工人档案记录,其数据结构如下: struct a char number100; int age; float p6; ; 定义一个数组:struct a b10; 假定文件已正确打开,不能正确地从文件中读入 10名工人数据到数组 b中的是( )。(分数:2.00)A.fread(b,sizeof(struct a),10,fp);B.for(i=0;i10;i+) fread(bi,sizeof(struct a),1,fp); C.for(i=0;i10;i+) fread(b+i,sizeof(struct a),1,fp);D.for(i=0;i5;i+=2) fread(b+i,sezeof(struct a),2,fp);解析:解析:数据块输入输出函数的调用格式为:ffead(buffer,size,count,fp),其中:“buffer”是一个指针,对于 fread来说,它是读入数据的存放地址。“size”是要读写的字节数;“count”是要进行读写多少个 size字节的数据项;“fp”是指文件型指针。选项 B中 bi是一个数组,不是指针,需改为bi。