1、国家二级 C语言机试(选择题)模拟试卷 46及答案与解析 一、选择题 1 程序流程图中带有箭头的线段表示的是 ( A)图元关系 ( B)数据流 ( C)控制流 ( D)调用关系 2 结构化程序设计的基本原则不包括 ( A)多态性 ( B)自顶向下 ( C)模块化 ( D)逐步求精 3 软件设计中模块划分应遵循的准则是 ( A)低内聚低耦合 ( B)高内聚低耦合 ( C)低内聚高耦合 ( D)高内聚高耦合 4 在软件开发中,需求分析阶段产生的主要文档是 ( A)可行性分析报告 ( B)软件需求规 格说明书 ( C)概要设计说明书 ( D)集成测试计划 5 算法的有穷性是指 ( A)算法程序的运行
2、时间是有限的 ( B)算法程序所处理的数据量是有限的 ( C)算法程序的长度是有限的 ( D)算法只能被有限的用户使用 6 对长度为 n的线性表排序,在最坏情况下,比较次数不是 n(n 1)/2的排序方法是 ( A)快速排序 ( B)冒泡排序 ( C)直接插入排序 ( D)堆排序 7 下列关于栈的叙述正确的是 ( A)栈按 “先进先出 “组织数据 ( B)栈按 “先进后出 “组织数据 ( C)只能在栈底插入数 据 ( D)不能删除数据 8 在数据库设计中,将 E R图转换成关系数据模型的过程属于 ( A)需求分析阶段 ( B)概念设计阶段 ( C)逻辑设计阶段 ( D)物理设计阶段 9 有三个
3、关系 R、 S和 T如下: 由关系 R和 S通过运算得到关系 T,则所使用的运算为 ( A)并 ( B)自然连接 ( C)笛卡尔积 ( D)交 10 设有表示学生选课的三张表,学生 S(学号,姓名,性别,年龄,身份证号 ),课程 C(课号,课名 ),选课 SC(学号,课号,成绩 ),则表 SC的关键字 (键或码 )为 ( A)课号,成绩 ( B) 学号,成绩 ( C)学号,课号 ( D)学号,姓名,成绩 11 C语言程序的模块化通过以下哪个选项来实现 ( A)变量 ( B)函数 ( C)程序行 ( D)语句 12 以下选项中不属于 C语言标识符的是 ( A)常量 ( B)用户标识符 ( C)关
4、键字 ( D)预定义标识符 13 以下选项中不属于 C语言程序运算符的是 ( A) sizeof ( B) ( C) ( ) ( D) ( B) A=a+b; ( C) a=a+b ( D) A?a:b; 15 若有以下程序段 doublex=5.16894; printf(“%fn“,(int)(x*1000+0.5)/(double)1000); 则程序段的输出结果是 ( A) 5.170000 ( B) 5.175000 ( C) 5.169000 ( D) 5.168000 16 设有定义: doublea,b,c; 若要求通过输入分别给 a、 b、 c输入 1、 2、 3,输入形式如
5、下(注:此处 代表一个空格 ) 1.02.03.0 则能进行正确输入的语句是 ( A) scanf(“%lf%lf%lf“,a,b,c); ( B) scanf(“%lf%lf%lf“, ( C) scanf(“%f%f%f“, ( D) scanf(“%5.1lf%5.1lf%5.1lf“, 17 若有定义语句 charc=101; 则变量 c在内存中占 ( A) 1个字节 ( B) 2个字节 ( C) 3个字节 ( D) 4个字节 18 若有以下程序 #include main() charc1,c2; c1=C+8-3;c2=9-0; printf(“%c%dn“,c1,c2); 则程序
6、的输出结果是 ( A) H 9 ( B) H 9 ( C) F 9 ( D)表达式不合法输出无定值 19 表示关系式 xyz的 C语言表达式的是 ( A) (x =y) switch(x) case1:switch(y) case0:a+;break; case1:b+;break; case2:a+;b+;break; printf(“a=%d,b=%dn“,a,b); 程序运行后的输出结果是 ( A) a=1,b=0 ( B) a=1,b=1 ( C) a=2,b=1 ( D) a=2,b=2 21 有以下程序 #include main() intk,j,s; for(k=2;k 6;k
7、+,k+) s=1; for(j=k;j 6;j+)s+=j; printf(“%dn“,s); 程序运行后的输出结果是 ( A) 6 ( B) 10 ( C) 24 ( D) 40 22 由以下 while构成的循环,循环体执行的次数是 intk=0; while(k=1)k+; ( A)有语法错,不能执行 ( B)一次也不执行 ( C)执行一次 ( D)无限次 23 有以下程序 #include intfun(inta,intB) returna+b; main() intx=6,y=7,z=8,r; r=fun(fun(x,y),z-); printf(“%dn“,r); 程序运行后的输
8、出结果是 ( A) 21 ( B) 15 ( C) 20 ( D) 31 24 以下选项中函数形参不是指针的是 ( A) fun( int *a ) ( B) fun( int a10 ) ( C) fun( int p= for(x=0;x 3;x+)y=y+*(p+x); printf(“%dn“,y); 程序运行后的输出结果是 ( A) 17 ( B) 19 ( C) 18 ( D) 20 26 以下程序调用 fun函数求数组中最大值所在元素的下标。 #include voidfun(int*s,intn,int*k) inti; for(i=0,*k=i;i main() inta34
9、=1,3,5,7,9,11,13,15,17,19,21,23,(*p)4=a,i,j,k=0; for(i=0;i 3;i+) for(j=0;j 2;j+)k=k+*(*(p+i)+j); printf(“%dn“,k); 程序运行后的输出结果是 ( A) 108 ( B) 68 ( C) 99 ( D) 60 28 有以下程序 #include intfuna(inta,intB)returna+b; intfunb(inta,intB)returna-b; intsss(int(*t)(),intx,inty)return(*t)(x,y); main() intx; x=sss(fu
10、na,9,3);x+=sss(funb,8,3);printf(“%dn“,x); 程序运行后的输出结果是 ( A) 24 ( B) 23 ( C) 17 ( D) 22 29 有以下程序 #include intfun(intx) intp; if(x=0|x=1)return(3); p=x-fun(x-2); return(p); main() printf(“%dn“,fun(9); 程序运行后的输出结果是 ( A) 4 ( B) 5 ( C) 9 ( D) 7 30 以下选项中,能正确进行字符串赋值的是 ( A) char *s = “ABCDE“ ; ( B) char s5 =
11、A, B, C, D, E ; ( C) char s45 = “ABCDE“ ; ( D) char *s ; gets( s ); 31 有以下程序 #include voidfun(char*p) inti; for(i=0;i 4;i+)printf(“%s“,pi); main() char*s6=“ABCD“,“EFGH“,“IJKL“,“MNOP“,“QRST“,“UVWX“; fun(s);printf(“n“); 程序运行后的输出结果是 ( A) ABCDEFGHIJKL ( B) ABCD ( C) AEIM ( D) ABCDEFGHIJKLMNOP 32 以下 fun函
12、数的功能是将形参 s所指字符串内容颠倒过来 voidfun(char*s) inti,j,k; for(i=0,j=strlen(s)_;i voidfun(char*p,intn) charb6=“abcde“;inti; for(i=0,p=b;i n;i+)pi=bi; main() chara6=“ABCDE“; fun(a,5);printf(“%sn“,a); 程序运行后的输出结果是 ( A) abcde ( B) ABCDE ( C) edcba ( D) EDCBA 34 有以下程序 #include fun(inta,intb) intstaticm=0,i=2; i=i+m
13、+1; m=i+a+b; returnm; main() intk=4,m=1,p; p=fun(k,m); printf(“%d,“,p); p=fun(k,m); printf(“%dn“,p); 程序运行后的输出结果是 ( A) 8,17 ( B) 7,16 ( C) 8,8 ( D) 7,17 35 若有以下程序 #include intk=7; voidf(int*s) int*t= *s=t; printf(“%d,%d,%d,“,k,*t,*s); main() inti=3,*p= f(r);printf(“%d,%d,%dn“,i,*p,*r); 则程序的输出结果是 ( A)
14、 3,3,3,7,7,7 ( B) 3,7,7,7,7,7 ( C) 7,7,7,3,3,3 ( D) 7,7,7,3,7,7 36 以下结构体说明和变量定义中 ,正确的是 ( A) typedef struct abc int n;double m; ABC; ABC x,y; ( B) struct abc int n;double m ; struct abc x, y; ( C) struct ABC int n;double m; struct ABC x, y; ( D) struct abc int n;double m; ; abc x, y; 37 有以下程序 #includ
15、e #include voidfun(int*p1,int*p2,int*s) s=(int*)malloc(sizeof(int); *s=*p1+*(p2+); main() inta2=1,2,b2=10,20,*s=a; fun(a,b,s);printf(“%dn“,*s); 程序运行后的输出结果是 ( A) 11 ( B) 10 ( C) 1 ( D) 2 38 以下程序依次把从终端输入的字符存放到 f文件中,用 #作为结束输入的标志 ,则在横线处应填入的选项是 #include main() FILE*fp;charch; fp=fopen(“fname“,“w“); while
16、(ch=getchar()!=#)fputc(_); fclose(fp); ( A) ch, “fname“ ( B) fp, ch ( C) ch ( D) ch, fp 39 有以下程序 #include #defineN2 #defineMN+1 #defineNUM(M+1)*M/2 main() printf(“%dn“,NUM); 程序运行后的输出结果是 ( A) 4 ( B) 8 ( C) 9 ( D) 6 40 有以下程序 #include main() inti=0; i=i; printf(“%dn“,i); 程序运行后的输出结果是 ( A) 8 ( B) 0 ( C)
17、1 ( D) -1 国家二级 C语言机试(选择题)模拟试卷 46答案与解析 一、选择题 1 【正确答案】 C 【试题解析】 在数据流图中,用标有名字的箭头表示数据流。在程序流程图中,用标有名字的箭头表示控制流。所以选择 C。 2 【正确答案】 A 【试题解析】 结构化程序设计的思想包括:自顶向下、逐 步求精、模块化、限制使用 goto语句,所以选择 A。 3 【正确答案】 B 【试题解析】 软件设计中模块划分应遵循的准则是高内聚低偶合、模块大小规模适当、模块的依赖关系适当等。模块的划分应遵循一定的要求,以保证模块划分合理,并进一步保证以此为依据开发出的软件系统可靠性强,易于理解和维护。模块之间
18、的耦合应尽可能的低,模块的内聚度应尽可能的高。 4 【正确答案】 B 【试题解析】 A错误,可行性分析阶段产生可行性分析报告。 C错误,概要设计说明书是总体设计阶段产生的文档。 D错误,集成测试计划是在 概要设计阶段编写的文档。 B正确,需求规格说明书是后续工作如设计、编码等需要的重要参考文档。 5 【正确答案】 A 【试题解析】 算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。有穷性是指算法程序的运行时间是有限的。 6 【正确答案】 D 【试题解析】 除了堆排序算法的比较次数是 O(nlog2n),其他的都是 n(n 1)/2。 7 【正确答案】 B 【试题解析】 栈是按
19、“先进后出 “的原则组织数据的,数据的插入和删除都在栈顶进行操作。 8 【正确答案】 C 【试题解析】 E R图转换成关系模型数据则是把图形分析出来的联系反映到数据库中,即设计出表,所以属于逻辑设计阶段。 9 【正确答案】 D 【试题解析】 自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉,所以 B错误。笛卡尔积是用 R集合中元素为第一元素, S集合中元素为第二元素构成的有序对,所以 C错误。根据关系 T可以很明显的看出是从关系 R与关系 S中取得相同的关系组所以取得是交运算,选择 D。 10 【正确答案】 C 【试题解析】 学号
20、是学生表 S的主键,课号是课程表 C的主键,所以选课表 SC的关键字就应该是与前两个表能够直接联系且能唯一定义的学号和课号,所以选择 C。 11 【正确答案】 B 【试题解析】 C语言程序的模块化通过函数来体现 ,所以选择 B。 12 【正确答案】 A 【试题解析】 常量是指在程序运行过程中其值不能被改变的量 ,如 5、 1.0、字符a等。 C语言的标识符分为 3类 :关键字、预定义标识符和用户标识符。常量不属于标识符,所以选择 A。 13 【正确答案】 B 【试题解析】 C语言中的不等于符号用 “!=“表示 ,没有符号 “。所以选择 B。 14 【正确答案】 C 【试题解析】 C语言规定 ,
21、C语句必须以分号 “;“结束。 C选项中没有结束符号 ,所以错误。 15 【正确答案】 C 【试题解析】 %f的输出格式是以带小数点的数学形式输出浮点数。首先计算x*1000,结果为 5168.94然后 +0.5,结果为 5169.44,然后进行强制类型转换 ,转换成整型为 5169,然后除以双精度数据 1000,结果也为双精度数据 5.169,输出时按照 %f的格式输出,所以输出结果为 5.169000。 16 【正确答案】 B 【试题解析】 scanf函数的一般形式为 scanf(格式控制 ,变量 1地址 ,变量 2地址 ,), 其中,格式字符串要与数据类型保持一致 ,所以格式字符串中应为
22、 %lf,后面应该为变量地址 ,所以需要加上符号 “ break;后, a的值为 1,继续执行语句 case 2: a+; b+; break;a的值为 2, b的值为 1。因此 C选项正确。 21 【正确答案】 B 【试题解析】 本题重点考察 for语句循环嵌套,首先 k=2,进行一次循环后, k自增两次,变成 4,这时 s为 1。即当 k=4的时候, s=1, j=4,执行内层循环,s=1+4, j自增 1后等于 5, s=5+5, j再自增 1后即为 6,跳出内层循环。 k自增两次后等于 6,不成立,跳出外层循环。最后输出 s的值,即为 10。因此 B选项正确。 22 【正确答案】 D
23、【试题解析】 本题考察 while语句, while语句的语义是:计算表达式的值,当值为真 (非 0)时, 执行循环体语句。 k=1为赋值语句,即 k 的值等于 1。 while(k=1) = while(1) ,是死循环,执行无限次。因此 A选项正确。 23 【正确答案】 A 【试题解析】 函数 fun的功能是返回两个形参的和。调用函数 fun(x,y)时,将变量 x=6和 y=7 的值分别传送变量 a和 b,并且 通过语句 return a+b;将 13返回给主函数。继续调用函数 fun(13,z-),这里 z-指将 z的值参与运算后,再将 z的值减 1操作;将 13和 8分别传送变量 a
24、和 b,且通过语句 return a+b;将 21返回给主函数。因此 A选项正确。 24 【正确答案】 C 【试题解析】 B选项和 D选项是将数组作为函数参数; A选项是将指针作为函数参数;因此 C选项正确。 25 【正确答案】 B 【试题解析】 本题通过语句 “p= 可得到 x=9+3=12,而后直接传入函数 funb,x=x+8-3=12+5=17。因此 C选项正确。 29 【正确答案】 D 【试题解析】 本题考查函数的递归调用,执行 f(9)后, f(9)=9-(7-(5-(3-f(1) =7,所以答案为 D选项。 30 【正确答案】 A 【试题解析】 本题考查字符数组的初始化, B选项
25、中赋值号右侧是赋值给一个字符串数组,而左边是一个字符数组,所以错误。 C选项中字符串包 含 6个字符,所以不能赋值在左边只能放 5个字符的字符串数组中。 D选项 gets函数中参数需要指定长度。所以选项 A正确。 31 【正确答案】 D 【试题解析】 本题考查字符串数组, s表示指向字符数组的指针, s指向了第一个字符串, s+指向了第二个字符串,所以最后输出结果为 D选项。 32 【正确答案】 B 【试题解析】 本题考查字符串处理函数 strlen, strlen计算一个字符串的长度,包含结尾符,所以本题中 j的初始化应该是从最后一个字符开始,所以应该将得到的字符串长度减 1,选项 B正确。
26、 33 【正确答案】 B 【试题解析】 本题考查数组名作为函数参数,执行 f函数时,传进去的 a指针被重新指向了 b,所以原本 a数组的地址内容不变,所以输出结果为 ABCDE,答案为 B选项。 34 【正确答案】 A 【试题解析】 本题考查静态局部变量,本题中先执行 fun(4,1)得到返回值为 8,此时静态局部变量 m为 8, i为 3,那么再次执行 fun(4,1)得到的值为 17,所以选项 A正确。 35 【正确答案】 D 【试题解析】 在主函数中分别给整型变量 i,指针型变量 p和指向指针的指针变量r赋初值 ;调用 f函数 ,并将实参变量 r的值传递给形参变量 s,在 f函数中 ,通
27、过printf(“%d,%d,%d,“, k, *t, *s);语句输出 7,7,7;返回主函数 ,通过printf(“%d,%d,%dn“, i, *p, *r);输出 3,7,7。因此 D选项正确。 36 【正确答案】 A 【试题解析】 本题考查 typedef的使用方法, typedef对已存在的类型使用一个新的名字,选项 A中 ABC为新的类型别名,定义正确。 37 【正确答案】 C 【试题解析】 本题考查把数组名作为函数参数 ,执行 fun函数后, s的值并没有发生变化,仍然是指向 a,所以输出结果为 1,选项 C正确。 38 【正确答案】 D 【试题解析】 本题考查 fputc函数,该函数将字符 ch写到文件指针 fp所指向的文件的当前写指针的位置。函数格式: int fputc (int n, File *fp)答案为 D选项。 39 【正确答案】 B 【试题解析】 本题考查宏定义,宏定义只是做个简单的替换,执行NUM=(N+1+1)*N+1/2=8,选项 B正确。 40 【正确答案】 D 【试题解析】 本题考查位运 算中按位取反, 0按位取反就是 -1,所以选项 D正确。