Fortran程序设计(第六章-循环结构(下.ppt_第1页
Fortran程序设计(第六章-循环结构(下.ppt_第2页
Fortran程序设计(第六章-循环结构(下.ppt_第3页
Fortran程序设计(第六章-循环结构(下.ppt_第4页
Fortran程序设计(第六章-循环结构(下.ppt_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

第六章 循环结构(下),6.5 DO结构嵌套,6.6 隐含DO循环,6.7 程序举例,一个DO结构循环体内可以包含另一个DO循环结构,这就是DO结构循环嵌套。 注意: 1 内循环必须完全嵌套在外循环体内,不能相互交叉。 2 循环嵌套中各层的循环控制变量不能同名。,6.5 DO结构嵌套,嵌套DO结构的执行过程,Do结构可以有多重嵌套,这里介绍二重嵌套的执行过程。对于多重嵌套,其基本原理相同。 1当控制进入到外层DO结构后,先计算出外层DO结构的循环次数Ri,外层循环变量得到初值。 2若Ri0,执行外层结构的DO块内的语句。 3当遇到内层DO语句时,控制进入内层DO结构;先算出内层DO结构的循环次数Rj,内层循环变量得到初值。,4对于内层DO结构的执行过程与外层结构的一样;若Rj0,顺次执行内循环的各语句;当Rj0时,从“正常出口”退出内循环。 5继续执行内循环DO结构后面的外循环体内的其它语句。 6外层DO结构循环变量加一个步长,循环次数Ri减1。 7重复2-6步的算法,直到RI等于0,结束全部循环。,嵌套DO结构的有关规定: 1.各种DO结构都可以嵌套,但必须完整嵌套。 2.对于带循环变量的DO结构,并列的DO结构可以用同一个变量名作循环变量,而嵌套的DO循环结构则不能使用相同的循环变量。 3.EXIT语句强行终止当前或指定循环。 4.可从循环体内跳到循环外,但不能从循环体外跳到循环体内。,6.6 隐含DO循环,隐含DO循环实际上是带控制变量的DO结构。但简化成只有DO结构的第一句,且把DO关键字隐去。 隐含DO循环的形式为: (list,v=u1,u2,u3) 例如: READ *,(A(I),I=1,5) PRINT (5I5),(A(I),I=1,5) 注意:隐含do循环输入、输出与DO循环输入输出的区别。,几种常见的隐含DO循环的形式: 1.按指定步长读写。例如 PRINT *,(X(J),J=1,19,2) 2.隐含DO循环与普通变量混合使用。例如 PRINT *,A,B,(X(I),I=1,3),C 3.用于输出一些特殊符号。例如 PRINT *,(-,I=1,80) 4.隐含DO循环可以并列出现。例如 READ *,(A(I),I=1,4),(B(I),I=1,4) 5.隐含DO循环可以嵌套使用。例如 PRINT *,(A(I,J),J=1,5),I=1,3),6.7 程序举例,【1】在下列的程序段中,循环体被执行的次数为: DO 10 A=2.5,-1.6,-0.5 循环体 CONTINUE,【2】阅读下列程序: DO 10 K=5,1,-1 M=0 DO 20 J=K,5 M=M+K*J 20 CONTINUE CONTINUE WRITE(*,*)M END,上述程序运行后,输出的M值为,【3】阅读下列程序: S=0.0 DO 10 I=1,2 DO 10 J=1,3 S=S+I+J 10 CONTINUE WRITE(*,*)S END,上述程序运行后,输出的S值为,【4】在下列的双重循环中,内层的循环体执行的总次数为: DO 10 T=1.5,10.5,1.5 DO 10 I=1,10 循环体 10 CONTINUE,【5】为了计算并输出n!,其中n从键盘输入,下列各FORTRAN程序中正确的是: A) READ(*,*)N S=0.0 DO 10 I=1,N S=S*I CONTINUE WRITE(*,*)S=,S END,B) READ(*,*)N K=1 S=1.0 K=K+1 S=S*K IF(K.LE.N) GOTO10 WRITE(*,*)S=,S END,【5】为了计算并输出n!,其中n从键盘输入,下列各FORTRAN程序中正确的是: C) READ(*,*)N K=1 S=1.0 IF(K.LE.N)THEN S=S*K K=K+1 GOTO 10 END IF WRITE(*,*)S=,S END,D) READ(*,*)N K=1 S=1.0 IF(K.LE.N) THEN K=K+1 S=S*K GOTO 10 END IF WRITE(*,*)S=,S END,【6】下列各循环中,正确的是: A) DO 10 I=1,10 D0 20 J=1,3 CONTINUE 20 CONTINUE,B) DO 10 I=1,10 DO 10 I=2,5,2 CONTINUE,【6】下列各循环中,正确的是: C) DO 10 I=1,10 IF(X.GE.0.0) I=11 CONTINUE,D) DO 10 I=1,10 10 CONTINUE DO 20 I=2,30,2 20 CONTINUE,【7】下列的双重DO循环中,内层的循环体执行的总次数为: DO 10 I=1,10 DO 10 J=I,10 循环体 10 CONTINUE,【8】填空:将DO循环改为用IF语句实现的直 到型循环,使两程序完全等价。 READ(*,*)N S=0.0 DO 10 K=1,N S=S+1.0/(K*(K+1) CONTINUE WRITE(*,*)S=,S END,READ(*,*)N S=0.0 (1) K=0 S=S+D (2) D=1.0/(K*(K+1) IF( (3) )GOTO 10 WRITE(*,*)S=,S END,【9】下列说法中正确的是:,A)所有需要重复处理的问题都可以用DO 循环结 构来处理。 B) 在循环次数事先能确定的情况下,只能用DO 循环结构来处理。 C) DO循环也是属于当型循环。 D) 所有当型循环不能用直到型循环来处理。,【10】阅读下列程序:,READ(*,*)N S=0.0 K=1 IF(N.GE.5)THEN S=S+32 T=1 T=2*T S=S+T K=K+1 IF(K.LE.N) GOTO 10 END IF WRITE(*,*) S END,在执行这个程序时,如果从键盘输入6 则运行后输出的S值 为,【11】阅读下列程序:,READ(*,*)N K=0 DO 10 I=1,N DO 10 J=I-1,N K=K+1 CONTINUE WRITE(*,*) K END,在执行这个程序时,如果从键盘输入10 则运行后输出的K值 为,【12】将下列程序段改写成用直到型循环实现同样的功能。在下划线处填入适当内容:,READ(*,*)N X=0.0 Y=0.0 DO 10 I=0,N-1 X=X+0.5 Y=Y+X*X/(I+1) 10 CONTINUE,READ(*,*)N X=0.0 Y=0.0 IF(N.GE.1) THEN (1) 10 (2) Y=Y+X*X/K (3) IF(K.LE.N) GOTO 10 END IF,练习: 1、下面关于DO循环的规定,错误的是_。 (A) DO循环的循环控制变量不能在循环体内赋值 (B) DO循环的控制变量表达式,终值和步长可以是整型和实型 (C) DO循环是当型循环 (D) DO循环的循环控制变量不能是双精度型 2、 有如下循环入口语句 INTEGER:I DO I=-0.5,-0.5,-1.0 该循环的执行次数为_。 (A) 0 (B) 1 (C) 出错 (D) 无限,3. 有如下循环入口语句 DO I=1,15,3 正常结束时有I=_。 (A) 13 (B) 15 (C) 16 (D) 不一定 4. 有如下循环入口语句 DO J=1,15,3 IF(MOD(J,10)=0) GOTO 10 PRINT *,J END DO 该语句输出的J的值是_。 (A) 1 4 7 10 (B) 1 4 7 10 13 (C) 1 4 7 13 (D) 10,5. 下面关于DO循环和块IF结构联合使用时的一些规定的叙述,其中错误的是_。 (A) DO循环体可以是一个块IF结构 (B) 块IF结构中的IF块,ELSE IF块,ELSE块中可以完整的包含DO循环 (C) DO循环体不能是一个块IF结构 (D) DO循环中有一个IF语句,则必须有ELSE语句或ELSE IF语句,END IF语句在同一循环体内,6. 有如下一程序 M=3; I=1 100 IF(I=M)THEN DO J=1,I PRINT*,J END DO I=I+1; GOTO 100 END IF 该程序的输出值是 。 (A) 1 1 2 1 2 3 (B) 1 1 1 2 3 (C) 1 2 3 (D) 程序有语法错误,例1:用,公式求的近似值,直到最后一项的绝对值小于10-6为止。,分析:用N-S图表示上述算法如下:,integer:s real: n, t, pi s=1; n=1.0; t=1.0; pi=1.0 do while(abs(t)1e-6) pi=pi+t; n=n+2; s=-s ; t=s/n enddo pi=pi*4 print *,pi=,pi end,例2:求Fibonacci数列:1,1,2,3,5,8的前40个数,即F1=1(n=1),F2=1(n=2),Fn=Fn-1+Fn-2(n大于2),分析:算法如下,integer: f1, f2 f1=1 f2=1 do i=1, 20 print*,f1, f2 f1=f1+f2; f2=f2+f1 end do end,例3:判别m是否为素数。,分析:算法如下,integer m, i, k read *,m k=sqrt(m); do i=2, k if (mod(m, I)= =0) exit if ( i=k+1) then print*,m, is a prime number else print *,m, is not a prime number endif enddo end,例4:歌德巴赫猜想(将一个100200的偶数分解成两个素数之和),程序: PROGRAM MAIN IMPLICIT NONE INTEGER:N,N1,N2,K,KEND LOGICAL PRIME N: DO N=100,200,2 N1=1 DO IF(N13)THEN N1=N1+1 ELSE N1=N1+2 ENDIF PRIME=.TRUE. KEND=SQRT(REAL(N1) KK1: DO K=2,KEND IF(MOD(N1,K)=0)PRIME=.FALSE. ENDDO KK1,IF(.NOT.PRIME) CYCLE N2=N-N1;PRIME=.TRUE. KEND=SQRT(REAL(N2) KK2: DO K=2,KEND IF(MOD(N2,K)=0) PRIME=.FALSE. ENDDO KK2 IF(.NOT.PRIME) THEN CYCLE ELSE EXIT ENDIF ENDDO WRITE (*,“(I3,=,I3,+,I3)“) N,N1,N2 ENDDO N END,例5:对于-5x11;-10y9;-6 z 18,求方程:x3+y3+z3=3的全部解。,程序设计有三种基本的思维方法: 枚举法、归纳法、抽象法 枚举法:就是逐一列举出可能解的各个元素,并加以判断,直到求得所需要的解。常用在排列、组合、数据分类、信息检索、多解方程的求解上;,程序如下: Integer: x, y, z do x= -5,11 do y=-10,9 do z=-6,18 if (x*x*x+y*y*y+z*z*z= =3) then print *,x,y,z end if End do End do End do end,使用枚举法,必须掌握两条原则: 确定搜索的范围(这个范围必须是有限的); 选择枚举的策略(按一条怎样的路径来逐一枚举);,例6:求整数a和b的最小公倍数。,分析: (1)如果 i 是a 和b的最小公倍数,则 i 必能被 a 和 b 整除,同时 i 必须是自然数,所以其取值范围是; (2)方法一:i 从1开始,依次增加,直到第一个能被a和b整除为止,这个 i 就是a和b的最小公倍数; (3)方法二:令从i 从a开始,并使 i 每次增加a而不是增加1,这就保证了 i 总是a的倍数。故每次只要判断 i 能否被b整除就可以了。一旦判断成立,i 就是a和b的最小公倍数;,integer a,b, i read*,a,b i=0 do while .true. I=I+1 if (mod(I,a)= =0) then if (mod(I,b)= =0) printf*, I; eixt endif endif enddo end,程序一:,例7:百钱百鸡问题。用100元钱买100只鸡,每只公鸡5元,每只母鸡3元,每3只小鸡1元,要求每种鸡至少买一只,且必须是整只的,问各种鸡各买多少只?,分析: (1)这是一个组合问题,归根到底是求三元一次方程的一组解; (2)设 i,j,k分别表示公鸡、母鸡和小鸡的只数。为了确定i,j,k的取值范围,可以有不同方法。不同的方法,程序的计算量相差甚远; (3)方法一:i :1 20;j:1 33;k:1100; (4)方法二:i :1 18;j:1 31;k:100ij; (5)方法三:由i +j+k=100及5i +3j+k/3=100得14i+8j=200,由此可得: i :1 13;j:1 23;k=100ij; (6)方法四:由方法三中的14i+8j=200得7i+4j=100可得: i :1 13;j=(100 7 i)/4;k=100ij;,归纳法:是从大量的特殊性中总结出规律性或一般性的结论。 归纳,在程序设计上主要表现为递归和迭代。我们常常用递归和迭代的方式把一个复杂的计算过程化为简单过程的多次重复,这种重复很容易用循环来实现;,例8:用牛顿迭代法求a的平方根。牛顿迭代公式为:,分析:解决该问题的N-S图如下:,real:a , x0 , x1 read*,a if(a=1.0e-5) x0=x1 x1=0.5*(x0+a/x0) enddo endif print *,sqrt(,a,)= , x1 end,例9:猴子第一天摘下若干桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉了一半,又多吃了一个,以后每天早上都吃了前一天剩下的一半零一个。到第10天早上再想吃时,发现只剩下一个桃子了。求第一天共摘多少

温馨提示

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

评论

0/150

提交评论