1、国家二级 C语言机试(选择题)模拟试卷 79及答案解析(总分:80.00,做题时间:90 分钟)一、选择题(总题数:40,分数:80.00)1.下列关于栈和队列的描述中,正确的是( )。(分数:2.00)A.栈是先进先出B.队列是先进后出C.队列允许在队头删除元素D.栈在栈顶删除元素2.已知二叉树后序遍历序列是 CDABE,中序遍历序列是 CADEB,它的前序遍历序列是( )。(分数:2.00)A.ABCDEB.ECABDC.EACDBD.CDEAB3.在数据流图中,带有箭头的线段表示的是( )。(分数:2.00)A.控制流B.数据流C.模块调用D.事件驱动4.结构化程序设计的 3种结构是(
2、)。(分数:2.00)A.顺序结构,分支结构,跳转结构B.顺序结构,选择结构,循环结构C.分支结构,选择结构,循环结构D.分支结构,跳转结构,循环结构5.下列方法中,不属于软件调试方法的是( )。(分数:2.00)A.回溯法B.强行排错法C.集成测试法D.原因排除法6.下列选项中,不属于模块间耦合的是( )。(分数:2.00)A.内容耦合B.异构耦合C.控制耦合D.数据耦合7.下列特征中不是面向对象方法的主要特征的是 ( )。(分数:2.00)A.多态性B.标识惟一性C.封装性D.耦合性8.在数据库设计中,将 E-R图转换成关系数据模型的过程属于( )。(分数:2.00)A.需求分析阶段B.概
3、念设计阶段C.逻辑设计阶段D.物理设计阶段9.在一棵二叉树上,第 5层的结点数最多是( )。(分数:2.00)A.8B.9C.15D.1610.下列有关数据库的描述,正确的是( )。(分数:2.00)A.数据库设计是指设计数据库管理系统B.数据库技术的根本目标是要解决数据共享的问题C.数据库是一个独立的系统,不需要操作系统的支持D.数据库系统中,数据的物理结构必须与逻辑结构一致11.以下关于 C语言的叙述中正确的是( )。(分数:2.00)A.预处理命令通常位于函数体外面,但也可以位于函数体中间B.C语言中的变量定义须在其他语句之前C.在 C语言程序的书写中,一个语句必须单占一行D.一个 C语
4、言源程序可以由一个或多个源文件组成,每个源文件可由自己的 main函数12.下列叙述中错误的是( )。(分数:2.00)A.用户所定义的标识符允许使用关键字B.用户所定义的标识符应尽量做到“见名知意”C.用户所定义的标识符必须以字母或下划线开头D.用户定义的标识符中,大、小写字母代表不同标识13.下列选项中可作为 C语言合法常量的是 ( )。(分数:2.00)A.-80B.-080C.-8e10D.-800e14.下列定义变量的语句中错误的是( )。(分数:2.00)A.int _int;B.double int_;C.char For;D.float US$;15.下列关于函数的叙述中正确的
5、是( )。(分数:2.00)A.每个函数都可以被其他函数调用(包括 main函数)B.每个函数都可以被单独编译C.每个函数都可以单独运行D.在一个函数内部可以定义另一个函数16.当 a=1、b=2、c=3、d=4 时,执行下面程序段后,x 的值是( )。 if(ab) if(cd)x=1; else if(ac) if(bd) x=2; else x=3; else x=6; else x=7;(分数:2.00)A.1B.6C.3D.217.以下程序的输出结果是( )。 #includestdio.h main() int a=4,b=3,c=2,d=1; printf(d,ab?a:dc?d
6、:b); (分数:2.00)A.1B.3C.2D.418.有以下程序 #includestdio.h main() int b33=0,1,2,0,1,2,0,1,2,i,j,t=0; for(i=0;i3;i+) for(j=2;j=i;j-)t+=bij; printf(dn,t); 程序运行后的输出结果是( )。(分数:2.00)A.4B.3C.8D.919.以下程序: #includestdio.h main() char str10; scanf(s,B.double int_;C.char For;D.float US$; 解析:解析:C 语言规定,变量的标识符只能由字母、数字和下
7、划线 3种字符组成,且首字符必须为字母或下划线。在 C语言中大写字母和小写字母被认为是两个不同的字符。选项 A定义的变量标识符_int 和选项 B定义的变量标识符_int 与 C语言的关键字 int是不同的,是正确的变量标识。选项 C定义的变量标识符 For与 C语言中的关键字 for是两个不同的标识符,所以选项 C是正确的,而选项 D包含有特殊字符$,因而其不符合 C语言的变量命名规定。15.下列关于函数的叙述中正确的是( )。(分数:2.00)A.每个函数都可以被其他函数调用(包括 main函数)B.每个函数都可以被单独编译 C.每个函数都可以单独运行D.在一个函数内部可以定义另一个函数解
8、析:解析:在 C语言中,函数定义是平行的,函数不能嵌套定义,即函数之间没有从属关系。虽然函数之间可以相互调用,但 main()函数不能被调用,选项 A错误;C 程序从 main()函数开始执行,当 main()函数执行完毕时,整个程序就结束了。C 程序的执行必须从 main()函数开始,选项 C选项错误;函数不能嵌套定义,选项 D错误。16.当 a=1、b=2、c=3、d=4 时,执行下面程序段后,x 的值是( )。 if(ab) if(cd)x=1; else if(ac) if(bd) x=2; else x=3; else x=6; else x=7;(分数:2.00)A.1 B.6C.
9、3D.2解析:解析:本题考查的是 if-else语句。第一个 if语句,先判断条件,发现 ab 条件成立,执行下面的语句。第二个 if语句,先判断条件,发现 cd 条件成立,执行下面的语句 x=1。17.以下程序的输出结果是( )。 #includestdio.h main() int a=4,b=3,c=2,d=1; printf(d,ab?a:dc?d:b); (分数:2.00)A.1 B.3C.2D.4解析:解析:条件表达式的格式为:a?b:c,它的功能是:当 a为真时,表达式的值等于 b的值;当a为假时,表达式的值等于 c的值。因为条件运算符的结合方向为“自右向左”。因此,当表达式中嵌
10、套使用条件表达式时,应先计算右边的条件表达式,再计算左边的条件表达式。题中应先计算“dc?d:b”的“d18.有以下程序 #includestdio.h main() int b33=0,1,2,0,1,2,0,1,2,i,j,t=0; for(i=0;i3;i+) for(j=2;j=i;j-)t+=bij; printf(dn,t); 程序运行后的输出结果是( )。(分数:2.00)A.4B.3C.8 D.9解析:解析:这道题主要考查的是二维数组的有关知识。在两层 for循环语句中,累加上三角元素,所以程序执行的过程为“t=b00+b01+b02+b11+b12+b22=8”。19.以下程
11、序: #includestdio.h main() char str10; scanf(s,&str); printf(sn,str); 运行上面的程序,输入字符串“how are you”,则程序的执行结果是( )。(分数:2.00)A.how B.how are youC.hD.howareyou解析:解析:当从键盘输入“how are you”时,由于 scanf输入函数的特点是遇到空格时结束读入字符,因此,该程序只将 how这 3个字符送到了字符数组 str中,并在其后自动加上结束符“0”。20.设变量 x和变量 y都是 int类型,且 x=l,y=2, 则 printf(dd,x,y
12、,(x,y)的输出结果是 ( )。(分数:2.00)A.1 2 B.1 2 2C.1,2D.输出值不确定解析:解析:本题考查 printf函数的格式和逗号表达式。printf 函数在输出时,是根据格式说明符的个数输出的,如果函数中有多余的项将不予输出;如果有输出项少于格式说明符,则出错,不能输出正确的结果。本题中逗号表达式(x,y)只返回 y的值。此时格式说明的个数是 2,而输出项的个数是 3,因此printf函数只输出前两项。21.以下程序的输出结果是( )。 #includestdioh main() int a=8,b=6,m=1; switch(a4) case 0:m+; break
13、; case 1:m+: switch(b3) default:m+; case 0:m+:break; printf(dn,m);(分数:2.00)A.1B.2 C.3D.4解析:解析:本题考查 switch语句。因为 a=8,a4=0,所以执行 case 0后面的语句,将 m加 1,遇到break语句跳出 switch。22.定义如下变量和数组: int i,x33=1,2,3,4,5,6,7,8,9; 则下面语句的输出结果是( )。for(i=0;i3;i+) printf(d,xi2-i);(分数:2.00)A.159B.147C.357 D.369解析:解析:本题主要考查二维数组的使
14、用。题中利用 for循环来输出 x数组中的指定元素:当 i=0时,输出 x02=3;当 i=1时,输出 x11=5;当 i=2时,输出 x20=7。23.有下列程序段: typedef struct NODE int num;struct NODE *next; OLD; 下列叙述中正确的是( )。(分数:2.00)A.以上的说明形式非法B.NODE是一个结构体类型C.OLD是一个结构体类型 D.OLD是一个结构体变量解析:解析:C 语言允许用 typedef说明一种新类型名,其一般形式为:typedef 类型名标识符。typedef语句的作用仅仅是使“标识符”来代表已存在的“类型名”,并未产
15、生新的数据类型。原有类型名依然有效。此题中,用 typedef定义了新的类型 OLD结构,所以 OLD为结构体类型。24.下列数组定义中错误的是( )。(分数:2.00)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;解析:解析:二维数组的初始化有以下几种形式:分行进行初始化;不分行的初始化;部分数组元素初始化;省略第一维的定义,不省略第二维的定义。在选项 B中赋值号左边定义了一个 2行 3列的二维数组,而右边用 3行 2列的数字进行赋初值。所以出现了边界的越界溢出错误。25.以下叙述错误
16、的是( )。(分数:2.00)A.变量的作用域取决于变量定义语句的位置B.全局变量可以在函数以外的任何部位进行定义C.局部变量的作用域可用于其他函数的调用D.一个变量说明为 static存储类型是为了限制其他编译单元的引用 解析:解析:本题考查函数调用的变量作用域。全局变量不在任何函数体内定义,作用域为整个文件;局部变量在函数体内定义,作用域仅为本次函数;static 类型是静态变量,为了方便其他编译单元的引用,不能随意改变。 一个函数包含两部分:函数首和函数体,函数体包括花括号内的所有语句。26.若定义函数“int*func()”,则函数 func的返回值为( )。(分数:2.00)A.一个
17、实数B.一个指向整型变量的指针 C.一个指向整型函数的指针D.一个整型函数的入口地址解析:解析:本题考查函数返回值。fun 函数的返回值类型为 int*类型,即函数返回一个指向整型变量的指针。27.若有定义“int a5,*p=a;”则正确引用数组元素的是( )。(分数:2.00)A.*&a5B.*a+2C.*(p+5)D.*(a+2) 解析:解析:本题考查通过指针引用数组元素。用指针引用数组有以下 3种形式:“(p+n)与(a+n)”表示数组元素 an的地址;“*(p+n)与*(a+n)“表示数组元素 an;“pn=*(p+n)”,都表示数组元素 an。 选项 A、B 没有这种引用形式;选项
18、 C,“*(p+5)”是引用数组的第 6个元素,而数组一共有 5个元素,出现越界;选项 D,“*(a+2)”引用数组的第 3个元素。28.以下对 C语言中联合类型数据的正确叙述是( )。(分数:2.00)A.定义了联合变量后,即可引用该变量或该变量中的任意成员B.一个联合变量中可以同时存放其所有成员C.联合中的各个成员使用共同的存储区域 D.在向联合中的一个成员进行赋值时,联合中其他成员的值不会改变解析:解析:联合体的几个特点:联合体所占用的内存空间为最长的成员所占用的空间;各个成员分量全部是从低地址方向开始使用内存单元;联合体中的空间在某一时刻只能保存某一个成员的数据;联合体和结构体可以任意
19、嵌套。29.有以下函数定义: int fun(double a,double b) return a*b; 若以下选项中所用变量都已正确定义并赋值,错误的函数调用是( )。(分数:2.00)A.if(fun(x,y)B.z=fun(fun(x,y),fun(x,y);C.z=fun(fun(x,y)x,y); D.fun(x,y);解析:解析:本题考查函数调用时的参数传递。选项 C中第一个参数的表达式不正确,因此不能得到正确的结果。30.执行以下语句段后,xy 的值是( )。 int *pt,xy; xy=200; pt=&xy; xy=*pt+30;(分数:2.00)A.200B.170C.
20、260D.230 解析:解析:本题考查指针的运用。通过 pt=&xy,将 pt指向 xy所占的内存地址,而*pt 是指针 pt所指向内存单元中的内容,即 200,所以最后 xy的值为 230。31.下述程序的输出结果是( )。 #includestdioh void main() int a20,*p4; int i,k=0; for(i=0;i20;i+) ai=i; for(i=0;i4;i+) pi=&ai*i+1; for(j=0;i4;i+) k=k+*pi; printf(d,k); (分数:2.00)A.10B.18 C.6D.数组元素引用不合法,输出结果不定解析:解析:第一个
21、for循环,给数组 a的 20个元素分别赋值 019;第二个 for循环,给数组 p赋值,p0=a1=1,p1=a2=2,p2=a5=5,p3=a10=10;第三个 for循环,将数组 p中元素的值进行累加,k=1+2+5+10=18。32.有以下程序: #includestdio.h #define N 8 void fun(int*x,int i) *x=*(x+i)+1; main() int aN=1,2,3,4,5,6,7,8,i; fun(a,2); for(i=0;iN2;i+) printf(d,ai); printf(n); 程序运行后的输出结果是( )。(分数:2.00)A
22、.1 3 1 3B.3 2 3 4C.4 2 3 4 D.1 2 3 4解析:解析:函数“fun(int*x,int i)”的功能是把数组元素 xi的值加 1赋给 x0。所以在主函数中执行 fun(a,2)后,数组元数 a0的值等于 4。然后在 for循环语句中,输出数组 a中的前 4个元素的值,分别是 4、2、3、4。33.下面程序的输出结果是( )。 #includestdioh main() char a=a,b,c,d,f,g,*p; p=a; printf(cn,*p+4);(分数:2.00)A.aB.bC.e D.f解析:解析:“*”号的优先级比“+”的优先级高,所以先执行“*p”
23、;指针 p指向的是数组的首地址,因此“*p=a”,再加 4得e。34.下面函数的功能是( )。 sss(s,t) char *s,*t; while(*s); while(*t) *(s+)=*(t+); return s;(分数:2.00)A.将字符串 s复制到字符串 t中B.比较两个字符串的大小C.求字符串的长度D.将字符串 t续接到字符串 s中 解析:解析:本题考查指针变量的运用。本题中的函数实质上是将字符串 t续接到字符串 s中。35.下列程序的运行结果是( )。 #includestdioh void sub(int*s,int*y) static int m=4; *y=sm; m
24、-; void main() int a=1,2,3,4,5,k,x; printf(n); for(k=0;k=4;k+) sub(a,&x); printf(d,x); (分数:2.00)A.5,4,3,2,1, B.1,2,3,4,5,C.0,0,0,0,0,D.4,4,4,4,4,解析:解析:本题考查的是静态变量以及函数的实参与形参之间的地址值传递。sub()函数中定义的变量m是一个静态变量,系统可为其分配固定的存储空间,重复使用时,变量的值保留:所以当 main()函数中的 for循环中语句“sub(a,&x)”;执行时,sub 函数中 m的值依次是 4、3、2、1、0;因为变量 x
25、进行的是地址值传递,所以最后依次输出的是数组 a的元素 a4、a3、a2、a1、a0。36.设 q1和 q2是指向一个 int型一维数组的指针变量,k 为 float型变量,下列不能正确执行的语句是( )。(分数:2.00)A.k=*q1*(*q2);B.q1=k; C.q1=q2;D.k=*q1+*q2;解析:解析:本题考查指针变量的赋值操作。选项 A是将指针 q1和 q2所指向的变量值相乘,然后赋给k;选项 B中,float 型数据和指针型数据之间不能进行赋值运算;选项 C中,是两个指针变量之间的赋值;选项 D中,是两个指针型变量所指向的两个 int型数据相加。37.下列程序的输出结果为(
26、 )。 main() union un char *name; int age; int pay; s; sname=zhaoming; sage=32; spay=3000; printf(dn,sage);(分数:2.00)A.32B.3000 C.0D.不确定解析:解析:本题考查的是联合体的有关概念。因为联合体是各个成员共享一段存储空间,此段存储空间最终存放的是最后存入的成员的值,所以题目中输出 sage 实际上输出了最后存入的 3000,因为 3000已经把原来存入的 sage(32)的值覆盖。38.以下有关宏替换的叙述不正确的是( )。(分数:2.00)A.使用宏定义可以嵌套B.宏定
27、义语句不进行语法检查C.双引号中出现的宏名不替换D.宏名必须用大写字母表示 解析:解析:本题考查宏替换的规则。宏替换有两类:简单的字符替换和带参数的宏替换。使用宏应注意:宏定义仅仅是符号替换,不是赋值语句,因此不做语法检查;为了区别程序中其他的标示符,宏名的定义通常用大写字母,但不是必须用大写;双引号中出现的宏名不替换;使用宏定义可以嵌套,即后定义的宏中可以使用先定义的宏。39.有以下程序: #includestdioh int b=3; int fun(int*k) b=*k+b;return(b); main() int a10=1,2,3,4,5,6,7,8,i; for(i=2;i4;
28、i+)b=fun(&ai)+b;printf(d,b); printf(n); 程序运行后的输出结果是( )。(分数:2.00)A.12 14B.12 32 C.10 14D.10 20解析:解析:i=2 时,fun(&a2)返回值是:b=b+a1=1=3+3=6,b=b+b=6+6=12;i=3 时,fun(a3)返回值是:b=b+a3=12+4=16,b=b+b=16+16=32。40.已知函数的调用形式 “fread(buffer,size,count,fp);其中 buffer代表的是( )。(分数:2.00)A.一个整型变量,代表要读入的数据项总数B.一个文件指针,指向要读的文件C.一个指针,是指向的输入数据放在内存中的起始位置 D.一个存储区,存放要读的数据项解析:解析:数据块输入输出函数的调用形式为:fread(buffer,size,count,fp)。 fread 函数参数说明:“buffer”是一个指针,对 fread来说,它是读入数据的存放地址;“size”是要读写的字节数;“count”是要进行读写多少个 size字节的数据项;“fp”是指文件型指针。