二级C语言127.docx
《二级C语言127.docx》由会员分享,可在线阅读,更多相关《二级C语言127.docx(14页珍藏版)》请在冰豆网上搜索。
二级C语言127
二级C语言-127
(总分:
100.00,做题时间:
90分钟)
一、选择题(总题数:
40,分数:
100.00)
1.设计软件结构是软件生命周期的______。
(分数:
2.50)
A.软件定义期
B.软件开发期 √
C.软件维护期
D.以上3个都不是
解析:
[解析]本题是对软件设计结构的考查。
设计软件结构是软件概要设计阶段进行的,而概要设计属于软件开发期。
2.下列关于栈的描述中错误的是______。
(分数:
2.50)
A.栈是先进先出的线性表
B.栈只能顺序存储 √
C.栈具有记忆作用
D.对栈的插入删除操作中,不需要改变栈底指针
解析:
[解析]栈是线性表的一种,它的特点是先进后出,并且只能在表的一端进行插入和删除操作的线性表,入栈和出栈都在栈顶进行,因此具有记忆作用。
栈可以采用顺序存储,也可以采用链式存储。
3.对长度为n的线性表进行顺序查找,在最坏情况下需要比较的次数为______。
(分数:
2.50)
A.125
B.n/2
C.n √
D.n+1
解析:
[解析]对长度为n的线性表进行顺序查找时,从表中的第一个元素开始,给定的值与表中逐个元素的关键字进行比较,直到两者相符,查找完成。
在最坏情况下,要查找的元素是表的最后一个元素或查找失败,这两种情况都需要将这个元素中的所有元素进行比较,因此比较次数为n。
4.以下选项中不合法的用户标识符是______。
(分数:
2.50)
A.abc.c √
B.file
C.Main
D.PRINTF
解析:
[解析]C语言规定标识符只能由字母、数字、下划线组成,并且只能由字母或下划线开头。
A中包含点符号,因此A选项不合法。
5.下列叙述中错误的是______。
(分数:
2.50)
A.一种数据的逻辑结构可以有多种存储结构
B.数据的存储结构与数据的处理效率无关 √
C.数据的存储结构与数据的处理效率密切相关
D.数据的存储结构在计算机中所占的空间不一定是连续的
解析:
[解析]数据的存储结构分顺序存储结构和链式存储结构,一个数据的逻辑结构可以有多种存储结构。
顺序结构中数据元素所占的存储空间是连续的,而链式存储结构中,数据元素通过指针就联系在一起了,所以所占的存储空间不一定是连续的。
6.下列工具中为需求分析常用工具的是______。
(分数:
2.50)
A.PAD
B.BFD
C.N-S
D.DFD √
解析:
[解析]需求分析常用的工具有4种:
数据流图(DFD)、数据字典(DD)、判断树和判定表。
PAD(问题分析图)、PFD(程序流程图)、N-S(盒式图)都是详细设计的常用工具,不是需求分析的工具。
7.下列叙述中不正确的是______。
(分数:
2.50)
A.在C语言中调用函数时,只能把实参的值传送给彤参,形参的值不能传送给实参
B.在C的函数中,最好使用全局变量 √
C.外部变量可以在函数之间传递数据
D.自动变量实质上是一个函数内部的局部变量
解析:
[解析]在程序运行中局部变量所在的函数被调用时,编译系统根据需要临时分配内存,调用结束空间解放;全局变量一经定义,编译系统为其分配固定的内存单元,在程序运行的自始至终都占用固定的单元。
在考虑内存未知的情况下,最好不要使用全局变量。
8.下列选项不符合良好程序设计风格的是______。
(分数:
2.50)
A.源程序要文档化
B.数据说明的次序要规范化
C.避免滥用goto语句
D.模块设计原则是高耦合、高内聚 √
解析:
[解析]在程序设计中,对于软件设计中的模块设计要保证高内聚和低耦合,源程序要有文档说明,同时对程序中数据的说明要规范化。
而goto语句破坏程序的结构,要尽量避免使用。
所以选项D不正确。
9.设有如下关系表:
R
A
B
C
1
1
2
2
2
3
S
A
B
C
3
1
3
T
A
B
C
1
1
2
2
2
3
3
1
3
则下列操作中正确的是______。
(分数:
2.50)
A.T=R∩S
B.T=R∪S √
C.T=R×S
D.T=R/S
解析:
[解析]关系代数中的集合运算分4种:
并、差、交和笛卡尔。
①并(∪);②差(-),R和S的差是由属于R但不属于S的元组构成的集合;③交(∩):
由既属于R又属于S的元组构成的集合;④笛卡尔积(×):
对两个关系R和S进行合并操作,产生的关系中元组个数为两个关系中元组个数之积。
根据关系T中的元组可知,T关系是关系R和关系S进行合并操作所得到的。
10.下列叙述中错误的是______。
(分数:
2.50)
A.列表框和组合框都有List属性
B.列表框有Selected属性,而组合框没有 √
C.列表框和组合框都有Style属性
D.组合框有Text属性,而列表框没有
解析:
[解析]组合框和列表框都没有Selected属性。
11.有下列程序:
main()
{intx=5;
do
{printf("%d",x-=4);}
while(!
(--x));
}
程序的输出结果是______。
(分数:
2.50)
A.1
B.20
C.1-4 √
D.死循环
解析:
[解析]本题考查do-while循环。
先执行do的内容,也就是printf语句,x=x-4=1,输出1,判断while循环的控制条件,--x=0,则!
(--x)为非零,循环条件成立,执行下一次循环;x=x-4=-4,输出-4,判断while循环的条件,--x=-5,则!
(--x)为零,循环条件不成立,结束循环。
12.若有下列定义,则______是对a数组元素地址的正确引用。
inta[5],*p=a;
(分数:
2.50)
A.p+5
B.*a+1
C.&a+1
D.&a[0] √
解析:
[解析]本题考查数组元素地址的引用。
选项A中,p+5引用的是a[5]的地址,而数组a只有5个元素,即a[0]、a[1]、a[2]、a[3]、a[4],所以引用错误(注:
数组元素下标从0开始);选项B中,*a+1指的是将数组a的第1个元素加1;选项C中,不存在这种引用方式;选项D中,&a[0]引用的是数组的首地址。
13.设有定义语句:
chara="/72";,则变量a______。
(分数:
2.50)
A.包含1个字符 √
B.包含2个字符
C.包含3个字符
D.定义不合法
解析:
[解析]""是转义字符,但是"/72"表示ASCII码里的1个字符。
14.定义下列结构体(联合)数组:
structSt
{charname[15];
intage;
}a[10]={"ZHAO",14,"WANG",15,"LIU",16,"ZHANG",17};
执行语句printf("%d,%c",a[2].age,*(a[3].name+2))的输出结果为______。
(分数:
2.50)
A.15,A
B.16,H
C.16,A √
D.17,H
解析:
[解析]本题考查结构体数组。
a[2].age为结构体a[2]的age成员,即a[3].name为指向结构体a[3]的name成员的第一个元素的指针,印指向“Z”,(a[3].name+2)将指针后移两位指向第三个元素“A”,*(a[3].name+2)是取指针所指向地址的内容。
15.若已定义:
inta[4][3]={1,2,3,4,5,6,7,8,9,10,11,12},(*prt)[3]=a,*p=a[0];
则能够正确表示数组元素a[1][2]的表达式是______。
(分数:
2.50)
A.*((*prt+1)[2])
B.*(*(p+5))
C.(*prt+1)+2
D.*(*(a+1)+2) √
解析:
[解析]A:
多了外层的*()。
B:
p是行地址,加5越界。
C:
少了外层的*()。
16.下列程序的输出结果是______。
char*point(char*pt);
main()
{charb[4]={"a","c","s","f"},*pt=b;
pt=point(pt);
printf("%c/n",*pt);
}
point(char*p)
{p+=3;
returnp;
}
(分数:
2.50)
A.s
B.c
C.f √
D.a
解析:
[解析]本题考查函数的调用及参数传递,当执行函数point时,刚开始指针p指向“a”,经过+3,指针p指向“f”,所以最后的输出结果是f。
17.下列选项中不会引起二义性的宏定义是______。
(分数:
2.50)
A.#defineS(x)x*x
B.#defineS(x)(x)*(x)
C.#defineS(x).(x*x)
D.#defineS(x)((x)*(x)) √
解析:
[解析]本题考查参数的宏替换。
为避免二义性有些参数表达式必须加括号,否则在实参表达式替换时,会出现错误。
例如x为(m+n)时替换A:
m+n*m+n,所以选项D最符合条件。
18.交换两个变量的值,不允许用临时变量,应该使用下列______位运算符。
(分数:
2.50)
A.&
B.^ √
C.‖
D.~
解析:
[解析]按逻辑位运算特点:
①用按位与运算将特定位清为0或保留特定位;②用按位或运算将特定的位置为1;③用按位异或运算将某个变量的特定位翻转或交换两个变量的值。
19.合法的C语言赋值语句是______。
(分数:
2.50)
A.a=b=58
B.k=int(a+b);
C.a=58,b=58
D.--1; √
解析:
[解析]赋值语句两个标志:
赋值(就是“=”)和语句(加上“;”)。
选项A,缺少分号,应该改为a=b=58;选项B,错误,类型转换不是这么写,应该是这样:
k=(int)(a+b);C选项中缺少分号;选项D,相当于i=i-1,所以也可以算作赋值操作。
20.有下列程序:
#include<stdio.h>
main()
{inta=6,b=7,m=1;
switch(a%2)
{case0:
m++;break;
case1:
m++;
switch(b%2)
{default:
m++;
case0:
m++;break;
}
}
printf("%d/n",m);
}
程序的运行结果是______。
(分数:
2.50)
A.3
B.2 √
C.4
D.1
解析:
[解析]本题考查switch语句及break的用法。
第一个switch语句,因为a=6,a%2=0,所以执行“case0,m++;”,将m加1,遇到break语句跳出switch语句,结束循环。
不执行下面的switch。
21.有以下程序:
#include<strintg.h>
main()
{charp[20]={"a","b","c","d"},q[]="abc",r[]="abcde";
strcpy(p+strlen(q),r);strcat(p,q);
printf("%d%d/n",sizeof(p),strlen(p));
}
程序运行后的输出结果是______。
(分数:
2.50)
A.209
B.99
C.2011 √
D.1111
解析:
[解析]在主函数中,首先定义一个包含20个元素的字符数组p,执行语句“strcpy(p+strlen(q),r);”,数组p的内容变为{a,b,c,a,b,c,d,e,/0,/0,/0,/0,/0,/0,/0,/0,/0,/0,/0,/0},执行语句“strcat(p,q);”,数组p的内容变为{a,b,c,a,b,c,d,e,a,b,c,/0,/0,/0,/0,/0,/0,/0,/0,/0},函数sizeof(p)是求数组p的大小,返回20,而函数strlen(p)是计算以p所指起始地址的字符串的长度,这一长度不包括串尾的结束标志0,所以函数返回11。
22.若变量a、b、x、i都已正确定义并赋值,则以下符合C语言语法的表达式是______。
(分数:
2.50)
A.a+=a-=(b=4)*(a=3) √
B.x%(-3);
C.a=a*3=2
D.y=float(i)
解析:
[解析]取余运算符%两边都应是正数,赋值语句左边必须是变量,不能是表达式,强制转换语句强制类型应加括号,而非加在变量上。
23.设有定义:
“inta;floatb;”,执行“scanf("%2d%f",&a,&b);”语句时,若从键盘输入876543.0<回车>,a和b的值分别是______。
(分数:
2.50)
A.876和543.000000
B.87和6.000000 √
C.87和543.000000
D.76和543.000000
解析:
[解析]本题考查scanf函数,输入格式符%2d%f表示只接收了字符,其中a输入的值为2位的十进制整数,即87,然后将紧接着的6赋给b,因为b的值为单精度数6,即6.000000,故选择B选项。
24.若有定义:
intc[4][5],(*cp)[5];和语句cp=c;,则能正确引用c数组元素的是______。
(分数:
2.50)
A.cp+1
B.*(cp+3)
C.*(cp+1)+3
D.*(*cp+2) √
解析:
[解析]cp是行指针,只表示行,若要表示元素,则需要配合列,A:
表示第二行;B:
表示第四行的内容,但是设指出那一列;C:
*(cp+1)+3只是地址不是元素值,需改为*(*(cp+1)+3)。
25.有以下程序:
main()
{intk=5;
while(--k)printf("%d",k-=3)j;
printf("/n");
}
执行后的输出结果是______。
(分数:
2.50)
A.1 √
B.2
C.4
D.死循环
解析:
[解析]当k=5时,while条件中的值为4,k为4,循环不成立,k-=3可写成k=k-3,输出1;接着执行--k后k为0,当k=0时,while循环不成立,退出。
26.当执行以下程序段时,______。
x=-1;
do{x=x*x;}while(!
x);
(分数:
2.50)
A.循环体将执行一次 √
B.循环体将执行两次
C.循环体将执行无限次
D.系统将提示有语法错误
解析:
[解析]do-while的功能是先执行一次循环体,再判断条件是否成立,当x=-1时,执行do语句,x=x*x=1,接着执行while后的表达式,其值为0,退出循环,因此循环体只执行了一次。
27.若有定义:
“int*p,x=0,*p,p=&x;”,则语句“printf("%d/n",*p);”的输出结果是______。
(分数:
2.50)
A.随机值
B.0 √
C.x的地址
D.p的地址
解析:
[解析]*p的意思是取其指向地址的内容,p是指向x地址的指针,因此输出*p也就是输出x的内容,即0,故选择B选项。
28.执行语句“for(i=1;i++<4;);”后,变量i的值是______。
(分数:
2.50)
A.3
B.4
C.5 √
D.不定
解析:
[解析]for循环结束时,i++的值应为4,i自加后此时应为5,故选择C选项。
29.下列程序的运行结果是______。
main()
{intx=1,y=3,a=0;
while(x++!
=(y-=1))
{a+=1;
if(y<x)break;
}
printf("%d,%d,%d/n",x,y,a);
}
(分数:
2.50)
A.2,3,2
B.2,3,1
C.1,3,3
D.3,1,2 √
解析:
[解析]本题考查while循环。
第一次循环,y=y-1,y=2。
循环条件成立,x=1,x++后值为1,x自加变成2,进入循环,a=a+1=1,判断if语句条件是否成立,y<x不成立,接着执行下一次循环。
第二次循环,x=2,y-1=1,循环条件成立,进入循环,a=a+1=2,判断if语句的控制条件是否成立,y<x成立,执行break语句,退出循环。
结果为D。
30.若有以下程序:
#include<stdio.h>
voidsub(doublex,double*y,double*z){*Y=*y-1.0;*z=*z+x;}
main()
(doublea=2.5,b=9.0,*pa,*pb;
pa=&a;pb=&b;
sub(b-a,pa,pa);printf("%f/n",a);
}
程序的输出结果是______。
(分数:
2.50)
A.9.000000
B.1.500000
C.8.000000 √
D.10.500000
解析:
[解析]从函数参数来看,x=b-a=6.5;y=z是指向a的指针pa,也就是说*y=*z=2.5;由于指针作为参数,可以将函数中计算得到的对指针引用的*y,*x作为最后计算得到的a的值,从函数语句看,类似做这样的运算,a=a-1.0;a=a+x;这里x=6.5于是计算得到,a=8;由于输出格式为浮点型,输出结果为8.0000000。
因此正确答案为C。
31.有以下程序:
#include<stdio.h>
main()
{intx=4,y;
do
{y=x;
if(!
y)printf("x");
else
printf("y");
x--;
}while(x);
}
程序的输出结果是______。
(分数:
2.50)
A.xyyx
B.yyyy √
C.yyxx
D.yxyx
解析:
[解析]本题考查do-while语句和if…else语句。
do-whiIe语句的功能是先执行循环体再判断条件,所以先判断if语句的条件,y=-4,!
y为逻辑0,条件不成立,执行下面的else语句,输出y,然后将x的值减1,x=3,条件不成立,执行下面的else语句,输出y,然后将x的值减1,x=2,满足while循环条件,继续循环。
第三次循环:
先判断if语句的条件,y=2,!
y为逻辑0,条件不成立,执行下面的else语句,输出y,然后将x的值减1,x=1,满足while循环条件,继续循环。
第四次循环:
先判断if语句的条件,y=-1,!
y为逻辑0,条件不成立,执行下面的else语句,输出y,然后将x的值减1,x=0,不满足whik循环条件,结束循环。
所以选项B正确。
32.有以下程序:
#include<stdio.h>
main()
{inti=0,a=0;
while(i<20)
{for(;;)
{if((i%10)==0)break;
else
i--;
}
i+=11;
a+=i;
}
printf("%d/n",a);
}
程序的输出结果是______。
(分数:
2.50)
A.62
B.63
C.33
D.32 √
解析:
[解析]本题考查while循环。
当i<20时,进入while循环体,循环体内的for循环实现的功能是i%10==0,也就是说当i值为0或者10的倍数的时候,跳出循环,执行i+=11;a+=i;,若i值不是10的倍数,则一直执行for循环i--。
①判断i=0时,执行i+=11;a+=i;,i=11,a=11;②判断i=10时,跳出for循环,执行i+=11;a+=i;,i=21,a=32;③判断i=21>20,不符合题意,结束循环。
33.下面程序的运行结果是______。
#include<stdio.h>
voiddel(char*s)
{inti,j;
char*a;
a=s;
for(i=0,j=0;a[i]!
="/0";i++)
{if(a[i]>="0"&&a[i]<="9")
{s[j]=a[i];
j++;
}
s[j]="/0";
}
}
main()
{char*s="aa89gggh";
del(s);
printf("/n%s",s);
}
(分数:
2.50)
A.1
B.2 √
C.3
D.4
解析:
[解析]本题中del(char*s)函数实现的功能是逐个读入s数组中的字符,如果遇到数字,则将数字存在s中,遇到非数字字符则跳过。
所以最后输出的应该是字符串s中所有数字的个数。
34.当输入为"hello?
"时,下面程序的执行结果是______。
#include<stdio.h>
main()
{charc;
c=getchar();
while(c!
="?
")
{putchar(c);break;
}
}
(分数:
2.50)
A.Rvfsu
B.h √
C.?
D.hello
解析:
[解析]本题考查getchar()函数与putchar()函数,通过getchar()函数读入字符,并通过putchar()函数将字符逐个输出,当用户输入“?
”时停止输出,且c是一个字符变量只占一个字节。
35.有以下程序,其中函数f的功能是将多个字符串按字典顺序排序______。
#include<string.h>
voidf(char*p[],intn)
{char*t;inti,j;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(strcmp(p[i],p[j]>0)){t=p[i];p[i]=p[j];p[j]=t;}
}
main()
{char*p[5]={"abc","aabdfg","abbd","dcdbe","cd"};
f(p,5);
printf("%d/n",strlen(p[1]));
}
程序运行后的输出结果是______。
(分数:
2.50)
A.2
B.3
C.6
D.4 √
解析:
[解析]函数voidf的功能是将字符指针数组*p[]中的每个字符串按照从小到大的顺序排列。
在主函数main()中,调用f(p,5)后,字符指针数组*p[5]中的字符串按照字典顺序从小到大排列为如下形式,即*p[5]={"aabdfg","abbd","abc","cd","dcdbe"},因此p[1]="abdb",strlen(p[1])=4。
36.在下列语句中,其含义为“q是一个函数指针,该指针指向整型数据”的定义语句是______。
(分数:
2.50)
A.int**q;
B.int(*q)(); √
C.int*q;
D.i