1 / 34

制作者:袁四清 学号: 20031014083 2003 级计算机系本科( 2 )班

第 6 章 循环控制. go. 制作者:袁四清 学号: 20031014083 2003 级计算机系本科( 2 )班. 当 P 为真. A. 假. P. 真. A. A. A. 直到 P 为 假. 真. P. 假. 6.1 概述. 循环结构:. 当型循环结构. 直到型循环结构. 注: A 可以是一个简单语句,也可以是一个基本结构. C 语言可实现循环 结构 的语句: 用 goto 和 if 构成循环 while 语句 do ~ while 语句 for 语句. goto 语句一般格式:.

shelby
Download Presentation

制作者:袁四清 学号: 20031014083 2003 级计算机系本科( 2 )班

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第6章 循环控制 go 制作者:袁四清 学号:20031014083 2003级计算机系本科(2)班

  2. 当P为真 A 假 P 真 A A A 直到P为假 真 P 假 6.1 概述 • 循环结构: • 当型循环结构 • 直到型循环结构 注:A可以是一个简单语句,也可以是一个基本结构

  3. C语言可实现循环结构的语句: 用goto 和 if 构成循环 while 语句 do ~ while 语句 for 语句

  4. goto语句一般格式: 6.2 goto语句以及用goto语句构成循环 • goto 语句标号; • …… • 标号:语句; • 功能:无条件转移语句 • 说明: • 不能用整数作标号 • 只能出现在goto所在函数内,且唯一 • 只能加在可执行语句前面 • 限制使用goto语句

  5. 例 用if 和goto语句构成循环,求 循环条件 循环初值 循环变量增值 循环终值 循环体 • /*c5_1.c*/ • #include <stdio.h> • main() • { int i,sum=0; • i=1; • loop:if(i<=100) • { sum+=i; • i++; • goto loop; • } • printf("%d",sum); • } 分析: sum=sum+1=1 sum=sum+2=1+2=3 sum=sum+3=3+3=6 sum=sum+4=6+4=10 …… sum=sum+100=4950+100=5050

  6. while 假(0) 表达式 真(非0) 循环体 6.3 while语句 • 一般形式: while(表达式) 循环体语句 此处无; • 执行流程:

  7. 特点:先判断表达式,后执行循环体(当型) • 说明: • 循环体有可能一次也不执行 • 循环体可为任意类型语句 • 下列情况,退出while循环: • 条件表达式不成立(为零) • 循环体内遇break,return,goto • 无限循环: while(1) 循环体;

  8. 例 用while循环求 循环条件 循环初值 循环终值 循环变量增值 循环体 /*c5_3.c*/ #include <stdio.h> main() { int i,sum=0; i=1; while(i<=100) { sum=sum+i; i++; } printf("%d",sum); }

  9. 例 显示1~10的平方 运行结果: 1*1=1 2*2=4 3*3=9 4*4=16 5*5=25 6*6=36 7*7=49 8*8=64 9*9=81 10*10=100 /*c5_4.c*/ #include <stdio.h> main() { int i=1; while(i<=10) { printf("%d*%d=%d\n",i,i,i*i); i++; } }

  10. do 循环体 while 真(非0) 表达式 假(0) 6.4 do-while语句 • 一般形式: do 循环体语句 while(表达式); 此处有; • 执行流程:

  11. 循环体 While循环 假(0) 表达式 真(非0) 循环体 • 特点:先执行循环体,后判断表达式(直到型) • 说明: • 至少执行一次循环体 • do-while可转化成while结构

  12. 例 用do~while循环求 /*c5_5.c*/ #include <stdio.h> main() { int i,sum=0; i=1; do { sum+=i; i++; } while(i<=100); printf("%d",sum); }

  13. 例 while和do~while比较 /*c5_6_1.c*/ #include <stdio.h> main() { int i,sum=0; scanf("%d",&i); do { sum+=i; i++; }while(i<=10); printf("%d",sum); } /*c5_6_2.c*/ #include <stdio.h> main() { int i,sum=0; scanf("%d",&i); while(i<=10) { sum+=i; i++; } printf("%d",sum); } 结论:当 while后的表达式第一次的值为“真”时,两种结果相同,否则不同。

  14. for 表达式1 假(0) 表达式2 真(非0) 循环体 表达式3 6.5 for语句 • 一般形式: for([表达式1];[表达式2];[表达式3]) 循环体语句 此处无; 1.先求解表达式1; 2.求解表达式2,若其值为真(非0),则执行循环体的内容,然后执行第3步。若为假(0),则结束循环,执行for语句下面一条语句。 3.若表达式为真,执行指定的语句后,求解表达式3。 4.返回第2步执行。 • 执行流程:

  15. 例 用for循环求 #include <stdio.h> main() { int i,sum=0; for(i=1;i<=100;i++) sum+=i; printf("%d",sum); } • for语句一般应用形式: for( 循环变量赋初值;循环条件;循环变量增值) { 循环体语句 } 此处无; • 说明: • for语句中表达式1、表达式2、表达式3类型任意,都可省略,但分号;不可省 • 无限循环: for(;;) • for语句可以转换成while结构 表达式1; while(表达式2) { 循环体语句; 表达式3; }

  16. 例:#include<stdio.h> main( ) { int i=0; for(i=0;i<10;i++) putchar(‘a’+i); } 例:#include<stdio.h> main( ) { int i=0; for(;i<10;i++) putchar(‘a’+i); } 省略表达式 1 运行结果:abcdefghij 例: #include<stdio.h> main( ) { int i=0; for(;i<10;) putchar(‘a’+(i++)); } 例: #include<stdio.h> main( ) { int i=0; for(;i<10;putchar(‘a’+i),i++) ; } 省略循环体 省略表达式1、3

  17. /*c5_7.c*/ main() { int i,j,k; for(i=0,j=100;i<=j;i++,j--) { k=i+j; printf("%d+%d=%d\n",i,j,k); } } 表达式 1、3为逗号表达式 /*c5_8.c*/ #include<stdio.h> main() { char c; for(;(c=getchar())!='\n';) printf("%c ",c); } /*c5_9.c*/ #include <stdio.h> main() { int i,c; for(i=0;(c=getchar())!='\n';i+=3) printf("%c ",i+c); } 结论:for语句的功能强大。

  18. 外循环 内循环 内循环 6.6 循环的嵌套 • 三种循环可互相嵌套,层数不限 • 外层循环可包含两个以上内循环,但不能相互交叉 • 嵌套循环的执行流程 (1) while() { …… while() { …… } …... } (4) for( ; ;) { …… do { …… }while(); …… while() { …… } …... } (3) while() { …… do { …… }while( ); ……. } (2) do { …… do { …… }while( ); …... }while( ); • 嵌套循环的跳转 禁止: • 从外层跳入内层 • 跳入同层的另一循环 • 向上跳转

  19. 1 9 2 18 3 27 36 4 45 5 6 54 63 7 72 8 9 81 j i 1 2 4 3 6 9 …………….. 例 循环嵌套,输出九九表 /*c5_10.c*/ #include <stdio.h> main() { int i,j; for(i=1;i<10;i++) printf("%4d",i); printf("\n---------------------------------------\n"); for(i=1;i<10;i++) for(j=1;j<=i;j++) printf((j==i)?"%4d\n":"%4d",i*j); }

  20. for(i=1;i<10;i++) for(j=1;j<=i;j++) printf((j==i)?"%4d\n":"%4d",i*j); i=1 假(0) i<10 真(非0) j=1 外循环 假(0) j<=i 真(非0) 内循环 printf j++ i++

  21. 6.7 几种循环的比较 • 三种循环均可处理同一问题; • for和while语句为先判断后执行,do-while语句则先执行后判断; • do-while和while 语句多用于循环次数不定的情况,循环次数确定的用for语句更方便; • do-while语句更适合第一次肯定执行的情况; • do-while和while语句只有一个表达式,用于控制循环是否进行。for语句有三个表达式,不仅可以控制循环是否进行,而且能为循环变量赋初值及不断修改其值。故for语句功能更强,更灵活。

  22. 6.8.1break语句 一般形式:break; 功能:在循环语句和switch语句中,终止并跳出循环体或开关体 说明: break只能终止并跳出最近一层的结构 break不能用于循环语句和switch语句之外的任何其它语句之中 6.8 break语句和continue语句

  23. while do 假(0) 表达式 …… break; …... 真(非0) …… break; …… while 真(非0) 表达式 假(0)

  24. for 表达式1 switch 假(0) 表达式2 表达式 真(非0) case …… break; …... const 1 const 2 const n default 语句组1 break; 语句组2 break; 语句组n break; 语句组 break; …... 表达式3

  25. break举例:输出圆面积,面积大于100时停止 #include <stdio.h> #define PI 3.14159 main() { int r; float area; for(r=1;r<=10;r++) { area=PI*r*r; if(area>100) break; printf("r=%d,area=%.2f\n",r,area); } }

  26. 例 break举例: • 小写字母转换成大写字母,直至输入非小写字母字符。 /*ch6-5-2.c*/ #include <stdio.h> main() { char c; while(1) { c=getchar(); if(c>='a' && c<='z') putchar(c-'a'+'A'); else break; } }

  27. 6.8.2continue语句 • 一般形式:continue; • 功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断 • 说明: • 仅用于循环语句中 • continue 语句仅结束本次循环,但break语句则是结束整个循环过程。

  28. for 表达式1 while do 假(0) 表达式2 假(0) 表达式 真(非0) …… continue; …... 真(非0) …… continue; …... …… continue; …… while 真(非0) 表达式 表达式3 假(0)

  29. 求输入的十个整数中正整数的个数及其和与平均值 #include <stdio.h> main() { int i,num=0,a; float sum=0; for(i=0;i<10;i++) { scanf("%d",&a); if(a<=0)continue; num++; sum+=a; } printf("%d plus integer's sum :%6.0f\n",num,sum); printf("Mean value:%6.2f\n",sum/num); }

  30. 6.9 程序举例 例6.6 用 公式求π的近似值,直到最后一项的绝对值小于10-6为止 t=1,pi=0,n=1.0,s=1 当|t|>=1e-6 pi=pi+t n=n+2 s=-s t=s/n pi=pi*4 输出pi • /*c5_11.c*/ • #include <stdio.h> • #include <math.h> • 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.6f\n",pi); • } 分子:1,-1, 1,-1… 分母:1, 3, 5, 7…

  31. 1 5 34 233 1597 10946 75025 514229 3524578 24157817 1 8 55 377 2584 17711 121393 832040 5702887 39088169 2 13 89 610 4181 28657 196418 1346269 9227465 63245986 3 21 144 987 6765 46368 317811 2178309 14930352 102334155 f1=1, f2=1 for i=1 to 20 输出f1,f2 f1=f1+f2 f2=f2+f1 例6.7 求Fibonacci数列:1,1,2,3,5,8,……的前40个数。 F1=1 (n=1) F2=1 (n=2) Fn=Fn-1+Fn-2 (n≥3) /*c5_12.c*/ #include <stdio.h> main() { long int f1,f2; int i; f1=1; f2=1; for(i=1;i<=20;i++) { printf("%12ld %12ld ",f1,f2); if(i%2==0) printf("\n"); f1=f1+f2; f2=f2+f1; } }

  32. 读入m k=m i=2 当i≤k m被i整除 假 真 用break 结束循环 i=i+1 i≥k+1 假 真 输出:m”不是素数” 输出:m”是素数” 例6.8 判断m是否素数 /*c5_13.c*/ #include <stdio.h> #include <math.h> main() { int m,i,k; scanf("%d",&m); k=sqrt(m); for(i=2;i<=k;i++) if(m%i==0) break; if(i>=k+1) printf("%d is ",m); else printf("%d is not ",m); printf("a prime number\n"); } 例6.9 求100~200间的全部素数

  33. ABCDEFGHIJKLMNOPQRSTUVWXYZ 例6-10 译密码 /*c5_14.c*/ #include <stdio.h> main() { char c; while((c=getchar())!='\n') { if((c>='a'&&c<='z')||(c>='A'&&c<='Z')) { c=c+4; if(c>'Z'&&c<='Z'+4||c>'z') c=c-26; } printf("%c",c); } } 例如: Hello,world! 译成密码:Lipps,asvph!

  34. 谢谢欣赏!!!

More Related