版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四章第四章 循环控制循环控制代码复用,省代码复用,省时时省力省力LOGO循环定义及要点n循环就是反复执行某些动作网络与计算中心网络与计算中心循环体 归纳出哪些操作需要反复执行循环控制条件 这些操作在什么情况下重复执行n 随着循环不断地执行,必须有一种方法使得循环控制条件最终不成立,循环可以退出,否则,就构成死循环,程序永远无法终止。LOGO引例引例n在现实生活中,经常会遇到评委打分的情况,比如奥运会中的跳水项目,评选优秀班集体等。n评委打分的过程大致是这样的,假设有n个评委,个评委,每个评委根据自己的判断给出一个分值,然后在n个评委的打分中去掉最高分和最低分,对剩下的分数取平均值分数取平均值
2、。现在把问题简化为不去掉最高分和最低分,直接取平均值作为选手的最终得分。LOGOEX4.1真假输入一个评委的评分将评分累加到总分中求平均得分n评分: double score;n平均分: double avg;n评委人数nint n;n当前评委编号nint i;n总分: double sum;还有评委的评分没有输入LOGOEX4.1真假输入一个评委的评分将评分累加到总分中求平均得分n评分: double score;n平均分: double avg;n评委人数nint n;n当前评委编号nint i;n总分: double sum;cinscore;sum+=score;avg=sum/n;还
3、有评委的评分没有输入i=nLOGOEX4.1真假nint n; /评委评委人数人数nint i; /当前评委编号当前评委编号ndouble score; /评分评分ndouble sum; /总分总分ndouble avg; /平均分平均分 iscore; sum+=score;avg=sum/n;i=1;sum=0;i+;LOGO4.14.1循环语句循环语句网络与计算中心网络与计算中心for循环语句while循环语句do-while循环语句多重循环LOGO4.1.1 for4.1.1 for语句语句规范的结构LOGOfor ( 表达式表达式1; 表达式表达式2; 表达式表达式3 ) 循环体循
4、环体语句语句 初始初始表达式:表达式:对表达式对表达式2 2中的循中的循环控制变量赋初值变量环控制变量赋初值变量 循环循环控制逻辑表达式控制逻辑表达式: 循环循环控制变量控制变量 循环后置循环后置表达式表达式: 改变改变表达式表达式2 2中的循环控制变量的值中的循环控制变量的值for 语句的格式LOGOEX4.1真假#includeusing namespace std;int main()int n=12; /评委人数评委人数int i; /当前评委编号当前评委编号double score; /评分评分double sum; /总分总分double avg; /平均分平均分 return 0
5、; iscore; sum+=score;avg=sum/n;i=1;sum=0;i+;LOGOEX4.1LOGOEX4.1sum=0;for( i=1; iscore; sum+=score; avg=sum/n;cout“avg=“avgendl;LOGOfor循环的变化形式n可以把赋初值的多个操作以逗号表达式的形式放在表达式1中。for( i=1,sum=0; iscore;sum+=score;for循环的变化形式LOGOfor循环的变化形式for循环的变化形式n表达式1可以为空,赋初值的操作可以放在循环语句之前 i=1; sum=0; for(; iscore;sum+=score;
6、LOGOfor循环的变化形式n表达式2可以为空,但两个分号不能少,分号用来区分号用来区分分3个表达式个表达式,表达式2为空是表达式永远为真的情况,需要在循环体中,根据一定的条件,以break语句跳出。for( i=1,sum=0; ; i+)if(in) break;cinscore;sum+=score;for循环的变化形式LOGOfor循环的变化形式n表达式3可以为空for( i=1,sum=0; iscore;sum+=score;i+;for循环的变化形式编程计算 s=1+2+3+4+100s=s+1s=s+2s=s+3s=s+100s=s+i ;i+;举例:举例:变量:变量: int
7、int s=0, i=1 s=0, i=1举例延伸:举例延伸:求 s=1-1/3+1/5-1/7+.+1/n求 e=1+1/1!+1/2!+1/3!+.+1/n!s=s+1/item*sign;item=item+2;sign=-sign;s=s+1/item;i=i+1;item=item*i;LOGO4.1.2 4.1.2 whilewhile语句语句当循环LOGOwhile (表达式表达式 ) 循环体循环体语句语句; 表达式while语句格式 循环开始前对循环条件进行初始化 在循环体语句中要包含修改循环条件的语句,否则循环将不能终止而陷入死循环。LOGOEX4.1sum=0;i=1;wh
8、ile ( iscore; sum+=score; i+;avg=sum/n;cout“avg=“avgendl;循环开始前对循环条件进行初始化在循环体语句中要包含修改循环条件的语句LOGOfor循环与while循环对比i=1;while ( iscore; sum+=score; i+;for( i=1 ; iscore; sum+=score; for循环while循环 结构上有差别 功能相同 循环初始表达式和后置表达式作为结构的一部分LOGO4.1.3 4.1.3 dodowhilewhile语句语句直到循环LOGO do-while 语句格式 表达式do 循环体循环体语句语句; whi
9、le (表达式表达式 );LOGOEX4.1真假cinscore; sum+=score;avg=sum/n;i=1;sum=0;i+;iscore; sum+=score; i+; while ( i=n );avg=sum/n;cout“avg=“avgi;while ( i=5 ) sum+=i; i+;cout“sum=“sumi;do sum+=i; i+; while ( i=5 );cout“sum=“sumendl;Dowhile循环i5LOGO4.1.4 4.1.4 三三种语句的共性和种语句的共性和区别区别依据实际问题选择适合的语句LOGO三三种语句的共性和区别种语句的共性和
10、区别do-while 先执行循环体,先执行循环体,再判断循环条再判断循环条件是否满足件是否满足 至少执行一次至少执行一次while 先判断条件是先判断条件是否满足,然后否满足,然后才执行循环体才执行循环体 可能一次也不可能一次也不执行。执行。for 先判断条件是先判断条件是否满足,然后否满足,然后才执行循环体才执行循环体 可能一次也不可能一次也不执行执行LOGO三种语句的共性和区别可以相互替换,都能实现循环控制 如果循环次数已知或者能用表达式确定,则选择如果循环次数已知或者能用表达式确定,则选择for循环循环 循环次数未知时,一般选择循环次数未知时,一般选择while或者或者do-while循
11、环循环 在有些情况下,循环条件中的变量是在循环题中计算出在有些情况下,循环条件中的变量是在循环题中计算出来的,适合用来的,适合用do-while循环。循环。LOGO循环算法的设计循环条件表达式n找出决定循环次数的变量找出决定循环次数的变量n用这些变量构成表达式用这些变量构成表达式循环体:考虑一次循环过程的所有细节1. 每次循环要完成的每次循环要完成的目的操作目的操作2. 进入下一次循环前要进行的进入下一次循环前要进行的预处理操作预处理操作使用相同变量,相同程序语句完成每一次循环使用相同变量,相同程序语句完成每一次循环注意注意: 在每一次循环中,必须对决定循环执行次在每一次循环中,必须对决定循环
12、执行次数的变量的值进行数的变量的值进行更新更新LOGOEX4.4多少年: int i;初值: i=0;利滚利:循环结构循环控制变量:小张的积蓄小张的积蓄:double m;循环执行条件:m20循环控制变量的初值: m=10;n小张现在有10万元储蓄,将这笔钱存在银行,年利率为5%,并且利滚利,问:多少年后,小张的积蓄能够翻一番?l循环体l计算积蓄:m=m*1.05;l累加年数:i+;循环条件循环条件m20LOGOEX4.4#includeusing namespace std;int main()double m=10;int i=0;while(m20)m=m*1.05;i+;couti=i
13、endl;return 0;多少年: int i;初值: i=0;利滚利:循环结构循环控制变量:小张的积蓄小张的积蓄:double m;循环控制变量的初值: m=10;循环执行条件:m20l循环体l计算积蓄:m=m*1.05;l累加年数:i+;LOGO4.1.5 4.1.5 多重循环多重循环把一个循环结构看成一个整体LOGO多重循环n在用三种语句实现的循环结构中,循环体语句是一条语句或者是用 括起来的复合语句。n如果把一个循环结构看成一个整体,它相当于把一个循环结构看成一个整体,它相当于一条语句一条语句,也可以出现在for、while或者do-while之下作为循环体语句,这样就构成了多重循环
14、。LOGO多重多重循环举例循环举例n编写程序打印如下图形。编写程序打印如下图形。n先解决打印一行的问题:先解决打印一行的问题: for(j=1;j=5;j+)for(j=1;j=5;j+) cout cout* *; ;将将其其重复重复5 5次次for for i=1;ii=1;i=5;i=5;i+)+) for(j=1;j=5;j+)for(j=1;j=5;j+) cout cout* *; ; coutendl; coutendl;LOGO多重多重循环举例循环举例n编写程序打印如下图形。编写程序打印如下图形。for for i=1;ii=1;i=5;i=5;i+)+) for(j=1;j=
15、5 ; j+)for(j=1;j=5 ; j+) cout cout* *; ; coutendl; coutendl;for(j=1;j=i ; j+)for(j=1;j=i ; j+)LOGO多重多重循环举例循环举例n编写程序打印如下图形。编写程序打印如下图形。for for i=1;ii=1;i=5;i=5;i+)+) coutendl; coutendl; for(j=1;j=i ; j+)for(j=1;j=i ; j+)coutcout* *; ;for(j=1;j=5 i ; j+)for(j=1;j=5 i ; j+) coutcout ; ;LOGOEX4.7n要解决这一类问
16、题,主要有以下几个问题要解决:1.当边长为n时共需要打印多少行2.每一行第一个*前有多少个空格,与n和行数是什么关系?3.每行的*号数及*后的空格数,与n和行数是什么关系?n=4LOGO问题的细化:上三角&下三角 * * * * * * * * * * * * * * * * 上三角下三角LOGO问题的细化:上三角&下三角 * * * * * * * * * * * * * * * * 边长n=4上三角空格数空格数星号数星号数131222313404LOGO/输出第i行,共执行n次for( i=1; i=n; i+ ) 输出n-i个空格输出i个”星号空格”换行每行前的空格数及星号数与行数i及边
17、长n的关系打印上三角空格数空格数星号星号数数131222313404LOGOint j; /输出上三角的输出上三角的n行行,i为行号为行号for(i=1;i=n;i+) /输出输出n-i个空格个空格for( j=1;j=n-i;j+ ) cout ;/输出输出i个星号个星号及空格及空格for( j=1;j=i;j+ ) cout“* “; /换行换行coutendl;打印上三角LOGO/输出第i行,共执行n-1次for(i=1; i=n-1; i+) 输出i个空格输出n-i个”星号空格”换行每行前的空格数及星号数与行数i及边长n的关系打印下三角空格数空格数星号星号&空格空格数数11322233
18、1LOGO/输出下三角的输出下三角的n-1行行,i为行号为行号for(i=1;i=n-1;i+) /输出输出i个空格个空格for( j=1;j=i;j+ ) cout ;/输出输出n-i个星号个星号及空格及空格for( j=1;j=n-i;j+ ) cout“* “; /换行换行coutendl;打印下三角LOGO4.2 4.2 流程控制语句流程控制语句网络与计算中心网络与计算中心breakcontinueLOGObreak & continuebreak语句语句 无条件地结束无条件地结束switch语语句,或循环语句句,或循环语句 转向执行语句块的后续转向执行语句块的后续语句语句contin
19、ue语句语句 用于循环体中,终止当用于循环体中,终止当前一次循环前一次循环LOGOwhile ( E1 ) 语句语句 1 if ( E2 ) continue ; 语句语句 2while ( E1 ) 语句语句 1 if ( E2 ) break ; 语句语句 2 语句2 E 1 语句1 E2 下一语句 breakbreak 语句2 E 1 语句1 E 2 下一语句 continuecontinueTTFFFFTTLOGOn例:输出例:输出1100内内3的倍数。的倍数。n分析:分析:设置整型变量设置整型变量I从从1变化到变化到100,依次测试,依次测试I是否是否3的的倍数,算法属于穷举法。倍数
20、,算法属于穷举法。 for (int i=1;i=100;i+) if ( i%3!=0) continue; /i不是3的倍数,转向下一次循环 coutit; /当i是3的倍数,输出i; break & continueLOGOEX4.8n算法如下:nfor(i=2;im;for(i=2;i=m) /在在i从从2变到变到m-1中,中,m%i=0始终不成立始终不成立 coutm是素数endl;else coutm不是素数endl;标标志志变变量量的的引引入入LOGOEX4.8n算法如下:n设置一个标志变量flag,flag,初值为初值为0 0nfor(i=2;im;i+)n判断m能否被i整除n
21、能整除则: 置标志变量flag=1;flag=1; 已经知道m不是素数,提前退出循环n如果标志变量的值为1,则m不是素数,否则是素数。n对于某个数m,在2至m-1之间,只要有个数能被m整除,就能说明m不是素数,只有所有的数都不能整除,才能说明m不是素数LOGOEX4.8flag=0;for( i=2; im; i+ )if(m%i=0)flag=1; / m被某个被某个i整除了,改变标志变量的值整除了,改变标志变量的值break; /提前退出循环提前退出循环if(flag=0) /在在i从从2变到变到m-1中,中,m%i=0始终不成立始终不成立coutm是素数endl;elsecoutm不是素
22、数endl;return 0;优化n=sqrt(m);for( i=2; i=n; i+ )LOGO标志变量判断是否提前退出循环nflag 是一个标志变量,它在程序中的作用是标志m是否被某个i整除。n一开始它的初值设置为0n在循环体中使用if(m%i=0) 来判断m是否被整除,如果表达式为真,则m被i整除,将flag的值置为1。n因此,只要有一个i使m被i整除,则flag的值为1。n除非所有的i都不能满足m被i整除,flag的值才为0;这刚好为循环体外通过flag的值判断m是否为素数提供了条件。LOGO4.34.3常用常用算法应用举例算法应用举例网络与计算中心网络与计算中心穷举法迭代法递推法L
23、OGOn穷举法基本思想是,在有限范围内列举所有可能的结果,找出其中符合要求的解。n穷举法适合求解的问题是:可能的答案是有限个且答案是可知的,但又难以用解析法描述。这种算法通常用循环结构来完成。穷举法LOGO 设鸡翁、母、雏分别为i,j,k,根据题意可得 i*5+j*3+k/3=100; i+j+k=100; EX4.12n“百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何? 两个方程无法解出三个变量,只能将各种可能的取值代入,其中能满足两个方程的就是所需的解,这就是枚举算法LOGO 设鸡翁、母、雏分别为i,j,k,根据题意可得 i*5+j*3+k/3
24、=100; i+j+k=100; EX4.12n“百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何? i、j、k可能的取值有哪些?分析可知,百钱最多可买鸡翁20,鸡母33,鸡雏300LOGOfor (i=0; i=20;i+)for (j=0; j=33;j+) for (k=0; k=300;k=k+3) if (i+j+k=100)&(5*i+3*j+k/3=100) coutijk;EX4.12n算法算法使用三重循环,执行时间函数是立方使用三重循环,执行时间函数是立方阶,循环体将执行阶,循环体将执行20*33*300=198000次。次。n如如
25、能在能在算法上改进一下算法上改进一下,减少,减少一重循环,一重循环,将大大缩短运行时间。将大大缩短运行时间。LOGOn实际上,当i、j确定时,k就可由题目要求确定为100-i-j,因此实际上只要用i、j去测试就可以了n循环体将执行:20*33=660次算法优化EX4.12for (i=0; i+=20;) for (j=0; j=33;j+) k=100-i-j; if(5*i+3*j+k/3=100)&(k%3=0) coutijk;LOGO 用用i,j,k,m四个变量分别表示千、百、十、个位上的数。四个变量分别表示千、百、十、个位上的数。 则则i的取值为的取值为03,j 的的取值为取值为0
26、2, k的的取值为取值为02, m的的取取值为值为03 。 用四重循环实现,但要注意各位数字不能相同。用四重循环实现,但要注意各位数字不能相同。EX4.11n由由0 0到到3 3四个数字,组成四个数字,组成4 4位数,每个数字用一次,但十位位数,每个数字用一次,但十位和百位不能为和百位不能为3 3,输出所有可能的四位数。要求每行显示,输出所有可能的四位数。要求每行显示5 5个数。个数。LOGOEX4.11n算法使用四重算法使用四重循环循环,逐一列举每位上可能,逐一列举每位上可能出现的数字出现的数字for(i=1;i=3;i+) for(j=0;j3;j+) if(j=i)continue; f
27、or(k=0;k3;k+) if (k=j|k=i) continue; for(m=0;m=3;m+) if(m=k|m=i|m=j) continue; coutijkmt; count+; LOGOif (count%5=0) coutendl; v每每行显示行显示5个数如何处理个数如何处理?EX4.11LOGO迭代法迭代法n迭代是数值分析中通过从一个初始估计出发寻找一系列近似解来解决问题的过程,为实现这一过程所使用的方法统称为迭代法。LOGOEX4.5n牛顿迭代法求解平方根na是已知正数,x 0是迭代初值,给x 0一个值,假定 x 0 = a/2;则用迭代公式迭代公式依次计算:ox1=
28、(x0+a/x0)/2;x2=(x1+a/x1)/2;nxk+1=(xk+a/xk)/2;n当|xk+1 xk|(是一个较小的正数)时,迭代终止,取xk+1的值为a的平方根近似值LOGOEX4.5#include #include using namespace std;int main()double a;/a的输入do couta;while (a=1e-5 );cout a的平方根为:x1=1e-5,而x1和x0都是在循环体中被赋值,这种情况用do-while循环更好。如果要改成while循环,会稍复杂些。LOGO递推法递推法n递推算法是通过问题的一个或多个已知解,用同样的方法逐个推算出
29、其他解,如数列问题,近似计算问题等,通常也要借助于循环结构完成。LOGO ! 7x! 5x! 3xx)xsin(753EX4.13n输入一个小于1的数x,求sinx的近似值,要求误差小于0.0001。近似计算公式如下这个近似计算可以看作一个累加过程,关键在于累加项数的确定。double p; /累加项doubel sin;/累加和累加:sin+=p;LOGOEX4.13fabs(p)0.0001Sin=0; i=1;P=x;主操作: sin+=p;预处理:p=p *(-1) *x*x /(2*i*(2*i+1); i+;)!1i2(x)1()1i(次累加时i第1i21iipT)1(2*2x*1
30、)(*pp下一次累加时2iiiLOGOEX4.14n一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子,假设兔子不存在死亡问题,请问从第1个月到第20个月,每个月有多少对兔子?n这个问题的答案是Fibonacci数列1n 1)-fib(n2)-fib(n1n 1 0n 1 fib(n)LOGOEX4.14: Fibonacci数列n除了第0项和第1项外,每一项都是由类似方法产生,即前两项之和n所以求当前项时,只需要记住前两项n程序不需要为每一项设置专用变量;属递推算法。1n 1)-fib(n2)-fib(n1n 1 0n 1 fib(n)LOGO /4_12
31、.cpp,兔子繁衍问题int main() int fib0=0,fib1=1,fib2;int n; /当前计算的是第几项当前计算的是第几项coutsetw(5)fib0setw(5)fib1endl;for(n=3;n=20;n+)fib2=fib0+fib1;coutsetw(5)fib2;if(n%5=0) coutendl; /控制每控制每行只显示行只显示5个数据个数据fib0=fib1; fib1=fib2; /递推递推 return 0;EX4.14 Fibonacci数列LOGO4.5 4.5 输入输出文件简介输入输出文件简介网络与计算中心网络与计算中心ofstreamifst
32、reamLOGO文件输入输出文件输入输出输入100个数,求平均值for(i=1;ia; s+=a;couts/100.0endl;有个数字输入错了怎么办?有什么办法把要输入的数据事先用记事本编辑好,然后再输入?文件输入的要点1. 定义输入文件2.打开文件3.从文件输入数据4.关闭文件 ifstream ifile;ifile.open(d:my_in_file.txt);for(i=1;ia; s+=a;ifile.close();couts/100.0endl;#include LOGO文件输入与输出对比文件输入与输出对比 #include #include 文件输入的要点1. 定义输入文件
33、2.打开文件3.从文件输入数据4.关闭文件文件输出的要点1. 定义输出文件2.打开文件3.将数据输出到文件4.关闭文件 ifstream ifile; ofstream ofile; ifile.open(d:my_in_file.txt); ofile.open(d:my_out_file.txt); for(i=1;ia; s+=a; ofiles/100.0 x; n+; sum+=x;判断数据是否读完LOGO4.3 4.3 综合综合举例举例网络与计算中心网络与计算中心 划拳 龟兔赛跑LOGO【例 4.9】 两个小孩用石头剪刀布划拳,游戏规则:每个人有5滴血,如果两人出的拳相同,则重新来
34、,否则,石头胜剪刀,剪刀胜布,布胜石头,划拳输一次血滴数减1,谁的血滴数先减到0者输分析以下问题:1.每个人有5滴血,如何表示?2.出的拳如何表示?3.石头胜剪刀,剪刀胜布,布胜石头,如何表示?4.如何判断胜负?5.有需要重复执行的步骤吗?int c1=5,c2=5;int p1,p2;/1:石头2:剪刀3:布(p1=1&p2=2)|(p1=2&p2=3)|(p1=3&p2=1)c1=0&c20|p1-p2|=1 &p1p1LOGO程序流程图程序流程图c1=5,c2=5输入p1,p2c10&c20判断出拳是否相同输出p1,p2的文字c2-判断p1的输赢c1-判断胜负输出赢家1输出赢家2TFTFTFFTLOGO核心代码while(c10&c20) cinp1p2; if(p1=p2)continue; if(p1=1&p2=2)|(p1=2&p2=3)| (p1=3&p2=1)c2-; elsec1-;if(c10) cout1Win!n;elsecout2Win!n;switch(p1) case 1:cout石头石头;break; case 2:cout剪刀剪刀;break; case 3:cout布布;break; coutt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 租赁家具装修协议书
- 空调收购合同协议书
- 移交承包土地协议书
- 编织袋购买合同范本
- 癫痫幼儿责任协议书
- 缔结友好协会协议书
- 短期工兼职合同范本
- 签收产品合格协议书
- 硫磺设备合作协议书
- 科技企业孵化协议书
- 工厂托管协议书范本
- 2025贵阳市康养集团有限公司三医康养服务分公司招聘2人笔试考试备考试题及答案解析
- (2026)糖尿病患者的护理课件
- DZ∕T 0213-2020 矿产地质勘查规范 石灰岩、水泥配料类(正式版)
- 医保异地备案委托书
- MOOC 跨文化交际通识通论-扬州大学 中国大学慕课答案
- 十八大以来的成果
- 《千里江山图》课件ppt
- 《建筑工程施工转包违法分包等违法行为认定查处管理办法》解读
- DB32-T 4281-2022 江苏省建筑工程施工现场专业人员配备标准
- 钢结构提升安全技术交底
评论
0/150
提交评论