C语言程序设计-谭浩强-第6章循环结构程序设计_第1页
C语言程序设计-谭浩强-第6章循环结构程序设计_第2页
C语言程序设计-谭浩强-第6章循环结构程序设计_第3页
C语言程序设计-谭浩强-第6章循环结构程序设计_第4页
C语言程序设计-谭浩强-第6章循环结构程序设计_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1/69,第六章循环控制,6.1概述6.2goto语句以及goto语句构成的循环6.3用while语句实现循环6.4用do-while语句实现循环6.5用for语句实现循环6.6循环的嵌套6.7几种循环的比较6.8break语句和continue语句6.9循环结构程序设计举例,本章重点:循环的基本概念不同形式的循环控制多重循环问题,2/69,6.1概述,问题的提出:输出一行10个星号“*”语句是?printf(*n);输出两行10个星号“*”语句是?printf(*n);printf(*n);输出100行10个星号“*”语句是?printf(*n);用循环结构解决,在C语言中可以用以下语句来实现循环:1.用goto语句和if语句构成循环;2.用while语句;3.用do-while语句;4.用for语句。,3/69,6.1goto语句以及用goto语句构成循环,语句标号用标识符表示,它的定名规则与变量名相同。,4/69,sum=0+1sum=1+2=3sum=3+3=6sum=6+4sum=4950+100=5050,例:用if和goto语句构成循环,求,#includevoidmain()inti,sum=0;i=1;loop1:if(i=100)sum+=i;i+;gotoloop1;printf(%d,sum);,5/69,3.说明,语句标号仅仅对goto语句有效,对其它语句不影响。,同一个程序中,不允许有同名标号。,goto语句通常与if语句配合使用,实现条件转移、构成循环、跳出循环体等功能。,不能用整数作标号。只能出现在goto所在函数内,且唯一。只能加在可执行语句前面。限制使用goto语句。,6/69,程序运行情况为:123asd123asdTheend,7/69,6.2用while语句实现循环,真(非零),循环体,假(零),1.while语句的一般形式:while(表达式)循环体;,2.while语句常称为“当型”循环语句。,8/69,3.说明:,先判断表达式,当条件成立时,则执行循环体,循环体有可能一次也不执行。,表达式同if语句后的表达式一样,可以是任何类型的表达式。,循环体多于一句时,用一对括起。,下列情况,退出while循环条件表达式不成立(为零)循环体内遇break,return,goto无限循环:while(1)循环体,9/69,例:用while循环求,#includevoidmain()inti,sum=0;i=1;while(i=100)sum=sum+i;i+;printf(%d,sum);,10/69,例:显示110的平方,#includevoidmain()inti=1;while(i=Ach=getchar();,不输出“#”,25/69,注意,在if、while语句中,表达式后面都没有分号,而在do-while语句的表达式后面则必须加分号。,do-while和while语句相互替换时,要注意修改循环控制条件。,26/69,6.5用for语句实现循环,1.for的形式:for(初始表达式1;条件表达式2;循环表达式3)循环体;,表达式1:用于循环开始前为循环变量设置初始值。,表达式2:控制循环执行的条件,决定循环次数。,表达式3:循环控制变量修改表达式。,循环体语句:被重复执行的语句。,说明:for语句中表达式1,表达式2,表达式3类型任意,都可省略,但分号;不可省。无限循环:for(;)三个表达式都可以是逗号表达式。for语句可以转换成while结构。,表达式1;while(表达式2)循环体语句;表达式3;,27/69,表达式3,计算表达式1,循环体,零,非零,for的下一条语句,2.执行过程,for(i=1;i=100;i=i+1)printf(“*n”);,输出100行10个星号“*”语句是?,i+,28/69,它相当于以下语句:i=1;while(i=100)sum=sum+i;i+;printf(%d,sum);,表达式1;,while(表达式2),表达式3;,29/69,例:#includevoidmain()inti=0;for(i=0;i10;i+)putchar(a+i);,运行结果:abcdefghij,例:#includevoidmain()inti=0;for(;i10;i+)putchar(a+i);,例:#includevoidmain()inti=0;for(;i10;)putchar(a+(i+);,例:#includevoidmain()inti=0;for(;i10;putchar(a+i),i+);,30/69,voidmain()inti,j,k;for(i=0,j=100;i=j;i+,j-)k=i+j;printf(%d+%d=%dn,i,j,k);,#includevoidmain()charc;for(;(c=getchar()!=n;)printf(%c,c);,#includevoidmain()inti,c;for(i=0;(c=getchar()!=n;i+=3)printf(%c,i+c);,31/69,对for语句,循环体为空语句的一般形式为:for(表达式1;表达式2;表达式3);如:for(sum=0,i=1;i=100;sum+=i,i+);,要在显示器上复制输入的字符,输入的字符为.时,结束循环。输入abcdefg.输出abcdefg.while(putchar(getchar()!=.);,3269,累加器赋初值,参考程序:,voidmain()longintk,s;,s=0;,for(k=1;k=1000;k+)s=s+k;,printf(s=%ld,s);,累加,3369,累乘器赋初值,求n!=123n,参考程序:,voidmain()doubles=1;,intk;,for(k=1;k=100;k+)s=s*k;,printf(s=%lf,s);,累乘,思考,整数连乘结果一定是整数,而本例中结果数值相当大,用long型都无法存放,因此将存放累乘结果的变量s定义为double型。,例2:求累乘积。如:123.100,属于“累乘器”类型问题。,3469,#includemath.hvoidmain()intx,k;scanf(%d,排除法:如果有因子,不再往下判断是否是素数,循环变量终值法,for(k=2;ksqrt(x)printf(%disaprime,x);elseprintf(%disnotaprime,x);,在判断范围内无因子,程序正常终止,有因子,程序非正常终止,例3:判断一个数是否为素数?,一个数x在2,sqrt(x)范围内没有因子,我们就称其为素数(质数),3569,#includemath.hvoidmain()intx,k,f=1;scanf(%d,排除法:如果有因子,不再往下判断是否是素数,for(k=2;k=sqrt(x);k+)if(x%k=0)f=0;break;,if(f=1)printf(%disaprime,x);elseprintf(%disnotaprime,x);,在判断范围内无因子,程序正常终止,有因子,程序非正常终止,标记变量法,36/69,#includestdio.hvoidmain()/*a,b,c代表百位、十位、个位*/intx,a,b,c,num=0;/*num存放满足条件的数的个数,注意num要赋初值*/for(x=100;x=999;x+)a=x/100;b=x/10%10;c=x%10;if(a!=b,例4:用0-9这十个数字可以组成多少无重复的三位数?,编程方法:“枚举法”,37/69,编程方法:“递推法”,例5:裴波那契数列的第1、2项分别为1、1,以后各项的值均是其前两项之和。求前30项菲波那契数。,所谓递推法就是从初值出发,归纳出新值与旧值间的关系,直到求出所需值为止。新值的求出依赖于旧值,不知道旧值,无法推导出新值。数学上递推公式正是这一类问题。,38/69,f1-第一个数f2-第二个数f3-第三个数f1=1;f2=1;f3=f1+f2;,以后只要改变f1,f2的值,即可求出下一个数.f1=f2;f2=f3;f3=f1+f2;,递推,39/69,voidmain()longf1=1,f2=1,f3;intk;,参考程序:,printf(%ldt%ldt,f1,f2);,for(k=3;k=30;k+)f3=f1+f2;printf(%ldt,f3);f1=f2;f2=f3;,注意f1、f2、f3、x的类型,递推,40/69,在循环体语句中又包含有另一个完整的循环结构的形式,称为循环的嵌套。如果内循环体中又有嵌套的循环语句,则构成多重循环。,6.6循环的嵌套,嵌套在循环体内的循环体称为内循环,外面的循环称为外循环。,while、do-while、for三种循环都可以互相嵌套。,41/69,说明:三种循环可互相嵌套,层数不限外层循环可包含两个以上内循环,但不能相互交叉嵌套循环的执行流程,(1)while()while().,(2)dodowhile();.while();,(3)while()dowhile();.,嵌套循环的跳转禁止:从外层跳入内层跳入同层的另一循环向上跳转,42/69,真,真,外循环初始条件,内循环初始条件,内循环体,外循环条件,假,内循环条件,假,修改内循环条件,修改外循环条件,循环结束,二重循环嵌套结构执行流程,43/69,例:循环嵌套,输出九九表,#includevoidmain()inti,j;for(i=1;i10;i+)printf(%4d,i);printf(n-n);for(i=1;i10;i+)for(j=1;j10;j+)printf(j=9)?%4dn:%4d,i*j);,4469,例:输出图形:,*,编程分析:,采用双重循环,一行一行输出。,每一行输出步骤:一般3步。1)光标定位,3)每输完一行光标换行(n),2)输出图形。例如本题:共4行,若行号用k表示,则每一行有2*k-1个*号。,4569,#includestdio.hvoidmain()intk1,k2;for(k1=1;k1=4;k1+)putchar(t);for(k2=1;k2=k1;k2+)putchar(b);,for(k2=1;k2=k1*2-1;k2+)putchar(*);,putchar(n);,定位(还可以用空格的方法),输出,inti,j;for(i=0;i6;i+)for(j=0;j=a,50/69,例:输出圆面积,面积大于100时停止,#definePI3.14159voidmain()intr;floatarea;for(r=1;r100)break;printf(r=%d,area=%.2fn,r,area);,51/69,(1)语句形式:continue;,(2)语句作用:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断,2.continue语句,(3)语句执行流程:continue语句可以结束本次循环,即不再执行循环体中continue语句之后的语句,转入下一次循环条件的判断与执行。,仅用于循环语句中,52/69,53/69,例:求300以内能被17整除的所有整数。,#includestdio.hvoidmain()intx,k;for(x=1;x=300;x+)if(x%17!=0)continue;printf(%dt,x);,54/69,例:求输入的十个整数中正数的个数及其平均值,#includevoidmain()inti,num=0,a;floatsum=0;for(i=0;i=a,62/69,例:输入任意一个整数,将其逆序输出,例如输入1234,输出4321。,#includestdio.hvoidmain()longy,n;scanf(%ld,63/69,例:猜数游戏:任意设置一个整数,请用户从键盘上输入数据猜想设值的数是什么,告诉用户是猜大了还是小了。10次以内猜对,用户获胜。否则,告诉用户设置的数据是什么。,#includestdio.hvoidmain()intnum=123,x,n;printf(hint:0num)printf(bigger!n);if(xnum)printf(smaller!n);if(n=11)printf(Lost!thenumberis%dn,x);,64/69,1.写出程序运行结果:voidmain()inti,j,x=0;for(i=0;i2;i+)x+;for(j=0;j=3;j+)if(j%2)continue;x+;x+;printf(“x=%dn”,x);,运行结果:x=8,练习,6569,voidmain()intx=1,y=0,a=0,b=0;switch(x)case1:switch(y)case0:a+;break;case1:b+;break;case2:a+;b+;break;case3:a+;b+;printf(“a=%d,b=%dn”,a,b);,运行结果:a=2,b=1,2.写出程序运行结果:,6669,3.将程序补充完整。以下程序从输入数据中统计正整数和负整数的个数.用输入

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论