谢丽聪老师C语言课件-6循环控制-2009.ppt

上传人:罗晋 文档编号:5657628 上传时间:2020-07-20 格式:PPT 页数:61 大小:511.50KB
返回 下载 相关 举报
谢丽聪老师C语言课件-6循环控制-2009.ppt_第1页
第1页 / 共61页
谢丽聪老师C语言课件-6循环控制-2009.ppt_第2页
第2页 / 共61页
谢丽聪老师C语言课件-6循环控制-2009.ppt_第3页
第3页 / 共61页
谢丽聪老师C语言课件-6循环控制-2009.ppt_第4页
第4页 / 共61页
谢丽聪老师C语言课件-6循环控制-2009.ppt_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《谢丽聪老师C语言课件-6循环控制-2009.ppt》由会员分享,可在线阅读,更多相关《谢丽聪老师C语言课件-6循环控制-2009.ppt(61页珍藏版)》请在三一文库上搜索。

1、第六章 循环控制,6.1概述 6.2goto语句以及用goto语句构成循环 6.3while语句和do-while语句 6.4for语句 6.5循环的嵌套 6.6break和continue语句,6.1 循环控制概述,循环结构的特点:在给定条件成立时,反复执行某程序段,直到条件不成立为止。 语言提供的循环结构类型如下: 1)用goto语句和if语句构成循环; 2)用while语句; 3)用do-while语句; 4)用for语句;,循环条件,循环体,6.2 goto 语句以及用goto 语句构成循环,6.2.1 形式: goto 语句标号; 6.2.2 功能:一进入执行goto 语句、立即转向

2、去执行其后面标号所指示的语句 goto jump; loop: 语句1 语句1 语句2 语句2 语句n 语句n jump: 语句n+1 goto loop; ,用标识符表示,分号,冒号,冒号,6.2.3 注意:结构化程序设计方法主张限制使用goto 语句,一般只在下面两种结构中表示循环 一、loop: if (表达式) 语句 goto loop; 表达式值为零时,立即停止循环 二、loop: 语句 if (!表达式) goto loop; 表达式值非零时,立即停止循环,例:用goto语句和if语句构成循环。,例 用goto语句和if语句构成循环。 void main() int i,sum=0

3、; i=1; loop: if(i=100) sum=sum+i; i+; goto loop; printf(%dn,sum); 运行结果:5050,i=101,形式: while (表达式) 语句 表达式值为零时,立即停止循环 形式: do 语句 while (表达式) ; 表达式值为零时,立即停止 循环,至少执行一次循环语句,6.3 while 和do while 语句,分号,while (表达式),do 语句 while (表达式) ;,例1.写出下面程序的运行结果,(1) void main( ) int i=1; while(i=3) printf(”%dn”,i);i+ ; (2

4、) void main( ) int i=1; while(i=3) ; printf(”%dn”,i);i+ ; ,结果 1 2 3,结果 死循环,循环体,空语句,注意:若把上面 、 去掉也死循环,复合语句 作为循环 体语句,(3) void main ( ) int k=1 , n=1 , sum=0 ; do sum+=n ; n+ + ; if ( sum=10 ) k=0; while ( k=1); printf ( ”sum=%dn”,sum) ; ,改为while(k=1) 死循环,0,1,1,2,3,3,6,4,10,结果: sum=10,例2 用while语句和do-whi

5、le语句求,传统流程图表示算法,N-S图表示算法,100,void main() int i,sum=0; i=1; 运行结果:5050 while(i=100) sum+=i; i+; printf(%dn,sum); void main() int i,sum=0; i=1; do sum+=i; i+; while(i=100); printf(%dn,sum); ,注意: i和sum的初值 i的终值,例3 统计从键盘输入一行字符的个数。,#include void main() int n=0; printf(input a string:n); while(getchar()!=n)

6、 n+; printf(%d,n); ,只要从键盘输入的字符不是回车就继续循环,完成对输入字符个数计数。,输入:ascdf 输出:5,例4.计算 p=123 n void main( ) int i,n;long p; scanf(”%d”, ,不用long会溢出,重复到n次,也可以写成 in+1,例5计算 s=1!+2!+3!+ +n! (n0) void main( ) int i,n;long s,t; scanf(”%d”,保证达到计算n次,t=11 2 3 S=1+1 2+1 2 3+ ,例6.计算下面二十个数的和:13.8、-65、68.9、 、342.987 void main(

7、 ) int i=1; float x,sum=0; while ( i=20 ) scanf (”%f ”, 注:执行程序时输入 13.8 65 68.9 342.987,i=40,i+=2,while语句中的表达式一般是关系表达或逻辑表达式,也可以是其它表达式,只要表达式的值为真(非0)即可继续循环。 例7. void main() int a=0,n; printf(“n input n: ”); scanf(%d,执行n次,每执行1次,n减1。,(a*2;a+),输入: 8,输出: 0 2 4 6 8 10 12 14,例8. while和do-while循环比较。 void main

8、() int sum=0,i; scanf(“%d”, ,do sum=sum+i; i+; while(i=10);,输入:8,输入:11,sum=0,sum=11,6.4 for 语句代替while 语句,6.4.1 形式: for (表达式1;表达式2;表达式3) 语句 要正确表达循环结构应注意三方面要求: 1、循环控制变量的初始化。 2、循环的条件。 3、循环控制变量的值的更新,for语句在书写形式上集中体现了这三方面要求,6.4.2 功能,for语句完全可以取代 while 语句。 for(表达式1;表达式2 ;表达式3) 语句 它的执行过程如下: 1)先求解表达式1。 2)求解表达

9、式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行第3)步;若其值为假(0),则结束循环,转到第5)步。 3)求解表达式3。 4)转回第2)步继续执行。 5)循环结束,执行for语句下面的一个语句。,(用for语句改写前面的 例2、例4、例5、例7),例2、求 void main() int i,sum=0; i=1; do sum+=i; i+; while(i=100); printf(%dn,sum); void main() int i,sum=0; for(i=1;i=100;i+)sum+=i; printf(%dn,sum); ,例4 .计算 p=123 n v

10、oid main( ) int i,n;long p; scanf(”%d”, ,for(i=1 , p=1 ; i=n ; i+) P*=i;,中间用逗号,for(i=1 , p=1 ; i=n ; P*=i, i+),例5 计算 s=1!+2!+3!+ +n! (n0) void main( ) int i,n;long s,t; scanf(”%d”,for (i=1, t=1, s=0 ; i=n ; i+) t*= i ; s+=t;,例7 .计算下面二十个数的和:13.8、-65、68.9、 、342.987 void main( ) int i=1; float x,sum=0;

11、 while ( i=20 ) scanf (”%f ”, ,for(i=1;i=20;i+) scanf (”%f ”,for语句形式: for(循环变量赋初值;循环条件;循环变量增量) 语句,总是一个赋值语句, 它用来给循环控制变量赋初值,总是一个表达式, 它用来判别循环是否终止,定义循环控制变量每循环一次后按什么方式变化,这三个部分之间用“;”分开,对于for循环中语句的一般形式, for(表达式1;表达式2 ;表达式3) 语句 就是如下的while循环形式: 表达式1; while(表达式2) 语句 表达式3;,例1.写出下面程序的输出结果 #include void main ( )

12、 char c; for ( ; (c=getchar() -#; ) putchar( c ); ,c为#,值为0,结束,可以是任意表达式,输入: a56*3h#hj$,输出: a56*3h,例2.下面程序的输出结果是 void main ( ) int x=10,y=10,i; for ( i=0;x 8;y= +i ) printf (”%3d%3d” ,x-,y) ; A 10 1 9 2 B 9 8 7 6 C 10 10 9 1 D 10 9 9 0,表达式1只做一次,9,1,8,C,2,注意:,1)for循环中的“表达式1”、“表达式2(循环条件)”和“表达式3” 可以缺省,但“

13、;”不能缺省。 2)省略了“表达式1”, 表示不对循环控制变量赋初值,可在for循环里面或外面对其赋初值。 例如: i=1; for(;i=20;i+) scanf (”%f ”,4)省略了“表达式3(循环变量增量)”, 则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句。 例如: for(i=1;i=100; ) sum=sum+i; i+ ;,5)省略了“表达式1”和“表达式3”。 例如: for(;i=100;) sum=sum+i; i+; 相当于: while(i=100) sum=sum+i; i+;,6)3个表达式都可以省略。 例如: for(;)语句 相当于

14、: while(1)语句 7)表达式1可以是设置循环变量的初值的赋值表达式,也可以是其他表达式。 例如: for(sum=0;i=100;i+)sum=sum+i;,8)表达式1和表达式3可以是一个简单表达式也可以是逗号表达式。 for(sum=0,i=1;i=100;i+)sum=sum+i; 或: for(i=0,j=100;i=100;i+,j-)k=i+j; 9)表达式2一般是关系表达式或逻辑表达式,但也可是数值表达式或字符表达式,只要其值非零,就执行循环体。 例如: for(i=0;(c=getchar()!=n;i+=c); 又如: for(;(c=getchar()!=n;) p

15、rintf(“%c”,c);,6.5 循环的嵌套,1、各种循环结构的循环体中可以包含任一种完整的循环结构、选择结构, 2、选择结构的任一分支中也可以包含任一种完整的循环结构、选择结构, 3、且它们可多层嵌套。,例1.while (xy+z) for(k=1;k2;k+ +) if ( a5) w=1; else if ( a=5 ) switch 结构 else for (s=0,n=0;n3;n+) s+=n; ,6.6 break语句和continue语句,switch 结构中的 break:提前结束该结构 循环结构中的break:提前结束该结构 (while循环、do-while循环、f

16、or循环) 循环结构中的continue:提前结束本次循环,若在多层嵌套中使用break或continue,它只影响包含它的最内层结构,例1. 写出以下程序的运行结果: void main( ) int n; for (n=1;n=10;n+ +) if(n%3=0)break;printf(“%4d”,n); printf(“!n”); void main( ) int n; for (n=1;n=10;n+ +) if(n%3=0) cotinue;printf(“%4d”,n); printf(“!n”);,结果:1 2!,结果:1 2 4 5 7 8 10!,例2. 把100200之间

17、的不能被3整除的数输出。 #include void main( ) int n; for(n=100;n=200;n+) if(n%3=0) continue; printf (”%d ”,n); printf (”n ”); ,能被3整除,则进行下一次循环,例3.计算下面若干个数的和:13.8、-65、68.9、 、342.987,并统计个数(个数100) #include void main( ) int i=1; float x,sum=0; while ( i=100 ) scanf (”%f ”, 注:执行程序时输入 13.8 65 68.9 342.987 1e36 ,求绝对值,

18、理论上相等,实际上有误差,位置 不能 错,i-1,例4. void main( ) int k,j,x=0; for (k=1;k=4;k+) x+; if ( k%3= = 0) break; for(j=k;j=5;j+) x+; x+; printf (”%dn”,x); 结果 ?,14,程序举例,例1:输出101000中所有十位数为3的数 void main() int i; for(i=10;i=1000;i+) if(i/10%10=3)printf(“%5d”,i); ,如: i=1234 i/10=123 整数 123%10=3,if(i/10%103)continue; pr

19、intf(“%5d”,i);,例2:,void main( ) int k; for ( k= 2;k=10 ;k+=3 ) printf (”%4d”,k ); printf (”%4d”,k ); 运行结果: 2 5 8 11,例3:,void main( ) int k , j=99; for ( k=1;k=2;k+ +) printf( ”(1)%d,5dn”,k,j); for (j=5;j=7;j+ +) printf( ”(2)%d,5dn”,k,j); printf( ”(3)%d,5dn”,k,j); printf( ”(4)%d,5dn”,k,j); ,例4:,void

20、main() int i, j, k; printf(i j kn); for (i=0; i2; i+) for(j=0; j2; j+) for(k=0; k2; k+) printf(“%d %d %dn, i, j, k); ,1,2,1,2,例5:输出100200中所有素数 m是素数: m不被2、3、4、m-1中任一个整除 结果: 101 103 107 109 113 127 131 137 139 149 151 157 163 173 173 179 181 191 193 197 199,执行 m=11; m=15; k=m-1; k=m-1; for( i=2;ik i=k

21、 k=10,i=11 k=3 i=3,ik,结束for循环,m%i=0,break,void main() int m,i,k; for(m=100;m=200;m+) k=m-1; for(i=2;i=k;i+) if(m%i=0)break; if(i=k) printf(“%d is not a prime numbern”,m); else printf(“%d is a prime numbern”,m); ,只要有一个整除,后面无需判断,强迫循环结束,此时i=k,循环正常结束,ik 说明都不能整除,改为输入一个数,判断是否为素数.,m-1,#include void main()

22、int m,i,k; scanf(“%d”,输入: 3,输入: 6,例6: 输出所有由1、2、3组成的三位数,111 211 311 112 212 312 113 213 313 121 221 321 122 222 322 123 223 323 131 231 331 132 231 332 133 233 333,void main() int i,j,k; for(i=1;i=3;i+) for(j=1;j=3;j+) for(k=1;k=3;k+) printf(“%d%d%d,”,i,j,k); %d%d%d没有空格和逗号,起分隔符作用,上面改为不出现重复数字的三位数 void

23、 main() int i,j,k; for(i=1;i=3;i+) for(j=1;j=3;j+) for(k=1;k=3;k+) if(i!=j ,上面改为不出现重复字母 的由X、Y、Z组成的三个子符的字符串 void main() int i,j,k; for(i=X;i=Z;i+) for(j=X;j=Z;j+) for(k=X;k=Z;k+) if(i!=j ,与int一样,例7: P121 6.15,void main() 甲队 乙队 int i,j,k; X A for(i=X;i=Z;i+) Y B for(j=X;j=Z;j+) Z C for(k=X;k=Z;k+) if(

24、i!=j 输出:ZA,XB,YC,例8:用公式求。,#include void main() int s; float n,t,pi; t=1;pi=0;n=1.0;s=1; while(fabs(t)1e-6) pi=pi+t; n=n+2; s=-s; t=s/n; pi=pi*4; printf(pi=%10.6fn,pi);,例9 “斐波那契数列”是意大利中世纪数学家列昂纳多斐波那契以兔子繁殖为例子而引入的:兔子在出生两个月后,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?经过分析: 经过月数:-0-1-2-3-4-5-6-7- 兔子对数:-1-

25、1-2-3-5-8-13-21- 数字1,1,2,3,5,8,13,构成了一个数列。,数字1,1,2,3,5,8,13,有明显的特点: 前面相邻两项之和,构成了后一项。 我们可以得到递推公式如下: 程序运行结果为: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765,void main() int i,x1=1,x2=1; for(i=1;i=10;i+) /*每次生成并输出两项,所以循环10次*/ printf(”%10d %10d ”,x1,x2); if(i%2=0)printf(”n”); /*当i为偶数时换行,即每四个数换行*/ x1=x1+x2; x2=x2+x1; ,

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

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1