第五章 fortran循环结构

合集下载

FORTRAN知识点总结

FORTRAN知识点总结

F O R T R A N第2章FORTRAN90基础知识:程序单元的概念:fortran90程序是一种分块形式的程序,整个程序由若干程序单元块组成。

每个程序只有一个主程序单元。

各单元体的程序体形式上相同。

程序单元可以是主程序、子程序(外部过程或内部过程)、模块MODULE (供其他程序单元引用即把该程序单元内的全部语句复制到程序单元中)或块数据程序单元BLOCK 。

语言元素:指在程序设计中用到的基本成分,如字符集、常量、变量、记号(标号、关键字、名字、常数、运算符和定界符)以及其他的基本结构等。

字符集:英文字母、阿拉伯数字、下划线、21个特殊字符($和?没有规定用法)。

数据结构:整型INTEGER (34-2下划线后面是种别参数),n 位字长的计算机的数据表示范围一般为12~211-+---n n ,种别参数由内在询问函数KIND 送回,种别值提供的最小范围由内在函数SELECTED-INT-KIND 送回,表示十进制幂的范围由内在函数RANGE 送回;实型REAL ,小数形式和指数形式;复型COMPLEX (种别类型参数值取实部与虚部中较大者);字符型CHARACTER,由一对单撇号或双撇号之间的字符序列组成;逻辑型LOGICAL。

派生数据类型TYPE;数组INTEGER,DIMENSION(1,50)::A,可直接对数组元素进行运算如3*A,SQRT(A);字符子串,在字符串CHARACTER(LEN=80)::ROW中,ROW(1:3)就表示字符串ROW中第1到第3个元素组成的子串。

变量名的命名规则:不能超过31个字符;组成成分是字母、数字、下划线;第一个字符必须是字母。

第3章基本语句:类型说明语句:类型说明(种别说明),属性说明::变量名表尽量避免把两个实数作相等或不相等的比较。

淘汰隐式说明IMPLICIT NONE种别说明:种别参数即对可移植数据精度和范围进行选择的机制KIND(X) 返回变元X的种别参数值SELECTED-REAL-KIND(n,m) 产生一个种别值,它表示某一精度和范围。

Fortran第5章

Fortran第5章

注意:不能出现大数, Do n=1,100 否则将超出范围 如 A=A*N A=A*x/n s=s+x**n/A S=s+A 分母为大数,有时会死循环、 输出NaN等等难以预测情况。 enddo 第84页例5-6:N=30时结果为 Print*, s, exp(x) 负数 end
练习:求
s cos x 1 (1)
3
10 6 …… 错误的输入格式: 2,8,3,10,6,……
S=S+X
ENDDO PRINT'("S=",I6)',S END PROGRAM EXAM4
2.A=A*表达式
例:求
s e 1 x
x
重复:
x2 2!

x3 3!
x1 0 0 100!
s s
xn n!
分析通项A的求法:an=an-1*x/n 即A=A*X/n, n=1,2,……100
同构数
例5-26 (102页)编程,输出1000以内的所有同构数。 所谓同构数是指一个数位于它的平方数的最右端。如5的平 方数是25,25的平方数是625,,所以5,25都是同构数。 Do I=1,1000 判定I是否为同构数 enddo 同构数分析: (1)1000以内的所有同构数,分三类:可能 是一位数、两位数、三位数(三分支结构)。 (2)先求平方数,再取最右端的一位数、两位数、三 位数,后判断
有循环变量DO结构的一般形式 表示:do n=1,100,1 nn: Do n=1,100,1 a= 2*n s=s+a
a= 2*n
s=s+a enddo
enddo nn
有循环变量DO结构的一般形式 [DO结构名]: DO, 循环变量I=初值e1,终值e2,步长值e3 循环体 END DO [DO结构名]

fortran循环结构及基本语句

fortran循环结构及基本语句

fortran循环结构及基本语句Fortran中的循环结构包括DO循环和DO WHILE循环。

基本语句包括赋值语句、条件语句和IO语句。

1.DO循环结构:DO循环结构用于重复执行一段代码块,语法如下:DO variable = start, end, step!代码块ENDDO在循环开始前,将变量初始化为start的值,然后执行代码块。

然后将变量增加step的值,并检查是否达到end的值,如果没有达到则继续执行代码块,直到达到end的值为止。

2.DOWHILE循环结构:DOWHILE循环结构用于在满足条件时重复执行一段代码块,语法如下:DO WHILE (condition)!代码块ENDDO在每次循环开始前,检查condition是否为真,如果为真则执行代码块,然后再次检查condition。

只有当condition为假时,循环才会结束。

3.赋值语句:赋值语句用于将一个值赋给一个变量,语法如下:variable = expression可以使用算术运算符和函数来计算expression的值,并将结果赋给变量。

4.条件语句:条件语句用于根据条件选择执行不同的代码块,常用的条件语句有IF语句和SELECTCASE语句。

-IF语句的语法如下:IF (condition) THEN!代码块1ELSE IF (condition) THEN!代码块2ELSE!代码块3ENDIF根据condition的值选择执行代码块1、代码块2或代码块3-SELECTCASE语句的语法如下:SELECT CASE (expression)CASE (value1)!代码块1CASE (value2)!代码块2CASEDEFAULT!代码块3ENDSELECT根据expression的值选择执行相应的代码块,如果没有匹配的值,则执行默认的代码块。

5.IO语句:IO语句用于输入和输出数据,常用的IO语句有WRITE和READ语句。

循环结构的Fortran程序设计幻灯片

循环结构的Fortran程序设计幻灯片

2021/5/15
9
四、do循环中的控制语句
在do循环中,为了使用的方便可以加入一些控制语句,此处介 绍2个这样的语句。 (1)exit语句 Exit的意思是退出,所以在do循环的循环体内加入exit将迫使 循环立即终止,即退出循环体,而继续执行循环结构以后的语 句。通常exit与if语句配合使用,即
end
3
说明:
(1)步长为1时,表达式e3可以省略。比如“do i=1,10,1”
与“do i=1,10”相同。
(2)循环变量与参数表达式数据类型不 一致时,其处理方法与赋值语句相同, 即先计算参数表达式、并把结果转换成 循环变量类型,然后进行处理。比如, “ do i=1.3,5.9,2.6” 相 当 于 “ do
Integer x Do x=1,10,1 Print*,x,log(x*1.0),sin(x*1.) End do End
2021/5/15
2
一、do循环的一般格式
do i= e1,e2,e3 (do语句)
循环体
(执行的操作)
end do
(结束语句)
其中:(1)i代表循环变量(可为整型或实型);
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
Prinቤተ መጻሕፍቲ ባይዱ*,m,’不是完数’
End if
end
2021/5/15
循环结构的Fortran程序设 计幻灯片

Fortran程序设计循环结构

Fortran程序设计循环结构
read *, n,x SUM=0.0 DO I=1,N term= 1.0 / I**2 SUM=SUM+term ENDDO PI=SQRT(SUM*6.0) END
循环变量的UM=0. I=1 DO WHILE(1./ I**2>=1E-6) SUM=SUM+1./I**2 I=I+1 ENDDO
例:求两个整数的最大公约数 (DO WHILE 结构程序见DIVISOR.F90) read *, m,n
do while (m/=n) do while (m>n) m=m-n end do
do while (n>m)
n=n-m end do end do print *, '最大公约数=',m
也称“循环变量”
行号
行号
循环终端语句:
循环终端语句为一般的执行语句。 F90 规 定 : 循 环 终 端 语 句 可 以 是 除 了 GOTO 、 块 IF 、 CASE 、 CYCLE 、 DO 、 ELSE 、 ELSE IF 、 END IF 、 END 、 END SELECT 、 EXIT 、 SELECT CASE 、 STOP 和RETURN语句以外的任一可执行语句,如打印语句、赋 值语句、输入语句、逻辑IF语句等都可以作为终端语句。 特殊的循环终端语句是: END DO(常用于无语句标号时 ) 和CONTINUE(常用于有语句标号时 )。END DO语句使老 的CONTINUE语句显得没有什么用处了,虽然F90的向下 兼容性使CONTINUE语句仍然可用,但新编写的程序应该 尽量使用以END DO结束的块DO构造
end
例:打印“九九表”,即 1×1=1
1×2=2
……

fortran程序设计第5章

fortran程序设计第5章

5.3.2 用块IF和GOTO语句实现当型循环
用块IF和GOTO语句来代替WHILE语句实现当型 循环.即用GOTO语句实现"返回"以形成循环,用 块IF语句实现"条件判断"以决定是否继续执行循环. 这种循环的形式可写为: 标号S1 IF (逻辑表达式) THEN 块1 GOTO S1 END IF
C OBTAIN THE BIT-REVERSE OF I PRINT *, 'NUMBER TO REVERSE:' READ *, I J=0 DO 10, K=1, 8 J=2*J+MOD(I, 2) I=I/2 10 CONTINUE PRINT *, 'REVERSE IS', J END
[例5.7]打印"九九乘法表"
DO 10, I=1, 9 DO 20, J=1, I K=I*J PRINT *, I, '*', J, '=', K CONTINUE PRINT *, ' ' CONTINUE END
20 10
[例5.8]百钱买百鸡问题
公元五世纪末,我国古代数学家张丘建在《算经》中提出 了"百鸡问题":"鸡翁一,值钱五;鸡母一,值钱三;鸡雏 三,值钱一.百钱买百鸡,问鸡翁,母,雏各几何?".意为: 公鸡每只5元,母鸡3元,小鸡一元三只.100元买100只鸡. 设X为公鸡数,Y为母鸡数,Z为小鸡数.根据题意: X+Y+Z=100 5X+3Y+Z/3=100 -》 15X+9Y+Z=300 3个未知数,2个方程式,是一个不定方程,它没有唯一解, 而有多组解.对这类问题无法用解析法解,只能将所有可能的X, Y,Z值一个一个地去试,看是否满足上面两个方程式,如满足 就是一组解.

FORTRAN90第5章循环

FORTRAN90第5章循环

Enddo
Print*,y end 课外练习:用DO WHILE 实现素数判定、求最大公 约数等算法。
5.6 隐含DO循环
隐含DO循环的形式为: (循环体,v=u1,u2,u3)
类似于:
DO V=u1,u2,u3 循环体 enddo
隐去DO关键字的
DO语句
READ *,(x,y,I=1,5) PRINT ‘(5I5)’,(I,I=1, 5)
次 次 次
应用:求最大值
例5-8: 有一批实数,用零作终止标记。请编写程序找出 这批数中的最大值,并求出该最大值是这批数中的第几个 数(若最大值数多次出现,只打印出第一个位置)。
分析:
引入变量BMAX——存放最大值 IMAX——存放最大值序号 1、赋初值:输入第一个数,假设是最大值 2、重复:输入其它数,与最大值比较, 遇零终止。
FORTRAN语言及程序设计
计算机中心 2006.4
例题精讲

用梯形法计算定积分
sin( x ) dx
分析:等分、以直代曲、累加求和
y
b
a
x a b
复习循环的定义:
重复地执行某一段程序的情形,称为循环。
……
循环均由Do 结构表示
★ DO结构 共有哪三种 形式?适用 范围?
用于已知循环 次数
X,Y的值为

DO I=1,3
READ’(2I3)’,X,Y
ENDDO
必须输入三 行 1 2 3 4 5 6
2、隐含do循环只能用于输入、输出语句和数组构 造器中
错例
S=0 S=S+(I,I=1,3)
几种常见的隐含DO循环的形式
1.按指定步长读写。例如

fortran语言第五章

fortran语言第五章

(3) 循环次数的计算 计算公式:r = INT((e1-e2+e3)/e3) 例如:i:DO 20 I=2,20,2 r = (20-2+2)/2=10 (循环10次) 又如:ii:DO 10 A = 0.5,6.6,1.3
r = INT ((6.6-0.5+1.3)/1.3)=INT(7.4/1.3) = 5(循环5次) 如果将A改为整型变量I,即 DO 10 I = 0.5,6.6,1.3 首先 r = INT((6-0+1)/1)=7 DO 10 I = 0,6,1
n
例5.5 1+2+3+…+100 在以前我们曾用当型循环写过此程序,即: INTEGER S S=0 N=1 IF(N. LE. 100) THEN S = S+N N = N+I GOTO 5 ENDIF WRITE(*,*) ‘ S’,S END
DO 5 N=1,100,1 5 S = S+N DO 循环结构






据此写出程序:INTEGER A, B, C, N A=0 B=1 WRITE (∗, ∗) A, B N=3 C=A+B 10 WRITE (∗, ∗) C A=B B=C C=A+B IF (NOT.(N.GT.20)) GOTO 10 N=N+1 IF (N.LE.20) GOTO 10 END
n
程序流程图:
开始 读入N I=1, T=0 I≤N Y A=1/I T=T+A I=I+1 输出T 结束 从键盘输入项数, 从键盘输入项数,由用户控制 存放每一次累加以后的和 N
程序执行时各值变化情况(假如N=20)
第几次 循环 1 2 3 T原值 0 1
1 1+ 2 1 1 1+ +L+ 2 18

Fortran讲义 第五章

Fortran讲义 第五章
可分配数组(allocatable array)
数组指针
动态数组
数组的声 明
exam_5_1
用类型声明语句
<类型声明符>[::]<数组声明表> <数组声明表>→<数组名>(<维说明表>)[=<数组初值>] {,<数组名>(<维说明表>)[=<数组初值>]} <维说明表>→<维说明符>{,<维说明符>} <维说明符>→[<下界>:]<上界> 下界缺省为1 <数组初值>→(/<初值1>,…,<初值n>/)| [<初值1>,…,<初值n>] n为数组的大小
数组元素的存储顺序
按列存储(Column major)
的描 述
数组的引用
数组名 数组元素 数组片段
三元下标:a(1:2, -1:3:2) 向量下标:a(2, b) b=(/-1, 1, 3/)
a(1:3, -1:4)
a a(1,3)
数组越界:debug状态检查,release状态不检查
Fortran数 组的种类
显式形状数组(explicit-shape)
静态显式 自动数组(automatic array) 可调数组(adjustable array) 静态数组
假定形状数组(assumed-shape)
假定大小数组(assumed-size)
延迟形状数组(deferred-shape)
用dimension语句:dimension <数组声明表> 用代dimension属性的类型声明语句

fortran第5章(循环)

fortran第5章(循环)

END DO(常用于无语句标号时)
CONTINUE(常用于有语句标号时) 新编写的程序应该尽量使用以END DO结束的块DO构造。
第 9页
例1. 一球从100米高度自由落下,每次落地后反 跳回原高度的一半,再落下,求它在第20次着地 时,共经过了多少米?
90 77
H=100 S=0 DO I=1,20
ex=1.0 t=1.0
DO I=1,N
t=t*x/i ex=ex+t
END DO
第19页
计算多项式y=0.6+3.5x+5.0x2+0.3x3+5.1x4 +2.1x5+x6 例: 在x=1.3时的值
REAL A(6),F DATA A/ 0.6,3.5, 5.0,0.3,5.1,2.1,1.0/ DATA N,X/6,1.3/ TOLY=A(1) F=1.0 DO 10 K=2, N F=F*X 10 TOLY=TOLY+A(K)*F END
DO [[标号][,]] 循环变量=初值式E1 ,终值式E2[,增量式E3]
例如:
DO 10 N=1,100,1
T=N/2.0
10 PRINT *,T
第 3页
说明:
循环变量的初值、终值和步长可以为正或负。初值、终值 可以为零。但步长不应为 0 ,否则循环变量的值永远不会 超过终值,从而陷入死循环。 例:对于D0 k=-1,-3,-1 其 循环次数=INT((-3+1-1)/(-1))=3次 k按序分别取值为:-1,-2,-3。 如果循环变量的类型和初值、终值和步长的类型不一致, 则按赋值的规则处理,即需先将初值、终值和步长的类型 转化成循环变量的类型,然后进行处理。
终止循环的条件:循环变量的值超过终值。

第五章 fortran循环结构

第五章  fortran循环结构

例:输出所输入的全部正数, 直到输入负数或零,程序结束。
REAL :: P=1.0 DO WHILE (P>0) PRINT *,P READ *,P END DO END
DO WHILE循环的执行过程
满足循 环条件?
5.8 输入一个整数,输出其位数。
输入的整数存入变量N中,用变量K来统计N的位 数。程序如下: INTEGER :: N,K=0 READ *,N DO WHILE (N>0) K=K+1 N=N/10 END DO PRINT *,'K=',K END
(3) 退出循环后循环变量的值与最后一次循 环时循环变量的值不同,前者比后者多 一个步长。例如: DO K=1,10,2 L=K END DO PRINT *,K,L END 程序的执行结果为: 11 9
例5.1 求
x2 x3 xn y =1+ x + + +L + 2! 3! n!
累加项F的递推式为: Fi=Fi-1*X/I 可用赋值语句F=F*X/I来实现。 READ *,X,N F=1.0 Y=1.0 DO I=1,N F=F*X/I Y=Y+F END DO PRINT *,’Y=’,Y END
循 行 过 程
5
. . DO 1 环 执 2
i+e3→i r-1→r END DO下面的语句
说明:
(1) 循环体指的是DO语句与END DO语句之
间的语句,因此循环体并不包括DO语 句,执行程序时DO语句也只执行一次。 如果循环参数表达式e1、e2、e3中含 有变量,那么即便在循环体中改变变量 的值,循环参数并不改变。 (2) 在循环体内给循环变量赋值,是不允许 的。

第5章 循环 fortran

第5章 循环 fortran

例5-2 使用循环来计算2+4+6+8+10 PROGRAM EX0502 IMPLICIT NONE INTEGER, PARAMETER :: LIMIT=10 ! 计数器的上限 INTEGER COUNTER ! 计数器 INTEGER :: ANS = 0 ! 拿来累加使用 DO COUNTER=2, LIMIT, 2 ANS = ANS + COUNTER END DO WRITE(*,*) ANS ! STOP END

1.确定性循环
(1)变量用来控制循环次数,一般称为循环变量; (2)表达式1 代表循环变量的初值; (3)表达式2 代表循环变量的终值; (4)表达式3 代表循环变量的步长,缺省步长为1。 (5)循环次数的计算按下面公式:
MAX ((表达式2 - 表达式1+ 表达式 3)/表达式3,0)

例5-3 DO 循环的嵌套使用
PROGRAM EX0503 IMPLICIT NONE INTEGER I, J DO I=1, 3 DO J=1, 3 WRITE ( *, "(I2, I2)" ) I, END DO WRITE (*,*) "ANOTHER CYCLE" END DO END 显式循环(DO END DO)

第三节 循环结构
署名的循环
例5-8
功能是循环时能明确地知道END DO这个描述的位置是否正确 。
PROGRAM EX0508 IMPLICIT NONE INTEGER :: I, J OUTER: DO I=1, 3 ! 循环取名为OUTTER INNER: DO J=1, 3 ! 循环取名为INNER WRITE ( *, " ('( ',I2,' ,' ,I2, ') ') " ) I,J END DO INNER ! 结束INNER这个循环 END DO OUTER ! 结束OUTTER这个循环 !STOP END

FORTRAN知识点总结

FORTRAN知识点总结

F O R T R A N第2章FORTRAN90基础知识:程序单元的概念:fortran90程序是一种分块形式的程序,整个程序由若干程序单元块组成。

每个程序只有一个主程序单元。

各单元体的程序体形式上相同。

程序单元可以是主程序、子程序(外部过程或内部过程)、模块MODULE (供其他程序单元引用即把该程序单元内的全部语句复制到程序单元中)或块数据程序单元BLOCK 。

语言元素:指在程序设计中用到的基本成分,如字符集、常量、变量、记号(标号、关键字、名字、常数、运算符和定界符)以及其他的基本结构等。

字符集:英文字母、阿拉伯数字、下划线、21个特殊字符($和?没有规定用法)。

数据结构:整型INTEGER (34-2下划线后面是种别参数),n 位字长的计算机的数据表示范围一般为12~211-+---n n ,种别参数由内在询问函数KIND 送回,种别值提供的最小范围由内在函数SELECTED-INT-KIND 送回,表示十进制幂的范围由内在函数RANGE 送回;实型REAL ,小数形式和指数形式;复型COMPLEX (种别类型参数值取实部与虚部中较大者);字符型CHARACTER,由一对单撇号或双撇号之间的字符序列组成;逻辑型LOGICAL。

派生数据类型TYPE;数组INTEGER,DIMENSION(1,50)::A,可直接对数组元素进行运算如3*A,SQRT(A);字符子串,在字符串CHARACTER(LEN=80)::ROW中,ROW(1:3)就表示字符串ROW中第1到第3个元素组成的子串。

变量名的命名规则:不能超过31个字符;组成成分是字母、数字、下划线;第一个字符必须是字母。

第3章基本语句:类型说明语句:类型说明(种别说明),属性说明::变量名表尽量避免把两个实数作相等或不相等的比较。

淘汰隐式说明IMPLICIT NONE种别说明:种别参数即对可移植数据精度和范围进行选择的机制KIND(X) 返回变元X的种别参数值SELECTED-REAL-KIND(n,m) 产生一个种别值,它表示某一精度和范围。

fortran do while循环语句

fortran do while循环语句

fortran do while循环语句Fortran是一种编程语言,它早在1950年代末就被开发出来,用于数值计算和科学计算。

Fortran的全称为Formula Translation,意为公式翻译,它是一种高级语言,用于解决科学和工程问题,尤其是计算密集型问题。

Fortran的语法简单,易学易用,同时也具有高效、可移植性和可靠性等特点,成为了科学计算的标准之一。

在Fortran中,循环语句是一种常用的编程结构之一,Fortran do while循环语句也是其中之一。

Fortran do while循环语句的语法结构如下:``` do while (condition) Statement block end do ```其中,condition是一个逻辑表达式,可以是一个变量或常量的比较结果、逻辑表达式结果,也可以是使用逻辑运算符和比较运算符组合的结果。

当condition为真时,statement block部分的语句将被执行,否则跳过循环。

循环结束后,控制权回到do while语句的开头,重新判断condition是否为真,如果为真,继续执行循环,否则退出循环。

Fortran do while循环语句中的statement block部分可以包含多行语句,可以是任何有效的Fortran语句,例如赋值语句、条件语句、输入输出语句、函数调用等等。

下面是一个Fortran do while循环语句的示例程序:``` program dowhile_example implicitnone ! 显示声明所有变量 integer :: i=0, j=0 do while (i .lt. 10) ! 当i小于10时执行循环i = i + 1 ! 表示i的值每次循环增加1 j = j + i ! 表示j的值等于i的和 end do print*, "j的值:", j ! 输出j的值 end programdowhile_example ```在这个示例程序中,我们定义了两个整型变量i和j,然后使用do while循环语句对i进行循环,只要i小于10就一直执行循环,每次循环i的值都会加1,同时j的值也会增加i的值,最终输出j的值。

fortran基础知识1----循环

fortran基础知识1----循环

fortran基础知识1----循环do循环结构使得⼀个语句或⼀系列语句,以进⾏迭代,当⼀个给定的条件为真。

语法do循环的⼀般形式是:do var = start, stop [,step]! statement(s)…end do这⾥,循环变量var应该是⼀个整数start 是初始值stop 是最终值步骤step是递增,如果此被省略,则变量var以单位增加跳出循环Fortran中跳出循环的两个命令为exit和cycle,exit表⽰跳出离命令最近的循环,cycle表⽰结束此次循环并开始下⼀次循环。

pause:程序执⾏到pause 时,会暂停执⾏,直到⽤户按下Enter键才会继续执⾏。

continue这个命令没有实际的⽤途,它的功能就是继续向下执⾏程序,相当于python中的pass。

stop⽤来结束程序执⾏。

cycle命令可由略过循环的程序模块中,相当于python和C中的continue,直接跳过后⾯的所有代码,然后开始下⼀次循环。

exit的功能是可以直接跳出⼀个正在进⾏的循环,不论是do 循环还是do while 循环,相当于python和C中的break。

1 program sime23implicit none4 integer :: tn56 tn=27 print_tn : do8 print *, tn9 tn = tn+210if (tn>=200) exit print_tn11 end do print_tn12 pause1314 end1 program odd_num23implicit none4 integer :: num,num_odd5 print *, 'Input data number:'6 read *,num78 num_odd = 0910do11 num = num - 11213if (num<0) then14 exit15 elseif (mod(num,2)==0) then16 cycle17else18 num_odd = num_odd + 119 endif202122 print *, num23 enddo2425 print *, 'The number of odd number is',num_odd 2627 pause2829 end如果输⼊20,输出结果为:。

FORTRAN语言第5章(共8章)

FORTRAN语言第5章(共8章)

例5.1 求Fibonacci数列前30项之和。 Fibonacci数列的递推公式是: F0=0 F1=1 Fi=Fi-1+Fi-2
分析:设置两个变量来存放已求得的最后两项的 值:F2保存已求得的最后一项(即Fi-1),F1保 存前一项(即Fi-2)。这样,下一待求项就是F1 和F2之和,我们将它赋值给F,然后将原来的F2 赋值给F1,原来的F赋值给F2,又可以由F1和F2 推出一个新的F,如此可以一直推下去。 本例中,Fibonacci数列前30项之和是一个很大 的数,已经超过了类别参数为2的整数的取值范 围,只能采用类别参数为4整数。如果数超过类 别参数为4的整数取值范围,就只能采用实型数 据来处理。
例5.2 利用双精度按下面近似公式求
ln x

1 x
2
x 2
1
x3Biblioteka 13 24x
5

13 5 246

x
7

3
5
7
直到最后一项的绝对值小于10-15为止。 分析:首先找出累加项fn与fn-1的递推关系。不难推 出 f0 =x
f n= (2n - 1)(2n - 1) x (2n)(2n 1)
类别参数 1 2 4 字节数 1 2 4 取值范围 -1 2 8 ~ 1 2 7 -3 2 ,7 6 8 ~ 3 2 ,7 6 7 -2 ,1 4 7 ,4 8 3 ,6 4 8 ~ 2 ,1 4 7 ,4 8 3 ,6 4 7
在FORTRAN90中,还可以使用二进制、 八进制和十六进制整型常量,但它只能用 于DATA语句中。
例5.5 有一线段AB,A的坐标为(1,1),B的坐 标为(4.5,4.5),如图5.2所示。求AB的长度, 以及黄金分隔点C的坐标。黄金分割点在线段 的0.618处。

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

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

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
逻辑IF语句可作为DO循环的终端语 句,但其内嵌语句不能是上述控制语句!
DO 10 I = 1,50 K=I*1 PRINT *,I,K IF(K.GT.500) GOTO 100
9
10
继续语句(CONTINUE语句)
形式:
CONTINUE
DO 20 , I=1, 10 , 2 PRINT *, I 20 CONTINUE
统计平均成绩 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
4. 正常出口&非正常出口;
12
DO 循环的嵌套(多重循环) 一个循环体内又完整的包含另一个循环结构

fortran循环结构及基本语句

fortran循环结构及基本语句
!示例程序一:输出奇数1,3,5,7,9 DO I=1,100,2
IF (I>=9) EXIT ENDDO END
!示例程序二:输出奇数1,3,5,7,9 I=1 DO WHILE (I<=100)
write(*,*)I IF (I>=9) EXIT I=I+2 ENDDO END
!示例程序三:输出奇数1,3,5,7,9 I=1 DO
100 R3=MOD(R1,R2) !求R1除以R2的余数 R1=R2;R2=R3 IF (R2/=0) GOTO 100
!或 IF (R2==0)THEN ! ELSE ! GOTO 100 ! ENDIF
gcd=R1;lcm=M*N/gcd WRITE(*,"(1X,I3,'和',I3,'的最大公约数为:',I3)")M,N,gcd WRITE(*,"(1X,I3,'和',I3,'的最小公倍数为:',I3)")M,N,lcm END
执行过程:
(1)按顺序依次执行循环体语句。
(2)循环执行过程中,若满足循环结束条件,则执行EXIT语句退出循环。
(3)无条件转(1)。
<特殊DO循环语句>→[<名字>:] DO
<语句1>
<语句2> 循环体
……
<语句n>
ENDDO [<名字>] 说PI明rNoT:gErGaEmR M,N,R1,R2,R3,gcd,lcm ①Wr特it殊e(D*O,循*)环'输语入句两必个须自与然EX数IT:语'句配合使用。 ②R使EA用D(特*,殊*)DMO,循N 环语句可使循环变得短小、简洁、清晰。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。


INTEGER X DO X=1.2,5.6,2.4 PRINT *,X END DO END 程序执行后的输出结果为: 1 3 5 如果循环变量的步长为0,程序在编译和连接时 都没有问题,但在执行过程中求循环执行次数时 将出现语法错,即进行了除零运算。这是应当避 免的。
计算e1、e2、e3的值 e1→i 计算循环次数r r=0? N 执行循环体 Y
5.1.1 DO循环一般格式
DO i=e1,e2[,e3] …(循环体) END DO 其中i代表循环变量,它可以是整型或实型 变量。e1、e2、e3称为循环参数表达式, 分别表示循环变量的初值、终值和步长。 循环体是在循环过程中被重复执行的语 句组。
例 求5!
PROGRAM LOOP INTEGER P,K P=1 DO K=5,1,-1 P=P*K END DO PRINT *,P END
2. CYCLE语句Fra bibliotekCYCLE语句用来结束本次循环,即跳过循 环体中尚未执行的语句。在循环结构中, CYCLE语句将使控制直接转向循环条件 测试部分,从而决定是否继续执行循环。 CYCLE语句和EXIT语句的区别在于: CYCLE语句只结束本次循环,而不是终 止整个循环的执行。EXIT语句则是结束 所在循环,跳出所在循环体。
例5.13 已知 F 计算M的值。
ij
= Xi2 + Yj2
Si = ∑Fij
j =1
10
M = ∏Si
i=1
5
Xi = 2,4,6,8,10 Yj = 0.1,0.2,0.3,LL,1.0
分析:该问题要求对5个X值,10个Y值,计算出 50个F值。然后每10个F相加得到一个S值,共得 到5个S值。最后这5个S相乘,得到一个M值。可 以用一个二重循环来计算和输出各值。 每个S值是由10个F值累加得到的。累加前S要 清0。M是由5个S值累乘得到的,累乘前M应置1。 X和Y都是有规律的值,可以由循环变量I,J得到。
分析下面的程序:
INTEGER X,Y,Z,K X=1 Y=7 Z=2 DO K=X,Y,Z+1 X=2 Y=Y+X Z=Z*K PRINT *, K ,X,Y,Z END DO END 程序的执行结果为: 1 2 9 4 2 11 7 2 13 2 8 56

INTEGER K DO K=1,5,2 K=K+1 PRINT *,K END DO END 编译时将给出错误信息: error FOR3598: assignment to DO variable K detected between K and =
程序2:用DO WHILE循环实现 IMPLICIT NONE INTEGER M,I,J READ *,M I=2 J=SQRT(REAL(M)) DO WHILE(I<=J.AND.MOD(M,I)/=0) I=I+1 END DO IF (I>J.AND.M>1) THEN PRINT *,M,’ is a prime number’ ELSE PRINT *,m,’ is not prime number’ END IF END
例5.2 一个整数的因子(不包括该数本身)之和等 于它本身,则称该数为完数。例如6的因子有 1,2,3,且1+2+3=6,因此6是完数。输入一个整 数,判断它是否完数
根据完数的定义,先求整数的因子之和,然后判断该数 本身是否等于因子之和,若是则为完数。
INTEGER M,SUM,I READ *,M SUM=0 DO I=1,M/2 !该循环求因子之和 IF (MOD(M,I)==0) SUM=SUM+I ENDDO IF (M==SUM) THEN PRINT *,M,'是完数' ELSE PRINT *,M,'不是完数' ENDIF END
例5.7 求1~100之间的全部奇数之和。
INTEGER :: X=0,Y=0 DO X=X+1 IF (MOD(X,2)==0) THEN CYCLE ELSE IF (X>100) THEN EXIT ELSE Y=Y+X END IF END DO PRINT *,Y END
5.2 用DO WHILE语句实现循环
说明
(1)当循环变量变化的步长为1时,表达式e3可以 省略。即DO K=1,10,1与DO K=1,10等价。 (2)如果循环变量和循环参数表达式的类型不一致, 其处理办法与赋值语句一样,先将表达式的最 后结果转换成循环变量的类型,然后再进行处 理。 (3) DO循环的执行次数 r=MAX(INT((e2-e1+e3)/e3) ,0)。
5.1.3 与循环有关的控制语句
1.EXIT语句
在循环体内使用EXIT语句,将迫使所在循 环立即终止,即跳出所在循环体,而继续 执行循环结构后面的语句。通常将EXIT语 句与IF语句配合使用,即在循环体中使用 语句: IF (e) EXIT
例5.6 求两个整数a与b的最大 公约数和最小公倍数。
分析:根据例1.7介绍的算法,找出a与b中 较小的一个,则最大公约数必在1与最小整 数的范围内。使用DO语句,循环变量i从较 小整数变化到1。一旦循环控制变量i同时 整除a与b,则i就是最大公约数,然后使用 EXIT语句强制退出循环。求出最大公约数 后,直接应用最小公倍数和最大公约数之 间的关系求出最小公倍数。
INTEGER A,B,GCD,LCM,T PRINT *,'请输入两个自然数' READ *,A,B IF (A>B) THEN T=A;A=B;B=T END IF DO T=A,1,-1 IF (MOD(A,T)==0.AND.MOD(B,T)==0) THEN PRINT *,'GCD=',T EXIT END IF END DO PRINT *,'LCM=',A*B/T END
设待求项为F,待求项前面的第1项为F1,待求项前面的 第2项为F2。首先根据F1和F2推出F,再将F1作为F2, F作为f1,为求下一项作准备。如此一直递推下去。具 体过程如下: 1 1 2 3 5 第一次 F2 + F1 → F ↓ ↓ 第二次 F2 + F1 → F ↓ ↓ 第三次 F2 +F1 → F
程序3:用DO循环和逻辑IF语句的嵌套实现。 IMPLICIT NONE INTEGER M,I,J READ *,M I=2 J=SQRT(REAL(M)) DO IF (MOD(M,I)==0.OR.I>J) EXIT I=I+1 END DO IF (I>J.AND.M>1) THEN PRINT *,M,’ is a prime number’ ELSE PRINT *,m,’ is not prime number’ END IF END
循 行 过 程
5
. . DO 1 环 执 2
i+e3→i r-1→r END DO下面的语句
说明:
(1) 循环体指的是DO语句与END DO语句之
间的语句,因此循环体并不包括DO语 句,执行程序时DO语句也只执行一次。 如果循环参数表达式e1、e2、e3中含 有变量,那么即便在循环体中改变变量 的值,循环参数并不改变。 (2) 在循环体内给循环变量赋值,是不允许 的。
第五章 循环结构程序设计
DO语句 DO WHILE语句 循环的嵌套 循环结构的程序设计方法
循环结构
循环结构的基本思想是重复,即利用计 算机运算速度快以及能进行逻辑控制的特 性,重复执行某些语句,以完成大量的计 算要求。
5.1 用DO语句实现循环
例如,当X取1,2,3,…,10时,分别计算sinx 和cosx的值。 INTEGER X DO X=1,10,1 PRINT *,X,SIN(X*1.0),COS(X*1.0) END DO END
5.3 几种循环组织方式的比较
实现循环结构的三种语句,它们各具特点。 一般而言,事先能确定循环次数的循环问 题用DO循环,而事先不能确定循环次数的 循环问题用DO WHILE循环。但这并不是 绝对的,很多情况下它们是可以相互代替 的。
例5.11 输入一个整数m,判断是否素数。
程序1:用DO循环实现。 IMPLICIT NONE INTEGER M,I,J READ *,M J=SQRT(REAL(M)) DO I=2,J IF (MOD(M,I)==0) EXIT END DO IF (I>J.AND.M>1) THEN PRINT *,M,’ is a prime number’ ELSE PRINT *,m,’ is not prime number’ END IF END
例5.3 Fibonacci数列定义如下: F1=1 F2=1 Fn=Fn-1+Fn-2 (n>2) 求Fibonacci数列的前30项。
例5.4 所谓“水仙花数”是指一个三位整数,其各位数字 立方和等于该数本身。例如,153就是一个水仙花数。输 出全部“水仙花数”。
在[100,999]范围内,对所有整数逐一验证 是否符合的条件,输出符合条件的数。这 种方法称为穷举法。
5.4 循环的嵌套
如果一个循环结构的循环体又包括一个循 环结构,就称为循环的嵌套,或称为多重 循环结构。 在设计多重循环时,要特别注意内、外循 环之间的关系,以及各语句放置的位置, 不要搞错。
例5.12 求[100,1000]以内的全部素数。 (1) 判断一个数是否素数。
(2) 利用穷举法将判断一个数是否素数的程序段,对指定范围内的 每一个数都执行一遍,即可求出某个范围内的全部素数。 LOGICAL FLAG DO M=101,1000,2 FLAG=.TRUE. I=2 J=SQRT(REAL(M)) DO WHILE(I<=J.AND.FLAG) IF (MOD(M,I)==0) FLAG=.FALSE. I=I+1 END DO IF (FLAG) THEN PRINT *,M,’ is a prime number’ END IF END DO END
相关文档
最新文档