1、目 录 第一部分 名校考研真题 . 4 一、选择题 . 4 二、填空题 . 25 三、改错题 . 39 四、设计题 . 51 说明: 我们从指定谭浩强 C 程序设计(第 4 版)为考研参考书目的名校历年考研真题以及相关教辅习题中挑选具有代表性的真题,并 对其进行了详细的解答。通过这一部分的练习,可以帮助学员巩固基础知识、夯实专业基础,从而做到全方位备考。 第二部分 课后习题 . 64 第 1 章 程序设计和 C 语言 . 64 第 2 章 算法 程序的灵魂 . 67 第 3 章 最简单的 C 程序设计 顺序程序设计 . 81 第 4 章 选择结构程序设计 . 87 第 5 章 循环结构程序设计
2、 .100 第 6 章 利用数组处理批量数据 .122 第 7 章 用函数实现模块化程序设计 .147 第 8 章 善于利用指针 .178 第 9 章 用户自己建立数据类型 .210 第 10 章 对文件的输入输出 .239 第 11 章 常见错误分析 .261 第三部分 章节题库 .262 第 1 章 程序设计和 C 语言 .262 第 2 章 算法 程序的灵魂 .268 第 3 章 最简单的 C 程序设计 顺序结构 .299 第 4 章 选择结构程序设计 .330 第 5 章 循环结构程序设计 .362 第 6 章 利用数组处理批量数据 .388 第 7 章 用函数实现模块化程序设计 .4
3、67 第 8 章 善于利用指针 .507 第 9 章 用户自己建立数据类型 .526 第 10 章 对文件的输入输出 .577 第 11 章 常见错误分析 .589 第四部分 模拟试题 .590 谭浩强 C 程序设计(第 4 版)配套模拟试题及详解(一) .590 谭浩强 C 程序设计(第 4 版)配套模拟试题及详解(二) .605 第一部分 名校考研真题 说明: 我们从指定谭浩强 C 程序设计(第 4 版)为考研参考书目的名校历年考研真题以及相关教辅习题中挑选具有代表性的真题,并对其进行了详细的解答。通过这一部分的练习,可以帮助学员巩固基础知识、夯实专业基础,从而做到全方位备考。 一、选择题
4、 1 下列关于 C 语言文件的叙述中正确的是 ( ) 。 A 文件由一系列数据依次排列组成,只能构成二进制文件 B 文件由结构序列组成,可以构成二进制文件或文本文件 C 文件由数据序列组成,可以构成二进制文件或文本文件 D 文件由字符序列组成,其类型只能是文本文件 【答案】 C 【解析】 C 语言将文件看作是一个字符(字节)的序列,即由一个一个字符(字节)数据顺序组成。根据数据的组成形式,可将文件分为两种: ASCII 文件,又称文本( text)文件,它的每一个字节可放一个 ASCII 码,代表一个字符;二进制文件,是把内 存中的数据按其在内存中的存储形式原样输出到磁盘上存放。所以 C 文件
5、就是一个字节流或一个二进制流。答案选择 C 选项。 2 有以下程序: 程序运行后的输出结果是( )。 A 1,2,1,2 B 1,2,2,1 C 2,1,2,1 D 2,1,1,2 【答案】 B 【解析】 m 和 n 的值不变,分别是 1, 2;指针 *p 和 *q 交换了指向的位置,即 *p=&n, *q=&m,分别为 2, 1。答案选择 B 选项。 3 有以下程序: #include main() int m=1,n=2,*p=&m,*q=&n,*r; r=p; p=q; q=r; printf(%d,%d,%d,%dn,m,n,*p,*q); 程序运行后的输出结果是( )。 A 1001
6、,ZhangDa,1098.0 B 1002,ZhangDa,1202.0 C 1001,ChangRong,1098.0 D 1002,ChangRong,1202.0 【答案】 D 【解析】 函数 f 对结构体成员进行修改,并返回新的结构体; main 函数先定义了一个结构体变量 a 并为它赋初值,然后调用函数 f 修改结构体变量的成员值,最后输出新的结构体变量成员值。答案选择 D 选项。 4 有以下程序: 程序运行后的输出结果是 ( ) 。 A 32 B 12 #include #include struct A int a; char b10; double c; ; struct A
7、 f(struct A t); main() struct A a=1001,ZhangDa,1098.0; a=f(a); printf(%d,%s,%6.1fn,a.a,a.b,a.c); struct A f(struct A t) t.a=1002; strcpy(t.b,ChangRong); t.c=1202.0; return t; #include void fun(int p) int d=2; p=d+; printf(%d,p); main() int a=1; fun(a); printf(%dn,a); C 21 D 22 【答案】 C 【解析】 C 语言中函数参数传
8、递满足 “ 单向传递 ” ,实现传递值的功能,实参能传给形参,形参却不能传回给实参。 fun 函数体内输出 p 的值为 2,并不影响到 fun 函数外 a 的值, a 的值在 main 函数内依然为 1。答案选择C 选项。 5 有以下程序: 程序运行后的输出结果是( )。 A 10,64 B 10,10 C 64,10 D 64,64 【答案】 A 【解析】 C 语言中带参数的宏可以理解为用参数直接替换定义式中的变量,而不经过任何修改。所以 s = f(a+1) = a+1*a+1*a+1 = 3+3+3+1 = 10, t = f(a+1) = (a+1)*(a+1)*(a+1) = 444
9、 = 64,所以有无括号的运算结果是不同的。故答案选择 A 选项。 6 有以下程序: 程序运行后的输出结果是( )。 A 3344 B 2050 #include #define f(x) x*x*x main() int a=3,s,t; s=f(a+1); t=f(a+1); printf(%d,%dn,s,t); #include main() int a=2,3,5,4,i; for(i=0;i4;i+) switch(i%2) case 0:switch(ai%2) case 0:ai+;break; case 1:ai-; break; case 1:ai=0; for(i=0;i
10、1); 输出结果是 ( ) 。 A 16 B 8 C 4 D 2 【答案】 C 【解析】 C 语言中, “ ” 右移运算符是将变量转换成二进制,然后右移相应位数,将移出的位信息舍去,并在高位补 0,将所得的结果再赋值给变量。 本 题十进制数 8 转换为二进制数为 0000 1000,右移一位得到 0000 0100,再转换成十进制数就是 4。所以答案选择 C 选项。 8 有以下定义语句,编译时会出现编译错误的是( )。 A char a=a; B char a=n; C char a=aa; D char a=x2d; 【答案】 C 【解析】 本题中 a 为一个字符型变量,只能为其赋值一个字符
11、常量, A 项编译可以通过。 C 项中 aa不是字符常量, 而是一个字符串, 所以会编译错误。 BD 两项为转义字符,编译可以通过。答案选择 C 选项。 9 下面结构体的定义语句中,错误的是 ( ) 。 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 struct int x;int y;int z;a; 【答案】 B 【解析】 C 语言中结构体变量的定义有三种方法:定义结构体类型的同时定义结构体
12、变量,如 C 项;使用无名结构体类型定义结构体变量,如 D 项;先定义结构体类型,后定义结构体变量,如 A 项 , B 项错在分别定义结构体类型与结构体变量时需要用“ ;”隔开 。故 答案选择 B 选项。 10 有以下程序: 程序运行后的输出结果是( )。 #include #include main() char a10=abcd; printf(%d,%dn, strlen(a), sizeof(a); A 7,4 B 4,10 C 8,8 D 10,10 【答案】 B 【解析】 在 C 语言中, strlen()用来统计字符串中字符的个数(不包含字符串结束标志 0), sizeof()用
13、来求分配给数组的存储空间大小。题目中字符串 a 中字符个数为 4,但由于数组 a 定义含有 10 个字符,所以所占空间大小为 10。所以答案选择 B 选项。 11 以下函数 findmax拟实现在数组中查找最大值并作为函数值返回,但程序中有错导致不能实现预定功能。 造成错误的原因是( )。 A定义语句 int i,max;中 max 未赋初值 B赋值语句 max=MIN;中,不应给 max 赋 MIN 值 C语句 if(maxxi) max=xi;中判断条件设置错误 D赋值语句 max=MIN;放错了位置 【答案】 D 【解析】 本题中 for 循环中首先将 MIN 值赋值给 max,然后用
14、xi与 max 的值比较。每次都是将 MIN 值与xi值进行比较,所以无论 xi的值是什么,都不会影响 if 的判断语句, max=xi始终执行。所以函数返回的是数组中最后一个元素的值。程序的错误在于 max=MIN 的位置, for 循环之前应先执行 max=MIN。所以答案选择 D选项。 12 设有定义: char *c; 以下选项中能够使字符型指针 c 正确指向一个字符串的是 ( ) 。 A char str=string;c=str; B scanf(%s,c); C c=getchar(); D *c=string; 【答案】 A 【解析】 B, C 选项均为输入函数,其表达意思为输
15、入字符串 c。 B 项中 scanf()函数是将 c 定义为一个字 符数组的数组名; C 项中是将 c 定义为一个字符型变量 ; D 项 中 是 需要 在指针定义时为它赋值, 因此 是不合法 的,所以 BCD 三项 都 不正确 。 A 项 定义字符数组 str,再将字符数组 str 的首地址赋给字符型指针 c, 正确。所以答案选择 A 选项。 13 下列函数的功能是( )。 #define MIN -2147483647 int fingmax (int x,int n) int i,max; for(i=0;in;i+) max=MIN; if(maxxi)max=xi; return ma
16、x; A将 a 所指字符串赋给 b 所指空间 B使指针 b 指向 a 所指字符串 C将 a 所指字符串和 b 所指字符串进行比较 D检查 a 和 b 所指字符串中是否有 0 【答案】 A 【解析】 函数 fun 中 a 和 b 是两个字符型指针,在 while 语句的表达式中将指针 a 所指向的字符赋给指针 b所指向的内存单元,再判断指针 b 所指向的字符是不是字符串中的结尾符,若不是,则字符指针 a 和 b 分别自增,再执行循环语句,直至 b 所指向的字符为字符串中的空字符。所以答案选择 A 选项。 14 表达式: (int)(double)9/2)-9%2 的值是 ( ) 。 A 0 B
17、3 C 4 D 5 【答案】 B 【解析】 运算符 “ /”“ %” 的优先级高于 “ -” ,所以先进行除法和求余运算,再进行减法运算。强制类型转换表达式的形式:(类型名)(表达式)。 “ 9/2” 结果为 4,转换成 double 类型再转换成 int 类型结果依然为 4, 9%2的结果为 1,最后结果为 4-1=3。答案选择 B 选项。 15 有以下程序: 程序运行后的输出结果是( )。 A 9,One*World B 9,One*Dream! C 10,One*Dream! D 10,One*World 【答案】 C 【解析】 程序将两个字符串常量赋值给一个二维字符数组,然后 p 指向
18、第二个字符串。 strlen 统计字符串中有效字符的个数,可知 One*Dream!中共有 10 个字符。所以答案选择 C 选项。 16 有以下程序: fun(char * a,char * b) while(*b= *a)!=0) a+; b+; #include #include main() char str20=One*World,One*Dream!,*p=str1; printf(%d,strlen(p); printf(%sn,p); 程序运行以后的输出结果是( )。 A 7 B 8 C 9 D 10 【答案】 C 【解析】 在函数 f 中,整型变量 a 为静态变量,所以每次调用
19、函数 f 时不再为 a 重新赋值,而且 a 的值只有在程序结束时才被释放。第一次调用 f 后 n=4, a=2, s=4;第二次调用时, a 初值为 2,调用后, a=3, n=5, s=4+5=9,所以输出结果为 9。答案选择 C 选项。 17 有以下程序: 程序运行后的输出结果是( )。 A 3 B 5 C 7 D 9 【答案】 A 【解析】 程序进入 for 循环后,首先 k=1,执行 default 语句, c 变为 1。由于 default 语句之后没有 break 语句,因此继续执行 case 2, c 变为 2,之后执行 break 语句跳出本次循环。下次循环 k=2,直接执行
20、case 2, c 自增为 3 后跳出本次循环。 k=3 时 for 循环结束,最后输出 3。答案选择 A 选项。 #include int f(int n); main() int a=3,s; s=f(a); s=s+f(a); printf(%dn,s); int f(int n) static int a=1; n+=a+; return n; #include main() int c=0,k; for(k=1;k3;k+) switch(k) default:c+=k; case 2:c+;break; case 4:c+=2;break; printf(%dn,c); 18 下面
21、是有关 C 语言字符数组的描述,其中错误的是 ( ) 。 A 不可以用赋值语句给字符数组名赋字符串 B 可以用输入语句把字符串整体输入给字符数组 C 字符数组中的内容不一定是字符串 D 字符数组只能存放字符串 【答案】 D 【解析】 C 语言中, 字符数组可以用来存放单个的字符或者字符串。答案选择 D 选项。 19 若有定义语句: int a410,*p,*q4; 且 0ib?(bc?1:0):0; 功能相同的是 ( ) 。 A if(ab) & (bc) k=1; else k=0; B if(ab) | (bc) k=1; else k=0; C if(a=b) k=0; else if(
22、bb) k=1; else if(bc) k=1; else k=0; 【答案】 A 【解析】 三元运算符表达式的形式为:表达式 1?表达式 2:表达式 3,当表达式 1 的值为真时,结果为表达式2 的值;当表达式 1 的值为假时,结果为表达式 3 的值。首先判断 a、 b 的关系:如果 ab,执行语句( bc?1:0);判断 b、 c 的关系,如果 bc, k=1,否则 k=0;如果 ab,则 k=0。综上所述:当 ab 且 bc 时, k=1,否则 k=0,与 A 项语句功能相同。答案选择 A 选项。 21 若有定义语句: int x=10; 则表达式 x-=x+x 的值为( )。 A -
23、20 B -10 C 0 D 10 【答案】 B 【解析】 单目加运算符优先级高于赋值运算符,所以先做 x+x 结果为 20,再做 x-20,结果为 -10,然后赋值给 x。所以答案选择 B 选项。 22 有以下程序: 程序运行后的输出结果是 ( ) 。 A 0 B 2 C 3 D 5 【答案】 B 【解析】 程序 中 main 函数的作用就是判断字符串 s 中小写字母的个数,显然结果为 2。答案选择 B 选项。 23 有以下程序: 已知字母 A 的 ASCII 码为 65,程序运行后的输出结果是( )。 A E,68 B D,69 C E,D D输出无定值 【答案】 A 【解析】 C 语言中
24、每个字符都对应一个 ASCII 码值,该值可以用来运算。本题中 main 函数将字符 A 经过加四和加三运算后分别赋值给 c1、 c2,则 c1=E, c2=D,然后将 c1 按字符格式输出, c2 按整型格式输出。答案选择 A 选项。 24 有以下程序: #include main() char s=012xy; int i,n=0; for(i=0;si!=0;i+) if(si=a&si=z)n+; printf(%dn,n); #include main() char c1,c2; c1=A+8-4; c2=A+8-5; printf(%c,%dn,c1,c2); 更多各类考试资料 v
25、:344647 公众号:顺通考试资料 程序运行后的输出结果是( )。 A 0,0 B 1,0 C 3,2 D 1,2 【答案】 D 【解析】 main 函数先为 a、 b 赋值,然后做运算 a+b 结果赋值给 b,此时 b 为 1,并将 b 打印出来。接着做运算 2*b 结果为 2*1=2 赋值给 a,将 a 打印出来,所以最终的输出结果为 1,2。答案选择 D 选项。 25 以下选项中,能用作用户标识符的是 ( ) 。 A void B 8_8 C _0_ D unsigned 【答案】 C 【解析】 标识符是由若干个字符组成的字符序列,用来命名程序的一些实体。 C 语言定义标识符应遵循以下
26、六种规则:标识符由字母、数字或下划线组成;第一个字符必须是字母或下划线;标识符最多由 274 个字符组成;在标识符中严格区分大小写字母; 关键字不能作为自定义的标识符在程序中使用。 A、 D 项皆为 C语言的关键字, B 项第一个字符为数字,错误。答案选择 C 选项。 26 设有以下函数: void fun(int n,char* s) 则下面对函数指针的定义和赋值均是正确的是 ( ) 。 A void (* pf)();pf=fun; B void *pf();pf=fun; C void * pf(); *pf=fun; D void (* pf)(int,char);pf=&fun; 【
27、答案】 D 【解析】 函数指针的一般定义形式为: 返回值类型 (* 指针变量名 ) (形参列表 ); 其中,“ 返回值类型 ” 说明函数的返回类型, “ (* 指针变量名 )” 中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的 “ 形参列表 ” 表示指针变量指向的函数所带的参数列表。 以本题函数和函数指针为例,将函数的首地址赋给指针,可以是 pf=fun;或者 pf=&fun; 选项 A,参数列表与题干函数不符,错误。选项 B,函数指针定义格式错误。选项 C。函数指针定义格式错误,复制格式也错误。答案选择 D 选项。 27 阅
28、读以下程序: #include main() int a=1,b=0; printf(%d,b=a+b); printf(%dn,a=2*b); 该程序编译时产生错误,其出错原因是( )。 A定义语句出错, case 是关键字,不能用作用户自定义标识符 B定义语句出错, printF 不能用作用户自定义标识符 C定义语句无错, scanf 不能作为输入函数使用 D定义语句无错, printf 不能输出 case 的值 【答案】 A 【解析】 在 C 语言中,关键字又称保留字,它是系统预先定义的,具有特定含义的标识符,故不允许用户重新定义。 case 为 C 语言中的关键字,因此用户不能再定义标
29、识符为 case 的变量。答案选择 A 选项。 28 设有定义: int a=1,b=2,c=3; 以下语句中执行效果与其他三个不同的是 ( ) 。 A if(ab)c=a,a=b,b=c; B if(ab)c=a,a=b,b=c; C if(ab)c=a;a=b;b=c; D if(ab)c=a;a=b;b=c; 【答案】 C 【解析】 C 语言中 if 语句后面只跟一条语句时,可以省略大括号。即 if 语句仅作用于紧随其后的那条语句或者是复合语句的内容,所以 A 项,执行三条语句组成的复合语句; BD 两项执行大括号中的三条语句;而 C 项只执行 c=a;。答案选择 C 选项。 29 有以
30、下程序: 程序运行后的输出结果是( )。 A 0 2 B 1 3 C 5 7 D 1 2 【答案】 D 【解析】 (表达式 1)&(表达式 2)中,如果表达式 1 为假或 0,那么表达式 2 就不会被执行。程序首先进入while 的判断语句,执行 k+和 n+。 k+为零,不满足循环条件,所以 n+不会被执行, while 循环结束后, k 自增为 1, n 没有进行运算,仍为 2。答案选择 D 选项。 #include main() int case; float printF; printf(请输入 2 个数 :); scanf(%d %f,&case,&printF); printf(%
31、d %fn,case,printF); #include main() int n=2,k=0; while(k+&n+2); printf(%d %dn,k,n); 30 有以下程序: 程序运行的结果是 ( ) 。 A 1,2,3,4, B 1,0,7,0, C 1,4,5,9, D 3,4,8,0, 【答案】 B 【解析】 数组 x 有 4 列。 fun 函数中 for 循环的作用是将二维数组的对角线元素赋给 b0, b1, b2, b3。在主函数中,二维数组初始化为 1,2,3,4,5,6,7,8,9,10,对角线元素为 1,0,7,0。答案选择 B 选项。 31 有以下程序: 程序运行
32、的结果是 ( ) 。 A 40 B 16 C 8 D 4 【答案】 C 【解析】 移位运算符的优先级比赋值运算符优先级高,故语句 “ a=a1” 先进行 a 的二进制移位运算,左移一位相当于原数乘以 2, a1 结果为 4*2=8,没有超过 char 类型的范围,将 8 赋值给 a,并输出 a 的值。 答案选择 C 选项。 32 有以下程序: #include #define N 4 void fun(int aN,int b) int i; for(i=0;iN;i+)bi=aii; main() int xN = 1,2,3, 4, 5,6,7,8, 9,10, yN,i; fun(x,y
33、); for(i=0;iN;i+)printf(%d,yi); printf(n); #include main() char a=4; printf(%dn,a=ay, (+p)-x 即输出 data0.y 和 data1.x。 从初始化列表中可以看出,这两个值分别是 10 和 2。答案选择 C 选项。 33 有以下程序段 程序的输出结果是( )。 A a=10 b=50 c=30 B a=10 b=50 c=10 C a=10 b=30 c=10 D a=50 b=30 c=50 【答案】 B 【解析】 C 语言中使用分号来作为语句的结束,所以 a=b,b=c;是一条含有逗号运算符的语句
34、, 是 if 语句的执行体。因为题中 ab, if 条件不满足,直接执行 c=a。答案选择 B 选项。 34 有以下程序: #include struct st int x,y;data2=1,10,2,20; main() struct st*p=data; printf(%d,p-y); printf(%dn,(+p)-x); #include main() int a,b,c; a=10;b=50;c=30; if(ab)a=b,b=c;c=a; printf(a=%d b=%d c=%dn,a,b,c); 程序运行的结果是( )。 A 4 B 34 C 31 D 32 【答案】 C 【
35、解析】 在 fun 函 数中,首先将 s0k的值赋给 m,然后通过 for 循环,遍历 s1k sn-1k之中的数,将遇到的比 m 大的数保存到 m 中。这是搜索最大值的算法,搜索的是 s0k sn-1k之间的最大值。所以,主函数中 fun(a,4,0)的功能就是搜索 a00 a30之间的最大值,这 4 个值分别是 1、 11、 21、 31,所以最终输出结果 是 31。 答案选择 C 选项。 35 有以下程序: 程序运行的结果是( )。 A *7 B *3*5 C *5 D *2*6 #include int fun(int(*s)4,int n,int k) int m,i; m=s0k;
36、 for(i=1;im) m=sik; return m; main() int a44 = 1,2,3,4, 11,12,13,14, 21,22,23,24, 31,32,33,34; printf(%dn,fun(a,4,0); #include main() int i=5; do if(i%3=1) if(i%5=2) printf(*%d,i); break; i+; while(i!=0); printf(n); 【答案】 A 【解析】 在 do while 循环中,总是先执行循环体后判断循环条件,所以循环体至少会被执行一次。在循环中,如果满足 (i%3=1)&(i%5=2),则
37、输出 i 的值,并执行 break;退出 do while 循环;否则 i+,继续判断 while 条件,如果 i=0,则终止 do while 循环。第 1 遍循环, 5%3=1 不成立 ,执行 i+, i 变为 6, 第 1 遍循环结束,判断 (i!=0)为真,继续循环。 第 2 遍循环, 6%3=1 不成立 ,执行 i+, i 变为 7, 第 2 遍循环结束,判断 (i!=0)为真,继续循环。第 3 遍循环 7%3=1 成立, 7%3=2 成立 ,执 行 if 子句 “ printf(*%d,i);break;” ,输出 *7 之后跳出循环。答案选择 A 选项。 36 有以下程序: 程序
38、运行的结果是 ( ) 。 A 0 B 10 C 20 D出错 【答案】 C 【解析】 fun 函数的功能是申请一个 int 型指针 p,把 p 指向的存储空间赋值为 n,并返回 p 指向的空间的值,即为 n。 fun(10)的返回值为 10,所以 a=fun(10)后 a 的值为 10, a+fun(10)=20。答案选择 C 选项。 37 有以下程序: 程序运行的结果是( )。 A 331 B 41 C 2 D 1 #include #include int fun(int n) int *p; p=(int*)malloc(sizeof(int); *p=n; return *p; mai
39、n() int a; a=fun(10); printf(%dn,a+fun(10); #include main() int x=1,y=2,z=3; if(xy) if(yy 不成立,退出第一个 if 语句,执行printf(%dn,x+)。输出结果为 1。答案选择 D 选项。 38 有以下程序: 程序运行的结果是 ( ) 。 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, 【答案】 A 【解析】 在 C 语言中,函数参数传递的作用是“传值”,形参和实参是
40、两个没有关系的变量。函数 fun 交换了参数值,但只是交换了形参的值,结果并不会传递给实参。所以数组 c 没有发生变化,原顺序输出。答案选择A 选项。 39 有以下程序: #include 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;i10;i+=2)fun(ci,ci+1); for(i=0;i10;i+)printf(%d,ci); printf(n); 程序运行的结果是 ( ) 。 A 345678 B 876543 C 1098765 D 321678
41、 【答案】 D 【解析】 在 main()函数中定义了一个有 10 个元素的数组 k,并 且赋初值为 1,2,3,4,5,6,7,8,9,10。执行函数fun(k,5),把 k 的首地址赋给形参 a,把 5 赋给形参 n。在 fun()函数中, for 循环执行了 2 次:第一次, i 的值为 0,循环体中将 a0与 a4的值互换;第二次, i 值为 1,这次是将 a1与 a3的值互换。所以, fun()函数执行完后,数组 k 中的内容为 5,4,3,2,1,6,7,8,9,10。接下来,循环输出 a2 a7的值,故输出结果是 321678。答案选择 D选项。 40 C 源程序中不能表示的数制
42、是 ( ) 。 A二进制 B八进制 C十进制 D十六进制 【答案】 A 【解析】 C 语言中整型常量可以用十进制、八进制数、十六进制数来表示。虽然计算机只能识别二进制数,但二进制不能用源程序表示。答案选择 A 选项。 41 有以下程序: #include void fun(int a,int n) int i,t; for(i=0;in/2;i+) t=ai; ai=an-1-i; an-1-i=t; main() int k10=1,2,3,4,5,6,7,8,9,10,i; fun(k,5); for(i=2;i8;i+)printf(%d,ki); printf(n); 程序运行的结果是
43、( )。 A 1 B 2 C 3 D 4 【答案】 B 【解析】 fun 函数是一个递归函数,其功能是:当 b 的值为零时,返回此时 a 的值;否则,返回 fun(-a,-b),即 a 和 b 的值分别减 1 后递归调用返回 fun 函数。当 b 不断递减时, a 也不断递减,直到 b 为零。执行过程为:执行 fun(4,2), b=2,返回 fun(3,1),此时 b=1,返回 fun(2,0), b=0,返回 a 的值 2。答案选择 B 选项。 42 以下叙述中错误的是 ( ) 。 A用户定义的函数中可以没有 return 语句 B用户定义的函数中可以有多个 return 语句,以便可以调
44、用一次返回多个函数值 C用户定义的函数中若没有 return 语句,则应当定义函数为 void 类型 D函数的 return 语句中可以没 有表达式 【答案】 B 【解析】 用户定义的函数有两种: void 函数,可以没有 return 语句,如果有 return 语句,也不可以返回任何表达式;指定返回类型函数,至少有一个返回语句。在一个函数内,可以根据需要在多处出现 return 语句,但无论有多少个 return 语句, return 语句只会被执行一次然后退出函数,并且只能返回一个函数值。 AC 两项,在没有返回值的函数中可以没有 return 语句,函数类型 定义 为 void 即可
45、; D 项, 在没有返回值的函数中如果有return 语句,该语句必须不带任何表达式 ; B 项, 用户定义的函数可以有多个 return 语句,但是只能返回一个函数值。 答案选择 B 选项。 43 若有定义语句: char s10=123456700; 则 strlen(s)的值是 ( ) 。 A 7 B 8 C 9 D 10 【答案】 A 【解析】 C 语言规定以字符 0作为字符串结束的标识符。 strlen 函数返回的是字符串的长度,不包含字符 0,所以值是 7。答案选择 A 选项。 44 执行以下程序段后, w 的值为 ( ) 。 int w=A,x=14,y=15; w=(x|y)&
46、(wa); A -1 B NULL #include int fun(int a,int b) if(b=0)return a; else return(fun(-a,-b); main() printf(%dn,fun(4,2); C 1 D 0 【答案】 C 【解析】 因为 x=14, y=15 都是非零整数,因此 x|y=1。大写字母的 ASCII 码值小于小写字母, wa也为真,因此 (x|y)&(wa)的值为 1。答案选择 C 选项。 45有以下程序: 程序运行的结果是 ( ) 。 A 234345 B 43254345 C 233423 D 453423 【答案】 D 【解析】 外
47、层主循环 i 从 3 减到 1 执行了 3 次,嵌套的循环 j 从 1 增到 2, 每轮执行 2 次 。 每次输出 i+j 的值,就可以得到 3+1, 3+2, 2+1, 2+2, 1+1, 1+2。 但注意每次内循环结束要换行。答案选择 D 选项。 46 以下选项中正确的定义语句是 ( ) 。 A double a;b; B double a=b=7; C double a=7,b=7; D double,a,b; 【答案】 C 【解析】 同一类型变量的定义时,不同变量之间需要用 “ ,” 分隔,选项 A 错误;定义变量时初始化赋值不能用等号连接,选项 B 错误;变量类型说明后面不能用逗号,
48、而是用空格分离,选项 D 错误。答案选择 C 选项。 47 以下选项中不能作为 C 语言合法常量的是 ( ) 。 A cd B 0.1e+6 C a D 011 【答案】 A 【解析】 常量包括整型常量、实型常量、字符常量和字符串常量等。单引号表示字符常量,但不能包含字符串。表达字符串常量时需用双引号。 A 项, 在 C 语言中,字符常量是用单引号括起来的一个字符, cd包含了 2个字符 ; B 项, 0.1e+6 是实型常量的指数形式,代表 0.1106; C 项, a是合法的字符串常量, a 是一个非打印的转义字符表示响铃 ; D 项, 011是一个字符常量, 011 是一个用 3 位八进
49、制表示的转移字符。答案选择 A 选项。 48 若变量已正确定义为 int 型,要通过语句 scanf(%d,%d,%d,&a,&b,&c);给 a 赋值 1、给 b 赋值 2、给 C赋值 3,以下输入形式中错误的是( u 代表一个空格符) ( ) 。 #include main() int i,j; for(i=3;i=1;i-) for(j=1;j=2;j+)printf(%d,i+j); printf(n); A uuu1,2,3 B 1u2u3 C 1,uuu2,uuu3 D 1,2,3 【答案】 B 【解析】 在输入整数或实数这类数值型数据时,输入的数据之间必须用空格、回车符、制表符
50、( Tab 键 ) 等间隔符隔开,间隔符个数不限。 在题目中, scanf 函数使用通配符逗号,则在输入数据时也要使用通配符逗号,且逗号要紧跟着数据后面。 B 项, 没有输入非格式符 “ ,” 。答案选择 B 选项。 49 如有表达式 (w)?(-x):(+y),则其中与 w 等价的表达式是 ( ) 。 A w=1 B w=0 C w!=1 D w!=0 【答案】 D 【解析】 条件表达式形式为 ?:。表达式 1 的值为真,结果为表达式 2 的值;表达式 1 的值为假,结果为表达式 3 的值。可见表达式 w 等价于 w!=0。答案选择 D 选项。 50 下面的函数调用语句中 func 函数的实