1、国家二级( C语言)机试模拟试卷 22及答案与解析 一、选择题 1 下列数据结构中,能用二分法进行查找的是 ( )。 ( A)无序线性表 ( B)线性链表 ( C)二叉链表 ( D)顺序存储的有序表 2 下列叙述中,不属于设计准则的是 ( )。 ( A)提高模块独立性 ( B)使模块的作用域在该模块的控制域中 ( C)设计成多入口、多出口模块 ( D)设计功能可预测的模块 3 下列队列的描述中,正确的是 ( )。 ( A)队列属于非线性表 ( B)队列在队尾删除数据 ( C)队列按 “先 进后出 ”进行数据操作 ( D)队列按 “先进先出 ”进行数据操作 4 对下列二叉树进行前序遍历的结果为
2、( )。 ( A) ABCDEFGH ( B) ABDGEHCF ( C) GDBEHACF ( D) GDHEBFCA 5 对于长度为 n的线性表,在最坏情况下,下列各排序法所对应的比较次数中正确的是 ( )。 ( A)冒泡排序为 n(n-1) 2 ( B)简单插入排序为 n ( C)希尔排序为 n ( D)快速排序为 n 2 6 为了使模块尽可能独立,要求 ( )。 ( A)内聚程度要尽量高,耦合程度要尽 量强 ( B)内聚程度要尽量高,耦合程度要尽量弱 ( C)内聚程度要尽量低,耦合程度要尽量弱 ( D)内聚程度要尽量低,耦合程度要尽量强 7 下列选项中不属于软件生命周期开发阶段任务的是
3、 ( )。 ( A)软件测试 ( B)概要设计 ( C)软件维护 ( D)详细设计 8 数据独立性是数据库技术的重要特点之一。所谓数据独立性是指 ( )。 ( A)数据与程序独立存放 ( B)不同的数据被存放在不同的文件中 ( C)不同的数据只能被对应的应用程序所使用 ( D)以上三种说法都不对 9 在学 校中, “班级 ”与 “学生 ”两个实体集之间的联系属于 ( )关系。 ( A)一对一 ( B)一对多 ( C)多对一 ( D)多对多 10 软件调试的目的是 ( )。 ( A)发现错误 ( B)改善软件的性能 ( C)改正错误 ( D)验证软件的正确性 11 C语言源程序名的后缀是 ( )
4、。 ( A) exe ( B) C ( C) obj ( D) cp 12 若函数中有定义语句: int a;,则 ( )。 ( A)系统将自动给 a赋初值 0 ( B)这时 a中的值是和随机数 ( C)系统 将自动给 a赋初值 -1 ( D)这 a中无任何值 13 以下选项中,合法的一组 C语言数值常量是 ( )。 ( A) 028 ( B) 12 OXa23 4 5e0 ( C) 177 4c1 5 Oabc ( D) 0x8A 10,000 3 E5 14 下列语句组中,不正确的是 ( )。 ( A) char*s; s=“Olympic“; ( B) char s=“Olympic“;
5、 ( C) char*s; s=“Olympic“; ( D) char s=”Olympic“; 15 若在 定义语句: int a,b,c,*p=&c;之后,接着执行以下选项中的语句,则能正确执行的语句是 ( )。 ( A) scanf(“ d“, a, b, c); ( B) scanf(“ d d d“, a, b, c); ( C) scanf(“ d“, p); ( D) scanf(“ d“, &p); 16 有以下程序,其中 u表示按无符号整数输出 ( )。 main() unsigned int x=0xFFFF; *x的初值为十六进制数 * printf(“ u n“, x
6、); 程序运行后的输出结果是 ( )。 ( A) -1 ( B) 65535 ( C) 32767 ( D) 0xFFFF 17 设变量 x和 y均已正确定义并赋值,以下 if语句中,在编译时将产生错误信息的是 ( )。 ( A) if(x+); ( B) if(xy&y!=0); ( C) if(xy)x-else y+; ( D) if(y100)break; ( B) for(; ); ( C) int k=10000; dok+; while(k10000); ( D) int s=36; while(s) -s; 21 在 pnntf的格式字符中, e格式字符的作用是 ( )。 (
7、A)以十六进制无符号形式输出整数 ( B)以带符号的十进制形式输出整数 ( C)以指数形式输出实数 ( D)以字符形式输出,且只输出一个字符 22 以下选项中正确的语句组是 ( )。 ( A) char s; s=“HELLO!“; ( B) char*s; s=“HELLO!“; ( C) char s10; s=“HELLO!“; ( D) char*s; s=“HELLO!“; 23 字符串 “ “ABCDEF “ “的长度是 ( )。 ( A) 11 ( B) 10 ( C) 5 ( D) 3 24 下列说法正确的是 ( A) int(*def)10; -def指向一个指针,该指针指向
8、 10个整型变量构成的数组 ( B) int*(*gll10); -gh指向一个指针,该指针指向 10个整型变量构成的数组 ( C) int*(*gh10); -gh是一个指针,指向由 10个指向整型变量的指针构成的数组 ( D) A, C均正确 25 若函数调用 时的实参为变量,以下关于函数形参和实参的叙述中正确的是( )。 ( A)函数的实参和其对应的形参共占同一存储单元 ( B)形参只是形式上的存在,不占用具体存储单元 ( C)同名的实参和形参占同一存储单元 ( D)函数的形参和实参分别占用不同的存储单元 26 设有如下定义: struct sk int m; float x; data
9、,*q; 若要使 q指向 data中的 m域,正确的赋值语句是 ( )。 ( A) q=&data m; ( B) *q=data m; ( C) q=(struct sk*)&data m; ( D) q=(struct sk*)data m; 27 有以下程序: int fl(double a) return a*a; ) int f2(int x, int y) double a, b; a=f1(x); b=n(y); return a+b; main() double w; w=f2(2 1, 4 0); 程序执行后,变量 W的值是 ( )。 ( A) 20 21 ( B) 20 (
10、 C) 20 0 ( D) 0 0 28 若语句 “t=fun(fun(x, y, a), (a+b, a+c), x+y+z); ”对 fun函数的调用正确,则fun函数的形参个数为 ( )。 ( A) 3 ( B) 4 ( C) 5 ( D) 6 29 设 x为整型变量, n=14, n的地址为 4000; m=6, m的地址为 2000;执行语句x=&n后的结果为 ( )。 ( A) 14 ( B) 6 ( C) 2000 ( D) 4000 30 若有说明 int m34=3, 9, 7, 8 5, (*q)4:和赋值语句 q=m;,则对数组元素 mij(其中 0 struct tt
11、int x; struct tt*y; )*p; struct tt a4=20, a+1, 15, a+2, 30, a+3, 17, a; main() int i; p=a; for(i=1; ix); p=p-y; 程序的运行结果是 ( )。 ( A) 20, 30, ( B) 30, 17 ( C) 15, 30, ( D) 20, 15, 36 有以下程序: #include main() FILE*fp; int a10=1,2, 3, 0, 0), i; fp=fopen(“d2 dat“, “wb“); fwrite(a, sizeof(int), 5, fp); fwrit
12、e(a, sizeof(int), 5, fp); fclose(fp); fp=fopen(“d2 dat“, “rb“); fread(a, sizeof(int), 10, fp); fclose(fp); for(i=0; i #include #include void WriteText(FILE*); void ReadText(FILE*); main() FILE *fp; if(fp=fopen(“myfile4 txt“, “w“)=NULL) printf(“open fail! n“); exit(0); ) WriteText(fp); fclose(fp); if
13、(fp=fopen(“myfile4 txt“, “r“)=NULL) printf(“open fail! n“); exit(0); ) ReadText(fp); fclose(fp); *found* void WriteText(FILE_1_) char str81; printf(“ nEnter string with-1 to end: n“); gets(str); while(strcmp(str,“-1“)!=0) *found* fputs(_2_, fw); fputs(“ n“, fw); gets(str); void ReadText(FILE*fr) cha
14、r str81; printf(“ nbRead file and output to screen: n“); fgets(str,81, fr); while(!feof(fr) *found* printf(“ s“, _3_); fgets(str,81, fr); 三、程序修改题 42 给定程序 MODI1 C中函数 fun的功能是:判断一个整数是否是素数,若是返回 1,否则返回 0。 在 main()函数中,若 fun返回 1输出 YES,若 fun返回 0输出 NO!。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main函数。不得增行或删行,也不得更改程序的结构
15、 ! #include int fun(int m) int k=2: while(k void fun(char*a) main() char s81; void NONO(); printf(”Enter a string: n“); gets(s); fun(s); printf(“The string after deleted: n“); puts(s); NON00; void NONO() *本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 * FILE*in, *out; int i; char s81; in=fopen(“in dat“,“r“); out=fo
16、pen(“out dat“, “w“); for(i=0; iy)后面的 “x-”是一个表达式而不是一个语句,所以在编译时会产生错误信息。 18 【正确答案】 D 【试题解析】 当 x为大于 1的奇数时, x对 2求余的结果为 1,不为 0,所以选项D中表达式的值为 0。 19 【正确答案】 C 【试题解析】 本题考查逗号表达式的运用。 x=(i=4, j=16, k=32)中的 i=4,j=16, k=32构成一个逗号表达式,整个表达式的值取最后一项的值 ,即 32,所以x的值为 32。 20 【正确答案】 D 【试题解析】 选项 D中,首先定义的变量 s的值为 36,因为语句 -s;所以当
17、 s=0时循环会结束;选项 A由于 while(1)永远成立,循环构成死循环;选项 B中 for循环没有使循环结束的限定条件,也构成死循环;选项 C中由于 k永远大于10000,所以循环无法停止。 21 【正确答案】 C 【试题解析】 本题考查 printf函数的格式。格式字符 “e”或者 “E”都表示以指数形式输出单精度或双精度数。 22 【正确答案】 D 【试题解析】 本题考查数组和字符串的赋值。选项 A中数组 s没有明确其大小就赋值是错误的。选项 B中不能有大括号,选项 C中的写法应该为HELLO!。 23 【正确答案】 B 【试题解析】 本题涉及字符串最基本的 2个概念: 字符串的长度
18、是指字符串中字符的个数,但不包括字符串结束符; 以反斜杆 开头的特殊字符序列,意思是把反斜杆后丽的宁符序列转换成特定的含义,而不是原来的含义,不包含在字符串长度之内, 连同后面的字符为一个长度;而 也是如此。 24 【正确答案】 D 【试题解析】 int*(*gh10);一曲是一个指针,指向由 10个指向整型变量的指针构成的数组, int(*def)10; -def指向一个指针,该指针指向 10个整型变量构成的数组。 25 【正确答案】 D 【试题解析】 在 C语言中,函数的实参单无与形参单元在内存中分配不同的存储单元。在调用函数时,给形参分配临时存储单元,并将实参对应的值传递给彤参,在被调用
19、函数中对形参存储单元中的值进行运算,最后通过 rcturn语句把函数值返回调用函数。当调用结束后,形参单元被释放,实参单元仍保留 并维持原值。 26 【正确答案】 C 【试题解析】 利用强制类型转换 (struct sk*)把整数型地址 &data m转换成结构体变量指针赋给结构体指针变量 q。 27 【正确答案】 C 【试题解析】 本题考查函数调用的使用。计算 w的时候,先调用 f2函数, f2函数的公式是 “a+b”,计算 a和 b的时候义调用到 f1函数, f1的函数是 “a*a”,因此, w的计算公式为: w=(double)(int)(2 1*2 1)+(int)(4 0*4 0)=
20、20 0。 28 【正确答案】 A 【试题解析】 本题考查函数调用时的参数个数。在函数调用时,实参必须和形参的个数、类型一一对应。但函数的计算结果只有一个值,因而 fun函数的参数个数为 3。 29 【正确答案】 D 【试题解析】 &是取地址运算符,表达式 x=&a是表示将 a的地址赋给变量 x。 30 【正确答案】 D 【试题解析】 *(q+i)指向第 i行首地址, *(*(q+i)+j)代表第 i行第 j个元素。 31 【正确答案】 B 【试题解析】 函数 ss(char*s, chart)的功能是将指针 s所指向的字符串 中存在的字符 “t”均改写成大写字母;所以 main函数中引用函数
21、 ss后使得数组 str1中的小写字母 “d”均变成了大写字母 “D”,然后输出数组 str1,结果为: abcDDfefDbD。 32 【正确答案】 B 【试题解析】 字符串比较不能用 “=”,要用 strcmp(s1, s2)函数,字符串 s1和s2相等时返回值为 0,故 !strcmp(s1, s2)=1,条件成立执行后面的语句,输出theyare Equal。 33 【正确答案】 C 【试题解析】 根据 C语言的语法规则可知, int(*ptr)M中的标识符 ptr是一个指向具有 M个整型元素的一维数组指针。 34 【正确答案】 A 【试题解析】 C语言中,变量的隐含存储类型为 aut
22、o。 35 【正确答案】 D 【试题解析】 本题考查的是指针和结构的应用。首先定义的数组 tt中有两个成员,一个整型变量,一个结构指针。当 i=1时, p指针指向结构数组的第一个元素,并输出此元素的第一个成员 x即 20;当 i=2时, p指针指向结构数组的第二个元素的第一个成员,所以输出 15。 36 【正确答案】 D 【试题解析】 首先用函数。 fopen()以 “wb”的方式打开文件 “d2 dat”,然后调用两次 fwrite函数将数组 a的 5个元素,依次输出到文件 fp中 (共 10个字节 ),然后关闭文件。再次打开文件,使用文件指针指向文件的开头调用 fread函数从文件fp中读
23、取这 10个字节的数据到数组 a中,此时数组 a的内容就变为 1, 2, 3,0 0, l, 2, 3, 0, 0,因此最后的输出结果为 “1, 2, 3, 0, 0, 1, 2, 3, 0,0”。 37 【正确答案】 A 【试题解析】 本题主要考查结构体数组。 xi.num是结构体 xi中的 num成员,xi name2是结构体 xi中 name成员的第 3个元素。第一次循环, i=1,输出x1 num, x1 name2的值,即 2A:第二次循环, i=2,输出 x2num,x2 name2的值,即 3N:第三次循环, i=3,输出 x3 num, x3 name2的值,即 4E;第四次循
24、环, i=4,输出 x4 num, x4 nanlc2的值,即 50。 38 【正确答案】 C 【试题解析】 输出不会是 5 00000的,因为单精度浮点数和双精度浮点数在内存中的存储形式不 一样。 39 【正确答案】 C 【试题解析】 本题主要考查按位或运算。按位或是对两个运算对象相应的位进行逻辑或运算,其运算规则和逻辑或相同,两个运算对象只要有一个是 1,则结果为1。 40 【正确答案】 C 【试题解析】 字符串输入函数 fgetsO的调用形式为: fgets(s n, fp)。 s可以是一个字符数组名,或是指向字符串的指针; n为要读取的最多的字符个数: fp是指向该文件的文件型指针。字
25、符串输入函数的功能是:从 fp所指向的文件中读取长度不超过 n-1个字符的字符串,并将该字符串存放到字 符数组 s中。 二、程序填空题 41 【正确答案】 (1)*fw (2)str (3)str 【试题解析】 本题要求是把一段文本写到文件。 myfile4 txt中,用 -1作为字符串输入结束的标志。然后将文件的内容读出显示在屏幕上。主要是文件操作以及fputs和 fgets函数的使用。 解题思路 第一空:此处是补充函数参数名,参数类型已知是 FILE文件指针, fputs(“n“, fw)是将字符 “ n”写入文件,可知 fw是文件指针名,因此第一空处应该是void WriteText(F
26、ILE*fw)。 第二空: while(s仃 cmp(str, “-1“)!=0)循环的结束标志是 str字符串等于 “-1”时循环退出。如果 str不等于 “-1”,执行循环体内容:用 fputs函数将 str字符串写入文件。 fputs函数的调用形式是: fputs(s, fp),其中 s是指向字符串的指针或字符串数组名, fp是指向将要被写入的文件的文件指针因此第二处应该是fputs(str, fw)。 第三空: whiIe(!feof(fr)循环的作用是不断读取文件直到到达文件尾,每次最多读 81个,将读到的数据放在 str字符串里,并用 printf输出到屏幕,因此第三处应该是 pr
27、intf(“ s“, str)。 三、程序修改题 42 【正确答案】 (1)k+; (2)if (m=k) 【试题解析】 本题中函数的功能是判断一个整数 n是否是素数。素数是只能被 1和本身整除的正整数 (1),所以判别 n是否为素数,只要用 2、 3、 、 n-1这些数逐个去除 n,观察余数是否为 0即可,只要有一次相除余数为 0, n就不是素数,否则 n为素数。 解题思路 (1)第一个标识下 “k+”语句没有结束符分号,所以将 “k+”改为 “k+; ”。 (2)第二个标识下的 “if(m=k)”语句应该是判断 m是否素数,而原题中是将 k的值赋给 m,并不表示是否 m等于 k,所以第二个
28、标识下 “if(m=k)”应该改为“if(m=k)”。 四、程序设计题 43 【正确答案】 inti=0: char*p, *q; p=q=a; while(*p) p+; p-; while(*p=*) p-; while(q=p) ai=*q; i+; q+; ai= 0; 【试题解析】 该程序功能是将字符串尾部的 “*”号全部删除,前面和中间的 “*”号不删除。本题的解题过程首先确定由串尾开始的第一个非 “*”位置,将由头开始到此位置的字符拷贝到字符串。 解题思路 (1)首先,使用一个指针 p指向串尾,然后对指向串尾的指针 p指向的字符进行判断如果是 “*”,指针 p就跳过,这样来设置一个指针变量 q指向字符串的头位置。 (2)然后,将由字符串起始 到最后一个字母之间的字符拷贝到字符串 a。 (3)最后,在新生成的字符串尾加 0。