1、国家二级( C语言)机试模拟试卷 86及答案与解析 一、选择题 1 程序流程图中带有箭头的线段表示的是 ( )。 ( A)图元关系 ( B)数据流 ( C)控制流 ( D)调用关系 2 结构化程序设计的基本原则不包括 ( )。 ( A)多态性 ( B)自顶向下 ( C)模块化 ( D)逐步求精 3 软件设计中模块划分应遵循的准则是 ( )。 ( A)低内聚低耦合 ( B)高内聚低耦合 ( C)低内聚高耦合 ( D)高内聚高耦合 4 在软件开发中,需求分析阶段产生的主要文档是 ( )。 ( A)可行性分析报告 ( B)软件需求规格说明书 ( C)概要设计说明书 ( D)集成测试计划 5 算法的有
2、穷性是指 ( )。 ( A)算法程序的运行时间是有限的 ( B)算法程序所处理的数据量是有限的 ( C)算法程序的长度是有限的 ( D)算法只能被有限的用户使用 6 对长度为 n的线性表排序,在最坏情况下,比较次数不是 n(n一 1) 2的排序方法是 ( )。 ( A)快速排序 ( B)冒泡排序 ( C)直接插入排序 ( D)堆排序 7 下列关于栈的叙述正确的是 ( )。 ( A)栈按 “先进先出 ”组织数据 ( B)栈按 “先进后出 ”组织数据 ( C)只能在栈底插入数据 ( D)不能删除数据 8 在数据库设计中,将 E-R图转换成关系数据模型的过程属于 ( )。 ( A)需求分析阶段 (
3、B)概念设计阶段 ( C)逻辑设计阶段 ( D)物理设计阶段 9 有三个关系 R、 S和 T如下:由关系 R和 S通过运算得到关系 T,则所使用的运算为 ( )。 ( A)并 ( B)自然连接 ( C)笛卡尔积 ( D)交 10 设有表示学生选课的三张表,学生 S(学号,姓名,性别,年龄,身份证号 ),课程 C(课号,课名 ),选课 SC(学号,课号,成绩 ),则表 SC的关键字 (键或码 )为( )。 ( A)课号,成绩 ( B)学号,成绩 ( C)学号,课号 ( D)学号,姓名,成绩 11 以下叙述中错误的是 ( )。 ( A) C语言中的每条可执行语句和非执行语句最终都将被转换成二进制的
4、机器指令 ( B) C程序经过编译、连接步骤之后才能形成一个真正可执行的二进制机器指令文件 ( C)用 C语言编写的程序称为源程序,它以 ASCII代码形式存放在一个文本文件中 ( D) C语言源程序经编译后生成后缀为 obj的目标程序 12 以下选项中,合法的一组 C语言数值常量是 ( )。 ( A) 12 0Xa23 4 5e0 ( B) 028 5e一 3 -Oxf。 ( C) 177 4e1 5 0abe ( D) 0x8A 10 000 3 e5 13 以下选项中不合法的标识符是 ( )。 ( A) &a ( B) FOR ( C) 13rint ( D) _00 14 若有代数式
5、(其中 e仅代表自然对数的底数,不是变量 ),则以下能够正确表示该代数式的 C语言表达式是 ( )。 ( A) sqrt(fabs(pow(n, x)+exp(x) ( B) sqrt(fabs(pow(n, x)+pow(x, e) ( C) sqrt(abs(nx+ex) ( D) sqrt(fabs(pow(x, n)+exp(x) 15 若有定义: double a=22; int: i=0, k=18;,则不符合 C语言规定的赋值语句是 ( )。 ( A) i=(a+k) main() int s, t, A=10; double B=6; s=sizeof(A); t=sizeof
6、(B); prinff(“ d, d n”, s, t); 在 VC 6 0平台上编译运行,程序运行后的输出结果是 ( )。 ( A) 10, 6 ( B) 4, 4 ( C) 2, 4 ( D) 4, 8 17 有以下程序: #include main() char a, b, c, d; seanf(” c c”, &a, &b); c=getchar(); d=getchar(); pnnff(“ c c c c n”, a, b, e, d); 当执行程序时,按下列方式输入数据 (从第 1列开始, 代表回车,注意:回车也是一个字符 ) 12 34 则输出结果是 ( )。 ( A) 12
7、 34 ( B) 12 ( C) 1234 ( D) 12 3 18 以下关于逻辑运算符两侧运算对象的叙述中正确的是 ( )。 ( A)可以是任意合 法的表达式 ( B)只能是整数 0或非 0整数 ( C)可以是结构体类型的数据 ( D)只能是整数 0或 1 19 有以下程序: #include main() int a=0, b=0, c=0, d=0; if(a=1)b=1; c=2; else d=3: pnnff(“ d, d, d, d n”, a, b, c, d); 程序运行后的输出结果是 ( )。 ( A) 1, 1, 2, 0 ( B) 0, 0, 0, 3 ( C)编译有错
8、 ( D) 0, 1, 2, 0 20 有以下程序: #include main() int x=1, y=0, a=0, b=0; switch(x) ease 1: switch(y) ease 0: a+; break; case 1: b+; break; ease 2: a+; b+; break; ease 3: a+; h+; printf(“a= d, b= d n”, a, b); 程序运行后的输出结果是 ( )。 ( A) a=2, b=2 ( B) a=2, b=1 ( C) a=1, b=1 ( D) a=1, b=0 21 以下程序段中的变量已正确定义: for(i=
9、0; i int i, n; for(i=0; i int f(int x); main() int n=1, m; m=f(f(f(n); printf(“ d n”, m); int f(int x) return x*2; 程序运行后的输出结果是 ( )。 ( A) 8 ( B) 2 ( C) 4 ( D) 1 24 以下叙述中错误的是 ( )。 ( A)可以给指针变量赋一个整数作为地址值 ( B)函数可以返回地址值 ( C)改变函数形参的值,不会改变对应实参的值 ( D)当在程序的开头包含头文件 stdio h时,可以给指针变量赋 NULL 25 设已有定义: float X;,则以下
10、对指针变量 P进行定义且赋初值的语句中正确的是 ( )。 ( A) int*P=(float)X; ( B) float*P=&x; ( C) float P=&x; ( D) float*P=1024; 26 以下数组定义中错误的是 ( )。 ( A) int x23=1, 2, 3, 4, 5, 6; ( B) int x3=0; ( C) int x3=1, 2, 3, 4, 5, 6; ( D) int x23=1, 2, 3, 4, 5, 6; 27 有以下程序: #include void fun(int a, int n) int i, t; for(i=0; i #define
11、 N 4 void fun(int aN, int b) int i; for(i=0; i #include main() char str20= “ One*World”, “One*Dream!”, *P=str1; printf(“ d, ”, strlen(P); prinff(“ s n”, P); 程序运行后的输出结果是 ( )。 ( A) 10, One*Dream! ( B) 9, One*Dream! ( C) 9, One*World ( D) 10, One*World 32 有以下程序: #include main() char S=“012xy 08s34f4w2”
12、; int i, n=0; for(i=0; Si!=0; i+) if(Si=一 0&Si fun(int x, int y) static int m=0, i=2; i+=m+1; m=i+x+y; return m; main() int j=1, m=1, k; k=fun(j, m); prinff(“ d, ”, k); k=fun(j, m); prinff(“ d n”, k); 程序执行后的输出结果是 ( )。 ( A) 5, 1 1 ( B) 5, 5 ( C) 1 1, 1 1 ( D) 11, 5 34 在 C语言中,只有在使用时才占用内存单元的变量,其存储类型是 (
13、 )。 ( A) auto和 static ( B) extern和 register ( C) auto和 register ( D) static和 register 35 下面结构体的定义语句中,错误的是 ( )。 ( A) struct ordint x; int y; int z; struct ord a; ( B) struct ordint x; int y; int z; ; struct ord a; ( C) struct ordint x; int y; int z; a; ( D) structint x; int y; int z; a; 36 有以下程序: #in
14、clude typedef structint b, P; A; void f(A C) *注意: C是结构变量名 * int j; c.b+=1; e.p+=2; main() int i; A a=1, 2; f(a); printf(“ d, d n”, a b, a P); 程序运行后的输出结果是 ( )。 ( A) 2, 4 ( B) 1, 2 ( C) 1, 4 ( D) 2, 3 37 以下叙述中正确的是 ( )。 ( A)在 C语言中,预处理命令行都以 “#”开头 ( B)预处理命令行必须位于 C源程序的起始位置 ( C) #include必须放在 C程序的开头 ( D) C语
15、言的预处理不能实现宏定义和条件编译的功能 38 有以下程序: #include #include int fun(int n) int*P; P=(int*)malloc(sizeof(int); *P=n; return*P; main() int a; a=fun(10); printf(“ d n”, a+fun(10); 程序运行后的输出结果是 ( )。 ( A) 0 ( B) 10 ( C) 20 ( D)出错 39 有以下程序: #include main() unsigned char a=8, c; C=a3: printf(“ d n”, C); 程序运行后的输出结果是 (
16、)。 ( A) 16 ( B) 1 ( C) 32 ( D) 0 40 读取二进制文件的函数调用形式为: fread(buffer, size, count, fp);,其中buffer代表的是 ( )。 ( A)一个内存块的字节数 ( B)一个整型变量,代表待读取的数据的字节数 ( C)一个文件指针,指向待读取的文件 ( D)一个内存块的首地址,代表读人数据存放的地址 二、程序填空题 41 下列给定程序中,函数 fun的功能是:求 SS所指字符串数组中长度最短的字符串所在的行下标,作为函数值返回,并把其串长放在形参 n所指的变量中。 ss所指字符串数组中共有 M个字符串,且串长小于 N。请在
17、程序的下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。 注意:部分源程序在文件 BLANK1 C中。 不得增行或删行,也不得更改程序的结构 ! #include #include #define M 5 #define N 20 int fun(ehar(* ss)N, int*n) int i, k=0, len=N; *found* for(i=0; i void fun(char*p, char*b) int i, k=0; while(*p) i=1; while(i void fun(char*a) main() char s81; void NONO(); prinff
18、(“Enter a string: n”); gets(s); fun(s); prinff(”The string after deleted: n”); puts(s); NONO(); void NONO() *本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 * FILE*in, *out; int i; char s81; in=fopen(“in dat”, “r”); out=fopen(“out dat”, “w”); for(i=0; i即回车给了变量 c,字符 3给了变量 d。所以打印输出的结果为 D选项。 18 【正确答案】 A 【试题解析】 C语言的逻辑运算
19、符比较特别,它的操作数没有明确的数据类型,可以是任意合法的表达式,所以选择 A。 19 【正确答案】 C 【试题解析】 本题中 if(a=1)b=1;与 else d=3;之间多了语句 c=2;所以会出现else语句的位置错误的编译失败提示。 20 【正确答案】 B 【试题解析】 case常量表达式只是起语句标号作用,并不是该处进行条件判断。在执行 switch语句时,根据 switch的表达式,找到与之匹配的 case语句,就从此case子句 执行下去,不在进行判断,直到碰到 break或函数结束为止。所以执行内层 switch(y)时只执行了 a+,此时 a的值为 1。然后执行外层 cas
20、e 2语句的 a+十; b+; a为 2, b为 1。所以结果为 B。 21 【正确答案】 C 【试题解析】 由于内层循环 for(k=1; k3; k+)后面直接跟了空语句 “; ”所以在循环内部什么操作也不做,跳出外层循环后执行打印语句,所以打印了一个 “*”,选择 C。 22 【正确答案】 D 【试题解析】 case常量表达式只是起语句标号作用,并不是该处进行条件判 断。在执行 switch语句时,根据 switch的表达式,找到与之匹配的 case语句,就从此case子句执行下去,不再进行判断,直到碰到 break或函数结束为止。简单的说break是结束整个循环体,而 continue
21、是结束单次循环。 B选项中当产生的随机数n为 4时要执行打印操作。 C选项中当产生的随机数为 1和 2时分别执行 case3与case4后面语句的内容。由于存在 break语句所以 for循环不是固定执行 8次,执行次数与产生的随机数 n有关系。 23 【正确答案】 A 【试题解析】 第一次调用 m=f(f(f(1),第二次为 m=f(f(2),第三次为 m=f(4),即返回值为 8。 24 【正确答案】 A 【试题解析】 不能将一个整数直接赋给指针变量作为地址,所以 A是错误的。函数的返回值可以是地址,即指针。函数调用中形参值的变化不会传递给实参。 25 【正确答案】 B 【试题解析】 指针
22、是用来存放地址的变量,用 (类型名 +指针变量名 )的形式定义。赋值时应将某个变量地址即 &x赋给指针变量,所以选择 B。 26 【正确答案】 D 【试题解析】 D选项中 x23定义的是一个两行三列 的二维数组,而在给数组元素赋值时却赋成了三行,所以错误。 27 【正确答案】 A 【试题解析】 本题中的函数 fun()的功能是将数组 k中前 5个元素倒序,所以返回后数组 k中的元素排列是 5, 4, 3, 2, 1, 6, 7, 8, 9, 10。所以打印输出 k2到 k7元素的值,即 321678,所以选择 A。 28 【正确答案】 A 【试题解析】 本题中由 fun函数可知, b0=a00
23、一 a03=1一 4=一 3,b1=a11一 12=67=一 1, b2=a22一 21=11一 10=1, b3=a33一31=1613=3。所以主函数中打印 y数组元素的值为 A选项。 29 【正确答案】 C 【试题解析】 字符串的输入不能使用 scanf(“ s”, s);而应该使用 gets(s)。 30 【正确答案】 A 【试题解析】 根据题目中的定义可以知道 sizeof(p),计算的是数组 p中所有元素所占用的字节数,而不是 chat。型数据所占字节数。 31 【正确答案】 A 【试题解析】 p是指向二维字符数组第二行 One+Dream!的数组指针,所以长度是 10,打印输出的
24、也是该字符串。 32 【正确答案】 B 【试题解析】 本题中遇到 “ ”字符循环结束,所以只统计 “ ”之前的数字字符,所以为 3。 33 【正确答案】 A 【试题解析】 声明静态局部变量:函数调用结束后,其占用的存储单元不释放,在下次该函数调用时,该变量保留上一次函数调用结束时的值。本题子函数 fun中的变量 i和 m均为静态局部变量。所以第一次调用 fun函数,返回 m的值为5,第二次再调用。 fun函数时, i的值为 3, m的值已经是 5了,所以执行i+=m+1, i的值变为 9, m=i+x+y=9+l+1=11。 34 【正确答案】 C 【试题解析】 auto:函数中的局部变量,动
25、态地分配存储空间,数据存储在动态存储区中,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。 register:为了提高效率, C语言允许将局部变量的值放在CPU中的寄存器中,这种变量叫 “寄存器变量 ”,只有局部自动变量和形式参数可以作为寄存器变量。 extem:外部变量 (即全局变量 )是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。如果外 部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。 static:静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。 35 【正确答案】 A 【试
26、题解析】 A选项 stllJct ordint x; int y; int z; struct ord a;错误,不能在定义结构体的同时,又用结构体类型名定义变量。应该写成 B选项或者 D选项的格式。 36 【正确答案】 B 【试题解析】 结构体变量可以作为函数的参数和返回值。作为函数的实参时,可以实现 函数的传值调用。当使用结构体变量作为函数的形参时,实参也应该是结构体变量名以实现传值调用,实参将拷贝副本给形参,在被调用函数中改变形参值对于调用函数中的实参没有影响。所以选择 B。 37 【正确答案】 A 【试题解析】 预处理命令是以 “#”号开头的命令,它们不是 c语言的可执行命令,这些命令
27、应该在函数之外书写,一般在源文件的最前面书写,但不是必须在起始位置书写,所以 B、 c错误。 c语言的预处理能够实现宏定义和条件编译等功能,所以 D错误。 38 【正确答案】 C 【试题解析】 malloc(sizeof(int)的作用是开辟一个长度为 sizeof(int)存储空间,并通过强制类型转换 (int水 )将此存储空间的地址赋给了一个整型的指针变量 p。然后执行语句 +p=n,使得 +p的值为 10,并通过 retum返回此值,即 a的值为 10。然后在主函数中输出 a+fun(10)=10+10=20。 39 【正确答案】 B 【试题解析】 无符号整型变量 a的值为 8,二进制表
28、示为 00001000,右移 3位后为 00000001,即十进制的 1,所以输出 l。 40 【正确答案】 D 【试题解析】 fread(void*buffer, sizet size, sizetcount, FILE*stream);功能是从一个文件流中读数据,读取 count个元素,每个元素 size字节,如果调用成功返回 count。 buffer:用于接收数据的内存地址,大小至少是 size * count字节;size:单个元素的大小,单位是字节; count:元素的个数,每个元素是 size字节; stream:输入流。 二、程序填空题 41 【正确答案】 (1)M (2) (3)k 三、程序修改题 42 【正确答案】 (1)bk=*p; (2)bk=; k+; 四、程序设计题 43 【正确答案】 void fun(char*a) int i=0: char*p=a; w hiIe(*p&*p=*) ai=*p; i+: p+; while(*p) if(术 p!=*) ai=*p; i+; p+; ai= 0;