1、二级 C 语言-219 及答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:40,分数:100.00)1.在结构化方法中,用数据流程图(DFD)作为描述工具的软件开发阶段是_。(分数:2.50)A.逻辑设计B.需求分析C.详细设计D.物理设计2.对序线性表(23,29,34,55,60,70,78)用二分法查找值为 60 的元素时,需要比较次数为_。(分数:2.50)A.1B.2C.3D.43.下列描述中,正确的是_。(分数:2.50)A.线性链表是线性表的链式存储结构B.栈与队列是非线性结构C.双向链表是非线性结构D.只有根结点的二叉树是线性结构4.开发大型软件时,产生
2、困难的根本原因是_。(分数:2.50)A.大型系统的复杂性B.人员知识不足C.客观世界千变万化D.时间紧、任务重5.两个或两个以上的模块之间关联的紧密程度称为_。(分数:2.50)A.耦合度B.内聚度C.复杂度D.连接度6.下列关于线性表的叙述中,不正确的是_。(分数:2.50)A.线性表可以是空表B.线性表是一种线性结构C.线性表的所有结点有且仅有一个前件和后件D.线性表是由 n 个元素组成的一个有限序列7.设有如下关系表: (分数:2.50)A.T=R/SB.T=RSC.T=RSD.T=RS8.以下描述中,不是线性表顺序存储结构特征的是_。(分数:2.50)A.可随机访问B.需要连续的存储
3、空间C.不便于插入和删除D.逻辑相邻的数据物理位置上不相邻9.在三级模式之间引入两层映像,其主要功能之一是_。(分数:2.50)A.使数据与程序具有较高的独立性B.使系统具有较高的通道能力C.保持数据与程序的一致性D.提高存储空间的利用率10.下列方法中,属于白盒法设计测试用例的方法的是_。(分数:2.50)A.错误推测B.因果图C.基本路径测试D.边界值分析11.在 C 语言中,以下说法不正确的是_。(分数:2.50)A.在 C 程序中,整数和实数都能被准确无误地表示出来B.在 C 程序中,任何一个变量名都代表存储器中的一个位置C.静态变量的生存期与整个程序的运行期相同D.C 语言中,任何变
4、量都必须先声明才能进行引用12.以下关于 C 语言数据类型的叙述中正确的是_。(分数:2.50)A.C 基本数据类型包括:分为整型、实型、浮点型、字符型四种B.实型常量的表达方式包括十进制形式、十六进制形式、二进制形式、八进制形式、指数形式C.若要处理如“人员信息”等含有不同类型的相关数据,应自定义结构体类型D.若只处理“真”和“假”两种逻辑值,应使用逻辑类型13.以下标识符不是关键字的是_。(分数:2.50)A.breakB.charC.SwitchD.return14.下列选项中,不能作为合法常量的是_。(分数:2.50)A.1.234e04B.1.234e0.4C.1.234e+4D.1
5、.234e015.有以下程序: #include stdio.h main() while(getchar()!=“/n“); 以下叙述中正确的是_。(分数:2.50)A.此 while 语句将无限循环B.getchar()不可以出现在 while 语句的条件表达式中C.当执行此 while 语句时,只有按回车键程序才能继续执行D.当执行此 while 语句时,按任意键程序就能继续执行16.下列叙述中正确的是_。(分数:2.50)A.调用 printf()函数时,必须要有输出项B.使用 putchar()函数时,必须在之前包含头文件 stdio.hC.在 C 语言中,整数可以以二进制、八进制或
6、十六进制的形式输出D.调节 getchar()函数读入字符时,可以从键盘上输入字符所对应的 ASCII 码17.执行以下程序段后,w 的值为_。 int w=“A“,x=14,y=15; w=(x|y)(分数:2.50)A.-1B.NULLC.1D.018.设有定义:“long x=123450L;”,则以下能够正确输出变量 x 的是_。(分数:2.50)A.printf(“x=%d/n“,x);B.printf(“x=%id/n“,x);C.printf(“x=%dL/n“,x);D.printf(“x=%ld/n“,x);19.已有定义 int a=3;和输出语句 printf(“%8x“
7、,a);以下正确的叙述是_。(分数:2.50)A.整型变量的输出格式符只有%d 一种B.%x 是格式符的一种,它可以适用于任何一种类型的数据C.%x 是格式符的一种,其变量的值按十六进制数输出,但%8x 是错误的D.%8x 是正确的格式符,其中数字 8 规定了输出字段的宽度20.若有定义 int x,y;并已正确给变量赋值,则下列选项中与表达式(x-y)?(x+):(y+)中的条件表达式(x-y)等价的是_。(分数:2.50)A.(x-y0)B.(x-y0)C.(x-y0|x-y0)D.(x-y=0)21.若 a、b、c、d 都是 int 型变量且都已经正确赋初值,则以下不正确的赋值语句是_。
8、(分数:2.50)A.a+d;B.a+;C.a=b=c=d=100;D.a=(b=3)+(d=5);22.有以下程序 #define F(X,Y)(X)*(Y) main() int a=3,b=4; printf(“%d/n“,F(a+,b+); 程序运行后的输出结果是_。(分数:2.50)A.12B.15C.16D.2023.以下是 while 语句的基本形式: while(表达式) 语句; 其中“表达式”_。(分数:2.50)A.必须是逻辑表达式B.必须是关系表达式C.必须是逻辑表达式或关系表达式D.可以是任意合法的表达式24.有以下程序: #includestdio.h main()
9、int a=6,b=7,m=1; switch(a%2) case 0:m+;break; case 1:m+; switch(b%2) defaut:m+; case0:m+;break; printf(“%d/n“,m); 程序运行后的输出结果是_。(分数:2.50)A.1B.2C.3D.425.有以下程序 #include stdio.h int fun(int a,int b) if(b=0) return a; else return(fun(-a,-b); main() printf(“%d/n“,fun(4,2); 程序的运行结果是_。(分数:2.50)A.1B.2C.3D.42
10、6.关于字符常量,以下叙述正确的是_。(分数:2.50)A.空格不是一个字符常量B.字符常量能包含大于一个的字符C.单引号中的大写字母和小写字母代表的是相同的字符常量D.所有的字符常量都可以作为整型量来处理27.下面函数调用语句含有实参的个数为_。 func(exp1,exp2),(exp3,exp4,exp5);(分数:2.50)A.1B.2C.3D.528.有以下程序 #include stdio.h void main() int n=2,k=1; while(!(k0|n+); printf(“%d %d/n“,k,n); 程序运行后的输出结果是_。(分数:2.50)A.0 2B.1
11、3C.5 7D.1 229.以下不正确的定义语句是_。(分数:2.50)A.double x5=1.0,2.0,3.0,4.0,5.0;B.int y5=0,1,2,3,4,5;C.char c1=“1“,“2“,“3“,“4“,“5“;D.char c2=“a“,“b“,“c“;30.若有以下定义,则对数组元素的正确引用是_。 int a5,*p=a;(分数:2.50)A.*B.char c20= “goodmoming“;C.char c=“a“,“b“,“c“,“d“;D.char c=“goodmorning“;32.下列程序的运行结果为_。 #includestdio.h void
12、abc(char*str) int a,b,i,j; for(i=j=0;stri!=“/0“;i+) if(stri!=“a“) strj+=stri; strj=“/0“; void main() char str=,abcdef“; abc(str); printf(“str=%s“,str); (分数:2.50)A.str=bcdefB.str=abcdefC.str=aD.str=ab33.阅读下面程序,程序执行后的结果为_。 #include “stdio.h“ main() char *str=“abcdefghijklmnopq“; while(*str+!=“e“); pri
13、ntf(“%c/n“,*str); (分数:2.50)AfBaCeDq34.设有如下的程序段: char str=“HelloWorld“; char*ptr; ptr=str; 执行上面的程序段后,*(ptr+10)的值为_。(分数:2.50)A.“/0“B.“0“C.不确定的值D.“0“的地址35.下述语句中,在字符串 s1 和 s2 相等时显示“they are Equal”的是_。(分数:2.50)A.if(*s1=*s2)puts(“they are Equal“);B.if(!strcmp(s1,s2)puts(“they are Equal“);C.if(s1=s2)Puts(“
14、they are Equal“);D.if(strcmp(s1,s2)puts(“they are Equal“);36.设有定义: struct complex int real,unreal; data1=1,8,data2; 则以下赋值语句中错误的是_。(分数:2.50)A.data2=data1,real,data1,unreal;B.data2=(2,6);C.data2.real=data1.real;D.data2-real=data1.unreal;37.以下程序的输出结果是_。 #include stdio.h void prt (int *x,int *y,int *z)
15、printf(“%d,%d,%d/n“,+*x,+*y,*(z+); main() int a=10,b=40,c=20; prt ( prt ((分数:2.50)A.11,42,3112,22,41B.11;41,2012,42,20C.11,21,4011,21,21D.11,41,2112,42,2238.设有以下说明,则不正确的叙述是_。 union un int a; char b; float c; arr;(分数:2.50)A.arr 所占的内存长度等于成员 c 的长度B.arr 的地址和它的各成员的地址都是同一地址C.arr 可以作为函数参数D.不能在定义 arr 时对它初始化
16、39.若 x=4,y=5,则 x 以下叙述中正确的是_。(分数:2.50)A.此 while 语句将无限循环B.getchar()不可以出现在 while 语句的条件表达式中C.当执行此 while 语句时,只有按回车键程序才能继续执行 D.当执行此 while 语句时,按任意键程序就能继续执行解析:解析 根据程序顺序执行的次序,当程序执行到 while 这条语句,根据 while 语句中的结束循环的条件是“输入回车键时,结束循环”,所以当按回车键后,程序才执行 while 语句的下一条语句。16.下列叙述中正确的是_。(分数:2.50)A.调用 printf()函数时,必须要有输出项B.使用
17、 putchar()函数时,必须在之前包含头文件 stdio.h C.在 C 语言中,整数可以以二进制、八进制或十六进制的形式输出D.调节 getchar()函数读入字符时,可以从键盘上输入字符所对应的 ASCII 码解析:解析 选项 A,若 printf 函数没有输出项,且格式字符串中不含格式信息,则输出的是格式字符串本身,若格式字符串含有格式信息,运行时则出现错误提示;选项 C,在 C 语言中,整数可以十进制、八进制或十六进制的形式输出;选项 D,getchar 函数是从标准输入设备读取一个字符。17.执行以下程序段后,w 的值为_。 int w=“A“,x=14,y=15; w=(x|y
18、)(分数:2.50)A.-1B.NULLC.1 D.0解析:解析 字符变量 w 的初值为字符“A“,其 ASCII 码值为 65,字符“a“的 ASCII 码值为 97,所以关系表达式“w“a“”的值为 1;变量 x=14,变量 y=15,“x|y”为或,x、y 均为真,所以 x|y 的结果 1。因而逻辑表达式“(x|y)”,则以下能够正确输出变量 x 的是_。(分数:2.50)A.printf(“x=%d/n“,x);B.printf(“x=%id/n“,x);C.printf(“x=%dL/n“,x);D.printf(“x=%ld/n“,x); 解析:解析 C 语言规定,输出 long
19、型数值的格式符为%ld。19.已有定义 int a=3;和输出语句 printf(“%8x“,a);以下正确的叙述是_。(分数:2.50)A.整型变量的输出格式符只有%d 一种B.%x 是格式符的一种,它可以适用于任何一种类型的数据C.%x 是格式符的一种,其变量的值按十六进制数输出,但%8x 是错误的D.%8x 是正确的格式符,其中数字 8 规定了输出字段的宽度 解析:解析 本题考查 printf 函数的格式。“%8x”表示以十六进制无符号形式输出整型数据。“8”表示指定输出数据的宽度为 8 位。20.若有定义 int x,y;并已正确给变量赋值,则下列选项中与表达式(x-y)?(x+):(
20、y+)中的条件表达式(x-y)等价的是_。(分数:2.50)A.(x-y0)B.(x-y0)C.(x-y0|x-y0) D.(x-y=0)解析:解析 条件表达式的形式如下:“表达式 1?表达式 2:表达式 3”。其含义为当“表达式 1”的值为非零时,求出“表达式 2”的值,此时“表达式 2”的值就是整个条件表达式的值;当“表达式 1”的值为零时,则求“表达式 3”的值,这时“表达式 3”的值就是整个表达式的值。本题条件表达式的执行顺序是先求解表达式“x-y”的值,若其值为非 0(可以是正数,也可以是负数),则再求表达式“x+”的值,其值就是条件表达式的值;若表达式“x-y”的值为 0,则再求表
21、达式“y+”的值,其值就是条件表达式的值。因此,本题的答案为选项 C。21.若 a、b、c、d 都是 int 型变量且都已经正确赋初值,则以下不正确的赋值语句是_。(分数:2.50)A.a+d; B.a+;C.a=b=c=d=100;D.a=(b=3)+(d=5);解析:解析 C 语言规定,赋值号的右边可以是一个赋值表达式,因此选项 C、选项 D 正确;在选项 B 中,a+是一个自加 1 的表达式,a 被重新赋值,因此它是一个合法的赋值表达式;选项 A 中,a+d 是一个算术表达式,虽然最后有一个分号,但这个表达式中没有赋值操作,因此它不是一条赋值语句。22.有以下程序 #define F(X
22、,Y)(X)*(Y) main() int a=3,b=4; printf(“%d/n“,F(a+,b+); 程序运行后的输出结果是_。(分数:2.50)A.12 B.15C.16D.20解析:解析 此题考查的是编译预处理命令以及自加运算符。F(a+,b+)先取 a 和 b 的值,参加运算,再把 a 和 b 的值分别加 1,所以 F(a+,b+)=F(3,4)=3*4=12。23.以下是 while 语句的基本形式: while(表达式) 语句; 其中“表达式”_。(分数:2.50)A.必须是逻辑表达式B.必须是关系表达式C.必须是逻辑表达式或关系表达式D.可以是任意合法的表达式 解析:解析
23、本题考查 while 表达式。while(表达式)中的表达式可以为任何合法的表达式,一般情况下为逻辑、条件表达式,需要注意的是,当等号(=)误写为赋值号(=)时不会报错的,但是其值恒为 1。24.有以下程序: #includestdio.h main() int a=6,b=7,m=1; switch(a%2) case 0:m+;break; case 1:m+; switch(b%2) defaut:m+; case0:m+;break; printf(“%d/n“,m); 程序运行后的输出结果是_。(分数:2.50)A.1B.2 C.3D.4解析:解析 本题考查 switch 语句。因为
24、 a=6,所以 a%2=0,因此第一个 switch 语句,执行 case 0,将 m 加 1,遇到 break 语句跳出 switch 语句,输出 m 值为 2。25.有以下程序 #include stdio.h int fun(int a,int b) if(b=0) return a; else return(fun(-a,-b); main() printf(“%d/n“,fun(4,2); 程序的运行结果是_。(分数:2.50)A.1B.2 C.3D.4解析:解析 由程序可知,函数 fun(int a,int b)是一个递归函数。所以当主函数中调用 fun(4,2)时,其执行过程如下
25、“fun(4,2)-fun(3,1)-fun(2,0)”,其返回值为 2。所以正确答案为选项 B。26.关于字符常量,以下叙述正确的是_。(分数:2.50)A.空格不是一个字符常量B.字符常量能包含大于一个的字符C.单引号中的大写字母和小写字母代表的是相同的字符常量D.所有的字符常量都可以作为整型量来处理 解析:解析 本题考查字符常量的 4 个知识点:空格是一个字符常量,而且单引号中的空格不可以省略;字符常量只能包含一个字符;单引号中的大写字母和小写字母代表的是不相同的字符常量;所有的字符常量都作为整型量来处理,在计算机内部,其对应的整数值就是 ASCII 码值。27.下面函数调用语句含有实参
26、的个数为_。 func(exp1,exp2),(exp3,exp4,exp5);(分数:2.50)A.1B.2 C.3D.5解析:解析 本题考查函数调用时的实参形式。这里有一个逗号运算的考查,(a,b)的运算结果为 b,因而只有一个值,结合 func 的调用形式,可以知道实参的个数只有 2 个。28.有以下程序 #include stdio.h void main() int n=2,k=1; while(!(k0|n+); printf(“%d %d/n“,k,n); 程序运行后的输出结果是_。(分数:2.50)A.0 2B.1 3C.5 7D.1 2 解析:解析 在程序中整型变量 n 的初
27、始值等于 2,整型变量 k 的初始值等于 1,在执行 while 语句时,由于表达式 k 的值大于 0 为真,所以不再需要判断“n+”是否为真,“(k0|n+)”表达式的值为真。“!(k0|n+)”表达式的值为假,所以 while 语句中的条件不满足,循环语句不会执行,变量 n 的值也不会加 1,所在输出变量 k 和 n 的值是 1 和 2。29.以下不正确的定义语句是_。(分数:2.50)A.double x5=1.0,2.0,3.0,4.0,5.0;B.int y5=0,1,2,3,4,5; C.char c1=“1“,“2“,“3“,“4“,“5“;D.char c2=“a“,“b“,“
28、c“;解析:解析 本题考查对一维数组的赋值。选项 B 中,y5说明数组中有 5 个元素,但却给它赋了 6 个值,数组溢出所以是错误的。30.若有以下定义,则对数组元素的正确引用是_。 int a5,*p=a;(分数:2.50)A.* B.char c20= “goodmoming“;C.char c=“a“,“b“,“c“,“d“;D.char c=“goodmorning“;解析:解析 本题考查两个概念。用单引号括起来的一个字符常量只能存放一个字符;C 语言中没有字符串变量,只能用字符数组来存储字符串。选项 A 中一个单引号内存放了若干个字符,是错误的;选项 B 和选项 D 中将一个字符串赋
29、值给一个字符数组是允许的。32.下列程序的运行结果为_。 #includestdio.h void abc(char*str) int a,b,i,j; for(i=j=0;stri!=“/0“;i+) if(stri!=“a“) strj+=stri; strj=“/0“; void main() char str=,abcdef“; abc(str); printf(“str=%s“,str); (分数:2.50)A.str=bcdef B.str=abcdefC.str=aD.str=ab解析:解析 本题考查函数调用的参数传递。通过函数 abc 的执行,将字符串中的字母 a 去掉,保留剩
30、下的,由于是通过指针调用,所以改变字符串的结果。33.阅读下面程序,程序执行后的结果为_。 #include “stdio.h“ main() char *str=“abcdefghijklmnopq“; while(*str+!=“e“); printf(“%c/n“,*str); (分数:2.50)Af BaCeDq解析:解析 本题考查的是取内容运算符“*”和自加运算符“+”的优先级问题。由于“+”的优先级高于“*”,所以题干中“*str+!=“e“”,即“*(str+)!=“e“”,当 str 指向字符“e“”时,while 循环的条件不成立,但“str”已经进行了自加指向了字符“f“”
31、,所以“*str”输出字符“f“”。34.设有如下的程序段: char str=“HelloWorld“; char*ptr; ptr=str; 执行上面的程序段后,*(ptr+10)的值为_。(分数:2.50)A.“/0“ B.“0“C.不确定的值D.“0“的地址解析:解析 本题涉及字符数组和指针两个知识点:在 C 语言中,字符数组在存放字符串时会自动在末尾加上“/0“”,所以题中数组 str 有 11 个元素:ptr 指向数组 str 的首地址,“ptr+10”是指向“str10”,“*(ptr+10)”是引用 str10的值(即结束符“/0“”)。35.下述语句中,在字符串 s1 和 s
32、2 相等时显示“they are Equal”的是_。(分数:2.50)A.if(*s1=*s2)puts(“they are Equal“);B.if(!strcmp(s1,s2)puts(“they are Equal“); C.if(s1=s2)Puts(“they are Equal“);D.if(strcmp(s1,s2)puts(“they are Equal“);解析:解析 字符串比较不能用两个等号(=)来进行比较,应使用“strcmp(s1,s2)”函数来比较。“strcmp(s1,s2)“函数的功能是:当字符串 s1 和 s2 相等时,返回值为 0,因此,当表达式”!strc
33、mp(s1,s2)=1“时,条件成立,执行后面的语句,输出”they are Equal“。36.设有定义: struct complex int real,unreal; data1=1,8,data2; 则以下赋值语句中错误的是_。(分数:2.50)A.data2=data1,real,data1,unreal;B.data2=(2,6);C.data2.real=data1.real; D.data2-real=data1.unreal;解析:解析 本题主要考查结构体变量的定义与初始化。题目中定义了 complex 类型的结构体变量data1 和 data2,并对 data1 进行了初始
34、化。可以用一个结构体变量的成员对另一个结构体变量的成员赋值。37.以下程序的输出结果是_。 #include stdio.h void prt (int *x,int *y,int *z) printf(“%d,%d,%d/n“,+*x,+*y,*(z+); main() int a=10,b=40,c=20; prt ( prt ((分数:2.50)A.11,42,3112,22,41B.11;41,2012,42,20 C.11,21,4011,21,21D.11,41,2112,42,22解析:解析 本题考查的是函数参数的传递及自加运算符。主函数中第一次调用函数“prt(”,此函数中的输
35、出语句“printf(“%d,%d,%d/n“,+*x,+*y,*(z+);”使得 a 和 b 的值均加 1,而“*(z+)”由于先执行“z+”所以 c 的值不变;第二次调用函数“prt(”使得 a 和 b 在上一次的基础上再各自加 1(因为形参和实参进行的是地址传递),而 c 的值仍不变。38.设有以下说明,则不正确的叙述是_。 union un int a; char b; float c; arr;(分数:2.50)A.arr 所占的内存长度等于成员 c 的长度B.arr 的地址和它的各成员的地址都是同一地址C.arr 可以作为函数参数 D.不能在定义 arr 时对它初始化解析:解析 本
36、题主要考查联合体的内存使用:联合体所占用的内存空间为最长的成员所占用的空间,int 占 2 个字节,char 占 1 个字节,float 占 4 个字节,所以 arr 所占的内存长度等于成员 c 的长度;arr 的地址和它的各成员的地址都是同一地址;不能直接对 arr 赋值,即不能在定义 arr 时对它初始化;arr 也不可以作为函数参数。39.若 x=4,y=5,则 x&y 的结果是_。(分数:2.50)A.0B.4 C.3D.5解析:解析 本题主要考查按位与运算的知识点。按位与是对两个运算量相应的位进行逻辑与,“&”的规则和逻辑与“&”相同。x=4 的二进制为 00000100,y=5 的二进制为 00000101,x&y=00000100,转化为十进制即为 4。40.下列关于 C 语言数据文件的叙述中正确的是_。(分数:2.50)A.文件由 ASCII 码字符序列组成,C 语言只能读写文本文件B.文件由二进制数据序列组成,C 语言只能读写二进制文件C.文件由记录序列组成,可按数据的存放形式分为二进制文件和文本文件D.文件由数据流形式组成,可按数据的存放形式分为二进制文件和文本文件 解析:解析 本题考查的是数据文件的有关概念。文件由数据流的形式组成,可以按数据存放的形式分为二进制文件和文本文件,C 语言既能读写文本文件,又能读写二进制文件。