《5循环结构程序设计.ppt》由会员分享,可在线阅读,更多相关《5循环结构程序设计.ppt(51页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第5章章循环结构程序设计循环结构程序设计当某段当某段程序要重复执行程序要重复执行时时,使用循环结构使用循环结构使程序精炼使程序精炼C语言提供语言提供4种循环控制语句种循环控制语句:while语句语句do-while语句语句for语句语句if-goto语句(不提倡多用)语句(不提倡多用)5.1 while语句语句“当型当型”循环结构循环结构形式:形式:While(条件表达式条件表达式)语句语句表达式表达式语句语句非非0 00 0执行过程:执行过程:当表达式的值为真当表达式的值为真(非零非零)时,重复执行语句,直时,重复执行语句,直到逻辑表达式的值为假,到逻辑表达式的值为假,跳出循环。跳出循环。
2、特点:特点:先判断表达式,后执行语句先判断表达式,后执行语句流程图流程图例例5.1-1200i=1i例例5.1-25.1-2求求 。加数的范围:加数的范围:i=1i=200,sum=0;求和过程:求和过程:sum=sum+i;i+;此时此时,sum=1;i=2;sum=sum+i;i+;此时此时,sum=1+2;i=3;sum=sum+i;i+;此时此时,sum=1+2+3;i=4;sum=sum+i;i+;此时此时,sum=1+2+199;i=200;sum=sum+i;i+;此时此时,sum=1+2+199200;i=201;i=1;i=200sum+=i;i+;YN输出输出sum结束结束
3、开始开始sum=0;#includemain()inti,sum=0;i=1;while(i=200)sum=sum+i;i+;printf(sum=%dn,sum);例例5.2 5.2 读程序读程序分析:分析:偶数和放在偶数和放在even中,中,even=2+4+6+100;奇数和放在奇数和放在odd中,中,odd=1+3+5+99;计数器计数器n初值初值=1.while(n100)odd=odd+n;even=even+(n+1);n=n+2例例5.3例例5.4输出输出10个个*号号非非0 0i=10i=10打印星号打印星号0 0i+i+;#includemain()inti;i=1;/*
4、循环控制初值循环控制初值*/while(i=10)/*循环体循环体*/printf(“*”);i+;/*逻辑逻辑表达式值可变表达式值可变*/5.2 do-while语句语句“直到型直到型”循环循环一般形式:一般形式:do语句语句while(表达式表达式);语句语句表达式表达式非非0 00 0do-while语句流程语句流程执行过程:执行过程:先执行循环体语句先执行循环体语句,再判断再判断while中的表达中的表达式式,若为真若为真,则继续执行则继续执行循环体循环体,否则,执行否则,执行while后面的语句。后面的语句。例例5.65.6任意输入一个整数任意输入一个整数,将该数各位倒序输出。将该数
5、各位倒序输出。程序一:用程序一:用while语句实现语句实现 此程序输入为此程序输入为0时没有输出时没有输出main()intnumber,digit;printf(pleaseinputdata:);scanf(%d,&number);while(number!=0)digit=number%10;printf(%d,digit);number=number/10;main()intnumber,digit;printf(pleaseinputdata:);scanf(%d,&number);dodigit=number%10;printf(%d,digit);number=number/1
6、0;while(number!=0);此程序输入为此程序输入为0时仍有输出时仍有输出程序二:用程序二:用do-while语句实现语句实现200n=1n例例5.75.7.求求 。#includemain()inti,sum=0;i=1;do sum=sum+i;i+;while(i=200);printf(sum=%dn,sum);说明:当两者具有相同的循环体时说明:当两者具有相同的循环体时1.当当while 后面的表达式后面的表达式第第1次次的值的值为为“真真”时,两种循环得到的时,两种循环得到的结果相同。结果相同。2.否则,否则,二者二者结果不相同。结果不相同。main()intsum=0,
7、i;scanf(%d,&i);do sum=sum+i;i+;while(i=10);printf(sum=%d,sum);main()intsum=0,i;scanf(%d,&i);while(i=10)sum=sum+i;i+;printf(sum=%d,sum);当当i=1时时:sum=55当当i=11时时:sum=0当当i=1时时:sum=55当当i=11时时:sum=11在在do_while循环循环语句中需要注意,即与语句中需要注意,即与while循循环环的不同点:的不同点:1.与与while循环语句的区别,循环语句的区别,至少执行一次循环体至少执行一次循环体2.do_while循环
8、语句中的循环语句中的while()后面有分号;后面有分号;5.3for语句语句百鸡问题百鸡问题现在用百钱买百鸡,问这现在用百钱买百鸡,问这100100只鸡中,公鸡、母鸡只鸡中,公鸡、母鸡和小鸡各有多少只和小鸡各有多少只?5钱钱3钱钱1钱钱公鸡每只公鸡每只5 5文钱,文钱,母鸡每只母鸡每只3 3文钱,文钱,3 3只小鸡只小鸡1 1文钱。文钱。?cock取值范围是取值范围是1-20hen取值范围是取值范围是1-33chick取值范围是取值范围是3-99设公鸡、母鸡、小鸡的数量分别为设公鸡、母鸡、小鸡的数量分别为cock,hen,chick;cock,hen,chick为整数且为整数且chick是是
9、3的倍数的倍数.可用穷举法遍历所有可用穷举法遍历所有cock,hen,chick的可能组合来求解的可能组合来求解循环语句循环语句?问题归结为求不定方程组的整数解:问题归结为求不定方程组的整数解:一般形式:一般形式:for(表达式表达式1;表达式表达式2;表达式表达式3)语句语句计算表达式计算表达式1 1计算表达式计算表达式2 2语句语句计算表达式计算表达式3 3非非0 00 0for(i=0;in;i+)for语句语句循环控制变量循环控制变量赋初值赋初值条件表达式条件表达式改变循环条件改变循环条件例例语句;语句;for语句的其它形式语句的其它形式for(表达式表达式1;表达式表达式2;表达式表
10、达式3)表达式表达式1;表达式表达式3;不判断循环条件,不判断循环条件,成为死循环成为死循环200n=1n例例1 1.求求 ,用,用forfor语句实现。语句实现。#includemain()inti,sum=0;i=1;while(i=200)sum=sum+i;i+;printf(sum=%dn,sum);for(i=1;i=200;i+)sum=sum+i;例例2:2:用用forfor语句实现求语句实现求n!n!。#includemain()inti,fact=1,n;printf(Pleaseinputn:);scanf(%d,&n);for(i=1;i=n;i+)fact*=i;pr
11、intf(“%d!=%dn,n,fact);思考:思考:如何求如何求s=1!+2!+n!?例例3例例4 4.求求100100个数的最小值。个数的最小值。#includemain()floatx;inti;floatmin;printf(输入第输入第1个数个数:);scanf(%f,&x);min=x;for(i=2;i=100;i+)printf(输入第输入第%d个数个数:,i);scanf(%f,&x);if(x min)min=x;printf(最小值最小值=%fn,min);例例5 5.判断判断m m是否为素数。是否为素数。#includemain()intm,i,flag;printf
12、(nInputintegerm:);scanf(%d,&m);flag=1;for(i=2;im;i+)if(m%i=0)flag=0;i=m;if(flag=1)printf(%disprimen,m);elseprintf(%disnotprimen,m);分析分析:for语句、语句、while语句和语句和do-while语句的区别语句的区别ufor语句的循环次数由其中的语句的循环次数由其中的3个表达式决定个表达式决定,适合适合实现明确循环次数的循环结构。实现明确循环次数的循环结构。uwhile和和do-while语句适用于已知结束条件的循环,语句适用于已知结束条件的循环,在循环体中应存在
13、让在循环体中应存在让判断条件判断条件改变的语句。改变的语句。uwhile语句之前必须预先设置判断的初始条件。语句之前必须预先设置判断的初始条件。uwhile和和for语句是先判断后执行语句是先判断后执行,所以循环体最少所以循环体最少执行次数为零执行次数为零;而而do-while语句是先执行后判断语句是先执行后判断,循循环体最少执行环体最少执行1次。次。whilewhile语句多用于语句多用于语句多用于语句多用于循环次数不定循环次数不定循环次数不定循环次数不定的情况的情况的情况的情况do-whiledo-while语句多用于语句多用于语句多用于语句多用于至少要运行一次至少要运行一次至少要运行一次
14、至少要运行一次的情况的情况的情况的情况forfor语句语句语句语句多用于要多用于要多用于要多用于要赋初值赋初值赋初值赋初值或或或或循环次数固定循环次数固定循环次数固定循环次数固定的情况的情况的情况的情况5.5 循环的嵌套循环的嵌套在循环语句的循环体中又包含另外的在循环语句的循环体中又包含另外的完整完整的循环语句;个数和形式都任意。的循环语句;个数和形式都任意。说明:说明:1、三种循环可互相嵌套、三种循环可互相嵌套,层数不限层数不限,每层可有多个循环每层可有多个循环2、外循环每执行一次循环体、外循环每执行一次循环体,内循环要完整执行一遍内循环要完整执行一遍3、各种循环可以和各种选择结构相互嵌套、
15、各种循环可以和各种选择结构相互嵌套for(;).for(;).在循环语句的循环体中在循环语句的循环体中完整完整的包含另一个循环结构。的包含另一个循环结构。外循环每执行一次外循环每执行一次循环体循环体,内循环要内循环要完整的执行一遍完整的执行一遍内外循环的循环控制变内外循环的循环控制变量不同量不同外外循循环环内内循循环环2.嵌套的循环控制变量不能相同嵌套的循环控制变量不能相同3.内循环变化快,外循环变化慢;外循环每执行一次循环内循环变化快,外循环变化慢;外循环每执行一次循环体体,内循环要完整执行一遍。内循环要完整执行一遍。4.正确确定循环体正确确定循环体main()inti,j;for(i=1;
16、i=9;i+)for(j=1;j=i;j+)printf(“%d*%d=%d,j,i,i*j);printf(nn);注意:注意:1.1.三种循环可互相嵌套三种循环可互相嵌套,层数不限层数不限,每层可有多个循环嵌每层可有多个循环嵌套但不能相互交叉。套但不能相互交叉。例例1 1.输出九九乘法表,输出格式如下:输出九九乘法表,输出格式如下:1*1=11*2=22*2=4 1*3=32*3=63*3=91*4=42*4=83*4=124*4=16 1*5=52*5=10 3*5=154*5=205*5=251*6=62*6=123*6=184*6=245*6=306*6=361*7=72*7=14
17、3*7=214*7=285*7=356*7=427*7=491*8=82*8=163*8=244*8=325*8=406*8=487*8=568*8=641*9=92*9=183*9=274*9=365*9=456*9=547*9=63 8*9=729*9=81#include main()int i,j;for(i=1;i=9;i+)for(j=1;j=i;j+)printf(%d*%d=%dt,j,i,i*j);printf(n);例例2:for(a=1;a=10;a+)for(b=0;b=5;b+)循环正常结束时,内循环执行了?次循环正常结束时,内循环执行了?次循环正常结束时,内循环执行
18、了?次循环正常结束时,内循环执行了?次 外循环外循环外循环外循环执行了执行了执行了执行了1010次,次,次,次,内循环内循环内循环内循环执行执行执行执行6 6次次次次循环正常结束时,内循环执行了循环正常结束时,内循环执行了循环正常结束时,内循环执行了循环正常结束时,内循环执行了106=60106=60次次次次 cock的取值范围是的取值范围是1-20;hen的取值范围是的取值范围是1-33;chick的取值范围是的取值范围是3-99设公鸡、母鸡、小鸡的数量分别为设公鸡、母鸡、小鸡的数量分别为cock,hen,chick;cock,hen,chick为整数且为整数且chick是是3的倍数的倍数.
19、例例3.使用使用for语句解决百鸡问题语句解决百鸡问题cock循环,计算公鸡数;循环,计算公鸡数;hen循环,计算母鸡数循环,计算母鸡数;chick循环,计算小鸡数量。循环,计算小鸡数量。if(cock*5+hen*3+chick/3=100)&(cock+hen+chick=100)#includestdio.hmain()intcock,hen,chick;for(cock=1;cock=20;cock+)for(hen=1;hen=33;hen+)for(chick=3;chick=99;chick+=3)if(cock*5+hen*3+chick/3=100)&(cock+hen+ch
20、ick=100)printf(公鸡有公鸡有%2d只只;母鸡有母鸡有%2d只只;小鸡有小鸡有%2d只只.,cock,hen,chick);printf(n);问题问题 可以不用三重循环,用二重循环就能解可以不用三重循环,用二重循环就能解决问题,因为公鸡和母鸡的数量确定后,决问题,因为公鸡和母鸡的数量确定后,小鸡的数量也能确定,即小鸡的数量也能确定,即chick=100-hen-cock;试着改写程序?;试着改写程序?注意注意正确确定循环体正确确定循环体循环控制变量常与求解的问题挂钩循环控制变量常与求解的问题挂钩5.6.1 break语句语句只能出现在两种场合只能出现在两种场合:(1)用于用于sw
21、itch语句中,跳出语句中,跳出switch语句;语句;(2)用于循环语句,提前结束整个循环的执行用于循环语句,提前结束整个循环的执行在循环语句、在循环语句、switch语句嵌套使用的情况下,语句嵌套使用的情况下,break语句只能跳出(或终止)语句只能跳出(或终止)它所在的结构它所在的结构,而不能同时跳出多层结构。而不能同时跳出多层结构。5.6 break语句和语句和continue语句语句-强制结束循环强制结束循环main()intx=1,y=0,a=0,b=0,i=0;switch(x)case1:switch(y)case0:a+;break;case1:b+;break;case2:
22、a+;b+;break;case3:a+;b+;printf(“na=%d,b=%d”,a,b);for(i=0;i5)break;a=2,b=1a=8,b=1例例12181例例2 2.判断判断m m是否为素数。是否为素数。#includemain()intm,i,flag;printf(nInputintegerm:);scanf(%d,&m);flag=1;for(i=2;im;i+)if(m%i=0)flag=0;i=m;if(flag=1)printf(%disprimen,m);elseprintf(%disnotprimen,m);若求若求100-200100-200之间之间的所有
23、素数?的所有素数?break;5.6.2 continue语句语句1、只能用于循环语句的循环体中、只能用于循环语句的循环体中2、作用是使执行流程跳过循环体中、作用是使执行流程跳过循环体中continue后后 面的语句,即提前结束本次循环体语句序列。面的语句,即提前结束本次循环体语句序列。3、在、在while 和和do-while语句中,执行语句中,执行continue语语 句就立即去测试是否继续循环的条件。句就立即去测试是否继续循环的条件。4、在、在for语句中,执行语句中,执行continue语句立即计算表语句立即计算表 达式达式3,然后计算表达式,然后计算表达式2测试继续循环的条件。测试继
24、续循环的条件。5、一般地,、一般地,continue语句都会位于一个语句都会位于一个if语句中,语句中,即仅对满足某一条件的该次循环起作用。即仅对满足某一条件的该次循环起作用。-结束本次循环结束本次循环例例1.1.输出输出100-200100-200之间不能被之间不能被3 3整除的数。整除的数。better例例2:求输入的十个整数中正数的个数及其平均值求输入的十个整数中正数的个数及其平均值#includemain()inti,num=0,a;floatsum=0;for(i=0;i10;i+)scanf(%d,&a);if(a=1e-6)pi+=t;n=n+2;s=-s;t=s/n;n=1;s
25、=1;#includepi=0;4 31 51 71 1-+-+pitt=1;while(fabs(t)=1e-6)pi+=t;n=n+2;s=-s;t=s/n;n=1;s=1;#includepi=0;main()float t,pi,n;int s;pi=pi*4;printf(“pi=%10.6fn”,pi);当当n为整型?为整型?用一个变量充当符号位用一个变量充当符号位【算法思想算法思想】:利用自身的推导关系求解问题的:利用自身的推导关系求解问题的方法。利用已知数据推算出后面未知数据。方法。利用已知数据推算出后面未知数据。例例2 2:Fibonacci(斐波纳契斐波纳契)数列定义如下数
26、列定义如下Fib1=1;(n=1)Fib2=1;(n=2)Fibn=Fibn-1+Fibn-2(n=3)即:即:数列为:数列为:1,1,2,3,5,8,13,.这是一种这是一种递推算法递推算法应采用循环实现应采用循环实现2.递推算法递推算法f1=1;f2=1;f=f1+f2;f1=f2;f2=f;for(i=3;i8;y=+i)printf(%d%d,x-,y);A)10192B)9876C)10990D)101091DD练习题:练习题:2.以下程序的输出结果是()。以下程序的输出结果是()。main()intn=4;while(n-)printf(%d,-n);A)20B)31C)321D)
27、210AA小小结结1.程序设计的基本方法程序设计的基本方法结构化程序设计方法结构化程序设计方法:自顶向下自顶向下,逐步求精的方法。逐步求精的方法。2.顺序结构顺序结构按语句顺序执行按语句顺序执行,有表达式语句、有表达式语句、函数调用语句等。函数调用语句等。3.选择结构选择结构根据表达式值选择一组语句执行。有根据表达式值选择一组语句执行。有if语句和语句和switch语句。每条语句。每条if语句可实现一个二路分支,用多个语句可实现一个二路分支,用多个if嵌嵌套可实现多路分支。套可实现多路分支。switch语句专门用来实现多路分语句专门用来实现多路分支支,它的难点在于它的难点在于switch后的表
28、达式如何构造。后的表达式如何构造。4.循环结构循环结构在设计含有循环结构的程序时在设计含有循环结构的程序时,需要特别注意需要特别注意,什么什么事需要在进入循环之前做事需要在进入循环之前做,循环处理什么事循环处理什么事,如何出如何出循环等。循环等。C语言提供了三种实现循环的专用语句语言提供了三种实现循环的专用语句,即:即:for语句、语句、while语句和语句和do-while语句。语句。For语句的循环次数由其中的语句的循环次数由其中的3个表达式决定个表达式决定,适合实现明确循环次数的循环结构。适合实现明确循环次数的循环结构。while和和do-while语句适用于已知结束条件的循语句适用于已
29、知结束条件的循环环,在循环体中应存在让在循环体中应存在让判断条件判断条件改变的语句。改变的语句。while语句之前必须预先设置判断的初始条件。语句之前必须预先设置判断的初始条件。while和和For语句是先判断后执行语句是先判断后执行,所以循环体最所以循环体最少执行次数为零少执行次数为零;而而do-while语句是先执行后判断语句是先执行后判断,循环体最少执行循环体最少执行1次。次。5.良好的程序程序书写风格良好的程序程序书写风格每行一个语句,并按照逻辑关系呈锯齿状排列。每行一个语句,并按照逻辑关系呈锯齿状排列。必要的注释信息必要的注释信息,以利于程序的阅读和理解。以利于程序的阅读和理解。输入
30、数据之前给出必要的提示。输入数据之前给出必要的提示。输出结果力争清晰美观。输出结果力争清晰美观。#includemain()floatscore;printf(Inputscore:);scanf(%f,&score);if(score100)printf(errorn);elseswitch(int)score/10)case10:/*90-100的成绩合并处理的成绩合并处理*/case9:printf(An);break;case8:printf(Bn);break;case7:printf(Cn);break;case6:printf(Dn);break;default:printf(En);/*低于低于60的成绩的成绩*/