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


发布评论