第十一章 子程序_第1页
第十一章 子程序_第2页
第十一章 子程序_第3页
第十一章 子程序_第4页
第十一章 子程序_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2022-5-71第十一章 子程序【】 函数子程序、子例行程序的函数子程序、子例行程序的定义定义 与调用与调用,实参与虚参的数据传递实参与虚参的数据传递2022-5-72本章内容n11.111.1函数子程序函数子程序n11.211.2子例行程序子例行程序n11.311.3实参与虚参之间的数据传递实参与虚参之间的数据传递n11.411.4利用子程序实现程序的模块化设计利用子程序实现程序的模块化设计n11.511.5在子程序中在子程序中savesave语句与语句与datadata语句语句n11.611.6程序举例程序举例2022-5-7311.1 函数子程序 FORTRANFORTRAN的子程序有

2、的子程序有函数子程序、子例行程序和数函数子程序、子例行程序和数据块子程序据块子程序三种。三种。 子程序可以被主程序调用,也可以被其它子程序子程序可以被主程序调用,也可以被其它子程序调用。但不能直接或间接地自己调用自己调用。但不能直接或间接地自己调用自己( (递归调递归调用用) )。调用子程序的主程序和子程序统称为调用程。调用子程序的主程序和子程序统称为调用程序序( (调用单位调用单位) ),被调用的子程序统称为被调用程,被调用的子程序统称为被调用程序序( (被调用单位被调用单位) )。2022-5-7411.1 函数子程序 在在FORTRAN 77FORTRAN 77中,允许使用三种函数:中,

3、允许使用三种函数:(1)(1)内部函内部函数;数;(2)(2)语句函数;语句函数;(3)(3)函数子程序函数子程序( (外部函数外部函数) )。函数子程序是一个独立的程序单位,它不属于调函数子程序是一个独立的程序单位,它不属于调用程序所在的程序单位,因此它称为外部函数。用程序所在的程序单位,因此它称为外部函数。内部函数是内部函数是FORTRAN 77FORTRAN 77提供的系统标准函数,可提供的系统标准函数,可以被任何程序单位调用。以被任何程序单位调用。2022-5-7511.1.1函数子程序的定义一、函数子程序的定义一、函数子程序的定义 函数子程序必须以函数子程序必须以FUNCTIONFU

4、NCTION语句开头,以语句开头,以ENDEND语句语句结束。结束。 FUNCTIONFUNCTION语句的形式为语句的形式为:第一种:第一种: 类型说明类型说明 FUNCTION FUNCTION 函数名函数名( (虚拟参数表虚拟参数表) )第二种:第二种: FUNCTION FUNCTION 函数名函数名( (虚拟参数表虚拟参数表) ) 类型说明类型说明 函数名函数名:1.1.函数名的取名与变量名相同;函数名的取名与变量名相同; 2.2.函数名既表示函数的名字又代表函数的函数值;函数名既表示函数的名字又代表函数的函数值; 3.3.若省略对函数名的类型说明,按隐含类型规则处理。若省略对函数名

5、的类型说明,按隐含类型规则处理。2022-5-7611.1.1函数子程序的定义(续)4. 函数名后一对括号中为虚拟参数,当参数多于一个时,它们之函数名后一对括号中为虚拟参数,当参数多于一个时,它们之间用逗号隔开,虚参可以是变量名、数组名、子程序名;间用逗号隔开,虚参可以是变量名、数组名、子程序名;5. 如果没有虚参时,一对括号不能省,形式应为:如果没有虚参时,一对括号不能省,形式应为: 类型说明类型说明 FUNCTION FUNCTION 函数名函数名( )( )6. FUNCTION语句到对应的语句到对应的END语句组成函数体,函数体中说语句组成函数体,函数体中说明语句在前,执行语句在后;明

6、语句在前,执行语句在后;7. 在程序的执行流程返回调用单位之前,必须把所求的函数值赋在程序的执行流程返回调用单位之前,必须把所求的函数值赋给函数名:给函数名: 函数名函数名=表达式表达式2022-5-7711.1.1函数子程序的定义(续)8. 函数是一个独立的编译单位,所以函数体内的所有函数是一个独立的编译单位,所以函数体内的所有变量、语句标号等的作用仅局限于本程序单位内,变量、语句标号等的作用仅局限于本程序单位内,除函数名和虚参以外其他程序单位没有任何联系;除函数名和虚参以外其他程序单位没有任何联系;9. RETURN语句与语句与END语句的关系语句的关系: RETURN语句可以语句可以有多

7、个,有多个,可根据需要放在适当的位置上,程序执行的流程在遇到它时就立即返回调用单位,它可以省略它可以省略; END语句只有一个语句只有一个,且必须放在子程序的最后。,且必须放在子程序的最后。2022-5-7811.1.2函数子程序的调用 外部函数的调用形式与内部函数的调用相同其形式如下:外部函数的调用形式与内部函数的调用相同其形式如下: 函数名函数名(实在参数,实在参数, ) 或者或者 函数名函数名( ) 注意:注意:1.它可以在任何允许函数值出现的表达式中调用函数,只它可以在任何允许函数值出现的表达式中调用函数,只能在表达式中对函数进行调用;能在表达式中对函数进行调用; 2.在调用程序中使用

8、外部函数名和函数子程序定义中的函数在调用程序中使用外部函数名和函数子程序定义中的函数名的类型应完全一致;名的类型应完全一致; 3.实参个数必须与对应的虚参个数完全相同,实参与虚参按实参个数必须与对应的虚参个数完全相同,实参与虚参按它们的位置建立一一对应的联系,实参的名字和对应位置上的虚它们的位置建立一一对应的联系,实参的名字和对应位置上的虚参无需相同,但类型必须完全一致。参无需相同,但类型必须完全一致。2022-5-79运用函数子程序编程 编写一个函数子程序编写一个函数子程序IFAC用来求用来求n!,要求所得函数值为,要求所得函数值为实型。调用此函数求实型。调用此函数求 C=R!/(R-K)!

9、*K!)2022-5-710举例源程序 (home) INTEGER R REAL IFAC10 WRITE(*,*)输入正整数输入正整数R,K(RK) READ(*,*)R,K IF(R .GE.0 .AND. K .GE.0 .AND S . R-K .GE.0 )THEN C=IFAC(R)/ (IFAC(R-K)* IFAC(K) ELSE WRITE(*,*)数据有误,重输数据有误,重输 GOTO 10 ENDIF WRITE(*,*)C= ,C END主程序主程序子程序子程序 REAL FUNCTION IFAC(K) IFAC=1 IF ( K.EQ. 0) THEN IFAC=

10、1 RETURN ELSE DO 10 I=1,K IFAC=IFAC*I10 CONTINUE ENDIF END 2022-5-711 11.2 子例行程序1.子例行程序的定义子例行程序的定义 子例行程序以SUBROUTINE语句开头,以END语句结束。 SUBROUTINE语句的形式为: SUBROUTINE 子例行程序名子例行程序名(虚拟参数,虚拟参数,) 当没有虚参时形式为: SUBROUTINE 子例行程序名子例行程序名 2022-5-712 11.2 子例行程序说明: 子例行程序名的取名方法与变量相同。 当有一个以上的虚参时,它们之间用逗号隔开,如果没有虚参,则一对括号可以省略不

11、写。 子例行程序的说明部分,应包括对虚参和子例行程序中所用变量、数组等的说明。 子例行程序中RETURN语句END语句的作用同函数子程序。 子例行程序也是一个独立的编译单位,在变量名、语句标号等的使用方面与函数子程序相同。2022-5-71311.2 子例行程序2.子例行程序的调用子例行程序的调用 必须用一条独立的CALL语句来调用子例行程序, CALL 语句的形式为: CALL 子例行程序名子例行程序名(实在参数,实在参数,) 当子例行程序没有虚参时,则调用形式为: CALL 子例行程序名子例行程序名 或 CALL 子例行程序名子例行程序名( ) 2022-5-71411.2 子例行程序 函

12、数子程序和子例行程序的区别:函数子程序和子例行程序的区别: 第一条语句不同。 名字的作用不同。 函数子程序名除了供调用时使用外,还代表着函数值,应作类型说明,且必须在返回调用单位前在函数体内给函数名赋予函数值。函数值通过函数名带回调用单位。 子例行程序名只供调用时使用,不代表某个值,不得在程序体内赋值。2022-5-71511.2 子例行程序 在子例行程序中求得的值通过实参和虚参的联系带回调用单位。 调用的方式不同。 函数子程序的调用总是出现在表达式中,并将所得的函数值参与表达式的运算。子例行程序必须用一条独立的CALL语句调用。 应用的场合不同。 在程序设计中,如果只需得到一个计算值,一般采

13、用函数子程序的形式。如果希望通过子程序的运算操作得到一批数据,则应采用子例行程序。2022-5-716编写子例行程序分别求出5 5矩阵两个对角线上元素之和real a(5,5)call juzhen(a)call add(a,x1,x2)write(*,*)x1,x2end subroutine juzhen(w) real w(5,5) write(*,*) Enter 5 5 matrix do 10 i=1,5 read(*,*)(w(i,j),j=1,5)10 continue end subroutine add(w,s1,s2) real w(5,5) do 10 i=1,5 s1

14、=s1+w(i,i) continue do 20 i=1,5 j =5-i+1 s2=s2+a(i,j) continue end1020home2022-5-71711.3 实参与虚参之间的数据传递 函数子程序和子例行程序中的虚参可以是函数子程序和子例行程序中的虚参可以是变量名、数组名、子例行变量名、数组名、子例行程序名,程序名,在子例行程序中还可以用在子例行程序中还可以用星号星号作为虚参;作为虚参; 函数子程序和子例行程序在没有调用之前,所有的虚参没有具体的函数子程序和子例行程序在没有调用之前,所有的虚参没有具体的存储单元和具体的值,只是起到形式上的作用。当执行的流程转存储单元和具体的值

15、,只是起到形式上的作用。当执行的流程转向子程序时,实参和虚参按地址结合,实参的存储单元就是对应向子程序时,实参和虚参按地址结合,实参的存储单元就是对应虚参的存储单元,执行完子程序后,虚参又无定义。虚参的存储单元,执行完子程序后,虚参又无定义。2022-5-71811.3.1变量作为虚参1 1. . 当虚参是变量时,实参可以是同一类型的常量、变量、数组元当虚参是变量时,实参可以是同一类型的常量、变量、数组元素和表达式。素和表达式。2 2. . 如果实参是变量或数组,在调用子程序时,对应的虚参实际上如果实参是变量或数组,在调用子程序时,对应的虚参实际上将与实参共用一个存储单元。如果实参是将与实参共

16、用一个存储单元。如果实参是常量常量或或表达式表达式,则子,则子程序中对应的虚参变量的值不应当改变,也就说在这种情况下程序中对应的虚参变量的值不应当改变,也就说在这种情况下虚参不应当在子程序中被赋值。虚参不应当在子程序中被赋值。 integer a,c(3) subroutine sub(x,a)integer a,c(3) subroutine sub(x,a) data c/3 data c/3* *0/ integer x,a0/ integer x,a a=100 a=2 a=100 a=2* *x x call sub(a,c(2) x=2 call sub(a,c(2) x=2* *

17、a a wtite wtite( (* *, ,* *)a,c(2) end)a,c(2) end end end2022-5-719实参与虚参存储的关系c(1) c(2) c(3) 0 0 0100a主程序400ac(1) c(2) c(3) 0 200 0主程序c(1) c(2) c(3) 0 200 0400a主程序子程序子程序xa2022-5-720虚参为字符变量 如果虚参是字符变量,则它的长度应遵循以下两条规则:如果虚参是字符变量,则它的长度应遵循以下两条规则:1、虚参字符变量的长度定义必须、虚参字符变量的长度定义必须小于等于小于等于对应实参变量的长度;对应实参变量的长度;2、虚参字

18、符变量的长度可用、虚参字符变量的长度可用(*)来定义,表示长度不定。当调用子程序时,具有不来定义,表示长度不定。当调用子程序时,具有不定长度的虚参变量自动定义成为与对应实参具有同样长度。定长度的虚参变量自动定义成为与对应实参具有同样长度。 character str1*8,str2*40 subroutine sub(ch) character *(*)ch call sub(str1) call sub(str2) end end2022-5-72111.3.2 数组作为虚参 1、如果虚参数组是数值类型或逻辑类型,在调用子程序如果虚参数组是数值类型或逻辑类型,在调用子程序时将把实参数组第一个

19、元素的地址传送给子程序作为虚时将把实参数组第一个元素的地址传送给子程序作为虚参数组的第一个元素的地址,每个数组占用一串连续的参数组的第一个元素的地址,每个数组占用一串连续的存储单元;存储单元; 2 2、虚实同用一存储单元,并且虚参数组的其余元素与该、虚实同用一存储单元,并且虚参数组的其余元素与该实参数组元素后的元素按排列顺序一一对应结合,不能实参数组元素后的元素按排列顺序一一对应结合,不能超过对应实参数组的范围,与数组维数无关;超过对应实参数组的范围,与数组维数无关;2022-5-72211.3.2 数组作为虚参 3、当数组是字符类型时,虚实和实参数组不是按数组元当数组是字符类型时,虚实和实参

20、数组不是按数组元素的顺序一一对应结合,而是按字符位置一一对应结合;素的顺序一一对应结合,而是按字符位置一一对应结合; 4 4、在子程序中,允许虚参数组是可调数组。虚参数组中、在子程序中,允许虚参数组是可调数组。虚参数组中最后一维的上界可以用星号表示。最后一维的上界可以用星号表示。2022-5-723虚实数组传递对应图dimension a(8)call sub(a)endsubroutine sub(b)dimension b(4) end a(1) a(2) a(3) a(4) a(5) a(6) a(7) a(8) b(1) b(2) b(3) b(4) a(1) a(2) a(3) a(

21、4) a(5) a(6) a(7) a(8) b(1) b(2) b(3) b(4)dimension a(8)call sub(a(3)endsubroutine sub(b)dimension b(4) end2022-5-724虚实字符型数组传递对应图character*4 b(6) call sub(b) endb(1) b(2) b(3) b(4) b(5) b(6) c(1) c(2) c(3) c(4) Subroutine sub(c)character*5 c(4) end2022-5-72511.3.3 子程序名作为参数 在虚参表中允许出现函数名和子例行程序名,根据虚参名在

22、子在虚参表中允许出现函数名和子例行程序名,根据虚参名在子程序中出现时的上下文关系来确定。程序中出现时的上下文关系来确定。 subroutine sub(a,n,x,f) dimension a(n) Y=f(I)+1 x=a(I)+1 end 注:注:external 和和intrinsic语句作用是说明那些函数名是子程序名或内部函数语句作用是说明那些函数名是子程序名或内部函数P2492022-5-72611.3.4 星号作为虚参 (Go) subroutine exam(a,*,*)120 x=x1+x2 return1 call exam(x,*120,*140) else if ( )t

23、hen 140 return2 end endif end2022-5-72711.4 11.4 利用子程序实现程序的模块化设计利用子程序实现程序的模块化设计( (gogo) )n当子程序放在同一个文件时,编译、当子程序放在同一个文件时,编译、连接同原来方法连接同原来方法n当不在同一文件时,分别编译,然后当不在同一文件时,分别编译,然后用用link命令,如下:命令,如下:link 主程序名,子程序主程序名,子程序1,子程序,子程序2;n最后运行可执行程序最后运行可执行程序(主程序名主程序名.exe文件文件)主程序子程序A子程序B2022-5-72811.5在子程序中save语句与data语句 ( (gogo) )n函数子程序或子例行程序中用到的所有变量,在被调用前通常没有确定的存储函数子程序或子例行程序中用到的所有变量,在被调用前通常没有确定的存储单元,每当子程序被调用时才临时分配存储单元,退出子程序时存储单元,这单元,每当子程序被调用时才临时分配存储单元,退出子程序时存储单元,这些变量的值不被保留。下次调用上次的值不存在。些变量的值不被保留。下次调用上次的值不存在。n在函数或子例行程序可以使用在函数或子例行程序可以使用save说明语句来指定子程序中的某些变量的存说明语句来指定子程序中的某些变量的存储单元不被释放,它们的内容在退出子程序

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论