国家二级(C语言)机试模拟试卷13(共385题)_第1页
国家二级(C语言)机试模拟试卷13(共385题)_第2页
国家二级(C语言)机试模拟试卷13(共385题)_第3页
国家二级(C语言)机试模拟试卷13(共385题)_第4页
国家二级(C语言)机试模拟试卷13(共385题)_第5页
已阅读5页,还剩109页未读 继续免费阅读

下载本文档

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

文档简介

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

(共9套)

(共385题)

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

一、选择题(本题共40题,每题1.0分,共40分。)

1、程序流程图中带有箭头的线段表示的是()o

A、图元关系

B、数据流

C、控制流

D、调用关系

标准答案:C

知识点解析:在数据流图中,用标有名字的箭头表示数据流。在程序流程图中,用

标有名字的箭头表示控制流。所以选择C。

2、结构化程序设计的基本原则不包括()。

A、多态性

自顶向下

C、模块化

D、逐步求精

标准答案:A

知识点解析:结构化程序设计的思想包括:自顶向下、逐步求精、模块化、限制使

用got。语句,所以选择A。

3、软件设计中模块划分应遵循的准则是()0

A、低内聚低耦合

B、高内聚低耦合

C、低内聚高耦合

D、高内聚高耦合

标准答案:B

知识点解析:软件设计中模块划分应遵循的准则是高内聚低偶合、模块大小规模适

当、模块的依赖关系适当等。模块的划分应遵循一定的要求,以保证模块划分合

理,并进一步保证以此为依据开发出的软件系统可靠性强,易于理解和维护。模块

之间的耦合应尽可能的低,模块的内聚度应尽可能的高。

4、在软件开发中,需求分析阶段产生的主要文档是()。

A、可行性分析报告

B、软件需求规格说明书

C、概要设计说明书

D、集成测试计划

标准答案:B

知识点解析:A)错误,可行性分析阶段产生可行性分析报告。C)错误,概要设计

说明书是总体设计阶段产生的文档。D)错误,集成测试计划是在概要设计阶段编

写的文档。B)正确,需求规格说明书是后续工作如设计、编码等需要的重要参考文

档。

5、算法的有穷性是指()o

A、算法程序的运行时间是有限的

B、算法程序所处理的数据量是有限的

C、算法程序的长度是有限的

D、算法只能被有限的用户使用

标准答案:A

知识点解析:算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可

完成。有穷性是指算法程序的运行时间是有限的。

6、对长度为n的线性表排序,在最坏情况下,比较次数不是n(n—1)/2的排序方法

是()o

A、快速排序

B、冒泡排序

C、直接插入排序

D、堆排序

标准答案:D

知识点解析:除了堆排序算法的比较次数是O(nlogzn),其他的都是n(n—lj/2。

7、下列关于栈的叙述正确的是()。

A、栈按“先进先出”组织数据

B、栈按“先进后出”组织数据

C、只能在栈底插入数据

D、不能删除数据

标准答案:B

知识点解析:栈是按“先进后出”的原则组织数据的,数据的插入和删除都在栈顶进

行操作。

8、在数据库设计中,将E-R图转换成关系数据模型的过程属于()o

A、需求分析阶段

B、概念设计阶段

C、逻辑设计阶段

D、物理设计阶段

标准答案:C

知识点解析:E-R图转换成关系模型数据则是把图形分析出来的联系反映到数据

库中,即设计出表,所以属于逻辑设计阶段。

9、有三个关系R、S和T如下:由关系R和S通过运算得到关系T,则所使用的

运算为()。

A、并

B、自然连接

C、笛卡尔积

D、交

标准答案:D

知识点解析:自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量

必须是相同的属性组,并且在结果中把重复的属性列去掉,所以B)错误。笛卡尔

积是用R集合中元素为第一元素,S集合中元素为第二元素构成的有序对,所以

C)错误。根据关系T可以很明显的看出是从关系R与关系S中取得相同的关系组

所以取得是交运算,选择D。

10、设有表示学生选课的三张表,学生S(学号,姓名,性别,年龄,身份证号),

课程C(课号,课名),选课SC(学号,课号,成绩),则表SC的关键字(键或码)为

()。

A、课号,

B、学号,

、学号,课

C名

D、学号,姓,成绩

C

知识点解析:学号是学生表S的主键,课号是课程表C的主键,所以选课表SC的

关键字就应该是与前两个表能够直接联系且能唯一定义的学号和课号,所以选择

Co

11、以下叙述中错误的是()。

A、C语言中的每条可执行语句和非执行语句最终都将被转换成二进制的机器指令

B、C程序经过编译、连接步骤之后才能形成一个真正可执行的二进制机器指令文

C、用C语言编写的程序称为源程序,它以ASCH代码形式存放在一个文本文件中

D、C语言源程序经编译后生成后缀为.obj的目标程序

标准答案:A

知识点解析:C语言中的非执行语句不会被编译,不会生成二进制的机器指令,所

以A)错误。由C语言构成的指令序列称C源程序,C源程序经过C语言编译程序

编译之后生成一个后缀为.OBJ的二进制文件(称为目标文件);最后要由“连接程序”

把此.OBJ文件与C语言提供的各种库函数连接起来生成一个后缀为.EXE的可执行

文件。

12、以下选项中,合法的一组C语言数值常量是()。

A、12.0Xa234.5e0

B、028.5e-3-Oxf

C、.1774c1.5Oabc

D、0x8A10,0003.e5

标准答案:A

知识之解析:C语言中八进制整型常量的开头是数字0,十六进制整型常量的开头

数字是Ox。C语言中的实型常量有两种表示形式:小数形式,小数形式表示的实

型常量必须要有小数点;指数形式,以”e“或”E“后跟一个整数来表示以10为底数

的帚数,口规定字母e或E之前必须要有数字,旦c或E后面的指数必须为整数。

B)选项中028错误,八进制中没有数字8。C)选项中4el.5中e后面的指数不是整

数。D)选项中3.e5小数点后面缺少数字。

13、以下选项中不合法的标识符是()。

A、&a

B、FOR

C、print

D、0

标准答案:A

知识点解析:C语言中标识符由字母、下划线、数字组成,且开头必须是字母或下

划线。另外,关键字不能作为标识符。因为C语言中区分大小写,所以B)选项中

的“FOR”可以作为标识符来用。A)选项中含有非法字符&,所以选择A。

14、若有代数式:^其中e仅代表自然对数的底数,不是变量),则以下能够正

确表示该代数式的C语言表达式是()。

A、sqrt(fabs(pow(n,x)+exp(x)))

sqrt(fabs(pow(n,x)+pow(x,e)))

C、sqrt(abs(nAx+eAx))

D、sqrt(fabs(pow(x,n)+exp(x)))

标准答案:A

知识点解析:B)选项中函数pow(x,e)错误应该直接使用exp(x)函数。C)选项中函

数abs(nAx+eAx)错误,应该彳吏用fabs()返回浮点数的绝对值。D)选项中pow(x,n)

参数顺序错误。

15、若有定义:doublea=22;inti=0,k=18;,则不符合C语言规定的赋值语

句是()

A、i=(a+k)<=(i+k);

B、i=a%ll;

C>a=a++,i++

D>1=!a;

标准答案:B

知识点3析:取模运算守‘%”,二元运算符,具有左结合性,参与运算的量均为整

型。选项B中的a变量是double实型,所以B)不符合规定。

16、有以下程序:#include<stdio.h>main(){ints,t,A=10;doubleB=6;

s=sizeof(A);t=sizeof(B);printf("%d,%d\n",s,t);[在VC6.0平台上编

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

A、10,6

B、4,4

C、2,4

D、4,8

标准答案:D

知识点解析:C语言中利用sizcof()函数判断数据类型长度,在VC6.0平台中,整

型int占有4个字节,double型数据占有8个字节。

17^有以下程序:#include<stdio.h>main(){chara,b,c,d;

scanf("%c%c",&a,&b);c=getchar();d=getchar();

printf("%c%c%c%c\n",a,b,c,d);}当执行程序时,按下列方式输入数据(从第

1列开始,VCR>代表回车,注意:回车也是一个字符)12<CR>34<CR>则输

出结果是()。

A、1234

B、12

C、1234

D、123

标准答案:D

知识点解析:按照从键盘输入的数据可以判断字符I给了变量a,字符2给了变量

b,字符VCR>即回车给了变量c,字符3给了变量d。所以打印输出的结果为D)

选项。

18、下关于逻辑运算符两侧运算对象的叙述中正确的是()。

A、可以是任意合法的表达式

B、只能是整数。或非0整数

C、可以是结构体类型的数据

D、只能是整数。或1

标准答案:A

知识点解析:C语言的逻辑运算符比较特别,它的噪作数没有明确的数据类型,可

以是任意合法的表达式,所以选择A。

19>有以下程序:#include<stdio.h>main(){inta=O,b=0,c=0,d=0:

if(a=I)b=1;c=2;elsed=3;printf(M%d,%d,%d,%d\n",a,b,

c,d);}程序输出()o

A、1,1,2,0

B、0,0,0,3

C、编译有错

D、0,1,2,0

标准答案:C

知识点解析:本题中if(a=l)b=l;与elsed=3;之间多了语句c=2;所以会出现

else语句的位置错误的编译失败提示。

20、有以下程序:#include<stdio.h>main(){intx=1,y=0,a=0,b=0;

switch(x){case1:switch(y){case0:a++;break;

case1:b++;break;}case2:a++;b++;

break;case3:a++;b++;}printf("a=%d,b=%d\n",

a,b);}程序的运行结果是()o

A、a=2,b=2

B、a=2,b=1

C^a=1,b=1

D、a=1,b=0

标准答案:B

知识点解析:常量表达式只是起语句标号作用,并不是该处进行条件判断-在

执行switch语句时,根据switch的表达式,找到与之匹配的case语句,就从此

case子句执行下去,不在进行判断,直到碰到break或函数结束为止。所以执行内

层switch(y)时只执行了a++,此时a的值为1。然后执行外层case2语句的a+

+;b++;a为2,b为I。所以结果为B)。

21、以下程序段中的变量已正确定义:for(i=0;i<4;i++,i++)

for(k=hk<3;k+—);printf("*n);程序段的输出结果是()。

A、**

B、****

C、*

D********

标准答案:C

知识点解析:由于内层循环for(k=l;k<3;k++)后面直接跟了空语句“;“所

以在循环内部什么操作也不做,跳出外层循环后执行打印语句,所以打印了一个

选择C。

22、有以下程序段:#include<stdio.h>inti,n;for(i=0;i<8;i++)

{n=rand()%5;switch(n){case1:case3:printf("%d\nH,

n);break:case2:case4:printf("%d\n",n);continue;case0:

exit(O);}printf("%d\n*',n);}以下关于程序段执行情况的叙述,正确

的是()o

A、tor循环语句固定执行8次

B、当产生的随机数n为4时结束循环操作

C、当产生的随机数n为1和2时不做任何操作

D、当产生的随机数n为0时结束程序运行

标准答案:D

知识点解析:case常量表达式只是起语句标号作用,并不是该处进行条件判断。在

执行switch语句时,根据switch的表达式,找到与之匹配的case语句,就从此

case子句执行下去,不再进行判断,直到碰到break或函数结束为止。简单的说

break是结束整个循环体,而continue是结束单次循环。B)选项中当产生的随机数

n为4时要执行打印操作。C)选项中当产生的随机数为1和2时分别执行case3与

case4后面语句的内容。由于存在break语句所以for循环不是固定执行8次,决行

次数与产生的随机数n有关系。

23有以下程序:#include<stdio.h>intf(intx);main(){intn=1,m;m=

f(f(f(n)));printf("%d\n",m);)intf(intx){returnx*2;}程序运行后的输出结果

是()。

A、8

B、2

C、4

D、1

标准答案:A

知识点解析:第一次调用m=f(f(f(l))),第二次为m=f(f(2)),第三次为m=f(4),

即返回值为8。

24、以下叙述中错误的是()。

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

B、函数可以返回地址值

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

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

标准答案:A

知识点解析:不能将一个整数直接赋给指针变量作为地址,所以A)是错误的。函

数的返回值可以是地址,即指针。函数调用中形参值的变化不会传递给实参。

25、设已有定义:floatx;,则以下对指针变量p进行定义且赋初值的语句中正确

的是()。

A、int*p=(float)x;

B、float*p=&x;

C、floatp=&x;

D、float*p=1024;

标准答案:B

知识点解析:指针是用来存放地址的变量,用(类型名*指针变量名)的形式定义。

赋值时应将某个变量地址即&x赋给指针变量,所以选择Bo

26、以下数组定义中错浜的是()o

A、intx[2][3]={1,23,4.5,6};

B、intx[][3]={0);

C、intx[][3]={{1,2,3},{4,5,6}};

D、intx⑵[3]={{1,2},{3,4},{5,6}};

标准答案:D

知识点解析:D)选项中x[2][3]定义的是一个两行三列的二维数组,而在给数蛆元

素赋值时却赋成了三行,所以错误。

27、有以下程序:#include<stdio.h>voidfun(inta[],intn){inti,t;

for(i=0;i<n/2;i++){t=a[i];a[i]=a[n—1—i];a[n—1—i]=t;))main()

{intk[10]={1,2,34,5,6,7,8,9,10),i;fun(k,5);for(i=2:i<8;i+

n

+)printf("%d,k[i]):printf("\n");}程序的运行结果是()<,

A、321678

B、876543

C、1098765

D、345678

标准答案:A

知识点解析:本题中的函数fun()的功能是将数组k中前5个元素倒序,所以返回

后数组k中的元素排列是54321,6,7,8,9,10。所以打印输出k[2]到k[7]元素的值,

即321678,所以选择A。

28、有以下程序:#include<stdio.h>#defincN4voidfun(inta[][N],intb[])

{inti;for(i=0;i<N;i++)b[i]=a[i][i]—a[i][N-1—i];}main()

{intx[N][N]={{l,2,3,4},[5,6,7,8),(9,10,11,12),

{13,14,15,16}},y|N],i;fun(x,y);for(i=0;i<N;i++)

printf(H%d,y[i]);printf("\n");}程序运行后的输出结果是()。

A、一3,—1,1,3,

B、-12,-3,0,0,

C、0,1,2,3,

D、一3,—3,—3,—3,

标准答案:A

知识点解析:本题中由fun函数可知,b(0]=a|0]|0|-a|0]|31=l-4=-3,b|l]=

a[l][l]-[l][2]=6-7=-l,b[2]=a[2][2]-[2][l]=ll-10=l,b[3]=a[3][3]-

[3][1]=16—13=3o所以主函数中打印y数组元素的值为A)选项。

29、设有定义:chars[8”;inti=O;,以下不能将一行(不超过80个字符)带有空

格的字符串正确读入的语句或语句组是()。

A、gets(s):

B、while((s[i++]=getchar())!='\n');s[i]=,\0,;

C、scanf("%s",s);

D、do{scanf("%c",&s[ij);}while(s[i++J!='\n');s[iJ='\0';

标准答案:C

知识点解析:scanf("%s",s)用这种格式输入字符串时,空格和回车符都作为输入

数据的分隔符而不能被读入,题目要求输入的字符串有空格,不符合题意要求,答

案为C选项。

30、设有定义:charp[]={,T,2,3},*q=p;,以下不能计算出一个char

型数据所占字节数的表达式是()。

A、sizeof(p)

B、sizeof(char)

C、sizcof(*q)

D、sizeof(p|0])

标准答案:A

知识点解析:根据题目中的定义可以知道sizcof(p),计算的是数组p中所有元素所

占用的字节数,而不是char型数据所占字节数。

31、有以下程序:#include<stdio.h>#include<string.h>main(){charstr[][20]

=(nOne*World","One*Dream!M},*p=str[l];pnntf(H%d,",strlen(p));

printfC,%s\n%p);}程序运行后的输出结果是()。

A、10,One*Dream!

B、9,One*Drcam!

C、9,One*World

D、10,One*World

标准答案:A

知识点解析:p是指向二维字符数组第二行One*Dream!的数组指针,所以长度是

10,打印输出的也是该字符串。

32、有以卜程序:#include<stdio.h>main(){chars|]="012xy\08s34f4w2";

inti,n=0;for(i=0:s[i]!=0:i++)A=O&&s[i]

V=,9,)n++;printf(n%d\n",n);}程序运行后的输出结果是()。

A、0

B、3

C、7

D、8

标准答案:B

知识点解析:本题中遇到,'字符循环结束,所以只统计,'之前的数字字符,所以

为3。

33、有以下程序:#include<stdio.h>fun(intx,inty){staticintm=0,i=2:

i+=m+l;m=i+x+y;returnm;)main(){intj=l»m=1,k:k=

fun(j,m);printf("%d,",k);k=fun(j,m);prinlf("%d\n",k);}执行后的

输出结果是()o

A、5,11

B、5,5

C>11,11

D、II,5

标准答案:A

知识点解析:声明静态局部变量:函数调用结束后,其占用的存储单元不释放,在

下次该函数调用时,该变量保留上一次函数调用结束时的值。本题子函数fun中的

变量i和m均为静态局部变量。所以第一次调用fun函数,返回m的值为5,第二

次再调用fun函数时,i的值为3,m的值已经是5了,所以执行i+=m+1,i的

值变为9,m-i+x+y-9+l-Hl-llo

34、在C语言中,只有在使用时才占用内存单元的变量,其存储类型是()o

A^auto和static

B、extern和register

C、auto^0register

D、static和register

标准答案:C

知识点解析:auto:函数中的局部变量,动态地分配存储空间,数据存储在动态存

储区中,在调用该函数时系统会给它们分配存储空间.在函数调用结束时就自动释

放这些存储空间。register:为了提高效率,C语言允许将局部变量的值放在CPU

中的寄存器中,这种变量叫”寄存器变量”,只有局部自动变量和形式参数可以作为

寄存器变量。extern:外部变量(即全局变量)是在函数的外部定义的,它的作用域

为从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,

其有效的作用范围只限于定义处到文件终了。static:静态局部变量属于静态存储

类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。

35、下面结构体的定义语句中,错误的是()<>

A、structord{intx;inty;intz;)structorda:

B、structord{intx;inty;intz;};structorda;

C、structord{intx;inty;intz;}a;

D、struct{intx;inty;intz;}a;

标准答案:A

知识点解析:A)选项stmctord{intx;inly;intz;}structorda;错误,不能在定

义结构体的同时,又用结构体类型名定义变量。应该写成B)选项或者D)选项的格

式。

36、有以下程序:#include<stdio.h>typedefstruct{intb>p;)A;voidf(Ac)

/*注意:c是结构变量名*/{intj;c.b+=l;c.p+=2;)main(){inti;A

a=(l,2);f(a);printf("%d,%d\n'\a.b,a.p);}程序运行后的输出结果是

()。

A、2,4

B、1,2

C、1,4

D、2,3

标准答案:B

知识点解析:结构体变量可以作为函数的参数和返回值。作为函数的实参时,可以

实现函数的传值调用。当使用结构体变量作为函数的形参时,实参也应该是结构体

变量名以实现传值调用,实参将拷贝副本给形参,在被调用函数中改变形参值对于

调用函数中的实参没有影响。所以选择B。

37、以下叙述中正确的是().

A、在C语言中,预处理命令行都以“#”开头

B、预处理命令行必须位于C源程序的起始位置

C、#inckideVstdio.h>必须放在C程序的开头

D、C语言的预处理不能实现宏定义和条件编译的功能

标准答案:A

知识点解析:预处理命令是以“#"号开头的命令,它们不是C语言的可执行命令,

这些命令应该在函数之外书写,一般在源文件的最前面书写,但不是必须在起始位

置书写,所以B),C)错误。C)语言的预处理能够实现宏定义和条件编译等功能,

所以D)错误”

38、有以下程序:#include<stdio.h>#includc<stdlib.h>intfun(intn){int

*p;p=(int*)malloc(sizeof(int));*p=n;return*p;}main(){inta;

a=fun(10);printf(H%d\nn,a+fun(10));}程序的运行结果是()。

A、0

B、10

C、20

D、出错

标准答案:C

知识点解析:malloc(sizBof(int))的作用是开辟一个长度为sizeof(int)存储空间,并通

过强制类型转换(int*)将此存储空间的地址赋给了一个整型的指针变量po然后执行

语句*p=n,使得*p的值为10,并通过relurn返回此值,即a的值为10。然后在主

函数中输出a+fun(10)=10+10=20o

39、有以卜.程序:#include<stdio.h>main(){unsignedchara=8,c;c

=a>>3:printfC1%d\nM,c);)程序运行后的输出结果是()。

A、16

B、1

C、32

D、0

标准答案:B

知识点解析:无符号整型变量a的值为8,二进制表示为00001000,右移3位后为

00000001,即十进制的1,所以输出1。

40、读取二进制文件的函数调用形式为:fread(buffer,size,count,fp);,其中

buffer代表的是()o

A、一个内存块的字节数

B、一个整型变量,代表待读取的数据的字节数

C、一个文件指针,指向待读取的文件

D、一个内存块的首地址,代表读入数据存放的地址

标准答案:D

知识点解析:fread(void*buffer,sizetsize,sizetcount,FILE*stream):功能

是从一个文件流中读数据,读取couni个元素,每个元素size字节,如果调用成功

返回coum。buffer:用于接收数据的内存地址,大小至少是size*count字节;

size:单个元素的大小,单位是字节;count:元素的个数,每个元素是size字

节;stream:输入流。

二、程序填空题(本题共I题,每题L0分,共[分0)

41、下列给定程序中,函数fun的功能是:有NxN矩阵,以主对角线为对称线,

时称元素相加并将结果存放在左下三角元素中,右上三角元素置为0。例如,若

N=3,有下列矩阵:123456789计算后结果为10065010149请在程序的下

画线处填人正确的内容并把下画线删除,使程序得出正确的结果。注意:部分源

程序给出如下..不得增行或删行,也不得更改程序的结构!试题程序:#include

<stdio.h>#defineN4/**********found***********/voidfun(int(*t)[1]){int

i,j,for(i=1;i<N,i++){for(j=0;jVi;j++){/**********found***********/

【2】=仃“川+5]口;/**********found***********/【3]=0;}))main(){inti,

j,t[][N]={21,12,13,24,25,16,47,38,29,11,32,54,42,21,33,10);print^X

nTheoriginalarray:\n"),for(i=0;i<N;i++){for(j=0;j<N;j++)printf(14%

2d“,t[i][j]);printR"\n"),)fun(t);printf{44\nTheresultis:\n"),for(i=0;i<

N;i++){for(j=0;j<N;j++)printf("%2d”,t[i]|j]);printf("\n");|)

标准答案:(l)[N](2)Ui][j](3)Uj][i]

知识点解析:填空1:主函数中调用函数的参数为二维数组,所以此处形参应定义

为指针数组。填空2:艰据题意可知,对称元素相加的和存放在左下三角元索中,

那么应填入的是填空3:右上三角元素置0,应填入中|川。

三、程序修改题(本题共1题,每题1.0分,共7分0)

42、下列给定程序中函数fun的功能是:将K整型数中各位上为奇数的数依次取

出,构成一个新数放在t中。高位仍在高位,低位仍在低位。例如,当s中的数为

87653142时,t中的数为7531。请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!试题程

序:#include<stdlib.h>#include<stdio.h>@include<conio.h>void

fun(longs,long*l){intd:longsl=l;/**********found***********/1=0;while(s

>0){d;s%10;/**********found***********/if(d%2:=0)[*t=d*s]+*t;

si*=10;}S/=10;)}voidmain(){longs,t;system(MCLSM);printf(4t\nPleaseenter

s:”);scantV'%ld、',&s);fun(s,&t);printf^(fc4Theresultis:%ld\n",t);}

标准答案:(l)*t=0:⑵if(d%2!=0)或if(d%2==l)

知识点解析:(1)由甬数定义可知,变量t是指针变量,所以对t进行赋初值。是不

对的。因为1指向的足存放新数的变量,所以此处应给新数赋初值0,即*1=0;(2)

变量d表示数s各位上的数,此处的if条件应为判断d是否为奇数。

四、程序设计题(本题共I题,每题1.0分,共1分0)

43、请编写函数fun,其功能是:将M行N列的二维数组中的数据,按列的顺序

依次放到一维数组中。一维数组中数据的个数存放在形参n所指的存储单元中。

例如,若二维数组中的数据为333333334444444455555555则一维数组中的

内容应是:334455334455334455334455注意:部分源程序给出如下。请勿

改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写

的若干语句。试题程序:#include<Stdio.h>voidfun(int(*S)[10],int*b»int*

n,intmm,intnn){}main(){intw[10][10]=({33,33,33,33),{44,44,44,

44),{55,55,55,55]),i,j,inta[100]={0}»n=0;printf(<€Thematrix:\

n");for(i=0;i<3;i++){for(j=0;j<4;jH)prinl「(“%3d”,W[i][j]);

printf("\n");)fun(w,a,&n,3,4);printfi(t4TheAarray:\n”),for(i=0,i<

n;i++)printf(“%3d",a[i]);)

标准答案:voidfun(int(*s)[10]»int*b,int*n,intmm,intnn){inti,j;for(j=0>

j<nn;j++)/*将二维数组中的数据按列的顺序依次放入一维数组中*/for(i=0:i

<mm;i++){b[*n]=*(*(s+i)+j);*n=*n+l;/*通过指针返回元素个数*/))

知识点解析:题目要求实现将二维数组元素存入一维数组,需使用for循环语句来

控制二维数组元素的下标,同时使用指针变量配合操作。可以用两个循环来生理

问题,由于是按列的顺序取出,所以第1个循环用于控制列下标,第2个循环用于

控制行下标。

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

一、选择题(本题共40题,每题1.0分,共40分。)

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

A、解决同一个问题的不同算法的时间复杂度一般是不同的

B、解决同一个问题的不同算法的时间复杂度必定是相同的

C、对同一批数据作同一种处理.,如果数据存储结构不同,不同算法的时间复杂度

肯定相同

D、对同一批数据作不同的处理,如果数据存储结构相同,不同算法的时间复杂度

肯定相同

标准答案:A

知识点解析:算法的时间复杂度是指执行算法所需要的计算工作量,而计算工作量

是用算法所执行的基本运算次数来度量的。解决同一个问题的不同算法的时间复杂

度,可能相同也可能不相同。算法的时间复杂度与数据存储结构无关,对同一批数

据作同一种处理或者不同处理,数据存储结构相同或者不同,算法的时间复杂度都

可能相同或者不同。故选A选项。

2、下列处理中与队列有关的是()。

A、操作系统中的作业调度

B、执行程序中的过程调用

C、执行程序中的循环控制

D、二又树的遍历

标准答案;A

知识点解析:队列是指允许在一端进行插入,而在另一端进行删除的线性表。由于

最先进入队列的元素将最先出队,所以队列具有“先进先出”的特性,体现了“先来

先服务”的原则。作业调度是指根据一定信息,按照一定的算法,从外存的后备队

列中选取某些作业调入内存分配资源并将新创建的进程插入就绪队列的过程。执行

程序中的过程调用一般指函数调用,需要调用时候转入被调用函数地址执行程序,

与队列无关。执行程序中的循环控制是指算法的基本控制结构,包括对循环条件的

判定与执行循环体,与队列无关。二叉树是一个有限的结点集合,二叉树的遍历是

指不重复地访问二

3、设栈的存储空间为S(l:m),初始状态为top二m+1。经过一系列入栈与退栈操

作后,top=l。现又要将一个元素进栈,栈顶指针top值变为()。

A、发生栈满的错误

B、2

C、m

D、0

标准答案:A

知识点解析:栈是一种特殊的线性表,它所有的插入与删除都限定在表的同一端进

行。入栈运算即在栈顶位置插入一个新元索,退栈运算即是取出栈顶元素赋予指定

变量。题目中初始状态为lop=m+l,可知入栈栈顶指针lop=lop-l,出栈栈顶指针

top=top+l,由于栈长为m,当top=l时栈满,不能再进行入栈操作。故选A选

项。

4、设二叉树共有150个结点,其中度为1的结点有10个,则该二叉树中的叶子结

点数为()。

A、71

B、70

C、69

D、不可能有这样的二叉树

标准答案:D

知识点解析:在树结构中,一个结点所拥有的后件个数称为该结点的度,所有结点

中最大的度称为树的度。对任何一棵二叉树,度为0的结点总是比度为2的结点多

一个。如果有一棵二义树,结点总数为150,假设度为0的结点个数为n,则有

n十l(Hn-l=150,n=70.5,由于结点个数必须是整数,所以不可能有题目中这样的

二叉树。故选择D选项。

5、非空循环链表所表示的数据结构()。

A、有根结点也有叶子结点

B、没有根结点但有叶子结点

C、有根结点但没有叶子结点

D、没有根结点也没有叶子结点

标准答案:A

知识点解析:在单链表的第一个结点前增加一个表头结点,队头指针指向表头结

点,最后一个结点的指针域的值由NULL改为指向表头结点,这样的链表称为循

环链表。循环链表是线性结构,有且只有一个根结点,每一个结点最多有一个前

件,也最多有一个后件。循环链表表头结点为根结点,链表的最后一个结点为叶子

节点,虽然它含有一个由向表头结点的指针,但是表头结点并不是它的一个后件。

故选择A选项。

6、设二叉树中共有31个结点,其中的结点值互不相同。如果该二叉树的后序序列

与中序序列相同,则该二叉树的深度为()。

A、31

B、16

C、17

D、5

标准答案:A

知识点解析:二叉树遍历可以分为3种:前序遍历〔访问根结点在访问左子树和访

问右子树之前)、中序遍历(访问根结点在访问左子树和访问右子树两者之间)、后序

遍历(访问根结点在访问左子树和访问右子树之后)。由结点值互不相同而后序序列

与中序序列相同,可知该二叉树所有的结点都没有右子树,所以31个结点的二叉

树深度为31。故选A选项。

7、在最坏情况下,堆排序的时间复杂度是()。

A、O(lgO2n)

O(nlog2n)

C、O(n2)

D、0(nr5)

标准答案:B

知识点解析•:若有n个元素的序列,将元素按顺序组成一棵完全二叉树,当且仅当

满足下列条件时称为堆,大根堆是指所有结点的值大于或等于左右子结点的值;小

根堆是指所有结点的值小于或等于左右子结点的值。在调整建堆的过程中,总是将

根结点值与左、右子树的根结点进行比较,若不满足堆的条件,则将左、右子树根

结点值中的大者与根结点值进行交换。堆排序最坏情况需要O(nlog2n)次比较,所

以时间复杂度是O(nlog2n),B选项正确。

8、软件按功能可以分为应用软件、系统软件和支撑软件(或工具软件)。下面属于

系统软件的是()。

A、学籍管理系统

B、ERP系统

C、C编译程序

D、CAI软件

标准答案:C

知识点解析:计算机软件按功能分为应用软件、系统软件、支撑软件(或工具软

件)。系统软件是管理计算机的资源,提高计算机的使用效率,为用户提供各种服

务的软件。应用软件是为了应用于特定的领域而开发的软件。支撑软件介于系统软

件和应用软件之间,协助用户开发软件的工具型软件,其中包括帮助程序人员开发

和维护软件产品的工具软件,也包括帮助管理人员控制开发进程和项目管理的工具

软件。如Dephi、PowerBuilder等。选项C属于系统软件,选项A、B、D属于应

用软件,故选C选项。

9、存储在计算机内有结构的数据集合是()。

A、数据库

B、数据库系统

C、数据库管理系统

D、数据结构

标准答案:A

知识点解析:数据库是指长期存储在计算机内的、有组织的、可共享的数据集合。

数据库系统是由数据库及其管理软件组成的系统,是应用软件。数据库管理系统是

数据库系统的核心,它位于用户与操作系统之间,属于系统软件。数据结构是计算

机存储、组织数据的方式。故本题选A选项。

10、在数据库技术中,为提高数据库的逻辑独立性和物理独立性,数据库的结构被

划分成用户级、存储级和()。

A、概念级

B、外部级

C、管理员级

D、内部级

标准答案:A

知识点解析•:数据库系统在其内部分为三级模式,即概念模式、内模式和外模式。

概念模式是数据库系统中全局数据逻辑结构的描述,全体用户的公共数据视图。外

模式也称子模式或者用户模式,是用户的数据视图,也就是用户所能够看见和使用

的局部数据的逻辑结构和特征的描述,是与某一应用有关的数据的逻辑表示。内模

式又称物理模式,是数据物理结构和存储方式的描述,是数据在数据库内部的存储

方式。所以数据库的结阂被划分成用户级、存储级和概念级。故选A选项。

11、以下叙述错误的是()。

A、一个算法所包含的操作步骤应该是有限的

B、任何能通过编译和运行的算法都一定能得到所期望的结果

C、算法中每一条指令必须有确切的含义

D、算法可以用各种描述方法来进行描述

标准答案:B

知识点解析:算法的特点:零个或多个输入,至少一个输出,可行性(能编程实

现),有穷性(有限步出结果),确定性(描述不能有歧义)。可知选项A,C,DIE

确0C语言中,通过编译,可以运行的程序.不一定符合题目的本意.因此即使可

以运行得到结果,也不一定和预期的结果一样,否则就不需要调试和修改程序了,

故B选项错误。答案为B选项。

12、以下是正确C语言实型常量的是()。

A、.e-1

B、e-1

C、-le

D、le-1

标准答案:D

知识点解析:所谓常量是指在程序运行过程中,其值不能被改变的量。在C语言

中,有整型常量、实型常量、字符常量和字符串常量等类型。实型常量有两种表示

形式:十进制小数形式、指数形式。指数形式中e后面的指数必须是整数,阶码标

志e之前需要有数字,由此可知选项A,B,C错误。答案为D选项

13、以下叙述正确的是()。

A、在C语言中分号是语句的组成部分

B、C语言程序由C语句组成,可以省略main函数

C、分号是C语句之间的分隔符

D、所有程序行都必须用分号结束

标准答案:A

知识点解析:C程序的入口函数是main。,C程序中有且只有一个main函数,故

选项B错误。分号是C语言一条语句的结束标志,不是分隔符,C语言分隔符是

用来分隔多个变量、数据项、表达式等的符号,包括逗号、空白符、分号和冒号

等,选项C错误。C语言的程序不是以分号结束的,因为C语言是面向过程的,

从main函数开始在main函数里结束,选项D错误。故答案为A选项。

14>若有定义:doublca,b,c;能正确给a,b,c输入数据的语句是()。

A、scanf(M%lf%lf%lf'&a,&b,&c);

B、scanf(”%f%f%f\&a,&b,&c);

C、scanf(n%lf%lf%lf,a,b,c);

D、scanf(”%lf%lf%f,&a,&b,&c);

标准答案:D

知识点解析:%lf,%lc是制对double类型的,如果仅用%3输入的数据可.能不

完全接收,数据的精度可能不足。%£主要针对float类型的变量输入,因此选项B

错误。根据题目格式可知选项A,C错误。故答案为D选项。

15、有以下程序:#include<stdio.h>main(){intx=0xg;pfinff("%c\

n”,,A,+x);}程序运行后的输出结果是()。

A、I

B、J

C、K

D、H

标准答案:B

知识点解析:printf("%c\n",'A'+x),x=0x9(16)转为十进制x=9,因此printf("%c

\n",'A,+9),打印格式要求是%和因此需要从字符A,按字母顺序向后偏移9

个位置,可得结果为J。故答案为B选项。

16、设有定义:doublex=5.16894;,则语句printf("%lf\n”,(int)(x*1000+0.5)

/1000.);的输出结果是()。

A、5.16900

B、5.16800

C、0.00000

D、输出格式说明符与输出项不匹配,产生错误信息

标准答案:A

知识点解析:(x*l000+0.5)表示x移动3位小数,加0.5,也就是小数第4位加

5,若这位大于等于5,则进1到个位。因为“5.16894*10005168.94+0.5

5169.44”所以(皿)(以1000+0.5)强制转换为整型结果为5169。(5169/

1000.0)5.169,由于1000.0结果自动转换为浮点数所以printf("%lf\n”,

5.169)结果是5.16900。故答案为A选项

17、有以下程序:#include<stdio.h>main(){inta=0,b=0,c=0>d=0;if(a=l)

b=l;c=2;elsed=3;printf("%d,%d,%d,%d、n",a»b,c,d);}程序输

出()。

A、编译有错

B、0,0,0,3

C、1,1,2,0

D、0,1,2,0

标准答案:A

知识点解析:C语言规定else总是和之前与其最近的且不带else的if配对,题目

中,if(a=l)b=l;c=2;默认省略的eke已经配对了,下一句else没有匹配,if为非

法else。另外if的判断条件a=l是赋值语句,不是判断语句,此处也会产生编译错

误。因此答案为A选项。

18、有以下程序:#include<stdio.h>main(){inta=-2,b=2;for(;++a&&-

b:)?printf(”%d,%d\n”,a,b);}程序运行后的输出结果是().

A、0,1

B、0,0

C、1,-1

D、0,2

标准答案:A

知识点解析:for(;++a&&--b;);for循环中第1,3表达g为缺省项,判断条件为

++a&&-b;a=-2,b=2;,第一次执行了++a和-b,,表示为真,循环条件成立,

第二次执行++a为0,由于&&运算符,当第一个条件为假时,不执行第二个条

件.所以.发生短路.-h不执行了°因此a.b的最终值0.1c故答案为A选

项。

19^有以下程序:#include<stdio.h>main()(intt;scanf("%d",&t);if(t++<

6)printf("%d、n”,t);elseprintf("%d\n",t-);printfC\nM);}执行时输入:6

V回车,,则输出结果是()。

A、6

B、8

C、7

D、5

标准答案:C

知识点解析:后置自增运算:k++表示先运算,后自力I」。if(t++V6)printf("%d\

n",l):elseprimf("%d'\n",t—);l的初值为6,1++V6,则条件为假,执行

printfr%d\n'\t-),此时t=7,打印t值为7,之后进行自减操作t=6。因此打印

的结果为7。故答案为C选项。

20、有以卜程序:#include<stdio.h>main(){charch=,D,;while(ch>,A,)d{ch-

putchar(ch);if(ch二-'A,)break;putehar(ch+l);}}程序运行后的输出结果是

()。

A、CB

B、BCA

C>CCBB

D、CDBCA

标准答案:D

知识点解析:putchar。函数功能是输出一个字符,由whlic判断条件和ch初始值可

知,只要ch'AL每次执行二次pulchar,否则跳出。第一次输出CD,第二次输出

BC,第三次输出A,跳出循环。因此答案为D选项。

21>以下程序拟实现计算s=l+2*2+3*3+...+n*n+...,直到s>1000为止。#includc

<stdio.h>main(){ints,n;s=l:n=l;do{n=n+1;s=s+n*n;)while(s>

1000);printf("s=%d\n”,s);}程序运行后,不能得到正确结果,以下修改方案

正确的是()。

A、while(s>1000);改为while(s<=1000);

B、把s=l;改为s=0;

C、把n=l;改为n=0;

D、把115+1;改为n=n*n;

标准答案:A

知识点解析:题目中程序不能实现预期功能是因为while的循环条件错误,在选项

B中,把s=l,改为s=0,最终的结果s=4,与题目原意不同;在选项C中,把

n=l;改为n=0;最终的结果s=2,与题目原意不同;在选项D中,把n=n+l;改

为n=n*n;坡终的结果s=2,与题目原意不同;选项A,正确的修改了while循环

条件,可以得到正确结果。故答案为A选项。

22、有以下程序:#inchide<stdio.Ii>main()(intm.n:*canf("%d%d”.

&n,);while(m!=n){while(m>n){m=m-n;)while(n>m)tn=n-m;}}printf("%d

\n%m);}该程序的功能是()。

A、计算m和n的最小公倍数

B、计算m和n的最大公约数

C、计算m和n的差值

D、找出m和n中的较大值

标准答案:B

知识点解析:题目使用更相减损术求最大公约数,其思想:1、任意给定两个正整

数,判断它们是否都是偶数。若是,则用2约简,若不是则执行第二步。2、以较

大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个

操作,直到所得的减数和差相等为止。则第一步中约掉的若干个2与第二步中等数

的乘积就是所求的最大公约数。因此。故答案为B选项。

23、有以卜程序:#include<stdio.h>intadd(inta,intb){return(a+b);}main()

{intk,(*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);

标准答案:D

知识点解析:*与()的优先级,()的优先级高于*,因为(*f)()定义函数指针九f指向

函数的指针。kadd,将函数add()的首地址赋给指针f,所以调用函数add。可以写

为f(),其返回值是整型,不是指针类型,不能用*取指针指向的内存单元的数据,

故k=*f(8,b)的调用方式错误。答案为D选项。

24、若有定义语句:doublex,y,*px,*py;执行px=&x;py=&y;正确的输入

语句是()。

A、scanf("%lf%lf,x,y);

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

C、scanf(”%f%『,x,y);

D、scanf("%lf%le",px,py):

标准答案:D

知识点解析:%If,%le是针对double类型的数据,如果仅用%1;输入的数据可

能不能被完全接收,数据的精度可能不足。%£主要针对float类型的变量输入,选

项B错误。根据scanf(格式,变量地址),选项A,C错误。故答案为D选项。

25、以下定义数组的语句中错误的是()。

A>intnum[][3]=({1,2),3,4,5,6);

intnum[2][4]={{l,2),{3,4},{5,6));

C、intnum[]={1,2,3,4,5,6};

D、intnum[][4]={1,2,3.4,5,6):

标准答案:B

知识点解析:选项B中,intnum[2][4]={{l,2},{3,4},{5,6}};定义数组是2

行4列,但是初始化的结构是3行2列,因此初始化错误。故答案为B选项。

26、有以下程序:#include<stdio.h>voidfun(inta[]»intn,intflag){inti=0,

j,t;for(i=0;i<n-1;i++)for(j=i+1;j<n;j++)if(flag){if(a[i]<a[j]){t=a[i];

a[i]=a|j];a|j]=t;}}else(if(a[i]>a[j]){t=a[i]:a[i]=a[j];a[j]=t;})}m

温馨提示

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

评论

0/150

提交评论