1 / 53

第五章 循环控制

第五章 循环控制. §5.1 问题的提出与程序示例. 前面已介绍了顺序结构 , 选择结构,本章介绍循环结构。. 实际问题 : 一组重复执行的语句。. 如 : 问题 1 : 在屏幕上 输出整数 1~20. 问题 2 : sum=1+2+3+…+100;.  则用循环结构解决。. C 语言 有三 种形式 的 循环 :. 1 . 当型循环: while 语句. 2 . 直到型循环: do …while 语句. 3 . for 语句. §5.2 while 语句. 为了使程序的结构化功能强 , 应尽量少用 goto 语句。.

Télécharger la présentation

第五章 循环控制

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. 第五章 循环控制 §5.1 问题的提出与程序示例 前面已介绍了顺序结构,选择结构,本章介绍循环结构。 实际问题:一组重复执行的语句。 如:问题1: 在屏幕上 输出整数1~20 问题2: sum=1+2+3+…+100;

  2. 则用循环结构解决。 C语言有三种形式的循环: 1.当型循环:while 语句 2.直到型循环:do …while 语句 3.for语句

  3. §5.2 while语句 为了使程序的结构化功能强,应尽量少用goto语句。 专门的当型循环语句––while语句 循环条件 • 形式: while (表达式) • 语句 2. 功能: 先判断表达式的值。若0.则执行其后面的语句,否则while执行完毕。

  4. =0 表达式 0 语句 下一语句 3.流程图: 4. 执行过程: 先判断表达式的值。若0.则执行其后面的语句,否则while执行完毕。 • 要写出一个正确的循环结构,要做以下几方面工作: • 控制变量赋初值; • 设置正确的循环条件; • 书写循环体,并且循环体中应有控制变量的更新、调整, 使循环条件趋向于0(假) 将上述第一个问题 用while语句写出: i=1; while (i<=20) { printf(“%d”,i); i++; }

  5. 第二个问题:求1+2+3+……+100之和。 • 分析: 1. 变量的个数,初始值: 加数的变化规律,依次递增1,可用一个变量i反映加数的变化情况,应赋初始值为1;要用一个变量来存放累加的结果,其初始值应为0; 2. 循环条件 反复要做加法一直做到什么时候停止下来呢? 做到加数变到100时停止,所以有循环条件为:i<=100 3. 循环体 在循环体中是反复要做的事情即做加法,除此之外,循环体中应该有改变循环变量的语句,保证循环在重复执行若干次之后循环条件不再满足,从而跳出循环。

  6. int sum,i; sum=0; i=1; while (i<=100) { sum+ =i; i++; } 注: while后面的语句一般为复合语句, 即:加{ }  语句中应有使循环变量发生变化的语句。 否则会出现无限循环–––“死”循环。 请阅读教材P100例5-5和例5-6

  7. main() { int x=2; while (x<=50) { printf("%4d",x); x=x+2; } printf("\n"); } 例5-2-3:输出1---50之间的所有偶数

  8. 例5-2-4:输出100---999之间所有能被7整除的数,并统计共有几个这样的数.例5-2-4:输出100---999之间所有能被7整除的数,并统计共有几个这样的数. main() { int x=100,n=0; while (x<=999) { if (x%7)==0) { printf("%5d",x); n++; } x++; } }

  9. 阅读以下程序 main() { int i,sum ; i=0,sum=0; while(i<=100) { sum=sum+i; i=i+7; } printf("%d",sum); } 赋初值 循环条件 循环体 循环控制变量发生变化 把0—100所有7的倍数(或所有能被7整除的数)相加.

  10. While循环是先判断表达式,后执行循环体 • 循环体有可能一次也不执行 main() { int x=10; while (x=0) { x=x-1; } printf("%d",x); }

  11. 语句 0 表达式 =0 §5.3 do …while语句 一种专门的“ 直到型” 循环语句。 • 形式: do • { • 语句 • } • while(表达式); 2.执行过程: 先执行语句,再判表达式的值,若0,再执行语句,否则结束循环 3.流程: 至少执行一次循环体!

  12. 用do…while编程求s=1+2+3+…+100 main( ) { int sum=0,i=1; do { sum=sum+i; i++; }while(i<=100); printf("sum=%d\n",sum); } 赋初值 循环体 循环控制变量发生变化 循环条件

  13. 用do…while改写1+2+3+…..+100程序如下: main ( ) { int i, sum=0; i=1; do {sum=sum+i; i++; } while (i<=100); printf("%d",sum); }

  14. while语句与do…while语句的区别: 当第一次执行时,若表达式=0时,则while语句与do  while有所不同,do  while 执行一次循环体,而while不执行。

  15. §5.5 for语句 一种形式更为灵活的循环语句。 1. 形式 循环控制变量的改变 初值 • 格式: For (表达式1; 表达式2; 表达式3 ) 语句; 循环条件 循环体 2.执行过程 首先计算表达式1,接着执行表达式2,若表达式2的值0,则执行语句,接着计算表达式3,再判断表达式2的值.依此重复下去,直到表达式2的值=0(假)。

  16. 3.流程: 计算表达式1 =0(假) 求表达式2值 0(真) 语句 计算表达式3 结束for语句

  17. 例 计算s=1+2+…+100 main() { int s=0,k; for (k=1;k<=100;k++) s=s+k; printf("s=%d\n",s); }

  18. for语句完全可以用while代替,但for直观、简单、方便。for语句完全可以用while代替,但for直观、简单、方便。 for (表达式1; 表达式2; 表达式3 ) 语句; for用while代替的流程: 表达式1; while(表达式2) { 语句 表达式3; }

  19. 4. for语句的几种特例  可以省略表达式1, 但须保留分号;这时在for之前就得赋值给循环变量; 例: 任意输入两个整数a, b,求 main ( ) { int i, j, a, b, sum; printf ("please input two number!\n") scanf ("a=%d, b=%d", &a, &b); i=a; j=b;

  20. if (a>b) {i=b; j=a;} for (; i<=j; i++) sum=sum+i; printf (" \n sum=%d", sum); }

  21. 表达式2一般不可省略,否则为无限循环 例: for (i=1;; i++) sum=sum+i; 相当于条件永真、永不为0,若用while表示 相当于: while (1) { sum=sum+i; i++; }

  22. 表达式3亦可省略,但在循环体中须有语句修改循环变量;以使表达式2在某一时刻为0而正常结束循环。表达式3亦可省略,但在循环体中须有语句修改循环变量;以使表达式2在某一时刻为0而正常结束循环。 例: for (sum=0,i=1;i<=100;) { sum=sum+i; i++; }

  23. 若同时省略表达式1,表达式3,则相当于while(表达式2)语句。若同时省略表达式1,表达式3,则相当于while(表达式2)语句。 例: for (; i<=100;) {sum+=i; i++;} 相当于while (i<=100) {sum+=i; i++; }

  24. 三个表达式均省略 即for(;;)语句则相当于while(1)语句. 表达式1、表达式3可以是逗号表达式,以使循环变量值在修改时可以对其它变量赋值。 如for (sum=0, i=1; i<=100; i++, i++)  sum=0; for (i=1; i<=100; i=i+2)

  25. 表达式2可以是关系表达式,也可以是数值表达式或字符表达式。只要值0.即执行循环体.表达式2可以是关系表达式,也可以是数值表达式或字符表达式。只要值0.即执行循环体. 例:for (i=0; (c=getchar( ))!='\n'; i+=c) ; 请思考以下程序段的执行结果: for(i=1;i<=20;i++) ; printf(“%d “, i);

  26. §5.5循环的嵌套 与其它语言一样,当循环体中又包含了另一个完整的循环语句时–––嵌套。 C有三种循环语句,均可以相互嵌套: while ( ) {… while ( ) …{ } }

  27. for (; ;) {… while ( ) { } do { } while ( ); … }

  28. 程序举例 • 编写程序,在一行内输出整数1-10,并连续输出五行。 #include "stdio.h" void main() { int i,j; for(i=1;i<=5;i++) { for(j=1;j<=10;j++) printf("%d ",j); printf("\n"); } }

  29. 程序举例 • 编程输出”九九乘法口诀表“ #include "stdio.h" void main() { int i,j; for(i=1;i<=9;i++) { for(j=1;j<=i;j++) printf("%d*%d=%-3d",i,j,i*j); printf("\n"); } }

  30. §三种循环的比较 1. for循环功能强于while, do…while.但若不是明显地给出循环变量初终值(或修改条件),则应用while 或do …while.以增强程序的结构化和可读性。 2. 要防止无限循环––死循环。 3. 循环过程中,为了结束本次循环或跳出整个循环。分别要用到continue和break语句。

  31. §5.6 break语句 break语句 语法格式: break; 在循环体中的功能: 终止最内层循环。从包含它的最内层循环语句中(while、do……while、for)中退出,执行包含它的循环语句的下一条语句。

  32. 问题: 计算圆的面积r2, 半径取1, 2, 3, 4…,当面积>100时结束。 for(r=1; r<=10; r++) { area=pirr; if (area>100) break; } printf (“r=%d,area=%f", area); 从结构化程序要求出发,用break;退出循环,进入for语句的下一条语句。

  33. 举例:编程求3-100之间的所有素数。 题目分析:假设一个数是m,判断它是素数的方法是:它不能被2~m-1中任何一个数整除。 程序: int i,j; for(i=3;i<=100;i++) { for(j=2;j<=i-1;j++) if(i%j==0) break; if(i==j) printf("%4d",i); } 返回

  34. 5.7 contiune语句 1. continuce语句 格式:continue; 功能: 结束本次循环(即本次循环体中continue后面的部分不执行),开始下一次循环。 continue用在while和do……while语句中与用在for语句中略有不同。在for语句中将终止本次循环体运行,但是要计算表达式3。

  35. 问题: 编写程序,打印100~200中不能被3整除的数。 main( ) { int n; for (n=100; n<200; n++) if (n%3!=0) printf("%d", n); }

  36. 换一种方式: main ( ) { int n; for (n=100; n<=200; n++) {if (n%3= =0) continue; printf ("%d", n); } } continue语句起了结束本次循环的作用。

  37. 2. break与continuce的区别 • break与continue都可以用在循环体中,使用时要注意两者的区别: • break是使内层循环立即终止,执行循环体外的第一条语句,而continue语句是终止本次循环,执行下一次循环; • break语句可用在switch语句中,而continue则不能。

  38. 比较break和continue在循环体中的使用 int i=0; while(i<=9) { i++; if(i==5) break; printf("%d \n",i); } int i=0; while(i<=9) { i++; if(i==5) continue; printf("%d \n",i); } 请思考上述两个程序的运行结果。

  39. 5.8 控制循环的实用方法 控制循环的方法大致可以分为以下几种: • 计数循环 • 哨兵循环 • 计数哨兵循环 • 询问循环 • 输入验证循环等

  40. 1 计数循环和哨兵循环 计数循环程序段: for(i=1,sum=0;i<=99;i=i+2) sum=sum+i; 哨兵循环程序段: c=getchar(); while(c!=‘$’) { putchar(c); c=getchar(); }

  41. 编程求3-100之间的所有素数。 回顾 • 2 计数哨兵循环 int i,j,flag; for(i=3;i<=100;i++) { flag=1; for(j=2; (j<=i-1)&&flag ;j++) if(i%j==0) flag=0; if(flag==1) printf("%4d",i); }

  42. 3. 询问循环 例5.23:编写程序输入某门功课的若干个同学的成绩,并计算平均分,通过询问循环来控制输入是否停止 本程序在每次接收用户输入的分数以前,都要询问用户是否需要继续输入数据。如果用户回答“Y”,则循环继续,如果用户回答“N”,则循环结束。 具体程序代码如下:

  43. int sum,i,score,c; sum=0; i=0; printf("Do you want to input data(y/n):"); c=getchar(); getchar(); while(c=='Y'||c=='y') { printf("\nPlease enter score:"); scanf("%d",&score); getchar(); sum=sum+score; i++; printf("\n Do you want to continue input data(y/n):"); c=getchar(); getchar(); } if(i!=0) printf("aver=%5.2lf\n",1.0*sum/i); else printf("\nNo data!");

  44. P124习题18:假设某高速公路的一个收费站的收费标准为:小型车15元/车次、中型车35元/车次、大型车50元/车次、重型车70元/车次。编写程序,循环显示下列列表,请用户选择车型,根据用户的选择输出应交的费用,直到用户选择“退出”,程序结束。P124习题18:假设某高速公路的一个收费站的收费标准为:小型车15元/车次、中型车35元/车次、大型车50元/车次、重型车70元/车次。编写程序,循环显示下列列表,请用户选择车型,根据用户的选择输出应交的费用,直到用户选择“退出”,程序结束。 1-小型车 2-中型车 3-大型车 4-重型车 5-退出 参考P115例5.24

  45. int i=0,x; while(i!=5) { printf("\n 1-小型车"); printf("\n 2-中型车"); printf("\n 3-大型车"); printf("\n 4-重型车"); printf("\nPlease input your choice:"); scanf("%d",&i); switch(i) { case 5:break; case 1:printf("小型车收费15元/车次\n");break; case 2:printf("中型车收费35元/车次\n");break; case 3:printf("大型车收费50元/车次\n");break; case 4:printf("重型车收费75元/车次\n");break; default:printf("Error choice!\n"); } } • 程序代码如下:

  46. §5.9 程序举例 用循环结构解决实际问题的方法大致可以分为: 穷举、求和(积)、迭代 例5.26:请列出所有个位数是6,且能被3整除的两位数。 穷举法1: int i; for(i=10;i<=99;i++) if(i%10==6&&i%3==0) printf("%3d\n",i); 穷举法1: int i; for(i=1;i<=9;i++) if((i*10+6)%3==0) printf("%3d\n",i*10+6);

  47. 例5.27 编程计算 方法一: int i,flag; float sum; for(i=1,sum=0,flag=1 ;i<=100; flag=-flag,i++) sum=sum+flag*1.0/(i*i); printf("sum=%f \n",sum); 方法二: int i; float sum; for(i=1,sum=0; i<=100; i=i+2) sum=sum+1.0/(i*i); for(i=2;i<=100;i=i+2) sum=sum-1.0/(i*i); printf("sum=%f \n",sum);

  48. 例5.29:求Fibonacci数例: 1, 1, 2, 3, 5, 8, …前40个数。 规律:F1=1, F2=1 Fn=Fn – 1 + Fn – 2 (n>2) 程序要点:  f1=f1+f2; f2=f1+f2; 交替的结果正好为一序列  每输出4个数时换行。

  49. int a,b,j,f; a=1;b=1; printf("%10d%10d",a,b); for(j=3;j<=20;j++) { f=a+b; a=b; b=f; printf("%10d",f); if(j%4==0) printf("\n"); } 方法一:

  50. 方法2: int a,b,j; a=1;b=1; printf("%10d%10d",a,b); for(j=2;j<=10;j++) { a=a+b; b=a+b; printf("%10d%10d",a,b); if(j%2==0) printf("\n");

More Related