二级C语言 2套 选择题的副本.docx
《二级C语言 2套 选择题的副本.docx》由会员分享,可在线阅读,更多相关《二级C语言 2套 选择题的副本.docx(25页珍藏版)》请在冰豆网上搜索。
二级C语言2套选择题的副本
(1)算法空间复杂度的度量方法是
A)算法程序的长度
B)算法所处理的数据量
C)执行算法所需要的工作单元
D)执行算法所需要的存储空间
答案:
D
【解析】算法的空间复杂度是指执行这个算法所需要的内存空间,。
算法执行期间所需的存储空间包括3个部分:
输入数据所占的存储空间;程序本身所占的存储空间;算法执行过程中所需要的额外空间。
D选项正确。
(2)下列叙述中正确的是
A)循环队列属于队列的链式存储结构
B)双向链表是二叉树的链式存储结构
C)非线性结构只能采用链式存储结构
D)有的非线性结构也可以采用顺序存储结构
答案:
D
【解析】循环队列是队列的一种顺序存储结构,A选项错误。
双向链表为顺序存储结构,二叉树通常采用链式存储结构,B选项错误。
完全二叉树是属于非线性结构,但其最佳存储方式是顺序存储方式,C选项错误,D选项正确。
(3)下列叙述中正确的是( )。
A)顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的
B)顺序存储结构只针对线性结构,链式存储结构只针对非线性结构
C)顺序存储结构能存储有序表,链式存储结构不能存储有序表
D)链式存储结构比顺序存储结构节省存储空间
答案:
A
【解析】链式存储结构既可以针对线性结构也可以针对非线性结构,所以B)与C)错误。
链式存储结构中每个结点都由数据域与指针域两部分组成,增加了存储空间,所以D)错误。
(4)下列关于栈的叙述中,正确的是
A)栈底元素一定是最后入栈的元素
B)栈顶元素一定是最先入栈的元素
C)栈操作遵循先进后出的原则
D)以上说法均错误
答案:
C
【解析】栈顶元素总是后被插入的元素,从而也是最先被删除的元素;栈底元素总是最先被插入的元素,从而也是最后才能被删除的元素。
栈的修改是按后进先出的原则进行的。
因此,栈称为先进后出表,或"后进先出"表,所以选择C。
(5)在软件设计中不使用的工具是( )。
A)系统结构图
B)PAD图
C)数据流图(DFD图)
D)程序流程图
答案:
C
【解析】系统结构图是对软件系统结构的总体设计的图形显示。
在需求分析阶段,已经从系统开发的角度出发,把系统按功能逐次分割成层次结构,是在概要设计阶段用到的。
PAD图是在详细设计阶段用到的。
程序流程图是对程序流程的图形表示,在详细设计过程中用到。
数据流图是结构化分析方法中使用的工具,它以图形的方式描绘数据在系统中流动和处理的过程,由于它只反映系统必须完成的逻辑功能,所以它是一种功能模型,是在可行性研究阶段用到的而非软件设计时用到,所以选择C)。
(6)下面对类-对象主要特征描述正确的是()。
A)对象唯一性
B)对象无关性
C)类的单一性
D)类的依赖性
答案:
A
【解析】对象的基本特点是:
标识唯一性、分类性、多态性、封装性、模块独立性好。
类是具有共同属性、共同方法的对象的集合,是关于对象的抽象描述,反映属于该对象类型的所有对象的性质。
对象具有的性质,类也具有。
故A选项正确。
(7)在软件开发中,需求分析阶段产生的主要文档是( )。
A)可行性分析报告
B)软件需求规格说明书
C)概要设计说明书
D)集成测试计划
答案:
B
【解析】A)错误,可行性分析阶段产生可行性分析报告。
C)错误,概要设计说明书是总体设计阶段产生的文档。
D)错误,集成测试计划是在概要设计阶段编写的文档。
B)正确,需求规格说明书是后续工作如设计、编码等需要的重要参考文档。
(8)下面对软件测试描述错误的是()。
A)严格执行测试计划,排除测试的随意性
B)随机地选取测试数据
C)测试根本目的是尽可能多地发现并排除软件中隐藏的错误
D)软件测试是保证软件质量的重要手段
答案:
B
【解析】在测试之前制定测试计划,并严格执行,测试用例的选择不可随意,应选择有代表性的,尽可能发现迄今为止尚未发现的错误,A选项叙述正确,B选项叙述错误。
测试根本目的是尽可能多地发现并排除软件中隐藏的错误,C选项叙述正确。
软件测试是保证软件质量、可靠性的关键步骤,D选项叙述正确。
故正确答案为B选项。
(9)在数据库系统中,用于对客观世界中复杂事物的结构及它们之间的联系进行描述的是
A)概念数据模型
B)逻辑数据模型
C)物理数据模型
D)关系数据模型
答案:
A
【解析】数据模型按照不同的应用层次分为以下3种类型:
概念数据模型,着重于对客观世界复杂事物的描述及对它们内在联系的刻画;逻辑数据模型,是面向数据库系统的模型,着重于在数据库系统一级的实现;物理数据模型,是面向计算机物理实现的模型,此模型给出了数据模型在计算机上物理结构的表示。
A选项正确。
(10)公司中有多个部门和多名职员,每个职员只能属于一个部门,一个部门可以有多名职员。
则实体部门和职员间的联系是
A)1:
1联系
B)m:
1联系
C)1:
m联系
D)m:
n联系
答案:
C
【解析】两个实体集间的联系实际上是实体集间的函数关系,主要有一对一联系(1:
1)、一对多联系(1:
m)、多对一联系(m:
1)、多对多联系(m:
n)。
对于每一个实体部门,都有多名职员,则其对应的联系为一对多联系(1:
m),答案选C。
(11)关于程序中的注释,以下叙述正确的是()。
A)注释的内容必须放在一对/*和*/之间
B)注释必须置于所说明的语句前或语句后
C)注释中间可以嵌套另一个注释
D)注释内容错误会导致编译出错
答案:
A
【解析】程序中,注释可以出现在程序的任何位置,B选项错误;注释中间不能嵌套另一个注释,C选项错误;注释内容不影响程序编译,D选项错误,答案为A选项。
(12)有以下程序
#include
main()
{intk=-17;
printf("%d,%o,%x\n",k,1-k,1-k);
}
程序的运行结果是()。
A)-17,22,12
B)-17,12,22
C)-17,-22,-12
D)17,22,12
答案:
A
【解析】整型常量有3种表示方法,分别是十进制数表示法、八进制数表示法和十六进制数表示法。
十进制整常量没有前缀,输出格式控制符为%d;八进制整常量以0作为前缀,输出格式控制符为%o;十六进制整常量以0X或0x作为前缀,输出格式控制符为%x。
1-k=18,整型常量18用八进制表示为22,十六进制表示为12,A选项正确。
(13)以下定义语句中正确的是()。
A)inta=b=0;
B)charA=65+1,b='b';
C)floata=1,*b=&a,*c=&b;
D)doublea=0.0;b=1.1;
答案:
B
【解析】A选项语句中b变量还没有定义不能直接用于给a变量赋值。C选项语句中*b、*c表示的是一个实型变量的地址,不能再将&b赋值给指针型变量c。D选项语句中a=0.0后面应该为逗号,不能是分号。
(14)有以下程序:
#include
main()
{ ints,t,A=10;doubleB=6;
s=sizeof(A);t=sizeof(B);
printf("%d,%d\n",s,t);
}
在VC6.0平台上编译运行,程序运行后的输出结果是( )。
A)10,6
B)4,4
C)2,4
D)4,8
答案:
D
【解析】C语言中利用sizeof()函数判断数据类型长度,在VC6.0平台中,整型int占有4个字节,double型数据占有8个字节。
(15)表达式:
(int)((double)9/2)-9%2的值是()。
A)0
B)3
C)4
D)5
答案:
B
【解析】先将整型数据9强制转换成double型,然后除以2得到的结果与double型保持一致,即为4.5,然后将4.5强制转换成整型数据4,然后计算9%2的值为1,最后计算4-1的值为3,所以选择B选项。
(16)设有定义:
intx=11,y=12,z=0;,以下表达式值不等于12的是()。
A)(z,x,y)
B)(z=x,y)
C)z=(x,y)
D)z=(x==y)
答案:
D
【解析】逗号表达式的计算过程是从左到右逐个求每个表达式的值,取最右边一个表达式的值作为该逗号表达式的值。
赋值运算结合性为由右向左结合,赋值运算符左值为变量,右值为变量或常量,且左右两边数据类型相同才能实现赋值。
成功实现赋值后以左值为返回值。
逻辑表达式成立则返回1,不成立返回0。
A选项逻辑表达式x==y不成立,则z=0,表达式值为0。
B选项中逗号表达式x,y取y值为表达式值,然后赋值给z=12,表达式值为12。
C选项逗号表达式(x,y)取y值为表达式值,然后赋值给z=12,表达式值为12。
D选项逗号表达式(z,x,y)取y值为表达式值12。
选择D选项。
(17)若有定义:
inta=0,b=0,c=0,d=0;,有C语言表达式(a++&&b++)?
c++:
d++,以下关于其执行顺序的叙述正确是()。
A)先执行a++,表达式a++的值为0,由此即可确定(a++&&b++)的值为0,因此执行d++
B)先执行a++,表达式a++的值为0;再执行b++,表达式b++的值为0,由此可确定(a++&&b++)值为0,因此执行d++
C)先执行a++,表确定(a++&&b++)值为1,因此执行c++达式a++的值为1;再执行b++,表达式b++的值为1,由此可
D)先执行b++,表达式b++的值为1;再执行a++,表达式a++的值为1,由此可确定(a++&&b++)值为1,因此执行c++
答案:
A
【解析】表达式1?
表达式2:
表达式3,若表达式1为真,则执行表达式2,否则执行表达式3。
逻辑与运算符遵循"短路求值"策略,即只有在仅靠左操作数的值无法确定该逻辑表达式的结果时,才会求解右操作数,表达式(a++&&b++)中,左操作数a++的值为0,已经可以确定整个逻辑表达式的结果为0,因此右操作数b++不再求解,直接执行表达式3,即d++,答案为A选项
(18)有以下程序:
#include
main()
{unsignedchara=2,b=4,c=5,d;
d=a|b;d&=c;printf("%d\n",d);}
程序运行后的输出结果是( )。
A)3
B)4
C)5
D)6
答案:
B
【解析】&按位与,如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。
|按位或,两个相应的二进制位中只要有一个为1,该位的结果值为1。
2的二进制为00000010,4的二进制为00000100,所以做或运算结果为00000110,该数与5即00000101做与操作结果为00000100,即4
(19)有以下程序
#include
main()
{charc;
c=getchar();
do{
putchar(c++);
}while((c=getchar())!
='#');
}
程序运行时从第一列开始输入:
abcdefg##<回车>,则输出结果是()。
A)bcdefgh$
B)bcdefgh
C)abcdefg#
D)abcdefg
答案:
D
【解析】运算符"++"放在变量后面时,先参与其他操作,再对变量+1。
putchar(c++)表示先输出当前c值,再对c值+1,当输入abcdef##时,在while语句中,程序输入"#",循环退出。
因此输出为abcdefg,答案为D选项。
(20)若有定义:
charc;intd;,程序运行时输入:
1,2<回车>,能把值1输入给变量c、值2输入给变量d的输入语句是
A)scanf("%c,%d",&c,&d);
B)scanf("%c%d",&c,&d);
C)scanf("%d,%f",&c,&d);
D)scanf("%d%d",&c,&d);
答案:
A
【解析】scanf函数的调用格式为:
scanf(格式控制串,地址列表);,格式控制串,由%开头,后跟格式字符,如c对应字符型变量,d对应整型变量。
地址表列需要读入的是所有变量的地址或字符串的首地址。
如果除了格式说明字符和附加格式字符外,如果还有其他字符,则在输入数据时要求按一一对应的位置原样输入这些字符,比如两个格式说明之间有一个逗号,则从键盘输入时输入量之间也应照原样输入逗号。
A选项正确。
(21)有以下程序
#include
main()
{inta=1,b=2,c=3,d=0;
if(a==1&&b++==2)
if(b!
=2||c--!
=3)
printf("%d,%d,%d\n",a,b,c);
elseprintf("%d,%d,%d\n",a,b,c);
elseprintf("%d,%d,%d\n",a,b,c);
}
程序运行后的输出结果是()。
A)1,3,2
B)1,3,3
C)1,2,3
D)3,2,1
答案:
B
【解析】else总是和最近的if配对,所以进入第一个if语句中条件判断时,因为是逻辑与操作需要两边运算对象的值均为非零值,才为真,所以需要逐个执行判断的结果为1,不再执行第二个case语句中的操作。而是进入第二个if语句条件判断,因为b!
=2条件成立所以整个条件表达式的值为真,所以不再执行逻辑或的第二个运算对象(c--!
=3)c的值不变,也不再执行第一个else语句。打印a的值1,b的值3,c的值3。
(22)有以下程序
#include
main()
{ints;
scanf("%d",&s);
while(s>0)
{switch(s)
{case1:
printf("%d",s+5);
case2:
printf("%d",s+4);break;
case3:
printf("%d",s+3);
default:
printf("%d",s+1);break;
}
scanf("%d",&s);
}
}
运行时,若输入123450<回车>,则输出结果是()。
A)66656
B)6566456
C)66666
D)6666656
答案:
B
【解析】switch语句的执行流程是:
首先计算switch后面圆括号中表达式的值,然后用此值依次与各个case的常量表达式比较,若圆括号中表达式的值与某个case后面的常量表达式的值相等,就执行此case后面的语句,执行后遇break语句就退出switch语句;若圆括号中表达式的值与所有case后面的常量表达式都不等,则执行default后面的语句。然后退出。所以输入1时打印65,输入2时打印6,输入3时打印64,输入4时打印5,输入5时打印6。
(23)设有以下代码
do{
while(条件表达式1)
循环体A;
}while(条件表达式2);
while(条件表达式1)
{
do{
循环体B;
}while(条件表达式2);
}
其中,循环体A与循环体B相同,以下叙述正确的是()。
A)循环体A与循环体B的执行次数相同
B)循环体A比循环体B的执行次数多一次
C)循环体A比循环体B的执行次数少一次
D)循环体A与循环体B的执行次数不确定
答案:
A
【解析】while循环语句一般形式为:
while(表达式){循环体},执行过程为:
首先判断表达式,成立(非0)则执行循环体,不成立(0)则退出循环。
do…while循环语句一般形式为:
do{循环体}while(表达式),执行过程为:
首先执行循环体,之后判断表达式,成立(非0)则再一次执行循环体,不成立(0)则退出循环。
假设表达式1与表达式2成立次数为n1与n2。
若n1>n2,则循环体A执行次数为n2+1,B执行次数n2+1;若n1(24)有以下程序
#include
main()
{inta=0,b=0;
for(;a<5;a++)
{if(a%2==0)continue;
b+=a;
break;
}
printf("%d\n",b);
}
程序运行后的输出结果是()。
A)1
B)4
C)0
D)10
答案:
A
【解析】for语句中,当a=0时,满足for循环中if语句的条件,执行continue继续下一次循环,a+1后再进入for语句循环,此时a=1不满足if语句,执行b=b+a为1,接着执行break语句,终止循环,最后输出b=1,故答案为A选项。
(25)有以下程序
#include
main()
{inti=5;
do
{if(i%3==1)
if(i%5==2)
{printf("*%d",i);break;}
i++;
}while(i!
=0);
printf("\n");
}
程序的运行结果是
A)*2*6
B)*3*5
C)*5
D)*7
答案:
D
【解析】do...while语句是先执行后判断,所以第一次先执行循环体,判断i%3==1的条件,由于i为5所以余数为2,条件不成立,执行i++,i的值为6,判断while条件为真,第二次执行循环体,同第一次循环体的执行过程一样,i的值变为7,判断while条件为真,第三次执行循环体,此时i%3==1条件成立,判断i%5==2也成立,打印*与i的值,即*7,然后执行break语句,跳出循环。所以选择D选项。
(26)有以下程序
#include
main()
{intc[6]={10,20,30,40,50,60},*p,*s;
p=c;s=&c[5];
printf("%d\n",s-p);
}
程序运行后的输出结果是()。
A)5
B)50
C)6
D)60
答案:
A
【解析】首先初始化一维数组c[6],语句p=c;指将c[0]元素的地址赋给指针变量p;语句s=&c[5];指将c[5]元素的地址赋给指针变量s。
程序最后输出s-p,即结果为5。
因此A选项正确。
(27)有以下程序
#include
voidfun(inta[],intn,intflag)
{inti=0,j,t;
for(i=0;ifor(j=i+1;jif(flag)
{if(a[i]{t=a[i];a[i]=a[j];a[j]=t;}
}
else
{if(a[i]>a[j])
{t=a[i];a[i]=a[j];a[j]=t;}
}
}
main()
{intc[10]={7,9,10,8,3,5,1,6,2,4},i;
fun(c,4,1);
fun(c+4,6,0);
for(i=0;i<10;i++)printf("%d,",c[i]);
printf("\n");
}
程序运行后的输出结果是()。
A)7,8,9,10,6,5,4,3,2,1
B)10,9,8,7,6,5,4,3,2,1
C)10,9,8,7,1,2,3,4,5,6,
D)1,2,3,4,5,6,7,8,9,10,
答案:
C
【解析】fun()函数作用冒泡法排序,flag控制升序(0)或者降序
(1)。
n为参与排序的个数。
a为数组的起始地址。
因此,fun(a,4,1),数组的前四个降序排序,fun(a+4,6,0)从数组的第四项,后六个升序排序。
故结果为10,9,8,7,1,2,3,4,5,6。
答案为C选项
(28)下列选项中,能正确定义数组的语句是()。
A)intnum[0...2008];
B)intnum[];
C)intN=2008;
intnum[N];
D)#defineN2008
intnum[N];
答案:
D
【解析】C语言不允许定义动态数组,定义数组的大小必须为常量表达式。
A选项错误,C语言中数组没有此类型的定义方法;B选项错误,定义数组应指明数组大小,如果不指明数组大小,需要给定初值的个数;C选项错误,N为变量,不能用来定义数组大小。
因此D选项正确。
(29)有以下程序
#include
main()
{
inta[4][4]={{1,4,3,2},
{8,6,5,7},
{3,7,2,5},
{4,8,6,1}};
inti,j,k,t;
for(i=0;i<4;i++)
for(j=0;j<3;j++)
for(k=j+1;k<4;k++)
if(a[j][i]>a[k][i])
{
t=a[j][i];
a[j][i]=a[k][i];
a[k][i]=t;
}/*按列排序*/
for(i=0;i<4;i++)
printf("%d,",a[i][i]);
}
程序运行后的输出结果是()。
A)1,6,2,1,
B)8,7,3,1,
C)4,7,5,2,
D)1,6,5,7,
答案:
D
【解析】首先对二维数组进行赋值操作,a[0][0]、a[0][1]、…、a[3][2]、a[3][3]的值为1、4、…、6、1。
通过for语句和if语句,对二维数组各列元素进行由小到大的排序操作,程序最后通过for语句输出二维数组对角线上的元素。
因此D选项正确。
(30)有以下程序
#include
main()
{charw[20],a[5][10]={"abcdef","ghijkl","mnopq","rstuv","wxyz"};
inti,j;
for(i=0;i<5;i++)
{j=0;
while(a[i][j]!
='\0')j++;
w[i]=a[i][j/2+1];
}
w[5]='\0';
puts(w);
}
程序运行后的输出结果是()。
A)ekpuz
B)agmrw
C)flqvz
D)djoty
答案:
A
【解析】在for循环中,执行完while语句,j值为字符串数组a的每行字符串的长度,因此w[i]=a[i][j/2+1],数组a的元素a[i][j/2+1]的值赋给一维数组w[i]。
比如i=0;j=6;a[i][j/2+1]=a[0][4]='e',将此值赋给w[0]。
循环依次给数组W赋值最后输出w,答案为A选项。
(31)有以下程序(strcpy为字符串复制函数,strcat为字符串连接函数)
#include
#include
main()