1、国家二级( C语言)机试模拟试卷 142及答案与解析 一、选择题 1 下列关于循环队列的叙述中正确的是 ( )。 ( A)循环队列有队头和队尾两个指针,因此,循环队列是非线性结构 ( B)循环队列中元素的个数是由队头指针和队尾指针共同决定的 ( C)在循环队列中,只需要队尾指针就能反映队列中元素的动态变化情况 ( D)在循环队列中,只需要队头指针就能反映队列中元素的动态变化情况 2 设有一个初始状态为空的栈。现将元素 A、 B、 C、 1、 2、 3依次入栈,然后再依次出栈,则出栈后的元素顺序为以下哪一项 ?( ) ( A) 123ABC ( B) CBA321 ( C) ABC123 ( D
2、) 321CBA 3 在长度为 m的有序线性表中进行二分查找,最坏情况下需要比较的次数是 ( )。 ( A) O(m) ( B) O(m2) ( C) O(1og2m) ( D) O(mlog2m) 4 下列叙述中正确的是 ( )。 ( A)顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的 ( B)顺序存储结构只针对线性结构,链式存储结构只针对非线性结构 ( C)顺序存储结构能存储有序表,链式存储结构不能存储有序表 ( D)链式存储结构比顺序存储结构节省存储空间 5 数据流图中带有箭头的线段表示的是 ( )。 ( A)控制流 ( B)事件驱动 ( C)模块调用 ( D)数据
3、流 6 在软件开发的需求分析阶段,可以使用下列哪种工具 ?( ) ( A) NS图 ( B) DFD图 ( C) PAD图 ( D)程序流程图 7 计算机语言中常说的面向对象中, “对象 ”基本特点一般不包括 ( )。 ( A)多态性 ( B)封装性 ( C)一致性 ( D)标识唯一性 8 一间学生宿舍可住至少一个学生,则宿舍和学生之间的对应 关系是 ( )。 ( A)一对多 ( B)一对一 ( C)多对一 ( D)多对多 9 在数据管理技术发展的三个阶段中,数据共享最好的一个阶段是 ( )。 ( A)人工管理阶段 ( B)文件系统阶段 ( C)数据库系统阶段 ( D)三个阶段相同 10 有三
4、个关系 R、 S和 T如下:由关系 R和 S通过运算得到关系 T,则所使用的运算为 ( )。 ( A)笛卡尔积 ( B)交 ( C)并 ( D)自然连接 11 在以下选项中,按照 C语言规定,不能出现在标识符中的是 ( )。 ( A)大写字母 ( B)下划线 ( C)数字字符 ( D)连接符 12 在以下选项中,能用作 C语言数据常量的是 ( )。 ( A) 10L ( B) 083 ( C) 0 5e1 2 ( D) o30F 13 下列叙述中错误的是 ( )。 ( A)一个 C语言程序只能实现一种算法 ( B) C语言程序可以由多个程序文件组成 ( C) C语言程序可以由一个或多个函数组成
5、 ( D)一个 C语言函数可以单独作为一个 C语言程序文件存在 14 假如下列选项中的变量已正确定义并成功赋值,其中正确的表达式是 ( )。 ( A) int(22 1 2) ( B) n=y+m+5, +y ( C) x=y*3=x+k ( D) x=21 7 0 15 设在 C语言程序中已经定义了整型变量 int x=2;,以下表达式中,值不为 6的是 ( )。 ( A) 2*x, x+=2 ( B) x+, 2*x ( C) x*=(1+x) ( D) x*=x+1 16 有以下 C语言程序: #inelude void main() int x, y, z; x=y=1; z=x+,
6、y+, +y; printf( d, d, d n, x, y, z); 程序运行后的输出结 果是 ( )。 ( A) 2, 3, 3 ( B) 2, 3, 2 ( C) 2, 2, 1 ( D) 2, 3, 1 17 设 x,y已经成功定义并赋值,则与表达式 (xy)? (x+): (y+)中的条件表达式(x一 y)等价的是 ( )。 ( A) (xy 0) ( B) (x一 y 0x一 y 0) ( C) (xy 0) ( D) (x一 y=0) 18 有以下 C语言程序: #include void main() char ch1, ch2; ch1=R+5一 2; ch2=R+5一 1
7、3; printf( c, d n, ch1, ch2); 已知字母 R的 ASC 码为 82,程序运行后的输出结果是 ( )。 ( A) U, 84 ( B) T, 83 ( C) U, T ( D) T, U 19 有以下程序: #include void main() int x=2, y=3; if(! x)y+=3; else if(x=0) if(x)y+=2; else y+; printf( d n, y); 程序运行后的输出结果是 ( )。 ( A) 3 ( B) 2 ( C) 1 ( D) 0 20 在 C语言中定义下列变量并赋值: double x=1 333; int
8、a=3, b=2, c=1;则下列选项中正确的 switch语句是 ( )。 ( A) switch(a+b) casel: printf(* n); case2+l: printf(* n); ( B) switch(int)x); ease1: printf(* n); case2: printf(* n); ( C) switch(x) case1 333: printf(* n); case 2 0: printf(* n); ( D) switch(a+b) case 1: printf(* n); case c: printf(* n); 21 有以下程序: #include vo
9、id main() int i=15; for(; i 0; i一一 ) if(i 5=0)printf( d,一一 i); 程序运行后的输出结果是 ( )。 ( A) 1494 ( B) 15105 ( C) 151005 ( D) 140904 22 有以下程序: #include void main() int i, j, m=1; for(i=1; i 3; i+) for(j=3; j 0; j一一 ) if(i*j 3)break; m*=i*j; printf(m= d n, m); 程序运行后的输出结果是 ( )。 ( A) m=4 ( B) m=2 ( C) m=6 ( D)
10、 m=5 23 有以下程序: include int fun(int x, int y) if(x! =y)return(x+y) 2); else return(x); void main() int a=3, b=5, c=6; printf( d n, fun(fun(b, c), 2*a); 程序运行后的输出结果是 ( )。 ( A) 6 ( B) 5 ( C) 8 ( D) 12 24 下列选项中,定义 C语言数组的正确语句是 ( )。 ( A) int N=10; int xN; int xN; ( B) #define N 10 int xN ( C) int x010 ; (
11、D) int x; 25 有以下程序: #include stdio h void main() int i, *p=NULL; *p=&i; printf(Inputi: ); scanf( d, &p); printf(outputi: ); printf( d n, p); 该程序试图通过指针 p为变量 i读入数据并输出,但程序有多处错误,以下语句正确的是 ( )。 ( A) *p=&i; ( B) int i, *p=NULL; ( C) scanf( d, &p) ( D) printf( d n, p); 26 有以下程序: #include int add(int x, int
12、y)return(x+y); void main() int s, (*pf)(), a=1, b=2; pf=add; 则以下函数调用语句错误的是 ( )。 ( A) s=pf(a, b); ( B) s=add(a, b); ( C) s=(*pf)(a, b); ( D) s=*pf(a, b); 27 有以下程序: #include void main() int a: 7, 8, 9, 10, i; for(i=0; i 4; i+) switch(i 3) case 0: switch(ai 3) case 0: ai+; break; case 1: ai; break; cas
13、e 1: ai=0; for(i=0; i 4; i+)printf( d, ai); printf( n); 程序运行后的输出结果是 ( )。 ( A) 0696 ( B) 6010 ( C) 0906 ( D) 6099 28 有以下程 序: #include void main() int a33=0, 1, 2, 0, 1, 2, 0, 1, 2, i, j, s=10; for(i=0; i 3; i+) for(j=1; j =i; j+) s+=aiaji; printf( d n, s); 程序运行后的输出结果是 ( )。 ( A) 12 ( B) 13 ( C) 11 ( D
14、) 15 29 以下语句中存在语法错误的是 ( )。 ( A) char ss620; ss1=right? ; ( B) char ss20=fight; ( C) char*ss6; ss1=right? ; ( D) char*ss=right? ; 30 以下不能将 s所指字符串正确复制到 t所指存储空间的是 ( )。 ( A) do*t+=*s+; while(*s); ( B) for(i=0; ti=si; i+); ( C) while(*t=*s)t+; s+; ( D) for(i=0, j=0; ti+=sj+; ); 31 有以下程序 : #include void s
15、wap(char*ch1, char*ch2) char ch; ch=*ch1; *ch1=*ch2; *ch2=ch; void main() char*str1=xyz, *str2=abc; swap(str1, str2); printf( s, s n, str1, str2); 程序执行后的输出结果是 ( )。 ( A) xyz, cba ( B) xyz, abc ( C) ayz, xbc ( D) abc, xyz 32 有以下 函数: int fun(char*x, char*y) int m=0; while(*x=*y)&*x! = 0)x+; y+; m+; ret
16、urn m; 函数的功能是 ( )。 ( A)将 y所指字符串赋给 x所指存储空间 ( B)统计 x和 y所指字符串中最前面连续相同的字符个数 ( C)查找 x和 y所指字符串中是否有 0 ( D)统计 x和 y所指字符串中相同的字符个数 33 有以下程序: #lnclude int fun() static int i=1; i*=3; retum i; void main() int k, s=1; for(k=1; k =3; k+)s*=fun(); printf( d n, s); 程序运行后的输出结果是 ( )。 ( A) 729 ( B) 27 ( C) 81 ( D) 243
17、34 在 C语言源文件中定义的全局变量的作用域为 ( )。 ( A)所在文件的全部范围 ( B)所在程序的全部范围 ( C)所在函数的全部范围 ( D)由具体定义位置和 extern说明来决定范围 35 以下叙述中不正确的是 ( )。 ( A)用 typedef可以为各种类型起别名,但不能为变量起别名 ( B)可以用 typedef将已存在的类型用一个新的名字来代表 ( C)用 typedef定义新的类型名后,原有类型名仍有效 ( D)可以通过 typedef增加新的类型 36 有以下程序: #include struct S int x, y; data2=1, 2, 10, 12; voi
18、d main() struct s p=data1; printf( d n, +(p x); 程序运行后的输出结果是 ( )。 ( A) 10 ( B) 11 ( C) 20 ( D) 21 37 有以下程序: #include #define pi 3 14 #define S(r)pi*r*r void main() int i=1, j=2; printf( 4 2f n, S(i+j); 程序运行后的输出结果是 ( )。 ( A) 7 14 ( B) 28 26 ( C) 6 28 ( D) 9 42 38 有以下程序: #include void main() unsigned c
19、har a=1, b=3, c=5, d; d=a b; d&=c; printf( d n, d); 程序运行后的输出结果是 ( )。 ( A) 1 ( B) 3 ( C) 4 ( D) 5 39 C语言的文件操作过程中,以下描述中正确的是 ( )。 ( A) C语言中的文件是流式文件,因此只能顺序存取数据 ( B)打开一个已存在的文件并进行了写操作后,原有文件中的全部数据必定被覆盖 ( C)在一个程序中当对文件进行了写操作后,必须先关闭该文件然后再打开,才能读到第 1个数据 ( D)当对文件的读 (写 )操作 完成之后。必须将它关闭:否则可能导致数据丢失 40 有以下程序: #includ
20、e #include void main( ) int*a, *b, *c; a=b=c=malloc(sizeof(int); a=0; *b=1; *c=2: a=b; printf( d, d, d n, *a, *b, *c); 程序运行后的输出结果是 ( )。 ( A)出错 ( B) 2, 2, 3 ( C) 1, 2, 3 ( D) 2, 2, 2 二、程序填空题 41 下列给定程序中,函数 fun的功能是进行数字字符转换。若形参 ch中是数字字符 0到 9,则将 0转换成 9, 1转换成 8, 2转换成 7, , 9转换成 0;若是其他字符则保持不变;并将转换后的结果作为函数值返
21、回。 请在程序的下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。 注意:部分源程序在文件 BLANKl C中。不得增行或删行,也不得更改程序的结构! #inelude *found* 【 1】 fun(char ch) *found* if(ch =0&【 2】 ) *found* return9一 (ch一 【 3】 ); return ch; main() char c1, c2; c1=1; c2=fun(c1) printf( c, c, c1, c2); 三、程序修改题 42 给定程序 modil c的主函数中,将 a、 b、 c三个节点链成一个单向链表,并给各节点的数据
22、域赋值,函数 fun()的作用是:累加链表节点数据域中的数据作为函数值返回。 请改正函数 fun中指定部位的错误,使它能得出正确的结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include stdio h typedef struct list int data; struct list*next; LIST; int fun(LIST*h) LIST*P; *found* int t: p=h; *found* while(*p) *found* t=t+p data; p=(*p) next; return t: main() LIST a,
23、 b, c, *h; a data=34; b data=51; c data=87; e next= 0; h=&a; a next=&b; b next=&c; printf(总和 = d n, fun(h); 四、程序设计题 43 规定输入的字符串中只包含字母和 #号 。请编写函数 fun,其功能是:将字符串尾部的 #号 全部删除,前面和中间的 #号不动。 例如,字符串中的内容为: “#AB#CD#EF”,删除后,字符串中的内容应当是:“#AB#CD#EF”。在编写函数时,不得使用 C语言提供的字符串函数。 注意:部分源程序在文件 PROC1 C中。 请勿改动主函数 main和其他函数中
24、的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 #include 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); NONO(); void NONO() *本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 * FILE*in, *out; int i; char s81; in=fopen(in dat, r); out=fopen(out da
25、t, W); for(i=0; i 10; i+) fscanf(in, s, s); fun(s); fprintf(out, s n, s); fclose(in); fclose(out); 国家二级( C语言)机试模拟试卷 142答案与解析 一、选择题 1 【正确答案】 B 【试题解析】 循环队列有队头指针和队尾指针,其中的元素个数是由队头指针和队尾指针共同决定的,且循环指针是线性结构,因此,其他选项不正确。 2 【正确答案】 D 【试题解析】 用栈组织数据的原则是先进后出,所以最后进栈的元素最先出栈,最先进栈的元素最后出栈,所以答案选择 D。与队列组织数据的先进出原则要区分开来。 3
26、 【正确答案】 C 【试题解析】 进行二分法查找时,有序线性表中的元素必须顺序存储,因此进行二分法查找需要 log2m次。 4 【正确答案】 A 【试题解析】 链式存储可以是连续结构也可以是非连续结构,这是链式存储的特点。但链式存储中的存储节点不仅包括数据域还包括指针域,所以存储空间会更多,而不是节省存储空间。 5 【正确答案】 D 【试题解析】 数据流图中的箭头线段表示数据流,指从前一个结点流向后一个结点。 6 【正确答案】 B 【试题解析】 在软件开发的需求阶段一般会使用的工具有数据流图 (DFD图 )和数据字典 (DD),因此选择 B。 7 【正确答案】 C 【试题解析】 对象的基本特点
27、包括:多态性、封装性、模块化和标识唯一性,因此选项 C不正确。 8 【正确答案】 A 【试题解析】 一间宿舍可以住多个学生,而一个学生只能住一间宿舍,因此,宿舍和学生是一对多的关系。 9 【正确答案】 C 【试题解析】 数据管理技 术的三个发展阶段为人工管理阶段、文件系统阶段和数据库管理阶段。只有在数据库管理阶段实现数据的自由分享更加容易和方便。 10 【正确答案】 D 【试题解析】 只有通过自然连接,即将数据自然连接在一起,并去掉重复的数据才能实现如题所示的结果,因此选择 D。 11 【正确答案】 D 【试题解析】 按照 C语言规定,标识符由字母、数字和下划线组成,且开头必须是字母或下划线,
28、所以选项 D不合法。 12 【正确答案】 A 【试题解析】 选项 A是长整型数,合法;选项 B的形式是八进制数,但其中包含数 字 8,不合法;选项 C是科学计数法的形式,但 e后面的数不是整数,不合法;选项 D有点像十六进制的数,但第一个字符是 0,不是 0也不是 0x所以不合法。 13 【正确答案】 A 【试题解析】 在 C语言程序中可以自选编制多种算法,因此选项 A的叙述错误。 C语言中可以由多个文件组成,并通过引用的方式连接在一起编译并运行,每个文件可以包含一个或多个函数,因此选项 B和 D的叙述没有错误; C语言可以包含多个函数,所以选项 C的叙述也没有错误。 14 【正确答案】 B
29、【试题解析】 求余运算符的左右两个数字都必须是 整数,所以选项 A和 D错误,另外,进行整型强制转化时正确的表达式是 (int)x,而不是 int(x);选项 C中不能将 x+k的值赋给 y*3,所以选项 C错误。选项 B中涉及逗号运算符,它的级别最低,因此,选项 B表达式的执行过程是先将 y+m+5的值赋给 n, y值自加一次。 15 【正确答案】 A 【试题解析】 选项 A和 B中出现的逗号表达式,整个表达式是取逗号后面的表达式的值,因此,选项 A的计算过程是先计算 2*x,得到 4,此时 x还是 2,再计算 x+=2,得到 4,因此整个表达式的值是 4。选项 B的计算过程是先计算 x+,
30、得到 2,此时 x经过自加 1后变成了 3,再计算 2*x,得到 6,整个表达式的值取逗号后面的表达式的值为 6。选项 C分解后可以写成 x=x*(1+x),将 x=2代入,结果为 6。选项 D中的加法运算级别高于赋值运算,所以可以写成 x=x*(x+1),将x=2代入,结果为 6。 16 【正确答案】 D 【试题解析】 本题主要考察 +运算符和逗号运算符的执行顺序。表达式 z=x+,y+, +y的计算过程是,首先计算 x+,得到 1, x加 1后变成 2(先使用后自加 );再计算 y+,得到 1后变成 2;最后计算 +y, y先加 1变 成 3,得到 3(先自加再使用 )。因为赋值运算级别高
31、于逗号运算,所以整个表达式是 x+的值,即将1赋给 z。程序运行后 x, y, z的值将是 2, 3, 1。 17 【正确答案】 B 【试题解析】 表达式 (x y)? (x+): (y+)中问号前面在表达式若为非 0(注意不是大于 0),则用冒号前面的表达式为整个表达式赋值,否则将用冒号后面的表达式赋值。 18 【正确答案】 A 【试题解析】 本题中将字符进行整数运算,其实是使用字符的 ASC 码进行运算,运算后 ch1和 ch2的 ASC 码将为 82+3和 82+2,注意在程序输出时用的格式是 c d,因此, chi1输出字符 U(ASC 码为 85),字符 ch2输出为整数,即84。
32、19 【正确答案】 A 【试题解析】 if一 elseilf一 else分支结构中的关键考察点是 else将与最近的一个if一 elself配对。本题串最后的 else语句将与紧跟在其前面的 if(x)y+=2;语句配对,而这两个语句均在其前面的 elself语句作用域内;由于 x=1,所以,程序开始的 if和 elseif语句均不执行,因而,本程度段中的具体赋值语句均未得到执行,运行后输出的 y值为初始 值。 20 【正确答案】 A 【试题解析】 switch()条件语句中的表达式只能接收 int, byte, clar, short,enum类型,不能接收其他类型。因此选项 C不正确; c
33、ase语句中的表达式必须是常量表达式,所以 D选项不正确。选项 B在 switch后面加了一个分号,用法出错。 21 【正确答案】 A 【试题解析】 if(i 5=0)用来判断能被 5整除的整数; i是先自减再使用,所以输出的 i值是能被 5整除的整数再减 1,答案 A正确。 22 【正确答案】 C 【试题解析】 外 层 for循环次数为 2,内层 for循环次数为 3;当 i=1时,执行 3次内循环,结果是 m=6;当 i=2时,内循环中 j=3,将执行 break语句,跳出内层循环,此时,外层循环也正好结束,所以结果为 m=6。还需要注意赋值运算符的级别仅比逗号运算符高,比其他运算符低,所
34、以在本题中 m*=i*j可以展开成m=m*(i*j)。 23 【正确答案】 B 【试题解析】 函数 fun(int x, int y)是求两个正数的平均数,返回结果为整数,所以,若 x+y是奇数,返回结果将会舍掉 0 5。在主函数调用 fun函数时是嵌套调 用,第一次先执行 fun(b, c),返回结果 5,第二次再调用 fun(5, 6),返回结果为 5。 24 【正确答案】 B 【试题解析】 定义 C语言数组时,数组长度不能是变量,只能是常量,所以选项 A错误;如果数组长度不写明需要在定义时通过赋初值来完成定义,如 int x=1, 3, 4;因此选项 D错误,选项 C中数组长度的写法不正
35、确。 25 【正确答案】 B 【试题解析】 分析题意,选项 A的正确写法应该是 p=&i;选项 C的正确写法应该是 scanf( d, p);选项 D的正确写法应该是 printf( d n, *p)。 26 【正确答案】 D 【试题解析】 pf是一个指向函数的指针,本题的难度在于函数指针的调用。在 C语言中,函数名会被转换为指向这个函数的指针,除非这个函数名作为 &操作符的操作对象。因此,函数指针的调用可以是 add(a b)和 pf(a, b),它们两者是一样的。另外, (*pf)(a, b)也是合法的,表示先对指针 pf引用,再调用函数,指针两侧的括号必须有,可以理解为将函数指针反过来转
36、换为函数名再调用函数,其实在 ANSI C标准中将 pf(a, b)认为是 (*pf)(a, b)的简写形式,并且推荐使用前者,因为它更符合函数调用的逻辑。但若写成 *pf(a, b)的形式,则因为 ()优先级高于*,所以将先调用函数,再进行指针的解引用操作,但函数返回的是一个整型数值,因此,调用会出错,选项 D不正确。 27 【正确答案】 D 【试题解析】 for循环执行 4次循环, i分别为 0, 1, 2, 3,循环体内包含两重swish()条件分支语句,对数组元素 ai进行赋值操作;第一重 switch()语句的判别条件是 i被 3除的余数,但只有两种选择分支 case 0和 case
37、 1;因此当 i=2时, for循环体不被执行,数组元素 a2还是初始值。当 i=1时,执行第一重 switch的case 1分支, a1=0;至此已经可以选择正确答案。若再要判断,当 i=0和 3时,程序将进入第二重 switch()条件分支, a0 3的值和 a3 3的值均为 0,因此,都执行第二重 switch()语句的 case 0分支语句, a0且 a3; 28 【正确答案】 D 【试题解析】 此题考查 for循环执行条件和数组元素的调用。 for(ex1; ex2;ex3)ex4;的执行过程是:计算 ex1;判断 ex2,若 ex2为真,执行 ex4(若 ex2为假将不执行 ex4
38、);计算 ex3;判断 ex2的值进行下一次循环。题目中第 1层 for循环执行 3次, i=0, 1, 2;但第 2层 for循环要根据第 1层 for循环的 i值判断, i=0时, i =i为假,所以不执行循环体, i=1时,执行 1次, s+=a1a11, i=2时,执行 2次, s+=a2a12和 s+=a2a22。对于数组的元素调用可以用数组名后跟数组下标引用元素的形式,数组下标可以是表达式,所以执行s+=a11, s+=a22, s+=a22,结果为 15。 29 【正确答案】 A 【试题解析】 此题考查字符数组的定义及赋值。字符串数组可以先定义再赋值,也可以在定义的同时赋值。 3
39、0 【正确答案】 A 【试题解析】 从语法上讲,选项 B和选项 D的执行是一样的,都是将字符 s数组的元素逐一赋值给字符数组 t的对应元素;要注意的是字符指针指向的是字符串的首字符地址,通过 s+运算将其指向下一个字符。另外,在字符串的末尾系统会自动补加一个字符 0作为结束字符,所以若移动字符串指针至字符串结尾,其值将会是指向 0,在分支语句中可以作为条件表达式,其值为假。因此从语法上讲此四个选项都是正确的 C语言语句,且对于正常字符串,执行结果都是正确的。如果字符串 s是个空字符串,选项 A也会进行 1次复制动作,所以不正确。 31 【正确答案】 C 【试题解析】 首先要注意交换函数 swa
40、p只交换参数指针 (字符数组 )的第一个字符,因为,函数中的中间变量只是一个字符变量 (char ch),而且两个指针所指的内在地址没变,只交换了其中存储的值。所以主函数中的结果是只将两个字符串的首字符进行了交换。 32 【正确答案】 B 【试题解析】 函数返回的是整数 m的值,所以最符合题意应该是 B和 D,函数在比较两个字符串中相同的字符时,只要出现不相同的字符便退出循环,函数结束,所以选项 B正确。 33 【正确答案】 A 【试题解析】 主函数中的 for循环体可以写成 s=s*fun()*fun()*fun();子函数中的静态变量只在定义时赋一次初值,因此第 1次调用时初值是 1,返回
41、 3,第 2次调用时 i的初值为 3而不是 1,所以返回 9,第 3次调用 i=9,返回 27;所以主函数中的 s=1*3*9*27=729。 34 【正确答案】 D 【试题解析】 全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件,其作用域是整个源程序。但在函数中使用全局变量,一般应作全局变量说明,全局变量的说明符为 extern,只有在函数内经过说明的全局变量才能使用。但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。所以正确选项为 D。其余选项没有提到 extern的作用,所以不正确。 35 【正确答案】 D 【试题解析】 typede
42、f为 C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型 包括内部数据类型 (int, char等 )和自定义的数据类型 (struct等 )。在编程中使用 typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明,原来的类型名仍然是有效。所以选项 B、 C叙述是正确的。 typedef是为数据类型起别名,不能给变量起别名,选项 A叙述正确,而且 tvpedef只能给已经存在的 (原有类型和已经自定义的类型 )起别名,但不能增加新的类型,选项 D叙述不正确。 36 【正确答案】 B 【试题解析】 定义的结构体 S中有 2个整型数
43、x和 y,并 且定义的该结构体的数组 data2,数组元素个数为 2,所以 data中的元素共 4个,初值为 l, 2, 10和12。在函数中声明结构体 S的变量 p并赋值,需要注意的是数组元素在引用时下标是从 0开始的,所以 p=data1=10, 12,因此,输出结果是 11, +(p x)是指先将 p x增加 1再使用。 37 【正确答案】 A 【试题解析】 #define宏定义一定要先展开再计算,S(i+j)=pi*i+j*i+j=3 14*1+2*1+2=7 14。所以在 #define定义表达式时一定要记得加括号,本题 如果写成 #define S(r)=pi*(r)*(r),将得
44、到预想的计算结果。 38 【正确答案】 A 【试题解析】 按位运算符的运算过程是将运算符写成二进制的形式,并按位进行比较,与 (&)操作的结果是两个位均相同则结果为 1,否则为 0,或 (1)操作的结果是只要有一个位为 1,则结果为 1。 1的二进制为 00000001, 3的二进制为00000011, (1 3)=00000011, 5的二进制是 00000101,所以 (13)&5)=00000001,用十进制输出结果为 1。这里的无符号数定义并不会对结果产 生影响,因为均是正数,这里的 char也不会影响,因为这几个数字的 ASC 码是其本身。 39 【正确答案】 D 【试题解析】 A错
45、,因为 C语言中的文件可以进行随机存取; B错,因为可以使用追加操作对文件进行操作而原文件中的内容不会被覆盖; C错,因为可以通过fseek()函数重新定位以进行读写,而不用先关闭再打开。 40 【正确答案】 D 【试题解析】 malloc(sizeof)将分配一块存放整型数据的内存地址, a, b, c三个整型指针同时指向这个地址; a=0是让 a指针指向地址为 1的内存空间 (0x1),*b=1是指将 b指针指向的这个内存空间的数值写成 1,水 c=2是指将 c指针指向的这个内存空间的值写成 2,因为 b和 c指向的是同一个内存空间。因此,它们指向的这个空间的值将会是 2; a=b是将 a
46、指针也指向 b指针指向的这个内存空间,所以 a, b, c又都指向了开始分配的这个内存空间,其值为 2,所以答案为 D。 二、程序填空题 41 【正确答案】 1 char, 2 ch =9, 3 0 【试题解析】 填空 1:函数定义时,类型标识符指明了本函数的类型,函数的类型实际上是函数返回值的类型,所以此处 应该填入 char。 填空 2:通过 if条件语句判断字符串中字符是否是数字字符,既大于等于字符0,同时小于等于字符 9。 填空 3: return语句完成函数返回操作,要实现字符转换,应填入 return9 (ch一 0)。 三、程序修改题 42 【正确答案】 1 int t=0; 2 while(p)或 while(p! =NULL); 3 t=t+p data; 【试题解析】 1题目中变量 t是用来存放累加和的,因此必须初始化。 2题目中 *p是结构体,不能转化为 bool型。 3 p是指针,只能用 p一,不能用 p。 四、程序设计题 43 【正确答案】 void fun(char*a) while(*a! = 0) a+; a一一: *指针 a指向字符串的尾部 * while(*a=#) a一一: *指针 a指向最后一个字母 * *(a+1)= 0; *在字符串最后加上结束标志符 * 【试题解析】 对于一个字符串要删除其尾部的 #,只需要