版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第七章 函 数,7 函数,程序代码中需要重复的某个功能和重复使用某一段程序代码时,可用函数。 “函数”包括:自定义函数(function) 和子程序(subroutine) 自定义函数扩充库函数的功能,71 子程序(SUBROUTINE),以subroutine 开头,要取名。以return 返回;end或end subroutine 或end subroutine name结束 用call 来调用 主程序不一定要放在最开头,书写顺序可任意 子程序独立地拥有属于自己的变量声明;主程序和子程序中声明的变量各不相干 子程序拥有独立的行代码(format 等用) 互相之间传递参数,72 自定义函数(
2、FUNCTION),与子程序的不同: 1)会返回一个数值,并对储存返回值的函数名要有类型声明; 2)调用时不用call,但调用前要对自定义函数名声明;,73 全局变量(COMMON),定义一块共享的内存空间,不同的程序单元之间(函数之间,函数与主程序之间),声明的变量使用相同的内存位置,以传递数据。 FORTRAN 77使用 两种:1)无名公用区;2)有名公用区 各程序单元COMMON中的变量类型必须按位置一一对应 用Block data 模块赋初值,74函数中的变量,函数中的变量(不含所输入的参数)是独立的(局部变量),其生存时间,仅在子程序被调用期间。 声明中用SAVE,可保证程序整个执行
3、过程中,始终保留其内存空间,上一设置的内容有记忆。 传递参数的注意事项: 函数或子程序的虚参数,在调用前不配置内存,只是形式。调用时,与实参按地址结合。退出子程序时,虚参又变得无定义。 一) 类型匹配 传递的参量要求类型匹配,可以直接传递常数,常量的类型也要匹配,二) 数组参数 1)传递数组参数实际上传递的是数组元素的内存地址 函数所接受到的数组参数,都在函数执行前已经配置好一块连续的内存空间,函数中的声明只是定义如何去使用它们,可以使用其中一部分;把一维变成二维;改变坐标范围等。 2)函数数组参数传递时,虚参数组不要超过实参数组的范围。编译器不会辨别,但执行会出错. 3) 数组在声明时,要使
4、用常数来确定数组的尺寸,当作为函数的虚参,可用虚参变量来声明数组的尺寸。 4)作为函数虚参的多维数组,最高一维的大小可以不声明,其他维必须声明尺寸。 三)传递函数 传递的参数可以是函数名(function,subroutine) 作实参的函数名要先声明。 函数声明时,intrinsic 表示库函数;external表示自定义的函数。,字符串数组的传递:传递字符串变量时可以不声明长度,不同于数组,不能写为str(8) Str(8:8)传递单个内存空间,多维数组的传递:最高一维的大小可以不声明,其他维必须声明尺寸,不能写成 write(*, *) a,数组声明为:A(L,M,N) A(x,y,z)
5、的内存位置为: 1+(x-1)+(y-1)*L+(z-1)*L*M 未用到最高维,program ch_array implicit none character(len=5) : ch(5) !字符串数组5*5 data ch/12345, bbbbb, ccccc, ddddd, eeeee/ call sub(ch) stop end subroutine sub( B ) implicit none integer i character(len=4) : B(5) write(*,(1X, A) (B(i), i=1,5) return end subroutine,字符串数组的传递
6、,7-4-3 变量的生存周期,函数中的变量(不含所输入的参数)的生存时间,仅在子程序被调用期间。 声明中用SAVE,可保证程序整个执行过程中,始终保留其内存空间,上一设置的内容有记忆。,Fortran 90 Integer, save : counter=1,Visual Fortran 中 都保留函数中变量 ! 注意初值和赋值的区别,744 传递函数,传递的参数可以是函数名(function,subroutine) 作实参的函数名要先声明。 函数声明时,intrinsic 表示库函数;external表示自定义的函数。,844 传递函数,在函数不作参数传递时External 可省略,库函数不
7、必声明,子程序可作参数, 7-5特殊参数的使用方法,Fortran 90 中:可设置某些参数的属性:为只读或可写等 参数个数可以不定 传递参数的顺序可变,7-5-1 参数的属性,FORTRAN 90用INTENT设置虚参的属性: 类型,INTENT(IN): 参数变量名 !参数为只读,不能改变数值,否则编译会出现错误信息 类型,INTENT(OUT): 参数变量名 !参数在程序中重新设置数值,否则编译会出现警告 类型,INTENT(INOUT): 参数变量名 !参数可读可写,和没指定一样 Fortran 中,变量作为实参传递出去之后,在调用函数后有可能被改变,以此来限制或提醒。,7-5-2 函
8、数的使用接口(INTERFACE),INTERFACE是一段程序模块,说明所要调用的函数的参数类型及返回值的类型等。,例:,结构:,Interface !interface定义开始 Function func_name(n1, n2nm) !开始定义函数 func_name Implicit none Integer !声明参数n1nm及返回值func_name Real !的数值类型 End function func_name !定义函数func_name结束 Subroutine sub_name ( ) !定义子程序sub_name Implicit none Integer . !声
9、明参数的数值类型 Real . End subroutine sub_name . End interface !interface 结束,7-5-2 函数的使用接口(INTERFACE),调用必须要使用interface的情况: 函数返回值为数组 指定参数位置来传递参数时 所调用的函数的参数数目不固定 输入指针参数时 函数返回值为指针时,7-5-3 不定个数的参数的传递,Fortran 90 中采用optional 命令来声明可省略参数,要用interface作函数的参数定义,或用Module来定义,7-5-4 改变参数的传递位置,Fortran 90中,可以改变参数传递位置,要用inter
10、face声明 subroutine sub(a, b,c) Call sub(b=2, c=3, a=1) 直接代入虚参变量名(已在interface 声明)来传递 子程序接受到的是a=1, b=2, c=3 对于有多个可省略参数的函数,调用时可使用这个办法只传递其中的部分参数,例:,Subroutine sub(a, b, c, d, e, f) implicit none integer, optional: a, b, c, d, e, f end subroutine sub Call sub(b=3, f=5) !只输入b和f的值,其他省略,例:要计算 , 对于A, B,C没有的情况
11、默认为0来计算,7-6 特殊的函数类型,Fortran 90中的函数可以特别指定成 RECURSIVE 递归 PURE ELEMENTAL 这三种特殊类型,并行及数组设置时使用,7-6-1 递归(RECURSIVE),递归函数除了被其他程序块调用外,可以自己调用自己来执行程序 必要条件: 每次被调用时,递归函数中的局部变量(那些不是传递的参数和SAVE的变量)独立存在,每次被调用会使用不同的内存地址。 用result来设置另一个储存返回值的变量 程序中要设置调用终点,以免无限循环调用,格式 : Recursive 类型 function func_name( parameters) resul
12、t (ans),Result可以用来在程序代码中使用另外一个名字来设置函数的返回值,根据fortran 90标准,最开始加上recursive才能递归调用,Recursive subroutine ( parameters ),例题, 计算N! N!=N*(n-1)*(n-2)*2*1=N*(N-1)!,执行: 【ans = n * fact(n-1) 】 n=4 第一次调用:ans=4*fact(n-1) , 调用fact(3) 第二次调用:n=3, ans=3*fact(n-1), 调用fact(2) 第三次调用:n=2, ans=2*fact(n-1), 调用fact(1) 第四次调用:
13、n=1, ans=1, 返回,返回值 Fact(1)=Ans=1 Fact(2)=ans=2*fact(1)=2! Fact(3)=ans=3*fact(2)=3! Fact(4)=ans=4*fact(3)=4!,每次被调用时,递归函数中的局部变量独立存在,每次被调用会使用不同的内存地址。,执行: n=4 第一次调用:count=1, localcount=1, count=2, ans=4*fact(3) 第二次调用:n=3, localcount=2, count=3, ans=3*fact(2) 第三次调用:n=2, localcount=3, count=4, ans=2*fact(
14、1) 第四次调用:n=1, localcount=4 count=5, ans=1, 返回,返回后 N=2, Fact(1)=Ans=1, count=5, localcount=3; N=3, Fact(2)=ans=2*fact(1)=2! Count5,localcount=2; N=4, Fact(3)=ans=3*fact(2)=3! Count=5, localcount=1 主程序: Fact(4)=ans=4*fact(3)=4!,write(6,(I2,th enter, n=,I2) localcount, nans = n * fact(temp) write(6,(I2
15、,th exit, n=,I2, ans=,I5, count=, i3) localcount, n, ans, count,特别注意改变传递参数带来的问题,非递归函数的局部变量可能每次调用放在相同的内存位置,WRITE(6, 100) localcount, n FORMAT(I2,th enter, n=,I2) . Temp=n-1 fact = n * ifact(temp) WRITE(6, 200) localcount, n, fact,从第2次调用开始temp和虚参的n公用地址,在函数中不断的减1,用Subroutine,快速排序法 (Quick Sort),Until n=1,快速排序法 (Quick Sort),recursive,分裂到只有一个数时结束,Sort and division: 把第一个数放到某个位置s, 使左边的数据小于a(s); 右边的数据大于 a(s),排列10个0100的随机数 p.493,应该是:if(E=S) return,递归函数的调用包含递推和回归的两个过程, 执行效率比较低,Now, A(R ) K=A
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年留学中介加盟合作风险与院校资源把控
- 2026年考场突发情况应急处理指南
- 2026年渠道部年度工作总结与经销商管理计划
- 2026年建筑施工风险辨识与高处坠落应急措施
- 2026年旅游景区安全生产应急预案
- 2026年施工现场防台风应急预案
- 2026年华为技术有限公司管理模式
- 2026年WELL健康建筑标准认证要点与实施技巧
- 2026年理财公司现金管理类产品手册
- 2026年施工现场安全文化建设与CI形象打造
- 2026年及未来5年市场数据中国防静电防潮袋行业发展监测及投资战略咨询报告
- 食品生产供应商管理制度
- 2026黑龙江双鸭山公益性岗位招聘176人备考考试题库附答案解析
- 2025年云南烟草招聘考试真题
- 卫气营血辨证护理
- 2026年山东能源集团招聘笔试习题含答案
- 影子老师陪读合同范本
- 招标档案移交制度
- 2025年榆林神木市信息产业发展集团招聘备考题库(35人)及答案详解(新)
- 商铺消防改造方施工方案
- 森林防灭火知识培训课件
评论
0/150
提交评论