全国计算机二级C语言 # (8)选择题:选择结构程序设计(1-30)

全国计算机二级C语言 # 选择题:选择结构程序设计(1-30)


1. 有以下程序

#include <stdio.h>
main()
{
char  c;
while( ( c=getchar() )!= ‘ ‘ )
{
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( ” ” );
}
程序运行后从第一列开始输入以下数据
2473<回车>
程序的输出结果是答案:A

A)668977

B)68766
C)4444
D)6677877
题目解析:字符常量与其ASCII码值一一对应,在计算的时候,一般是字符数据对应的ASCII码参与运算。本程序的逻辑是如果输入的字符不为<回车>,判定表达式”c-‘2′”的值,如果表达式的值为0或者1,即输入的字符为’2’、’3’时,输出两遍c+4对应的字符;输入的字符为’4’时,输出一遍c+4对应的字符;输入的字符为′5′,输出c+3和c+2对应的字符;输入的字符为’7’时,输出c+2对应的字符。


2. 有以下程序段,若变量已正确定义并赋值

if(a>b)printf(“x=%d,”, x);
else   printf(“y=%d,”, y);
if(a<=b)i++;
else   j++;
则与此程序段功能相同的选项是答案:A

A)if(a>b){printf(“x=%d,”, x);j++;}
else   {printf(“y=%d,”, y);i++;}
B)if(a>b){printf(“x=%d,”, x);i++;}
else   {printf(“y=%d,”, y);j++;}
C)if(a>=b){printf(“x=%d,”, x);i++;}
else    {printf(“y=%d,”, y);j++;}
D)if(a<=b){printf(“x=%d,”, x);i++;}
else    {printf(“y=%d,”, y);j++;}
题目解析:程序的逻辑是当a>b时,执行语句”printf(“x=%d, “, x);”和语句” j++;”,否则执行语句”printf(“y=%d, “,y);”和语句”i++;”。


3. 以下程序的功能是判断输入的一个整数是否能被3或7整除,若能整除,输出YES,否则输出NO。在下划线处应填入的选项是
#include <stdio.h>
main()
{  int  k;
printf(“Enter a int number : “); scanf(“%d”, &k );
if  ________  printf(“YES “);
else          printf(“NO “);
}答案:D

A)( (k%3=0) || (k%7=0) )
B)(k/3==0) || (k/7==0)
C)( (k%3==0)&& (k%7==0) )

D)( (k%3==0) || (k%7==0) )

题目解析:根据程序的逻辑设计,if的判定条件应该是k对3或者7取余的值等于0,使用逻辑或”||”、求余运算符”%”以及等于关系运算符”==”。


4. 对于 if(表达式) 语句,以下叙述正确的是答案:A

A)“表达式”的值可以是任意合法的数值

B)在“表达式”中不能出现变量
C)在“表达式”中不能出现常量
D)“表达式”的值必须是逻辑值
题目解析:if语句的一般形式为”if(表达式) 语句体”,其中,”表达式”可以是任意合法的C语言表达式,所以计算出的结果可以是任意合法的数值。


5. 有如下程序

#include <stdio.h>
main()
{
int a = 0, b = 1;
if (a++ && b++)
printf(“T”);
else
printf(“F”);
printf(“a=%d,b=%d “, a, b);
}
程序运行后的输出结果是答案:B
A)Fa=0,b=2

B)Fa=1,b=1

C)Ta=1,b=2
D)Ta=0,b=1
题目解析:自加运算符后置的时候,该变量是先使用后自加1。并且根据逻辑表达式的”短路求值”原理,判定表达式”a++”的值为0,整个逻辑表达式的值为0,而且”b++”不再计算。a=1,b=1。


6. 有如下程序

#include <stdio.h>
main()
{
char a = ‘3’, b = ‘A’;
int i;
for (i=0; i<6; i++)
{
if (i % 3) putchar(a + i);
else putchar(b + i);
}
printf(” “);
}
程序运行后的输出结果是答案:C
A)ABC678
B)34AB78

C)A45D78

D)34CD78
题目解析:程序的流程是:for循环i从0到5,如果a不能被3整除,也就是表达式”i%3″的值不为0,则输出’3’+i对应的字符;若a能被3整除,则输出’A’+i对应的字符。


7. 有如下程序

#include <stdio.h>
main()
{
int x = 0x13;
if (x = 0x18) printf(“T”);
printf(“F”);
printf(” “);
}
程序运行后的输出结果是答案:D
A)T
B)TFT
C)F

D)TF

题目解析:C语言中用非0值表示真,用0值表示假,0x18为用十六进制表示的数值,为非0,赋值给x后x也为非0,所以if条件语句” printf(“T”);”能够执行,输出T。之后执行语句”printf(“F”);”。


8. 有如下程序

#include <stdio.h>
main()
{
int a = 0, b = 1;
if (++a == b++)
printf(“T”);
else
printf(“F”);
printf(“a=%d,b=%d “, a, b);
}
程序运行后的输出结果是答案:C
A)Fa=1,b=2
B)Ta=0,b=1

C)Ta=1,b=2

D)Fa=0,b=2
题目解析:自增运算符前置时,该变量是先自增1后再参与其他运算;自增运算符后置时,该变量是先参与运算后再自增1。由此,if判定条件判定的是自加后的a值和自加前的b值是否相等,判定条件为真,输出T,此时a=1,b=2。


9. 有如下程序

#include <stdio.h>
main()
{
if (‘


10. 有以下程序段
int a,b,c;
scanf(“%d%d%d”,&a,&b,&c);
if(a>b) a=b;
if(a>c) a=c;
printf(“%d “,a);

该程序段的功能是答案:D
A)输出a、b、c中值相等的数值
B)输出a的原始值
C)输出a、b、c中的最大值

D)输出a、b、c中的最小值

题目解析:新增试题,程序执行过程为:从键盘读入三个整型数据,依次赋给a,b,c,判断a,b,若成立将较小的值b赋值给较大的值a,判断a,c,若成立将较小的值c赋值给较大的值a,if实现了将从键盘读入的数据中最小值赋给a的功能,最后输出a,也即输出最小值。


11. 有以下程序

#include <stdio.h>
main()
{
int x;
scanf(“%d”,&x);
if(x>10) printf(“1”);
else if(x>20) printf(“2”);
else if(x>30) printf(“3”);
}
若运行时输入:35<回车>,则输出结果是答案:C
A)123
B)2

C)1

D)3
题目解析:if多分支选择结构中,只有之前的if(或else if)的判定条件不满足时才进行下一个if(或else if)的条件判定,所以当输入35时,执行的是第一条if语句的语句体。


12. 有以下程序段

scanf(“%d%d%d”,&a,&b,&c);
if(a<b) a==b;
if(a<c) a==c;
printf(“%d “,a);
该程序段的功能是答案:D
A)输出a、b、c中的最小值
B)输出a、b、c中值相等的数值
C)输出a、b、c中的最大值

D)输出a的原始值

题目解析:if语句的形式为”if(表达式) 语句体”,如果表达式的值为真,则执行语句体。该程序段的逻辑是如果a>b,则把b值赋值给a;如果a>c,则把c值赋值给a,也就是a中记录但是a、b、c中的最小值。


13. 以下程序段中,不能实现“如果a<b则x=10,否则x=-10”的是答案:A

A)if(a<b) x=10;
if(b<a) x=-10;
B)x=(a>=b)? -10:10;
C)if(a<b) x=10;
else x=-10;
D)x=-10;
if(a<b) x=10;
题目解析:题目的意思若a<b,x=10,若a>=b,x=-10,选项A)少考虑了a==b的情况。


14. 有以下程序

#include <stdio.h>
main()
{  char *s=”120119110″;
int n0,n1,n2,nn,i;
n0=n1=n2=nn=i=0;
do{
switch(s[i++])
{  default   : nn++;
case  ‘0’ : n0++;
case  ‘1’ : n1++;
case  ‘2’ : n2++;
}
} while(s[i]);
printf(“n0=%d,n1=%d,n2=%d,nn=%d “,n0,n1,n2,nn);
}
程序的运行结果是答案:C
A)n0=2,n1=7,n2=10,nn=1
B)n0=2,n1=5,n2=1,nn=1

C)n0=3,n1=8,n2=9,nn=1

D)n0=4,n1=8,n2=9,nn=1
题目解析:switch语句执行过程中,default语句块最后执行,case或者default只是作为一个入口,如果执行完某一个case或者default语句块之后没有遇到break,则继续往下执行。该程序中的循环是遍历数组s中的元素:为0时,n0、n1、n2均自增1;为1时,n1、n2自增1;为2时,只有n2自增1;其他情况,nn、n0、n1、n2均自增1;数组s中有2个′0′,5个′1′,1个′2′和1个′9′,循环终止的条件是字符串末尾的′′,对应的整数为0,所以答案选”n0=3,n1=8,n2=9,nn=1。


15. 有以下程序

#include <stdio.h>
main( )
{   int a,b;
for (a=0; a<3; a++)
{  scanf(“%d”, &b);
switch(b)
{  default: printf(“%d,”, ++b);
case 1: printf(“%d,”, ++b);
case 2: printf(“%d,”, ++b);
}
}
}
执行时输入:1 2 3<回车>,则输出结果是答案:C
A)2,2,3,4,4,4,
B)2,3,4,3,4,4,

C)2,3,3,4,5,6,

D)2,3,4,
题目解析:switch语句执行过程中,default语句块最后执行,case或者default只是作为一个入口,如果执行完某一个case或者default语句块之后没有遇到break,则继续往下执行。该程序中的循环是遍历数组s中的元素:为0时,n0、n1、n2均自增1;为1时,n1、n2自增1;为2时,只有n2自增1;其他情况,nn、n0、n1、n2均自增1;数组s中有2个′0′,5个′1′,1个′2′和1个′9′,循环终止的条件是字符串末尾的′′,对应的整数为0,所以答案选”n0=3,n1=8,n2=9,nn=1。


16. 有以下程序

#include <stdio.h>
main( )
{  int  a,b;
for (a=0; a<3; a++)
{  scanf(“%d”, &b);
switch(b)
{  default: printf(“%d,”, b++);
case 1: printf(“%d,”, b++);
case 2: printf(“%d,”, b++);
}
}
}
程序运行时输入:1  2  3<回车>,则输出结果是答案:B
A)1,2,3,2,3,3,

B)1,2,2,3,4,5,

C)1,2,3,
D)1,1,1,2,2,3
题目解析:考查switch语句的执行过程。switch语句执行过程中,default语句块最后判定,case或者default只是作为一个入口,如果执行完某一个case或者default语句块之后没有遇到break,则继续往下执行。3次输入的b值分别为1、2、3。对应执行的printf语句的条数分别为1、2、3条。即1,2,2,3,4,5。


17. 有如下程序

#include   <stdio.h>
main( )
{
int  i, data;
scanf(“%d”, &data);
for (i=0; i<10; i++)
{
if (i > data) break;
printf(“%d,”, i);
}
}
程序运行时,从键盘输入:3<回车>后,程序输出结果是答案:D
A)2,3,4,
B)1,2,3,
C)3,4,5,

D)0,1,2,3,

题目解析:根据if语句中的判断条件i > data可知,当i>data时,跳出程序。i从0取到3时,data满足条件,即data中存储了0,1,2,3;当i=4时,i>data不成立,立即跳出程序,所以输出为0,1,2,3。


18. 有以下程序

#include   <stdio.h>
main( )
{
int  x = 0x13;
if (x = 0x12)   printf(“True”);
printf(“False “);
}
程序运行后的输出结果是答案:D
A)True
B)False
C)TrueFalseTrue

D)TrueFalse

题目解析:虽然if函数后面有一个输出,但并不是需要满足了if条件才能输出,也即该程序段实际是不管输入什么,都是两个输出。


19. 有以下程序

#include   <stdio.h>
main( )
{
int  a = 0, b = 1;
if (++a == b++)
printf(“1”);
else
printf(“0”);
printf(“a=%d,b=%d “, a, b);
}
程序运行后的输出结果是答案:A

A)1a=1,b=2

B)0a=0,b=2
C)1a=0,b=1
D)0a=1,b=2
题目解析:先判断if语句中++a==b++是否成立,判断出来是成立,即输出1,if函数过后输出时,由于进行了++a和b++运算,得出a=1,b=2。


20. 有以下程序

#include   <stdio.h>
main( )
{
if (‘


21. 有以下程序

#include   <stdio.h>
main( )
{
int  i, *ptr;
int  array[4] = {0,1};
for (ptr=array, i=0; i<3; i++, ptr++)
{
if (*ptr == 0)
putchar(‘#’);
else
putchar(‘M’ + *ptr);
}
printf(” “);
}
程序运行后的输出结果是答案:A

A)#N#

B)MMM
C)#F#
D)MO#
题目解析:i=0时,i小于3成立,进行下一语句,即if判断,此时*ptr==0成立,存入#,依次类推i=1和2时的存入数据,可得出输出为#N#。


22. 若要利用if-else语句判断year是否闰年,是闰年则返回1,不是闰年则返回0。
以下选项中不能完成正确判断的程序段是答案:A

A)if(year%400==0) return 1;
else if(year%100!=0)
if(year%4==0) return 1;
else return 0;
B)if(year%4!=0)  return 0;
else if(year%400==0) return 1;
else if(year%100==0) return 0;
else return 1;
C)if(year%400!=0)
if(year%100==0) return 0;
else if(year%4==0) return 1;
else return 0;
else return 1;
D)if(year%100==0)
if(year%400==0) return 1;
else return 0;
else if(year%4==0) return 1;
else return 0;
题目解析:!=代表不等于,%代表求余运算,A项中的判断条件中有漏洞,不能被400整除的,被100整除,被4整除,程序自身矛盾。


23. 以下关于switch语句的叙述中正确的是答案:B

A)default必须放在全部case的最后

B)每个case语句标号后面可以没有break语句

C)所有case的标号都应当是连续的
D)char型常量不能做case的标号使用
题目解析:default和case是相对独立的,即便是default放在了case之前,还是会执行后面的case;case语句可以没有break语句;case语句的标号可以不连续;case的标号可以是合法常量。


24. 若ch是char型变量,则以下程序段不能实现“若ch存储大写字母字符则返回1,若存储小写字母字符则返回0,若是其它字符则返回-1”这一功能的是答案:C

A)if(ch>=’A’&&ch<=’Z’) return 1;else if(ch>=’a’&&ch<=’z’) return 0;     else return -1;
B)if(ch>=’a’&&ch<=’z’) return 0;if(ch>=’A’&&ch<=’Z’) return 1;else return -1;

C)if(ch>=’a’&&ch<=’z’)
return 0;
else return -1;
if(ch>=’A’&&ch<=’Z’) return 1;
D)if(ch>=’A’&&ch<=’Z’) return 1;if(ch>=’a’&&ch<=’z’)     return 0;else return -1;
题目解析:因为题目中要求进行两次判断,一是判断是否为大写字母,二是判断是否为小写字母,二者之间存在一定的相连关系,单独执行两次判断不能保证结果一定准确;多个if是所有的if都会进行判断if else if是只要有满足条件的,就不再对之后的else if进行判断。


25. 有以下程序

#include  <stdio.h>
main()
{
int i,x,k=0,m;
for(i=0;i<5; i++)
{
scanf(“%d”,&x);
x/=10;
switch(x)
{
case 0: case 1: case 2: k++;m=1;
default : k++; m=2;
case 3: k++; m=3;
case 4: k++; m=4;
}
}
printf(“%d,%d”,k,m);
}
程序运行时输入:35 20 52 40 106<回车>,则输出结果是答案:A

A)13,4

B)15,2
C)5,2
D)5,4
题目解析: 通过对本题程序段的分析,我们可以知道,每次执行for循环后,对应的k和m的值分别如下:
第1次:k=2,m=4;
第2次:k=6,m=4;
第3次:k=9,m=4;
第4次:k=10,m=4;
第5次:k=13,m=4;
由此可知,本题答案选A)。


26. 有如下程序

#include <stdio.h>
main()
{  int f=-2,k=4,a=0;
while(f)
{  do
{   if(k%2) a++;
else break;
} while(–k);
f++;
}
printf(“%d,%d,%d”,f,k,a);
}
程序的运行结果是答案:B
A)0,0,2

B)0,4,0

C)2,4,0
D)0,4,2
题目解析:,由于f=-2,不等于0,即while(f)内的程序没有被执行,直到f=0为止,所以输出为0,4,0。


27. 有以下程序

#include <stdio.h>
int fun( int x[ ],int k)
{ if( k==0) return x[k];
else return x[k-1] + fun(x,k/2);
}
main()
{   int x[ ]={2,4,6,8,10} ;
printf(“%d “,fun(x,5));
}
程序的运行结果是答案:B
A)16

B)18

C)22
D)12
题目解析:分析题意可知:当k=5,根据if语句中的条件,返回的是x[4]+fun(x,2);当k=2时,根据if语句中的条件,返回的是x[1]+fun(x,1);当k=1时,根据if语句中的条件,返回的是x[0]+fun(x,0);当k=0时,根据if判断条件返回的是x[0],以上结果相加(即10+4+2+2),得出最终的输出结果为18,故本题答案选B)。


28.  有如下程序

#include <stdio.h>
main()
{
int i;
char data;
scanf(“%c”, &data);
printf(“%d “, data);
for (i=2; i<10; i++)
{
if (data % i) continue;
printf(“%d,”, i);
}
}
程序运行时,从键盘输入: B<回车>后,程序输出结果的第一行为66,则第二行内容为答案:A

A)2,3,6,

B)2,3,4,5,6,7,8,9,
C)6,
D)10,
题目解析: B对应的ASCII码值为66,即data=66,if判断的满足条件是66除以i余数为0,i从2取值取到9,共有2,3,6可以被整除。


29.  有如下程序

#include <stdio.h>
void get_put()
{
char ch;
ch = getchar();
putchar(ch);
if (ch != ‘ ‘) get_put();
putchar(‘.’);
}
main()
{
get_put();
}
程序运行时,输入1234<回车>,则输出结果是答案:A

A)1234
…..
B)4321…..
C)1234…..
D)4444
…..
题目解析:get_put()函数判断输入的ch是否等于回车换行,如果不等于,放入一个.当ch中字符等于回车换行时,跳出if,输入为1234<回车>,即需要检测的字符有5个,输出为1234
…..


30.  有以下程序

#include <stdio.h>
main()
{
int a=1,b=2,c=3;
char flag;
flag = b>=2 && c<=3;
switch(a)
{
case 1: switch(flag)
{
case 0: printf(“**”); break;
case 1: printf(“%%”); break;
}
case 0: switch(c)
{
case 1: printf(“$$”); break;
case 2: printf(“&&”); break;
default : printf(“##”);
}
}
printf(” “);
}
程序运行后的输出结果是答案:C
A)**##
B)%&&

C)%##

D)**$$


本章结束…

默认图片
linwute
我要像梦一样自由,像大地一样宽容; 在艰辛放逐的路上,点亮生命的光芒; 我要像梦一样自由,像天空一样坚强; 在曲折蜿蜒的路上,体验生命的意义;

留下评论