二级C语言分类模拟题537.docx
《二级C语言分类模拟题537.docx》由会员分享,可在线阅读,更多相关《二级C语言分类模拟题537.docx(20页珍藏版)》请在冰点文库上搜索。
![二级C语言分类模拟题537.docx](https://file1.bingdoc.com/fileroot1/2023-5/5/caa930d4-dd87-4e24-96bc-40349c6f32f5/caa930d4-dd87-4e24-96bc-40349c6f32f51.gif)
二级C语言分类模拟题537
二级C语言分类模拟题537
(总分:
56.50,做题时间:
90分钟)
一、选择题(总题数:
40,分数:
56.50)
1.有以下程序:
#include<stdio.h>
structS{inta;intb;};
main()
{structSa,*p=&a;
a.a=99;
printf("%d/n",______);
}
程序要求输出结构体中成员a的数据,以下不能填入横线处的内容是______。
(分数:
1.00)
A.a
B.*p.a √
C.p->a
D.(*p).a
解析:
[解析]本题考查结构体变量的引用。
题目中要求输出结构体中成员a的数据,p为指针,*p为结构体变量,那么*p.a可以表示为结构体中成员a的数据。
2.下列叙述中正确的是______。
(分数:
1.00)
A.空字符串不占用内存,其内存空间大小是0
B.两个连续的单引号(")是合法的字符常量
C.可以对字符串进行关系运算
D.两个连续的双引号("")是合法的字符串常量 √
解析:
[解析]字符串常量(包括空字符串)所占内存字节数等于字符串中字节数加1,A选项错误。
字符常量是用单引号括起来的一个字符,B选项错误。
C语言中,字符串比较不能直接用关系运算符进行正确比较,可以用字符串比较函数strcmp来实现,C选项错误。
字符串常量是由一对双引号括起的字符序列,D选项正确。
3.以下选项中可用作C程序合法实数的是______。
(分数:
1.00)
A.3.0e0.2
B..1e0 √
C..E9
D.9.12E
解析:
[解析]e前e后有数字,e后数值为整数,所以A、C、D错误。
4.有如下程序:
#include<stdio.h>
structperson
{
charname[10];
intage;
};
main()
{
structpersonroom[2]={{"Wang",19},{"Li",20}};
printf("%s:
%d/n",(room+1)->name,room->age);
{
程序运行后的输出结果是______。
(分数:
1.00)
A.Li:
19 √
B.Wang:
19
C.Li:
20
D.Wang:
17
解析:
[解析]声明结构类型person后,在main函数中定义了一个结构数组room,其中有2个元素,每个元素都是person类型数据。
在输出中,因为room表示数组首地址,首地址+1,指向room数组中第二个元素,并将该元素的name信息进行输出,同理,对第一个元素中的age信息输出,因此,答案为A选项。
5.有以下程序(字母A的ASCII代码为65):
#include<stdio.h>
main()
{
charc1="A".c2="Y";
printf("%d,%d/n",c1,c2);
}
程序运行后的输出结果是______。
(分数:
1.00)
A.输出格式不合法,输出出错信息
B.A,Y
C.65,90
D.65,89 √
解析:
[解析]一个整数,只要它的值在0~255范围之内,也可以用字符形式输出。
输出之前,系统会将该整数转化为相应的ASCII码字符。
字符也可以用整型来输出,输出的是对应的ASCII值。
"A"的ASCII值为65,"Y"的AScII值为89,故D选项正确。
6.有以下程序:
#include<stdio.h>
intf(intx);
main()
{intn=1,m;
m=f(f(f(n)));printf("%d/n",in);
}
intf(intx)
{returnx*2;}
程序运行后的输出结果是______。
(分数:
1.00)
A.8 √
B.2
C.4
D.1
解析:
[解析]第一次调用m=f(f(f
(1))),第二次调用m=f(f
(2)),第三次调用m=f(4),即返回值为8。
所以选择A选项。
7.fgets(str,n,fp)函数从文件中读入一个字符串,以下错误的叙述是______。
(分数:
3.00)
A.字符串读入后会自动加入"/0"
B.fp是指向该文件的文件型指针
C.fgets函数将从文件中最多读入n个字符 √
D.fgets函数将从文件中最多读入n-1个字符
解析:
8.下列叙述中,正确的是______。
(分数:
1.00)
A.C程序中的注释只能出现在程序的开始位置和语句的后面
B.C程序书写格式严谨,要求一行内只能写一个语句
C.C程序的书写格式自由,一个语句可以写在多行上 √
D.用C语言编写的程序只能放在一个程序文件中
解析:
[解析]C程序中注释可以放在任意位置;C语言的语法限制不严格,所以可以将多条语句放在同一行上;C程序可以放在多个程序文件中,并使用include语句进行文件包含。
故本题答案为C。
9.有以下程序:
#include<stdio.h>
main()
{
inta=1,b=2,c=3,d=0;
if(a==1&&b++==2)
if(b!
=2||c--!
=3)
printf("%d,%d,%d/n",a,b,c);
elseprintf("%d,%d,%d/n",a,b,c);
elseprintf("%d,%d,%d/n",a,b,c);
}
程序的运行结果是______。
(分数:
2.50)
A.1,3,2
B.1,3,3 √
C.1,2,3
D.3,2,1
解析:
[解析]else总是和最近的if配对,所以进入第一个if语句中进行条件判断时,因为是逻辑与操作,需要两边运算对象的值均为非零值才为真,所以需要逐个执行判断的结果为1。
进入第二个if语句条件判断,因为b!
=2条件成立,所以整个条件表达式的值为真,不再执行逻辑或的第二个运算对象(c--!
=3)c的值不变,也不再执行第一个else语句。
打印a的值1,b的值3,c的值3。
10.有三个关系R,S和T如下:
R
A
B
C
a
1
2
b
2
1
c
3
1
S
A
B
C
d
3
2
T
A
B
C
a
1
2
b
2
1
c
3
1
d
3
2
其中关系T由关系R和S通过某种操作得到,该操作为______。
(分数:
1.00)
A.选择
B.投影
C..交
D..并 √
解析:
[解析]在关系T中包含了关系R与S中的所有元组,所以进行的是并的运算,答案为D。
11.有以下程序(注:
字符a的ASCH码值为97):
#include<stdio.h>
main()
{char*s={"abc"};
do
{printf("%d",*s%10);++s;}
while(*s);
}
程序运行后的输出结果是______。
(分数:
1.00)
A.789 √
B.abc
C.7890
D.979899
解析:
[解析]因为小写字符a,b,c的ASCII码值分别勾97,98,99,而在dowhile循环语句中,每次对字符的ASCII码值取余数并输出,所以分别输出7,8,9。
12.以下叙述中正确的是______。
(分数:
1.00)
A.在C语言中,预处理命令行都以“#”开头 √
B.预处理命令行必须位于C源程序的起始位置
C.#include<stdio.h>必须放在C程序的开头
D.C语言的预处理不能实现宏定义和条件编译的功能
解析:
[解析]预处理命令是以“#”号开头的命令,它们不是C语言的可执行命令,这些命令应该在函数之外书写,一般在源文件的最前面书写,但不是必须在起始位置书写,因此B、C选项错误。
C语言的预处理能够实现宏定义和条件编译等功能,因此D选项错误。
故本题答案为A。
13.若变量已正确定义,下列正确的程序段是____。
(分数:
2.00)
A.while(ch=getchar()=="/N")putchar(ch);
B.while((ch=getchar())=="/n")putchar(ch);
C.while((ch=getchar())!
="/N")putchar(ch);
D.while((ch=getchar())!
="/n")putchar(ch); √
解析:
[解析]本题考查两个知识点:
①C语言用"/n"这个字符常量表示换行;②函数getchar()的作用是从终端输入一个字符,当遇到换行时结束输入。
14.以下有4组用户标识符,其中合法的—组是______。
(分数:
1.00)
A.FOR-subCase
B.4dDOSize
C.f2_G3IFabc √
D.WORDvoiddefine
解析:
[解析]C语言的标识符的定义为:
以字母或下划线开头的由字母、数字字符、下划线组成的字符串。
而且标识符不能与关键字相同。
15.以下选项中合法的常量是______。
(分数:
1.00)
A.999
B.2.7e
C.OXab √
D.123E0.2
解析:
[解析]A选项中含有非法的空格,所以错误。
C语言中十六进制常量以Ox开头,所以C选项正确。
实型常量中e的前后必须均有数据,且其后必须为整数,所以B选项和D选项错误。
16.下列定义变量的语句中错误的是______。
(分数:
2.50)
A.doubleint_;
B.floatUS$; √
C.charFor;
D.int_int;
解析:
[解析]变量命名规范:
由字母数字下划线组成,且数字不作为开头。
所以B错误。
17.若二维数组a有m列,则在a[i][j]前的元素个数为____。
(分数:
1.00)
A.i*m+j-1
B.i*m+j √
C.j*m+1
D.i*m+j+1
解析:
[解析]二维数组的元素可以看成是按矩阵形式存放的,数组第一维的下标是i,说明它前面还有i行,有i*m个元素,数组第二维的下标是j,说明它前面还有j列,有j个元素,所以共有i*m+j个元素。
18.有以下程序
#include<stdio.h>
main()
{intx;
scanf("%d",&x);
if(x<=3);else
if(x!
=10)printf("%d/n",x);
}
程序运行时,输入的值在哪个范围才会有输出结果______。
(分数:
1.00)
A.大于3且不等于10的整数 √
B.不等于10的整数
C.大于3或等于10的整数
D.小于3的整数
解析:
[解析]大于3执行else语句,不等于10,就会输出x的值,所以选择A。
19.有以下程序:
#include<stdio.h>
main()
{chars1[]="programe",s2[]="Language";
char*p1=s1,*p2=s2;
intk;
for(k=0;k<8;k++)
if(*(p1+k)==*(p2+k))
printf("%s/n",*(p1+k));
}
程序的运行结果是______。
(分数:
1.00)
A.grameamee √
B.gae
C.programe
D.无输出字符
解析:
[解析]定义两个指针变量p1、p2,分别指向数组s1、s2首地址,在for循环中,比较两个指针所指地址的元素是否相等,如果相等,则输出当前指针指向地址的字符串。
20.假定已建立以下链表结构,且指针P和q已指向如下图所示的结点:
则以下选项中可将q所指向结点从链表中删除并释放该结点的语句组是
(分数:
2.00)
A.(*p).next=(*q).next;free(p);
B.p=q->next;free(q);
C.p=q;free(q);
D.p->next=q->next;free(q); √
解析:
[解析]要从链表中删除b,只需要将c结点的地址赋给p->next即可。
c结点的地址存放在q->next中,因此,p->next=q->next即可,然后用free(q)释放指针q的空间。
21.若有定义intx,y;并已正确给变量赋值,则以下选项中与表达式(x-y)?
(x++):
(y++)中的条件表达式(x-y)等价的是______。
(分数:
1.00)
A.(x-y<0||x-y>0) √
B.(x-y<0)
C.(x-y>0)
D.(x-y==0)
解析:
[解析]条件表达式:
x=表达式1?
表达式2:
表达式3的含义是:
先求解表达式1,若其值为非0(真),则求解表达式2,将表达式2的值赋给x,若表达式1的值为0(假),则求解表达式3,将表达式3的值赋给x。
在本题中与表达式(x-y)等价的是(x-y<0||x-y>0),A选项正确。
22.有以下程序:
#include<stdio.h>
voidfun(char**p)
{++p;printf("%s","p);}
main()
{char*a[]={"Morning","Afternoon","Evening","Night"};
fun(a);
}
程序的运行结果是______。
(分数:
2.50)
A.Afternoon √
B.fternoon
C.Morning
D.orning
解析:
[解析]执行fun(a)语句时,p指向的是字符串数组a的第一个字符串“Morning”,p自加1之后,p指向字符串数组a的第2个字符串“Afternoon”。
23.在16位IBM-PC上使用C语言,若有如下定义:
structdata
{inti;
charch;
doublef;
}b;
则结构变量b占用内存的字节数是____。
(分数:
2.00)
A.1
B.2
C.7
D.11 √
解析:
[解析]结构体变量所占用内存的字节数是其所有成员所占用内存字节数之和。
本题中整型变量i所占用的内存是2字节,字符型变量ch所占用的内存是1字节,双精度型变量f所占用的内存是8字节,三者相加即可。
24.以下叙述中正确的是______。
(分数:
1.00)
A.用C语言实现的算法必须要有输入和输出操作
B.用C语言实现的算法可以没有输出,但必须要有输入
C.用C程序实现的算法可以没有输入,但必须要有输出 √
D.用C程序实现的算法可以既没有输入,也没有输出
解析:
[解析]本题考查的是c语言中算法的特性。
一个算法具有5个特性:
有穷性、确定性、可行性、有零个或多个输入以及一个或多个输出。
所以,选项C正确。
25.有以下程序段:
charstr[4][12]={"aaa","bbb","ccc","ddd"},*p[4];
inti;
for(i=0;i<4;i++)p[i]=str[i];
以下选项中不能正确引用字符串的是______。
(分数:
1.00)
A.*p[3] √
B.p[3]
C.str[2]
D.*p
解析:
[解析]*p[3]→p[3][0]是一个字符,不是字符串,选项A错误。
p[3]和str[2]和*p分别代表了ddd,ccc,aaa。
答案为A选项。
26.以下定义语句中,编译时会出现编译错误的是____。
(分数:
1.00)
A.chara="a";
B.chara="/n"
C.chara="aa"; √
D.chara="/xgd";
解析:
[解析]char类型用于存储单个字符的简单变量类型,它可以被指定为一个字符常量或一个整数。
27.已知大写字母A的ASCII码值是65,小写字母a的ASCII码值是97。
以下不能将变量c中的大写字母转换为对应小写字母的语句是______。
(分数:
1.00)
A.c=("A"+c)%26-"a" √
B.c=c+32
C.c=c-"A"+"a"
D.c=(c-"A")%26+"a"
解析:
[解析]根据题意可知,小写字母比与之对应的大写字母的ASCII码大32。
A选项中字符A加上c表示的大写字符再对字母个数26取余,本身这个表达式没有任何含义,所以选择A选项。
28.有以下程序
#include<stdio.h>
charfun(char*c)
{
if(*c<="Z"&&*c>="A")
*c-="A"-"a";
return*c;
}
main()
{
chars[81],*p=s;
gets(s);
while(*p)
{
*p=fun(p);
putchar(*p);
p++;
}
printf("/n");
}
若运行时从键盘上输入OPENTHEDOOR<回车>,程序的输出结果是______。
(分数:
2.00)
A.openthedoor √
B.oPENtHEdOOR
C.OPENTHEDOOR
D.OpenTheDoor
解析:
[解析]函数fun功能将大写字符转换为小写字符。
所以选择A。
29.若有说明“inta[3][4];”,则a数组元素的非法引用是______。
(分数:
2.50)
A.a[0][2*1]
B.a[1][3]
C.a[4-2][0]
D.a[0][4] √
解析:
30.以下程序的输出结果是_______。
main()
{inti,a[10];
for(i=9;i>=0;i-)a[i]=10-i;
print("%d%d%d,a[2],a[5],a[8]);
}
(分数:
2.00)
A.258
B.741
C.852 √
D.369
解析:
[解析]在本题运行时主要注意的是当i=9时,a[i]=10-9=1:
i=8时,a[i]=10-8=2;i=7时,a[i]=10-7=3;……依此类推,直到i=0时,a[i]=10-0=10:
此时,i的值已变为-1,判断for的循环条件,不成立,然后输出a[2],a[5],a[8]分别为8,5,2。
31.有以下程序:
#include<stdio.h>
main()
{structnode{intn;structnode*next;}*p;
structnodex[3]={{2,x+1},{4,x+2},{6,NULL}};
p=x;
printf("%d,",p->n);
printf("%d/n",p->next->n);
}
程序运行后的输出结果是______。
(分数:
1.00)
A.2,3
B.2,4 √
C.3,4
D.4,6
解析:
[解析]由题干中的函数可知,程序运行后的输出结果为2,4。
32.有以下程序:
#include<stdio.h>
#defineS(x)x*x/x
main()
{intk=6,j=3;
printf("%d,%d/n",S(k+j+2),S(j+k+2));
}
程序运行后的输出结果是______。
(分数:
1.00)
A.11,11
B.29,29 √
C.26,29
D.121,121
解析:
[解析]#define命令是C语言中的一个宏定义命令,标识符一般使用大写,为了区分其他标识符,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。
宏定义不进行其他操作,仅仅只是替换标识符。
s(k+j+2)=k+j+2*k+j+2/k+j+2,经计算可得29,S(j+k+2)=j+k+2*k+j+2/i+k+2,经计算可得29。
因此输出为29,29。
答案为B选项。
33.有以下程序:
#include<stdio.h>
main()
{
chars[]={"012xy"};
int1,n=0;
for(i=0;s[i]!
=0;i++)
if(s[i]>="a"&&s[i]<="z")n++;
printf("%d/n",n);
}
程序的运行结果是______。
(分数:
2.00)
A.0
B.2 √
C.3
D.5
解析:
[解析]程序首先给字符数组s[]赋值为"012xy",for循环语句的功能是遍历字符串,通过if条件语句对字符串中的小写字母进行计数,字符串中小写字母为2个,即n=2,因此B选项正确。
34.以下叙述中正确的是______。
(分数:
1.00)
A.每个后缀为.C的C语言源程序都可以单独进行编译 √
B.每个后缀为.C的C语言源程序都应该包含一个main函数
C.在C语言程序中,main函数必须放在其他函数的最前面
D.在C语言程序中,只有main函数才可单独进行编译
解析:
[解析]一个普通的C函数可以单独作为一个C的程序文件存在被包含到其他程序中,每个后缀为.C的C语言源程序都可以单独进行编译,所以B、D选项错误。
main函数可以放在程序的开始、中间和最后,所以C选项错误。
35.有以下程序:
#include<stdio.h>
main()
{FILE*fp;
inti,a[6]={1,2,3,4,5,6},k;
fp=fopen("data.dat","w+");
fprintf(fp,"%d/n",a[0]);
for(i=1;i<6;i++)
{fseek(fp,0L,0);
fscanf(fp,"%d",&k);
fseek(fp,0L,0);
fprintf(fp,"%din",a[i]+k);
}
rewind(fp);
fseanf(fp,"%d",&k);
fclose(fp);
printf("%d/n",k);
}
程序的运行结果是______。
(分数:
1.00)
A.21 √
B.6
C.123456
D.11
解析:
[解析]fopen函数以一定方式打开指定文件,返回一个指向文件的文件指针。
如果不能实现打开指定文件的操作,则返回一个空指针NULL。
fscanf函数从文本文件中按格式输入。
fprintf函数按照格式向文本文件中输出数据。
文件定位函数fseek,将指针由文件开头0、当前位置1、末尾2移动指定字节。
rewind函数功能使文件的位置指针返回到文件头。
本例中,循环实现的功能是求数组的和。
程序执行过程为:
以读/写方式建立一个新的文本文件data.dat,将1写入文件;执行for循环,将文件指针移到文件开头,将文件第一个数值1赋给k,再将指针移动到开头,向文件内输入a[i]+k=3。
for循环实现将a数组中元素累加,结果21存放在文件中。
调用rewind将文件指针移动到开头,调用fscanf函数从文件中