2024年2月3日发(作者:)

二级C语言分类模拟题546

(总分65, 做题时间90分钟)

选择题

1.

有以下程序

#include<stdio.h>

struct S

{int a,b;}data[2]={10,100,20,200};

main()

{ struct S p=data[1];

printf("%dn",++(p.a));

}

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

SSS_SINGLE_SELA 21

B 11

C 20

D 10

分值: 2

答案:A

[解析] 声明 data 是结构体型S的数组。初始化时data[0].a=10;

data[0].b=100;data[1].a=20;data[1].b=200。主函数中p=data[1] ; 即p.a=data[1].a;p.b=data[1].b;执行语句printf("%dn",++(p.a)); 打印输出时 p.a 先增1再打印。即p.a = data[1].a=20,先增1等于21,因此程序运行结果是21。

2.

有以下程序(说明:字母A的ASCII码值是65):

#include<stdio.h>

void fun(char*s)

{ while(*s)

{ if(*s%2)printf("%c",*s);

s++;

}

}

main()

{ char a()="BYTE";

fun(a);

printf("n");

}

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

SSS_SINGLE_SEL

A BT

B YE

C YT

D BY

分值: 1

答案:B

[解析] 本题中执行fun(a)时,会取字符串a的第一个字母B,因为字母B的ASCII码值为66,所以不会输出字母B,函数只会输出ASCII码值为奇数的字母,字母Y的ASClI码值为89,字母T的ASCII码值为84,字母E的ASCII码值为69,因此B选项正确。

3.

可在C程序中用作用户标识符的一组标识符是______。

SSS_SINGLE_SEL

A void define WORD

B as_b3 _123 If

C For —abc case

D 2c DO SIG

分值: 2

答案:B

4.

下面for语句的循环次数为______。

for(x=1, y=0; (y!=19)&&(x<6); x++);

SSS_SINGLE_SEL

A 是无限循环

B 循环次数不定

C 最多执行6次

D 最多执行5次

分值: 2.5

答案:D

[解析] 本题考查for循环的使用。根据条件考虑x的取值变化,x从1取到5,可以循环5次,但并不知道y如何变化,有可能出现y=19提前跳出循环的情况,所以最多执行5次。

5.

下面描述中,不属于软件危机表现的是______。

SSS_SINGLE_SELA 软件过程不规范

B 软件开发生产率低

C 软件质量难以控制

D 软件成本不断提高

分值: 1.5

答案:A

[解析] 软件危机主要表现在:软件需求的增长得不到满足;软件开发成本和进度无法控制;软件质量难以保证;软件不可维护或维护程度非常低;软件的成本不断提高;软件开发生产率的提高赶不上硬件的发展和应用需求的增长。因此本题答案为A。

6.

下列叙述中正确的是______。

A 对长度为n的有序链表进行查找,最坏情况下需要的比较次数为n

B 对长度为n的有序链表进行对分查找,最坏情况下需要的比较次数为(n/2)

C 对长度为n的有序链表进行对分查找,最坏情况下需要的比较次数为(log2n)

D 对长度为n的有序链表进行对分查找,最坏情况下需要的比较次数为(nlog2n)

分值: 1

答案:C

[解析] 二分法查找只适用于顺序存储的有序表,对于长度为n的有序线性表,最坏情况只需比较log

2 n次。

7.

以下选项中不能用作C程序合法常量的是______。

SSS_SINGLE_SELSSS_SINGLE_SEL

A 1,234

B 123

C 123

D "x7G"

分值: 2

答案:A

[解析] 选项A中的1,234在两侧加双引号才是C程序的合法常量。

8.

若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是______。

A 函数的实参和其对应的形参共占同一存储单元

B 形参只是形式上的存在,不占用具体存储单元

C 同名的实参和形参占同一存储单元

D 函数的形参和实参分别占用不同的存储单元

分值: 2.5

答案:D

[解析] 在C语言中,函数的实参单元与形参单元在内存中分配不同的存储单元。

9.

对关系S和关系R进行集合运算,结果中既包含关系S中的所有元组也包含关系R中的所有元组,这样的集合运算称为______。

SSS_SINGLE_SELSSS_SINGLE_SEL

A 并运算

B 交运算

C 差运算

D 除运算

分值: 2.5

答案:A

[解析] 关系的并运算是指,由结构相同的两个关系合并,形成一个新的关系,其中包含两个关系中的所有元组。

10.

有以下程序

#include<stdio.h>

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);

}

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

SSS_SINGLE_SEL

A x=8

B x=4

C x=6

D x=12

分值: 2

答案:A

[解析] 本题考查的是for循环的嵌套。外循环的循环变量i从0递增到1会循环2次,内循环的循环变量j从0递增到3会循环4次。但是内循环中有一条if语句,每当j%2为真,即j为奇数时会跳过下面的x++;语句,所以4次内循环只有2次执行到x++;语句,再加上外循环中包含的2条x++;语句,所以每次外循环会使x自增4次,2次外循环下来x的值为8。故应该选择A。

11.

设有条件表达式:(EXP)?i++;j-,则以下表达式中(EXP)完全等价的是______。

SSS_SINGLE_SEL

A (EXP==0)

B (EXP!=0)

C (EXP==1)

D (EXP!=1)

分值: 2

答案:B

12.

以下定义语句中正确的是______。

SSS_SINGLE_SEL

A char a="A"b="B";

B flo at a=b=10.0;

C int a=10,*b=&a;

D float *a,b=&a;

分值: 1

答案:C

[解析] 在A选项中,定义了两个char型的变量,但是在这两个变量之间应该加上逗号;在B选项中,没有对b进行定义,只是对b进行了赋值,因此是错误的;在D选项中,把一个指针赋值给了一个float型的变量,因此是错误的。

13.

以下程序的输出结果是______。

main()

{ int a=3;

printf("%dn", (a+a-=a*a));

}

SSS_SINGLE_SEL

A -6

B 12

C 0

D -12

分值: 2.5

答案:D

[解析] 本题可以写成:a+a+(a-(a*a)),因为*的优先级最高,其次是-=的,+的优先级最低,所以先求a-=a*a=9,表达式变为a+a+-=9,即a=a-9=-6,再次变为a+(-6)=-12,故选择D选项。

14.

有三个关系R、S和T如下:

R

A B C

a 1 2

b 2 1

c 3 1

S

A D

c 4

T

A B C D

c 3 1 4

则由关系R和S得到关系T的操作是______。

SSS_SINGLE_SEL

A 自然连接

B .交

C 投影

D .并

分值: 2

答案:A

[解析] 自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉,因此根据T中元组可以判断关系R和S做的是自然连接操作,答案为A。

15.

请读程序段:

char str[]="ABCD",*p=str,

printf("%dn",*(p+4));

程序段的输出结果是______。

SSS_SINGLE_SELA 68

B 0

C 字符"D"的地址

D 不确定的值

分值: 1

答案:B

[解析] 在对字符数组赋字符串值时,系统会自动在字符串的末尾加上一个字符串结束标志“0”,故指向字符数组的指针p的*(p+4)的值为“0”。由于“0”的编码值就是0,所以本题输出为0。

16.

以下程序段中有语法错误的是______。

A fun(char aa[1()]){while(*aa)printf("%c",*aa++);}

B fun(chatr*aa){while(aa[0])printf("%c",*aa++);}

C main(){char*aa="Hello!";}while(*aa)printf("%c",*aa++);}

D main(){char aa[10]="Hello!";}while(*aa)printf("%c",*aa++); }

分值: 2

答案:D

17.

有以下程序:

main()

{int e[]={2,4,6,8,10},y=0,x,*p;

p=&a[1];

for(x=1;x<3;x++)y+=p[x];

printf("%dn",y);

}

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

SSS_SINGLE_SELSSS_SINGLE_SEL

A 10

B 11

C 14

D 15

分值: 2

答案:C

[解析] 指针变量p指向数组元素a[1],则p[1]即为a[2],p[2]即为a[3],执行第一次for循环时,y=y+p[1]=0+a[2]=6,第二次执行for循环,y=y+p[2]=6+a[3]=14,此时x为3,for循环条件不满足,退出循环,输出y的值为14。

18.

有以下程序:

#include <stdio.h>

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) ;

}

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

SSS_SINGLE_SEL

A 36

B 24

C 32

D 28

分值: 2.5

答案:D

[解析] 在主函数main( )中定义了两个变量s和i,同时给s赋初值。a=4,i赋初值0。当i=0时。执行“s+=f(i);”语句,调用f()并将i的初值0传递给形参n。首先执行if语句中的条件:n%2,若条件为假,则执行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的初值传递给形参n。首先执行if语句中的条件:n%2,条件为真,执行if下面的语句,t=0,a=6 t=0+6=6,使用return返回t,t=6+6=12,返回主函数中,s=16+12=28。最后输出的结果为28。因此D选项正确。

19.

有以下程序段:

FILE*fp;

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

{printf("不能打开文件!");

exit(0);}

else

printf("成功打开文件!");

若指定文件不存在,且无其他异常,则以下叙述错误的是______。

A 输出“不能打开文件!”

B 输出“成功打开文件!”

C 系统将按指定文件名新建文件

D 系统将为写操作建立文本文件

分值: 1

答案:A

[解析] fopen函数以一定方式打开指定文件,返回一个指向文件的文件指针,如果不能实现打开指定文件的操作,则返回一个空指针NULL。如果指定文件不存在则创建一个文件名为指定文件名的新文件,然后打开它。程序中,文件不存在,但无其他异常,表示可以建立新文件,命名为,C项正确,并以只写方式打开它,D项正确,返回指向文件的指针,if条件不成立,输出“成功打开文件!”,B项正确。

20.

有以下程序:

#include <stdio.h>

main( )

{

int a[ ]={2,4,6,8}, *p=a,i;

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

a[i]=*p++;

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

}

程序的输出结果是______。

SSS_SINGLE_SELSSS_SINGLE_SEL

A 2

B 8

C 4

D 6

分值: 1

答案:D

[解析] 本题通过语句“*p=a”将一维数组a的首地址的值赋值给变量p,即p的值为2。执行for循环,a[i]=*p++,指将p的值赋给a[i]后,再进行自增操作,因此4次循环后a[2]的值为6。因此D选项正确。

21.

以下程序段中的变量已正确定义

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

for(k=1;k<3;k++);printf("*");

程序段的输出结果是______。

SSS_SINGLE_SELA * *

B ****

C *

D ********

分值: 1

答案:C

[解析] 由于内层循环for(k=1;k<3;k++)后面直接跟了空语句“;”,因此在循环内部什么操作也不做,执行完内层循环后执行打印语句,所以打印了一个“*”,故本题答案C。

22.

有以下程序:

#include <stdio.h>

void f(int x[],int n)

{ if(n>1)

{ f(&x[1], n-1);

printf("%d,",x[0]);

}

else

printf("%d,",x [0]);

}

main()

{int z[6]={1,2,3,4,5,6};

f(z,6); printf("n");

}

程序的运行结果是______。

SSS_SINGLE_SEL

A 6,5,4,3,2,1,

B 1,1

C 1,1,1,1,1,1,

D 1,2,3,4,5,6,

分值: 1

答案:A

[解析] 在调用一个函数的过程中又出现直接或间接的调用该函数本身,称为函数的递归调用。本题目中递归函数调用执行过程为:f(z,6)->f(&z[1],5)->f(&z[2],4)->f(&z[3],3)->f(&z[4],2)->f(&z[5],1),输出x[0],也即z[5]=6,返回执行f(&z[4],2)之后的输出x[0]语句,即5,同理再返回上一个f函数,依次输出4,3,2,1,故A选项正确。

23.

以下叙述中错误的是______。

SSS_SINGLE_SELA

B

C

D

分值: 2

答案:D

[解析] C语言程序生成的.exe文件是二进制的可执行文件,它不需要C语言集成开发环境的支持,可以直接运行。

24.

下列对于线性链表的描述中正确的是 ______。

A 存储空间不一定是连续,且各元素的存储顺序是任意的

B 存储空间不一定是连续,且前件元素一定存储在后件元素的前面

C 存储空间必须连续,且各前件元素一定存储在后件元素的前面

D 存储空间必须连续,且各元素的存储顺序是任意的

分值: 2

答案:A

[解析] 线性链表属于链式存储结构,在链式存储结构中,存储空间可以不连续,各元素的存储顺序是任意的,元素之间的逻辑关系是由指针域来决定的。

25.

以下定义数组的语句中错误的是______。

A int num[2][4]={{1,2},{3,4},{5,6}}

B int num[][3]={{1,2},3,4,5,6);

C int num[]={1,2,3,4,5,6};

D int num[][4]={1,2,3,4,5,6};

分值: 2

答案:A

[解析] int num[2][4]定义2行4列数组,赋值给num数组3行错误。所以选择A。

26.

下列选项中不能作为C语言合法常量的是 ____ 。

SSS_SINGLE_SELSSS_SINGLE_SELSSS_SINGLE_SEL

C语言的可执行程序是由一系列机器指令构成的

用C语言编写的源程序不能直接在计算机上运行

通过编译得到的二进制目标程序需要连接才可以运行

在没有安装C语言集成开发环境的机器上不能运行C源程序生成的.exe文

A "cd"

B 0.1e+6

C "a"

D "011"

分值: 1

答案:A

[解析] 所谓常量是在程序运行过程中,其值不能被改变的量。包括整型数量、实型常量、字符常量和字符串常量等类型。选项B中0.1e+6是用指数形式表示的实型常量。C语言的语法规定,字母e之前必须要有数字,后面的指数必须

为整数,并且在字母e前后以及数字之间不得插入空格,选项C中用双引号括起来表示字符串a。选项D中"011"表示用单引号括起来的转义字符八制进数011。选项A中在用单引号表示的字符常量中,只能包含一介字符。

27.

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

SSS_SINGLE_SEL

A 3

B 4

C 11

D 12

分值: 1

答案:B

28.

若有以下类型说明语句:

char w;int x;flooat y,z;

则表达式w*x+z-y的结果为______类型。

SSS_SINGLE_SEL

A float

B char

C int

D double

分值: 1

答案:A

[解析] 在进行运算时,不同类型的数据参加运算,需要先将其转换成同—类型的数据,然后再进行运算。转换的顺序由低到高为:char,short→int→unsigned→long→double←float,故结果为float型。

29.

现在有以下定义,int a;double b;float c;char k;则下面的表达式a/b+c-k值的类型为:

SSS_SINGLE_SELA int

B double

C float

D char

分值: 1

答案:B

[解析] 双目运算中两边运算量类型转换规律:

运算数1 运算数2 转换结果类型

短整型 长整型 短整型->长整型

整型 长整型 整型->长整型

字符型 整型 字符型->整型

有符号整型无符号整型有符号整型->无符号整型

整型 浮点型 整型->浮点型

在a/b的时候,a,b的类型不一致,根据类型转换规则,把整型转换成double

类型,之后的加,减类似。转化规则为char,short→int→unsigned→long→double←float

30.

若有以下程序:

#include <stdio.h>

int f(int m)

{ static int n=0;

int a=2;

n+ +; a+ +; return n+m+a;

}

main( )

{ int k;

for.(k=0; k<4; k+ +) printf("%d,", f(k));

}

则程序的输出结果是______。

SSS_SINGLE_SEL

A 3,5,7,9,

B 4,7,10,13,

C 4,5,6,7,

D 4,6,8,10,

分值: 2

答案:D

[解析] 本题考查静态局部变量以及自增运算符,静态局部变量在函数凋用结束后,并不释放,仍然保留它的值,本题中,k为0时,return n+m+a之前,n为1,a为局部变量,值为3,m为0,所以第一个返回值为4。k为1,在函数返回值之前,静态局部变量为2,局部变量a仍然为3,m为1,所以结果是6,依此类推答案为D。

31.

有以下定义:“int a; long b; double x, y;”,则以下选项中正确的表达式是______。

SSS_SINGLE_SEL

A a%(int x-y)

B a=x!=y;

C (a*y)%b

D y=x+y=x

分值: 1

答案:D

[解析] 选项A、C,取模运算符(%)用于计算两个整数相除所得的余数,int x-y与a*y的结果是双精度,因此不能使用取模运算符;选项B,a是属于整型变量,x、y属于双精度变量,因此不能将x赋值给a。

32.

已知下列函数定义:

fun(int *b,int c,int n,int data)

{int k;

for(k=0;k<m*n;k++)

{*b=data;

b++;}

}

则调用此函数的正确写法是(假设变量a的说明为int a[50])______。

SSS_SINGLE_SEL

A fun(*a,4,5,1);

B fun(&a,4,5,1);

C fun((int*)a,4,5,1);

D fun(a,4,5,1);

分值: 2.5

答案:D

[解析] 本题考查函数调用时的参数传递。fun函数的调用形式为“fun(int

*b,int m,int n,int data)”,而调用数组时,用数组名表示一个指向数组第一个元素的指针,因此调用时的形式为fun(a,4,5,1)。

33.

设q1和q2是指向一个int型一维数组的指针变最,k为float型变量,下列小能正确执行的语句是 ____ 。

SSS_SINGLE_SELA k=*q1*(*q2);

B q1=k;

C q1=q2;

D k=*q1+*q2;

分值: 2

答案:B

[解析] 本题考查指针变量的赋值操作。选项A)是将指针q1和q2所指向的变量值相乘,然后赋给k;选项B)中,float型数据和指引型数据之间不能进行赋值运算;选项C)中,是两个指针变量之间的赋值;选项D)中,是两个指针型变量所指向的两个int型数据相加。

34.

设有如下关系表:

则下列操作正确的是______。

SSS_SINGLE_SEL

A T=R/S

B T=R×S

C T=R∩S

D T=R∪S

分值: 2.5

答案:C

[解析] T就是关系R中有的,同时S中也有的有序组(4、5、6),即交运算(∩)。

35.

下列判断正确的是 ____ 。

A chara="ABCD";等价于char*a;*a="ABCD";

B char str[10]={"ABCD"};等价于char str[10];str[]={"ABCD"};

C char*s="ABCD";等价于char s;*s="ABCD";

D charc[5]="ABCD",d[5]="ABCD";等价于char c[5]=d[5]="ABCD";

分值: 1

答案:D

[解析] a="ABCD"书写错误,因为“;”左边不能出现常量;数组名s是代表s数组首地址的地址常量,而不是变量;字符串只有在定义时维数可以省略。

36.

在软件设计中不使用的工具是______。

SSS_SINGLE_SELSSS_SINGLE_SEL

A 系统结构图

B 程序流程图

C PAD图

D 数据流图(DFD图)

分值: 1

答案:C

[解析] 数据分析主要使用的是数据流图和数据字典,概念设计阶段使用的是系统结构图,在详细设计阶段使用的是程序流程图。所以答案选择C。

37.

某二叉树中有n个度为2的结点,则该二叉树中的叶子结点数为______。

SSS_SINGLE_SEL

A n+1

B n-1

C 2n

D n/2

分值: 1

答案:A

38.

有以下程序

#include <stdio.h>

main()

{ int n,*p=NULL;

*p=&n;

printf("Input n:"); scanf("%d",&p); printf("output n:");

printf("%dn",p);

}

该程序试图通过指针p为变量n读入数据并输出,但程序有多处错误,以下语句正确的是______。

SSS_SINGLE_SEL

A int n,*p=NULL;

B *p=&n;

C scanf("%d",&p)

D printf("%dn",p);

分值: 1

答案:A

[解析] 选项B的正确写法应为“p=&n;”,选项C的正确写法应为“scanf("%d",p);”,选项D的正确写法应为“printf("%din",*p);”。故本题答案为A。

39.

以下关于C语言数据类型使用的叙述中错误的是______。

A 若只处理“真”和“假”两种逻辑值,应使用逻辑类型

B 若要保存带有多位小数的数据,可使用双精度类型

C 若要处理如“人员信息”等含有不同类型的相关数据,应自定义结构体类型

D 整数类型表示的自然数是准确无误差的

分值: 1

答案:A

[解析] C语言不存在逻辑类型,所以A错误。单精度float类型可提供6位有效数字,双精度double类型可提供16位有效数字,所以要保存带有多位小数的数据,要使用双精度类型,所以B选项正确。结构体类型可以保存不同类型数据,所以C正确,整数的表示是不存在误差的,所以D选项正确。

40.

在数据结构中,从逻辑结构上看可以分成______。

SSS_SINGLE_SELSSS_SINGLE_SEL

A 动态结构和静态结构

B 线性结构和非线性结构

C 内部结构和外部结构

D 紧凑结构和非紧凑结构

分值: 2

答案:B

1