子程序的定义及使用

上传人:宝路 文档编号:47919128 上传时间:2018-07-06 格式:PPT 页数:31 大小:334.32KB
返回 下载 相关 举报
子程序的定义及使用_第1页
第1页 / 共31页
子程序的定义及使用_第2页
第2页 / 共31页
子程序的定义及使用_第3页
第3页 / 共31页
子程序的定义及使用_第4页
第4页 / 共31页
子程序的定义及使用_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《子程序的定义及使用》由会员分享,可在线阅读,更多相关《子程序的定义及使用(31页珍藏版)》请在金锄头文库上搜索。

1、第九讲 子程序的定义及使用9.1 Fortran 子程序概述lFORTRAN 90子程序,也称过过程,划分为为两类类:函数和子例行程序。l函数是指产产生一个运算结结果且通过操作数调调用执执行的子程序。l子例行程序是指可产产生多个处处理结结果且通过过CALL语语句调调用执执行的子 程序。l每类类子程序又划分为标为标 准子程序和用户户自定义义子程序。l用户户自定义义子程序又划分为为内部子程序、外部子程序和模块块子程序 。lFORTRAN 90的子程序分类类FORTRAN 90 子程序子例行程序标准子例行程序用户自定义子例行程序内部子例行程序 外部子例行程序 模块子例行程序函数标准函数用户自定义函数

2、内部函数 外部函数 模块函数语句函数标准子程序内部子程序 外部子程序 模块子程序 标准子程序 内部子程序 外部子程序 模块子程序使用标准函数需要注意以下几点: l标准函数对变元的个数和类型有明确的规定和要求。要求有一个变元,如函数SIN(x);要求两个变元,如函数MOD(m,n);要求多个变元,如函数MAX(x1,x2,xn)。要求变元类型为整型,如函数MOD(m,n);,要求变元类型为实型,如SIND(x);要求变元类型为整型、实型、双精度、复型等多种类型,如ABS(x)。l标准函数的函数值只有一个,且有明确的类型规定。多数函数函数值类型与变元类型相同,如函数SQRT(9.0D0)=3.0D

3、0,类型都为双精度;也有函数函数值类型与变元类型不相同,如函数INT(8.5)=8,变元类型为实型,而函数值类型为整型。l对于“弧度”和“角度”单位,使用不同的三角函数。l函数变元必须写在函数名后括号内,变元可是常数、变量或表达式,少数标准函数变元要求变量,如LOG(v)lIMPLICIT语句不能改变一个标准函数的类型。9.2 语句函数在求解实际问题时,特别是在求解有关科学与工程数值 计算问题时,常常会遇到计算一些数学表达式,如:这些数学表达式在程序中多次出现,需要重复书写它们, 不但浪费了宝贵的时间和精力,而且也容易出错。任何数学 表达式实际上都可表示成一元、二元或多元函数关系,即 F(x1

4、,x2,xn),这些函数关系如果没有对应的标准函数,则 需要用户设法定义新的函数来实现它们。FORTRAN 90提供了语句函数定义功能来定义一些简单的 函数,用于实现有关的函数关系。用户自定义语句函数其使 用方法与标准函数相同,可以作为操作数在表达式中调用。一般形式为:F(x1,x2,xn)F为函数名,x1,x2,xn为虚拟变元(或称形式参数或哑元)。要求:不能重名,只能为普通变量名。类型可用隐含规则定义 ,也可用类型声明语句定义,但须放在该语句函数定义语句之 前。下面程序通过语句函数实现例9.2问题。 PROGRAM F72F(x1,x2,x3)=3.14159*(x1+x2/60.0+x3

5、/3600.0)/180.0A=F(36.0,43.0,27.0)B=F(15.0,24.0,0.0)C=F(8.0,16.0,54.0)S=COS(A)*2-4*SIN(B)*TAN(C)WRITE (*,*) A,B,C,SEND program调用一般形式为: 语句函数名() 说明:l同语句函数定义语句中的语句函数名相同。l为实在参数或实参,其个数、次序和类型应与定 义语句中形式参数一致。实在参数之间用逗号分隔。l实参可是常数、变量、数组元素、函数名、表达式。 当调用语句函数时,其执行过程如下:l首先计算实参表达式的值;l将实参值赋予对应的形参,即形实参结合l用被赋值的形参对语句函数定义

6、语句中的表达式进行求值运 算;l将运算后的表达式值转换为函数名类型,并将其按函数值返回 到调用位置。使用语句函数的一些规定: l一个语句函数只能在一行内定义。如果太长,可续行书写。l语句函数定义语句是非执行语句。l语句函数只有一个函数返回值,函数名与函数值符合赋值规 则。l定义语句函数,右端表达式中可调用已定义语句函数或标准函 数,但不能调用该语句函数自己,即不能递归调用。H(x1,x2)=x1*x1+x2*x2F(x1,x2)=SQRT(H(x1,x2)l语句函数的形式参数不允许为数组或下标变量或常量。DIMENSION A(10),B(2,3)F1(x,y)=x+A(1)+y-B(1,2)

7、 !表达式中可以引用数组元素F(C)=C+100l语句函数名属于局部变量,只能在定义它的程序单位中引用。l语句函数可无形参,称为无参函数,圆括号不能省略,即:F() 。 例9.1计算空间一点P(x,y,z)的方向弦,其计算公式如下:其中:、为点P到原点直线与坐标轴x、y、z的夹角。PROGRAM F7_1F(a,b,c,r)=rSQRT(a*a+b*b+c*c)WRITE(*,*) 输入 x,y,z:READ(*,*) x,y,zDAF(x,y,z,x)DBF(x,y,z,y)DGF(x,y,z,z)WRITE(*,*) DA,DB,DGEND program9.3 外部函数子程序l无法用一条

8、语句来定义的函数,可以用一个单独的 程序单位定义,它不属于调用函数语句所在的程序 单位,因此称之为外部函数。l是用户自定义的函数子程序。所在程序的其他程序 单位都可以调用它。 PROGRAM main INTEGER addWrite(*,*) add(5,3) END PROGRAM main FUNCTION add(m,n)INTEGER m,n,addadd=m+n END FUNCTION addFUNCTION add(m,n)INTEGER m,n,addadd=m+n END FUNCTION add PROGRAM main INTEGER addWrite(*,*) add

9、(5,3) END PROGRAM mainl外部函数只产生一个结果,由函数名返回。l外部函数定义一般格式: 类型说明 FUNCTION 函数名(形式参数表)说明语句部分执行语句部分END FUNCTION 函数名 例如:INTEGER FUNCTION add(m,n)INTEGER m,nadd=m+n END FUNCTION addFUNCTION add(m,n)INTEGER m,n,addadd=m+n END FUNCTION addl关键字FUNCTION前面可指定内部数据类型,如:INTEGER、 REAL、COMPLEX、CHARACTER或LOGICAL等。如果没指定,

10、则按I- N规则或类型声明语句声明类型。l称为哑元表;无形参时圆括号也不能省略。形参 可以是变量名、数组名或子程序名l函数体位于FUNCTION语句和END FUNCTION语句之间。l函数体有说明部分、执行部分。l当返回值只有一个时才能使用外部函数,并且外部函数名至 少被赋值一次。l调用格式要求同标准函数、语句函数。作为操作数用。l一般格式:F(a1,a2,an)F为函数名,ai为实在参数。 l实在参数可是表达式、普通变量、下标变量、数组名、内部 函数引用、外部函数引用以及外部函数名和子程序名等。l如果定义外部函数无形式参数,其引用形式为:F( )。l外部函数执行过程:n若实在参数为表达式,

11、则先对表达式求值。n实在参数与相应的形式参数结合,将实参值传递给对应形参 。n经过形实结合,形式参数获得了所需要的值,然后,立即执行 内部函数体。n在执行函数体的过程中,若遇到RETURN语句或END FUNCTION 语句,则控制返回到引用的地方,并代回所计算的函数值参 加表达式的计算。PROGRAM F971DIMENSION A(6),B(4)WRITE(*,*) 请输入A数组的6个元素和B数组的4个元素:READ(*,*)(A(I),I=1,6),(B(I),I=1,4)P5=pnx(5,A,2.5)P3=pnx(3,B,2.5)WRITE(*,100) 2.5,P5,2.5,P3 1

12、00 FORMAT(1X,P5(,F3.1,)=,F10.5,P3(,F3.1,)=,F10.5) END program输入数据:5.0,2.5,0.0,0.0,4.4,3.53.4,1.5,1.76,3.5输出结果:P5(2.5)= 600.43750 P3(2.5)= 70.400009.4 外部子程序lFORTRAN90提供标准子程序、语句函数、外部 子程序(外部函数、外部子例行程序)等。l外部子程序是一个独立的程序单元。95PROGRAM my_addINTEGER m,n,sm=4n=5call add(m,n,s)write(*,*) swrite(*,*) m END PROG

13、RAM my_addSUBROUTINE add(m,n,s)INTEGER m,n,ss=m+nm=m+1 END SUBROUTINE addl外部子例行程序,简称外部子程序,也称外部过程,是 独立的程序单元。l外部子例行程序可产生多个结果,由参数返回。l外部子例行程序定义一般格式:SUBROUTINE 子程序名()END SUBROUTINE 例如:SUBROUTINE swap(x,y)INTEGER temp,x,ytemp=x;x=y;y=tempEND SUBROUTINE swap定义子程序应遵守的规则:(1)当要求的返回值多于一个时才使用子例行程 序。其返回值通过实在参数与虚

14、拟参数的结合进行。(2)外部子例行程序的定义是一个程序单元,有 说明部分和执行部分,尾部必须有END结束。(3)外部子例行程序在整个程序有意义。(4)子例行程序定义中的虚参表可以是变量名、 数组名、函数名或子程序名,另外在子例行程序中还 可以用星号(*)作为虚参。l子例行程序不指定数据类型,子程序名不返回值。l称为哑元表, 无形参,则圆括号可省略。l子程序体位于SUBROUTINE和END SUBROUTINE语句之间。l说明部分:说明函数名、形参、变量等类型。l执行部分:进行数值运算或数据处理。l例:计算X=2.5时多项式值P5(x)5.0x5+2.5x4+4.4x+3.5P3(x)3.4x

15、3+1.5x2+1.76x+3.5调用计算CALL pnf(5,A,2.5,pnx)WRITE(*,*) pnxCALL pnf(3,A,2.5,pnx)WRITE(*,*) pnxl通过CALL语句调用。作为语句使用。l一般格式:CALL P(a1,a2,an)或CALL P。 l如果无虚拟参数,其调用形式为:CALL P。l外部子例行程序执行过程:n若实在参数为表达式,则先对表达式求值。n实在参数与相应的虚拟参数结合,将实参值 或地址传递给对应虚参。n经过哑实结合,形式参数获得了所需要的值 或地址。n执行子程序体。n返回调用处下一条语句执行。使用外部子例行程序求矩阵A的转置矩阵B。PROG

16、RAM matrixPARAMETER(N=3)INTEGER A(N,N),B(N,N)READ(*,*) (A(I,J),J=1,N),I=1,N)CALL trans(N,A,B)DO I=1,NWRITE(*,(I3,1X) A(I,1:N)ENDDOEND PROGRAM matrix !求转置矩阵SUBROUTINE trans(N,A,B)INTEGEE A(N,N),B(N,N),NINTEGER I,JDO I=1,NDO J=1,N B(J,I)=A(I,J)ENDDOENDDOEND SUBROUTINE trans9.5 实参与虚参之间的数据传递关系l函数子程序和子例行程序中的虚参可以是变量名、数组名、函 数名、子例行程序名。l在子例行程序中还可以用星号(*)作为虚参l当函数子程序和子例行程序被调用之前,所有虚参都无定义, 既没有具体的存储单元也没有具体的值。lFortran 90的虚实结合规则是:第一个实参

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号