一、选择题
1执行下列程序后,变量a,b,e的值分别是( )。
int x=5,Y=4;
int a,b,e;
a=(--x==y++)?x;++y;
b=++x;
c=y;
A.a=5,b=5,c=5B.a=4,b=5,c=5C.a=5,b=6,c=5D.a=1,b=5,C=6
参考答案:B
参考解析:本题考查自加(++)、自减(--)运算符的使用。“++X,--x”,在变量x前使用,先使x的值加1或者减l,再使用此时的表达式的值参与运算;“x++,X--”,先把使用x的值参与运算,在使用x之后,再使x的值加l或者减1。
对于表达式--×=4,y+十=4,两者相等,--x=y++为真,所以a=x=4,执行完此语句后Y的值是5。第2个表达式b=++x,X的值先加l,然后赋给b,即b=x+1=5;表达式c=y=5。故选项B正确。
2C语言可执行程序的开始执行点是( )。
A.包含文件中的第一个函数
B.程序中第一个函数
C.程序中的main()函数
D.程序中第一条语句
参考答案:C
参考解析:每个C程序有且只有一个主函数main(),且程序必须从main()函数开始执行,并在main()函数中结束。
3设有定义的语句:“char c1=92,c2=92;”,则以下表达式中的值为零的是( )。
A.c1^c2B.c1&c2C.^c2D.^c1
参考答案:A
参考解析:当值相同时按位异或,则为0,按位或与 按位与时仍不变,负数也为非0。
4有以下程序:
main()
{ int x=0,y=5,z=3;
while(z-->0&&++x<5)y=y-1:
printf(”%d,%d,%d\n”,x,y.z);
}
程序执行后的输出结果是( )。
A.3,2,0B.3,2,-1C.4,3,-1D.5,2,5
参考答案:B
参考解析:
while语句执行如下:
当z=3,x=0时,表达式z一一>0&&++x%5为真,Z的值变为2,X的值变为l,执行语句“y=y-1;”,Y的值变为4;
当z=2,x=1时,表达式z一一>0&&++x<5为真,z的值变为1,X的值变为2,执行语句“y=y-1;”,y的值变为3;
当z=1,x=2时,表达式z一一>0&&++x<5为真,z的值变为0,X的值变为3,执行语句“y=y-1;”,Y的值变为2;
当z=0,x=3时,表达式z一一>0为假,表达式(z一一>o&&++x%5)为假,Z的值为-1,不进行++x<5的判断,不执行语句y=y-1;;
所以X的值为3,Y的值为2,z的值为-1。答案为B。
5下述程序执行的输出结果是( )。
#include
main()
{char a[2][4];
strcpy(a,"are");strcpy(a[1],"you");
a[0][3]='&'
print[(”%s\n”,a);
}
A.are&youB.youC.areD.&.
参考答案:A
参考解析:strepy实现的功能是复制,该操作把are复制到a中,a[o][3]=’&’,且strcpy(a[1],”you”)把you复制到a[1]中,故输出a为“are&you”。
6两个或两个以上模块之间联系的紧密程度称为( )。
A.耦合性B.内聚性C.复杂性D.数据传输特性
参考答案:A
参考解析:耦合性用来表示模块间互相连接的紧密程度的度量。它取决于各个模块之间接口的复杂度、调用方式以及哪些信息通过接口。
7若有以下程序:
#include
main()
{int k=2,m=4,n=6,。pk=&k,*pm=&m,*P;
*(P=&n)=*pk*(*pm);printf("%d\n",n);
)
程序的输出结果是( )。
A.4B.6C.8D.10
参考答案:C
参考解析:p=&n即指针P指向n的地址,*(p一&n)即*P即n的值n=2*4=8。因此正确的答案为C。
8交换两个变量的值,不允许用临时变量,应该使用下列( )位运算符。
A.&B.^C.||D.~
参考答案:B
参考解析:按逻辑位运算特点:①用按位与运算将特定位清为0或保留特定位;②用按位或运算将特定的位置为l;③用按位异或运算将某个变量的特定位翻转或交换两个变量的值。
9下列字符数组初始化语句中,不正确的是( )。
A.char c[]='goodmorning';B.char e[20]="goodmorning":C.char c[]=('a','b','c','d');D.char c[]={”ffgoodmorning”);
参考答案:A
参考解析:本题考查两个概念:①用单引号括起来的一个字符常量只能存放一个字符;②C语言中没有字符串变量,只能用字符数组来存储字符串。
10有以下程序:
#include(strint9.h>
main()
{char p[20]={'a','b','c','d'},q[]=”abe”,r[]=”
abcde”;
strcpy(p+strlen(q),r);strcat(p,q);
printf(”%d%d\n”,sizeof(p),strlen(p));
)
程序运行后的输出结果是( )。
A.20 9B.9 9C.Z0 11D.11 11.
参考答案:C
参考解析:在主函数中,首先定义一个包含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的内容变为ra,b,C,a,6,c,d,e,a,b,C,\0,\0,\0,\0,\0,\0,\0,\0},函数sizeof(p)是求数组P的大小,返回20,而函数strlen(p)是计算以P所指起始地址的字符串的长度,这一长度不包括串尾的结束标志0,所以函数返回11。
11设a、b、e、d、m、n均为int型变量,且a=5、b=6、c=7、d=8、m=2、n=2,则逻辑表达式(m=a>b)&&(n=c>d)运算后,n的值是( )。
A.0B.1C.2D.3
参考答案:C
参考解析:因为a>b不成立,故表达武a>b的值为0,即把0赋给rn,因此&&左边表达式的值为0,0与任何值&&运算都为0,于是不再计算&&.右边表达式的值,所以此时的l3.仍然为2。
12以下选项中不合法的用户标识符是( )。
A.abC.CB.fileC.MainD.PRINTF
参考答案:A
参考解析:C语言规定标识符只能由字母、数字、下划线组成,并且只能由字母或下划线开头。A中包含点符号,因此A选项不合法。
13为了提高软件的独立性,模块之间最好是( )。
A.控制耦合B.公共耦合C.内容耦合D.数据耦合
参考答案:D
参考解析:在程序设计中,各模块间的内聚性越强,则耦合性越弱。一般较优秀的软件设计,应尽量做到高内聚、低耦合,以有利于提高模块的独立性。耦合性与内聚性是模块独立的两个定性标准,是互相关联的。
14以下程序的输出结果是( )。
main()
{ char*s=”l2134211”;
int v[4]={0,0,0,0),k,i;
for(k=0;s[k];k++)
{ switch(s[k])
{case…1:i=0;
case'2':i=1:
ease'3':i=2;
case'4':i=3;}
)
vEij++;
)
for(k=0;k<4;k++)printf(”%d¨,v[k]);
A.4 2 1 1B.0 0 0 8C.4 6 7 8D.8 8 8 8
参考答案:B
参考解析:本题考查switch,case语句,当k=0时,循环体成立,执行switch后表达式的值为’l’,执行case'1’,i的值为0,因为没有break语句,继续执行其后的语句,到最后一个语句时i的值为3,此时v[i]++,v[3]=1,接着执行k++后,k的值为1,当k=1时,循环成立。执行switch后的表达式的值为…2,执行case'2',i的值为1,因为没有break语句,继续执行其后的语句,到最后一个语句时,i的值为3,此时viii++,v[3]=2,接着执行k++后,k的值为2,依次下去,case'4'也会执行,最后i的值一定为3,到v[3]=8时循环结束,而vE03-vEz]的值一直没有变化,故选择8选项。
15若有定义“int a=5,b=7;”,则表达式a%=(b%2)运算后,a的值为( )。
A.0B.1C.11D.3
参考答案:A
参考解析:本题考查“%”运算符的使用。运算符“%”是整数除法的余数。本题中表达式a%=(b%2)等价于a=a%(b%2)=5%(7%2)=5%1=0。
16下列合法的声明语句是( )。
A.int _abc=50;B.double int=3+5c2.5:C.long do=11;D.float 3_asd=3e-3;
参考答案:A
参考解析:标识符是由字母、数字或下划线组成,并且它的第一个字符必须是字母或者下划线。B选项int不是表达变量类型的标识符,它不能再用做变量名和函数名。c选项d0是c语言的一个关键字。D选项标识符不符合只能以字母或下划线开始的要求。
17有以下程序:
#include
main()
{ int a[]={2,4.6.8},*p=a,i;
for(i=0;i<4;i+.+)a[i]=*p++;
printf(”%d\n”,a[2]);
程序的输出结果是( )。
A.6B.8C.4D.2
参考答案:A
参考解析:p=a,相当于重新把a中的内容赋给a本身,所以a[2]=6。
18设a=1,b=2,c=3,d=4,则表达式:“a
A.4B.3C.2D.1
参考答案:D
参考解析:在三目运算符中,优先级相同,按从右到左的结合性计算,a
19下列程序的输出结果是( )。
main()
(int i=1,j=2,k=3;
if(i++==1&&(++j==3==||k++==
3))
printf(”%d%d%d\n”,i,j,k);
)
A.1 2 3B.2 3 4C.2 2 3D.2 3 3
参考答案:D
参考解析:本题考查自增运算符“++”、逻辑与运算符“&&”和逻辑或运算符“||”。自增运算符“十十”出现在变量之前,表示先使变量的值加1,再使用变量的值进行运算;出现在变量之后,表示先使用变量的值进行运算,再使用变量的值加1。当逻辑与运算符“&&”两边的运算对象都为真时,逻辑表达的值才为真;当逻辑或运算符“||”只要一个值为l,值就为l。根据运算符的优先级,题中应先计算内层括号中的值。++j是先自加后运算,因此运算时J的值等于3,所以表达式++j一3成立,即表达式的值为l;1与任何数都为进行或(||)运算,结果都为1,因此k一3的表达式i++是先运算后自加,因此运算时i为l,所以i十+一1成立,自加1后i一2。if语句的条件为真即“1”,所以输出i、j、k的值分别是2,3,3。
20以下程序的输出结果是( )。
main()
{char str[][10]={¨china”,”beijing”),*p=str;
printf(”%s\n”,p十10):
A.ChinaB.BeijingC.ngD.ing
参考答案:B
参考解析:本题考查指针,由*P—str可知,指针P指向字符串数组的首地址。二维数组str为每个字符串分配的存储空间是10个字节,因此p+10指向str[1][o],输出的字符串就是数组中的第2个字符串。
21以下关于字符串的叙述中正确的是( )。
A.c语言中有字符串类型的常量和变量
B.两个字符串中的字符个数相同时才能进行字符串大小的比较
C.可以用关系运算符对字符串的大小进行比较
D.空串一定比空格打头的字符串小
参考答案:D
参考解析:字符串常量是由双引号括起来的一串字符,所以A选项错误;任意两个字符串的大小比较要调用字符串比较函数strcmp(sl,s2)来进行,所以选项8和C错误。
22下列程序的输出结果是( )。
#include
main()
{ int a=0,i;
for(i=1;i<5:i++)
{ switch(i)
{ case 0:
case 3:a+=1;
case】:
case 2:a=2;
default:a+=3;
}
}
printf(”%d”,a);
)
A.19B.18C.6D.8
参考答案:A
参考解析:本题考查switchcase开关语句,default退出继续循环。当i=1时,执行casel,因为没有break语句,所以依次往下运行,a=a+2-2,a=a+3=5;当i=2时,执行case2,没有break语句,所以依次往下运行,a-a+2-7,a=a+3=10;当i=3时,执行case3,当a=a+1=11,没有break语句,所以依次往下运行,a=a+2=13,a=a+3=16;当i=4时,没有case语句,则执行default,a=a十3—19,i=5不成立,循环结束。
23有以下程序:
#include
main()
{ int x:=10,y=3;
printf(”%d\n”,y=x/y);
)
执行后的输出结果是( )。
A.0B.1C.3D.不确定的值
参考答案:C
参考解析:xy都是整形,C表达式的值的类型和参与运算的值的类型保持一致,而浮点数据转换为整形数据使用的方法是直接抛弃小数部分,所以3.3的小数部分被舍弃了,于是结果就是3。
24函数[seek(pf,OI,SEEK_END)中的SEEK_END代表的起始点是( )。
A.文件开始B.文件末尾C.文件当前位置D.以上都不对
参考答案:B
参考解析:SEEK—SET代表文件的开始,SEEK—
END代表文件末尾,SEEK—CUR代表文件当前位置。
25数字字符0的ASCII值为48,运行以下程序的输出结果是( )。
main()
{char a='1',b='2':
printf(”%c,”.b++);printf(”%d\n”,b-a);)
A.3,2B.50,2C.2,2D.2,50
参考答案:C
参考解析:b++是先用表达式的值然后自增l,因此表达式值为'2',b为'3'.b-a='3'-'1'=2,因此最后输出的结果为2,2,前一个为字符2,后一个为数字2。
26若有以下程序段:
int c1=1,c2=2,c3;
c3=c1/c2;
print[(”%d\n”,c3);
执行后的输出结果是( )。
A.0B.1/2C.0.5D.1
参考答案:A
参考解析:c1和c2都是整数,1/2取整得0,舍弃小数点。因此正确答案为A。
27下列叙述中正确的是( )。
A.软件测试应该由程序开发者来完成
B.程序经调试后一般不需要测试
C.软件维护只包括对程序代码的维护
D.以上三种说法都不对
参考答案:D
参考解析:程序调试是由程序开发者完成诊断和改正程序中的错误的过程;软件测试是由专门的测试人员完成,是发现错误而执行程序的过程;软件维护是指软件系统交付使用以后,为了改正错误或满足新的需要而修改软件的过程,是软件生存周期中非常重要的一个阶段。
28下列程序中函数sort()的功能是对数组a中的数据进行由大到小的排序。
#include
void sort(int a[],int n)
{ int i,j,t;
for(i 0;i
for(j=i+1+1;j
if(aEi]
{t=a[i];a[i]=a[j];a[j]=t;
)
main()
{int a[10]={1,2,3,4,5,6,7,8,9,10},i:
sort(&a[1],7);
for(i=0;i<10;i++)printf(”Vood,”,a[i]);
}
程序运行后的输出结果是( )。
A.1,2,3,4,5,6,7,8,9,10,
B.10,9,8,7,6,5,4,3,2,1,
C.i,8,7,6,5,4,3,2,9,10,
D.1,2,10,9,8,7,6,5,4,3,
参考答案:C
参考解析:本程序中的函数sort(inta[],intn)实现的功能是将数组a中的前n个数进行从大到小排序。sort(&a[1],7)是将数组中从a[l]~a[7]这7个数进行从大到小排序,其他数不变。
29若有定义:int X,*pb;则正确的赋值表达式是( )。
A.pb=&XB.pb=XC.*pb=&xD.*pb=*x
参考答案:A
参考解析:*pb是指解除对*pb的引用(也可以认为是取pb所指向的地址的值),被解除引用的指针可以作为左值,&为取地址运算符,&X就是取指向变量X的指针。
30下列叙述中正确的是( )。
A.算法的执行效率与数据存储结构无关
B.算法的空间复杂度是指算法程序中指令(或语句)的条数
C.算法的有穷性是指算法必须能在执行有限个步骤之后终止
D.以上3种描述都不对
参考答案:C
参考解析:在程序设计中,算法执行效率与数据的存储结构密切相关。算法的空间复杂度是指算法执行过程中所需存储空间。
31已知有如下结构体:
struct sk
{ int a;
float b;
}data,*p;
若有P一8Ldata,则对data的成员a引用正确的是( )。
A.(*p).data.aB.(*p).a;C.p->data.aD.P.data.a
参考答案:B
参考解析:本题主要考查结构指针:p=&data,访问结构体的成员。它可以通过结构变量访问,即data可以用等价的指针形式:(*p).a和P一>a来访问结构体变量中的成员。
32若有定义和语句:
int*。pp,*P,a=20,b=10;
pp=8Lp;P=&a;P=&.b;printf(”%d,%d\n”,*
P,**PP);
则输出结果是( )。
A.20,10B.20,20C.10,20D.10,10
参考答案:D
参考解析:本题考查指针变量的赋值。**pp是定义一个指针变量,语句pp=&p是将PP指向指针P,*P和**pp都是指针P所指的内存空间的内容,即b的值。
33合法的main()函数命令参数形式是( )。
A.main(int a,char*c口)B.main(int arc,char**arv)C.main(int argc,char*argv)D.main(int argv,char*argc[])
参考答案:C
参考解析:在C语言中,main()函数也可以有参数,例如,main(intar90,char*argv),argc是指字符串的指针数组,而其他几项表达不正确。
34当执行以下程序段时,( )。
x=-1:
do{x=x*x;)while(!x);
A.循环体将执行一次
B.循环体将执行两次
C.循环体将执行无限次
D.系统将提示有语法错误
参考答案:A
参考解析:do—while的功能是先执行一次循环体,再判断条件是否成立,当x=一l时,执行do语句,x=X*x=1、,接着执行while后的表达式,其值为0,退出循环,因此循环体只执行了一次。
35设x=011050,则x=x&01252的值是( )。
A.000000 1000 101000B.1111110100011001C.0000001 01 1 100010D.1100000OOOl0 1 000
参考答案:A
参考解析:本题主要考查按位与运算,x—Oll050的二进制形式为O001001000010lo00,01252的二进制形式为0000001010101010,两者相与得0000001000101000。
36下列选项不符合良好程序设计风格的是( )。
A.源程序要文档化
B.数据说明的次序要规范化
C.避免滥用got0语句
D.模块设计原则是高耦合、高内聚
参考答案:D
参考解析:在程序设计中,对于软件设计中的模块设计要保证高内聚和低耦合,源程序要有文档说明,同时对程序中数据的说明要规范化。而goto语句破坏程序的结构,要尽量避免使用。所以选项D不正确。
37若有说明“char sl E30]=”abc”,s2[]=”defghi“;”,
则在使用函数stcat(sl,s2)后,结果是( )。
A.sl的内容更新为abcdefghi
B.sl的内容更新为defghi\O
C.sl的内容更新为defghiabc\O
D.sl的内容更新为abcdefghi\O
参考答案:D
参考解析:strcat(sl,s2)函数的功能是把s2字符串连接到sl字符串的末尾,要保证sl有足够的空间容纳下连接后的字符串。
38有以下程序:
#include
main()
{ int x=4,y;
{ y=x;
if(!y)printf(”x”);
else
printf(”y”);
x--:
)while(x);
)
程序的输出结果是( )。
A.xyyxB.YYYYC.yyxxD.yxyx
参考答案:B
参考解析:本题考查d0—while语句和if…else语句。d0—while语句的功能是先执行循环体再判断条件,所以先判断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=-l,!y为逻辑0,条件不成立,执行下面的else语句,输出Y,然后将x的值减1,x=0,不满足while循环条件,结束循环。所以选项B正确。
39有以下程序段:
int i,j,m=0;
for(i=1;i<=15;i+=4)
for(j=3;j<=19;j+=4)m++;
printf(”%d\n”,m);
程序段的输出结果是( )。
A.12B.15C.20D.25
参考答案:C
参考解析:
li=1J一3
m+十.m一1
j+4=7<=19m++m=2
j一十4—11
19m=5
i+4—515结束m一20
40若有定义“double a;”,则正确的输入语句是( )。
A.scan{(”%if”,a);
B.scanf(”%f”,&a);
C.scan{(”%If”,&a)
D.scan{(”%le”,&a);
参考答案:D
参考解析:
D。【解析】本题考查scanf函数的调用形式:scanf(格式字符串,输入项地址表)。题中定义变量a为双精度型变量,双精度变量的格式符为“le”;变量的地址用取地址符“&”加变量名表示,所以选项D正确。
二、程序填空题
41请补充函数proc(),其功能是:计算并输出给定10个数的方差。
例如,拾定的10个数为12.0,9.0.26.0,5.0,6.0,31.0,9.0,3.0,8.0,18、0,输出为s=8.8771500。
注意:部分源程序给出如下。
请勿改动main()函数和其他函数中的任何内容,仅在函数proc()的横线上填入所编写的若于表达式或语句。
试题程序:
#include
#include
double proc(double xElO])
{
int i;
double avg=0.0;
double 8urn=0.0;
double abs=0.0:
double sd;
for(i=0:i<10;i++)
【1】 ;
avg=sum/10;
for(i=0;i<10;i十十)
【2】 ;
sd= 【3】 ;
return sd;
void main()
{
double s,str[10]={12.0,9.0,26.0,5.0,6.0,31.0.
9.0,3.0,8.0,18.0);
int i;
printf(”\nThe original data is:\n”);
for(i一0;i<10;i++)
t)rintf(”%6.lf,slr[i]):
printf(”\n\n”);
s=proc(str):
printf(”s=%f\n\n”,s);
)
参考解析:
【1】sum+=x[i][2|abs+=(x[i]-avg)*(X[i]-
avg)[31sqrt(abs/10)
【解析】由函数proc()可知,变量sum中存放n个数的和,因此,【l】处填“sum+=x[i]”;然后求其平方差,因此,[21处填“abs+=(x[i]-avg)*(x[i]-avg)”;最后求l0个数的方差,因此,【3】处填“sqrt(abs/lO)”。
三、程序改错题
42给定程序中,函数proc()的功能是:使数组中的元素的值缩小5倍。
请修改程序中的错误,使它能得出正确的结果。
注意:不要改动main()函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#include
#include
float m[10];
f f****found****
int proc(void)
{
int J;
printf(”In subfunc after calling\n”);
for(j=0;j<10;j++)
{
|f****found****
printf(”%f”,m[j]%5);
}
}
void main()
{
int i;
printf(”In main before calling\n”);
for(i=0;i<10;i++)
{
m[i]=i+20:
printf(”%f”,m[i]);
}
proc();
printf(”\nIn main after calling\n”):
for(i=0;i<10;i++)
printf(”%f”,m[i]/S):
参考解析:
(1)错误:intproc(void)正确:voidproc(void)
(2)错误:printf(”%f”,m[j]%5);正确:printf(”%f”,m[j]/5);
【解析】由主函数中的函数调用可知,函数proc()没有返回值。因此,“intproc(void)”应改为“voidproc(void)”。题目中要求使数组中元素的值缩小到l/5,而不是对5取余。因此,“printf(”%f”,m[j]%5);”应改为“printf(”%f”,m[j]/5);”。
四、程序设计题
43请编写函数proc(),该函数的功能是:将放在字符串数组中的M个字符串(每串的长度不超过N),按顺序合并组成一个新的字符串。
例如,若字符串数组中的M个字符串为:
ABCD
BCDEFG
CDEFGHI
则合并后的字符串内容应该是ABCDBCDEFGCDEFGHI。
注意:部分源程序给出如下。
请勿改动main()函数和其他函数中的任何内容,仅在函数proc()的花括号中填入所编写的若干语句。
试题程序:
#include
#include
#define M 3
#define N 20
void proc(char arr[M][N].char*b)
{
}
void main()
{
char str[M][N]={”ABCD”,”BCDEFG”,”
CDEFGHl”),i;
char arr[100]={”#############
#####”);
printf(”The string:\n”);
for(i=0;i<2M;i++)
puts(str[i]);
printf(”\n”);
proc(str,arr);
printf(”The A string:\n”);
printf(”%S”,arr);
printf(”\nln”);
}
参考解析:
voidproc(chararr[M][N],char*b){
inti,j,k一0;
for(i=0;i
for(j=0;arr[i][j]!=’\0';J++)//由于每行的个数不等,因此用a[i][j]!一‘\o'来作为循环结束的条件
b[k++]=arrEi][j];//把二维数组中的元素放到b的一维数组中,
b[k]=’\o';//最后给b赋'\0’作为字符串结束的标志)
【解析】字符串数组中每一行都是一个完整的字符串,其结束标志为’\0'。因此,通过字符串的结束标志来判断每一个字符串是否结束,将字符串数组中的所有字符串均赋值给新的一维数组b来完成字符串的合并。