admin 管理员组文章数量: 887021
2023年12月16日发(作者:乌班图系统能干什么)
一、单项选择题
一)C语言基础
1. 以下叙述中错误的是______。
A、计算机不能直接执行用C语言编写的源程序
B、C程序经C编译程序编译后,生成后缀为.obj的文件是一个二进制文件
C、后缀为.obj的文件,经连接程序生成后缀为.exe的文件是一个二进制文件
D、后缀为.obj和.exe的二进制文件都可以直接运行
解析:本题考查的是C语言的特征。C语言被称为计算机的"高级语言",我们把由高级语言编写的程序称为"源程序",对于计算机本身来说,它并不能直接识别由高级语言编写的程序。C程序经C编译程序编译后,生成后缀为.obj的二进制文件 (称为目标文件)。最后还要由称为"连接程序"(Link)的软件,把此.obj文件与C语言提供的各种库函数连接起来生成一个后缀为.exe的可执行文件。.obj文件是目标文件不可以直接执行,所以选项D错误。故本题答案选D。
2. 对于一个正常运行的C程序,以下叙述中正确的是 。
A、程序的执行总是从main函数开始,在main函数结束
B、程序的执行总是从程序的第一个函数开始,在main函数结束
C、程序的执行总是从main函数开始,在程序的最后一个函数中结束
D、程序的执行总是从程序中的第一个函数开始,在程序的最后一个函数中结束
解析:本题考查的是C语言的函数。在C语言中,所有的函数定义,包括主函数main在内,都是平行的。C程序的执行总是从main函数开始, 完成对其它函数的调用后再返回到main函数,最后由main函数结束整个程序。一个C源程序必须有,也只能有一个主函数main。故本题答案选A。
3. 按照C语言规定的用户标识符命名规则,不能出现在标识符中的是______。
A、大写字母 B、连接符 C、数字字符 D、下划线
解析:本题考查的是标识符。C语言规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线。故本题答案B。
4. 下列叙述中正确的是______。
A、每一个C程序文件中都必须要有一个main()函数
B、在C程序中main()函数的位置是固定的
C、C程序中所有函数之间都可以相互调用,与函数所在位置无关
D、在C程序的函数中不能定义另一个函数
解析:本题考查的是函数的定义方法。 每一个C程序由多个C程序文件组成,而每个C程序都必须有一个main()函数,故每一个C程序文件中都必须有一个main()函数的说法是错误的。在C程序中所有函数都是平行的,即在定义函数时是相互独立的,一个函数并不能从属于另一个函数,即函数不能嵌套定义,函数间可以相互调用,但不能调用main()函数,main()函数的位置也不是固定的。 故本题答案为D。
5. 下列叙述错误的是______。
A、一个C语言程序只能实现一种算法
B、C程序可以由多个程序文件组成
C、C程序可以由一个或多个函数组成
D、一个C函数可以单独作为一个C程序文件存在
解析:本题考查的是C程序的构成。一个C语言程序可以实现多种算法。一个C程序可以由一个或多个源程序文件组成,一个源程序文件由一个或多个函数组成,构成C语言程序的基本单位是函数,函数也是C程序中模块化程序设计的基础,C函数可分为标准库函数和用户定义函数两类。 故本题答案为A。
6. 以下不合法的用户标识符是______。
A、j2_KEY B、Double C、4d D、_8_
解析:本题考查的是标识符。C语言规定标识符只能由字母、数字和下划线三种符号组成,而且第一个字符必须是字母或下划线。大写字母和小写字母被认为是两个不同的字符,用户在定义标识符时应做到"
见名知意",且不允许使用关键字作标识符。故本题答案为C。
7. 以下叙述中错误的是______。
A、C语言源程序经编译后生成后缀为.obj的目标程序
B、C程序经过编译、连接步骤之后才能形成一个真正可执行的二进制机器指令文件
C、用C语言编写的程序称为源程序,它以ASCII代码形式存放在一个文本文件中
D、C语言中的每条可执行语句和非执行语句最终都将被转换成二进制的机器指令
解析:本题考查的是C语言程序的基本组成。在C语言中,注释是用于协助读者更好地理解程序,它不会被系统转换成二进制,所以非执行语句是不会被转换成二进制的机器指令。故本题答案为D。
8. 以下叙述中错误的是______。
A、算法正确的程序最终一定会结束 B、算法正确的程序可以有零个输出
C、算法正确的程序可以有零个输入
D、算法正确的程序对于相同的输入一定有个相同的结果
解析:本题考查的是算法的概念。算法的目的是为了求解,"解"就是输出。算法的输出不一定就是计算机的打印输出,一个算法得到的结果就是算法的输出。没有输出的算法是没有意义的。故本题答案为B。
9. 以下四个程序中,完全正确的是______。
A、#include
main(); main()
{ {
/*programming*/ /*/programming/*/
printf("programming!n"); printf("programming!n");
} }
C、#include
main() main()
{ {
/*programming*/ /*/*programming*/*/
printf("programming!n"); printf("programming!n");
} }
解析: 本题考查的是C语言中注释的格式。 C语言中注释用"/*"和"*/"括起来,它可以出现在程序中任何合适的地方。选项A 中"main();"是一个函数声明语句,下面的大括号及其内容作为一个语句块,应放在程序的大括号中,故选取项A错误;选项B中的注释语句不正确,因为程序在编译时认别到两次"/*"作为注释的开始,但未识别到"*/"作为注释的结束,故选项B错误;选项D的"include"前缺少"#",故选项D错误。故本题答案为C。
10. 算法具有五个特性,以下选项中不属于算法特性的是______。
A、有穷性 B、简洁性 C、可行性 D、确定性
解析:本题考查的是算法的特性。有穷性、确定性、有零个或多个输入、有一个或多个输出、有效性是算法的五大特性。故本题答案为B。
11. 一个算法应该具有"确定性"等5个特性,下面对另外4个特性的描述中错误的是______。
A、有零个或多个输入 B、有零个或多个输出
C、有穷性 D、可行性
解析:本题考查的是算法的特性。故本题答案为B。
12. 请选出可用做C语言用户标识符的一组标识符______。
① void ② a3_b3 ③ For ④ 2a
define _123 _abc DO
WORD IF case sizeof
A、① B、② C、③ D、④
解析:本题的考查点是C语言的标识符。 ①中的void是C语言的关键字,不合法;③中的case和C语言的关键字,不合法;④中的2a是数字打头而且sizeof和C语言的关键字重名,不合法。故本题答案为B。
13.以下叙述中正确的是______。
A、C程序中注释部分可以出现在程序中任意合适的地方
B、花括号"{"和"}"只能作为函数体的定界符
C、构成C程序的基本单位是函数,所有函数名都可以由用户命名
D、分号是C语句之间的分隔符,不是语句的一部分
解析:本题的考查点是C程序设计的初步知识。
选项A,C程序中/*„„*/表示注释部分,注释只是给人看的,对编译和运行不起作用,可以加在程序中任何位置,所以选项A是对的;
选项B,函数体是函数的主体,从左花括号开始,到与之匹配的右花括号结束。
选项C,一个C程序中必须有且只能有一个由“main”命名的主函数,其他函数由用户自行命名。
选项D,C语句是组成C程序的基本单位,具有独立的程序功能。所有的C语句都以分号结尾。
故本题答案为A。
14.已定义c为字符型变量,则下列语句中正确的是______。
A、c='97' B、c="97"; C、c=97; D、c="a";
解析:本题的考查点是字符型变量。C语言中,字符型数据和整型数据之间可以通用。一个字符数据既可以以字符形式输出,也可以以整数形式输出。所以把整型数据赋给字符型变量,直接用c=97即可,所以选项C正确。
15.以下选项中可作为C语言合法整数的是______。
A、10110B B、0386 C、0Xffa D、x2a2
解析:本题的考查点是C语言中的整型常数。整型常数可以用十进制、八进制或十六进制表示,并分为有符号数、无符号数和长整数。由此可知选项A错;选项B,用0386表示八进制错误,因为八进制数为0-7八个数字,含有8是不对的;选项D,数字前加“0x”表示十六进制数,所以D也不对。故本题答案为C。
16. 以下选项中不能作为合法常量的是______。
A、1.234e04 B、1.234e0.4 C、1.234e+4 D、1.234e0
解析:本题考查的是常量表示法。本题选项中的几个常量都属于指数形式的实型常量。此种类型的常量要求字母e(或E)之前必需有数字,且e后面的指数必须为整数,所以本题中选项B非法。故本题答案为B。
17.与十进制数200等值的十六进制数为______。
A、A8 B、A4 C、C8 D、C4
解析:本题考查的是进制之间的转换。用十--十六进制转换法,除16,由下而上取余法。故本题答案为C。
18. 若有代数式(其中e仅代表自然对数的底数,不是变量),则以下能够正确表示该代数式的C语言表达式是______。
A、sqrt(abs(n^x+e^x)) B、sqrt(fabs(pow(n,x)+pow(x,e)))
C、sqrt(fabs(pow(n,x)+exp(x))) D、sqrt(fabs(pow(x,n)+exp(x)))
解析:本题考查的是基本函数应用。exp(x)函数功能是返回以自然数e为底,函数参数x为幂的指数值e;pow(n,x)函数功能是返回n的x次幂值n;fabs()函数功能是返回函数参数的绝对值;sqrt()用于返回函数参数的平方根。选项A中 n^x不是有效的C语言表达式,所以错误;选项B中pow(x,e)的功能是求x的值,显然也不正确;选项D中的pow(x,n)存在和选项B相同的问题。选项C正确。故本题答案选C。
exx19. 以下合法的字符型常量是______。
A、'x13' B、'081' C、'65' D、"n"
解析:本题考查的是字符常量。字符常量只能包含一个字符,因此选项C错误。字符常量只能用单引号
括起来,不能用双引号括起来,因此选项D错误。转义字符常量是以一个反斜线开头后跟一个特定的字符,用来代表某个特定的ASCII字符,反斜线后直接跟数字表示八进制(八进制不用0开头),所以选项B错误。反斜线后用小写字母x开头来表示十六进制数。故本题答案选A。
20.设有定义:float a=2,b=4,h=3;,以下C语言表达式中与代数式1/2(a+b)h计算结果不相符的是______。
A、(a+b)*h/2 B、(1/2)*(a+b)*h C、(a+b)*h*1/2 D、h/2*(a+b)
解析:两个整数相除结果为整数,如5/3的结果为1,舍去小数部分。如果参加运算的两个数中有一个数为实数,则结果是double型,因为所有实数都按double型进行运算。根据运算符优先级,先计算括号内的,故选项B中(1/2)=0,整个表达式的值为0。故本题答案为B。
121sin()32值的C语言表达式是______。 21. 以下不能正确计算代数式A、1/3*sin(1/2)*sin(1/2) B、sin(0.5)*sin(0.5)/3
C、pow(sin(0.5),2)/3 D、1/3.0*pow(sin(1.0/2),2)
解析:本题考查的是C语言表达式。如果算术运算符"/"中参与运算的变量都是整型变量,则"/"表示整除运算,所以"1/3"的值应为0,故本题答案为A。
22. 以下程序的功能是:给r输入数据后计算半径为r的圆面积s,程序在编译时出错。
main()
/* Beginning */
{int r; float s;scanf("%d",&r);
s=*∏*r*r; printf("s=%fn",s);}
出错的原因是______。
A、注释语句书写位置错误 B、存放圆半径的变量r不应该定义为整型
C、输出语句中格式描述符非法 D、计算圆面积的赋值语句中使用了非法变量
解析:本题考查的是C程序的编写。本题并未对变量"∏"作任何定义,所以编译时会出现非法字符的错误信息。 故本题答案为D。
23. 有以下程序
main()
{int x, y, z;
x=y=1;z=x++,y++,++y;
printf("%d,%d,%dn",x, y, z); }
程序运行后的输出结果是______。
A、2,3,3 B、2,3,2 C、2,3,1 D、2,2,1
解析:本题考查的是C语言的运算规则。x++:表示在使用x之后,使x的值加1;y++:表示在使用y之后,使y的值加1;++y:表示在使用y之前,使y的值加1。此题中执行z=x++,是将x的值先赋给z,所以z=1,接下来x自行加1,其结果为2;执行y++后,y=2,执行++y后,y=3。 故本题答案为C。
24. 以下选项中,值为1的表达式是______。
A、1-'0' B、1-'0' C、'1'-0 D、'0'-'0'
解析:本题考查的是C表达式的基本运算。'0'代表ASCII码为48的字符,'0' 代表ASCII码为0的字符,'1'代表ASCII码为49的字符,所以只有选项B的表达式的值为1。 故本题答案选B。
25. 有以下程序
main()
{char a1='M',a2='m';
printf("%cn",(a1,a2));}
以下叙述中正确的是______。
A、程序输出大写字母M B、程序输出小写字母m
C、格式说明符不足,编译出错 D、程序运行时产生出错信息
解析:本题考查的是逗号表达式。在逗号表达式(表达式1,表达式2)中,其运算方法是先求表达式1的值,然后求表达式2的值,整个逗号表达式的值是表达式2的值。故本题输出的是a2的值m。 故本题答案为B。
26. 有以下程序
main()
{ int a,b,d=25;
a=d/10%9;
b=a&&(-1);
printf("%d,%dn",a,b);}
程序运行后的输出结果是______。
A、6,1 B、2,1 C、6,0 D、2,0
解析:本题考查的是算术运算符。如果算术运算符"/"中参与运算的变量都是整型变量,则"/"表示整除运算,"%"表示求余。本题中"a=d/10%9;"的值为25/10%9=2;"b=a&&(-1);"为2&&(-1)=1(注意:-1表示真,只有0才表示假),所以a,b的值分别为2,1。故本题答案为B。
27. 若整型变量a、b、c、d中的值依次为:1、4、3、2
则条件表达式a
A、1 B、2 C、3 D、4
解析:本题考查的是条件表达式。本题先求的是a
28. 若x和y代表整型数,以下表达式中不能正确表示数学关系|x-y|<10的是______。
A、abs(x-y)<10 B、x-y>-10&&x-y<10
C、!(x-y)<-10||!(y-x)>10 D、(x-y)*(x-y)<100
解析:本题考查的是表达式。选项A中,abs()本身就是求绝对值的函数,所以是正确的;选项B是把|x-y|<10表示成了数学表达式中的-10<(x-y)<10,然后再用c语言规则表示出来的;选项D相当于把|x-y|<10两边同时平方,是正确的;而选项C中!(x-y)<-10相当于(x-y)>=-10,!(y-x)>10相当于(x-y)>=-10。故选项C相当于(x-y)>=-10,所以错误。故本题答案为C。
29.有以下程序
main()
{ char a='a',b;
printf("%c,",++a);printf("%cn",b=a++);}
程序运行后的输出结果是______。
A、b,b B、b,c C、a,b D、a,c
解析:本题考查的是++运算符。本题中printf("%c,",++a)先将a加,再执行此条语句,输出b,而printf("%cn",b=a++)是先输出刚才a的值(刚才的a++表示a=a+1,所以是b),然后再加1。所以答案为A。
30.以下程序段中与语句k=a>b?(b>c?1:0):0;功能等价的是______。
A、if((a>b)&&(b>c))k=1; B、if((a>b)||(b>c))k=1;
else k=0; else k=0;
C、if(a<=b) k=0; D、if(a>b) k=1;
else if(b<=c) k=1; else if(b>c) k=1;
else k=0;
解析:本题考查的是条件表达式。本题是先比较a,b,如果a>b成立则执行(b>c?1:0),如果b>c成立则结果为1,其它情况则为0。即只有a>b与b>c同时成立时k值才能为1。故本题答案为A。
31. 以下叙述中错误的是______。
A、C语句必须以分号结束 B、复合语句在语法上被看作一条语句
C、空语句出现在任何位置都不会影响程序运行
D、赋值表达式末尾加分号就构成赋值语句
解析:本题考查的是C语句。"空语句出现在任何位置都不会影响程序运行"这句话是错误的,例如在for循环中,循环条件语句为空时,则不判断循环条件,循环将无终止地进行下去,导致了此循环为死循环。 故本题答案为C。
32. #include
main()
{ char c1,c2,c3,c4,c5,c6;
scanf("%c%c%c%c",&c1,&c2,&c3,&c4);
c5=getchar(); c6=getchar();
putchar(c1); putchar(c2);
printf("%c%cn",c5,c6);
}
程序运行后,若从键盘输入(从第1列开始)
123<回车>
45678<回车>
则输出结果是______。
A、1267 B、1256 C、1278 D、1245
解析:本题考查的是字符输入输出函数的应用。 getchar()函数只能接收一个字符,即使输入多个字符后再按回车还是只能将第一个字符读入。scanf()和printf()是按格式输入输出的函数,当输入123<回车>,scanf()分别读入字符"1"、"2"、"3"、"<回车>";接下来输入45678<回车>,则getchar()读入字符"4"赋值给c5,字符"5" 赋值给c6,故本题答案为D。
33. 若以下选项中的变量已正确定义,则正确的赋值语句是______。
A、x1=26.8%3; B、1+2=x2; C、x3=0x12; D、x4=1+2=3;
解析:正确的赋值语句中的左值不能为常量或表达式,右值不能为变量或表达式。
选项A中右值为表达式,明显是错误的;选项B中,左值为表达式,明显是不对的。选项D中,表达式x4=1+2=3,是先执行赋值表达式1+2=3,这本身就是错误的,1+2不是变量,不能赋值。故本题答案为C。
34. 有以下程序
main()
{ int m,n,p;
scanf("m=%dn=%dp=%d",&m,&n,&p);
printf("%d%d%dn",m,n,p);}
若想从键盘上输入数据,使变量m中的值为123,n中的值为456,p中的值为789,则正确的输入是______。
A、m=123n=456p=789 B、m=123 n=456 p=789
C、m=123,n=456,p=789 D、123 456 789
解析:本题考查的是格式输入函数。如果在"格式控制"字符串中除了格式说明以外还有其他字符,则在输入数据时应输入与这些字符相同的字符。根据本题的数据输入形式说明在输入数据时,必须输入"m="、"n="、"p="字符,且中间不能含有空格。故本题答案为A。
35.有以下程序
main()
{ char a,b,c,d;
scanf("%c,%c,%d,%d",&a,&b,&c,&d);
printf("%c,%c,%c,%cn",a,b,c,d);}
若运行时从键盘上输入:6,5,65,66↙。则输出结果是______。
A、6,5,A,B B、6,5,65,66 C、6,5,6,5 D、6,5,6,6
解析:本题考查的是格式字符的输入和输出。将字符常量6和5所对应的内存的ASCII码翻译成字符常量为6和5输出,将内存中的整型数65和66对应的字符常量即A和B输出。所以此题答案为A。
36. 以下程序的输出结果是______。
main()
{int k=17;
printf("%d,%o,%xn",k,k,k);}
A、17,021,0x11 B、17,17,17 C、17,0x11,021 D、17,21,11
解析:本题的考查点是不同格式的数据输出。printf函数对不同类型的数据用不同的格式字符,"%d"是以十进制形式输出整数(正数不输出符号);"%o"以八进制无符号形式输出整数(不包括前导符0);"%x"以十六进制无符号形式输出整数(不包括前导符0x)。本题答案为D。
37.有定义语句:int x,y;若要通过scanf("%d,%d",&x,&y);语句使变量x得到数值11,变量y得到数值12,下面四组输入形式中,错误的是______。
A、11 12↙ B、11,12↙ C、11, 12↙ D、11,↙12↙
解析:本题的考查点是格式输入函数。如果在“格式控制”字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符。所以输入的两个数字之间的逗号是不可少的。故本题答案为A。
38.设变量x为float型且已赋值,则以下语句中能将x中的数值保留到小数点后两位,并将第三位四舍五入的是______。
A、x=x*100+0.5/100.0; B、x=(x*100+0.5)/100.0
C、x=(int)(x*100+0.5)/100.0; D、x=(x/100+0.5)/100.0;
解析:本题的考查点是实型数据。对于此类题目,我们可用排除法,题目要求保留到小数点后两位,选项A、B、D都不合题面要求。选项C中,x=(int)(x*100+0.5)/100.0中,x为float型,所以小数点后有6位小数,x*100后有4位,x*100+0.5仍为4位,且在这里已经将第三位四舍五入了,取整后再除以100.0,结果中小数点后为2位。故本题答案为C。
39.有以下程序
main()
{ int a=666,b=888;
printf("%dn",a,b);}
程序运行后的输出结果是______。
A、错误信息 B、666 C、888 D、666,888
解析:本题考查的是输出格式。printf()函数中,当格式转换说明符个数少于输出项个数时,多余的输出项不予输出。所以本题答案为B。
40.有以下程序
main()
{ int x=102,y=012;
printf("%2d,%2dn",x,y);}
执行后输出结果是______。
A、10,01 B、02,12 C、102,10 D、02,10
解析:y=012表示将八进制数12赋给变量y。d格式符,用来输出十进制整数。%md,m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。本题是将八进制数12也输出为十进制数,八进制数12转换为十进制数为10,所以输出结果为102,10。故本题答案为C。
二)选择结构程序设计
1. 设变量x和y均已正确定义并赋值。以下if语句中,在编译时将产生错误信息的是______。
A、if(x++); B、if(x>y && y!=0); C、if(x>0) x-- D、if(y<0) {;}
else y++; else x++;
解析:本题考查的是if语句。if后表达式两侧的圆括号不可少,最后是一条语句或是用花括号括起来的一组语句。选项A和B是在表达式后跟了一条空语句,选项D是在表达式后跟了一组空语句,选项C中x--是表达式而不是语句,所以在编译时会出现错误信息。故本题答案选C。
2. 有以下程序
main()
{ int i;
for(i=1;i<=40;i++)
{ if(i++%5==0)
if(++i%8==0) printf ("%d",i);}
printf("n"); }
执行后的输出结果是______。
A、5 B、24 C、32 D、40
解析:本题考查的是if语句的应用。在满足for 语句条件下,第一个if语句的条件是指i先对5取余后,再自行加1;第二个if语句的条件是指:i=i+1后,再对8取余。故本题答案选C。
3. 在嵌套使用if语句时,C语言规定else总是______。
A、和之前与其具有相同缩进位置的if配对 B、和之前与其最近的if配对
C、和之前与其最近的且不带else的if配对 D、和之前的第一个if配对
解析:本题考查的是if语句的使用规则。在嵌套使用if语句时,C语言规定else总是和之前与其最近的且不带else的if配对。故本题答案为C。
4. 有以下程序
main()
{ int i=1,j=2,k=3;
if(i++==1&&(++j==3||k++==3))
printf("%d %d %dn",i,j,k); }
程序运行后的输出结果是______。
A、1 2 3 B、2 3 4 C、2 2 3 D、2 3 3
解析:本题考查的是条件判断语句。本题中执行"i++==1&&(++j==3||k++==3)"时,先执行i++==1,由于i++是先运算,后自加,所以表达式"i++==1"的值为真,其值为1,然后执行括号中的表达式,由于++j是先自加,后运算,所以表达式"++j==3" 的值为真,根据短路原理,右边的表达式"k++==3"不再进行运算,直接得出括中表达的值为1,相与后整个表达式的值也为1,输出i,j,k时,由于未执行过k,所以它们的值分别为2,3,3。故本题的答案为D。
5.有以下程序:
main()
{ int i;
for(i=0;i<3;i++)
switch(i)
{case 0:printf("%d",i);
case 2:printf("%d",i);
default:printf("%d",i);}}
程序运行后的输出结果是______。
A、022111 B、021021 C、000122 D、012
解析:此题考点是switch语句。switch语句执行完一个case后面的语句后,流程控制转移到下一个case继续执行。“case 常量表达式”只是起语句标号作用,并不是在该处进行条件判断。在执行switch语句时,根据switch后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。如果想在执行一个case分支后,使流程跳出switch结构,即终止switch语句的执行。可以用一个break语句来达到此目的。本题中没有使用break终止switch语句的执行。在此题中当i=0时,执行第一个case语句,因为它后面没有break,所以一直到执行完default语句结束,再执行下一循环。故本题答案为C。
6. 下列条件语句中,功能与其他语句不同的是______。
A、if(a) printf("%dn",x); else printf("%dn",y);
B、if(a==0) printf("%dn",y); else printf("%dn",x);
C、if (a!=0) printf("%dn",x); else printf("%dn",y);
D、if(a==0) printf("%dn",x); else printf("%dn",y);
解析:此题考的是if语句中逻辑表达式值的判断。if(a)表示a值为真(即不等于0都为真)的话,就输出x的值,否则输出y的值;if(a==0)表示如果a与0等值,即a不为真,就输出y的值,否则输出x的值,此与选项A等价;再看选项C,a不等于0,即为真,输出x,否则输出y,与前两个都同意;而选项D恰好与前几项的意思相反,它是a为0时,输出x,为真时输出y。故本题答案为D。
7.有以下程序
main()
{ char k; int i;
for(i=1;i<3;i++)
{ scanf("%c",&k);
switch(k)
{ case '0': printf("anothern");
case '1': printf("numbern");}
}}
程序运行时,从键盘输入:01↙,程序执行后的输出结果是______。
A、another B、another C、another D、number
number number number number
another number
解析:此题考点是switch语句。本题中没有使用break终止switch语句的执行,本题当k为0时,执行完case '0'后将继续执行case '1'。故本题答案为C。
8.以下4个选项,不能看作一条语句的是______。
A、{;} B、a=0,b=0,c=0; C、if(a>0); D、if(b==0)m=1;n=2;
解析:if语句是用来判定所给的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。在if和else后面可以只含一个内嵌的操作语句,也可以有多个操作语句,此时用花括号“{}”将几个语句括起来成为一个复合语句。选项D中没有将两个操作语句括起来,不能看作一条语句。故本题答案为D。
9.以下程序的输出结果是______。
main()
{ int a=-1,b=1, k;
if((++a<0)&&!(b--<=0))
printf("%d %dn",a,b);
else
printf("%d %dn",b,a);
}
A、-1 1 B、0 1 C、1 0 D、0 0
解析:本题的考查点是if条件的判断。++a是先运算后使用,b--是先使用后运算。执行++a后,a值为0,不满足条件,所以a为0,b仍为1,接下去执行else语句,输出1 0。故本题答案为C。
10. 有以下程序
main()
{ int c;
while((c=getchar() )!='n') {
switch(c-'2') {
case 0: case 1: putchar(c+4);
case 2:putchar(c+4);break;
case 3:putchar(c+3);
default:putchar(c+2);break; } }
}
A、668977 B、668966 C、66778777 D、6688766
解析:本题的考查点是switch()语句。getchar()函数是从键盘接受一个字符输入;当用户键入的字符不是回车符时,会进入一个多分支选择语句,根据表达式c-'2'的值进行分支选择;putchar()是在屏幕上打印一个字符,最后的结果应当为 668977。故本题答案为A。
11.有定义语句:int a=1,b=2,c=3,x;,则以下选项中各程序段执行后,x的值不为3的是______。
A、if (c else if (b else x=3; else x=1; C、if (a<3) x=3; D、if (a if (a<2) x=2; if (b if (a<1) x=1; if (c 解析:本题的考查点是if语句。选项A,因为前面两个条件都不满足,所以执行最后一种操作,x=3;选项B,a<3成立,执行第一种操作,x=3;选项C,a<3成立,执行第一种操作,x=3;a<2成立,执行第二种操作,此时x=2;a<1不成立,最后的不执行,所以执行此段程序后x=2;选项ф,a 12.以下关于逻辑运算符两侧运算对象的叙述中正确的是______ A、只能是整数0或1 B、只能是整数0或非0整数 C、可以是结构体类型的数据 D、可以是任意合法的表达式 解析:本题考查的是C语言运算符的基本应用。逻辑运算符两侧的运算对象不但可以是0和1,也可以是任意基本类型或指针类型的数据,还可以是任意合法表达式。故本题答案为D。 13. 若x是int型变量,且有下面的程序片段 for(x=3;x<6;x++) printf((x%2)?("**%d"):("##%dn"),x); 上面程序片段的输出结果是______。 ① **3 ② ##3 ③ ##3 ④ **3##4 ##4 **4 **4##5 **5 **5 ##5 A、① B、② C、③ D、④ 解析:本题的考查点是条件运算符。本题答案为D。 14.有以下计算公式 若程序前面已在命令行中包含math.h文件,不能够正确计算上述公式的程序段是______。 A、if(x>=0) y=sqrt(x); B、y=sqrt(x); else y=sqrt(-x); if(x<0) y=sqrt(-x); C、if(x>=0) y=sqrt(x); D、y=sqrt(x>=0?x:-x); if(x<0) y=sqrt(-x); 解析:题面公式的意思是当x大于或等于0,则y的值就取x的平方根,如果x的值小于0,则y的值就取x的相反数的平方根。sqrt(number)用于返回函数参数的平方根,如果number的值为负数,则返回零。选项B的功能是取x(无论x的值为正、负还是零)的平方根赋值给y,然后再判断x是否小于0,如果小于0,则取x的相反数的平方根赋值给y。这显然不符合题面公式的意思,所以选项B的程序不能正确计算题面公式。故本题答案为B。 15.下述程序,______是正确的判断。 #include void main() {int x,a,b; scanf(“%d”,&x); if(x>0) a=10;b=20; else a=-10;b=-20; printf(“%d,%dn”,a,b); } A、输入数据1,输出10,20 B、输入数据-1,输出-10,-20 C、输入数据0,输出-10,-20 D、程序有语法错误,不能通过编译 解析:本题考查的是if语句的基本应用。执行程序,编译程序给出错误信息提示:Mispalced else in function main。故本题答案为D。 三)循环结构程序设计 1. 有以下程序 main() { int i, j; for(i=1;i<4;i++) { for(j=i;j<4;j++) printf("%d*%d=%d ",i,j,i*j); printf("n");} } 程序运行后的输出结果是 。 A、1*1=1 1*2=2 1*3=3 B、1*1=1 1*2=2 1*3=3 2*1=2 2*2=4 2*2=4 2*3=6 3*1=3 3*3=9 C、1*1=1 D、1*1=1 1*2=2 2*2=4 2*1=2 2*2=4 1*3=3 2*3=6 3*3=9 3*1=3 3*2=6 3*3=9 解析:本题考查的是循环嵌套。在一个循环体内又完整地包含了另一个循环,称为循环嵌套。外循环i的值分别为1、2、3,当i=1,内循环j=1时,输出1*1=1;当内循环j=2时,输出1*2=2;当内循环j=3时,输出1*3=3;当i=2,内循环j=2时,输出2*2=4;当内循环j=3时,输出2*3=6;当i=3,内循环j=3时,输出3*3=9。故本题答案选B。 2. 有以下程序 main() { int k=5, n=0; do {switch(k) {case 1: case 3: n+=1; k--; break; default: n=0; k--; case 2: case 4: n+=2; k--; break;} printf("% d",n); }while(k>0 && n<5);} 程序运行后的输出结果是______。 A、235 B、0235 C、02356 D、2356 解析:本题考查的是循环嵌套。do-while语句的特点是先执行循环体,然后判断循环条件是否成立,当循环条件的值为0时循环结束。执行switch语句,寻找与5吻合的case 5分支,没有寻找到,于是执行default后的语句,n=0,k的值变为4,继续执行switch语句,寻找与4吻合的case 4分支,开始执行其后的各语句:n+=2=0+2=2,k的值变为3,遇到break语句跳出该switch语句体。执行printf语句输出2;此时n=2,k=3依旧满足do-while循环条件,将用同样的方式再次执行switch语句,直到n=5时不再满足do-while循环条件退出所有循环。此时输出的结果为235。故本题答案选A。 3. 以下叙述中正确的是______。 A、break语句只能用于switch语句体中 B、continue语句的作用是:使程序的执行流程跳出包含它的所有循环 C、break语句只能用在循环体内和switch语句体中 D、在循环内使用break语句和continue语句的作用相同 解析:本题考查的是break与continue的特性。break语句的使用说明:(1)只能用在循环体内和switch语句体内使用break语句。(2)当break出现在循环体中的switch语句体内时,其作用只是跳出该switch语句体。当break出现在循环体中,但并不在switch语句体内时,则在执行break后,跳出本层循环体。故本题答案选C。 4.有以下程序 main() { int k=5; while(--k) printf("%d",k-=3); printf("n");} 执行后的输出结果是______。 A、1 B、2 C、4 D、死循环 解析:本题考查的是while语句的应用。此题中首先给k赋初值5,执行while语句:中的表达式"--k",k先自行减1结果为4,满足while执行条件输出:k=k-3=4-3=1;此时输出结果为1。返回执行while语句,重复上面的操作,while后的表达式为0,退出循环,所以最后的输出结果为1。 故本题答案为A。 5. 有以下程序 main() { int i,j,x=0; for(i=0;i<2;i++) { x++; for(j=0;j<=3;j++) { if(j%2) continue; x++; } x++;} printf("x=%dn",x);} 程序执行后的输出结果是______。 A、x=4 B、x=8 C、x=6 D、x=12 解析:本题考查的是循环嵌套和continue语句的应用。当外层循环for(i=0;i<2;i++)满足条件的情况下执行循环体,循环体中包含了嵌套的内层循环for(j=0;j<=3,j++){„„},在内层循环中,当if条件语句不成立时执行continue语句,其作用是跳过"x++;",继续执行内层循环的for语句,直到内层循环条件不满足,则执行跳出内层循环,执行外层循环的"x++;"语句,然后再对i进行判断,直到外层循环条件不满足,跳出外层循环,执行输出语句,结果为8。故本题答案为B。 6. 在以下给出的表达式中,与while(E)中的(E)不等价的表达式是______。 A、(!E==0) B、(E>0||E<0) C、(E==0) D、(E!=0) 解析:本题考查的是while条件表达式的判断。while(表达式)语句用来实现"当型"循环结构,当表达式为非0值时,执行while语句中的内嵌语句。选项A非零即为1,选项B与选项D的结果也为1,只有选项C为0。故本题答案为C。 7. 有以下程序 main() { int k=5,n=0; while(k>0) {switch(k) {default : break; case 1 : n+=k; case 2 : case 3 : n+=k;} k--;} printf("%dn",n);} 程序运行后的输出结果是______。 A、4 B、5 C、6 D、7 解析:本题考查的是while语句。在本题中,当k=5和k=4的时候,case都没有与其匹配的值,所以执行了default语句;当k=3时,执行"case 3 : n+=k;"得n=3,然后执行default;当k=2时,执行"case 2 : case 3 : n+=k;"得n=5,然后执行default;当k=1时,执行"case 1 : n+=k; case 2 : case 3 : n+=k;"使得n加两次k,得到n=7。 故本题答案为D。 8. 有以下程序段 int n,t=1,s=0; scanf("%d",&n); do{ s=s+t; t=t-2; }while (t!=n); 为使此程序段不陷入死循环,从键盘输入的数据应该是______。 A、任意正奇数 B、任意负偶数 C、任意正偶数 D、任意负奇数 解析:本题考查的是while循环语句。要使得程序段不陷入死循环,则必须存在终止循环的条件"t=n",由于t的初始值为1,且每执行一次循环都会使得t的值减2,故执行本程序后t有可能的最大值为-1,然后,依次减2,所以键盘输入的n的值必须是t的值之一,即为任意负奇数。 故本题答案为D。 9. 设变量已正确定义,则以下能正确计算f=n!的程序段是______。 A、f=0; for(i=1;i<=n;i++) f*=i; B、f=1; for(i=1;i C、f=1; for(i=n;i>1;i++) f*=i; D、f=1; for(i=n;i>=2;i--) f*=i; 解析:本题考查的是for语句。n!=n*(n-1)*„„*2*1,由于选项A中f的初值为0,所以循环n次后,f值依然为0,故选项A错误;选项B中循环的终止条件是"i 永远不会出现不满足条件"i>1"的值,所以出现死循环。故本题答案为D。 10. 有以下程序 main() { int a=1,b; for(b=1;b<=10;b++) { if(a>=8) break; if(a%2==1){a+=5;continue;} a-=3; } printf("%dn",b); } 程序运行后的输出结果是______。 A、3 B、4 C、5 D、6 解析:本题考查的是break与continue的区别。本题具体执行过程如下: a=1,b=1:a>=8不成立,判断a%2==1成立,a+=5则a=6,continue,执行下一次循环; a=6,b=2:a>=8不成立,判断a%2==1不成立,a-=3则a=3,执行下一次循环; a=3,b=3:a>=8不成立,判断a%2==1成立,a+=5则a=8,continue,执行下一次循环; a=8,b=4:a>=8成立,break,结束整个循环,输出b的值4。 故本题答案为B。 11.有以下程序 main() { int i=0,s=0; for (;;) {if(i==3||i==5) continue; if (i==6) break; i++;s+=i;}; printf("%dn",s);} 程序运行后的输出结果是______。 A、10 B、13 C、21 D、程序进入死循环 解析:此题考的是continue的用法。此题中,执行时首先是i=0,两个if条件都不成立,则接下执行i++,s+=i;第二次循环继续执行,判断if语句,当执行到i=3时,就执行continue,跳过它下面的语句,继续执行下一轮循环,而又因为此时在for循环中并没有使变量i增值,所以这轮循环的i值还是3,继续continue,无终止条件,进入死循环。故本题答案为D。 12.下面程序的功能是输出以下形式的金字塔图案: * *** ***** ******* main() { int i,j; for(i=1;i<=4;i++) { for(j=1;j<=4-i;j++)printf(" "); for(j=1;j<=______;j++)printf("*"); printf("n");} } 在下划线处应填入的是______。 A、i B、2*i-1 C、2*i+1 D、i+2 解析:本题是找出打印*号的条件,从图中我们可以找到规律,第一行一个*,第二行3个,第三行5个„„,也就是每行中*的个数恰好是行数的2倍减一个,由此不难得出,横线处应当填入2*i-1。故本题答案为B。 13.有以下程序: main() { int i,s=0; for(i=1;i<10;i+=2) s+=i+1; printf("%dn",s);} 程序执行后的输出结果是______。 A、自然数1~9的累加和 B、自然数1~10的累加和 C、自然数1~9中奇数之和 D、自然数1~10中偶数之和 解析:通过for(i=1;i<10;i+=2)可知,i为从1开始的小于10的奇数,即1,3,5,7,9,i+1即为2,4,6,8,10,即自然数1到10中的偶数,s+=i+1就是累加这几个偶数。故本题答案为D。 14.有以下程序: main() { int x=0,y=5,z=3; while(z-->0&&++x<5) y=y-1; printf("%d,%d,%dn",x,y,z);} 程序执行后的输出结果是______。 A、3,2,0 B、3,2,-1 C、4,3,-1 D、5,-2,-5 解析:当x=0,y=5,z=3时,z-->0&&++x<5成立,执行y=y-1;此时y=4,z=2,x=1。执行后条件仍然成立,继续执行y=y-1,此时y=y-1=3,z=1,x=2,以此类推,直至条件不成立。当z为0时条件不成立,执行后z为-1。故本题答案为B。 15.有以下程序 main() { int i,n=0; for( i=2;i<5;i++) {do { if(i%3) continue; n++;}while(!i); n++;} printf("n=%dn",n);} 程序执行后输出结果是______。 A、n=5 B、n=2 C、n=3 D、n=4 解析:当i=2时,i%3为真,继续执行n++;此时n=1,!i为假,结束while循环,执行n++,此时n为2。当i=3时,i%3=0,跳出循环。当i=4时,i%3=1为真,继续执行n++,此时n为3,!i为假,结束while循环,继续往下执行n++,此时n为4。故本题答案为D。 16. 执行下面程序片段的结果是______。 int x=23; do{printf("%2d",x--);}while(!x); A、打印出321 B、打印出23 C、不打印任何内容 D、陷入死循环 解析:本题的考查点是do-while循环条件的判断。x--是自减运算,先使用x的值,后进行自减运算,所以打印出来的结果应当为23。故本题答案为B。 17. 以下程序的输出结果是______。 main() { int n=4; while(n--)printf("%d ",--n);} A、2 0 B、3 1 C、3 2 1 D、2 1 0 解析:本题的考查点是while语句的判断。n--是先使用后运算,--n是先运算后使用。n=4时,执行n--后,n变为3,执行--n后,n变为2,所以,第一次输出时,n为2;同上过程,第二次输出时,n为0。故本题答案为A。 18. C语言中,下列叙述正确的是______。 A、不能使用do-while语句构成的循环 B、do-while语句构成的循环,必须用break语句才能退出 C、do-while语句构成的循环,当while语句中的表达式值为非零时结束循环 D、do-while语句构成的循环,当while语句中的表达式值为零时结束循环 解析:本题的考查点是do-while语句。本题答案为D。 19.要求以下程序的功能是计算:s=1+1/2+1/3+„+1/10。 main() { int n; float s; s=1.0; for(n=10;n>1;n--) s=s+1/n; printf("%6.4fn",s);} 程序运行后输出结果错误,导致错误结果的程序行是 A、s=1.0; B、for(n=10;n>1;n--) C、s=s+1/n; D、printf("%6.4fn",s); 解析:本题的考查点是查找程序运行错误的原因。主要考察运算中字符的转换。s=s+1/n;因为n为整型,所以1/n都为0。这就是导致本题出错的原因。s=s+1/n应改为s=s+1.0/n。故本题答案为C。 20. 对以下程序段,下列叙述正确的是______。 int k=10; while(k=0) k=k-1; A、循环体执行了10次 B、循环是无限循环 C、循环体语句一次也不执行 D、循环体语句执行了一次 解析:表达式k=0是一个赋值表达式而不是一个关系表达式,将0赋值给k,且此表达式的值也为0,所以循环体语句一次也不执行。本题答案为C。 四)函数 1. 有以下程序 int a=4; int f(int n) { int t=0; static int a=5; if(n%2) {int a=6; t+=a++;} else {int a=7; t+=a++;} return t+a++;} main() { int s=a,i=0; for(;i<2;i++) s+=f(i); printf("%dn",s);} 程序运行后的输出结果是______。 A、24 B、28 C、32 D、36 解析:本题考查的是函数调用和变量的作用域。在主函数main()中定义了两个变量s和i,同时给s赋初值a=4,i赋初值0。当i=0时,执行"s+=f(i);"语句,调用f()函数并将i的初值0传递给形参n。首先执行if语句中的条件:n%3,条件为假,执行else下的语句,a=7,t=7+0=7,使用return返回t,t=7+(a++)=7+5=12,此时a运算完后自行加1为6;返回主函数中,s=4+12=16。当i=1时,执行"s+=f(i);"语句,调用f()函数并将i的初值1传递给形参n。首先执行if语句中的条件: n%3,条件为真,执行if下的语句,t=0,a=6,t=0+6=6,使用return返回t,t=6+6=12,返回主函数中,s=16+12=28。最后的输出结果为28。故本题答案选B。 2. 有以下程序 fun (int x, int y) { static int m=0,i=2; i+=m+1; m=i+x+y; return m;} main() { int j=1,m=1,k; k=fun(j,m); printf("%d,",k); k=fun(j,m); printf("%dn",k);} 执行后的输出结果是______。 A、5,5 B、5,11 C、11,11 D、11,5 解析:本题考查的是局部变量在程序中的应用。将j和m的值带入函数fun中,第一次调用完fun()后, m和i的值分别为5和3且要保留,并在第二次调用时使用,这是因为两者都是局部静态变量。所以最后的结果是5和11。 故本题答案为B。 3. 有以下程序 fun(int x, int y){return(x+y);} main() { int a=1,b=2,c=3,sum; sum=fun((a++,b++,a+b),c++); printf("%dn",sum);} 执行后的输出结果是______。 A、6 B、7 C、8 D、9 解析:本题考查的是函数的正确调用。在fun((a++,b++,a+b),c++) 中,先算括号内的(a++,b++,a+b) 逗号运算,即先算出a++的值,a=2;再算出b++的值,b=3;最后算出a+b的值,a+b=2+3=5,整个逗号表达式的值为最后a+b的值即为5;接下来调用fun 函数,此时原语句变为:sum=fun(5,c++); c++表示在使用c以后再将c的值加1,结果为:5+3=8。故本题答案为C。 4. 有以下程序 fun(int x) { int p; if(x==0||x==1) return(3); p=x-fun(x-2); return p;} main() { printf("%dn",fun(7));} 执行后的输出结果是______。 A、7 B、3 C、2 D、0 解析:本题考查的是函数的递归调用。函数fun是一个递归调用函数,首先主函数将实参7传递给函数fun中的形参x,由于7≠0,7≠1,不满足if条件,所以执行下面的p=x-fun(x-2);语句,此语句继续调用 它本身,直到当x=1时,返回函数值3代入到调用它的表达式中,依此类推„„,最终p的值为2。故本题答案为C。 5. 有以下程序 void fun2 (char a, char b) {printf ("%c %c", a,b);} char a='A',b='B'; void fun1(){ a='C' ; b='D'; } main() { fun1(); printf("%c %c ",a,b); fun2 ('E', 'F');} 程序的运行结果是______。 A、C D E F B、A B E F C、A B C D D、C D A B 解析:本题考查的是全局变量和局部变量的区别。本题答案为A。 6. 有以下程序 int fun1(double a){return a*=a;} int fun2(double x,double y) { double a=0,b=0; a=fun1(x);b=fun1(y); return(int)(a+b);} main() {double w;w=fun2(1.1,2.0);„„} 程序执行后变量w中的值是______。 A、5.21 B、5 C、5.0 D、0.0 解析:本题考查的是数值类型的定义与强制转换。本题在进行调用函数fun2()时,又对函数fun1()进行了调用,由于函数fun1()定义为整型,所以第一次调用fun1()时返回的值为1,然后再将1赋值给a,此时由于a为double型,则系统自动类型转换,将1转换成了1.000000赋值给了变量a,以此类推,得b的值为4.000000,然后通过"return(int)(a+b);"将a+b的值强制转换为int型5返回给主函数,此时又由w的类型为double,所以返回的整型值5又被转换为double型。故输出结果为5.0。故本题答案为C。 7. 以下叙述中错误的是______。 A、C程序必须由一个或一个以上的函数组成 B、函数调用可以作为一个独立的语句存在 C、若函数有返回值,必须通过return语句返回 D、函数形参的值也可以传回给对应的实参 解析:本题考查的是函数的概念。在执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数的实参的值,也就是说形参的值是不传回给对应的实参的。本题答案为D。 8. 有以下程序 int fun(int n) { if(n==1) return 1; else return(n+fun(n-1));} main() { int x; scanf("%d",&x);x=fun(x);printf("%dn",x);} 执行程序时,给变量x输入10,程序的输出结果是______。 A、55 B、54 C、65 D、45 解析:本题考查的是函数的递归调用。fun函数共被调用8次,即fun(9)、fun(8)、fun(7)、fun(6)、fun(5)、fun(4) 、fun(3) 、fun(2),n=10+9+8+7+6+5+4+3+2+1=55, 所以x=55。故本题答案为A。 9. 若各选项中所有变量已正确定义,函数fun中通过return语句返回一个函数值,以下选项中错误的程序是______。 A、main() B、float fun(int a,int b){„„} {„„ x=fun(2,10); „„} main() float fun(int a,int b){ „„} {„„ x=fun(i,j); „„} C、float fun(int int); D、main() main() { float fun(int i, int j); {„„ x=fun(2,10); „„} „„ x=fun(i,j); „„} float fun(int a,int b){ „„} float fun(int a,int b){ „„} 解析:本题考查的是函数的调用。当程序中定义了多个函数时,通常情况下是先定义后调用,若被调函数定义在主调函数之后,则必须先声明后调用。故本题答案为A。 10. 以下程序的输出结果是______。 main( ) { int w=5; fun(w); printf("n"); } fun(int k) { if(k>0) fun(k-1); printf("%d",k);} A、5 4 3 2 1 B、0 1 2 3 4 5 C、1 2 3 4 5 D、5 4 3 2 1 0 解析:本题的考查点是函数的递归调用。fun函数共被调用6次,即fun(5)、fun(4)、fun(3)、fun(2)、fun(1)、fun(0)。本题答案为B。 11. 设函数fun的定义形式为 void fun(char ch,float x) { „„ } 则以下对函数fun的调用语句中,正确的是______。 A、fun("abc",3.0); B、t=fun('D',16.5); C、fun('65',2.8); D、fun(32,32); 解析:本题考查的是函数的调用。对有参函数进行调用时,实参与形参的类型应相同或赋值兼容。由于整型数据与字符型数据可以通用,所以实参"32"与形参"ch"的类型是一致的;又因为整型变量给浮点型变量赋值是相兼容的,所以选项D是正确的调用。故本题答案为D。 12.有以下程序 int f1(int x,int y){return x>y?x:y;} int f2(int x,int y){return x>y?y:x;} main() { int a=4,b=3,c=5,d=2,e,f,g; e=f2(f1(a,b),f1(c,d)); f=f1(f2(a,b),f2(c,d)); g=a+b+c+d-e-f; printf("%d,%d,%dn",e,f,g); } 程序运行后的输出结果是______。 A、4,3,7 B、3,4,7 C、5,2,7 D、2,5,7 解析:本题考查的是函数的调用。函数f1的功能是返回两个数中比较大的值,f2的功能是返回两个数中比较小的值。故本题答案为A。 13.在函数调用过程中,如果函数funA调用了函数 funB,函数funB又调用了函数funA,则 ______。 A、称为函数的直接递归调用 B、称为函数的间接递归调用 C、称为函数的循环调用 D、C语言中不允许这样的递归调用 解析:本题考的是函数的递归调用。本题答案为B。 14.以下叙述中正确的是______。 A、局部变量说明为static存储类,其生存期将得到延长 B、全局变量说明为static存储类,其作用域将被扩大 C、任何存储类的变量在未赋初值时,其值都是不确定的 D、形参可以使用的存储类说明符与局部变量完全相同 解析:此题考的是变量的作用域。本题答案选A。 15.有以下程序 void f(int v, int w) { int t; t=v; v=w; w=t;} main() { int x=1,y=3,z=2; if(x>y) f(x,y); else if(y>z) f(y,z); else f(x,z); printf("%d,%d,%dn",x,y,z);} 执行后输出结果______。 A、1,2,3 B、3,1,2 C、1,3,2 D、2,3,1 解析:if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。本题中条件y>z为真,所以执行f(y,z)。在函数调用开始时,y的值传送给v,z的值传送给w,执行完f函数后,v和w的值是互换了,但main函数中的y和z并未互换。也就是说由于“单向传送”的“值传递”方式,形参值的改变无法传给实参。故本题答案为C。 16.若程序中定义了以下函数: double myadd(double a,double b) {return(a+b);} 并将其放在调用语句之后,则在调用之前应该对函数进行说明,以下选项中错误的说明是______。 A、double myadd(double a, b); B、double myadd(double,double); C、double myadd(double b, double a); D、double myadd(double x, double y); 解析:对被调函数进行说明的作用是告诉系统:在本函数中将要用到的某函数是返回值的类型,以便在主调函数中按此类型对函数值作相应的处理。本题选项A中,函数参数列表中,不可以用一类型声明多个变量,即变量b没有被声明,所以出错。故本题答案为A。 17. 下面程序的输出是______。 int m=13; int fun2(int x,int y) { int m=3; return(x*y-m); } main( ) { int a=7,b=5; printf("%dn",fun2(a,b)/m);} A、1 B、2 C、7 D、10 解析:本题的考查点是函数的调用。函数fun2()的作用是将形参x和y的值相乘后-3,在fun2()中的变量m是一个局部变量,它的值在fun2()函数内有效,在主函数中的m指的是全局变量,其值为13,所以fun2(a,b)/m的值为(7*5-3)/13,即2。故本题答案为B。 18.有以下程序 fun(int a, int b) { if(a>b) return(a); else return(b);} main() { int x=3,y=8,z=6,r; r=fun(fun(x,y),2*z); printf("%dn",r);} 程序运行后的输出结果是______。 A、3 B、6 C、8 D、12 解析:本题的考查点是函数的返回值。fun函数的作用是比较a、b的值,如果a>b,就返回a的值,反之,返回b的值。在main函数中,r=fun(fun(x,y),2*z),先对括号里的进行运算,fun(x,y)的返回值为8,再比较8和12,得到r的返回值为12。故本题答案为D。 19.下列函数定义中,会出现编译错误的是______。 A、max(int x,int y,int *z) B、int max(int x,y) {*z=x>y ? x:y;} { int z; z=x>y ? x:y; return z;} C、max(int x,int y) D、int max(int x,int y) { int z; z=x>y?x:y; return(z);} { return(x>y?x:y); } 解析:本题的考查点是函数的返回值。函数的返回值是由return语句带回的,如果被调用的函数中没有return语句,并不带回一个确定的、用户所希望得到的函数值,但实际上,函数并不是不带回值,而只是不带回有用的值,带回的是一个不确定的值。但并不影响程序的运行。故选项A、C 虽然没有return语句,但没有语法错误,而选项B中,定义max函数时,里面的行参也要分别定义。而选项中只定义了x的数据类型,而y并未定义,所以会出现错误。故本题答案为B。 20. 若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是______。 A、函数的实参和其对应的形参共占同一存储单元 B、形参只是形式上的存在,不占用具体存储单元 C、同名的实参和形参占同一存储单元 D、函数的形参和实参分别占用不同的存储单元 解析:本题的考查点是函数形参和实参。在内存中,实参单元与形参单元是不同的单元。故本题答案为D。 五)数组的定义和使用 1. 有以下程序 void f (int b[]) { int i; for(i=2;i<6;i++) b[i]* =2;} main() { int a[10]={1,2,3,4,5,6,7,8,9,10},i; f(a); for(i=0;i<10;i++) printf("%d,",a[i]);} 程序运行后的输出结果是______。 A、1,2,3,4,5,6,7,8,9,10, B、1,2,6,8,10,12,7,8,9,10, C、1,2,3,4,10,12,14,16,9,10, D、1,2,6,8,10,12,14,16,9,10, 解析:本题在调用函数时,实参是&a[0]的地址,即把a[0]的地址传给形参,由条件i=2且i<6得出函数将对a[2]开始的4个元素(3,4,5,6)进行乘以2操作,结果分别为:a[2]=6,a[3]=8,a[4]=10,a[5]=12。a[0]、a[1]、a[6]、a[7]、a[8]、a[9]的值并没有发生变化,所以最后的输出结果为:1,2,6,8,10,12,7,8,9,10,。故本题答案选B。 2. 有以下程序 main() { int a[4][4]={{1,4,3,2},{8,6,5,7},{3,7,2,5},{4,8,6,1}},i,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,5,7, B、8,7,3,1, C、4,7,5,2, D、1,6,2,1, 解析:本题首先定义了一个4行4列的二维数组a,并用了三层循环来进行按列由小到大排序操作。外层循环变量i表示数组的列,第二层循环变量j表示数组的行,第三层循环用于求第i列第j行的最小值,其中通过if语句对相关数值进行比较和交换。然后再通过for语句对排序数组对角线上的值进行输出,即输出a[0][0]、a[1][1]、a[2][2]、a[3][3]。故本题答案选A。 3. 有以下程序 main() { int i,t[][3]={9,8,7,6,5,4,3,2,1}; for(i=0;i<3;i++) printf("%d ",t[2-i][i]); } 程序执行后的输出结果是______。 A、7 5 3 B、3 5 7 C、3 6 9 D、7 5 1 解析:本题考查的是二维数组的应用。将初始值放在一对大括号内,按数组元素排列的顺序对各元素赋值,二维数组中行下标可以省略,但列下标必须要指定,由此题可以看出数组t是一个三行三列的二维数组,执行for循环语句t[2-i][i]分别为t[2][0],t[1][1],t[0][2],得出输出结果为3 5 7。故本题答案为B。 4. 有以下程序 #include main() { char p[]={'a','b','c'},q[10]={'a','b','c'}; printf("%d %dn",strlen(p),strlen(q)); } 以下叙述中正确的是______。 A、在给p和q数组置初值时,系统会自动添加字符串结束符,故输出的长度都为3 B、由于p数组中没有字符串结束符,长度不能确定;但q数组中字符长度为3 C、由于q数组中没有字符串结束符,长度不能确定;但p数组中字符长度为3 D、由于p和q数组中没有字符串结束符,故长度都不能确定 解析:strlen是计算以"0"结束的字符串的长度的函数,函数的值为字符串中实际长度,不包括"0"。题中"q[10]={'a','b','c'}"虽然给出了数组大小,即数组实际分配的存储空间,但此字符串只占用前3个存储单元,其余存储单元系统自动加上"0",故数组q的长度为3;由于p数组中没有字符串结束符,故字符串的长度不能确定。故本题答案为B。 5. 有以下程序 void sort(int a[],int n) {int i,j,t;
版权声明:本文标题:C语言期末题库 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1702705746h427504.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论