六、新增真考题库试题参考答案及解析
第1套 新增真考题库试题参考答案及解析
一、选择题
(1)A 【解析】算法的时间复杂度是指执行算法所需要的计算工作量,而计算工作量是用算法所执行的基本运算次数来度量的。解决同一个问题的不同算法的时间复杂度,可能相同,也可能不相同。算法的时间复杂度与数据存储结构无关,对同一批数据作同一种处理或者不同处理,数据存储结构相同或者不同,算法的时间复杂度都可能相同或者不同。故A选项正确。
(2)A 【解析】队列是指允许在一端进行插入,而在另一端进行删除的线性表。由于最先进入队列的元素将最先出队,所以队列具有“先进先出”的特性,体现了“先来先服务”的原则。作业调度是指根据一定信息,按照一定的算法,从外存的后备队列中选取某些作业调入内存分配资源,并将新创建的进程插入就绪队列的过程。执行程序中的过程调用一般指函数调用,需要调用时转入被调用函数地址执行程序,与队列无关。执行程序中的循环控制是指算法的基本控制结构,包括对循环条件的判定与执行循环体,与队列无关。二叉树是一个有限的结点集合,二叉树的遍历是指不重复地访问二叉树中的所有结点,与队列无关。故本题选择A选项。
(3)A 【解析】栈是一种特殊的线性表,它所有的插入与删除都限定在表的同一端进行。入栈运算即在栈顶位置插入一个新元素,退栈运算即是取出栈顶元素赋予指定变量。题目中初始状态为top=m+1,可知入栈栈顶指针top=top-1,出栈栈顶指针top=top+1,由于栈长为m,当top=1时栈满,不能再进行入栈操作。故选择A选项。
(4)D 【解析】在树结构中,一个结点所拥有的后件个数称为该结点的度,所有结点中最大的度称为树的度。对任何一棵二叉树,度为0的结点总是比度为2的结点多一个。如果有一棵二叉树,结点总数为150,假设度为0的结点个数为n,则有n+10+n-1=150,解得n=70.5。由于结点个数必须是整数,所以不可能有题目中这样的二叉树,故选择D选项。
(5)A 【解析】在单链表的第一个结点前增加一个表头结点,队头指针指向表头结点,最后一个结点的指针域的值由NULL改为指向表头结点,这样的链表称为循环链表。循环链表是线性结构,有且只有一个根结点,每一个结点最多有一个前件,也最多有一个后件。循环链表的表头结点为根结点,链表的最后一个结点为叶子结点,虽然它含有一个指向表头结点的指针,但是表头结点并不是它的一个后件。故选择A选项。
(6)A 【解析】二叉树遍历可以分为3 种:前序遍历(访问根结点在访问左子树和访问右子树之前)、中序遍历(访问根结点在访问左子树和访问右子树两者之间)、后序遍历(访问根结点在访问左子树和访问右子树之后)。由结点值互不相同而后序序列与中序序列相同,可知该二叉树所有的结点都没有右子树,所以31 个结点的二叉树深度为31。故选A选项。
(7)B 【解析】若有n个元素的序列,将元素按顺序组成一棵完全二叉树,当且仅当满足下列条件时称为堆:大根堆是指所有结点的值大于或等于左、右子结点的值;小根堆是指所有结点的值小于或等于左、右子结点的值。在调整建堆的过程中,总是将根结点值与左、右子树的根结点进行比较,若不满足堆的条件,则将左、右子树根结点值中的大者与根结点值进行交换。堆排序最坏情况下,需要O(nlog2n)次比较,所以时间复杂度是O(nlog2n),故B选项正确。
(8)C 【解析】计算机软件按功能分为应用软件、系统软件、支撑软件(或工具软件)。系统软件是管理计算机的资源,提高计算机的使用效率,为用户提供各种服务的软件。应用软件是为了应用于特定的领域而开发的软件。支撑软件介于系统软件和应用软件之间,协助用户开发软件的工具型软件,其中包括帮助程序人员开发和维护软件产品的工具软件,也包括帮助管理人员控制开发进程和项目管理的工具软件,如Dephi、PowerBuilder等。选项C属于系统软件,选项A、B、D属于应用软件,故选C选项。
(9)A 【解析】数据库是指长期存储在计算机内的、有组织的、可共享的数据集合。数据库系统是由数据库及其管理软件组成的系统,是应用软件。数据库管理系统是数据库系统的核心,它位于用户与操作系统之间,属于系统软件。数据结构是计算机存储、组织数据的方式。故本题选A选项。
(10)A 【解析】数据库系统在其内部分为三级模式,即概念模式、内模式和外模式。概念模式是数据库系统中全局数据逻辑结构的描述,全体用户的公共数据视图。外模式也称子模式或者用户模式,是用户的数据视图,也就是用户所能够看见和使用的局部数据的逻辑结构和特征的描述,是与某一应用有关的数据的逻辑表示。内模式又称物理模式,是数据物理结构和存储方式的描述,是数据在数据库内部的存储方式。所以数据库的结构被划分成用户级、存储级和概念级。故选A选项。
(11)B 【解析】算法的特点:零个或多个输入,至少一个输出,可行性(能编程实现),有穷性(有限步骤得到结果),确定性(描述不能有歧义)。可知选项A、C、D正确。C语言中,通过编译,可以运行的程序,不一定符合题目的本意,因此即使可以运行得到结果,也不一定和预期的结果一样,否则就不需要调试和修改程序了,故B选项错误。答案为B选项。
(12)D 【解析】所谓常量是指在程序运行过程中,其值不能被改变的量。在C语言中,有整型常量、实型常量、字符常量和字符串常量等类型。实型常量有两种表示形式:十进制小数形式、指数形式。指数形式中e后面的指数必须是整数,阶码标志e之前需要有数字,由此可知选项A、B、C错误。答案为D选项。
(13)A 【解析】C语言程序的入口函数是main(),C语言程序中有且只有一个main函数,故选项B错误。分号是C语言一条语句的结束标志,不是分隔符,C语言分隔符是用来分隔多个变量、数据项、表达式等的符号,包括逗号、空白符、分号和冒号等,故选项C错误。C语言程序不是以分号结束的,因为C语言是面向过程的,从main函数开始并在main函数里结束,故选项D错误。故答案为A选项。
(14)D 【解析】% lf,% le是针对 double类型的,如果仅用%f,输入的数据可能不被完全接收,数据的精度可能不足。% f主要针对float类型的变量输入,因此选项B错误。根据题目要求,可知选项A、C错误。故答案为D选项。
(15)B 【解析】将x=0x9(十六进制)转换为十进制,得x=9,因此printf("% c\n",′A′+9),打印格式要求是% c,因此需要从字符A,按字母顺序向后偏移9 个位置,可得结果为J。故答案为B选项。
(16)A 【解析】(x *1000 +0.5)表示 x向右 移动3位小数,加0.5,也就是小数第4位加5,若这位大于等于5,则进1到个位。因为5.16894 × 1000 +0.5 =5169.44,所以(int)(x *1000+0.5)强制转换为整型结果为5169。5169 ÷ 1000.0=5.169,由于1000.0 结果自动转换为浮点数,所以printf(“% lf\n”,5.169)结果是5.16900。故答案为A选项。
(17)A 【解析】C语言中规定else总是和之前与其最近的且不带else的if配对,题目中,if(a=1)b=1;c=2;默认省略的else已经配对了,下一句else没有匹配if,为非法else。另外,if的判断条件a=1是赋值语句,不是判断语句,此处也会产生编译错误。因此答案为A选项。
(18)A 【解析】在for(;++a && --b;);这个for循环中,第1、3表达式为缺省项,判断条件为++a&&--b,由于a=-2,b=2,第一次执行了++a和--b后,值为真,循环条件成立;第二次执行++a后值为0,由于&&运算符,当第一个条件为假时,不执行第二个条件,所以b=1时发生短路,--b不执行了。因此a,b的最终值为0,1。故答案为A选项。
(19)C 【解析】后置自增运算t++表示先运算,后自加。t的初值为6,t++ <6,则条件为假,执行printf(“% d\n”,t--),此时t=7,打印t值为7,之后进行自减操作,t=6。因此打印的结果为7。故答案为C选项。
(20)D 【解析】putchar()函数功能是输出一个字符,由whlie判断条件和ch初始值可知,只要ch>′A′,每次执行二次putchar,否则跳出。第一次输出CD,第二次输出BC,第三次输出A,跳出循环。因此答案为D选项。
(21)A 【解析】题目中程序不能实现预期功能是因为while的循环条件错误,在选项B中,把s=1;改为s=0;的最终结果是s=4,与题目原意不同;在选项C中,把 n=1;改为n=0;的最终结果是s=2,与题目原意不同;在选项D中,把n=n+1;改为n=n*n;的最终结果是s=2,与题目原意不同;选项A,正确地修改了while循环条件,可以得到正确结果。故答案为A选项。
(22)B 【解析】题目使用更相减损术求最大公约数,其思想:①任意给定两个正整数,判断它们是否都是偶数。若是,则用2约简;若不是,则执行第二步。②以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得到的减数和差相等为止。则第一步中约掉的若干个2 与第二步中等数的乘积就是所求的最大公约数。因此。故答案为B选项。
(23)D 【解析】()的优先级高于*,因为(*f)()定义函数指针f,f为指向函数的指针,而f=add,即将函数add()的首地址赋给指针f,所以调用函数add()可以写为f(),其返回值是整型,不是指针类型,不能用*取指针指向的内存单元的数据,故k=*f(a,b)的调用方式错误。答案为D选项。
(24)D 【解析】% lf,% le是针对double类型的数据,如果仅用%f,输入的数据可能不能被完全接收,数据的精度可能不足。% f主要针对float类型的变量输入,故选项B错误。根据scanf(格式,变量地址),A、C选项错误。故答案为D选项。
(25)B 【解析】选项B中,定义的数组是2行4列,但是初始化的结构是3行2列,因此初始化错误。故答案为B选项。
(26)C 【解析】本题中fun()函数作用是冒泡法排序, flag控制升序(0)或者降序(1)。n为参与排序的元素个数。a为数组的起始地址,因此,fun(a,4,1)数组的前4个降序排序,fun(a+4,6,0)对数组的第四项后6 个元素进行升序排序。故结果为10,9,8,7,1,2,3,4,5,6。答案为C选项。
(27)D 【解析】第一个for循环的作用是对数组a赋初值,从0~9,第二个for循环的作用是计算数组前4项的a[i]+i的和。0+0,1+1,2+2,3+3,经计算的结果为12,因此答案为D选项。
(28)C 【解析】new_div()的返回值是int类型,因此, a/b+0.5(其中a,b均为double类型)的小数部分被将被截断。经计算,7.8/3.1+0.5=2.516+0.5=3.016,故打印的结果为3。故答案为C选项。
(29)B 【解析】函数fun的功能是在形参a所指的具有n个元素的数组中查找最大值并返回。通过 for循环比较,s始终指向最大值的那个元素。取指针的值,使用*p,因此比较*p和*s,需要找到最大值,当*s<*p时,修改指针s的指向,因此答案为B选项。
(30)A 【解析】函数strlen(char*s);用于计算字符串s的长度,不包括“\0”在内;p指向数组的第二个元素,因此strlen(p)=10,并打印,故答案为A选项。
(31)A 【解析】for循环的作用是每次遇到空格,将空格后面的所有字符(包括“\0”)移动到数组的最前面。因此数组最后的状态是“Beijing!\0g!\0ng!\0neijing!\0”,但是printf(“% s”)打印遇到“\0”自动结束。因此,打印“Bei-jing!。”故答案为A选项。
(32)A 【解析】static静态变量只在声明时初始化一次。因此,第一次调用函数f(k=0),此时n=m=k=0,经过自增操作后,n=1,m=1,k=1,返回值为3;第二次调用函数f(k=1),此时n=1,k=1,m=0,经过自增操作后,n=2,k=2,m=1,返回值为5。故最终结果为3,5,故答案为A选项。
(33)B 【解析】局部变量覆盖全局变量,但是全局变量的声明周期还存在。f()函数调用完成后,由于m为全局变量,被修改为32,即函数的返回值为32,此时m=32/12,第二次调用f(a,b)函数,函数的返回值为3,此时m=2,故输出为1。所以答案为B选项。
(34)A 【解析】sizeof()是运算符,在头文件中,typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、对象、函数等。它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。strlen(*char)函数在运行时才能计算,参数必须是字符型指针(char*),当数组名作为参数传入时,实际上数组就退化成了指针,它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL,返回的长度大小不包括NULL。sizeof(a)求数组a所占空间的大小,包括字符串最后的“\0”,所以sizeof(a)=5,strlen()遇到“\0”就结束, strlen(a)=4。strlen(b)是指针指向的字符串长度,sizeof(b)是指针的大小。strlen(c)是字符串的长度,sizeof(c)是数组的长度。因此,输出4,5,2,4,1,3。故答案为A选项。
(35)A 【解析】auto用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,将在函数中定义的变量视为局部变量。这个关键字通常会被省略,因为所有的变量默认就是auto的。
register定义的变量告诉编译器尽可能地将变量存在CPU内部寄存器中,而不是通过内存寻址访问,用以提高效率。
static变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点也是它与全局变量的区别。当static用来修饰全局变量时,它就改变了全局变量的作用域。
extern限制在了当前文件里,但是没有改变其存放位置,还是在全局静态储存区。extern 外部声明,表示该变量在其他地方有被定义过。因此,答案为A选项。
(36)A 【解析】存储结构用链式存储。链式结构每个结点有个指针域,指针域指向下一个链式结构的结点,因此指针域的结构应该是该结构形式,故应定义为struct link*next,答案为A选项。struct是结构体的说明符,不能省略。
(37)A 【解析】C语言函数参数传递大致分为两种情况。
①值传递过程中,被调函数的形参作为被调函数的局部变量处理,即在内存的堆栈中开辟空间,以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形参的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。
②地址传递过程中,被调函数的形参虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。结构体中name是数组,做实参传递,会退化为指针,因此调用函数f()后,参数name为地址传递,内容被修改,其他的成员为值传递,不会被修改。因此输出Sun,f,350。故答案为A选项。
(38)C 【解析】^运算符为按位异或运算符,即0^1=1, 1^0=1,1^1=0,0^0=0,因此a^b=101。
在进行<<操作后,101变为10100(二进制),转换为十进制是20,因此答案为C选项。
(39)A 【解析】sizeof(FILE*)=4,因为FILE* 为指针,指针的大小为4,故sizeof(int*)=4,理由同前面。文件指针的值是地址,是一个十六进制的数,它的值不一定小于文件字节数,因此选项B错误。文件指针是所指文件的当前读取位置,而不是文件指针的值,因此选项C错误。
fscanf函数可以向任意类型的文件写入,但写入的数量不能超过系统的缓冲区,写文件先写入缓冲区,最后一起写入文件,因此选项D错误。故答案为A选项。
(40)D 【解析】fgets读取一个长度为(n-1)的字符串;fread按照指定的长度读取数据项,对应二进制的打开方式;fscanf按指定格式读,对应文本的打开方式;getc从指定的文件读入一个字符,即从fp所指向的文件中读入一个字符赋给ch。因此答案为D选项。
二、程序填空题
【参考答案】
(1)a=0,b=0,k
(2)(k!=0)
(3)scanf("% d",&k)
【解题思路】
填空1:scanf函数用到变量k,需要提前定义,在while循环中使用了临时存放正负数个数的变量a,b,因此也要提前定义。
填空2:根据题意,输入0时结束程序,因此当k!=0时进入循环记录正负数的个数。
填空3:需要不断地从终端输入整数,因此在循环体内添加输入操作。
三、程序修改题
【参考答案】
(1)int t;改为int t=0;
(2)*p 改为p或者p!=NULL
(3)p.data改为p->data
【解题思路】
(1)题目中变量t是用来存放累加和的,因此必须初始化。
(2)题目中*p是结构体,不能转化为bool型。
(3)p是指针,只能用p->,不能用p.。
四、程序设计题
【参考答案】
int i=0,j=0;//循环统计的下标
*a=0;//初始化a字符统计的个数
*c=0;//初始化c字符统计的个数
for(i=0;i<M;i++)//行
{
for(j=0;j<M;j++)//列
{
if(t[i][j]==′A′)//字符是a,计数
(*a)+ +;
if(t[i][j]==′C′)//字符是c,计数
(*c)++;
}
}
【解题思路】
对二维数组的行列分别循环,行优先,查找数组中为A或者为C的元素,分别对其进行计数。
第2套 新增真考题库试题参考答案及解析
一、选择题
(1)A 【解析】数据元素是一个含义很广泛的概念,它是数据的“基本单位”,在计算机中通常作为一个整体进行考虑和处理。数据元素可以是一个数据,也可以是被抽象出的具有一定结构的数据集合,所以数据结构中的数据元素可以是另一数据结构。满足有且只有一个根结点,并且每一个结点最多有一个前件,也最多有一个后件的非空的数据结构为线性结构,不满足条件的结构为非线性结构。空数据结构可以是线性结构,也可以是非线性结构。非空数据结构可以没有根结点,如非性线结构“图”就没有根结点。故选A选项。
(2)A 【解析】算法的空间复杂度是指执行这个算法所需要的内存空间,包括输入数据所占的存储空间、程序本身所占的存储空间、算法执行过程中所需要的额外空间。如果额外空间量相对于问题规模(即输入数据所占的存储空间)来说是常数,即额外空间量不随问题规模的变化而变化,则称该算法是原地工作的。故选A选项。
(3)A 【解析】循环队列长度为m,由初始状态为front=rear=m,可知此时循环队列为空。入队运算时,首先队尾指针进1(即rear+1),然后在rear指针指向的位置插入新元素。特别的,当队尾指针rear=m+1时,置rear=1。退队运算时,排头指针进1(即front+1),然后删除front指针指向的位置上的元素,当排头指针front=m+1时,置front=1。从排头指针front指向的后一个位置直到队尾指针rear指向的位置之间所有的元素均为队列中的元素。如果rear-front>0,则队列中的元素个数为rear-front个;如果rear-front<0,则队列中的元素个数为rear-front+m。该题中m-1<m,即rear-front<0,则该循环队列中的元素个数为(m-1)-m+m=m-1。故选A选项。
(4)C 【解析】树是一种简单的非线性结构,直观地来看,树是以分支关系定义的层次结构。在树结构中,一个结点所拥有的后件个数称为该结点的度,所有结点中最大的度称为树的度。由于只有度为3的结点和叶子结点,可知最后一层都为叶子结点;倒数第二层一部分结点度为3,一部分为叶子结点;其余的结点的度均为3,通过计算度为3的结点总数(33-1-1)/2<8<(34-1-1)/2可知,树共有4层,前两层有度为3的结点(33-1-1)/2=4个,第三层有33=9个结点,其中4个是度为3的结点,5个是叶子结点,所以该树中的叶子结点数为4 × 3+5=17。故选C选项。
(5)A 【解析】在树结构中,一个结点所拥有的后件个数称为该结点的度,所有结点中最大的度称为树的度。对任何一棵二叉树,度为0的结点总是比度为2的结点多一个。二叉树结点总数为530,度为2的结点有250个,则度为0的结点有251个,那么度为1的结点个数为530-250-251=29。故选A选项。
(6)B 【解析】二叉树遍历可以分为3 种:前序遍历(访问根结点在访问左子树和访问右子树之前)、中序遍历(访问根结点在访问左子树和访问右子树两者之间)、后序遍历(访问根结点在访问左子树和访问右子树之后)。由于结点值均大于其左子树上的所有结点值,且小于右子树上的所有结点值,那么只要遍历时访问根结点在访问左子树和右子树之间,遍历序列有序,即中序序列有序。故选B选项。
(7)A 【解析】整数类实例包括:十进制常量用0 ~9表示,不能以0开头;八进制常量用0~7表示,必须用0 开头;十六进制常量用0~9和A~F(a~f)表示,必须以0x或0X开头。本题中B选项是科学计数法表示的浮点数实例,C选项是浮点数实例,D选项是字符串实例。故选A选项。
(8)A 【解析】计算机软件由两部分组成:一是机器可执行的程序和数据;二是机器不可执行的,与软件开发、运行、维护、使用等有关的文档。故选A选项。
(9)D 【解析】通常把软件产品从提出、实现、使用、维护到停止使用、退役的过程称为软件生命周期。选项A、B、C均为生命周期的一部分。故选D选项。
(10)A 【解析】数据管理技术的发展经历了3个阶段:人工管理阶段、文件系统阶段和数据库系统阶段。三者各自的特点如下表所示。
续表
由上表可知,数据库系统独立性较好,文件系统独立性较差;数据库系统可以解决数据冗余和数据独立性问题,而文件系统不能。故A选项正确,D选项错误。文件系统与数据库系统都是计算机系统中管理数据的软件。文件系统是操作系统的重要组成部分,数据库系统是独立于操作系统的软件。但数据库系统是在操作系统的基础上实现的,数据库中数据的组织和存储是通过操作系统中的文件系统来实现的。文件系统较数据库系统能管理更多类型的文件,管理的数据量也更多。故B、C两项错误。
(11)A 【解析】模块化程序的优点:①易于维护和复用,可以提高程序编制的效率;②易于分工合作;③易于模块化调试测试。模块化程序的副作用:①可能会降低程序运行效率;②设计的前期工作需要多花费时间。可知B、C、D选项正确。答案为A选项。
(12)C 【解析】 C语言合法标识符的命名规则是:①标识符由字母、数字和下画线组成;②第一个字符不能是数字,只能是字母或下画线。选项A的第一个字符为&,非法;选项B,第一个字符为#,非法;选项D,第一个字符为-,非法。故答案为选项C。
(13)A 【解析】C 语言中,逗号运算符可以把两个以上(包含两个)的表达式连接成一个表达式。逗号运算符的优先级是所有运算符中级别最低的,逗号运算符保证左边的子表达式运算结束后才进行右边的子表达式的运算。也就是说,逗号运算符是一个序列点,其左边所有副作用都结束后,才对其右边的子表达式进行运算,并以最右边表达式值作为整个逗号表达式的值。因此变量c的值为a% b,即11% 3=2。故答案为A选项。
(14)B 【解析】所谓常量是指在程序运行的过程中,其值不能被改变的量。在C语言中,有整型常量、实型常量、字符常量和字符串常量。选项A是字符串,但使用单引号,错误;选项C和D为实型常量中的指数形式,但指数形式e(E)之前必须是数字,之后必须为整数,错误。故答案为B选项。
(15)A 【解析】代数表达式1/(x·y·z)是小数,转为C语言的表达式必须是小数。A选项,由于1.0为浮点数,计算结果自动转换为浮点数,故A选项正确。B、C、D选项的表达式均为0。
(16)A 【解析】scanf()函数从标准输入输出中读入两个字符“1”和“2”分别赋给变量a和b,遇到回车符自动结束,但回车符已经存入缓冲区,函数getchar()将从中接受回车符,故c赋值为回车符,第二个getchar()读入字符“3”,因此a=1,b=2,c= <CR>,d=3。故答案为A选项。
(17)C 【解析】continue语句的作用是跳过循环体中剩余的语句而强行执行下一次循环。在switch…case语句中,如果没有break会导致多个分支重叠。因此,输入1 时,执行case 1和case 2语句后结束。输入2时,执行case 2语句后结束。输入3时,执行defaul语句,故得到的结果是2,2,3,4。答案为C选项。
(18)A 【解析】题目中程序执行过程中,关键语句z=x/y的结果为:z=1.5,if条件成立,x=2.4,y=2.4,z=1.0,下一次循环if条件不成立,跳出循环,按照格式打印y值为2.400000。故答案为A选项。
(19)C 【解析】scanf("% c",&c)要求输入的为字符,题目中输入了0,而字符0对应的ASCII码为48,因此for循环中,i的范围从0~5,均小于48,if条件不成立,直接执行下一条语句,即执行语句printf,因此得到的结果是0,1,2,3,4。故答案为C选项。
(20)A 【解析】选项A中,i为整型,因此1/i是整型类型,当1/i有小数时,小数部分会被截断。因此1/i结果始终为0,导致结果出错,应改为sum+=1.0/i。因此答案为A选项。
(21)A 【解析】指针运算符(通常称为间接引用运算符:indirection operator 或复引用运算符:dereferencing opera-tor)返回其操作数(即一个指针)所指向的对象的值。定义语句中的 * 号不是一个间址运算符,而是定义指针变量的说明符,因此,A选项错误,B选项正确。原则上说变量p可以有放double兼容性的变量地址,故C选项正确。根据指针的赋值运算,可知D选项正确。故答案为A选项。
(22)A 【解析】函数返回值可以是整型、实型、字符型、指针和结构类型,也可以没有返回值,还可以返回数组指针,因此可知B、C、D选项错误。故答案为A选项。
(23)C 【解析】函数fun()的作用是求数组指定返回的元素的积,故函数fun(a,3)求的是数组a[0]~a[3]的积,因此结果为2 ×3 ×4 ×5=120,故答案为C选项。
(24)A 【解析】(*p)[4]定义了一个数组指针。p可以指向类似于arry[][4]的数组,题目中,p不是一个二维数组,只是可以指向这类二维数组,因此选项A错误。p+1代表了第一行第一个元素的地址,p=a指向数组a的首地址,则B、C选项正确,同理可知选项D也正确。故答案为A选项。
(25)A 【解析】函数change()的作用将从数组尾部将数组内的元素值加 1。数组的初始值为ABCD,因此经change()后,得到的值为BCDE。故答案为A选项。
(26)D 【解析】float a[8]={1.0,2.0};定义了一个包含8个float型元素的数组,并初始化了数组的前2项,其他项是随机数。int b[1]= {0};定义了只有一个int型元素的数组,并初始化为0。char c[]= {"A","B"};定义了一个char型数组,大小由初始化元素决定,但初始化值是字符串,类型不兼容,编译出错。char d = = "1";定义了一个char型变量,但是初始化值是字符串,类型不兼容,编译出错。因此只有a,b定义和初始化正确。故答案为D选项。
(27)C 【解析】第一个for循环初始化数组a,分别为1,3,5,随机数,形成了基本有序的序列,再将输入的数字插入到数组a,使它们形成有序序列。通过分析可知,打印的结果为1,2,3,5。故答案为C选项。
(28)A 【解析】当p=a,n=10,x=10时while循环条件成立,直到p=a+9,结束循环,执行下一条语句,if条件成立,返回p-a,此时p-a=a+9-a=9,因此输出9。故答案为A选项。
(29)C 【解析】数组a是二维数组,数组w存放二维数组a行、列值相同位置的元素,由a[5][10]可得w[0]~w [4]的元素分别是agmsy,因此打印结果为agmsy。故答案为C选项。
(30)A 【解析】字符串“\t\"\\\n\′\065\08AB”中共有13个字符,而 strlen()函数从字符串第一个字符开始扫描,直到碰到第一个结束符“\0”为止,然后返回计数器值(长度不包含“\0”)。故输出结果为6。答案为A选项。
(31)A 【解析】函数fun(*ss,m1m2)的作用是,如果m1>m2,交换数组元素ss[m1]和ss[m2]。因此执行函数fun(ss,0,5)后,因为0<5,数组ss的元素值还是0,1,2,3,4, 5,6,7,8,\0。执行函数fun(ss,9,6),因为9>5,交换数组元素,数组ss的元素值为0,1,2,3,4,5,\0,8,7,6。执行完函数fun(ss,0,9),函数的元素不交换,因此打印结果为012345。故答案为A选项。
(32)A 【解析】全局变量与函数体内局部变量同名时,局部变量会覆盖全局变量,因此在sub1()函数内,全局变量m,n是不可见的。在函数sub1()内,对m,n操作的是局部变量,对全局变量不产生影响。但在sub2()函数内,由于没有和全局变量变量重名,因此在此函数内,m,n是可见的。因此,第一个printf()打印的是全局变量m,n,故打印的结果是1,2;第二个printf(),调用sub1(),没有修改全局变量m,n,故打印的结果是1,2;第三个printf(),之前调用了sub2(),修改了全局变量m,n,因此,打印的结果是2,4。故答案为A选项。
(33)D 【解析】isspace(c)函数作用是检查参数c是否为空格字符。若参数c为空格字符,则返回TRUE,否则返回NULL(0)。Isdigit(c)函数作用是检查参数c是否为阿拉伯数字0~9。返回值若为阿拉伯数字,则返回TRUE,否则返回NULL(0)。程序中,fun()函数的第一个for循环判断字符串是否为负号,第二个for循环获取符号后面的数字字符,并将它们转化为整数,遇到了非数字的字符跳出,最后返回数组的结果。因此,可知首先获取负号,紧接着获取数值26,遇到了字符a跳出,返回-26,因此打印的结果是-26。故答案为D选项。
(34)A 【解析】结构体变量建议在定义的时候进行初始化。结构体常见的几种初始化方法如下:
(1)struct a a1 = {
.b = 1,
.c = 2
};
(2)struct a a1 = {
b:1,
c:2
};
(3)struct a a1 = { 1,2};
计算机内核喜欢用第一种方法初始化,使用第一种和第二种方法时,成员初始化顺序可变。因此,可以判断选项A错误。答案为A选项。
(35)B 【解析】#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/j+k+2,经计算得29。因此输出为29,29。答案为B选项。
(36)A 【解析】 C语言允许由用户自己定义类型说明符,也就是说允许由用户为数据类型取“别名”。类型定义符typedef即可用来完成此功能,可以完全代替原来的类型说明符。因此,变量a的类型为int *a[10]。而typedef int *T [10];语句,由于[]运算符优先级高于*,可以看成typedef int[10]*T,替换T可得int[10]*a=>int *a[10],因此,答案为A选项。
(37)A 【解析】fopen("data.dat","w+");作用是打开可读写文件,若文件存在,则文件长度清为零,即该文件内容会消失;若文件不存在,则建立该文件。rewind(fp);作用是使文件fp的位置指针指向文件开始。fprintf(fp,"% d\n", a[5-i]);作用是将 a[i]输出到 fp 指向的文件中。fscanf(fp,"% d",&k);作用是将fp读入到变量k中,第一个for循环将数组中元素倒着输入到fp指向的文件中;rewind()作用是指向文件开始,因此打印是数组a的倒序。故打印结果为6,5,4,3,2,1。答案为A选项。
(38)A 【解析】函数calloc(n,sizeof(type))在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针,如果分配不成功,返回NULL。函数fun()为变量s申请了内存空间。在调用fun()函数时,传送的是变量q的值,为传值调用,并没有改变指针变量指向的内容,q指向 NULL,因此运行会出错。故答案为A 选项。
(39)A 【解析】函数fgetc()作用是从文件读入一个字符到指定变量。函数fputc()作用是将指定字符写入fp文件中,函数fprintf()和fwrite()的作用均是写入文件操作函数。因此B、C、D选项错误。答案为A选项。
(40)B 【解析】结构体定义时初始化,list[0]={"white",2},list[1]= {"yellow",3},(list+1)- >color=list [1].color="yellow",list- >dim=list[0].dim=2,因此,打印的结果是yellow:2。故答案为B选项。
二、程序填空题
【参考答案】
(1)leap
(2)day
(3)1
【解题思路】
填空1:leap isleap()函数判断是否是闰年,由于初始化2月为28天,但是闰年时是29,因此闰年要多加1天,isleap()应该返回0或者1,leap的表达式为逻辑运算,得到的结果刚好是0或1。
填空2:day 前面累加了平年月份的天数,还需要加上日的天数。
填空3:如果是闰年并且累加月份大于2月,需要多加1天。
三、程序修改题
【参考答案】
(1)double sum改为double sum=0.0;
(2)for(i=0;i<2;i++)改为for(i=0;i<n;i++);
(3)sum += std[i].score[1]改为sum += std[i].score [0];
【解题思路】
(1)累加求和需要初始化累加结果的临时变量。
(2)共有n个学生的成绩,需要累加所有学生第一门课的成绩。
(3)第1门课程的平均分,C语言的下标是从0开始的。
四、程序设计题
【参考答案】
int bits=1;//临时变量统计位数
while(n/10)//判断是否为0,若不为0,bits加1,再将n除以10,继续判断
{
bits++;
n=n/10;
}
return bits;
【解题思路】
通过对指定的多位数每次除以10,去掉最后一位,直到为0结束,使用临时变量来统计一个多位数的位数。
共有条评论 网友评论