Fortran77教程-5循环结构的实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2. 对于任何形式的循环,都不允许循环的交叉;
DO 10 I=1, 5 DO 20 J=1, 3 M=I*J CONTINUE CONTINUE DO 10 I=1, 10 …… DO 10 J=0, 20, 2 …… CONTINUE
10 20
3. 嵌套DO循环中,可以共用一个循环终端语句;
DO 10 I=1, 10 …… DO 20 J=0, 20, 2 …… CONTINUE CONTINUE
22
C Fibonacci数列问题 C 1,1,2,3,5,8,13,21,34... f1=1.0 f2=1.0 write(*,*) f1 write(*,*) f2 n=3 f=f1+f2 10 write(*,*) f f1=f2 f2=f f=f1+f2 n=n+1 if((n.le.30).and.(f.le.1e5)) goto 10 end
第一章 第二章 第三章 第四章 第五章 第六章 第七章 第八章
算法 计算机和计算机程序 Fortran语言程序设计初步 逻辑运算和选择结构 循环结构的实现 Fortran的数据结构 数据的输入、输出 常用算法的程序设计举例
1
第五章 循环结构的实现
循环操作:重复执行一组指令 (或一个程序段) 循环分类: 无条件的循环 有条件的循环
GOTO语句破坏了语句 直到 N 30 顺序执行的正常状况,不 GOTO <标号> 符合结构化原则,因此一 属于直到型循环 般不提倡使用GOTO语句!
3
5.2 用DO语句实现循环
DO s[, ] v = e1, e2 [, e3]
循环终端 语句标号 循环 变量 循环变 量初值 循环变 量终值 循环变 量增量
20
3. 用READ语句和GO TO语句实现当型循环
自学!
5.4 直到型循环的实现
用逻辑if语句可实现直到型循环。 C 求1-1/2+1/3+...+1/99-1/100的值 integer sign sum=1.0 deno=2.0 sign=1 10 sign=(-1)*sign term=sign/deno sum=sum+term deno=deno+1 if(deno.le.100) goto 10 write(*,*) sum end
逻辑IF语句可作为DO循环的终端语 句,但其内嵌语句不能是上述控制语句!
DO 10 I = 1,50 K=I*1 PRINT *,I,K IF(K.GT.500) GOTO 100
9
Baidu Nhomakorabea
10
继续语句(CONTINUE语句)
形式:
CONTINUE
DO 20 , I=1, 10 , 2 PRINT *, I 20 CONTINUE
2. 循环变量的初值、终值和步长值在执 行循环体期间不能改变;
DO 20 , I=K, J, M K=2*K J=J+1 M=M/2 PRINT *, K, J, M 20 CONTINUE
11
3. 可以用转移语句从循环体内转到循环 体外,也可以在循环体内转移,但不允 许从循环外转到循环内;
DO 10 , I=1, 100 …… IF (I*I.GE.500) GOTO 100 非正常出口 …… 10 CONTINUE 正常出口 …… 100 PRINT *, I, I*I
19
* 用π2/6≈ 1/12+1/22+...+1/n2,求π值 read(*,*) n sum=0.0 i=1 10 if(i.le.n) then term=1.0/(i*i) sum=sum+term i=i+1 goto 10 end if pi=sqrt(6.0*sum) write(*,*) 'pi=',pi end
5. 如果v的类型和 e1、e2 、 e3的类型不一致, 先将e1、e2 、 e3的类型化成v的类型,然后处 理 DO 20,X=1.5,3.6,1.2 循环次数:r =INT((3.6- 1.5+ 1.2)/ 1.2)=2 循环次数:r =INT((3- 1+ 1)/ 1)=3 6. 如果计算出循环次数 r<0 时,按 r=0 处理, 避免使用实型的循环变量! 即一次也不执行循环 用整型的循环变量时,计算
4. 正常出口&非正常出口;
12
DO 循环的嵌套(多重循环) 一个循环体内又完整的包含另一个循环结构
注意事项: 1. 嵌套循环的各层不允许使用同一个变 量名作为循环控制变量;
DO 20 I=1, 5 …… DO 10 I=2, 10, 2 …… CONTINUE …… CONTINUE
13
10
20
15
5.3 当型循环的其他实现方法
1. do while语句 * 统计平均成绩 integer count sum=0.0 count=0 read(*,*) score do 10 while(score.ge.0.0) sum=sum+score count=count+1 read(*,*) score 10 continue aver=sum/count write(*,*) 'count=',count write(*,*) 'average=',aver end
16
*
10 $
辗转相除求最大公约数 integer m,n,r,t read(*,*) m,n if(m.lt.n) then t=m m=n n=t end if r=mod(m,n) do 10 while(r.ne.0) m=n n=r r=mod(m,n) continue write(*,*) 'The greatest', ' common divisor is', n end
10
$ $
判断n是否为素数 logical w integer r read(*,*) n w=.true. i=2 j=sqrt(real(n)) r=mod(n,i) if(r.eq.0) then w=.false. else i=i+1 end if if((i.le.j).and.w) goto 10 if(w) then write(*,*) n, ' is', ' a prime number' else write(*,*) n, ' is not', ' a prime number' end if end
C C C C C
百钱买百鸡 100元钱买100只鸡 公鸡5元/只 母鸡3元/只 小鸡1元/3只 integer x,y,z do 10 x=0,19 do 20 y=0,33 z=100-x-y if(15*x+9*y+z.eq.300) write(*,*) x,y,z continue continue end
17
2. 用块IF和GO TO语句实现当型循环
判断n是否为素数 read(*,*) n j=sqrt(real(n)) i=2 do 10 while((i.le.j).and. $ (mod(n,i).ne.0)) i=i+1 10 continue if(i.gt.j) then write(*,*) n,' is', $ ' a prime number' else write(*,*) n,' is not', $ ' a prime number' end if end C C 判断n是否为素数 read(*,*) n j=sqrt(real(n)) i=2 if((i.le.j).and.(mod(n,i).ne.0))
2
5.1 用GOTO语句实现循环
例:打印30个学生的学号和成绩
N=1 1 N 100 READ (*,*) NUM, GRADE WRITE (*,*) NUM, GRADE 输入NUM,GRADE N=N+1 IF ( N.LE. 30 ) GOTO 100 打印NUM,GRADE END N 1 N
21
C
判断n是否为素数 read(*,*) n j=sqrt(real(n)) i=2 do 10 while((i.le.j).and. $ (mod(n,i).ne.0)) i=i+1 10 continue if(i.gt.j) then write(*,*) n,' is', $ ' a prime number' else write(*,*) n,' is not', $ ' a prime number' end if end C
统计平均成绩 integer count sum=0.0 count=0 read(*,*) score if(score.ge.0.0) then sum=sum+score count=count+1 read(*,*) score goto 10 end if aver=sum/count write(*,*) 'count=',count write(*,*) 'average=',aver end
10 then
$
$
i=i+1 goto 10 end if if(i.gt.j) then write(*,*) n,' is', ' a prime number' else write(*,*) n,' is not', ' a prime number' end if end
18
*
10
统计平均成绩 * integer count sum=0.0 count=0 read(*,*) score do 10 while(score.ge.0.0) 10 sum=sum+score count=count+1 read(*,*) score continue aver=sum/count write(*,*) 'count=',count write(*,*) 'average=',aver end
DO 10,T=5.0,25.0,0.5
2. e1、e2 、 e3的值可以正或负, e1、e2的 值可以为0, e3的值不应为0 3. 脱离循环的条件:循环变量沿变化的 方向超过终值
5
4. 循环次数计算公式为:r =INT((e2- e1+ e3)/ e3)
DO 20,I=1,10,2 循环次数:r =INT((10- 1+ 2)/ 2) =INT(5.5)=5次
DO 10 N=1, 30 READ (*,*) NUM, GRADE 10 WRITE (*,*) NUM, GRADE END
DO语句 循环体
4
DO s[, ] v = e1, e2 [, e3]
DO语句几点说明:
1. e1、e2 、 e3可以是常数、变量或表达式
C=5.0 DO 10,T= C,50.0/2.0,0.5
DO 10,I=10,1,2 出的循环次数是绝对正确的! 循环次数:r =INT((1- 10+ 2)/.2)= -3
6
DO 循环执行过程
s
DO s[, ] v = e1, e2 [, e3] …… 循环体 ……
DO语句
DO 计算e1、e2 、 e3的值 循 e1 v 环 计算循环次数:r =INT((e - e + e )/ e ) 2 1 3 3 属 当r > 0 于 循环体语句 当 v e3 v 型 r 1 r 循 环 适用范围:循环次数已知
20 10
10
4. 可以从内层循环根据需要将控制转到外层循 环,但不允许从外层循环将控制转到内层循环
14
C
20
10
打印九九表 open(1,file='out.dat') do 10 i=1,9 do 20 j=1,9 k=i*j write(*,*) i,'*',j,'=',k continue write(*,*) write(*,*) continue $ end 20 10
7
循环终端语句&继续语句(CONTINUE语句)
循环终端语句 定义: 循环体中带有语句标号的最后一个语句
20 10 DO 10 I = 1,50 K=I*1 PRINT *,I,K 循环体
规定: 下列语句不能作为DO循环的终端语句:
8
GOTO语句, DO语句, STOP语句, END语句, END IF语句,块IF语句, ELSE语句 ,ELSE IF语句,等
作用: 将流程转移到逻辑上的下一个操作 优点:1.循环范围清晰,易识别; 2.使一般可执行语句不再作为终端 语句,仅执行其语句本身功能; 3.不用记哪些语句不能作终端语句
10
DO 循环的一些规定 1. 循环变量可以在循环体中被引用,但 不应再被赋值;
DO 20 , N=1, 100 DO 20 , N=1, 100 M=2*N N=2*N PRINT *, M PRINT *, N 20 CONTINUE 20 CONTINUE
相关文档
最新文档