国家二级(C语言)机试模拟试卷158(题后含答案及解析)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

国家二级(C语言)机试模拟试卷158(题后含答案及解析)
题型有:1. 选择题 2. 程序填空题 3. 程序修改题 4. 程序设计题
选择题
1.下列叙述中正确的是( )。

A.程序执行的效率与数据的存储结构密切相关
B.程序执行的效率只取决于程序的控制结构
C.程序执行的效率只取决于所处理的数据量
D.以上说法均错误
正确答案:A
解析:程序执行的效率与数据的存储结构、数据的逻辑结构、程序的控制结构以及所处理的数据量等有关。

2.软件按功能可以分为应用软件、系统软件和支撑软件(或工具软件)。

下列各项中属于应用软件的是( )。

A.学生成绩管理系统
B.C语言编译程序
C.UNIX操作系统
D.数据库管理系统
正确答案:A
解析:软件按功能可以分为:应用软件、系统软件、支撑软件。

操作系统、编译程序、汇编程序、网络软件、数据库管理系统都属于系统软件。

所以B、C、D选项都是系统软件,只有A选项是应用软件。

3.通常软件测试实施的步骤是( )。

A.集成测试、单元测试、确认测试
B.单元测试、集成测试、确认测试
C.确认测试、集成测试、单元测试
D.单元测试、确认测试、集成测试
正确答案:B
解析:软件测试过程一般按4个步骤进行,即单元测试、集成测试、验收测试(确认测试)和系统测试。

故答案应该选B。

4.下列叙述中错误的是( )。

A.系统总体结构图支持软件系统的详细设计
B.软件设计是将软件需求转换为软件表示的过程
C.数据结构与数据库设计是软件设计的任务之一
D.PAD图是软件详细设计的表示工具
正确答案:A
解析:详细设计的任务是为软件结构图而非总体结构图中的每一个模块确定实现算法和局部数据结构、用某种选定的表达工具表示算法和数据结构的细节,因此A选项描述错误。

5.对长度为n的线性表作快速排序,在最坏情况下,比较次数为( )。

A.n
B.n-1
C.n(n-1)
D.n(n-1)/2
正确答案:D
解析:快速排序最坏情况就是每次选的基准数都和其他数做过比较,共需比较(n-1)+(n-2)+…+1=n(n-1)/2,故D选项正确。

6.某二叉树共有7个结点,其中叶子结点只有1个,则该二叉树的深度为(假设根结点在第1层)( )。

A.3
B.4
C.6
D.7
正确答案:D
解析:根据二叉树的基本性质:在任意一棵二叉树中,度为0的叶子结点总比度为2的结点多一个,因此本题中度为2的结点为1-1=0个,据此可以知道本题中的二叉树的每一个结点都有一个分支,所以共有7个结点、共7层,即深度为7,选择D。

7.下列关于栈的叙述中,正确的是( )。

A.栈顶元素最先能被删除
B.栈顶元素最后才能被删除
C.栈底元素永远不能被删除
D.栈底元素最先能被删除
正确答案:A
解析:栈是“先进后出”的数据结构,因此栈顶元素最后入栈却最先被删除,栈底元素最先入栈却最后被删除,答案为A。

8.在数据库中,数据模型包括数据结构、数据操作和( )。

A.数据约束
B.数据类型
C.关系运算
D.查询
正确答案:A
解析:数据模型是数据特征的抽象,从抽象层次上描述了系统的静态特征、动态行为和约束条件,为数据库系统的信息表示和操作提供一个抽象的框架,即描述了数据结构、数据操作及数据约束。

故正确答案为A。

9.一名教师可讲授多门课程,一门课程可由多名教师讲授。

则实体教师和课程间的联系是( )。

A.1:1联系
B.1:m联系
C.m:1联系
D.m:n联系
正确答案:D
解析:因为一名教师可讲授多门课程,而一门课程又能由多名教师讲授,所以教师和课程之间是多对多的关系,可以表示为m:n,选择D。

10.支持子程序调用的数据结构是( )。

A.栈
B.树
C.队列
D.二叉树
正确答案:A
解析:栈支持子程序调用。

栈是一种只能在一端进行插入或删除的线性表。

在主程序调用子函数时要首先保存主程序当前的状态,然后转去执行子程序,最终把子程序的执行结果返回到主程序中调用子程序的位置,继续向下执行,这种调用符合栈的特点,所以A选项正确。

11.以下正确的说法是( )。

A.用户若需要调用标准库函数,调用前必须重新定义
B.用户可以重新定义标准库函数,但若重新定义,该函数将失去原有意义C.用户系统根本不允许用户重新定义库函数
D.用户若需要调用库函数,调用前不必使用预编译命令将该函数所在文件包括到用户源文件中,系统会自动寻找该文件
正确答案:D
解析:无论是标准库函数,还是别的函数,都属于函数的范畴,都允许用户重新定义和使用,使用的时候include命令必须以“#”号开头,文件名用一对双引号或一对尖括号括起来,系统提供的头文件是以.h作为文件后缀。

12.下列叙述中错误的是( )。

A.C程序可以由一个或多个函数组成
B.C程序可以由多个程序文件组成
C.一个C语言程序只能实现一种算法
D.一个C函数可以单独作为一个C程序文件存在
正确答案:C
解析:一个C程序可以有一个或多个程序文件,也可以有一个或多个函数,所以一个C语言程序可以实现多种算法,答案选C。

13.设有定义:int a;float b;执行scanf(“%2d%f”,&a,&b);语句时,若从键盘输入876543.0,则a和b的值分别是( )。

A.87和6.0
B.876和543.0
C.87和543.0
D.76和543.0
正确答案:A
解析:scanf( )函数的一般形式为:scan(格式控制,地址表列)。

其中,“格式控制”是用双引号括起来的字符串,也称为“转换控制字符串”,它包括两种信息:①格式说明,由“%”和格式字符组成;②普通字符,即需要原样输入的字符。

“地址表列”是需要接收输入数据的一系列变量的地址。

本题中的“格式控制”是“%2d%f”,“%2d”的意思是要输入一个整数,但该整数最宽只占2个字符,而“%2d”是要输入一个浮点数。

题目要求输入的是876空格543.0,所以scanf( )函数将87赋给a,将6赋给b。

14.若变量均已正确定义并赋值,以下各项中属于合法的C语言赋值语句是( )。

A.x=n%2.5;
B.x=y==5;
C.x+n=i;
D.x=5=4+1;
正确答案:B
解析:%取余操作数只能是整数,x+n和数值5不能作为赋值的左值,所以A、C、D选项错误。

15.以下各项中,属于合法的转义字符是( )。

A.’\x41’
B.’\0x41’
C.’\X41’
D.’\0X41’
正确答案:A
解析:’\xhh’表示1到2位十六进制所代表的字符,故答案为A。

16.有以下程序:#include<stdio.h>main( ){int a=3:a+=a-=a*a;
printf(“%d\n”,a);}程序的输出结果是( )。

A.0
B.9
C.3
D.-12
正确答案:D
解析:等号“=”运算符是从右到左,且与“+、-、*”运算符比,优先级较低。

首先计算a*a,结果为9,执行a=a-9后a的值为-6,然后执行a+=a,即a=a+a=-6+(-6),所以值为-12。

17.设有定义:char s[81];int i=0;以下不能将一行(不超过80个字符)带有空格的字符串正确读入的语句或语句组是( )。

A.gets(s);
B.while((s[i++]=getchar( ))!=‘\n’);s[i]=‘\0’;
C.scanf(“%s”,s);
D.do{scanf(“%c”,&s[i]);}while(s[i++]!=‘\n’);s[i]=‘\0’;
正确答案:C
解析:函数scanf( )输入字符串时默认空格为间隔符,所以不能输入空格,答案选C。

18.有以下程序:#include<stdio.h>main( ){char c1,c2,c3,c4,c5,c6;scanf(“%c%c%c%c”,&c1,&c2,&c3,&c4);c5=getchar( );c6=getchar( );putchar(e1);putchar(c2);printf(“%c%c\n”,c5,c6);}程序运行后,若从键盘输入(从第1列开始):123<回车>45678<回车>则输出结果是( )。

A.1256
B.1245
C.1278
D.1267
正确答案:B
解析:对于字符型数据的输入而言,从键盘上输入的字符,不管是否可以输出,都会被读入字符型变量中。

因此,c1=1,c2=2,c3=3,c4=<回车>,c5=4,c6=5,输出c1,c2,c5,c6的结果为1245,答案选B。

19.有以下程序:#include<stdio.h>main( ){int a,b;for(a=0;a<3;a++){scanf(“%d”,&b);switch(b){default:printf(“%d”,++b);case1:printf(“%d”,++b);case2:printf(“%d”,++b);}}}执行时输入:1 2 3<回车>,则输出结果是( )。

A.2 3 3 4 5 6
B.2 3 4
C.2 2 3 4 4 4
D.2 3 4 3 4 4
正确答案:A
解析:这是一个循环结构嵌套选择结构,按照外层循环,内层选择一步一步处理即可。

本题重点注意,switch语句中并没有出现break语句,所以内层循环是不会跳出的。

20.对于if(表达式)语句,以下叙述中正确的是( )。

A.“表达式”的值可以是任意合法的数值
B.变量不能出现在“表达式”中
C.常量不能出现在“表达式”中
D.如果“表达式”的值不是逻辑值,程序会出编译错误
正确答案:A
解析:B、C、D选项描述比较片面。

21.若有以下程序:#include<stdio.h>main( ){int c;C=13|15;printf(“%d\n”,c);}则程序的输出结果是( )。

A.13
B.15
C.18
D.5
正确答案:B
解析:本题考查位运算中按位或运算符,或运算只要两个比较的位中有一个为1,其结果是1,否则结果为0。

13用二进制表示为00001101,15用二进制表示为00001111,或运算后结果为00001111,即15,故B选项正确。

22.有以下程序:#include<stdio.h>main( ){int a=1,b=0;if(--a)b++;else if(a==0)b+=2;else b+=3;printf(“%d\n”,b);}程序运行后的输出结果是( )。

A.0
B.1
C.2
D.3
正确答案:C
解析:“++”和“--”运算,当以前缀形式出现时,则先进行加1或减1操作,再进行其他运算;当以后缀形式出现时,则先进行其他运算,再进行加1或减1操作。

a初始定义为1,b为0,执行--a,a的值变为0,即if判断为假,执行b+=2,输出b的值为2。

23.有以下程序:#include<stdio.h>main( ){int i,array[6]={1,5,0,4};for(i=0;i<5;i++)printf(“%d”,array[i]);printf(“\n”);}程序运行后的输出结果是( )。

A.0 4 0 4 0
B.1 5 0 4 0
C.1 5 5 4 0
D.1 2 1 2 0
正确答案:B
解析:本题主要考查一维数组的输出。

由于数组中有6个元素,但初始化数组的时候只给出4个元素,所以array[5]=0,array[6]=0,前面几位元素依次输出,不够位数补O,所以选项B正确。

24.以下叙述中正确的是( )。

A.数组说明符的一对方括号中只能使用整型常量,而不能使用表达式
B.一条语句只能定义一个数组
C.每个数组包含一组具有同一类型的变量,这些变量在内存中占有连续的存储单元
D.在引用数组元素时,下标表达式可以使用浮点数
正确答案:C
解析:同类元素的集合称为数组,数组元素在内存中占据连续的存储空间,C选项正确。

方括号中可以为整型变量或者常量表达式,A选项错误。

在使用逗号运算符的情况下,一条语句可以定义多个数组,B选项错误。

数组元素在数组中的下标为整型常量或者变量构成的整型表达式,不能为浮点数,D选项错误。

答案选C。

25.若有定义语句:int m[ ][3]={1,2,3,4,5,6,7};,则与该语句等价的是( )。

A.int m[ ][3]={{1,2,3},{4,5},{6,7}};
B.int m[ ][3]={{1,2},{3,4},{5,6,7}};
C.int m[ ][3]={{1,2,3},{4,5,6},{7}};
D.int m[ ][3]={{1},{2,3,4},{5,6,7}};
正确答案:C
解析:考查二维数组的初始化。

初始化二维数组的时候,若给数组的全部元素均赋初值,此时第一维的元素个数可以不指定,部分赋值时,最后一行元素不写完整,此时数组第一维元素个数仍然可以不指定。

题中为按行给数组m赋值,最后一行只有部分赋初值,答案选C。

26.以下叙述中正确的是( )。

A.char,c1,c2,*c3,c4[40];是合法的变量定义语句
B.数组下标的下限由数组中第一个非零元素的位置决定
C.数组下标的下限由数组中第一个被赋值元素的位置决定
D.数组下标的下限是1
正确答案:A
解析:A选项正确,charc1,c2,*c3,c4[40]表示定义了两个字符变量c1、c2,一个字符指针c3,一个字符数组c4。

数组的下限永远为0,选项B、C、D 错,答案选A。

27.有以下程序:#include<stdio.h>main( ){int a=3;do{printf(“%d,”,a-=2);}while(!(--a));printf(“\n”);}程序运行后的输出结果是( )。

A.1,-3,
B.1,-2,
C.3,0,
D.1,0,
正确答案:B
解析:本题重点考查do…while语句,该循环语句的特点是,先执行循环中的语句,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。

因此,do…while循环至少要执行一次循环语句。

变量a赋初值为3,每循环一次需执行语句a-=2一次,同时循环条件使变量a自减1,所以第一次循环后变量a变为1,第2次循环后变量a变为-2。

故B选项正确。

28.若有定义:char s[30]={0};运行时输入:This is a string.<回车>则以下不能正确读入整个字符串This is a string.到字符数组s中的语句组是( )。

A.scanf(“%s”,s);
B.gets(s);
C.for(i=0;(c=getchar( ))!=‘\n’;i++)s[i]=c;
D.i=0;while((c=getchar( ))!=‘\n’)s[i++]=c;
正确答案:A
解析:考查基本的字符串输入控制语句。

29.有以下程序:#include<stdio.h>main( ){int x;for(x=3;x<6;x++)printf((x%2)?(“*%d”):(“#%d”),x);printf(“\n”);}程序的输出结果是( )。

A.*3#4*5
B.#3*4#5
C.*3*4#5
D.*3#4#5
正确答案:A
解析:条件运算符组成条件表达式的一般形式为:表达式1?表达式2:表达式3。

其求值规则为:表达式1值为真,则以表达式2的值作为条件表达式的值,否则以表达式3的值作为整个条件表达式的值。

本题中语句printf((x%2)?(“*%d”):(“#%d”,x);含义为变量x对2求余,如果结果为真,则按照“*%d”出,否则按照“#%d”出。

故A选项正确。

30.有以下程序:#include<stdio.h>void fun(int a,int b){int t;t=a;a=b;b=t;}main( ){int c[10]={1,2,3,4,5,6,7,8,9,0},i;for(i=0;i<10;
i+=2)fun(c[i],c[i+1]);for(i=0;i<10;i++)printf(“%d”,c[i]);printf(“\n”);}程序的运行结果是( )。

A.1 2 3 4 5 6 7 8 9 0
B.2 1 4 3 6 5 8 7 0 9
C.0 9 8 7 6 5 4 3 2 1
D.0 1 2 3 4 5 6 7 8 9
正确答案:A
解析:函数fun( )属于值传参,形参的变化不会影响实参,所以函数调用结束后,数组c没有任何变化,输出结果为选项A。

31.有以下程序:#include<stdio.h>int fun(int n){int a;if(n==1)return1;a=n+fun(n-1);return(a);}main( ){printf(“%d\n”,fun(5));}程序的输出结果是( )。

A.10
B.14
C.15
D.9
正确答案:C
解析:考查递归函数。

函数fun( )的功能是计算1到n之间的数字之和,所以计算结果为15,答案选C。

32.以下选项中,没有编译错误的是( )。

A.char str3[]={‘d’,’e’,’b’,’u’,’g’,’\0’};
B.char str1[5]=“pass”,str2[6];str2=str1;
C.char name[10];name=“china”;
D.char str4[];str4=“hello world”;
正确答案:A
解析:B选项中,不能直接将字符数组名直接赋值给另一个字符数组名。

C 选项赋值错误,不能将一个字符串常量赋值给一个字符指针。

D选项定义str4时需要定义其长度。

故A选项正确。

33.有以下程序:#include<stdio.h>int add(int a,int b){return(a+b);}main( ){int k,(*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);
正确答案:A
解析:int(*f)( )为一个函数指针变量,返回值为整型,f为一个指针变量,
指向一个已经定义的函数,在调用该函数的时候需要把参数写在相应的小括号内,即(*指针名)(参数或参数列表),所以选项A调用错误,答案选A。

34.以下关于C语言函数参数传递方式的叙述中正确的是( )。

A.数据只能从实参单向传递给形参
B.数据可以在实参和形参之间双向传递
C.数据只能从形参单向传递给实参
D.C语言的函数参数既可以从实参单向传递给形参,也可以在实参和形参之间双向传递,可视情况选择使用
正确答案:A
解析:数据只能由实参单向传递给形参称为“值传递”,而不能由形参传回来给实参,A选项正确;数组名、指针等作参数,实参传递给形参地是地址值,这样形参和实参就指向同一段内存单元,在函数体内对形参数据的改变也将影响到实参。

实参和形参之间不可双向传递,BD选项错误。

数据不能从形参传递给实参,C选项错误。

35.设已有定义:float x;则以下对指针变量p进行定义且赋初值的语句中正确的是( )。

A.float*p=&;x;
B.int*p=(float)x;
C.float p=&;x;
D.float*p=1024:
正确答案:A
解析:考查指针变量的初始化。

只能把对应类型的变量的地址赋值给指针,选项B错误;定义指针时要加上“*”标明该变量为一个指针变量,选项C错误;不能把一个整数直接赋值给指针变量,选项D错误;所以答案选A。

36.以下叙述中正确的是( )。

A.在C语言中,预处理命令行都以#开头
B.预处理命令行必须位于C源程序的起始位置
C.#include<stdio.h>必须放在C程序的开头
D.C语言的预处理不能实现宏定义和条件编译的功能
正确答案:A
解析:C语言中,凡是以“#”开头的都被称为编译预处理行,选项A正确;预处理行可以放在C源程序的任何位置,习惯放在起始位置,选项B错误;语句“#include<stdio.h>”必须放在使用文件stdio.h中相关方法的语句之前,但是不一定非要放在C程序开头,选项C错误;预处理包括宏定义、文件包含和条件编译等,选项D错误。

答案选A。

37.有以下程序:#include<stdio.h>int fun1(int a,int b){return a+b;}int fun2(int a,int b){return a-b;}int fun(int(*t)(int,int),int x,int y){return((*t)(x,
y));}main( ){int x;X=fun(fun1,9,3);x+=fun(fun2,8,3);printf(“%d\n”,x);}程序运行后的输出结果是( )。

A.24
B.23
C.17
D.22
正确答案:C
解析:本题主要考查函数作为形参时的使用,由x=fun(fun1,9,3);可得到x=9+3=12,而后直接传入函数fun2,x=x+8-3=12+5=17。

故C选项正确。

38.有以下程序:#include<stdio.h>void sp(int*a){int b=2;a=&b;*a=*a*2;printf(“%d,”,*a);}main( ){int k=3,*p=&k;sp(p);pfinff(“%d,%d\n”,k,*p);}则程序的输出结果是( )。

A.4,3,3
B.4,3,4
C.6,3,6
D.6,6,6
正确答案:A
解析:首先在主函数中给整型变量k赋值为3,将变量k的地址赋给指针变量p,调用sp函数,将实参p的值传给形参a,在sp函数中,指针变量a又获得变量b的地址,通过运算后,输出a的值为4,返回主函数,输出k的值和p 的值为3和3。

故A选项正确。

39.有以下程序:#include<stdio.h>void my( ){char ch;ch=getchar( );if(ch!=‘c’)my( );putchar(ch);}main( ){my( );}执行时,输入abc<回车>,则输出结果是( )。

A.abc
B.ababc
C.bca
D.cba
正确答案:D
解析:my( )递归,直到输入了c开始返回。

递归使用的是栈的思想,因此最后输入进去的最先返回并输出。

所以结果是cba。

40.有以下程序:#include<stdio.h>main( ){unsigned char a=8,c;c=a >>3:printf(“%d\n”,c);}程序运行后的输出结果是( )。

A.32
B.16
C.1
D.0
正确答案:C
解析:字符常量与其ASCII码值一一对应,在计算的时候,可以使用该字符的ASCII码参与运算,输出时会根据格式控制符输出对应的字符或者ASCII 码。

右移运算符“>>”的运算规则是把左边运算数的各二进制位全部右移n 位,n取决于“>>”右边的数值。

字符a的ASCII码值为8,对应二进制为1000,所以a>>3=1,输出的字符c的ASCII码值为1,答案选C。

程序填空题
41.下列给定程序中,函数fun的功能是:有N×N矩阵,以主对角线为对称线,对称元素相加并将结果存放在左下三角元素中,右上三角元素置为0。

例如,若N=3,有下列矩阵:1 2 34 5 67 8 9计算后结果为1 0 06 5 010 14 9请在程序的下画线处填入正确的内容并把下画线删除。

使程序得出正确的结果。

注意:不得增行或删行,也不得改程序的结构!试题程序:#include<stdio.h>#define N4
正确答案:(1)[N](2)t[i][j](3)t[j][i]
解析:本题考查:有参函数定义,需要根据题目要求和给定程序确定函数参数。

N×N矩阵中如何表示左下角和右上角元素。

填空1:主函数中调用函数的参数为二维数组,所以此处形参应定义为指针数组。

填空2:根据题意可知,对称元素相加的和存放在左下三角元素中,那么应填入的是t[i][j]。

填空3:右上三角元素置0,应填入t[j][i]。

程序修改题
42.在主函数中用键盘输入若干个数放入数组中,用0结束输入并放在最后一个元素中。

下列给定程序中,函数fun的功能是:计算数组元素中所有值为正数的平均值(不包括0)。

例如,数组中元素中的值依次为:39,-47,21,2,-8,15,0,则程序的运行结果为19.250000。

请改正程序中的错误,使它能得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构!试题程序:#include <stdio.h>double fun(int x[]){/******found******/int sum=0
正确答案:(1)double sum=0.0;(2)sum/=c;
解析:本题考查:变量的数据类型,区别int整型和double双精度型;除法运算符“/”。

(1)变量定义错误,变量sum存放所有数据的和,应定义为double 型。

(2)C语言中的除法运算符是“/”。

程序设计题
43.假定输入的字符串中只包含字母和*号。

请编写函数fun,其功能是:除了尾部的*号之外,将字符中的其他*号全部删除。

形参p已指向字符串中最后的一个字母。

在编写函数时,不得使用C语言提供的字符串函数。

例如,字符串中的内容为****A*BC*DEF*G*******,删除后,字符串中的内容应当是ABCDEFG*******。

注意:请勿改动主函数main和其他函数中的任何内容,仅
在函数fun的花括号中填入你编写的若干语句。

试题程序:#include<stdio.h>void]]fun(char*a,cha
正确答案:void fun(char*a,char*p){char*t=a;for(;t<=p;t++)if(*t!=‘*’)*(a++)=*t;for(;*t!=‘\0’;t++)*(a++)=*t;*a=‘\0’;/*在字符串最后加上字符串结束标识*/}
解析:本题考查:删除字符串中非尾部*号,删除的主要思想就是把不删除的字符保留起来。

本题用两个循环语句来实现。

第1个循环的作用是将指针p 所指字母以前所有非*号的字符保留下来,即删除指针p以前所有的木号。

第2个循环的作用是将指针p以后的所有*号保留下来。

最后在新串的结尾加上结束符。

相关文档
最新文档