}
if(flag==1) printf(\else printf(\
}
说明:
(1) 此程序中增加了一个头文件“math.h”,这是因为在使用sprt函数(求平方根)时需要这一头文件。
(2) 在程序的开始处利用了do-while循环语句来处理读键盘过程,这是为了保证所读入的数据是一个大于2的整数,如果不满足这一条件,将重复读操作,一直到读入的数据满足条件为止。
(3) 程序中的flag变量是用于设置标志的,当flag=1时,说明n不满足素数条件,最后通过对flag的判断来显示相应的提示信息。正确地使用标志变量,对程序设计会带来方便。
一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。
三种循环(while循环、do-while循环和for循环)可以相互嵌套。例如: (1) while( )
{
……;
for( ; ; ) {……;} }
(2) for( ; ; ) {
……; do {……;
}while( ); }
【例6-18】求100~200之间的所有素数
在例6-17的基础上,对本题用一个嵌套的for循环即可处理。程序如下: #include\#include\main () {
int n, m, i, flag;
for(n=101;n<=200;n=n+2) { m=sqrt(n); flag=0; for(i=2;i<=m;i++) {
16
}
if(n%i==0) { flag=1; break; } }
if(flag==0) printf(\
}
程序运行结果:
101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199
循环变量n代表被检测的数,从101变化到200。在每一次循环中,又内嵌一个for循环,用来检测当前的n是否素数,这个内嵌循环的循环变量是i,它从2变化到m。
【例6-19】输出下三角形式九九乘法表。 1 2 3 4 5 6 7 8 9 1 1 2 2 4 3 3 6 9
4 4 8 12 16 ……
9 9 18 27 36 45 54 63 72 81
对这样表格形式的输出,可以用多次循环来解决。用外层循环来控制行,如: for(i=1;i<=9;i++)
用内层循环来控制列,如: for(j=1;j<=i;j++) 程序如下: #include\main () {
int i,j;
printf(\ ***九九乘法表***\\n \ /*输出表头*/
for(i=1;i<=9;i++) /*外层循环,控制行*/ printf(\ printf(\
for(i=1;i<=9;i++) /*内层循环,控制列*/ {
printf(\ for(j=1;j<=i;j++) printf(\ printf(\ } }
【例6-20】求Fibonacci数列的前50项。Fibonacci数列的第一项为1,第二项为1,
17
从第三项开始,每项等于前两项之和。
我们可以引入三个变量f1、f2和f,分别存放数列的前两项和当前项,其中f=f1+f2。用一个循环来求解数列的前50项,每次求下一项时,令f1=f2,f2=f,f=f1+f2。程序如下:
#include\main () {
int i;
long f1=1,f2=1,f; /*数字较大,可能超出整数范围,定义为长整型*/ printf(\输出数列的前两项*/ for(i=3;i<=30;i++) { f=f1+f2; printf(\ f1=f2; /*这两行为下一次循环作准备*/ f2=f; } }
本章小结
循环结构的设计,是程序设计的重要组成部分,也是等级考试的一个重要考点。
while循环和do-while循环是两种形式非常相近的循环结构,都是当循环条件满足时执行循环体。它们之间的主要区别是:
while循环先检测循环条件然后再决定是否执行循环体;而do-while循环先执行一次循环体再检测循环条件,根据检测结构决定是否继续执行循环体。
for循环相对上述两种循环结构而言功能更加强大,在for语句中可包含三个表达式,习惯用法是用表达式1来实现变量初始化,用表达式2来作循环条件判断,用表达式3作循环变量的自增自减。
用if和goto语句组合也可以构成循环,但这种方法不符合结构化程序设计准则,因此并不提倡。
解决同一问题可以采用上述各种循环结构,一般来讲它们之间可以互相代替使用。在一个循环的循环体中可以嵌入另一个循环结构,这就是循环的嵌套。循环嵌套的层数并没有限制,但层数过多会使可读性变差,一般嵌套层数不宜超过3层。
continue语句只能出现在循环体中,它的作用是终止本次循环转而开始进行下一次循环;和continue语句相对应的break语句的作用是终止循环,并跳出当前循环结构。 习题:
1. 比较while语句、do-while语句和for语句的异同. 2. 阅读下列程序,指出运行结果: main( ) { int x=3; do { printf(\ }while(!(--x)); }
18
3. 阅读下列程序,指出运行结果: main( ) {
int j=0,k=0,a=0; while(j<2) { j++; a++; k=0; }
while(k<=3) { k++; if(k%2!=0) continue; a++; } a++;
printf(\ }
4. 阅读下列程序,指出运行结果:
main( ) { int i;
for(i=0;++i;i<5) { if(i==3) { printf(\ break; } printf(\ } }
5. 阅读下列程序,指出运行结果: main( ) {
int a,b;
for(a=1,b=1;a<=100;a++) { if(b>=20) break; if(b%3==1)
19
{ b+=3; continue; } b-=5; }
printf(\
}
6. 阅读下列程序,指出运行结果: main( ) {
int i,a=0;
for(i=1;i<=5;i++) { do { i++; a++; }while(i<3); } i++;
printf(\}
7. 已知有如下计算公式:
π≈4*(1/1-1/3+1/5-1/7+……)
下列程序就是根据这一公式计算圆周率的。其中,精度控制在0.00001;变量s表示当前符号项,item表示当前项,n表示当前项的序号。阅读程序,并填空: #include \ main( ) {
float pai=0.0,item=1.0,s=1.0; int n=1;
while( ) { pai+=item; s=-s; item=s/(2*n+1); }
pai=4*pai;
printf(\ }
8. 编写程序,求1000以内奇数的和。
9. 编写程序,求任意两个整数之间所有的素数。
20
10. 编写程序,以上三角形式输出九九乘法表。
11. 编写程序,求1!+2!+3!+……+n!。n从键盘输入。
12. 一球从100米高空自由落下,每次落地后反跳回原高度的一半,再落下,求它在第十次落地时,共经过多少米,第十次反弹多高?
21