《循环控制结构》PPT课件

《循环控制结构》PPT课件

ID:39513839

大小:915.10 KB

页数:94页

时间:2019-07-04

上传者:U-145848
《循环控制结构》PPT课件_第1页
《循环控制结构》PPT课件_第2页
《循环控制结构》PPT课件_第3页
《循环控制结构》PPT课件_第4页
《循环控制结构》PPT课件_第5页
资源描述:

《《循环控制结构》PPT课件》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

第6章循环控制 循环是计算机解题的一个重要特征。由于计算机运算速度快,最适宜做重复性的工作。当我们在进行程序设计时,总是要把复杂的不易理解的求解过程转换为容易理解的操作的多次重复,从而降低了问题的复杂度,同时也减少程序书写及输入的工作量。 sum=1+2+3+4+……+100输出如下:输出所有2~10000的素数.************************ 循环结构程序设计循环是在循环条件为真时计算机反复执行的一组指令(循环体)。循环控制通常有两种方式:◆计数控制 事先能够准确知道循环次数时用之用专门的循环变量来计算循环的次数,循环变量的值在每次执行完循环体各语句后递增,达到预定循环次数时则终止循环,继续执行循环结构后的语句。◆标记控制 事先不知道准确的循环次数时用之由专门的标记变量控制循环是否继续进行。当标记变量的值达到指定的标记值时,循环终止,继续执行循环结构后的语句。 实现循环结构的语句do/while实现循环结构的语句if/gotobreakwhilefor(……)continue C语言中可用以下语句构成循环:if…gotowhiledo…whilefor其中if…goto是通过编程技巧(if语句和goto语句组合)构成循环功能。而且goto语句将影响程序流程的模块化,使程序可读性变差,所以结构化程序设计主张限制goto语句的使用。其他三种语句是C语言提供的循环结构专用语句。 6.1if/goto语句语句功能:语句格式:语句标号:语句;……if(表达式)goto语句标号;……当(表达式)的值为非零时则重复执行“语句标号”后面的语句。标识程序中某个语句的位置 EXAMPLE[6-1]:请用C语言实现右侧程序流程图所描述的算法:即:sum=1+2+3+4+……+100设:i计数器:i=i+1sum为累加器:sum=sum+iBeginsum=0i=1sum=sum+i输出sumEndi=i+1Fi<=100T Beginsum=0i=1sum=sum+i输出sumEndi=i+1Fi<=100Tmain(){}intsum=0,i=1;sum=sum+i;sum+=i;i=i+1;if(i<=100)printf(“%d ”,sum);gotoaa;aa:i++;语句标号:语句;……if(表达式)goto语句标号; EXERCISES[6-1]:从键盘输入100个有符号整数,请分别统计其中正整数和负整数的个数。 Begini=0p=0n=0i++输出pnEndp++FX>0T输入xn++i<100F111、设计算法X<0 2、实现算法main(){}Intp,n,i,x;scanf(“%d”,&x);i++;if(x>0)printf(“%d,%d ”,p,n);gotobb;bb:p++;p=n=i=0;elseIf(x<0)n++;if(i<100) 5.2while语句语句功能:语句格式:while(表达式){statements;}当表达式的值为非零时,重复statements。关系、逻辑赋值表达式bodyofloop 请用while实现sum=1+2+3+4+……+100main(){}intsum=0,i=1;{sum+=i;While(i<=100)printf(“%d ”,sum);i++;}while(表达式){……}Beginsum=0i=1sum=sum+i输出sumEndi=i+1Fi<=100T main(){intn=0;while(n<3){printf(“%d,”,n);n++;}printf(“%d ”,n);}0,main(){intn=3;while(n)printf(“%d,”,n--);n=-3;printf(“ ”);while(n)printf(“%d,”,n++);}1,2,33,2,1,-3,-2,-1,EXAMPLE[6-2]:n0123210-3-2-10 main(){inta=1,b=2,c=2,t=0;while(a0)&&(y>5));printf(“y=%dx=%d ”,y,x);}请程序的运行结果及循环次数HOMEWORK[6-4]: while语句和用do-while语句的比较:在一般情况下,用while语句和用do-while语句处理同一问题时,若二者的循环体部分是一样的,它们的结果也一样。但是如果while后面的表达式一开始就为假(0值)时,两种循环的结果是不同的。 例while和do-while循环的比较(1)#include(2)#include voidmain()voidmain() {{intsum=0,i;intsum=0,i;scanf(“%d″,&i);scanf(”%d″,&i); while(i<=10)do {{ sum=sum+i;sum=sum+i; i++;i++; }}while(i<=10);printf(“sum=%d ”,sum);printf(“sum=%d ”,sum); }}运行结果:1↙sum=55再运行一次:11↙sum=0运行结果:1↙sum=55再运行一次:11↙sum=11说明:(1)当while后面的表达式的第一次的值为“真”时,两种循环得到的结果相同。否则,二者结果不相同。 语句功能:6.4for语句语句格式:for(表达式1;表达式2;表达式3){statements;}当表达式2的值为非零时,重复执行statements。 for(表达式1;表达式2;表达式3){statements;}表达式1—循环初始表达式,用于进入循环体前为循环变量赋初值由算术、赋值、逻辑和逗号表达式构成。表达式2—循环控制表达式,用于控制循环体语句的执行次数由关系表达式或逻辑表达式构成。表达式3—修改循环变量表达式,即每循环一次使得表达式1的值就要变化一次。由算术、赋值、逻辑和逗号表达式构成。 main(){intn;for(n=1;n<=10;n++)printf(“%d,”,n);}1,2,3,4,5,6,7,8,9,10for(表达式1;表达式2;表达式3){statements;}EXAMPLE[6-4]: main(){intn,i=100;for(n=1;n<=5;n++)printf(“%d,”,i);}100,100,100,100,100main(){intn,i=100;for(n=5;n>0;n--)printf(“%d,”,i);}EXAMPLE[6-5]: main(){intx,y;for(x=0,y=0;x+y<=50;x++,y++){printf(“%3d”,x+y);if(x%5==0)printf(“ ”);}}EXERCISES[6-8]:写出右侧程序段的运行结果 main(){intsum,i;for(sum=0,i=1;i<=100;i++)sum+=i;printf(“sum=%d ”,sum);}main(){intsum=0,i=1;do{sum+=i;i++;}while(i<=100);printf(“sum=%d ”,sum);}main(){intsum=0,i=1;while(i<=100){sum+=i;i++;}printf(“sum=%d ”,sum);}main(){intsum=0,i=1;label:if(i<=100){sum+=i;i++;gotolabel;}printf(“sum=%d ”,sum);}1+2+3+4+5+……+100 说明:for语句的一般形式中的“表达式1”可以省略,此时应在for语句之前给循环变量赋初值。注意省略表达式1时,其后的分号不能省略。如:for(;i<=100;i++)sum=sum+i;执行时,跳过“求解表达式1”这一步,其他不变。 如果表达式2省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式2始终为真。例如:for(i=1;;i++)sum=sum+i;它相当于:i=1;while(1){sum=sum+1;i++;}图5.7求解表达式1语句求解表达式3 (3)表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。如:for(i=1;i<=100;){sum=sum+i;i++;}在上面的for语句中只有表达式1和表达式2,而没有表达式3。i++的操作不放在for语句的表达式3的位置处,而作为循环体的一部分,效果是一样的,都能使循环正常结束。 (4)可以省略表达式1和表达式3,只有表达式2,即只给循环条件如:for(;i<=100;)while(i<=100){sum=sum+i;{sum=sum+i;i++;}相当于i++;}在这种情况下,完全等同于while语句。可见for语句比while语句功能强,除了可以给出循环条件外,还可以赋初值,使循环变量自动增值等。 (5)3个表达式都可省略,如:for(;;)语句相当于while(1)语句即不设初值,不判断条件(认为表达式2为真值),循环变量不增值。无终止地执行循环体。 (6)表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。如:for(sum=0;i<=100;i++)sum=sum+i;表达式3也可以是与循环控制无关的任意表达式。 表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。如:for(sum=0,i=1;i<=100;i++)sum=sum+i;或for(i=0,j=100;i<=j;i++,j--)k=i+j;表达式1和表达式3都是逗号表达式,即同时设两个初值,使两个变量增值。图5.8i=0j=100i≤jk=i+ji=i+1j=j-1真假 在逗号表达式内按自左至右顺序求解,整个逗号表达式的值为其中最右边的表达式的值。如:for(i=1;i<=100;i++,i++)sum=sum+i;相当于for(i=1;i<=100;i=i+2)sum=sum+i; (7)表达式2一般是关系表达式(如i<=100)或逻辑表达式(如a=1e-6;i++){e=e+x;f=f*i;x=1.0/f;}printf(“e=%f”,e);} 例5.10猴子第一天摘下若干桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃前一天剩下的一半零一个。到第十天想再吃时,就只剩一个桃子了,求第一天共摘多少桃子。采用逆算法,若某一天剩余的桃子是x,则前一天的桃子数应是2(x+1)voidmain(){intx=1,i;for(i=9;i>=1;i--)x=2*(x+1);printf(“%d”,x);} 程序举例例1求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)(n≥3)算法如图所示:图6-13f1=1,f2=1fori=1to20输出f1、f2f1=f1+f2f2=f2+f1 例1求Fibonacci数列前40个数。#include voidmain() { longintf1,f2;inti;f1=1;f2=1;for(i=1;i<=20;i++) { printf(“%12ld%12ld”,f1,f2); if(i%2==0)printf(“ ”); f1=f1+f2;f2=f2+f1;} }运行结果:11235813213455891442333776109871597258441816765109461771128657463687502512139319641831781151422983204013462692178309352457857022887922746514930352241578173908816963245986102334155 请输出26个小写的英文字母以及每个字母所对应的ASCII码值。HOMEWORK[6-5]: 设某学校新生入学时,需报选体育课选修科目。其科目包括有:篮球、排球、体操、乒乓球、网球。请为某班级(30人)统计报选各科目的人数。请设计报选体育科目统计程序HOMEWORK[6-6]: 6.5嵌套循环嵌套循环是循环中的循环。嵌套循环的深度可达两层、三层、四层,甚至更多。实际层数可根据应用程序的需要而定,但超过三层的嵌套循环不为多见。 ……for(i=1;i<=9;i++){for(j=1;j<=9;j++)……}……内层循环外层循环双重循环 下面几种都是合法的形式:(1)while()(2)do(3)for(;;){…{…{while()dofor(;;){…}{…{…}}while();}}}while();(4)while()(5)for(;;)(6)do{…{…{…do{…}while()for(;;)while();{…}{…}……}}}while(); 请设计求解下列问题的C语言程序:s=1!+2!+3!+……+20!1!=12!=1*23!=1*2*34!=1*2*3*45!=1*2*3*4*5……20!=1*2*3*4*5……*20i1-11-i1-20EXAMPLE[6-6]:1-21-31-41-51-20jt=t*j s=1!+2!+3!+……+20!s=0,ti(1~20)t=1j(1~i)输出st*=js+=t main(){inti,j,t;longs=0;}for()i=1;i<=20;i++for()j=1;j<=i;j++t=t*j;s+=t;{}printf(“%l ”,s);s=1!+2!+3!+……+20!i(1-20)j(1-i)t=1; 请设计按下列格式打印九九表程序。1*1=11*2=21*3=3……1*9=92*1=22*2=42*3=6……2*9=18……9*1=99*2=189*3=27……9*9=81EXAMPLE[6-7]:abp=a*b a,b,pa(1~9)b(1~9)输出a*b=p1*1=11*2=21*3=3……1*9=92*1=12*2=42*3=6……2*9=18…… main(){inta,b,p;}p=a*bfor()a=1;a<=9;a++for()b=1;b<=9;b++printf();p=a*b;“%da,b,p*%d=%d”,{}{}printf(“ ”);1*1=11*2=21*3=3……1*9=92*1=12*2=42*3=6……2*9=18…… 双重循环特点当外层循环变量中的值变换一次时,内层循环变量中的值将变换若干次。 若i,j已定义为int类型,则以下程序段中内循环体总的执行次数是:for(i=5;i;i--)for(j=0;j<4;j++){……}A)20B)24C)25D)30EXERCISES[6-9]: 请打印下列图形:ABCDEFABCDEFABCDEFABCDEFABCDEFABCDEFTEST[6-4]: #defineROWS6#defineCHARS6main(){introw;charch;for(row=0;row100)break;printf(“r=%f,area=%f ”,r,area);}程序的作用是计算r=1到r=10时的圆面积,直到面积area大于100为止。从上面的for循环可以看到:当area>100时,执行break语句,提前结束循环,即不再继续执行其余的几次循环。 break主要是用于选择结构和循环结构中。break语句main(){inti,s=0;for(i=0;i<100;i++){scanf(“%d ”,&x);if(x<=0)break;s+=x;}printf(“s=%d ”,s);} EXERCISES[6-10]:main(){inti,m=0,n=0,k=0;for(i=9;i<=11;i++)switch(i/10){case0:m++;n++;break;case10:n++;break;default:k++;n++;}printf(“%d,%d,%d ”,m,n,k);}m0n011k02123 continue该语句是专用于循环结构中改变某一次循环流程的语句。其作用是:使程序流程提前结束本次循环从而开始下一次循环。continue语句 main(){intk=4,n=0;for(;n100)break;}C)k=32764;D)S=32764;dowhile((S++%2)||(S%2)){k++;k++;S++;}while(k>0);EXERCISES[6-13]: C)k=32764;do{k++;printf(“k=%d ”,k);k++;printf(“k=%d ”,k);}while(k>0);int-32768~32767215214213212211210292827262524232221201个字节1个字节 C)k=32764;do{k++;printf(“k=%d ”,k);k++;printf(“k=%d ”,k);}while(k>0);0111111111111101k++,32765k++,3276601111111111111100111111111111111k++,32767k++,-327681000000000000000int-32768~32767-327671000000000000001 continue语句和break语句的区别:continue语句只结束本次循环,而不是终止整个循环的执行。而break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。while(表达式1){…if(表达式2)continue;…}图6-11表达式1表达式2while循环的下一语句假真真假continue while(表达式1){…if(表达式2)break;…}图6-10break假表达式1表达式2while循环的下一语句假真真 main(){intk=0;charc=‘A’;do{switch(c++){case‘A’:k++;break;case‘B’:k--;case‘C’:k+=2;break;case‘D’:k=k%2;continue;case‘E’:k=k*10;break;default:k=k/3;}k++;}while(c<‘G’);printf(“k=%d ”,k);}TEST[6-1]: 例2把100~200之间的能被3整除的数输出。#include voidmain() {intn;for(n=100;n<=200;n++) { if(n%3!=0) continue;printf(“%d”,n);} }说明:当n不能被3整除时,执行continue语句,结束本次循环(即跳过printf函数语句),只有n能被3整除时才执行printf函数。 算法思想:让m被2到除,如果m能被2~之中任何一个整数整除,则提前结束循环,此时i必然小于或等于k(即);如果m不能被2~k(即)之间的任一整数整除,则在完成最后一次循环后,i还要加1,因此i=k+1,然后才终止循环。在循环之后判别i的值是否大于或等于k+1,若是,则表明未曾被2~k之间任一整数整除过,因此输出“是素数”。图6-14读入mk=i=2当i≤km被i整除真假用break结束循环i=i+1i≥k+1真假输出:m“是素数”输出:m“不是素数”例3判断m是否素数。 例3判断m是否素数。#include #include voidmain() {intm,i,k;scanf(“%d”,&m);k=sqrt(m); for(i=2;i<=k;i++) if(m%i==0)break;if(i>k)printf(“%disaprimenumber ”,m); elseprintf(“%disnotaprimenumber ”,m); }运行结果:17↙17isaprimenumber 例4求100~200间的全部素数。#include #include voidmain() {intm,k,i,n=0; for(m=101;m<=200;m=m+2) { k=sqrt(m); for(i=2;i<=k;i++) if(m%i==0)break; if(i>=k+1){printf(“%d”,m);n=n+1;} if(n%10==0)printf(“ ”); }printf(“ ”);}运行结果:101103107109113127131137139149151157163167173179181191193197199 HOMEWORK[6-8]:输出任意两个数之间的基数如:输入为1,25两个数,则对应输出应是1,3,5,7,9,11,13,15,17,19,21,23,25 请输入若干名学生某科的考试成绩然后统计出各分数段考试成绩的人数。如:小于6060-6970-7980-8990-100HOMEWORK[6-9]*: 请使用嵌套循环打印下列图形:FFEFEDFEDCFEDCBFEDCBAHOMEWORK[6-10]: FFEFEDFEDCFEDCBFEDCBAmain(){charch;inti,j;for(i=0;i<=6;i++){for(ch=‘F’,j=0;j=0;i--){forj=1;j<=i;j++)putchar(‘#’);for(j=1;j<=4-i;j++)putchar(‘*’);putchar(‘ ’);}……####*###**##***#****HOMEWORK[6-11]: 请编写打印下列图形的程序*************************HOMEWORK[6-12]*:**************** *****************************************main(){intn1,n2,n3;for(n=1;n1<=5;n1++){for(n2=1;n2<=20-n1;n2++)printf(“”);for(n3=1;n3<=2*n1-1;n3++)printf(“*”);printf(“ ”);}for(n1=4;n1<=1;n1--){for(n2=1;n2<=20-n1;n2++)printf(“”);for(n3=1;n3<=2*n1-1;n3++)printf(“*”);printf(“ ”);} 请编写按下列格式打印九九乘法表的程序1234567892468101214161836912151821242748121620242832365101520253035404561218243036424854714212835424956638162432404856647291827364554637281HOMEWORK[6-13]: 语句标号:语句;……if(表达式)goto语句标号;Summarywhile(表达式){statements;}do{statements;}while(表达式)for(表达式1;表达式2;表达式3){statements;}

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭