1、国家二级( C语言)机试模拟试卷 101及答案与解析 一、选择题 1 下列叙述中正确的是 ( )。 ( A)栈是 “先进先出 ”的线性表 ( B)队列是 “先进后出 ”的线性表 ( C)循环队列是非线性结构 ( D)有序线性表既可以采用顺序存储结构,也可以采用链式存储结构 2 支持子程序调用的数据结构是 ( )。 ( A)栈 ( B)树 ( C)队列 ( D)二叉树 3 某二叉树有 5个度为 2的结点,则该二叉树中的叶子结点数是 ( )。 ( A) 10 ( B) 8 ( C) 6 ( D) 4 4 下列排序方法 中,最坏情况下比较次数最少的是 ( )。 ( A)冒泡排序 ( B)简单选择排序
2、 ( C)直接插入排序 ( D)堆排序 5 软件按功能可以分为:应用软件、系统软件和支撑软件 (或工具软件 )。下面属于应用软件的是 ( )。 ( A)编译程序 ( B)操作系统 ( C)教务管理系统 ( D)汇编程序 6 下面叙述中错误的是 ( )。 ( A)软件测试的目的是发现错误并改正错误 ( B)对被调试的程序进行 “错误定位 ”是程序调试的必要步骤 ( C)程序调试通常也称为 Debug ( D)软件测试应严格执行测试计 划,排除测试的随意性 7 耦合性和内聚性是对模块独立性度量的两个标准。下列叙述中正确的是 ( )。 ( A)提高耦合性降低内聚性有利于提高模块的独立性 ( B)降低
3、耦合性提高内聚性有利于提高模块的独立性 ( C)耦合性是指一个模块内部各个元素间彼此结合的紧密程度 ( D)内聚性是指模块问互相连接的紧密程度 8 数据库应用系统中的核心问题是 ( )。 ( A)数据库设计 ( B)数据库系统设计 ( C)数据库维护 ( D)数据库管理员培训 9 有两个关系 R、 S如下: 由关系R通过运算得到关系 S,则所 使用的运算为 ( )。 ( A)选择 ( B)投影 ( C)插入 ( D)连接 10 将 ER图转换为关系模式时,实体和联系都可以表示为 ( )。 ( A)属性 ( B)键 ( C)关系 ( D)域 11 以下叙述中错误的是 ( )。 ( A)使用三种基
4、本结构构成的程序只能解决简单问题 ( B)结构化程序由顺序、分支、循环三种基本结构组成 ( C) C语言是一种结构化程序设计语言 ( D)结构化程序设计提倡模块化的设计方法 12 以下四个程序中,完全正确的是 ( )。 ( A) #include stdio h main(); * programming, * printf(“programming! n“); ( B) #include stdio h main() *programming* printf(“programming! n“); ( C) #include stdio h main() * *programming* * p
5、rintf(“programming! n“); ( D) include stdio h main() *programming* printf(“programming! n“); 13 C源程序中不能表示的数制是 ( )。 ( A)十六进制 ( B)八进制 ( C)十进制 ( D)二进制 14 以下选项中,能用作用户标识符的是 ( )。 ( A) _0_ ( B) 8_8 ( C) void ( D) unsigned 15 若有定义语句: int x=10;,则表达式 x-=x+x的值为 ( )。 ( A) 0 ( B) -20 ( C) -10 ( D) 10 16 有以下程序: #
6、include stdio h main() int a=1, b=0: printf(“ d, “, b=a+b); printf(“ d n“, a=2*b); 程序运行后的输出结果是 ( )。 ( A) 1, 2 ( B) 1, 0 ( C) 3, 2 ( D) 0, 0 17 有以下程序: #include stdio h main()int a1, a2; char c1, c2; scanf(“ dc d c“, &a1, &c1, &a2, &c2); printf(“ (1, c, d, c“, a1, c1, a2,c2); 若想通过键盘输入,使得 a1的值为 12, a2的
7、 值为 34, c1的值为字符 a, c2的值为字符 b,程序运行后的输出结果是: 12, a, 34, b。则正确的输人格式是(以下 代表空格, CR代表回车 )( )。 ( A) 12 b CR ( B) 12 b CR ( C) 12, a, 34, h CR ( D) 12a34h CR 18 若变量已正确定义,在 if(W)printf(“ d n“, k);中,以下不可替代 W的是( )。 ( A) a b+c ( B) ch=getchar() ( C) a=b+c ( D) a+ 19 有以下程序段: #include stdio h int a, h, c; a=10; b=
8、50; c=30; if(a h)a=b, b=c; c=a; printf(“a= db= dc= d n“, a, b, c); 程序运行后的输出结果是 ( )。 ( A) a=10 h=50 c=30 ( B) a=10 h=50 c=10 ( C) a=10 b=30 c=10 ( D) a=50 b=30 c=50 20 下列叙述中正确的是 ( )。 ( A)在 switch语句中,不一定使用 break语句 ( B)在 switch语句中必须使用 default ( C) break语句必须与 switch语句中的 case配对使用 ( D) break语句只能用于 switch语
9、句 21 以下不构成无限循环的语句或语句组是 ( )。 ( A) n=0; do+n; while(n =0); ( B) n=0; while(1)n+; ; ( C) n=10; while(n); n-; ; ( D) for(11=0, i=1; i+)n+=i; 22 有以下程序: #include stdio h main() int c=0, k; for(k=1; k 3; k+) switch(k) default: c+=k; case2: c+; break; ease4: c+=2; break; printf(“ d n“, c); 程序运行后的输出结果是 ( )。
10、( A) 7 ( B) 5 ( C) 3 ( D) 9 23 有以下程序: #include stdio h int f(int x, int y) return(y-x)*x); main() int a=3, b=4, c=5, d; d=f(f(a, b), f(a, c); printf(“ d n“, d); 程序运行后的输出结果是 ( )。 ( A) 7 ( B) 10 ( C) 8 ( D) 9 24 若有定义语句: double a, *p=&a;以下叙述中错误的是 ( )。 ( A)定义语句中的 *号是一个间址运算符 ( B)定义语句中的 *号是一个说明符 ( C)定义语句中
11、的 p只能存放 double类型变量的地址 ( D)定义语句中, *p=&a把变量 a的地址作为初值赋给指针变量 P 25 若有定义语句: double x, y, *px, *py;执行了 px=&x; py=&y;之后,正确的输入语句是 ( )。 ( A) seanf(“ If Ie“, px, py); ( B) seanf(“ f f“&x, &y); ( C) seanf(“ f f“, x, y); ( D) scanf(“ If If“, x, y); 26 以下定义数组的语句中错误的是 ( )。 ( A) int num3=1, 2, 3, 4, 5, 6; ( B) int
12、num24: 1, 2, 3, 4, 5, 6; ( C) int num=1, 2, 3, 4, 5, 6; ( D) int num4=1, 2, 3, 4, 5, 6; 27 有以下程序: #include stdio h void fun(int a, int b) int t; t=a; a=b; b: t; main() int c10=1, 2, 3, 4, 5, 6, 7, 8, 9, 0, i; for(i=0; i 10; i+=2)fun(ci, ci+1); for(i=0; i 10; i+)printf(“ d, “, ci); printf(“ n“); 程序运行
13、后的输出结果是 ( )。 ( A) 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, ( B) 2, 1, 4, 3 6, 5, 8 7 0 9, ( C) 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, ( D) 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 28 有以下程序: #include stdio h main() int x32=0, i; for(i=0; i 3; i+)scanf(“ d“, xi); printf(“ 3d 3d 3d n“, x00, x01, x10); 若运行时输入: 2 4 6回车,则输出结果为 ( )。 ( A
14、) 2 0 4 ( B) 2 0 0 ( C) 2 4 0 ( D) 2 4 6 29 有以下程序段: #include stdio h int j; float y; char name50; scanf(“ 2d f s“, &j, &y, name); 当执行上述程序段,从键盘上输入 55566 7777abc后, y的值为 ( )。 ( A) 566 0 ( B) 55566 0 ( C) 7777 0 ( D) 566777 0 30 下列语句组中,正确的是 ( )。 ( A) char*s; s=“Olympic“; ( B) char s7; s=“Olympic“; ( C)
15、char*s; s=“Olympic“; ( D) char s7; s=“Olympic“; 31 有以下函数: int fun(ehar*s) char*t=s; while(*t+); return(t-s); 该函数的功能是 ( )。 ( A)计算 s所指字符串的长度 ( B)比较两个字符串的大小 ( C)计算 s所指字符串占用内存字节的个数 ( D)将 s所指字符串复制到字符串 t中 32 有以下程序 (注:字符 a的 ASCII码值为 97): #include stdio h main() char*s=“abc“; do printf(“ d“, *s 10); +s; whi
16、le(*s); 程序运行后的输出结果是 ( )。 ( A) 789 ( B) abc ( C) 7890 ( D) 979899 33 设有如下函数定义: #include stdio h int fun(int k) if(k 1)returm0; else if(k=1)retum1: else return fun(k-1)+1: 若执行调用语句 “n=fun(3); ”,则函数 fun总共被调用的次数是 ( )。 ( A) 2 ( B) 3 ( C) 4 ( D) 5 34 有以下程序: #include stdio h int f(int n); main() int a=3, s;
17、 s=f(a); s=s+f(a); printf(“ d n“, s); int f(int n) static int a=1: 1n+=a+; return n; 程序运行后的输出结果是 ( )。 ( A) 9 ( B) 8 ( C) 7 ( D) 10 35 设有定义 : struct complex int real, unreal; datal=1, 8, data2; 则以下赋值语句中错误的是 ( )。 ( A) data2=(2, 6); ( B) data2=datal; ( C) data2=real=datal real; ( D) data2 real=datal un
18、real; 36 有以下程序: #incdude stdio h struct Sint n; int a20; ; wild f(struct S*p) int i, j, t; fori=0; i p- n-1; i+) for(j=i+1; j p- n; j+) if(p- ai p- aj) t=p- ai; p- ai: p- aj; p- aj=t; main() int i: street S s=10, 2, 3, 1, 6, 8, 7, 5, 4, 10, 9; f(&s); for(i=0; i s n; i+)printf(“ d, “, s ai); 程序运行后的输出
19、结果是 ( )。 ( A) 2, 3, 1, 6, 8, 7, 5, 4, 10, 9, ( B) 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, ( C) 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ( D) 10, 9, 8, 7, 6, 1, 2, 3, 4, 5, 37 有以下程序: #include stdio h #include string h typedef structchat nanle9; char sex; int sore2; STU; STU f(STU a) STU b=“Zhao“, m, 85, 90; int i; sirc
20、opy(a name, b name); a sex=b sex: for(i=0; i 2; i+)a scorei=b scorei; return a; main() STU c=“Qian“, f, 95, 92, d; d=f(c); printf(“ s, c, d, d, “, d name, d sex, d score0, d score1); printf(“ s, c, d, d n“, c name, c sex, C score0, c score1); 程序运行后的输出结果是 ( )。 ( A) Zhao, m, 85, 90, Qian, f, 95, 92 (
21、B) Zhao, m, 85, 90, Zhao, m, 85, 90 ( C) Qian, f, 95, 92, Qian, f, 95, 92 ( D) Qian, f, 95, 92, Zhao, m, 85, 90 38 以下关于宏的叙述中正确的是 ( )。 ( A)宏替换没有数据类型限制 ( B)宏定义必须位于源程序中所有语句之前 ( C)宏名必须用大写字母表示 ( D)宏调用比函数渊用耗费时间 39 设有以下语句: int a=1, b=2, c: c=a (b 2); 执行后, c的值为 ( )。 ( A) 7 ( B) 9 ( C) 8 ( D) 6 40 有以下程序: #in
22、clude stdio h main() FILE*fp; int a10=1, 2, 3, i, n; tp=fopen(“d1 dat“, “w“); for(i=0; i 3; i+)fprintf(fp, “ d“, ai); fprintf(fp, “ n“); fclose(fp); tp=fopen(“d1 dat“, “r“); fscanf(fp, “ d“, &n); Mose(fp); printf(“ d n“, n); 程序运行后的输出 结果是 ( )。 ( A) 321 ( B) 12300 ( C) 1 ( D) 123 二、程序填空题 41 函数 fun的功能是
23、:将一副扑克牌编号为 1, 2, 3, , 53, 54,以某种特定的方式洗牌,这种方式是将这副牌分成两半,然后将它们交叉,并始终保持编号为l的牌在最上方,如第一次这样洗牌后的结果为: 1, 28, 2, 29, , 53, 27,54。两次洗牌后的结果为: 1, 41, 28, 15 2, 42 , 53, 40, 27, 14, 54。 程序的功能是:输出经过 n次这样洗牌后的结果。 请在程序的下画线处填入正确的内容,并 把下画线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的 BLANK1 C中。不得增行或删行,也不得更改程序的结构 ! 试题程序: #include std
24、io h void fun(int a55, int n) int i, k; *found* int 155; for(i=0; i n; i+) for(k=1; k =27; k+) b2*k-1=ak; *found* b21*k=ak+27; for(k=1; k =54; k+) *found* ak=3; main() int m, a55, i; for(i=1; i 55; i+)ai=i; printf(“请输入洗牌次数: “); seanf(“ d“, &m); fun(a, m); for(i=1; i 55; i+)printf(“ d, “, ai); printf
25、(“ n“); 三、程序修改题 42 下列给定程序中函数 fun的功能是:用冒泡法对 6个字符串进行升序排列。 请改正程序中的错误,使它能得出正确的结果。 注意:部分源程序在文件 MODI1 C中,不得增行或删行,也不得更改程序的结构 ! #include stdio h #include string h #define MAXLINE20 fun(char*pstr6) int i, j; char*p; for(i=0; i 5; i+) *found* for(j=i+1, j 6, j+) if(strcmp(*(pstr+i),; *(pstr+j) 0) p=*(pstr+i);
26、 *found* *(pstr+i)=pstr+i; *(pstr+j)=p; main() int i; char*pstr6, str6MAXLINE; for(i=0; i 6; i+)pstri=stri; printf(“ nEnter6string(1string at each line): n“); for(i=0; i 6; i+)scanf(“ s“, pstri); fun(pstr); printf(“The strings after sorting: n“); for(i=0; i 6; i+)printf(“ s n“, pstri); 四、程序设计题 43 请编
27、写函数 fun,其功能是分别统计形参 t所指二维数组中字母 A和 C的个数 注意:部分源程序存在 PROG1 C中,请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入所编写的若干语句。 试题程序: #include stdio h #include stdlib h #deftlie M14 void NONO(); void fun(char(*t)M, int*a, int*c) void get(char(*s)M) int i, j; for(i=0; i M; i+) for(j=0; j M; j+) sij=65+rand() 12; printf“
28、c“, sii); printf(“ n“): main() char aMM; in x, y; get(a); fun(a, &x, &y); printf(“A= d C= d n“, x, y): NONO(): void NONO() *本函数用于打开文件,输入数据,渊用函数,输出数据,关闭文件。 * HLE*fp, *wf; int i, j, x, y; char aMM; fp=fopen(“c: test in dat“, “r“); wf=fi)pen(“c: test out dat“ “w“): for(i=0; i M: i+) for(j=0; j M; j+) f
29、scanf(fp, “ c“, &aij); fun(a, &x, &y); fprintf(wt, “A= d n“, x); fprintf(wf, “C= d n“, y); fclose(fp); fclose(wf); 国家二级( C语言)机试模拟试卷 101答案与解析 一、选择题 1 【正确答案】 D 【试题解析】 栈是先进后出的线性表,所以 A错误;队列是先进先出的线性表,所以 B错误;循环队列是线性结构的线性表,所以 C错误。 2 【正确答案】 A 【试题解析】 栈支持子程序调用。栈是一种只能在一端进行插入或删除的线性表,在主程序渊用子函数时要首先保存主程序当前的状态,然后转占
30、执行子程序,最终把子程序的执行结果返回到主程序中调用子程序的位置,继续向下执行,这种调用符合栈的特点,因此本题的答案为 A。 3 【正确答案】 C 【试题解析】 根据二叉树的基本性质 3:在任意一棵二叉树中,度为 0的叶了结点总是比度为 2的结点多一个,所以本题中足 5+1=6个。 4 【正确答案】 D 【试题解析】 冒泡排序与简单插入排序与简单选择排序法在最坏情况下均需要比较 n(n-1) 2次,而堆排序在最坏情况下需要比较的次数是 nlog2n。 5 【正确答案】 C 【试题解析】 编译软件、操作系统、汇编程序都属于系统软件,只有 C教务管理系统才是应用软件 6 【正确答案】 A 【试题解
31、析】 软件测试的目的是为了发现错误而执行程序的过程,并不涉及改正错误,所以选项 A错误。程序调试的基本步骤有:错误定位、修改设计和代码,以排除错误、进行回归测试,防止引进新的错误。程序调试通常称为 Debug,即排错。软件测试的基本准则有:所有测试都应追溯刮需求、严格执行测试计划,排除测试的随意性、充分注意测试中的群集现象、程序员应避免检查自己的 程序、穷举测试不可能、妥善保存测试计划等文件。 7 【正确答案】 B 【试题解析】 模块独立性是指每个模块只完成系统要求的独立的子功能,并且与其他模块的联系最少且接口简单。一般较优秀的软件设计,应尽量做到高内聚,低耦合,即减弱模块之问的耦合性和提高模
32、块内的内聚性,有利于提高模块的独立性,所以 A错误, B正确。耦合性是模块间互相连接的紧密程度的度量而内聚性是指一个模块内部各个元素间彼此结合的紧密程度,所以 C与 D错误。 8 【正确答案】 A 【试题解析】 数据库应用系统中的核心问题是数据库的设 计。 9 【正确答案】 B 【试题解析】 投影运算是指对于关系内的域指定可引入新的运算。本题中 s是在原有关系 R的内部进行的,是由 R中原有的那些域的列所组成的关系。所以选择B。 10 【正确答案】 C 【试题解析】 从 ER图到关系模式的转换是比较直接的,实体与联系都可以表示成关系, ER罔中属性也可以转换成关系的属性。 11 【正确答案】
33、A 【试题解析】 使用顺序,选择 (分支 ),循环三种基本结构构成的程序可以解决所有问题,而不只是解决简单问题,所以 A错误。 12 【正确答 案】 B 【试题解析】 C语言中注释语句的注释方法是: *注释内容 *或注释一行。所以 A与 C错误, D选项中预编译命令 inelude stdio h前丢掉了 “#”号。所以选择 B。 13 【正确答案】 D 【试题解析】 在 C语言中整型常最可以用十进制、八进制和十六进制等形式表示,但不包括二进制,所以选择 D。 14 【正确答案】 A 【试题解析】 C语言中标识符由字母、下划线、数字组成,且开头必须是字母或下划线。另外,关键字不能作为标识符。
34、B中以数字 8开头,所以错误。 C与 D中用的是 关键字 void与 unsigned,所以错误。 15 【正确答案】 C 【试题解析】 算术运算符 +的优先级高于 -=,且 -=的结合方向为自右向左,所以表达式 x-=x+x可以表示成 x=x-(x+x)=10-(10+10)=-10,选择 C。 16 【正确答案】 A 【试题解析】 首先打印 b=a+b=1+0=1的值 1,此时已给 b赋值为 1。然后打印a=2*b=2*1=2的值 2。所以结果是 1, 2。 17 【正确答案】 D 【试题解析】 存输入多个数据时,若格式控制串中无非格式字符,则认为所有 输入的字符均为有效字符。所以应按选项
35、 D的顺序输入数据。 18 【正确答案】 A 【试题解析】 选项 A是非法的表达式, C语言中没有运算符 19 【正确答案】 B 【试题解析】 本题中 a b的条件不满足,所以不执行逗号表达式 a=b, b=c;的操作,而是执行 c=a操作,即 c的值为 10。 20 【正确答案】 A 【试题解析】 defauh语句在 switch语句中可以省略,所以 B错误; switch语句中并非每个 case后都需要使用 break语句,所以 C错误; break语句还可以用于for等循环结构中,所以 D错误 21 【正确答案】 A 【试题解析】 选项 A中 do后面的语句只执行了一次便结束了循环; B
36、选项中条件 whik(1)永远成立,所以是死循环; C选项中 n的值为 10,而循环体为空语句,所以 while(n)永远为真,进入死循环; D选项中 for语句第二个表达式为空,所以没有判别条件,进入死循环。 22 【正确答案】 C 【试题解析】 向 switch语句块传送参数后,编译器会先寻找匹配的 case语句块,找到后就执行该语句块,遇到 break跳出;如果没有匹配的语句块,则执行default语句块。 case与 default没有顺序之分。所以第一次循环 k的值为 1,执行c+=k, c的值为 1,再执行 case2后的语句 c+, c的值为 2,遇到 break语句跳出循环;第
37、二次循环 k的值为 2,执行 case2后面的语句 c+, c的值为 3,跳出循环。 23 【正确答案】 D 【试题解析】 调用 f(a, b)函数返回 3,调用 f(a, c)函数返回 6,所以外层调用f(f(a, b), f(a, c);即调用 f(3, 6)函数返回 9。 24 【正确答案】 A 【试题解析】 在变量定义 double a, *p=&a;中, *号是一个指针运算符,而非间址运算符,所以 A错误。 25 【正确答案】 A 【试题解析】 因为 x, y都是 double型数据,所以输入时的格式字符应为 lf,所以 B与 C错误。 D选项中 scanf(“ lf lf“, x,
38、 y);应为 scanf(“ lf lf“,&x &y);。 26 【正确答案】 B 【试题解析】 B选项中定义的数组为 2行 4列,而赋值时赋成了 3行所以出错。 27 【正确答案】 A 【试题解析】 函数调用中发生的数据传送是单向的。即只能把实参的值 传送给彤参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参的值发生改变,而实参中的值小会变化,所以数组 c中的元素的值并没有变化,选择A。 28 【正确答案】 A 【试题解析】 本题中输入的 3个数据 2, 4, 6分别赋值给了 x00, x10,x20。 x01仍为初始时的 0,所以打印输出时的结果为 A选项。 29 【正确答
39、案】 A 【试题解析】 它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。其中的格式命令可以说明最大域宽。在百分号 ( )与格式码之间的整数用于限制从对应域读入的最大字符数。所以 j的值为 55, y的值为 566 0,字符数组 name为 7777abc。 30 【正确答案】 A 【试题解析】 字符型指针变量可以用选项 A的赋值方法: chars*;s=“Olympic“,选项 C的写法: char*s, s=“Olympic“;是错误的。字符数组可以在定义的时候初始化: char s=“Olympic“; ?或者 char s=“Olympic“,鄙是正确的。但是不可
40、以在定义字符数组后,对数组名赋值。 (数组名是常量,代 表数组首地址 )所以选项 B和选项 D都是错误的对于本例,选项 B、 D中亨符数组 s的大小至少为 8,才能存放下字符串 (字符串的末尾都有结束标识 0)。 31 【正确答案】 A 【试题解析】 首先 char*s接受一个字符型数组的首地址并将这个首地址赋给另一个字符型指针 char*t, while(*t+)不断循环直到 *t为 0,再将 t-1,这时字符指针 1指向字符串的最后一个字符,又因为 s指向字符数组的首地址即字符串的首地址所以 return(t-s)便是返回字符数组中字符串的长度。 32 【正确答案】 A 【试题解析】 因为
41、小写字符 a, b, c的 ASCII码值分别为 97, 98, 99,而在 do while循环语句中,每次对字符的 ASCII码值取余数并输出,所以分别输出 7,8, 9。 33 【正确答案】 B 【试题解析】 首先 n=fun(3), 3被当作参数传递进去,这就进行了一次调用, 3被当做参数传进去后,程序会执行这句 else retum fun(k-1)+1;这就调用了第二次,而参数是 3-1也就是 2。 2被当做参数传进去后,程序会执行这句 else return fun(k-1)+1;这就调用了 第三次,而参数是 2-1也就是 1。 1被当做参数传进去后,程序会执行这句 else i
42、f(k=1)return1;不再递归调用,所以最终结果为 3次。 34 【正确答案】 A 【试题解析】 题目中静态局部变量 a,在静态存储区内分配存储单元,在程序整个运行期间都不释放。所以第一次调用函数执行 n+=a+;时 a先与 n相加在再进行自增。 n的值为 4, a的值为 2,且 a变量执行完后空间没有释放。再执行s=s+f(a)时, s的值为 4,调用 f(a)函数时 n的返回值为 n=3+2=5,且此时 a的值为3了。所以 s的值为 9。 35 【正确答案】 A 【试题解析】 A选项中可以在声明变量的同事为 data2赋值,但是 data2=(2,6);应写作 data2=2, 6。
43、所以选择 A。 36 【正确答案】 C 【试题解析】 本题的子函数 f的功能是对结构体变量 s中第二个成员数组中所有的数据进行从小到大的冒泡排序,所以结果是 C。 37 【正确答案】 A 【试题解析】 本题考查的是函数调用时的参数传递问题。程序在调用函数 f时,传给函数 f的参数只是结构变量 c在栈中的一个拷贝,函数 i-所做所有操作只是针对这个数据拷贝 进行的修改,这些都不会影响变量 c的值。 38 【正确答案】 A 【试题解析】 宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头,所以 B选项中宏定义必须位于源程序中所有语句之前是错误的。宏名一般用大写,但不是必须用大写,所
44、以 C选项错误。宏展开不占运行时间,只占编译时间,函数调用占运行时间 (分配内存、保留现场、值传递、返回值 ),所以 D选项错误。 39 【正确答案】 B 【试题解析】 h为 2,二进制为 00000010,执行左移两位操作后为 00001000,然后与 a00000001做异或操作结果为 00001001,即十进制的 9。 40 【正确答案】 D 【试题解析】 程序首先将数组 a10中的元素 1、 2、 3分别写入了文件 d1 dat文件中,然后又将 d1 dat文件中的数据 123,整体写入到了变量 n的空间中,所以打印 n时输出的数据为 123。 二、程序填空题 41 【正确答案】 (1
45、)b (2)2 (3)bk。 【试题解析】 填空 1: for循环中使用了一个数组 b,用来临时存放交换位置后的扑克牌, C语言中变量需要先声明后使用,所以填空 (1)处需要声明一个数组 b。答案为 b。 填空 2:第二个 for循环是将数组 a中前一半元素 (即 1 27编号的扑克牌 )放入数组 b的奇数位置,将数组 a中的的后一半元素 (即 28 54编号的扑克牌 )放入数组b的偶数位置,实现扑克牌的交叉洗牌,所以填空 (2)处是数组 b的起始值为 2的偶数下标 2k,答案为 2。 填空 3:由于数组 b属于函数中的临时变量,所以将数组 a的元素交叉存储到数组b后,还需要将数组 b的无素依
46、次赋值给数组 a,第三个 for循环实现的功能是将数组 h赋值给数组 a,所以填空 (3)处需要填入对应下标为 k的数组 b的元素,答案为 bk。 三、 程序修改题 42 【正确答案】 (1)for(j=i+1; j 6; j+) (2)*(pstr+i)=*(pstr+j);。 【试题解析】 本题考查:冒泡排序算法; for循环语句格式;指针数组。 冒泡排序算法,其基本思想是将待排序的元素看作是竖着排列的 “气泡 ”,较小的元素比较轻,从而要往上浮。在冒泡排序算法中我们要对这个 “气泡 ”序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。如果
47、发现两个相邻元素的顺序不对,即 “轻 ”的元素在下面,就交换它们的位置。 显然,处理一遍之后, “最轻 ”的元素就浮到了最高位置;处理二遍之后, “次轻 ”的元素就浮到了次高位置。依次类推,完成排序。 用代码实现数组 sN的升序排列为: for(i=0; i N; i+) for(j=i+1; j N; j+) if(si sj)t=si; si=sjsj=t; 。 四、程序设计题 43 【正确答案】 int i=0, j=0;循环统计的下标 *a=0;初始化 a字符统计的个数 *c=0;初始化 c字符统计的个数 for(i=0; i M; i+)行 for(j=0; j M; j+)列 if(tij=A)字符是 a,计数 (*d)+; if(tjj=c)字符是