《第05章 循环控制(精品).ppt》由会员分享,可在线阅读,更多相关《第05章 循环控制(精品).ppt(46页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第5 5章章 循环控制循环控制5.1 while5.1 while语句语句5.2 do-while5.2 do-while语句语句5.3 for5.3 for语句语句5.4 5.4 gotogoto以及以及gotogoto构成的循环构成的循环 5.5 break5.5 break语句和语句和continuecontinue语句语句5.6 5.6 循环的嵌套循环的嵌套5.7 5.7 循环结构程序设计举例循环结构程序设计举例在在C C语言中可以用以下语句来实现循环:语言中可以用以下语句来实现循环:1.1.用用gotogoto语句和语句和ifif语句构成循环;语句构成循环;2.2.用用whilew
2、hile语句;语句;3.3.用用do-whiledo-while语句;语句;4.4.用用forfor语句。语句。循环循环:就是在给定的条件成立时反复执行某一就是在给定的条件成立时反复执行某一程序段,被反复执行的程序段称为循环体。程序段,被反复执行的程序段称为循环体。5.1 while5.1 while语句语句真真(非零非零)表达式表达式循环体循环体假假(零零)1.while 1.while 语句的形式语句的形式:while(while(表达式)表达式)循环体;循环体;2 2.while.while语句常称为语句常称为“当型当型”循环语句。循环语句。3.3.说明说明:先判断表达式,后执行语句。先
3、判断表达式,后执行语句。表达式同表达式同ifif语句后的表达式一样,可以是语句后的表达式一样,可以是任何类型的表达式。任何类型的表达式。循环体多于一句时,用一对循环体多于一句时,用一对 括起括起。whilewhile循环结构常用于循环次数不固定,根循环结构常用于循环次数不固定,根据是否满足某个条件决定循环与否的情况。据是否满足某个条件决定循环与否的情况。例:分析下列程序段的循环次数例:分析下列程序段的循环次数i=1;i=1;while(iwhile(i=100)0)0)printfprintf(+);(+);else else printfprintf(-);(-);scanf(%f,&xsc
4、anf(%f,&x););判断正负号判断正负号#include#include stdio.hstdio.h void main()void main()char char chch;intint num=0;num=0;chch=getchargetchar();();例例5.2 5.2 统计从键盘输入的一行字符的个统计从键盘输入的一行字符的个数(以回车键作为输入结束标记)数(以回车键作为输入结束标记)。while(chwhile(ch!=n)!=n)判断是否输入结束判断是否输入结束 num+;num+;chch=getchargetchar();();printf(numprintf(nu
5、m=%dn,num);=%dn,num);5.2 do-while5.2 do-while语句语句1 1.do-while.do-while的形式:的形式:do do 循环体;循环体;while(while(表达式表达式););2 2.do-while.do-while语句常称为语句常称为“直到型直到型”循环语句。循环语句。真真(非零非零)表达式表达式循环体循环体假假(零零)3.3.说明说明:先先执行执行语句语句,后判断,后判断表达式表达式。第一次条件为真时,第一次条件为真时,whilewhile,do-whiledo-while等等价;第一次条件为假时,二者不同。价;第一次条件为假时,二者不
6、同。例例5.3 5.3 用用do-whiledo-while语语句句编编写写程程序序统统计计从从键键盘盘输输入入的的一一行行非非空空字字符符的的个个数数(以以回回车车键键作作为为输输入入结结束标记)。束标记)。#include#include stdio.hstdio.h void main()void main()char char chch;intint num=0;num=0;chch=getchargetchar();();do do num+;num+;chch=getchargetchar();();while(chwhile(ch!=n);!=n);printf(numprint
7、f(num=%dn,num);=%dn,num);5.3 for5.3 for语句语句1.for1.for的形式:的形式:for(for(初始表达式初始表达式1 1;条件表达式;条件表达式2 2;循环表达式;循环表达式3 3)循环体循环体;表表达达式式1:用用于于循循环环开开始始前前为为循循环环变变量量设设置置初初始值。始值。表达式表达式2:控制循环执行的条件,决定循环次:控制循环执行的条件,决定循环次数。数。表达式表达式3:循环控制变量修改表达式。:循环控制变量修改表达式。循环体语句:被重复执行的语句。循环体语句:被重复执行的语句。表达式表达式3 3计算表达式计算表达式1 1循环体循环体判断
8、表达式判断表达式2 2零零非零非零forfor的下一条语句的下一条语句2.2.执行过程执行过程for(ifor(i=1;i=100;i+)=1;i=100;i+)sum=sum=sum+isum+i;例如:例如:它相当于以下语句:它相当于以下语句:i=1;i=1;while(i=100)while(i=100)sum=sum+i;sum=sum+i;i+;i+;表达式表达式1 1;whilewhile(表达式表达式2 2)表达式表达式3 3;3.3.说明说明三个表达式都可以是逗号表达式。三个表达式都可以是逗号表达式。三个表达式都是任选项,都可以省略,但要注三个表达式都是任选项,都可以省略,但要
9、注意省略表达式后,分号间隔符不能省略。意省略表达式后,分号间隔符不能省略。forfor语句中表达式省略的形式语句中表达式省略的形式:(1 1)forfor语语句句一一般般形形式式中中的的“表表达达式式1 1”可可以以省略。省略。如:如:sum=0;i=1;sum=0;i=1;for(;i=100;i+)for(;i100)100)break;break;sum=sum=sum+isum+i;学生自学学生自学(3 3)表达式)表达式3 3也可以省略,但此时保证循环也可以省略,但此时保证循环能正常结束。能正常结束。如:如:for(sumfor(sum=0,i=1;i=100;)=0,i=1;i=1
10、00;)sum=sum+i;sum=sum+i;i+;i+;学生自学学生自学(4 4)可以省略表达式)可以省略表达式1 1和和表达式表达式3 3,只有表达式,只有表达式2 2。如:如:i=1;sum=0;i=1;sum=0;for(;i=100;)for(;i=100;)sum=sum=sum+isum+i;i+;i+;i=1;sum=0;i=1;sum=0;while(i=100)while(i100)break;100)break;sum=sum=sum+isum+i;i+;i+;相当于相当于学生自学学生自学(6 6)循环体为空语句)循环体为空语句 对对forfor语句,循环体为空语句的一
11、般形式为语句,循环体为空语句的一般形式为:for(for(表达式表达式1 1;表达式;表达式2 2;表达式;表达式3)3);如:如:for(sumfor(sum=0,i=1;i=100;sum+=0,i=1;i=100;sum+=I,iI,i+)+);学生自学学生自学(1 1)在进入累加前先给累加器赋初值(一般为)在进入累加前先给累加器赋初值(一般为0 0););(2 2)用循环语句实现累加;)用循环语句实现累加;for(for(循环变量赋初值循环变量赋初值;循环条件循环条件;循环变量改变规律循环变量改变规律)(3 3)循环体语句的设计。)循环体语句的设计。累加器当前值累加器当前值=累加器原值
12、累加器原值+循环变量当前值循环变量当前值;典型例题分析典型例题分析例例5.4 5.4 求累加和求累加和1+2+3+1+2+3+1000+1000基本方法基本方法:属于属于“累加器累加器”类型问题。类型问题。累加器赋初值累加器赋初值思考思考:求偶数和求偶数和2+4+6+2+4+6+100+100参考程序:参考程序:void main()void main()long long intint k,sk,s;s=0;s=0;for(k=1;k=1000;k+)for(k=1;k=1000;k+)s=s+k;s=s+k;printfprintf(s=%lds=%ld ,s);,s);累加累加(1 1)
13、给累乘器赋初值,一般为)给累乘器赋初值,一般为1 1;(2 2)用循环语句实现累乘;)用循环语句实现累乘;for(for(循环变量赋初值循环变量赋初值;循环条件循环条件;循环变量改变规律循环变量改变规律)(3 3)循环体设计。)循环体设计。累乘器当前值累乘器当前值=累乘器原值累乘器原值*循环变量当前值;循环变量当前值;例例5.5 5.5 求累乘积。如求累乘积。如:1:12 23 3.100100基本方法基本方法:属于属于“累乘器累乘器”类型问题。类型问题。累乘器赋初值累乘器赋初值思考思考:求求n!=1n!=12 23 3n n参考程序:参考程序:void main()void main()do
14、uble s=1;double s=1;intint k;k;for(k=1;k=100;k+)for(k=1;k=100;k+)s=s*k;s=s*k;printf(printf(s s=%=%lflf,s,s););累乘累乘整数连乘结果一定整数连乘结果一定是整数,而本例中是整数,而本例中结果数值相当大,结果数值相当大,用用longlong型都无法存型都无法存放,因此将存放累放,因此将存放累乘结果的变量乘结果的变量s s定义定义为为doubledouble型。型。例例5.6 5.6 用用0-90-9这十个数字可以组成多少无这十个数字可以组成多少无重复的三位数重复的三位数?编程方法:编程方法:
15、“枚举法枚举法”按问题本身的性质,一一列举出该问题按问题本身的性质,一一列举出该问题所有可能的解,并在逐一列举的过程中,检所有可能的解,并在逐一列举的过程中,检验每个可能解是否是问题的真正解,若是,验每个可能解是否是问题的真正解,若是,我们采纳这个解,否则抛弃它。对于所列举我们采纳这个解,否则抛弃它。对于所列举的值,既不能遗漏也不能重复。的值,既不能遗漏也不能重复。void main()void main()intint x,a,b,c,numx,a,b,c,num=0;=0;/*/*a,b,ca,b,c代表百、十、个位代表百、十、个位*/*num /*num存放满足条件的数的个数,注意存放满
16、足条件的数的个数,注意numnum要赋初值要赋初值*/for(xfor(x=100;x=999;x+)=100;x=999;x+)a=x/100;b=x/10%10;c=x%10;a=x/100;b=x/10%10;c=x%10;if(a!=b&a!=c&b!=c)if(a!=b&a!=c&b!=c)num+;num+;printf(%5d,x);printf(%5d,x);printf(nnumberprintf(nnumber=%d,num);=%d,num);#include#include stdio.hstdio.h“参考程序:参考程序:编程方法:编程方法:“递推法递推法”例例5.7
17、 5.7 裴波那契数列的第裴波那契数列的第1 1、2 2项分别为项分别为1 1、1 1,以后,以后各项的值均是其前两项之和。求前各项的值均是其前两项之和。求前3030项菲波那契数。项菲波那契数。所所谓谓递递推推法法就就是是从从初初值值出出发发,归归纳纳出出新新值值与与旧旧值值间间的的关关系系,直直到到求求出出所所需需值值为为止止。新新值值的的求求出出依依赖赖于于旧旧值值,不不知知道道旧旧值值,无无法法推推导导出出新新值值。数数学学上上递递推推公公式式正正是是这这一一类类问问题。题。f1-f1-第一个数第一个数 f2-f2-第二个数第二个数 f3-f3-第三个数第三个数 f1=1;f2=1;f3
18、=f1+f2;f1=1;f2=1;f3=f1+f2;以后只要改变以后只要改变f1,f2f1,f2的值,即可求出下一个数的值,即可求出下一个数.f1=f2;f2=f3;f3=f1+f2;f1=f2;f2=f3;f3=f1+f2;递推递推void main()void main()long f1=1long f1=1,f2=1f2=1,f3;f3;intint k k;参考程序参考程序:printfprintf(%ld%ldtt%ldt%ldt ,f1,f2);,f1,f2);for(k=3;k=30;k+)for(k=3;k=1;x-)=300;x=1;x-)if(x%17=0)if(x%17=
19、0)break;break;printf(xprintf(x=%dn,x);%dn,x);找到满足条件的最找到满足条件的最大数,结束循环大数,结束循环(1 1)语句形式)语句形式:continue;continue;(2 2)语句作用)语句作用:结束结束本次循环本次循环。2.2.continuecontinue语句语句(3 3)语句执行流程)语句执行流程:continue continue语句可以结束本次循环,即不再执语句可以结束本次循环,即不再执行循环体中行循环体中continue continue 语句之后的语句,转入下一语句之后的语句,转入下一次循环条件的判断与执行。次循环条件的判断与执
20、行。例例5.10 5.10 求求300300以内能被以内能被1717整除的所有整数。整除的所有整数。#include#include stdio.hstdio.h void main()void main()intint x,k;x,k;for(xfor(x=1;x=300;x+)=1;x=300;x+)if(x%17!=0)if(x%17!=0)continue;continue;printf(printf(%dt,x%dt,x););while(while(条件条件)语句语句A;A;break;break;语句语句 B;B;真真语句语句B B条件条件语句语句A Abreakbreak假假结
21、束循环结束循环3.break3.break语句与语句与continuecontinue语句的区别语句的区别至此位置至此位置while(while(条件条件)语句语句A;A;continue;continue;语句语句 B;B;真真语句语句B B条件条件语句语句A Acontinuecontinue假假结束循环结束循环至此位置至此位置#include#include stdio.hstdio.h void main()void main()intint a,b;a,b;for(afor(a=1,b=1;a=10;a+)=1,b=1;a=10)break;=10)break;if(b if(b%3
22、=1)3=1)b+=3;continue;b+=3;continue;printf(printf(%dn,adn,a););例例5.11 5.11 分析以下程序的运行结果。分析以下程序的运行结果。程序运行结果:程序运行结果:4 4 在循环体语句中又包含有另一个完整的循环结构的在循环体语句中又包含有另一个完整的循环结构的形式,称为循环的嵌套。如果内循环体中又有嵌套形式,称为循环的嵌套。如果内循环体中又有嵌套的循环语句,则构成多重循环。的循环语句,则构成多重循环。5.6 5.6 循环的嵌套循环的嵌套嵌套在循环体内的循环体称为内循环,外面的循环嵌套在循环体内的循环体称为内循环,外面的循环称为外循环。
23、称为外循环。while while、do-whiledo-while、forfor三种循环都可以互相嵌套。三种循环都可以互相嵌套。循环语句之间的关系循环语句之间的关系for(.)for(.).for(.)for(.).内内循循环环外外循循环环for(.)for(.).for(.)for(.).并列循环并列循环嵌套循环嵌套循环交叉循环交叉循环for(.)for(.).for(.)for(.).错误错误真真真真外循环初始条件外循环初始条件内循环初始条件内循环初始条件内循环体内循环体外循环条件外循环条件假假内循环条件内循环条件假假内循环循环条件内循环循环条件外循环循外循环循环条件环条件循环结束循环结
24、束二重二重循环循环嵌套嵌套结构结构执行执行流程流程 5.7 5.7 循环结构程序设计举例循环结构程序设计举例例例5.12 5.12 输输入入任任意意一一个个整整数数,将将其其逆逆序序输输出出,例例如如输入输入12341234,输出,输出43214321。include include stdio.hstdio.h void main()void main()long y,n;long y,n;scanf(%ld,&yscanf(%ld,&y)while(ywhile(y!=0)!=0)n=y%10;n=y%10;printf(%ld,nprintf(%ld,n););y=y/10;y=y/10
25、;例例5.13 5.13 猴猴子子第第一一天天摘摘下下若若干干个个桃桃子子,当当即即吃吃了了一一半半,又又多多吃吃了了一一个个。以以后后每每天天早早晨晨猴猴子子都都吃吃掉掉前前一一天天剩剩下下的的一一半半多多一一个个。到到第第5 5天天时时,猴猴子子再再去去吃吃桃桃子子时时发发现现只只剩剩下下1 1个桃子。问第一天猴子摘了多少个桃子?个桃子。问第一天猴子摘了多少个桃子?#include#include stdio.hstdio.h void main()void main()intint x=1,n;x=1,n;for(nfor(n=4;n=1;n-)=4;n=1;n-)x=(x+1)*2;x
26、=(x+1)*2;printf(%d,xprintf(%d,x););例例5.14 5.14 猜猜数数游游戏戏:任任意意设设置置一一个个整整数数,请请用用户户从从键键盘盘上上输输入入数数据据猜猜想想设设值值的的数数是是什什么么,告告诉诉用用户户是是猜猜大大了了还还是是小小了了。1010次次以以内内猜对,用户获胜。否则,告诉用户设置的数据是什么。猜对,用户获胜。否则,告诉用户设置的数据是什么。#include#include stdio.hstdio.h void main()void main()intint num=123,x,n;num=123,x,n;printf(hint:0number1000n);printf(hint:0number1000n);for(nfor(n=1;n=10;n+)=1;nnum)num)printf(bigger!nprintf(bigger!n););if(xnum)if(xnum)printf(smaller!nprintf(smaller!n););if(nif(n=11)=11)printf(Lost!theprintf(Lost!the number is%dn,x);number is%dn,x);