《第11章子程序.ppt》由会员分享,可在线阅读,更多相关《第11章子程序.ppt(70页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第十一章第十一章子子 程程 序序1华中科技大学土木工程与力学学院Fortran语言概概 念念 一个一个Fortran应用程序往往是由一个主程应用程序往往是由一个主程序序(必要条件必要条件)和多个子程序组成,对于和多个子程序组成,对于一个完整的应用系统几乎都是这样。一个完整的应用系统几乎都是这样。Fortran子程序分为子程序分为:1)函数子程序函数子程序;2)子例行程序子例行程序;3)数据块子程序数据块子程序(后章介绍后章介绍)2华中科技大学土木工程与力学学院Fortran语言概概 念念1 1、函数子程序分为、函数子程序分为:内部函数子程序内部函数子程序 外部函数子程序外部函数子程序2 2、子
2、例行子程序分为:、子例行子程序分为:内部子例行子程序内部子例行子程序 外部子例行子程序外部子例行子程序用于完成复杂的计算用于完成复杂的计算返回一个或多个值返回一个或多个值.用用于于完完成成复复杂杂计计算算,返返回回一一个个或或多多个个值值,或或不不返返回回任任何何值值,而而用于其它数据处理用于其它数据处理3华中科技大学土木工程与力学学院Fortran语言概概 念念 一个一个Fortran子程序可以被主程子程序可以被主程序调用序调用,也可以被其它子程序调也可以被其它子程序调用用.但不能递归调用但不能递归调用(直接或间接直接或间接自己调用自己自己调用自己)(注注:F90可以使用递归调用可以使用递归
3、调用).4华中科技大学土木工程与力学学院Fortran语言主程序主程序Program main。end子程序子程序FUNCTION XX(A,B)。end子程序子程序SUBROUTINE YY(A,B)。end5华中科技大学土木工程与力学学院Fortran语言本章要点本章要点11.1 函数子程序函数子程序;11.2 子例行程序子例行程序;11.3 实参与虚参之间的数据传递实参与虚参之间的数据传递(输输)11.4 利用子程序实现程序的模块化设计利用子程序实现程序的模块化设计;11.5 子程序中的子程序中的SAVE语句和语句和DATA语句语句;11.6 程序举例程序举例6华中科技大学土木工程与力学
4、学院Fortran语言11.1 函数子程序函数子程序用子程序用子程序(程序段程序段)来定义一个函数来定义一个函数称称之为之为“外部函数外部函数”;通常是在内部函数没有这个功能通常是在内部函数没有这个功能(未提供未提供),而语句函数又不能完成所需的功能时而语句函数又不能完成所需的功能时,采用函数子程序采用函数子程序;函数子程序是一个单独的程序单位函数子程序是一个单独的程序单位它它有明显标志(有明显标志(语句函数属于所在的程序语句函数属于所在的程序单位,只能被本程序单位中的表达式引单位,只能被本程序单位中的表达式引用用),被其它程序调用。),被其它程序调用。7华中科技大学土木工程与力学学院Fort
5、ran语言11.1 函数子程序函数子程序11.1.1 函数子程序的定义函数子程序的定义:函数子程序必须以函数子程序必须以FUNCTION语句开头语句开头,以以END语句结束语句结束.其基本形式如下其基本形式如下:类型说明类型说明 FUNCTION 函数名函数名(虚参表虚参表)其中其中:函数名的命名规则与变量名相同函数名的命名规则与变量名相同.函数名既是函数的名字也代表该函数的值函数名既是函数的名字也代表该函数的值,所以要对其进行类型说明所以要对其进行类型说明.其形式也可以其形式也可以:FUNCTION 函数名函数名(虚参表虚参表)类型说明类型说明 函数名函数名8华中科技大学土木工程与力学学院F
6、ortran语言11.1 函数子程序函数子程序11.1.1 函数子程序的定义函数子程序的定义:函数子程序中函数名的类型说明被省略函数子程序中函数名的类型说明被省略时时,则该函数名也遵循隐含类型规则。则该函数名也遵循隐含类型规则。函数名后的括号中存放虚参函数名后的括号中存放虚参,虚参之间以虚参之间以逗号相隔逗号相隔,没有虚参时没有虚参时,括号是不能少的括号是不能少的.函数子程序就象主程序一样函数子程序就象主程序一样,其函数体内其函数体内的语句也是说明语句在前的语句也是说明语句在前,执行语句在后执行语句在后.9华中科技大学土木工程与力学学院Fortran语言11.1 函数子程序函数子程序11.1.
7、1 函数子程序的定义函数子程序的定义:函数体中的执行语句完成求解函数值的运算函数体中的执行语句完成求解函数值的运算.在程序的执行流程返回调用单位之前在程序的执行流程返回调用单位之前,必须把必须把所求得的函数值赋给函数名所求得的函数值赋给函数名。因此,在子程序中必定有如下语句存在因此,在子程序中必定有如下语句存在:函数名函数名=表达式表达式如如:MYABS=-1*X 和和 MYABS=X而不能而不能:MYABS(X)=-1*X 和和 MYABS(X)=X10华中科技大学土木工程与力学学院Fortran语言 REAL FUNCTION MYABS(X)REAL FUNCTION MYABS(X)R
8、EAL X IF(X.LT.0)THEN MYABS=-1*X RETURN ELSE MYABS=X ENDIF END PROGRAM MAIN REAL MYABS,X,A READ(*,*,*)A X=MYABS(A)WRITE(*,*)(*,*)A,X END一定要注意主、子一定要注意主、子程序中变量类型说程序中变量类型说明和函数名的类型明和函数名的类型说明。说明。11华中科技大学土木工程与力学学院Fortran语言12华中科技大学土木工程与力学学院Fortran语言11.1 函数子程序函数子程序11.1.1 函数子程序的定义函数子程序的定义:函数在执行中遇到函数在执行中遇到Retu
9、rn语句或语句或End语句的时候语句的时候,立即返回到调用单位并由函数名把函数值带回立即返回到调用单位并由函数名把函数值带回.Return语句语句:只能在子程序中存在只能在子程序中存在,也可以有多个也可以有多个;End语句语句:在主、子程序中只能有一个在主、子程序中只能有一个,不能省略不能省略.注意注意:函数是一个独立的编译单位函数是一个独立的编译单位,除函数名和虚参除函数名和虚参外与其它程序单位没有任何关系或联系外与其它程序单位没有任何关系或联系;因此在函因此在函数子程序中不必考虑数子程序中不必考虑标号标号、名字名字等是否和其它程序等是否和其它程序单位相重单位相重(这样就这样就有很大的灵活性
10、有很大的灵活性)。13华中科技大学土木工程与力学学院Fortran语言11.1 函数子程序函数子程序11.1.2 函数子程序的调用函数子程序的调用:函数子程序的调用与系统函数(内部函数)的函数子程序的调用与系统函数(内部函数)的调用形式完全相同。调用形式完全相同。变量名变量名=含有(含有(函数名(实参)函数名(实参)或或 函数名()的表达式函数名()的表达式注意以下四点:注意以下四点:1)只能在表达式中对函数进行调用;只能在表达式中对函数进行调用;2)对于主程序要调用外部函数来说,应在说对于主程序要调用外部函数来说,应在说明部分对函数名的数据类型加以说明。如果没明部分对函数名的数据类型加以说明
11、。如果没有说明,则按隐含类型处理。必须在调用程序有说明,则按隐含类型处理。必须在调用程序中使中使外部函数名外部函数名与与函数子程序定义中函数名函数子程序定义中函数名的的类型完全相同。类型完全相同。14华中科技大学土木工程与力学学院Fortran语言11.1 函数子程序函数子程序11.1.2 函数子程序的调用函数子程序的调用:如上例中:由于外部函数如上例中:由于外部函数MYABS是实型,是实型,主程序中就应该说明了主程序中就应该说明了MYABS为实型,为实型,不然就造成类型不一致的错误。不然就造成类型不一致的错误。3)在调用外部函数时,实参表中的实参在调用外部函数时,实参表中的实参个数必须与对应
12、函数的形参个数完全相个数必须与对应函数的形参个数完全相同,且实参与形参之间是建立的一一对同,且实参与形参之间是建立的一一对应关系,类型也要求一致。应关系,类型也要求一致。15华中科技大学土木工程与力学学院Fortran语言如果没有对如果没有对Myabs说明说明的话,就会的话,就会出现错误出现错误。16华中科技大学土木工程与力学学院Fortran语言11.1 函数子程序函数子程序11.1.2 函数子程序的调用函数子程序的调用:在函数调用时,实参的值传递给对应位在函数调用时,实参的值传递给对应位置上的形参,程序就接着转去执行函数置上的形参,程序就接着转去执行函数体内的执行语句。在遇到体内的执行语句
13、。在遇到End或或Return语语句返回调用单位,并把函数值带回句返回调用单位,并把函数值带回,然后然后继续参与主程序的表达式的运算。继续参与主程序的表达式的运算。4)如果函数没有形参,则在调用时也没如果函数没有形参,则在调用时也没有实参,但括号不能丢。有实参,但括号不能丢。17华中科技大学土木工程与力学学院Fortran语言 PROGRAM MAIN N=3 Y=(S(N)+S(N+1)+S(N+2)/(S(N+3)+S(N+4)WRITE(*(*,100)Y=,Y100 FORMAT(1X,A,E13.6)END FUNCTION S(X)INTEGER X S=0 DO 10 I=1,X
14、 S=S+I10 CONTINUE END18华中科技大学土木工程与力学学院Fortran语言如果没有对X进行整型说明就会产生编译错误19华中科技大学土木工程与力学学院Fortran语言PROGRAM MAIN REAL MYEXP WRITE(*,*)(*,*)输入输入X的值:的值:READ(*,*)XY=(MYEXP(X)-MYEXP(-X)/2.0WRITE(*,*)YENDFUNCTION MYEXP(X)REAL MYEXPN=0 T=1S=1DO 10,WHILE(ABS(T).GT.1E-5)N=N+1T=T*X/NS=S+T10CONTINUEMYEXP=SEND20华中科技大
15、学土木工程与力学学院Fortran语言21华中科技大学土木工程与力学学院Fortran语言 Program main1 Real:MyExp,y,x Write(*,*)Enter x:Read(*,*)x Y=(MyExp(x)-MyExp(-x)/2.0 Write(*,*)Y END PROGRAM 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)0g(x)=0,f(x)=0 x-1,f(x)0g(x)=0,f(x)=0 x-1,f(x)0要求用外部函
16、数求要求用外部函数求g(x)的值的值。25华中科技大学土木工程与力学学院Fortran语言GO26华中科技大学土木工程与力学学院Fortran语言11.2 子例行程序子例行程序Fortran77除了可以使用函数子程序除了可以使用函数子程序(FUNCTION)之外之外,还可以使用还可以使用子例行程序子例行程序(SUBROUTINE).它们都属于子程它们都属于子程序的范围。序的范围。函数子程序与子例行程序区别:函数子程序与子例行程序区别:函数子程序函数子程序-函数子程序的名字代表一个值(在函数子程序的名字代表一个值(在函数子程序中求出的函数值并存放在函数名中,函数子程序中求出的函数值并存放在函数名
17、中,因此函数名有数据类型);因此函数名有数据类型);子例行程序子例行程序在子例行程序中求出的值不由该程在子例行程序中求出的值不由该程序名带回调用单位,是通过实参与形参的联系而序名带回调用单位,是通过实参与形参的联系而传递的;所以传递的;所以子例行程序名子例行程序名不属于某个类型,也不属于某个类型,也不代表某个值,也不需要对该名进行说明。不代表某个值,也不需要对该名进行说明。!27华中科技大学土木工程与力学学院Fortran语言11.2 子例行程序子例行程序11.2.1 11.2.1 子例行程序定义子例行程序定义调用方式不同:函数子程序的调用总出现调用方式不同:函数子程序的调用总出现在表达式中,
18、子例行程序的调用是由一条在表达式中,子例行程序的调用是由一条独立的语句独立的语句CALLCALL来完成的。来完成的。使用场合:使用场合:如果只需要得到一个计算值,如果只需要得到一个计算值,采用函数子程序。在设计函数子程序时,采用函数子程序。在设计函数子程序时,不主张在函数体内改变形参的值,从而保不主张在函数体内改变形参的值,从而保证不使对应的实参发生变化。如果想通过证不使对应的实参发生变化。如果想通过程序运算后得到一批数据(矩阵运算)或程序运算后得到一批数据(矩阵运算)或一些特定的操作,就使用子例行程序。一些特定的操作,就使用子例行程序。28华中科技大学土木工程与力学学院Fortran语言11
19、.2 子例行程序子例行程序11.2.1 11.2.1 子例行程序的定义子例行程序的定义子例行程序必须以子例行程序必须以SubroutineSubroutine语句开头语句开头,以以ENDEND语语句结束句结束.其基本形式如下其基本形式如下:Subroutine Subroutine 子例行子例行程序名程序名 (虚参表虚参表)其中子例行程序名的命名规则与变量名相同其中子例行程序名的命名规则与变量名相同.但但子例行程序名只是标识一个子例行程序,不代表子例行程序名只是标识一个子例行程序,不代表任何值任何值.(虚参表虚参表)是子例行程序与调用单位之间进行数据是子例行程序与调用单位之间进行数据传输的主要
20、渠道。没有虚参表时传输的主要渠道。没有虚参表时,其括号可以省其括号可以省略略;多个虚参时多个虚参时,以逗号相隔。以逗号相隔。有关其它规则与函数子程序基本相同。有关其它规则与函数子程序基本相同。29华中科技大学土木工程与力学学院Fortran语言11.2 子例行程序子例行程序11.2.211.2.2子例行程序的调用子例行程序的调用必须用一条独立的语句必须用一条独立的语句CALLCALL来调用子例行来调用子例行程序:程序:CALL CALL 子例行程序名子例行程序名 (实参表)或(实参表)或 CALL CALL 子例行程序名子例行程序名 通过调用,将得到的新值通过实参与形参通过调用,将得到的新值通
21、过实参与形参的结合传送回调用单位(就是子例行程序的结合传送回调用单位(就是子例行程序的的程序体程序体给形参赋值)。给形参赋值)。30华中科技大学土木工程与力学学院Fortran语言 SUBROUTINE SUM(N,S)INTEGER N REAL S S=0.0 DO 10,I=1,N S=S+I10 CONTINUE END PROGRAM MAIN CALL SUM(3,Y1)CALL SUM(4,Y2)CALL SUM(5,Y3)CALL SUM(6,Y4)CALL SUM(7,Y5)SUM(7,Y5)Y=(Y1+Y2+Y3)/(Y4+Y5)WRITE(*(*,100)Y=,Y100
22、FORMAT(1X,A,E13.6)END31华中科技大学土木工程与力学学院Fortran语言 SUBROUTINE AST WRITE(*(*,100)100 FORMAT(1X,20(*)END PROGRAM MAIN CALL AST CALL AST END*子程序就是完成指定的输出任务,不必要返回结果.32华中科技大学土木工程与力学学院Fortran语言PROGRAM MAINREAL W(5,5)CALL READIN(W)CALL OPP(W,X1,X2)WRITE(*,100)X1,X2100FORMAT(1X,对角线的值对角线的值:/1X,X1=,F8.2,x2=,F8.2
23、)Endsubroutine opp(A,s1,s2)real A(5,5)s1=0do 10 I=1,5s1=s1+A(I,I)10continues2=0do 20 I=1,5J=5-I+1s2=s2+A(I,J)20continueEndsubroutine readin(A)real A(5,5)write(*,*)(*,*)输入输入5X5矩阵矩阵:do 10 I=1,5 read(*,*)(*,*)(A(I,J),J=1,5)10continueEnd求求5X55X5矩阵对角线之和矩阵对角线之和33华中科技大学土木工程与力学学院Fortran语言求输入两数之间的阶乘之和,求输入两数之
24、间的阶乘之和,如输入:,则如输入:,则!34华中科技大学土木工程与力学学院Fortran语言.35华中科技大学土木工程与力学学院Fortran语言11.3 实参与虚参之间的数据传送实参与虚参之间的数据传送解决:解决:如何将虚参和实参结合进行数据传送的问题;如何将虚参和实参结合进行数据传送的问题;函数子程序和子例行程序的虚参可以是:函数子程序和子例行程序的虚参可以是:变量名、数组名、函数名、子例行程序名变量名、数组名、函数名、子例行程序名;在子例行程在子例行程序中还可以用序中还可以用 作为虚参。作为虚参。概念:概念:在函数子程序和子例行程序被调用之前,所有在函数子程序和子例行程序被调用之前,所有
25、虚参是无定义的,就是没有具体的值、没有分配存储虚参是无定义的,就是没有具体的值、没有分配存储单元单元故由此得名故由此得名“形参形参”。当执行的流程转向子程。当执行的流程转向子程序时,实参和虚参按地址结合(实参的存储单元对应序时,实参和虚参按地址结合(实参的存储单元对应虚参的存储单元)。退出子程序时,子程序的虚参又虚参的存储单元)。退出子程序时,子程序的虚参又变成无定义(释放存储单元)。变成无定义(释放存储单元)。36华中科技大学土木工程与力学学院Fortran语言11.3 实参与虚参之间的数据传送实参与虚参之间的数据传送 当虚参的形式不同时当虚参的形式不同时,与实参之间的数据与实参之间的数据传
26、递也各不相同,常见四种情况传递也各不相同,常见四种情况:变量作为虚参变量作为虚参;数组作为虚参数组作为虚参;子程序名作为虚参子程序名作为虚参;星号作为虚参星号作为虚参.37华中科技大学土木工程与力学学院Fortran语言11.3 实参与虚参之间的数据传送实参与虚参之间的数据传送11.3.111.3.1变量作为虚参变量作为虚参当虚参是变量时,对应的实参可以是同一类型的常量、当虚参是变量时,对应的实参可以是同一类型的常量、变量、数组元素和表达式。变量、数组元素和表达式。Program main Integer A,C(3)Data C/3*0/A=100 Call Sub(A,C(2)Write(
27、*,*,*)A=,A,C(2)=,C(2)end Subroutine Sub(X,A)Integer X,A A=2*X X=2*A End运行结果是运行结果是:A=400 C(2)=20038华中科技大学土木工程与力学学院Fortran语言11.3 实参与虚参之间的数据传送实参与虚参之间的数据传送11.3.111.3.1变量作为虚参变量作为虚参如果虚参是字符型变量时,则如果虚参是字符型变量时,则:1)1)虚参字符变量的长度必须小于等于对应实参的长度虚参字符变量的长度必须小于等于对应实参的长度;2)2)虚参字符变量的长度可以用星号来定义虚参字符变量的长度可以用星号来定义,表示长度可变表示长度
28、可变 Program main Character Str1*8,Str2*40 Call Sub(Str1)Call Sub(Str2)end subroutine Sub(CH)Character*(*)CH .end运行后运行后:第一次调用第一次调用CH长度为长度为8,第二次调用第二次调用CH长度为长度为40.39华中科技大学土木工程与力学学院Fortran语言11.3 实参与虚参之间的数据传送实参与虚参之间的数据传送11.3.2 数组作为虚参数组作为虚参l当虚参是数组名时当虚参是数组名时,对应的实参可以是同一对应的实参可以是同一类型的数组名或数组元素类型的数组名或数组元素.l如果虚参和
29、实参是数值型或逻辑型数组如果虚参和实参是数值型或逻辑型数组,在在调用子程序时调用子程序时,是把实参数组第一个元素的是把实参数组第一个元素的地址传送给子程序作为虚参数组的第一个元地址传送给子程序作为虚参数组的第一个元素的地址素的地址,从而使它们共用存储单元从而使它们共用存储单元.l如果数组是字符型如果数组是字符型,虚参与实参数组不是按虚参与实参数组不是按数组元素的顺序一一对应数组元素的顺序一一对应,而是按字符位置而是按字符位置一一对应结合的一一对应结合的.40华中科技大学土木工程与力学学院Fortran语言A(1)A(2)A(3)A(4)A(5)A(6)A(7)A(8)B(-1)B(0)B(1)
30、B(2)B(3)B(4)B(5)PROGRAM MAINDIMENSION A(8)CALL SUB(A)ENDSUBROUTINE SUB(B)DIMENSION B(-1,5).END数组名数组名41华中科技大学土木工程与力学学院Fortran语言A(1,2)A(2,1)A(1,2)A(2,2)A(1,3)A(2,3)A(1,4)A(2,4)B(1)B(2)B(3)B(4)B(5)B(6)PROGRAM MAINDIMENSION A(2,4).CALL SUB(A).ENDSUBROUTINE SUB(B)DIMENSION B(6).END数组名数组名42华中科技大学土木工程与力学学院
31、Fortran语言A(1)A(2)A(3)A(4)A(5)A(6)A(7)A(8)B(1)B(2)B(3)B(4)PROGRAM MAINDIMENSION A(8).CALL SUB(A(3).ENDSUBROUTINE SUB(B)DIMENSION B(4).END数组元素数组元素43华中科技大学土木工程与力学学院Fortran语言11.3 实参与虚参之间的数据传送实参与虚参之间的数据传送11.3.2数组作为虚参数组作为虚参l如果数组是字符型如果数组是字符型,虚参与实参数组不虚参与实参数组不是按数组元素的顺序一一对应是按数组元素的顺序一一对应,而是按而是按字符位置一一对应结合的字符位置一
32、一对应结合的.44华中科技大学土木工程与力学学院Fortran语言B(1)B(2)B(3)B(4)B(5)B(6)C(1)C(2)C(3)C(4)PROGRAM MAINCHARACTER*4 B(6).CALL SUB(B)END SUBROUTINT SUB(C)CHARATER*5 C(4).END45华中科技大学土木工程与力学学院Fortran语言11.3 实参与虚参之间的数据传送实参与虚参之间的数据传送11.3.211.3.2数组作为虚参数组作为虚参l在子程序中在子程序中,允许虚参数组是允许虚参数组是可调数组可调数组.从而从而提高了程序的灵活性和可读性提高了程序的灵活性和可读性PRO
33、GRAM MAINDIMENSION A(10),B(4,3)M1=4M2=3CALL SUB(A,10,B,M1,M2).ENDSUBROUTINE SUB(X,NX,Y,N1,N2)DIMENSION X(NX),Y(N1,N2).END!46华中科技大学土木工程与力学学院Fortran语言11.3 实参与虚参之间的数据传送实参与虚参之间的数据传送11.3.211.3.2数组作为虚参数组作为虚参l虚参数组中最后一维的上界可以用星号来表虚参数组中最后一维的上界可以用星号来表示示,用这种方式定义的数组称为用这种方式定义的数组称为不定长数组不定长数组.(这也是可调数组的一种)(这也是可调数组的一
34、种)PROGRAM MAINDIMENSION A(10),B(4,3)CALL SUB(A,B).ENDSUBROUTINE SUB(X,Y)DIMENSION X(0:*),Y(2,*)Y(2,*).END在执行在执行CALL SUB(A,B)的语的语句调用后句调用后,SUB子程序中子程序中X,Y的的实际说明实际说明:Dimension X(0:9),Y(2,6)可调数组名只能是虚参可调数组名只能是虚参实际编译出错实际编译出错47华中科技大学土木工程与力学学院Fortran语言48华中科技大学土木工程与力学学院Fortran语言这种在虚参中用号表示的方法,编译时会出错原因是子程序中虚参为可
35、调数组时,不能使用打印数组语句,只能安排在主程序中。49华中科技大学土木工程与力学学院Fortran语言11.3 实参与虚参之间的数据传送实参与虚参之间的数据传送11.3.311.3.3子程序名作为虚参子程序名作为虚参在虚参表中可以出现函数名和子例行程序名在虚参表中可以出现函数名和子例行程序名.程程序要根据上下关系以及有序要根据上下关系以及有是否说明是否说明来决定来决定.如如:Subroutine Sub(A,N,X,F)Dimension A(N).Y=F(I)+1 X=A(I)+1 .End 程序判断程序判断:由于有定义由于有定义,A是数组是数组;N和和X是变量是变量;由于由于F(I)没有
36、说明没有说明,程序程序确定确定F为实型函数名为实型函数名;如果在子程序中还出现如果在子程序中还出现Call XX语句语句,则后面的则后面的XX就是子程序名了就是子程序名了.50华中科技大学土木工程与力学学院Fortran语言11.3 实参与虚参之间的数据传送实参与虚参之间的数据传送11.3.311.3.3子程序名作为虚参子程序名作为虚参 Subroutine Sub(X,P).CALL P .End在虚参中的函数名、子例行程序名在虚参中的函数名、子例行程序名是一个虚设的名字,实际的名字要是一个虚设的名字,实际的名字要等调用的实参传送过来。等调用的实参传送过来。在调用程序单位中,要进在调用程序单
37、位中,要进行如下的说明:行如下的说明:外部函数名或子例行程序名时:外部函数名或子例行程序名时:external XXXexternal add,sub内部函数名时:内部函数名时:intrinsic XXXIntrinsic sin,cos是一个虚设是一个虚设的名字,真的名字,真正的名有实正的名有实参传过来参传过来51华中科技大学土木工程与力学学院Fortran语言 FUNCTION F(FUN,X)X=X*3.14159/180.0 F=FUN(X)END PROGRAM MAIN Intrinsic sin,tan X1=45 X2=60 SIN1=F(SIN,X1)TAN2=F(TAN,X
38、2)WRITE(*,100)SIN1,TAN2100 FORMAT(1X,SIN(45)=,F8.5,3X,TAN(60)=,F8.5)END求求sin45度和度和tan60度度函数名作为虚参函数名作为虚参52华中科技大学土木工程与力学学院Fortran语言53华中科技大学土木工程与力学学院Fortran语言program mainintrinsic sin,cosx=3.14159/5.0y1=triangle(sin,cos,x)y2=triangle(cos,sin,x)write(*(*,100)TAN=,Ywrite(*(*,100)CTAN=,Y100FORMAT(1X,A,F6.
39、2,A,E13.6)ENDFUNCTION TRIAGLE(F1,F2,X)TRIANGLE=F1(X)/F2(X)END求求tan(36)和和ctan(36)的值的值此时的此时的F1、F2分别代表分别代表sin 和和 cos该程序既该程序既能求正切能求正切,也能求余也能求余切切.在实参表中出现内部在实参表中出现内部函数名时函数名时,在调用程序在调用程序的说明部分用的说明部分用:Intrinsic Intrinsic 进行说明进行说明54华中科技大学土木工程与力学学院Fortran语言program mainexternal add,subcharacter chread(*,(*,(A)ch
40、read(*,*)(*,*)x1,x2if(ch.eq.A.or.Ch.eq.a)then call test(add,x1,x2,y)write(*(*,100)x1,+,x2,=,yelse if(ch.eq.S.or.Ch.eq.s)then call test(sub,x1,x2,y)write(*(*,100)x1,-,x2,=,y else write(*,*)(*,*)select error!end if 100FORMAT(1X,2(F6.2,A),F6.1)ENDsubroutine test(T,x1,x2,x)call T(x1,x2,x)ENDSubroutine a
41、dd(A,B,C)C=A+BENDSubroutine SUB(A,B,C)C=A-BEND选择选择A做加法做加法S做减法做减法X1和和X2是运算的两数是运算的两数在在Call Test(add,x1,x2,y)addT(T就是就是add)所以所以Call T(x1,x2,x)就是就是Call add(x1,x2,x)在实参表中出现子例在实参表中出现子例行程序名时行程序名时,在调用程在调用程序的说明部分用序的说明部分用:External External 进行说明进行说明55华中科技大学土木工程与力学学院Fortran语言11.3 实参与虚参之间的数据传送实参与虚参之间的数据传送11.3.41
42、1.3.4星号(星号(*)作为虚参)作为虚参 Program main 120 X=X1+X2 call ex(X,*120,*140).140 .end subroutine ex(A,*,*)*,*)if()then .Return1 else if()then .Return2 end if end在在callcall语句中,与虚参第一个星号对应的语句标号为语句中,与虚参第一个星号对应的语句标号为120120,第二个为,第二个为140140。在执行子程序时,遇到在执行子程序时,遇到endend正常结束;如果是遇到正常结束;如果是遇到return1,return1,则转到主的则转到主的12
43、0120处,如果是遇到处,如果是遇到return2,return2,则转到主的则转到主的140140处执行。处执行。56华中科技大学土木工程与力学学院Fortran语言57华中科技大学土木工程与力学学院Fortran语言11.4 利用子程序实现程序的模块化设计利用子程序实现程序的模块化设计在实际应用中在实际应用中,我们总是将一个大的任务我们总是将一个大的任务分解成若干小的子任务分解成若干小的子任务,这些小的子任务这些小的子任务就是单个的程序单位就是单个的程序单位,完成某个特定的简完成某个特定的简单操作单操作;由于子程序可以多次调用由于子程序可以多次调用,使得使得系统中相同操作部分只需调用子程序
44、来系统中相同操作部分只需调用子程序来完成完成,不必重复编程不必重复编程.这种方法的程序设计这种方法的程序设计:容易调试、修改、容易调试、修改、维护;程序的可读性好;最大特点是表维护;程序的可读性好;最大特点是表现在对单个模块的调式与修改上。现在对单个模块的调式与修改上。58华中科技大学土木工程与力学学院Fortran语言11.4 利用子程序实现程序的模块化设计利用子程序实现程序的模块化设计模块化设计模块化设计:1.Fortran1.Fortran子程序中可以通过虚实结合使用可调子程序中可以通过虚实结合使用可调数组、传送子程序名等,为结构化程序设计提数组、传送子程序名等,为结构化程序设计提供手段
45、。供手段。2.2.主、子程序可以分别建立和编译,最后将它们主、子程序可以分别建立和编译,最后将它们的的.OBJ.OBJ文件连接起来。主、子程序的源程序也文件连接起来。主、子程序的源程序也可放在一起可放在一起(同一文件中同一文件中),然后编译、连接。,然后编译、连接。主程序 子A程序 子程序B59华中科技大学土木工程与力学学院Fortran语言11.4 利用子程序实现程序的模块化设计利用子程序实现程序的模块化设计模块化设计模块化设计:3.3.尽可能把各个主要功能分解成独立的模尽可能把各个主要功能分解成独立的模块并由子程序来完成块并由子程序来完成,并将子程序中的各并将子程序中的各个算法细节也都放在
46、子程序中去完成个算法细节也都放在子程序中去完成.主程序 子A程序 子程序B60华中科技大学土木工程与力学学院Fortran语言 Write(*,*)(*,*)enter N:Read(*,*)N(*,*)N Do 10 While(N.GE.0)Do 10 While(N.GE.0)WWrite(*,rite(*,(1X,A,F7.1)(1X,A,F7.1)FUN=FUN=,FUN(N),FUN(N)Write(*,*)(*,*)enter N:Read(*,*)N(*,*)N10 Continue10 Continue End End FUNCTION FUN(N)FUNCTION FUN(
47、N)Save N0,F Save N0,F Data N0/0/,F/1/Data N0/0/,F/1/If(N.LT.0)then If(N.LT.0)then Write(*,*)Write(*,*)data error!data error!;Fun=-1;Return;Fun=-1;Return Else If(N.LE.N0)then Else If(N.LE.N0)then F=1 ;N0=1 F=1 ;N0=1 ENDIF ENDIF Do 10 I=N0+1,N Do 10 I=N0+1,N F=F*I F=F*I10 Continue10 Continue Fun=F Fun
48、=F N0=N N0=N EndEnd 求阶乘函数,当后来输入的数求阶乘函数,当后来输入的数大于先前输入数,则利用大于先前输入数,则利用SAVE语句中已经保留的值,不必从语句中已经保留的值,不必从头开始计算阶乘头开始计算阶乘只是第一次调用时有效求阶乘函数,当后来输入的数求阶乘函数,当后来输入的数小于或等于先前输入数,从头小于或等于先前输入数,从头开始计算阶乘开始计算阶乘.由于有了由于有了SAVE语句语句,使得它的变量不被释放使得它的变量不被释放.62华中科技大学土木工程与力学学院Fortran语言 FUNCTION FAC(N)FUNCTION FAC(N)Data F/1/Data F/1/
49、改为:改为:F=1F=1 IF(N.LT.0)then IF(N.LT.0)then Write(*,*)Write(*,*)data error!data error!Fac=-1 Fac=-1 Return Return Else Else Do 10 I=1,N Do 10 I=1,N F=F*I F=F*I10 Continue10 Continue EndifEndif Fac=FFac=F End End当当Data语句给子程序中的变量语句给子程序中的变量或数组赋初值时,这些变量和或数组赋初值时,这些变量和数组元素只是在子程序第一次数组元素只是在子程序第一次调用时才有初值;如果没有
50、调用时才有初值;如果没有Save语句说明,语句说明,Data语句中的语句中的变量和数组在第一次调用退出变量和数组在第一次调用退出后就变成无定义的了。不要认后就变成无定义的了。不要认为调用一次子程序为调用一次子程序Data语句就语句就赋一次初值。因为赋一次初值。因为Data是非执是非执行语句。行语句。该程序多次该程序多次调用时是不调用时是不正确的!正确的!63华中科技大学土木工程与力学学院Fortran语言需要注意需要注意:l在子程序中不能用在子程序中不能用DataData语句给虚参赋初语句给虚参赋初值值(因为虚参的数据来自实参因为虚参的数据来自实参);l当用当用DataData语句给子程序中的