admin 管理员组

文章数量: 1086019


2024年12月30日发(作者:二维数组表示矩阵)

国家二级(C语言)笔试模拟试卷1

(题后含答案及解析)

题型有:1. 选择题 2. 填空题

选择题(1-10、21-40每题2分,11-20每题1分,共70分)下列各题A、B、

C、D四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位

置上。

1. 算法的空间复杂度是指( )。

A.算法程序的长度

B.算法程序中的指令条数

C.算法程序所占的存储空间

D.执行算法所需要的存储空间

正确答案:D

解析:算法的复杂度主要包括算法的时间复杂度和算法的空间复杂度。所谓

算法的时间复杂度是指执行算法所需要的计算工作量;算法的空间复杂度一般是

指执行这个算法所需要的内存空间。

2. 用链表表示线性表的优点是( )。

A.便于随机存取

B.花费的存储空间较顺序存储少

C.便于插入和删除操作

D.数据元素的物理顺序与逻辑顺序相同

正确答案:C

解析:链式存储结构的结点空间可以动态申请和释放,其数据元素的逻辑次

序靠结点的指针来指示,在进行插入和删除操作时不需要移动数据元素,故链式

存储结构下的线性表便于插入和删除操作。

3. 数据结构中,与所使用的计算机无关的是数据的( )。

A.存储结构

B.物理结构

C.逻辑结构

D.物理和存储结构

正确答案:C

解析:数据结构一般包括三个方面的内容:数据的逻辑结构、存储结构及数

据上的运算集合。数据的逻辑结构只抽象的反映数据元素之间的逻辑关系,而不

管它在计算机中的存储表示形式。

4. 结构化程序设计主要强调的是( )。

A.程序的规模

B.程序的效率

C.程序设计语言的先进性

D.程序的易读性

正确答案:D

解析:结构化程序设计方法的主要原则可以概括为自顶向下、逐步求精、模

块化及限制使用goto语句,总的来说可使程序结构良好、易读、易理解、易维

护。

5. 软件设计包括软件的结构、数据、接口和过程设计,其中软件的过程设

计是指( )。

A.模块间的关系

B.系统结构部件转换成软件的过程描述

C.软件层次结构

D.软件开发过程

正确答案:B

解析:软件设计包括软件结构设计、数据设计、接口设计和过程设计,其中

结构设计是定义软件系统各主要部件之间的关系;数据设计是将分析时创建的模

型转化为数据结构的定义;接口设计是描述软件内部、软件和操作系统之间及软

件与人之间如何通信;过程设计则是把系统结构部件转换成软件的过程性描述。

6. 检查软件产品是否符合需求定义的过程称为( )。

A.确认测试

B.集成测试

C.验证测试

D.验收测试

正确答案:A

解析:确认测试的任务是验证软件的功能、性能以及其他特性是否满足需求

规格说明定义的各种需求;集成测试的主要目的是发现与接口有关的错误。

7. 数据流图用于抽象地描述一个软件的逻辑模型,数据流图由一些特定的

图符构成。下列图符名标识的图符不属于数据流图合法图符的是( )。

A.控制流

B.加工

C.数据存储

D.源和潭

正确答案:A

解析:数据流图包括四个方面,即加工(输入数据经加工变换产生输出)、数

据流(沿箭头方向传送数据的通道,一般在旁边标注数据流名)、存储文件(数据

源)(表示处理过程中存放各种数据的文件)、源和潭(表示系统和环境的接口,属

系统之外的实体),不包括选项中的控制流。

8. 应用数据库的主要目的是( )。

A.解决数据保密问题

B.解决数据完整性问题

C.解决数据共享问题

D.解决数据量大的问题

正确答案:C

解析:数据库中的数据具有“集成”与“共享”的特点,亦即数据库集中了

各种应用的数据,进行统一构造与存储,从而使它们可以被不同应用程序所使用,

故选项C) 正确。

9. 在数据库设计中,将E-R图转换成关系数据模型的过程属于( )。

A.需求分析阶段

B.逻辑设计阶段

C.概念设计阶段

D.物理设计阶段

正确答案:B

解析:E-R模型即实体-联系模型,是将现实世界的要求转化成实体、联系、

属性等几个基本概念以及它们之间的两种连接关系。数据库逻辑设计阶段包括的

过程有:从E-R图向关系模式转换,逻辑模式规范化及调整,实现规范化和

RDBMS,以及关系视图设计。

10. 在数据管理技术的发展过程中,经历了人工管理阶段、文件系统阶段

和数据库系统阶段,其中数据独立性最高的阶段是( )。

A.数据库系统

B.文件系统

C.人工管理

D.数据项管理

正确答案:A

解析:人工管理阶段是在20世纪50年代中期以前出现的,数据不独立,完

全依赖于程序;文件系统阶段是数据库系统发展的初级阶段,数据独立性差;数

据库系统阶段数据具有高度的物理独立性和一定的逻辑独立性。

11. 下列选项中正确的语句组是( )。

A.char s[8]; s={“Beijing”};

B.char *s; s={“Beijing”};

C.char s[8]; s=“Beijing”;

D.char *s; s=“Beijing”;

正确答案:D

解析:本题考查字符串的定义和赋初值。选项A)、C)错误,字符数组的赋

值可以逐个字符赋给数组中各元素,也可以定义字符数组时整个字符串赋初值。

选项B)、D)是给字符指针赋值,正确的格式是char *s;s=“Beijing”;选项B)不对。

12. 有以下程序: #include <stdio.h> 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

正确答案:B

解析:本题考查对外部存储类型的结构体变量进行初始化。初始化后,

data[0]x的值为 10,data[0]y的值为100。输出++(p->x)时,++(p->x)就相当于

++data[0].x,这时 data[0].x先自增,再使用,所以输出11。

13. 以下选项小可作为C语言合法整数的是( )。

A.10110B

B.386

C.0Xffa

D.x2a2

正确答案:C

解析:整数可以用十进制、八进制或十六进制表示,并分为有符号数、无符

号数和长整型数,由此可知选项A)错;选项B),用0386表示八进制错误,因为

八进制数字为0~7八个数字,含有8是不对的;数字前加“0x”表示十六进制

数,所以D)不对。

14. 下列关于C语言数据文件的叙述中正确的是( )。

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

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

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

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

正确答案:D

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

文件,选项 A)、B)、C)错误。ASCII文件又称文本文件,它的每一个字节代表

一个字符。二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁

盘上存放。

15. 以下选项中非法的表达式是( )。

A.0<=x<100

B.i=j= =0

C.(char)(65+3)

D.x+1=x+1

正确答案:D

解析:选项A)在C语言中是一个合法的关系表达式,但它并不代表数学式

o<=x< 100。计算0<=x<100时,从左到右结合,先计算0<=x,其结果只能

是0或1,然后再比较0< 100或1<100。根据运算符的优先级,选项B)先判

断j==0是否成立,其结果只能是0或1,然后再将0或1赋给i。选项C)中,

(char)(65+3)为类型强制转换,将整数型数据转换为字符型。选项D)是将一个数

据赋给一个表达式,等号左边不合要求,所以错误。

16. 有以下程序段: main( ) { int a=5,*b,**c; c=&b;b=&a;

┆ } 程序在执行了c=&b;b=&a;语句后,表达式**c的值是( )。

A.变量a的地址

B.变量b中的值

C.变量a中的值

D.变量b的地址

正确答案:C

解析:本题考查指向指针的指针。*c表示c间接指向的对象的地址,而**c

是c间接指向的对象的值。在c*&b中,已经把b的地址存放在c里了,*c就指

向了b的地址,而b里存放的就是a的地址,那么**c应该是变量a的值。也可

以用排除法排除选项A),B)。由b= &a可知,这两个选项是同一个意思,变量b

中的值就是变量a的地址。所以可以排除。

17. 已定义以下函数: fun(int *p) { return *p;} 该函数的返回值

是( )。

A.不确定的值

B.形参p中存放的值

C.形参p所指存储单元中的值

D.形参p的地址值

正确答案:C

解析:本题考查函数的返回值。函数形参*p是一个指针变量,函数调用返

回的是p所指存储单元里的值。

18. 设有如下程序段: int x=2002,y=2003; printf(“%dn”,(x,y));则以

下叙述中正确的是( )。

A.输出语句中格式说明符的个数少于输出项的个数,不能正确输出

B.运行时产生出错信息

C.输出值为2002

D.输出值为2003

正确答案:D

解析:本题考查逗号表达式。逗号表达式的形式为:表达式1,表达式2,

其求解过程为:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达

式2的值。

19. 有以下程序: #include <stdio.h> #include <string.h>

main( ) { char str[][20]={“Hello”,”Beijing”},*P=str[0];

printf(“%dn”,strlen(p+20)); } 程序运行后的输出结果是( )。

A.0

B.5

C.7

D.20

正确答案:C

解析:本题考查字符数组和指针的运用。strlen是测试字符串长度的函数,

函数的值为字符串的实际长度,不包括’/0’在内。str[][20]={“Hello”,”Beijing”}定

义了一个2行20列的数组,数组的首地址是&str[0][0],p+20是从首地址向后移

了20位,指针指向了str[1][0]处,此时求字符串的长度,是从str[1][0]开始的,

即“Beijing”的长度,所以输出结果是7。

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

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

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

int的指针

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

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

类型元素

正确答案:B

解析:当一个数组中的元素均为指针类型数据时,该数组就称为指针数组。

int *p[3]表示此数组是指针类型的,每个数组元素(指针变量)都是指向一个整型

的指针变量。

21. 设有定义:int n=0,*p=&n,**q=&p;则下列选项中正确的赋值语句

是( )。

A.p=1;

B.*q=2;

C.q=p;

D.*p=5;

正确答案:D

解析:选项A) ,B) ,C) 的指针赋值表达方式都不正确,*p=5表示将整

数5放到指针p所指向的存储单元中。

22. 下面程序的运行结果是( )。 #include<stdio.h> main( )

{ int y=10; do{y--;}while(--y); printf(“%dn”,y--); }

A.-1

B.1

C.8

D.0

正确答案:D

解析:本题考查“++”和“--”运算符,运算符“++”是操作数加1,而“--”

则是操作数减1。在do-while循环中,首先执行y--,再执行--y。当y=2时,执

行y--,y的值变为 1,--y使y值变为0,循环结束。执行输出时,先输出y的

值0,然后执行y--,使y的值变为 -1。

23. 下面程序的输出结果是( )。 #include <stdio.h>

main( ) { int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;

printf(“%dn”,*(p+2)); }

A.3

B.4

C.1

D.2

正确答案:A

解析:在C语言中,数组元素的下标是从0开始的。指针变量p指向数组

的首地址,(p +2)就会指向数组中的第3个元素。因此输出数组元素的值为3。

24. 有如下程序段: int a[10]={1,2,3,4,5,6,7,8,9,10}; int

*p=&a[3],b;b=P[5];则b的值是( )。

A.5

B.6

C.9

D.8

正确答案:C

解析:p=&a[3]将指针指向数组a的第4个元素,p[5]则是数组a的第9个元

素,而 a[8]=9,所以b=9。

25. 设有int x=11;则表达式(x++ *1/3)的值是( )。

A.3

B.4

C.11

D.12

正确答案:A

解析:当自加运算符做后缀表达式的时候,表达式的值不变,只有变量的值

增加1,所以表达式(x++*1/3)相当于(11*1/3),值为3。

26. 请选择以下语句的输出结果( )。 printf(“%dn”,

strlen(“t”065xffn”));

A.5

B.14

C.8

D.输出项不合法,无正常输出

正确答案:A

解析:本题考查用strlen函数计算字符串长度的方法。该字符串中包含的字

符是:”t” (跳格符)、”” “(双引号)、”065”(ASCII值为八进制065,也即十进制

为53的字符)、”xff” (ASCII值为十六进制ff,也即十进制为255的字符)、”n”(换

行符)。

27. 下列程序的输出结果是( )。 #include <8tdio.h> main( )

{ double d=3.2; int x,y; x=1.2;y=(x+3.8)/5.0; printf(“%dn”,

d*y); }

A.3

B.3.2

C.0

D.3.07

正确答案:C

解析:本题中,程序先执行语句x=1.2;根据赋值运算的类型转换规则,先

将常量1.2转换为整型,取整数1,并将其赋给变量x,然后执行语句y=(x+3.8)/5.0。

根据运算符的优先级,先计算小括号内的x+3.8,其运算过程是:先将整型变量

x的值1转换为double型1.0,然后与3.8做加法运算,得到中间结果4.8,接着

进行除法运算4.8/5.0,其结果小于1.0,接着进行赋值运算,赋值号左边的变量

y的类型为整型,于是对这个小于1.0的中间结果进行取整,结果为 0。于是变

量y的值为0,d*y的值也为0。

28. 下列程序的输出结果是( )。 #include <stdio.h> int b=2;

int func(int *a) { b+=*a;return(b);} main( ) { int a=2, res=2;

res+=func(&a); printf(“%dn”,res); }

A.4

B.6

C.8

D.10

正确答案:B

解析:对于函数体中的语句b+=*a;其中的“*”是指针运算符,*a就是main

函数中变量a的值。

29. 下面能正确进行字符串赋值操作的是( )。

A.chars[5]={“ABCDE”};

B.chars[5]={‘A’,’B’,’C’,’D’,’E’};

C.char*s;s=“ABCDE”;

D.char *s;scanf(“%s”,&s);

正确答案:C

解析:如果一个字符数组用来存储字符串,那么在定义该字符数组时,数组

的大小应该比它将要实际存放的字符串长度大1,所以选项A) 和B) 错;选项

D) 中s本身就是一个字符指针,不需再取地址。

30. 执行以下程序后,a,b的值分别是( )。 #include <stdio.h

> main( ) { int a,b,k=4,m=6,*p1=&k,*p2=&m;

a=p1==&m; b=(*p1)/(*p2)+7; printf(“a=%dn”,a);

printf(“b=%dn”,b); }

A.-1,5

B.1,6

C.0,7

D.4,10

正确答案:C

解析:a=p1==&m;等价于a=(P1==&m);将p1是否等于m的地址的逻辑

值(0)赋给变量a;在b=(*p1)/(*p2)+7;语句中,(*P1)/(*p2)=0,因此将表达式的

值7赋给变量b。

31. 设有数组定义:char array[]=“China”;则数组array所占的空间是( )。

A.4个字节

B.5个字节

C.6个字节

D.7个字节

正确答案:C

解析:在定义字符数组时,可以用一个字符串作为初值,对数组进行初始化。

要注意的是,数组array的长度不是5,而是6,因为系统将自动在字符串常量的

后面加上一个”0”,因此,题干中的初始化语句与char

array[]={“C”,”h”,”i”,”n”,”9”,”0”};等价。

32. 若已定义: int a[]={0,1,2,3,4,5,6,7,8,9},*p=a,i;

其中0≤i≤9,则对a数组元素不正确的引用是( )。

A.a[p-a]

B.*(&a[i])

C.p[i]

D.a[10]

正确答案:D

解析:通常,引用一个数组元素可以用下标法,如s[p-a]和p[i]的形式;或

指针法,如 *(&a[i])的形式。在本题中a[0]=0,a[9]=9,显然a[10]超出了数组范

围。

33. 以下不正确的定义语句是( )。

A.double x[5]={2.0,4.0,6.0,8.0,10.0};

B.int y[5]={0,1,3,5,7,9};

C.char c1[]={‘1’,’2’,’3’,’4’,’5’};

D.char c2[]={‘x10’,’xa’,’x8’};

正确答案:B

解析:选项B) 中定义的y数组的长度为5,但赋初值时有6个元素,所以

是错误的。

34. 若有以下程序: #include<stdio.h> int a[]={2,4,6,8};

main( ) { int i; int *p=a; for(i=0;i<4;i++) a[i]=*p;

printf(“%dn”,a[2]); } 上面程序的输出结果是( )。

A.6

B.8

C.4

D.2

正确答案:D

解析:在C语言中,数组元素的下标是从0开始的。for循环语句中,指针

变量p始终指向数组a的首地址,因而执行循环赋值语句后数组各元素的值均变

为2。

35. 下面程序段的运行结果是( )。 char * format=“%s,a=%d,

b=%dn”; int a=11,b=10; a+ =b; printf(format,”a+=b”,a,b);

A.for,”a+=b”,ab

B.format,”a+=b”

C.a+=b,a=21,b=10

D.以上结果都不对

正确答案:C

解析:字符串常量是由双引号括起来的一串字符,每一个字符串常量都分别

占用内存中一串连续的存储空间,这些连续的存储空间实际上就是字符型一维数

组。

36. C语言允许函数类型缺省定义,此时函数值隐含的类型是( )。

A.float

B.int

C.long

D.double

正确答案:B

解析:在C语言中,对于自定义函数要遵循“先定义,后使用”的规则,

如定义时不指定函数类型,C编译系统都默认函数的返回值是int型。

37. 以下程序有语法错误,有关错误原因的正确说法是( )。 main( )

{ int G=5,k; void prt_char( );┆ k=prt_char(G);┆ }

A.语句void prt_char( );有错,它是函数调用语句,不能用void说明

B.变量名不能使用大写字母

C.函数说明和函数调用语句之间有矛盾

D.函数名不能使用下划线

正确答案:C

解析:在C程序中,若把函数定义放在函数调用之后,应该在函数调用之

前对函数进行声明,或称为函数原型说明。函数声明的类型必须与函数返回类型

一致,函数声明可以是一条独立的语句,也可以与普通变量一起出现在同一条语

句中。本题程序中声明prt_char函数是void类型,与k=prt _ char( )的类型矛

盾,所以本题的错误在于“函数说明和函数调用语句之间有矛盾”。

38. 以下叙述中不正确的是( )。

A.在不同函数中可以使用相同名字的变量

B.函数中的形式参数是局部变量

C.在一个函数内定义的变量只在本函数范围内有效

D.在一个函数内的复合语句中定义的变量在本函数范围内有效

正确答案:D

解析:C语言在函数中说明的变量为局部变量,只在函数内起作用,不会影

响到其他函数。在不同函数中使用相同的变量名不代表是同一变量,A) 项正确;

在函数定义时声明的参数只在函数内部起作用,是函数的局部变量,B) 正确;

在一个函数中定义的变量是这个函数的局部变量,所以只在这个函数内起作用,

C) 正确;复合语句中定义的变量其作用域是这个复合语句,不会扩大到整个函

数,所以D) 项错误。

39. 有以下程序: #include<stdio.h> union pw { int i;

char ch[2]; }a; main( ) { [0]=13;[1]=0;printf(“%dn”,

a.i);} 程序的输出结果是( )。

A.13

B.14

C.208

D.209

正确答案:A

解析:在本题中,首先定义了一个共用体pw,其中有两个域:整型变量i

和字符数组ch。因为共用体中的域是共享内存空间的,数组元素由低到高存储:

ch[0]在低字节;ch[1]在高字节;整型变量i占两个字节,高位与ch[1]共用存储

空间,低位与ch[0]共用存储空间,而高位 ch[1]的值为0,所以输出的成员变量

i的值就是ch[0]的值13。

40. 在16位IBM-PC机上使用C语言,若有如下定义: stmct data

{ int i; char ch; double f; } b;则结构变量b占用内存的

字节数是( )。

A.1

B.2

C.7

D.11

正确答案:D

解析:结构体变量占用内存的字节数是其所有成员占用内存字节数之和。本

题中整型变量i占用的内存是2字节,字符型变量ch占用的内存是1字节,双

精度型变量f占用的内存是8字节,三者相加为11。

41. 下面程序的运行结果是( )。 #include <stdio.h> main( )

{ int a=1,b=10; do {b-=a;a++;}while(b--<0);

printf(“a=%d,b=%dn”,a,b); }

A.a=3,b=11

B.a=2,b=8

C.a=1,b=-1

D.a=4,b=9

正确答案:B

解析:本题考查两个知识点:自加自减运算符和do -while循环语句。do -while

循环条件是b--<0,所以循环体语句只执行一次。

42. 以下程序的输出结果是( )。 #include <stdio.h> void

reverse(int a [],int n) { int i,t; for(i=0;i<n/2;i++) { t=a[i];

a[i]=a[n-1 -i];a[n-1-i] =t;} } main( ) { int b[10]={1,2,3,4,5,

6,7,8,9,10};int i,s=0; reverse(b,8); for(i=6;i<10;i++)s+=b[i];

printf(“%dn”,s); }

A.22

B.10

C.34

D.30

正确答案:A

解析:在main函数中,调用reverse函数将b数组中的前8个成员进行互置,

执行完毕后,b数组中的成员为{8,7,6,5,4,3,2,1,9,10},然后再执

行for循环结构,将b[6],b[7],…, b[9]的值相加,结果为22。

43. 有如下程序: #include <stdio.h> long fib(int n) { if(n

>2)return(fib(n-1)+fib(n-2)); else return(2); } main( )

{ printf(“%dn”,fib(3));} 该程序的输出结果是( )。

A.2

B.4

C.6

D.8

正确答案:B

解析:本题考查函数的递归调用。fib(3)=fib(2)+fib(1),而fib(2)的返回值为

2, fib(1)的返回值也为2,故输出的fib(3)的值为4。

44. 假定以下程序经编译和连接后生成可执行文件,如果在此

可执行文件所在目录的DOS提示符下键入: PROG ABCDEFGH IJKL<回车

>则输出结果是( )。 #include <stdio.h> main(int argc,char * argv[])

{ while(--argc>0)printf(“%s”,argv[argc]); printf(“n”); }

A.ABCDEFG

B.IJHL

C.ABCDEFGHIJKL

D.IJKLABCDEFGH

正确答案:D

解析:本题中,arge表示参数的个数,应为3。argv是一个指向字符串的指

针数组,指针数组argv中的元素argv[0]指向字符串“PROG”,元素argv[1]指向

字符串“ABCDEFGH”, argv[2]指向字符串“IJKL”。在while循环条件中,先

进行自减运算,再执行相应的printf语句。

45. 以下程序有错,错误原因是( )。 main( ) { int *p,i;

char *q,ch; p=&i; q=&ch; *p=40; *p=*q;

┇ }

A.p和q的类型不一致,不能执行*p=*q;语句

B.*p中存放的是地址值,因此不能执行*p=40;语句

C.q没有指向具体的存储单元,所以*q没有实际意义

D.q虽然指向了具体的存储单元,但该单元中没有确定的值,所以执行语

句*p=*q;没有意义,可能会影响后面语句的执行结果

正确答案:D

解析:在该程序中,首先声明整型指针变量p和整型变量i,字符型指针变

量q和字符型变量ch,将i的地址赋给指针变量p,将ch的地址赋给指针变量q,

然后将40赋给*p。此时,虽然q已经指向了一个具体的存储单元,但ch的值不

确定,即*q没有确定的值,所以不能执行 *p=*q;语句。

46. 函数rewind的作用是( )。

A.使文件位置指针重新返回文件的开始位置

B.将文件位置指针指向文件中所要求的特定位置

C.使文件位置指针指向文件的末尾

D.使文件位置指针自动移至下一个字符位置

正确答案:A

解析:函数rewind的功能是将文件指针重新指向一个流的开头。用法如下:

void rewind(FILE * stream);

47. 设有以下说明语句: struct ex {int x;float y;char z;} example;

则下面叙述中不正确的是( )。

A.struct是结构体类型的关键字

B.example是结构体类型名

C.x,y,z都是结构体成员名

D.struct ex是结构体类型名

infile name:n”); scanf(“%s”,infile); printf(“Enter the outfile

name:n”); scanf(“%s”,outfile); if((in=fopen(infile,”r”))==NULL)

{ printf(“cannot open infilen”);exit(0);}

if((out=fopen(outfile,”w”))==NULL) { printf(“cannot open outfilen”);

exit(0); } while(! feof(in)) fputc(fgetc(in),out); fclose(in);

fclose(out); }

A.程序完成将磁盘文件的信息在屏幕上显示的功能

B.程序完成将两个磁盘文件合二为一的功能

C.程序完成将一个磁盘文件复制到另一个磁盘文件中的功能

D.程序完成将两个磁盘文件合并并在屏幕上输出的功能

正确答案:C

解析:在C程序中,如果已经定义文件指针FILE *fp;fopen函数的功能是

打开一个文件,调用方式为fp=fopen(文件名,使用文件方式);feof函数的功能

是检查文件是否结束,调用方式为feof(FILE*fp);fpute函数的功能是把一个字

符写到磁盘文件中,调用方式为fputc(ch, fp),ch是要输出的字符,fp是指定

要将该字符写入的文件,该文件必须已经以写或读写方式打开了;fgetc函数的

功能是从磁盘文件中读入一个字符,调用方式为ch=fsetc(fp),ch是字符变量,

fp是文件指针变量;fclose函数的功能是关闭一个文件,调用方式为fclose(文件

指针)。

50. C语言中,能识别处理的文件是( )。

A.文本文件和数据块文件

B.文本文件和二进制文件

C.流文件和文本文件

D.数据文件和二进制文件

正确答案:B

解析:在计算机中,对于输入输出均采用数据流的形式。文件按照存取方式

分为顺序存取文件和随机存取文件;按照存储形式分为二进制文件和文本文件。

文本文件存储的是字符的 ASCII码,文件的内容可以直接进行输入输出;二进

制文件直接将字符存储,不能将二进制文件的内容直接输出到屏幕上。所以,C

语言能够处理的文件是文本文件和二进制文件。

填空题(每空2分,共30分)请将每一个空的正确答案写在答题卡上。注

意:以命令关键字填空的必须拼写完整。

51. 算法执行过程中所需要的存储空间称为算法的______。

正确答案:空间复杂度

解析:算法执行时所需要的存储空间,称为算法的空间复杂度。

52. 按照逻辑结构分类,数据结构可分为线性结构和非线性结构,二叉树

属于______。

正确答案:非线性结构

解析:对于一个非空的数据结构,如果同时满足下列两个条件,即1)有且只

有一个根结点;2)每一个结点最多有一个前件,也最多有一个后件; 即为线性

结构,而二叉树的结点可能存在两个后件,所以是非线性结构。

53. 软件开发环境是全面支持软件开发全过程的______的集合。

正确答案:软件工具

解析:软件开发环境是各类软件开发工具的集合体。

54. 数据库理论中,数据的独立性一般可分为物理独立性和______。

正确答案:逻辑独立性

解析:数据的独立性一般可分为物理独立性和逻辑独立性。

55. 数据库管理系统是位于用户与______之间的软件系统。

正确答案:操作系统

解析:数据库管理系统是帮助用户创建和管理数据库的应用程序的集合。因

此,数据库管理系统需要操作系统的支持,为用户提供服务。

56. 以下程序运行后的输出结果是______。 main ( ) { int p=30;

printf{“%dn”, (p/3>0?p/10:p%3) }; }

正确答案:3

解析:本题考核的知识点是条件运算符的运用。三目运算表达式的规则为如

果“?”前面表达式的值为真,则取“:”前的表达式的值,否则,取“:”后面表

达式的值。又由于条件运算符的结合方向是自右向左的,所以在本试题中,先计

算表达式中p%3,该值为0,在计算表达式P/10其值为3,最后计算表达式p/3

该值为10.所以此表达式等价于“10?3:0”,显然取“:”前的僵为3,所以最后

输出的值为3。

57. 若有程序 main ( ) { int i, j; scanf ( “i=%d, j=%d” , &i,&j );

printf(“i=%d,j-%dn “,i,j); } 要求给i赋10,给j赋20,则应该从键盘输入

______。

正确答案:i=0 j=20

解析:本题考核的知识点是scanf( )数的使用.该函数的第一个参数是格

式字符串,主要由两类字符组成,一类是非格式符要求原样输入,一类是格式符

对应要输入的变量,所以说本题中应该原样输入i=j=,后面分别给变量 0和20,

所以说空格处应该填入i=0,j=20。

58. 以下程序运行后的输出结果是______。 main ( ) { int

x=10,y=20, t=0 if(x==y) t=x;x=y;y=t; printf(“%d,%d /n”,x,y); }

正确答案:20,0

解析:本题考查的知识点是if语句的基本概念。在主函数中首先定义了三

个整型变量x、y,t,并分别给它们赋初值为10,20, 0,接着执行if语句,在

if后面括号内的条件表达式中,条件“x==y”即“10==20”不成立,则不执行

其后的语句“t=x”,然后退出if语句,顺序执行语句X=y;y=t;。执行完这两条

语句后x的值变为20,y的值变为0,所以最后输出x,y的值为20和0。

59. 有以下程序 main( ) { int n=0,m=l,x=2; if(!n) x-=1;

if(m) x-=2; if(x) x-=3; printf(“%dn”,x); } 执行后输出的结

果是______。

正确答案:-4

解析:本题考核的知识点是if...else结构的应用。if…else构造了一种二路分

支选择,是一种最基本的选择结构,if(条件) S1(if分结构) else S2(else分结

构),它的工作过程是:先对条件表达式进行判断,若为真(成立,值为非零),就

执行if分结构(S1);否则(不成立,值为0),就执行else分结构(S2)。本题中,n=0,

可以判断(!n)为真,执行x=x-1=2-1=1;m=1,可以判断(m)为真,执行x=x-2=1-2=-1;

进而可以判断(x)为真,执行x=x-3=-l-3=4。所以,最后输出为叫

60. 有以下程序: #include <stdio.h> main( ) { char c;

while((c=getchar( ))!=‘?’) putchar(--c); } 程序运行时,如查从键盘输入:

Y?N?<回车>,则输出的结果为______。

正确答案:x

解析:本题考查的知识点是while循环的程序分析;主函数中首先定义了一

个字符型变量C,接着执行下面while语句,在while循环中,首先从键盘上读

入一个字符Y并给赋给字符变量C,赋值表达式的值不为’?’,执行输出语句,

输出字符x。接着判断while中的循环条件,读入一个字符’?’,并赋值给c,赋

值表达式的值为’?’,循环条件不再满足,退出循环。

61. 有以下程序 void f( int y, int *x) { y=y+*x; *X=*X+y; }

main( ) { int x=2,y=4; f(y,&x); printf(“%d %dn”,x,y); }

执行后输出结果是______。

正确答案:8 4

解析:本题考核的知识点是函数的调用、值传递和地址传递的区别。“值传

递”指实参将值传递给形参后,实参与形参再无联系。也就是说对行参的改变将

不影响实参;地址传递是指地址或数组名作为形参时的参数传递,这种情况下对

形参的改变将对实参产生影响.函数 f(Y*x)的作用是让y的值加上指针x所指

向变量的值,让指针x所指向变量的值加上y的值。由于形参y是传值的,形参

x是传地址的,故调用该函数后,作为实参的y的值将不改变,而实参x的值将

改变,故最后输出的y的值为4,而x的值为8。

62. 函数fun的功能是计算xn double fun(double x,int n) { int i;

double y=1; for(i=1;i<=n;i++) y=y*x; return y; } 主函数

中已正确定义m、a、b变量并赋值,并调用fun函数计算:m=a4+b4-(a+b)3。实

现这一计算的函数调节器用语句为______。

正确答案:m=fun(a,4)+fun(b,4)-fun(a+b,3);

解析:本题考核的知识点是C程序的简单应用。函数fua(x,n)的作用是求x

的n次方,因此a的4次方应该调用函数tim(a,4),b的4次方应该调用函数

fun(b,4),a+b的3次方应该调用函数fun(a+b,3),所以题目中的数学表达式,写

成C程序中的语句为 m=fun(a,4)+fun(b,4)-fun(a+b,3)。

63. 以下程序运行后输出结果是______。 void swap(int x, int y)

{ int t; t=x; x=y; y=t; printf(“%d %d “,x,y”); }

main( ) { int a=3,b=4; swap(a,b);

printf(“%d %dn”,a,b); }

正确答案:4 3 3 4

解析:本题考查的是函数的传值调用。在C语宫中函数是传值调用的,印

在函数中修改形参变量的内容,不会影响传给函数的实参变量的内容。题目中首

先让a=3,b=4,然后调用swap( )函数,该函数首先交换两个参数的值,然后输

出交换后的值,即输出4和3,然后在主函数中再次输出a和b的值,由于传值

调用不会影响实参的值,所以最后输出的是3和4。

64. 以下程序运行后的输出结果是______。 #include <string.h>

void fun(char *s,int p,int k) { int i; for(i=p;i<k-1;i++)

s[i]=s[i+2]; } main( ) { char s[]=“abcdefg”; fun(s,3,strlen(s));

puts(s); }

正确答案:abcfg

解析:本题考查的是字符数组用作函数参数。C语言中数组名可以看作该数

组首地址的常量指针、因此可以直接传递给指针类型的参数。本题的主函数调用

fun(s,3,strlen(s));后,函数中for循环就是for(i=3;i<strlen(s)-1;i++),即i从3

递增到字符数组s的长度-2位置,循环中让 s[i]=s[i+2],所以函数fun( )实现

的功能简单来说就是将字符串s下标为p+2~k范围的字符整体复制到字符串s

下标为p~k-2的位置上。在本题中strlen(s)返回s的长度7,所以复制的字符为

s[5]~s[7],即’f’、 ‘g’,’0’三个字符,复制到s[3]~s[5],故最终输出的字符串

为abcfg(因为s[5]为’0’,所以后面的字符不会输出)。

65. 函数ssbc叩( )的功能是对两个字符申进行比较。当s所指字符串和

t所指字符申相等时,返回值为0;当s所指字符串大于t所指字符串时,返回值

大于0;当s所指字符串小于t所指字符串时,返回值小于0(功能等同于库函数

strcmp( ))。请填空。 #include <stdio.h> int sstrcmp(char *s, char *t)

{ while(*s && *t && *s== ) { s++;t++; } return }

正确答案:*t或t[0)*s-*t或*s-t[0]或s[0]-*t或s[0]t[0]

解析:本题考查的知识点是字符型指针变量作为函数的参数以及序符串大小

的比较.函数sstrcmp( )有两个字符型指针变量,用来指向两个字符串。比较

两个字符串的大小方法是:从第一个字符开始依次向后比较,若对应的字符相等

则接着比较下一个字符,一直到两个字符串中对应字符不等,或者有一个为”0”,

此对应字符的 ASCII码大的字符串就大。故循环条件是*s和*t不为”0”。且*s

和*t相同,第一处应填“*t”或其他等价形式。根据题意可知第二处应填“*s-*t”

或其等价形式。

66. 设函数findbig已定义为求3个数中的最大值。以下程序将利用函数指

针调用findbig函数。请填空。 main( ) { int findbig(int,int,int);

int (*f) ( ) ,x,y, z,big; f=______; scanf(“%d%d%d”,&x,&y,&z}:

big=(*f)(x,y,Z); printf(“big=%dn”,big); }

正确答案:findbig

解析:本题考核的知识点是指向函数的指针变量的使用。本题首先定义了一

个指向函数的指针变量f,如果希望让它指向某个函数,只需把函数名赋给该指

针变量即可。所以说本题的空格处应该填入函数名findbig。

67. 以下程序运行后的输出结果是______。 fun(int x) { if(x/2>0)

fun(x/2); printf(“%d “ ,x); } main( ) { fun(6); }

正确答案:1 3 6

解析:本题考核的知识点是函数递归。主函数调用函数fun(6),由于6/2>0

为真递归调用fun(3),接着递归调用fun(1),输出1,返回上一层输出3,在返回

上一层输出6。故空格处应该填1 3 6。

68. 以下程序的运行结果是______。 # include <string.h> typedef

struct student{ char name[10]; long sno; float

score; }STU; main( ) { STU

a={“zhangsan”,2001,95},b={“Shangxian”,2002,90},

c={“Anhua”,2003,95},d,*p-&d; d=a; if{strcmp(,)>

0) d=b; if(strcmp(,)>0) d=c;

printf(“%ld%sn”,,p >name}; }

正确答案:2002Shangxian

解析:本题考核的知识点是结构体类型的定义、赋初值以及字符串的比较。

本题中首先定义一个结构体类型STU,镇结构体由一个长度为10的字符型数组、

一个long型变量和一个float型变量组成。接着在主函数中用 STU定义了4个

结构体变量a、b、c、d,并且给a、 b、c赋初值,然后定义?一个结构体指针p,

并让它指向变量d。然后让将变量a的值赋给变量d,接着通过两个if语句比较

结构体变量a、b、c的成员 name大小。第一个订语句将结构体变量和

结构体变量中较小的那个赋值给结构体变量 d,第二个if语句将结构体

变量和结构体变量较大的那个赋给结构体变量d。比较通过函数

strcmp实现。strcmp( )函数有两个参数,分别为被比较的两个字符串。如果第

一个字符串大于第二个字符串返回值大于0,若第一个小于第二个返回值小于0,

相等时返回值为0。字符串比较大小的标准是从第一个字符开始依次向右比较,

遇到某一个字符大,该字符所在的字符串就是较大的字符串,如果遇到某一个字

符小,该字符所在的字符串就是较小的字符串。 程序中第一个if语句

strcmp(, )>0为真,故将b的值赋给d;第二个if语句

strcmp()>0为假,故不执行后面的语句,最后d的值为b的值,

因此输出 0和p->name的值为2002Shangxian

69. 以下程序的功能是将字符串s中的数字字符放入d数组中,最后输出

d中的字符串。例如,输入字符串 :abc123edf456gh,执行程序后输出:123456请

填空. #include <stdio.h> #include <ctype.h> main( )

{ char s[80], d[80]; int i,j; gets(s); for

(i=j=0;s[i]!=‘0’;i++) if( ) {d[j]=s[i]; j++; } d[j]=‘0’; puts

(d); }

正确答案:s[i]=‘0’&&s[i]<=‘9’或isdit(s[i])或s[i]>=48&& s[i]<=57或s[i]

<=‘9’ && s[i]>=‘0’或’9’>=s[i]] && ‘0’<=s[i]或’0’<=s[i] &&’9’>=s[i]或s[i]

<=57&& S[i]>=48或57>=s[i]&&48<=s[i]或 48<=s[i]&&57>=s[i]

解析:本题考核的知识点是字符串和字符串的存储方法,字符数组的初始化,

字符串的输入和输出的应用。C语言没有字符串变量,字符串不是存放在一个变

量中而是存放在一个字符型数组中,因此为7存放字符串,常常在程序中定义字

符型数组:字符串存放在字符数组中,但字符敷组与字符串可以不等长,C语言

规定以”0”字符作为字符串结束标志。本题中,char s[80],d[80];定义了两个字

符型。数组,可以放入80个字符。gets函数是C语言提供的一个专门用于读字

符串的函数,它读入全部字符 (包括空格),直到遇到回车为止。本题中,读八

字符串s后,开始比较s中的每个字符是否为数字字符,因为字符数据在内存中

以相应的ASCII码存放,所以只需比较相应的ASCII码值是否在48(‘0’的 ASCII

代码)与57(‘9’的ASCII代码)之间,或者直接与’0’,’9’,进行比较,如果是数字

字符则将此字符存入d数组中,不是则继续进行下一字符的比较,直至s结束

(即’0’的出现).将”0”。字符作为字符串 d结束标志,最后调用puts函数输出d。

所以在空格处应填入比较语句s[i]>=‘0’&& s[i]<=‘9’ 或 isdigit(s[i])或s[i]>

=48&& s[i]<=57或s[i]<=‘9’&& s[i]>=‘0’或’9’>=s[i] &&’O’<=s[i]或’0’<=s[i]

&&’9’ >=s[i]或s[i]<=57 &&

=s[i]&&57>=s[i]。

s[i]>=48或 57>=s[i]&&48<=s([i]或48<


本文标签: 函数 文件 字符 变量 数组