Fortran程序设计(第六章-循环结构(下).ppt
第六章 循环结构(下)6.5 DO6.5 DO结构嵌套结构嵌套6.6 6.6 隐含隐含DODO循环循环6.7 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),C3.用于输出一些特殊符号。例如 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 循环体10 CONTINUE【2】阅读下列程序:DO 10 K=5,1,-1 M=0 DO 20 J=K,5 M=M+K*J20 CONTINUE10 CONTINUE WRITE(*,*)M END上述程序运行后,输上述程序运行后,输出的出的M值为值为 【3】阅读下列程序:S=0.0 DO 10 I=1,2 DO 10 J=1,3 S=S+I+J10 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*I10CONTINUE WRITE(*,*)S=,S END B)READ(*,*)N K=1 S=1.0 10 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 10 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 10 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 10 CONTINUE 20 CONTINUE B)DO 10 I=1,10 DO 10 I=2,5,2 10 CONTINUE【6】下列各循环中,正确的是:C)DO 10 I=1,10 IF(X.GE.0.0)I=11 10 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)10 CONTINUE WRITE(*,*)S=,S END READ(*,*)N S=0.0 (1)K=010 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=110 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 10 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 1010PRINT*,J END DO 该语句输出的该语句输出的J的值是的值是_。(A)1 4 7 10 (B)1 4 7 10 13(C)1 4 7 13 (D)105.下下面面关关于于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(I1e-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)分析:算法如下分析:算法如下f1=1,f2=1do i=1,20输出输出f1,f2f1=f1+f2f2=f2+f1 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是否为素数。是否为素数。分析:算法如下分析:算法如下读入读入m,并令,并令k=sqrt(m),i=2当当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 PRIMEN: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的全部解。的全部解。n程序设计有三种基本的思维方法:程序设计有三种基本的思维方法:枚举法、归纳法、抽象法枚举法:就是逐一列举出可能解的各个元素,并加以判断,直到求得所需要的解。常用在排列、组合、数据分类、信息检索、多解方程的求解上;程序如下:程序如下:Integer:x,y,z do x=-5,11do y=-10,9do z=-6,18if(x*x*x+y*y*y+z*z*z=3)then print*,x,y,z end ifEnd doEnd doEnd doend使用枚举法,必须掌握两条原则:使用枚举法,必须掌握两条原则:n确定搜索的范围(这个范围必须是有限的);确定搜索的范围(这个范围必须是有限的);n选择枚举的策略(按一条怎样的路径来逐一选择枚举的策略(按一条怎样的路径来逐一枚举);枚举);例例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 分析:解决该问题的分析:解决该问题的N-S图如下:图如下:TF输入输入 aa=1.0e-5 x0=x1 x1=0.5*(x0+a/x0)输出输出x1 x1=0.5*(x0+a/x0)real:a,x0,x1 read*,a if(a=1.0e-5)x0=x1 x1=0.5*(x0+a/x0)enddo endif print*,sqrt(,a,)=,x1end 例例9:猴子第一天摘下若干桃子,当即吃了一半,还不过瘾,:猴子第一天摘下若干桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉了一半,又多吃了一个。第二天早上又将剩下的桃子吃掉了一半,又多吃了一个,以后每天早上都吃了前一天剩下的一半又多吃了一个,以后每天早上都吃了前一天剩下的一半零一个。到第零一个。到第10天早上再想吃时,发现只剩下一个桃子天早上再想吃时,发现只剩下一个桃子了。求第一天共摘多少个桃子。了。求第一天共摘多少个桃子。分析:分析:(1)采用归纳法。)采用归纳法。(2)在本例中,假设)在本例中,假设 s 为剩下的,则为剩下的,则s+1为前一天为前一天的一半,而的一半,而2(s+1)为前一天的总个数。依次类推,)为前一天的总个数。依次类推,10天前的桃子数即可算出。天前的桃子数即可算出。integer:s,i s=1 do i=1,9 s=(s+1)*2 end do print*,s endF归纳法的另一重要用途是用于数列和级数求和;如归纳法的另一重要用途是用于数列和级数求和;如前述例前述例1(求(求)和例)和例2(求(求Fibonacci数列)数列)例例10:有一张足够大的纸,厚:有一张足够大的纸,厚0.09毫米,问将它对折多少次毫米,问将它对折多少次后可以达到珠穆朗玛峰的高度(后可以达到珠穆朗玛峰的高度(8848米)?米)?分析:分析:(1)采用归纳法;)采用归纳法;(2)设)设a为高度,初值为为高度,初值为910-5米;米;(3)对折后,高度为前一次高度的)对折后,高度为前一次高度的2倍,每次乘倍,每次乘2后判断乘积是否已超过后判断乘积是否已超过8848米。若已超过,则记下米。若已超过,则记下乘乘2的次数就是对折的次数;的次数就是对折的次数;(4)请自己编程;)请自己编程;F抽象法:自顶向下,逐步求精。抽象法:自顶向下,逐步求精。例例11:将将1到到100间的素数打印出来。间的素数打印出来。输入输入1n把所有的非素数去掉把所有的非素数去掉打印全部素数打印全部素数CBA输入输入ni=1当当i=nxi=ii=i+1A:将将x1去掉(使去掉(使x1=0)i=2当当in/2当当i=i+1如如xi未去掉,则将未去掉,则将xi+1到到xn间全部是间全部是xi的倍的倍数去掉数去掉B:B1B2B3例例12:用循环语句打印下列图案:用循环语句打印下列图案:*分析:分析:(1)这是一个典型的循环嵌套问题;)这是一个典型的循环嵌套问题;(2)该图案中一共有)该图案中一共有6行,打印时需一行一行进行,行,打印时需一行一行进行,设正在处理的行为第设正在处理的行为第 i 行,则行,则 i 从从1 6;(3)每行的字符个数与所在行有关,设)每行的字符个数与所在行有关,设j表示第表示第 i 行第行第j个字符,则个字符,则j从从 1 2*i 1;(4)每行的起始位置。设第一行为第)每行的起始位置。设第一行为第20列的话,列的话,则第则第 i 行的位置可用行的位置可用21-i 来表示。来表示。例例13:用循环语句打印下列图案:用循环语句打印下列图案:*分析:分析:(1)将该图案分成上下两部分处理;)将该图案分成上下两部分处理;(2)定行、定行中的字符个数、定每行打印)定行、定行中的字符个数、定每行打印的起始位置。的起始位置。QUESTION?48