第11章子程序.ppt
《第11章子程序.ppt》由会员分享,可在线阅读,更多相关《第11章子程序.ppt(70页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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 实参与虚参之间的数据传送实参与虚参之间的数据传送 当虚参的形式不同时当虚参的形式不同时,与实参之间的数据与实参之间的数据传
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 11 章子 程序
限制150内