FORTRAN90第6章子程序

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