循环结构的Fortran程序设计.ppt_第1页
循环结构的Fortran程序设计.ppt_第2页
循环结构的Fortran程序设计.ppt_第3页
循环结构的Fortran程序设计.ppt_第4页
循环结构的Fortran程序设计.ppt_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

2019/5/18,1,第四讲 循环结构程序设计,循环结构在程序设计中广泛使用,是一种非常重要的程序结构。 其基本思想是重复,即重复执行某些语句、以完成大量的计算要求。 但是,循环不是简单的重复,因为尽管每次都执行相同的语句,但是在循环过程中变量在变化,而且完成了循环次数或在一定的条件下能退出循环。 本讲介绍Fortran90实现循环结构的2种方法: 1、do循环结构; 2、do while循环结构。,循环次数事先可以确定下来,用do语句实现循环,非常方便。比如,当x=1、2、3、10时,分别计算lnx和sinx的值,用do循环实现的程序如下:,2019/5/18,2,1 用do语句实现循环,Integer x Do x=1,10,1 Print*,x,log(x*1.0),sin(x*1.) End do End,2019/5/18,3,一、do循环的一般格式,do i= e1,e2,e3 (do语句) 循环体 (执行的操作) end do (结束语句),其中:(1)i代表循环变量(可为整型或实型); (2)e1,e2,e3称为参数表达式,分别为循环变量的初值、终值和步长; (3)循环体是循环过程被重复执行的语句组; (4)end do是循环结束的终端语句,其与do语句配合使用。,2019/5/18,4,说明:,(1)步长为1时,表达式e3可以省略。比如“do i=1,10,1”与“do i=1,10”相同。,(3)参数表达式“i=e1,e2,e3”表示循环次数为: r=max(int(e2-e1+e3)/e3),0) 比如:do i=10,1,-2的循环次数r=5,而do i=10,1,2的r=0(即不循环),注意: 1、步长不能为0; 2、循环次数不能为0。,2019/5/18,5,二、do循环的执行过程,(1)循环体指do语句和end do语句之间的语句,不包括do语句,因此do语句在循环过程中只执行一次。如果循环参数表达式中含变量,那么即使在循环体中改变变量的值,循环参数并不改变。比如:,Integer a,b,c,I a=1;b=7;c=2 Do i=a,b,c+1 a=2;b=b+a;c=c*i Print*,i,a,b,c End do End 输出为:1 2 9 2 4 2 11 8 7 2 13 56,进入do循环后,首先计算出循环变量i的初值1、终值7、步长3(即执行do语句),尽管在循环体中改变了变量a、b、c的值,但是循环变量的初值、终值、步长不再变化。,2019/5/18,6,(2)由于在循环过程中,循环变量会自动按循环要求变化,因此不能在循环体内给循环变量进行赋值。,Integer i Do i=1,5,2 i=i+1 Print*,i End do End Error for3598: assignment to Do variable i detected between i and =,(3)由于每循环一次循环变量自动增加一个步长的值,因此退出循环后循环变量的值,比最后一次循环时循环变量的值多1个步长。,Integer i,m Do i=1,10,2 m=i End do Print*,i,m End 输出为:11 9,三、do循环举例,例1:输入x、n,计算输出:,分析:累加项可表示为递推Fi=Fi-1*x/i,用赋值语句F=F*x/i来实现。重复加是循环操作,程序为:,2019/5/18,7,Integer n,i Real x,F,y Read*,x,n F=1.0 Y=1.0 Do i=1,n F=F*x/i Y=Y+F End do Print*,x=,x,n=,n Write(*,*)y=,y End 从键盘输入:3,3 输出为:x=3.0 n=3 y=13.0,2019/5/18,8,例2:输入一个整数,判断并输出是否为完数(除自身外所有因子之和等于本身的数),比如6=1+2+3,所以6是完数。,分析:因为找一个整数的因子及求它们的和可以用循环来实现,而用选择结构可进行判断与输出其是否为完数,程序为:,Integer m,i,sum Read*,m Sum=0 Do i=1,m/2 !求除本身之外的因子及之和 If(mod(m,i).eq.0) sum=sum+i End do if(m.eq.sum)then Write(*,*) m,”是完数” Else Print*,m,不是完数 End if end,2019/5/18,9,例3:找出3位整数中全部的水仙花数。,分析:利用do循环逐一判断3位整数100,999中哪些是水仙花数,并输出,程序为:,Integer m,m1,m2,m3,n Do m=100,999 m1=m/100 m2=mod(m/10,10) m3=mod(m,10) n=m1*3+m2*3+m3*3 If(n.eq.m) Print*,m,是水仙花数 End do end,2019/5/18,10,比如:求两个整数m和n的最大公约数和最小公倍数。,分析:最大公约数在1,min(m,n)范围内,且同时能被m和n整除,因此利用do i=min(m,n),1搜寻,一旦mod(m,i)=0、mod(n,i)=0则此时的i就是最大公约数,并利用exit退出循环。然后利用最大公约数,求出最小公倍数。程序为:,2019/5/18,11,Integer a,b,t,i read*,a,b if(ab)then t=a a=b b=t end if Do i=a,1,-1 if(mod(a,i)=0.and.mod(b,i)=0)then print*,g=,i exit end if end do print*,l=,a*b/i !求最小公倍数 End 比如:12,9 g=3, l=36,注意: 在程序中,do语句中的内容省略,表示循环条件永远成立。当x为偶数时执行cycle语句-直接执行下一次循环。当x大于100时,执行exit语句-跳出循环体。,2019/5/18,12,(2)cycle语句,Cycle语句是用来结束本次循环,即跳过循环体中尚未执行的语句。在循环结构中,cycle语句将使控制直接转向循环条件的测试部分,从而决定是否继续执行循环。,Cycle语句与exit语句的区别在于:cycle语句只是结束本次循环,而不是终止整个循环的执行。Exit语句则是结束所在循环,跳出所在循环体。,例如:求1100中全部奇数之和。,Integer: x=0,y=0 do x=x+1 if(mod(x,2)= =0)then cycle else if(x100)then exit else y=y+x end if end do print*,y End,2019/5/18,13,2 用do while语句实现循环,对于循环次数确定的循环问题,使用do循环是比较方便的。但是,有些循环问题事先是无法确定循环次数的,只能通过给定的条件来决定是否继续循环。这时可以使用do while语句来实现循环。,一、do while循环的一般格式,do while (条件表达式) (do while语句) 循环体 (执行的操作) end do (结束语句),其中:(1)表示循环的条件表达式,要用括号括起来; (2)循环体是在循环过程中被重复执行的语句组; (3)end do是循环结束的终端语句,do while语句与end do语句要配合使用。,2019/5/18,14,比如: real: p=1.0 do while (P0) print*,p read*,p end do End 该程序输出所输入的全部正数,直到输入负数或零,程序结束。,(4)对于循环次数确定的循环问题也可以使用do while语句来实现,比如:求5!,integer: m=1,n=1 do while (m=5) n=n*m m=m+1 end do print*,n End,2019/5/18,15,二、do while循环的执行过程,(1)当给定的条件满足时,执行do while和end do之间的循环体语句; (2)语句执行完毕后,程序自动返回到do while语句,再一次判断do while语句中的条件。 (3)如果条件仍然满足,则再执行一遍循环体语句,如果条件不满足,则结束循环,去执行end do后的语句。,2019/5/18,16,三、do while循环举例,例1:输入一个整数,输出其位数。,分析:输入的整数存入变量m中,用变量n来统计m的位数,程序为:,Integer: m,n=0 read*,m Do while (m0) n=n+1 m=m/10 end do print*,n=,n End 比如:129 n=3,2019/5/18,17,分析:这种累加求和的问题,关键是如何求累加项,通常的办法是利用前一项来求后一项,即利用递推法来求累加项。,例2:求 ,直到最后一项的绝对值小于106时,停止计算。X右键盘输入。,real x,a,s integer:i=1 read*,x s=x a=x do while (abs(a)=1.0e-6) i=i+1 a=-x*x/(2*i-2)/(2*i-1)*a s=s+a end do print*,x,s End,2019/5/18,18,3 Fortran循环结构程序设计的其它问题,一、do循环与do while循环的互换,Do循环和do while循环是Fortran90中常用的2种基本循环结构,前者主要用于确定循环次数的问题、而后者则常用来处理事先无法确定循环次数的问题,但也并非绝对,很多情况下二者可以互换使用。 比如:输入一个整数,判断是否为素数。,分析:所谓素数指这样的整数:除了1和本身不能被其它任何数整除的数。判断一个数是否为素数,可以按照2,3,m-1逐一检查能否除下,但当m很大时检查量太大。 有一个结论:只需检查2,3,m1/2即可判断m是否为素数。 这个问题既可用do循环实现,也可利用do while来解决,程序分别为:,2019/5/18,19,implicit none integer m,i,j read*,m j=sqrt(real(m) do i=2,j if(mod(m,i).eq.0) exit end do if(ij.and.m1)then print*,m,是素数 else print*,m,不是素数 end if End,implicit none integer m,i,j read*,m i=2 j=sqrt(real(m) do while (ij.and.m1)then print*,m,是素数 else print*,m,不是素数 end if End,2019/5/18,20,二、循环的嵌套,如果循环体中又包括一个循环结构,就称为循环的嵌套,也叫多重循环结构。 在设计多重循环时,要特别注意内、外循环之间的关系,以及各语句放置的位置,不能搞错。,比如:求100,200以内的全部素数。,分析:分两步: (1)判断一个数是否为素数的程序段(见前面的例子); (2)利用穷举法将判断一个数是否为素数的程序段,对指定范围内的每一个数都执行一遍,即可求出该范围内的所有素数了。,implicit none integer m,i,j logical zc do m=101,200,2 zc=.true. i=2 j=sqrt(real(m) do while (i=j.and.zc) if(mod(m,i).eq.o)zc=.False. i=i+1 end do if(zc)then print*,m,是素数 end if End do end,2019/5/18,21,分析:该问题要求对5个x值、10个y值,计算出50个F值。然后每10个F值求和得到5个S值。再5个S值连乘得出M的值。 可用二重循环实现:每个S由10个F累加,M由5个S累乘得到。X和Y有明显的规律,可用循环变量得到。,real:x,y,F,s,M=1.0 integer i,j do i=1,5 x=i*2.0 s=0.0 do j=1,10 y=j/10.0 F=sqrt(x*2+y*2) s=s+F end do M=M*s End do print*,M=,M End 输出结果:M=4.107494E8,2019/5/18,22,4 循环结构程序设计上机,1、已知 ,分别求: (1)当n取1000时,S的值;【7.852727E-1】 (2)S0.78时的最大n值和此时n值对应的S值;【0.7799640;23】 (3)求S的值,直到累加项小于104为止。【7.817278E-1】,2、甲、乙、丙三球迷分别预测已进入半决赛A、B、C、D四对的名次,甲预测:A第一、B第二,乙预测:C第一、D第三,丙预测:D第二、A第三。结果每人的预测只对了一半,试问真正的名次应该是怎样?【3、2、1、4】,本讲学习了“重复操作、完成大量计算”的循环结构程序设计问题,包括do循环和do while循环。知道了2种循环结构的编写格式、执行过程及其使用。还明白在do循环的循环体中可加入控制语句,比如exit语句和cycle语句的使用,以及二者之间的互换,循环的嵌套等。,2019/5/18,23,integer i,n real s,x s=0.0 n=1000 do i=1,n x=2.0/(4*i-3)/(4*i-1) s=s+x End do print*,s=,s end,integer i,n real s,x s=0.0 i=1 do while (s0.78) x=2.0/(4*i-3)/(4*i-1) s=s+x i=i+1 End do n=i-2 s=s-x print*,s=,s, n=,n end,递推、迭代法,integer i,n real s,x s=0.0 i=1 x=2.0/(4*i-3)/(4*i-1) do while (x=1E-4) s=s+x i=i+1 x=2.0/(4*i-3)/(4*i-1) End do n=i-2 s=s-x print*,

温馨提示

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

评论

0/150

提交评论