i=i0+1;
练习题5及参考答案
if (i==20) break; }
B. for (i=1;;i++) sum=sum+1; 1. 单项选择题
C. k=0; do (1)语句while (!e);中的条件!e等价于 。
{ A. e==0
B. e!=1
C. e!=0
++k;
D. ~e
} while (k<=0); 【答】!e等价于!(e!=0),即e==0。本题答案为A。
D. s=3379;
(2)下面有关for循环的正确描述是 。
while (s++%2+3%2) A. for循环只能用于循环次数已经确定的情况 s++; B. for循环是先执行循环体语句,后判定表达式 【答】A C. 在for循环中,不能用break语句跳出循环体
D. for循环体语句中,可以包含多条语句,但要用花括号(7)与以下程序段等价的是____。 括起来
while (a) 【答】D
{
(3)C语言中 。
if (b) continue; A. 不能使用do-while语句构成的循环
c; B. do-while语句构成的循环必须用break语句才能退出 }
C. do-while语句构成的循环,当while语句中的表达式值A. while (a)
为非零时结束循环
{ if (!b) c; }
D. do-while语句构成的循环,当while语句中的表达式值C. while (c)
为零时结束循环
{ if (b) c; }
【答】D
c; } (4)C语言中while和do-while循环的主要区别【答】A
是 。
(8)以下程序的输出结果是____。 A. do-while的循环体至少无条件执行一次
#include
main() C. do-while允许从外部转到循环体内 {
D. do-while的循环体不能是复合语句
int i;
【答】A
for (i=4;i<=10;i++) (5)以下程序段 。 {
int x=-1; if (i%3==0) continue; do printf(\{
} x=x*x; } }
A. 45
B. 457810 while (!x);
D. 678910
A. 是死循环
B. 循环执行二次
【答】B
C. 循环执行一次
D. 有语法错误
(9)以下程序的输出结果是____。 【答】C
#include
main() A. i=100;
{
while (1) int num=0; { while (num<=2) {
25
B. while (c)
D. while (a)
{ if (b) break;
C. 69
{ if (!b) break; c; }
num++;
printf(\ } } A. 1
B. 1
C. 1
D. 1
2
2 2
3
3
4
【答】C
2. 填空题
(1)以下程序的运行结果是____。 #include
int s=0,k; for (k=7;k>=0;k--) {
switch(k) {
case 1: case 4:
case 7: s++; break; case 2: case 3: case 6: break; case 0:
case 5: s+=2; break; } }
printf(\}
【答】s=7
(2)以下程序的运行结果是 。
#include
if (s%7==0)
continue; else
++i;
} while (s<15); printf(\
}
【答】执行第1次循环时,i++返回1,i=2,s=3+1=4,执行else部分,i=3;执行第2次循环时,i++返回3,i=4,s=4+3=7,执行if部分;执行第3次循环时,i++返回4,i=5,s=7+4=11,执行else部分,i=6;执行第4次循环时,i++返回6,i=7,s=11+6=17,执行else部分,i=8,此时while条件不满足,退出循环。所以输出结果为:8。
(3)以下程序的运行结果是____。 #include
int i,j;
for (i=4;i>=1;i--) {
printf(\
for (j=1;j<=4-i;j++) printf(\ printf(\ } }
【答】使用两重循环。本题答案为:
* ** *** ****
(4)以下程序的运行结果是____。 #include
int i,j,k;
for (i=1;i<=6;i++) {
for (j=1;j<=20-2*i;j++) printf(\ for (k=1;k<=i;k++) printf(\ printf(\ } }
【答】使用两重循环。本题答案为: 1 2 2 3 3 3
26
4 4 4 4 5 5 5 5 5 6 6 6 6 6 6
(5)以下程序的运行结果是____。 #include
int i,j,k; for (i=1;i<=6;i++) {
for (j=1;j<=20-3*i;j++) printf(\ for (k=1;k<=i;k++) printf(\ for (k=i-1;k>0;k--) printf(\ printf(\ } }
【答】使用两重循环。本题答案为: 1 1 2 1 1 2 3 2 1 1 2 3 4 3 2 1 1 2 3 4 5 4 3 2 1 1 2 3 4 5 6 5 4 3 2 1 (6)以下程序的运行结果是____。 #include
int i,j,k; for (i=1;i<=4;i++) {
for (j=1;j<=20-3*i;j++) printf(\ for (k=1;k<=2*i-1;k++) printf(\ printf(\ }
for (i=3;i>0;i--) {
for (j=1;j<=20-3*i;j++) printf(\ for (k=1;k<=2*i-1;k++) printf(\ printf(\ } }
【答】使用两重循环。本题答案为:
* * * * * * * * * * * * * * * * * * * * * * * * *
3. 编程题
(1)编写一个程序,求
之值。【解】使用一个for循环即可。程序如下: /*文件名:exci5_1.cpp*/ VC++6.0 #include
int i; float s; s=0;
for (i=1;i<=100;i++) {
if (i%2==0)
/*i为偶数*/
s=s-1.0/i; else
/*i为奇数*/
s=s+1.0/i; }
printf(\}
程序运行结果: s=0.688172
(2)编写一个程序,求s=1+(1+2)+(1+2+3)+?+(1+2+3+?+n)的值。
【解】采用两层循环求解,外层i从1到n,里层从1到i。程序如下:
/*文件名:exci5_2.cpp*/ VC++6.0 #include
/* 求1+ ? +i */
for (j=1;j<=i;j++)
27
}
}
s1=s1+j; }
do {
d=n; printf(\n=n/10;
s=s+s1;
printf(\
(3)编写一个程序,对用户输入的字符流(以Ctrl+Z结束)中的行、单词和字符个数进行统计。
【解】用nc、nl和nw分别统计字符个数、行数和单词数。使用lnword作为单词开始与否的标记,开始时为0。lnword=0表示一个单词可以开始计数,为了使一个单词只计一次,在遇到单词的第一个字符后让lnword为1。程序如下: /*文件名:exci5_3.cpp*/ #include
(4)编写一个程序,用户输入一个正整数,把它的各位数字前后颠倒一下,并输出颠倒后的结果。
【解】对于正整数n,从高位到低位依次计算出它的各位上的数字d,在计算出d后立即输出该数字,输出序列构成的数正好是n的各位数字前后颠倒的结果。程序如下: /*文件名:exci5_4.cpp*/ #include
int n,d;
printf(\输入一个正整数:\scanf(\printf(\颠倒结果:\
28
VC++6.0 int c,nl,nw,lnword,nc; lnword=NO; nl=1;nw=nc=0;
while ((c=getchar())!=EOF) /*按Ctrl+Z输入结束*/ { }
printf(\字符个数:%d,行数:%d,单词个
nc++;
if (c=='\\n') nl++; /*增加一行*/
if (c==' ' || c=='\\n' || c=='\\t') lnword=NO; /*else if (lnword==NO) { }
lnword=YES;++nw;
VC++6.0 } while (n!=0); printf(\
(5)编写一个程序,求输入的三个正整数的最小公倍数。 【解】采用穷举法求解。输入三个整数分别为x,y和z,该最小公倍数一定是x的倍数。程序使用while循环,倍增x查找满足s % y == 0 && s % z == 0条件的s。程序如下: /*文件名:exci5_5.cpp*/ #include
(6)编写一个程序,求出200到300之间的数,且满足条件:它们三个数字之积为42,三个数字之和为12。
【解】采用穷举法求解。使用两重for循环嵌套语句,i、j、k分别表示该数的百位数、十位数、个位数,i只能是2,j和k进行循环。程序如下: /*文件名:exci5_6.cpp*/ #include
(7)编写一个程序,求出满足下列条件的四位数:该数是个完全平方数,且第一、三位数字之和为10,第二、四位数字之积为12。 【解】采用穷举法求解。该数是一个四位数,其平方数只能在32到99之间,使用一个for循环即可。程序如下:
int i,j,k; i=2;
for (j=0;j<=9;j++)
for (k=0;k<=9;k++)
if (i*j*k==42 && i+j+k==12)
printf(\
VC++6.0 int x,y,z,s;
printf(\输入三个整数=>x,y,z:\scanf(\s=x; while (1) { }
printf(\最小公倍数:%d\\n\
if (s%y==0 && s%z==0)
break; s+=x;
VC++6.0 不计空白符*/
数:%d\\n\