1、Ch5:循环结构程序设计循环结构程序设计用用whilewhile语句实现循环语句实现循环用用do-whiledo-while语句实现循环语句实现循环用用for for 语句实现循环语句实现循环 循环的嵌套循环的嵌套几种循环的比较几种循环的比较breakbreak语句语句continuecontinue和语句和语句程程 序序 举举 例例Ch5:循环结构程序设计循环结构程序设计Ch5:循环结构程序设计循环结构程序设计32022-6-6什么是循环?什么是循环?为什么要使用循环?为什么要使用循环?1001nyn问题问题1 1:问题问题2:2: 在许多问题中需要用到循环控制。循环结构是结构化程序设计的基
2、本结构之一,它和顺序结构、分支结构共同作为各种复杂程序的基本构造单元。Ch5:循环结构程序设计循环结构程序设计42022-6-6 循环控制结构在程序中是循环控制结构在程序中是指指对某段对某段程序或某条语句根据条件重复执行。程序或某条语句根据条件重复执行。C语言可实现循环的语言可实现循环的语句语句:while 语句语句do while 语句语句for 语句语句Ch5:循环结构程序设计循环结构程序设计52022-6-6while语句用来实现“当型”循环结构。一般形式:一般形式: while (while (表达式表达式) ) 语句语句 当表达式为非0值时,执行while语句中的内嵌语句。其特点是:
3、先判断表达式,后执行语句。Ch5:循环结构程序设计循环结构程序设计62022-6-6v特点:先判断表达式,后执行循环体v说明:l循环体有可能一次也不执行l循环体可为任意类型语句;循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现。 l下列情况,退出while循环u条件表达式不成立(为零)u循环体内遇break,return,gotol无限循环: while(1) 循环体;在循环体中应有使循环趋向于结束的语句。Ch5:循环结构程序设计循环结构程序设计72022-6-6例 用while循环求 /*ch5_1.c*/#include main() int i,sum=0; i=1;
4、 while(i=100) sum=sum+i; i+; printf(%d,sum);循环初值循环终值循环变量增值循环条件循环体Ch5:循环结构程序设计循环结构程序设计82022-6-6例例 显示显示110的平方的平方/*ch5_2.c*/#include main() int i=1; while(i=10) printf(%d*%d=%dn,i,i,i*i); i+; 运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=100Ch5:循环结构程序设计循环结构程序设计92022-6-6 do-while语句的特点:先执
5、行循环体,然后判断循环条件是否成立。 一般形式一般形式: : do do 循环体语句 whilewhile (表达式);执行过程:执行过程:先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零(“真”) 时,返回重新执行循环体语句,如此反复,直到表达式的值等于0为止,此时循环结束。Ch5:循环结构程序设计循环结构程序设计102022-6-6v特点:先执行循环体,后判断表达式v说明:l至少执行一次循环体ldowhile可转化成while结构expr循环体假(0)真(非0)循环体While循环Ch5:循环结构程序设计循环结构程序设计112022-6-6 在一般情况下,用while语句和用
6、do-while语句处理同一问题时,若二者的循环体部分是一样的,它们的结果也一样。但是如果while后面的表达式一开始就为假(0值)时,两种循环的结果是不同的。Ch5:循环结构程序设计循环结构程序设计122022-6-6例例 while和和dowhile比较比较main()int sum=0,i; scanf(%d,&i); while (i=10) sum=sum+i; i+; printf(sum=%dn,sum);main()int sum=0,i; scanf(%d,&i); do sum=sum+i; i+; while (i=10) printf(sum=%dn,sum);当当i1
7、0时,时, 两程序的结果不同。两程序的结果不同。首次条件为真,两者等价;首次条件为假,首次条件为真,两者等价;首次条件为假,dowhile执行一次。执行一次。Ch5:循环结构程序设计循环结构程序设计132022-6-6 C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。 一般形式一般形式: : forfor(表达式1;表达式2;表达式3) 语句Ch5:循环结构程序设计循环结构程序设计142022-6-6forfor(表达式1;表达式2;表达式3) 语句forfor语句的执行过程:语句的执行过
8、程: (1) 先求解表达式1。 (2) 求解表达式2,若其值为真(值为非0),则执 行for语句中指定的内嵌语句,然后执行下 面第(3)步。若为假(值为0),则结束循环, 转到第(5)步。 (3) 求解表达式3。 (4) 转回上面第(2)步骤继续执行。 (5) 循环结束,执行for语句下面的一个语句 Ch5:循环结构程序设计循环结构程序设计152022-6-6注意注意: : C语言中的for语句比其他语言(如BASIC,PASCAL)中的FOR语句功能强得多。可以把循环体和一些与循环控制无关的操作也作为表达式1或表达式3出现,这样程序可以短小简洁。但过分地利用这一特点会使for语句显得杂乱,可
9、读性降低,最好不要把与循环控制无关的内容放到for语句中。Ch5:循环结构程序设计循环结构程序设计162022-6-6vfor语句一般应用形式:for(循环变量赋初值;循环条件;循环变量增值)循环体语句;v说明:lfor语句可以转换成while结构#include main() int i,sum=0; for(i=1;i=100;i+) sum+=i; printf(%d,sum);expr1;while(expr2)循环体语句;expr3;lfor语句中expr1, expr2 ,expr3 类型任意,都可省略,但分号;不可省l若表达式1缺省,则从表达式2开始执行。l若表达式2缺省,则认为
10、表达式2始终为真,循环无终止进行。Ch5:循环结构程序设计循环结构程序设计172022-6-6例如:例如: for ( ;i=100;i+) sum=sum+i; for (i=1; ;i+) sum=sum+i; for (i=1;i=100; ) sum=sum+i;i+; for ( ;i=100; ) sum=sum+i;i+; for ( ; ; ) 语句语句省略表达式省略表达式1省略表达式省略表达式2省略表达式省略表达式3省略表达式省略表达式1,3循环无终止进行循环无终止进行Ch5:循环结构程序设计循环结构程序设计182022-6-6l三个三个表达式可以是语言的任意型表达式。表达式
11、可以是语言的任意型表达式。例:例: for ( sum=0,i=1;i=100;i+) sum=sum+i; for (i=0,j=100 ;i=j;i+,j-) k =i+j; for (i=0 ;(c=getchar()!=n;i+=c) ; 逗号表达式逗号表达式逗号表达式逗号表达式空语句空语句Ch5:循环结构程序设计循环结构程序设计192022-6-6例:#include main( ) int i=0; for(i=0;i10;i+) putchar(a+i); 运行结果:abcdefghij例:#include main( ) int i=0; for(;i10;i+) putcha
12、r(a+i); 例:#include main( ) int i=0; for(;i10;) putchar(a+(i+); 例:#include main( ) int i=0; for(;i10;putchar(a+i),i+) ; Ch5:循环结构程序设计循环结构程序设计202022-6-6main() int i,j,k; for(i=0,j=100;i=j;i+,j-) k=i+j; printf(%d+%d=%dn,i,j,k); #includemain() char c; for(;(c=getchar()!=n;) printf(%c ,c);#include main()
13、int i,c; for(i=0;(c=getchar()!=n;i+=3)printf(%c ,i+c);Ch5:循环结构程序设计循环结构程序设计212022-6-6三种循环结构三种循环结构用于反复的进行某个操作,直到条件不成立时为止。用于反复的进行某个操作,直到条件不成立时为止。(1 1)while (while (表达式表达式) ) 语句系列语句系列 (2 2)do do 语句系列语句系列 while ( while (表达式表达式); );(3 3)for (for (表达式表达式1;1;表达式表达式2;2;表达式表达式3) 3) 语句系列语句系列 使用循环语句要注意和数组的结合:使用
14、循环语句要注意和数组的结合:关键在于找出数组下标和循环变量之间关键在于找出数组下标和循环变量之间的关系。的关系。三种循环功能完全等价:三种循环功能完全等价:(1),(2)(1),(2)两种主要用于循环次数不定。两种主要用于循环次数不定。而而(3)(3)主要用于循环次数确定的情况。主要用于循环次数确定的情况。Ch5:循环结构程序设计循环结构程序设计222022-6-65.2.1 break5.2.1 break语句语句 break语句可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句 一般形式:一般形式: break;break;注意注意: :break只能终止并跳出最近一层的
15、结构;break语句不能用于循环语句和switch语句之外的任何其他语句中。 Ch5:循环结构程序设计循环结构程序设计232022-6-6exprbreak;假(0)真(非0)whiledobreak;.expr假(0)真(非0)whileCh5:循环结构程序设计循环结构程序设计242022-6-6expr2break;.假(0)真(非0)forexpr1expr3switchexpr语句组1break;语句组2break;语句组nbreak;语句组break;.const 1const 2const ndefaultcase Ch5:循环结构程序设计循环结构程序设计252022-6-6例例:
16、 float pi=3.14159;for(r=1;r100) break; printf(r=%f,area=%fn,r,area); 程序的作用是计算程序的作用是计算r=1r=1到到r=10r=10时的圆面积,直到时的圆面积,直到面积面积areaarea大于大于100100为止。从上面的为止。从上面的forfor循环可以循环可以看到:当看到:当area100area100时,执行时,执行breakbreak语句,提前结语句,提前结束循环,即不再继续执行其余的几次循环束循环,即不再继续执行其余的几次循环。Ch5:循环结构程序设计循环结构程序设计262022-6-65.2.2 continue
17、5.2.2 continue语句语句 作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定.仅用于循环语句中.一般形式:一般形式: continue;continue;Ch5:循环结构程序设计循环结构程序设计272022-6-6exprcontinue;假(0)真(非0)while真(非0)docontinue;.expr假(0)whileexpr2continue;.假(0)真(非0)forexpr1expr3Ch5:循环结构程序设计循环结构程序设计282022-6-6例例 求输入的十个整数中正数的个数及其平均值求输入的十个整数中正数的个数及其平均值/*ch
18、5_3.c*/#include main() int i,num=0,a; float sum=0; for(i=0;i10;i+) scanf(%d,&a);if(a=0) continue;num+;sum+=a; printf(%d plus integers sum :%6.0fn,num,sum); printf(Mean value:%6.2fn,sum/num);Ch5:循环结构程序设计循环结构程序设计292022-6-6continue语句和break语句的区别 continue语句只结束本次循环,而不是终止整个循环的执行。 while(表达式1) for if(表达式2) c
19、ontinue; 0Ch5:循环结构程序设计循环结构程序设计302022-6-6 continue和break的区别 break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。 while(表达式1) for if(表达式2) break; Ch5:循环结构程序设计循环结构程序设计312022-6-6 一个循环体内又包含另一个完整的循环结构 称为循环的嵌套。内嵌的循环中还可以嵌套 循环,这就是多层循环。 三种循环(while循环、do-while循环和for循 环)可以互相嵌套。Ch5:循环结构程序设计循环结构程序设计322022-6-6 下面几种都是合法的形式:(1) while(
20、 ) (2) do (3) for(;) while( ) do for(;) while( ); while( ); Ch5:循环结构程序设计循环结构程序设计332022-6-6(4) while( ) (5) for(;) (6) do do while( ) for(;) while( ) while( ) Ch5:循环结构程序设计循环结构程序设计342022-6-6(1)四种循环都可以用来处理同一问题,一般情况下它们可以互相代替。 (2)在while循环和do-while循环中,只在while后面的括号内指定循环条件,因此为了使循环能正常结束,应在循环体中包含使循环趋于结束的语句(如i
21、+,或i=i+1等)。Ch5:循环结构程序设计循环结构程序设计352022-6-6 for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while循环能完成的,用for循环都能实现。 (3)用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。Ch5:循环结构程序设计循环结构程序设计362022-6-6(4)while循环、do-while循环和for循环,可以用break语句跳出循环,用continue语句结束本次循环(
22、break语句和continue语句见下节)。Ch5:循环结构程序设计循环结构程序设计372022-6-6例:例: 用/41-1/3+1/5-1/7+公式求的近似值,直到某一项的绝对值小于10-6为止。N-SN-S图表示算法图表示算法 Ch5:循环结构程序设计循环结构程序设计382022-6-6 # include # include void main() int s; float n,t,pi; t=1;pi=0;n=1.0;s=1; while(fabs(t)1e-6) pi=pi+t; n=n+2; s= -s; t=s/n; pi = pi*4; printf(pi=%10.6fn,
23、pi); Ch5:循环结构程序设计循环结构程序设计392022-6-6例:例: 求Fibonacci数列前40个数。这个数列有如下特点:第1,2两个数为1,1。从第3个数开始,该数是其前面两个数之和。即: F(1)=1 (n=1) F(2)=1 (n=2) F(n)=F(n-1)+F(n-2) (n3) 算法如图所示:1FCh5:循环结构程序设计循环结构程序设计402022-6-6例例: 判断判断m m是否素数。是否素数。算法思想算法思想: :让m被2到sqrt(m)除,如果m能被2sqrt(m)之中任何一个整数整除,则提前结束循环,此时i必然小于或等于sqrt(m) ;如果m不能被2sqrt
24、(m) 之间的任一整数整除,则在完成最后一次循环后,i还要加1,因此i=sqrt(m) +1,然后才终止循环。在循环之后判别i的值是否大于或等于sqrt(m)+1,若是,则表明未曾被2sqrt(m)之间任一整数整除过,因此输出“是素数”。 1FCh5:循环结构程序设计循环结构程序设计412022-6-61FCh5:循环结构程序设计循环结构程序设计422022-6-6 void main() int m,i,k; scanf(%d,&m); k=sqrt(m); for(i=2;ik) printf(%d is a prime numbern,m); else printf(%d is not
25、a prime numbern,m); Ch5:循环结构程序设计循环结构程序设计432022-6-6例例: 译密码。为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。 思路:思路:可以按以下规律将电文变成密码: 将字母将字母A A变成字母变成字母E E,a a变成变成e e,即变成其后的,即变成其后的第第4 4个字母,个字母,W W变成变成A A,X X变成变成B B,Y Y变成变成C C,Z Z变变成成D D。 1FCh5:循环结构程序设计循环结构程序设计442022-6-61FCh5:循环结构程序设计循环结构程序设计452022-6-6 void main() char c; while(c=getchar()!=n) /* 从键盘上读从键盘上读入一个字符入一个字符 */ if(c=a & c=A & cZ & cz) /* 如果超如果超出了最大字母,循环到第一个字母出了最大字母,循环到第一个字母 */ c=c-26; printf(%c,c); printf(“n”);