第6章循环结构.ppt
本章主要内容概述用while语句实现循环用dowhile语句实现循环用for语句实现循环循环的嵌套几种循环语句的比较break语句和continue语句程序举例,第六章 循环控制,6.1 概述,循环结构:程序设计中,经常需要重复相同的计算或处理过程。例如:全班有50个学生,统计各学生三 门课的平均成绩。,scanf(“%f,%f,%f”,输入学生1的三门课成绩,并计算平均值后输出,scanf(“%f,%f,%f”,输入学生2的三门课成绩,并计算平均值后输出,要对50个学生进行相同操作,重复50次,循环结构两大要素:循环体 可重复执行的语句或语句组循环条件 条件表达式,指出什么时候执行循环体,什么时候结束循环。,循环体语句,条件表达式,循环体语句,条件表达式,真,假,while的后续语句,1形式:while(条件表达式)循环体语句,6.3 while语句,例0:用 while 语句实现在屏幕上输出10行“I love programming!”。,分析:设计变量并赋初值 用int型变量i表示行数,初值为1设计循环条件 i10设计循环体 printf(“I love programming!n”);i+;用循环语句实现,void main()int i;i=1;while(i=10)printf(“I love programming!n”);i+;,条件表达式必须加括号,括号后不能有;,循环体包含多条语句时,不能少,例1:用 while 语句实现 1+2+3+100,分析:设计变量并赋初值 1.用int型变量sum存放和,初值为0 2.用int型变量i表示累加变量,初值为1设计循环体 sum=sum+i;i+;设计循环条件 i100用循环语句实现,程序流程图:,开始,初始化 sum=0;i=1;,判断:i=100?,sum=sum+i;,i=i+1;,输出 sum,结束,真,假,真,sum=sum+i;,i=i+1;,判断:i=100?,#include void main()int i,sum=0;i=1;while(i=100)sum=sum+i;i+;printf(%d,sum);,循环结束后,i的值是多少?,101,使用说明:1)在while的循环体中一定要有使循环趋于结束的语句;否则将形成死循环;2)注意循环操作的范围、花括号、分号的使用;3)注意给循环变量赋初值的位置及初值的正确性;,#include void main()int sum=0,i=1;while(i=100)sum=sum+i;i+;printf(sum%dn,sum);,程序:,i+;sum+=i;,i=0;,100,例 2求1到100之间的奇数之和,偶数之积。,sum=0 mul=1,i=100,i能整除2?,yes,no,mul=mul*i,sum=sum+i,输出sum,mul,i+;,i=1,main()double mul=1;int i=1,sum=0;while(i=100)if(i%2=0)mul=mul*i;else sum=sum+i;i+;printf(sum=%dn,sum);printf(mul=%en,mul);,main()int i,k1,k2,k;i=1;k1=1;k2=2;while(i=5)k=k1+k2;k1=k2;k2=k;i+;printf(%5d,k);,例 3读程序练习:,3 5 8 13 21,1形式:do 语句 while(表达式);,6.4 do-while语句,循环体语句,条件表达式,循环体语句,条件表达式,真,假,例 1用do_while 语句实现 1+2+3+100,分析:设计变量并赋初值 1.用int型变量sum存放和,初值为0 2.用int型变量i表示累加变量,初值为1设计循环体 sum=sum+i;i+;设计循环条件 i100用循环语句实现,void main()int i,sum=0;i=1;do sum=sum+i;i+;while(i=100);printf(sum=%d,sum);,i+;sum+=i;,i=0;,100,例2:计算表达式,12 23 34 n(n+1),1 1 1 1,+,+,+,.+,+.,的值,直到某一项的值小于10-3次方为止。,分析:1.累加项 t=2.循环条件为:t10-3,i(i+1),1,main()float sum=0,t;int i=1;do t=1.0/(i*(i+1);sum=sum+t;i+;while(t=1e-3);printf(sum=%fn,sum);,while循环与do_while循环小结:1.循环体内必须有使循环趋于终止的条件,while(i=100)sum=sum+i;i+;,do sum=sum+i;i+;while(i=100);,2.注意循环初值与循环条件,i=1;while(i=100)sum=sum+i;i+;,i=0;while(i100)i+;sum=sum+i;,3.do_while 循环的循环体至少执行一 次,while循环的循环体可能一次 也不执行。,4.在循环体至少执行一次的前提下,do_while与while 循环等价。,例3:求 n!,main()int i=1,n;double m=1;scanf(%d,main()int i=1,n;double m=1;scanf(%d,1.一般形式:for(表达式1;表达式2;表达式3)语句,for 的循环体,括号不可少,分号不可少,6.5 for语句,求表达式1,判表达式2,语句,求表达式3,for语句的下一个语句,真,非0,假,值为0,for语句执行过程示意,for(表达式1;表达式2;表达式3)语句,表达式1只执行1次;表达式2、3和内嵌语句执行多次,通常:表达式1用于对循环变量赋初值;表达式2给出循环条件;表达式3使循环变量增值;,循环类型:当型,for语句等价于下列语句:表达式1;while(表达式2)语句;表达式3;,例:#include void main()int i,sum=0;for(i=1;i=100;i+)sum=sum+i;printf(“sum=%dn”,sum);,例:for(i=0;i=10;i=i+2)printf(“%3d”,i);printf(“ni=%d”,i);运行结果:0 2 4 6 8 10 i=12例:for(i=10;i;i-)printf(“%d,”,i);运行结果:10,9,8,7,6,5,4,3,2,1,例:for(i=1,j=6;ij;i+,j-)printf(“%d*%d=%dn”,i,j,i*j);运行结果:1*6=6 2*5=10 3*4=12,3.说明:1)表达式1可省略,但分号不能省;如:int i=1,sum=0;for(;i=100;i+)sum=sum+i;2)若表达式2省略,循环条件永远为真;如:for(i=1;i+)printf(“%d,”,i);,死循环,3)表达式3也可省略,但应设法保证循环正常结束;如:for(i=1;i=100;)sum=sum+i;i+;4)可只给循环条件;i=1;for(;i=100;)sum=sum+i;i+;,5)三个表达式都可省;for(;)相当于 while(1)6)表达式1和表达式3可以是逗号表达式;如:for(i=1,sum=0;i=100;i+)sum=sum+i;,7)表达式2一般为关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值为非零就执行循环体。如:for(;(c=getchar()!=n;)printf(%c,c);注:尽量避免用实型变量控制循环次数。,在循环体内尽量避免改变循环变量的值,否则将难以预知循环次数。,例:void main()int i;for(i=1;i=20;i+)i=i+5;printf(%5d,i);printf(n);,运行结果为:6 12 18 24,修改了循环变量,概念:一个循环体内又包含另一个完整的循环结构。,6.6 循环的嵌套,例:do-while嵌套 例:do-while、for混合嵌套 do do do for(e1;e2;e3)while(e1);while(e);while(e);,错误的循环交叉形式:,说明:1)三种循环可以互相嵌套 2)嵌套可以是多层的,*,main()int i,j;for(i=1;i=5;i+)for(j=1;j=5;j+)printf(*);printf(n);,例:在屏幕上输出一个由5*5星号组成的方形。,四种循环一般可互相代替循环次数已知时,常用for 循环次数未知时,常用while或do-while。3.while和do-while循环的循环体中应包括使循环趋于结束的语句。4.for的功能强于while和do-while 5.循环变量初始化的位置不同。6.while和for循环是当型循环,do-while循环是直到型循环,6.7 几种循环的比较,一、break语句 作用:1)从循环体内跳出,即提前结束循环,接着执行循环下面的语句;2)break语句只能 用于循环语句和 switch 语句。,6.8 break语句和continue语句,#include void main()int r;float area;for(r=1;r100)break;printf(“r=%d,area=%-7.2fn”,r,area);printf(“r=%d”,r);,计算半径为1到10的各圆面积,直到面积大于100为止。,注意:在循环中使用了break语句后,循环语句的结束可能有两种:1.正常结束(正常出口);由于循环条件表达式为假2.非正常结束(异常出口):由break语句引起。,使用说明:1)内循环中的break仅跳出内循环结构;,if(e)break;,2)被循环语句嵌套的switch中出现的break,仅跳出switch;,switch(e)break;,二、continue 语句作用:结束本次循环,即跳过循环体中语句中下面尚未执行的语句,接着执行下一次是否执行循环的判定。,for(n=100;n=200;n+)if(n%3=0)continue;printf(“%d”,n);,if(n%3!=0)printf(“%d”,n);,例:for中用 continue 例:while中用continue for(e1;e2;e3)while(e1)if(e)continue;if(e)continue;,三、break语句和continue语句的区别是:1)continue 语句只结束本次循环,不终止整个循环的执行;2)break 语句是终止整个循环的执行,不再进行条件判断。,例:从键盘上任意输入一个正整数,判断其是否为素数。,素数:除了1和它本身之外没有其他因子的数。换句话说只要有因子(除了1和它本身之外)则该数一定不是素数,判断m是否素数:(穷举法)for(i=2;i=m-1;i+)if(m%i=0),若此循环正常结束则m是素数。,则m不是素数,成立,im-1,void main()int m,i;scanf(%d,方法1,main()int m,i,k=1;scanf(%d,方法2,标志变量,例用公式求的近似值,直到最后一项的绝对值小于10-6为止。/41-1/3+1/5-1/7+算法分析:1.循环累加 pi=pi+t;2.交替改变符号 s=-s;3.每项分子为 1,分母 n=n+2;,6.9 程序举例,#include void main()int s;float n,t,pi;t=1;pi=0;n=1;s=1;while(fabs(t)=1e-6)pi=pi+t;n=n+2;s=-s;t=s*1.0/n;printf(pi=%10.6fn,4*pi);,程序:,例 求Fibonacci数列:1,1,2,3,5,8,.的前40个数。,f1 f2 1 1,f1=f1+f2;f2=f2+f1;,fi=fi-1+fi-2,f1,2,f2,3,.,.,void main()long int f1,f2;int i;f1=1;f2=1;for(i=1;i=20;i+)printf(%12ld%12ld,f1,f2);if(i%2=0)printf(n);f1=f1+f2;f2=f2+f1;,与此解题方法类似的有:(迭代法)1、编写求 20+21+22+23+263 的程序。2、求1!+2!+3!+20!。3、有一个分数序列 2/1,3/2,5/3,8/5,13/8,21/13求出这个数列的前20项之和4、求:Sn=a+aa+aaa+aaaaaa,其中a是一个数字,n表示a的位数,n要求由键盘输入。等等。,void main()int i,j,m=0;for(j=100;jj-1)printf(%5d,j);m+;if(m%10=0)printf(n);printf(m=%dn,m);,例:求100200之间的所有素数及素数的个数。,输出10个素数后换行,与此解题方法类似的有:(穷举法、列举法)1、输出所有的水仙花数。2、找出11000之间的全部同构数。一个数等于它的平方数的右端,就称为同构数。如:5的平方是25,25的平方是625。3、编程找出1000之内的所有完数。一个数恰好等于它的因子之和,这个数就称为“完数”。例如:6的因子为1,2,3,而6=1+2+3,因此6是完数。,同构数:一个数等于它的平方数的右端。如:5的平方是25 25的平方是625,例:找出11000之间的全部同构数。,分析:1.用i表示11000之间的数 2.用n表示i的位数 3.同构数的条件:i*i%(int)pow(10,n)=i,m=i;n=0;do n+;m=m/10;while(m!=0);,#include math.h main()int n,m;long i;for(i=1;i=1000;i+)m=i;n=0;do n+;m=m/10;while(m!=0);if(i*i%(int)pow(10,n)=i)printf(%5ld,i);printf(n);,一个数恰好等于它的因子之和,这个数就称为“完数”。例如:6的因子为1,2,3,而6=1+2+3,因此6是完数。编程找出1000之内的所有完数,并按下面格式输出其因子6 its factors are 1,2,3,例,main()int i,j,k;for(i=2;i=1000;i+)k=0;for(j=1;j=i/2;j+)if(i%j=0)k=k+j;if(i=k)printf(“%d its factors are%d”,i,1);for(j=2;j=i/2;j+)if(i%j=0)printf(“,%d”,j);printf(“n”);,程序:,例:从键盘输入字符直到输入字符#为止,并统计 输入字母的个数。特点:循环次数事先无法确定#include void main()char ch;int count=0;do ch=getchar();if(ch=A,例:从键盘输入字符直到输入字符#为止,并统计 输入字母的个数。方法2:#include void main()char ch;int count=0;while(1)ch=getchar();if(ch=A,例:在屏幕上输出以下图形。,*,分析:(设N=5)第1行:4个空格 1个“*”换行符 第2行:3个空格 3个“*”换行符第3行:2个空格 5个“*”换行符第4行:1个空格 7个“*”换行符第5行:0个空格 9个“*”换行符,由此归纳出:第i行的空格数5-i个;第i行的“*”数是2i-1个。,void main()int i,j;for(i=1;i=5;i+)for(j=1;j=5-i;j+)printf();for(j=1;j=2*i-1;j+)printf(*);printf(n);,本章小结,本章介绍的内容 介绍了while、dowhile、for三种循环结构的使用和它们之间的区别,以及break、continue的用法要求达到的目标掌握while、dowhile、for语句的用法会使用这三种结构进行循环程序设计理解 break 和 continue在程序控制中的作用,图形 1:(法一)main()int i;for(i=1;i=5;i+)printf(“*n”);,*,图形 1:(法二)main()int i;for(i=1;i=25;i+)if(i%5=0)printf(“*n”);else printf(“*”);,*,图形 2:(法三)main()int i,j;for(i=1;i=5;i+)for(j=1;j=i;j+)printf(“);printf(“*n”);,*,图形 2:(法三)main()int i,j;for(i=1;i=5;i+)for(j=1;j5+i;j+)if(ji)printf(“);else printf(“*”);printf(“n”);,*,图形 3:main()int i,j;for(i=1;i=5;i+)for(j=1;j=5-i:j+)printf(“);for(j=1;j=5;j+)printf(“*”);printf(“n”);,*,图形 4:main()int i,j;for(i=1;i=5;i+)for(j=1;j=i;j+)printf(“*”);printf(“n”);,*,图形 4:main()int i,j;for(i=1;i=5;i+)for(j=1;j=i;j+)printf(“*”);printf(“n”);,*,图形 5:(法一)main()int i,j;for(i=1;i=5;i+)for(j=1;j=5-i;j+)printf(“);for(j=1;j=i;j+)printf(“*”);printf(“n”);,*,图形 5:(法二)main()int i,j;for(i=1;i=5;i+)for(j=1;j=5;j+)if(i+j6)printf(“);else printf(“*”);printf(“n”);,*,main()int i,j,n;scanf(“%d”,例:在屏幕上输出一个由n*n个星号组成的方形。,*,main()int i,j;for(i=1;i=5;i+)for(j=1;ji;j+)printf();for(j=1;j=5;j+)printf(*);printf(n);,算法1分析:设该三位数为 i(100i999),与之对应的个位、十位、百位数字分别为k1、k2、k3,则有以下关系:i=k13+k23+k33 数字分离:(1)个位:k1=i%10(2)十位:k2=i/10%10(3)百位:k3=i/100,例:打印水仙花数。如:153=13+53+33,例:i=543k1=543%10值为3k2=543/10%10值为4k3=543/100值为5,main()int i,k1,k2,k3;for(i=100;i=999;i+)k1=i%10;k2=i/10%10;k3=i/100;if(i=k1*k1*k1+k2*k2*k2+k3*k3*k3)printf(%d=%d3+%d3+%d3n,i,k1,k2,k3);,方法1:,算法分析2:设该三位数的百位、十位、个位数字分别为k1、k2、k3,则有以下关系:k1*100+k2*10+k3=k13+k23+k33 k1取值19,k2、k3取值09,main()int k1,k2,k3,i;for(k1=1;k1=9;k1+)for(k2=0;k2=9;k2+)for(k3=0;k3=9;k3+)i=k1*100+k2*10+k3;if(i=k1*k1*k1+k2*k2*k2+k3*k3*k3)printf(%d=%d3+%d3+%d3n,i,k1,k2,k3);,方 法 2,例:找出101200之间各个位数字之和能被5整 除的所有数。,算法分析:拆数方法:s=s+m%10 m=m/10 循环条件:m0 打印方式:每打印10个数,输出一个n,第几次循环,s的值,m的值,1,3,2,3,10,12,27,2,0,如:m=273 s的初值为0,main()int i,m,s,k=1;for(i=10;i0);if(s%5=0)printf(%5d,i);if(k%10=0)printf(n);k+;printf(n);,