国家二级(C语言)机试模拟试卷194附答案解析

国家二级(C语言)机试模拟试卷194

选择题

1.结构化程序设计的基本原则不包括(  )。(A)

A. 多态性

B. 自顶向下

C. 模块化

D. 逐步求精

解析:结构化程序设计的思想包括:自顶向下、逐步求精、模块化、限制使用goto语句,所以选择A。

2.以下程序段中的变量已正确定义:

for(i=0;i<4;i++,i++)

for(k=1;k<3;k++);printf(\(C)

A. **

B. ****

C. *

D. ********

解析:由于内层循环for(k=1;k<3;k++)后面直接跟了空语句“;”所以在循环内部什么操作也不做,跳出外层循环后执行打印语句,所以打印了一个“*”,选择C。

3.下面程序的运行结果是( )。

#include<stdio.h>

main()

{int i;

for(i=1;i<=5;i++)

{if(i%2)printf(\(A)

A. *#*#*

B. #*#*#*

C. *#*#

D. #*#*

解析:分析程序可知,程序循环5次,然后利用if语句决定每次循环时输出的字符。当i为奇数时,i%2=1,if(i%2)为真,输出“*”:当i为偶数时,i%2=0,if(i%2)为假,执行else语句,输出“#”,所以当i取1、3、5值时输出“*”,当i取2、4值时输出“#”。

4.下列数组定义中错误的是( )。

B

解析:二维数组的初始化有以下几种形式:①分行进行初始化;②不分行的初始化;③部分数组元素初始化;④省略第一维的定义,不省略第二维的定义。在选项B)中赋值号左边定义了一个2行3列的二维数组,而右边用3行2列的数字进行赋初值。所以出现了边界的越界溢出错误。

5.在长度为n的有序线性表中进行二分查找,最坏情况下需要比较的次数是( )。(C)

A. D(n)

B. O(n2)

C. O(log2n)

D. O(nlog2n)

解析:当有序线性表为顺序存储时才能用二分法查找。可以证明的是对于长度为凡的有序线性表,在最坏情况下,二分法查找只需要比较log2n次,而顺序查找需要比较n次。

6.下列队列的描述中,正确的是( )。(D)

A. 队列属于非线性表

B. 队列在队尾删除数据

C. 队列按“先进后出”进行数据操作

D. 队列按“先进先出”进行数据操作

解析:队列是只允许在一端删除,在另一端插入的顺序表,允许删除的一端叫做队头,允许插入的一端叫做队尾。队列的操作数是依据先进先出的原则进行的。因此队列亦称作先进先出的线性表,或后进后出的线性表。

7.下面程序的运行结果是( )。

for(i=3;i<7;i++)printf((i%2)?(\(D)

A. )**3

##4

**5

**6

B. ##3

**4

##5

**6

C. ##3

**4

##5

##6

D. **3

##4

**5

##6

解析:本题考查printf函数的输出格式和条件表达式“?:”的使用。①printf函数输出时“**%\

”和“##%d\

”中的“##\

8.有以下程序:

#include<stdio.h>

main()

{ints;

scanf(\(B)

A. 66656

B. 6566456

C. 66666

D. 6666656

解析:switch语句的执行流程是:首先计算switch后面圆括号中表达式的值,然后用此值依次与各个case的常量表达式比较,若圆括号中表达式的值与某个case后面的常量表达式的值相等,就执行此case后面的语句,执行后遇break语句就退出switch语句;若圆括号中表达式的值与所有case后面的常量表达式都不等,则执行default后面的语句。然后退出。所以输入1时打印65,输入2时打印6,输入3时打印64,输入4时打印5,输入5时打印6。

9.设X为整型变量,n=14,n的地址为4000;m=6,m的地址为2000;执行语句x=&n后的结果为( )。(D)

A. 14

B. 6

C. 2000

D. 4000

解析:&是取地址运算符,表达式x=&a是表示将a的地址赋给变量x。

10.下述语句中,在字符串s1和s2相等时显示”they are Equal”的是( )。(B)

A. if(*s1==*s2)

puts(\

B. if(!strcmp(s1,s2))

puts(\

C. if(s1==s2)

puts(\

D. if(strcmp(s1,s2))

puts(\

解析:字符串比较不能用“==”,需用strcmp(s1,s2)函数,字符串s1和s2相等时返回值为0,故!strcmp(s1,s2)==1,条件成立执行后面的语句,输出they are Equal。

11.设有说Nint(*ptr)[M];其中的标识符ptr是( )。(C)

A. M个指向整型变量的指针

B. 指向M个整型变量的函数指针

C. 一个指向具有M个整型元素的一维数组的指针

D. 具有M个指针元素的一维指针数组,每个元素都只能指向整型变量

解析:根据C语言的语法规则可知,int(*ptr)[M]中的标识符ptr是一个指向具有M个整型元素的一维数组指针。

12.内聚性是对模块功能强度的衡量,下列选项中,内聚性较弱的是( )。(B)

A. 顺序内聚

B. 偶然内聚

C. 时间内聚

D. 逻辑内聚

解析:内聚是从功能角度来衡量模块的联系,它描述的是模块内的功能联系。内聚有如下种类,它们之间的内聚度由弱到强排列:

系。内聚有如下种类,它们之间的内聚度由弱到强排列:

偶然内聚——模块中的代码无法定义其不同功能的调用。但它使该模块能执行不同的功能,这种模块为巧合强度模块。

逻辑内聚——这种模块把几种相关的功能组合在一起,每次被调用时,由传送给模块的参数来确定该模块应完成哪一种功能。

时间内聚——这种模块顺序完成一类相关功能,比如初始化模块,它顺序地为变量置初值。

过程内聚——如果一个模块内的处理元素是相关的,而且必须以特定次序执行,则称为过程内聚。

通信内聚——这种模块除了具有过程内聚的特点外,还有另外一种关系,即它的所有功能都通过使用公用数据而发生关系。

顺序内聚——如果一个模块内各个处理元素和同一个功能密切相关,而且这些处理必须顺序执行,处理元素的输出数据作为下一个处理元素的输入数据,则称为顺序内聚。

功能内聚——如果一个模块包括为完成某一具体任务所必需的所有成分,或者说模块中所有成分结合起来是为了完成一个具体的任务,此模块则为功能内聚模块。

13.有以下程序:

#include<stdio.h>

int f(int x,int y)

{return((y-x)*x);}

main()

{int a=3,b=4,c=5,d;

d=f(f(a,b),f(a,c));

printf(\(D)

A. 7

B. 10

C. 8

D. 9

解析:调用f(a,b)函数返回3,调用f(a,c)函数返回6,所以外层调用f(f(a,b),f(8,c));即调用f(3,6)函数返回9。

14.有以下程序:

#include

int flint t[],int n);

main()

{int a[4]={1,2,3,4},s;

s=f(a,2);printf(\(B)

A. 4

B. 7

C. 10

D. 6

解析:本题主要考查的是函数的递归调用,子函数f是一个递归函数,所以主函数中执行f(a,2)时,其执行过程是a[3]+f(a,1)=a[3]+a[2]+f(a,0)=7。

15.下列模式中,能够给出数据库物理存储结构与物理存取方法的是( )。(A)

A. 内模式

B. 外模式

C. 概念模式

D. 逻辑模式

解析:数据库管理系统的三级模式结构由外模式、模式和内模式组成。

外模式,或子模式,或用户模式,是指数据库用户所看到的数据结构,是用户看到的数据视图。模式,或逻辑模式,是数据库中对全体数据的逻辑结构和特性的描述,是所有用户所见到的数据视图的总和。外模式是模式的一部分。内模式,或存储模式,或物理模式,是指数据在数据库系统内的存储介质上的表示,即对数据的物理结构和存取方式的描述。

16.下列叙述中正确的是( )。(A)

A. 程序执行的效率与数据的存储结构密切相关

B. 程序执行的效率只取决于程序的控制结构

C. 程序执行的效率只取决于所处理的数据量

D. 以上说法均错误

解析:程序执行的效率与数据的存储结构、数据的逻辑结构、程序的控制结构以及所处理的数据量等有关。

17.软件设计中划分模块的一个准则是( )。(B)

A. 低内聚低耦合

B. 高内聚低耦合

C. 低内聚高耦合

D. 高内聚高耦合

解析:一般较优秀的软件设计,应尽量做到高内聚,低耦合,即减弱模块之间的耦合性和提高模块内的内聚性,有利于提高模块的独立性。

18.以下正确的字符串常量是( )。(A)

A. \

B. ’abc’

C. Olympic Games

D. \\\\\\

解析:百分号\

19.若有定义语句:int x=10;,则表达式x-=x+x的值为( )。(B)

A. -20

B. -10

C. 0

D. 10

解析:单目加运算符优先级高于赋值运算符,所以先做x+x结果为20,再做x-20,结果为-10。

20.有以下程序:

#include<stdio.h>

main()

{ int c;

while((c=getchar0)!=’\n’)

{ switch(c-’3’)

{ case 0:

case 1:putchar(c+4);

case 2:putchar(c+4);break;

case 3:putchar(c+3);

case 4:putchar(c+3);break;

}}

printf(’’\n’’);}

从第一列开始输入数据(<CR>代表一个回车符):3845<CR>,则程序输出结果为( )。(A)

A. 77889

B. 77868

C. 776810

D. 77886610

解析:题中while循环的条件是:当从键盘读入的字符不是“’\n’”时,执行while循环。

输入第一个字符3时:执行case 0,什么也不输出;case 1,输出7;case 2,输出 7;遇到break语句,跳出switch语句。输入第二个字符8时“c-’3’=5”,不执行任何语句。输入第三个字符4时“c-’3’=1”,执行case 1输出8;case 2,输出8;遇到break语句,跳出switch语句。输入第四个字符5时“c-’3’=2”,执行case2,输出9;遇到break语句,跳出switch语句。

21.有以下程序

#include

void main()

{

int n=2,k=1;

while(!(k>0‖n++));

printf(“%d %d\n”,k,n);

}

程序运行后的输出结果是( )。(D)

A. 0 2

B. 1 3

C. 5 7

D. 1 2

解析:在程序中整型变量n的初始值等于2,整型变最k的初始值等于1,在执行while语句时,由于表达式k的值大于0为真,所以不再需要判断n++是甭为真,(k>0||n++)表达式的值为真。!(k、0||n++)表达式的值为假,所以while语句中的条件不满足,循环语句不会执行,变量n的值也不会加1,所在输出变量k和n的值是1和2。

22.有三个关系R、S和T如下:

(C)

A. 自然连接

B. 交

C. 除

D. 并

解析:如果S=T/R,则S称为T除以R的商。在除运算中S的域由T中那些不出现在R中的域所组成,对于S中的任一有序组,由它与关系R中每个有序组所构成的有序组均出现在关系T中。所以本题选择C。

23.以下选项中关于程序模块化的叙述错误的是( )。(A)

A. 可采用自底向上、逐步细化的设计方法把若干独立模块组装成所要求的程序

B. 把程序分成若干相对独立、功能单一的模块,可便于重复使用这些模块

C. 把程序分成若干相对独立的模块,可便于编码和调试

D. 可采用自顶向下、逐步细化的设计方法把若干独立模块组装成所要求的程序

解析:程序模块化思想中,可以采用自顶向下、逐步细化的方法。所以选项A中“自底向上”的说法是错误的。

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

A. 栈与队列都只能顺序存储

B. 循环队列是队列的顺序存储结构

C. 循环链表是循环队列的链式存储结构

D. 栈是顺序存储结构而队列是链式存储结构

解析:栈是所有的插入与删除都限定在表的同一端进行的线性表;队列是指允许在一端进行插入,而在另一端进行删除的线性表,二者既可以顺序存储也可以链式存储。为了充分地利用数组的存储空间,把数组的前端和后端连接起来,形成一个环形的表,称为循环队列,因此循环队列是队列的一种顺序存储结构。

25.有以下程序:

#include

main()

{ FILE*fp;int a[10]={1,2,3,0,0},i;

fp=fopen(\(D)

A. 1,2,3,0,0,0,0,0,0,0,

B. 1,2,3,1,2,3,0,0,0,0,

C. 123,0,0,0,0,123,0,0,0,0,

D. 1,2,3,0,0,1,2,3,0,0,

解析:首先用函数fopen()以“wb”的方式打开文件“d2.dat”,然后调用两次fwrite函数将数组a的5个元素,依次输出到文件fp中(共10个字节),然后关闭文件。再次打开文件,使用文件指针指向文件的开头,调用tread函数从文件fp中读取这10个字节的数据到数组a中,此时数组a的内容就变为{1,2,3,0,0,1,2,3,0,0},因此最后的输出结果为“1,2,3,0,0,1,2,3,0,0”。

26.定义结构体数组

struct stu

{ int num;

char name[20];

}x[5]={1,\(A)

A. 2A3N4E5O

B. 1H213U4E

C. 1A2N3E4O

D. 1A2N3E4O

解析:本题主要考查结构体数组。x[i].num是结构体x[i]中的num成员,x[i].name[2]是结构体x[i]中name成员的第3个元素。第一次循环,i=l,输出x[1].num,x[1].name[2]的值,即2A;第二次循环,i=2,输出x[2].num,x[2].name[2]的值,即3N;第三次循环,i=3,输出x[3].num,x[3].name[2]的值,即4E;第四次循环,i=4,输出x[4].num,x[4].name[2]的值,即50。

27.下列叙述中正确的是( )。(C)

A. 在栈中,栈中元素随栈底指针与栈顶指针的变化而动态变化

B. 在栈中,栈顶指针不变,栈中元素随栈底指针的变化而动态变化

C. 在栈中,栈底指针不变,栈中元素随栈顶指针的变化而动态变化

D. 以上说法都不正确

解析:栈是先进后出的数据结构,在整个过程中,栈底指针不变,入栈与出栈操作均由栈顶指针的变化来操作,所以选择C

28.下列关于C语言数据文件的叙述中正确的是( )。(D)

A. 文件由ASCII码字符序列组成,C语言只能读写文本文件

B. 文件由二进制数据序列组成,C语言只能读写二进制文件

C. 文件由记录序列组成,可按数据的存放形式分为二进制文件和文本文件

D. 文件由数据流形式组成,可按数据的存放形式分为二进制文件和文本文件

解析:本题考查数据文件的基本概念。①文件由数据流形式组成,可以按数据的存放形式分为二进制文件和文本文件;②C语言既能读写文本文件,又可以读写二进制文件。

29.为了建立如图所示的存储结构(即每个结点含两个域,data是数据域,next是指向结点的指针域)则在( )处填入的选项是( )。

(A)

A. structlink*next;

B. linknext;

C. link*next;

D. strucflinknext;

解析:存储结构用链式存储。链式结构每个节点有个指针域,指针域指向下一个链式结构的节点,因此指针域的结构应该是该结构形式,因此应定义为struct link*next,故答案为A选项。struct是结构体的说明符,不能省略。

30.以下叙述中错误的是( )。(A)

A. 可以给指针变量赋一个整数作为地址值

B. 函数可以返回地址值

C. 改变函数形参的值,不会改变对应实参的值

D. 当在程序的开头包含头文件stdio.h时,可以给指针变量赋NULL

解析:

31.有以下程序:

#include<stdio.h>

main()

{ int i;

for(i=1;i<=40;i++)

{ if(i++%5==0)

if(++i%8:=O)pfintf(’’%d’’,i);

}

printf(’’\n’’);

}

程序执行后的输出结果是( )。(A)

A. y=-1

B. y=0

C. y=1

D. while构成无限循环

解析:y–表示y使用后再自减1。所以最后一次y的值为0,条件不成立但仍要执行自减操作,y的值为一1,跳出循环。打印y的值-1。

32.有以下程序:

#include<stdio.h>

int m=1,n=2;

void sub1(int m,int n)

{m+=2;n++;}

void sub2()

{m++;n+=2;}

main()

{printf(\(A)

A. 1,2,1,2,2,4

B. 1,2,6,6,7,8

C. 1,2,2,4,2,4

D. l,2,6,6,2,4

解析:全局变量与函数体内局部变量同名时,局部变量会覆盖全局变量,因此在subl()函数内,全局变量m,n是不可见的,在函数sub1()对m,n操作的是局部变量,对全局变量不产生影响。但在sub2()函数内,由于没有和全局变量变量重名,因此在此函数内,m,n是可见的。因此,第一个printf()打印的是全局变量m,n,故打印的是1,2,第二个printf(),调用sub1(),没有修改全局变量m,n.故打印的是1,2,第三个printf(),之前调用了sub2(),修改了全局变量m,n。因此,打印的是2,4。故答案为A选项。

33.C语言中的数组定义语句中不正确的是( )。

B

解析:定义数组时一维数组可以不指定列数,二维数组可以不指定行数,系统将根据输入的数据来决定,但如果指定了具体的行列数,赋值时就必须按照行列数输入,选项B定义了2行但输入却是3行,所以错误。

34.有以下程序

#include <stdio.h>

main()

{

int sum, pad, pAd;

sum = pad = 5;

pAd = ++sum, pAd++, ++pad;

printf(\(B)

A. 5

B. 6

C. 7

D. 8

解析:C语言区分大小写,pad与pAd是两个不同的变量,首先将5赋值给两个变量,由于赋值运算符的优先级高于逗号运算符,所以计算pAd=++sum,此时pAd为6,sum也为6,然后计算pAd++,pAd的值变为7,++pad,pad的值变为6,所以选择B。

35.以下选项中叙述正确的是(A)

A. char c1, c2, *c3, c4[40]; 是合法的变量定义语句

B. 数组说明符的一对方括号中只能使用整型常量,而不能使用表达式

C. 数组下标的下限可以是负值

D. 若有数组定义 float array[4]; 则语句 printf(\

解析:A选项正确定义了字符变量c1、c2,字符型指针c3,字符型一维数组c4[40],A选项正确。\

36.以下选项中叙述正确的是(A)

A. 文件指针是指针类型的变量

B. 文件指针可同时指向不同文件

C. 文件指针的值是文件在计算机磁盘中的路径信息

D. 调用fscanf函数可以向文本文件中写入任意字符

解析:所谓文件指针,实际上是指向一个结构体类型的指针变量,这个结构体中包含有文件的一些信息,如缓冲区的地址,在缓冲区中当前存取的字符的位置,对文件是\

37.算法应当具有的特性不包括(D)

A. 可行性

B. 有穷性

C. 确定性

D. 美观性

解析:一个算法应该具有以下五个重要的特征:有穷性,确定性,输入,输出以及可行性,故答案选D选项。

38.某棵树中共有25个结点,且只有度为3的结点和叶子结点,其中叶子结点有7个,则该树中度为3的结点数为(A)

A. 不存在这样的树

B. 7

C. 8

D. 6

解析:树是一种简单的非线性结构,直观地来看,树是以分支关系定义的层次结构。在树结构中,一个结点所拥有的后件个数称为该结点的度,所有结点中最大的度称为树的度。首先假设这样的树是存在的,由于只有度为3的结点和叶子结点,可知最后一层都为叶子结点,倒数第二层一部分结点的度为3,一部分结点为叶子结点。结点总数为25,叶子结点有7个,则度为3的结点有18个,由于(34-1-1)/2<18<(35-1-1)/2可知,树共有5层,前三层有度为3的结点(34-1-1)/2=13个,第四层有34-1=27个结点,其中5个是度为3的结点,22个是叶子结点,此时与题目给出的叶子结点有7个相矛盾,故不存在这样的树。故选择A选项.

39.以下选项中,合法的C语言实数是(C)

A. E4.8

B. 4.3e0.2

C. 4.00E-01

D. 0.29E

解析:C语言\

40.有以下程序

#include <stdio.h>

int m1(int x, int y )

{ if( x<= y ) return 2*x+1;

else return y;

}

int m2(int x, int y )

{ if( x<= y ) return 2*y+1;

else return x;

}

main()

{ int i, t1=10, t2=0;

for( i=1; i<=4; i++ )

{ t1=m1( i,t1 ); t2=m2( i,t2 ); }

printf(\(A)

A. t1=9 t2=4

B. t1=4 t2=9

C. t1=9 t2=9

D. t1=1 t2=4

解析:函数m1(x,y),若x<y,返回2*x+1,否则返回y, 函数m2(x,y),若x<=y,返回2*y+1,否则返回x,for循环对t1=m1(i,t1),执行4次,可知答案为9,t2=m2(i,t2), 执行4次,可知答案为4,因此答案为A选项。

程序填空题

41.给定程序中,函数fun的功能是:求ss所指字符串数组中长度最短的字符串所在的行下标,作为函数值返回,并把其串长放在形参n所指变量中。ss所指字符串数组中共有M个字符串,且串长<N。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

1 #include<stdio.h>

2 #include<string.h>

3 #define M 5

4 #define N 20

5 int fun(char(*ss)[N],int *n)

6 { int i,k=0,len=N;

7 /**********found**********/

8 for(i=0;i< __1__;i++)

9 {len=strlen(ss[i]);

10 if(i==0) *n=len;

11 /**********found**********/

12 if(len __2__ *n)

13 {* n=len;

14 k=i ;

15 }

16 }

17 /**********found**********/

18 return(__3__);

19 }

20 main()

21 { char ss[M][N]={’’shanghai’’,’’guangzhou’’,’’beijing’’,’’tianjing’’,’’chongqing’’};

22 int n,k,i;

23 printf(’’\nThe original strings are:\n’’);

24 for(i=0;i<M;i++)puts(ss[i]);

25 k=fun(ss,&n);

26 printf(’’\nThe length of shortest string is:%d\n’’,n);

27 printf(’’\nThe shortest string is:%s\n’’,ss[k]);

28 }

(1)M (2)< (3)k

解析:第一空:循环的目的是在M个字符串中寻找长度最短的字符串,因此循环变量i从0变化到“M-1”,故第一空处应为“M”。

第二空:“*n”记录最小字符串的长度,由审题分析可知,字符串ss[i]长度比min小,则交换最小长度值和下标位置,故第二空处应为“<”。

第三空:变量k记录了最小字符串的下标位置,函数的返回值是最短的字符串所在的行下标,故第三空处应为“k”。

程序修改题

42.下列给定程序中,函数fun的功能是:计算并输出下列级数的前N项和SN,直到SN+1的值大于q为止,q的值通过形参传入。

(1)s=s+(double)(n+1)/n; (2)return t;

解析:(1)在C语言中,整数除以整数得出的结果也是整数,因此此处要转换数据类型。

(2)观察while循环,如果返回变量是s,那么返回的是大于q的值,而题中所要返回的是小于q的值,所以应该返回变量t。

程序设计题

43.编写函数fun,其功能是:求Fi-bonacci数列中大于t的最小的数,结果由函数返回。Fibonacci数列F(n)的定义为:

F(0)=0,F(1)=1

F(n)=F(n-1)+F(n-2)

例如,当t=1000时,函数值为1597。

注意:部分源程序给出如下。

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

试题程序:

1 #include<conio.h>

2 #include<math.h>

3 #include<stdio.h>

4 int fun (int t)

5 {

6

7 }

8 main()

9 {

10 int n ;

11 n=1000;

12 printf(’’n=%d,f=%d\n’’,n,fun(n));

13 }

1 int fun(int t)

2 {

3 int f0=0,f1=1,f;

4 do{

5 /*根据Fiborlacci数列的定义求数值*/

6 f=f0+f1;

7 f0=f1;f1=f;

8 } while(f<t);/*如果求的数值小于t则继续*/

9 return f;

10 }

解析:根据所给数列定义不难发现,该数列最终的结果是由两个数列之和组成,所以可以在循环内部始终把f看成是前两项之和,而f0始终代表第n-2项,f1代表第n-1项。退出循环时得到的数f,就是大于指定数的最小的数。

资源下载《国家二级(C语言)机试模拟试卷194附答案解析.doc》 文档下载价格为20下载币,请先
将本套试题Word文档或文章下载到电脑,方便收藏和打印
资源下载
《国家二级(C语言)机试模拟试卷194附答案解析.doc》
试题含答案和解析word文档下载价格:20 下载币
《国家二级(C语言)机试模拟试卷194附答案解析.doc》
试题含答案和解析word文档VIP优惠:免费
将本套试题Word文档或文章下载到电脑,方便收藏和打印
0

评论0

没有账号? 注册  忘记密码?