第四套模拟试题参考答案及解析.docx
《第四套模拟试题参考答案及解析.docx》由会员分享,可在线阅读,更多相关《第四套模拟试题参考答案及解析.docx(14页珍藏版)》请在冰豆网上搜索。
![第四套模拟试题参考答案及解析.docx](https://file1.bdocx.com/fileroot1/2023-1/26/2c9a8833-1947-41fe-864c-c96f2b55bd9f/2c9a8833-1947-41fe-864c-c96f2b55bd9f1.gif)
第四套模拟试题参考答案及解析
第四套模拟试题参考答案及解析
1.本题考查的是数据结构的基本概念。
数据的逻辑结构在计算机存储空间中的存放形式形式称为数据的存储结构(也称数据的物理结构)。
故本题答案为D。
2.本题考查的是栈和队列。
栈是一种特殊的线性表,这种线性表只能在固定的一端进行插入和删除操作,允许插入和删除的一端称为栈顶,另一端称为栈底。
一个新元素只能从栈顶一端进入,删除时,只能删除栈顶的元素,即刚刚被插入的元素。
所以栈又称先进后出表(FILO-FirstInLastOut)。
线性表可以顺序存储,也可以链式存储,而栈是一种线性表,也可以采用链式存储结构。
故本题答案为B。
3.本题考查的是基本排序算法。
假设线性表的长度为n,则在最坏情况下,冒泡排序需要经过n/2遍的从前往后扫描和n/2遍的从后往前扫描,需要比较次数为n(n-1)/2。
快速排序法的最坏情况比较次数也是n(n-1)/2。
故本题答案为D。
4.本题考查的是顺序查找。
在进行顺序查找过程中,如果线性表中的第一个元素就是被查找元素,则只需做一次比较就查找成功,查找效率最高;但如果被查找的元素是线性表中的最后一个元素,或者被查找的元素根本就不在线性表中,则为了查找这个元素需要与线性表中所有的元素进行比较,这是顺序查找的最坏情况。
所以对长度为n的线性表进行顺序查找,在最坏情况下需要比较n次。
故本题答案为C。
5.本题考查的是线性单链表、双向链表与循环链表的结构及其基本运算。
在链式存储结构中,存储数据结构的存储空间可以不连续,各数据结点的存储顺序与数据元素之间的逻辑关系可以不一致,而数据元素之间的逻辑关系是由指针域来确定的。
故本题答案为A。
6.本题考查的是软件测试的目的。
关于软件测试的目的,GrenfordJ.Myers再《TheArtofSoftwareTesting》一书中给出了深刻的阐述:
软件测试是为了发现错误而执行程序的过程;一个好的测试用例是指很可能找到迄今为止尚未发现的错误的用例;一个成功的测试是发现了至今尚未发现的错误的测试。
整体来说,软件测试的目的就是尽可能多地发现程序中的错误。
故本题答案为C。
7.本题考查的是软件工程基本概念。
模块独立性是指每个模块只完成系统要求的独立的子功能,并且与其他模块的联系最少且接口简单。
耦合性与内聚性是模块独立性的两个定性标准,耦合与内聚是相互关联的。
在程序结构中,各模块的内聚性越强,则耦合性越弱。
一般较优秀的软件设计,应尽量做到高内聚,低耦合,即减弱模块之间的耦合性和提高模块内的内聚性,有利于提高模块的独立性。
故本题答案为B。
8.本题考查的是软件工程基本概念。
计算机软件是计算机系统中与硬件相互依存的另一部分,是包括程序、数据及相关文档的完整集合。
软件具有以下特点:
①软件是一种逻辑实体,而不是物理实体,具有抽象性;②软件的生产过程与硬件不同,它没有明显的制作过程;③软件在运行、使用期间不存在磨损、老化问题;④软件的开发、运行对计算机系统具有依赖性,受计算机系统的限制,这导致软件移植的问题;⑤软件复杂性高,成本昂贵;⑥软件开发涉及诸多的社会因素。
故本题答案为D。
9.本题考查的是数据库系统的基本特点。
数据独立性是数据与程序间的互不依赖性,即数据库中数据独立于应用程序而不依赖于应用程序。
也就是说,数据的逻辑结构、存储结构与存取方式的改变不会影响应用程序。
选项A、B、C三种说法都是错误的。
故本题答案为D。
10.本题考查的是数据模型。
层次模型是最早发展起来的数据库模型,它的基本结构是树形结构。
故本题答案为C。
11.本题考查的是常量表示法。
C语言的常量分为整型常量、实型常量和字符型常量。
本题中只包含整型常量和实型常量。
选项B从形式上来看属于整型常量中的八进制整数,以0开头,但只能用0-7表示八进制数,所以选项B不合法;选项C和D从形式上看属于实型常量,用指数形式表示的实型常量需要注意一点:
e(或E)之前必需有数字,且e后面的指数必须为整数,所以选项C和D中e后面为小数和没有数字的形式都不合法;选项A属于实型常量中的十进制小数形式的表示法,是合法的。
故本题答案为A。
12.本题考查的是算法的特性。
算法的特性中包括"有零个或多个输入"及"有一个或多个输出"这两个特性。
输入是指执行算法时从外界取得必要的信息。
一个算法可以有两个或多个输入,但也可以没有输入;一个算法得到的结果就是算法的输出,没有输出的算法是没有意义的,所以一个算法必须至少有一个输出。
故本题答案为C。
13.本题考查的是算法的特性。
C语言规定标识符只能由字母、数字和下划线三种符号组成,而且第一个字符必须是字母或下划线。
注意:
大写字母和小写字母被认为是两个不同的字符。
所以选项A中Main与主函数名main不同。
另外标识符名不能与关键字重名,所以选项D是非法的标识符。
故本题答案为D。
14.本题考查的是常量表示法。
本题选项中的几个常量都属于指数形式的实型常量。
此种类型的常量要求字母e(或E)之前必需有数字,且e后面的指数必须为整数,所以本题中选项B非法。
故本题答案为B。
15.本题考查的是格式输出函数。
变量a,b定义为字符,执行语句"printf("%c,",b++);"后,输出字符变量b的值'2'(b++是在使用b之后,再将b的值加1),b自加,b的值变成字符3,执行"printf("%d\n",b-a);",即'3'-'1',故输出的值为数字2。
故本题答案为C。
16.本题考查的是变量的自加运算。
++在变量前和变量后的唯一区别就在于在执行"++变量"所在的语句时,是先将变量加1再执行它所在语句还是先执行它所在的语句再使变量加1,当++在变量后时,也就是"变量++",那就是先将变量值代入表达式运算后再使变量加1;而"++变量"是先使变量加1,再把加1后的结果放入表达式进行运算。
这两种情况,在执行完变量所在的语句后,它们在内存中的值都是加过1之后的值了。
本题执行"printf("%d%d",m++,++n);"后,输出的是m和n+1的值1235,接着使m+1=13,执行"printf("%d%d\n",n++,++m);"输出n和m+1的值3514。
故本题答案为A。
17.本题考查的是格式输入函数。
scanf函数中的"格式控制"后面应当是地址,而不是变量名。
对于变量,通过地址运算符"&"求出内存中的地址;对于数组c[10],数组名c即为数组在内存中的地址。
故本题答案为B。
18.本题考查的是格式输入函数。
如果在"格式控制"字符串中除了格式说明以外还有其他字符,则在输入数据时应输入与这些字符相同的字符。
根据本题的数据输入形式"scanf("m=%dn=%dp=%d",&m,&n,&p);"说明在输入数据时,必须输入"m="、"n="、"p="字符,且中间不能含有空格。
故本题答案为A。
19.本题考查的是算术运算符。
如果算术运算符"/"中参与运算的变量都是整型变量,则"/"表示整除运算,"%"表示求余。
本题中"a=d/10%9;"的值为25/10%9=2;"b=a&&(-1);"为2&&(-1)=1(注意:
-1表示真,只有0才表示假),所以a,b的值分别为2,1。
故本题答案为B。
20.本题考查的是条件判断语句。
++在变量前和变量后的唯一区别就在于在执行"++变量"所在的语句时,是先将变量加1再执行它所在语句还是先执行它所在的语句再使变量加1,当++在变量后时,也就是"变量++",那就是先将变量值代入表达式运算后再使变量加1;而"++变量"是先使变量加1,再把加1后的结果放入表达式进行运算。
这两种情况,在执行完变量所在的语句后,它们在内存中的值都是加过1之后的值了。
另外注意"&&"和"||"的"短路"运算。
当运算符"&&"左边表达式的值为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
a:
cc:
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:
i++<7的值为真,p[i]%2即为p[2]%2,值为1,执行j+=p[i];,所以j=13;
i=2:
i++<7的值为真,p[i]%2即为p[3]%2,值为0,不执行j+=p[i];,所以j=13;
i=3:
i++<7的值为真,p[i]%2即为p[4]%2,值为1,执行j+=p[i];,所以j=13+15=28;
i=4:
i++<7的值为真,p[i]%2即为p[5]%2,值为0,不执行j+=p[i];,所以j=28;
i=5:
i++<7的值为真,p[i]%2即为p[6]%2,值为1,执行j+=p[i];,所以j=28+17=45;
i=6:
i++<7的值为真,p[i]%2即为p[7]%2,值为0,不执行j+=p[i];,所以j=45;
i=7:
i++<7的值为假,结束循环,输出j的值45。
故本题答案为45。
23.本题考查的是字符串函数的使用。
C语言中以'\0'作为字符串的结束符,且strlen()函数计算的是'\0'字符前的所有字符的个数。
故本题中strlen(a)应为2。
数组定义以后系统就为其分配相应大小的内存空间,而不论其中有没有内容。
sizeof()函数是计算变量或数组所分配到的内存空间的大小。
所以本题的sizeof(a)为7。
故本题答案为C。
24.本题考查的是数组的定义。
选项A中定义的是5个数组元素,但赋值的时候赋的是6个元素,所以出错;选项C不符合数组定义形式,数组名后应加上"[]";选项D的类型说明符错误,如果用char定义就对了;选项B中的0,1,2,3,4,5分别表示对应字符的ASCII码,所以选项B是正确的。
故本题答案为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。
故本题答案为A。
26.本题考查的是数组定义。
C语言规定'\0'为字符串结束标志,系统对字符串常量自动加一个'\0'为结束符。
所以"chara[]="xyz""的数组长度为4,而"b[]={'x','y','z'};"的数组长度为3(此处的数组长度与strlen函数所求的长度不同,此处的长度是指数组占内存空间的大小),故a数组长度大于b数组长度。
故本题答案为C。
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,。
故本题答案为D。
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。
故本题答案为D。
29.本题考查的是数组的概念。
在C语言中,如果出现下标越界的情况,系统不管在编译还是执行时都不会给出"下标越界"的错误提示。
故本题答案为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。
故本题答案为C。
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。
故本题答案为B。
32.本题考查的是数组名作函数的实参。
用数组名作函数实参时,不是把数组的值传递给形参,而是把实参数组的起始地址传递给形参数组,这样两个数组就共同占用同一段内存单元。
本题通过"prt(a,5);"将数组a的首地址传递给了指针变量m,使指针变量m指向数组a的首地址,那么,对指针变量所指向的存储单元的内容的改变就是对数组a中的元素的改变。
题中函数ptr的作用是将指针变量m所指向的存储单元中的元素值各加上1,故数组a中的值也随之变化,所以输出的数组元素的值为2,3,4,5,6,。
故本题答案为B。
33.本题考查的是指针变量对数组元素的引用。
本题定义了数组a,C语言规定数组变量名代表数组的首地址,也是就是第0号元素的地址。
所以for循环中循环变量p的初值即为a[0]的地址,故输出的"*p"的值为a[0]的值。
当进行p++后,指针变量p又指向了a[1],再次输出"*p"即为a[1]的值,经过10次循环,将a数组中的值全部输出,即为1,2,3,4,5,6,7,8,9,0,。
故本题答案为A。
34.本题考查的是宏定义。
return语句用于从被调函数带回一个函数值。
void关键字表示"无类型",即不需要从被调函数中带回函数值,所以不需要return语句,故编译时出错。
故本题答案为D。
35.本题考查的是位运算。
按位"与"运算符"&"的运算规则是:
如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。
因为本题中相与的两个值相等,即对应位上的二进制值相等,所以"与"的结果也即为其值本身。
故本题答案为C。
36.本题考查的是预处理概念。
通常,预处理命令位于源文件的开头,但不一定必须位于开头,也可以写在函数与函数之间;由于预处理命令的末尾不加分号,所以,不能在一行上写多条预处理命令,否则,系统处理时就会把它当作一条命令;宏名一般习惯用大写字母表示,以便与变量名相区别,但这并非规定,也可用小写字母。
故本题答案为D。
37.本题考查的是共用体。
union是表示共用体的关键字,说明其内的成员a,b,c共占用同一个内存空间,所以data的每个成员起始地址都相同;共用体变量所占的内存长度等于最长的成员的长度,故变量data所占的内存字节数与成员c所占字节数相等;但由于各成员变量的类型不一致,所以它们的存储方式也不相同,整型占用2个字节的存储空间,double型占用8个字节的存储空间;另外data可以作为函数的实参,此时data作为一个地址进行地址传送;执行"data.a=5;printf("%f\n",data.c);"系统不能自动将整型变量转换为浮点型值,printf函数只是将内存中的数据以不同的类型输出,而不能将内存中的整型数据自动转换为等值的浮点数,故C是错误的。
故本题答案为C。
38.本题考查的是字符串的赋值。
选项A定义了一个字符型的指针变量sp,则*sp存储的是第一个字符,而选项A中给它赋的是字符串,所以错误,如果将"*sp="right!
""改成"sp="right!
""就对了,即把字符串"right"的首地址赋给了指针变量sp;
选项B定义了一个字符型的数组s[10],则s表示代表数组的首地址,而题中给它赋的是字符串,所以错误,要对字符数组赋值,只能在定义数组时,对其进行初始化;
选项C定义了一个字符型的数组s[10],再通过*s给数组元素赋初值,在此,由于*s指的是数组的第一个元素,而题中给它赋的是字符串,所以错误。
故本题答案为D。
39.本题考查的是结构体。
typedef关键字用于声明一个新的类型名代替已有的类型名。
本题中如果没有用typedef进行定义的话,则structST为结构体类型,现在用typedef定义后,相当于用NEW代表了structST这一结构体类型,故NEW为结构体类型。
故本题答案为C。
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:
a>=8不成立,判断a%2==1不成立,a-=3则a=3,执行下一次循环;
a=3,b=3:
a>=8不成立,判断a%2==1成立,a+=5则a=8,continue,执行下一次循环;
a=8,b=4:
a>=8成立,break,结束整个循环,输出b的值4。
故本题答案为B。
41.本题考查的是指针变量对数组的引用。
本题通过"p=s"将指针变量p指向字符数组s,在第一次输出时,由于++和*为同一优先级,而结合方向为自右向左,所以,"*p++"相于"*(p++)"。
但又因为"++"在p的右侧,是"后加",所以,先对p的原值进行*运算,得到s[0]的值,然后使得p加1,p指向s[1],故在第二次输出的时候,输出的值为s[1]的值,所以输出结果为15。
故本题答案为A。
42.本题考查的是字符串运算。
字符串的比较规则是对两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到'\0'为止,若全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准,该函数就实现了此功能,如果两字符串相等,则返回0,否则返回第一个不等字符串的ASCII码的差值。
故本题答案为D。
43.本题考查的是循环的嵌套。
本题程序为二重循环,外循环控制输出数据的行数,内循环控制输出数据的列数。
从本题输出的形式来看,程序要求输出的是4行4列。
外层循环"for(i=0;i<4;i++)"控制输出4行,内层的第一个for循环控制每行的空格数的输出,第二个for循环用于控制每行数字的输出,由于每一行的数字个数比前一行少1,所以内层的第二个for循环每一次循环的次数需要递减1,那么j的初始必呈递增形式,又因为第一行输出的是4个数,所以空格中填i是正确的。
故本题答案为B。
44.本题考查的是指针变量对数组的引用。
在C语言中,函数的参数传递方式采用按值传递(即使是指针变量也是按值传递的),因此不能通过调用函数的方式来改变指针本身的值,只能改变指针所指变量的值,故在point函数中对指针p+=3的运算不能对调用它的函数起作用,所以本题的输出应该是"a"。
故本题答案为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不能做到。
故本题答案为D。
47.本题考查的是结构体。
选项A中typedef的作用是声明一个新的类型名AA代替已有的结构体类型名structaa,然后用AA定义了结构体类型的变量td;
选项B直接用结构体类型名structaa定义了结构体类型的变量td;
选项C中的aa本身就为结构体变量名,所以不能再用它来定义结构体变量,故此种定义方法是错误的。
选项D中省去了结构体名,直接将td定义成了结构体变量。
故本题答案为C。
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的作用是指定文件读入一个字符串。
故本题答案为D。
49.本题考查的是文件操作。
题中"fopen(fn,"w")"的作用是打开fn所指向的文件,使用文件方式为"写入";"fputs(str,fp)"的作用是将字符str的值输出到fp所指向的文件中去。
在程序中,两次使用"写入"的方式打开同一个文件,在第二次打开时,文件指针指向文件头,所以此次写入的数据覆盖了文件原有的数据,故本题中t1.dat的内容为end。
故本题答案为B。
50.本题考查的是算法的特性。
有穷性、确定性、有零个或多个输入、有一个或多个输出、有效性是算法的五大特性。