国家二级(C语言)机试历年真题试卷汇编30附答案解析

国家二级(C语言)机试历年真题试卷汇编30

选择题

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

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

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

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

D. 以上说法均错误

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

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

A. 栈

B. 树

C. 队列

D. 二叉树

解析:在高级语言中,函数的调用是通过栈来实现的。在进行函数调用时,系统将所需的信息压入栈中,如函数的局部变量、返回值等。每个函数的状态是由函数中的局部变量、函数参数值、函数的返回值地址决定的,存储这些信息的数据区域称为活动记录,或叫做栈帧,它是运行时系统栈上分配的空间。

3.下列叙述中正确的是( )。(D)

A. 栈是“先进先出”的线性表

B. 队列是“先进后出\

C. 循环队列是非线性结构

D. 有序线性表既可以采用顺序存储结构,也可以采用链式存储结构

解析:栈是“先进后出”的线性表,队列是“先进先出”的线性表,循环队列链式存储的线性表,也是线性结构。有序的线性表既可采用顺序存储结构,也可以采用链式存储结构。

4.某二叉树有5个度为2的结点,则该二叉树中的叶子结点数是( )。(C)

A. 10

B. 8

C. 6

D. 4

解析:由二叉树的性质可得,对于一个非空的二叉树,叶子结点数等于度为2的结点数目加1。

5.下列排序方法中,最坏情况下比较次数最少的是( )。(D)

A. 冒泡排序

B. 简单选择排序

C. 直接插入排序

D. 堆排序

解析:冒泡排序,简单选择排序,直接插入排序在最坏情况下的比较次数都是O(n2),而堆排序的时间复杂度为O(nlog2n)。

6.将E-R图转换为关系模式时,实体和联系都可以表示为( )。(C)

A. 属性

B. 键

C. 关系

D. 域

解析:E-R图转换为关系模式时,实体和联系都可以表示为关系。

7.数据库应用系统中的核心问题是( )。(A)

A. 数据库设计

B. 数据库系统设计

C. 数据库维护

D. 数据库管理员培训

解析:数据库应用系统是在数据库管理系统(DBMS)支持下建立的计算机应用系统。数据库设计是数据库应用系统中的核心问题。

8.下面叙述中错误的是( )。(A)

A. 软件测试的目的是发现错误并改正错误

B. 对被调试的程序进行“错误定位”是程序调试的必要步骤

C. 程序调试通常也称为Debug

D. 软件测试应严格执行测试计划,排除测试的随意性

解析:软件测试是为了发现软件中的错误,但最终目的不是改正错误,而是开发出高质量的完全符合用户需要的软件。

9.软件按功能可以分为:应用软件、系统软件、支撑软件(或工具软件)。下面各项中属于应用软件的是( )。(C)

A. 编译程序

B. 操作系统

C. 教务管理系统

D. 汇编程序

解析:系统软件主要包括:①操作系统软件;②各种语言的解释程序和编译程序;③各种服务性程序;④各种数据库管理系统。操作系统、编译程序与汇编程序属于系统软件,编译程序与汇编程序也称为支撑软件,而教务管理系统属于应用软件。

10.耦合性和内聚性是对模块独立性度量的两个标准。下列叙述中正确的是( )。(B)

A. 提高耦合性、降低内聚性有利于提高模块的独立性

B. 降低耦合性、提高内聚性有利于提高模块的独立性

C. 耦合性是指一个模块内部各个元素间彼此结合的紧密程度

D. 内聚性是指模块问互相连接的紧密程度

解析:耦合性是指模块间互相连接的紧密程度,内聚性是指一个模块内部各个元素间彼此结合的紧密程度。提高内聚性、降低耦合性是提高模块独立性的方法。

11.有两个关系R,S如下:

(B)

A. 选择

B. 投影

C. 插入

D. 连接

解析:关系S是由关系R的第1、2列的元组组成,很显然这是对关系R进行投影运算的结果。可以简单理解为:选择运算是对行的操作,投影运算是对列的操作。投影是指将对象转换为一种新形式的操作,该形式通常只包含那些将随后使用的属性。由选择、投影、插入、连接的定义可知,本题所使用的运算是投影。

12.以下说法中正确的是( )。(C)

A. C语言程序总是从第一个定义的函数开始执行

B. 在C语言程序中,要调用的函数必须在main()函数中定义

C. C语言程序总是从main()函数开始执行

D. C语言程序中的main()函数必须放在程序的开始部分

解析:C语言的陧序是由主函数main()开始运行;由主函数来调用其他函数.函数必须是并列的,定义后才能使用,不能在一个函数中定义其他函数;main()函数不一定要放在程序的执行部分,故C选项正确。

13.设函数中有整型变量n,为保证其在未赋值的情况下初值为0,应选择的存储类别是( )。(C)

A. auto

B. register

C. static

D. auto或register

解析:静态存储类型定义变量在未对其初始化时会对其初始化默认值,其中int型的默认初始化值是O.其他选项的存储类型不能保证变量在未赋值情况的初值。

14.若有以下定义:

int x[10],*pt=x;

则对x数组元素的正确引用是( )。(B)

A. *&x[10]

B. *(x+3)

C. *(pt+10)

D. pt+3

解析:数组的下标是从0开始的,故x[10]实际上具体为x[0],x[1],…,x[9],而若使用x[10]就会溢出,编译出错。所以AC两项错误;D项是指向地址的.并未引用到元素;B项的表达正确,代表x[3]中的元素。

15.有以下程序:

#include<stdio.h>

main()

{

int a=5,b=1,t;

t=(a<<2)|b;

printf("%d\n",t);

{

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

A. 21

B. 11

C. 6

D. 1

解析:本题解题方法有如下两种:①位运算最常规的方式是转换为二进制,然后再运算。5的二进制是101,在<<2后为10100,然后和00001进行或运算后等于1 0 1 0 1,其十进制为21;②a<<2即为a*4,结果为20,1相当于保证这个数是奇数.若不是则加1,所以为21。

16.有以下程序:

#include<stdio.h>

struct ord{

int x,y;}dt[2]={1,2,3,4};

main()

{

struct ord*p=dt;

printf("%d,"++p一>x):

printf("%d\n",++p一>y);

}

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

A. 1,2

B. 2,3

C. 3.4

D. 4,1

解析:dt是一个结构体数组,所以初始化的结果为dt[0]={1,2},dt[1]={3,4}。*p=dt;,表示p指向dt[0]。++p一>x中,一>的优先级大于++,所以这个表达式等价于++(p一>x),因为p一>x为1,所以这个值为2,同理.第二个++p一>y的值为2+1=3。

17.以下函数按每行8个输出数组中的数据:

void fun(int*w int n)

{int i;

for(i=0;i<n;i++)

{

______________

printf("% d".w[i]);

}

printf("\n");

}

下画线处应填入的语句是( )。(C)

A. if(i/8==0)printf("\n");

B. if(i/8==0)continue:

C. if(i%8==0)printf("\n");

D. if(i%8==0)continue:

解析:每行输出8个数组数据后输入一个换行,所以应该采取对8取余的方法,余数循环一次便换行一次,所以语句为if(i%8==0)printf("\n");。

18.有以下程序:

#include<stdio.h>

int b=2;

int fun(int*k)

{

b=*k+b:

return(b);

}

main()

{

int a[10]={1,2,3,4,5,6,7,8},i;

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

{

b=fun(&a[i])+b:

printf("%d",b);

}

printf("\n");

}

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

A. 1012

B. 810

C. 1028

D. 1016

解析:因为int是全局变量。所以它的值在整个程序结束时才会消失。for循环第一次i=2,a[i]=3,所以fun(&a[i])=3+2=5,这时b为5,所以b=fun(&a[i])+b=5+5=1 0。第二次循环时,b=10,然后fun(&a[i]),代入a[i]=4,这时fun(&a[i])=10+4=14,所以b=fun(&a[i])+b=14+14=28。

19.有以下程序(注意:字母a的ASCII码值为97):

#include<stdio.h>

void fun(char*S)

{

while(*s)

{

if(*s%2==0)

printf("%",*s):

s++:

}

)

main()

{

char a[]=("good");

fun(a);printf("\

");

}

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

A. d

B. go

C. god

D. good

解析:good中g的ASCII码值为103,o的ASCII码值为111,d的ASCII码值为100。在fun函数中,if(*s%2==0)语句会挑选出ASCII码值为偶数的字母。在good中,只有d的ASCII码值为偶数,所以结果为d。

20.有以下程序:

#include<stdio.h>

main()

{

FILE*f;

f=fopen("filea.txt","w");

fprintf(f,"abc"):

fclose(f):

}

若文本文件filea.txt中原有内容为:

hello,则运行以上程序后,文件filea.txt中的内容为( )。(C)

A. helloabc

B. abelo

C. abc

D. abchello

解析:fopen(”filea.txt”,”w”);表示以写的形式打开filea.txt,fprintf(f,”abc”);是先将文件清空再写入。所以本题是将abc写入filea.txt。

21.有以下程序:

#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\n",d);

}

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

A. 10

B. 9

C. 8

D. 7

解析:主函数中语句d=f(f(a,b),f(a,c));用函数的返回值做参数,所以首先计算f(a,b]),代入a=3,b=4.得3,然后计算f(a,c),代入a=3,c=5得6,所以d==f(f(a,b),f(a,c));,即为计算d=f(3,6),值为9。

22.有以下程序:

#include<stdio.h>

main()

{

int a1,a2;char cl,c2;

scanf("%d%c%d%c",&al,&c1,

&a2,&c2):

printf("%d,%c,%d,%c\n",a1,c1,a2,c2):

}

若想通过键盘输入,使得a1的值为12,a2的值为34,c1的值为a,c2的值为b,程序

输出结果是:12.a,34,b。则正确的输入格式是(以下一代表空格,<CR>代表回车)( )。(A)

A. 12a_34b<CR>

B. 12_a_34_b<CR>

C. 12_a_34_b<CR>

D. 12_a34_b<CR>

解析:该题可通过程序运行的输出结果判断输入情况。因为scanf()函数输入的形式是只有c1和a2之间有空格,没有别的符号,故运行程序后,输入的时候al和c1之间、a2和c2之间没有空格,在输入cl后,应先输入一个空格,再输入a2,所以A选项符合题意。

23.设有宏定义;#define IsDIV(k,n)((k%n==1)?l:0),且变量m已正确定义并赋值。则宏调用:IsDIV(m,5)&&IsDIV(m,7)为真时所要表达的是( )。(D)

A. 判断m是否能被5或者7整除

B. 判断m是否能被5和7整除

C. 判断m被5或者7整除是否余1

D. 判断m被5和7整除是否都余1

解析:IsDIV(m,5)&&IsDlV(m,7)都为真,即表达式((m%5==1)?1:0)结果为1,且表达式((m%7==1)?1:0)结果也为1,因为m%5,m%7都等于1,所以题目表达的是,判断m被5和7整除是否都余1。

24.有以下程序:

#include<stdio.h>

void fun(int*p,int*q)

{ p=p+1:*q=*q+1;}

main()

{

int m=1,n=2.*r=&m;

fun(r.&n):

printf("%d,%d\n",m,n);

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

A. 1,3

B. 2,3

C. 1,4

D. 1,2

解析:本题中p=p+1;语句只改变指针p的地址,跟p内容无关,所以m值没有改变。而*q=*q+1;语句中q地址指针指向的内容改变了n值,所以n变为3。

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

C

解析:字符串的输入有两种方式:①scanf()函数;②get()函数。C项中,s代表输入一个字符数组而非地址,而且遇到空格时会默认字符串输入结束,所以不能读入带有空格的字符串。

26.若有如下定义语句:

dou ble x.y,*px,*py;

执行了px=& x;py=&y;之后,正确的输入语句是( )。(C)

A. scanf("%f%f",x,y);

B. scanf("%f%f"&,x,&y);

C. scanf("%1 f%1 e",px,py);

D. scanf("%1 f%1 f",x,y);

解析:输入函数scanf的标准格式是:scanf(格式控制,地址列表),AD两项中地址列表格式不正确,应为&x,&y。格式控制和地址列表间应该用逗号隔开,B项也错误。

27.以下选项中证确的语句组是( )。(D)

A. char s[];s="BOOK!";

B. char*s;s={"BOOK!"};

C. char s[10];s="BOOK!";

D. char*s;s="BOOK!";

解析:AC两项错误,因为s是数组首地址,并非字符串变量;B项,s为字符串变量,赋值方式却为数组方式,故错误。D中先定义一个字符串变量,然后将变量指向一个字符串常量,语句正确。

28.有以下程序:

#include<stdio.h>

void fun(int*a,int*b)

{

int*c:

c=a:a:=b;b=c;

}

main()

{

int x=3,y=5,*p=&x,*q=&y;

fun(p,q);

printf("%d%d",*P,*q);

fun(&x,&y);

printf("%d%d\n",*P,*q);

}

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

A. 3 5 5 3

B. 3 5 3 5

C. 5 3 3 5

D. 5 3 5 3

解析:在C语言中函数参数传递的功能是“传值”,即形参和实参是两个没有关系的变量。本题函数的形参虽然为指针变量,但是函数内部交换的是地址值,而不是地址值所指向的函数值,所以不会传递给实参,因此交换函数并没有交换p、q所指向的值。

29.以下选项中,能用作数据常量的是( )。(D)

A. O115

B. 0118

C. 1—5e1.5

D. 115L

解析:C语言中实型常量有两种表示:小数形式和指数形式。在指数形式中,字母e(或E)之前必须要有数字,且e或E后面的指数必须为整数,故C项错;八进制整数常量以数字0开始,而不是O,故A项错。而在八进制数中的有效数字为0~7,故B项错。

30.以下是if语句的基本形式:

(表达式)语句

其中“表达式”( )。(D)

A. 必须是逻辑表达式

B. 必须是关系表达式

C. 必须是逻辑表达式或关系表达式

D. 可以是任意合法的表达式

解析:if中的表达式一般是关系表达式或逻辑表达式,用于描述选择结构的条件,但也可以是其他类型表达式,在其值非零时为真,所以任意合法的表达式都可以做if语句的判断条件。

31.有以下程序:

#include<stdio.h>

main()

{

int x;

scanf("%d",&x);

if(x<=3);

else if(x!=10)

printf("%d\n",x);

}

程序运行时,输入的值在哪个范围内才会有输出结果?( )(B)

A. 不等于10的整数

B. 大于3且不等10的整数

C. 大于3或等于10的整数

D. 小于3的整数

解析:第一个if有一个else语句,若x<=3,就什么也不做,若x>3,则进入else语句中,在else语句中只有当x!=10时才会有输出结果,所以输入的值的范围应为大于3且不等于10的整数。

32.若函数中有定义语句:int k;则( )。(B)

A. 系统将自动给k赋初值0

B. 这时k中的值无定义

C. 系统将自动给k赋初值一1

D. 这时k中无任何值

解析:int k;这条语句是定义一个整型变量k,是动态定义,所以k中的值无定义。如果采用静态定义,则会自动初始化变量为默认值1。

33.设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是( )。(D)

A. n=0;while((ch=getchar())!="n")n++:

B. n=0;while(getchar()!="\n";n++);

C. for(n=0;getchar()!="\n";n++);

D. n=0;for(ch=getchar()!="\n";n++);

解析:要统计一行中输入字符个数(不包含回车符)的程序实现,首先定义一个用作统计的变量n,赋初值为0;因为字符结束应该有换行符,所以该行字符是否结束的判断条件应为getchar()!=“\n”;for循环中用括号括起来的3个表达式之间要用分好隔开,其中表达式可以省略,但分号必须保留,故D选项错误。

34.有以下程序:

#include<stdio.h>

main()

{

int a=1,b=2,c=3,d=0;

if(a==1&&b++==2)

if(b!=2 || c!=3)

printf("%d%d%d\n",a,b,c);

else

printf("%d%d%d\n",a,b,c);

}

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

A. 1 2 3

B. 1 3 2

C. 1 3 3

D. 3 2 1

解析:首先a=1,b=2,c=3,d=0;因为a为1,b++本身为b加之前的值,即b++为2,所以第一个if语句的判断条件为真,进入if语句。b经过b++运算后值为3,所以第二个if语句为真(或运算时,一个为真,整体都为真,并且第一个为真时第二个不会被执行运算),这时后面的运算都忽略。

35.有以下程序(注意:字母A的ASCII码值为65):

#include<stdio.h>

main()

{

char*s={"ABC"};

do{

printf("%d",*s%10);

}while(*s++);

}

程序运行后的结果是( )。(A)

A. 5670

B. 656667

C. 567

D. ABC

解析:考查字符串的存储方式,C语言中字符串存储是以字符数组形式,每个字符串存储会在后面加\0再存储,\0对应ASCII值为0,最后一次是0%10,值为0,结果为5670。

36.以下选项中合法的标识符是( )。(C)

A. 1_1

B. 1–1

C. _11

D. 1__

解析:C语言中标识符的命名规则:标识符由字母、数字和下画线组成,并且第一个字符必须是字母或下画线,而不可以是数字。

37.有以下程序:

#include<stdio.h>

main()

{

int i:

char*a[]={"abcd","ef","gh","ijk"};

for(i=0;i<c4;i一+)

printf("%c",*a[i]);

}

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

A. aegi

B. dfhk

C. abcd

D. abcdefghijk

解析:char*a[]定义了一个指向数组的指针。由题中初始化结果得:*a[0]=“abcd”,a[1]=“ef”,a[2]=“gh”,a[3]=“ijk”,但是在输出语句时要求输出的格式是%c,为一个字符,所以每个元素输出第一个字符.即aegi。

38.有如下程序段:

int X=12:

double y=3.141593;

printf("%d%8.6f",x,y);

则输出结果是( )。(A)

A. 123.141593

B. 123.141193

C. 12,3.141593

D. 123.1415930

解析:输出的x与y间没有空格,“%8.6f”代表输出字符型数据y的格式应为小数点后保留6位。

39.设有定义:int x=2;,则以下表达式中,值不为6的是( )。(D)

A. x*=x+1

B. x++,2*x

C. x*=(1+x)

D. 2*x,x+=2

解析:A项,因为赋值运算优先级最低,所以先做x+1,此时x为3.然后再x*=3,所以为x=2*3=6;B项,x++得3然后2*x得6;C项与A项原理一致。2*x虽然结果为4,但未有赋值.此时x的值仍为2,所以最终为4。

40.有以下程序:

#include<stdio.h>

int fun(int x,int y)

{

if(x==y)return(x):

else return((x+y)/2);

}

main()

{

int a=4,b=5,c=6:

printf("% d\n",fun(2*a,fun(b,c)));

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

A. 3

B. 6

C. 8

D. 12

解析:fun的功能是求两数的平均数,并且参数和结果都为整型。题中是用一个函数作为另一个函数的参数,所以应该先做里面嵌套的函数即fun(b,c),值为5。fun(2*a,fun(b,c))即为计算fun(2*4,5),所以结果为(5+8)/2=6。

程序填空题

41.函数fun的功能是:计算1+x+

(1)1.0

(2)1

(3)i

解析:本题考查:累加、累乘;复合赋值运算;变量赋初值;for循环条件。

填空1:本题要求给doubk型变量t赋初值,从for循环中我们知道,t用来存放累乘的结

果,因此t的初值应该为1。

填空2:考查for循环变量的范围.注意本题要求计算r(x)的前n项,即计算:1+x+所以循环变量i应从1递增至n一1,因此此空应填1。

填空3:t用来存放每次循环增量,分析公式可知,后一项总是在前一项的基础上乘以一个

程序修改题

42.下列给定程序中,fun函数功能是:将n个无序整数从小到大排序。请改正程序中的错误,使它能得出正确的结果。

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

试题程序:

#include<stdio.h>

#include<stdlib.h>

fun(int n,int*a)

{

int i,j,P,t;

for(i=0;j<n一1;j++)

{

p=j;

/* * * * * *found* * * * * */

for(i=j+1;i<n一1;i++)

if(a[p]>a[i])

/* * * * * *found* * * * * */

t=i:

if(P!=j)

{

t=a[j];a[j]=a[p];a[p]=t;

}

}

}

putarr(int n,int*z)

{

int i:

for(i=1;i<=n;i++,z++)

{

printf("%4d",*z);

if(!(i%0 10))printf("\

");

}

printf("n"):

}

main()

{

int aa[20]={9,3,0,4,1,2,5,6,8,

10,7},n=11;

printf("Before sorting%d numbers:

\n",n);

putarr(n,aa);

fun(n,aa);

printf("After sorting%d numbers:

\

",n);

putarr(n,aa);

}

(1)for(i=j+1;i<n;i++)

(2)p=i;

解析:本题考查:for循环语句;需明确各个变量含义。

该程序是对n个无序数实现从小到大的排序,先找出整数序列的最小项,置于指针第1个元素的位置;再找出次小项,置于第2个元素的位置;之后顺次处理后续元素。

(1)数组的长度为n,所以最后一个元素的下标值为n一1,i的取值范围应该包括此下标值。

(2)p是中间变量,存放值较小的元素下标。

程序设计题

43. 编写函数int fun(int lim,int aa[MAX]),其功能是求出小于或等于lim的所有素数并放在aa数组中,并返回求出的素数的个数。

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

试题程序:

#include<conio.h>

#include%<stdio.h>

#include%<stdlib.h>

#define MAX 100

int fun(int lim,int aa[MAX])

{

}

void main()

{

FILE*wf:

int limit,i,sum;

int aa[MAX];

system("CLS"):

printf("输入一个整数:");

scanf("%d",&limit);

sum=fun(limit,aa);

for(i=0;i<sum;i++)

if(i%10==0&&i!=0)/*每行输出10个数*/

printf("\n");

printf("%5d",aa[i]);

/* * * * * * * * * * * */

wf=fopen("out.dat","w");

sum=fun(15,aa):

for(i=0:i<sum;i++)

if(i%10==0 8&i!=0)/*每行输出10个数*/

fprintf(wf,"\n");

fprintf(wf,"%5d",aa[i]);

}

fclose(wf):

/* * * * * * * * * * * */

int fun(int lim,int aa[MAX])

{

int i,j,k=0;

for(i=2;i<=lim;i++)/*求出小于或等于lim的全部素数*/

{

for(j=2;j<i;j++)

if(i%j==0)break;

if(j>=i)

aa[k++]=i;/*将求出的素数放入数组aa中*/

}

return k;/*返回所求出的素数的个数*/

}

解析:本程序使用for循环语句查找小于lim的所有数,使用内嵌的循环判断语句判断该数是否为素数。在做这道题时,需要重点掌握素数的判定方法:

for(j=2;j<i;j++)

if(i%j==0)break;

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

评论0

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