c语言课件4.循环结构程序设计_第1页
c语言课件4.循环结构程序设计_第2页
c语言课件4.循环结构程序设计_第3页
c语言课件4.循环结构程序设计_第4页
c语言课件4.循环结构程序设计_第5页
已阅读5页,还剩32页未读, 继续免费阅读

付费下载

下载本文档

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

文档简介

1、安徽工程科技学院4.2.1 while语句4.2.2 do-while语句4.2.3 for语句 4.2.4 转移语句4.2.5 循环的嵌套4.2.6 循环结构程序设计举例 4.2 循环结构程序设计循环的概念 当所要解决的问题存在重复执行内容时,应该使用循环结构来实现,具体的设计步骤可归纳如下。(1)构造循环体。将问题中需要重复执行的部分,利用C语言规则归纳出一组程序段。在归纳的过程中应充分利用变量是一个变化的量的概念。如本列中变量score在不同的时刻代表的是不同学生的成绩。 (2)寻找控制循环的变量。有的题目循环的次数是确定的,可以使用计数器来控制循环;有的题目循环的次数不是确定的,那么使

2、用计数器就不合适了,设计者应从题目中去寻找规则变化的量来控制循环体完成规定的次数。(3)找出控制变量的3个要素。 循环控制变量的初值。 循环的条件。 使循环趋于结束的部分。4.2.1 while语句while语句是实现当型结构循环的语句,其一般形式为while(逻辑量) 循环体语句 其中,while是C语言的关键字,语句中的逻辑量为循环条件。while语句的流程图如图4.2所示。 例4.3 求1到100的和。根据流程图写出程序:main() int i,sum; sum=0; i=1; while(i=100) sum=sum+i; i+; printf(%dn,sum);图4.3 例4.3的

3、N-S流程图例4.4 求n!。main() float fac; int i,n; fac=1; i=2; scanf(%d,&n); while(i=n) fac=fac*i; i+; printf(n!=%.0fn,fac);图4.4 例4.4的N-S流程图4.2.2 do-while语句 do-while语句是实现直到型循环结构的语句,其一般形式为: do 循环体语句while(逻辑量); do-while语句的流程图如图4.6所示。 例4.9 求两个数的最大公约数。 (a)当型结构 (b)直到型结构图4.8 例子的两种结构的N-S图 根据流程图可得到程序:main() main() i

4、nt m,n,r; int m,n,r; scanf(%d,%d,&m,&n); scanf(%d,%d,&m,&n); if(mn) if(mn) r=m;m=n;n=r; r=m,m=n,n=r; r=m%n; do while(r!=0) m=n; r=m%n; n=r; m=n; r=m%n; n=r; while(r!=0); printf(%dn,n); printf(%dn,m); 4.2.3 for语句 for语句是实现当型循环结构的语句,for语句是语言所提供的功能更强、使用更广泛的一种循环语句。其一般形式为: for(表达式1;表达式2(逻辑量);表达式3) 循环体语句;

5、表达式1通常用来给循环变量赋初值,一般是赋值表达式。也允许在for语句外给循环变量赋初值,此时可以省略该表达式。表达式2通常是循环条件,一般为关系表达式或逻辑表达式,也可以是任意“确定的值”。表达式3通常是使循环趋于结束的部分,一般是赋值表达式。图4.9 for 语句的传统流程图 图4.10 for语句的N-S流程图 Y N 表达式2 求解表达式1 循环体语句 循环的后续语句 求解表达式32 for(表达式1;表达式2;表达式3) 循环体语句 求1到100的和。main() int i,sum; sum=0; for(i=1; i=100;i+) sum=sum+i; printf(%dn,s

6、um);使用for语句应注意以下几点。(1)for语句中的各表达式都可省略,但间隔符分号不能省略。例如:for(;逻辑量;表达式3) 省去了表达式1。for(表达式1;表达式3) 省去了表达式2。for(表达式1; 逻辑量;) 省去了表达式3。for(;) 省去了全部表达式。在循环变量已赋初值时,可省去表达式1。 main() int i,sum; sum=0; i=1; for(; i=100;i+) sum=sum+i; printf(%dn,sum);可省去表达式3,应该在循环体部分增加使循环趋于结束部分。main() int i,sum; sum=0; for(i=1; i=100;)

7、 sum=sum+i; i+; printf(%dn,sum);省略表达式2 ,则循环条件一直为真,那么在循环体中应有循环结束语句,否则是死循环。省略表达式1和表达式3,for语句相当于while语句。main() int i,sum; sum=0; i=1; for(; i=100;) sum=sum+i; i+; printf(%dn,sum);(2)表达式1和表达式3可以是逗号表达式main() int i,sum; for(sum=0,i=1; i=100;i+) sum=sum+i; printf(%dn,sum);main() int i,sum; for(sum=0,i=1; i

8、=1000,则跳出循环。main() int n=1,s=0; for (;n=1000) break; printf(s=%dn, s);2. continue语句continue语句只能用在循环体中。 其一般格式是: continue; continue语句的功能是结束本次循环,即不再执行循环体中continue 语句之后的语句,转入下一次循环执行。应注意的是,该语句只结束本层本次的循环,并不跳出循环。 使用continue语句时,应该清楚在不同的循环语句中下次循环的起点是什么。在while和do-while语句中,下次循环的起点是判断逻辑量;在for语句中,下次循环的起点是计算表达式2的

9、值。【例4.14】 输出100以内能被7整除的数。void main()int n;for(n=7;n0) fact *=n-; goto loop; printf(n!=%.0fn, fact);4.2.5 循环的嵌套 当一个循环体内又包含另一个循环结构时,称为循环的嵌套。被嵌入的循环又可以嵌套其他的循环,这就是多重循环。 例4.20 分析以下循环内外层循环控制变量的变化。main() int i,j; int mul; for(i=1;i10;i+) for(j=1;j=i;j+) mul=i*j; printf(%d*%d=%-4d,i,j,mul); printf(n); 程序运行的结

10、果为:1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 4*4=16 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=267*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=498*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=649*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=8

11、1【例4.21】 利用公式 求的近似值,直到最后一项的绝对值小于10-6为止。对于循环次数未知的循环结构,一般不适合使用for语句实现,可以采用while语句或do-while语句来实现。用while语句实现的程序源代码如下:4.2.6 循环结构程序设计举例 +#includemain()int sign=1;float n=1,t=1,pi=0;while(fabs(t)1e-6)pi+=t;n+=2;sign*=-1;t=sign/n;pi*=4;printf(pi=%10.6fn,pi);例4.22 求ex1x +图4.13 例4.22的N-S流程图main() float x,fac,

12、ex,xn; int n; fac=1; ex=1; n=1; xn=1; scanf(%f,&x); do fac=fac*n; xn=xn*x; ex=ex+xn/fac; n+; while(xn/fac10e-6); printf(%fn,ex); 【例4.23】 输出100以内的素数。所谓素数是指只能被1和其本身整除的数。算法分析:我们先用穷举法来对2100之间所有的数进行判断。在判断一个数n是否是素数时,我们对n用2n-1逐个去除,若某次可以整除则说明n不是素数,跳出该层循环。 如果在所有的数都是未除尽的情况下结束循环,则为素数。程序源代码如下: main()int n,i;for

13、(n=2;n=100;n+)for(i=2;i=n) printf(t%d,n);对此算法作进一步分析。实际上,2以上的所有偶数均不是素数,因此可以使循环变量的步长值改为2,即每次增加2,此外只需对数n用2n/2 或2去除就可判断该数是否素数。这样将大大减少循环次数,减少程序运行时间。#includemath.hvoid main()int n,i,k;for(n=3;n=100;n+=2)k=sqrt(n);for(i=2;i=k) printf(t%3d,n);例4.24 求Fibonacci数列的前20项之和。分析:本例是一种“递推”的题目。所谓“递推”是指在前面一个(或几个)结果的基础

14、上推出下一个结果的方法。 图4.14 例4.24的N-S流程图 根据流程图编写程序:main() float sum,f1,f2,f3; int i; f1=1; f2=1;sum=f1+f2; for(i=3;i=20;i+) f3=f1+f2; sum+=f3; f1=f2; f2=f3; printf(%.0fn,sum);【例4.25】求解百鸡百钱问题。公元钱五世纪,我国古代数学家张丘建在算经一书中提出了“百鸡百钱”问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?算法分析:百鸡百钱问题是典型的穷举法问题。我们设x,y,z分别为买的鸡翁,鸡母,鸡雏的个数,则有x+y+z=1005*x+3*y+z/3=100而x,y可能取数的范围为x:020y:033z可以由公式z=100-x-y计算出来。据

温馨提示

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

评论

0/150

提交评论