第四套模拟试题参考答案及解析Word格式.docx
《第四套模拟试题参考答案及解析Word格式.docx》由会员分享,可在线阅读,更多相关《第四套模拟试题参考答案及解析Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
![第四套模拟试题参考答案及解析Word格式.docx](https://file1.bdocx.com/fileroot1/2023-1/26/2c9a8833-1947-41fe-864c-c96f2b55bd9f/2c9a8833-1947-41fe-864c-c96f2b55bd9f1.gif)
数据独立性是数据与程序间的互不依赖性,即数据库中数据独立于应用程序而不依赖于应用程序。
也就是说,数据的逻辑结构、存储结构与存取方式的改变不会影响应用程序。
选项A、B、C三种说法都是错误的。
10.本题考查的是数据模型。
层次模型是最早发展起来的数据库模型,它的基本结构是树形结构。
11.本题考查的是常量表示法。
C语言的常量分为整型常量、实型常量和字符型常量。
本题中只包含整型常量和实型常量。
选项B从形式上来看属于整型常量中的八进制整数,以0开头,但只能用0-7表示八进制数,所以选项B不合法;
选项C和D从形式上看属于实型常量,用指数形式表示的实型常量需要注意一点:
e(或E)之前必需有数字,且e后面的指数必须为整数,所以选项C和D中e后面为小数和没有数字的形式都不合法;
选项A属于实型常量中的十进制小数形式的表示法,是合法的。
12.本题考查的是算法的特性。
算法的特性中包括"
有零个或多个输入"
及"
有一个或多个输出"
这两个特性。
输入是指执行算法时从外界取得必要的信息。
一个算法可以有两个或多个输入,但也可以没有输入;
一个算法得到的结果就是算法的输出,没有输出的算法是没有意义的,所以一个算法必须至少有一个输出。
13.本题考查的是算法的特性。
C语言规定标识符只能由字母、数字和下划线三种符号组成,而且第一个字符必须是字母或下划线。
注意:
大写字母和小写字母被认为是两个不同的字符。
所以选项A中Main与主函数名main不同。
另外标识符名不能与关键字重名,所以选项D是非法的标识符。
14.本题考查的是常量表示法。
本题选项中的几个常量都属于指数形式的实型常量。
此种类型的常量要求字母e(或E)之前必需有数字,且e后面的指数必须为整数,所以本题中选项B非法。
15.本题考查的是格式输出函数。
变量a,b定义为字符,执行语句"
printf("
%c,"
b++);
"
后,输出字符变量b的值'
2'
(b++是在使用b之后,再将b的值加1),b自加,b的值变成字符3,执行"
%d\n"
b-a);
,即'
3'
-'
1'
,故输出的值为数字2。
16.本题考查的是变量的自加运算。
++在变量前和变量后的唯一区别就在于在执行"
++变量"
所在的语句时,是先将变量加1再执行它所在语句还是先执行它所在的语句再使变量加1,当++在变量后时,也就是"
变量++"
,那就是先将变量值代入表达式运算后再使变量加1;
而"
是先使变量加1,再把加1后的结果放入表达式进行运算。
这两种情况,在执行完变量所在的语句后,它们在内存中的值都是加过1之后的值了。
本题执行"
%d%d"
m++,++n);
后,输出的是m和n+1的值1235,接着使m+1=13,执行"
%d%d\n"
n++,++m);
输出n和m+1的值3514。
17.本题考查的是格式输入函数。
scanf函数中的"
格式控制"
后面应当是地址,而不是变量名。
对于变量,通过地址运算符"
&
求出内存中的地址;
对于数组c[10],数组名c即为数组在内存中的地址。
18.本题考查的是格式输入函数。
如果在"
字符串中除了格式说明以外还有其他字符,则在输入数据时应输入与这些字符相同的字符。
根据本题的数据输入形式"
scanf("
m=%dn=%dp=%d"
&
m,&
n,&
p);
说明在输入数据时,必须输入"
m="
、"
n="
p="
字符,且中间不能含有空格。
19.本题考查的是算术运算符。
如果算术运算符"
/"
中参与运算的变量都是整型变量,则"
表示整除运算,"
%"
表示求余。
本题中"
a=d/10%9;
的值为25/10%9=2;
b=a&
(-1);
为2&
(-1)=1(注意:
-1表示真,只有0才表示假),所以a,b的值分别为2,1。
20.本题考查的是条件判断语句。
另外注意"
和"
||"
的"
短路"
运算。
当运算符"
左边表达式的值为0时,则右边表达式就不再进行运算,整个表达式的值即为0;
左边表达式的值为非零时,则右边表达式就不再进行运算,整个表达式的值为1。
本题中执行"
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。
21.本题考查的是条件表达式。
条件表达式的一般形式为:
表达式1?
表达式2:
表达式3
条件运算符的执行顺序为:
先求解表达式1,若非0则求解表达式2,此时表达式2的值就是整个条件表达式的值,若表达式1的值为0,则求解表达式3,此时表达式3的值就是整个条件表达式的值。
本题先求的是a<
b的值,根据a=1,b=4,故a<
b的值为真,所以整个表达式"
a<
b?
a:
c<
d?
c:
d"
的值为a的值1。
故本题的答案为A。
22.本题考查的是数组。
本程序的作用是求除p[0]外的其它奇数的和。
本题执行过程如下:
i=0:
i++<
7的值为真,p[i]%2即为p[1]%2,值为0,不执行j+=p[i];
,所以j=0;
i=1:
7的值为真,p[i]%2即为p[2]%2,值为1,执行j+=p[i];
,所以j=13;
i=2:
7的值为真,p[i]%2即为p[3]%2,值为0,不执行j+=p[i];
i=3:
7的值为真,p[i]%2即为p[4]%2,值为1,执行j+=p[i];
,所以j=13+15=28;
i=4:
7的值为真,p[i]%2即为p[5]%2,值为0,不执行j+=p[i];
,所以j=28;
i=5:
7的值为真,p[i]%2即为p[6]%2,值为1,执行j+=p[i];
,所以j=28+17=45;
i=6:
7的值为真,p[i]%2即为p[7]%2,值为0,不执行j+=p[i];
,所以j=45;
i=7:
7的值为假,结束循环,输出j的值45。
故本题答案为45。
23.本题考查的是字符串函数的使用。
C语言中以'
\0'
作为字符串的结束符,且strlen()函数计算的是'
字符前的所有字符的个数。
故本题中strlen(a)应为2。
数组定义以后系统就为其分配相应大小的内存空间,而不论其中有没有内容。
sizeof()函数是计算变量或数组所分配到的内存空间的大小。
所以本题的sizeof(a)为7。
24.本题考查的是数组的定义。
选项A中定义的是5个数组元素,但赋值的时候赋的是6个元素,所以出错;
选项C不符合数组定义形式,数组名后应加上"
[]"
;
选项D的类型说明符错误,如果用char定义就对了;
选项B中的0,1,2,3,4,5分别表示对应字符的ASCII码,所以选项B是正确的。
25.本题考查的是函数的调用。
函数f1的功能是返回两个数中比较大的值,f2的功能是返回两个数中比较小的值。
具体执行过程如下:
1、f1(a,b):
即f1(4,3),返回值为4;
2、f1(c,d):
即f1(5,2),返回值为5;
3、e=f2(f1(a,b),f1(c,d)):
即f2(4,5),返回值为4;
4、f2(a,b):
即f2(4,3),返回值为3;
5、f2(c,d):
即f2(5,2),返回值为2;
6、f=f1(f2(a,b),f2(c,d)):
即f1(3,2),返回值为3;
7、g=a+b+c+d-e-f;
:
即g=7。
26.本题考查的是数组定义。
C语言规定'
为字符串结束标志,系统对字符串常量自动加一个'
为结束符。
所以"
chara[]="
xyz"
的数组长度为4,而"
b[]={'
x'
'
y'
z'
};
的数组长度为3(此处的数组长度与strlen函数所求的长度不同,此处的长度是指数组占内存空间的大小),故a数组长度大于b数组长度。
27.本题考查的是函数的调用。
本程序中函数f的作用是交换指针变量x和y所指向的存储单元的值。
在主函数中,能过"
p=a;
q=&
a[7];
将指针变量p指向了数组的第一个元素,指针变量q指向了数组的最后一个元素。
通过"
f(p,q)"
调用函数f进行对称的数组元素的交换。
当while循环4次(即p=q)后,a数组中各元素的值分别为87654321,所以程序输出的结果为8,7,6,5,4,3,2,1,。
28.本题考查的是指针变量对数组的引用。
本题通过"
for(i=0;
i<
9;
i++)p[i]=i;
对二维数组a的元素依次赋值。
赋值后,a的数组元素的值分别为a[0][0]=0,a[0][1]=1,a[0][2]=2,a[1][0]=3,a[1][1]=4,a[1][2]=5,a[2][0]=6,a[2][1]=7,a[2][2]=8,故本题输出的值为345。
29.本题考查的是数组的概念。
在C语言中,如果出现下标越界的情况,系统不管在编译还是执行时都不会给出"
下标越界"
的错误提示。
30.本题考查的是循环的嵌套。
本题函数fun的作用是将指定的数组元素(从下标n到下标m)向后移一位。
由函数调用"
fun(a,2,9);
可知,函数fun用于将a[2]到a[9]的各元素依次向后移一位,移完后,a数组中各元素的值分别为1,2,3,3,4,5,6,7,8,9,10,故输出的前5个数组元素为12334。
31.本题考查的是循环的嵌套。
本题定义了一个二维数组a,并通过a[3][2]={0}将数组中的各个元素初始化为0,又定义了一个指针变量ptr,它用于指向包含2个元素的一维数组,在第一个for循环中,语句"
ptr=a+i;
用于将指针变量ptr指向第i行的数组元素,通过两次循环,分别给二维数组a的第0行的第1个元素和第1行的第1个元素赋了值1和2,即a[0][0]=1,a[1][0]=2。
32.本题考查的是数组名作函数的实参。
用数组名作函数实参时,不是把数组的值传递给形参,而是把实参数组的起始地址传递给形参数组,这样两个数组就共同占用同一段内存单元。
本题通过"
prt(a,5);
将数组a的首地址传递给了指针变量m,使指针变量m指向数组a的首地址,那么,对指针变量所指向的存储单元的内容的改变就是对数组a中的元素的改变。
题中函数ptr的作用是将指针变量m所指向的存储单元中的元素值各加上1,故数组a中的值也随之变化,所以输出的数组元素的值为2,3,4,5,6,。
33.本题考查的是指针变量对数组元素的引用。
本题定义了数组a,C语言规定数组变量名代表数组的首地址,也是就是第0号元素的地址。
所以for循环中循环变量p的初值即为a[0]的地址,故输出的"
*p"
的值为a[0]的值。
当进行p++后,指针变量p又指向了a[1],再次输出"
即为a[1]的值,经过10次循环,将a数组中的值全部输出,即为1,2,3,4,5,6,7,8,9,0,。
34.本题考查的是宏定义。
return语句用于从被调函数带回一个函数值。
void关键字表示"
无类型"
,即不需要从被调函数中带回函数值,所以不需要return语句,故编译时出错。
35.本题考查的是位运算。
按位"
与"
运算符"
的运算规则是:
如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。
因为本题中相与的两个值相等,即对应位上的二进制值相等,所以"
的结果也即为其值本身。
36.本题考查的是预处理概念。
通常,预处理命令位于源文件的开头,但不一定必须位于开头,也可以写在函数与函数之间;
由于预处理命令的末尾不加分号,所以,不能在一行上写多条预处理命令,否则,系统处理时就会把它当作一条命令;
宏名一般习惯用大写字母表示,以便与变量名相区别,但这并非规定,也可用小写字母。
37.本题考查的是共用体。
union是表示共用体的关键字,说明其内的成员a,b,c共占用同一个内存空间,所以data的每个成员起始地址都相同;
共用体变量所占的内存长度等于最长的成员的长度,故变量data所占的内存字节数与成员c所占字节数相等;
但由于各成员变量的类型不一致,所以它们的存储方式也不相同,整型占用2个字节的存储空间,double型占用8个字节的存储空间;
另外data可以作为函数的实参,此时data作为一个地址进行地址传送;
执行"
data.a=5;
%f\n"
data.c);
系统不能自动将整型变量转换为浮点型值,printf函数只是将内存中的数据以不同的类型输出,而不能将内存中的整型数据自动转换为等值的浮点数,故C是错误的。
38.本题考查的是字符串的赋值。
选项A定义了一个字符型的指针变量sp,则*sp存储的是第一个字符,而选项A中给它赋的是字符串,所以错误,如果将"
*sp="
right!
改成"
sp="
就对了,即把字符串"
right"
的首地址赋给了指针变量sp;
选项B定义了一个字符型的数组s[10],则s表示代表数组的首地址,而题中给它赋的是字符串,所以错误,要对字符数组赋值,只能在定义数组时,对其进行初始化;
选项C定义了一个字符型的数组s[10],再通过*s给数组元素赋初值,在此,由于*s指的是数组的第一个元素,而题中给它赋的是字符串,所以错误。
39.本题考查的是结构体。
typedef关键字用于声明一个新的类型名代替已有的类型名。
本题中如果没有用typedef进行定义的话,则structST为结构体类型,现在用typedef定义后,相当于用NEW代表了structST这一结构体类型,故NEW为结构体类型。
40.本题考查的是break与continue的区别。
break和continue的区别是:
continue语句只结束本次循环,而不是终止整个循环的执行;
而break语句则是结束整个循环过程,不再判断执行的条件是否成立。
本题具体执行过程如下:
a=1,b=1:
a>
=8不成立,判断a%2==1成立,a+=5则a=6,continue,执行下一次循环;
a=6,b=2:
=8不成立,判断a%2==1不成立,a-=3则a=3,执行下一次循环;
a=3,b=3:
=8不成立,判断a%2==1成立,a+=5则a=8,continue,执行下一次循环;
a=8,b=4:
=8成立,break,结束整个循环,输出b的值4。
41.本题考查的是指针变量对数组的引用。
p=s"
将指针变量p指向字符数组s,在第一次输出时,由于++和*为同一优先级,而结合方向为自右向左,所以,"
*p++"
相于"
*(p++)"
。
但又因为"
++"
在p的右侧,是"
后加"
,所以,先对p的原值进行*运算,得到s[0]的值,然后使得p加1,p指向s[1],故在第二次输出的时候,输出的值为s[1]的值,所以输出结果为15。
42.本题考查的是字符串运算。
字符串的比较规则是对两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到'
为止,若全部字符相同,则认为相等;
若出现不相同的字符,则以第一个不相同的字符的比较结果为准,该函数就实现了此功能,如果两字符串相等,则返回0,否则返回第一个不等字符串的ASCII码的差值。
43.本题考查的是循环的嵌套。
本题程序为二重循环,外循环控制输出数据的行数,内循环控制输出数据的列数。
从本题输出的形式来看,程序要求输出的是4行4列。
外层循环"
4;
i++)"
控制输出4行,内层的第一个for循环控制每行的空格数的输出,第二个for循环用于控制每行数字的输出,由于每一行的数字个数比前一行少1,所以内层的第二个for循环每一次循环的次数需要递减1,那么j的初始必呈递增形式,又因为第一行输出的是4个数,所以空格中填i是正确的。
44.本题考查的是指针变量对数组的引用。
在C语言中,函数的参数传递方式采用按值传递(即使是指针变量也是按值传递的),因此不能通过调用函数的方式来改变指针本身的值,只能改变指针所指变量的值,故在point函数中对指针p+=3的运算不能对调用它的函数起作用,所以本题的输出应该是"
a"
45.本题考查的是函数的调用。
题中char(*f1)()=fun定义了f1是一个指向函数fun的指针变量,即将函数fun的入口地址赋给了指针变量f1,这时f1和fun都指向函数的开头,调用*f1就是调用函数fun,注意,此时用函数指针变量调用函数时,只需将(*f1)代替函数名fun即可,再在(*f1)之后的括弧中根据需要写上实参,所以"
(*f1)(a);
就相当于"
fun(a)"
,故选项A是正确的。
故本题答案为A。
46.本题考查的是链表。
本题定义了结构体类型的指针变量p,q,r,并各自有两个成员变量data和next,data用于存放数据,next用于存放下一个结点的地址,所以,要想将q所指结点从链表中删除,同时保持链表的连续,必需使p结点的next指向r,在四个选项中,只有选项D不能做到。
47.本题考查的是结构体。
选项A中typedef的作用是声明一个新的类型名AA代替已有的结构体类型名structaa,然后用AA定义了结构体类型的变量td;
选项B直接用结构体类型名structaa定义了结构体类型的变量td;
选项C中的aa本身就为结构体变量名,所以不能再用它来定义结构体变量,故此种定义方法是错误的。
选项D中省去了结构体名,直接将td定义成了结构体变量。
48.本题考查的是文件操作函数。
fseek函数用于改变文件的位置指针。
调用的形式为:
fseek(文件类型指针,位移量,起始点),起始点用0、1、2代替。
0(SEEK_SET):
文件开始;
1(SEEK_CUR):
文件当前位置;
2(SEEK_END):
文件末尾。
位移量"
是指以"
起始点"
为基点,向前移动的字节数。
fseek(fp,0L,SEEK_SET)"
的作用是将位置指针移到文件头。
与此作用相同的函数是"
rewind(fp)"
使位置指针重新返回文件的开头。
feof的作用是判断文件是否已指到了文件末尾,如果已指到文件的末尾,则返回值为非零,否则为零。
ftell的作用是得到流式文件中的当前位置,用相对于文件开头的位移量来表示。
fgets的作用是指定文件读入一个字符串。
49.本题考查的是文件操作。
题中"
fopen(fn,"
w"
)"
的作用是打开fn所指向的文件,使用文件方式为"
写入"
fputs(str,fp)"
的作用是将字符str的值输出到fp所指向的文件中去。
在程序中,两次使用"
的方式打开同一个文件,在第二次打开时,文件指针指向文件头,所以此次写入的数据覆盖了文件原有的数据,故本题中t1.dat的内容为end。
50.本题考查的是算法的特性。
有穷性、确定性、有零个或多个输入、有一个或多个输出、有效性是算法的五大特性。