42第5章循环结构程序设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第5章循环结构程序设计主要内容5.1概述5.2while语句5.3do-while5.4for语句5.5break语句和continue语句5.6循环的嵌套5.7程序举例所谓循环控制,就是如何实现循环结构的控制问题。有3种方法:用while语句用do-while语句用for语句5.1概述while语句是专门用于实现循环控制的语句之一。其一般形式为:while(表达式)语句含义:当表达式的值为非0时,执行循环体语句,否则执行后续语句。表达循环条件的表达式循环体语句语句关键字5.2while语句执行过程是先判断后执行:while(表达式)语句表达式循环体语句0非0(成立)5.2while语句例:用while语句实现计算s=1+2+3+4+5的部分算法:#includestdio.hintmain(){inti=1,s=0;while(i=5){s=s+i;}printf(“\n%d”,s);return0;}注意与if语句的区别。循环体中要有使循环条件趋于成立的条件。i≤5?s=0i=1s=s+ii=i+1YN5.2while语句si01123364105156i++;do-while语句主要用于实现直到型循环。其一般形式为:do循环体语句while(表达式)执行过程是先执行后判断:非0(真)0(假)表达式循环体语句;5.3do-while语句例:用do-while语句实现计算s=1+2+3+4+5的部分算法:#includestdio.hintmain(){inti=1,s=0;dos+=i++;while(i=5);printf(“\n%d”,s);return0;}真s=0i=1i≤5?s=s+ii=i+1假5.3do-while语句s=s+i;i++;si10123364105156例:while和do-while循环语句的比较:5.3do-while语句#includestdio.hintmain(){inti,s=0;scanf(“%d”,&i);dos+=i++;while(i=5);printf(“\n%d”,s);return0;}#includestdio.hintmain(){inti,s=0;scanf(“%d”,&i);while(i=5)s+=i++;printf(“\n%d”,s);return0;}当输入i的值小于或等于5时,二者得到结果如何?当输入i的值大于5时,二者得到结果又如何?for语句是一种使用最为灵活,并且是用得最多的循环控制语句,其一般形式为:for(表达式1;表达式2;表达式3)循环体语句大体含义:对于()的情况执行循环体内容。假表达式2求解表达式1循环体语句求解表达式3真5.4for语句例:用for语句实现计算s=1+2+3+4+5:s=0;for(i=1;i=5;i++)s+=i;标准形式表达式1表达式2表达式3循环体语句可以理解为:循环变量i从初值1开始到终值5结束,步长为1,重复执行循环体5次。5.4for语句si01123364105156for语句的常见变化:s=0;i=1;for(;i=5;i++)s+=i;省略表达式1省略表达式3省略表达式1和35.4for语句s=0;for(i=1;i=5;)s+=i++;s=0;i=1;for(;i=5;)s+=i++;s=0;i=1;for(;;){s+=i++;if(i5)break;}省略表达式1,2,3表达式2是任意表达式5.4for语句s=5;i=5;for(;--i;)s+=i;s=0;for(i=1,j=5;ij;i++,j--)s+=i+j;if(i==j)s=s+i;用逗号表达式5.4for语句在程序设计中不要过分追求for语句的多变性。ij51s0624123315#includestdio.hintmain(){inti,n;floats=1;scanf(“%d”,&n);for(i=1;i=n;i++)s*=i;printf(“\ns=%f”,s);return0;}注意s的初值。注意当n较大时的情况。求和与连乘都是最常用的算法,要熟练掌握。例:求n!,n!=1*2*3…(n-1)*n。5.4for语句#includestdio.hintmain(){inti,s=0;printf(“\n%d”,s);return0;}for(i=1;i=100;i++)s+=i;for(i=1;i=100;i++)if(i%3==0)s+=i;for(i=3;i=100;i+=3)s+=i;for(i=3;i=100;i+=3)if(i%7!=0)s+=i;例:求自然数1-100中能被3整除的数之和。i的作用?求能被3整除但不被7整除的数之和?5.4for语句#includestdio.hintmain(){inti,a,max;scanf(“%d”,&a);max=a;for(i=1;i=99;i++){scanf(“%d”,&a);if(amax)max=a;}printf(“\nmax=%d”,max);return0;}例:求任意100个整数中的最大值。循环体中没有引用循环变量。i的作用?5.4for语句break语句一般形式:break;只能用于switch和循环语句中。例:switch((int)score/10){case10:case9:printf(“A”);break;case8:printf(“B”);break;case7:printf(“C”);break;case6:printf(“D”);break;default:printf(“E”);}跳出switch语句5.5break语句与continue语句例:#includestdio.hintmain(){intsum=0,i;for(i=1;i=10;i++){if(sum5)break;sum=sum+i;}printf(“%d”,sum);return0;}#includestdio.hintmain(){intsum=0,i,j;for(i=1;i=10;i++){for(j=1;j=10;j++){if(sum5)break;sum=sum+i+j;}}printf(“%d”,sum);return0;}跳出本层循环5.5break语句与continue语句isum0112336j511220392310一般形式:continue;只能用循环语句中。#includestdio.hintmain(){intsum=0,i;for(i=1;i=10;i++){if(sum5)continue;sum=sum+i;}printf(“%d”,sum);return0;}#includestdio.hintmain(){intsum=0,i,j;for(i=1;i=10;i++){for(j=1;j=10;j++){if(sum5)continue;sum=sum+i+j;}}printf(“%d”,sum);return0;}continue语句5.5break语句与continue语句跳出本次循环isum01123364510j011225394510212310310循环体内又包含另一个完整的循环结构(多重循环)。for(i=1;i=10;i++){for(j=1;j=20;j++){s+=i+j;//语句①}}外重循环内重循环要掌握多重循环执行的全过程。5.6循环的嵌套i:j:①执行次数:1120223……20123……20123……20…………102020……执行200次以上多重循环结构可以简写为:for(i=1;i=10;i++)for(j=1;j=20;j++)s+=i+j;5.6循环的嵌套#includestdio.hintmain(){inti,j;for(i=1;i=100;i++)for(j=1;j=100;j++)if(i*j==100)printf(“\n%d,%d”,i,j);return0;}例:找出行号乘以列号等于100的座位。5.6循环的嵌套若考虑用方程组:设公鸡x只,母鸡y只,小鸡z只则x+y+z=1005x+3y+z/3=100是一多解问题。5.7程序举例例:百钱买百鸡问题。给定100块钱,要求正好买100只鸡,已知公鸡5元/只,母鸡3元/只,小鸡1元/3只,问公鸡、母鸡和小鸡应各买多少只?例:百钱买百鸡问题。给定100块钱,要求正好买100只鸡,已知公鸡5元/只,母鸡3元/只,小鸡1元/3只,问公鸡、母鸡和小鸡应各买多少只?测试法求解的程序设计有两个要点:⑴通过循环列出所有可能的解。⑵对所有列出的可能的解进行条件测试。5.7程序举例通过循环列出公鸡、母鸡和小鸡可能的只数,再对可能的只数进行条件为的测试。x+y+z=1005x+3y+z/3=100用测试法求解的程序:#includestdio.hintmain(){intx,y,z;for(x=0;x=100;x++)for(y=0;y=100;y++)for(z=0;z=100;z++)if(x+y+z==100&&5*x+3*y+z/3.0==100)printf(“\n%d,%d,%d”,x,y,z);return0;}5.7程序举例程序可进一步简化为:#includestdio.hintmain(){intx,y,z;for(x=0;x=20;x++)for(y=0;y=33;y++){z=100-x-y;if(5*x+3*y+z/3.0==100)printf(“\n%d,%d,%d”,x,y,z);}return0;}5.7程序举例例:判断一个数m是否为素数。分析:只能被1和自己整除的数为素数。通过循环列出所有和m相除的数。#includestdio.hintmain(){inti,m;scanf(“%d”,&m);for(i=2;im;i++)if(m%i==0)break;if(i==m)printf(“\n%disaprime”,m);elseprintf(“\n%disnotaprime”,m);return0;}用测试法求解5.7程序举例mi4522345例:判断100---200间的全部素数。分析:通过循环列出所有要判断是否是素数的数。#includestdio.hintmain(){inti,m;for(m=100;m=200;m++){for(i=2;im;i++)if(m%i==0)break;if(i==m)printf(“\n%disaprime”,m);elseprintf(“\n%disnotaprime”,m);}return0;}可用测试法求解5.7程序举例例:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字的立方和等于该数本身。如:153是一水仙花数,因为153=13+53+33。5.7程序举例#includestdio.hintmain(){inti,j,k,n;for(n=100;n=999;n++){i=?j=?k=?if(i*i*i+j*j*j+k*k*k==n)printf(“\n%d”,n);}return0;}通过循环列出所有3位数,然后对3位数进行条件判断。i=n/100;k=n%10;j=n/10%10;5.7程序举例#includestdio.hintmain(){inti,j,k,n;for(i=1;i=9;i++)for(j=0;j=9;j++)for(k=0;k=9;k++){n=i*100+j*10+k;if(i*i*i+j*j*j+k*k*k==n)printf(“\n%d”,n);}return0;}通过循环列出百位,十位,个位的所有可能的解,然后对解进行条件判断。5.7程序举例求多解的问题考虑用测试法例:求S=∑i!=1!+2!+3!+4!+…+19!+20!20i=15.7程序举

1 / 40
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功