《Fortran程序设计第六章循环结构.ppt》由会员分享,可在线阅读,更多相关《Fortran程序设计第六章循环结构.ppt(48页珍藏版)》请在三一办公上搜索。
1、第六章 循环结构(下),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,内层
2、循环变量得到初值。,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
3、循环,隐含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
4、*,(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*J20 CONTINUE CONTINUE WRITE(*,*)M END,上述程序运行后,输出的M值为,【3】阅读下列程序:S=0.0 DO 10 I=1,2 DO 10 J=1,3 S=S+I+J10 CONTINUE
5、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*ICONTINUE 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从键
6、盘输入,下列各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】下列各循环中
7、,正确的是: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)
8、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,在执行这个程序时,如果从键盘
9、输入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.L
10、E.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
11、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
12、;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),F
13、n=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的偶数分解
14、成两个素数之和),程序: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(
15、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,11do y=-10,9d
16、o z=-6,18if(x*x*x+y*y*y+z*z*z=3)then print*,x,y,z end ifEnd doEnd doEnd doend,使用枚举法,必须掌握两条原则:确定搜索的范围(这个范围必须是有限的);选择枚举的策略(按一条怎样的路径来逐一枚举);,例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,这
17、就保证了 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分别表
18、示公鸡、母鸡和小鸡的只数。为了确定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;,归纳法:是从大量的特殊性中总结出规律性或一般性的结论。归纳,在程序设计上主要表现为递归和迭代。我们常常用递归
19、和迭代的方式把一个复杂的计算过程化为简单过程的多次重复,这种重复很容易用循环来实现;,例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,)=,x1end,例9:猴子第一天摘下若干桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉了一半,又多吃了一个,以后每天早上都吃了前一天剩下的一半零一个。到第10天早上再想吃时,发现只剩下一个桃子了。求第一天共摘多少个桃子。,分析:(1)采用
20、归纳法。(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 end,归纳法的另一重要用途是用于数列和级数求和;如前述例1(求)和例2(求Fibonacci数列),例10:有一张足够大的纸,厚0.09毫米,问将它对折多少次后可以达到珠穆朗玛峰的高度(8848米)?,分析:(1)采用归纳法;(2)设a为高度,初值为910-5米;(3)对折后,高度为前一次高度的2倍,每次乘2后判断乘积是否已超过8848米。若已超过,则记下
21、乘2的次数就是对折的次数;(4)请自己编程;,抽象法:自顶向下,逐步求精。例11:将1到100间的素数打印出来。,例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?,