2006年9月国家二级(C语言)笔试真题试卷(题后含答案及解析)_第1页
2006年9月国家二级(C语言)笔试真题试卷(题后含答案及解析)_第2页
2006年9月国家二级(C语言)笔试真题试卷(题后含答案及解析)_第3页
2006年9月国家二级(C语言)笔试真题试卷(题后含答案及解析)_第4页
2006年9月国家二级(C语言)笔试真题试卷(题后含答案及解析)_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

2006年9月国家二级(C语言)笔试真题试卷(题后含答案及解析)题型有:1.选择题2.填空题选择题(1-10、21-40每题2分,11-20每题1分,共70分)下列各题A、B、C、D四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上。1.下列选项中不符合良好程序设计风格的是______。A.源程序要文档化B.数据说明的次序要规范化C.避免滥用goto语句D.模块设计要保证高耦合、高内聚正确答案:D解析:良好的程序设计风格可以使程序结构清晰合理,使程序代码便于维护,因此,程序设计风格对保证程序的质量很重要。主要应注意和考虑下述—些因素:1、源程序要文挡化;2、数据说明的次序要规范化;3、语句的结构应该简单直接,不应该为提高效率而把语句复杂化,避免滥用goto语句。模块设计要保证低耦合、高内聚。2.从工程管理角度,软件设计—般分为两步完成,它们是______。A.概要设计与详细设计B.过程控制C.软件结构设计与数据设计D.程序设计与数据设计正确答案:A解析:从工程管理角度看,软件设计分为两步完成:概要设计与详细设计。概要设计(义称结构设计)将软件需求转化为软件体系结构、确定系统级接口、全局数据结构或数据库模式;详细设计确立每个模块的实现算法和局部数据结构,用适当方法表示算法和数据结构的细节。3.下列选项中不属于软件生命周期开发阶段任务的是______。A.软件测试B.概要设计C.软件维护D.详细设计正确答案:C解析:软件生命周期分为软件定义、软件开发及软件维护。其中软件开发阶段的任务中软件设计阶段可分解成概要设计阶段和详细设计骱段;软件维护不属于软件开发阶段。4.在数据库系统中,用户所见数据模式为______。A.概念模式B.外模式C.内横式D.物理模式正确答案:B解析:数据库管理系统的三级模式结构由外模式、模式和内模式组成。夕模式,或子模式,或用户模式,是指数据库用户所看到的数据结构,是用户看到的数据视图。模式,或逻辑模式,是数据库中对全体数据的逻辑结构和特性的描述,是所有用户所见到的数据视图的总和。外模式是模式的—部分。内模式,或存储模式,或物理模式,是指数据在数据库系统内的存储介质上的表示,即对数据的物理结构和存取力式的描述。5.数据库设计的四个阶段是:需求分析、概念设计、逻辑设计和______。A.编码设计B.测试阶段C.运行阶段D.物理设计正确答案:D解析:数据库设计方法和步骤:需求分析、概念设计、逻辑设计和物理设计的相关策略。数据库设计以下6个设计阶段:需求分析阶段、概念设计阶段、逻辑设计阶段、物理设计阶段、实施阶段及数据库运行和维护阶段。6.设有如下三个关系表下列操作中正确的是______。A.T=R∩SB.R∪SC.T=R×SD.T=R/S正确答案:C解析:从图中可以看出,关系T是关系R和关系S的简单扩充,而扩充的符号为×,所以答案为T=R×S。7.下列叙述中正确的______。A.一个算法的空间复杂度大,则其时间复杂度也必定大B.一个算法的空间复杂度大,则其时间复杂度必定小C.一今算法的时间复杂度大,则其空间复杂度必定小D.上述三种说法都不对正确答案:D解析:算法的复杂度主要包括时间复杂度和空间复杂度:算法在运行过程中需辅助存储空间的大小称为算法的空间复杂度;算法的时间复杂度是指执行算法所需要的计算工作量,即算法执行过程中所需要的基本运算次数,为了能够比较客观地反映出—个算法的效率,在度量—个算法的工作量时,不仅应该与所使用的计算机、程序设计语言以及程序编制者无关,而且还应该与算法实现过程中的许多细节无关。为此,可以用算法在执行过程中所需基本运算的执行次数来度量算法的工作量。8.在长度为64的有序线性表中进行顺序查找,最坏情况下需要比较的次数为______。A.63B.64C.6D.7正确答案:B解析:在进行顺序查找过程中,如果线性表中的第1个元素就是被查找元素,则只需做—次比较就查找成功,查找效率最高;但如果被查找的元素是线性表中的最后—个元素,或者被查找的元素根本就不在线性表中,则为了查找这个元素需要与线性表中所有的元素进行比较,这是顺序查找的最坏情况。所以对长度为n的线性表进行顺序查找,在最坏情况下需要比较n次。9.数据库技术的根本目标是解决数据的______。A.存储问题B.共享问题C.安全问题D.保护问题正确答案:B解析:由于数据的集成性使得数据可为多个应用所共享,特SU是在网络发达的今天,数据库与网络的结合扩大了数据关系的应用范围。数据的共享本身又可极大地减少数据冗余性,不仅减少了不必要的存储空间,更为重要的是可以避免数据的不—致性。因此,数据库设计的根本目标是要解决数据共享问题。10.对下列二叉树进行中序遍历的结果是______。A.ACBDFEGB.ACBDFGEC.ABDCGEFD.FCADBEG正确答案:A解析:二叉树的中序遍历指在访问根结点、遍历左子树与遍历右子树这三者中,首先遍历左子树,然后访问根结点,最后遍历右子树;并且遍历左、右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。11.下列叙述错误的是______。A.一个C语言程序只能实现—种算法B.C程序可以由多个程序文件组成C.C程序可以由—个或多个函数组成D.一个C函数可以单独作为—个C程序文件存在正确答案:A解析:一个C语言程序可以实现多种算法。—个C程序可以由—个或多个源程序文件组成,—个源程序文件由—个或多个函数组成,构成C语言程序的基本单位是函数,函数也是C程序中模块化程序设计的基础,C函数可分为标准库函数和用户定义函数两类。12.下列叙述中正确的是______。A.每—个C程序文件中都必须要有—个main()函数B.在C程序中main()函数的位置是固定的C.C程序中所有函数之间都可以相互调用,与函数所在位置无关D.在C程序的函数中不能定义另—个函数正确答案:D解析:每—个C程序由多个C程序文件组成,而每个C程序都必须有一个main()函数,故每—个C程序文件中都必须有—个main()函数的说法是错误的。在C程序中所有函数都是平行的,即在定义函数时是相互独立的,—个函数并不能从属于另—个函数,即函数不能嵌套定义,函数间可以相互调用,但不能调用main()函数,main()函数的位置也不是固定的。13.下列定义变量的语句中错误的是______。A.int_int;B._;C.charFor;D.floatUS$;正确答案:D解析:C语言中用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列称为标识符,C语言规定标识符能由字母、数字和下划线三种字符组成,且第—个字符必须为字母或下划线。选项D中含有“$”,故不符合标识符的定义。14.若变量x、y己正确定义并赋值,以下符合C语言语法的表达式是______。A.++x,y=x-B.x+1=yC.x=x+10=x+yD.double(x)/10正确答案:A解析:赋值表达式的左边不能为算式,故选项B、c错误;选项D为强制类型的转换,其书写形式为:(类型名)(表达式),即正确书写应为:(double)x/10或(double)(x/10);选项A为逗号表达式符合C语言语法。15.以下关于逻辑运算符两侧运算对象的叙述中正确的是______。A.只能是整数0或1B.只能是整数0或非0整数C.可以是结构体类型的数据D.可以是任意合法的表达式正确答案:D解析:逻辑运算符两侧的运算对象不但可以是0和1,也可以是任意基本类型或指针类型的数据,还可以是任意合法表达式。16.若有定义intx,y;并已正确给变量赋值,则以下选项中与表达式(x-y)?(x++):(y++)中的条件表达式(x-y)等价的是______。A.(x-y>O)B.(x-y<O)C.(x-y<0||x-y>0)D.(x-y=0)正确答案:C解析:“(x-y)?(x++):(y++)”的求解顺序是:先判断x-y的值,如果为非0(真),则执行X++,从而表达式返回X++的值;如果0(假),则执行y++,从而表达式返回y++的值。相当于“或”的关系,所以选项C正确。17.有以下程序main(){intx,y,z;x=y=1;z=x++,y++,++y;printf(“%d,%d,%d\n”,x,y,z);}程序运行后的输出结果是______。A.2,3,3B.2,3,2C.2,3,1D.2,2,1正确答案:C解析:x++:表示在使用x之后,使x的值加1;y++:表示在使用y之后,使y的值加1;++y:表示在使用y之前,使y的值加1。此题中执行z=x++,是将x的值先赋给z,所以z=1,接下来x自行加1,其结果为2:执行y++后,y=2,执行++后,y=3;故答案选C。18.设有定义:inta;floatb;执行scanf(“%2d%f”,&a,&b);语句时,若从键盘输入876543.0<回车>,a和b的值分别是______。A.876和543.000000B.87和6.000000C.87和543.000000D.76和543.000000正确答案:B解析:对于unsigned型数据可以指定数据的输入域宽w,系统秒将自动按w值截取所需长度的数据,此题中指定输入域宽为2,所以把前两个数送给a,即a=87.后面的数值应送给变量b,由于6后面是空格分隔符,所以系统认为该数据到此结束,即将6赋给了b,所以答案选B。19.有以下程序main(){inta=0,b=0;a=10;/*给a赋值b=20;给b赋值*/printf(“a+b=%d\n”,a+b);/*输出计算结果*/}程序运行后的输出结果是______。A.a+b=10B.a+b=30C.30D.出错正确答案:A解析:在C语言中,注释是用于协助读者更好地理解程序,它不会被系统编译执行,此题中第—处的注释内容包括:“/*给a赋值b=20;给b赋值*/”,故本题中“b=20;”在程序中不起作用,所以输出语句执行的a+b的值为10+0的值,即输出为“a+b=10”。20.在嵌套使用if语句时,C语言规定else总是______。A.和之前与其具有相同缩进位置的if配对B.和之前与其最近的if配对C.和之前与其最近的且不带else的if配对D.和之前的第—个if配对正确答案:C解析:在嵌套使用if语句时,C语言规定else总是和之前与其最近的且不带else的if配对。21.下列叙述中正确的是______。A.break语句只能使用switch语句B.在switch语句中必须使用defaultC.break语句必须与switch语句中的case配对使用D.在switch语句中,不一定使用break语句正确答案:D解析:在switch语句中,break语句主要起到在执行一个case分支后,使流程跳出switch结构,即终止switch语句的执行,但最后—个分支(default)可以不加break语句。22.有以下程序main(){intk=5;while(-k)printf(“%d”,k-=3);printf(“\n”);}执行后的输出结果是______。A.1B.2C.4D.死循环正确答案:A解析:此题中首先给k赋初值5,执行while语句:中的表达式“--k”,k先自行减1结果为4,满足while执行条件输出:k=k-3=4-3=1;此时输出结果为1。返回执行while语句,重复上面的操作,while后的表达式为0,退出循环,所以最后的输出结果为1。23.有以下程序main(){inti;for(i=1;i<=40;i++){if(i++%5=0)if(++i%8=0)printf(“%d”,i);}printf(“\n”);}A.5B.24C.32D.40正确答案:C解析:在满足for语句条件下,第—个if语句的条件是指i先对5取余后,再自行加1;第二个if语句的条件是指:i=i+1后,再对8取余。设可以满足第—个if语句的值为:x,那么可以满足第二个if语句的值为:x+2,转换为方程组:x=32,所以答案选C。24.以下选项中,值为1的表达式是______。A.1-’0’B.1-’、0’C.’1’-0D.’\0’-’0’正确答案:B解析:‘0’代表ASCⅡ码为48的字符,‘\0’代表ASCⅡ码为0的字符,‘1’代表ASCⅡ码为49的字符,所以只有选项B的表达式的值为1。25.有以下程序fun(intx,inty){return(x+y);}main(){inta=1,b=2,c=3,sum;sum=fun((a++,b++,a+b),c++);printf(“%d\n”,sum);}A.6B.7C.8D.9正确答案:C解析:在fun((a++,b++,a+b),c++)中,先算括号内的(a++,b++,a+b)逗号运算,即先算出a++的值,a=2;再算出b++的值,b=3;最后算出a+b的值,a+b=2+3=5,整个逗号表达式的值为最后a+b的值即为5;接下来调用fun函数,此时原语句变为:smn=fun(5,C++);进行运算,c++表示在使用c以后再将c的值加1,所以结果为:5+3=8。26.有以下程序main(){chars[]=“abcde”;s+=2;printf(“%d\n”,s[0]);}执行后的结果是______。A.输出字符a的ASCⅡ码B.输出字符c的ASCⅡ码C.输出字符cD.程序出错正确答案:D解析:此题中s是—个字符数组,而字符数纽是在编绎时为它分配内存单元的,即此字符数组的地址在编译时是确定的,所以对此地址变量并不能赋值,故语句“s+=2;”错误,故程序出错。27.有以下程序fun(intx,inty){m=0,i=2;i+=m+1;m=i+x+y;returnm;}main(){intj=1,m=1,k;k=fun(j,m);printf(“%d,”,k);k=fun(j,m);printf(“%d\n”,k);}执行后的输出结果是______。A.5,5B.5,11C.11,11D.11,5正确答案:B解析:将j和m的值带入函数fun中,第—次调用完fun()后,m和i的值分别为5和3且要保留,并在第二次调用时使用,这是因为两者都是局部静态变量。所以最后的结果是5和11。28.有以下程序fun(intx){intp;if(x=0||x=1)return(3);p=x-fun(x-2);returnp;}main0{printf(“%d\n”,fun(7));}执行后的输出结果是______。A.7B.3C.2D.0正确答案:C解析:函数fun是—个递归调用函数,首先主函数将实参7传递给函数fun中的形参x,由于7≠0,7≠1,不满足if条件,所以执行下面的p=x-fun(x-2);语句,此语句继续调用它本身,直到当x=1时,返回函数值3代入到调用它的表达式中,依此类推……,最终p的值为2。29.在16位编译系统上,若有定义inta[]={10,20,30},*p=&a;,少逗号当执行p++;后,下列说法错误的是______。A.p向高地址移了一个字节B.p向高地址移了一个存储单元C.p向高地址移了两个字节D.p与a+1等价正确答案:A解析:题目中p=&a表示指针p指向第—个元素a[0],执行p++是指使p指向下—个数据对象的地址,也就是向高地址移了—个存储单元;因为int数据占两个字节,所以p相当于向高地址移了两个字节,所以选项A错误。30.有以下程序main0{inta=l,b=3,c=5;int*p1=&a,*p2--&b,*p=&c;*p-~pl*(*p2);print~”%dXn”,c);}执行后的输出结果是______。A.1B.2C.3D.4正确答案:C解析:p1=&a表示指针变量p1指向元素1的地址;p2=&b表示指针变量p2指向元素3的地址;p=&c表示指针变量p指向元素5的地址;执行*p=*p1*(*p2)=1*3=3,所以最后的结果为:3。31.若有定义:intw[3][5];,则以下不能正确表示该组元素的表达方式是______,A.*(*w+3)B.*(w+1)[4]C.*(*(w+1))D.*(&w[0][0]+1)正确答案:B解析:选项A:*(*w+3)=*(*(w+0)+3)=*(w[0]+3)=w[0][3],符合数组定义的范围可以正确表示数据元素。选项B:*(w+1)[4]=*(*(w+1)4=*w[5]=w[5][0],超出了数据定义的范围。选项C:*(*(w+1))=*w[1]=w[1][0],符合数组定义的范围可以正确表示数据元素。选项D:*(&w[0][0]+1);=*(w[0]+1)w[0][1],符合数组定义的范围可以正确表示数据元素。32.若有以下函数首部intfun(doublex[lO],int*n)则下面针对此函数的函数声明语句中正确的是______。A.intfun(doublex,int*n);B.intfun(double,int);C.intfun(double*x,intn);D.ihtfun(double*,int*);正确答案:D解析:函数声明可以照写已定义的函数的首部,再加一个号就成为了对函数的声明,在函数声明中也可以不写形参名,而只写形参的类型,但要保证与函数首部写法上的—致,即函数类型、函数名、参数个数、参数类型和参数顺序相同。字符数组可用指针来表示,所以选顶D正确。33.若有定义语句:intk[2][3],*pk[3];,则以下语句中正确的是______。A.pk=k;B.pk[0]=&k[1][2];C.pk=k[0];D.pk[1]=k;正确答案:B解析:*pk[3]:由于[]比*优先级高,因此p先与[3]结合,形成p[3]数组,有3个元素。然后再与p前面的“*”结合,“*”表示此数组是指针类型的,每个数组元素(相当于—个指针变量)都可以指向—个整型变量。34.有以下程序voidchange(intk[]){k[0]=k[5];}main(){intx[10]={1,2,3,4,5,6,7,8,9,10},n=0;while(n<=4){change(&x[n]);n++;}for(n=0;n<5;n++)printf(“%d”,x[n]);printf(“\n”);}程序运行后输出的结果是______。A.678910B.13579C.12345D.62345正确答案:A解析:本题考点为数组名作函数参数,当n=O时,把x[0]的地址传绐被调函数change,即将形参k与实参x指向同一个存储单元x[0],执行被调函数后,k[0]=6,即x[0]=6:当n=1时,形参k指向x数组的第1个数组元素所在单元,即k[0]与x[1]共用同一存储单元,执行被调函数后,k[0]=7,即x[1]=7,依次类推得出x[0]到x[4]的值分别为6、7、8、9、10。35.若要求定义具有1O个int型元素的一维数组a,则以下定义语句中的错误的是______。A.#defineN10inta[N];B.#a[2*n]C.inta[5+5];D.intn=10,a[n];正确答案:D解析:—维数组的定义方式为:类型说明符数组名[常量表达式];常量表达式表示元素的个数,即数组的长度。常量表达式可以包括常量和符号常量,但不能包含变量。所以选项D错误。36.有以下程序main(){intx[3][2]={0},i;for(i=0;i<3;i++)scanf(“%d”,x[i]);printf(“%3d%3d%3d\n”,x[0][0],x[0][1],x[1][0]);}若运行时输入:246<回车>,则输出结果为______。A.200B.204C.240D.246正确答案:B解析:此题中“scanf(“%d”,x[i]);”相当于“scarf(“%d”,x[i][0]);”。输入246,执行for语句也就是x[0][0]=2,x[1][0]=4,x[2][0]=6,其余的数组元素为0:所以x[0][0]=2,x[0][1]=0,x[1][0]=4。37.有以下程序main(){chars[]={“aeiou”},*ps;ps=s;printf(“%c\n”,*ps+4);}程序运行后输出的结果是______。A.aB.eC.uD.元素s[4]的地址正确答案:B解析:此题中先定义一个指针变量ps,并将s的首地址赋给此指针变量,*ps+4相当于先从指针变量ps指向的地址中取出相应数据“a”后,对此数据加4,a的ASCⅡ码为32,32+4=36,对应于字符e,所以答案选B。38.在以下语句中存在语法错误的是______。A.charss[6][20];ss[1]=“right?”;B.charss[][20]={“fight?”};C.char*ss[6];ss[1]=“right?”;D.char*ss[]={“right?”};正确答案:A解析:此题需要了解字符数组和字符指针变量的区别,字符数组由若干个元素组成,每个元素中放一下字符,而字符指针变量中放的是地址(字符串的首地址),决不是将字符串放到指针变量中,选项D是指在定义字符指针变量时让字符指针指向字符串“right?”的首地址;选项C是先定义字符指针数组,再让指针数纽指向字符串”right?”的首地址;选项B是在定义数组时将字符赋给数组,而选项A的这种先定义,再用赋值语句赋值的形式是错误的,因为数组可以在变量定义时整体赋初值,而不能在赋值语句中整体赋值。39.若有定义:char*x=“abcdefghi”;,以下选项中正确运用了strcpy函数的是______。A.chary[10];strcpy(y,x[4]);B.chary[10];strcpy(++y,&x[1]);C.chary[10],*s;strcpy(s=y+5,x);D.chary[10],*s;strcpy(s=y+1,x+1);正确答案:D解析:选项A中x[4]是取字符e,也就是将字符复制到y中,strcpy实现的是地址的复制所以选项A错误;选项B中++y是错误的,不允许对常量进行自加运算(y是—个确定的地址值),所以选项B错误;选项C指针变量s指向了y向后的第5位,则存放x时会出现越界问题,所以选项C错误;选项D中,指针变量s指向了y向后的第—位,此时s可存放数据的长度为9,而地址“x+1”起的字符串的地址长度也刚好为9(包括“\0”),所以开始复制不会出现地址越界问题,故选项D正确。40.有以下程序ihtadd(inta,intb){return(a+b);}mian(){intk,(*f)(),a=5,b=10;f=add;…}则以下函数调用语句错误的是______。A.k=(*f)(a,b);B.k=add(a,b);C.k=*f(a,b);D.k=f(a,b);正确答案:C解析:此题定义了指向函数的指针变量f指向了函数add的入口地址,所以,要调用函数,可以通过函数名(选项B的形式)或函数指针变量(选项A、D的形式)调用即可,而选项C中是先进行函数调用,然后对调用后返回的整型值求其指针值,事实上,对常量求指针值是不合理的,所以选项C错误。41.有以下程序#include<string.h>main(intargc,char*argv[]){inti=1,n=0;while(i<argc){n=n+strlen(argv[i]);i++;}printf(“%d\n”,n);}该程序生成的可执行文件名为:proc.exe。若运行时输入命令行:proc1234567则程序的输出结果是______。A.3B.5C.7D.11正确答案:C解析:main()可以带有参数,并且参数只能有两个,第一个参数(argc)类型为整型用来记下命令行的参数个数,第二个参数(argv)为—个字符型指针数组,其各个元素用来记下命令行各参数字符串的首地址。此题执行时,argc的值为4,在循环中依次使用strlen()函数求出argv(1)、argv(2)、argv(3)指向的字符串(123、45、67)的长度并把他们加到变量n中,得到n的值为7。42.有以下程序voidfun2(chara,charb){printf(“%c%c”,a,b);}chara=‘A’,b=‘B’;voidfun1(){a=‘C’;b=‘D’;}main(){fun1();printf(“%c%c”,a,b);fun2(‘E’,’F’);}程序的运行结果是______。A.CDEFB.ABEFC.ABCDD.CDAB正确答案:A解析:本题主要是要区分全局变量和局部变量,全局变量是指在函数之外定义的变量,它的有效范围是从定义变量的位置开始到本源文件结束,函数fun1中用的变量a、b就是全局变量,虽然在定义时给a、b分别赋值为A、B,但在fun1函数中对其值进行了改变,所以调用fun1后输出的a、b的值为’C’和’D’;而fun2中输出的是两个局部形参变量a、b的值,这两变量的值由主函数在调用时赋给它,故输出结果为:E、F。43.有以下程序#include<stdio.h>#defineN5#defineMN+1#definef(x)(x*M)main(){inti1,i2;i1=f(2)i2=f(1+1);printf(“%d%d\n”,i1,i2);}程序的运行结果是______。A.1212B.117C.1111D.127正确答案:B解析:在编译时预处理程序用“替换文本”来替换宏,并用对应的实参来替换“替换文本”。此题中的替换文本分别为:N+1、(x*M)。引用带参的宏名i1=f(2),在经过宏替换后i1=2’N+1=2’5+1=11(注:因为对宏M的替换中N+1没有加括号,所以对宏f(x)的替换文本展开后就变为:x*N+1形式);与上相同i2在引用带参的宏名并替换展开后变为:i2=1+1*N+1=1+1*5+1=7,所以答案选B。44.设有以下语句typedefstructTT{charc;inta[4];}CIN;则下面叙述中正确的是______。A.可以用TT定义结构体变量B.TT是struct类型的变量C.可以用CIN定义结构体变量D.CIN是structTT类型的变量正确答案:D解析:此题中说明了—个结构体类型structTT的同时,定义了一个结构体变量CIN,结构体变量中的各成员在内存中按说明中的顺序依次排序。45.有以下结构体说明、变量定义和赋值语句structSTD{[10];intage;charsex;}s[5],*ps;ps=&s[0];则以下scanf函数调用语句中错误引用结构体变量成员的是______。A.scanf(“%s”,s[0].name);B.scanf(“%d”,&s[0].age);C.scanf(“%c”,&(ps->sex));D.scanf(“%d”,ps->age);正确答案:D解析:要给结构体成员输入数据,在scanf语句中需要使用结构体成员的地址。函数scanf是C语言的标准输入函数,其作用是在终端设备上输入数据,而且要求输入项必须是某个存储地址。选项A中是引用结构体数组s的第0个元素s[0]的name成员,name是包含10个元素的数组,数组名就表示数组的地址,也就代表s[0].name的地址,所以选项A是正确的。选项B显然也是正确的,选项C是先用指针变量引用结构体的成员sex后取它的地址,也是正确的。选项D用指针变量引用结构体的成员sex后没有再继续取其地址,所以是错误的。46.若有以下定义和语句uniondate{inti;charc;fioatf;}x;inty;则以下语句正确的是______。A.x=10.5;B.x.c=101;C.y=x;D.printf(“%d\n”,x);正确答案:B解析:本题定义了共用体变量x及整型变量y,需要说明的是共用体变量不能直接引用,而只能用共用体变量中的成员,故选项A、C、D均错误。47.程序中已构成如下图所示的不带头结点的单向链表结构,指针变量s、p、q均已正确定义,并用于指向链表结点,指针变量s总是作为头指针向链表的第—个结点。若有以下程序段q=s;s=s->next;p=s;while(p->next)p=p->next;P->next=q;q->next=NULL;该程序段实现的功能是______。A.首结点成为尾结点B.尾结点成为首结点C.删除首结点D.删除尾结点正确答案:A解析:根据语句q=s得知指针q指向结点a;由s=s->next;p=s得知指针p和s均指向接点b;在满足while语句的情况下,抽行p=p->next;得知p现在指向结点c;由p->next=q得知p指向的结点是a,a移到c的后面;由q->next=NULL得知结点a与结点b的指针断开。移动后的结构图如图所示:48.若变量已删除正确定义,则以下语句的输出结果是______。件并进行了写操作后,原有文件中的全部数据必定被覆盖C.在—千程序中当对文件进行了写操作后,必须先关闭该文件然后再打开,才能读到第1个数据D.当对文件的读(写)操作完成之后,必须将它关闭,否则可能导致数据丢失正确答案:D解析:C语言中,有两种对文件的存取方式:顺序存取和直接存取,所以选项A错误;在对文件进行读、写操作前,先要使用库函数fopen“打开”文件来实现程序中要读、写的文件与实际数据文件间的联系。在进行打开文件操作时可以指定其打开方式,如果使用“r+”方式则在写新数据时,只覆盖新数据所占的空间,其后的老数据并不丢失,所以选项B错误;在对文件进行操作后关闭文件是为了防止文件缓冲区中的剩余数据的丢失,所以选项D正确。50.有以下程序#include<stdio.h>main(){FILE*fp;inti;charch[]=“abcd”,t;fp=fopen(“abc.dat”,”wb++”);for(i=O;i<4;i++)fwrite(&ch[i],1,1,fp);fseek(fp,-2L,SEEK_END);fread(&t,1,1,fp);fclose(fp);printf(“%c\n”,t);}程序执行后的输出结果是______。A.dB.cC.bD.a正确答案:A解析:此题考核的是文件的读写,定义—个FILE类型结构体的指针fp,以“可以由位置函数设置读和写”方式打开一个abc.dat文件,并向文件输入数组变量ch指向的字符串,则文件内的内容为“abcd”,执行fseek函数,则文件类型指针fp指向文件尾向前移动2个字节的位置处,即指针指向“b”,所以最后的输出结果为b,答案选C。填空题(每空2分,共30分)请将每一个空的正确答案写在答题卡上。注意:以命令关键字填空的必须拼写完整。51.下列软件系统结构图的宽度为[]。正确答案:3解析:软件系统结构图的宽度:整体控制跨度(最大模块数的层)的表示。52.[]的任务是诊断和改正程序中的错误。正确答案:程序调试解析:程序调试的任务是诊断和改正程序中的错误。它与软件测试不同,软件测试是尽可能多地发现软件中的错误。先要发现软件的错误,然后借助于一定的调试工具去找出软件错误的具体位置。软件测试贯穿整个软件生命期,调试主要在开发阶段。53.—个关系表的行称为[]。正确答案:元组解析:设计数据库的目的实质上是设计出满足实际应用需求的实际关系模型;关系中的行称为元组,对应存储文件中的记录,关系中的列称为属性,对应存储文件中的字段。54.按“先进后出”原则组织数据的数据结构是[]。正确答案:栈解析:栈和队列都是—种特殊的操作受限的线性表,只允许在端点处进行插入和删除。二者的区别是:栈只允许在表的—端进行插入或删除操作,是—种“先进后出”的线性表;而队列只允许在表的—端进行插入操作,在另—端进行删除操作,是—种“先进先出”的线性表。55.数据结构分为线性结构和非线性结构,带链的队列属于[]。正确答案:线性结构解析:与栈类似,队列也是线性表,也町以采用链式存储结构。56.设有定义:floatx=123.4567;,则执行以下语句后的输出结果是[]。printf(“%f\n”(int)(x*100+0.5)/100.1;正确答案:123.46解析:输出语句的表达式:(int)(x*100+0.5)/100.0是指先运算表达式中的“x*100+0.5”,然后将其结果强制转换为int型,即:(int)(l23.4567*100+O.5)=(int)12346.17=12346,接下来进行”/100.0”的运算即:12346/100.0=123.46,原因是除运算是双目运算,当—边是整型数,—边是实型数时,系统自动将整型转换为实型数,然后进行运算,又因为最后的的输出格式是float类型的实数,所以结果为123.460000。57.以下程序运行后的输出结果是[]。main(){intm=011,n=11;printf(“%d%d\n”,++m,n++);}正确答案:1011解析:此题中定义两个变量m和n,首先将一个八进制数赋给m,十进制数赋给n;在输出之前先进行运算,++n:是指在输出变量m前先对其进行加1,(011)8+l=(9)10+1=10;n++:是指在进行输出操作后n再进行加1操作,所以输出时n=11。“%d%d”表示输出的是两个带符号的十进制整型数,所以最后的输出结果为:1011。58.以下程序运行后的输出结果是[]。main(){intx,a=1,b=2,c=3,d=4;x=(a<b)?a:b;x=(x<c)?x:c;x=(d>x)?x:d;printf(“%d\n”,x);}正确答案:1解析:条件运算符优先于赋值运算,但低于逻辑运算、关系运算、算术运算。条件运算的一般形式为(表达式1)?(表达式2):(表达式3),当(表达式1)值为真时,(表达式2)的值为整个表达式的值;当(表达式1)的值为假时,(表达式3)的值为整个表达式的值。题中执行表达式“x=(a<b)?a:b”后,x=1;再执行表达式“x=(x<c)?x:c”后,x=1,将此值代入后—个表达式“x=(d>x)?x:d”,由于“d>x”值为真,故x的值为1。59.有以下程序,若运行时从键盘输入:18,11<回车>,则程序的输出结果是[]。main(){inta,b;printf(“Entera,b:”);scanf(“%d,%d”,&a,&b);while(a!=b){while(a>b)a-=b);white(b>a)b-=a;}printf(“%3d%3d\n”,a,b);}正确答案:11解析:此题中定义两个变量a和b并通过scanf语句对其进行赋值,当满足“a!=b”循环条件时进行其下的条件的判断,直到最外层的条件不再被满足后进行数据的输出。自先给a和b分别赋值18和11。条件:18!=11,所以执行其下的条件判断“a>b”条件满足,a=a-b=18-7=7,然后继续判断条件a>b是否成立,此时7>11不成立,退出内循环中的第一个while循环,执行内循环的第二个while循环,比较其条件b>a是否成立,此条件成立,所以b=b-a=4,继续判决条件b>a是否成立,若成立,则继续执行b-=a;,否则退出内循环的第二个while循环,同时继续比较外循环条件a!=b是否成立,依此类推,直到a=1,b=1条件不再被满足后进行数据的输出,所以最后的结果为:11。60.以下程序的功能是:将输入的正整数按逆序输出。例如:若输入135则输出531。请填空。#include<stdio.h>main(){intn,s;printf(“Enteranumber:”);scanf(“%d”,&n);printf(“Output:“);do{s=n%10;printf(“%d”,s);[];}while(n!=0);printf(“\n’);}正确答案:n/=10或n=n/10或n=(n-s)/10或n=(n-n%10)/10解析:根据s=n%10可知:此操作可以将输入的数据n的最后—位赋给s,根据题目的要求是要将输入的数据逆序输出,现在已经将原数据的个位输出,在其后如果执行n/=10司将原数据的个位数去掉,满足do....while的条件继续s=n%10操作,此时可求出十位上的数进行输出,继续执行n/=10操作,与上相同最后将百位上的数进行输出,所以该题答案为:n/=10。61.下面程序的运行结果是[]。#include<stdio.h>intf(inta[],intn){if(n>1)returna[0]+f(a+1,n-1);elsereturna[0];}main(){intaa[10]={12,3,4,5,6,7,8,9,10},s;s=f(aa+2,4);printf(“%d\n”,s);}正确答案:18解析:实参中aa+2是指将数组元素3的地址传递绐形参a,应当注意—点,用数纽名作函数实参时,不是把数组的值传给形参,而是把实参数组的地址传绐形参数组,两个数组共用一段内存单元。所以a[]={3,4,5,6,7,8,9,10),n=4,a[0]=3。形参中a+1表示数组元素4的地址传递绐形参a,所以a[0]+f(a+1,n-1)=3+f(a+1)),3),此时a[]={4,5,6,7,8,9,10),n=3,a[0]=4。n=3同样满足n>1的条件a[0]+f(a+1,n-1)=4+f(a+1,2)此时a[]={5,67,8,9,10},n=2,a[0]=5。n=2同样满足n>1的条件a[0]+f(a+1,n-1)=5+f(a+1,2)此时a[]={6,7,8,9,10},n=1,a[0]=6。n=1不再满足条件返回a[0]=6,6+5+4+3=18,所以最后的结果为18。62.下面程序由两个源程序文件:t4.h和t4.c组成,程序编译运行的结果是:[]。t4.h的源程序为:#defineN10#definet2(x)(x*N)t4.c的源程序为:#include<stdio.h>#defineM8#definef(x)((x)*M)#include“t4.h”main(){inti,j;i=f(1+1);j=f2(1+1);printf(“%d%d\n”,i,j);}正确答案:1611解析:在编译时预处理程序用“替换文本”来替换宏,并用刘应的实参来替换“替换文本”。此题中的替换文本分别为:x*N、(x)*M。弓,用带参的宏名i=f(1+1),在经过宏替换后将成为:i=(1+1)*M=2*8=16。与上相同j在引用带参的宏名并替换展开后变为;j=1+1*N=1+1*10=11(注:因为在对宏f2(x)的替换中x没有加括号,所以对宏f2(x)的替换文本展开后就变为:1+1*N形式),所以答案为1611。63.下面程序的功能是建立一个有3个结点的单循环链表,然后求各个结点数值域data中数据的和,请填空。#include<stdio.h>#include<stdlib.h>structNODE{intdata;structNODE*next;};main(){structNODE*p,*q,*r;intsum=0;p=(structNODE*)malloc(sizeof(structNODE));q=(structNODE*)malloc(sizeof(structNODE));r=(structNODE*)malloc(sizeof(structNODE));p->data=100;q->data=200;r->data=300;p->next=q;q->next=r;r->next=p;sum=p->data+p->next->data+r->next->next[];printf(“%d\n”,sum);}正确答案:->next->data解析:自定义结构体类型名为Node,并定义指向结点类型的指针*p,*q,*r。它们共有两个成员:成员data是整型,成员next是指针类型,题目要求求结点数值域的和,也就是求p->data+q->data+r->data的值,p->data表示取p所指结点的值,p->next->data表示取q指针所指结点中的值,现在p所指结点和q所指结点的值已经取到,就差r所指结点中的值,题目中已知r->next指向的是p->data,如果想得到r指针所指结点的值需要将最后的指针指向r->data,所以答案为->next->data。64.有以下程序,其功能是:以二进制”写”方式打开文件d1.dat,写入1~100这100个整数后关闭文件。再以二进制“读”方式打开文件d1.dat,将这100个整数读入到另一个数组b中,并打印输出。请填空。#include<stdio.h>main(){FILE*fp;inti,a[100],b[100];fp=fopen(“d1.dat”,”wb”);for(i=0;i

温馨提示

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

评论

0/150

提交评论