- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第六章 循环控制
1
主要内容
三大循环语句 1. while语句 2. do-while语句 3. for语句 用于循环体内的控制语句 break语句 continue语句 循环的典型应用 分类统计、多项式累加、穷举、递推、 图案打印……
2
概述
通常需要使用循环的情况是:
• • 有重复的动作(循环体) 循环次数可以控制(循环条件)
打印出100到200之间所有的素数
}
}
28
程序举例
[例4]输入一个整数,计算它的位数,并反向输出。 思路:设一个数13579,一位一位地切下各位 循环结束条件: num==0; 同时计数 count=count+1;
13579 1357 9 9 bit
bit=num%10 num=num/10 count=0;输入num num!=0 bit=num%10
个变量
12
死 循 环!
永远不会退出的循环为死循环
–for (;;) {} –while (1) {} –do {} while (1) –除非确实需要,否则不要使用这样的形式, 它们使循环的中止条件变得不明朗。
一般情况下,要极力避免死循环
–通常程序不需要死循环。如果出现,往往 都是bug –时间过长的循环会造成“假死”现象,也 要考虑解决
k=sqrt(m); for(i=2;i<=k;i++) if(m % i==0)
break;
if(i>k) printf(“%d prime number\n”,m); else printf(“%d not a prime\n”,m); }
26
break语句和continue语句
#include <math.h> main() {int m, i, k,flag=1; /*flag为标志值*/ scanf(“%d”,&m);
#include <math.h> main() { int m,i,k; for(m=100;m<=200;m++) { k=sqrt(m); for(i=2;i<=k;i++) if(m % i==0) break; if(i==k+1) printf(“%d prime number\n”,m);
表达式为真? N
while后语句
Y
语句(循环体)
4
while 语句
[例] 求1+2+…+100的值
不能写成 if (i<=100)
main() { int i=1,sum=0; while (i<=100) { sum=sum+i; i++; } printf(“%d”,sum); } i=1,sum=0 i<=100 sum=sum+i i=i+1
for(i=1,j=100; i<j; i++,j--)
k=k+i+j;
10
for语句
常见循环条件的种类 1. 关系表达式: for( ;i<=100; ) 2. 逻辑表达式: for ( ;a>b && x<y; ) 3. 字符表达式: for ( ;(c=getchar()) != „\n‟; ) printf(“%c”,c);
循环的嵌套
循环的嵌套又称多重循环。 例:输出九九表
1×1=1
2×1=2 2×2=4
for(n=1;n<=9;n++) for(i=1;i<=n;i++)
9×3=27 ... 9×9=81
9×1=9
...
9×2=18 for(i=1;i==1;i++) printf(“%d×%d=%d ”,1,i,1*i) for(i=1;i<=2;i++) printf(“%d×%d=%d ”,2,i,2*i) for(i=1;i<=n;i++) printf(“%d×%d=%d ”,n,i,n*i)
k=sqrt(m); for(i=2;i<=k&&flag==1;i++) if(m % i==0) flag=0;
if(flag==1) printf(“%d prime number\n”,m); else printf(“%d not a prime\n”,m); }
27
break语句和continue语句
例如: 1+2+…+100
在C语言中可以用下列语句实现循环
1. 2. 3. 4. goto和if结合(有限适用原则) while do-while for
3
while 语句
while语句用来实现“当型循环” 格式:while(表达式) 语句
–表达式为真时 ( 非 0 值 ) ,执行 while 语句的内 嵌语句。
16
程序举例
[例2] 输入50个0-9的字符数字,计算数字串中
有多少个奇数,偶数和零。
思路:
1.输入50个字符数字,而不是整数: char num
2.注意50个字符的输入和50个数字的输入的区别
3.字符数字的ascii码:48 49 50 ……57
4.将字符变成数字后判断奇偶:i=num-‟0‟;
6
do-while 语句
[例] 求1+2+…+100的值
main() { int i=1, sum=0;
do{ sum=sum+i; i++; }while (i<=100);
i=1, sum=0 sum=sum+i; i++; 直到i>100 输出sum
printf(“%d”,sum)
}
7
for语句
14
程序举例
赋初值:计数器清零 读入一张选票
选票值如非结束标志
多分支判断
读入一张新选票
输出计数器的值
15
程序举例
main() { int vote,l_vote,z_vote,w_vote, invalidvote; l_vote=0; z_vote=0; w_vote=0; invalidvote=0; scanf(“%d”,&vote); while (vote!=-1) { switch (vote) {case 1: l_vote++;break; case 2: z_vote++;break; case 3: w_vote++;break; case 0: case 4: invalidvote++;break; } scanf(“%d”,&vote); } printf(“Li%2d,zhang%2d,wang%2d,invalid%2d”, l_vote,z_vote,w_vote,invalidvote); }
}
22
break语句和continue语句
break语句用来终止循环 continue用来结束本次循环
表达式1 y
语句 表达式2 n 语句 y break y continue n 表达式1 y 语句 表达式2 n 语句
n
循环的下一个语句
循环的下一个语句
23
break语句和continue语句
求面积小于等于100的半径 把100…200之间不能被3整除 为自然数的圆的面积 的自然数输出 #define PI 3.14 main() main() { int n ; { int r; for(n=100;n<=200;n++) float area; for(r=1; ;r++) { { if (n%3==0) area=PI*r*r; continue ; if(area>100) printf(“%d”,n); break; printf(“%f”,area); } } } 24 }
20
循环的嵌套
分析: 行的控制 i:1--8 1. „*‟的个数j与当前行的关系 j=2*i-1 2. „*‟前面的空格k与行的关系: 开始时,第一行有7个空格 每多一行,少一个空格k=8-i
for(i=1;i<=8;i++) {for(k=1;k<=8-i;k++) 输出空格; for(j=1;j<=(2*i-1);j++) 输出* 换行 }
19
循环的嵌套
for( 9次 ) { for( n 次) { } }
#include <stdio.h> main() { int n,i; for(n=1;n<=9;n++) { for(i=1;i<=n;i++) printf("%d×%d=%d printf("\n"); } }
",n,i,n*i);
输出 sum
如果有一个以上的语句循环,则必须用{ }构成复 合语句。
5
do-while 语句
do-while语句用来实现“直到型”循环结构 do{ do-while中的循环体至少执 行一次,而while语句中的 语句 }while(表达式); 循环体可能一次都不执行。
语句(循环体)
Y
表达式为真? N do-while后语句
输出bit;count++
1357 135 7
135 13 5
7
5
bit
bit
1 0
1
3