当前位置:首页 >> 工学 >> C语言基础练习题(含答案)

C语言基础练习题(含答案)

1

目录
第 1-3 章 C 语言基础知识习题 ................................................................................................ 2 1 选择题 ............................................................................................................................. 2 2 填空题 ............................................................................................................................. 7 3 答案及部分解析 ............................................................................................................. 9 第 4 章 选择结构习题 ............................................................................................................. 11 1 选择题 ........................................................................................................................... 11 2 填空题 ........................................................................................................................... 17 3 答案及部分解析 ........................................................................................................... 23 第 5 章 循环结构习题 ............................................................................................................. 26 1 选择题 ........................................................................................................................... 26 2 填空题: ....................................................................................................................... 32 3 答案及部分解题分析 ................................................................................................... 39 第 6 章 数组习题 ..................................................................................................................... 41 1. 单项选择题 .................................................................................................................. 41 2. 填空题 .......................................................................................................................... 44 3. 判断题 .......................................................................................................................... 45 4. 程序填空题 .................................................................................................................. 45 5. 阅读程序,分析程序的功能。 .................................................................................. 49 第 7 章 函数习题 ..................................................................................................................... 55 1. 单项选择题 .................................................................................................................. 55 2. 填空题 .......................................................................................................................... 56 3. 判断题 .......................................................................................................................... 57 4. 程序填空题 .................................................................................................................. 58 5. 写出下列程序运行结果 .............................................................................................. 59 第 8 章 指针习题 ..................................................................................................................... 67 1 选择题 ........................................................................................................................... 67 2 填空题 ........................................................................................................................... 69

1

第 1-3 章 C 语言基础知识习题
1 选择题
1. 以下不是 C 语言的特点的是( ) 。 A、语言简洁紧凑 B、能够编制出功能复杂的程序 C、C 语言可以直接对硬件操作 D、C 语言移植性好 2. 下列字符序列中,不可用作 C 语言标识符的是( ) 。 A.abc123 B.no.1 C._123_ D._ok 3. 正确的 C 语言标识符是 ( ) 。 A._buy_2 B.2_buy C.?_buy D.buy? 4. 请选出可用作 C 语言用户标识符的一组标识符( ) 。 A.void B.a3_b3 C.For D.2a define _123 -abc DO WORD IF Case sizeof 5. 下列符号中,不属于转义字符的是( ) 。 A.\\ B.\0xAA C.\t D.\0 6. 不属于 C 语言关键字的是( ) 。 A.int B.break C.while D.character 7. 是 C 语言提供的合法关键字的是( ) 。 A.Float B.signed C.integer D.Char 8. 以下不能定义为用户标示符的是( ) 。 A.scanf B.Void C._3com_ D.int 9. 一个 C 程序是由( ) 。 A. 一个主程序和若干子程序组成 B. 一个或多个函数组成 C. 若干过程组成 D. 若干子程序组成 10. C 语言程序的基本单位是( ) 。 A.程序行 B.语句 C.函数 D.字符 11. 下列说法中,错误的是( ) 。 A.每个语句必须独占一行,语句的最后可以是一个分号,也可以是一个回车换行符号 B.每个函数都有一个函数头和一个函数体,主函数也不例外 C.主函数只能调用用户函数或系统函数,用户函数可以相互调用 D.程序是由若干个函数组成的,但是必须有、而且只能有一个主函数 12. 以下说法中正确的是( ) 。 A.C 语言程序总是从第一个定义的函数开始执行 B.在 C 语言程序中,要调用的函数必须在 main( )函数中定义 C.C 语言程序总是从 main( )函数开始执行

1

D.C 语言程序中的 main( )函数必须放在程序的开始部分 13. C 编译程序是( ) 。 A.C 程序的机器语言版本 B.一组机器语言指令 C.将 C 源程序编译成目标程序 D.由制造厂家提供的一套应用软件 14.以下选项中,合法的用户标识符是( ) 。 A.long B._2abc C.3dmax D.A.dat 15.以下选项中,合法的实型常数是( ) 。 A.5E2.0 B.E-3 C.2E0 D.1.3E 16.已知大写字母 A 的 ASCII 码值是 65, 小写字母 a 的 ASCII 码是 97,则用八进制表示的 字符常量’\101’是( ) 。 A.字符 A B.字符 a C.字符 c D.非法的常量 17.以下选项中, 合法转义字符的选项是( ) 。 A.’\\’ B.’\018’ C.’xab’ D.’\abc’ 18.以下选项中,正确的字符常量是( ) 。 A.”F” B.’\\’’ C.’W’ D.’’ 19.以下选项中可作为 C 语言合法整数的是 A.10110B B.0386 C.0Xffa D.x2a2 20.下列变量定义中合法的是 A.short _a=1-.le-1; B.double b=1+5e2.5; C.long do=0xfdaL; D.float 2_and=1-e-3; 21.与数学式子

9x n 对应的 C 语言表达式是( ) 。 2x ? 1
B.9*x**n/(2*x-1) D.9*pow(n,x)/(2*x-1)

A.9*x^n/(2*x-1) C.9*pow(x,n)*(1/(2*x-1)) 22.若有代数式

3ab ,则不正确的 C 语言表达式是( ) 。 cd

A.a/c/d*b*3 B.3*a*b/c/d C.3*a*b/c*d D .a*b/d/c*3 23.已知各变量的类型说明如下: int m=8,n, a, b; unsigned long w=10; double x=3.14, y=0.12; 则以下符合 C 语言语法的表达式是( ) 。 A.a+=a-=(b=2)*(a=8) B. n=n*3=18 C.x%3 D.y=float (m) 24.以下符合 C 语言语法的赋值表达式是( ) 。 A.a=9+b+c=d+9 B.a=(9+b, c=d+9) C.a=9+b, b++, c+9 D.a=9+b++=c+9 25. 已知字母 A 的 ASCII 码为十进制数 65,且 S 为字符型,则执行语句 S=’A’+’6’-’3’; 后,S 中的值为( ) 。 A.’D’ B.68 C.不确定的值 D.’C’ 26.在 C 语言中,要求运算数必须是整型的运算符是( ) 。 A./ B.++ C.*= D .%

1

27.若有说明语句:char s=’\72’;则变量 s( ) 。 A.包含一个字符 B.包含两个字符 C.包含三个字符 D.说明不合法,s 的值不确定 28.若有定义:int m=7; float x=2.5, y=4.7; 则表达式 x+m%3*(int)(x+y)%2/4 的值是( ) 。 A.2.500000 B.2.750000 C.3.500000 D.0.000000 29.在 C 语言中,char 型数据在内存中的存储形式是( ) 。 A.补码 B.反码 C.原码 D.ASCII 码 30.设变量 x 为 float 类型,m 为 int 类型,则以下能实现将 x 中的数值保留小数点后两位, 第三位进行四舍五入运算的表达式是( ) 。 A.x=(x*100+0.5)/100.0 B.m=x*100+0.5, x=m/100.0 C.x=x*100+0.5/100.0 D.x=(x/100+0.5)*100.0 31.表达式 13/3*sqrt(16.0)/8 的数据类型是( ) 。 A.int B.float C.double D.不确定 32.设以下变量均为 int 类型,则值不等于 7 的表达式是( ) 。 A.(m=n=6, m+n, m+1) B.(m=n=6, m+n, n+1) C.(m=6, m+1, n=6, m+n) D.(m=6, m+1, n=m, n+1) 33.假设所有变量均为整型,则表达式(x=2, y=5, y++, x+y)的值是( ) 。 A.7 B.8 C.6 D.2 34.已知 s 是字符型变量,下面不正确的赋值语句是( ) 。 A.s=’\012’; B.s= ’u+v’; C.s=’1’+’2’; D.s=1+2; 35.已知 s 是字符型变量,下面正确的赋值语句是( ) 。 A.s=’abc’; B.s=’\08’; C.s=’\xde’; D.s=”\”; 36.若有以下定义,则正确的赋值语句是( ) 。 int x,y; float z; A.x=1,y=2, B.x=y=100 C.x++; D.x=int (z); 37.设 x、y 均为 float 型变量,则不正确的赋值语句是( ) 。 A.++x ; B.x*=y-2; C.y=(x%3)/10; D.x=y=0; 38.下列语句中符合 C 语言的赋值语句是( ) 。 A.a=7+b+c=a+7; B.a=7+b++=a+7; C.a=7+b,b++,a+7 D.a=7+b,c=a+7; 39.putchar 函数可以向终端输出一个( ) 。 A.整型变量表达式值。 B.字符串 C.实型变量值。 D.字符或字符型变量值。 40.以下程序段的输出结果是( )。 int a=12345; printf(”%2d\n”, a);

1

A.12 B.34 C.12345 D.提示出错、无结果 41.若 x 和 y 均定义为 int 型,z 定义为 double 型,以下不合法的 scanf()函数调用语句为 ( ) 。 A.scanf(”%d%lx,%le”,&x,&y,&z); B.scanf (”%2d*%d%lf ”, &x, &y, &z); C.scanf(”%x%*d%o”, &x,&y); D。scanf(”%x%o%6.2f”, &x,&y,&z); 42.有如下程序段: int x1,x2; char y1,y2; scanf(”%d%c%d%c”,&x1,&y1,&x2,&y2); 若要求 x1、x2、y1、y2 的值分别为 10、20、A、B,正确的数据输入是( ) 。 (注:└┘ 代表空格) A.10A└┘20B B.10└┘A20B C.10 └┘A└┘20└┘ B D.10A20└┘B 43. 若变量已正确说明为 float 类型,要通过语句 scanf(”%f %f%f”, &a, &b, &c);给 a 赋予 10.0, b 赋予 22.0, c 赋予 33.0, 不正确的输入形式为( ) 。 A.10<回车> B.10.0,22.0,33.0<回车> 22<回车> 33 C.10.0<回车> D.10 22<回车> 22.0 33.0<回车> 33<回车> 44.有如下程序,若要求 x1、x2、y1、y2 的值分别为 10、20、A、B,正确的数据输入是( ) 。 (注:└┘代表空格) int x1,x2; char y1,y2; scanf(”%d%d”,&x1,&x2); scanf(”%c%c”, &y1,&y2); A.1020AB B.10└┘20└┘ABC C.10└┘20 D.10└┘20AB AB 45.已有定义 int a=-2;和输出语句:printf(”%8lx”,a) ;以下正确的叙述是( ) 。 A.整型变量的输出格式符只有%d 一种 B.%x 是格式符的一种,它可以适用于任何一种类型的数据 C.%x 是格式符 D.%8lx 不是错误的格式符,其中数字 8 规定了输出字段的宽度 46.有如下程序段,对应正确的数据输入是( ) 。 float x,y; scanf(”%f%f”, &x,&y); printf(”a=%f,b=%f”, x,y); A.2.04<回车> B.2.04,5.67<回车> 5.67<回车> C.A=2.04,B=5.67<回车> D.2.055.67<回车> 47.有如下程序段,从键盘输入数据的正确形式应是( ) 。 (注:└┘代表空格) float x,y,z; scanf(―x=%d,y=%d,z=%d‖,&a,&y,&z);

1

A.123 B.x=1,y=2,z=3 C.1,2,3 D.x=1└┘ y=2└┘ z=3 48.以下说法正确的是( ) 。 A.输入项可以为一个实型常量,如 scanf(”%f”,3.5); B.只有格式控制,没有输入项,也能进行正确输入,如 scanf(”a=%d,b=5d”); C. 当输入一个实型数据时, 格式控制部分应规定小数点后的位数, 如 scanf(”%4.2f”,&f); D.当输入数据时,必须指明变量的地址,如 scanf(”%f”,&f); 49.根据定义和数据的输入方式,输入语句的正确形式为: ( ) 。 (注:└┘代表空格) 已有定义:float x,y; 数据的输入方式:1.23<回车> 4.5<回车> A.scan(”%f,%f”,&x,&y); B.scanf(”%f%f”,&x,&y); C.scanf(”%3.2f└┘%2.1f”,&x,&y); D.scanf(”%3.2f%2.1f”,&x,&y); 50.根据下面的程序及数据的输入和输出形式,程序中输入语句的正确形式应该为( ) 。 #include ”stdio.h” main() {char s1,s2,s3; 输入语句; printf(”%c%c%c”,s1,s2,s3); } 输入形式:A└┘B└┘C<回车> (注:└┘代表空格) 输出形式:A└┘B A.scanf(”%c%c%c”,&s1,&s2,&s3); B.scanf(”%c└┘%└┘c%c”,&s1, &s2,&s3); C.scanf(”%c,%c,%c”,&s1,&s2,&s3); D.scanf(”%c%c”, &s1, &s2,&s3); 51.以下程序的执行结果是: ( ) 。 #include ”stdio.h” main() { int x=2,y=3; printf(”x=%%d,y=%%d\n”,x,y); } A. x=%2,y=%3 B. x=%%d,y=%%d C. x=2,y=3 D. x=%d,y=%d 52.以下程序的输出结果是( ) 。 (注:└┘代表空格) #include ”stdio.h” main() { printf(”\nstring1=%15s*”, ”programming”); printf(”\nstring2=%-5s*‖, ”boy”); printf(”string3=%2s*‖, ”girl”); } A.string1=programming└┘└┘└┘└┘* B.string1=└┘└┘└┘└┘programming* string2=boy* string2=boy└┘└┘*string3=gi* string3=gi* C.string1=programming└┘└┘└┘└┘* D.string1=└┘└┘└┘└┘programming* string2=└┘└┘boy*string3=girl* string2=boy└┘└┘*string3=girl* 53.根据题目中已给出的数据的输入和输出形式,程序中输入输出语句的正确内容是( ) 。

1

#include ”stdio.h” main() { int a; float b; 输入语句 输出语句 } 输入形式:1└┘2.3<回车> (注:└┘代表空格) 输出形式:a+b=3.300 A.scanf(”%d%f”,&a,&b); B.scanf(”%d%3.1f”,&a,&b); printf(”\na+b=%5.3f”,a+b); printf(”\na+b=%f”,a+b); C.scanf(”%d,%f”,&a,&b); D.scanf(”%d%f”,&a,&b); printf(”\na+b=%5.3f”,a+b) printf(”\na+b=%f”,a+b); 54.阅读以下程序,当输入数据的形式为:12,34,正确的输出结果为( ) 。 #include ”stdio.h” main() { int a,b; scanf(”%d%d”, &a,&b); printf(”a+b=%d\n”,a+b); } A.a+b=46 B.有语法错误 C.a+b=12 D.不确定值 55.若有定义:int x,y; char s1,s2,s3; 并有以下输出数据: (注:└┘代表空格) 1└┘2<回车> U└┘V└┘W<回车> 则能给 x 赋给整数 1,给 y 赋给整数 2,给 s1 赋给字符 U,给 s2 赋给字符 V,给 s3 赋给 字符 W 的正确程序段是( ) 。 A.scanf(”x=%dy=%d”,&x,&y); s1=getchar();s2=getchar();s3=getchar(); B.scanf(”%d%d”,&x,&y); s1=getchar();s2=getchar();s3=getchar(); C.scanf(”%d%d%c%c%c”,&x,&y,&s1,&s2,&s3); D.scanf(”%d%d%c%c%c%c%c%c”,&x,&y,&s1,&s1,&s2,&s2,&s3,&s3);

2 填空题
1. C 语言的符号集包括________、________、________。 2. 结构化设计中的三种基本结构是________、_______、________。 3. C 语言源程序文件的后缀是________,经过编译后生成文件的后缀是________,经过链 接后生成文件的后缀是________。 4. C 语言的关键字都用________{大写或小写}。 5. 一个函数由两部分组成,它们是_______、_______。 6. 函数体一般包括_______、_______。 7. C 语言是通过_______来进行输入和输出的。 8. 以下程序的执行结果________。 #include ”stdio.h” main()

1

{ short i=-1,j=1; printf(”dec:%d,oct:%o,hex:%x,unsigned:%u\n”,i,i,i,i); printf(”dec:%d,oct:%o,hex:%x,unsigned:%u\n”,j,j,j,j); } 9. 以下程序的执行结果是________。 #include ”stdio.h” main() { char s=’b’; printf(”dec:%d,oct:%o,hex:%x,ASCII:%c\n”, s,s,s,s); } 10.以下程序的执行结果是________。 (注:└┘代表空格) #include ”stdio.h” main() { float pi=3.1415927; printf(”%f,%.4f,%4.3f,%10.3f”,pi,pi,pi,pi); printf(”\n%e,%.4e,%4.3e,%10.3e”,pi,pi,pi,pi); } 11.以下程序的执行结果是:________。 #include ”stdio.h” main() { char c=’c’+5; printf(”c=%c\n”,c); } 12.以下程序输入 1└┘2└┘3 后的执行结果是________。 (注:└┘代表空格) #include ”stdio.h” main() { int i,j; char k; scanf(”%d%c%d”,&i,&k,&j); printf(”i=%d,k=%c,j=%d\n”,i,k,j); } 13.有以下程序,若输入 9876543210 后的执行结果是________;若输入为:98└┘76└┘543210 后的执行结果是________;若输入为:987654└┘3210 后的执行结果为:________。 (注:└┘ 代表空格) #include ”stdio.h” main() { int x1,x2; char y1,y2; scanf(”%2d%3d%3c%c”,&x1,&x2,&y1,&y2); printf(”x1=%d,x2=%d,y1=%c,y2=%c\n”,x,y); } 14.若 x 和 y 均为 int 型变量,则以下语句的功能是________。 x+=y; y=x-y; x-=y; 15. 有一输入函数 scanf(”%d”,k);则不能使 float 类型变量 k 得到正确数值的原因是: ________。 16.有如下程序段,输入数据:12345ffl678 后,u 的值是 【1】 ,v 的值是 【2】 。 int u; float v; scanf(“%3d%f”,&u,&v);

1

3 答案及部分解析
一.选择题答案 1.B 2.B 7.B 8.D 13.C 14.B 19.C 20.A 25.A 26.D 31.C 32.C 37.C 38.D 43.B 44.D 49.B 50.A 55.D

3.A 9.B 15.C 21.C 27.A 33.B 39.D 45.D 51.D

4.B 10.C 16.A 22.C 28.A 34.B 40.C 46.A 52.D

5.B 11.A 17.A 23.A 29.D 35.C 41.D 47.B 53.A

6.D 12.C 18.C 24.B 30.B 36.C 42.A 48.D 54.D

14.解析:C 语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须 为字母或下划线。 而且不能与 C 语言规定的关键字同名。 关键字如: auto, break, case, char, const, continue, default, do, double, else, entry, extern, for, float, goto, if, int, int, long, register, return, short, signed, sizeof, static, struct, unsigned, while, switch, typedef, void, volatile, unior。这些关键字先不必硬背下来,随着后续的学习,你将 发现它们都是一些数据的类型、语句等,自然会随着学习的深入,而记下来。 15.解析:用指数形式表示一个实型常数时,E 或 e 之前必须有数字,且 E 后面指数必须为 整数。 16.解析:’\101’为转义字符,相对应一个 ASCII 码字符。 (101)8=(65)10=A. 17.解析:转义字符的特征是以“\”开头,其后跟一些字符,如\n, \t, \’, \\, \}, \‖, \b, \f 等代表 一些特殊的含义,而\后如跟数字,可以为八进制或者十六进制,将其转换为对应 的 ASCII 码值, 就可以得出对应的字符。 “\” 后跟八进制的写法: \0nn, 或者\nn, 表 示“\0”或者“\”后只能跟 1 或 3 位 0——7 之间的数字; “\”后跟十六进制的写 法:\xnn,或者\nn, 表示“\x”或者“\”后只能跟 1 或 2 位 0——9 及 a——f(A— —F)之间的字符。 选项 B 的错误在于 8 不是八进制; 而选项 C 的错误在于没有 “\” ; 选项 D 的错误在于超长(多了一位) 。 21.解析:B 的错误在于赋值语句的左侧只能为一个简单变量,如:n=3*(n=18); C 的错误在 于%运算符只能适用于整型数据,D 的错误在于作类型转换时,应将类型加上括 号,即为:y=(float) m 31.解析:逗号表达式的最终结果为最右端的表达式(即 x+y)的值,其运算顺序是从左自 右的。第三个表达式 y++,其隐含有两步操作:先取 y 的原值,再执行 y=y+1 运 算;而本题中,虽然没有将 y 赋给某个变量(取其原值) ,但还是一定会执行加运 算的。因而,经过第三个表达式,y 已经自加为 6,故 x+y 的值为 8,相对应得表 达式最终结果为 8。若本题改为:(x=2, y=5, z=y++, x+z),则其结果应为 7。 二.填空题答案 1. 答案:英文字母、数字、一些有特定含义的标点符号 2. 答案:顺序结构、选择结构、循环结构 3. 答案:C,OBJ,EXE 4. 答案:小写

1

5. 6. 7. 8.

答案:函数说明部分和函数体 答案:变量定义部分和执行部分 答案:输入和输出函数 答案:dec:-1,oct:177777,hex:ffff,unsigned:65535 dec:1,oct:1,hex:1,unsigned:1 9. 答案:dec:98,oct:142,hex:62,ASCII:b 10.答案:3.141593,3.1416,3.142, └┘└┘└┘└┘└┘3.142 3.141593e+00,3.1416e+00,3.142e+00,└┘└┘3.142e+00 (注:由于 c 编译系统不同,我们上机使用的机器,其第二个 printf 语句实际结果 为:3.14159e+00,3.142e+00,3.14e+00,└┘└┘3.14e+00,即:小数点后取 5 位。) 11.答案:c=h 12.答案:i=1,k=└┘,j=2 13.答案:第一种情况的执行结果:x1=98,x2=765,y1=4,y2=1 第二种情况的执行结果:x1=98,x2=76,y1=└┘,y2=3 第三种情况的执行结果:x1=98,x2=765,y1=4,y2=2 14.答案:交换 x 和 y 的值 15.答案: (1)格式符应为:%f; (2)变量前边未加取地址符&, 即应为 scanf(”%f”,&k); 16.答案: 【1】123 【2】45.000000

· ·

第 4 章 选择结构习题
1 选择题
1. 已有定义:int x=3, y=4, z=5; 则表达式!(x+y)+z-1 && y+z/2 的值是() 。 A.6 B.0 C.2 D.1 2. 设 a=5,b=6,c=7,d=8,m=2,n=2, 则执行(m=a>b) && (n=c>d)后 n 的值为() 。 A.1 B.2 C.3 D.4 3. 设 x、y 和 z 都是 int 类型变量,且 x=3,y=4,z=5, 则下面的表达式中,值为 0 的表达式为 () 。 A.’x’ && ’y’ B.x<=y C.x||y+z && y-z D.!((x<y)&&!z||1) 4.为了避免嵌套的 if-else 语句的二义性,C 语言规定 else 总是与()组成配对关系。 A.缩排位置相同的 if B.在其之前未配对的 if C.在其之前未配对的最近的 if D.同一行上的 if 5. 逻辑运算符两侧运算对象的数据类型() 。 A.只能是 0 或 1 B.只能是 0 或非 0 正数 C.只能是整型或字符型数据 D.可以是任何类型的数据 6. 以下关于运算符优先顺序的描述中正确的是() 。 A.关系运算符<算术运算符<赋值运算符<逻辑与运算符 B.逻辑与运算符<关系运算符<算术运算符<赋值运算符 C.赋值运算符<逻辑与运算符<关系运算符<算术运算符 D.算术运算符<关系运算符<赋值运算符<逻辑与运算符 7. 下列运算符中优先级最高的是() 。 A.< B.&& C.+ D.!= 8. 选择出合法的 if 语句(设 int x,a,b,c; ) () 。 A.if(a=b) c++; B.if(a=<b) c++; C.if(a<>b) c++; D.if(a=>b) c++; 9. 能正确表示“当 x 的取值在[-58,-40]和[40,58]范围内为真,否则为假”的表达式是() 。 A.(x>= -58) && (x<= -40) && (x>=40) && (x<=58) B.(x>= -58) || (x<= -40) || (x>=40) || (x<=58) C.(x>= -58) && (x<= -40) || (x>=40) && (x<=58) D.(x>= -58) | |(x<= -40) && (x>=40) || (x<=58) 10.判断 char 型变量 s 是否为小写字母的正确表达式是() 。 A.’a’ <= s<=’z’ B.(s>=’a’) & (s<=’z’)

· ·

C.(s>=’a’) && (s<=’z’) D.(’a’<=s) and (’z’>=s) 11.若希望当 x 的值为奇数时,表达式的值为“真” ,x 的值为偶数时,表达式的值为“假” 。 则以下不能满足要求的表达式是() 。 A.x%2==1 B.!(x%2==0) C.!(x%2) D.x%2 12.已知 x=45, y=’a’, z=0; 则表达式(x>=z && y<’z’ || !y)的值是() 。 A.0 B.语法错 C.1 D. “假” 13.指出下列程序段所表示的逻辑关系是() 。 if(a<b) {if(c==d) x=10; } else x=-10; A. x ? ? B. x ? ? C. x ? ?

? 10 ?? 10

a ? b且 c ? d a ? b且 c ? d

? 10 ?? 10 ? 10 ?? 10
? 10 ?? 10

a ? b且 c ? d a?b a ? b且 c ? d a ? b且 c ? d
a ? b且 c ? d c?d

D. x ? ?

?? 1 ? 14. 有一函数:y ? ? 0 ?1 ?

x?0 x?0 x?0
, 以下程序段中不能根据 x 值正确计算出 y 值的是 () 。

A.if (x>0) y=1; else if (x==0) y=0; else y= -1; B.y=0; if (x>0) y=1; else if (x<0) y= -1; C.y=0; if (x>=0) if(x>0) y=1; else y= -1; D.if (x>=0) if (x>0) y=1; else y=0; else y= -1; 15.执行以下语句后,y 的值为() 。 int x,y,z; x=y=z=0;

· ·

++x || ++y && ++z; A.0 B.1 C.2 D.不确定值 16.已知 int a=1,b=2,c=3; 以下语句执行后 a,b,c 的值是() 。 if(a>b) c=a; a=b; b=c; A.a=1, b=2, c=3 B.a=2, b=3, c=3 C.a=2, b=3, c=1 D .a=2, b=3, c=2 17.请阅读以下程序:该程序() 。 #include ”stdio.h” main() { int x=-10, y=5, z=0; if (x=y+z) printf(”***\n” ); else printf(”$$$\n”); } A.有语法错不能通过编译 B.可以通过编译但不能通过连接 C.输出*** D.输出$$$ 18.以下程序的运行结果是() 。 #include ”stdio.h” main() { int a=1; if (a++>1) printf(”%d\n”, a); else printf(”%d\n”, a--); } A.0 B.1 C.2 D.3 19.当 a=1,b=2,c=4,d=3 时,执行完下面一段程序后 x 的值是() 。 if (a<b) if (c<d) x=1; else if (a<c) if (b<d) x=2; else x=3; else x=4; else x=5; A.1 B.2 C.3 D.4 20.执行以下程序段后,变量 x,y,z 的值分别为() 。 int a=1,b=0, x, y, z; x=(--a==b++)?--a:++b; y=a++; z=b; A.x=0,y=0,z=0 B.x= -1,y= -1,z= 1 C.x=0,y=1,z=0 D.x= -1,y= 2, z= 1 21.若 a、b、c、d、w 均为 int 类型变量,则执行下面语句后的 w 值是() 。 a=1;b=2;c=3;d=4; w=(a<b)?a :b; w=(w<c)?w :c; w=(w<d)?w :d;

· ·

A.1 B.2 C.3 D.4 22.以下程序的输出结果是() 。 #include ”stdio.h” main() { int a=5, b=4, c=6, d; printf(”%d\n”, d=a>b? a>c?a:c :b); } A.5 B.4 C.6 D.不确定 23.若 a、b、c1、c2、x、y 均为整型变量,正确的 switch 语句是() 。 A.switch (a+b); B.switch a { case 1: y=a+b; break; { case c1: y=a-b; break; case 0: y=a-b; case c2: x=a*d; break; break; default: x=a+b; } } C.switch (a*a+b*b) D.switch(a-b) { case 3: { default: y=a*b; break; case 1: y=a+b; break; case 3: x=a+b; break; case 3: y=b-a; break; case 10: case 11: y=a-b; break; } } 24.执行下列程序,输入为 3 的数出结果是() 。 #include ”stdio.h” main() { int k; scanf(”%d”, &k); switch(k) { case 1: printf(”%d\n”, k++); case 2: printf(”%d\n”, k++); case 3: printf(”%d\n”, k++); case 4: printf(”%d\n”, k++); break; default: printf(”Full!\n”); } } A.3 B.4 C.3 D.4 5 4 25.假定等级和分数有以下对应关系: 等级:A 分数:85——100 等级:B 分数:60——84 等级:C 分数:60 以下 对于等级 grade 输出相应的分数区间,能够完成该功能的程序段是() 。 A.switch (grade) { case ’A’ :printf(”85——100\n”); case ’B’ :printf(”60——84\n”); case ’C’ :printf(”<60\n”); default: printf(”grade is error!\n”); }

· ·

B.switch (grade) { case ’A’ :printf(”85——100\n”); break; case ’B’ :printf(”60——84\n”); case ’C’ :printf(”<60\n”); default: printf(”grade is error!\n”); } C.switch (grade) { case ’A’ :printf(”85——100\n”); break; case ’B’ :printf(”60——84\n”); break; case ’C’ :printf(”<60\n”); default: printf(”grade is error!\n”); } D.switch (grade) { case ’C’ :printf(”<60\n”); break; case ’B’ :printf(”60——84\n”); break; default: printf(”grade is error!\n”); break; case ’A’ :printf(”85——100\n”); } 26.有如下程序,写出该执行结果() 。 #include ”stdio.h” main() { float x=2.0, y; if (x<0.0) y=0.0; else if (x<10.0) y=1.0/x; else y=1.0; printf(”%f\n”,y); } A.0.000000 B.0.250000 C.0.500000 27.以下程序的运行结果是() 。 #include ”stdio.h” main() { int a=2,b= -1,c=2; if (a<b) if (b<0) c=0; else c++; printf(”%d\n”,c); } A.0 B.1 C.2 28.运行以下程序后,如从键盘上输入 china#,则输出为() 。

D.1.000000

D.3

· ·

#include ”stdio.h” main() { int v1=0,v2=0; char ch; while ( (ch=getchar()) != ’# ’) switch (ch) { case ’a’: case ’h’: default: v1++; case ’o’: v2++; } printf(”%d,%d\n”, v1,v2); } A.2,0 B.5,0 C.5,5 29.有以下程序,若输入为字符 s,则程序运行结果为() 。 #include ”stdio.h” main() { char ch; ch=getchar(); switch (ch) { case ’a’: printf(”a=%c\n”,ch); default: printf(”end!\n”); case ’b’: printf(”b=%c\n”,ch); case ’c’: printf(”c=%c\n”,ch); } } A.end! B.end! C.有语法错误 b=s c=s 30.有以下程序,程序运行后的输出结果是() 。 #include ”stdio.h” main() { int a=15, b=21, m=0; switch (a%3) { case 0: m++; break; case 1: m++; switch (b%2) { default: m++; case 0: m++; break; } } printf(”%d\n”,m); } A.1 B.2 C.3

D.2,5

D.a=s end!

D.4

· ·

2 填空题
1. 若从键盘输入 58,则输出结果是________。 #include ”stdio.h” main() { int a; scanf(”%d”, &a); if (a>50) printf(”%d”, a); if (a>40) printf(”%d”,a); if (a>30) printf(”%d”,a); } 2. 设 int x=9,y=8;表达式 x==y+1 的结果是________。 3. 定义 int x,y;执行 y=(x=1,++x,x+2);后, y 的值是________。 4. 定义 int x=10,y,z; 执行 y=z=x; x=y==z;后, x 的结果是________。 5. 设 int a=1,b=2,c,d,e; 执行 c=(-a++)+(++b); d=(b--)+(++a)-a; e=(a/(++b))-(a/(--a)); 请问 a,b,c,d,e 的结果是:________。 6. 设 int a=2,b=3,c,d,e,f; 执行 c=(a++>= --b); d=(a==++b); e=(a--!=b); f=(++a>b--); 请问 a,b,c,d,e,f 的结果是:________。 7. 以下程序的运行结果是________。 #include ”stdio.h” main() { int a,b,c,s,w,t; s=w=t=0; a= -1; b=3; c=3; if (c>0) s=a+b; if (a<=0) { if (b>0) if (c<=0) w=a-b; } else if (c>0) w=a-b; else t=c; printf(”%d %d %d”, s,w,t); } 8. 以下程序的运行结果是________。 #include ”stdio.h” main() { int a,b,c,d,e; a=c=1;

· ·

b=20; d=100; if (!a) d=d++; else if (!b) if (d) d= --d; else d= d--; printf(”%d\n\n”, d); } 9. 以下程序的运行结果是________。 #include ”stdio.h” main() { int a, b= 250, c; if ((c=b)<0) a=4; else if (b=0) a=5; else a=6; printf(”\t%d\t%d\n”,a,c); if (c=(b==0)) a=5; printf(”\t%d\t%d\n”,a,c); if (a=c=b) a=4; printf(”\t%d\t%d\n”,a,c); } 10.下面程序根据以下函数关系,对输入的每个 x 值,计算出 y 值。请在【】内填空。 x y 2<x<=10 x(x+2) -1<x<=2 1/x x<=-1 x-1 #include ”stdio.h” main() { int x,y; scanf(”%d”, &x); if (【1】) y=x*(x+2); else if (【2】) y=1/x; else if (x<=-1) y=x-1; else 【3】; if (y!= -1) printf(”%d”,y); else printf(”error”); } 11.以下程序的功能是计算一元二次方程 ax2+bx+c=0 的根。请在【】内填入正确内容。 #include ”stdio.h” #include ”math.h” main() { float a,b,c,t,disc,w,term1,term2; printf(”enter a,b,c:”); scanf(%f%f%f”,&a,&b,&c); if (【1】)

· ·

if (【2】) printf(”no answer due to input error\n”); else printf(”the single root is %f\n”, - c/b); else { disc=b*b-4*a*c; w=2*a; term1= -b/w; t=abs(disc); term2=sqrt(t)/w; if (【3】) printf(”complex root\n real part=%f imag part =%f\n”, term1,term2); else printf(”real roots\n root1=%f root2=%f\n”, term1+term2,term1-term2); } } 12.以下程序根据输入的三角形的三边判断是否能组成三角形,若可以则输出它的面积和三 角形的类型。请在【】内填入正确内容。 #include ”math.h” #include ”stdio.h” main() { float a,b,c,s,area; printf(”please input three edges of a triangle:”); scanf(”%f%f%f”,&a,&b,&c); if (【1】) { s=(a+b+c)/2; area=sqrt(s*(s-A*(s-B*(s-c)); printf(”\nthe area of the triangle is: %f”,area); if ((a==b)&&(b==c)) printf(”等边三角形”); else if (【2】) printf(”等腰三角形”): else if (【3】) printf(”直角三角形”): else printf(”一般三角形”): } else printf(”不能组成三角形”); } 13.以下程序的功能是判断输入的年份是否是闰年。请在【】内填入正确内容。 #include ”stdio.h” main() { int year, flag; printf(”please input the year to jude whether it is a leap year:”); scanf(”%d”,&year); if (year%400==0) flag=1; else if (【1】) flag=1; else 【2】; if (flag) printf(”%d is a leap year\n”,year);

· ·

else printf(”%d is not a leap year!\n”,year); } 14.以下程序是对用户输入的字母进行大小写转换。请在【】内填入正确内容。 #include ”stdio.h” main() { char ch; printf(”please input a letter:”); scanf(”%c”,&ch); if (【1】) ch=ch+32; else if (ch>=’a’ && ch<=’z’) 【2】; printf(” the converted letter is: %c\n”,ch); } 15.以下程序是对从键盘输入的任何三个整数,求出其中的最小值。请在【】内填入正确内 容。 #include ”stdio.h” main() { int a,b,c,min; printf(”please input three numbers:”); scanf(”%d%d%d”,&a,&b,&c); if (【1】) min=b; else min=a; if (min>c) 【2】; printf(”min=%d\n”,min); } 16.以下程序实现这样的功能:商店卖西瓜,10 斤以上的每斤 0.15 元,8 斤以上的每斤 0.3 元,6 斤以上的每斤 0.4 元,4 斤以上的每斤 0.6 元,4 斤以下的每斤 0.8 元,从键盘输入 西瓜的重量和顾客所付钱数,则输出应付款和应找钱数。请在【】内填入正确内容。 #include ”stdio.h” main() { float weight, money, rate; printf(”the paid money of the client is:”); scanf(”%f”,&money); printf(”the weight of the watermelon is:”); scanf(”%f”,&weight); if (【1】) rate=0.15; else if (weight>8) rate=0.3; else if (weight>6) 【2】; else if (weight>4) rate=0.6;

· ·

【3】 rate=0.8; printf(”the account payable of the watermelon is %f\n”, weight*rate); printf(”the change for client is %f\n”,money-weight*rate); } 17.以下程序段的运行结果是________。 #include ”stdio.h” main() { char ch1=’a’,ch2=’A’; switch (ch1) { case ’a’: switch (ch2) {case ’A’: printf(”good!\n”); break; case ’B’: printf(”bad!\n”); break; } case ’b’: printf(”joke\n”); } } 18.根据以下函数关系,对输入的每个 x 值,计算出相应的 y 值。请在【】内填入正确内容。 x y x<0 0 0<=x<10 x 10<=x<20 10 20<=x<40 -0.5x+20 #include ”stdio.h” main() { int x, rate; float y; printf(”please input the value of x:”); scanf(”%d”,&x); if (【1】) rate= -1; else rate=【2】; switch(rate) { case –1: y=0; break; case 0: y=x; break; case 1: y=10; break; case 2: case 3: y=-0.5*x+20; break; default: y= -2; } if (【3】) printf(”y=%f\n”,y); else printf(”the value of x is invalid!\n”); } 19.以下程序实现的功能是:从键盘输入某年某月,输出该年份该月的天数。请在【】内填 入正确内容。 #include ”stdio.h” main()

· ·

{ int year, month, days, leap; printf(”please input both year and month:”); scanf(”%4d/%2d”,&year,&month); switch (【1】) { case 1: case 3: case 5; case 7: case 8: case 10: case 12: days=31; 【2】 case 4: case 6: case 9: case 11: days=30; break; case 2: if (year%400==0) leap=1; else if (year%4==0 && year%100!=0) leap=1; else 【3】; if (leap) days=29; else days=28; } printf(”%d 年%d 月的天数为%d\n”, year, month, days); } 20.以下程序完成两个数的四则运算。请在【】内填入正确内容。 #include ”stdio.h” main() { float x,y; char operator; printf(”please input the expression:”); scanf(”%f%c%f”,&x,&operator,&y); switch (【1】) { case ’+’: printf(”%g%c%g=%g\n”, x, operator, y, x+y); 【2】; case ’-’: printf(”%g%c%g=%g\n”, x, operator, y, x-y); break; case ’*’: printf(”%g%c%g=%g\n”, x, operator, y, x*y); break; case ’/’: if (y==0.0) printf(”除零错误!\n”); else printf(”%g%c%g=%g\n”, x, operator, y, x/y); break; 【3】: printf(”表达式存在错误!\n”);

· ·

} } 21.以下程序运行后的输出结果是_____________。 #include ”stdio.h” main() { int x=10, y=20, t=0; if (x==y) t=x; x=y; y=t; printf(”%d,%d\n”,x,y); } 22.执行以下语句后,x、y 和 z 的值分别为_____________。 int x,y,z; x=y=z=0; ++x || ++y && ++z;

3 答案及部分解析
一.选择题答案 1. D 2. B 3. D 4.C 5.D 6.C 7. C 8. A 9. C 10.C 11.C 12.C 13.B 14.C 15.A 16.B 17.C 18.C 19.B 20.B 21.A 22.C 23.D 24.C 25.D 26.C 27.C 28.C 29.A 30.A 2. 解析:当条件 1:m=a>b 的值为假时, 便已经确定整个表达式的值为假,所以不必再继 续判断第二个表达式的逻辑值。由于没有执行第二个表达式 n=c>d,所以 n 的值 仍为 2。 17.解析:if 的条件表达式 x=y+z 为赋值语句,x=5 为非零值,即为 if (1) printf(”***\n”); 23.解析:A.的错误在于 switch(a+b);其后有一个“; ” ,B 的错误在于 switch a 的条件表达 式 a 没有括号,应该为 switch(a),C 的错误在于有两个 case 具有相同的入口值。 28.解析:当输入 c 时,switch 语句执行情况为:
switch(ch) {case ’a’: case ’h’: default: v1++; case ’0’: v2++; }

从此处向下执行

因为没有 break 语句

当继续输入 h 时,switch 语句的执行情况为:
switch(ch) {case ’a’: case ’h’: default: v1++; case ’0’: v2++; }

从此处向下执行

因为没有 break 语句

? v1 ? v1 ? 1 ? 2 ? ?v 2 ? v 2 ? 1 ? 2

重复上述过程,输入 5 个有效字符,则 v1 和 v2 执行 5 次自加操作,所以: v1=5, v2=5

· ·

二.填空题答案 1.答案:585858 解析:虽然三个 if 语句按照嵌套方式书写,但是程序仍然是依顺序运行的,会分别对每一 个 if 的条件表达式进行判断,若其条件表达式为真,就执行其后的语句,否则,不执行。 2.答案:1 解析:注意该表达式是关系表达式的双等号,所以其结果只能为 1 或 0。 3.答案:4 4.答案:1 5.答案:在 Turbo C 编译系统下,结果为 a=2,b=3,c=2,d=3,e=-1;若在 Visual C++下, 结果为 a=2,b=3,c=2,d=3,e=-0。 解析:①在 Turbo C 编译系统下,解题过程如下: 第一个赋值语句“c=(-a++)+(++b);”可分解为如下的几个语句:

b ? b ?1 ? ? c ? ?a ? b ? ? b ? 2 ? 1 ? 3, c ? ?1 ? 3 ? 2, a ? 1 ? 1 ? 2 a ? a ?1 ? ?
此时 a=2,b=3,c=2。 第二个赋值语句“d=(b--)+(++a)-a;”可分解为如下的几个语句:

a ? a ?1 ? ? d ? b ? a ? a ? ? a ? 2 ? 1 ? 3, d ? 3 ? 3 ? 3 ? 3, b ? 3 ? 1 ? 2 b ? b ?1 ? ?
此时 a=3,b=2,c=2,d=3。 第三个赋值语句“e=(a/(++b))-(a/(--a));”中由于自加、自减运算符的优先级高于其它运算 符,故先运算++和--,令 a=2,b=3,然后该等式中 a 的值都取 2 参与运算,故该等式等 价与: “e=2/3-2/2;” ,因此 e 的值等于 0。 此时 a=2,b=3,c=2,d=3,e=0 ②在 Visual C++编译系统下,解题过程如下: 前两条赋值语句“c=(-a++)+(++b);” 、 “d=(b--)+(++a)-a;”的运算过程和在 Turbo C 编译系 统一样,第三个赋值语句“e=(a/(++b))-(a/(--a));”可按步骤分解为如下的几个语句

? ? e ? a / b ? a /(a ? 1)? ? b ? 2 ? 1 ? 3, e ? 3 / 3 ? 3 / 2 ? 0, a ? 2 ? a ? a ?1 ?
因此,其结果为 a=2,b=3,c=2,d=3,e=-0 6.答案:a=3,b=2,c=1,d=1,e=0,f=0 解析:第一个赋值语句 c=(a++>= --b);可以分解为如下的语句:

b ? b ?1

b ? b ?1 ? ? c ? (a ?? b)? ? b ? 3 ? 1 ? 2, c ? (2 ?? 2) ? 1, a ? 2 ? 1 ? 3 a ? a ?1 ? ?
第二个赋值语句 d=(a==++b);可以分解为如下的语句:

b ? b ?1 ? ? ? b ? 2 ? 1 ? 3, d ? (3 ?? 3) ? 1 d ? (a ?? b)?

· ·

第三个赋值语句 e=(a--!=b);可以分解为如下的语句:

e ? (a!? b)? ? ? e ? (3!? 3) ? 0, a ? 3 ? 1 ? 2 a ? a ?1 ?
第四个赋值语句 f=(++a>b--);可以分解为如下的语句:

a ? a ?1 ? ? f ? (a ? b)? ? a ? a ? 1 ? 3, f ? (3 ? 3) ? 0, b ? 3 ? 1 ? 2 b ? b ?1 ? ?
由以上各步,可以得到:a=3,b=2,c=1,d=1,e=0,f=0 7.答案:2 0 0 解析:参看如下的注释语句。 if (c>0) s=a+b; /* c=3>0 为真,所以执行 s=a+b 语句;即:s=2*/ if (a<=0) /*由于 a= -1, 故 a<=0 为真,所以执行其后的大括号内的语句*/ { if (b>0) /*由于 b=3, 故 b>0 为真,可以继续下面的语句*/ if (c<=0) w=a-b; /*由于 c=3,c<=0 为假,其后 w=a-b 不会执行*/ } else if (c>0) w=a-b;/*这一对 if-else 因 a<=0 为真,所以没有机会执行到*/ else t=c; 8.答案:100 9.答案: 6 250 5 1 0 0 10.答案: 【1】x>2 && x<=10 【2】x>-1 && x<=2 【3】y= -1 11.答案: 【1】a==0 【2】b==0 【3】disc<0 12.答案: 【1】(a+b>c) && (b+c>a) &&(a+c>b) 【2】 (a==b) || (b==c) || (a==c) 【3】 (a*a+b*b==c*c)||(a*a+c*c==b*b)||(b*b+c*c==a*a) 13.答案: 【1】(year%4==0)&&(year%100!=0) 【2】flag=0 14.答案: 【1】ch>=’A’ && ch<=’Z’ 【2】ch=ch-32 15.答案: 【1】a>b 【2】min=c; 16.答案: 【1】weight>10 【2】rate=0.4 【3】else 17.答案:good! joke 18.答案: 【1】x<0 【2】x/10 【3】y!= -2 19.答案: 【1】month 【2】break; 【3】leap=0; 20.答案: 【1】operator 【2】break 【3】default 21.答案:20,0 22.答案:1,0,0

·26·

第 5 章 循环结构习题
1 选择题
1. 以下程序的输出结果是( )。 main() { int n=4; while (n--) printf(〞%d〞,--n); } A.20 B.31 2. 以下程序的输出结果是( )。 main() {int x=10,y=10,i; for(i=0;x>8;y=++i) printf("%d%d",x--,y); } A.10192 B.9876 3. 当执行以下程序段时。 x=-1; do {x=x*x;} while (!x); A.循环体将执行一次 C.循环体将执行无数多次 4. 执行以下程序后输出的结果是( ) 。 main() { int y=10; do{y--;}while(--y); printf("%d\n",y--);} A.-1 B.1 C.8 5. 下面程序的输出结果是( ) 。 main() { int x=3,y=6,a=0; while (x++!=(y-=1)) {a+=1; if (y<x) break; } printf("x=%d,y=%d,a=%d\n",x,y,a); } B.循环体将执行两次 D.系统将提示有语法错误 C.321 D.210

C.10990

D.101091

D.0

·27·

A.x=4,y=4,a=1 B.x=5,y=5,a=1 C.x=5,y=4,a=3 D.x=5,y=4,a=1 6.若 i,j 已定义为 int 类型,则以下程序段中内循环的总的执行次数是 ( for (i=5;i;i--) for (j=0;j<4;j++) {…} A.20 B.24 C.25

) 。

D.30

7. 请读程序: #include<stdio.h> main() {int x=1,y=0,a=0,b=0; switch(x) {case 1:switch(y) {case 0:a++;break; case 1:b++;break; } case 2:a++;b++;break; } printf("a=%d,b=%d\n",a,b); } 上面程序的输出结果是( ) 。 A.a=2,b=1 B.a=1,b=1 8.若有以下程序段,w 和 k 都是整型变量 w=k; LB: if(w==0) goto LE; w--; printf(〞*〞); goto LB; LE: 则不能与上面程序段等价的循环语句是( ) 。 A. for(w=k;w!=0;w--) print(〞*〞); B. w=k; while(w--!=0) printf(〞*〞); w++; C. w=k; do {w--;printf(〞*〞);} while (w!=0); D.for (w=k;w;--w) printf(〞*〞); 9. 下面程序的输出是( ) 。 C.a=1,b=0 D.a=2,b=2

·28·

main() { char *s=〞12134211〞; int k,v1=0,v2=0,v3=0,v4=0; for (k=0;s[k];k++) switch(s[k]) { default:v4++; case 1:v1++; case 2:v2++; csse 3:v3++; } printf(〞v1=%d,v2=%d,v3=%d,v4=%d\n〞,v1,v2,v3,v4); } A.v1=4,v2=2,v3=1,v4=1 C.v1=5,v2=8,v3=6,v4=1 10. 有以下程序 #include〞stdio.h〞 int abc(int u,int v ); main() { int c,a=24,b=16; c=abc(a,b); printf(〞%d\n〞,c); } int abc (int u,int v) { int w; while (v) {w=u%v; u=v; v=w;} return u; } 输出结果是( )。 A.6 B.7 C.8 11.在下列选项中,没有构成死循环的程序段是( ) 。 A.int i=100; while (1) { i=i%100+1; if(i>100) break; } B. for ( ; ;); B.v1=4,v2=9,v3=3,v4=1 D.v1=8,v2=8,v3=8,v4=8

D.9

·29·

C.int k=1000; do {++k;}while (k>=10000); D.int s=36; while (s) ; --s; 12.若输入 B,以下程序的运行结果为( ) 。 main() {char grade;scanf("%c",&grade); switch(grade) {case'A':printf(">=85."); case'B': case'C':printf(">=60."); case'D':printf("<60."); default:printf("error."); } } A.>=85. B.>=60. C.>=60.<60.error. 13.列程序运行的情况是( main() { int i=1,sum=0; while(i<10)sum=sum+1;i++; printf("i=%d,sum=%d",i,sum); } A.i=10,sum=9 B.i=9,sum=9 C.i=2,sum=1 D.运行出现错误 ) 。

D.error.

14.有以下语句: i=1; for(;i<=100;i++) sum+=i; 与以上语句序列不等价的有( )。 A. for(i=1; ;i++) {sum+=i;if(i==100)break;} B. for(i=1;i<=100;){sum+=i;i++;} C. i=1;for(;i<=100;)sum+=i; D. i=1;for(; ;){sum+=i;if(i==100)break;i++;} 15.下面程序的运行结果为( ) 。 main() { int n; for(n=1;n<=10;n++) { if(n%3==0)continue; printf("%d",n); } } A.12457810 B.369 C.12

D.12345678910

·30·

16.下面程序的运行结果是( ) 。 main() {int x,y,z; x=0;y=z=-1; x+=-z---y; printf("x=%d\n",x); } A.x=4 B.x=0 C.x=2 D.x=3 17.标有/**/的语句的执行次数是( ) 。 int y,i; for(i=0;i<20;i++) {if(i%2==0)continue; y+=i;/**/ } A.20 B.19 C.10 D.9 18.在 C 语言中,if 语句后的一对圆括号中,用以决定分支的流程的表达式。 A.只能用逻辑表达式 B.只能用关系表达式 C.只能用逻辑表达式或关系表达式 D.可用任意表达式 19.在以下给出的表达式中,与 do-while(E)语句中的(E)不等价的表达式是( ) 。 A.(!E==0) B.(E>0||E<0) C.(E==0) D.(E!=0) 20.假定所有变量均已正确定义,下列程序段运行后 x 的值为( ) 。 k1=1;k2=2; k3=3; x=15; if(!k1)x--;else if(k2) if(k3)x=4;else x=3; A.14 B.4 C.15 D.3 21.执行下面语句的输出为( ) 。 int i=-1; if(i<=0)printf(―* * * *\n‖); else printf(―% % % % \n‖); A.* * * * B.% % % % C.% % % % c D.有错,执行不正确 22.下列程序的输出是( ) 。 #include<stdio.h> main() { int i;char c; for(i=0;i<=5;i++) {c=getchar();putchar(c); } } 程序执行时从第一列开始输入以下数据,<CR>代表换行符。 u<CR> w<CR> xsta<CR> A.uwxsta B.u C.u D.u w w w x xs xsta 23.下列程序的输出为( ) 。

·31·

#include"stdio.h" main() { int i,j,x=0; for(i=0;i<2;i++) {x++; for(j-0;j<=3;j++) {if(j%2)continue;x++; } x++; } printf("x=%d\n",x); } A.x=4 B.x=8 C.x=6 D.x=12 24.下列程序的输出为( ) 。 #include<stdio.h> main() {int i,j,k=0,m=0; for(i=0;i<2;i++) { for(j=0;j<3;j++)k++;k-=j;} m=i+j; printf("k=%d,m=%d\n",k,m); } A.k=0,m=3 B.k=0,m=5 C.k=1,m=3 D.k=1,m=5 25.在 C 语言中,为了结束 while 语句构成的循环,while 后一对圆括号中表达式的值应该为 ( ) 。 A.0 B.1 C.true D.非 0 26. 在 C 语言中,为了结束由 do-while 语句构成的循环,while 后一对圆括号中表达式的 值应为( ) 。 A.0 B.1 C.true D.非 0 27.下列程序的输出为( ) 。 #include<stdio.h> main() { int k=0;char c='A'; do {switch(c++) { case'A':k++;break; case'B':k--; case'C':k+=2;break; case'D':k=k%2;continue; case'E':k=k*10;break; default:k=k/3; } k++; } while(c<'G');

·32·

printf("%d\n",k); } A.k=3 B.k=4 C.k=2 D.k=0 28.C 语言的 if 语句嵌套时,if 与 else 的配对关系是( ) 。 A. 每个 else 总是与它上面的最近的 if 配对 B. 每个 else 总是与最外的 if 配对 C. 每个 else 与 if 的配对是任意的 D. 每个 else 总是与它上面的 if 配对 29.下列程序的输出为( ) 。 #include<stdio.h> main() {int i=0,j=0,a=6; if((++i>0)||(++j>0))a++; printf("i=%d,j=%d,a=%d\n",i,j,a); } A.i=0,j=0,a=6 B.i=1,j=1,a=7 C.i=1,j=0,a=7 D.i=0,j=1,a=7 30.下列程序段的输出结果为( ) 。 main() {int x=3; do { printf("%3d",x-=2);} while(!(--x));} A.1 B.3 0 C.1 -2 D.死循环

2 填空题:
1. 当输入 19,2,21 时下列程序运行的结果是_________。 main() {int a,b,c,max; printf("please scan three number a,b,c:\n"); scanf("%d,%d,%d",&a,&b,&c); max=a; if(max<b)max=b; if(max<c)max=c; printf("max is:%d",max); } 2. 若输入字母 C,程序输出结果为【1】 ;若输入字符*,程序将【2】 。 #include<stdio.h> main() {char c1,c2; c1=getchar(); while(c1<97||c1>122)c1=getchar(); c2=c1-32; printf("%c,%c\n",c1,c2);

·33·

} 3. 以下程序运行的结果为________。 main() { int a,b,c,x,y,z; a=10;b=2; c=!(a%b);x=!(a/b); y=(a<b)&&(b>=0); z=(a<b)||(b>=0); printf("%d,%d,%d,%d\n",c,x,y,z); } 4. 若输入 4,程序运行结果为【 1 】,若输入-4,运行结果为【 2 】,若输入 10,运行结果为 【 3 】. main() { int x,y; scanf("%d",&x); if(x<1) { y=x; printf("x=%d,y=x=%d\n",x,y); } else if(x<10) { y=2*x-1; printf("x=%d,y=2*x-1=%d\n",x,y); } else { y=3*x-11; printf("x=%d,y=3*x-11=%d\n",x,y); } } 5.以下程序运行的结果________。 main() {int i=1,sum=0; loop:if(i<=10) {sum+=i; i++; goto loop; } printf("sum=%d\n",sum); } 6.以下程序运行的结果________。 main() { int x=2,y,z; x*=3+1; printf("%d,",x++); x+=y=z=5;

·34·

printf("%d,",x); x=y==z; printf("%d\n",x); } 7.以下程序运行的结果________。 #include<stdio.h> #include<math.h> main() {int i,k,m,n=0; for(m=1;m<=10;m+=2) { if(n%10==0)printf("\n"); k=sqrt(m); for(i=2;i<=k;i++) if(m%i==0)break; if(i>k) {printf("%2d",m); n++; } } } 8.如果输入‘1’ , ‘2’ , ‘3’ , ‘4’ ,程序运行输出的是________。 #include<stdio.h> main() {char c; int i,k; k=0; for(i=0;i<4;i++) {while(1) { c=getchar();if(c>='0'&&c<='9')break;} k=k*10+c-'0'; } printf("k=%d\n",k); } 9.运行以下程序后,如果从键盘上输入 china#<回车>,则输出结果为________。 #include <stdio.h> main() {int v1=0,v2=0; char ch; while ((ch=getchar())!='#') switch(ch) {case 'a': case 'h': default: v1++; case '0':v2++;

·35·

} printf("%d,%d\n",v1,v2); } 10.程序运行结果是_________。 #include<stdio.h> main() {int i; for(i=1;i+1;i++) { if(i>4){printf("%d\t",i++);break;} printf("%d\t",i++); } } 11. 以下程序运行的结果是_________。 #include<stdio.h> 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); } 12.以下程序运行的结果是________。 main() {int i=1; while(i<10) if(++i%3!=1)continue; else printf("%d",i); } 13.程序运行的结果是________。 main() {int n=0; while(n++<=1) printf("%d\t",n); printf("%d\n",n); } 14.此程序运行时,输入 qwert?程序的运行结果是_________。 #include<stdio.h> main() {char c;

·36·

while((c=getchar())!='?')putchar(++c); } 15.对以下程序: 当输入 65 14 时,其运行结果是【 1 】 。 当输入 14 63 时,其运行结果是【 2 】 。 当输入 25 125 时,其运行结果时【 3 】 。 #include<stdio.h> main() {int m,n; scanf("%d%d",&m,&n); while(m!=n) { while(m>n)m-=n; while(n>m)n-=m; } printf("m=%d\n",m); } 16. 在执行以下程序时, 为了使输出结果为 t=4,则给 a 和 b 输入的值应满足的条件是_______。 main() {int s,t,a,b; scanf(〞%d,%d〞,&a,&b); s=1; t=1; if(a>0) s=s+1; if(a>b) t=s+t; else if (a==b) t=5; else t=2*s; printf(〞t=%d\n〞,t); } 17.求出 1000 以内的“完全数” 。 (提示:如果一个数恰好等于它的因子之和(因子包括 1, 不包括数本身) ,则称该数为“完全数” 。如:6 的因子是 1,2,3 而 6=1+2+3,则 6 是 个“完数” ) 。 main() {int i,a,m; for(i=1;i<1000;i++) {for(m=0,a=1;a<=i/2;a++) if(!(i%a)) 【1 】; if【2】)printf("%4d",i); } } 18.鸡问题:100 元钱买 100 只鸡,公鸡一只 5 元钱,母鸡一只 3 元钱,小鸡一元钱三只, 求 100 元钱能买公鸡、母鸡、小鸡各多少只? #include<stdio.h> main() {int cocks,hens,chicks; cocks=0;

·37·

while(cocks<=19) { hens=0; while(hens<=33) { chicks=100.0-cocks-hens; if(5.0*cocks+3.0*hens+chicks/3.0==100.0) printf("%d,%d,%d\n",cocks,hens,chicks); 【1】; } 【2】; } } 19.爱因斯坦的阶梯问题:设有一阶梯,每步跨 2 阶,最后余 1 阶;每步跨 3 阶,最后余 2 阶;每步跨 5 阶,最后余 4 阶;每步跨 6 阶,最后余 5 阶;只有每步跨 7 阶时,正好到 阶梯顶。问共有多少阶梯。 main() {int ladders=7; while(【 1 】)ladders+=14; printf("%d\n",ladders); } 20.下列程序计算平均成绩并统计 90 分及以上人数。 main() {int n,m; float grade,average; average=n=m=【1】; while(【2】) { scanf("%f",&grade); if(grade<0)break; n++; average+=grade; if(grade<90)【3】; m++; } if(n)printf("%.2f%d\n",average/n,m); } 21.下列程序计算 Fibonacci 数列:1,1,2,3,5,8,13……的前 40 项。 main() {int I;long f1,f2; 【1】; for(I=0;I<20;I++) { printf("%12ld%12ld",f1,f2); if(I%2)printf("\n"); f1+=f2; 【2】; }

·38·

} 22.下列程序判断一个数是否为素数。 #include<stdio.h> #include<math.h> main() {int I,k,m; scanf("%d",&m); k=sqrt(【1】); for(I=2;I<=k;I++) if(m%I==0)【2】; if(【3】)printf("%dyes\n",m); else printf("%dno\n",m); } 23. 求 100~499 之间的所有水仙花数,即各位数字的立方和恰好等于该数本身的数。 main() {int I,j,k,m,n; for(I=1;【1】;I++) for(j=0;j<=9;j++) for(k=0;k<=9;k++) {【2】; n=I*I*I+j*j*j+k*k*k; if(【3】) printf("%d",m); } } 24.从键盘上输入两个整数 m 和 n,求其最大公约数。 main() {int a,b,num1,num2,temp; scanf("%d,%d",&num1,&num2); if(【1】) { temp=num1; num1=num2; num2=temp; } a=num1;b=num2; while(b!=0) { temp=【2】; a=b; b=temp; } printf("%d,%d",a,num1*num2/a); }

·39·

3 答案及部分解题分析
一.选择题答案 1.A 2.D 3.A 4.D 5.D 6.A 7.A 8.C 9.D 10.C 11.C 12.C 13.D 14C 15.A 16.C 17.C 18.D 19.C 20.B 21.A 22.C 23.B 24.B 25.A 26.A 27.B 28.A 29.C 30.C 1. 答案:A 解析:此题中判断 while 后面的条件时,先使用 n 的值再 n--,而打印时打印的是 n 减 1 后的值。所以第一次循环,n=4,执行完后 n=2,打印出 2;第二次循环,n=2, 经过 n—和 —n,n 变成了 0,打印出 0;第三次循环时 while 后面的条件不成立(n=0),所以循环结束。 故输出为 20。 2. 答案:D 解析:第一次循环时打印的 x 和 y 的值都是 10,然后 x 通过 x—后变成 9,因此第二次 循环时 x=9, 而“y=++i‖执行完后,y 变成 1,所以第二次循环时打印的 x 和 y 的值是 9 和 1 ,然后 x—变成 8; 第三次循环时,x>8 条件不成立,循环结束。故 D 为正确 答案。 3. 答案:A 解析:对于一个不为 0 的数, !x 即为 0,故对于 x=-1,while 后条件不成立,但是 do 循环体是先执行的,故等判断条件时,循环体已执行了一次。 4. 答案:D 解析:此题是一个 do-while 循环,当 y 值为 1 时,while 后的条件--y 变成 0,从而循环 结束,这时打印出 0,然后 y--变成-1。故 D 为正确答案。 5. 答案:D 解析:此题中循环进行了 1 次,但判断了 2 次,第一次 x 加 1 变成 4,y 减 1 变成 5,a 加 1 变成 1;第 2 次 while 后面的条件不成立,因为!=的左边先使用 x 的值 4 来判断, 右边表达式的值为 4,即 y 由 5 变成 4,判断结束后 4 变成 5,循环结束。故 D 为正确 答案。 6. 答案:A 解析:此题中外层 for 要进行 5 次,内层 for 循环要进行 4 次,所以共进行 4*5=20 次循 环。 二.填空题答案 1. 答案:21 2. 答案: 【1】c C 3. 答案:1,0,0,1 4. 答案: 【1】x=4,y=2*x-1=7 5. 答案:55 6. 答案:8,14,1 7. 答案:1 3 5 7 8. 答案:1234

【2】等待继续输入,直到输入小写字母。 【2】x=-4,y=x=-4 【3】x=10,y=3*x-11=19

·40·

9. 答案:5,5 10.答案:1 3 5 11.答案:8 12.答案:4 7 10 13.答案:1 2 3 14.答案:rxfsu 15.答案: 【1】m=1 【2】m=7 【3】m=25 16.答案:0<a<b 17.答案: 【1】m=m+a 【2】m==i 18.答案: 【1】hens++ 【2】cocks++ 19.答案: 【1】ladders/3!=2||ladders/5!=4||ladders/6!=5 20.答案: 【1】0 【2】1 【3】continue 21.答案: 【1】f1=1;f2=1 【2】f2+=f1 22.答案: 【1】m 【2】break 【3】I>=k+1 23.答案: 【1】I<=4 【2】m=I*1000+j*100+k*10 【3】m==n 24.答案: 【1】num1>num2 【2】a%b

·41·

第 6 章 数组习题
1. 单项选择题
(1) int a[4]={5,3,8,9};其中 a[3]的值为( )。D A. 5 B. 3 C. 8 D. 9 (2) 以下 4 个字符串函数中,( )所在的头文件与其他 3 个不同。A A. gets B. strcpy C. strlen D. strcmp (3) 以下 4 个数组定义中,( )是错误的。 D A. int a[7]; B. #define N 5 long b[N]; C. char c[5]; D. int n,d[n]; (4) 对字符数组进行初始化,( )形式是错误。 B A. char c1[ ]={'1', '2', '3'}; B. char c2[ ]=123; C. char c3[ ]={ '1', '2', '3', '\0'}; D. char c4[ ]="123"; (5) 在数组中,数组名表示( )。 A A. 数组第 1 个元素的首地址 B.数组第 2 个元素的首地址 C. 数组所有元素的首地址 D.数组最后 1 个元素的首地址 (6) 若有以下数组说明,则数值最小的和最大的元素下标分别是( )。 B int a[12] ={1,2,3,4,5,6,7,8,9,10,11,12}; A. 1,12 B. 0,11 C. 1,11 D. 0,12 (7) 若有以下说明,则数值为 4 的表达式是( )。 D int a[12] ={1,2,3,4,5,6,7,8,9,10,11,12}; char c=?a?, d, g ; A. a[g-c] B. a[4] C. a['d'-'c'] D. a['d'-c] (8) 设有定义:char s[12] = "string" ; 则 printf( "%d\n",strlen(s)); 的输出是( )。 A A. 6 B. 7 C. 11 D. 12 (9) 设有定义:char s[12] = "string"; 则 printf("%d\n ", sizeof(s)); 的输出是( )。 D

·42·

A. 6 B. 7 C. 11 D. 12 (10) 合法的数组定义是( )。 A A. char a[ ]= "string " ; B. int a[5] ={0,1,2,3,4,5}; C. char a= "string " ; D. char a[ ]={0,1,2,3,4,5} (11) 合法的数组定义是( )。 D A. int a[3][ ]={0,1,2,3,4,5}; B. int a[ ][3] ={0,1,2,3,4}; C. int a[2][3]={0,1,2,3,4,5,6}; D. int a[2][3]={0,1,2,3,4,5,}; (12) 下列语句中,正确的是 ( )。D A. char a[3][ ]={'abc', '1'}; B. char a[ ][3] ={'abc', '1'}; C. char a[3][ ]={'a', "1"}; D. char a[ ][3] ={ "a", "1"}; (13) 下列定义的字符数组中,输出 printf("%s\n", str[2]) ;的输出是( )。 C static str[3][20] ={ "basic", "foxpro", "windows"}; A. basic B. foxpro C. windows D. 输出语句出错 (14) 下列各语句定义了数组,其中哪一个是不正确的( )。 C A. char a[3][10]={"China","American","Asia"}; B. int x[2][2]={1,2,3,4}; C. float x[2][ ]={1,2,4,6,8,10}; D. int m[][3]={1,2,3,4,5,6}; (15) 数组定义为 int a[3][2]={1,2,3,4,5,6},值为 6 的数组元素是( )。 B A. a[3][2] B. a[2][1] C. a[1][2] D. a[2][3] (16) 下面的程序中哪一行有错误( )。D #include <stdio.h> main() { float array[5]={0.0}; //第 A 行 int i; for(i=0;i<5;i++) scanf("%f",&array[i]); for(i=1;i<5;i++)

·43·

array[0]=array[0]+array[i];//第 B 行 printf("%f\n",array[0]); //第 C 行 } A. 第 A 行 B. 第 B 行 C. 第 C 行 D. 没有 (17) 下面哪一项是不正确的字符串赋值或赋初值的方式( )。 C A. char *str; str="string"; B. char str[7]={'s','t','r','i','n','g'}; C. char str1[10];str1="string"; D. char str1[]="string",str2[]="12345678"; (18) 若有以下说明和语句,则输出结果是哪一项( )。C (strlen(s)为求字符串 s 的长度的函数) char s[12]="a book!"; printf("%d",strlen(s)); A. 12 B. 8 C. 7 D. 11 (19) 若有以下说明和语句,则输出结果是( )。B (strlen(s)为求字符串 s 的长度的函数) char sp[]="\t\v\\\0will\n"; printf("%d",strlen(sp)); A. 14 B. 3 C. 9 D. 字符串中有非法字符 (20) 若有以下说明和语句,则输出结果是( )。 C char str[]="\"c:\\abc.dat\""; printf("%s",str); A. 字符串中有非法字符 B. \"c:\\abc.dat\" C. "c:\abc.dat" D. "c:\\abc.dat"

·44·

2. 填空题
(1) C 语言中,数组的各元素必须具有相同的 ,元素的下标下限为 ,下标必须是正整数、 0、或者 。但在程序执行过程中,不检查元素下标是否 。 数据类型,0,符号常量,越界 (2) C 语言中,数组在内存中占一片 的存储区,由 代表它的首地址。数组名是一个 常量, 不能对它进行赋值运算。连续,数组名,地址 (3) 执行 static int b[5], a[ ][3] ={1,2,3,4,5,6}; 后,b[4] = ,a[1][2] = 。 0,6 (4) 设有定义语句 static int a[3][4] ={{1},{2},{3}}; 则 a[1][0]值为 ,a[1][1] 值为 ,a[2][1]的值为 。 2,0,0 (5) 如定义语句为 char a[ ]= "windows",b[ ]= "95";,语句 printf("%s",strcat(a,b));的输出结果为 。Windows95 (6) 根据以下说明,写出正确的说明语句:men 是一个有 10 个整型元素的数组。 step 是一个有 4 个实型元素的数组,元素值分别为 1.9, -2.33, 0, 20.6。 grid 是一个二维数组,共有 4 行,10 列整型元素。 int mesh[10]; float step[4] = {1.9, -2.33, 0, 20.6}; int grid[4][10]; (7) array 是一个一维整形数组,有 10 个元素,前 6 个元素的初值是 9,4,7,49,32,-5,正确 的说明语句为: 。该数组下标的取值范围是从___到___(从小到大)。用 scanf 函数输入数组的第二个元素 表示为: 。用赋值语句把 39 存入第一个元素表示为: 。 把第六个和第四个元素之和存入第一个元素表示为: 。 int array[10] = {9,4,7,49,32,-5}; 0 9 scanf("%d",&array[1]); array[0] = 39; array[0]= array[5]+array[3]; (8) 写出以下初始化数组的长度:①int chn[3];数组 chn 的长度为___。②float isa[]={1.0,2.0,3.0,4.0,5.0}; 数组 isa 的长度为___。③int doom[8];数组 doom 的长度为___。④float pci[4][2]; 数组 pci 的长度为___。 ⑤int ast[3][3];数组 ast 的长度为___。⑥int att[3][4];数组 att 的长度为___。 ⑦float dell[][3]={{1,4,7},{2,5},{3,6,9}};数组 dell 的长度为___。6 20 16 32 18 24 36

·45·

(9) 若有以下整型的 a 数组,数组元素和它们得值如下所示: 数组元素: a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 元素的值: 9 4 12 8 2 10 7 5 1 3 ①请写出对该数组的说明,并赋以上初值。 ②该数组的最小下标值为___,最大下标值为___。 ③写出下面各式的值:a[a[9]]的值为___ ;a[a[4]+a[8]]的值为___。 int a[10]={9,4,12,8,2,10,7,5,1,3}; 0 9 8 8 (10) 字符串"ab\n\\012/\\\""的长度为___。10

3. 判断题
( × )(1) C 允许对数组的大小作动态定义,即可用变量定义数组的大小。 ( × )(2) 字符数组不要求它的最后一个字符为?\0?,甚至可以不包含?\0?。 ( × )(3) 数组定义 int a[10]; 也可以写成 int a(10); 。 ( √ )(4) 在对全部数组元素赋初值时,可以不指定数组长度。 ( × )(5) 定义 s 为 5×6(5 行 6 列)的数组可写成 float a[5,6]; ( √ )(6) 数组定义 int a[10]; 表示数组名为 a,此数组有 10 个元素。 ( × )(7) 数组定义 int a[10]; 表示数组名为 a,此数组有 10 个元素,第 10 个元素 为 a[10]。 ( √ )(8) static char c[]={“a book”}; 与 static char c[]=“a book”; 等价。 ( × )(9) static char c[]={'a' ,' ','b','o','o','k','\0'};与 static char c[]={'a' ,' ' ,'b','o','o','k'}; 等价。 ( × )(10) 设已有说明:static char c1[10],c2[10]; 下面程序片段是合法的。 c1={“book”}; c2=c1;

4. 程序填空题
(1) 输入 20 个数,输出它们的平均值,输出与平均值之差的绝对值为最小的数组元素。 请填空。 #include <stdio.h>

·46·

void main( ) { float a[20],pjz=0,s,t; int i,k; for(i=0;i<20;i++) pjz+=a[i]; s=fabs(a[0]-pjz); for(i=1;i<20;i++) if(fabs(a[i]-pjz)<s) { s=fabs(a[i]-pjz); t=a[i]; } } -------------------------------------------------------------------------------for(i=0;i<20;i++) scanf(“%f”,&a[i]); pjz/=20; printf(“%f,%f\n”,piz,t);

(2) 以下程序以每行 10 个数据的形式输出 a 数组,请填空。 void main( ) { int a[50],i; printf("输入 50 个整数:"); for(i=0; i<50; i++) scanf( "%d",_____ ); for(i=1; i<=50; i++) { if( _________ ) printf( "%3d\n" , _____ ) ; printf( "%3d",a[i-1]); } } &a[i]

·47·

i%10==0 a[i-1]

(3) 下面程序的功能是输出数组 s 中最大元素的下标,请填空。 void main( ) { int k, p; int s[ ]={1,-9,7,2,-10,3}; for(p=0,k=p; p<6; p++) if(s[p]>s[k]) _____; printf("%d\n" ,k); } k=p

(4) 这个程序输入了 20 个数存放在一个数组中,并且输出其中最大者与最小者、20 个数的 和及它们的平均值。请填空。 void main() { char array_____ ; int max,min,average,sum; int i; for(i=0;i<_____;i++) { printf("请输入第%d 个数:",i+1); scanf("%d",_____); } max=array[0];

·48·

min=array[0]; for(i=0;i<=_____;i++) { if(max<array[i]) __________ if(min>array[i]) __________ sum=________; } average =_________; printf("20 个数中最大值是%d,",max); printf("最小值是%d,",min); printf("和是%d,",sum); printf("平均值是%d.\n",average); } [20] 20 &array[i] 19 max=array[i]; min=array[i]; sum+array[i] sum/20

·49·

5. 阅读程序,分析程序的功能。
(1) #include <stdio.h> #include <string.h> void main( ) { char s[80]; int i ; for(i=0; i<80; i++) { s[i]=getchar( ); if(s[i]=='\n') break; } s[i]='\0'; i=0; while(s[i]) putchar(s[i++]); putchar(?\n?); } 从键盘输入一个字符串,并逐一输出

(2) #include <stdio.h> #include <string.h> void main( ) { char str[10][80], c[80]; int i;

·50·

for(i=0; i<10; i++) gets(str[i]); strcpy(c, str[0]) ; for(i=1; i<10; i++) if(strlen(c) <strlen(str[i])) strcpy(c,str[i]); printf( "%s\n", c); printf( "%d\n", strlen (c)); } 从键盘输入若干字符串,找到其中最长的一个输出及它的长度

(3) #include <stdio.h> #include <string.h> void main( ) { char a[10][80], c[80]; int i, j, k; for(i=0; i<10; i++) gets(a[i]); for(i=0; i<9; i++) { k=i ; for(j=i+1; j<10; j++) if(strcmp (a [j], a[k])<0) k=j; if(k!=i ) {strcpy(c,a[i]) ; strcpy(a[i], a[k]); strcpy(a[k],c);} // 字符串交换 } for(i=0; i<10; i++) puts (a[i]); }

·51·

从键盘输入若干字符串,并将它们按大到小顺序排好再输出

(4) 阅读程序,写出运行结果 #include <stdio.h> void main( ) { int a[6]={12,4,17,25,27,16},b[6]={27,13,4,25,23,16},i,j; for(i=0;i<6;i++) { for(j=0;j<6;j++) if(a[i]==b[j])break; if(j<6) printf("%d ",a[i]); } printf("\n"); } 4 25 27 16

(5) 阅读程序,写出运行结果。 #include <stdio.h> void main( ) { char a[8],temp; int j,k; for(j=0;j<7;j++) a[j]='a'+j; a[7]='\0'; for(j=0;j<3;j++) { temp=a[6]; for(k=6;k>0;k--) a[k]=a[k-1]; a[0]=temp;

·52·

printf("%s\n",a); } } gabcdef fgabcde efgabcd

(6) 阅读下列程序,写出程序运行的输出结果。 #include <stdio.h> #include <string.h> void main( ) { char str1[ ]="*******"; for(int i=0;i<4;i++) { printf("%s\n",str1); str1[i]=' '; str1[strlen(str1)-1]='\0'; } } ******* ***** *** *

(7) 该程序的运行结果是: min= ,m= ,n= 。 void main()

·53·

{ float array[4][3]={ {3.4,-5.6,56.7}, {56.8,999.,-.0123}, {0.45,-5.77,123.5}, {43.4,0,111.2} }; int i,j; int min; int m,n; min = array[0][0]; m=0;n=0; for(i=0;i<3;i++) for(j=0;j<4;j++) if(min > array[i][j]) { min = array[i][j]; m=i;n=j; } printf("min=%d,m=%d,n=%d\n",min,m,n); } -5.77 2 1

(8) 写出下面这个程序的输出结果: void main() { char str[]="ABCDEFGHIJKL";

·54·

printf("%s\n",str); printf("%s\n",&str[4]); str[2]=str[5]; printf("%s\n",str); str[9]='\0'; printf("%s\n",str); } 屏幕上显示: ABCDEFGHIJKL EFGHIJKL ABFDEFGHIJKL ABFDEFGHI

(9) 读懂下面的程序并填空。 void main() { char str[80]; int i=0; gets(str); while(str[i]!=0) { if(str[i]>='a'&&str<='z') str[i]-=32; i++; } puts(str); }

·55·

程序运行时如果输入 upcase, 屏幕显示 UPCASE 程序运行时如果输入 Aa1Bb2Cc3, 屏幕显示 AA1BB2CC

第 7 章 函数习题
1. 单项选择题
(1)C 语言总是从 函数开始执行。 A A. main B. 处于最前的 C.处于最后的 D. 随机选一个 (2)函数在定义时,省略函数类型说明符,则该函数值的类型为 。A A. int B. float C. long D. double (2)以下 函数,真正地没有返回值。 B A. int a(){int a=2;return (a);} B. void b(){printf("c");} C. int a(){int a=2;return a;} D. 以上都是 (3)在 C 语言中,有关函数的说法,以下正确的是 。 A A. 函数可嵌套定义,也可嵌套调用 B. 函数可嵌套定义,但不可嵌套调用 C. 函数不可嵌套定义,但可嵌套调用 D. 函数不可嵌套定义,也不可嵌套调用 (4)以下函数调用语句中,含有实参的个数为 。C fun((2,3),(4,5+6,7)); A. 1 B. 2 C. 5 D. 6 (5)函数调用可以在 。 D A. 函数表达式中 B. 函数语句中 C. 函数参数中 D. 以上都是 (6)被调函数返回给主调函数的值称为 。C A. 形参 B. 实参 C. 返回值 D. 参数 (7) ,可以不进行函数类型说明。 D A. 被调函数的返回值是整型或字符型时 B. 被调函数的定义在主调函数定义之前时 C. 在所有函数定义前,已在函数外预先说明了被调函数类型 D. 以上都是 (8)被调函数通过 语句,将值返回给主调函数。 D

·56·

A. if B. for C. while D. return (9)被调函数调用结束后,返回到 。 D A.主调函数中该被调函数调用语句处 B.主函数中该被调函数调用语句处 C.主调函数中该被调函数调用语句的前一语句 D.主调函数中该被调函数调用语句的后一语句 (10)以下对 C 语言函数的有关描述中,正确的是 。A A. 在 C 中,调用函数时,只能把实参的值传送给形参,形参的值不能传送给实参 B. C 函数既可以嵌套定义又可递归调用 C. 函数必须有返回值,否则不能使用函数 D. C 程序中有调用关系的所有函数必须放在同一个源程序文件中 (11)C 语言中函数的隐含存储类型是 。 C A. auto B. static C. extern D. 无存储类型 (12)能把函数处理结果的两个数据返回给主调函数,在下面的方法中不正确的是 。A A. return 这两个数 B. 形参用两个元素的数组 C. 形参用两个这种数据类型的指针 D. 用两个全局变量 (13)C 语言可执行程序从什么地方开始执行 ( )。 C A. 程序中第一条可执行语句 B. 程序中第一个函数 C. 程序中的 main 函数 D. 包含文件中的第一个函数 (14)有一个函数原型如下所示,则该函数的返回类型为( ) 。 C abc(float x,float y); A. void B. double C. int D. float

2. 填空题
(1) 变量的作用域主要取决于变量 ,变量的生存期既取决于变量 ,又取决于变量 。 所处 的位置,所处的位置,存储类型

·57·

(2) 说明变量时, 若省略存储类型符, 系统默认其为 存储类别, 该存储类别的类型符为: 。 动态,auto (3) 静态型局部变量的作用域是 ,生存期是 。它所在的局部,整个程序 (4) 函数中的形参和调用时的实参都是数组名时, 传递方式为 , 都是变量时, 传递方式为 。 址传递,值传递 (5) 函数的形式参数的作用域为 ,全局的外部变量和函数体内定义的局部变量重名时, _________变量优先。 该函数中,局部 (6) 若自定义函数要求返回一个值,则应在该函数体中有一条 语句,若自定义函数要求不 返回一个值,则应在该函数说明时加一个类型说明符 。 return,void (7) 若函数的形式参数是指针类型,则实参可以是 或 。指针,数组名 (8) 函数的参数为 char *类型时,形参与实参结合的传递方式为 。址传递 (9) 函数的实参为常量时,形参与实参结合的传递方式为 。值传递 (10) 下面这个函数的功能是求两个整数的积,并通过形参传回结果,请填空。int int int* *result void mul(___x,___y,___result) { ___=x*y; }

3. 判断题
( × )(1) 函数说明指的是在程序中设定一个函数模块。 ( √ )(2) 形参只有在被调用时才分配存储空间。 ( × )(3) 在 C 的函数中,最好使用全局变量。 ( × )(4) 在调用函数时,实参传值给形参,调用结束时,形参值传给实参。 ( √ )(5) 所有函数定义都是并行的,相互独立的。 ( × )(6) 函数的隐含存储类型是 extern。 ( × )(7) 形参可以是常量、变量或表达式。 ( × )(8) 函数调用可以作为一个函数的形参。

·58·

( √ )(9) C 语言规定,实参应与其对应的形参类型一致。 ( × )(10) 定义函数时,形参的类型说明可以放在函数体内。

4. 程序填空题
(1) 对数组按值从大到小的顺序排序后输出,请填空。 #include <stdio.h> void main() { float a[7]={2,6,3,8,3,12,9}; int i ; void sort(float*,int); _____; for(i=0;i<7;i++) printf("%f ",a[i]); printf("\n"); } void sort(_________) { int i,j,k; float t; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) if(_____) k=j; ________ { t=*(p+i); *(p+i)=*(p+k); *(p+k)=t; } }

·59·

} sort(a,7) float* p,int n *(p+k)<*(p+j) if(k!=i)

(2) 下列函数在 n 个元素的一维数组中, 找出最大值、 最小值并传送到调用函数, 请填空。 #include <stdio.h> void find(float *p, int max, int min, int n) { int k; _______ *max=*p; _______ for(k=1;k<n;k++) { t=*(p+k); if ( _____ ) *max=t; if (t<*min) *min=t; } } float t; *min=*p; *max<t

5. 写出下列程序运行结果
(1)

·60·

main() { int i=1,p; p=fun(i,i+1); printf("%d\n",p); } int fun(int a,int b) { int f; if(a>b) f=1; else if(a==b) f=0; else f=-1; return f; } -1

(2)键盘输入 abcdef<CR> #include <stdio.h> void fun( ) { char c ; if((c=getchar( ))!='\n') fun( ) ; putchar(c);

·61·

} void main( ) { fun( ); } fedcba

(3) #include <stdio.h> #define C 5 int x=1,y=C; void main( ) { int x; x=y++; printf("%d %d\n", x,y); if(x>4) { int x ; x=++y; printf("%d %d\n",x,y) ; } x+=y--; printf("%d %d\n",x,y); } 56 77 12 6

(4) #include <stdio.h> int c , a=4 ; func(int a , int b) { c=a*b ; a=b-1 ; b++ ; return (a+b+1) ; } void main( )

·62·

{ int b=2 , p=0 ; c=1 ; p=func(b , a) ; printf("%d,%d,%d,%d\n", a,b,c,p) ; } 4,2,8,9

(5) unsigned fun6(unsigned num) { unsigned k=1; do { k*=num%10; num/=10; } while(num); return k; } void main( ) { unsigned n=26; printf("%d\n", fun6(n)); } 12

(6) #include <stdio.h> int max(int a,int b); main() {

·63·

int x,y,z,t,m; scanf("%d,%d,%d",&x,&y,&z); t=max(x,y); m=max(t,z); printf("%d",m); } int max(int a,int b) { if(a>b) return(a); else return(b); } 运行时若输入:10,15,9 则输出:___ 15 运行时若输入:300,129,300 则输出:___ 300 (7) #include <stdio.h> long sum(int a,int b); long factorial(int n); main() { int n1,n2; long a; scanf("%d,%d",&n1,&n2); a=sum(n1,n2); printf("a=%1d",a);

·64·

} long sum(int a,int b) { long c1,c2; c1=factorial(a); c2=factorial(b); return(c1+c2); } long factorial(int n) { long rtn=1; int i; for(i=1;i<=n;i++) rtn*=i; return(rtn); } 运行时若输入:2,3 则输出:___ 8 运行时若输入:0, 5 则输出:___ 121 (8) #include <stdio.h> int s(); int x,y; main() { int n; x=1;y=2;

·65·

n=s(); printf("x=%d,y=%d,n=%d",x,y,n); } int s() { int z; x=3;y=4; z=x+y; return(z); } 程序运行后输出:___ 3,4,7

(9) 以下程序的输出结果是 a=___,b=___,c=___。 #include <stdio.h> int func(int a,int *p); void main() { int a=1,b=2,c; c=func(a,&b); b=func(c,&a); a=func(b,&c); printf("a=%d,b=%d,c=%d",a,b,c); } int func(int a,int *p) { a++; *p=a+2;

·66·

return(*p+a); } 36 16 19

·67·

第 8 章 指针习题
1 选择题
1、若有定义:int x,*pb;则以下正确的表达式是(A) A、pb=&x B、pb=x C、*pb=&x D、*pb=*x 2、以下程序的输出结果是(B) A、因变量无定义输出不定值 B、0 C、-1 D、1 #include<stdio.h> void main() {printf(“%d\n”,NULL);} 3、以下程序的输出结果是(B) A、5,2,3 B、-5,-12,-7 C、-5,-12,-17 D、5,-2,-7 #include<stdio.h> void sub(int x,int y,int *z) {*z=y-x;} void main() { int a,b,c; sub(10,5,&a); sub(7,a,&b); sub(a,b,&c); printf(“%d,%d,%d\n”,a,b,c); } 4、以下程序的输出结果是(C) A、4 B、6 C、8 D、10 #include<stdio.h> void main()

·68·

{ int k=2,m=4,n=6; int *pk=&k,*pm=&m,*p; *(p=&n)=*pk*(*pm); printf(“%d\n”,n); } 5、已知指针 p 的指向(图一)的 a[1],则执行语句*p++;后,*p 的值是(B)。 A、20 10 a[0] 20 a[1] 30 a[2] 40 a[3] 50 a[4] (图一) 6、已知指针 p 的指向(图一)的 a[1],则表达式*++p 的值是(B)。 A、20 B、30 C、21 D、31 B、30 C、21 D、31

7、已知指针 p 的指向(图一)的 a[1],则表达式++*p 的值是(C)。 A、20 B、30 C、21 D、31

8、以下程序的输出结果是(D)。 A、23 B、24 C、25 D、26

#include<stdio.h> void prtv(int *x) {printf(“%d\n”,++*x);} void main() { int a=25;prtv(&a); }

·69·

9、以下程序的输出结果是(B)。 A、运行出错 B、100 C、a 的地址 D、b 的地址 #include<stdio.h> void main() { int **k,*a,b=100; a=&b;k=&a; printf(“%d\n”,**k); } 10、以下程序运行后,输出结果是(D)。 A) 8 B) 7 C) 6 D) 5 #include<stdio,h> ss(char *s) { char *p=s; while(*p) p++; return(p-s); } main() { char *a="abded"; int i; i=ss(a); printf("%d\n",i); }

2 填空题
1、若有定义:char ch;

·70·

(1)使指针 p 指向变量 ch 的定义语句是 char *p=&ch; 。 (2)若已定义 char *p;,使指针 p 指向变量 ch 的赋值语句是 p=&ch; 。 (3)在(1)的基础上,通过指针 p 给变量 ch 读入字符的 scanf 调用语句是 scanf(“%c”,p); 。 (4)在(1)的基础上,通过指针 p 给变量 ch 赋字符?a?的语句是 *p=?a?; 。 (5)在(1)的基础上,通过指针 p 用格式输出函数输出 ch 中字符的语句是 printf(“%c”,*p); 。 2、以下程序输出的是 C 。 void main( ) { int i=3, j=2; char *a="DCBA"; printf("%c%c\n",a[i],a[j]); } 3、以下函数的功能是,把两个整数指针所指的存储单元中的内容进行交换。请填空。 void exchange(int *x, int *y) { int t; t=*y; *y= *x ; *x= t ; }


更多相关文档:

C语言语法基础练习题(含答案).doc

C语言语法基础练习题(含答案) - C 语言语法基础练习题 语言语法基础练习题 一、选择题 1.C 语言基本类型包括 ) . 语言基本类型包括( A) 整型、实型、逻辑...

C语言基础练习题(含答案).doc

C语言基础练习题(含答案)_IT认证_资格考试/认证_教育专区。第一章 C 语言

C语言基础练习100题(含答案).doc

C语言基础练习100题(含答案)_其它课程_高中教育_教育专区。本文对中职C语言基础进行全面复习巩固。 C 语言基础练习 100 题(含答案)雷柳青编排 1、下面程序的输出...

C语言语法基础练习题(含答案).doc

C语言语法基础练习题(含答案) - C 语言语法基础练习题 一、选择题 1.C 语言基本类型包括( ) A) 整型、实型、逻辑型 B) 整型、实型、字符型、逻辑型 C)...

C语言基础练习题(含答案)(3).txt

C语言基础练习题(含答案)(3) - 第三章 循环结构 3.1 选择题 1. 以

C语言基础练习题(含答案)(2).txt

C语言基础练习题(含答案)(2) - 第二章 选择结构 2.1 选择题 1. 已

C语言各章节练习题(含答案).doc

C语言各章节练习题(含答案) - 一、 C 语言概述练习题 选择 1. 一个 C

C语言基础强化练习100题(含答案).doc

C 语言基础强化练习 100 题(含答案)雷柳青编排 1.C 语言程序的基本构成

C语言基础题(含答案).doc

C语言基础题(含答案) - 第一章 C 语言基础知识 1 第一章 C 语言基础知识 1.1 选择题 1. 以下不是 C 语言的特点的是( )。 A、语言简洁紧凑 B、...

c语言基础练习题含答案.doc

c语言基础练习题含答案 - 数组值加倍输出 数组的最大数 逆序输出数组 数组元素

C语言基础练习题含答案.doc

C语言基础练习题含答案 - C 语言基础练习题(含答案)() 第一章 C 语言基

C语言程序基础练习题500道(附答案).pdf

C语言程序基础练习题500道(附答案) - 1.下列四组选项中,均不是 C 语言关健字的选项是( A A) define B) gect C) include D) while IF char ...

c语言基础练习习题及答案.doc

c语言基础练习习题答案 - c 语言基础练习习题答案 一、单项选择题 1.下

c语言程序基础练习题500道(附答案).doc

c语言程序基础练习题500道(附答案)_电脑基础知识_IT/计算机_专业资料。1

C语言基础练习题(含答案).doc

C语言基础练习题(含答案) - 1 目录 第 1-3 章 C 语言基础知识习题

c语言程序基础练习题500道(附答案)资料.doc

c语言程序基础练习题500道(附答案)资料 - 1.下列四组选项中,均不是 C 语言关健字的选项是( A A) define B) gect C) include D) while IF cha...

c语言基础习题、复习题(含答案).doc

c语言基础习题复习题(含答案) - 《C 语言设计》复习题 一 选择题 1、以

C语言基础题及答案.doc

C语言基础题答案 - 第一单元 一、 选择题 1. C 语言的基本构成单位是:

C语言语法基础练习题(含答案).pdf

C语言语法基础练习题(含答案) - C 语言语法基础练习题 一、选择题 1.C 语言基本类型包括( ) A) 整型、实型、逻辑型 B) 整型、实型、字符型、逻辑型 C)...

C语言基础练习习题及答案.pdf

C语言基础练习习题答案 - c 语言基础练习习题答案 一、单项选择题 1.下

更多相关标签:
网站地图

文档资料共享网 nexoncn.com copyright ©right 2010-2020。
文档资料共享网内容来自网络,如有侵犯请联系客服。email:zhit325@126.com