14.2 新增真考试题参考答案及解析
第1套 参考答案及解析
一、选择题
(1)A 【解析】算法的时间复杂度是指执行算法所需要的计算机工作量,而算法的计算机工作量是用算法所执行的基本运算次数来度量的,算法所执行的基本运算次数和问题的规模有关,所以 A选项叙述错误,B选项叙述正确。算法的空间复杂度指执行这个算法所需要的内存空间。算法的时间复杂度与空间复杂度没有必然的联系,所以C选项叙述正确。算法的空间复杂度与算法运行输出结果的数据量无关,所以D选项叙述正确。故本题答案为A选项。
(2)A 【解析】对长度为n的线性表排序,在最坏情况下,冒泡排序需要比较的次数为n(n-1)/2。本题中n=20,20 × (20-1)/2=190。故本题答案为A选项。
(3)A 【解析】由于带链栈利用的是计算机存储空间中的所有空闲存储节点,因此随栈的操作栈顶栈底指针动态变化。带链的队列中若只有一个元素,则首尾指针相同。故本题答案为A选项。
(4)A 【解析】在树结构中,一个节点所拥有的后件个数称为该节点的度,所有节点中最大的度称为树的度。
根据题意,度为3的树第1层1个根节点,第2层3个子节点,每个子节点下各3个子节点,所以第3层共9个子节点,前3层共13个节点。第3层有一个节点度为2即有2个子节点,本层其他节点各1个子节点;即第4层共10个节点。前4层共23个节点。第4层中的2个节点下各有1个子节点,即第5层有2个节点,此2个节点下各有1个子节点。第3层有8个度为1的节点,第4层有2个度为1的节点,第5层有2个度为1的节点,8+2+2=12。故本题答案为A选项。
(5)A 【解析】软件设计中模块划分应遵循的准则是高内聚低耦合、模块大小规模适当、模块的依赖关系适当等。耦合性是对模块间相互联系紧密程度的度量。内聚性是指模块内部各个元素间彼此结合的紧密程度的度量。模块的内聚性越高,模块间的耦合性就越低,可见模块的耦合性和内聚性是相互关联的。故本题答案为A选项。
(6)A 【解析】模块的扇出是指本模块的直属下层模块的个数,或者说是由一个模块直接调用的其他模块数。模块的扇入是指有多少个上级模块调用它。题目中某系统为一个模块,其扇出数目为3,功能2模块扇出数为3,功能3模块扇出数为2,功能2.2扇出数目为2,故最大扇出数为3。功能2.2.2有2个上级模块调用,为最大扇入数,即3+2=5。故本题答案为A选项。
(7)A 【解析】系统软件是管理计算机的资源,提高计算机的使用效率,为用户提供各种服务的软件,包括各种系统开发、维护工具软件。应用软件是为了应用于特定的领域而开发的软件。人事管理系统属于应用软件。Oracle数据库管理系统、C++编译系统、iOS操作系统是系统软件。故本题答案为A选项。
(8)A 【解析】在关系数据库中,二维表由行数据组成,每行数据包含若干属性值,每个属性都有指定的类型和取值范围。数据行数是有限的,每行数据互不相同(元组唯一性),每行的次序可以任意交换(元组的次序无关性);表中属性名(列名)各不相同即字段名不重复,属性名(列名)次序可任意交换。故本题答案为A选项。
(9)A 【解析】零件可以存放在多个仓库中,而每一仓库中可存放多种零件,则实体仓库和零件间的联系是多对多。故本题答案为A选项。
(10)A 【解析】依赖是指在一个关系中,一个属性集依赖与别的属性集,或一个属性集决定别的属性集。在关系模式中,如果Y->X,X->A,且X不决定Y和A不属于X,那么Y->A,即Y->A是传递依赖。在关系S中,所在系(Sd)依赖于学号(S#),即S#->Sd;所在系的班主任(Dc)依赖于所在系(Sd),即Sd->Dc。在关系S中存在主属性传递依赖,即S#->Dc。选项B、C、D都不属于主属性传递依赖。故本题答案为A选项。
(11)B 【解析】任何C语言程序,无论简单或复杂,都必须经过编译、链接生成可执行文件才能由计算机运行,选项A、D错误;结构化程序的3种基本结构是顺序结构、选择结构和循环结构,选项B正确;N-S流程图是描述算法的很好的工具,复杂的算法也是可以描述的,选项C错误。故本题答案为B选项。
(12)D 【解析】C语言运行前,需要将C程序编译、链接,生成可执行程序文件,在运行可执行文件时,只能从键盘读入用户输入的字符或数据,依据程序的逻辑来改变程序运行的步骤,选项D正确;不能从键盘读入C源程序并附加到本程序的尾部一并执行,选项A错误;也不能直接读入二进制指令并执行,选项B错误;也不能读入C源程序并逐行运行,选项C错误。故本题答案为D选项。
(13)B 【解析】由于变量c是字符变量,所以选项A中的空格会赋给变量c,丢弃f;选项C会将单引号“'”赋给变量c,丢弃f;选项D会将空格赋给变量c,丢弃单引号“'”和f。故本题答案为B选项。
(14)A 【解析】C语言中赋值运算符具有右结合性,且括号内的表达式优先级最高,所以选项A中首先运算b=3,将3赋给b,表达式的值为3,然后再将1赋给3,这种逻辑是错误的,3是常量,不能被赋值。故本题答案为A选项。
(15)C 【解析】逗号表达式的计算结果是最后一个逗号之后的表达式的运算结果,选项A叙述正确;运算符%是求模运算符,只能对整数类型的变量进行运算,选项B叙述正确;复合运算a*=b+ch中,先计算b+ch的值,再将a与b+ch之和相乘,结果再赋值给a,选项D叙述正确;语句ch=(unsigned int)a+b中,括号优先级最高,所以首先将a强制转换成无符号整型,再与b相加,结果赋值给ch,选项C叙述错误。故本题答案为C选项。
(16)A 【解析】C语言中,合法的标识符是由字母、数字和下划线组成,并且第一个字符必须是字母或下划线,选项D中的3break错误;用户标识符不能是C语言中的关键字或函数,选项B中的unsigned是关键字,不是合法的用户标识符;选项C中的getch是库函数名,不是合法的用户标识符;C语言区分字母大小写,选项B中的Switch是合法的用户标识符;选项A中的两个标识符都是合法的用户标识符。故本题答案为A选项。
(17)A 【解析】scanf()函数是标准输入函数,其中双引号之间的内容是格式控制串,后面是输入参数列表。其中输入参数列表中各项都必须是变量地址,所以选项C错误;在scanf()函数的格式字符前,可以加入一个正整数指定输入数据所占的宽度,但不可以对实数指定小数位的宽度,所以选项B、D错误;选项A是正确的,按照A的输入格式,12345赋值给a,空格赋值给ch,678910.36赋值给d。故本题答案为A选项。
(18)B 【解析】C语言中,实数有两种表示形式:十进制小数形式和指数形式,本题各选项都是以指数形式表示。当实数以指数形式表示:尾数E(或e)整型指数。其中尾数是小数形式的实型常量,E或e是指数形式的标识,又称为阶码标识;整型指数表示指数的大小。C语言规定,E或e之前的尾数必须要有数字,E或e之后的整型指数必须是整数,且E或e前后以及数字之间不得插入空格。综上所述,本题答案为B选项。
(19)B 【解析】C语言中语句必须是以“;”结尾,#include是文件包含的宏定义,不属于C语言的语句,选项A错误;一个#include只可以包含一个文件,如果需要包含多个文件,必须使用多个#include命令行,因此选项C、D错误;#include命令如果太长,可以使用符号'\'将命令写成多行,因此选项B正确。故本题答案为B选项。
(20)A 【解析】x的平方在C语言中有2种表示方法:pow函数和x*x,选项D错误;pow()函数第一个参数是底数,第二个参数是指数,所以x的平方是pow(x,2),选项B错误;余弦值需要使用cos函数,数学上360度等价于2π,所以45度转换成整数是1/4π,选项C错误。故本题答案为A选项。
(21)D 【解析】在本题中,需要求n的平方和并赋给s,直到s大于1000为止。题目的程序中使用do...while()循环来实现,每次循环都是将n自增1后求平方,再累加给s,while循环条件是当s大于1000时,才继续循环,所以本题程序的运行结果是1+2*2=5,不是正确结果。需要将while的循环条件s>1000修改为s<=1000,含义是当s<=1000时继续循环,否则s>1000后终止循环。故本题答案为D选项。
(22)B 【解析】程序首先赋值a为字符'3',赋值b为字符'A',循环变量i的初值为0;每次循环后自增1,最大值为5。if条件判断i的值。当i的值为偶数时,将b与i的和当做字符输出;当i的值为奇数时,将a与i的和当做字符输出。所以i为0时,输出b+0即A;i为1时,输出a+1即'4';i为2时,输出b+2即C;i为3时输出a+3即'6'……,综上所述,程序运行结果为:A4C6E8。故本题答案为B选项。
(23)A 【解析】本题中sum初值为100,要求实现sum减去1到10之和。选项A中,for循环将i从0循环到10,每次循环都用sum减去i的当前值,再将i自增1,满足题意,选项A正确。选项B中,使用do...while()循环,每次循环前i先自增1,然后用sum减去i自增后的值;由于i初值为0,第一次循环sum减去1,直到i为10时继续循环,i自增1后, sum减去11,不满足题意,错误。选项C中,while循环条件i<>不合法,错误。选项D中,循环终止条件为i<10,所以结果是sum累减1~9中所有奇数之和,不满足题意,错误。故本题答案为A选项。
(24)C 【解析】程序中a的初值为123456,while循环的终止条件是a=0;每次循环,都将a的最后一位数字赋给b,a除以10后(丢弃最后一位)重新赋给a,所以循环过程中a(b)的取值为123456(6)、12345(5)、1234(4)、123(3)、12(2)、1(1)。循环体中,每次循环都对b执行switch语句,当b的数值不等于1、2、3、4时,首先执行default语句,输出b并将b自增1,再执行case1、case2语句,输出自增后的b值;当b的数值等于1、2、3、4时,只执行相应地case语句,输出b的值。综上所述,当b为6、5时,分别输出67、56;当b为4、3、2、1时,分别输出4、3、2、1。最终程序输出结果为:67564321。故本题答案为C选项。
(25)A 【解析】数字字符'0'~'9'的ASCII码值是连续递增的,即'1'比'0'的ASCII码值大1……所以在题目中,外层for循环的循环变量i取值为'1'、'2'、……'9';内层for循环的循环变量j取值为'0'、'1'……'9';另外外层for循环的循环体中if(i<'3')语句表示当i的ASCII码小于字符'3'的ASCII码值时,执行continue语句跳入下一次循环(i的ASCII码值自增1);if(i=='4')语句表示当i是字符'4'时,执行break语句跳出循环;同理,内层for循环中的if(j<'2'||j>='4')语句在j的值不等于'2'、'3'时,执行continue跳入下一次循环。综上所述,只有在i取值为'3'或'4',j取值为'2'或'3'时,才执行语句:n=(i-'0')*10+j-'0'和printf("%d",n)。所以当i取值为'3'时,j取值为'2',n的值为3*10+2=32,输出32(空格);j取值为'3',n的值为3*10+3=33,输出33(空格);当i取值为'4'时,j取值为'2',n的值为4*10+2=42,输出42(空格);j取值为'3',n的值为4*10+3=43,输出43(空格)。所以程序最终输出结果为:32 33 42 43。故本题答案为A选项。
(26)B 【解析】指针自增或自减1,移动的字节数与指针变量指向的具体类型有关,假设指针变量p指向的是int类型,那么p=p+1表示指针p移动4个字节(通常int类型占4个字节),选项A错误;将0赋给指针变量,表示指针变量的值为空,这是合法的,选项C错误;通过指针变量存储指向的地址的值,称为“间接存取”方式,选项D错误;指针变量具有基类型,基类型不同的指针变量不能直接相互赋值,选项B正确。故本题答案为B选项。
(27)D 【解析】main()函数中,首先定义两个整型变量i和j,初值为3和7,并将i的地址赋给p,j的地址赋给q,传给swap()函数,swap()函数接收两个整型指针变量a、b。然后使用整型变量t交换a、b所指向的值并输出,通过指针变量,这次交换改变了实参i、j的值,使得i=7,j=3;指针变量tp交换a和b的值,由于a、b的值是p、q值的拷贝,所以这次交换只改变了形参a、b的值,对实参p、q的值没有改变,所以此时a指向j,b指向i,函数最后输出*a和*b,所以输出3、7。由于swap()函数改变了p和q指向的值,但未改变p、q的值,所以main()函数输出i的值为7,j的值为3,*p的值为i,*q的值为j,所以程序输出结果为:3,7,7,3,7,3。故本题答案为D选项。
(28)A 【解析】fun()函数两个参数:array和ptr,返回值为void类型,其中array是float数组名,ptr是整型指针变量。C语言中,数组名本身就是一个地址,作为形参时数组退化成指针类型,所以array就是一个指针变量,选项A正确、选项B错误;调用函数fun()时,实参数组元素的个数与形参array数组元素个数相同,选项C错误;调用函数fun()时,传递给形参array的只是实参数组的首地址,选项D错误。故本题答案为A选项。
(29)A 【解析】C语言中,双引号""括起来的是字符串,单引号''括起来的是字符,选项B错误;""是长度为0的字符串,它包含字符串结束标志符'\0',所以不是空字符串,选项C错误;'\n'是回车字符,"\n"是字符串,它还包括字符串结束标志符'\0',选项D错误。在C语言中,以"\"开头的字符属于转义字符,在'\ddd'中ddd是三位八进制数,它代表一个ASCII字符;在'\xhh'中hh是两位十六进制数,也代表一个ASCII字符,所以A选项中两个都是转义字符常量,选项A正确。故本题答案为A选项。
(30)D 【解析】rand()函数是产生随机数的函数,它可以生成0~RAND_MAX的一个随机数,其中RAND_MAX是stdlib. h中定义的一个整数。通常我们需要0 ~N-1 的一个随机数,使用rand()的结果对N求模即可。选项A中,rand ()%2只有两个值0或1,所以当rand()%2的结果为0时,整个表达式的值是rand()%'A',这里'A'要转换成ASCII码值65,所以结果为0~64的一个随机数;当rand()%2的结果为1时,整个表达式的值是rand()%'a','a'的ASCII码值为97,所以结果是0~96的一个随机数,可见选项A错误;逻辑或运算符“||”或逻辑与运算符“&&”的结果都只能是0或非0,所以选项B、C也是错误的;选项D中,如果rand()%2的结果为0,那么整个表达式的值为rand()%26+'A',0~25的任一个数与'A'的和都是一个大写字母;如果rand()%2的值为1,整个表达式的值为rand()%26+'a',0~25的任一个数与'a'的和都是一个小写字母,所以选项D正确。故本题答案为D选项。
(31)A 【解析】由题意可知,指针变量p指向变量a,p的值是a的地址;指针变量q指向变量p,q的值是p的地址,所以q是指针变量,q指向p,*q是变量p,选项A叙述错误。p也是指针变量,p指向a,选项B叙述正确。由于q指向p,所以*q指向a,选项C叙述正确。*p和**q都是代表变量a,选项D叙述正确。故本题答案为A选项。
(32)C 【解析】f()函数有两个参数:数组首地址x和数组元素个数n,当n大于1时,首先输出最后一个元素x[n-1],然后递归调用自身;直到n等于1时再次输出x[n-1],然后回到上一层调用,输出x[n-1];main()函数定义一个数组a,包含4个元素1、2、3、4,然后调用f函数f(a,4),此时形参x等于a,形参n的值是4,所以输出a[3]即4,接着调用f(a,3),输出3,调用f(a,2)输出2,调用f(a,1)输出1;接着再逐步回到上一层的调用,f(a,2)输出2,f(a,3)输出3, f(a,4)输出4。最终程序输出结果为:4321234。故本题答案为C选项。
(33)A 【解析】fun()函数参数是字符串的首地址p,函数首先将首地址p赋给t,然后通过while循环遍历指针t,直到t指向字符串结束标志符'\0',此时循环结束,t指向'\0',p指向首地址,所以p指向的字符串所占存储单元个数就是:tp。故本题答案为A选项。
(34)B 【解析】main()函数中定义一个二维数组v,另外还定义一个指针数组p,通过for循环,将v的各个行(字符串的首地址)赋给p的对应下标的元素,然后通过嵌套的for循环,为该二维数组中存放的各个字符串进行排序,stcmp函数返回值大于0时(p[i] >p[j])交换两个字符串,所以每一轮内嵌的for循环,都将下标为i的字符串放在最终的排序位置上,即排序规则是按字符串升序排列。字符串排序时,将两个字符串自左向右逐个字符比较(按字符的ASCII码大小),直到出现不同的字符或遇到'\0'为止,排序后,再将v中各个排序后的字符串输出。所以程序运行结果为:abcd efghijklmnopq。故本题答案为B选项。
(35)D 【解析】程序中S1和S2都是宏定义,所以S1(a+b)宏展开后的表达式为4*a+b+4*(a+b),即4*1+2+4*(1+2),结果为18;S2(a,b)宏展开的表达式为4*(a)*(b)+b*a,即4*(1)*(2)+2*1,结果为10;S1(3)宏展开后的表达式为4*3+4*(3),结果为24;S2(3+a,b+3)宏展开的表达式为4*(3+a)*(b+3)+b+3*3+a,即4*(3+1)*(2+3)+2+3*3+1,结果为92。本题输出结果为:18,34,92。故答案为D选项。
(36)A 【解析】link结构体中的next是链表中下一个节点的地址,由于p当前指向A,所以p->next是B的地址,p->next->next是C的地址,访问C的节点数据成员dt可以使用C的地址访问,即:p->next->next->dt,选项B正确;p是A的地址,所以*p是节点A;(*p).next是B的地址,由于成员运算符“.”的优先级高于解引用运算符“*”,所以*(*p).next是节点B;(*(*p).next).next是C的地址,*(*(*p).next).next是节点C,引用C的dt成员:(*(*(*p).next).next).dt,选项C正确;同理,也可以既使用指针运算符,也使用解引用运算符来访问C的节点数据成员dt,即(*(p->next->next)).dt,选项D正确;选项A中,*p表示A节点,(*p).next表示节点B的地址,由于->运算符的优先级高于*运算符,所以先执行->,即表达式(*p).next->next->dt引用了C节点的数据成员dt,然后再执行解引用运算符*,这是错误的。故本题答案为A选项。
(37)B 【解析】由题意可知,使用typedef将类型struct{intx,y;} *重命名为USER,所以函数fun的返回类型为struct{intx, y;} *,即指向结构体类型的指针。故本题答案为B选项。
(38)C 【解析】C语言中,宏定义和宏调用都是允许嵌套的,选项A、D错误;根据题意,将表达式x=HA*(HA+HB(2))宏展开为x=2 *(2 +(2+1)*2),所以结果为x=16,选项B错误,选项C正确。故本题答案为C选项。
(39)A 【解析】C语言文件打开时,打开方式“a+”表示打开一个文本文件,从文件开始位置读,在文件尾部添加数据,如果指定的文件不存在,系统将使用调用fopen()时指定的文件名创建一个新的文件,如果指定的文件存在,那么文件原有内容将被保存,新的数据追加到原有文件之后。故本题答案为A选项。
(40)D 【解析】程序首先以读和写二进制文件的方式打开文件d.dat,然后通过for循环调用fwrite()函数将数组a中的各个元素写入到d.dat中;然后使用rewind()函数,将文件指针fp重定位到文件的开始位置,再调用fread()函数将文件的前3个整数1、2、3读入a[3]开始的位置,所以此时数组 a中的元素值分别为:1、2、3、1、2、3。故本题答案为 D选项。
二、程序填空题
【参考答案】
(1) 1 (2) i
(3) a[p+i]或*(a+p+i)
【考点分析】
条件运算符组成条件表达式的一般形式:表达式1?表达式2:表达式3。其求值规则为:如果表达式1的值为真,则以表达式2 的值作为条件表达式的值,否则以表达式3的值作为整个条件表达式的值。
【解题思路】
填空1:该处是判断数组元素的个数是奇数还是偶数,为奇数时要使当前位置加1,使p指向数组中间位置。
填空2和填空3:这里是一个比较常见的数组位置调换程序,应填入i和a[p+i]或*(a+p+i)。
【解题宝典】
变量交换算法:如果变量a、b互换,需借助第3个变量temp完成,即temp=a;a=b;b=temp;。
三、程序修改题
【参考答案】
(1)floatk;
(2)if(*a<*c)
【考点分析】
本题考查:变量定义,根据给定程序语句确定变量类型;if语句条件表达式。
【解题思路】
(1)观察程序中的k,在赋值语句中,k是以变量的形式进行赋值而非指针,所以将k定义为指针是错误的。
(2)此处if语句是为了将小于*c的值放入*c中,所以改为if(*a<*c)。
四、程序设计题
【参考答案】
int fun(STREC *a,STREC *b)
{
int i,j=0,max=a[0].s;
for(i=0;i<N;i++)
if(max<a[i].s)/*找出最大值*/
max=a[i].s;
for(i=0;i<N;i++)
if(max==a[i].s)
b[j++] =a[i];
/*找出成绩与max相等的学生的记录,存入结构体b中*/
return j; /*返回最高成绩的学生人数*/
}
【考点分析】
本题考查:结构体数组操作;用循环判断结构查找数组中的最大值。
【解题思路】
该程序使用两个循环判断语句,第1个循环判断语句的作用是找出最大值;第2个循环判断语句的作用是找出与max相等的成绩(即最高成绩)的学生记录,并存入b中。
【解题宝典】
对于如何找出数组中最大值(多个相等)的方法,我们已经不陌生。如何对结构体数组进行类似操作呢?
掌握以下语句:
for(i=0;i<N;i++)
if(max<a[i].s)max=a[i].s;
第2套 参考答案及解析
一、选择题
(1)A 【解析】数据的逻辑结构有两个要素:一是数据元素的集合,通常记为D;二是D上的关系,它反映了D中各数据元素之间的前后件关系,通常记为R。即一个数据结构可以表示成B=(D,R),其中B表示数据结构。为了反映D中各数据元素之间的前后件关系,一般用二元组来表示。例如,假设a与b是D中的两个数据,则二元组(a,b)表示a是b的前件,b是a的后件。如果一个非空的数据结构满足下列两个条件:①有且只有一个根节点;②每一个节点最多有一个前件,也最多有一个后件,则称该数据结构为线性结构。如果一个数据结构不是线性结构,则称为非线性结构。根据上述理论,本题中f为根节点,每个节点有一个前件和一个后件,符合线性结构的定义。故本题答案为A选项。
(2)A 【解析】在循环队列中,队头指针和队尾指针相同并不能说明循环队列为空,还需要判断表示s,s=0表示队列为空,A选项错误;空二叉树没有叶子节点,B选项正确;带链栈的栈底指针随栈的操作而动态变化,C选项正确;若带链队列中只有一个元素,则队头指针与队尾指针必定相同,D选项正确。故本题答案为A选项。
(3)A 【解析】当top=bottom=20时,表示栈顶和栈底指向同一元素。栈底指针永远指向栈的底部,所以该栈的元素只有1个。故本题答案为A选项。
(4)A 【解析】根据题目,有6个度为0的节点:,1个度为1的节点:,3个度为2的节点:,因此最后度为3的节点有1个:。故本题答案为A选项。
(5)A 【解析】模块独立性实现了模块的信息隐蔽和局部化。模块间的耦合性和内聚性是度量模块独立程度的标准。一个模块的内聚性越高,则该模块的独立性越强;一个模块的耦合性越高,则该模块的独立性越弱。故本题答案为A选项。
(6)A 【解析】黑盒测试方法也称为功能测试或数据驱动测试。黑盒测试是对软件已经实现的功能是否满足需求进行测试和验证。黑盒测试方法主要有等价类划分法、边界值分析法、错误推测法和因果图等。白盒测试方法主要有逻辑覆盖测试(语句覆盖、路径覆盖、判断覆盖、条件覆盖)、基本路径测试等。故本题答案为A选项。
(7)A 【解析】数据模型按照不同的应用层次分为3种类型:概念数据模型、逻辑数据模型、物理数据模型。概念数据模型有实体-联系模型(E-R模型)、面向对象模型及谓词模型;逻辑数据模型有层次模型、网状模型、关系模型和面向对象模型。故本题答案为A选项。
(8)A 【解析】在二维表中凡能唯一标识元组的最小属性集称为该表的键或码。表A中的某属性集是某表B的键,则称该属性集为A的外键或外码。故本题答案为A选项。
(9)A 【解析】关系模型中可以有3类完整性约束:实体完整性约束、参照完整性约束和用户定义的完整性约束。实体完整性约束是指若属性M是关系的主键,则属性M中的属性值不能为空值。故本题答案为A选项。
(10)A 【解析】若X→Y,但Y不完全函数依赖于X,则称Y对X部分依赖。关系模式SC中,主键为(S#,C#),但显然有S#→Sd、S#→Sa,存在非主属性对主属性的部分依赖。故本题答案为A选项。
(11)B 【解析】C语言规定必须用main作为主函数名,选项D叙述正确;main()是C语言中主函数的起始行,也是C程序执行的起始行,选项A、C叙述正确;main()作为主函数可以在源程序的任意位置,但是程序执行必须从main()函数开始,选项B叙述错误。故本题答案为B选项。
(12)A 【解析】在程序设计时,用一个个小模块来实现不同的功能,每个程序设计人员分别完成一个或多个小模块,称这样的程序设计方法为“模块化”。由一个个功能模块构成的程序结构称为模块化结构,使用模块化结构程序设计,有利于任务的分解简化,选项B叙述正确;C语言允许对函数单独进行编译,从而可以实现模块化,选项C叙述正确;采用模块化结构,可以使不同模块的程序员分别编写和调试,大大提高了编程效率,选项D叙述正确;在C语言程序中,每个模块并不一定能够单独编译运行,选项A叙述错误。故本题答案为A选项。
(13)D 【解析】在编写程序时可以在程序中加入注释,以说明变量的含义。在添加注释时,注释内容必须放在符号“/*”和“*/”之间,“/*”和“*/”必须成对出现,“/”与“*”之间不可以有空格,选项A叙述正确;注释可以用英文,也可以用中文,还可以出现在程序中任意合适的地方,选项B叙述正确;注释部分只是用于阅读,对程序的运行不起作用,选项C叙述正确;使用“/*”和“*/”的注释之间不可再嵌套“/*”和“*/”,选项D叙述错误。故本题答案为D选项。
(14)A 【解析】合法C语言的标识符的命名规则是:标识符可以由字母、数字和下划线组成,并且第一个字符必须是字母或下划线,则选项A正确;^符号不合法,则选项B错误;~符号不合法,则选项C错误;-符号不合法,则选项D错误。故本题答案为A选项。
(15)B 【解析】在本题的表达式中,圆括号的优先级最高,乘法运算符次之,加法运算符最低,同优先级中加法运算符的结合性为从左向右结合,所以表达式执行顺序是:先执行a+b得r1,再执行(d+e)得r2,再执行c*r2得r3,最后执行r1+r3得表达式最后结果。故本题答案为B选项。
(16)C 【解析】对于double类型的实数,可以在printf()函数的格式化字符串中使用“n1.n2”的形式来指定输出宽度(n1和n2 分别代表一个整常数),其中n1 指定输出数据的宽度(包括小数点),n2 指定小数点后小数位的位数,n2 也称为精度。对于格式字符%f,当输出数据的小数位多于n2 位时,截取右边多余的小数,并对截取部分的第一位小数做四舍五入处理;当输出数据小数位少于n2 时,在小数的最右边补0,使得输出数据的小数部分宽度为n2;如果指定“n1. 0”格式,则不输出小数点和小数部分。题目中,%6.2f表示输出6位宽度,2位小数,所以被截取的小数位0.006四舍五入,结果为123.46;%3.0f表示输出3位宽度,0位小数,结果为123。故本题答案为C选项。
(17)D 【解析】在本题中,x是一个整型变量,赋值为072,以0开头的整数是八进制的表示形式;printf()函数中,格式字符%d表示以十进制形式输出x+1,所以需要将072转换成十进制数7*8 +2 =58,输出x+1为59。故本题答案为D选项。
(18)A 【解析】根据算术表达式和运算符的优先级与结合性,对于本题中表达式:int(x*1000 +0.5)/(double)1000,首先计算x*1000,由于x是double类型、1000是整型,x*1000的结果默认是double类型,即3141.59;再加0.5后执行int的强制转换,结果为3142;分母(double)1000强制转换为double类型,此时3142/(double)1000中,3142需要转换成double类型,然后除以1000,结果为3.142000,保留了小数点后6位。故本题答案为A选项。
(19)A 【解析】单引号括起来的单个字符,属于字符常量,对应的格式字符是%c,双引号括起来的若干字符,属于字符串常量,对应的格式字符是%s,因此选项A错误;%d是整型数据的格式字符,由于字符常量或变量可以作为整型数,也可以作为整数参与算术运算,选项B、C正确;同理,整数也可以作为字符常量,选项D正确。故本题答案为A选项。
(20)B 【解析】在本题中,输入语句scanf()的格式控制字符串中,第一个%d与第二个%d之间有一个逗号,第二个%d与第三个%d之间有一个空格,所以输入的第一个整数和第二个整数之间也必须要有一个逗号,选项C、D错误;对于第二个整数和第三个整数之间的空格,可以使用tab、回车、空格符,选项A错误。故本题答案为B选项。
(21)D 【解析】第一个if语句是单独的语句,所以执行完第一个if语句后,r的值仍为初值0;第二个if语句与后续的两个elseif都是嵌套的,所以只会执行其中的一个语句,即if(b==2)r=2这条语句。故本题答案为D选项。
(22)A 【解析】C语言中,函数声明的函数名、返回值类型和参数列表必须与函数定义相同,其中参数列表中可以省略参数名。题目中,fun()函数返回整型,3个参数分别是:整型指针、整型指针、整型。选项A中,第一个参数应该是整型指针类型,第二个参数也应该是指针类型,因此A选项声明错误;其他选项都正确。故本题答案为A选项。
(23)C 【解析】题目中定义了字符数组a,它包含数字字符和字母字符;然后通过for循环,将a中所有的数字字符前移,舍去其他字符,并在数字字符后添加字符串结束符'\0'。for循环结束后,数组a的值为123456789。故本题答案为C选项。
(24)D 【解析】程序中a初值为-2,for循环执行++a后结果为-1,b初值为2,for循环执行--b后结果为1,所以for循环的循环条件-1&&1的值为真,执行printf语句输出结果为-1,1;接着下一次循环时,++a结果为0,--b结果为0,0&&0结果为假,for循环结束。故本题答案为D选项。
(25)C 【解析】fun()函数的功能是将参数x的值赋给y,然后x自增1,返回y的值,所以fun()的返回值与实参值相同;main()函数的for循环中,k的初值为0,执行printf语句时,输出fun(0)+0,结果为0;接着执行两次k++,此时k的值为2,循环条件k<3满足,继续执行printf()函数,输出fun(2)+2,结果为4;接着再次执行2次k++,k为4,不满足循环条件,程序运行结束,所以程序输出结果为0,4。故本题答案为C选项。
(26)A 【解析】f()函数接收一个数组a的首地址s,然后将s指针向后移动两个单位,此时s指向数组a的第3个元素,即3;然后将s的后一个元素累加6,s指向的元素赋值为7,并返回s指针赋给实参p,所以f()函数调用后,a数组中的元素分别为1,2,7,10,5。执行p=f(p)后,p指向第3个元素,所以输出a[0]为1,a[1]为2,*p为7,p[1]为10。故本题答案为A选项。
(27)B 【解析】程序在进入for循环时,a的初值为6,i的初值为1;for循环中,if(a>=5)语句成立,执行break,跳出for循环,此时a的值为6,i的值为1,所以程序输出结果为1,6。故本题答案为B选项。
(28)A 【解析】字符'3'的ASCII码值是51,所以选项A的值是51;字符'D'、'A'的ASCII码值是68、65,选项B的值为3;字符'3'、'0'的ASCII码值是51、48,所以选项C的值为3;字符'd'、'a'的ASCII码值是100、97,所以选项D的值为3。故本题答案为A选项。
(29)B 【解析】题目中,fun()函数的作用是将数组a中,前n个元素按照flag来排序,当flag为true(非0)时降序排列,当flag为false(0)时升序排列;main()函数中,两次调用fun()函数,第一次传入数组元素个数为10,flag为0,所以第一次fun()函数的调用是将数组c中的前10个元素升序排列;第二次传入数组元素个数为5,flag为1,所以第二次fun ()函数的调用是将数组c中的前5个元素降序排列,两次调用后,数组c的元素顺序为:5,4,3,2,1,6,7,8,9,10,。故本题答案为B选项。
(30)D 【解析】选项A中,int是关键字,不能作为用户标识符,命令行错误;选项B中,两个#号错误;选项C中两个#号错误,另外DEFINE大写也是错误的;选项D正确。故本题答案为D选项。
(31)A 【解析】程序通过scanf()函数,输入data的值13,for循环中i的值遍历0~4,对每个i的值执行if语句判断,其中i>data始终为假,所以表达式i>data&&i%3==0始终为假,所以if语句的判断条件需要看i<data&&i%2的值。由于i<data始终为真,i<data&&i%2的值又取决于i%2的值,也就是说整个if语句的判断条件取决于i%2的值,如果i%2为真,那么if语句成立,执行continue,否则执行printf()函数。所以当i取值1、3时i%2的为1,if条件成立,执行continue;当i取值0、2、4时,i%2的值为0,if条件不成立,执行printf()函数,输出结果为0,2,4。故本题答案为A选项。
(32)A 【解析】选项A中,sum初值为1,i初值为0;当i<=n成立时,执行while()循环,首先i自增1,此时1的值为1,然后sum累加i,此时sum的值为1+1=2,所以选项A计算了2次1,不能实现累加求和功能,选项B、C、D都正确。故本题答案为A选项。
(33)B 【解析】C语言中,数组名本身就是一个指针,指向数组内存的起始位置,选项A叙述正确;可以将一个指针指向一个同类型的数组,选项C叙述正确;指针指向一个数组后,可以通过移动指针指向该数组中的任意一个元素,选项D叙述正确;已经定义的数组被分配了内存空间,所以可以读入数据到数组中,未赋初值的指针没有分配内存空间,所以不可以读入数据,选项B叙述错误。故本题答案为B选项。
(34)C 【解析】程序main()函数中首先定义整型数组a和整型指针p,数组a包含5个元素:1、2、3、4、5。然后将数组第2个元素2的地址&a[1]传给函数f(),形参s接收了此地址,然后将s指针向后移动一个单位,此时s指向数组a的第2个元素,即3。然后将此时s指向的后一个元素累加6,并将s指向的元素累加7后,s再次后移一位,指向数组a的第4个元素,最后将s的值返回赋给p,所以f()函数调用后,a数组中的元素分别为1,2,10,10,5,p指向第4个元素,所以输出a[1]为2,a[2]为10,*p为10,p[1]为5。故本题答案为C选项。
(35)B 【解析】在程序中,fun1()函数的功能是返回数组a中前n个元素的平均值;fun2()函数的功能是遍历数组a的前n个元素,将最大值存放p指向的地址,将最小值存放q指向的地址,所以对于main()函数中的数组a,av的值是3.000000,mx的值是5.000000,mn的值是1.000000。故本题答案为B选项。
(36)C 【解析】C语言中,函数名也是一个指针,是函数的入口地址,所以要是函数指针f指向函数fun的入口地址,直接将函数名fun赋给f即可。故本题答案为C选项。
(37)A 【解析】程序中定义结构体类型group,它包含3个成员变量:first、second、third。main()函数中,定义数组array,它包含5个元素:9,1,3,4。然后将array和元素个数5传给get_min_max_sum()函数,get_min_max_sum()函数遍历数组array,然后将数组中元素的最小值赋给res的first,将最大值赋给res的second,将数组元素之和赋给res的third,所以程序输出:min=0,max=9,sum=17。故本题答案为A选项。
(38)A 【解析】题目中使用malloc()函数分配了80个字节的内存单元,void指针p指向该内存单元。在C语言中,void*不能直接使用,必须利用强制类型转换将其转成所需的类型才能使用,则选项A叙述错误;int类型的元素占4个字节,所以可以将p指向的内存强制类型转换成具有20个int类型的一维数组来使用,同理也可以强制类型转换成10个double类型的一维数组,或强制类型转换成80个char类型的一维数组,则选项B、C、D叙述正确。故本题答案为A选项。
(39)A 【解析】结构体PER类型定义了两个成员:num为整型,date为嵌套的结构体类型。初始化时,成员值的顺序必须与成员定义的顺序相同,num必须是整数,date必须是小括号括起来的嵌套的3个整数。选项A中,{1001}和{1002}都不是整数,语句错误。故本题答案为A选项。
(40)B 【解析】fputs(str,fp)的功能是将字符串str输出到文件指针fp指向的文件中。故本题答案为B选项。
二、程序填空题
【参考答案】
(1) N (2) k (3) ss[i]
【考点分析】
本题考查:for循环语句;if语句条件表达式;字符串复制函数strcpy的使用。
【解题思路】
填空1:for循环语句的作用是遍历字符串数组中的每一个字符串,所以循环变量i的循环条件是i<N。
填空2:题目要求删除串长度大于k的字符串,所以if条件语句的条件表达式是len<=k。
填空3:通过字符串复制函数将串长不大于k的字符串另存,并记录个数。
【解题宝典】
字符串复制函数strcpy,其格式为:
strcpy(字符数组名1,字符数组名2)
功能:把字符数组2中的字符串复制到字符数组1中。字符串结束标识“\0”也一同复制。字符数组2 也可以是一个字符串常量,这时相当于把一个字符串赋予一个字符数组。
三、程序修改题
【参考答案】
(1)intk =0;
(2)while(*p||*q)
【考点分析】
本题考查:变量初始化,需要根据题意确定变量含义,然后对其进行初始化操作;while循环语句。
【解题思路】
(1)变量k存放数组c的下标,因此应初始化为0。
(2)while循环语句的循环条件是判断两个字符串是否到达结尾。
四、程序设计题
【参考答案】
void fun(char *a)
{
int i=0;
char *p=a;
/*单独处理 字符串前缀为'*'的情况*/
while(*p&&*p=='*')
{
a[i] =*p;i++;p++;
}
/*循环判断当前指向的字符是否'*'如果不是保存*/
while(*p)
{
if(*p!='*')
/*保存非*的字符串,并将指针移到下一个位置*/
{
a[i] =*p;i++;
}
p++;
}
a[i] ='\0';
}
【考点分析】
本题考查:指针型变量定义;while循环语句;if语句条件表达式;字符串结束标识“\0”。
【解题思路】
函数fun的功能:除了字符串前导的*号之外,将串中其他*号全部删除。解答本题,首先定义一个临时指针p,初始指向原串首地址;其次利用循环语句把字符串前导*号复制到原串;然后继续移动指针,把串中和串尾的非*号字符复制到原串;最后为修改后的字符串赋结束字符“\0”。
【解题宝典】
要删除字符串中的指定字符,通常采用保留非指定字符的方法。可以将非指定字符保留在原串,即将需要保留的字符从原串的起始位置重新赋值;也可以保留到新串,即新建一个字符串,存放要保留的字符。