资源描述
第四章循环控制网络与计算中心网络与计算中心LOGO循环定义及本章要点网络与计算中心网络与计算中心循环就是反复执行某些动作本章要点:for循环语句while循环语句do-while循环语句多重循环LOGO循环程序的实现要点1)归纳出哪些操作需要反复执行,即C+中的循环体2)这些操作在什么情况下重复执行-即C+中的循环控制条件3)随着循环不断地执行,必须有一种方法使得循环控制条件最终不成立,循环可以退出,否则,就构成死循环,程序永远无法终止。LOGO引例n在现实生活中,经常会遇到评委打分的情况,比如奥运会中的跳水项目,评选优秀班集体等。n评委打分的过程大致是这样的,假设有n个评委,每个评委根据自己的判断给出一个分值,然后在n个评委的打分中去掉最高分和最低分,对剩下的分数取平均值。现在把问题简化为不去掉最高分和最低分,直接取平均值作为选手的最终得分。LOGO问题分析要解决这个问题,需要以下三个步骤:1)输入1个评委的评分2)将该评委的评分累加到总和sum中3)用总和sum除以n得到平均分avg思考:哪些步骤重复执行?LOGO评委打分问题流程图LOGO 4.1.1for 语句语句 for循环语句的格式循环语句的格式for(表达式表达式1;表达式表达式2;表达式表达式3)循环体语句循环体语句 表达式2循环体表达式1表达式3关键字初始表达式循环控制逻辑表达式循环后置表达式LOGO例4.1 for循环实现评委打分1.确定循环体:cinscore;/score代表评委的打分sum+=score;/sum代表所有评委的总分,求和前应清零2.确定循环控制条件 n个评委打分,循环n次3.写成for循环 for(int i=1;iscore;sum+=score;LOGO循环执行过程对该例中的各个语句按下面的顺序编号,我们来分析一下循环执行的过程表达式1:i=1 表达式2:ix;sum+=x;循环体后的语句:avg=sum/n;LOGO循环条件 循环体 truefalse注意:1)循环开始前对循环条件进行初始化;2)在循环体语句中要包含修改循环条件的语句,否则循环将不能终止而陷入死循环。4.1.2 while语句语句while语句也称为当循环语句也称为当循环,语句格语句格式为:式为:while(表达式表达式)循环体语句;循环体语句;LOGO关键代码i=1;while(ix;sum+=x;i+;LOGOfor循环与while循环对比for(i=1;ix;sum+=x;i=1;while(ix;sum+=x;i+;LOGO循环条件 循环体 truefalse直到型循环 do-while 语句语句 do-while语句称为直到循环,格式为:语句称为直到循环,格式为:do 循环体语句循环体语句 while(表达式表达式);LOGO关键代码i=1;do cinx;sum+=x;i+;while(ix;sum+=x;i+;while(i=n);i=1;sum=0;while(ix;sum+=x;i+;LOGO 4.1.3 do-while 语句语句 ndo/while语句和语句和while语句的区别:语句的区别:ndo/while语句至少执行一次循环体后再判断循环条件语句至少执行一次循环体后再判断循环条件是否满足;是否满足;nwhile语句先判断条件是否满足,然后才执行循环体。语句先判断条件是否满足,然后才执行循环体。可能一次也不执行。可能一次也不执行。n多数情况下可以互相替代。多数情况下可以互相替代。LOGOwhile循环与 do-while循环对比i=1;s=0;do s+=i;while(i=10);cout“s=”=10)s+=i;cout“s=”s;输出s=0输出s=1LOGO4.1.4三种语句的共性和区别共性共性:可以相互替换,都能实现循环控制:可以相互替换,都能实现循环控制区别区别:针对不同的问题,可以选择不同的结构:针对不同的问题,可以选择不同的结构1)如果如果循环次数已知循环次数已知或者能用表达式确定,则选择或者能用表达式确定,则选择for循环循环2)循环循环次数未知次数未知时,一般选择时,一般选择while或者或者do-while循环循环,3)在在有些情况下,有些情况下,循环条件中的变量循环条件中的变量是在是在循环循环体体中中计算计算出出来的,适合用来的,适合用do-while循环。循环。LOGOfor while do-while对比for(i=1;ix;sum+=x;i=1;while(ix;sum+=x;i+;i=1;sum=0;do cinx;sum+=x;i+;while(i=n);LOGO思考sum=1+2+3+ns=0;for(i=1;ix;sum+=x;sum=1+3+5+2*n-1sum+=i;换sum+=2*i-1;sum=1+1/2+1/3+1/nsum=1-1/2-1/3+1/4+1/5+1/nsum+=1.0/i;if(i%2=1)sum+=1.0/i;elsesum+=-1.0/i;LOGO举例例4.4设小张现在有10万元储蓄,将这笔钱存在银行,年利率为5%,并且利滚利,问:多少年后,小张的积蓄能够翻一番?分析:只知道最终要达到20万元,却不知道要循环多少次适合while循环i=0;m=10;while(m20)m=m*1.05;i+;思考:用for循环如何写?m=10;for(i=0;m20;i+)m=m*1.05;LOGO用迭代法求用迭代法求a的平方根近似值。求平方根的迭的平方根近似值。求平方根的迭代公式为代公式为:迭代法求解:a是已知正数,x 0是迭代初值,给x 0一个值,假定 x 0=a/2;则用迭代公式依次计算:x1=(x0+a/x0)/2;x2=(x1+a/x1)/2;xk+1=(xk+a/xk)/2;当|xk+1 xk|0)及较小正数及较小正数delta(也可用常变量也可用常变量);2、x 0=a/2;用迭代公式算用迭代公式算 x1=(x0+a/x0)/2;3、while(|x1 x0|=delta)时重复时重复 x0=x1;x1=(x0+a/x0)/2;/求求xk+1时只需要知道时只需要知道xk的值,所以只需的值,所以只需2个变量个变量4、取、取x1的值为的值为a的平方根近似值,输出。的平方根近似值,输出。迭代法求迭代法求a的平方根算法的平方根算法LOGO关键代码x1=a/2;do x0=x1;x1=(x0+a/x0)/2;while(fabs(x1-x0)=1e-5);cout a的平方根为:x1endl;LOGO4.1.5多重循环n在以上三种语句实现的循环结构中,循环体语句是一条语句或者是用 括起来的复合语句。n如果把一个循环结构看成一个整体,它相当于一条语句,也可以出现在for,while或者do-while之下作为循环体语句,这样就构成了多重循环。LOGO例4.6打印九九乘法表,格式如下:LOGO算法:算法:1、输出表头,用一个循环语句即可;、输出表头,用一个循环语句即可;2、输出表体:、输出表体:for(i=1;i10;i+)couti;/输出行号输出行号 输出第输出第i行数据;行数据;/A coutendl;/准备输出下一行准备输出下一行 3、A行细化:行细化:for(j=1;j=i;j+)coutsetw(4)i*j;打印九九乘法表算法打印九九乘法表算法LOGO关键代码coutsetw(3)*setw(4);for(i=1;i10;i+)coutsetw(4)i;coutendl;for(i=1;i10;i+)coutsetw(3)isetw(4);/(1)for(j=1;j=i;j+)coutsetw(4)i*j;/(2)coutendl;/(3)LOGO举例例4.7用*字符打印边长为n的菱形。当n=4时,如下图所示:分析:1)当边长为n时共需要打印多少行2)每一行第一个*前有多少个空格,与n和行数是什么关系?3)每行的*号数是多少?与行数是什么关系?当边长为4时共需要打印7行或者当边长为4时共需要打印4行加3行LOGO举例每一行第一个*前有多少个空格,与n和行数是什么关系?每行的*号数是多少?与行数是什么关系?for(i=1;i=n;i+)/i从1到n代表输出上三角n行 输出n-i个空格 输出i个星号,并且每个星号后带一个空格 换行LOGO核心代码核心代码for(i=1;i=n;i+)/i循环n次,代表n行 for(j=1;j=n-i;j+)/j循环n-i次,输出n-i个空格cout ;for(j=1;j=i;j+)/j循环i次,输出i个星号及空格cout*;/每个星号后带一个空格 coutendl;/换行cout*=1;i-for(i=n;i=1;i-)/i循环n次,代表n行 for(j=1;j=n-i;j+)/j循环n-i次,输出n-i个空格cout ;for(j=1;j=i;j+)/j循环i次,输出i个星号及空格cout*;/每个星号后带一个空格 coutendl;/换行LOGO4.2 break&continuenbreak语句语句格式:格式:break;n无条件地结束无条件地结束switch语句,或循环语句,转向执行语句,或循环语句,转向执行语句块的后续语句语句块的后续语句ncontinue语句语句 格式:格式:continue;n用于循环体中,终止当前一次循环用于循环体中,终止当前一次循环LOGOwhile (E1)语句 1 if (E2)break ;语句 2while(E1)语句 1 if(E2)continue;语句 2 语句2 E 1 语句1 E2 下一语句 break 语句2 E 1 语句1 E 2 下一语句 continuebreak 与与 continue 语句比较语句比较LOGO4.2.1 break语句【例4.8】输入一个数,判断这个数是否为素数。素数的定义:只能被1和它本身整除的数。对于某个数m,在2至m-1之间,只要有一个数能被m整除,就能说明m不是素数,只有所有的数都不能整除,才能说明m是素数。算法:1)设置一个标志变量flag,初值为02)for(i=2;im;i+)判断m能否被i整除,能整除则:置标志变量flag=1;已经知道m不是素数,提前退出循环3)如果标志变量的值为1,则m不是素数,否则是素数。整除:m%i=0 LOGO核心代码核心代码flag=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不是素数n break结束:i=nn=sqrt(m);for(i=2;in)/在i从2变到m-1中,m%i=0始终不成立coutm是素数endl;else coutm不是素数endl;n=sqrt(m)LOGO4.2.2 continue语句 for(i=1;i0|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;LOGO4.3常用算法应用举例n4.3.1 穷举法n4.3.2迭代法n4.3.3递推法LOGO4.3.1 穷举法穷举法n穷举法基本思想是,在有限范围内列举所有可能的结果,找出其中符合要求的解。n穷举法适合求解的问题是:可能的答案是有限个且答案是可知的,但又难以用解析法描述。这种算法通常用循环结构来完成。LOGO设鸡翁、母、雏分别为设鸡翁、母、雏分别为i i,j j,k k,根据题意可得:,根据题意可得:i i*5+j5+j*3+k/3=100;3+k/3=100;i+j+ki+j+k=100;=100;两个方程无法解出三个变量,只能将各种可能两个方程无法解出三个变量,只能将各种可能的取值代入,其中能满足两个方程的就是所需的取值代入,其中能满足两个方程的就是所需的解,因此这是枚举算法(也叫穷举法)的应的解,因此这是枚举算法(也叫穷举法)的应用。用。i i、j j、k k可能的取值有哪些?分析可知,百钱最可能的取值有哪些?分析可知,百钱最多可买鸡翁多可买鸡翁2020,鸡母,鸡母3333,鸡雏,鸡雏300300。【例4.10】中国古代数学史上著名的“百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?LOGO这个算法使用三重循环,执行时间函数是立方阶,这个算法使用三重循环,执行时间函数是立方阶,循环体将执行循环体将执行2020*3333*300=198000300=198000次。次。我们希望在算法上改进一下,如能减少一重循环,我们希望在算法上改进一下,如能减少一重循环,将大大缩短运行时间。将大大缩短运行时间。for(i=0;i=20;i+)for(j=0;j=33;j+)for(k=0;k=300;k+)if(i+j+k=100)&(5*i+3*j+k/3=100)coutijk;百百算法算法买百鸡算法买百鸡算法:LOGOn实际上,当实际上,当i i、j j确定时,确定时,k k就可由题目要求确定为就可由题目要求确定为100-i-j100-i-j,因此实际上只要用,因此实际上只要用i i、j j去测试,用钱数检去测试,用钱数检测就可以了。循环体将执行测就可以了。循环体将执行:2020*33=66033=660次。次。n算法改进为:算法改进为:for(i i=0;=0;i i=20;20;i i+)+)for(j=0;(j=0;j=j=33;j+)33;j+)if(5(5*i+3i+3*j+(100-i-j)/3=100)j+(100-i-j)/3=100)coutcouti ijj100-i-j;100-i-j;算法优化百钱买百鸡百钱买百鸡 k=100-i-j;if(5*i+3*j+k/3=100)&(k%3=0)coutij0.0001输出sinxTFif(i%2=1)sinx+=a/b;elsesinx+=-a/b;a=1;for(j=1;j=2*i;j+)a=a*x;b=1;for(j=1;i0.0001输出sinxTFif(i%2=1)sinx+=item;elsesinx+=-item;item=item*x*x/(2*i)/(2*i+1)LOGO递推法n递推算法是通过问题的一个或多个已知解,用同递推算法是通过问题的一个或多个已知解,用同样的方法逐个推算出其他解,如数列问题,近似样的方法逐个推算出其他解,如数列问题,近似计算问题等,通常也要借助于循环结构完成计算问题等,通常也要借助于循环结构完成。LOGO【例4.13】用欧基里德算法(也称辗转法)求两个整数的最大公约数。用num1除以num2,求出余数resd,如果resd=0,则当前num2就是最大公约数,如果resd!=0,令num1=num2,num2=resd,重复以上过程,直到resd=0为止。算法:1)输入num1、num22)循环判断num1能否被num2整除(resd=num1%num2)能整除则,num2就是最大公约数,结束循环;否则num1=num2,num2=resd,重复2)3)输出最大公约数LOGO关键代码关键代码for(;)resd=num1%num2;if(resd=0)break;num1=num2;num2=resd;do resd=num1%num2;num1=num2;num2=resd;while(resd!=0);resd=num1%num2;while(resd!=0)num1=num2;num2=resd;resd=num1%num2;哪个变量是求出的最大公约数?for(;)是什么意思?LOGO文件输入输出文件输入输出输入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.定义输入文件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.5综合举例n4.5.1改进的评委打分n4.5.2龟兔赛跑n4.5.3猜数游戏LOGO4.5.1改进的评委打分(去掉一个最高分和一个最低分)难点:如何求最低分和最高分?求最低分方法:先假设第一次输入的评分是最小的,并将其值保存在min中,然后拿后面的评分与min比较,有更小的就替换掉原来的min。cinn;/输入评委数量cinx;/输入第一个评委的打分min=x;/假设第一个评委的评分是最小for(i=2;ix;/循环输入其它评委的打分 if(xmax)max=x;LOGO龟兔赛跑 乌龟乌龟与兔子进行赛跑,跑场是一个矩形跑道,跑道边可以进行休息。与兔子进行赛跑,跑场是一个矩形跑道,跑道边可以进行休息。乌龟乌龟每分钟前进每分钟前进3 3米,兔子每分钟前进米,兔子每分钟前进9 9米;兔子米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是每龟,于是每跑跑1010分钟分钟回头看一下乌龟,若发现自己超过乌龟,就在路边回头看一下乌龟,若发现自己超过乌龟,就在路边休息休息,每次休息每次休息3030分钟分钟,否则继续,否则继续跑跑1010分钟分钟;而乌龟非常努力,一直跑而从不休息。;而乌龟非常努力,一直跑而从不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问假定乌龟与兔子在同一起点同一时刻开始起跑,请问t t分钟后乌龟和兔子谁跑得分钟后乌龟和兔子谁跑得快,即最后的比赛结果是谁胜或者平局快,即最后的比赛结果是谁胜或者平局。(1 1)循环循环控制控制 以以时间(分)为参考来循环累计兔子与乌龟前进的路程值时间(分)为参考来循环累计兔子与乌龟前进的路程值,每分钟,每分钟循环循环1 1次次,计算计算兔子与乌龟行进的总路程兔子与乌龟行进的总路程。(2 2)乌龟乌龟 整个整个规定规定t t分钟内,每过分钟内,每过1 1分钟,乌龟路程都要累加分钟,乌龟路程都要累加3 3米米(3 3)兔子)兔子 如果如果兔子在兔子在休息休息,每分钟增加,每分钟增加0 0米,若是在米,若是在前进前进,每分钟增加,每分钟增加9 9米。米。LOGO龟兔赛跑分支判断分支判断 包括包括对兔子状态的判断与对兔子和乌龟的总路程大小的判断。对兔子状态的判断与对兔子和乌龟的总路程大小的判断。判断判断兔子行进兔子行进是否已经到是否已经到1010分钟分钟,如果已经到,如果已经到1010分钟,比较兔子与乌龟总分钟,比较兔子与乌龟总路程,若兔子路程大于乌龟路程,则路程,若兔子路程大于乌龟路程,则改变兔子状态为改变兔子状态为休息休息 判断判断兔子休息兔子休息是否已经达到是否已经达到3030分钟分钟,如果已经达到,如果已经达到3030分钟,则改变兔子状分钟,则改变兔子状态为态为前进前进。定义定义一个整型变量一个整型变量stationstation表示兔子的表示兔子的状态状态定义一个休息时间定义一个休息时间sleepsleep定义行进定义行进时间时间runrun
展开阅读全文