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 B、#include

main(); main()

{ {

/*programming*/ /*/programming/*/

printf("programming!n"); printf("programming!n");

} }

C、#include D、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中循环的终止条件是"i1时,由于初值"i=n"是符合条件"i>1"的,且增量为+1,故循环中

永远不会出现不满足条件"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;

for(i=0;i

for(j=i+1;j

if(a[i]

main()

{ int aa[10]={1,2,3,4,5,6,7,8,9,10},i;

sort(aa+2, 5);

for(i=0;i<10;i++) printf("%d,",aa[i]);

printf("n");}

程序运行后的输出结果是______。

A、1,2,3,4,5,6,7,8,9,10, B、1,2,7,6,3,4,5,8,9,10,

C、1,2,7,6,5,4,3,8,9,10, D、1,2,9,8,7,6,5,4,3,10,

解析: 程序中sort函数的作用是将指定的数由大到小排序。主调函数"sort(aa+2, 5);"中的实参aa+2是指aa[2]的地址,将其传给了形参a[],使得形参中a[0]的值为主函数中aa[2]的值,即3;实参中的5传给形参中的n,在sort函数中起着限制循环次数的作用,即使得参加排序的只有5个数,从aa[2]到aa[6],所以本题输出的结果是1,2,7,6,5,4,3,8,9,10,。 故本题答案为C。

6. 有以下程序

main()

{char p[]={'a','b','c'},q[]="abc";

printf("%d %dn",sizeof(p),sizeof(q)); }

程序运行后的输出结果是______。

A、4 4 B、3 3 C、3 4 D、4 3

解析:本题考查的是字符数组。字符数组有两种定义方式:一种是逐个字符赋给数组中各元素,如本题中"p[]={'a','b','c'}"的定义,由于定义时没有给出数组大小,此时字符个数就是数组的长度;另一种是将字符串作为字符数组来处理,如题中"q[]="abc""的定义形式。C语言规定,字符串以'0'作为结束符,并占用一个存储空间。sizeof()函数是计算变量或数组所分配到的内存空间的大小,故本题的输出结果是3

4。 故本题答案为C。

7. 已有定义:char a[]="xyz",b[]={'x','y','z'};,以下叙述中正确的是______。

A、数组a和b的长度相同 B、a数组长度小于b数组长度

C、a数组长度大于b数组长度 D、上述说法都不对

解析:本题考查的是数组定义。C语言规定'0'为字符串结束标志,系统对字符串常量自动加一个'0'为结束符。所以a数组长度为4,而b数组长度为3(此处的数组长度与strlen函数所求的长度不同,此处的长度是指数组占内存空间的大小),故a数组长度大于b数组长度。故本题答案为C。

8. 以下叙述中错误的是______。

A、对于double类型数组,不可以直接用数组名对数组进行整体输入或输出

B、数组名代表的是数组所占存储区的首地址,其值不可改变

C、当程序执行中,数组元素的下标超出所定义的下标范围时,系统将给出"下标越界"的出错信息

D、可以通过赋初值的方式确定数组元素的个数

解析:本题考查的是数组的概念。在C语言中,如果出现下标越界的情况,系统不管在编译还是执行时都不会给出"下标越界"的错误提示。故本题答案为C。

9. 以下能正确定义一维数组的选项是______。

A、int a[5]={0,1,2,3,4,5}; B、char a[]={0,1,2,3,4,5};

C、char a={'A','B','C'}; D、int a[5]="0123";

解析:本题考查的是数组的定义。选项A中定义的是5个数组元素,但赋值的时候赋的是6个元素,所以出错;选项C不符合数组定义形式,数组名后应加上"[]";选项D的类型说明符错误,如果用char定义就对了;选项B中的0,1,2,3,4,5分别表示对应字符的ASCII码,所以选项B是正确的。故本题答案为B。

10.以下能正确定义二维数组的是______。

A、int a[][3]; B、int a[][3]={2*3};

C、int a[][3]={}; D、int a[2][3]={{1},{2},{3,4}};

解析:本题考查的是二维数组的定义。选项B不符合二维数组的定义规范,选项C中不能赋空值,选项D中a[2][3]表示a是一个2行3列的数组,而后面赋值却赋了3行,故本题答案为A。

11.有以下程序

main()

{ int x[]={1,3,5,7,2,4,6,0},i,j,k;

for(i=0;i<3;i++)

for (j=2;j>=i;j--)

if(x[j+1]>x[j]){ k=x[j];x[j]=x[j+1];x[j+1]=k;}

for (i=0;i<3;i++)

for(j=4;j<7-i;j++)

if(x[j]>x[j+1]){ k=x[j];x[j]=x[j+1];x[j+1]=k;}

for (i=0;i<8;i++) printf("%d",x[i]);

printf("n");}

程序运行后的输出结果是______。

A、75310246 B、01234567 C、76310462 D、13570246

解析:本题考查的是排序算法。故本题答案为A。

12.有以下程序:

void sort(int a[],int n)

{ int i,j,t;

for(i=0;i

for(j=i+2;j

if(a[i]

}

main()

{ int aa[10]={1,2,3,4,5,6,7,8,9,10},i;

sort(aa,10);

for(i=0;i<10;i++) printf("%d,",aa[i]);

printf("n");

}

其输出结果是______。

A、1,2,3,4,5,6,7,8,9,10, B、10,9,8,7,6,5,4,3,2,1,

C、9,2,7,4,5,6,3,8,1,10, D、1,10,3,8,5,6,7,4,9,2,

解析:sort函数的功能实际上是对数组中奇数位置上的数进行从大到小排序。排序后的结果应该为9,2,7,4,5,6,3,8,1,10。故本题答案为C。

13. 设有char str[]="Beijing";则执行

printf("%dn",strlen(strcpy(str,"China") ) );

后的输出结果为______。

A、5 B、7 C、12 D、14

解析:本题的考查点是求字符串的长度。在执行printf()函数前,数组str的长度是7,但是使用strcpy()函数将新的值赋给str后,strlen()函数返回的应当是现在的str字符串的字符个数,即是5。故本题答案为A。

14. 以下不能正确定义二维数组的选项是______。

A、int a[2][2]={{1},{2}}; B、int a[][2]={1,2,3,4};

C、int a[2][2]={{1},2,3} D、int a[2][]={{1,2},{3,4}}

解析:本题的考查点是二维数组的定义和初始化。在对数组进行初始化时,如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。故本题答案为D。

15. 若要求从键盘读入含有空格字符的字符串,应该使用函数______。

A、getc() B、gets() C、getchar() D、scanf()

解析:本题考查的是字符串的读写。函数gets()的作用是从终端输入一个字符串(包括空格)到字符数组,直到遇到换行符为止,所以可以用来键盘读入空格字符。故本题答案为B。

16. 有以下程序

#include

void f(char p[][10],int n) /* 字符串从小到大排序 */

{char t[10]; int i,j;

for(i=0;i

for(j=i+1;j

if(strcmp(p[i],p[j])>0)

{ strcpy(t,p[i]); strcpy(p[i],p[j]); strcpy(p[j],t);} }

main()

{ char p[5][10]={"abc","aabdfg","abbd","dcdbe","cd"};

f(p,5);

printf("%dn",strlen(p[0]));}

程序运行后的输出结果是______。

A、2 B、4 C、6 D、3

解析:本题考查的是二维字符数组按行存放字符串、二维数组名作为函数的参数以及字符串的排序。本题答案选C。

17. 有以下程序

#include

main()

{ char p[20]={'a','b','c','d'},q[]="abc",r[]="abcde";

strcat(p,r); strcpy(p+strlen(q),q);

printf("%dn",strlen(p));}

程序运行后的输出结果是______。

A、9 B、6 C、11 D、7

解析:本题考查的是用于字符串处理的函数。题目中首先通过strcat(p,r)将r所指字符串的内容连接到p所指的字符串后面,p[20]={'a','b','c','d','a','b','c','d', 'e'}。然后通过p+strlen(q)在数组元素p[0]地址的基

础上向后移动三位,然后将q所指字符串的内容复制到p所指的存储空间中,从字符"d"往后全部覆盖,p[20]={ 'a','b','c','a','b','c'}。在输出语句中strlen(p)是求字符串的长度,值为6。故本题答案选B。

18. 以下能正确定义字符串的语句是______。

A、char str[]={'064'}; B、char str="x43";

C、char str=''; D、char str[]="0";

解析:本题考查的是字符串的定义。C语言中,字符串是用一对双引号括起来的字符序列,并用字符型数组来存放,故选项A、C不属于字符串, 选项B定义的是一个字符变量str,却用来存放字符串,显然也不正确,所以选项D正确。

19. 有以下程序

main()

{ char a[7]="a00a00";

int i,j;

i=sizeof(a);

j=strlen(a);

printf("%d %dn",i,j); }

程序运行后的输出结果是______。

A、2 2 B、7 6 C、7 2 D、6 2

解析:本题考查的是字符串函数的使用。C语言中以'0'作为字符串的结束符,且strlen()函数计算的是'0'字符前的所有字符的个数。故本题中strlen(a)应为2。数组定义以后系统就为其分配相应大小的内存空间,而不论其中有没有内容。sizeof()函数是计算变量或数组所分配到的内存空间的大小。所以本题的sizeof(a)为7。故本题答案为C。

20. s1和s2已正确定义并分别指向两个字符串。若要求:当s1所指串大于s2所指串时,执行语句S;,则以下选项中正确的是______。

A、if(s1>s2) S; B、if(strcmp(s1,s2)) S;

C、if(strcmp(s2,s1)>0) S; D、if(strcmp(s1,s2)>0) S;

解析:本题考的是字符串比较函数strcmp。字符串比较规则是对两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到"0"为止。如果全部相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。比较的结果由函数值带回。当s1s2时,返回值>0;所以在此题中要使得s1所指串大于s2所指串,那么就必定使得strcmp(s1,s2)>0。故本题答案为D。

六)指针

1. 有以下程序

void f(int *q)

{ int i=0;

for( ;i<5;i++) (*q)++;}

main()

{ int a[5]={1,2,3,4,5},i;

f(a);

for(i=0;i<5;i++) printf("%d,",a[i]);}

程序运行后的输出结果是______。

A、2,2,3,4,5, B、6,2,3,4,5, C、1,2,3,4,5, D、2,3,4,5,6,

解析:本题考查的是指针作为函数的参数和函数的调用。题目中定义了一个指针变量作为函数f()的形参。主函数main()中调用f()函数,当i=0时,执行语句(*q)++,此处*q代表的就是数组元素a[0]的值,即将1进行加1操作;当i=1时,q仍指向数组元素a[0]的地址,因为在函数f()中并未对指针变量q作任何变动,也即*q仍代表了数组元素a[0]的值,所以此次(*q)++即2+1,所以a[0]的值变为3;„„直到i=4时,执行

(*q)++(即5+1)后a[0]的值变为6。所以最后的输出结果为:6,2,3,4,5,。故本题答案选B。

2.若有以下函数首部

int fun(double x[10], int *n)

则下面针对此函数的函数声明语句中正确的是______。

A、int fun(double x, int *n); B、int fun(double, int );

C、int fun(double *x, int n); D、int fun(double *, int *);

解析:本题考查的是函数的声明。函数声明可以照写已定义的函数的首部,再加一个分号就成为了对函数的声明,在函数声明中也可以不写形参名,而只写形参的类型,但要保证与函数首部写法上的一致,即函数类型、函数名、参数个数、参数类型和参数顺序相同。字符数组可用指针来表示,所以选项D正确。故本题答案为D。

3.有以下程序

main()

{char s[]={"aeiou"},*ps;

ps=s; printf("%cn",*ps+4); }

程序运行后输出的结果是______。

A、a B、e C、u D、元素s[4]的地址

解析:本题考查的是指针变量的运算。此题中先定义一个指针变量ps,并将s的首地址赋给此指针变量,*ps +4相当于先从指针变量ps指向的地址中取出相应数据"a"后,对此数据加4,a的ASCII码为32,32+4=36,对应于字符e。 故本题答案选B。

4.有以下程序

void change(int k[]){ k[0]=k[5]; }

main()

{ int x[10]={1,2,3,4,5,6,7,8,9,10}, n=0;

while(n<=4)

{ change(&x[n]); n++;}

for(n=0;n<5;n++) printf("%d",x[n]);

printf("n");}

程序运行后输出的结果是______。

A、6 7 8 9 10 B、1 3 5 7 9 C、1 2 3 4 5 D、6 2 3 4 5

解析:本题考查的是数组名作函数参数。当n=0时,把x[0]的地址传给被调函数change,即将形参k与实参x指向同一个存储单元x[0],执行被调函数后,k[0]=6,即x[0]=6;当n=1时,形参k指向x数组的第1个数组元素所在单元,即k[0]与x[1]共用同一存储单元,执行被调函数后,k[0]=7,即x[1]=7,依次类推得出x[0]到x[4]的值分别为6、7、8、9、10。 故本题答案为A。

5.有以下程序

main()

{ int a=1,b=3,c=5;

int *p1=&a,*p2=&b,*p=&c;

*p=*p1*(*p2);

printf("%dn",c);}

执行后的输出结果是______。

A、1 B、2 C、3 D、4

解析:本题考查的是通过指针引用数据进行计算。p1=&a表示指针变量p1指向元素1的地址; p2=&b表示指针变量p2指向元素3的地址;p=&c表示指针变量p指向元素5的地址; 执行*p=*p1*(*p2)=1*3=3,所以最后的结果为:3。 故本题答案为C。

6.有以下程序

void swap(char *x,char *y)

{ char t;

t=*x;*x=*y;*y=t;}

main()

{ char *s1="abc",*s2="123";

swap(s1,s2); printf("%s,%sn",s1,s2);}

程序执行后的输出结果是______。

A、123,abc B、abc,123 C、1bc,a23 D、321,cba

解析:本题考查的是指针变量值的交换。C语言中,字符串常量在内存中是以字符数组的形式进行存放的,因此字符指针x和y指向的是各字符串的首地址,也就是字符串第一个字符的地址,则*x与*y交换的是字符串的第一个字符,即字符"a"与"1"的交换,而字符串中其它字符保持不变。故本题答案为C。

7.有以下程序

void fun1(char *p)

{ char *q;

q=p;

while(*q!= '0')

{(*q)++;q++;}}

main()

{ char a[]={"Program "},*p;

p=&a[3];fun1(p); printf("%sn",a);}

程序执行后的输出结果是______。

A、Prohsbn B、Prphsbn C、Progsbn D、Program

解析:本题考查的是指向数组的指针作为函数的参数及指针的运算。如果形参数组中的元素发生变化,实参也将发生相应变化。指针p指向数组的第三位地址(即字符"g"的地址),q=p也就相当于指针q指向数组的第三位地址。表达式(*q)++,首先根据()的优先级得到a[3]的值"g",再进行加1运算,所以g也就变成了h;表达式q++是将地址加1,也就是指向下一个地址a[4]。然后再执行while()语句,直到遇到'0'结束循环,返回形参。故本题答案为A。

8.设有定义:int n1=0,n2,*p=&n2,*q=&n1;,以下赋值语句中与n2=n1;语句等价的是______。

A、*p=*q; B、p=q; C、*p=&n1; D、p=*q;

解析:本题考查的是指针变量的赋值。本题答案为A。

9.有以下程序

void sum(int a[])

{ a[0]=a[-1]+a[1]; }

main()

{ int a[10]={ 1,2,3,4,5,6,7,8,9,10};

sum(&a[2]);

printf("%dn",a[2]);}

程序运行后的输出结果是______。

A、6 B、7 C、5 D、8

解析:本题考查的是函数参数的传递。本题答案为A。

10.有以下程序

main()

{ int a[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],*q=p+2;

printf("%dn",*p+*q); }

程序运行后的输出结果是______。

A、16 B、10 C、8 D、6

解析:本题考查的是指向数组的指针变量。数组a各元素a[0]~a[9]的值依次为1~10;在程序的说明部分,指针变量p初始化为&a[3],即*p的值为4;指针变量q初始化为p+2,即&a[3]+2,所以*q的值为6,所以*p+*q的值为10。 故本题答案为B。

11.有以下程序

#include

void f(char *s,char *t)

{ char k;

k=*s; *s=*t; *t=k;s++; t--;

if(*s) f(s,t);}

main()

{ char str[10]="abcdefg",*p;

p=str+strlen(str)/2+1;

f(p,p-2);

printf("%sn",str);}

程序运行后的输出结果是______。

A、abcdefg B、gfedcba C、gbcdefa D、abedcfg

解析:本程序的作是将字符串str倒序。故本题答案为B。

12.有以下程序

void swap1(int c0[],int c1[])

{ int t;

t=c0[0]; c0[0]=c1[0]; c1[0]=t;}

void swap2(int *c0,int *c1)

{ int t;

t=*c0; *c0=*c1; *c1=t;}

main()

{int a[2]={3,5}, b[2]={3,5};

swap1(a,a+1); swap2(&b[0],&b[1]);

printf("%d %d %d %dn",a[0],a[1],b[0],b[1]);}

程序运行后的输出结果是______。

A、3 5 5 3 B、5 3 3 5 C、3 5 3 5 D、5 3 5 3

解析:函数swap1、swap2的作用均为交换两个数。主调函数"swap1(a,a+1)"使得数组a的首地址赋给形参c0[],使得c0指向a[0]所在的存储单元,a[1]的地址赋给形参c1[],使得c1指向a[1]所在的存储单元,故交换c0[0]与c1[0]后,a[0]与a[1]值也发生了变化;主调函数"swap2(&b[0],&b[1]);"起着同样的作用,使得指针变量c0指向了b[0]存储单元,c1指向了b[1]存储单元,并在swap2函数中发生了交换,所以b[0]、b[1]的值也发生变化,故本程序输出的结果是5353。 故本题答案为D。

13. 有以下程序

#include

main()

{int a[]={1,2,3,4,5,6,7,8,9,10,11,12,},*p=a+5,*q=NULL;

*q=*(p+5);

printf("%d %dn",*p,*q); }

程序运行后的输出结果是______。

A、运行后报错 B、6 6 C、6 11 D、5 10

解析:此题考查的是指针变量赋值。本题将指针q赋值为空,即指向了空地址,而对空地址所对应的内容赋值*q=*(p+5)是会出错的,所以输出结果会报错。所以此题答案为A。

14.有以下程序

main()

{ int a=7,b=8,*p,*q,*r;

p=&a;q=&b;

r=p; p=q;q=r;

printf("%d,%d,%d,%dn",*p,*q,a,b);}

程序运行后的输出结果是______。

A、8,7,8,7 B、7,8,7,8 C、8,7,7,8 D、7,8,8,7

解析:此题考的是指针变量。本题答案为C。

15.有以下程序

main()

{char str[][10]={"China","Beijing"},*p=str;

printf("%sn",p+10);}

程序运行后的输出结果是______。

A、China B、Bejing C、ng D、ing

解析:此题考的是指向数组元素的指针变量。p+10就指向了从首地址依次向后的第11个存储单元即字符B的地址,所以输出Beijing,故答案为B。

16.设有如下的程序段

char str[]="Hello";

char *ptr; ptr=str;

执行完上面的程序段后,*(ptr+5)的值为______。

A、'o' B、'0' C、不确定的值 D、'o'的地址

解析:本题的考查点是字符数组的结束标志。故本题答案为B。

17.若已定义:int a[9],*p=a;并在以后的语句中未改变p的值,不能表示a[1]地址的表达式是______。

A、p+1 B、a+1 C、a++ D、++p

解析:本题的考查点是数组地址的表示。选项C中,数组名所表示的数组地址不能被重新赋值。故本题答案为C。

18.已定义以下函数

fun(char *p2, char *p1)

{ while((*p2=*p1)!='0'){p1++;p2++;} }

函数的功能是______。

A、将p1所指字符串复制到p2所指内存空间 B、将p1所指字符串的地址赋给指针p2

C、对p1和p2两个指针所指字符串进行比较

D、检查p1和p2两个指针所指字符串中是否有'0'

解析:while((*p2=*p1)!='0'表示将p1所指向的值赋给*p2,即将p1所指字符串复制到p2所指内存空间。在这里“*P2=*p1”是赋值操作,而不是比较是否相等,比较应当为双等号“==”。所以B,C,D都不对。故本题答案为A。

19.若有定义:int *p[3];,则以下叙述中正确的是______。

A、定义了一个基类型为int的指针变量p,该变量具有三个指针

B、定义了一个指针数组p,该数组含有三个元素,每个元素都是基类型为int的指针

C、定义了一个名为*p的整型数组,该数组含有三个int类型元素

D、定义了一个可指向一维数组的指针变量p,所指一维数组应具有三个int类型元素

解析: int *p[3]表示此数组是指针类型的,每个数组元素(指针变量)都可指向一个整型的指针变量。故本题答案选B。

20.设有定义:int a,*pa=&a; 以下scanf语句中能正确为变量a读入数据的是___。

A、scanf("%d",pa); B、scanf("%d",a);

C、scanf("%d",&pa); D、scanf("%d",*pa);

解析: scanf函数可以用来输入任何类型的多个数据。本题答案为A。

21. 有以下程序

main()

{ char ch[]="uvwxyz",*pc;

pc=ch; printf("%cn",*(pc+5));}

程序运行后的输出结果是______。

A、z B、0 C、元素ch[5]的地址 D、字符y的地址

解析:本题中定义了一个字符串数组和指针,并将指针pc指向该数组的首地址,语句中的*(pc+5)指的就是pc[5]的值,所以最后输出的结果为z。故本题答案选A。

22. 有以下函数

int fun(char *s)

{ char *t=s;

while(*t++);

return(t-s);}

该函数的功能是______。

A、比较两个字符串的大小 B、计算s所指字符串占用内存字节的个数

C、计算s所指字符串的长度 D、将s所指字符串复制到字符串t中

解析:本题考查的是通过字符指针进行字符长度的计算。故本题答案选C。

23. 若有定义:char *x="abcdefghi";以下选项中正确运用了strcpy函数的是____。

A、char y[10]; strcpy(y,x[4]); B、char y[10]; strcpy(++y,&x[1]);

C、char y[10],*s;strcpy(s=y+5,x); D、char y[10],*s; strcpy(s=y+1, x+1);

解析:本题考查的是用于字符串处理的函数strcpy。本题答案为D。

24. 设有以下定义和语句

char str[20]= "Program",*p; p=str;

则以下叙述中正确的是______。

A、*P与str[0]中的值相等 B、str与p的类型完全相同

C、str数组长度和p所指向的字符串长度相等

D、数组str中存放的内容和指针变量p中存放的内容相同

解析:本题考查的是指针变量对数组的引用。本题答案为A。

25. 以下语句或语句组中,能正确进行字符串赋值的是______。

A、char *sp;*sp="right!"; B、char s[10];s="right!";

C、char s[10];*s="right!"; D、char *sp="right!";

解析:本题考查的是字符串的赋值。本题答案为D。

26. 有以下函数

fun(char *a,char *b)

{ while((*a!='0')&&(*b!='0')&&(*a==*b))

{a++;b++;}

return(*a-*b); } 该函数的功能是______。

A、计算a和b所指字符串的长度之差 B、将b所指字符串连接到a所指字符串中

C、将b所指字符串连接到a所指字符串后面 D、比较a和b所指字符串的大小

解析:函数就实现功能,如果两字符串相等,则返回0,否则返回第一个不等字符串的ASCII码的差值。故本题答案为D。

27. 有以下程序

float f1(float n) { return n*n; }

float f2(float n) { return 2*n; }

main()

{ float (*p1)(float),(*p2)(float),(*t)(float),y1,y2;

p1=f1; p2=f2; y1=p2(p1(2.0));

t=p1; p1=p2; p2=t; y2=p2(p1(2.0));

printf("%3.0f,%3.0fn",y1,y2);}

程序运行后的输出结果是______。

A、8, 16 B、8, 8 C、16, 16 D、4, 8

解析:本题考查的是指向函数的指针变量。本题答案为A。

28.有以下程序

void fun(int *a,int i,int j)

{ int t;

if(i

{ t=a[i];a[i]=a[j];a[j]=t;i++; j--;fun(a,i,j);}}

main()

{ int x[]={2,6,1,8},i;

fun(x,0,3);

for(i=0;i<4;i++) printf("%2d",x[i]);

printf("n");}

程序运行后的输出结果是______。

A、1 2 6 8 B、8 6 2 1 C、8 1 6 2 D、8 6 1 2

解析:本题考的是函数参数的传递和函数自身的调用。fun(x,0,3);是将数组名x作为实参,把数组x的首地址传送给形参(指针a),这样数组x与形参指针a共占同一段内存单元,所以在调用函数期间,如果改变了形参数组x的值,也就改变了实参指针a的值。本题答案为C。

29.有以下程序

int a=2;

int f(int *a)

{return (*a)++;}

main()

{ int s=0;

{int a=5;

s+=f(&a); }

s+=f(&a);

printf("%dn",s);}

执行后输出结果是______。

A、10 B、9 C、7 D、8

解析: 在一个函数的内部定义的变量是内部变量,它只在本函数范围内有效。本题中的int a=5;只在

{int a=5;s+=f(&a);}内有效。在函数之外定义的变量称为外部变量,外部变量是全局变量。全局变量可以为本文件中其它函数所共用。它的有效范围为:从定义变量的位置开始到本源文件结束。本题的开头int a=2;即为全局变量,实际上起作用的也就是这个。故本题答案为C。

30.请选出以下程序的输出结果______。

#include

sub(int *s,int y)

{ static int t=3;

y=s[t];t--;}

main()

{ int a[]={1,2,3,4},i, x=0;

for(i=0;i<4;i++) {

sub(a,x);printf("%d",x); }

printf("n");}

A、1234 B、4321 C、0000 D、4444

解析:本题的考查点是函数的形参和实参的关系。

x作为函数sub()的实参时,函数对x值的改变没有返回主函数,并不能使得x的值变化,所以在打印时,x的值是始终不变的,即为0。

故本题答案为C。

七)结构体和共用体

1. 设有以下语句

struct TT {char c; int a[4];}CIN;

则下面叙述中正确的是______。

A、可以用TT定义结构体变量 B、TT是struct类型的变量

C、可以用CIN定义结构体变量 D、CIN是struct TT类型的变量

解析:本题考查的是结构体的定义。此题中说明了一个结构体类型struct TT的同时,定义了一个结构体变量CIN,结构体变量中的各成员在内存中按说明中的顺序依次排序。故本题答案为D。

2. 有以下结构体说明、变量定义和赋值语句

struct STD

{ char name[10];int age;char sex;

}s[5],*ps; ps=&s[0];

则以下scanf函数调用语句中错误引用结构体变量成员的是______。

A、scanf("%s",s[0].name); B、scanf("%d",&s[0].age);

C、scanf("%c",&(ps->sex)); D、scanf("%d",ps->age);

解析:要给结构体成员输入数据,在语句中需要使用结构体成员的地址。选项D用指针变量引用结构体的成员sex后没有再继续取其地址,所以是错误的。故本题答案为D。

3. 有以下程序

struct S{int n; int a[20];};

void f(int *a, int n)

{ int i;

for(i=0;i

main()

{ int i; struct S s={10,{2,3,1,6,8,7,5,4,10,9}};

f(s.a,s.n);

for(i=0;i

程序运行后的输出结果是______。

A、2,4,3,9,12,12,11,11,18,9, B、3,4,2,7,9,8,6,5,11,10,

C、2,3,1,6,8,7,5,4,10,9, D、1,2,3,6,8,7,5,4,10,9,

解析:本题考查的是结构体成员的引用。f()函数中,通过指针a来引用数组中的元素;通过for循环语句将数组中除最后一个元素外的其它元素(由条件i

4. 有以下程序

struct S{int n; int a[20];};

void f(struct S *p)

{ int i,j,t;

for(i=0;in-1;i++)

for(j=i+1;jn;j++)

if(p->a[i]>p->a[j]) { t=p->a[i]; p->a[i]=p->a[j]; p->a[j]=t;}}

main()

{ int i; struct S s={10,{2,3,1,6,8,7,5,4,10,9}};

f(&s);

for(i=0;i

程序运行后的输出结果是______。

A、1,2,3,4,5,6,7,8,9,10, B、10,9,8,7,6,5,4,3,2,1,

C、2,3,1,6,8,7,5,4,10,9, D、10,9,8,7,6,1,2,3,4,5,

解析: f()函数作用就是从小到大进行排序,最后将排序后的元素输出:1,2,3,4,5,6,7,8,9,10,。故本题答案选A。

5. 有以下程序

typedef struct{int b,p;}A;

void f(A c) /* 注意:c是结构变量名 */

{ int j;

c.b+=1; c.p+=2;}

main()

{ int i;

A a={1,2};

f(a);

printf("%d,%dn",a.b,a.p);}

程序运行后的输出结果是______。

A、2,3 B、2,4 C、1,4 D、1,2

解析:C语言规定,在函数调用时变量作为参数传递是进行值传递,在函数体中对形参变量的修改不会影响对应的实参变量。本题定义了一个函数f(),用变量作为形参,在main()函数中调用了一次f()函数,形参进行计算:c.b+=1=1+1=2,c.p+=2=2+2=4,由于变量作为参数进行传递不会影响到实参的的值,所以a.b,a.p依旧是原来的值,即:1,2。故本题答案选D。

6. 若有以下定义和语句

union date

{ int i; char c; fioat f;} x; int y;

则以下语句正确的是______。

A、x=10.5; B、x.c=101; C、y=x; D、printf("%dn", x);

解析:本题定义了共用体变量x及整型变量y,共用体变量不能直接引用,而只能引用共用体变量中的成员,故选项A、C、D均错误。故本题答案选B。

7. 有以下程序

struct STU

{ char name[10]; int num; float TotalScore; };

void f(struct STU *p)

{ struct STU s[2]={{"SunDan",20044,550},{"Penghua",20045,537}},*q=s;

++p; ++q; *p=*q;}

main()

{ struct STU s[3]={ {"YangSan",20041,703},{"LiSiGuo",20042,580}};

f(s);

printf("%s %d %3.0fn",s[1].name, s[1].num,s[1].TotalScore);}

程序运行后的输出结果是______。

A、SunDan 20044 550 B、Penghua 20045 537

C、LiSiGuo 20042 580 D、SunDan 20041 703

解析:本程序将结构体数组s的首地址传递给了结构体指针变量p,并在函数f中改变了指针变量p所指向的第二个结构体中的成员变量,这一改变,也就是改变了主函数中s[1]的成员变量,故程序输出的值为Penghua 20045 537。 故本题答案为B。

8. 有以下程序段

typedef struct NODE

{int num; struct NODE *next; }OLD;

以下叙述中正确的是______。

A、以上的说明形式非法 B、NODE是一个结构体类型

C、OLD是一个结构体类型 D、OLD是一个结构体变量

解析:本题考查的是结构体的定义。typedef关键字用于声明一个新的类型名代替已有的类型名。本题中如果没有用typedef进行定义的话,则struct NODE为结构体类型,现在用typedef定义后,相当于用OLD代表了struct NODE这一结构体类型,故OLD为结构体类型。 故本题答案为C。

9. 以下对结构体类型变量td的定义中,错误的是______。

A、typedef struct aa B、struct aa

{ int n; { int n;

float m; float m;

}AA; }td;

AA td; struct aa td;

C、struct D、struct

{ int n; { int n;

float m; float m;

}aa; }td;

struct aa td;

解析:本题考查的是结构体。选项C中的aa本身就为结构体变量名,所以不能再用它来定义结构体变量,故此种定义方法是错误的。故本题答案为C。

10.有以下程序:

struct STU{char name[10]; int num;};

void f1(struct STU c)

{struct STU b={"LiSiGuo",2042};c=b;}

void f2(struct STU *c)

{struct STU b={"SunDan",2044};*c=b;}

main()

{struct STU a={"YangSan",2041},b={"WangYin",2043};

f1(a);f2(&b);

printf("%d %dn",,);}

执行后输出结果是______。

A、2041 2044 B、2041 2043 C、2042 2044 D、2042 2043

解析:f2函数传递的是变量的地址,可以实现数据的交换,而f1函数中是传递的值,执行完f1后,c的值是变了,但main函数中的a的值并未变化。也就是说由于“单向传送”的“值传递”方式,形参值的改变无法传给实参。故本题答案为A。

11. 有以下程序:

#include

union pw { int i; char ch[2];}a;

main()

{ [0]=13;[1]=0;

printf("%dn",a.i);}

程序的输出结果是(注意:ch[0]在低字节,ch[1]在高字节)______。

A、13 B、14 C、208 D、209

解析:根据共用体的定义可知:共用体a的成员i和成员ch[2]是共用着同一段内存空间,所以,当程序给[0]赋值后,实际上,共用体成员i的值也确定了,为13,所以打印输出的结果应当为13。故本题答案为A。

12.有以下程序:

struct s

{ int x,y; } data[2]={10,100,20,200};

main()

{ struct s *p=data;

printf("%dn",++(p->x));}

程序运行后的输出结果是______。

A、10 B、11 C、20 D、21

解析:本题的考查点是结构体变量的初始化。 该题是一个对外部存储类型的结构体变量进行的初始化。初始化后,x的值为10,y的值为100。++(p->x)中首先p->x是把p指向结构体变量s中的x成员,此++(p->x)就相当于++x,这时x先自增,再使用,所以此时x的值为11。故本题答案为B。

13. 有以下程序段

typedef struct node{int data; struct node *next; } *NODE;

NODE p;

以下叙述中正确的是______。

A、p是指向struct node结构变量的指针的指针 B、NODE p;语句出错

C、p是指向struct node结构变量的指针 D、p是struct node结构变量

解析:本题考查的是对用户自定义类型的理解。本题中定义了一个指针类型的"用户类型名" NODE,通过"用户类型名"可以定义该类型的结构体变量,所以选项C的叙述是正确的。故本题答案选C。

14.有以下程序段

struct st

{int x;int *y;}*pt;

int a[]={1,2},b[]={3,4};

struct st c[2]={10,a,20,b};pt=c;

以下选项中表达式的值为11的是______。

A、*pt->y B、pt->x C、++pt->x D、(pt++)->x

解析:本题考查的是结构体类型的指针。题目中定义了一个st结构体类型,然后定义了st型的结构体指针变量*pt及结构体数组c,并对结构体数组进行了初始化,且将结构体指针变量pt指向了数组c,则pt->x的值为10,则++pt->x的值为11(注:"->"运算符的优先级高于"++"),故选项C正确。

15.有以下说明和定义语句

struct student

{ int age; char num[8];};

struct student stu[3]={{20,"200401"},{21,"200402"},{19,"200403"}};

struct student *p=stu;

以下选项中引用结构体变量成员的表达式错误的是______。

A、(p++)->num B、p->num C、(*p).num D、stu[3].age

解析:本题考查的是结构体类型的数组和结构体指针变量。本题答案为D。

16.已知字符0的ASCII码为十六进制的30,下面程序

main()

{ union{ unsigned char c;

unsigned int i[4]; }z;

z.i[0]=0x39; z.i[1]=0x36;

printf("%cn",z.c); }

A、6 B、9 C、0 D、3

解析:本题的考查点是共用体。

根据共用体的定义可知:共用体z的成员c和成员i[4]是共用着同一段内存空间,所以,当程序给z.i[0]赋值后,实际上共用体成员c的值也确定了,为0x39,所以在以字符方式打印时,打印结果应是ASCII码等于0x39的字符,即是"9"。故本题答案为B。

17.以下叙述中错误的是______。

A、可以通过typedef增加新的类型

B、可以用typedef将已存在的类型用新的名字来代表

C、用typedef定义新的类型名后,原有类型名仍有效

D、用typedef可以为各种类型起别名,但不能为变量起别名

解析:本题考查的是类型声明的概念。选项A错误,原因是typedef可以声明新的类型名来代替已有的类型名,但却不能增加新的类型。故本题答案为A。

18.当说明一个结构体变量时,系统分配给它的内存是______。

A、各成员所需内存量的总和

B、结构体中第一个成员所需内存量

C、结构体中占内存量最大者所需的容量

D、结构体中最后一个成员所需内存量

解析:本题考查的是结构体的定义。故本题答案为A。

19.当说明一个共用体变量时,系统分配给它的存储空间是______。

A、该共用体中第一个成员所需存储空间

B、该共用体中占用最大存储空间的成员所需存储空间

C、该共用体中最后一个成员所需存储空间

D、该共用体中所有成员所需存储空间的总和

解析:本题考查的是共用体的定义。故本题答案为B。

20.若有以下说明:

struct student

{char name[20];

int age;

char sex;}a={“Wang Hong”,22,’M’},*p=&a;

则对字符串“Wang Hong”的引用方式不可以是______。

A、(*p).name B、

C、 D、p->name

八)文件操作

1. 以下叙述中正确的是______。

A、C语言中的文件是流式文件,因此只能顺序存取数据

B、打开一个已存在的文件并进行了写操作后,原有文件中的全部数据必定被覆盖

C、在一个程序中当对文件进行了写操作后,必须先关闭该文件然后再打开,才能读到第1个数据

D、当对文件的读(写)操作完成之后,必须将它关闭,否则可能导致数据丢失

解析:本题考查的是文件的读写操作。C语言中,有两种对文件的存取方式:顺序存取和直接存取,所以选项A错误;在对文件进行读、写操作前,先要使用库函数fopen"打开"文件来实现程序中要读、写的文件与实际数据文件间的联系。在进行打开文件操作时可以指定其打开方式,如果使用"r+"方式则在写新数据时,只覆盖新数据所占的空间,其后的老数据并不丢失,所以选项B错误;在对文件进行操作后关闭文件是为了防止文件缓冲区中的剩余数据的丢失。故本题答案为D。

2. 执行以下程序后,文件的内容是(若文件能正常打开)______。

#include

main()

{ FILE *fp;

char *s1="Fortran",*s2="Basic";

if((fp=fopen("","wb"))==NULL)

{ printf("Can't open filen"); exit(1);}

fwrite(s1,7,1,fp); /*把从地址s1开始的7个字符写到fp所指文件中*/

fseek(fp, 0L,SEEK_SET); /*文件位置指针移到文件开头*/

fwrite(s2,5,1,fp);

fclose(fp);}

A、Basican B、BasicFortran C、Basic D、FortranBasic

解析:本题定义一个FILE类型结构体的指针fp,以"只写"方式打开一个文件,并向文件输入指针变量s1指向的7个字符,则文件内的内容为"Fortran",执行fseek函数文件位置指针移到文件的开头,再次向文件输入指针变量s2指向的5个字符,虽然此时的文件前5个字符字符已被"Forta"所占用,但当向文件输入"Basic"这五个字符时,系统会覆盖原有的内容"Forta",所以最后里的内容为:Basican。故本题答案为A。

3. 以下叙述中错误的是______。

A、C语言中对二进制文件的访问速度比文本文件快

B、C语言中,随机文件以二进制代码形式存储数据

C、语句FILE fp;定义了一个名为fp的文件指针

D、C语言中的文本文件以ASCII码形式存储数据

解析:FILE是由系统定义的一个结构体类型,并用该类型来定义若干个FILE类型的变量,以便存放若干个文件。所以用FILE定义的变量必须是数组或指针。故本题答案为C。

4. 有以下程序

#include

main()

{ FILE *fp; int i,a[6]={1,2,3,4,5,6};

fp=fopen("","w+b");

fwrite(a,sizeof(int),6,fp);

fseek(fp,sizeof(int)*3,SEEK_SET); /*该语句使读文件的位置指针从文件头向后移动3个int型数据*/

fread(a,sizeof(int),3,fp); fclose(fp);

for(i=0;i<6;i++) printf("%d,",a[i]);}

程序运行后的输出结果是 。

A、4,5,6,4,5,6, B、1,2,3,4,5,6, C、4,5,6,1,2,3, D、6,5,4,3,2,1,

解析:本题首先以创建方式打开文件"",通过fwrite()函数写6个整型数据(1,2,3,4,5,6)到文件""中,通过fseek()函数使读文件的位置指针从文件头向后移动3个int型数据,此时文件指针指向的数据为4。通过fread()函数读3个int型数据(4,5,6)依次存放到数组的a[0]、a[1]、a[2]中,此时数组a中的值为(4,5,6,4,5,6),所以最后的输出结果为:4,5,6,4,5,6,。故本题答案选A。

5. 有以下程序:

#include

main()

{ FILE *fp; int k,n,a[6]={1,2,3,4,5,6};

fp=fopen("","w");

fprintf(fp,"%d%d%dn",a[0],a[1],a[2]);

fprintf(fp,"%d%d%dn",a[3],a[4],a[5]);

fclose(fp);

fp=fopen("","r");

fscanf(fp,"%d%d",&k,&n); printf("%d%dn",k,n);

close(fp);}

程序运行后的输出结果是______。

A、1 2 B、1 4 C、123 4 D、123 456

解析:本题首先以创建方式打开文件"",两次调用fprintf()函数把a[0],a[1],a[2] ,a[3],a[4],a[5]的值写到文件""中,文件""的内容为:1,2,3<回车>4,5,6。然后把该文件关闭再以只读方式打开,文件位置指针指向文件头,再通过fscanf()函数从中读取两个整数到k和n中,由于格式符之间无间隔,因此输入数据可以用回车隔开,故输入的k的值为123,n的值为456。故本题答案选D。

6. 有以下程序

#include

main()

{FILE *fp; int i;

char ch[]="abcd",t;

fp=fopen ("","wb++");

for (i=0;i<4;i++) fwrite(&ch[i],1,1,fp);

fseek (fp,-2L,SEEK_END);

fread (&t,1,1,fp);

fclose (fp);

printf ("%cn",t);}

程序执行后的输出结果是______。

A、d B、c C、b D、a

解析:本题中定义一个FILE类型结构体的指针fp,以"可以由位置函数设置读和写"方式打开一个文件,并向文件输入数组变量ch指向的字符串,数组ch包含:a、b、c、d、'0'五个元素('0'为系统自加的),执行fseek函数,文件类型指针fp从文件尾向前移动2个字符,即指针指向"c",所以最后的输出结果为c。故本题答案为B。

7. 有以下程序

#include

main()

{ FILE *fp; int i,k,n;

fp=fopen("","w+");

for(i=1;i<6;i++)

{fprintf(fp,"%d ",i);

if(i%3==0) fprintf(fp,"n");}

rewind(fp);

fscanf(fp,"%d%d",&k,&n); printf("%d %dn",k,n);

fclose(fp); }

程序运行后的输出结果是______。

A、0 0 B、123 45 C、1 4 D、1 2

解析:本题考查的是文件的输入输出。语句"fprintf(fp,"%d ",i);"的作用是将变量i的值按"%d "的格式输出到fp指向的文件上;"rewind(fp)"的作用是使指针重新返回文件的开头;"fscanf(fp,"%d%d",&k,&n)"的作用是将磁盘文件中的数据送给变量k,n。故本题答案为D。

8. 有以下程序

#include

void WriteStr(char *fn,char *str)

{ FILE *fp;

fp=fopen(fn,"w");

fputs(str,fp);

fclose(fp); }

main()

{ WriteStr("","start");

WriteStr("","end"); }

程序运行后,文件中的内容是______。

A、start B、end C、startend D、endrt

解析:题中"fopen(fn,"w")"的作用是打开fn所指向的文件,使用文件方式为"写入";"fputs(str,fp)"的作用是将字符str的值输出到fp所指向的文件中去。在程序中,两次使用"写入"的方式打开同一个文件,在第二次打开时,文件指针指向文件头,所以此次写入的数据覆盖了文件原有的数据,故本题中的内容为end。故本题答案为B。

9. 以下与函数fseek(fp,0L,SEEK_SET)有相同作用的是______。

A、feof(fp) B、ftell(fp) C、fgetc(fp) D、rewind(fp)

解析:本题考查的是文件操作函数。本题中"fseek(fp,0L,SEEK_SET)"的作用是将位置指针移到文件头。与此作用相同的函数是"rewind(fp)":使位置指针重新返回文件的开头。故答案为D。

10.有如下程序

#include

main()

{FILE *fp1;

fp1=fopen("","w");

fprintf(fp1,"abc");

fclose(fp1);}

若文本文件中原有内容为:good,则运行以上程序后文件中的内容为______。

A、goodabc B、abcd C、abc D、abcgood

解析:本题考的是文件类型指针。fp1=fopen("","w")表示打开名为 的文件,使用文件方式为向该文件写数据,如果原来不存在该文件,则在打开时新建一个以指定的名字命名的文件;如果原来已存在一个以该文件命名的文件,则在打开时将该文件删去,然后重新建立一个新文件,所以本题中中原有内容good被删去了,fopen函数带回指向fp1文件的指针并赋给fp1。fprintf(fp1,"abc")的作用是将字符串abc输出到fp1指向的文件上。故本题答案为C。

11.下列关于c语言数据文件的叙述中正确的是______。

A、文件由ASCII码字符序列组成,C语言只能读写文本文件

B、文件由二进制数据序列组成,C语言只能读写二进制文件

C、文件由记录序列组成,可按数据的存放形式分为二进制文件和文本文件

D、文件由数据流形式组成,可按数据的存放形式分为二进制文件和文本文件

解析:本题的考查点是文件的基本概念。本题答案为D。

12.若fp已正确定义并指向某个文件,当未遇到该文件结束标志时函数feof(fp)的值为______。

A、0 B、1 C、-1 D、一个非0值

解析:本题的考查点是feof()函数的应用。feof(fp)用来测试fp所指向的文件当前状态是否“文件结束”。如果是文件结束,函数feof(fp)的值为1(真),否则为0(假)。故本题答案为A。

13.要打开一个已存在的非空文件file用于修改,选择正确的语句是______。

A、fp=fopen(“file”,”r”); B、fp=fopen(“file”,”a+”);

C、fp=fopen(“file”,”w”); D、fp=fopen(“file”,”r+”);

解析:本题的考查点是fopen()中的使用文件的方式。故本题答案为D。

14.函数fgetc()的作用是从指定文件读入一个字符,该文件的打开方式必须是______。

A、只写 B、追加 C、只读或读写 D、以上都不正确

解析:本题答案为C。

15. 若要打开A盘上的user子目录下名为的文本文件进行读、写操作,下面符合此要求的函数调用是______。

A、fopen("A:","r") B、fopen("A:","r+")

C、fopen("A:","rb") D、fopen("A:","w")

解析:本题答案为B。


本文标签: 本题 函数 语句