a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 148|回复: 1

[考试试题] 07年4月等级考试二级C语言练习一[2]

[复制链接]
发表于 2012-7-31 22:22:49 | 显示全部楼层 |阅读模式
(18)以下程序段的输出结果是
: z) B& y7 V# |: {. Y8 {8 F" n   int a=1234;
  g0 L, ~0 E5 s9 w. q5 }   printf("%2d\n",a);
6 e' I8 S# |+ h   A)12 0 F# `% q! a+ m
   B)34
$ z& r0 u6 ?3 }   C)1234 - M$ r$ S2 |9 }5 l7 T
   D)提示出错、无结果
/ g* x% b, j; N& `" N   【答案】C
5 z& ^5 u, I9 W6 L   【解析】 printf()函数的输出格式,当整数的值超过格式要求输出范围时,原样输出。本题中要求输出两个有效数字,而实际上a有4个有效数字,故原样输出,输出1234。4 ]% X- k  G' t. f& {8 U
$ q/ a) x, u) @4 f5 V
   (19)以下选项中不属于C语言的类型的是% Q2 J4 d* L: c$ i0 U( v
   A)signed short int
6 B/ V5 k* E) v: O+ G) k) E6 ?   B)unsigned long int4 B" e6 Z2 M& n
   C)unsigned int 7 T: k/ K1 n+ F( m) Q( W' Q' t
   D)long short' c+ {8 s9 k3 d6 x
   【答案】D- H* R, b$ _9 S. d
   【解析】在选项中很明显选项A为无符号短整型,选项B为无符号长整型,选项C为无符号整型,而选项D的类型在C语言中不存在。
! W+ Q) T9 M' y9 c7 `5 f2 {  K' @( L. r2 p+ H4 C7 ~
   (20)若有说明语句:int a,b,c,*d=&c;则能正确从键盘读入三个整数分别赋给变量a、b、c的语句是
; x7 i- p- A! ?/ S! ?/ w5 `' H- J   A)scanf("%d%d%d",&a,&b,d); 5 m6 L/ c7 E5 {( M/ O0 e
   B)scanf("%d%d%d",&a,&b,&d);
: c2 X8 d. ?3 s6 E   C)scanf("%d%d%d",a,b,d);
$ h6 S" k: h+ ^  Q4 w   D)scanf("%d%d%d",a,b,*d);
2 Z3 \8 B( h6 C7 \; ?0 a4 m& J: r  K1 X, v   【答案】A, Z0 t# i/ ?$ L
   【解析】scanf()函数有两个参数,第一个参数是输入格式字符串,第二个参数是输入变量地址列表。输入格式字符串主要由“%”符号和格式字符组成。地址列表是由多个地址组成的。选项B中d已经为地址,不应在加上求地址符号“&”;选项C中,a和b都为变量不是地址,应该在a和b之前加上求地址符号“&”;选项D中指针d所指向的存储空间的位置为变量c的值,不为地址。
9 Y. k4 Q  v0 g. L2 J: x  A9 N+ N. f; F
   (21)在16位C编译系统上,若定义long a;,则能给a赋40000的正确语句是
2 T; u0 U2 L+ K  @) x. l   A)a=20000+20000;
' q1 F- i; \, H& \' G   B)a=4000*10;
% ~  c8 H; z3 R# {' C* Z) ~5 o$ r   C)a=30000+10000;
" T( r7 y6 Y) u3 p! x6 x* P: S) [   D)a=4000L*10L;
) O9 {  e* `2 n; b7 i. C( O   【答案】D0 ^7 _! o. t. u. F0 i
   【解析】由于20000+20000、4000*10及30000+10000都是整型表达式,故运算的结果仍然是整型,表达式运算的结果超出了整型数据的范围,不正确。而D是长整型运算,不会超出长整型的范围。
/ z9 f- j- r& ~9 U" W4 z8 V" [2 C, e0 E0 o
   (22)以下叙述正确的是
5 Y+ `' J% h9 t! I) X   A)可以把define和if定义为用户标识符
  I* Y8 c% v0 q) |2 i   B)可以把define定义为用户标识符,但不能把if定义为用户标识符
0 ~, {) _* _$ ~$ E0 L3 U7 j   C)可以把if定义为用户标识符,但不能把define定义为用户标识符9 ]3 y3 @7 w6 s8 I* q4 t2 S
   D)define和if都不能定义为用户标识符
: [2 O% S# ~( y+ d# d7 l# g- k8 F   【答案】B% S5 I6 [# h6 O/ j1 J: g6 E
   【解析】C语言中的保留字,而define不是保留字。用户标识符不允许使用保留字。
* D' s$ j* P: o7 H(23)若定义:int a=511,*b=&a;则printf("%d\n",*b);的输出结果为
% d" D& l; \" E   A)无确定值
8 x: O1 P4 j2 b+ I   B)a的地址
- a5 L/ @4 ?. F: r' J& h% d2 T   C)512 9 t+ y; o3 G# }
   D)5117 D8 A5 J; p8 i
   【答案】D
/ e, B+ @# P2 K3 O+ M   【解析】本题中先定义了一个int型的变量a并赋初值为511,接着定义了一个指向a的指针变量b,在printf()函数的输出格式中,是输出*b,即输出指针所指向变量a的值为511,因此输出511。
. w# n( ^" x1 r! P! F5 b
" r7 L" U/ R6 s) ?& r   (24)以下程序的输出结果是' I" v% L* y2 _4 }
   main()
" w0 X' f- c! N0 t$ S; s2 @0 q   { int a=5,b=4,c=6,d;; H+ H4 d: B1 @+ P# z4 A+ @: E( g
   printf(("%d\n",d=a>b?)(a>c? a:c):(b));
. h* O( L6 |% q# [   }2 x# u4 H! O! ~- F* b) a( u
   A)5 9 Z; r6 Q/ N7 j; j9 d7 L; j) ~
   B)4
6 w" }7 M2 S( U% f& ?/ {   C)6 8 Z, l- c  _# F% A" a
   D)不确定
# _" E6 G& j- T- g9 k, P$ Q1 E   【答案】C& V- Q. `, J& k" S& ?
   【解析】在C语言中问号表达式(如:a>c?a:c;)的计算规则为:如果a>c为真,那么表达式的值为a的值;否则表达式的值为c的值。本题中的printf()函数中的输出表达式,首先计算括号内的条件表达式,它的值为6(a>c?a:c中a>c即5>6为假故该表达式的值为c的值即为6),然后再计算外面表达式(等价于a>b?6:b)的值,同理可得该表达式的值为6,将值6赋值给d,因此最后输出该表达式的值为6。
9 B: N" I( H3 b9 t; K8 W; Z, ~. b9 b- R- {  v& u; U
   (25)以下程序中,while循环的循环次数是8 k& o; ?2 i2 q; ^
   main()
2 g" f/ {1 z. Q& t! F   { int i=0;: V0 t' K: F7 c# Z9 c6 C* _
   while (i<10)
5 r0 ~6 |6 E2 @* L  U' F& l   { if(i<1)continue;0 E7 i% a; ~( r1 q% d; `
   if(i==5) break;( k; y1 Z4 Z/ S  x  q4 c2 T
   i++;
& F0 ]+ [& P" N0 g, \3 A" w   }. X1 ]7 e. K; H* N1 V1 f
   …
0 _% J$ k  x- ^& D   }1 x7 f+ B- y' k/ b2 _
   A)1 # W9 v8 X- z7 }
   B)10 ' `4 N6 d3 j- ^! q$ f* X
   C)6
  x- K4 _! _+ Y/ \' t; ]   D)死循环,不能确定次数  H8 E9 T$ R6 w0 `! S5 |$ r8 u+ P
   【答案】D
8 M+ m) W6 V( r6 j   【解析】break语句只能在循环体和switch语句体内使用,当break出现在switch语句体内时,其作用只是跳出该switch语句体。当break出现在循环体中,但不在switch语句体内时,则在执行break后,跳出本层循环体。而continue语句的作用是结束本次循环,即跳过本次循环中余下尚未执行的语句,接着再一次进行循环的条件判定。本程序中,变量i的初始值为0,判断while后面括号内表达式的值为真,执行循环体内的if语句,判断if后面括号内表达式的值为真,执行“continue;”语句。因continue的作用是结束本次循环,即跳过本次循环体中余下尚未执行的语句,接着再一次进行循环的条件判断,所以i的值未发生变化,循环条件仍然为真,if语句也仍然成立,因此循环将无止境地进行下去。* H& M. D. q- A/ G5 \6 w

7 _* R5 Y! r& b' S   (26)以下程序的输出结果是  H- V) _4 k+ w  e
   main()0 D" ^$ ]/ V, b( u
   { int a=0,i;; E4 F2 C3 A; H- e
   for(i=1;i<5;i++)- b( {, r- g7 l4 c" ?: {
   { switch(i)3 ~! s" `: V5 E5 }$ t( G6 `3 j
   { case 0:
0 A, W3 a5 q  E3 h. Q   case 3:a+=2;& l/ R8 v; l7 \- d' L
   case 1:
4 t& i7 c& t: Q* e5 e* _   case 2:a+=3;1 p2 O( n4 V  C- W2 ]$ j, Z  a( K% Z
   default:a+=5;
( q3 E9 f6 d2 ^) a( u5 \) ^- Y   }4 A6 v% Y& M1 f" e& ~& _! B
   }" a9 D" S+ O, d' x
   printf("%d\n",a);
/ L2 T5 K- k/ c; w, \: w1 w" N   }% Z# {6 O& _+ j6 C+ D
   A)31
: {' r1 W5 S$ Z/ u   B)13
; B) e" T9 X7 ^5 ^/ z6 n( \, f   C)10 & i6 B; |* V. h
   D)20* q7 l" m! {6 y% Y; ~- U1 }3 P+ z
   【答案】A
9 n/ c1 D4 E8 n5 [; o   【解析】switch语句的执行过程是:在switch后面的表达式的值和case后面常量表达式的值吻合时,就执行该case分支的语句。如果在该语句的后面没有break语句,则按顺序继续执行下一个case分支,直到遇到break语句或switch多分支语句结束,在switch语句中,break语句的作用是使流程跳出switch结构,终止switch语句的执行。在本题中,因为每个case语句后面都没有break语句,所以,第一轮循环(i==1)执行过后a的值为8,第2轮(i==2)执行过后a的值为16,第3轮(i==3)执行过后a的值为26,第4轮(i==4)执行过后a的值为31,然后执行“i++”语句,这时循环条件为假,循环结束。  Y7 c$ O7 K. D! F" s" u% `

: K3 p  k- Y5 v0 j9 G/ D% n% Z2 m) y! n   (27)以下程序的输出结果是
! X5 a0 Q( b6 J   main()
2 @5 Q6 ~, }6 Q/ j   { int a=4,b=5,c=0,d;0 u% t. j* c7 k7 ~3 B1 A8 J% c, C& ]
   d=!a&&!b‖!c;
8 p  a* @: V9 i' \$ g8 |4 I# [   printf("%d\n",d);
; q' P# u8 _" e8 i! ?: g, u! x   }4 w: M6 ]1 O  |0 K+ B* a
   A)1
) G& V& C* h5 m* D/ C   B)0
' x8 S! L- }, {" D3 f( h  z4 y. a5 l* V   C)非0的数
) x, Z4 F' s' i" w   D)-1
: s  ]5 l- R; K   【答案】A
. b2 y( S# f% ~, R  [) P   【解析】由于单目运算符优先级高于“&&”和“||”运算,所以先计算!a、!b和!c分别为“假”、“假”、“真”,然后是&&运算和“||”运算,原表达式就等价于“假”&&“假” ||“真”,又由于“&&”的优先级高于“||”运算符,所以先计算“假”&&“假”,还是为假,最后是“假”||“真”为真。因此最后d被赋值为1,故最后输出为1。
9 c7 \, |% W% l6 u( g2 k+ X7 J& s, ?# g
   (28)以下程序的输出结果是4 i$ D% x, c2 g' l3 ~! s2 b
   #include <stdio.h>
; y+ T1 S5 m: K6 `. `   main()
; {6 Y' z/ H6 H) j: E   { int i=0,a=0;; }2 A  r8 o6 Z9 o- r
   while (i<20)
# f% l6 p9 W. ^/ ]8 h, ^+ H  o   { for(;;)% P& n0 T' \1 k. v+ \* x
   { if((i%10)==0) break;
! y# `" Q9 c3 D& r* V: S, w! y   else i--;
7 p8 G0 }4 W) y% `; n8 h8 p) _& m   }+ M& G2 \$ ]6 p) S  [# a: Y2 t
   i+=11;a+=i;
- H* F2 Q& w  t: w7 t% e. ^   }1 k: U; l% y  I
   printf("%d\n",a);
+ ^& T6 ^- N, r; u  n   }" I, W8 }. p( R. H- D  k
   A)21 4 w, G6 s$ {' v1 ?
   B)32 - w# f6 C9 U( `- [" q0 u
   C)33
7 M* a4 J+ ]  D; R2 S   D)115 {8 P: G' t0 c
   【答案】B- f- t4 C5 _2 [3 q
   【解析】break语句只能在循环体和switch语句体内使用。本题程序为在while循环中嵌套for循环。先看内层for循环,该循环的3个表达式全部省略,循环条件始终为真,但循环体内的break语句为终止循环的条件。首先,由初始条件判断外层循环while括号内表达式的值,该值为真,执行本次while循环,即执行循环体内的if语句,判断该表达式后面括号里表达式的值为真,执行break语句,跳出内层循环,执行下面的语句,此时i和a的值均变为11;回到外层循环,判断表达式“i<20”仍为真,执行内层循环语句,此时if条件不满足,执行else语句,i的值为10,继续内层循环,if语句条件满足,执行break语句,跳出内层循环,执行下面的语句后,i和a的值分别是21和32。再判断外层循环的条件为假,结束循环。4 F; a6 N/ g$ y9 d( e

1 |3 V& v" s6 Q. S: z% k% P. c8 w   (29)以下程序的输出结果是
6 V0 s' n, f) E0 X   char cchar(char ch)9 g! c8 \  P2 P- }& z1 ]
   {
' E/ E) n# X" B5 h0 L5 A   if(ch>='A' &&ch<='Z')ch=ch-'A'+'a';* E6 D0 \' y  I' p0 f' ^4 `3 V
   return ch;! K9 s2 h' e* ~8 i* b( [
   }
, ^! c. z4 \* `! ]7 F$ f   main()- N3 h2 `2 I, M9 j
   { char s[]="ABC+abc=defDEF",*p=s;7 S& T& D3 Z" D
   while(*p)
* b# G: J2 @3 Q4 W% g# ?; _! t# ^6 r   { *p=cchar(*p);' P# `4 z+ z+ `1 \/ d. L
   p++;* G! W; L4 s+ D8 L+ C
   }' K/ M, \$ A# Z. _
   printf("%s\n",s);
: a2 {1 L8 u- r9 X$ q   }3 `, R/ u6 v/ W1 p  Y! m, S
   A)abd+ABC=DEFdef 3 }, g2 y: E$ G6 e( ^
   B)abc+abc=defdef $ C3 t6 w1 H5 Q; Z! M5 F
   C)abcABCDEFdef 8 k/ z8 L8 j  h
   D)abcabcdefdef7 _9 o# _3 d( P" n
   【答案】B
6 F+ M4 f) }6 O* @) M' @2 n   【解析】本题首先定义了一个函数cchar(),有一个字符型参数ch。在函数中首先判断该字符是否为大写字母,如果是则把它转换成小写字符再赋值给ch,把ch作为函数值返回。在主函数中定义了一个字符数组s并初始化,然后定义了一个指针变量并使它指向数组s。接着通过一个while循环利用指针变量p,依次取出字符数组的字符(直到遇到字符串结束标志'\0'),并调用cchar()函数,把大写字母转换成小写字母,其他字符不变。最后输出字符数组为s中的内容,结果为“abc+abc=defdef”。
回复

使用道具 举报

 楼主| 发表于 2012-7-31 22:22:50 | 显示全部楼层

07年4月等级考试二级C语言练习一[2]

(30)以下程序的输出结果是
! J4 ?4 ], m! w- F% c   int f()# B& t! m$ G' h# t* _7 j: _8 R- p
   { static int i=0;
! L6 b! y& d7 x1 x/ I  j& r3 ^   int s=1;
2 g# C( c1 d9 j0 X' q  |   s+=i;i++;
; u  g% @! L, q2 s9 Y7 E   return s;8 q% u# k) g. L: o( V  j
   }& E3 i4 Y, `" f1 _
   main()
$ o+ J" \; p. J: {   { int i,a=0;
/ R4 w  p( N$ N# c9 i; N   for(i=0;i<5;i++)a+=f();9 _* T9 v9 l( b7 b/ d
   printf("%d\n",a);
5 a1 U* e! G5 K  j2 P: W# w( t& t   }  }9 J$ L# y; V  K% S# O
   A)20
; k, \% n' K: i3 W   B)24
6 P3 _( \; i9 s6 h; i   C)25 ! w4 K: @; _4 b7 l! [- [6 c
   D)15
, z' j/ V1 d& y* z   【答案】D
: ~1 O$ S9 ^4 E: V2 M0 f   【解析】在C语言中声明为static型的变量,在整个程序运行期间,静态局部变量在内存的静态存储区中占据永久性的存储单元。即使退出函数后,下次再进入该函数时,静态局部变量仍使用原来的存储单元。由于并不释放这些存储单元,因此这些存储单元中的值得以保留;因而可以继续使用存储单元中原来的值。本题中函数f()中定义了一个static型变量i,故每调用一次函数f(),i的值加1,返回s的值等于i,在主函数中用了一个for循环,该循环执行了5次,每次都调用f()函数,将其返回值累加到变量a中,故最后a的值为1+2+3+4+5=15。% \2 T# q1 A4 Z1 v, \
. J  l$ O) g' u6 u6 b2 u2 O6 _" [8 Y
   (31)以下程序段的输出结果是
  U: a5 D5 x5 g5 V9 w7 Y   char s[]="\\141\141abc\t";/ J! p. V; z) ?# T3 x
   printf("%d\n",strlen(s));% |+ g8 p2 I5 B' }
   A)9
7 p) H2 r4 [$ g( y   B)12
7 G* n0 ^9 b! e5 z   C)13 ' ^3 Y- B. |0 t3 c
   D)14* }! s) @0 h8 N7 E1 y6 e
   【答案】A
! \" J) n% `. q, m# V2 z; q   【解析】字符数组中可以存放字符串,但字符数组的长度并不是字符串的长度,字符串的长度是指字符数组中存放的有效字符个数,即'\0',之前的字符数。字符数组s中依次存放的字符是:'\\'、'1'、'4'、'1'、'\141'、'a'、'b'、'c'和'\t',和最后一个字符串结束标记'\0',故字符串的长度是9。! a5 x5 M( X% n0 L9 B2 E
$ q) w" E3 J* h1 U
   (32)若有以下程序& c5 Y1 Q6 r4 L% K7 A6 x  o5 O  c7 L
   #include <stdio.h>/ Z1 `" W! x+ k2 w
   void f(int n);& E+ Z- q0 G% T0 J
   main()- v& E  |7 P% u$ Y4 {
   { void f(int n);/ l: I% U1 b( L( F# N; V" {- S
   f(5);% a7 J6 _* \! a- `1 x5 ?8 Q
   }3 I5 ?! v( l3 R
   void f(int n)% \& O# K9 z# {  a) f' d5 w  m
   { printf("%d\n",n);}6 K  y" o' ?: j6 E2 y- {
   则以下叙述中不正确的是
8 R' `  S$ q! `* O5 H   A)若只在主函数中对函数f进行说明,则只能在主函数中正确调用函数f7 s4 ]! i9 b3 o% K9 T/ P
   B)若在主函数前对函数f进行说明,则在主函数和其后的其他函数中都可以 正确调用函数f
' w: C' y1 E0 r% p5 T1 H, [# V   C)对于以上程序,编译时系统会提示出错信息;提示对f函数重复说明
3 ~' |7 c7 ^/ U   D)函数f无返回值,所以可用void将其类型定义为无值型8 E0 h4 l6 m, n5 w$ b7 d
   【答案】C3 W/ h' h; Y* T! C& A
   【解析】若一个函数定义在主调函数之后,其返回值不是int或char型,则必须对之进行函数说明。可在函数外说明也可以在函数内说明,在函数外说明,在其后的所有函数均可调用该函数,若在函数内说明,则只能在本函数内调用该函数。函数只能定义一次,但函数说明可以出现多次。
" ?! x' X( ^: j% e! x, ~9 R, k- i2 n8 e, f- Y
   (33)以下程序调用findmax函数返回数组中的最大值2 h9 \$ w# G4 w2 |
   findmax(int * a,int n)3 ]# ?- l0 r7 V" Y8 j  R
   { int * p,* s;2 W) N& {, J% ?6 g+ [# E* S; z
   for (p=a,s=a;p-a<n;p++)
9 a% L2 z: V- N0 g0 f& @/ {   if( ) s=p;
( }; T# g8 W. O% W( R$ B   return(*s);
/ O; J8 p9 C  {1 h   }
) X: P- b+ {/ F3 H   main()
" P6 f8 W# y0 {) X! o0 |" Z$ c   { int x[5]={12,21,13,6,18};
& Z0 {$ r/ u* O1 q3 |   printf("%d\n",findmax(x,5));! y& U6 i0 \% Z/ ^2 Y
   }+ v7 o/ b/ ^9 O' v( K: ~
   在下划线处应填入的是
8 ~. I* U# d! K, a: {: X5 ]6 L   A)p>s
7 L& K7 N+ j- ?! s! u  k7 D   B)*p>*s * C8 ~  s9 x2 m; H6 w* z, M
   C)a[p]>a[s] & q" k% Z: x' L1 W- {1 s/ d
   D)p-a>p-s
8 k" P, ^. h  @% f, y# m$ z   【答案】B
. m" w( |5 u9 S( u( E# m   【解析】在main()函数中定义了一个具有5个元素的x数组并赋初值,然后调用findmax()函数求数组中元素的最大值。调用时把数组元素x的首地址,传给了形参指针变量a,把5传给形参n。在函数findmax()中定义了两种指针变量p和s,其中s用来记录最大元素的地址,p作为循环控制变量,表示每个元素的地址。求最大值的算法是先将第5个元素(用s记下它的地址)做为最大值,然后用最大值(*s)与后面的每个元素比较(*p),若后面的元素大,则用s记下它的地址,所以下划线应填“*s<*p”或“*p>*s”。
5 @- F# i7 U9 ?/ y0 T/ i- Q  ^5 E4 J" ^# e# H/ j( M' b7 H
   (34)以下程序的输出结果是6 X  b! l. Z* e0 D% [/ e" ~6 a
   main(), ]6 ~! Q* b) v- z/ p3 e
   { char ch[3][5]={"AAAA","BBB","CC"};
8 h5 ^  M$ J0 |& [  ?" N   printf("\"%s"\n",ch[1]);" o$ g2 s/ }, f5 k
   }
8 f' A) p4 \6 p+ w: y3 H+ X  L   A)"AAAA"
6 A/ t6 y3 L) o* ]6 @   B)"BBB"
1 E7 ?4 @  A" v4 M; n5 Q& L9 O   C)"BBBCC" 7 [2 ^6 b- l4 d! _" o$ d
   D)"CC"
$ k0 q1 Z: E  E$ z* i+ Z( k1 W   【答案】B# m1 T  ~. d+ {! u5 R
   【解析】二维字符数组可以看成由若干个一维字符数组组成,每行是一个一维字符数组。本题首先定义了一个数组ch[3][5],并给它们按行赋初值,即相当于给ch[0]赋值“AAAA”,给ch[1]赋值“BBB”,给ch[2]赋值“BBB”,最后输出转义字符“'\'”、ch[1]和转义字符“\”,因此输出为“BBB”。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-5 09:23 , Processed in 0.529389 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表