FORTRAN90第6章子程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Subroutien S(m,n,k,l) Implicit None
Program main Implicit none Integer::M,N,K,L Read*,M,N
Integer::m,n,k,l
K=m+n L=m-n
CALL S(M,N,K,L)
PRINT*,K,L
End
所有的输入、输出
1.没有RESULT关键字。 2、虚元:负责子程序的全部输入和全部输出 3、无虚元时:SUBROUTINT 子程序名 或 SUBROUTINT 子程序名() 4、函数子程序的调用是表达式中。 而子例子程序必须通过CALL语句来调用。 CALL 子程序名(实元表)
例子程序求K=M+N,L=M-N 主程序输入2,3调用子程序求2+3,2-3的值。
END
调用的执行过程
1、计算实元值(作为输出的可预先无值)
2、虚实按地址结合:虚元按顺序借用实元存储单元 3、运行至子程序的第一句,直至遇子程序的END 语句返回到主调程序: ①运行返回至CALL语句的下一个语句 ②虚实脱离结合,但子程序运行时造成的实元 值的改变将保留。
阅读程序:画虚实结合表
INTEGER::X,Y CALL SUB(X,X,Y) CALL SUB(X,Y,Y) SUBROUTINE SUB(X,Y,Z) INTEGER::X,Y,Z
……
READ*,A,B D=F(A,B,c)
PRINT*,C,D
END
子程序END语句写法
END [FUNCTION [函数名]]
子程序END语句功能
1、函数单位的结束标志 2、将控制返回到主调程序。
函数单位定义语句的写法
[RECURSIVE]FUNCTION 函数名(虚元表)RESULT(结果名)
§6.2外部函数子程序
外部函数子程序的结构
单位定义语句 说明部分 程序体:具体计算 END语句
PROGRAM NAIN
两单位相互独立编译
必须进行数据的传递
FUNCTION F(X,Y,Z)RESULT(F_RESULT) IMPLICIT NONE REAL::X,Y,z,F_RESULT F_RESULT=X+Y Z=X-Y END
END
不能省略说明 两单位独立编译
注意:虚元名任意,但一般与实元一致。 检查调用原则,程序体编写规则。
例2.计算y=f(x)+g(x)值。
其中
f(x)=x+sin30° x+1,f(x)>0 g( x) = 0, f(x)=0 x-1, f(x)<0 要求用外部函数求g(x)的值。
PROGRAM MAIN IMPLICIT NONE REAL::X,Y,F,G,GF READ*,X F=X+SIN(30*3.1415926/180) G=GF(X,F) Y=F+G G,GF不能同名 PRINT*,Y END
FORTRAN90程序设计
计算机中心 2006.3
Visual Fortran 90 程序设计
§6.1概述 §6.2 函数子程序 §6.3 子例子程序 §6.4 虚实结合 §6.6 模块 §6.7 递归过程 §6.8 其他部分 §6.9 程序举例
§6.5 子程序的嵌套调用
§6.1 概述
主程序的结构:
Program main Implicit none Integer::M,N,K,L,F Read*,M,N K=F(M,N,L) PRINT*,K,L END
FUNCTION F(M,N,L)RESULT(F_RESULT) IMPLICIT NONE INTEGER::M,N,L,F_RESULT F_RESULT=M*N L=M-N
I=1
X=3*I;Y=2*I;Z=X+Y PRINT*,X,Y,Z
END
注意:一个变量只有一 个存储单元
按顺序结合,不是按名 结合
END
1、函数子程序的第一行(注释行除外)。
3 、函数名为全局名:作用域为整个程序,不与 已有的全局名同名。 各独立程序单位的名字为全局名
2 、如果函数是递归的,则应以 RECURSIVE 开头。
4、主调程序与被调程序 两个单位之间的数据传递
①结果名:子程序的一个输出
函数值返回给调用式
一般写法:函数名_RESULT,用于保存一个计算结果,称为 函数值。且结果名有类型,必须在子程序说明部分说明类型。
e e Sinh (x ) 2
x
x
x x x e 1 x ....... 2 ! 3 ! ! n 0n
x
2
3
n
!主程序如下: Program main1 Real:: MyExp,y,x
!函数子程序 Function MyExp(x) result (Exp_res) Real::Exp_res,x,s,T integer::N N=1; T=1; S=1 do T=T*X/N IF(ABS(T)<=1E-5)EXIT S=S+T;N=N+1 end do Exp_res=S END FUNCTION
F_RESULT=X+Y
Z=X-Y END
函数子程序的调用
1、调用式是表达式, 调用结束后调用式得到函数值。 2、常见形式: ①Y=函数名(实元表) ②PRINT*,函数名(实元表)
③IF(函数名(实元表))……
注意:实元与虚元一般必须在个数、次序、类型上保 持一致;但实元与虚元名字可以不同。
例1:编写子程序求K=M*N,L=M-N,主程序输入 2,3,调用子程序,计算2*3及2-3。
引入子程序的目的: 模块化设计
单位定义 说明部分 用子程序完成 子程序 用子程序完成 用子程序完成
输入
计算或处理 输出 END
所有功能都在主 子程序 程序单位内完成
源程序的结构 1、一个Fortran90程序主程序单元个数:1个 2、子程序单元:0-n个 子程序单元被主程序单元或被其它子程序单 元调用,甚至可以递归调用(调用本身)
f_RESULT=X+Y
END
注意:一个变量只有 一个存储单元 按顺序结合,不是按 名结合
2、虚元为变量,实元为常量、表达式:
开辟临时单元存放常量或表达式的值
REAL::MN,X,S X=3.0
PRINT*,S(X,MN(X)),X
END FUNCTION S(A,C)RESULT( S_RESULT ) REAL::A,S,S_RESULT A=A+1;B=A**A S_RESULT=B-C END FUNCTION S FUNCTION MN(X)RESULT(MN_RESULT) MN_RESULT=3.0*X END FUNCTION MN
Βιβλιοθήκη Baidu……
READ*,A,B D=F(A,B,c)
PRINT*,C,D
END
5、虚元的含义:编写子程序时没有具体值(调用时或 调用结束后才获得数值),因此只是一个符号,表示输 入、输出,名字可随便用户取。 6、虚元可以是变量名、数组名、过程名、指针等。
7、虚元的可选属性INTENT:
INTENT(IN):作为子程序的输入(不得再改变其值) INTENT(OUT):子程序的输出(对应的实元不能是表 达式) INTENT(INOUT):子程序的输入输出 例:REAL,INTENT(IN)::X,Y
247.0
4.0
6.3 外部子例行子程序
外部子例行子程序:用户定义,用于完成复杂 计算任务,返回一个或多个值,或用于其它数 据处理
外部子例行子程序的结构
[Recursive]Subroutine 子程序名(虚元表)
说明部分 程序体 End [Subroutine [子程序名]]
与函数子程序的区别
子程序程序体的写法
分为说明部分和执行部分。
两单位独立编译
1、说明部分应对程序体内一切变量、数组等实体 (包括虚元)作出说明,同时还要说明函数结果 变量名,但不可说明函数名。 2、执行部分中必须对函数结果名至少赋值一次。
FUNCTION F(X,Y,Z)RESULT(F_RESULT) IMPLICIT NONE REAL::X,Y,z,F_RESULT
FUNCTION GF(X,F)RESULT(GF_RESULT)
ELSE
GF_RESULT=0 ENDIF END
IMPLICIT NONE
REAL::X,F,GF_RESULT IF(F>0)THEN GF_RESULT=X+1 ELSEIF(F<0)THEN GF_RESULT=X-1
练习: 计算函数Sinh(x)的值,当ex的通项值小于等于1E-6 时停止。计算公式如下:
①运行权返回至调用点
②函数值返回给调用表达式 ③虚实脱离结合,但子程序运行时造成的实元值 的改变将保留。
子程序阅读技巧:画出虚实结合表
1、虚元为变量,实元为同类型的变量
INTEGER::X,Y,Z,f Y=f(X,X) PRINT*,Y Z=f(y,x) PRINT*,Z END FUNCTION f(X,Y)RESULT(f_RESULT) INTEGER::X,Y,f_RESULT,I I=1;X=3*I;Y=2*I
②虚元表:子程序的所有输入,及除函数值之 外的其他计算结果的输出。 由实元传递给对应 的虚元
虚元数据返回给对应的实元
FUNCTION F(X,Y,Z)RESULT(F_RESULT)
IMPLICIT NONE REAL::X,Y,z,F_RESULT
F_RESULT=X+Y
Z=X-Y END PROGRAM NAIN 主 子
最简单的源程序的结构
主程序: 单位定义 说明部分 子程序: 计算或处理
输入
调用子程序 输出 END
子程序分类
用于完成复杂的计算
1、函数子程序
分为内部函数子程序 外部函数子程序 2、子例行子程序 分为内部子例行子程序 外部子例行子程序
返回 一个或多个值
用于完成复杂计算 ,返回一个或多个 值,或用于其它数 据处理
Write(*,*) ‘Enter x:’
Read(*,*)x Y=(MyExp(x)-MyExp(-x)) /2.0 Write(*,*)Y END PROGRAM
两次调用
调用的执行过程
1、计算实元值(作为输出的可预先无值)
2、虚实按地址结合:虚元按顺序借用实元存储单元
3、运行权至子程序的第一句,直至遇子程序的END 语句返回到主调程序:
Program main Implicit none Integer::M,N,K,L Read*,M,N
Integer::m,n,k,l
K=m+n L=m-n
CALL S(M,N,K,L)
PRINT*,K,L
End
所有的输入、输出
1.没有RESULT关键字。 2、虚元:负责子程序的全部输入和全部输出 3、无虚元时:SUBROUTINT 子程序名 或 SUBROUTINT 子程序名() 4、函数子程序的调用是表达式中。 而子例子程序必须通过CALL语句来调用。 CALL 子程序名(实元表)
例子程序求K=M+N,L=M-N 主程序输入2,3调用子程序求2+3,2-3的值。
END
调用的执行过程
1、计算实元值(作为输出的可预先无值)
2、虚实按地址结合:虚元按顺序借用实元存储单元 3、运行至子程序的第一句,直至遇子程序的END 语句返回到主调程序: ①运行返回至CALL语句的下一个语句 ②虚实脱离结合,但子程序运行时造成的实元 值的改变将保留。
阅读程序:画虚实结合表
INTEGER::X,Y CALL SUB(X,X,Y) CALL SUB(X,Y,Y) SUBROUTINE SUB(X,Y,Z) INTEGER::X,Y,Z
……
READ*,A,B D=F(A,B,c)
PRINT*,C,D
END
子程序END语句写法
END [FUNCTION [函数名]]
子程序END语句功能
1、函数单位的结束标志 2、将控制返回到主调程序。
函数单位定义语句的写法
[RECURSIVE]FUNCTION 函数名(虚元表)RESULT(结果名)
§6.2外部函数子程序
外部函数子程序的结构
单位定义语句 说明部分 程序体:具体计算 END语句
PROGRAM NAIN
两单位相互独立编译
必须进行数据的传递
FUNCTION F(X,Y,Z)RESULT(F_RESULT) IMPLICIT NONE REAL::X,Y,z,F_RESULT F_RESULT=X+Y Z=X-Y END
END
不能省略说明 两单位独立编译
注意:虚元名任意,但一般与实元一致。 检查调用原则,程序体编写规则。
例2.计算y=f(x)+g(x)值。
其中
f(x)=x+sin30° x+1,f(x)>0 g( x) = 0, f(x)=0 x-1, f(x)<0 要求用外部函数求g(x)的值。
PROGRAM MAIN IMPLICIT NONE REAL::X,Y,F,G,GF READ*,X F=X+SIN(30*3.1415926/180) G=GF(X,F) Y=F+G G,GF不能同名 PRINT*,Y END
FORTRAN90程序设计
计算机中心 2006.3
Visual Fortran 90 程序设计
§6.1概述 §6.2 函数子程序 §6.3 子例子程序 §6.4 虚实结合 §6.6 模块 §6.7 递归过程 §6.8 其他部分 §6.9 程序举例
§6.5 子程序的嵌套调用
§6.1 概述
主程序的结构:
Program main Implicit none Integer::M,N,K,L,F Read*,M,N K=F(M,N,L) PRINT*,K,L END
FUNCTION F(M,N,L)RESULT(F_RESULT) IMPLICIT NONE INTEGER::M,N,L,F_RESULT F_RESULT=M*N L=M-N
I=1
X=3*I;Y=2*I;Z=X+Y PRINT*,X,Y,Z
END
注意:一个变量只有一 个存储单元
按顺序结合,不是按名 结合
END
1、函数子程序的第一行(注释行除外)。
3 、函数名为全局名:作用域为整个程序,不与 已有的全局名同名。 各独立程序单位的名字为全局名
2 、如果函数是递归的,则应以 RECURSIVE 开头。
4、主调程序与被调程序 两个单位之间的数据传递
①结果名:子程序的一个输出
函数值返回给调用式
一般写法:函数名_RESULT,用于保存一个计算结果,称为 函数值。且结果名有类型,必须在子程序说明部分说明类型。
e e Sinh (x ) 2
x
x
x x x e 1 x ....... 2 ! 3 ! ! n 0n
x
2
3
n
!主程序如下: Program main1 Real:: MyExp,y,x
!函数子程序 Function MyExp(x) result (Exp_res) Real::Exp_res,x,s,T integer::N N=1; T=1; S=1 do T=T*X/N IF(ABS(T)<=1E-5)EXIT S=S+T;N=N+1 end do Exp_res=S END FUNCTION
F_RESULT=X+Y
Z=X-Y END
函数子程序的调用
1、调用式是表达式, 调用结束后调用式得到函数值。 2、常见形式: ①Y=函数名(实元表) ②PRINT*,函数名(实元表)
③IF(函数名(实元表))……
注意:实元与虚元一般必须在个数、次序、类型上保 持一致;但实元与虚元名字可以不同。
例1:编写子程序求K=M*N,L=M-N,主程序输入 2,3,调用子程序,计算2*3及2-3。
引入子程序的目的: 模块化设计
单位定义 说明部分 用子程序完成 子程序 用子程序完成 用子程序完成
输入
计算或处理 输出 END
所有功能都在主 子程序 程序单位内完成
源程序的结构 1、一个Fortran90程序主程序单元个数:1个 2、子程序单元:0-n个 子程序单元被主程序单元或被其它子程序单 元调用,甚至可以递归调用(调用本身)
f_RESULT=X+Y
END
注意:一个变量只有 一个存储单元 按顺序结合,不是按 名结合
2、虚元为变量,实元为常量、表达式:
开辟临时单元存放常量或表达式的值
REAL::MN,X,S X=3.0
PRINT*,S(X,MN(X)),X
END FUNCTION S(A,C)RESULT( S_RESULT ) REAL::A,S,S_RESULT A=A+1;B=A**A S_RESULT=B-C END FUNCTION S FUNCTION MN(X)RESULT(MN_RESULT) MN_RESULT=3.0*X END FUNCTION MN
Βιβλιοθήκη Baidu……
READ*,A,B D=F(A,B,c)
PRINT*,C,D
END
5、虚元的含义:编写子程序时没有具体值(调用时或 调用结束后才获得数值),因此只是一个符号,表示输 入、输出,名字可随便用户取。 6、虚元可以是变量名、数组名、过程名、指针等。
7、虚元的可选属性INTENT:
INTENT(IN):作为子程序的输入(不得再改变其值) INTENT(OUT):子程序的输出(对应的实元不能是表 达式) INTENT(INOUT):子程序的输入输出 例:REAL,INTENT(IN)::X,Y
247.0
4.0
6.3 外部子例行子程序
外部子例行子程序:用户定义,用于完成复杂 计算任务,返回一个或多个值,或用于其它数 据处理
外部子例行子程序的结构
[Recursive]Subroutine 子程序名(虚元表)
说明部分 程序体 End [Subroutine [子程序名]]
与函数子程序的区别
子程序程序体的写法
分为说明部分和执行部分。
两单位独立编译
1、说明部分应对程序体内一切变量、数组等实体 (包括虚元)作出说明,同时还要说明函数结果 变量名,但不可说明函数名。 2、执行部分中必须对函数结果名至少赋值一次。
FUNCTION F(X,Y,Z)RESULT(F_RESULT) IMPLICIT NONE REAL::X,Y,z,F_RESULT
FUNCTION GF(X,F)RESULT(GF_RESULT)
ELSE
GF_RESULT=0 ENDIF END
IMPLICIT NONE
REAL::X,F,GF_RESULT IF(F>0)THEN GF_RESULT=X+1 ELSEIF(F<0)THEN GF_RESULT=X-1
练习: 计算函数Sinh(x)的值,当ex的通项值小于等于1E-6 时停止。计算公式如下:
①运行权返回至调用点
②函数值返回给调用表达式 ③虚实脱离结合,但子程序运行时造成的实元值 的改变将保留。
子程序阅读技巧:画出虚实结合表
1、虚元为变量,实元为同类型的变量
INTEGER::X,Y,Z,f Y=f(X,X) PRINT*,Y Z=f(y,x) PRINT*,Z END FUNCTION f(X,Y)RESULT(f_RESULT) INTEGER::X,Y,f_RESULT,I I=1;X=3*I;Y=2*I
②虚元表:子程序的所有输入,及除函数值之 外的其他计算结果的输出。 由实元传递给对应 的虚元
虚元数据返回给对应的实元
FUNCTION F(X,Y,Z)RESULT(F_RESULT)
IMPLICIT NONE REAL::X,Y,z,F_RESULT
F_RESULT=X+Y
Z=X-Y END PROGRAM NAIN 主 子
最简单的源程序的结构
主程序: 单位定义 说明部分 子程序: 计算或处理
输入
调用子程序 输出 END
子程序分类
用于完成复杂的计算
1、函数子程序
分为内部函数子程序 外部函数子程序 2、子例行子程序 分为内部子例行子程序 外部子例行子程序
返回 一个或多个值
用于完成复杂计算 ,返回一个或多个 值,或用于其它数 据处理
Write(*,*) ‘Enter x:’
Read(*,*)x Y=(MyExp(x)-MyExp(-x)) /2.0 Write(*,*)Y END PROGRAM
两次调用
调用的执行过程
1、计算实元值(作为输出的可预先无值)
2、虚实按地址结合:虚元按顺序借用实元存储单元
3、运行权至子程序的第一句,直至遇子程序的END 语句返回到主调程序: