一、实训目标
循环结构是程序设计中重要的程序结构之一。通过本实训的练习,加深对 for 循环、while 循环、do…while 循环语句的理解,掌握循环结构的编程技巧和方法,避免在程序中出现死循 环,能够应用三种循环语句解决实际应用问题。
二、实训任务
(一)课内 2 学时完成
1.计算并输出表达式的值。 s=12+22+32+...+ n 2
【提示】从键盘上输入变量 n 的值,循环控制变量 i 的初值为 0,循环条件为 i<=n,循环 控制变量每次加 1。
程序运行后:
输入数据为:
10<回车>
输出结果为:
s=385
2.输出 2000~2100 年中所有的闰年,要求每行输出 10 个年号。
【提示】闰年的条件:能被 4 整除但不能被 100 整除或者能被 400 整除,即:i%4==0 &&
i%100!=0) || (i%400==0),满足这个条件则输出该年号,并统计闰年的个数,当每行输出够 10 个则输出回车换行。使用循环语句改变年号。
程序运行后:
输出结果为:
3.有 1020 个西瓜,第 1 天卖一半多两个,以后每天卖剩下的一半多两个,问几天以后 能卖完?用 while 循环实现。
【提示】有 1020 个西瓜,第 1 天卖一半多两个,剩下的西瓜数是(西瓜总数/22),第 2 天卖第 1 天剩下的一半多两个,第 2 天剩下的西瓜数是((西瓜总数/22)/22),依次类推,
卖完为止,统计卖西瓜的天数。设西瓜数为 x,循环条件为“x!=0” ,每天剩下的西瓜数可以 表示为:(x/22)。
程序运行后:
输出结果为:
需要 8 天卖完西瓜。
(二)课外 2 学时完成
1.按照从小到大,输入两个正整数,输出这两个数之间不能被 6 整除的数(每行输出 10 个数)。
【提示】设两个变量 m、n 存放输入的两个数,判断输入两个数的大小,m 中存小数,n 中存大数,利用循环输出 m、n 之间不能被 6 整除的数,表达式“i%6==0”表示可以被 6 整 除。利用计数器变量控制每行输出 10 个数。
程序运行后:
输入数据为:
请输入两个正整数:6 20<回车>
输出结果为:
7 8 9 10 11 13 14 15 16 17 19 20
2.有一堆零件(100~200 之间),若分成 4 个零件一组则多 2 个零件;若分成 7 个零件 一组则多 3 个零件;若分成 9 个零件一组则多 5 个零件,求这堆零件总数。
【提示】设零件数为 i,根据已给条件:若分成 4 个零件一组则多 2 个零件(i%4==2);若 分成 7 个零件一组则多 3 个零件(i%7==3);若分成 9 个零件一组则多 5 个零件(i%9==5),利用 循环 for(i=100;i<=200;i++)计算出满足条件的变量 i 的值,即为零件总数。
程序运行后:
输出结果为:
零件总数为:122
3.在某一黑夜一司机碰伤行人之后落荒而逃,经过警方调查,有三个目击者。甲说: “车 牌号的前 2 位相同” 。乙说: “车牌号的后 2 位加起来等于 6” 。丙说: “车牌号是一个 4 位数,
并且能被 2 整除” 。根据上述提供的线索,编写程序找出肇事车可能的车牌号。
【提示】经过分析,要找的车牌号为 4 位数,只能在 1000~9999 之间进行排查。排查条 件为:具有前 2 位相同,后 2 位加起来等于 6 的特点,并且能被 2 整除。设车牌号为 x,四位 数字分别为 a、b、c、d,条件可写为: “a==b && c+d==6 && x%2==0”
运行结果如下:
三、实训思考
1.指出语句 for(i=0;(c=getchar())!='\n';i+=c);的循环体?
2.如何理解 continue 语句?
3.“do x++ while(x==10);” 语句正确吗?若有错误,请修改。
习题 3-1
一、判断题
1.for 循环中的三个表达式可以省略第一个表达式。( ) 2.for 循环中的步长可以任意设定。( )
3.break 语句只适用于循环语句中。( )
4.continue 语句和 break 语句功能相同,都用于结束循环。( ) 5.语句 for(i=1;i!=0;)是正确的。 ( )
6.设 i,j,k 均为 int 型变量,执行下面的循环后,k 的值为 9。( ) for (i=0,j=10;i<=j;i++,j) k=i+j;
二、单项选择题
1.执行下列循环语句 for(k=1; k++<4; ); 后,变量 k 的值是________。
A.3 B.4 C.5 D.不定
2.下面语句的输出结果为________。
for(k=0;k<5;++k) { if(k= = 3)
continue;
printf("%d",k);
A.012 B.0124 C.01234 D.没有输出结果 3.循环语句 for (x=0; x<4;x++);的循环执行________。
A.无限次 B.不确定次 C.4 次 D.3 次
4.下面程序的功能是计算 1~50 之间可以是 7 的倍数的数值之和,请选择填空。
#include "stdio.h"
void main() { int i,sum=0;
for(i=1;i<=50;i++) if(________) sum+=i;
printf("%d",sum);
}
A.(int)(i/7)==i/7 B.(int)i/7==i/7 C.i%7=0 D.i%7==0 5.下面程序的功能是计算 1~10 之间的偶数之和,请选择填空。
#include "stdio.h"
void main() { int a,i;
a =0;
for(i=0;i<=10;i+=2) _________;
printf("偶数之和=%d\n",a);
}
A.a=i B.a=i+1 C.a=i++ D.a=a+1 6.下面程序的运行结果是_________
#include "stdio.h"
void main() { int i;
for(i=1;i<=5;i++) switch (i%5)
{ case 0: printf ("*");break;
case 1:printf("#");break;
default:printf("\n");
case 2: printf("&");
} }
A.#&&&* B.#& C.# D.#&
& &
&* & *
&
* 三、填空题
1.下面程序的功能是:输出 100 以内(包括 100)个位数为 6 并且能被 3 整除的所有数。
#include "stdio.h"
void main() { int k,j;
for(k=0; ________; k++) { j=k*10+6;
if( ________ ) continue;
printf("%d\n",j);
} }
2.下面程序的功能是:计算 13+57+…99+101 的值。
#include "stdio.h"
void main() { int k,t=1,s=0,m;
for(k=1; k<=101; k+=2) { ________;
s=s+m;
________;
}
printf("%d\n",s);
}
3.下面是实现输出九九乘法表的程序,在画线的位置填上适当的语句,使该程序完整。
#include "stdio.h"
void main() { int i, j, k;
for(i=1;________; i++) {
for(________; j<=i ; j++) printf("%d*%d=%d",________);
printf(_________);
} }
4.根据给出的程序段,请写出正确的结果。
x=1;
p=1, sum=0 ; for (x=1; x<=5; x++) { p=p*x;
sum=sum+p;
}
上面的程序段实现的功能是计算下面的式子________;
其运行结果为_________。
5.下面程序运行后的输出结果是_________。
#include "stdio.h"
void main() { int i,j,p,s;
s=0; { int i,x,max,min;
scanf("%d",&x);
________;
for(i=2;i<=10;i++) { scanf("%d",&x);
if (x>max) ________;
if (x<min) ________;
}
printf("max=%d min=%d\n",max,min);
}
7.输出 20~30 之间不能被 2 整除的数。填空,将程序补充完整。
#include "stdio.h"
{ int n1=100,n2=50,n3=10;
float k;
________;
for(k=1;_________;k++) s1=s1+k;
for(k=1;k<=n2;k++) s2=s2+k*k;
for(k=1;k<=n3;k++) s3=s3+1/k;
printf("总和=%8.2f\n",________);
}
习题 3-2
一、判断题
1.do_while 的循环体不能使用复合语句。( ) 2.while 的循环体至少执行一次。( )
3.如果 a 为 3,则语句“while(a) a;”执行的循环次数是 3 次。( ) 4.下列程序段的功能是求 5 的阶乘。( )
s=k=1;
while(k<6) s*=k++;
5.如果“条件 e”不成立,则语句 s 至少执行 1 次。( ) do
s;
while(e);
6.while、do while、for 三种循环形式可以互相嵌套。( ) 7. “do 语句 while(条件) ”必须使用 break 语句退出循环。( ) 8.当条件为 0 时将结束“do 语句 while(条件) ”循环。( ) 二、单项选择题
1.在执行以下程序时,如果从键盘上输入,ABCdef<回车>,则输出为________。
#include"stdio,h"
void main() { char ch;
while((ch=getchar())!='\n') { if(ch>='A' && ch<='Z')
ch=ch+32;
else if(ch>='a' && ch<='z') ch=ch32;
printf("%c",ch); }printf("\n"); }
A.ABCdef B.abcDEF C.abc D.DEF
2.下面程序的输出结果是_________。
#include "stdio.h"
void main() { int x=23;
do
{ printf("%d",x); } while(!x);
}
A.321 B.23 C.死循环 D.不输出任何内容
3.执行下面程序段后的输出结果是________。
int k=1, a=0, b=1;
do { a=a+b*k;
b= b;
k++;
} while (a>=0);
printf("%d",a);
A.1 B.0 C.1 D.2
4.下面程序的输出结果是________。
#include "stdio.h"
void main() { int x=3;
do {
printf("%d\n",x=2);
}while(!(x)); }
A.输出的是 1 B.输出的是 1 和2
C.输出的是 3 和 0 D.是死循环 5.有如下程序段,则正确的执行结果是________。
int m=3;
while(m<=5) { printf("%d",m3);
m++; }
A.0 0 0 B.0 1 2 C.1 2 3 D.无结果
6.下面程序的功能是将从键盘输入的一对数,由小到大排序输出。当输入一对相等数时 结束循环,请选择填空。
# include "stdio.h"
void main() { int a,b,c;
scanf ("%d%d",&a,&b);
while (_________) { if (a>b)
{ t=a;a=b;b=t; } printf ("%d,%d\n",a,b);
scanf ("%d%d",&a,&b);
}
}
A.!a=b B.a!=b C.a==b D.a=b 7.C 语言中 while 和 dowhile 循环的主要区别是_________。
A.dowhile 的循环体至少无条件执行一次
B.while 的循环控制条件比 dowhile 的循环控制条件严格 C.dowhile 允许从外部转到循环体内
D.dowhile 的循环体不能是复合语句 8.以下描述中正确的是_________。
A.dowhile 循环中循环体语句只能是一条可执行语句
B.dowhile 循环由 do 开始,在 while(表达式)后面不能写分号 C.在 dowhile 循环体中,一定有能使 while 表达式为“假”的操作 D.dowhile 循环中,根据情况可以省略 while
9.以下程序段_________。
x=1;
do { x=x*x; } while (!x);
A.是死循环 B.循环执行两次 C.循环执行一次 D.有语法错误 10.下面程序段输出的是________。
int x=3;
do
{ printf ("%d\n",x=2;
} while (!( x));
A.1 B.1 和2 C.3 和 0 C.是死循环 11.下面程序的输出结果是________。
#include "stdio.h"
void main() { int n=9;
while(n>6) { n;
printf("%d",n);
} }
A.987 B.876 C.8765 D.9876 12.以下说法正确的是________。
A.continue 和 break 只能用在循环体中 B.continue 只能用在循环体中 C.break 只能用在循环体中 D.continue 只能用在循环体外 三、填空题
1.设有整型变量 k=4,则语句“while(k) k;”执行的循环次数是________。
2.dowhile 的循环体至少执行________次。
3.下面程序运行后的输出结果是_________。
#include "stdio.h"
void main() { int x=25;
while(x>20 && x<30) { x++;
if(x/6) { x++;
break; } else continue;
}
printf("%d\n",x);
}
4.下面程序是计算 10 个整数中奇数的和及其偶数的和,请填空。
#include <stdio.h>
void main() { int a,b,c,i;
a=c=0;
for(i=1;i<=10;i++) { scanf("%d",&b);
_____________
_____________ } printf("%d\n",a);
printf("%d\n",c);
}
5.下面程序的功能是:输出 100 以内(不包含 100)能被 3 整除且个位数为 6 的所有整 数,请填空。
#include<stdio.h>
void main() { int i;
for(i=1; _________; i++) if___________
}
6.下列程序段中循环体执行的次数是_________。
n=1234;
do{
n/=10;
}while (n);