国家二级(C语言)机试历年真题试卷汇编25(题后含答案及解析)-0_第1页
国家二级(C语言)机试历年真题试卷汇编25(题后含答案及解析)-0_第2页
国家二级(C语言)机试历年真题试卷汇编25(题后含答案及解析)-0_第3页
国家二级(C语言)机试历年真题试卷汇编25(题后含答案及解析)-0_第4页
国家二级(C语言)机试历年真题试卷汇编25(题后含答案及解析)-0_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

国家二级(C语言)机试历年真题试卷汇编25(题后含答案及解析)题型有:1.选择题2.程序填空题3.程序修改题4.程序设计题选择题1.下列叙述中正确的是()。A.链表可以是线性结构也可以是非线性结构B.链表只能是非线性结构C.快速排序也适用于线性链表D.对分查找也适用于有序链表正确答案:A解析:线性表的链式存储结构称为线性链表,线性链表可以是线性结构也可以是非线性结构。快速排序和对分查找是适用于顺序存储的线性表。故本题选择A选项。2.循环队列的存储空间为Q(1:50)。经过一系列正常的入队与退队操作后,front=rear=25。后又成功地将一个元素退队,此时队列中的元素个数为()。A.24B.49C.26D.0正确答案:B解析:当front=rear时可知队列要么为空要么队列满,题目又成功地将一个元素退队,说明之前队列为满(为空时队列中无元素),退出一个元素后队列中还有50-1=49个元素。故本题选择B选项。3.设二叉树中有20个叶子节点,5个度为1的节点,则该二叉树中总的节点数为()。A.46B.45C.44D.不可能有这样的二叉树正确答案:C解析:二叉树中只存在度为0、1、2的节点,根据在二叉树中度为0的节点(叶子节点)总比度为2的节点多一个,可知本题中度为2的节点有20-1=19个。故该二叉树中总的节点数为20+5+19=44个。故本题选择C选项。4.设栈与队列初始状态为空。首先A,B,C,D,E依次入栈,再F,G,H,I,J依次入队;然后依次出队至队空,再依次出栈至栈空。则输出序列为()。A.E,D,C,B,A,F,G,H,I,JB.E,D,C,B,A,J,I,H,G,FC.F,G,H,I,J,A,B,C,D,ED.F,G,H,I,J,E,D,C,B,A正确答案:D解析:栈称为“后进先出”表或“先进后出”的线性表;队列称为“先进先出”或“后进后出”的线性表。F,G,H,I,J依次入队,则依次出队顺序为F,G,H,I,J;A,B,c,D,E依次入栈,则依次出栈顺序为E,D,C,B,A。故输出顺序为F,G,H,I,J,E,D,C,B,A。故本题选择D选项。5.下面不属于软件工程三要素的是()。A.环境B.工具C.过程D.方法正确答案:A解析:软件工程包含3个要素:方法、工具和过程。故本题选择A选项。6.程序流程图是()。A.总体设计阶段使用的表达工具B.详细设计阶段使用的表达工具C.编码阶段使用的表达工具D.测试阶段使用的表达工具正确答案:B解析:详细设计阶段常见的工具有程序流程图、N-S图、PAD图、HIPO图、判定表等。故本题选择B选项。7.下面属于“对象”成分之一的是()。A.封装B.规则C.属性D.继承正确答案:C解析:面向对象方法中的对象由两部分组成:①数据,也称为属性,即对象所包含的信息,表示对象的状态;②方法,也称为操作,即对象所能执行的功能、所能具有的行为。故本题选择C选项。8.数据库管理系统能实现对数据库中数据的查询、插入、修改和删除,这类功能称为()。A.数据控制功能B.数据定义功能C.数据存储功能D.数据操纵功能正确答案:D解析:数据定义功能:负责数据的模式定义与数据的物理存取构建。数据操纵功能:负责数据的操纵,包括查询与增、删、改等操作。数据控制功能:负责数据完整性、安全性的定义与检查以及并发控制、故障恢复等功能。故本题选择D选项。9.实体电影和实体演员之间的联系是()。A.一对一B.多对多C.多对一D.一对多正确答案:B解析:一部电影可由多名演员参演,一名演员可以参演多部电影,因此实体电影和实体演员之间的联系是多对多。故本题选择B选项。10.定义学生的关系模式如下:S(S#,Sn,Sex,Age,D#},Da)(其属性分别为学号、姓名、性别、年龄、所属学院、院长)该关系的范式最高是()。A.1NFB.2NFC.3NFD.BCNF正确答案:B解析:关系数据库中的关系是要满足一定要求的,满足不同程度要求的为不同的范式。满足最低要求的叫第一范式,简称1NF。在满足第一范式的基础上,进一步满足更多要求规范则是第二范式。然后在满足第二范式的基础上,还可以再满足第三范式,以此类推。对于关系模式,若其中的每个属性都已不能再分为简单项,则它属于第一范式。若某个关系R为第一范式,并且R中每一个非主属性完全依赖于R的某个候选键,则称其为第二范式。第二范式消除了非主属性对主键的部分依赖。如果关系R是第二范式,并且每个非主属性都不传递依赖于R的候选键,则称R为第三范式。(传递依赖:在关系模式中,如果Y→X,X→A,且X不决定Y和A不属于X,那么Y→A是传递依赖)。本题中,关系s满足第一范式和第二范式,但是S#→D#,D#→Da,存在传递依赖,因此不满足第三范式。该关系的范式最高是2NF。故本题选择B选项。11.下面叙述中正确的是()。A.用计算机汇编语言书写的程序是计算机可以直接执行的B.程序是用纯粹的英文所表示的人们头脑中解决问题或进行计算的步骤C.算法仅仅是用计算机高级语言书写的计算机解题的步骤D.用任何计算机高级语言书写的程序都必须转换为计算机指令序列才能执行正确答案:D解析:计算机只能识别机器语言,选项A错误;程序不仅仅由纯粹的英文书写,还包括数字和一些特殊符号,选项B错误;算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,并不仅仅是解题步骤,选项C错误;计算机只能识别执行计算机的指令序列,任何程序都需要转换成指令序列才能被计算机执行,选项D正确;本题答案为D。12.下面叙述中错误的是()。A.C语言的函数可以直接使用,无须事先定义或声明B.C语言程序是由函数组成的C.C语言的函数就是一段程序D.C语言的函数可以单独编译正确答案:A解析:C语言要求,在程序中用到的所有函数,必须“先定义,后使用”,选项A错误;一个源程序文件由一个或多个函数以及其他有关内容(如指令、数据声明与定义)组成,选项B正确;函数就是一段具有特定功能的程序,选项C正确;C语言中的函数可以单独进行编译,编译为目标文件,要链接成可执行文件时,选项D正确;本题答案为A。13.若有定义:inta=100;则语printf(‘‘%d%d%d\n’’,sizeof(‘‘a’’),sizeof(a),sizeof(3.14));的输出是()。A.328B.248C.238D.421正确答案:B解析:sizeof是C/C++中的一个操作符(如++、--),作用就是返回一个对象或者类型所占的内存字节数。sizeof(char)为1,sizeof(int)为4,sizeof(double)为8。当操作数是具体的字符串或者数值时,会根据具体的类型进行相应转化,sizeof(‘‘a’’),转化为数组型,注意要加上后面的’\0’,字节数为2;sizeof(a)即为sizeof(100),等价于sizeof(int)所以返回值为4;sizeof(3.14)其中3.14是double型,所以返回值为8,选项B正确;本题答案为B。14.若有定义:inta=3,b;,则执行语句:b=(a++,a++,a++);后,变量a和b的值分别是()。A.6,5B.8,7C.6,3D.5,6正确答案:A解析:C语言中“++”为单目运算符,优先级最高,a++表示在使用a之后使a的值加1,逗号表达式从左到右按顺序执行,并返回最右表达式的值,所以最后a自增了3次,结果为6,因为a++为使用后加1,所以在第三个a++时,返回最右表达式的值,a此时的值为5,赋值给b,赋值结束后执行第三次自增,所以最后a的值为6,b的值为5,选项A正确;本题答案为A15.有以下程序段inta=3,b;b=a+3;{intc=2;a*=c+1;}printf(‘‘%d\n’’,a);下面关于此段程序的说法,正确的是()。A.这段程序的输出是9B.这段程序中存在有语法错误的语句C.这段程序的输出是7D.可执行语句b=a+3后,不能再定义变量c正确答案:A解析:C语言中变量的定义可以在复合语句的开头,所以可以定义变量c,选项D错误;此段程序不存在语法错误,选项B错误;C语言中运算符*=(/=、+=、-=),例如a*=b(a/=b、a+=b、a-=b)等价于a=a*b(a=a/b、a=a+b、a=a-b),此段程序开始a=3,b没有赋初值,执行b=a+3后b为6,定义变量c并赋初值2,执行a*=c+1,等价于a=a*(c+1),结果为9,选项A正确,选项C错误;本题答案为A。16.以下叙述中正确的是()。A.在C语言中,常量名也要遵守标识符的命名规则B.对单目运算符来说,运算对象一定在其右侧C.标识符的首字符必须是下划线、字母,其他字符可以是任意的键盘可键人字符D.变量占用内存,常量不占用内存正确答案:A解析:C语言中,用来对变量、符号常量名、函数、数组、类型等命名的有效字符序列统称为标识符,常量名也要遵守标识命名规则,选项A正确;单目运算符的运算对象可以在其左侧或者右侧,如i++或++i,选项B错误;C语言规定标识符只能由字母、数字、下划线组成,选项C错误;一般来说,基本类型(整型、字符型等)常量会在编译阶段被编译成立即数,占用代码段的内存,而字符串常量占用的是数据段内存。选项D错误;本题答案为A。17.若有定义:inta=3,b=2;,则下面表达式中,值为真的选项是()。A.!b||!aB.!(a/b)C.!(b/a)D.!a&&!b正确答案:C解析:C语言中“!”叫“取非”运算符,属于逻辑运算符,只有两种状态,“真”和“假”,C语言规定非0为“真”,0为“假”。a=3,b=2,!2、!3为0,即为假,“||”为“或”运算符,左右两个表达式有一个为真及整个表达式为真,0||0为0,值为假,选项A错误;a/b为1.5,又因为a、b都为int型,自动转换,丢弃小数部分,所以a/b的值为1,!1为0,为假,选项B错误;b/a为0.6666…,丢弃小数部分,其值为0,!0为真,所以选项C正确;a=3,b=2,!2、!3为0,即为假,“&&”为“与”运算符,左右两个表达式全为真时整个表达式才为真,0&&0为假,选项D错误;本题答案为C。18.若要求:当数学式3<x<7成立时,使得y=1,且设x、y为int型变量,则以下能够实现这一要求的选项是()。A.if(x>3)if(x<7)y=1;B.if(x>3||x<7)y=1;C.if(x<3)y=1;elseif(x<7)y=1;D.if(!(x<=3))y=1;elseif(7>x)y=1;正确答案:A解析:要求为当x>3且x<7时使得y=1。当x>3且x<7时使得y=1,选项A正确;“||”为“或”运算符,选项B错误;当x<3时y=1或x<7时y=1,选项C错误;当!(x<=3)即当x>3时,y=1,或者x<7时y=1,选项D错误;本题答案为A。19.有下列程序#include<stdio.h>main(){charc,d;c=getchar();d=getchar();switch(c-’0’){case1:switch(d%’0’){case1:printf(‘‘*’’);case2:printf(‘‘@’’);}case2:switch(d%’0’){case1:printf(‘‘#’’);case2:printf(‘‘&’’);}}}若运行时输入:21<回车>,程序的输出结果是()。A.@#*B.&C.@#&D.#&正确答案:D解析:switch为多分支选择语句,其后面括号内的值应为整型类型(包括字符类型),将switch后括号的值与case中给定的值相比较,如果和其中之一相匹配,则执行该case后的语句,若都不匹配,则执行default语句,若没有default语句,则不执行任何语句,流程转到switch下一条语句,每一个case语句后应加上break,使流程跳出switch语句,若不加break,在执行完相匹配的case语句后会顺序执行完该case语句下的所有case语句。键盘输入21,2赋值给c,1赋值给d,第一层switch语句为switch(2),执行case2语句,第二层switch为switch(1),执行casel语句输出#,继续顺序执行case1语句下面的语句case2,输出&,执行完毕,跳出switch语句,输出结果为#&,选项D正确;本题答案为D。20.有下列程序#include<stdio.h>main(){inti,a,b,e;a=b=c=0:for(i=0;i<3;i++){switch(i%3){ease0:a++;break;ease1:b++;break;ease2:c++;break;}if(i%3==0)break;}printf(‘‘%d%d%d\n’’,a,b,c);}程序执行后的输出结果是()。A.201B.111C.100D.210正确答案:C解析:switch为多分支选择语句,其后面括号内的值应为整型类型(包括字符类型),将switch后括号的值与case中给定的值相比较,如果和其中之一相匹配,则执行该case后的语句,若都不匹配,则执行default语句,若没有default语句,则不执行任何语句,流程转到switch下一条语句,每一个case语句后应加上break,使流程跳出switch语句若不加break,在执行完相匹的case语句后会顺序执行完该case语句下的所有case语句。定义变量,a、b、c初值为0,执行循环语句:i=0,%为取余运算符,如a%b,结果为a/b的余数,0%3值为0,执行case0语句,执行完该语句此时a的值为1;向下执行if语句,判断i%3==0,结果为真,执行if语句内的break,跳出for语句,输出a、b、c的值,此时a的值为1,b、c的值仍为0,选项C正确;本题答案为C。21.有下列程序#include<stdio.h>main(){inti,j,a,b;a=b=j=0;while(j<3){j++;jf(j==1)continue;for(i=0;i<3;i++){if(i>1)break;a=a*10+i;if(i<1)b=a;}}printf(‘‘%d%d\n’’,a,b);程序执行后的输出结果是()。A.10101B.101101C.100D.10110正确答案:D解析:C语言中当continue和break用在循环语句的循环体时,break用于立即退出本层循环,而continue仅仅结束本次循环,本次循环体内不执行continue语句后的其他语句,但下一次循环还会继续执行,如果有多层循环时,break只会跳出本层循环,不会跳出其他层的循环。两层循环嵌套,外循环循环一次,内循环需要执行其所有循环。程序开始a、b、j都为0,j=0<3,执行while循环,执行j++,j为1,(j==1)为真,执行if语句,continue,结束本次循环,j=l<3为真,再次执行while循环,j此时值为2,(j==1)为假,不执行if语句,向下执行for循环,i=0,a=0*10+0=0,b=a=0,i++;i=1,a=0*10+1=1,b=0;i=2>1,执行break语句,跳出for循环,此时a=1,b=0,j=2<3为真,再次执行whik语句,j=3,不执行if语句,向下执行for循环,i=0,a=1%10+0=10.b=a=10,i++;i=1,a=10*10+1=101,b=10;i=2>1,执行break语句,跳出for循环,此时a=101,b=10,j=3<3为假,退出while循环,输出a、b,a=101,b=10,选项D正确;本题答案为D。22.有下列程序#include<stdio.h>main(){charc,i;for(i=0;i<3;i++){c=getchar();printf(‘‘%c,’’,(c-’A’+5)%26+’a’);}printf(‘‘\n’’);}若程序运行时输入:APE<回车>,则输出结果是()。A.E,T,I,B.F,U,J,C.f,u,j,D.E,t,I,正确答案:c解析:根据ASCII码表,’A’-’Z’对应的是65-90,’a’-’z’对应的是97-122,字符型可以和数字相互比较,依次从键盘输入APE,A-’A’+5=5,5%26=5,5+’a’,即为a往后第五个字母,即为f,同理先将字符转换成对应的ASCII码进行计算,最后再转换成对应的字符输出,最后输出结果为f,u,j,选项C正确;本题答案为C。23.库函数rand()的功能是产生一个在0—32767之间的随机数。若要用此函数随机产生一个0~99.99(2位小数)之间的数,以下能实现此要求的表达式是()。A.(rand()%10000)/100.0B.(rand()%10000)/100C.(rand()%9000+1000.0)/100.0D.(rand()%100)/100.0正确答案:A解析:要得到两位小数,应除以小数,使其转换成浮点数,所以应除以100.0,选项B错误;因为rand()的功能是产生一个0~32767之间的随机数,且要求随机产生一个0~99.99(2位小数)之间的数,因此先得到0~9999之间的数然后在除以100.0,rand()%10000,当随机数在1~9999时,结果都为其本身,当随机数在9999以上时,结果为0~9999,选项A正确;rand()%9000只能得到0~8999的数,加上1000.0以后只能得到1000.0~9999.0,选项C错误;rand()%100只能得到0~99之间的随机数,选项D错误;本题答案为A。24.若想定义一个求x的n次方的函数,设传给函数的幂次n为整数,则以下四个函数中正确的是()。A.doublemypow(doublex,intn){intsignednum,i;doublemul=1.0:if(n>=0)signednum=1;else{signednum=-1;n=-n;}for(i=1;i<=n;i++)mu1*=x;if(signednum==-1)mu1=1.0/mu1;returnmu1;}B.doublemypow(doublex,intn){inti;doublemul=1.0:n=fabs(n);for(i=1;i<=n;i++)mul*=x;returnmul;}C.doublemypow(doublex,intn){inti;doublemul=1.0;if(n>0){for(i=1;i<=n;i++)mul*=x;}else{for(i=n;i>=0;i--)mul*=1.0/x:}returnmul;}D.doublemypow(doublex,intn){inti;doublemul=1.0;if(n>=0){for(i=0;i<=n;i++)mul*=x;}else{for(i=n;i>=0;i--)mul*=1.0/x;}returnmul;}正确答案:A解析:求一个数的n次方时,先判断是正次方还是负次方,选项A中,先定义一个标识变量signednum,若为正次方则给该变量赋值为1,若为负次方则给该变量赋值为-1,再利用循环将需要求次方的数进行累乘操作,再通过条件语句判断标识变量signednum,当检测到该标识变量为正时,直接输出累乘后的值,当检测到该标识变量为负时,将累乘结果取倒后输出,本题答案为A选项。25.下面关于指针基类型的叙述正确的是()。A.基类型不同的指针,其地址值不能相同B.指针的基类型决定通过该指针访问的每个内存单元包含多少个字节C.基类型相同的指针,可以进行加、减、乘、除运算D.基类型为void的指针,可以存取任何类型的数据正确答案:B解析:基类型不同的指针地址值可以相同,选项A错误;指针的基类型决定通过该指针访问的每个内存单元包含多少个字节,选项B正确;两个指针变量之间可以比较大小,也可以赋值,相减以后得到的使两指针的位移偏量,不能做加运算、乘运算、除运算,指针表示两个地址,相加、相乘、相除没有任何意义,选项C错误;void类型指针中的数据不能访问,如果非要访问的话,可以通过显式转换将void类型指针转换为与所指向的数据类型相符的类型,选项D错误;本题答案为B。26.有下列程序#include<stdio.h>intfun(chara,char*s){inttemp;temp=a;a=*s:*s=temp:returna;}voidmain(){chara=‘3’,b=‘6’,c;c=fun(a,&b);printf(‘‘%c,%c,%c\n’’,a,b,c);}程序执行后的输出结果是()。A.6,3,6B.6,3,3C.3,6,3D.3,3,6正确答案:D解析:主函数调用fun函数时,将实参a的值和变量b的地址拷贝给形参变量a,和形参指针变量s。这时形参a的值为’3’,形参指针s和实参b指向同一块内存空间,此空间存放的值为’6’。在函数fun中,变量temp的值为’3’,形参a被重新赋值为’6’,执行语句*s=temp时,将’3’赋给指针变量s指向的内存空间,这时,实参b也指向这块内存空间。函数调用结束时,变量c=‘6’,a=‘3’,b=‘3’。选项D正确;本题答案为D。27.有下列程序#include<stdio.h>voidmain(){intarry[]={1,3,5,7,9},i,j;for(i=0;i<4;i+=2){for(j=1;i+j<5;j++,j++)printf(‘‘%d’’,arry[i+j]);}}程序执行后的输出结果是()。A.357B.377C.599D.577正确答案:B解析:arry[]为一维数组,执行第一次外循环i=0时:j=1,arry[1],j=3,arry[3],j=5,i+j=5<5为假,结束内循环,执行第二次外循环,i-2时;j=1,arry[3],j=3,i+j=5<5为假,结束内循环,i=4<4为假,结束外循环,输出结果为arry[1],arry[3],arry[3],即为377,选项B正确;本题答案为B。28.有下列程序#include<stdio.h>voidmain(){intarry[][3]={{1,3},{5},{7,9}},i,j;for(i=2;i>=0;i--){for(j=2;j>=0;j--)printf(‘‘%d’’,arry[i][j]);printf(‘‘\n’’);}}程序执行后的输出结果是()。A.097005031B.031005097C.790500130D.130500790正确答案:A解析:二维数组arry[]的初始值为:130500790只对部分元素赋初值并且省略了第一维的长度,执行第一次外循环循环时,输出arry[2][2],arry[2][1],arry[2][0],执行第二次外循环时输出arry[1][2],arry[1][1],arry[1][0],执行第三次外循环时输出arry[0][2],arry[0][1],arry[0][0],所得结果为097005031选项A正确;本题答案为A。29.有下列程序#include<stdio.h>char*fun(char*st,intn){inti;for(i=0;i<n-1;i++){putchar(st[i]-32);}st[i]=‘\0’;returnst+n;}voidmain(){chars[30]=‘‘happybrithday’’;char*cc=fun(s,6);printf(‘‘%s\n’’,c);}程序执行后的输出结果是()。A.happybirthdayB.HAPPYbirthdayC.birthdayhappyD.birthdayHAPPY正确答案:B解析:根据ASBII码表,’A’-’Z’对应的是65-90,’a’-’z’对应的是97~122,将字符串s的首元素地址传给指针st,并将前五个元素对应的ASCII码-32。即为将小写的happy,变成大写的HAPPY,putchar()函数直接将这五个字符输出,当i=5时跳出循环向下执行,st为数组s的首元素地址,st+n返回该数组第六个元素及之后的元素,返回值为birthday,所以最后的输出结果为HAPPYbirthday,选项B正确;本题答案为B。30.有下列程序#include<stdio.h>intfun(char*s,char*t){intc=0:char*p,*q;while(*s){P=s;q=t;while(*p&&*q&&*p++=*q++);if(!*q)c++;s++;}returnc;}voidmain(){char*str1=‘‘celebrationmeeting’’,*str0=‘‘ti’’;printf(‘‘%d\n’’,fun(str1,str0));}程序执行后的输出结果是()。A.1B.0C.2D.3正确答案:C解析:fun()函数的功能是以第二个字符串作为第一个字符串的子串,判断第一个字符串含有几个子串。首先将两个字符串首字母地址传给相应的形参,将第一个第二个字符串的首字母地址分别赋给p,q,c为计数变量,当第一个字符串中的字母跟第二个字符串中的字母相同时,两个指针都加一,即都往后移动一位继续比较,直到第二个字符串的指针为空指针,即第二个字符串结束,此时代表找到一个子串,c加1,然后第一个字符串的指针继续往后加一,第二个字符串的指针指向第一个字符,继续比较,选项C正确;本题答案为C。31.有下列程序#include<stdio.h>intfun2(int*dt,intn);intfun1(intn,int*dt){inti=0,num;while(n){dt[i]=n%10;n/=10:i++:}num=fun2(dt,i);returnnum;}intfun2(int*dt,intn){inti,t=0;for(i=0;i<n;i++)t=t*10+dt[i];returnt;}voidmain(){intdata[100];printf(‘‘%d\n’’,fun1(12345,data));}程序执行后的输出结果是()。A.13524B.12345C.54321D.42531正确答案:C解析:函数fun1()中while循环的功能即为将12345这个五位数拆分成五个数字并且将它们的顺序颠倒存人数组dt中,当i=0时,dt[0]=12345%10=5,即数组中第一个元素为5,12345/10,经强制转化变为1234,然后依次执行把所有数字存入数组,函数fun2()的功能即为把这五个数分别乘以它们所在的数位的权,将这五个数重新组成一个五位数,最后的输出结果为54321,选项C正确;本题答案为C。32.有下列程序#include<stdio.h>voidfun(intn,int*t){inttp:if(n<2)return;if(dt[0]>dt[1]){tp=dt[0];at[0]=dt[1];dt[1]=tp;}fun(n-1,dt+1);}voidmain(){intd[10]={35,13,21,3,15},i;for(i=0;i<4;i++)fun(5-i,d);for(i=0;i<5;i++)printf(‘‘%d’‘,d[i]);}程序执行后的输出结果是()。A.313152135B.352115133C.313352115D.152135133正确答案:A解析:fun()函数的功能为判断一个数组中相邻两个数的大小,若前一个数大于后一个数,则将两个数在数组中的位置互换,先对比第一个元素与第二个元素,若符合条件则交换位置,反之则不变,在fun函数内,通过fun(n-1,dt+1)递归调用自己,依次向后比较,直到n<2,退出函数。函数调用一次,fun函数可以找到数组的最大值并放在最后一个元素位置,通过第一个for循环,可以完成数组的排序。再利用第二个for循环,将该数组的所有元素依次输出,执行完输出结果应为313152135,选项A正确;本题答案为A。33.有下列程序#include<stdio.h>intfun(intb){statieinta=0:intt;t=a+b;a=b;returnt;}voidmain(){inti;for(i=1;i<24;)printf(‘‘%d’’,i=fun(i));}程序执行后的输出结果是()。A.12358132134B.11358132134C.247122033D.0247122033正确答案:A解析:函数中,用static声明的变量,为静态局部变量,静态局部变量在内存的静态存储区中占据着永久性存储单元,退出函数时,变量不会消失,下一次调用时,值仍然存在。执行循环,i=1,调用函数fun(),a=b=1,因为a为静态局部变量,所以在函数调用结束后,它并不释放,仍保留a的值为1,返回值为1,输出1,i=1,再次执行循环,调用函数,此时a的值为上一次调用保存的值1,所以返回值为2,此时a的值仍为1,输出2,i=2,再次执行循环,调用函数,返回值为3,a=b=2,依次执行直到循环结束,最后输出结果为12358132134,选项A正确;本题答案为A。34.有以下不完整程序#include<stdio.h>intfun(intb){【】returna+b;}voidmain(){inti;i=fun(5);printf(‘‘%d\n’’,i);}inta=10;若要程序能正确运行并得到结果15,在【】处,所应加入的变量声明是()。A.staticinta;B.registerinta;C.autointa;D.externinta;正确答案:D解析:程序中的a为全局变量,当全局变量定义在后,引用它的函数在前时,应该在引用它的函数中用extern对此全局变量进行说明,以便通知编译程序:该变量是一个已在外部定义了的全局变量,选项D正确;本题答案为D。35.对于语句void*p=malloc(sizeof(int)*250);,下面说法正确的是()。A.经强制类型转换后,该语句所申请的内存可以作为125个double元素的一维数组来使用B.利用指针p,所申请的内存可作为250个int元素的一维数组来使用C.这条语句存在语法错误D.该语句所申请内存只能存储int数据正确答案:A解析:经强制类型转换后,double型占8个字节,int型占4个字节,250个int型元素内存空间,可以存放125个double类型元素,选项A正确;在使用指针p前,必须先把malloc函数返回的void指针转换为整型指针,然后赋给指针p,再使用,选项B错误;该语句没有语法错误,选项C错误;调用malloc内存分配函数成功会返回内存地址,返回类型是void*,又称万能指针(可以赋值给任何类型的指针变量),选项D错误;本题答案为A。36.有以下程序段#include<stdio.h>#include<stdlib.h>#defineMemory(X,num)malloc(num*sizeof(x))voidmain(){inta=5;charc=10:floatf=100.0:doubled=50.0:int*pi=Memory(a,100);char*pc=Memory(c,100);float*pf=Memory(f,100);double*pd=Memory(d,100);}针对此程序段,以下说法正确的是()。A.系统动态分配的int型数组为500字节B.系统动态分配的数组都是100个元素C.系统动态分配的char型数组为1000字节D.系统动态分配的float与double型数组均为400字节正确答案:B解析:Memory(x,num)malloc(num*sizeof(x)),其中x为某种数据类型的变量,num为该数据类型元素的数量,并给其分配内存。a为int型,占4个字节int*pi=Memory(a,100)即为malloc(100*sizeof(a)),系统动态分配的int型数组为400字节,选项A错误;num为各数据类型元素的数量,其值都为100,选项B正确;char型占1个字节,系统动态分配的char型数组为100字节,选项C错误;float类型占4个字节,double类型占8个字节,所以选项D错误;本题答案为B。37.若有如下定义和语句typedefstruct{intn;doubledt;}IANDF,*PIF;PIFp=(PIF)malloc(sizeof(IANDF));则下述说法中正确的是()。A.指针变量p指向结构体存储单元的首地址B.指针变量p指向了IANDFC.IANDF与PIF都有各自的存储单元D.IANDF和PIF都可以作为结构体变量名使用正确答案:A解析:在C语言中,使用typedef关键字为结构体起一个别名,IANDF、*PIF即为该结构体的别名,*PIF为指针类型。指针变量p为结构体指针,指向结构体存储单元的首地址,选项A正确;指针p为结构体指针变量,指向结构体,不是指向IANDF,选项B错误;IANDF、*PIF只是结构体的别名,没有自己的存储单元,选项C错误;IANDF、*PIF为结构体别名,相当于类型名,不能作为结构体变量名使用,选项D错误;本题答案为A。38.有以下程序#include<stdio.h>structdate{intyear,month,day;};structtime{inthour,minute,second;};structstu{structdatedt;structtimett;};voidmain(){structstureed[3]={{{2016,3,5},{12,25,30}},{{2017,5,8},{8,45,55}},{{2015,6,8},{22,15,26}}};inti;for(i=1;i<3;i++){if(reed[i].dt.year>=2016)printf(‘‘%d-%d’’,reed[i].dt.month,recd[i].dt.day);elseprintf(‘‘%d-%d’’,reed[i].tt.minute,recd[i].tt.second);printf(‘‘\n’’);}}程序执行后的输出结果是()。A.5-815-26B.3-525-30C.6-815-26D.3-545-55正确答案:A解析:定义了结构体date和time来存放年月日和时分秒,并在reed结构体数组中存放了三组数据,在执行循环语句时,i=1,recd[1].dt.year即访问结构体数组中的第二组数据中的year变量,返回值为2017大于2016,执行if语句,输出该组数据的month和day变量,结果为5-8,当i=2时,reed[2].dt.year即访问结构体数组中的第三组数据中的year变量,返回值为2015小于2016为假,执行else语句,输出该组数据的minute和second变量,输出结果为15-26,选项A正确;本题答案为A。39.若有定义:inta=5,b=8;,则以下表达式的逻辑值为假的是()。A.a|bB.b%aC.a&&bD.a&b正确答案:D解析:“|”为“位或”运算符,先将a与b化成二进制,然后对齐排列,在同一纵列中有一个数1那么结果就为1;只有两个都是0,结果才为0,aIb结果为13,为真,选项A正确;b%a结果为3,为真,选项B正确;a&&b为真,选项C正确;&为位与运算,先将a与b化成二进制,然后对齐排列,同一纵列中都为1则结果为1,否则为0,5&8为0,为假,选项D正确;本题答案为D。40.有以下程序#include<stdio.h>#include<stdlib.h>voidmain(){inta[100],i;FILE*fp;for(i=0;i<20;i++)a[i]=rand()%100+1;fp=fopen(‘‘data.txt’’,’’w+b’’);fwrite(a,sizeof(int),20,fp);fclose(fp);}当程序成功打开文件并成功写入数据后,下面说法正确的是()。A.向文件写入了20个int型数据B.向文件写入了100个int型数据C.向文件写入了1个int型数据D.向文件写入了20个随机实型数据正确答案:A解析:在C语言中fopen()函数用于打开指定路径的文件,返回该文件的指针,fwrite()函数的作用将一块内存区域中的数据写入到文本文件,rand()的功能是产生一个0-32767之间的随机数,rand()%100即为得到一个0-99之间的随机数,再加上1,即为得到一个1-100之间的随机数,执行for循环后,往数组a中存了20个1-100之间的随机数,:fwrite()函数中又规定了数据个数为20,所以选项A正确;本题答案为A。程序填空题41.使用VC++2010打开考生文件夹下blank1中的解决方案。此解决方案的项目中包含一个源程序文件blank1.c。函数fun根据所给n名学生的成绩,计算出所有学生的平均成绩,把高于平均成绩的学生成绩求平均值并返回。例如,若有成绩为:50,60,70,80,90,100,55,65,75,85,95,99,则运行结果应为:91.5请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在文件BLANK1.C中,不得增行或删行,也不得更改程序的结构!#include<stdio.h>#pragmawarning(disable:4996)doublefun(doublex[],intn){inti,k=0;doubleavg=0.0,sum=0.0;for(i=0;i<n;i++)avg+=x[i];/**********found**********/avg/=__【1】__;for(i=0;i<n;i++)if(x[i]>avg){/**********found**********/__【2】___+=x[i];k++:}/**********found**********/return__【3】__;main(){doublescore[12]={50,60,70,80,90,100,55,65,75,85,95,99};doubleaa;aa=fun(score,12);printf(‘‘%d\n’’,aa);}正确答案:(1)n(2)sum(3)sum/k解析:填空1:fun()函数有两个参数,第一个为数组x,第二个为数组元素个数n,首先利用第一个for循环将传入的所有数组元素加起来存入变量avg中,因为求的是平均值,所以需要除以元素个数,所以该空填数组元素个数n。答案为n。填空2:第二个for循环将数组中每个元素值与平均成绩进行比较,把高于平均值的元素值加起来以便后期求其平均,此时需要一个变量用来存放高于平均成绩的元素总和,所以该空填sum。答案为sum。填空3:变量k的作用为统计高于平均成绩的元素个数,因为题目要求把高于平均成绩的学生成绩求平均值并返回,所以用高于平均成绩的分数总数除以元素个数,所以该空填sum/k。答案为sum/k。程序修改题42.使用VC++2010打开考生文件夹下modi1中的解决方案。此解决方案的项目中包含一个源程序文件modi1.c。函数fun将字符串s1和s2交叉合并形成新字符串s3,合并方法为:先取s1的第1个字符存入s3,再取s2的第1个字符存入s3,以后依次类推;若s1和s2的长度不等时,较长字符串多出的字符顺序放在新生成的s3后。例如,当s1为:’’123456789’’,s2为:’’abcdefghijk’’时,输出结果应该是:1a2b3c4d5e6f7g8h9ijk请改正函数fun中指定部位的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。#include<stdio.h>#include<string.h>#ragmawarning(disable:4996)voidfun(char*s1,char*s2,char*s3){inti,j;/**********found**********/for(i=0,j=0;(s1[i]!=‘\0’)&&(s2[i]!=‘\0’);i++,j=j+1){s3[j]=s1[i];s3[j+1]=s2[i];}if(s2[i]!=‘\0’){for(;s2[i]!=‘\0’;i++,j++)/**********found

温馨提示

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

评论

0/150

提交评论