07循环控制.docx

上传人:b****6 文档编号:6037948 上传时间:2023-01-03 格式:DOCX 页数:9 大小:18.54KB
下载 相关 举报
07循环控制.docx_第1页
第1页 / 共9页
07循环控制.docx_第2页
第2页 / 共9页
07循环控制.docx_第3页
第3页 / 共9页
07循环控制.docx_第4页
第4页 / 共9页
07循环控制.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

07循环控制.docx

《07循环控制.docx》由会员分享,可在线阅读,更多相关《07循环控制.docx(9页珍藏版)》请在冰豆网上搜索。

07循环控制.docx

07循环控制

第七讲 第六章循环控制

内容:

§6.5 循环嵌套

§6.6  break和continue语句

§6.7  循环结构程序举例

§6.5 循环的嵌套

一、循环的嵌套

   在一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。

二、循环嵌套结构的执行

   外循环每执行一次,内循环执行一个周期。

三、while循环结构、do-while循环结构、for循环结构可以相互嵌套。

例1输出一个图形。

    *

   ***

  *****

 *******

main()

{inti,j,k;

 for(i=1;i<=4;i++) /*控制输出图形的行数,外循环体中共有三个语句*/

 {for(j=1;j<=20-i;j++) /*内循环的第一个语句为循环体,实现连续输出若干个空格*/

     printf("");

   for(k=1;i<=2*i-1;i++)/*内循环的第二个语句为循环体,实现连续输出若干个星号*/

     printf("*");

   printf("\n");/*内循环的第三个语句输出回车换行符*/

 }

}

§6.6 break语句和continue语句

一、break语句

1.格式:

break;

2.功能:

提前结束循环,从循环体中无条件跳出来,转到循环语句后面的语句执行。

3.注意:

该语句只能用于switch语句和循环语句(for、while、do-while语句)中,不能用于其它语句中。

二、continue语句

1.格式:

continue;

2.功能:

结束本次循环,即不再执行循环体中continue后面的语句。

在for循环结构中,跳转到计算表达式3的值,而后再计算表达式2的值以决定是否继续执行循环体;在while循环结构或do-while循环结构中,跳转到计算表达式的值,以决定是否继续执行循环体。

3.注意:

该语句只能用于循环语句(for、while、do-while语句)中,不能用于switch语句和其它任何语句中。

三、二者区别

 break终止循环,不再进行条件判断;continue只结束本次循环,而不是终止循环的执行。

以上两个语句都不能用于if和goto构成的循环语句中。

§6.7 循环结构程序举例

例1.(教材P116例6.6)程序的功能是:

求π的近似值,直到最后一项绝对值小于0.000001

  π        1     1     1 

 ——=1-——+——-——…… 

  4         3     5     7

#include"math.h"/*要使用数学函数,必须包含math.h头文件*/

main()

{ints=1;/*变量s用来存放每项的系数*/

 floatpi=0,n=1;/*变量pi用来存放总和,n用来存放项数*/

 while(1/(2*n-1)>=1e-6)/*循环结束条件是当项值的绝对值小于0.000001*/

 {pi=pi+s/(2*n-1);

 n++;

 s=-s;/*实现s的+1和-1交替出现*/

 }

 pi=pi*4;

 printf("%fpi=%10.6f\n",n,pi);

}

程序运行结果如下:

500001.000000pi=3.141594

   想一想,如果将while(1/(2*n-1)>=1e-6)改为while(1/(2*n-1)>=1e-4,程序的结果会有什么变化?

该程序还可以进行如下改动,运行结果不变。

#include"math.h"

main()

{ints=1;

 floatpi=0,n=1,t=1;/*变量n存放项值的分母,变量t存放项值并为它赋值为1*/

 whilefabs(t)>=1e-6)

 {pi=pi+t);

 n=n+2;

 s=-s;

 t=s/n;/*计算下一个项值*/

 }

 pi=pi*4;

 printf("%fpi=%10.6f\n",n,pi);

}

想一想,将语句子floatpi=0,n=1,t=1;改为floatpi=1,n=1,t=0;可以吗?

例2(教材P116例6.7)Fabonacci数列求值问题。

数列的各项值分别为:

1,1,2,3,5,8,……,求它的前40个项值。

即这个数列的第1项和第2项值都是1,从第3项开始,每一个项值都是它的相邻前2项的项值之和。

这是一个兔子繁殖问题,如果每一对小兔子都在出生后两个月后繁殖一对小兔子,设第一个月有一对兔子,问第n个月时有多少对兔子。

main()

{longf1,f2;/*注意到这两个变量不能再用整型,而要用长整型*/

 inti;

 f1=1;f2=1;/*变量f1和f2存放最近算出的两个项值*/

 for(i=1;i<=20;i++)

 {printf("%12ld%12ld",f1,f2);/*输出已经计算出的项值,每循环输出2个*/

 if(i%2==0)printf("\n");/*此语句的作用是实现换行,保证每行输出4个数据*/

 f1=f2;/*项值移动,以后代前*/

 f2=f1+f2;/*计算下一个项值*/

 }

}

程序运行结果如下:

1        1        2        3

5        8        13       21

34       55       89       144

233      377      610      987

1597     2584     4181     6765

10946    17711    28657    46368

75025    121393   196418   317811

514229   832040   1346269  2178309

3524578  5702887  9227465  14930352

24157817 39088169 63245986 102334155

想一想,如果想每行输出6个数据,程序该怎样修改?

该例题的程序还可以这样实现:

main()

{longf1,f2,t;/*使用变量t作为临时存储单元,存放有用的数据*/

 inti;

 f1=1;f2=1;

 printf("\n%12ld%12ld",f1,f2);/*循环体外先输出,下面的循环体内就先计算*/

 for(i=2;i<40;i++)

 {if(i%4==0)printf("\n");/*保证每行输出4个数据,注意和上段程序的区别*/

 t=f1;/*用临时单元存放f1的值*/

 f1=f2;/*项值移动,以后代前*/

 f2=f1+t;/*计算下一个项值*/

 printf("%12ld",f2);/*每次输出一个项值,注意i的终值为40*/

 }

}

例3(教材P118例6.8)判断m是否为素数,算法N-S流程图参见教材P118。

程序如下:

/*输入一个整数m,判断该数是否为素数*/

#include"math.h"

main()

{intm,i,k; 

 scanf("%d",&m);/*输入待判断的数m*/

 k=sqrt(m);/*计算m的正平方根*/

 for(i=2;i<=k;i++)

  if(m%i==0)break;/*已经可以得到m不是素数的结论,结束循环*/

 if(i>=k+1)printf("\n%d是素数\n",m);/*根据循环结束后i值与k值的大小来决定m是否为素数*/

 elseprintf("\n%d不是素数\n",m);

}

程序运行结果如下:

分别输入2、3、4、12、13、36、49、37等数,结果为:

2是素数

3是素数

4不是素数

12不是素数

13是素数

36不是素数

49不是素数

37是素数

请一定要认真考虑按i>=k+1来判断素数的原因。

该程序还可以这样实现:

#include"math.h"

main()

{intm,i,flag=0;/*定义一个变量flag作为标志,flag==0,标志m是素数*/

 floatk;

 scanf("%d",&m);/*输入待判断的数m*/

 k=sqrt(m);/*计算m的正平方根*/

 for(i=2;i<=k;i++)/*注意此处循环结束的条件,该条件改为i

 if(m%i==0){flag=1;break;}/*m不是素数,flag置1,结束循环*/

 if(flag==0)printf("\n%d是素数\n",m);/*按flag的值决定m是否为素数*/

 elseprintf("\n%d不是素数\n",m);

}

例4(教材P118例6.9)求100~200之间的所有素数

   注意到这个例题与上个例题既有相同之处,又有不同之处。

可以在上个程序的基础上进行改进,以实现题目的要求。

#include"math.h"

main()

{intm,i,k,n=0;/*变量m为待判断的数,变量n为计数器,统计素数的个数以控制输出*/

 for(m=101;m<=200;m=m+2)

 {if(n%10==0)printf("\n");/*按素数个数n决定是否换行*/

 k=sqrt(m);/*注意该语句的位置,一定要在m循环体内,对每个m都重新计算k*/

 for(i=2;i<=k;i++)

   if(m%i==0)break;

 if(i>=k+1)

 {printf("%d",m);/*如果是素数,就输出其值;否则,不输出*/

  n++;}/*注意这个语句的位置,m为素数则n加1*/

 }

}

程序运行结果如下:

101103107109113127131137139149

151157163167173179181191193197

199

该程序还可以这样实现:

#include"math.h"

main()

{intm,i,k,n,flag=0;/*变量flag是一个标志,flag==0标志m是素数*/

 printf("\n");

 n=0;

 for(m=100;m<=200;m++)/*此句改为(m=101;m<=200;m=m+2)也行,速度要快一些*/

 {flag=0;/*标志变量flat一定要放在外层for循环之内赋值为0*/

 k=sqrt(m);

 for(i=2;i<=k;i++)

   if(m%i==0){flag=1;break;} 

 if(flag==0)/*按flag的值判断m是否为素数*/

 {if(n%5==0)printf("\n");/*每行输出5个数据*/

  printf("%8d",m);/*输出格式字符使用%8d是为了输出格式清晰*/

  n++;}

 }

}

程序运行结果如下:

101103107109113

127131137139149

151157163167173

179181191193197

199

例5(教材P119例6.10)译电码:

将字母A变成字母E,字母a变成e,即变成其后的第四个字母,W变成A,X变成B,Y变成C,Z变成D。

非字母不变。

实现上述功能的程序如下:

#include"stdio.h"/*调用字符函数getchar()等字符函数时,必须包含此头文件*/

main()

{charc;

 while((c=getchar())!

='\n')/*从键盘上输入一个字符并赋给变量c后进行判断,注意此句括号的使用*/

 {if((c>='A'&&c<='Z')||(c>='a'&&c<='z'))

   c=c+4;/*字符加4后就成为其后的第四个字符*/

 if(c>'Z'&&c<='Z'+4||c>'z')/*注意此处是对加4后的字符进行判断*/

   c=c-26;

 printf("%c",c);

 }

}

   注意一下第2个if语句中判断条件的设置,如果使用:

if(c>'Z'&&c<='Z'+4||c>'z'&&c<='z'+4)与上面的程序(即教材上的程序)运行结果是否相同?

结合教材附近录Ⅰ想一想。

上面的程序还可以这样实现:

#include"stdio.h" 

main()

{charc;

 while((c=getchar())!

='\n') 

 {if((c>='A'&&c<='Z'-4)||(c>='a'&&c<='z'-4))

   c=c+4;/*字符加4后就成为其后的第四个字符*/

 elseif(c>'Z'-4&&c<='Z'||c>'z'-4&&c<='z') 

   c=c-22;/*即c=(c+4)-26*/

 printf("%c",c);

 }

}

   注意这个程序中的if-elseif结构的使用与上个程序中两个if语句的使用的区别。

   在本章学习中,请一定要注意花括号的使用。

对每一对花括号,都要弄清是哪个语句要求的花括号,去掉这个花括号可以吗?

去掉之后,程序运行的情况会发生什么变化?

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1