《第5章循环结构.ppt》由会员分享,可在线阅读,更多相关《第5章循环结构.ppt(65页珍藏版)》请在三一文库上搜索。
1、第5章 循环结构程序设计,C 语言程序设计,2019/4/9,2,5.1 while循环控制 (P50),语句一般格式 while (表达式) 语句,一般为关系表达式或逻辑表达式,也可以是C语言其他类型的合法表达式 用来控制循环体是否执行,称为内嵌语句,可以是基本语句、控制语句,也可以是复合语句 是循环重复执行的部分,2019/4/9,3,功能:,计算表达式的值,为非0(逻辑真)时,重复执行内嵌语句,每执行一次,就判断一次表达式的值,直到表达式的值为0 时结束循环,转去执行while后面的语句。,循环控制条件,循环体,2019/4/9,4,例如:,【例】编写程序,求100个自然数的和 即: s
2、=1+2+3+ +100,思路:寻找加数与求和的规律,加数i从1变到100,每循环一次,使i增1,直到i的值超过100。i的初值设为1。 求和设变量 sum 存放和,循环求sum=sum+i,直至i超过100。,2019/4/9,5,算法和程序:,main( ) int i,sum; i=1; sum=0; while (i=100) sum=sum+i; i+; printf(“sum=%dn“,sum); ,程序输出结果: sum=5050,i: 循环控制变量 sum: 累加器,2019/4/9,6,注意:,如果while的 (表达式) 值为0,则循环体一次也不执行 (例如当i的初值=10
3、1) 。 在循环体中必须有使循环趋向结束的操作,否则循环将无限进行(死循环)。 在循环体中,语句的先后位置必须符合逻辑,否则会影响运算结果。,思考程序段的输出? while (i=100) i+; sum=sum+i; ,运行后,输出: sum=5150 原因是什么?,2019/4/9,7,注意(续):,为了保证循环正常运行,应该特别注意: 循环控制条件的描述 控制条件的初始状态(初始值) 循环体内部对控制条件的影响,2019/4/9,8,例 ,显示110的平方,#include main() int i=1; while(i=10) printf(“%d*%d=%dn“,i,i,i*i);
4、i+; ,运行结果: 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,2019/4/9,9,#include main() int i=0,sum=0; while(sum10000) sum+=i*i; i+; printf(“i=%d sum=%dn“,i-1,sum); ,【例5.1】:编写程序,求122232n2,直到累加和大于或等于10000为止。,程序运行结果:i31 sum=10416,思考? while (sum10000) i+; sum+=i*i; ,2019/4/9,10,程序运行
5、结果:i30 sum=10415,#include main() int i=1,sum=0; while(sum10000) i+; sum+=i*i; printf(“i=%d sum=%dn“,i-1,sum); ,不符合题目要求,2019/4/9,11,思路:使用循环不断累加每项,每一项的分母比前一项 增加2,符号相反 设置: 设s为符号位,n为每项分母, t为每项值,t=s/n 每循环一次,s符号改变一次s=-s,分母加2,n=n+2 pi为所求 /4的值,pi=pi+t,例5.2 用 公式求 的近 似值,直到最后一项的绝对值小于10-6为止,2019/4/9,12,#include
6、 #include main( ) int s=1; float n=1.0,t=1.0,pi=0; while(fabs(t)=1e-6) pi=pi+t; n+=2.0; s=-s; t=s/n; pi=pi*4; printf(“pi=%fn“,pi); ,执行结果: pi=3.141594,设s为符号位,n为每项分母, t为每项值,pi为所求 的值,2019/4/9,13,5.2 do-while语句(P53),语句一般格式 do 语句 while (表达式); 功能: 先执行内嵌语句(循环体),之后计算表达式的值,不为0(逻辑真)时,再执行循环体并判断条件,直到表达式的值为 0 结束
7、循环,转去执行while下面的语句。,2019/4/9,14,do-while循环的算法,N-S结构图,main( ) int i=1,sum=0; do sum=sum+i; i+; while (i=100); printf(“%dn“,sum); ,用do-while语句 求100个自然数的和,2019/4/9,15,说明:,while和do-while都能实现循环控制,while结构程序通常都可以转换成do-while结构,区别: do- while 语句先执行循环体再判断条件,循环体至少执行一次; while 语句先判断条件再执行循环体,循环体有可能一次也不执行 dowhile循环体
8、中一定要有能使表达式值趋于0的操作(如i+),否则会出现死循环。,2019/4/9,16,do-while语句的简单应用,【例】用辗转相除法求m和n的最大公约数,2019/4/9,17,算法和程序:,main( ) int m,n,r; scanf(“%d, %d“, ,程序运行情况如下: 24, 60 12,2019/4/9,18,【例5.4】按Fibonacci数列,直到某项大于1000为止,并输出该项的值 。,思路:Fibonacci数列的前几项是:0、1、1、2、3、5、8、13、21、34、。此数列的变化规律是:,设变量f1、f2和f,并为f1和f2赋值为0和1,令f=f1+f2得到
9、第3项; 将f1f2, f2f,再求f=f1+f2得到第4项; 依此类推求第5项、第6项,这是一种递推算法 应采用循环实现,2019/4/9,19,算法和程序,#include main( ) int f1,f2,f; f1=0;f2=1; do f=f1+f2; f1=f2; f2=f; while(f2=1000); printf(“F=%dn“,f2); ,执行结果:F=1597,2019/4/9,20,5.3 for语句 (P55),语句一般格式 for (表达式1;表达式2;表达式3) 语句,功能: 计算表达式1的值,再判断表达式2,如果其值为非0(逻辑真),则执行内嵌语句(循环体)
10、,并计算表达式3;之后再去判断表达式2,一直到其值为0时结束循环,执行后续语句。,循环初始条件,循环控制条件,循环体,2019/4/9,21,for语句的算法,例如: main( ) int i,sum; sum=0; for ( i=1; i=100; i+) sum=sum+i; printf(“sum=%dn“,sum); ,可部分或全部省略,但“;”不可省略,2019/4/9,22,for语句的简单应用,【例】求n! ,即计算p=123n的值。,思路:求阶乘与求累加的运算处理过程类似,只要将“+”变为“*”。,设置: 乘数i ,初值为1,终值为n(n是循环控制终值,需要从键盘输入) 累
11、乘器 p ,每次循环令p = p*i,2019/4/9,23,程序:,main( ) int i, n; long p; p=1; printf(“Enter n:“); scanf(“%d“, ,思考: 如何输出1!, 2!, , n! ? 如何求s =1!+ 2!+ + n! ?,2019/4/9,24,【例5.6】计算半径为0.5mm、1.0mm、1.5mm、2.0mm、2.5mm时的圆面积,#include main( ) double r,s,Pi=3.1416; for (r=0.5; r=2.5; r+=0.5) s=Pi*r*r; printf(“r=%3.1f s=%fn“,
12、r,s); ,运行结果:r=0.5 s=0.785400 r=1.0 s=3.141600 r=1.5 s=7.068600 r=2.0 s=12.566400 r=2.5 s=19.635000,2019/4/9,25,【例5.4】按每行输出5个数的形式输出Fibonacci数列的前20项 。,思路:Fibonacci数列的前几项是:1、1、2、3、5、8、13、21、34、。此数列的变化规律是:,设变量f1、f2和f3,并为f1和f2赋初值1,令f3=f1+f2得到第3项; 将f1f2, f2f3,再求f3=f1+f2得到第4项; 依此类推求第5项、第6项,这是一种递推算法 应采用循环实现
13、,2019/4/9,26,算法和程序,#define N 20 main( ) int i,f1,f2,f3; f1=f2=1; printf(“n%8d%8d“,f1,f2); for (i=3; i=N; i+) f3=f1+f2; f1=f2; f2=f3; printf(“%8d“,f3); if (i%5=0) printf(“n“); ,2019/4/9,27,省略for语句的表达式, 表达式1、2、3全省略,即: for ( ; ; ) 就等同于:while (1),会无限循环(死循环),注意:在省略某个表达式时,应在适当位置进行循环控制的必要操作,以保证循环的正确执行, 省略表
14、达式1和表达式3,即: for(;表达式2;) 就等同于:while( 表达式2 ) 省略表达式2,即: for(表达式1; ;表达式3) 就等同于:表达式1; while(1)表达式3;,2019/4/9,28,例如:, i=1; for ( ; i100) for (i=1; i100) i+; ,2019/4/9,29,例:#include main( ) int i ; for(i=0;i10;i+) putchar(a+i); ,运行结果:abcdefghij,例:#include main( ) int i=0; for(;i10;) putchar(a+(i+); ,例:#inc
15、lude main( ) int i=0; for(;i10;i+) putchar(a+i); ,例:#include main( ) int i=0; for(;i10;putchar(a+i),i+) ; ,2019/4/9,30,说明:,所有用 while 语句实现的循环都可以用for 语句实现。,等价于:,for(表达式1;表达式2 ;表达式3) 语句;,表达式1; while (表达式2) 语句; 表达式3; ,2019/4/9,31,熟悉几个循环语句,while (!x) x+; 当 x=0 时,执行循环体x+;,while (c=getchar( ) != n) n=n+1;
16、n 称为计数器,作用是统计输入字符的个数 while (num+5); 先执行循环体x*=-3,再判断条件(x5) for (n=0; n26; n+) printf(“%c “, n+A); 作用是输出26个大写字母 for (sum=0, i=1; i=100; sum=sum+i, i+=2) ; 作用是计算100以内的奇数和,2019/4/9,32,几种循环语句的比较,while和do-while语句的表达式只有一个,for语句有三个。 while 和for先判断循环条件后执行循环体,do-while语句先执行循环体后判断循环条件。,while语句多用于循环次数不定的情况 do-whi
17、le语句多用于至少要运行一次的情况 for语句多用于要赋初值或循环次数固定的情况,2019/4/9,33,5.5 循环结构中的跳转语句(P59),有如下三种语句实现跳转: break语句 continue语句 在循环语句的循环体中使用,可以进行循环的流程控制,2019/4/9,34,5.5.1循环中break的应用,功能: 利用break语句能够强迫终止本循环,转到后续语句执行。,while语句,do-while语句,for语句,2019/4/9,35, int x,n=0,s=0; while (n5) scanf(“%d“, int x,n=0,s=0; do scanf(“%d“, fo
18、r (n=0,s=0; n5; n+ ) scanf(“%d“, ,2019/4/9,36,#include main( ) int i, s; for ( i=1; i+ ) s=s+i; if(s5000) break; printf(“s=%d,i=%dn”,s,i); ,输出结果:s=5050,i=100,【例5.9】计算s=1+2+3+i,直到累加到s大于5000为止,输出s和i的值,2019/4/9,37,5.5.2 continue语句及应用,功能: 中断循环体的本次执行(即跳过循环体中尚未执行的语句),立即开始执行下一次循环。,while语句,do-while语句,for语句,
19、2019/4/9,38,例5-5 :, int x,n=0,s=0; while (n5) scanf(“%d“, int x,n=0,s=0; do scanf(“%d“, for (n=0,s=0; n5; n+) scanf(“%d“, ,2019/4/9,39,【例5.10】 #include main( ) int k=0,s=0,i; for(i=1;i5) printf(“*i=%d,s=%d,k=%dn“,i,s,k); continue; k=k+s ; printf(“ i=%d,s=%d,k=%dn “,i,s,k); ,运算结果: i=1,s=1,k=1 i=2,s=3
20、,k=4 *i=3,s=6,k=4 *i=4,s=10,k=4 *i=5,s=15,k=4,2019/4/9,40,5.4. 循环的嵌套(P57),如果循环语句的循环体内又包含了另一条循环语句,则称为循环的嵌套 例如: #include main( ) int i, j; for ( i=1; i10; i+ ) for ( j=1; j=i; j+ ) printf (j=i)?“%4dn“:“%4d“,i*j); ,外循环语句,内循环语句,for ( j=1; j=i; j+ ) printf(“%4d“,i*j); printf(“n“); ,if(j=i)printf(“%4dn“,i
21、*j); else printf(“%4d“,i*j); ,2019/4/9,41,注意:,while、do-while、for循环语句可以并列,也可以相互嵌套,但要层次清楚,不能出现交叉。 多重循环程序执行时,外层循环每执行一次,内层循环都需要循环执行多次。 例如:,for(a=1;a=10;a+) for (b=0;b=5;b+) ,外循环执行了10次,内循环执行6次 循环正常结束时,内循环执行了106=60次,2019/4/9,42,【例5-24】编程序,输出以下图形。,* * * *,一共有4 行,每行由空格和星号组成:空格数按行增加,星号按行减少 变量 i 控制输出行数, 从1变化到
22、4 变量 j 控制输出每行的空格和星号: j 从1变化到 i,每次输出一个空格 j 从1变化到 8-2*i1,每次输出一个星号,使用双重循环实现,思路:,2019/4/9,43,算法和程序:,main( ) int i,j; for (i=1; i=4; i+) for (j=1; j=i-1; j+) printf(“ “); for (j=1;j=8-(2*i-1);j+) printf(“*“); printf(“n“); ,思考: 如何输出10行图形? 输出图形向右平移20个字符位置,应如何修改程序?,2019/4/9,44,思路:素数是指只能被1和它本身整除的数,如5、7、11、17
23、、等。,分别用2、3、,m-1(1m101)尝试能否整除整数m。如果m能被某个数整除,则m就不是素数。,这是一种穷举算法 设被除数为i,从2循环到100 设除数为k,从2循环到i-1,【例5.8】编写程序,找出2100以内的所有质数(素数),2019/4/9,45,#include main( ) int k, i, tag; for ( i=2; i=100; i+ ) tag=0; for ( k=2; ki; k+ ) if(i%k=0) tag=1; if (tag=0) printf(“%d, ”,i); ,程序:,2019/4/9,46,对于穷举法来说,为了提高程序的效率,就要减少
24、尝试次数。 比如在上例中: 首先,在外循环中,偶数肯定不是素数,只需判断奇数。 其次, 在内循环中,只需判断到不能被 整除即可。,程序的优化,程序优化为: #include “math.h“ #include main( ) int k, i, tag; printf(“2, ”); for ( i=3; i=100; i+=2 ) tag=0; for ( k=2; tag=0 if (tag=0) printf(“%d, ”,i); ,2019/4/9,47,5.6 循环结构程序举例,【例5.11】 从输入的若干个大于零的正整数中选出最大值。用-1结束输入。,思路: 1.用第一次循环处理输
25、入的若干负整数, 2.用第二次循环从输入的正整数中找出最大值,2019/4/9,48,#include main() int x,max; printf(“Enter -1 to end: n”); do printf(“Enter x : ”); scanf(“%d”, ,当输入以下数据时: 25 -6 18 12 -9 45 12 42 -1 输出结果如下: max=45,2019/4/9,49,方法2:,#include void main() int i,max=0; do scanf(“%d“, ,2019/4/9,50,【例5.3】用迭代法求方程 的根,要求误差小于10-6,此方程
26、没有解析根,只有通过迭代法求数值根 算法: 1.x1=0,x2=cosx1. 2.判|x2-x1|10-6,若小于则x1=x2,重复执行1,否则执行3 3.计算结果输出,2019/4/9,51,#include #include void main() double x1=0.0,x2=cos(x1); while(fabs(x2-x1)1e-6) x1=x2; x2=cos(x1); printf(“x=%fn”,x2); ,执行结果: X=0.739086,程序:,2019/4/9,52,【例】:使用双重for循环打印下面的图形. * * * #include void main() in
27、t k,i,j; for(i=0;i=2;i+) for(k=1;k=i;k+) printf(“ ”); for(j=0;j=3;j+) printf(“*”); printf(“n”); ,2019/4/9,53,【例】编写程序,求1-3+5-7+-99+101的值,#include void main() int i=1,t,sum=1; int s=1; while(i=99) i=i+2; s=-s; t=i/s; sum=sum+t; printf(“%d“,sum); ,2019/4/9,54,方法2:,#include void main() int i,t,sum=0; in
28、t s=-1; for(i=1;i=101;i+=2) s=-s; t=i/s; sum=sum+t; printf(“%d“,sum); ,2019/4/9,55,应用举例,【例5.6】把100200之间能被7整除的数,以十个数为一行的形式输出,最后输出一共有多少个这样的数。,for (n=100; n=200; n+) n能被7整除 T F 输出 n 输出10个数 终止本次循环 换行 输出个数,T,F,2019/4/9,56,算法和程序,main( ) int n,j=0; for(n=100;n=200;n+) if (n%7!=0) continue; printf(“%6d“,n);
29、 j+; if (j%10=0) printf(“n“); printf(“ n j=%dn“,j); ,main( ) int n,j=0; for(n=100;n=200;n+) if (n%7=0) printf(“%6d“,n); else continue; j+; if (j%10=0) printf(“n“); printf(“n j=%dn“,j); ,2019/4/9,57,【例5】判断输入的某个数m是否为素数。若是素数,输出“YES”,若不是,输出“NO”。,思路:素数是指只能被1和它本身整除的数,如5、7、11、17、等。,分别用2、3、,m-1尝试能否整除整数m。如果m
30、能被某个数整除,则m就不是素数。,这是一种穷举算法 设除数为j,从2循环到m-1,2019/4/9,58,#include “math.h“ main( ) int j,m,k; printf(“Enter an integer number: “); scanf(“%d“, ,方法一:,2019/4/9,59,#include“stdio.h“ main() int m,r,i=2; scanf(“%d“, ,方法二,2019/4/9,60,main( ) int m,i,r; i=2; scanf(“%d“, ,方法三,2019/4/9,61,编程练习:,请编写程序统计输入的一行中小写字母
31、的个数。 输出公元1600年至2000年所有闰年的年号 请编写输出以下图案的程序,图案的行数由输入的值确定。 A BBB CCCCC 用一张五角的硬币换5分和1角的硬币(至少各一枚),问有哪几种算法 教材129页6.2、6.6、6.7、6.8、6.10、6.14,2019/4/9,62,练习1.请编写程序统计输入的一行中小写字母的个数。,#include void main() char c; int i=0; while(c=getchar()!=n) if(ca ,2019/4/9,63,练习2:打印闰年,#include void main() int i,j=0; for(i=1600;i=2000;i+) if(i%4=0 ,2019/4/9,64,练习3:打印图形,void main() int i,j,k,n; char c=A; scanf(“%d“, ,A BBB CCCCC,2019/4/9,65,练习4:换钱,#include void main() int x,y; for(y=1;y=0) printf(“x=%d,y=%dn“,x,y); ,
链接地址:https://www.31doc.com/p-2566873.html