1、福建省二级 C 语言-2 (1)及答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:20,分数:40.00)1.一个 C 语言源程序的执行_。(分数:2.00)A.从 main()函数开始,直到 main()函数结束B.从第一个函数开始,直到最后一个函数结束C.从第一条语句开始,直到最后一条语句结束D.从 main()函数开始,直到最后一个函数结束2.C 语言中,合法的整型常数是_。(分数:2.00)A.-068B.0x48aC.1, 256D.1.03.以下关于 C 语言变量的叙述中,错误的是_。(分数:2.00)A.不同基本类型的变量之间不能进行混合运算B.在定义变量
2、的同时可对变量赋初值C.变量按所定义的类型存放数据D.程序中的变量必须先定义后使用4.若已定义 int a, b=6;执行语句 a=-b; 后,变量 a、b 的值分别_。(分数:2.00)A.5 5B.5 6C.6 5D.6 65.以下程序运行时,应从键盘输入_,则输出结果是:3 6。 #includestdio.h int main() int a, b; scanf(“%d, %d“, printf(“%d %d/n“, a, b); return 0; (分数:2.00)A.3,6B.3 6C.6,3D.a=3 b=66.若已定义 int a=1, b=2, c=3, d=4, k=2,
3、 t=2; ,执行(k=ab)|(t=cd)后 t 的值是_。(分数:2.00)A.“false“B.2C.0D.17.以下关于运算符优先顺序的描述中,正确的是_。(分数:2.00)A.关系运算符算术运算符赋值运算符逻辑与运算符B.逻辑与运算符关系运算符算术运算符赋值运算符C.赋值运算符逻辑与运算符关系运算符算术运算符D.算术运算符关系运算符赋值运算符逻辑与运算符8.执行以下程序,若从键盘输入 1,则输出结果是_。 #includestdio.h int main() int k; scanf(“%d“, switch(k) case 1: printf(“%d“, k+); case 2:
4、printf(“%d“, k+); case 3: printf(“%d“, k+); break; default: printf(“Full!/n“); return 0; (分数:2.00)A.1B.2C.234D.1239.以下不是无限循环的语句是_。(分数:2.00)A.while(1)a+;B.for(m=0, n=1; n+m; n=i+)i=n;C.for(;a+=i);D.for(i=10;i-)sum+=i;10.以下程序运行结果是_。 #includestdio.h int main() int a=1, 3, 4, 6, 9, i, x=1; for(i=0; i3;
5、i+) x+=ai+1; printf(“%d/n“, x); return 0; (分数:2.00)A.9B.14C.15D.1011.执行 int a4=2, 3, 5, 7, 8, 9, 11, 13, 15; 语句后,a12的值是_。(分数:2.00)A.11B.3C.5D.912.以下给字符数组 str 定义和赋值,正确的是_。(分数:2.00)A.char str10;str=“good“;B.char str10;strcpy(str, “abdefghijklmnxy“);C.char str10=“abdefghijklmnxy“;D.char str=“good“;13.下
6、列叙述错误的是_。(分数:2.00)A.形式参数也属局部变量B.在其他函数中定义的变量在主函数中不能使用C.主函数中定义的变量属全局变量D.全局变量的作用域从定义该变量的位置开始至本源文件结束14.下列叙述错误的是_。(分数:2.00)A.C 程序在执行过程中对预处理命令行进行处理B.预处理命令行都必须以#号开始C.在程序中凡是以#号开始的语句行都是预处理命令行D.以下是正确的宏定义:#define CR 4515.对于基类型相同的两个指针变量 p1、p2,则下列运算不合理的是_。(分数:2.00)A.p1=p2B.p1+p2C.p1p2D.p2-p116.以下程序的运行结果是_。 #incl
7、udestdio.h void fun(int x, int y, int*p) *p=x+y; int main() int a, b, c; fun(5, 3, fun(7, a, fun(a, b, printf(“%d, %d, %d/n“, a, b, c); return 0; (分数:2.00)A.0, 0, 0B.8, 15, 0C.8, 0, 0D.8, 15, 2317.若有以下结构类型定义及结构变量说明: struct example int a; char se; vl; 则_是正确的结构变量声明或结构变量成员引用。(分数:2.00)A.example.a=50;B.e
8、xample v2; v2.a=50;C.struct example v2; v2.a=50;D.struct v2; v2.a=50;18.以下程序的运行结果是_。 #includestdio.h struct STU char name10; float score3; ; int main() struct STU s3=“zhang“, 95, 89, 78, “wang“, 77, 68, 80, “hong“, 67, 76, 70; struct STU*p=s; int i; float sum=0; for(i=0; i3; i+) sum=sum+p-scorei; pr
9、intf(“%6.2f/n“, sum); return 0; (分数:2.00)A.239.00B.262.00C.225.00D.213.0019.以下程序段执行后,变量 c 的值为_。 int a=3, b=2, c; c=(a b)2;(分数:2.00)A.11B.12C.3D.420.C 语言中系统默认的文件类型有_。(分数:2.00)A.类型文件和文本文件B.二进制文件和类型文件C.文本文件和记录文件D.文本文件和二进制文件二、程序填空题(总题数:1,分数:20.00)(在每对/*/之间填写内容,完成题目的要求)(分数:20.00)(1).以下程序的功能是将输入字符串中所有的字符“
10、k“删除。 如:输入:adklhjkyuer 输出:adlhjyuer /*/ 1/*/ int main() char str100; int/*/ 2/*/; printf(“Enter string:“); gets(str); for(i=j=0; stri!=“/0“; i+) if(stri!=“k“) strj=stri; /*/ 3/*/; strj=“/0“; printf(“Now sting is:“); puts(str); return 0; (分数:10.00)(2).以下程序用以输出两个正整数 a 和 b,它们满足 a 能被 13 整除,b 能被 11 整除,且
11、a 与 b 之和为316。 #includestdio.h int main() int i=0, a, b; do i+; b=316-13*i; while(/*/ 1/*/); a=13*i; printf(“%d+%d=316/n“, a, b); return 0; (分数:10.00)三、程序改错题(总题数:1,分数:20.00)(修改每对/*/之间存在的错误,完成题目的要求)(分数:20.00)(1).以下程序用以输出 1100 之间所有偶数的累加和。 #includestdio.h int main() /*/ 1 int i/*/; int sum=0; while(i+,
12、i=100) if(/*/ 2 i=(i/2)*2/*/) continue; sum+=i; printf(“sum=%d/n“, sum); return 0; (分数:10.00)(2).以下程序实现如下图形的输出。 1 0 0 0 0 2 1 0 0 0 3 2 1 0 0 4 3 2 1 0 5 4 3 2 1 #includestdio.h int main() /*/ 1 int a5, 5; /*/ int i, j; for(i=0; i5; i+) for(j=0; j5; j+) if(/*/ 2 j=i/*/) aij=0; else /*/ 3 aij=i+2-j;
13、/*/ printf(“%3d“, aij); printf(“/n“); return 0; (分数:10.00)四、编程题(总题数:1,分数:20.00)(补充每对/*/之间的程序段,完成题目的要求)(分数:20.00)(1).程序中的 fun()函数用以完成如下数学表达式。 (分数:10.00)_(2).请编写程序中的 letters()函数,主函数调用该函数用以将字符数组 str1 中出现的英文字母依次存放在字符数组 str2 中(所有大写字母在前、小写字母在后)。如: str1 中字符串:adKDsdi798?sdfAE str2 中字符串:KDAEadsdisdf #include
14、stdio.h void letters(char s, char str) /*/ /*/ int main() char str1100, str2100; printf(“Enter a string:“); gets(str1); letters(str1, str2); printf(“string is converted:“); puts(str2); return 0; (分数:10.00)_福建省二级 C 语言-2 (1)答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:30,分数:60.00)1.以下不正确的 if 语句是_。(分数:2.00)A.if
15、(xy);B.if(x=yC.if(x!=y)scanf(“%d“, D.if(xy)x+; y+; 解析:解析 选项 D 的 if 分支内嵌语句是复合语句,复合语句内的各条语句都必须以分号“; ”结尾,而右花括号“”后面则不需要有分号。应改为:if(xy)x+; y+; 。2.if 语句嵌套使用时,else 总是与_配对。(分数:2.00)A.同一行上的 ifB.其之前最近的 ifC.其之前最近的未配对的 if D.缩排位置相同的 if解析:解析 C 语言规定,else 总是与它前面最近的未配对的 if 配对。注意选项 B 是不正确的,如如下嵌套格式: if(表达式 1) if(表达式 2)
16、 语句 1 else 语句 2 与 else 最近的 if 语句已用花括号括起来,表示它是不带 else 的 if 语句。关于选项 D,通常要求同一层的 if、else 在缩排位置相同的同一列上对齐,但排列对齐不是正确配对的保障机制,只是为了清晰体现嵌套结构,提高程序的可读性。3.以下程序的输出结果是_。 #includestdio.h int main() int a=-1, b=1, k; if(+a0 else printf(“%d%d/n“, b, a); return 0; (分数:2.00)A.-1 1B.0 1C.1 0 D.0 0解析:解析 首先判断+a0 的值,由于+a 是先
17、加 1 后使用,故执行+a 后 a 的值变为 0,判断出a0 的值为假。对于else k=0; B.if(ab|bc)k=1;C.if(a=b)k=0;else if(b=c)k=1;else k=0;D.if(ab)k=1;else if(bc)k=1;解析:解析 语句 k=ab?(bc?1:0):0;的功能是将表达式 ab?(bc?1:0):0 的值赋给k。ab?(bc?1:0):0 是一个嵌套的条件表达式,其计算顺序为先外层再内层,首先判断 ab 成立否,若 ab 成立,再计算 bc?1:0 的值,此时当 bc 时值为 1,否则值为 0;若 ab 不成立,则值为 0。选项 A 的选择语句
18、功能符合条件表达式的要求,当 ab switch(a%3) case 0:switch(b%5) default:m-; case 2:m+; break; case 3:m-; break; case 1:m+; printf(“%d/n“, m); return 0; (分数:2.00)A.0B.1C.2D.3 解析:解析 此程序是 switch 的嵌套结构。首先根据 a%3 的值(0)选择外层 switch 的 case 0 分支,执行该分支内嵌的 switch 语句,根据 b%5 的值(2)选择内层 switch 的 case 2 分支,执行该分支中的 m+,于是 m=2,执行 bre
19、ak 退出内层 switch,这时外层 switch 的 case 0 分支也执行结束;由于 case 0 分支没有 break 语句(注意,case 2 分支中的 break 只能退出内层 switch 语句),case 0 之后的 case 1 分支中的 m+接着被执行,于是 m=3,至此完成外层 switch 的执行。注意在内层 switch 语句中,尽管 case 2分支出现在 default 分支之后,但它还是会在 default 分支之前被挑选,default 分支只有在所有分支都没被选中时才有机会执行。6.以下描述中正确的是_。(分数:2.00)A.do-while 语句构成的循
20、环,当 while 后的表达式的值为零时结束循环 B.do-while 语句构成的循环,当 while 后的表达式的值为非零时结束循环C.do-while 语句构成的循环只能用 break 语句退出D.do-while 语句构成的循环可以用 continue 语句退出解析:解析 do-while 语句构成的循环和 while 语句构成的循环一样,当条件表达式为非 0 时,执行循环体语句,当条件表达式为 0 时,停止循环。也可以在循环体中,根据相应条件,使用 break 语句退出循环。continue 语句的作用是跳过循环体中其后面未执行的语句,进行下一次循环条件判定,循环继续与否,将由循环条件
21、是否满足决定。7.以下程序执行后,输出结果为_。 int main() int x, y; for(x=1, y=1; y50; y+) if(x=10)break; if(x%2=1) x+=5; continue; X-=3; printf(“x=%d“, x); return 0; (分数:2.00)A.10 B.11C.12D.13解析:解析 本题要求掌握 break 和 continue 语句在循环语句中的作用。第一次循环:x=1,执行x+=5,结果为 6;第二次循环:x=6,执行 x-=3,结果为 3;第三次循环:x=3,执行 x+=5,结果为 8;第四次循环:x=8,执行 x-=
22、3,结果为 5;第五次循环:x=5,执行 x+=5,结果为 10;第六次循环:x=10,停止循环。x 结果为 10。8.下列程序段的执行次数为_。 int a=1; while(1) a+; +a; if(a4)break;(分数:2.00)A.1 B.2C.死循环D.错误解析:解析 进入 while 循环,先判别循环条件,循环条件为真,执行循环体语句 a+; +a; 后,a 为3,满足 a4,停止循环,所以循环执行 1 次。9.下面程序的运行结果是_。 int main() int x=0, y=0; while(x15) y+; x+=+y; printf(“%d, %d“, y, x);
23、 return 0; (分数:2.00)A.20,7B.6,12C.20,8D.8,20 解析:解析 第一次循环:执行 y+,使 y=1,执行 x+=+y,使 y=2,x=2;第二次循环:执行 y+,使y=3,执行 x+=+y,使 y=4,x=6;第三次循环:执行 y+,使 y=5,执行 x+=+y,使 y=6,x=12;第四次循环:执行 y+,使 y=7,执行 x+=+y,使 y=8,x=20;第五次循环:x15,停止循环。所以最终结果:y=8,x=20。10.对于下面程序段,描述中正确的是_。 int i=100; while(i=0) i=i-1;(分数:2.00)A.while 循环执
24、行 100 次B.循环体语句一次也不执行 C.while 循环执行 99 次D.循环体语句执行一次解析:解析 要注意表达式 i=0 和 i=0 的区别:前者是比较运算,判别 i 值是否是 0;后者是赋值运算,将 0 赋给 i。循环条件为 i=0,即将 0 赋给 i,此时表达式的值为 0,循环条件不成立,循环体不被执行。11.下面程序的运行结果是_。 int main() int a=3, b=2, c=1; while(abc) a=a+b; b=a-b; a=a-b; c=a+b; printf(“%d, %d, %d“, a, b, c); return 0; (分数:2.00)A.2,3
25、,5B.3,2,5C.2,3,1D.3,2,1 解析:解析 如果要在 C 语言程序中表示数学关系式 abc,正确的写法为:ab do x*=x; while(!x!=0);(分数:2.00)A.是死循环B.循环执行 2 次C.循环执行 1 次 D.有语法错误解析:解析 进入循环,先执行 x*=x,x 的结果为 4,!x 为 0,循环条件(!x!=0)为假,停止循环,循环执行 1 次。逻辑运算符“!”的优先级高于关系运算符“!=”。13.若有定义:int k; ,下面不会出现死循环的程序段是_。(分数:2.00)A.k=0=while(k%2=k+%2)k+;B.k=0;while(1)k=k%
26、100+1; if(k100)break;C.k=0;do+k;while(k0); D.for(;);解析:解析 选项 A 中,k%2 与 k+%2 等价,后者在表达式执行以后递增 1,所以条件(k%2=k+%2)总是成立的,是一个死循环语句。选项 B 中,k%100 是 k 与 100 求余,其值永远不超过 99,循环执行语句k=k%100+1,就是交替将 1,2,100 赋给 k,条件(k100)不可能满足,所以无法终止循环。选项 C中,因为 k 为 int 型变量,在循环体中,语句+k;使 k 一直递增,在 Visual C+运行环境中,当 k 递增至 2147483647 时,再执行
27、 k+,此时 k 值为-2147483648,条件(k0)不满足,停止循环。14.从键盘输入 2473,下面程序的运行结果是_。 #includestdio.h int main() int c; while(c=getchar()!=“/n“) switch(c-“2“) case 0: case 1: putchar(c+4); case 2: putchar(c+4); break; case 3: putchar(c+3); default: putchar(c+2); break; printf(“/n“); return 0; (分数:2.00)A.668977 B.668966C
28、.66778777D.6688766解析:解析 从键盘输入的是字符“2“、“4“、“7“、“3“,c-“2“分别是输入的 4 个字符与字符“2“的ASCII 差值。第一次循环:c-“2“为 0,从 case 0 入口,执行两次 putchar(c+4);输出 66 后,以 break;语句结束;第二次循环:c-“2“为 2,从 case 2 入口,执行 putchar(c+4);输出 8 后,以 break;语句结束;第三次循环:c-“2“为 5,从 default 入口,执行 putchar(c+2);输出 9;第四次循环:c-“2“为 1,从 case 1 入口,执行两次 putchar(
29、c+4);输出 77 后,以 break;语句结束,整个循环结束。15.下面程序的运行结果是_。 #includestdio.h int main() int a, b; for(a=1, b=1; a=100; a+) if(b=20)break; if(b%3=1) b+=3; continue; b-=5; printf(“%d/n“, a); return 0; (分数:2.00)A.7B.8 C.9D.10解析:解析 程序段执行过程各变量的值如下: b=1 a=1 a=100 b%3=1 b=b+3=4 a=a+1=2 a=100 b%3=1 b=b+3=7 a=a+1=3 a=10
30、0 b%3=1 b=b+3=10 a=a+1=4 a=100 b%3=1 b=b+3=13 a=a+1=5 a=100 b%3=1 b=b+3=16 a=a+1=6 a=100 b%3=1 b=b+3=19 a=a+1=7 a=100 b%3=1 b=b+3=22 a=a+1=8 a=100 b=20 break 结束循环 输出 a16.C 语言中数组元素引用时,其下标允许是_。(分数:2.00)A.关系表达式B.整型表达式C.任何类型的表达式D.整型常量或整型表达式 解析:解析 数组元素引用时,其数组下标应是整型常量或整型表达式。17.以下对一维整型数组 k 正确定义的是_。(分数:2.00
31、)A.k20;B.int n=20, kn;C.#define N 20int kN; D.int n;scanf(“%d:, int kn;解析:解析 C 语言中定义一维数组的形式是: 类型标识符数组名整型常量表达式或符号常量; 答案 A 缺少类型标识符,声明不完整。答案 B 和 D 在声明中数组长度为变量,都是错误的,而答案 C 的数组长度是由符号常量 N 来确定,符合 C 语言语法规则。18.在 C 语言中,二维数组元素在内存中的存放顺序是_。(分数:2.00)A.按行存放 B.按列存放C.由用户自己定义D.由编译器决定解析:解析 C 语言编译系统为二维数组在内存中分配一片连续的存储单元
32、,从存储上看二维数组仍然是一维线性空间,各个元素在内存中的存放顺序是“按行优先”方式进行的。所以正确答案是 A。19.以下一组对数组 a 初始化的语句中,给 a 数组所有元素赋初值 0 的正确语句是_。(分数:2.00)A.int a9=9*0;B.int a9=0; C.int a9=;D.int a9=0;解析:解析 C 语言规定数组初始化时元素初值应放在一对花括号中,而且各值之间以逗号相隔,所以答案 A 和 D 都是错误的。答案 C 中的花括号中,没有一个具体的值,也是错误的。答案 B 虽然只给第一个元素赋初值 0,但系统自动对后续各元素赋初值 0,所以正确答案是 B。20.以下能对二维
33、数组 m 进行正确初始化的语句是_。(分数:2.00)A.int m2=1, 2, 2, 0, 3;B.int m24=1, 2, 3, 4, 2, 5;C.int m3=1, 2, 3, 4, 5; D.int m3=1, , 2, 5, 3;解析:解析 二维数组初始化时,可省略第一维的大小,但不能省略第二维大小,所以答案 A 是错误的。对于答案 B,定义的数组 m 是 2 行 4 列的二维数组,但赋初值却包含了 3 行,是错误的。而答案 D 中的初值列表有一行的初值是空的,这在初始化中是不允许的,也是错误的。从答案 C 可以看出,该语句定义了一个 2 行 3 列的二维数组,并按 C 语言规
34、定对其中部分元素赋初值,是正确的。21.若有说明:int a10; ,则对 a 数组元素引用不正确的是_。(分数:2.00)A.a4+5B.a10 C.a10-10D.a5解析:解析 本例所定义的数组 a 包含 10 元素其元素下标的范围从 0 到 9。在 C 语言中,引用数组元素时下标允许是整型常量或整型表达式,答案 A、C 和 D 所引用的数组元素下标都没有超出所定义的数组范围,而且均为整型,都属于正确引用。而答案 B 中的下标已越界,引用不正确。22.若有说明:int k34; ,则对 k 数组元素的正确引用是_。(分数:2.00)A.a20 B.a1, 3C.a24D.a(2)(1)解
35、析:解析 引用二维数组元素时,行下标与列下标应分别用中括号括起来,所以答案 B 和 D 是错误的。本例所定义的二维数组 k,其行下标范围从 0 到 2,列下标范围从 0 到 3,答案 C 超出了数组列下标的范围,也是错误的。答案 A 正确引用了 k 数组第 2 行第 0 列的元素。23.执行 int a3=1, 2, 3, 4, 5, 6, 7;语句后,a10的值是_。(分数:2.00)A.1B.3C.5D.4 解析:解析 本例语句 int a3=1, 2, 3, 4, 5, 6, 7;相当于 int a33=1, 2, 3, 4, 5, 6, 7; ,即定义 a 是一个 3 行 3 列的二维
36、数组而 a10为第 1 行第 0 列的元素,其值为 4。24.以下关于数组的描述正确的是_。(分数:2.00)A.数组的大小是固定的,但可以有不同数据类型的数组元素B.数组的大小是可变的,但所有数组元素的数据类型必须相同C.数组的大小是固定的,所有数组元素的数据类型必须相同 D.数组的大小是可变的,可以有不同数据类型的数组元素解析:解析 C 语言规定数组元素的个数必须在定义数组时就确定下来,不是可调数组,而且每个数组元素的数据类型都是已经定义的数据类型,所以只有答案 C 描述正确。25.以下对二维数组 a 正确定义的语句是_。(分数:2.00)A.int a3;B.float a(3, 4);
37、C.float a34; D.int a3, 4;解析:解析 C 语言中定义二维数组的形式是: 类型标识符 数组名整型常量表达式 1整型常量表达式 2; 定义二维数组时,第一维与第二维长度要分别用中括号括起来,所以答案 B 和 D 是错误的。二维数组在初始化时,可省略第一维的长度但不能省略第二维长度,所以答案 A 也是错误的。答案 C 正确定义了 a 是一个 3 行 4 列的二维数组,每个数组元素为浮点型数据。26.若有说明:int k4=1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11; ,则 k 数组的第一维长度是_。(分数:2.00)A.3 B.2C.1D.无确定值解析
38、:解析 C 语言中,对二维数组初始化时,可省略第一维的长度。本例有 11 个元素,每行 4 个元素,共需 3 行,因此 k 数组第一维长度为 3。27.以下程序段的运行结果是_。 int i, a10; for(i=0; i10; i+) ai=i; for(i=0; i10; i+, i+) ai+=2; for(i=0; i10; i+) printf(“%d“, ai);(分数:2.00)A.0123456789B.03254769811C.21436587109 D.234567891011解析:解析 执行 for(i=0; i10; i+) ai=i;循环语句后,数组 a 中 10
39、个元素的值依次为0,1,2,3,4,5,6,7,8,9。接着执行 for(i=0; i10; i+, i+) ai+=2;语句,由于该循环语句中循环控制变量 i 的步长为 2,即依次将 a0、a2、a4、a6、a8这些元素的值增加 2,而其他元素值不变,所以应选择答案 C。28.以下程序的运行结果是_。 #includestdio.h int main() int k9=19, 16, 17, 15, 13, 11, 10, 9, i=1, s=0; while(i9 printf(“%d/n“, s); return 0; (分数:2.00)A.33 B.52C.101D.110解析:解析
40、语句 while(i9 ,等价于 while(i9 i+; while 的循环控制条件为(i9 int i, k=2; for(i=0; i3; i+) print(“%d“, mki); return 0; (分数:2.00)A.4 5 7B.2 7 9C.9 10 11D.6 8 9 解析:解析 语句 int m3=1, 3, 2, 4, 5, 7, 6, 8, 9, 10, 11;相当于 int m43=1, 3, 2, 4, 5, 7, 6, 8, 9, 10, 11; 。在语句 for(i=0; i3; i+) printf(“%d“, mki);中,由于变量 k 控制 m 数组的行
41、下标,其值恒为 2,而循环控制变量 i 控制 m 数组的列下标,也即输出 m20、m21、m22元素的值,所以应选择答案 D。30.设有如下程序段: int a34=1, 0, 2, 1, 0, 2, 1, 0, 1, 1, 0, 1, i, j, sum=0; for(i=0; i=2; i+9) for(j=0; j=i; j+) sum+=aij; 则执行该程序段后,sum 的值是_。(分数:2.00)A.0B.4C.5 D.3解析:解析 int a34=1, 0, 2, 1, 0, 2, 1, 0, 1, 1, 0, 1;相当于 int a34=1, 0, 2, 1, 0, 2, 1,
42、 0, 1, 1, 0, 1; ,程序段中循环语句的执行过程可用如下表格进行详析:即 sum 的值为 5。 i 值 j 值 aij的值 执行 sum+=aij后 sum 的值 0 1 1 2 2 2 0 0 1 0 1 2 a00值为 1 a10值为 0 a11值为 2 a20值为 1 a21值为 1 a22值为 0 sum=0+1=1 sum=1+0=1 sum=1+2=3 sum=3+1=4 sum=4+1=5 sum=5+0=5 二、填空题(总题数:21,分数:40.00)31.以下程序运行时输入 12,输出结果是 1。 #includestdio.h int main() char c
43、h1, ch2; int n1, n2; ch1=getehar(); ch2=getchar(); n1=ch1-“0“; n2=n1*10+(ch2-“0“); printf(“%d/n“, n2); return 0; (分数:2.00)解析:12。解析 输入 12,字符“1“被赋给变量 ch1,字符“2“被赋给变量 ch2;ch1 减去字符“0“的结果为整数 1,赋值给变量 n1,ch2 减去字符“0“的结果为整数 2,最后计算出变量 n2 的值为 12。32.以下程序运行后的输出结果是 1。 #includestdio.h int main() int x=3, y=0, z=0;
44、if(x=y+z)printf(“* *“); else printf(“#“); return 0; (分数:2.00)解析:#解析 本题要点是 if 后面括号内表达式的真假判断。由于 y 和 z 都为 0,把 y+z 的值赋给x,所以 x 的值也为 0,即表达式值为假,执行 else 分支语句,输出#。特别提醒:if 后面括号内的表达式一般为关系表达式或逻辑表达式,但也可以是任意合法的表达式,只要表达式的值为 0,就代表“假”,表达式的值非 0,都代表“真”。33.以下程序运行时输入 10,20,输出结果是 1。 #includestdio.h int main() int x, y, t
45、=0; scanf(“%d, %d“, if(xy) t=x; x=y; y=t; printf(“%d, %d/n“, x, y); return 0; (分数:2.00)解析:20,0。解析 输入 10,20,10 被赋给 x,20 被赋给 y;判定 if 条件 xy 为假,于是 if 分支内嵌的语句 t=x;被跳过,而去执行 x=y;和 y=t;语句,所以输出 x 的值为 20,y 的值为 0。特别提醒,如果要实现“当 xy 时,将 x 与 y 中的数交换,否则 x、y 值不变”,需用大括号将 t=x;x=y;y=t;括起来,即成为复合语句t=x; x=y; y=t;。34.以下程序运行时输入 9,输出结果是 1。 #includestdio.h int main() int n; scanf(“%d“, if(n+10) printf(“%d/n“, n); else printf(“%d/n“, n-); return 0; (分数:2.00)解析:10。解析 输入 n 为 9,由于 n+是先使用后加 1,因此,if 语句中是对 910 进行判断,结果为真,将执行 if 分支中的 printf(“%d