《第五章 循环结构程序设计.ppt》由会员分享,可在线阅读,更多相关《第五章 循环结构程序设计.ppt(70页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1 第一节第一节 循环的基本概念循环的基本概念 第二节第二节 while语句语句 第三节第三节 do-while语句语句 第四节第四节 for语句语句 第五节第五节 几种循环的比较几种循环的比较 第六节第六节 循环的嵌套循环的嵌套 第七节第七节 break和和continue语句语句 第八节第八节 应用实例应用实例2 25.1 循环循环的概念的概念什么是循环?什么是循环?为什么要使用循环?为什么要使用循环?循环是有规律的重复操作循环是有规律的重复操作。将复杂问题将复杂问题分解分解为简单的操作过为简单的操作过程,程序只对简单过程描述,这些过程的多次程,程序只对简单过程描述,这些过程的多次重复重复
2、就可完成对问就可完成对问题的求解。题的求解。一、循环问题一、循环问题问题问题1 1:求:求1+2+3+1+2+3+100+100的和。的和。问题问题2 2:找出找出整整数数1110001000中中能同时被能同时被3 3和和7 7整除的数。整除的数。l if-goto 循环循环l while循环循环l for循环循环l do while循环循环 先判断后循环先判断后循环 (当型循环)(当型循环)先循环先循环后后判断判断 (直到型循环)(直到型循环)3 3l 循环变量的初始循环变量的初始值值l 循环进入条件循环进入条件l 循环体循环体l 循环变量的循环变量的增值增值循循环环的的基基本本要要素素循环
3、变量的初值循环变量的初值满足条件则执行循环体满足条件则执行循环体重复执行的语句重复执行的语句循环变量的改变循环变量的改变,进一步测进一步测试条件试条件5.1 5.1 循环的概念循环的概念(完完)二、循环结构二、循环结构循循环体体N条件条件Y入口入口出口出口条件条件NY循循环体体先循环后判断先循环后判断先判断后循环先判断后循环4 4 5.2 5.2 无条件转向语句无条件转向语句二、标号语句二、标号语句格式:标号标识符:语句格式:标号标识符:语句功能:指示语句在程序中的位置,作为转移语句的转移功能:指示语句在程序中的位置,作为转移语句的转移目标目标 一、一、goto语句(无条件转向语句)语句(无条
4、件转向语句)格式:格式:goto 标号标识符标号标识符功能:执行该语句时,将程序流程无条件地转向指功能:执行该语句时,将程序流程无条件地转向指定定标号所在的语句标号所在的语句继续执行。继续执行。标号由数字,字母,下划线组成标号由数字,字母,下划线组成goto loop;loop:if(x=y)5 5 gotogoto 语句标号语句标号语句标号语句标号;语句标号语句标号语句标号语句标号:语句标号语句标号语句标号语句标号:gotogoto 语句标号语句标号语句标号语句标号;或或或或scanf(“%d,%d”,&x,&y);loop:if(x=y)t=x;x=y;y=t;goto loop;6 6m
5、ain()int k,sum=0;k=1;loop:if(k=100)sum=sum+k;k+;goto loop;printf(“%d”,sum);5.2 5.2 无条件转向语句无条件转向语句例:求例:求例:求例:求1 1100100的累计和的累计和的累计和的累计和7 71.格式:格式:2.功能:功能:先判断先判断表达式表达式的值,若为非零,的值,若为非零,重复重复执行循环执行循环体语句,再判断体语句,再判断直到表达式的值为零,退出循环体。直到表达式的值为零,退出循环体。即:测试即:测试-执行执行-测试测试-执行执行-5.2 5.2 用用whilewhile设计循环结构设计循环结构100wh
6、ile(while(表达式表达式表达式表达式)循环体语句;循环体语句;循环体语句;循环体语句;8 8l特点:先判断表达式,后执行循环体特点:先判断表达式,后执行循环体l说明:说明:循环体有可能一次也不执行循环体有可能一次也不执行循环体可为任意类型语句循环体可为任意类型语句下列情况,退出下列情况,退出while循环循环l条件表达式不成立(为零)条件表达式不成立(为零)l循环体内遇循环体内遇break,return,goto无限循环无限循环:while(1)循环体循环体;9 9语语言言程程序序设设计计教教程程 第第六六章章 循循环环结结构构程程序序设设计计C【例例例例】用用用用whilewhile
7、whilewhile语句求语句求语句求语句求1 1 1 1100100100100的累计和。的累计和。的累计和。的累计和。#include#include main()main()intint i=1,sum=0;i=1,sum=0;while(i=100)while(i=100)sum+=i;sum+=i;i+;i+;printfprintf(sum=%(sum=%dndn,sum);,sum);循环初值循环初值循环初值循环初值循环终值循环终值循环终值循环终值循环条件循环条件循环条件循环条件循环体循环体循环体循环体循环变量增值循环变量增值循环变量增值循环变量增值运行结果:运行结果:运行结果:
8、运行结果:sum=5050sum=50501010main()int number=0;while(number=1)number+;printf(“%dn”,number);结果:结果:1 2number初值为初值为 0,条件为条件为number=11.number为为0,满足条件满足条件 number为为0,然后自增为然后自增为1输出输出number 12.number为为1,满足条件满足条件 number为为1,然后自增为然后自增为2输出输出number 23.number为为2,不满足条件不满足条件5.2 5.2 用用whilewhile设计循环结构设计循环结构(续续)11113.3.
9、说明说明:(1 1)当循环体中语句多于一)当循环体中语句多于一条时,用条时,用 ,否则,循环只,否则,循环只对第一个语句;起作用对第一个语句;起作用.(2 2)循环体内部必须有实现)循环体内部必须有实现对循环变量增值的语句,否对循环变量增值的语句,否则,易出现则,易出现“死循环死循环”.(3 3)条件表达式要有括号条件表达式要有括号,后面不加分号后面不加分号.(4 4)注意条件的边界值注意条件的边界值.例题:求例题:求 1+2+3+n=10000的最大的的最大的n。main()int a,k;a=k=0;while(a=10000)+k;a+=k;printf(“1+2+3.+%d=%dn”,
10、k-1,a-k);5.2 5.2 用用whilewhile设计循环结构设计循环结构(续续)1212【例例例例】显示显示显示显示1 1 1 110101010的平方的平方的平方的平方#include#include main()main()intint i=1;i=1;while(i=10)while(i=10)printfprintf(%d*%d=%(%d*%d=%dndn,i,i,i*i);,i,i,i*i);i+;i+;运行结果:运行结果:运行结果:运行结果:1*1=11*1=12*2=42*2=43*3=93*3=94*4=164*4=165*5=255*5=256*6=366*6=36
11、7*7=497*7=498*8=648*8=649*9=819*9=8110*10*1010=100=100语语言言程程序序设设计计教教程程 第第六六章章 循循环环结结构构程程序序设设计计C1313【例例例例】求两个正整数的最大公因子。求两个正整数的最大公因子。求两个正整数的最大公因子。求两个正整数的最大公因子。我们采用我们采用我们采用我们采用EuclidEuclid(欧几里德)算法来求最大公因子,其算法是:(欧几里德)算法来求最大公因子,其算法是:(欧几里德)算法来求最大公因子,其算法是:(欧几里德)算法来求最大公因子,其算法是:(1)(1)输入两个正整数输入两个正整数输入两个正整数输入两个
12、正整数mm和和和和n n。(2)(2)用用用用mm除以除以除以除以n n,余数为,余数为,余数为,余数为r r,如果,如果,如果,如果r r等于等于等于等于0 0,则,则,则,则n n是最大公因子,算法结束,否则是最大公因子,算法结束,否则是最大公因子,算法结束,否则是最大公因子,算法结束,否则(3)(3)。(3)(3)把把把把n n赋给赋给赋给赋给mm,把,把,把,把r r赋给赋给赋给赋给n n,转,转,转,转(2)(2)。#include#include void main()void main()intint m,n,r;m,n,r;printfprintf(Please input t
13、wo positive integer:);(Please input two positive integer:);scanfscanf(%(%d%dd%d,&m,&n);,&m,&n);while(n!=0)while(n!=0)r=m%n;r=m%n;/求余数求余数求余数求余数 m=n;m=n;n=r;n=r;printfprintf(Their greatest common divisor is%(Their greatest common divisor is%dndn,m);,m);运行结果:运行结果:运行结果:运行结果:Please input two positive int
14、eger:24 56Please input two positive integer:24 56 Their greatest common divisor is 8Their greatest common divisor is 8语语言言程程序序设设计计教教程程 第第六六章章 循循环环结结构构程程序序设设计计C14145.3 5.3 用用do-whiledo-while设计循环结构设计循环结构1.格式:格式:2.功能:功能:先执行循环体先执行循环体,再判断表达式的值,若为非零,再判断表达式的值,若为非零,重复执行循环体语句,再判断重复执行循环体语句,再判断.直到表达式的值为直到表达式的值
15、为零,退出循环体零,退出循环体即:执行即:执行-测试测试-执行执行-测试测试-条件条件NY循循环体体do do do do 循环体语句;循环体语句;循环体语句;循环体语句;while(while(while(while(表达式表达式表达式表达式););););1515语语言言程程序序设设计计教教程程 第第六六章章 循循环环结结构构程程序序设设计计C【例例例例】用用用用do_whiledo_whiledo_whiledo_while语句求语句求语句求语句求1 1 1 1100100100100的累计和。的累计和。的累计和。的累计和。#include#include void main()void
16、 main()intint i=1,sum=0;i=1,sum=0;do do sum+=i;sum+=i;i+;i+;while(i=100);while(i=100);printfprintf(sum=%(sum=%dndn,sum);,sum);运行结果:运行结果:运行结果:运行结果:sum=5050sum=50501616 main()int n=1,s=0,x;scanf(%d,&x);do s=s+n;do s=s+n;n+;n+;while(n=x);while(n=x);printf(s=%dn,s);5.3 5.3 用用do-whiledo-while设计循环结构设计循环结构
17、(续续)n=xn=xs=s+ns=s+nYn+开始开始初始化初始化n,sn,sN结束结束输入输入x x输出输出s s问题:输入一个问题:输入一个x,求,求1+2+3+.+x1717 main()int s=0,x;scanf(%d,&x);while(x=10)s=s+x;x+;printf(s=%dn,s);main()int s=0,x;scanf(%d,&x);do s=s+x;x+;while(x=10);printf(s=%dn,s);输入:输入:12输出:输出:s=12循环至少循环至少执行一次执行一次循环没有循环没有被执行被执行输入:输入:12输出:输出:s=03、whilewhi
18、le与与do whiledo while的比较的比较 5.3 5.3 用用do-whiledo-while设计循环结构设计循环结构(完完)1818例例 while和和dowhile比较比较#include main()int i,sum=0;scanf(%d,&i);do sum+=i;i+;while(i=10);printf(%d,sum);main()int i,sum=0;scanf(%d,&i);while(i=10)sum+=i;i+;printf(%d,sum);输入输入11,sum11输入输入11,sum0输入输入11?1919计算计算表达式表达式1 1初值初值;计算计算表达式
19、表达式2 2并判断并判断,0 0 时跳出循环,非时跳出循环,非0 0 时执行循环;时执行循环;当表达式当表达式2 2非非0 0,执行循环体语句,计算,执行循环体语句,计算表达式表达式3 3增量增量;自动转到第二步自动转到第二步(计算计算表达式表达式2)2).继续执行。继续执行。forfor语句语句 初值表达式初值表达式1 条件表达式条件表达式2 增量表达式增量表达式3for(表达式表达式1;表达式表达式2;表达式表达式3)语句组语句组 5.4 5.4 用用forfor语句设计循环结构语句设计循环结构1.格式格式:2.功能功能:main()int n,s;for(n=1;n=100;n+)s=s
20、+n;printf(“%dn”,s);变量的增量变量的增量循环体循环体变量的初值变量的初值循环条件循环条件2020 1.1.表达式表达式1,1,表达式表达式2 2和表达式和表达式3 3均可缺省均可缺省for(;n100;n+)缺省缺省e1,n 应在循环之前赋初值应在循环之前赋初值 for(n=0;n+)缺省缺省e2,造成死循环,不可使用!造成死循环,不可使用!for(n=0;n100;)缺省缺省e3,n增量应在循环体内进行增量应在循环体内进行for(;)缺省缺省e1,e2,e3 死循环死循环for(;n100;)缺省缺省e1,e3分号始分号始终不能缺省!不能缺省!3.说明说明不可用不可用 5.
21、4 5.4 用用forfor语句设计循环结构语句设计循环结构(续续)2121for(初值初值;判断判断;增量增量)语句;语句;for(初值初值;判断判断;增量增量)复合语句复合语句;for(初值初值;判断判断;增量增量);2.2.表达式表达式1 1和和表达式表达式3 3可是与初值、增量无关的逗号表达式可是与初值、增量无关的逗号表达式for(s=0,n=1;n=100;s=s+n,printf(“%d”,s)n+;for(s=0;n100;s=s+n,n+)printf(“%d”,s);求累加和求累加和n的初值在的初值在for之前之前完成完成增量在增量在for之外完成之外完成forfor语句的形
22、式:语句的形式:5.4 5.4 用用forfor语句设计循环结构语句设计循环结构(续续)2222 main()int n=1,s=0,x;scanf(%d,&x);loop:if(n=x)s=s+n;n+;goto loop;printf(s=%dn,s);10s=55100s=5050255s=32640while(n=x)while(n=x)for(;n=x;)for(;n=x;)if-gotoWhile(n=x)While(n=x)for(;n=x;)循环结束循环结束5.4 5.4 用用forfor语句设计循环结构语句设计循环结构(续续)n=xn=xs=s+ns=s+nn+开始开始初始化
23、初始化n,s,xn,s,xN结束结束输入输入x xY输出输出s s2323main()int n,s;for(n=1;n=10;n+=2)printf(n=%dn,n);main()int n,s;for(n=1;n=10;n+=2);printf(n=%dn,n);以下以下程序的输出结果程序的输出结果输出结果:输出结果:n=11输出结果:输出结果:n=1n=3n=5n=7n=9无循环体无循环体 循环体循环体;特点:先判断后循环特点:先判断后循环printf(n=%dn,n);5.4 5.4 用用forfor语句设计循环结构语句设计循环结构(完完)2424例:#include main()in
24、t i=0;for(i=0;i10;i+)putchar(a+i);运行结果:abcdefghij例:#include main()int i=0;for(;i10;i+)putchar(a+i);例:#include main()int i=0;for(;i10;)putchar(a+(i+);例:#include main()int i=0;for(;i10;putchar(a+i),i+);25255.5 5.5 几种循环的比较几种循环的比较1、C中的三种循环语句中的三种循环语句while(),do-while(),for()都可由表达式控制重复执行一个循环体,都可以用来都可由表达式控制
25、重复执行一个循环体,都可以用来解决同一个问题,一般情况下,可以相互代替。解决同一个问题,一般情况下,可以相互代替。2、三种循环各有特点、三种循环各有特点:1)当循环次数及条件在程序运行中才能确定时,选用当循环次数及条件在程序运行中才能确定时,选用while()或或do-while()语句语句两者区别两者区别:while()顶部测试顶部测试,可能一次也不执行,可能一次也不执行 do-while()底部测试底部测试,至少执行一次,至少执行一次26265.5 5.5 几种循环的比较几种循环的比较(完完)(2)如果初值,条件明显,循环次数已给出,选用如果初值,条件明显,循环次数已给出,选用for()语
26、句,功能最强。语句,功能最强。(3)出现出现“死循环死循环”的几种情况的几种情况 for(;)for(.;非零常数表达式;非零常数表达式;)while(非零常数表达式)非零常数表达式)do.while(非零常数表达式)非零常数表达式)main()int I=0,j=5;while(j10)j=I*2;printf(“%d”,j);结果为:结果为:?2727循环的嵌套v三种循环可互相嵌套,层数不限v外层循环可包含两个以上内循环,但不能相互交叉v嵌套循环的执行流程(1)while()while().(2)do do while();.while();(3)while()do while();.(4
27、)for(;)do while();while().内循环外循环内循环v嵌套循环的跳转禁止:l从外层跳入内层l跳入同层的另一循环l向上跳转5.6 5.6 循环的嵌套循环的嵌套28285.6 5.6 循环的嵌套循环的嵌套 一、循环嵌套的概念一、循环嵌套的概念 1 2 3 4 5 6 7 8 91 2 3 4 5 6 7 8 9-1 12 42 43 6 93 6 94 8 12 164 8 12 165 10 15 20 255 10 15 20 256 12 18 24 30 366 12 18 24 30 367 14 21 28 35 42 497 14 21 28 35 42 498 1
28、6 24 32 40 48 56 648 16 24 32 40 48 56 649 18 27 36 45 54 63 72 819 18 27 36 45 54 63 72 81在循环体中,又包含在循环体中,又包含有循环结构。有循环结构。行循环中包含了列循环。行循环中包含了列循环。2929例 循环嵌套,输出九九表1234567891234567892468101214161836912151821242791827364554637281.ij/*ch5_5.c*/#include main()int i,j;for(i=1;i10;i+)printf(%4d,i);printf(n-n)
29、;for(i=1;i10;i+)for(j=1;j10;j+)printf(j=9)?%4dn:%4d,i*j);3030i10printf假(0)真(非0)i=1j+j=1j10真(非0)假(0)i+for(i=1;i10;i+)for(j=1;j10;j+)printf(j=9)?%4dn:%4d,i*j);外循环内循环3131 二、嵌套结构规则二、嵌套结构规则 外循外循环内循环内循环交叉循环交叉循环外循环外循环入口入口内循环出口内循环出口内循环出口内循环出口外循环出口外循环出口5.6 5.6 循环的嵌套循环的嵌套(续续)三、循环嵌套的运行过程三、循环嵌套的运行过程外层循环取一个值,内层循
30、环取遍所有的值外层循环取一个值,内层循环取遍所有的值3232每只公鸡每只公鸡5个钱,每只母鸡个钱,每只母鸡3个钱,每个钱,每3只小鸡只小鸡1个钱,用个钱,用100个钱,买个钱,买100只鸡,问公鸡、母鸡只鸡,问公鸡、母鸡和小鸡各买几只?和小鸡各买几只?分分析析定义变量定义变量x,y,z,表示公鸡、母鸡和小鸡的只数表示公鸡、母鸡和小鸡的只数int x,y,z;for(x=1;x=20;x+)for(y=1;y=33;y+)for(z=1;z=300;z+).程序运算程序运算多少次?多少次?5.6 5.6 循环的嵌套循环的嵌套(续续)33335.6 5.6 循环的嵌套(续)循环的嵌套(续)x最多为
31、最多为20,y最多为最多为33,当当x,y已确定时,已确定时,z的值为的值为100-x-ymain()int x,y,z;for(x=1;x20;x+)for(y=1;y=33;y+)z=100-x-y;if(5*x+3*y+z/3=100)printf(“%d,%d,%dn”,x,y,z);共六组解共六组解:x y z3 20 774 18 787 13 808 11 8111 6 8312 4 84所求的所求的z不能被不能被3整整除如何解决除如何解决?3434main()int a,b,c,k=0;for(a=0;a=100;a+)for(b=0;b=50;b+)for(c=0;c=20;
32、c+)if(a+2*b+5*c=100)k+;printf(“%dn”,k);将一元钱换成一分,将一元钱换成一分,二分和五分的硬币,二分和五分的硬币,共有多少种换法?共有多少种换法?定义变量定义变量a,b,c定义变量定义变量 k5.6 5.6 循环的嵌套循环的嵌套(续续)3535l要求:要求:从键盘输入从键盘输入m m值,输出值,输出m m行每行行每行m m个个*号。号。例:输入例:输入m=4m=4,输出的图形如下:输出的图形如下:l思路:思路:l1.输入输入m;l2.重复重复打印打印m行,每行打印行,每行打印m个个*;*1.输入输入m;2.for(k=1;k=m;k+)打印一行中的打印一行中
33、的 m 个个 *;5.6 5.6 循环的嵌套循环的嵌套(续续)36365.6 5.6 循环的嵌套(完)循环的嵌套(完)l细化:细化:1.输入输入m;2.for(k=1;k=m;k+)打印打印 m 个个 *;换新行换新行;l1.输入输入m;2.for(k=1;k=m;k+)for(j=1;j=m;j+)printf(“*”);printf(“n”);main()int k,m,j;scanf(“%d”,&m);for(k=1;k=m;k+)for(j=1;j=m;j+)printf(“*”);printf(“n”);37375.7 break5.7 break和和continuecontinue
34、语句语句lbreak语句格式语句格式break;lbreakbreak语句的功能语句的功能 1.1.在在switchswitch语语句句中中结结束束casecase子子句句,使使控控制制转转到到 switchswitch语句之外。语句之外。2.2.在在循循环环结结构构中中,breakbreak语语句句使使流流程程转转向向该该循循环环体体的的外层外层继续运行。向外退出继续运行。向外退出一层循环一层循环 breakbreak语句与语句与continuecontinue语句语句 3838 l辅助控制语句辅助控制语句break语句语句l功能:在循环语句和功能:在循环语句和switch语句中语句中,终止
35、并跳出循环终止并跳出循环体或开关体体或开关体l说明:说明:break只能只能终止并跳出最近一层的结构终止并跳出最近一层的结构break不能用于循环语句和不能用于循环语句和switch语句之外的任语句之外的任何其它语句之中何其它语句之中3939exprbreak;假(0)真(非0)whiledobreak;.expr假(0)真(非0)while4040expr2break;.假(0)真(非0)forexpr1expr3switchexpr语句组1break;语句组2break;语句组nbreak;语句组break;.const 1const 2const ndefaultcase 4141例例
36、break举例:输出圆面积,面积大于举例:输出圆面积,面积大于100时停止时停止#define PI 3.14159main()int r;float area;for(r=1;r100)break;printf(r=%d,area=%.2fn,r,area);4242例例 break举例:小写字母转换成大写字母举例:小写字母转换成大写字母,直至输入非字母字符直至输入非字母字符#include main()int i,j;char c;while(1)c=getchar();if(c=a&c=0;i-)if(i%13)=0)break;printf(“%dn”,i);5.7 break5.7
37、break和和continuecontinue语句语句(续续)4444lcontinue语句格式:语句格式:continue;continuecontinue语句的功能:语句的功能:continuecontinue语句仅能在循环语句中使用。语句仅能在循环语句中使用。它的作用不是结束循环,而是开始一次新的循它的作用不是结束循环,而是开始一次新的循环。环。结束一次循环结束一次循环对于对于forfor语句,将控制转到执行增量和条件测试语句,将控制转到执行增量和条件测试部分。部分。对于对于whilewhile和和do-whiledo-while语句,将控制转到条件测语句,将控制转到条件测试部分。试部分
38、。5.7 break5.7 break和和continuecontinue语句语句(续续)4545continue语句v功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断v仅用于循环语句中exprcontinue;假(0)真(非0)while真(非0)docontinue;.expr假(0)whileexpr2continue;.假(0)真(非0)forexpr1expr34646main()int x,y,z;for(x=1;x=20;x+)for(y=1;y=33-x;y+)z=100-x-y;if(5*x+3*y+z/3=100)if(z%3!=0)conti
39、nue;printf(“%d,%d,%dn”,x,y,z);将前面例题中将前面例题中,小鸡的数小鸡的数z中不能被中不能被3整除的解筛除整除的解筛除?5.7 break5.7 break和和continuecontinue语句语句(续续)4747breakbreak的使用的使用main()int i,j,a=0;for(i=0;i2;i+)for(j=0;j4;j+)if(j%2)break;a+;a+;#printf(“a=%dn”,a);a=4 a=5a=6 a=71.i=0j=0,if为为0,a从从0到到1j=1,if为为1 退出退出 j循环循环执行执行语句语句#a从从1到到22.i=1j
40、=0,if为为0,a从从2到到3j=1,if为为1 退出退出 j循环循环执行执行语句语句#a从从3到到45.7 break5.7 break和和continuecontinue语句语句(续续)4848main()int i,j,x=0;for(i=0;i2;i+)x+;for(j=0;j=3)Fn=Fn-1+Fn-2(n=3)5151 2.解题方法:解题方法:设计求每月兔子总数的通用程序。设计一个计设计求每月兔子总数的通用程序。设计一个计数器数器i i表示当前月数,变量表示当前月数,变量f1,f2f1,f2分别表示前两分别表示前两月兔子总数并分别输出,当计数器月兔子总数并分别输出,当计数器i
41、i值变为值变为2020时,能得出前四十个月所有兔子数时,能得出前四十个月所有兔子数(总数总数)。3.程序与流程图程序与流程图 5.8 5.8 循环应用循环应用(续续)5252 main()main()long f1,f2;long f1,f2;intint i;i;f1=1;f2=1;f1=1;f2=1;for(i=1;i=20;i+)for(i=1;i=20;i+)printf(printf(“%12ld,%12ld%12ld,%12ld”,f1,f2),f1,f2);if(i%2=0)printf(if(i%2=0)printf(“nn”););f1=f1+f2;f1=f1+f2;f2=f
42、2+f1;f2=f2+f1;5.8 5.8 循环应用循环应用(续续)开始开始初始化初始化f1,f2初始化初始化ii=20?输出输出f1和和f2Yf1=f1+f2f2=f1+f2N结束结束53535.8 5.8 循环应用循环应用例题例题C5-101.问题分析问题分析译密码译密码(输入一行字符,要求输出其相应的密码。输入一行字符,要求输出其相应的密码。)规律规律:将字母将字母A A变成字母变成字母E,E,(a(a变变成成e),e),即变成其后的第四个字即变成其后的第四个字母,母,W W变成变成A,XA,X变成变成B,YB,Y变成变成C,ZC,Z变成变成D D。非字母字符不变(如非字母字符不变(如“
43、China!China!”变成变成“GlmreGlmre!”)为使电文保密,往往按一定规律将其转换成密码,收为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。报人再按约定的规律将其译回原文。5454#include#include main()main()char c;char c;while(c=while(c=getchargetchar()!=()!=nn)if(if(c=c=a a&c&cz z|c=|c=A A&c=&cif(cZ Z&c=&c+4|cz z)c=c-26;c=c-26;printf(printf(“%c%c”,c,c););5.8 5.8
44、 循环应用循环应用(续续)开始开始定义定义cc!=n?Yc=c+4c=c-26N结束结束c为字母?为字母?YcZ&cz输出输出cYNYN小写字母都小写字母都Z+455555.8 5.8 循环应用循环应用(续续)例题:求两个数的最大公约数和最小公倍数例题:求两个数的最大公约数和最小公倍数辗转相除法辗转相除法已知两个数已知两个数M和和N,假定假定MN,则求则求M%N,若余数若余数r为为0,则,则N即为是所求,若余数即为是所求,若余数r不为不为0,用,用N除除 r,再求再求其余数其余数直到余数为直到余数为0,则除数就是最大公约数。,则除数就是最大公约数。两数的乘积除以最大公约数就是最小公倍数。两数的
45、乘积除以最大公约数就是最小公倍数。求求76 与与 64的最大公约数的最大公约数r=76%64,r 的值为的值为12 r不为不为0r=64%12,r 的值为的值为4 r不为不为0r=12%4,r 的值为的值为 076与与64的最大的最大公约数为公约数为45656最大公约数最大公约数程序:程序:main()int x,y,t,r;scanf(“%d,%d”,&x,&y);if(xy)t=x;x=y;y=t;while(x%y)r=x%y;x=y;y=r;printf(“%dn”,y);输入输入64,76交换交换x,y条件是:余数不为条件是:余数不为0除数做被除数,余数做除数除数做被除数,余数做除数
46、5757最大公约数和最小公倍数最大公约数和最小公倍数lmain()int p,r,n,m,temp;printf(“请输入两个正整数请输入两个正整数n,m:”);scanf(“%d,%d”,&n,&m);if(nm)temp=n;n=m;m=temp;p=n*m;while(m!=0)r=n%m;n=m;m=r;Printf(“它们的最大公约数为:它们的最大公约数为:dn”,n);Printf(“它们的最小公倍数为:它们的最小公倍数为:dn”,p/n);5858输入一行字符,分别统计出其中的英文字母、空输入一行字符,分别统计出其中的英文字母、空格、数字和其它字符的个数。格、数字和其它字符的个数
47、。lincludelmain()char c;int letter=0,space=0,digit=0,other=0;printf(“请输入一行字符请输入一行字符:n”);while(c=getchar()!=n)if(c=a&c=A&c=0&c=9)digit+;elseother+;printf(“字母数字母数d,空格数,空格数d,数字数数字数d,其它字符数其它字符数dn”,letter,space,digit,other);5959l例题:打印例题:打印“水仙花数水仙花数”l“水仙花数水仙花数”是指一个是指一个3位数,其各位数字的立方和等位数,其各位数字的立方和等于该数本身。于该数本身
48、。l例如:例如:153是一个是一个“水仙花数水仙花数”,1531353336060水仙花数水仙花数lincludelmain()int i,j,k,n;printf(“水仙花数是水仙花数是:”);for(n=100;n1000;n+)i=n/100;j=n/10-i*10;k=n%10;if(n=i*i*i+j*j*j+k*k*k)printf(“4d”,n”);printf(“n”);水仙花数:水仙花数:153 370 371 4076161l例题:有一个分数序列:例题:有一个分数序列:2/1,3/2,5/3,8/5,13/8,21/13,l求出这个数列的前求出这个数列的前20项之和。项之和
49、。6262lincludelmain()int i,t,n=20;float a=2,b=1,s=0;for(i=1;in;i+)s=s+a/b;t=a;a=a+b;b=t;printf(“sum=%9.6fn”,s);运行结果:运行结果:Sum32.6602596363l例题:两个乒乓球进行比赛,各出三人。甲对为例题:两个乒乓球进行比赛,各出三人。甲对为A,B,C三人,乙对为三人,乙对为X,Y,Z三人。已抽签决定比赛名单。有人向三人。已抽签决定比赛名单。有人向队员打听比赛的名单,队员打听比赛的名单,A说她不和说她不和X比,比,C说她不和说她不和X,Y比。请编程找出三对赛手的名单。比。请编程找
50、出三对赛手的名单。6464lincludelmain()char i,j,k;for(i=X;iZ;i+)for(j=X;jZ;j+)if(i!=j)for(k=X;kZ;k+)if(i!=k&j!=k)if(i!=X&k!=X&k!=Z)printf(“A-%ct B-%ct C-%cn”,i,j,k);6565第五章第五章 总结总结一一 有关循环的概念(满足条件重复执行一组语句)有关循环的概念(满足条件重复执行一组语句)二二 循环结构的表达方法:四种语句(循环结构的表达方法:四种语句(if-goto,while(),do-while(),for())三三 边界条件的处理(自增,自减在循环条