第6章 循环结构.ppt_第1页
第6章 循环结构.ppt_第2页
第6章 循环结构.ppt_第3页
第6章 循环结构.ppt_第4页
第6章 循环结构.ppt_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,第6章 循环结构设计,2,本章主要内容,C语言中的三种循环语句: while语句(当型) dowhile语句(直到型) for语句(当型) 循环体中的辅助控制语句: break语句 continue 语句 goto 语句,本章是 全书的重 点和难 点!,3,while 语句“当型”循环结构,一般形式: while (表达式)语句 说明: “表达式”为循环条件;“语句”为循环体。 特点: 先判断表达式,后执行语句,图6_1,4,【例6.1】求,图6_2,5,main() int i=1,sum=0; while(i=100) sum=sum+i; i+; printf(%d n,sum);

2、,编程求解:1+2+3+100?,“i1”可否换成:“i0”,6,注意:,while语句中的“表达式”(即判断条件)可以是任意的表达式,但一般为关系表达式或逻辑表达式。 循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现。 在循环体中应有使循环趋向于结束的语句,以免形成死循环。 允许循环体以空语句形式出现。,7,【例6.2】求2n。,main() int i=1,n; long int p=1; scanf(%d, ,图6_3,8,dowhile 语句“直到型”循环结构,一般形式: do 语句 while (表达式); 特点: 先执行一次指定的循环内嵌语句,然后判断条件表达式

3、。,图6_4,9,【例6.3】,#include main() char c; do c=getchar(); if(c=A ,将键盘输入字符中所有大写字母转换为小写字母,其他字符不变。,10,for 语句“当型”循环结构,一般形式: for(表达式1;表达式2;表达式3)语句 说明: 表达式1:循环变量赋初始值 表达式2:循环条件 表达式3:循环变量增值 语句:循环体,图6_5,11,【例6.4】求 。(改【例6.1】),main() int i,sum=0; for(i=1;i=100;i+) sum=sum+i; printf(%d n,sum); ,12,三种循环的比较:,三种循环都可

4、以用来处理同一问题,一般情况下它们可以互相代替。 用while和do while循环时,循环变量初始化的操作在while 和do while语句前完成;for语句可以在表达式1中完成。,13,三种循环的比较(续):,while和do while循环只在while后面指定循环条件,且在循环体中应包含使循环趋于结束的语句;for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中,功能更强。 while 和for循环是先判断表达式,后执行语句;do while循环是先执行语句后判断表达式。,14,循环的嵌套,定义: 一个循环体中又包含一个完整的循环结构,称为循环

5、的嵌套。 说明: while 循环、do while循环和 for循环都可以进行嵌套,而且可以相互嵌套。,15,几种合法的嵌套结构:,16,使用循环嵌套时注意:,要保证嵌套的每一层循环在逻辑上都是完整的,避免嵌套交叉使用。 要保证循环到最后有一个跳出循环的条件,否则会产生死循环(嵌套循环中检查死循环错误,相对来说比较困难)。 在编程时,注意循环嵌套的书写最好用阶梯缩进的形式,可使程序层次分明。,17,main() int i,j; printf(n ); for(i=1;i=9;i+) printf(%4d,i); printf(n-); for(i=1;i=9;i+) printf(n%4d

6、,i); for(j=1;j=i;j+) printf(%4d,i*j); ,【例6.5】输出九九表。,1 2 3 4 5 6 7 8 9 - 1 1 2 2 4 3 3 6 9 4 4 8 12 16 5 5 10 15 20 25 6 6 12 18 24 30 36 7 7 14 21 28 35 42 49 8 8 16 24 32 40 48 56 64 9 9 18 27 36 45 54 63 72 81,18,习题6.1 输入两个正整数,求其最大公约数和最小公倍数。,#include void main( ) int m, n, p, r, temp; printf(“输入两个

7、正整数:”); scanf(“%d, %d”, ,辗转整除求余法,19,break 语句无条件转移语句,一般形式:break; 功能: 用在switch语句中使流程跳出switch结构,继续执行switch语句后面的语句。 用在循环体内,迫使所在循环立即终止(跳出当前循环体),继续执行循环体后面的第一条语句。 说明:break语句不能用于循环语句和switch语句之外的任何其他语句中。,20,void main( ) int m, n, p, i; printf(“输入两个正整数:”); scanf(“%d, %d”, ,习题6.1 输入两个正整数,求其最大公约数和最小公倍数。(方法二),21

8、,【例6.6】把数316分为两个数之和,其中一个为13的倍数,一个为11的倍数。,main() int i=0; for(;i+) if(!(316-i*13)%11)break; printf(13*%d+11*%d=316n“ ,i,(316-13*i)/11); ,22,continue语句无条件转移语句,一般形式:continue; 功能:结束本次循环(跳过循环体中尚未执行的语句),接着进行是否执行下一次循环的判定。 continue和break的区别: continue只结束本次循环,而非终止整个循环。 break则是结束所在层循环,不再进行条件判断。,23,continue:其作用

9、为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。,for(. ; . ; . ) . continue; . ,while( . ) . continue; . ,24,求素数:只可以被1与自身整除的数。,判断一个数 t 是否为素数,用2到t-1循环除。,for( i=2; it ; i+) if(t%i=0) break; if (i=t) printf(“是素数。n”); else printf(“不是素数n”);,进一步,由于 t 不可能被大于 t/2 的数整除,所以可将循环次数降低。,t/2,(i=t/2),25,计算:222222.2222222?

10、,累加和 s0,设通项为t,t的初值为2,22=2*10+2;,222=22*10+2;,2222=222*10+2;,t=t*10+2;,所以,通项的循环表示为:,前一项,当前项,循环体为:,26,void main(void) int i,t,s; s=0; t=2; for( i=0;i7;i+) s=s+t; t=t*10+2; printf(“s=%dn”,s); ,27,【例6.7】输出100200之间所有不能被3整除的数。,main() int n,count=0; for(n=100;n=200;n+) if(n%3=0)continue; printf(%4d,n); cou

11、nt+; if(count%10=0)printf(n); ,换成什么,可 不改变结果?,28,#include #include void main( ) int s=1,n=1; float t=1,pi=0; while( fabs(t)1e-6 ) pi+=t; n=n+2; s=-s; t=1.0*s/n; printf(pi=%8.6fn,4*pi); ,p124 例题6.6,29,goto 语句,一般形式:goto 语句标号; 说明: goto为无条件转向语句。 语句标号必须是合法的标识符。不能用整数作标号。 用途: 与if语句一起构成循环结构; 从多层循环体的内层循环跳到外层循

12、环。,结构化程序设计 方法主张限制使用 goto语句,因为滥用 goto语句将使程序流 程无规律、可读性差,只有不得已(如能大大提高效率)时才能使用goto!,30,【例6.8】用if和goto语句构成循环,求 。,main() int i=1,sum=0; loop:if(i=100) sum=sum+i; i+; goto loop; printf(Sum=%d,sum); ,31,void main(void ) int i=10; switch(i) case 9: i+; case 10: i+; case 11: i+; default: i+; printf(“i=%d”,i);

13、 ,i=11,i=12,i=13,i=13,32,int x=1, y=0, a=0, b=0; switch( x ) case 1: switch( y ) case 0: a+; break; case 1: b+; break; case 2: a+; b+; break; case 3: a+; b+; printf(“a=%dtb=%dn”,a,b);,a=1,a=2 b=1,a=2b=1,33,求级数公式:,首先写出通项,然后再用当前项(第n项)除前一项,得出后一项比前一项大多少倍。,通项:,t=x*x/(2*n)*(2*n-1),第n项/第n-1项:,表明前一项比后一项大t倍,

14、即后一项乘t等于前一项,后一项(-1)前一项t,34,S=0;term=1;n=1;/一定要赋初值 while(fabs(term)=1e-5) S=S+term; term=(-1)*term*x*x/(2*n)*(2*n-1); n+; ,term=(-1)*term*t;,前一项,当前项,旧的,新的,后一项(-1)前一项t,设通项为term,则可以写出迭代公式,t=x*x/(2*n)*(2*n-1),35,t=x*x/(2*n)*(2*n-1),第n项/第n-1项:,第一项:term=1;,第一次循环:S=S+term; term=(-1)*term*t;,第二次循环:S=S+term;

15、 term=(-1)*term*t;,这时左边的term代表第二项,而右边的term为第一项。,这时左边的term代表第三项,而右边的term为第二项。,term=(-1)*term*t;,前一项,当前项,同样是term,在循环中不断用旧的数值去推导赋值出新的数值。,36,S=0;term=1;n=1;/一定要赋初值 while(fabs(term)=1e-5) S=S+term; term=(-1)*term*x*x/(2*n)*(2*n-1); n+; ,旧的,新的,37,作业,阅读并上机运行本章的程序例题,要求理解. 习题115。,38,#include void main(void) int n,count=0; printf(input datan); scanf(%d, ,112页,习题5.7,39,#include void main( ) int a, n, i=1, sn=0, tn=0; printf(a,n= ); scanf(%d,%d, ,习题6.3,40,#include void main( ) float sum=0,t=1; int n; for(n=1;n=20;n+) t=t*n; sum=sum+t; printf(1!+2!+.+20!=%en,sum); ,习题6.4,41,#include void main() int m,s,i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论