国家二级(C语言)笔试模拟试卷23(题后含答案及解析)_第1页
国家二级(C语言)笔试模拟试卷23(题后含答案及解析)_第2页
国家二级(C语言)笔试模拟试卷23(题后含答案及解析)_第3页
国家二级(C语言)笔试模拟试卷23(题后含答案及解析)_第4页
国家二级(C语言)笔试模拟试卷23(题后含答案及解析)_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

国家二级(C语言)笔试模拟试卷23(题后含答案及解析)题型有:1.选择题2.填空题选择题(1-10、21-40每题2分,11-20每题1分,共70分)下列各题A、B、C、D四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上。1.算法执行过程中所需要的存储空间称为算法的A.时间复杂度B.计算工作量C.空间复杂度D.工作空间正确答案:C解析:算法执行时所需要的存储空间,包括算法程序所占的空间、输入的初始数据所占的存储空间以及算法执行过程中所需要的额外空间,其中额外空间还包括算法程序执行过程的工作单元以及某种数据结构所需要的附加存储空间.这些存储空间共称为算法的空间复杂度。2.以下数据结构中属于线性数据结构的是A.集合B.线性表C.二叉树D.图正确答案:B解析:所谓的线性结构是指:如果一个非空的数据结构满足下列两个条件,即1)有且只有一个根结点;2)每一个结点最多有一个前件,也最多有一个后件。同时满足两个条件的只有线性表,而其他三种数据结构的结点可能存在多个前件或后件,所以不是线性结构。故答案为B。3.下列数据结构中,能用二分法进行查找的是A.顺序存储的有序线性表B.线性链表C.二叉链表D.有序线性链表正确答案:A解析:二分查找只适用于顺序存储的有序表。在此所说的有序表是指线性表中的元素按值非递减排列(即从小到大,但允许相邻元素值相等)的。选项A正确。4.函数重载是指A.两个或两个以上的函数取相同的函数名,但形参的个数或类型不同B.两个以上的函数取相同的名字和具有相同的参数个数,但形参的类型可以不同C.两个以上的函数名字不问,但形参的个数或类别相同D.两个以上的函数取相同的函数名,并且函数的返回类型相同正确答案:A解析:函数重载指的是两个或两个以上的函数具有相同的函数名,但形参的个数或类型不同。程序中通过判断主调函数传过来的参数的个数和类型,来决定选择调用哪个具体的函数。5.检查软件产品是否符合需求定义的过程称为A.确认测试B.集成测试C.验证测试D.验收测试正确答案:A解析:确认测试是要检查已实现的软件是否满足了需求规格说明书中确定了的各种需求,以及软件配置是否完全、正确。软件需求规格说明书是软件确认测试的基础。6.在结构化程序设计方法中,下面哪种内聚的内聚性最弱?A.逻辑内聚B.时间内聚C.偶然内聚D.过程内聚正确答案:C解析:内聚有很多种类,其中内聚性由弱到强的顺序为:偶然内聚、逻辑内聚、时间内聚、过程内聚.所以本题的答案为C。7.支持数据库各种操作的软件系统叫做A.数据库管理系统B.文件系统C.数据库系统D.操作系统正确答案:A解析:数据库管理系统是一种系统软件,负责数据库中的数据组织、数据操纵、数据维护、控制及保护和数据服务等操作。所以答案为A。8.数据库系统可分为三级模式,下列选项中不属于数据库三级模式的是A.抽象模式B.外模式C.概念模式D.内模式正确答案:A解析:数据库的三级模式是指概念模式、内模式和外模式,其中外模式又叫子模式,内模式又叫物理模式.所以本题答案为A。9.在数据库设计的四个阶段中,为关系模式选择存取方法应该是在______阶段。A.需求分析B.概念设计C.逻辑设计D.物理设计正确答案:D解析:需求分析阶段是分析用户的需求,显然不属于这个阶段,由此可以排除选项A.概念设计是将需求分析得到的用户需求抽象为信息结构及概念模型的过程,涉及不到数据的存取,所以选项D错误。逻辑设计是在概念设计的基础上将E-R图转换成数据库管理系统的逻辑数据模型表示的逻辑模式,也不涉及存取问题,选项C也不对。答案为D。10.以下说法不正确的是A.C程序中必须有一个main()函数,C程序是从main()函数的第1条语句开始执行的。B.非主函数都是在执行主函数时,通过函数调用或嵌套调用而得以执行的。C.C程序中的main()函数必须放在程序的开始位置。D.C程序中的main()函数位置可以任意指定。正确答案:C解析:本题考核的知识点是main()函数的作用,以及main()函数在程序中出现的位置。一个完整的C语言程序有且仅有一个主函数(main()函数)。程序总从main()函数的第一条语句开始执行,到main()函数的最后一条语句结束,其他函数都是在执行main()函数时,通过函数调用或嵌套调用而得以执行的。C语言规定,main()函数在程序中的位置是任意的,故选项c不正确。所以,4个选项中C符合题意。11.C语言中用于结构化程序设计的三种基本结构是A.顺序结构、选择结构、循环结构B.if、switch、breakC.for、while、do-whileD.if、for、continue正确答案:A解析:结构化程序设计是由3种基本结构组成的,它们是顺序结构、选择结构和循环结构。所以,A选项为所选。12.为了使模块尽可能独立,要求A.模块的内聚程度要尽量高,且各模块间的耦合程度要尽量强B.模块的内聚程度要尽量高,且各模块间的耦合程度要尽量弱C.模块的内聚程度要尽量低,且各模块间的耦合程度要尽量弱D.模块的内聚程度要尽量低,且各模块间的耦合程度要尽最强正确答案:B解析:系统设计的质量主要反映在模块的独立性上.评价模块独立性的主要标准有两个:一是模块之间的耦合,它表明两个模块之间互相独立的程度;二是模块内部之间的关系是否紧密,称为内聚.一般来说,要求模块之间的耦合尽可能地弱,即模块尽可能独立,而要求模块的内聚程度尽量地高。综上所述,选项B的答案正确。13.以下非法的赋值语句是A.n=(i=2,++i);B.j++;C.++(i+1);D.x=j>0;正确答案:C解析:本题考查的知识点是赋值语句的基本知识。在表达式的运算中,双目赋值运算符的格式为“变量二表达式”,单目运算符一般形式为“运算符表达式”或“表达式运算符”。常量和表达式是不能被赋值的。选项A为复合表达式,首先计算(i=2,++i)的值,然后赋值给n,故选项A正确;选项B为简单自加运算,故选项B正确;选项C在表达式++(i+1);中,(i+1)不是变量,该表达式的值为常量,而在++运算中,其运算对象必须为变量,故选项C错误;选项D中为复合赋值表达式,正确.所以应当选择C。14.有以下程序:main(){inta=1,b=2,m=0,n=0,k;k=(n=b>A)||(m=a<B);printf(“%d,%d\n”,k,m);}程序运行后的输出结果是A.0,0B.0,1C.1,0D.1,1正确答案:C解析:在“||”运算中当其左边的表达式为真,右边的表达式将不再执行。主函数中,“||”左边的表达式k=(n=b>a),“2>1”为真,所以n被赋值为1,接着k被赋值1,即“||”运算符左边表达式为真,此时不再计算“||”右边的表达式,因此m的值没有被改变仍为0,最后的输出结果1,0。所以,4个选项中选项C符合题意。15.已知i、j、k为int型变量,若从键盘输入:1,2,3<回车>,使i的值为1、i的值为2、k的值为3,以下选项中正确的输入语句是A.scanf(“%2d%2d%2d”,&i,&j,&k);B.scanf(“%d%d%d”,&i,&j,&k);C.scanf(“%d,%d,%d”,&i,&j,&k);D.scanf(“i=%d,j=%d,k=%d”,&i,&j,&k);正确答案:C解析:本题考查的知识点是输入函数scanf()基本用法。使用该语句时,要求除格式控制符以外的字符都要原样输入,“,”为非格式符,要原样输入。选项A,输入格式描述为“%2d%2d%2d”,输入要用空格隔开,不满足键盘输入1,2,3的条件,故A错误:选项B中,输入格式描述符为“%d%d%d”,输入也要用空格隔开,故错误:选项D中,输入格式描述符为“i=%d,i=%d,k=%d”,应该从键盘输入i=1,j=2,k=3,才能使得i,j,k的值为1,2,3,故选项D错误。4个选项中C正确。16.设有如下程序段:intx=2002,y=2003;printf(“%d\n”,(x,y));则以下叙述中正确的是A.输出语句中格式说明符的个数少于输出项的个数,不能正确输出B.运行时产生出错信息C.输出值为2002D.输出值为2003正确答案:D解析:逗号运算符的结合性为从左到右,其一般形式为“表达成1,表达式2”,整个表达式的值为表达式2的值。故4个选项中选项D符合题意。17.用树形结构表示实体之间联系的模型的是A.关系模型B.网状模型C.层次模型D.以上三个都是正确答案:C解析:在数据库系统中,由于采用的数据模型不同,相应的数据库管理系统(DBMS)也不同。目前常用的数据模型有三种:层次模型、网状模型和关系模型。在层次模型中,实体之间的联系是用树结构来表示的,其中实体集(记录型)是树中的结点,而树中各结点之间的连线表示它们之间的关系。因此,本题的正确答案是C。18.若x和y代表整型数,以下表达式中不能正确表示数学关系|x-y|<10的是A.abs(x-y)<10B.x-y>-10&&x-y<10C.!(x-y)<=10||!(y-x)>10D.(x-y)*(x-y)<100正确答案:C解析:本题考核的知识点是关系运算和逻辑运算的混合应用。选项A用了一个绝对值函数abs(),故选项A正确:选项B中用了一个“&&”逻辑与,故选项B正确:选项C中,“||”左边的式子如为真,将不再判断其后的表达式的值,故选项C不正确;选项D为本题中数学关系式的一个等价命题,故选项D正确.所以,4个选项中选项C符合题意。19.有以下程序main(){inta=3,b=4,c=5,d=2;if(a>B)if(b>C)printf(“%d”,d+++1);elseprintf(“%d”,++d+1);printf(“%d\n”,D);}程序运行后的输出结果是A.2B.3C.43D.44正确答案:A解析:本题考核的知识点是if-else语句的程序分析。我们首先看程序中if-else的匹配,由于C语言中规定else总是与最近的if搭配,因此程序中else与第二个订搭配,即该if-else语句为第一个if语句的执行部分,接着判断第一个if后面括号里的表达式的值“a>b”为假(“3>4”为假),因此不执行后面if-else语句,程序将执行下面的输出语句输出d,而d一直未被改变故为原来的值2,所以,4个选项中选项A符合题意。20.若定义:inta=511,*b=&a;则printf(“%d\n”,*B);的输出结果为A.无确定值B.a的地址C.512D.511正确答案:D解析:本题考核的知识点是printf()函数的输出格式.本题中先定义了一个int型的变量a并赋初值为511,接着定义了一个指向a的指针变量b,在printf()函数的输出格式中,是输出*b,即输出指针所指向变量a的值为511,因此输出511。所以,4个选项中D为所选。21.有以下程序:main(){intx=0,y=5,z=3;while(z-->0&&++x<5)y=y-1;printf(“%d,%d,%d\n”,x,y,z);}程序执行后的输出结果是A.3,2,0B.3,2,-1C.4,3,1D.5.-2,-5正确答案:B解析:本题中首先定义了三个整型变量x、y和z并分别赋值为0、5和3,while循环的判定条件为z-->0&&++x<5,由于x的初值为3,所以当z--执行3次后,z-->0将不在成立,又由于x的初值为0,所以++x执行5次,++x<5将不再成立,而它们两个表达式的值为逻辑与的关系,故当z-->0不成立时整个表达式的值为假,因此该循环共执行了3次,即语句y=y-1共执行了三次,但while循环的判定表达式却执行了四次,故起最后输出的x、y、z的值分别为3,2,-1,所以,4个选项中选项B符合题意。22.以下程序的功能是:按顺序读入10名学生4门课程的成绩,计算出每位学生的平均分并输出,程序如下:main(){intn.k;floatscore.sum,ave;sum=0.0;for(n=1;n<=10;n++){for(k=1;k<=4;k++){scanf(“%f”,&score);sum+=score;}ave=sum/4.0;printf(“NO%d:%f\n”,n,ave);}}上述程序运行后结果不正确,调试中发现有—条语句出现在程序中的位置不正确。这条语句是A.sum=0.0;B.sum+=score;C.ave=sun/4.0;D.printf(“NO%d:%f\n”,n,ave);正确答案:A解析:程序中使用了两层for循环,外层循环的作用是控制人数,循环一次是求一个人的成绩和,然后除以4得到平均成绩。每个人的成绩总和一开始时都必须清0,否则就会出现后面人的总成绩越来越大。“sum=0.0”;应在外层循环中。选项A正确。23.以下程序中,while循环的循环次数是main(){inti=0;while(i<10){if(i<1)continue;if(i==5)break;i++;}}A.1B.10C.6D.死循环,不能确定次数正确答案:D解析:break语句只能在循环体和switch语句体内使用,当break出现在switch语句体内时,其作用只是跳出该switch语句体。当break出现在循环体中,但不在switch语句体内时,则在执行break后,跳出本层循环体.而continue语句的作用是结束本次循环,即跳过本次循环中余下尚未执行的语句,接着再一次进行循环的条件判定。本程序中,变量i的初始值为0,判断while后面括号内表达式的值为真,执行循环体内的if语句,判断if后面括号内表达式的值为真,执行“continue;”语句.因continue的作用是结束本次循环,即跳过本次循环体中余下尚未执行的语句,接着再一次进行循环的条件判断,所以i的值未发生变化,循环条件仍然为真,if语句也仍然成立,因此循环将无止境地进行下去。所以,4个选项中D为所选。24.有以下程序段typedefstructNODE{intnum;structNODE*next;}OLD;以下叙述中正确的是A.以上的说朗形式非法B.NODE是一个结构体类型C.OLD是一个结构体类型D.OLD是一个结构体变量正确答案:C解析:将题目中的定义语句去掉前面的typedef和后面的OLD(分号保留),就是一条完整的结构体定义语句,其中struct是说明符,NODE是结构体名,大括号里面的是结构体成员的定义.此时要声明该结构体变量时需要使用struct加结构体名一起来声明,structNODE一起构成一个结构体类型,就好像字符类型char。若只去掉前面的typedef,就是一条结构体定义同时声明一个结构体变量OLD的语句,因为OLD的前面部分是structNODE的完整写法,可以看作是structNODE。C语言允许用typcdcf说明一种新类型名,其语法格式为:typedef类型名标识符;以后就可以用该标识符来代替被说明的类型名了。因此,当前面存在typedef时,该语句就变成7给structNODE的完整写法定义一个新的名称OLD。所以,此时的OLD是一个结构体类型,它相当于structNODE,即可以和char一样单独用来声明该结构体变量,而NODE只是一个结构体名,不能单独用来声明变量。所以,4个选项中C符合题意.25.有以下函数定义:voidfun(intn,doublex){……}若以下选项中的变量都已正确定义并赋值,则对函数fun的正确调用语句是A.fun(inty,doublem);B.k=fun(10,12.5);C.fun(x,n);D.voidfun(n,x);正确答案:C解析:选项A中应将y和m前面的函数的类型说明符去掉,故选项A不正确;选项B中函数传了2个参数,其中一个为整型一个为浮点型,而fun()函数在定义时声明的2个参数,一个为整型一个为双精度型,其参数类型不一致,故选项B不正确;选项D在调用函数时,不应该再声明其返回类型,故迭项D不正确.所以,4个选项中选项C符合题意。26.有定义语句:intb;charc[10];,则正确的输入语句是A.scanf(“%d%s”,&b,&C);B.scanf(“%d%s”,&b,C);C.scanf(“%d%s”,b,C);D.scanf(“%d%s”,b,&C);正确答案:B解析:scanf函数的第一个参数是格式控制字符串,该字符串中所出现的格式控制符必须与scanf函数的笫二个及其后面的参数一一对应.本题中四个选项的格式控制字符串都是”%d%s”,其中包括两个格式控制符%d和%s,它们分别表示输入一个十进制整数和输入一个字符串,其对应的参数应该分别为一个整型变量的地址和一个字符型数组的首地址。变量的地址可以通过对变量做取地址(&)运算来得到,而宇符型数组的首地址则可以直接通过数组名来得到。所以,4个选项中选项B符合题意。27.以下不能正确计算代数式sm2()值的C语言表达式是A.1/3*sin(1/2)*sin(1/2)B.sin(0.5)*sin(0.5)/3C.pow(sin(0.5),2)/3D.1/3.0*pow(sin(1.0/2),2)正确答案:A解析:当运算符“/”的左右两边运算分量都是整数的时候,运算结果也是一个整数,如果除不净则舍去小数部分。若两个运算分量有一个是实数,才会返回真正除法上的实数结果。选项A中传递给sin()函数的参数表达式1/2计算出来的结果为整数0,所以不能正确计算出题目要求的值,而其余选项中,除号两边都至少有一个运算分量是实数,故应该选择A。28.有以下程序int*f(znt*x,int*y){if(*x<*y)returnX;elsereturny;}main(){inta=7,b=8,*p,*q,*r;p=&a;q=&b;r=f(p,q);printf(“%d,%d.%d\n”,*p,*q,*r);}执行后输出结果是A.7,8,8B.7,8,7C.8,7,7D.8,7,8正确答案:B解析:本题定义了一个返回值为指针的函数f(),此函数有两个指针型的形参x和y)该函数的功能,是返回x和y指向的变量中值较小的那个指针变量。主函数中定义了两个指针变量p和小并让它们指向了变量a和b,调用函数f(),返回指向的变量值较小的指针变量,r的值为指针变量p的值(变量a的地址),因此最后输出的*p、*q和,r的值是7,8和7。所以,B选项为所选。29.s1和s2已正确定义并分别指向两个字符串。若要求:当s1所指串大于s2所指串时,执行语句S:则以下选项中正确的是A.if(s1>s2)S;B.if(strcmp(s1,s2))S;C.if(strcmp(s2,s1)>0)S:D.if(strcmp)(s1,s2)>0)S;正确答案:D解析:在C语言中字符串的比较用strcmp()函数,该函数有两个参数,分别为被比较的两个字符串。如果第一个字符串大于第二个字符串返回值大于0,若小于返回值小于0,相等返回值为0.字符串比较大小的标准是从第一个字符开始依次向右比较,遇到某一个字符大,该字符所在的字符串就是较大的字符串,如果遇到某一个字符小,该字符所在的字符串就是较小的字符串。本题中要求当s1所指字符串大于s2所指串时,执行语句s,因此应该为strcmp(s1,s2)>0或者strcmp(s2,s1)<0,所以,4个选项中选项D符合题意。30.若整型变量a、b、c、d中的值依次为:1、4、3、2。则条件表达式a<b?a:c<d?c:d的值是A.1B.2C.3D.4正确答案:A解析:因为条件运算符的结合方向为“自右至左”,所以表达式a<b?a:c<d?c:d相当于a<b?a:(c<d?c:D)。由于a=1,b=4,所以a<b的结果为“真’,所以整个表达式的值为a的值1。所以,4个选项中选项A符合题意。31.有以下程序#include<stdio.h>main(){inta[]={1,2,3,4,5,6,7,8,9,10,11,12,},*p=a+5,*q=NULL;*q=*(p+5);printf(“%d%d\n”,*p,*q);}程序运行后的输出结果是A.运行后报错B.66C.611D.510正确答案:A解析:本题考核的知识点是通过指针引用数组的元素的方法.本题中首先定义了一个一维数组a并初始化,由于定义该数组的时候省略了长度,因此该数组的长度为初始化时候赋初值的个数即为12。数组名a代表数组的首地址,所以*p=a+5语句使得p指向数组的第6个元素,而在程序中定义了一个指针q并让它指向空,实际上程序并没有在内存中为指针q开辟存储空间,这样给q赋值不允许的,故该程序运行后报错。所以,4个选项中选项A符合题意。32.以下能正确定义一维数组的选项是A.intnum[];B.#defineN100intnum[N];C.intnum[0..100];;D.intN=100;intnum[N]正确答案:B解析:选项A定义数组时省略了长度,而C语言中规定,只有在定义并同时进行初始化时,数组的长度才可以省略,数组的长度为初始化时候的成员个数,故选项A错误:在C语言中规定,数组的长度必须是一个整数或整型常量表达式,故选项C不正确;定义时数组的长度不能使用变量表示,故选项D不正确,所以,4个选项中选项B符合题意。33.在C语言中,形参的缺省存储类是A.autoB.registerC.staticD.extern正确答案:A解析:在C语言中,行参的缺省存储类为auto。所以,4个选项中A为所选.34.有以下程序#include.<string.h>main(){char*p=“abcde\ofghjik\0”;printf(“%d\n”,strlen(p));}程序运行后的输出结果是A.12B.15C.6D.5正确答案:D解析:本题首先定义了一个字符型指针变量p,并用一个宇符串给它赋值,然后调用printf()函数输出p所指向的字符串的长度。字符串的结束标记为“\0”,其长度为“\0”前的字符个数,故长度为5。所以4个选项中D正确。35.阅读以下函数fun(char*sl,char*s2){inti:0;while(sl[i]==s2[i]&&s2[i]!=‘\0’)i++;return(sl[i]==‘\0’&&s2[i]==‘\0’);}此函数的功能是A.将s2所指字符申赋给s1B.比较s1和s2所指字符串的大小,若s1比s2的大,函数值为1,否则函数值为0C.比较s1和s2所指字符串是否相等,若相等,函数值为1,否则函数值为oD.比较s1和s2所指字符串的长度,若s1比s2的长,函数值为1,否则函数值为o正确答案:C解析:在函数fun()中有两个字符型指针变量s1和s1,在函数中程序执行while循环,该循环退出条件有两个:一个是s1[i]!=s2[i](两个字符串不相等);第二个是sl[i]和s2[i]相等均为“\0”(两个字符串相等)。循环退出后,执行return语句,即两个字符串相等则返回1,不相等则返回0。所以,C选项为所选。36.有以下程序voidf(int*x,int*y){intt;t=*X;*X=*y;*y=t;}main(){inta[8]={1,2,3,4,5,6,7,8},i,*p,*q;p=a;q=&a[7);while(p>q){f(p,q);p++;q--;}for(i=0;i<8;i++)printf(“%d,”,a[i]);}程序运行后的输出结果是A.8,2,3,4,5,6,7,1,B.5,6,7,8,1,2,3,4,C.1,2,3,4,5,6,7,8,D.8,7,6,5,4,3,2,1,正确答案:D解析:在C语言中,函数参数的默认传递方式是传值,即函数内部的形参只是调用时的实参的一个拷贝,改变形参,实参不会被改变.如果想要实现传址调用只能使用传递指针的方式来实现.利用指针作函数的参数时,无论形参指针还是实参指针所指的都是同一个内存地址,所以形参如果改变了这个地址中的内容,也就是改变了实参所指的地址内容.本题程序开头定义了一个函数f(),在函数中用一个临时变量t交换了两个指针参数所指的地址内容,所以该函数的作用就是交换两个参数所指的内容。在主函数中,首先定义了一个int型数组a,并定义了两个int型指针p、q分别指向数组a的第一个元素和最后一个元素。然后使用一个while循环调用函数f()不断交换两个指针所指的内容,每次交换后p往后移动一个元素,q往前移动一个元素,直到q不再大于p,即直到两个指针在数组a的中间相遇为止。所以,程序最终运行的结果是数组a中的所有元素全被反序排列一次。故应该选择选项D。37.设有如下说明typedefstruct{intn;charc;doubleX;}STD;则以下选项中,能正确定义结构体数组并赋初值的语句是A.STDtt[2]={{1,’A’,62},{2,’B’,75}};B.STDtt[2]={1,”A”,62,2,”B”,75};C.structtt[2]={{1,’A’),{2,’B’}};D.structtt[2]={{1,”A”,62.5},{2,”B”,75.0}};正确答案:A解析:本题定义了一个结构体类型并自定义类型名为STD,用户自定义类型后,就可以利用它进行变量与数组的定义。定义的方法,与c语言中其他类型的定义完全一样,定义结构型数组并赋初值时,每个元素用一对“{”和“}”括起来,字符型元素用“‘”括起来,选项A,B、C、D中只有选项A符合条件。所以,A选项为所选。38.有以下程序main(){union{unsignedintn;unsignedcharC;}ul;u1.C=‘A’;printf(“%c\n”,u1.n);}执行后输出结果是A.产生语法错B.随机值C.AD.65正确答案:C解析:在定义共用体的同时,定义了一个共用体型变量u1,共占两个字节,有两个成员n和c,两个成员的首地址是相同的.因此给u1.c赋一个“A”,其实就是给无符号整型成员u1.n的低字节赋一个“A”,输出u1.n的时候是以字符型的形式输出,只输出它的低地址的一个字节,因此为“A”。所以,C选项为所选。39.以下程序十函数scmp的功能是返回形参指针s1和s2所指字符串中较小字符串的首地址:#include<stdio.h>#include<string.h>char*scrap(char*s1,char*s2){if(strcmp(s1,s2)<0)return(s1);elsereturn(s2);}main(){inti;charstring[20],str[3][20];for(i=0;i<3;i++)gets(str[i]);strcpy(string,scmp(str[0],str[1]));/*库函数strcpy对宁符中进行复制*/strcpy(string,scmp(string,str[2]));printf(“%s\n”,string);}若运行时依次输入:abcd、4bba和abc三个宁符市,则输出结果为A.abcdB.abbaC.abcD.abca正确答案:A解析:字符串比较大小的标准是从第一个字符开始依次向右比较,遇到某一个字符ASCII码值较大时,该字符所在的字符串就是较大的字符串。主函数中调用了函数scmp(),分析不难知道该函数的作用是返回参加比较的两个字符串中的较小的字符串,它的主函数中定义了一个二维字符数组来存放三个字符串.接着通过for循环给每个字符串赋值,赋值后三个字符串分别为“abcd”、“abba”、“abc”,接着比较str[0]和str[1]的大小,根据字符串大小比较标准可知str[0]较小,然后通过函数strcpy()把str[0]中的字符串,拷贝到string中,然后比较string和str[2]的大小,比较结果是string较小,最后输出string的值为“abcd”,所以,4个选项中选项A符合题意。40.下面程序的功能是输出以下形式的金宁塔图案:*************main(){inti,j;for(i=1;i<=4;i++){for(j=1;j<=4-i;j++)printf(““);for(j=1;j<=();j++)printf(“*”);printf(“\n”);}}在下划线处应填入的是A.iB.2*i-1C.2*i+1D.i+2正确答案:B解析:通过观察可知图形共四行,上函数中通过一个for循环四次,输出4行。第一行输出3个空格和1个“*”,第2行输出2个空格和3个“”,第3行输出3个空格和5个“*”,第四行输出7个“*”,主函数中通过第二个循环控制每行的输出空格数,第三个for循环控制输出的“*”的个数,总结规律:每行输出的“*”的个数,总比前一行的多2个,且第一行的个数为1,可以断定每行输出的”*”的个数组成了一个公差为2的等差数列,所以每行输出“*”的个数即该等差数列的通项,故该空格处应该填写2*i-1,所以,4个选项中选项B符合题意。41.若有以下定义和语句:ints[4][5],(*ps)[5];ps=s;则对s数组元素的正确引用形式是A.ps+1B.*(ps+3)C.ps[0][2]D.*(ps+1)+3正确答案:C解析:本题首先定义了一个4行5列的数组s,又定义了一个指向由5个元素组成的一维数组的指针变量ps,通过赋值让ps指向了数组s的首地址。此时数组元素s[i][j]的地址为“*(ps+1)+j”,数组元素s[i][j]可表示为*(*(ps+1)+j)。选项B表示的是数组元素a[3][0]的地址;选项D表示的是数组元素s[1][3]的地址;选项A中“ps+1”为指向下一行(第二行)的地址;选项c中ps[0][2]无条件等价于“*(ps[0]+2)”又无条件等价于”(*(ps+0)+2)”,即是数组元素s[0][2]。所以,4个选项中C为所选。42.以下程序的输出结果是main(){intb[3][3]={0,1,2,O,l,2,0,1,2},i,j,t=1;for(i=0;i<3;i++)for(j=i;j<=i;j++)t=t+b[i][b[j][j]];printf(“%d\n”,t);}A.3B.4C.1D.9正确答案:B解析:本题中定义了一个二维数组b并初始化,定义了一个变量t并赋初值1。接着通过一个二重循环将若干个元素的值加到变量t中。循环的执行步骤是:外层循环变量i=0时,内层循环变量j=i,执行语句“t=t+b[i][b][j][j]]”,相当于t=t+b[0][b][0][0]],由于b[0][0]的值为0,得到t的值为1;依次类推,循环共执行了3次,最后输出t的值为4。所以,4个选项中B为所选。43.没有如下定义:Structsk{inta;floatb;}data;int*p;若要使P指向data中的a域,正确的赋值语句是A.p=&a;B.p=data.a;C.p=&data.a;D.*p=data.a;正确答案:C解析:data是一结构体变量,a是它的成员,因此引用a域的正确方法是:data.a,取它的地址赋值给指针变量p的语句应该是:p=&data.a。选项A,将a的地址直接赋给了p,而忽略了a为结构体内部的一个成员,而不是一单独的变量,故选项A不正确;选项B在p=data.a表达式中右边为一个结构体变量的成员不是地址,而左边为一指针应该将一地址赋给它,改选项B不正确:选项D表达式*p=data.a是将结构体变量中的成员a的值赋给指针p所指向的变量值,而不是使指针p指向data中的a域,故选项D不正确;4个选项中只有C正确。44.有以下程序main(){inta=i,b;for(b=1;b<=10;b++){if(a>=8)break;if(a%2==1){a+=5;continue;}a-=3;}printf(“%d\n”,B);}程序运行后的输出结果是A.3B.4C.5D.6正确答案:B解析:在一个循环体中,若执行到break则跳出循环体,执行循环体后面第一条语句;若执行到continue则开始下一次循环体的执行。本题中a的初始值为1,在循环体中首先判断a,如果>=8就用break跳出循环,接下来的判断语句a%2==1,是判断a除以2的余数是否为1,即a是否为奇数,是的话给a累加一个5,然后用continue开始下一次循环.若两个条件都不满足就让a自减一个3.因此第1次循环开始a为1不大于8,且是奇数,所以a被累加5开始下一次循环;第2次循环开始a为6不大于8,不是奇数,所以a被减去3;第3次循环开始a为3不大于8,是奇数,所以a被加上一个5;第4次开始a为8,满足第一个条件跳出循环。b在第1次循环时等于1,以后每次累加1,所以最后输出为4,选项B正确.45.有以下程序,其中函数f的功能是将多个字符串按字典顺序排序#include<string,h>voidf(char*p[],intn){char*t;inti,j;for(i=0;i<n-1;i++)for(j=i+1;j<n;j++)if(strcmp(p[i],p[j])>0){t=p[i];p[i]=p[j];p[j]=t;}}main(){char*p[5]={“abc”,”aabdfg”,”abbd”,”dcdbe”,”cd”};f(p,5);printf(“%d\n”。strlen(p[1]));}程序运行后的输出结果是A.2B.3C.6D.4正确答案:D解析:本题所说的字典顺序是由f()函数中所调用的strcmp()函数对字符串大小的比较方法来决定的。strcmp()函数是依次对两个参数所指字符串对应位置上的字符两两进行比较,当出现第一对不相同的字符时,即由这两个字符的ASCII码值的大小来决定整个字符串的大小。另外,根据f()函数中交换两个元素的条件strcmp(p[i],p[j]>0可以看出,当前面的元素大于后面的元素时,则交换两个元素,即从小到大排序。所以数组最终排序的结果是”aabdfg”,”abbd”,”abc”,“cd”,”dcdbe”。因此最终输出的p[1]的长度为4.应该选择D。46.有以下函数fun(char*a,char*B){while((*a!=‘\0’)&&(*b!=‘\0’)&&(*a==*B)){a++;b++;}return(*a-*B);}该函数的功能是A.计算a和b所指字符串的长度之差B.将b所指字符串复制到a所指字符串中C.将b所指字符串连接到a所指字符串后面D.比较a和b所指字符串的大小正确答案:D解析:本题要求阅读的代码是一个函数,阅读之前先要看清函数的定义,该函数有两个参数,都是字符指针,这说明它接收的是两个字符串.该函数没有定义返回类型,C语言规定函数的返回类型为int时可以省略,所以切不可将其看成是无返回类型的void型函数,它是int型函数。函数体中除了返回语句外,只有一条while循环语句,该循环的循环条件为(*a!=‘\’0}&&(*b!=‘\0’)&&(*a==*B),即当a和b所指处都不是字符结束符’\0’并且a和b所指处的内容相等时执行循环。而循环体中只是简单地将指针a和b同时往后移动1位。循环结束后返回a所指内容减去b所指内容的差。换个角度去考虑,也就是说当字符串a或b中有一个结束了或者是它们的相同位置中有一个字符不同时,则返回该位置两个字符之差。若两者长度相同而且所有对应字符都相同的话,最后返回的是’\0\-’\0’=0,否则的话就返回两个字符串第一对不相同的字符之差.这时应该可以看出来,这个函数实现的是对两个字符串的比较。所以,4个选项中D正确。47.有以下程序floatfl(floatn){returnn*n;}floatf2(floatn){return2*n;}main(){float(*p1)(float),(*p2)(float),(*t)(float),y1,Y2;p1=f1;p2=f2;y1=p2(p1(2.O));t=p1;p1=p2;p2=t;y2=p2(pl(2.0));printf(“%3.0f,%3,Of\n”,y1,y2);}程序运行后的输出结果是A.8,16B.8,8C.16,16D.4,8正确答案:A解析:题目一开始定义了两个函数,f1()实现的是返回参数的平方;f2()实现的是返回参数的2倍。接下来在主函数中定义了三个函数指针p1,p2,t。语句p1=f1;p2=f2;让指针p1指向函数n(),指针p2指向函数9()。然后调用p2(p1(2.0)),即让2先平方再乘以2,结果为8并赋给y1。然后语句序列t=p1;p1=p2;p2=t;交换了p1和p2的值,即p1指向f2(),p2指向f1()。再调用p2(p1(2.0)),让2先乘以2再平方,结果为16赋给y2.最后输出y1,y2的值为8和16,应该选择A。48.有以下程序:#inClude<stdlib.h>structNODE{intnum;structNODE*next;};main(){StructN00E*p,*q,*r;intsum;0;p=(structNODE*)malloc(sizeof(structNODE));q=(structNODE*)malloc(sizeof(structNODE));r=(structNODE*)malloc(Sizeof(structNODE));p->num=1;q->num=2;r->num=3;p->next=q;q->next=r;r->next=NULL;sum+=q->next->num;sum+=p->num;printf(“%d\n”,sum);}执行后的输出结果是A.3B.4C.5D.6正确答案:B解析:本题中定义了一个结点structNODE,在主函数中定义了三个结点变量指针p、q和r,接着通过malloc函数分配了三个结点并让p、q和r分别指向他们,再接着给p、q和r所指向的结点的hum域赋值为1、2、3,然后让结点p指向q,让q指向r,r指向NULL。显然q->next->num的值为指针r所指向结点的num域的值为3,p->num的值为指针p所指向结点的num域的值为1,故最后输出s的值为3+1=4。所以,4个选项中选项B符合题意。49.有以下结构体说明和变量定义,如图所示,指针p、q、r,分别指向此链表中的3个连续结点。Structnode{intdata;Structnode*hext;}*p,*q,*r;现要将Q所指结点从链表中删除,同时要保持链表的连续,以下不能完成指定操作的语句是A.p->next=q->next;B.p->next=p->next->next;C.p->next=r;D.p=q->next;正确答案:D解析:要删除链表中间的某个结点,只需要使它的前一个结点的next指针指向它的后一个结点-不过,严格来讲还需要使用free()函数释放掉该结点在内存中所占的空间。本题要删除的是q所指结点(以下简称q结点),只需使p结点的next指针指向r结点即可。选项A中,因为Q结点的next指向r结点,所以执行p->next=q->next;语句后p结点的next就指向了r结点,故选项A能完成删除。选项B中,p->next->next等价于q->next,因此也能完成删除。选项C直接让p->next指向r结点,当然可以删除。选项D使指针p指向q->next(即r结点),这样做不会影响到内存中的链表,所以应该选择D。50.有以下程序structSTU{charname[10];intnum;floatTotalScore;};voldf(structSTU*p){structSTUs[2]={{“SunDan”,20044,550),{“Penghua”.20045,537}},*q=s++p;++q;*p=*q;}main(){structSrUs[3]={{“YangSan”,20041,703),{“LiSiGuo”,20042,580}};f(s);printf(“%s%d%3.of\n”,S[1].name,s[1].num,s[1].Totalscore);}程序运行后的输出结果是A.SunDan20044550B.Penghua20045537C.USiGuo20042580D.SunDan20041703正确答案:B解析:在主函数中,首先声明了一个结构体数组s[3],然后用数组名调用函数f,而数组名是数组首地址的指针,因此,传递给函数的是指向上函数中s[0]的指针。在函数中,将参数指针往后移动了一位++p;,所以该指针现在指向主函数中的s[1],函数中也声明?一个结构体数组s[2]和一个结构体指针q,q虽然初始化指向函数中的结构数组s[2]的首地址,但也被往后移动了一位,所以函数调用的结果是将函数中的s[1]赋给了主函数中的s[1],故最终输出为:Penghua20045537,应该选择B。填空题(每空2分,共30分)请将每一个空的正确答案写在答题卡上。注意:以命令关键字填空的必须拼写完整。51.算法的复杂度主要包括______复杂度和空间复杂度。正确答案:时间解析:算法的复杂度主要指时间复杂度和空间复杂度。52.在一棵二叉树上第6层的结点个数最多是______个。正确答案:32解析:根据二叉树的性质,在二叉树的第K层上,最多有2k-1个结点。所以,第6层的结点数最多为32。53.若按功能划分,软件测试的方法通常分为______测试方法和黑盒测试方法。正确答案:白盒解析:软件测试的方法分为白盒测试方法和黑盒测试方法.54.在数据库理论中,数据物理结构的改变,如存储设备的更换、物理存储的更换、存取方式改变等都不影响数据库的逻辑结构,从而不引起应用程序的变化,称为______。正确答案:物理独立性解析:数据的物理结构改变,不影响数据库的逻辑结构,从而不引起应用程序的变化,这种性质叫做物理独立性。55.问题处理方案的正确而完整的描述称为______。正确答案:算法或程序或流程图解析:算法是问题处理方案正确而完整的描述。56.若有语句inti=-19,j=i%4;printf(“%d\n”,j),则输出的结果是______。正确答案:-3解析:本题考核的知识点是运算符“%’的应用。该运算符是求两个数相除的余数,其结果与被除数的符号一致,本题中“-19%4”的值为“-3”,所以说空格处应该填-3。57.以下程序运行后的输出结果是______。#defineS(x)4*X*x+1main(){inti=6,j=8;printf(“%d\n”,S(i+i));}正确答案:81解析:,解此类题一定要注意宏替换与函数调用的区别。宏替换是字面上的,在编译期间就完成了,它只是将实参字符串替换蚌宏中形参出现的位置,得到的新串来替换掉宏调用.。而函数是将实参先计算好,然后将值赋给形参,再执行函数体,整个过程在程序运行时发生。所以本题的宏调用s(1+1)将被替换成表达式4*i+j*i+j+1等于4*6+8*6+8+1=24+48+8+1=81。所以本题输出81。58.以下程序的输出结果是______。main(){inta=0;a+-(a=8);printf(“%d\n”,a);}正确答案:16解析:在程序中首先将8赋值给变量a,然后在进行复合赋值运算。即a=a+a=8+8=16,所以该空格处应该填16。59.若有以下程序main(){inta=4,b=3,c=5,t=0;if(a<b)t=a;a=b;b=t;if(a<c)t=a;a=c;c=t;printf(“%d%d%dln”,a,b,c);}执行后输出结果为______。正确答案:503解析:此处需注意的是:如果if后面的条件为真,只执行其后的一条语句或一条复合语句,如果if后面的条件为假,只执行else后面的一条语句或一条复合语句。先判断表达式“a<b”为假,不执行“t=a”,但执行“a=b;b=t;”,s的值为3,b的值为0。在判断表达式“a<c”,值为真,所以执行后面的3条语句“t=a;a=c;c=t”,结果a的值为5,c的值为3,所以最后输出的结果为5、0和3。60.以下程序的功能是计算:s=1+12+123+1234+12345。请填空。main(){intt=0,s=0,i;for(i=1;i<=5;i++){t=i+______;s=s+t;}printf(“s=%d\n”,s);}正确答案:t*10或10*t解析:本题要求累加一系列有规律的数,从输出结果来看,s保存的是最终结果,而s在循环体中,每次累加一个t,则说明t在5次循环中分别等于1.12、123、1234、12345;而t每次循环等于“填空内容”加上循环变量i,又因为i在5次循环中分别等于1、2、3、4,5,所以t每次循环要加的“填空内容”应分别为0、10、120,1230,12340,这一系列值正好是前一次t的值的10倍.所以“填空内容”应是t*10。61.若有以下程序main(){chara;a=‘H’-’A’+’0’;printf(“%c\n”,a);}执行后输出的结果是______。正确答案:7解析:本题考核的知识点是字符类型变量的运算。字符型数据可作为整型参加算术运算,其值为其对应的ASCII码。’H’-’A’的结果是7,加’0’后是’7’的ASCII码,所以输出的是字符’7’。62.以下程序的输出结果是______。main(){char*p-”abcdefgh”,*r;long*q;q=(long*)p;q++;r=[char*)q;printf(“%s\n”,r);}正确答案:efgh解析:本题定义了一个字符型指针变量p并通过赋初值让它指向了一个字符串,定义了另一个字符型指针变量r和一个长整型指针变量q。首先通过语句“q=(long*)p;”把P的地址值强制转换为长整型地址值并赋值给q,然后执行“q++;”,地址值增加了4,执行语句“r=(char*)q”,把长整型指针变量q的值再强制转换成字符型地址值并赋给r,r的值应为字符串中字符“e”的地址,最后输出r指向的字符串,是“efgh”。63.以下程序中,for循环体执行的次数是______。#defineN2#defineMN+1#defineKM+1*M/2main(){inti;for(i-1;i<K;i++){...}...}正确答案:4解析:将程序中所有的宏替换掉可得:M=2+1,K=2+1*2+1/2=4,所以for循环共循环了K-1+1次,即4-1+1共4次。64.以下程序运行后的输出结果是______。structNODE{inthum;structNODE*next;};main(){structNODEs[3]={{1,‘\0’},{2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论