530 likes | 629 Views
第五章 循环控制. §5.1 问题的提出与程序示例. 前面已介绍了顺序结构 , 选择结构,本章介绍循环结构。. 实际问题 : 一组重复执行的语句。. 如 : 问题 1 : 在屏幕上 输出整数 1~20. 问题 2 : sum=1+2+3+…+100;. 则用循环结构解决。. C 语言 有三 种形式 的 循环 :. 1 . 当型循环: while 语句. 2 . 直到型循环: do …while 语句. 3 . for 语句. §5.2 while 语句. 为了使程序的结构化功能强 , 应尽量少用 goto 语句。.
E N D
第五章 循环控制 §5.1 问题的提出与程序示例 前面已介绍了顺序结构,选择结构,本章介绍循环结构。 实际问题:一组重复执行的语句。 如:问题1: 在屏幕上 输出整数1~20 问题2: sum=1+2+3+…+100;
则用循环结构解决。 C语言有三种形式的循环: 1.当型循环:while 语句 2.直到型循环:do …while 语句 3.for语句
§5.2 while语句 为了使程序的结构化功能强,应尽量少用goto语句。 专门的当型循环语句––while语句 循环条件 • 形式: while (表达式) • 语句 2. 功能: 先判断表达式的值。若0.则执行其后面的语句,否则while执行完毕。
=0 表达式 0 语句 下一语句 3.流程图: 4. 执行过程: 先判断表达式的值。若0.则执行其后面的语句,否则while执行完毕。 • 要写出一个正确的循环结构,要做以下几方面工作: • 控制变量赋初值; • 设置正确的循环条件; • 书写循环体,并且循环体中应有控制变量的更新、调整, 使循环条件趋向于0(假) 将上述第一个问题 用while语句写出: i=1; while (i<=20) { printf(“%d”,i); i++; }
第二个问题:求1+2+3+……+100之和。 • 分析: 1. 变量的个数,初始值: 加数的变化规律,依次递增1,可用一个变量i反映加数的变化情况,应赋初始值为1;要用一个变量来存放累加的结果,其初始值应为0; 2. 循环条件 反复要做加法一直做到什么时候停止下来呢? 做到加数变到100时停止,所以有循环条件为:i<=100 3. 循环体 在循环体中是反复要做的事情即做加法,除此之外,循环体中应该有改变循环变量的语句,保证循环在重复执行若干次之后循环条件不再满足,从而跳出循环。
int sum,i; sum=0; i=1; while (i<=100) { sum+ =i; i++; } 注: while后面的语句一般为复合语句, 即:加{ } 语句中应有使循环变量发生变化的语句。 否则会出现无限循环–––“死”循环。 请阅读教材P100例5-5和例5-6
main() { int x=2; while (x<=50) { printf("%4d",x); x=x+2; } printf("\n"); } 例5-2-3:输出1---50之间的所有偶数
例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++; } }
阅读以下程序 main() { int i,sum ; i=0,sum=0; while(i<=100) { sum=sum+i; i=i+7; } printf("%d",sum); } 赋初值 循环条件 循环体 循环控制变量发生变化 把0—100所有7的倍数(或所有能被7整除的数)相加.
While循环是先判断表达式,后执行循环体 • 循环体有可能一次也不执行 main() { int x=10; while (x=0) { x=x-1; } printf("%d",x); }
语句 0 表达式 =0 §5.3 do …while语句 一种专门的“ 直到型” 循环语句。 • 形式: do • { • 语句 • } • while(表达式); 2.执行过程: 先执行语句,再判表达式的值,若0,再执行语句,否则结束循环 3.流程: 至少执行一次循环体!
用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); } 赋初值 循环体 循环控制变量发生变化 循环条件
用do…while改写1+2+3+…..+100程序如下: main ( ) { int i, sum=0; i=1; do {sum=sum+i; i++; } while (i<=100); printf("%d",sum); }
while语句与do…while语句的区别: 当第一次执行时,若表达式=0时,则while语句与do while有所不同,do while 执行一次循环体,而while不执行。
§5.5 for语句 一种形式更为灵活的循环语句。 1. 形式 循环控制变量的改变 初值 • 格式: For (表达式1; 表达式2; 表达式3 ) 语句; 循环条件 循环体 2.执行过程 首先计算表达式1,接着执行表达式2,若表达式2的值0,则执行语句,接着计算表达式3,再判断表达式2的值.依此重复下去,直到表达式2的值=0(假)。
3.流程: 计算表达式1 =0(假) 求表达式2值 0(真) 语句 计算表达式3 结束for语句
例 计算s=1+2+…+100 main() { int s=0,k; for (k=1;k<=100;k++) s=s+k; printf("s=%d\n",s); }
for语句完全可以用while代替,但for直观、简单、方便。for语句完全可以用while代替,但for直观、简单、方便。 for (表达式1; 表达式2; 表达式3 ) 语句; for用while代替的流程: 表达式1; while(表达式2) { 语句 表达式3; }
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;
if (a>b) {i=b; j=a;} for (; i<=j; i++) sum=sum+i; printf (" \n sum=%d", sum); }
表达式2一般不可省略,否则为无限循环 例: for (i=1;; i++) sum=sum+i; 相当于条件永真、永不为0,若用while表示 相当于: while (1) { sum=sum+i; i++; }
表达式3亦可省略,但在循环体中须有语句修改循环变量;以使表达式2在某一时刻为0而正常结束循环。表达式3亦可省略,但在循环体中须有语句修改循环变量;以使表达式2在某一时刻为0而正常结束循环。 例: for (sum=0,i=1;i<=100;) { sum=sum+i; i++; }
若同时省略表达式1,表达式3,则相当于while(表达式2)语句。若同时省略表达式1,表达式3,则相当于while(表达式2)语句。 例: for (; i<=100;) {sum+=i; i++;} 相当于while (i<=100) {sum+=i; i++; }
三个表达式均省略 即for(;;)语句则相当于while(1)语句. 表达式1、表达式3可以是逗号表达式,以使循环变量值在修改时可以对其它变量赋值。 如for (sum=0, i=1; i<=100; i++, i++) sum=0; for (i=1; i<=100; i=i+2)
表达式2可以是关系表达式,也可以是数值表达式或字符表达式。只要值0.即执行循环体.表达式2可以是关系表达式,也可以是数值表达式或字符表达式。只要值0.即执行循环体. 例:for (i=0; (c=getchar( ))!='\n'; i+=c) ; 请思考以下程序段的执行结果: for(i=1;i<=20;i++) ; printf(“%d “, i);
§5.5循环的嵌套 与其它语言一样,当循环体中又包含了另一个完整的循环语句时–––嵌套。 C有三种循环语句,均可以相互嵌套: while ( ) {… while ( ) …{ } }
for (; ;) {… while ( ) { } do { } while ( ); … }
程序举例 • 编写程序,在一行内输出整数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"); } }
程序举例 • 编程输出”九九乘法口诀表“ #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"); } }
§三种循环的比较 1. for循环功能强于while, do…while.但若不是明显地给出循环变量初终值(或修改条件),则应用while 或do …while.以增强程序的结构化和可读性。 2. 要防止无限循环––死循环。 3. 循环过程中,为了结束本次循环或跳出整个循环。分别要用到continue和break语句。
§5.6 break语句 break语句 语法格式: break; 在循环体中的功能: 终止最内层循环。从包含它的最内层循环语句中(while、do……while、for)中退出,执行包含它的循环语句的下一条语句。
问题: 计算圆的面积r2, 半径取1, 2, 3, 4…,当面积>100时结束。 for(r=1; r<=10; r++) { area=pirr; if (area>100) break; } printf (“r=%d,area=%f", area); 从结构化程序要求出发,用break;退出循环,进入for语句的下一条语句。
举例:编程求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); } 返回
5.7 contiune语句 1. continuce语句 格式:continue; 功能: 结束本次循环(即本次循环体中continue后面的部分不执行),开始下一次循环。 continue用在while和do……while语句中与用在for语句中略有不同。在for语句中将终止本次循环体运行,但是要计算表达式3。
问题: 编写程序,打印100~200中不能被3整除的数。 main( ) { int n; for (n=100; n<200; n++) if (n%3!=0) printf("%d", n); }
换一种方式: main ( ) { int n; for (n=100; n<=200; n++) {if (n%3= =0) continue; printf ("%d", n); } } continue语句起了结束本次循环的作用。
2. break与continuce的区别 • break与continue都可以用在循环体中,使用时要注意两者的区别: • break是使内层循环立即终止,执行循环体外的第一条语句,而continue语句是终止本次循环,执行下一次循环; • break语句可用在switch语句中,而continue则不能。
比较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); } 请思考上述两个程序的运行结果。
5.8 控制循环的实用方法 控制循环的方法大致可以分为以下几种: • 计数循环 • 哨兵循环 • 计数哨兵循环 • 询问循环 • 输入验证循环等
1 计数循环和哨兵循环 计数循环程序段: for(i=1,sum=0;i<=99;i=i+2) sum=sum+i; 哨兵循环程序段: c=getchar(); while(c!=‘$’) { putchar(c); c=getchar(); }
编程求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); }
3. 询问循环 例5.23:编写程序输入某门功课的若干个同学的成绩,并计算平均分,通过询问循环来控制输入是否停止 本程序在每次接收用户输入的分数以前,都要询问用户是否需要继续输入数据。如果用户回答“Y”,则循环继续,如果用户回答“N”,则循环结束。 具体程序代码如下:
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!");
P124习题18:假设某高速公路的一个收费站的收费标准为:小型车15元/车次、中型车35元/车次、大型车50元/车次、重型车70元/车次。编写程序,循环显示下列列表,请用户选择车型,根据用户的选择输出应交的费用,直到用户选择“退出”,程序结束。P124习题18:假设某高速公路的一个收费站的收费标准为:小型车15元/车次、中型车35元/车次、大型车50元/车次、重型车70元/车次。编写程序,循环显示下列列表,请用户选择车型,根据用户的选择输出应交的费用,直到用户选择“退出”,程序结束。 1-小型车 2-中型车 3-大型车 4-重型车 5-退出 参考P115例5.24
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"); } } • 程序代码如下:
§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);
例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);
例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个数时换行。
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"); } 方法一:
方法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");