全国计算机二级C语言 # 选择题:循环结构程序设计(1-43)
1. 若变量已正确定义,则以下for循环
for ( x=0,y=0; ( y!=123 ) && ( x<4 ); x++ );答案:B
A)执行123次
B)执行4次
C)执行次数不确定
D)执行3次
题目解析:for语句的一般形式为”for(表达式1; 表达式2; 表达式3 ) {循环体语句}”,其执行流程是先计算表达式1,之后计算表达式2,根据表达式2的值来判定是否进行循环,若为真,则执行循环体,循环体执行完毕之后再计算表达式3的值。该循环的循环条件是(y!=123&& x<4),每次循环后x自增1,x由0自增到3,循环执行4次。
2. 以下叙述正确的是答案:A
A)do-while语句构成的循环,当while语句中的表达式值为0时结束循环
B)do-while语句和while-do构成的循环功能相同
C)while-do语句构成的循环,当while语句中的表达式值为非0时结束循环
D)do-while语句构成的循环,必须用break语句退出循环
题目解析:没有while-do循环,选项B)错误;不管是while语句还是do-while语句都是判定表达式的值为0时结束循环,选项A)正确,选项C)错误;循环语句只要循环条件不满足就会退出循环,不必非得用break语句,选项D)错误;答案选A)。
3. 有以下程序
#include <stdio.h>
main( )
{
int i ;
for( i=1; i<= 5; i++ )
{ if( i % 2 ) printf( “*” );
else continue;
printf( “#” );
}
printf( “$ ” );
}
程序运行后的输出结果是答案:C
A)*#*#$
B)*#*#*#*$
C)*#*#*#$
D)*#*#*$
题目解析:该程序的逻辑是,for循环中i从1循环到5。每次循环中,若i不能被2整除,即表达式”i%2″的值为真时,则输出一个’*’和’#’,否则什么都不输出。循环结束后再输出字符’$’,i%2不为0时,i的可能取值为1、3、5,共输出三次的*#。
4. 有以下程序
#include <stdio.h>
main()
{
int x=23;
do
{
printf(“%2d “, x–);
} while( !x );
}
程序的执行结果是答案:A
A)输出23
B)不输出任何内容
C)输出321
D)陷入无限循环
题目解析:do-while循环中printf语句是按照列宽为2输出x的值,即23,然后计算表达式”x–“,得x=22,C语言中非0表示真,0表示假,所以判定的循环条件”!x”为假,退出循环。
5. 有以下程序
#include <stdio.h>
main()
{ int i=0, sum=1;
do
{
sum += i++ ;
} while( i<6 );
printf(“%d “,sum);
}
程序的输出结果是答案:C
A)18
B)20
C)16
D)22
题目解析:do-while循环的执行过程是先执行循环体再判定循环条件是否满足。该程序的循环条件为i<6,每次循环时i均自增1,sum是在1的基础上累加i自加前的值,即0到5。
6. 有以下函数
int fun( char *s, char *t )
{ while(( *s )&&( *t ) && (*t++ == *s++ ) );
return (*s-*t);
}
函数的功能是答案:D
A)将字符串s复制到字符串t中
B)求字符串的长度
C)连接字符串s和字符串t
D)比较两个字符串的大小
6. 有以下函数
int fun( char *s, char *t )
{ while(( *s )&&( *t ) && (*t++ == *s++ ) );
return (*s-*t);
}
函数的功能是答案:D
A)将字符串s复制到字符串t中
B)求字符串的长度
C)连接字符串s和字符串t
D)比较两个字符串的大小
7. 有如下程序
#include <stdio.h>
main()
{
int i, data;
scanf(“%d”, &data);
for (i=0; i<5; i++)
{
if (i < data) continue;
printf(“%d,”, i);
}
printf(” “);
}
程序运行时,从键盘输入:3<回车>后,程序输出结果为答案:D
A)0,1,2,3,4,5,
B)1,2,3,4,
C)0,1,2,
D)3,4,
题目解析:该程序的逻辑是:外层循环i从0到4,然后输出大于等于data的值。
7. 有如下程序
#include <stdio.h>
main()
{
int i, data;
scanf(“%d”, &data);
for (i=0; i<5; i++)
{
if (i < data) continue;
printf(“%d,”, i);
}
printf(” “);
}
程序运行时,从键盘输入:3<回车>后,程序输出结果为答案:D
A)0,1,2,3,4,5,
B)1,2,3,4,
C)0,1,2,
D)3,4,
题目解析:该程序的逻辑是:外层循环i从0到4,然后输出大于等于data的值。
8. 有如下程序
#include <stdio.h>
main()
{
int i, data;
scanf(“%d”, &data);
for (i=0; i<5; i++)
{
if (i > data) break;
printf(“%d,”, i);
}
printf(” “);
}
程序运行时,从键盘输入:3<回车>后,程序输出结果为答案:C
A)3,4,5,
B)0,1,
C)0,1,2,3,
D)3,4,
题目解析:该代码段的程序流程是:外层循环i从0到4,然后输出小于等于data的值。
9. 有如下程序
#include <stdio.h>
main()
{
int i;
for (i=0; i<5; i++)
putchar(‘9’ – i);
printf(” “);
}
程序运行后的输出结果是答案:D
A)’43210′
B)54321
C)’9”8”7”6”5′
D)98765
题目解析:该代码段中,for循环i从0循环到4,每次输出’9’-i对应的字符,’9’-0对应的字符为’9’,以此类推。
10. 有如下程序
#include <stdio.h>
main()
{
int i = 1;
for (printf(“%d”, i); i<4; i++)
printf(“%d”, i);
printf(” “);
}
程序运行后的输出结果是答案:D
A)123
B)0123
C)001
D)1123
题目解析:for语句的一般形式为”for(表达式1; 表达式2; 表达式3 ) {循环体语句}”,其执行流程是先计算表达式1,之后计算表达式2,根据表达式2的值来判定是否进行循环,若为真,则执行循环体,循环体执行完毕之后再计算表达式3的值。整个循环过程中,表达式的值只会执行一次,而表达式2、3以及循环体每次循环都会执行。
11. 有如下程序
#include <stdio.h>
main()
{
char ch = ‘A’;
while (ch < ‘D’)
{
printf(“%d”, ch – ‘A’);
ch++;
}
printf(” “);
}
程序运行后的输出结果是答案:D
A)abc
B)ABC
C)123
D)012
题目解析:字符常量与其ASCII码值一一对应,在计算的时候,一般是字符数据对应的ASCII码参与运算,所以该程序的逻辑是,在字符ch的ASCII码小于’D’的ASCII码的情况下,输出ch与’A’之间的ASCII码的差值。其中’A’-‘A’=0;’B’-‘A’=1……
12. 有如下程序
#include <stdio.h>
main()
{
char ch = ‘M’;
while (ch != ‘K’)
{
ch –;
putchar(ch);
}
printf(” “);
}
程序运行后的输出结果是答案:B
A)MM
B)LK
C)OP
D)MN
题目解析:while执行逻辑是如果字符ch不为′K′,则先自减1,再输出对应的字符,这里的自减1指的是字符的ASCII码减1,其实就是字符由′M′变为′L′。循环体执行2次,第1次输出′L′,第2次输出′K′,第3次循环条件不满足,退出循环。
13. 若要实现total=1+2+3+4+5,以下程序段错误的是答案:A
A)int i=1,total=1;
while(i<5)
{ total+=i;
i+=1;
}
B)int i=0,total=0;
while(i<5)
{ i+=1;
total+=i;
}
C)int i=1,total=0;
while(i<=5)
{ total+=i;
i+=1;
}
D)int i=0,total=0;
while(i<=5)
{ total+=i;
i+=1;
}
题目解析:选项A)记录的数据是total = 1+1+2+3+4,和题意不符
14. 有以下程序
#include <stdio.h>
main()
{
int i=1,k=0;
for( ; i<6 ; )
{ switch(i%3)
{ case 0: k++;
case 1: k++; break;
case 2: k++; continue;
}
i+=1;
}
printf(“%d “,k);
}
程序的运行情况是答案:B
A)输出5
B)形成无限循环
C)输出4
D)输出6
题目解析:break语句用于循环体,可以跳出当前层循环,continue语句的作用则是跳过当前循环层余下未执行的语句,继续执行下一次循环。在该程序中当i为2的时候执行语句” case 2: k++; continue;”跳过了i自加语句”i+=1;”,所以i值不再变化,程序陷入死循环。
15. 以下程序段中,循环次数不超过10的是答案:B
A)int i=6; do{ i-=2;} while(i!=1);
B)int i=10; do{ i=i+1;} while(i<0);
C)int i=5; do{ i+=1;} while(i>0);
D)int i=1; do{ i+=2;} while(i!=10);
题目解析:考查do-while循环语句的执行过程,B)仅执行1次,选项A)、C)、D)均为死循环,执行次数均超过10
16. 以下能够实现计算5!的程序段是答案:A
A)int fac=1,k=0;
do{ k++; fac*=k;} while(k<5);
B)int fac=1,k=1;
do{ k++; fac*=k;} while(k<=5);
C)int fac=1,k=0;
do{ fac*=k; k++;} while(k<5);
D)int fac=0,k=1;
do{ fac*=k; k++;} while(k<5);
题目解析:5!的计算公式是1*2*3*4*5,do-while语句是先执行循环体再判定循环条件。
17. 有以下程序
#include <stdio.h>
main()
{
int x=0,y=6;
do
{ while(–y) x++;}
while(y–);
printf(“%d,%d “,x,y);
}
程序的运行结果是答案:C
A)6,-1
B)6,0
C)5,-1
D)5,0
题目解析:考查do-while和while循环语句的执行过程。do-while语句是先执行循环体再判定循环条件,而while语句是先判定循环条件再执行循环体。自减运算符前置时,该变量是先自减1后再参与其他运算;自减运算符后置时,该变量是先参与运算后再自减1。由此,当y=1时,内层循环结束,此时x=5,y=0。外层循环的判定条件”y–“也为假,判定语句执行后y=-1。
18. 有以下程序
#include <stdio.h>
main( )
{ int a=-1, b=-1;
for(; ++a;) ++b;
printf(“%d,%d “, a, b);
}
程序运行后的输出结果是答案:A
A)0,-1
B)0,0
C)-1,-1
D)结果不确定
题目解析:for循环中的三个表达式第一个是初始化变量,可以有多个,用逗号隔开;第二个是判断是否满足条件,表达式返回值是非零就执行循环体,是零就退出循环;第三个是改变循环条件的;此处第二个表达式为空即当a=0时退出循环。输出的时候,%d是格式输出,代表输出的是一个整数,即a=0,b=-1。
19. 有以下程序
#include <stdio.h>
main( )
{ int a=0, b=0;
for(; a<5; a++)
{ if (a%2==0) continue;
b += a;
break;
}
printf(“%d “, b);
}
程序运行后的输出结果是答案:D
A)10
B)4
C)0
D)1
题目解析:for语句中,当a=0时,满足for循环中if语句的条件,执行continue继续下一次循环。执行a+1后进入for语句循环,此时a=1不满足if条件,执行b=b+a,此时b=1,接着执行break语句,终止循环,最后输出b=1。
20. 有以下程序
#include <stdio.h>
main( )
{ int a = 1, b = 1;
for( ; a–; )
b–;
printf(“%d,%d “, a, b);
}
程序运行后的输出结果是答案:D
A)1,1
B)0,0
C)-1,-1
D)-1,0
题目解析:for循环的判定条件为”a–“,即a先作为循环条件判定,然后再自减1。第一次循环判定条件为真,执行完毕后a=0,b=0,第二次循环判定条件为假,循环不成立,所以只执行判定表达式”a–“,所以最终a=-1,b=0。
21. 有以下程序
#include <stdio.h>
main( )
{ int a=1, b=0;
for(; a<5; a++)
{ if (a%2 == 0) break;
continue;
b += a;
}
printf(“%d “, b);
}
程序运行后的输出结果是答案:D
A)1
B)4
C)10
D)0
题目解析:break语句用于循环体,其作用是跳出当前层循环。所以该程序的逻辑是for循环中a从0循环到4,如果a能被2整除,则退出循环,故而b累加的是第一个不能被2整除的a的值,也就是a=1这一种情况,a=1时,b+=a,即b=0
22. 有以下程序
#include <stdio.h>
main( )
{ int i,j = 0;
char a[] = “How are you!”, b[10] = {0};
for (i=0; a[i]; i++)
if (a[i] == ‘ ‘)
b[j++] = a[i-1];
printf(“%s “, b);
}
程序运行后的输出结果是答案:B
A)Howareyou!
B)we
C)ay
D)we!
题目解析:for循环中判断条件是a中的空格,输出的是空格前的一个字符,即w和e。
23. 有以下程序
#include <stdio.h>
main( )
{ char w[20], a[5][10] = {“abcdef”, “ghijkl”, “mnopq”, “rstuv”, “wxyz”};
int i, j;
for (i=0; i<5; i++)
{ j = 0;
while (a[i][j] !=
24. 有如下程序
#include <stdio.h>
main( )
{
int i;
for (i=0; i<5; i++)
putchar(‘Z’ – i);
}
程序运行后的输出结果是答案:B
A)VWXYZ
B)ZYXWV
C)’X”Y”Z”W”V’
D)’ABCDE’
题目解析:for循环中,i从0开始取值,取到4。i=0时,’Z’ – i=Z,i=1时,’Z’ – i=Y,依次类推,得出结果。
25. 有如下程序
#include <stdio.h>
int sum_mod(int a, int b)
{
return a + b % 2;
}
main( )
{
int i;
for (i=0; i<5; i++)
printf(“%d”, sum_mod(i, 4));
printf(” “);
}
程序运行后的输出结果是答案:B
A)45678
B)01234
C)12345
D)43210
题目解析:for循环中,i从0开始取值,取到4。b%2是求b除以2的余数。i=0时,0+4%2=0,i=1时,1+4%2=1,i=2时,2+4%2=2,以此类推得出结果。
26. 有如下程序
#include <stdio.h>
int sum(int data)
{
static int init = 1;
return init += data;
}
main( )
{
int i;
for (i=1; i<=2; i++) printf(“%d,”, sum(i));
printf(” “);
}
程序运行后的输出结果是答案:A
A)2,4,
B)3,2,
C)1,3,
D)2,3,
题目解析:i=1时,即data=1,init=0,sum(i)=2;i=2时,即data=2,init=1,sum(i)=4。所以输出为2,4。
27. 有以下程序
#include <stdio.h>
main( )
{
int i = 4;
for ( printf(“%d”, i); i<2; i++) printf(“%d”, i);
printf(” “);
}
程序运行后的输出结果是答案:A
A)4
B)1
C)12
D)0
题目解析:for语句中各表达式是通过分号隔开的,通过表达式1确定循环初值,表达式2确定判断循环条件,表达式3可用于设置增值;现在表达式中条件不成立,即跳出该语句,紧接着输出为4。
28. 有以下程序
#include <stdio.h>
main( )
{
char ch = ‘B’;
while (ch < ‘E’)
{
printf(“%d”, ch – ‘A’);
ch++;
}
printf(” “);
}
程序运行后的输出结果是答案:A
A)123
B)012
C)abc
D)ABC
题目解析:该段程序判断的是输入字母和A之间ASCII码的差值,第一次为B,差值为1,第二次判断,此时输入为C,差值为2,第三次判断,输入为D,差值为3,再循环时,条件不成立,即输出为123。
29. 有以下程序
#include <stdio.h>
main( )
{
char ch = ‘M’;
while (ch != ‘K’)
{
putchar(ch);
ch –;
}
}
程序运行后的输出结果是答案:A
A)ML
B)OP
C)MK
D)mm
题目解析:分析程序段可知,该程序表示将输入字母和K之间的字母进行输出,输入为M,第一次执行while语句,输出为M,第二次执行while语句,输出为L,第三次执行时,条件不满足跳出,最终输出为ML。
30. 有以下程序
#include <stdio.h>
main( )
{
int i, k;
int array[4][2] = {{1,0}, {0}, {2,9}, {3}};
for (i=0; i<2; i++)
for (k=0; k<3; k++)
{
printf(“%d,”, array[k][i]);
}
printf(” “);
}
程序运行后的输出结果是答案:A
A)1,0,2,0,0,9,
B)1,2,0,1,4,1,
C)1,2,4,9,6,0,
D)2,9,0,0,1,4
题目解析:考察for循环语句中三个表达式的执行顺序,i=0时,i小于2成立,执行下一个for循环,k=0时,k小于3成立,执行,下一语句,即进行一次输出,输出为array[0][0]=1,i=1时,i小于2成立,执行下一个for循环,k=1,k小于3成立,执行下一语句,即进行一次输出,输出为array[1][1]=0,依次类推可得出全部输出结果。
31. 有以下程序
#include <stdio.h>
main( )
{
int i, *ptr;
int array[4] = {1,1,3,4};
for (ptr=array, i=0; i<3; i++) printf(“%d,”, *ptr++);
printf(” “);
}
程序运行后的输出结果是答案:B
A)1,2,4,
B)1,1,3,
C)1,3,4,
D)2,4,8,
题目解析:考察for循环中三个表达式的执行顺序。i=0时,i小于3成立,写入数组ptr中一次,即1;i=1时,i小于3成立,写入数组ptr中一次,即1,i=2时,i小于3成立,写入数组ptr中一次,即3,i=3时,i小于3不成立,跳出循环,输出数组ptr为1,1,3。
以下关于两个流程图特点的叙述正确的是答案:D
A)两个表达式逻辑相反时,流程图功能等价
B)语句2一定比语句1多执行一次
C)两个表达式逻辑相同时,流程图功能等价
D)语句2至少被执行一次
题目解析:图b中语句2是一开始就会执行的,即便表达式为假,图a中语句1是在表达式1为真才能够被执行,但这并不表示语句2一定比语句1多执行一次,当表达式1为真,表达式2为假时,语句1和2均至少被执行一次,表达式逻辑相同或相反,流程图功能都不能等价。
33. 设有定义:int sum=100,i;
以下选项中,能够实现 sum -=1+2+3…+10 的程序段是答案:C
A) i=1;
for( ;i<10;i++)
sum=sum-i++;
B) i=0;
while(i<>10)
sum=sum – ++i;
C) for(i=0;i<=10;)
sum=sum-i++;
D) i=0;
do
{
sum=sum-++i;
}while(i<=10);
题目解析:通过对题干的分析,do…while循环是先执行后判断,因此D选项中当i=10时,也会执行循环体中的语句,故先排除D项;A、B两个选项中,当i=10时,就不再执行循环语句了,故A、B两个选项也要排除。故本题答案选C)。
34. 有以下程序
#include<stdio.h>
main()
{
int i;
for(i=1;i<=10;i++)
{
if(i%3==0)
{ printf(“%d “,i);
continue;
}
if(i%5==0)
{
printf(“%d “,i);i++;
}
if(i%7==0)
{
printf(“%d “,i);i++;
break;
}
}
}
程序的运行结果是答案:C
A)3 3 3
B)3 6 9
C)3 5 7
D)4 6 8
题目解析:break语句用于循环体,可以跳出当前层循环,continue语句的作用则是跳过当前循环层余下未执行的语句,继续执行下一次循环。当i%3==0成立时,程序会跳出该语句,执行下一个if,即输出一个3,;当i%5成立时,程序跳出该语句,执行下一个if,即输出一个5;当i%7==0成立时,程序跳出该层循环,输出一个7;共输出为3,5,7。
35. 有如下程序
#include <stdio.h>
main()
{
int i,f=1,s=0;
for(i=1; i<100; i++)
{
s=s+f*i;
f=-f;
i++;
}
printf(“s=%d “,s);
}
程序的功能是答案:D
A)计算1*2*3*4*…*99的值
B)计算1*3*5*7*…*99的值
C)计算1-2+3-4+…-99的值
D)计算1-3+5-7+…-99的值
题目解析: for循环中是对s进行的递归运算,只是这里边有一个符号在变,循环次数为奇数为正,循环次数为偶数为负;i=1时,s=s+f*i=1,f=-f=-1;i=2时,s=s+f*i=-3,依次类推即可确定答案
36. 有下列程序
#include <stdio.h>
main( )
{ int a=-2, b=2;
for(; a++ , b–;)
printf(“%d,%d,”, a, b);
}
程序执行后的输出结果是答案:A
A)-1,1,0,0,
B)-1,1,
C)-1,1,-1,0,
D)-1,1,0,1,
题目解析: for循环中,判断条件为a++和b–是否为0,即循环到a和b均为0,所以输出为-1,1,0,0。
37. 有下列程序
#include <stdio.h>
main()
{ int a = 6, i;
for (i=1; i<=3; i++)
{ if (a<5) break;
if (a%2) { a += 2; continue; }
a = a + 4;
}
printf(“%d,%d”, i, a);
}
程序执行后的输出结果是答案:B
A)3,18
B)4,18
C)4,2
D)4,6
题目解析:a += 2等价于a=a+2,,i=1时,a=6,满足a可以整除2的条件,a=a+2=8;i=2时,满足a可以整除2的条件,a=10,依次类推,i=4时,a=a+2=14,跳出for循环,即a=a+4=18,所以输出为4,18。
38. 有下列程序
#include <stdio.h>
main( )
{
char b[] = “happynewyear”;
printf(“%s%s”, “12345678”+4, b+8);
}
程序执行后的输出结果是答案:C
A)52345678year
B)5678wyear
C)5678year
D)12345682year
39. 有如下程序
#include <stdio.h>
main()
{
char a = ‘0’, b = ‘A’;
int i;
for (i=1; i<6; i++)
{
if (i % 2 == 0) putchar(a + i);
else putchar(b + i);
}
}
程序运行后的输出结果是答案:D
A)A2A3B
B)2B4DF
C)B4CD7
D)B2D4F
题目解析:i=1时,i%2不等于0,执行putchar(b+i),即B,i=2时,i%2等于0,执行putchar(a+i),即2,依次类推,得出结果为B2D4F。
40. 有如下程序
#include <stdio.h>
main()
{
int i;
for (i=0; i<3; i++)
putchar(‘K’ – i);
}
程序运行后的输出结果是答案:B
A)012
B)KJI
C)KLM
D)LMN
题目解析: i=0时,小于3成立,执行putchar(‘K’ – i),即K,i=1时,小于3成立,执行putchar(‘K’ – i),即J,i=2时,小于3成立,执行putchar(‘K’ – i),即I,i=3时,小于3不成立,跳出for循环。
41. 有如下程序
#include <stdio.h>
int sum_3(int a, int b)
{
return a + b – 3;
}
main()
{
int i;
for (i=1; i<5; i++)
printf(“%d#”, sum_3(i, 3));
}
程序运行后的输出结果是答案:A
A)1#2#3#4#
B)4#5#6#7#
C)4#3#2#1#
D)0#1#2#3#
题目解析: i=1时,sum_3(i, 3)=1+3-3=1,输出为1#,依次类推得出结果为1#2#3#4#。
42. 有如下程序
#include <stdio.h>
int sum(int data)
{
static int init = 1;
return data += init++;
}
main()
{
int i;
for (i=1; i<=3; i++)
printf(“%d,”, sum(i));
}
程序运行后的输出结果是答案:C
A)2,3,4,
B)1,2,3,
C)2,4,6,
D)1,3,5,
题目解析:data += init++等价于data=init++ +data,i=1时,data=2,i=2时,data=2=4,i=3时,data=6,即输出为2,4,6。
43. 对于循环语句:for(i=0;i<=10;i++) { ; } 下面各选项的叙述中错误的是 答案:A
A)省略i=0,可引起无限循环
B)省略i++,可引起无限循环
C)省略i<=10,可引起无限循环
D)圆括号( )内三个表达式都省略,可引起无限循环
题目解析: i不从0取值开始,有限制条件i<=10,不会出现无限循环。
本章结束….