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

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

选择题

1.设有定义:

char p[]={’1’,’2’,’3’},*q=p;

以下不能计算出一个char型数据所占字节数的表达式是( )。(C)

A. sizeof(*q)

B. sizeof(char)

C. sizeof(p)

D. sizeof(p[0])

解析:数组名表示该数组的首地址,是一个地址常量,所以sizeof(p)求得的是一个地址占用的字节数,即4个字节,答案选C。

2.下列关于线性链表的描述中,正确的是( )。

I、只含有一个指针域来存放下一个元素地址

II、指针域中的指针用于指向该结点的前一个或后一个结点(即前件或后件)

III、结点由两部分组成:数据域和指针域。(D)

A. 仅I、II

B. 仅I、III

C. 仅II、III

D. 全部

解析:在定义的链表中,若只含有一个指针域来存放下一个元素地址,称这样的链表为单链表或线性链表。在链式存储方式中,要求每个结点由两部分组成:一部分用于存放数据元素值,称为数据域;另一部分用于存放指针,称为指针域。其中指针用于指向该结点的前一个或后一个结点(即前件或后件)。

3.设a和b均为int型变量,且a=6、b=11、c=3,则能使值为3的表达式足( )。(D)

A. b%(c%4)

B. b%(c-a%5)

C. b%a-a%5

D. (b%a)-(a%4)

解析:选项D括号内的运算分别是b%a=11%6=5和a%c=6%4=2,最后得到5-2=3。

4.以下各项中,能正确表述算式sin(2πr+30°)的C语言表达式是( )。(C)

A. sin(2*π*r+30)

B. sin(2*3.14*r+30)

C. sin(2*3.14*r+3.14*30/180.0)

D. sin(2*3.14*r+30*3.14/360.0)

解析:考查算术表达式的写法,选项C中没有,π,需要用数值3.14代替,sin函数的参数为弧度,角度30转成弧度应为3.14*30/180。故应选C。

5.对于循环队列,下列叙述中正确的是( )。(D)

A. 队头指针是固定不变的

B. 队头指针一定大于队尾指针

C. 队头指针一定小于队尾指针

D. 队头指针可以大于队尾指针,也可以小于队尾指针

解析:循环队列的队头指针与队尾指针都不是固定的,随着入队与出队操作要进行变化。因为是循环利用的队列结构所以队头指针有时可能大于队尾指针有时也可能小于队尾指针。

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

A. 如果企图通过一个空指针来访问一个存储单元,将会得到一个出错信息

B. 即使不进行强制类型转换,在进行指针赋值运算时,指针变量的基类型也可以不同

C. 设变量p是一个指针变量,则语句p=0;是非法的,应该使用p=NULL;

D. 指针变量之间不能用关系运算符进行比较

解析:空指针意味着该指针没有指向任何具体的变量,所以不能访问一个存储单元,选项A正确。指针的赋值运算只能在同一数据类型之间进行,故选项B错。语句p=0和p=NULL是一样的,都是把一个空指针赋给指针变量p,故选项C错。指针之间能进行关系运算,比较的是地址值的大小,选项D错。答案选A。

7.下列不属于软件工程3个要素的是( )。(D )

A. 工具

B. 过程

C. 方法

D. 环境

解析:软件工程包括3个要素,即方法、工具和过程。方法是完成软件工程项目的技术手段;工具支持软件的开发、管理、文档生成;过程支持软件开发的各个环节的控制、管理。

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

A. C程序可以由多个程序文件组成

B. 一个C语言程序只能实现一种算法

C. C程序可以由一个或多个函数组成

D. 一个C函数可以单独作为一个C程序文件存在

解析:在一个C语言程序中可以进行多种算法的实现,对算法的个数没有规定,所以B)错误。

9.sizeof(char)是( )。(B )

A. 一种函数调用

B. 一个整型表达式

C. 一个字符型表达式

D. 一个不合法的表达式

解析:sizeoffchar)是一个C语言的关键字,它不是函数调用。sizeof的功能是计算出运算对象在计算机的内存中所占用的字节数量,该表达式的返回值是一个整数,而不是一个字符型表达式。

10.有以下程序

#include

main()

{ int a=1,b=0;

printf(\(A)

A. 1,2

B. 1,0

C. 3,2

D. 0,0

解析:考查数据的输入,printf(\

11.软件详细设计生产的图如下:

(C)

A. N-S图

B. PAD图

C. 程序流程图

D. E-R图

解析:N-S图是用方框图来代替传统的程序流程图,所以A不对。PAD图是问题分析图,它是继承程序流程图和方框图之后提出的又一种主要用于描述软件详细设计的图形表示工具,所以B不对。E-R图是数据库中的用于表示E-R模型的图示工具,所以D不对。图中所示表示方法是进行软件详细设计时使用的程序流程图。

12.数据结构中,与所使用的计算机无关的是数据的 ( )。(C )

A. 存储结构

B. 物理结构

C. 逻辑结构

D. 线性结构

解析:数据的逻辑结构反映的是数据元素之间的逻辑关系,与使用的计算机无关。

13.下列选项中,不能作为合法常量的是( )。(B)

A. 1.234e04

B. 1.234e0.4

C. 1.234e+4

D. 1.234e0

解析:用指数形式表示的实型常量需注意两点:①e或E后面的指数必须是整数:②指数必须是不超过数据表示范围的正负整数,并且在e或E前必须有数字。

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

A. 使用三种基本结构构成的程序只能解决简单问题

B. 结构化程序由顺序、分支、循环三种基本结构组成

C. C语言是一种结构化程序设计语言

D. 结构化程序设计提倡模块化的设计方法

解析:已经证明,由顺序、分支、循环这三种基本结构组成的算法可以解决任何复杂的问题。选项A)叙述有误。

15.下列程序的运行结果为( )。

#include<stdio.h>

void abc(char*str)

{ int a,b,i,j;

for(i=j=0;str[i]!=’\0’;i++)

if(str[i]!=’a’)

str[j++]=str[i];

str[j]=’\0’;

}

void main()

{ char str[]=’’abcdef’’;

abc(str);

printf(’’str[]=%s’’,str);

}(A)

A. str[]=bcdef

B. str[]=abcdef

C. str[]=a

D. str[]=ab

解析:本题考查函数调用的参数传递。通过函数abc的执行,将字符串中的字母a去掉,保留剩下的,由于是通过指针调用,所以改变字符串的结果。

16.下列叙述中,不属于软件需求规格说明书的作用的是( )。(D)

A. 便于用户,开发人员进行理解和交流

B. 反映出用户问题的结构,可以作为软件开发工作的基础和依据

C. 作为确认测试和验收的依据

D. 便于开发人员进行需求分析

解析:软件需求规格说明书有以下几个方面的作用:

①便于用户、开发人员进行理解和交流;

②反映出用户问题的结构,可以作为软件开发工作的基础和依据;

③作为确认测试和验收的依据。

17.设表的长度为20。则在最坏情况下,冒泡排序的比较次数为( )。(A)

A. 190

B. 20

C. 19

D. 90

解析:对长度为n的线性表排序,在最坏情况下,冒泡排序需要比较的次数为n(n-1)/2。本题中n=20,20×(20-1)/2=190。故本题答案为A选项。

18.有以下程序:

#include

void fun(int*x,int s,int e)

{int i,j,t;

for(i=s,j=e;i<j;i++,j–)

{t=*(x+i);*(x+i)=*c(x+j);*(x+j)=t;}

}

main()

{int m[]={0,1,2,3,4,5,6,7,8,9},k;

fun(m,0,3);fun(m+4,0,5);fun(m,0,9);

for(k=0;k<10;k++)

pfinff(\(A)

A. 4567890123

B. 3210987654

C. 9876543210

D. 0987651234

解析:程序的执行过程为:定义数组m,并为其赋初值,数组长度为10。调用函数fun(m,0,3)将数组首地址传入函数,函数实现将数组下标值从0到3的元素首尾倒置,for循环结束之后数组为m={3,2,1,0,4,5,6,7,8,9}。调用函数fun(m+4,0,4)将数组下标值为4的元素地址传人函数,函数实现将数组下标值从4到9的元素首尾倒置,for循环结束之后数组为m={3,2,1,0,9,8,7,6,5,4}。调用函数fun(m,0,9)将数组首地址传入函数,函数实现将数组下标值从0到9的元素首尾倒置,for循环结束之后数组为m={4,5,6,7,8,9,0,1,2,3}。依次输出数组元素,结果为4567890123。

19.若a、b、C、d都是int型变量且都已经正确赋初值,则以下不正确的赋值语句是( )。(A)

A. a+d:

B. a++;

C. a=b=c=d=100;

D. a=(b=3)+(d=5);

解析:C语言规定,赋值号的右边可以是一个赋值表达式,因此选项C)、选项D)正确;在选项B)中,a++是一个自加1的表达式,a被重新赋值,因此它是一个合法的赋值表达式;选项A)中,a+d是一个算术表达式,虽然最后有一个分号,但这个表达式中没有赋值操作,因此它不是一条赋值语句。

20.关于字符常量,以下叙述正确的是( )。(D)

A. 空格不是一个字符常量

B. 字符常量能包含大于一个的字符

C. 单引号中的大写字母和小写字母代表的是相同的字符常量

D. 所有的字符常量都可以作为整型量来处理

解析:本题考查字符常量的4个知识点:①空格是一个字符常量,而且单引号中的空格不可以省略;②字符常量只能包含一个字符;③单引号中的大写字母和小写字母代表的是不相同的字符常量;④所有的字符常量都作为整型量来处理,在计算机内部,其对应的整数值就是ASCII码值。

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

A. 有一个以上根结点的数据结构不一定是非线性结构

B. 只有一个根结点的数据结构不一定是线性结构

C. 循环链表是非线性结构

D. 双向链表是非线性结构

解析:线性结构应满足:有且只有一个根结点与每个结点最多有一个前件,也最多有一个后件,所以B正确。所以有一个以上根结点的数据结构一定是非线性结构,所以A错误。循环链表和双向链表都是线性结构的数据结构。

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

B

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

23.若定义函数“int*func()”,则函数func的返回值为( )。(B)

A. 一个实数

B. 一个指向整型变量的指针

C. 一个指向整型函数的指针

D. 一个整型函数的入口地址

解析:本题考查函数返回值。fun函数的返回值类型为int*类型,即函数返回一个指向整型变量的指针。

24.下列程序的输出结果是( )。

#include

void fun(int*a,int*b)

{ int*k;

k=a;a=b;b=k;}

main()

{ int a=1,b=2,*x=&a,*y=&b;

fun(x,y);

printf(\(B)

A. 2 1

B. 1 2

C. 编译出错

D. 0 0

解析:本题考查函数调用时的参数传递。分析题目可知fun函数的形参是指向实参的指针,但main()函数中调用fun()函数时,实参是指针变量x、y(分别为指向a和b的指针),a、b的值在函数调用前后未发生变化,因而a=1,b=2,即输出12。

25.若有以下程序段:

struct st

{ int n;

int*m;

}; .

int a=2,b=3,c=5;

struct st s[3]=({101,&a),{102,&c),{103,&b}};

main()

{ struct st*p;

p=s;

}

则以下表达式中值为5的是( )。(B)

A. (*p).m

B. *(p+1)->m

C. *(p++)->n

D. (p++).(*m)

解析:本题考查如何通过指针引用数组元素。首先定义了一个结构体,然后定义了一个结构体变量s[3],并赋了初值。在主程序中,定义了一个指向结构体变量s的指针p,要使表达式的值为5,就应该引用s[1].m的值,使指针p指向s[1],++p可以实现将p指针加1,指向s[1]。

26.以下选项中,合法的实数是( )。(A)

A. 1.5E2

B. E1.1

C. 2.10E

D. 1.9E1.4

解析:用尾数指数形式表示浮点数时,E的右侧必须是整数且不能为空。

27.有以下程序:

#iinclude<stdio.h>

main()

{int a=7,b=0;

do{b+=a;a-=1;}while(a–);

printf(\(D)

A. 28,0

B. 28,1

C. 16,0

D. 16,-1

解析:分析程序可知,do语句1…while(语句2),每次循环在语句1中a的值减1,在语句2中判断a的值后,a的值又减1,所以在每次循环体执行完后,b累加的a的值分别为7,5,3,1,a的值分别为6,4,2,0,最后当a为0时,while判断条件为false,此时a的值再减1,为-1,到此循环结束,所以b的值为16,a的值为-1,故答案选D。

28.有以下程序:

#include<stdio.h>

main()

{int b[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=1;

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

for(j=i;j<=i;j++) t+=b[i][b[j][i]];

printf(\(B)

A. 3

B. 4

C. 1

D. 9

解析:分析程序可以发现,内层for循环每次只执行一次:即当j=i时。所以可以使用i替换j,去掉for循环,对应外层for循环的i,执行t+=b[i][b[i][i]],所以当i取值0、1、2时,t的值累加b[0][b[0][0]]、b[1][b[1][1]]、b[2][b[2][2]],即b[0][0]、b[1][1]、b[2][2],对应的值为:0、1、2,t取值为4(t初始值为1)。故答案选B。

29.已知char**s,下面正确的语句是( )。(D)

A. s=’’ABCDEF’’;

B. *s=’’ABCDEF’’;

C. **s=’’ABCDEF’’;

D. *s=’A’;

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

30.关于C语言的输出语句:printf(’’%3d\n’’,1001)的叙述中正确的是( )。(A)

A. 程序运行时输出1001

B. 程序运行时输出001

C. 程序运行时输出100

D. 指定的输出宽度不够,编译出错

解析:printf在输出时按照格式来输出,%3d表示输出3位整数,这里的3是最小位数,即最少输出3位,但如果多于3位,则按照实际位数输出。

31.下列选项中不属于软件生命周期开发阶段任务的是( )。(C)

A. 软件测试

B. 概要设计

C. 软件维护

D. 详细设计

解析:软件生命周期分为软件定义、软件开发及软件运行维护三个阶段,其中开发阶段包括概要设计、详细设计、实现和测试。

32.有以下程序(字母A的ASCII代码为65)

#include <stdio.h>

main()

{

char c1 = ’A’, c2 = ’Y’;

printf(\(D)

A. 输出格式不合法,输出出错信息

B. A, Y

C. 65, 90

D. 65,89

解析:一个整数,只要它的值在0~255范围之内,也可以用字符形式输出,输出之前,系统会将该整数转化为相应的ASCII码字符;字符也可以用整型来输出,输出的是对应的ASCII值。’A’的 ASCII值为65,’Y’的 ASCII值为89,D选项正确。

33.以下语句的输出结果是

printf(\(A)

A. 5

B. 8

C. 14

D. 输出项不合法,无正常输出

解析:由一对双引号括起来的一串字符为字符串。字符常量是用一对单引号括起来的单个字符,还有一些特殊字符常量,即以\

34.C语言源程序名的后缀是( )。(B)

A. .exe

B. .C

C. .obj

D. .cp

解析:由C语言构成的指令序列称为C源程序,源程序文件的后缀为“.c”。源程序经过C编译程序编译生成后缀为“.obj”的二进制文件(称为目标文件),然后由称为“连接程序”(Link)的软件把目标文件与C语言提供的各种库函数连接起求,生成后缀为“.exe”的可执行文件。

35.软件生命周期中,确定软件系统要做什么的阶段是(A)

A. 需求分析

B. 软件测试

C. 软件设计

D. 系统维护

解析:软件生命周期各阶段的主要任务是:问题定义、可行性研究与计划制定、需求分析、软件设计、软件实现、软件测试、运行维护。其中需求分析是指对待开发软件提出的需求进行分析并给出详细定义,也即是确定软件系统要做什么,A选项正确。

36.有两个关系R与S如下,由关系R和S得到关系T,则所使用的操作为

(C)

A. 并

B. 自然连接

C. 笛卡尔积

D. 交

解析:用于查询的3个操作无法用传统的集合运算表示,引入的运算为投影运算、选择运算、笛卡尔积。常用的扩充运算有交、除、连接及自然连接等。并:RS是将S中的记录追加到R后面。交:RS结果是既属于R又属于S的记录组成的集合。上述两种操作中,关系R与S要求有相同的结构,故A、D选项错误。自然连接:去掉重复属性的等值连接。自然连接要求两个关系中进行,比较的是相同的属性,并且进行等值连接,本题中结果T应为空,B选项错误。若T为笛卡尔积,结果为5元关系,元组个数为4,且计算结果与题目相符,C选项正确。

37.一个栈的初始状态为空。现将元素A,B,C,D,E依次入栈,然后依次退栈三次,并将退栈的三个元素依次入队(原队列为空),最后将队列中的元素全部退出。则元素退队的顺序为(C)

A. ABC

B. CBA

C. EDC

D. CDE

解析:栈所有的插入与删除都限定在表的同一端进行。入栈运算即在栈顶位置插入一个新元素,退栈运算即是取出栈顶元素赋予指定变量。队列指允许在一端进行插入,而在另一端进行删除的线性表。习惯上称往队列的队尾插入一个元素为入队运算,称从队列的队头删除一个元素为退队运算。元素入栈后为ABCDE,退栈并入队后,队中元素为EDC。退队时从队头开始,顺序为EDC,C选项正确。

38.若有定义语句:

double x, y,*px,*py;

执行

px=&x; py=&y;

正确的输入语句是(D)

A. scanf(\

B. scanf(\

C. scanf(\

D. scanf(\

解析:%lf,%le是针对double的,如果仅用%f,输入的数据可能不能被完全接收,数据的精度可能不足。%f主要针对float类型的变量的输入,选项B错误。根据scanf(格式,变量地址),选择A,C错误。因此,选择D

39.设有以下程序段

main( )

{ int x[M][N];

Arrlet(x);

}

则作为函数Arrlet的形参,以下表示形式非法的是(A)

A. int x[M][ ]

B. int (*x)[N]

C. int x[ ][N]

D. int x[M][N]

解析:C语言规定,二维数组作为实参参数传递时,形参必须要指明二维数组的列数,否则函数内无法识别数组的宽度,行数提供没有任何作用。(*p)[N]与p[][N]以及p[M][N]效果一样。排除法A选项

40.有以下程序

#include <stdio.h>

void f1(char *a, char b ){ char c; c=*a; *a=b; b=c; }

void f2(char a, char b ){ char c; c=a; a=b; b=c; }

void f3(char *a, char *b ){ char c; c=*a; *a=*b; *b=c; }

main()

{ char t1, t2;

t1 = ’A’; t2 = ’B’; f3( &t1,&t2 ); putchar(t1); putchar(t2);

t1 = ’A’; t2 = ’B’; f2( t1, t2 ); putchar(t1); putchar(t2);

t1 = ’A’; t2 = ’B’; f1( &t1, t2 ); putchar(t1); putchar(t2);

printf(\(B)

A. ABBABB

B. BAABBB

C. BABABA

D. BABAAB

解析:f1(*a,b),*a地址传递,b值传递,将b值传给*a,则f1(&t1,t2)调用后输出t1、t2为BB。f2(a,b)值传递,传入的只是a,b的拷贝,不实现交换,则f2(t1,t2)调用后输出t1、t2为AB。f3(*a,*b)为地址传递,可以实现a,b值的交换,则f3(&t1,&t2)调用后输出t1、t2为BA。因此结果为BAABBB。故答案为B选项

程序填空题

41.下列给定程序中,函数fun的功能是:找出100~x(x≤999)之间各位上的数字之和为15的所有整数,并在屏幕输出;将符合条件的整数的个数作为函数值返回。

例如,当n值为500时,各位数字之和为15的整

数有:159、168、177、186、195、249、258、267、276、285、294、339、348、357、366、375、384、393、429、438、447、456、465、474、483、492,共有26个。

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

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

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

试题程序:

1 #include<stdio.h>

2 int fun(int x)

3 { int n,s1,s2,s3,t;

4 /********* found*********/

5 n=【1】;

6 t=100;

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

8 while(t<=【2】)

9 {s1=t%10;s2=(t/10)%10;

10 s3=t/100;

11 if(s1+s2+s3==15)

12 {printf(’’%d’’,t);

13 n++;

14 }

15 /*********found*********/

16 【3】

17 }

18 return n;

19 }

20 main()

21 { int x=-1;

22 while(x>999 ||x<0)

23 {printf(’’Please input(0<x<=999):’’);

24 scanf(’’%d’’,&x);}

25 printf(’’\nThe result is:%d\n’’,fun(x));

26 }

(1)0 (2)x (3)t++

解析:填空1:变量n用于存放符合条件的整数的个数,应赋初值为0。

填空2:根据题目要求,确定循环变量t的取值范围为t<=x。

填空3:循环变量t自增1操作。

程序修改题

42.给定程序MODI1.C中函数fun的功能是:应用递归算法求形参a的平方根。求平方根的迭代公式如下:

(1)double fun(double a,double x0) (2)if(fabs(x1-x0)>0.00001)

解析:函数的功能是应用递归算法求某数a的平方根。

(1)主函数中“fun(x,1.0)”,x是double型变量,1.0是浮点数,可知fun有两个double型参数,而第一标识下“dotmle”不是C语言关键字,所以应将“double fun(double a,dounle x0)”改为“double fun(double a,double x0)”。

(2)第二个标识下的if语句是判断进行递归运算的条件,第二标识下变量x0没有定义,根据题意,这里是判断x1和x0的差值的绝对值是否比0.00001大,所以第二个标识下“if(fabs(x1-x0)>0.000011”改为“if(fabs(x1-x0)>0.00001)”。

程序设计题

43.请编写函数fun,其功能是:计算并输出下列多项式的值:

double s=0,t=1;

int i;

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

t *=i ;

s+=1./t;

}

return s;

解析:(1)根据题干中给出的数列,推出每一项分母是在前一项分母的基础上乘当前项数,第n项的项数为n。

(2)在循环中求得每一项,然后对其进行累加求和。

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

评论0

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