综合练习题 从下列四个供选择的答案中选出正确的一个答案 1、语句 printi(%%d%d”,123),将输出 A)%123%dB)%%123%d123D)上述语句语法有错 “%%”格式表示输出一个“%”。 2、执行下列程序段后,a值为 int a, b a=(a=b++)?a%5:a5; B)28 C)4 D)2 先计算a-=b++的值: a--的值为15,执行后a=14:b++的值为12,执行后b=13:15=12为假 执行a5即14/5值为2 结果:a=2 3、判断字符变量c的值为数字(0--39)则返回1,否则返回0,可用表达式 A)0=0)if (x)y=l; else y=-1 B) if(xl=0)if(x>0)y=l; else y=-1; else y=0 C)if (x0)y=l; else y=0; x<0 0 5、循环for(=0,j=5;++i-j;) printf((“%od%d”,,j),将执行 A)6次B)3次C)0次D无限次 i=0,j=5,(++i1)|=(-j14)成立:i=1,j=4 i=1,j=4,(++i+2)l=(-→3)成立:i=2,j=3 i=2,j=3,(++i+3)|=(-12)成立:i=3,j=2
1 综 合 练 习 题 一、从下列四个供选择的答案中选出正确的一个答案 1、语句 printf(“%%d%d”, 123); 将输出: A) %123%d B) %%d123 C) %d123 D)上述语句语法有错 “%%”格式表示输出一个“%”。 2、执行下列程序段后, a 值为: int a, b; a=15; b=12; a=(a-- ==b++)? a%5 : a/5; A) 0 B) 2.8 C ) 4 D) 2 先计算 a--==b++的值: a--的值为 15,执行后 a=14;b++的值为 12,执行后 b=13;15==12 为假 执行 a/5 即 14/5 值为 2 结果: a = 2 3、判断字符变量 c 的值为数字(’0’---’9’)则返回 1,否则返回 0, 可用表达式: A) ‘0’=0) if (x) y=1; else y= -1; B) if (x!=0) if (x>0) y=1; else y= -1; else y=0; C) if (x0) y=1; else y=0; 即: -1 x 0 5、循环 for(i=0, j=5; ++i!=--j; ) printf(“%d %d”, i, j); 将执行 A) 6 次 B) 3 次 C) 0 次 D) 无限次 i = 0, j = 5, (++i➔1) != (--j➔4) 成立: i = 1, j = 4 i = 1, j = 4, (++i➔2) != (--j➔3) 成立: i = 2, j = 3 i = 2, j = 3, (++i➔3) != (--j➔2) 成立: i = 3, j = 2 ……
6、下列程序段执行后s值为 int 1=5.s=0 do if(i%2)continue; else s+=i, while(--1) A)15B)906D)以上均不是 写成规范形式 if(i% 2) while(--1) i=5,s=0:i%2=1 i=4,s=0:i%2=0:s=0+4=4;i=3 i=2,s=4:i%2=0:s=4+2=6 =1,s=6:i%2=1 7、对于以下宏定义 #define n3 # define y(n)(N+1)幸n 执行语句“z=2*(N+Y(5+1)”后z的值为 C)25 D)以上均不是 宏定义的执行是先替换再参与运算 z=2*(N+(N+1)5+1)=2(3+(3+1)*5+1)=48 8、以下宏替换的叙述不正确的是 A)宏替换时不占运行时间 B)宏名无类型 C)宏替换只是字符替换 D宏名必须用大写字母表示 9、语句if(a>b)k=0, else k=1;(inta,b,k)等价于: k=(a>b)?1:0,B)k=a>b,Qk=a<=b;D)以上均不是 10、对于inti; char c, s[20]从输入序列123ab4sefg中将123读入i,'b'读入c;“45eg”读入S 则 scanf语句应写为 A)scanf("%da%c%s", i, c, s) B) scanf(“%d%^c%c%s”,&i,&e,s)
2 6、下列程序段执行后 s 值为: int i=5, s=0; do if (i%2) continue; else s+=i; while (--i); A) 15 B) 9 C) 6 D) 以上均不是 写成规范形式: do if (i % 2) continue; else s += i; while (--i); i = 5, s = 0: i % 2 = 1: i = 4 i = 4, s = 0: i % 2 = 0: s = 0 + 4 = 4; i = 3 i = 3, s = 4: i % 2 = 1: i = 2 i = 2, s = 4: i % 2 = 0: s = 4 + 2 = 6; i = 1 i = 1, s = 6: i % 2 = 1: i = 0 7、对于以下宏定义: #define N 3 #define Y(n) ((N+1)*n) 执行语句“z=2*(N+Y(5+1))”后 z 的值为: A) 48 B) 42 C) 25 D) 以上均不是 宏定义的执行是先替换再参与运算 z=2*(N+(N+1) 5+1)=2*(3+(3+1) *5+1)=48 8、以下宏替换的叙述不正确的是 A)宏替换时不占运行时间 B)宏名无类型 C)宏替换只是字符替换 D)宏名必须用大写字母表示 9、语句 if (a>b) k=0; else k=1; (int a, b, k) 等价于: A) k=(a>b)?1:0; B) k=a>b; C) k=a<=b; D) 以上均不是 10、对于 int i; char c, s[20];从输入序列 123ab45efg 中将 123 读入 i; ’ b’读入 c; “45efg”读入 s, 则 scanf 语句应写为: A) scanf(“%da%c%s”, i, c, s) B) scanf(“%d%*c%c%s”,&i, &c, s);
C)scanf("%da%c%s", &i, &c, &s) D) scanf(""%d%c%c%s",&i, &c, s) 11、对于以下程序段,运行后i值为 enum WeeKs{1,2,3,4,5,6,7} enum weeks a=l int i =0 switch(a)i case 2: 1 =2 default: i=3 A)1 B)0 D)上述程序有语法错误 12、某一程序 TEST. C,编译后运行:TEST123456ABC则相应的argc及argv3]分别为 A)3“456”B)3“ABC C)4“456”D)4“ABC” ar revo TEST argyll 123 -456 rgv ABC” 13、如下程序段 intc={1,7,12}; printf("next k is %d",*++k) 其输出应为 A)2 B)7 D)以上均不对 [ 4、如果变量ⅹx有如下类型: struct i
3 C) scanf(“%da%c%s”, &i,&c,&s) D) scanf(“%d%c%c%s”, &i, &c, s); 11、对于以下程序段, 运行后 i 值为: enum WEEKS {1,2,3,4,5,6,7} ; enum WEEKS a=1; int i=0; switch (a) { case 1: i=1; case 2: i=2; default: i=3; } A) 1 B) 0 C) 3 D) 上述程序有语法错误 12、某一程序 TEST.C,编译后运行:TEST 123 456 ABC 则相应的 argc 及 argv[3]分别为: A) 3 “456” B) 3 “ABC” C) 4 “456” D) 4 “ ABC” 13、如下程序段: int c[]={1, 7, 12}; int *k; k=c; printf("next k is %d",*++k); 其输出应为: A) 2 B) 7 C) 1 D)以上均不对 14、如果变量 xx 有如下类型: struct { char a1; 1 argv[0] “TEST” argv[1] “123” argv[2] “456” argv[3] “ABC” k 1 c[0] 7 c[1] 12 c[2]
2 如果 sizeof(xx)的值为3,则 则 sizeof(y)函数的返回值应为: A)2B)4C)5D)定义有错 15、执行下列程序 #define MA(x, y)((x)*(y)) 后变量i的值应为: B)19C23D)1 (1)*(1+1)) 16、执行下列程序 1,J i=3/2+7/2=5 j=45%1ll+((7>8)?14:21)=14) 后变量i的值应为: Ali=0j=l B) 1=((3/2+7/2)=5)=((1+3)=5)=(4=5)=0; 17、如果 char cc="12345",做 sizeof(cc)后的返回值应为 A)2B)506D)1 sIze0返回参数对象的字节数:这里的参数是字符数组c,有6个元素
4 int a2; 2 } xx; 如果 sizeof(xx)的值为 3, 则: union { char a1; int a2; int a3; } yy; 则 sizeof(yy)函数的返回值应为: A) 2 B) 4 C) 5 D)定义有错 15、执行下列程序: #define MA(x, y) ( (x)*(y) ) i=5; i=MA(i,i+1)-7; 后变量 i 的值应为: A) 30 B) 19 C) 23 D) 1 MA(i,i+1)-7 ➔ ((i) * (i+1)) – 7 ➔ (5 * 6 ) – 7 ➔ 23 16、执行下列程序: int i, j; i = 3/2 + 7/2 == 5; j = 45 % 11 + (((7>8) ? 14:21) == 14); 后变量 i,j 的值应为: A) i=0 j=1 B) i=1 j=1 C) i=0 j=2 D) i=1 j=2 i = ((3/2 + 7/2) == 5) = ((1+3) == 5) = (4 == 5) = 0; j = 1 + (21 == 14) = 1 + 0 = 1 17、如果 char cc[]="12345",做 sizeof(cc)后的返回值应为 A) 2 B) 5 C) 6 D) 1 sizeof()返回参数对象的字节数: 这里的参数是字符数组 cc,有 6 个元素
18、如果inti=16,j=23;执行 printf("%x-%o",i,j)后输出为: A)10-23B10-27C)16--23D)16-27 19、执行下列程序: #define MA(x, y)(x)*(y) inti=2 i=3/MA(,计+1)+5; printf("%dn”,1) 其输出应为 B) D)以上都错 3MA(1,i+1)+5 3(1)*(计+1)+5 少32*3+5 20、有一函数: int f(int a)( auto intb=0 static intc= 3 如果有inti,j;则执行两次调用:i=(2);j=(2)后,i,j值为 B)i=7,j=8 C)i=8 7 D)i=8, 注意静态局部变量 static int c;的含义 第一次调用f(2) 开始时:b=0,c=3 执行:b=0+1=1,c=3+1=4 返回:a+b+c=2+1+4=7 调用结束后:静态局部变量∞=4保持不变; 第二次调用f(2):
5 18、如果 int i=16, j=23 ; 执行 printf("%x--%o",i, j)后输出为: A) 10--23 B) 10--27 C) 16--23 D) 16--27 19、执行下列程序: #define MA(x, y) (x)*(y) int i = 2; i = 3/MA(i, i+1)+5; printf(“%d\n”, i); 其输出应为: A) 5 B) 8 C) 0 D) 以上都错 3/MA(i,i+1)+5 ➔ 3/(i)*(i+1)+5 ➔ 3/2*3+5 ➔ 8 20、有一函数: int f(int a) { auto int b = 0; static int c = 3; b = b+1; c = c+1; return(a+b+c); } 如果有 int i, j; 则执行两次调用:i=f(2); j=f(2) 后, i, j 值为: A) i = 7, j = 7 B) i = 7, j = 8 C) i = 8, j = 7 D) i = 8, j = 8 注意静态局部变量 static int c;的含义 第一次调用 f(2): 开始时: b = 0, c = 3 执行: b = 0 + 1 = 1, c = 3 + 1 = 4; 返回: a+b+c=2+1+4=7; 调用结束后: 静态局部变量 c=4 保持不变; 第二次调用 f(2):
开始时:b=0,c=4 执行:b=0+1=1,c=4+1=5 返回:a+b+c=2+1+5=8 调用结束后:静态局部变量c=5保持不变; 21、有一函数 int f(char *s) i ink=o while (*s)k=k*10+*s++-0 调用f(“1234”)的返回结果是: A)“1234”B)1234C)“4321”D)4321 while循环等价于: while(*s)k=k*10+(*s++)-“0° 该函数的作用将数字字符串转换成相应的整数 2、以下正确的描述是C )C语言的预处理能力是指完成宏替换和包含文件的调用 B)预处理命令智能位于C源程序文件的首部 C)凡是C源程序中首行以#标识的控制行都是编译预处理命令 )C语言的编译预处理就是对源程序进行初步的语法检查 23、使用fsek函数可以实现的操作是 A改变文件位置指针的当前位置 B)文件的顺序读写 C)文件的随机读写 D)以上都不是 24、inta={1,2,34.5,6,7.8,9,10},*p=ai 数组元素地址的正确表示 A)&(a+1) B)a++ C)&p D)&p[i] 、填空题 1、用for循环打印147101316192225,其语句应为 for(i=1;i←=9,i++) printf(%3d”,3*i-2) 2、执行完下列语句段后,值分别为:355350 Intl,J; J=10°(=5) +=j*=+2; 第一条语句执行后:i=5,j=50
6 开始时: b = 0, c = 4 执行: b = 0 + 1 = 1, c = 4 + 1 = 5; 返回: a+b+c=2+1+5=8; 调用结束后: 静态局部变量 c=5 保持不变; 21、有一函数: int f(char *s) { int k = 0; while (*s) k = k*10+*s++-’0’; return(k); } 调用 f(“1234”)的返回结果是: A) “1234” B) 1234 C) “4321” D) 4321 while 循环等价于: while (*s) k = k * 10 + (*s++) – ‘0’; 该函数的作用:将数字字符串转换成相应的整数. 22、以下正确的描述是 C A) C语言的预处理能力是指完成宏替换和包含文件的调用 B) 预处理命令智能位于 C 源程序文件的首部 C) 凡是 C 源程序中首行以#标识的控制行都是编译预处理命令 D) C 语言的编译预处理就是对源程序进行初步的语法检查 23、使用 fseek()函数可以实现的操作是 A)改变文件位置指针的当前位置 B)文件的顺序读写 C)文件的随机读写 D)以上都不是 24、int a[]={1,2,3,4,5,6,7,8,9,10},*p=a,i; 数组元素地址的正确表示: A)&(a+1) B)a++ C)&p D)&p[i] 二、填空题 1、用 for 循环打印 1 4 7 10 13 16 19 22 25 , 其语句应为: for (i=1; i<=9; i++) printf(“%3d”, _3*i-2__); 2、执行完下列语句段后, i,j 值分别为:___355,350__ int i, j; j=10*(i=5); i+=j*=i+2; 第一条语句执行后: i = 5, j = 50
执行第二条语句 +=j=+2 1+=(*=(1+2) (=50*7) i=5+350=355,J=350 3、执行完下列语句段后,i值为 static int al3][4}={1,2,3},4,5,6},i; a[o][1 2 a[0[2 a[0][3 a[lol 4 a[1[1 5 a[l[2 6 a[1][3 a[2]0 X}16 a[2][1 X18 a[2][2 a[2][3 a[OJ5的地址:X+(0*4+5)*2=X+10,即对应于a[1 4、执行完下列语句段后,i值为:4 int f(int x) i static int k=0 return x. =f(2); 5、执行完下列语句段后,i值为:18 7
7 执行第二条语句: i+=j*=i+2 ➔ i += (j *= (i+2)) ➔ i += (j *= 7) ➔ i += (j = 50*7) ➔ i = 5 + 350 = 355, j = 350 3、执行完下列语句段后, i 值为:__5__ static int a[3][4]={{1,2,3},{4,5,6}}, i; i= a[0][5]; a[0][0] 1 X a[0][1] 2 X+2 a[0][2] 3 X+4 a[0][3] ? X+6 a[1][0] 4 X+8 a[1][1] 5 X+10 a[1][2] 6 X+12 a[1][3] ? X+14 a[2][0] ? X+16 a[2][1] ? X+18 a[2][2] ? X+20 a[2][3] ? X+22 a[0][5]的地址: X+(0*4+5)*2 = X + 10, 即对应于 a[1][1]。 4、执行完下列语句段后, i 值为:__4___ int i; int f(int x) { static int k = 0; x+=k++; return x; } i=f(2); i=f(3); 5、执行完下列语句段后, i 值为:__18__
int f(int x) return(x>0)?x*f(x-1):3),} i=ff(1), 调用f(1) 1>0)成立,执行1*f(0)=f(0), 调用f(0)=3 所以,f(1)=3 调用f(3) f(3)=3*f(2) 所以f(3)=3*6=18 6、文件函数 rewind的功能是:使文件f的位置指针指向文件开始 7、对于 char c;若已知其值为小写字母,将其转换为相应大写字母的表达式为 8、将p说明为字符数组指针数组大小为10,可写为char(p川10l 9、feof函数可用于文本文件和二进制文件,它用来判断即将读入的文件是否为文 件结束标 若是,函数值为非零值。 10、在对文件进行操作的过程中,若要求文件的位置回到文件的开头,应当调用的函数是 rewind 11设有以下定义:# define WIDTh80 #define LENGTH (WIDTH+40) 则执行赋值语句:a= LENGTH*20;后a的值为:2400 12、head为指向以下结构的链表指针,统计链表中所有inf域值之和(s)的程序段为 struct list i long s for(p=head, s=0; p!= NULL 13、下面是用二分法从数组vn中查找数x的函数返回值为x所在下标(若找到)或-l(没找到)
8 int i; int f(int x) { return ((x>0)? x*f(x-1):3); } i=f(f(1)); 调用 f(1): (1>0) 成立,执行 1*f(0)=f(0), 调用 f(0) = 3 所以,f(1)=3; 调用 f(3): f(3) = 3 * f(2) f(2) = 2 * f(1) = 2 * 3 = 6 所以 f(3) = 3 * 6 = 18 6、文件函数 rewind()的功能是: 使文件 fp 的位置指针指向文件开始 7、对于 char c; 若已知其值为小写字母, 将其转换为相应大写字母的表达式为 ___c – ‘a’ + ‘A’______ 8、将 p 说明为字符数组指针,数组大小为 10,可写为:__char (*p)[10];__ 9、feof 函数可用于 文本 文件和 二进制 文件,它用来判断即将读入的文件是否为 文 件结束标志 ,若是,函数值为非零值。 10、在对文件进行操作的过程中,若要求文件的位置回到文件的开头,应当调用的函数是 rewind() 11.设有以下定义:#define WIDTH 80 #define LENGTH (WIDTH+40) 则执行赋值语句:a=LENGTH*20; 后 a 的值为: 2400 12、head 为指向以下结构的链表指针, 统计链表中所有 inf 域值之和(s)的程序段为: struct nlist { int inf; struct nlist *next; } *head, *p; long s; for (p=head, s=0; _p != NULL_ ; p = p->next) s += __p->inf__; 13、下面是用二分法从数组 v[n]中查找数 x 的函数,返回值为 x 所在下标(若找到)或-1(没找到):
binsearch(int x, int vI, int n low. high. mid low=0; high=n-1 if(v[mid])low=mid +1 14、下面程序验证哥德巴赫猜想,即寻找2到1000间满足“偶数=素数1+素数2”(如10=3+7)的所 有偶数。素数指只能被1和自身整除的正整数,如1,2,3,17等 #include #define maX 500 int prime(int n)/*判断n是否为素数* if((n%1))break for(i=1;,i<=500,i++) if( prime()&& prime(2*i-1))( printf("%d=%d+%dn”,2*,,2*-j);/若2*i为两个素数之和* 15、对于整型变量i执行 scanf("%d%*d%d"&&j),当输入23456后 16、对于 int*p,*q,i=5,j=6;执行: q-p &j后(*p)=6
9 binsearch(int x, int v[], int n) { int low, high, mid; low=0; high=n-1; while (lowv[mid]) low = mid +1; else return __ mid_; } return -1; } 14、下面程序验证哥德巴赫猜想, 即寻找 2 到 1000 间满足“偶数=素数 1+素数 2”(如 10=3+7)的所 有偶数。素数指只能被 1 和自身整除的正整数,如 1,2,3,17 等。 #include #define MAX 500 int prime(int n) /* 判断 n 是否为素数 */ { int i; for (i=2; i<=n-1; i++) if (!(n%i)) break; return _ i==n_; } main() { int i, j; for (i=1 ; i<=500; i++) for (j=1; j<2*i; j+=2) if (_prime(j) && prime(2*i-j)_) { printf(“%d = %d +%d\n”, 2*i, j, 2*i-j); /*若 2*i 为两个素数之和 */ break; } } 15、对于整型变量 i,j 执行 scanf("%d%*d%d",&i, &j);当输入 2 3 4 5 6 后 i=_ 2_ j= _4__ 16、对于 int *p, *q, i=5, j=6;执行: p = &i; q = p; p = &j;后 (*p)=_ 6_ , (*q)= __5__
7、f(intm) 1,J for(=m-1;j>=0;j-) rinf(%ld%c", i+j,j?*. # 如果调用f(3)将输出_2*1“0#3*2*1#4中3*2# 18, void f( int*a, int b) { static int k-o *a+=++k b+=2 若执行i=2,j=4; f(&i,j) f(&ji)后i=_3,j=_6 i2→3 j4→ k0→ k1-2 b 今6 b35 19、用for循环打印012012012; for(i=1;i<=9,i++) printf("y%2d",(i-1)%3_) 20、定义一个返回整型的函数指针p,应写为_int(*p)O 21、定义字符指针数组ar,数组大小为20,应写为 char sarr20 2、程序A void f( char cc)
10 17、f( int m ) { int i, j; for( i=0; i=0; j--) printf(“%1d%c",i+j, j?'*':'#'); } 如果调用 f(3)将输出__2*1*0#3*2*1#4*3*2#__ 18、void f( int *a, int b ) { static int k=0; *a += ++k; b +=2; } 若执行 i=2; j=4; f( &i, j ); f( &j, i ) 后 i= __3__, j= __6___ i 2 ➔ 3 j 4 i 3 j 4 ➔ 6 k 0 ➔ 1 k 1 ➔ 2 a b 4 ➔ 6 a b 3 ➔ 5 19、用 for 循环打印 0 1 2 0 1 2 0 1 2; for( i=1; i<=9; i++ ) printf("%2d", __(i-1)%3__); 20、定义一个返回整型的函数指针 p,应写为 _int (*p)();_ 21、定义字符指针数组 arr, 数组大小为 20,应写为 __char *arr[20];__ 22、程序A void f( char cc[] ) { char ch; int i=0,j=0;