fortran课件 第7章_2_11.ppt

上传人:s****8 文档编号:82791188 上传时间:2023-03-26 格式:PPT 页数:60 大小:1.27MB
返回 下载 相关 举报
fortran课件 第7章_2_11.ppt_第1页
第1页 / 共60页
fortran课件 第7章_2_11.ppt_第2页
第2页 / 共60页
点击查看更多>>
资源描述

《fortran课件 第7章_2_11.ppt》由会员分享,可在线阅读,更多相关《fortran课件 第7章_2_11.ppt(60页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第七章第七章 函函 数数7 函数函数程序代码中需要重复的某个功能和重复使用某一段程序代码中需要重复的某个功能和重复使用某一段程序代码时,可用函数。程序代码时,可用函数。“函数函数”包括:自定义函数包括:自定义函数(function)和子程序和子程序(subroutine)自定义函数扩充库函数的功能自定义函数扩充库函数的功能71 子程序(子程序(SUBROUTINE)以以subroutine 开头,要取名。以开头,要取名。以return 返回;返回;end或或end subroutine 或或end subroutine name结束结束用用call 来调用来调用主程序不一定要放在最开头,书写顺

2、序可任意主程序不一定要放在最开头,书写顺序可任意子程序独立地拥有属于自己的变量声明;主程序和子程序独立地拥有属于自己的变量声明;主程序和子程序中声明的变量各不相干子程序中声明的变量各不相干子程序拥有独立的行代码子程序拥有独立的行代码(format 等用)等用)互相之间传递参数互相之间传递参数72 自定义函数(自定义函数(FUNCTION)与子程序的不同:与子程序的不同:1)会返回一个数值,并对储存返回值的)会返回一个数值,并对储存返回值的函数名函数名要有要有类型声明类型声明;2)调用时不用)调用时不用call,但调用前要对自定义函数名声,但调用前要对自定义函数名声明;明;73 全局变量(全局变

3、量(COMMON)定义一块共享的内存空间,不同的程序单元之间定义一块共享的内存空间,不同的程序单元之间(函数之间,函数与主程序之间),声明的变量使(函数之间,函数与主程序之间),声明的变量使用相同的内存位置,以传递数据。用相同的内存位置,以传递数据。FORTRAN 77使用使用两种:两种:1)无名公用区;)无名公用区;2)有名公用区)有名公用区各程序单元各程序单元COMMON中的中的变量类型变量类型必须按位置一必须按位置一一对应一对应用用Block data 模块赋初值模块赋初值74函数中的变量函数中的变量函数中的变量(不含所输入的参数)是独立的(局部变量)函数中的变量(不含所输入的参数)是独

4、立的(局部变量),其生存时间,仅在子程序被调用期间。,其生存时间,仅在子程序被调用期间。声明中用声明中用SAVE,可保证程序整个执行过程中,始终保留其,可保证程序整个执行过程中,始终保留其内存空间,上一设置的内容有记忆。内存空间,上一设置的内容有记忆。传递参数的注意事项传递参数的注意事项:函数或子程序的虚参数,在调用前不配置内存,只是形式。调用时,函数或子程序的虚参数,在调用前不配置内存,只是形式。调用时,与实参按地址结合。退出子程序时,虚参又变得无定义。与实参按地址结合。退出子程序时,虚参又变得无定义。一一)类型匹配类型匹配传递的参量要求类型匹配,可以直接传递常数,常量的类传递的参量要求类型

5、匹配,可以直接传递常数,常量的类型也要匹配型也要匹配二二)数组参数数组参数1)传递数组参数实际上传递的是数组元素的内存地址)传递数组参数实际上传递的是数组元素的内存地址 函数所接受到的数组参数,都在函数执行前已经配置好一块连续的内函数所接受到的数组参数,都在函数执行前已经配置好一块连续的内存空间,函数中的声明只是定义如何去使用它们,可以使用其中一部存空间,函数中的声明只是定义如何去使用它们,可以使用其中一部分;把一维变成二维;改变坐标范围等。分;把一维变成二维;改变坐标范围等。2)函数数组参数传递时,虚参数组不要超过实参数组的范围。)函数数组参数传递时,虚参数组不要超过实参数组的范围。编译器不

6、会辨别,但执行会出错编译器不会辨别,但执行会出错.3)数组在声明时,要使用常数来确定数组的尺寸,当作为函数组在声明时,要使用常数来确定数组的尺寸,当作为函数的虚参,可用虚参变量来声明数组的尺寸。数的虚参,可用虚参变量来声明数组的尺寸。4)作为函数虚参的多维数组,最高一维的大小可以不声明,)作为函数虚参的多维数组,最高一维的大小可以不声明,其他维必须声明尺寸。其他维必须声明尺寸。三)三)传递函数传递函数传递的参数可以是函数名(传递的参数可以是函数名(function,subroutine)作实参的函数名要先声明。作实参的函数名要先声明。函数声明时,函数声明时,intrinsic 表示库函数;表示

7、库函数;external表示自定义的表示自定义的函数。函数。字符串数组的传递字符串数组的传递:传递字符串变量时可以不声明长度传递字符串变量时可以不声明长度 不同于数组,不能写为不同于数组,不能写为str(8)Str(8:8)传递单个内存空间传递单个内存空间多维数组的传递多维数组的传递:最高一维的大小可以不声明,其他维必须声明尺寸最高一维的大小可以不声明,其他维必须声明尺寸 不能写成不能写成 write(*,*)a数组声明为:数组声明为:A(L,M,N)A(x,y,z)的内存位置为:的内存位置为:1+(x-1)+(y-1)*L+(z-1)*L*M 未用到最高维未用到最高维 program ch_

8、arrayimplicit none character(len=5):ch(5)!字符串数组字符串数组5*5 data ch/12345,bbbbb,ccccc,ddddd,eeeee/call sub(ch)stopendsubroutine sub(B)implicit none integer i character(len=4):B(5)write(*,(1X,A)(B(i),i=1,5)returnend subroutine字符串数组的传递字符串数组的传递 chCh(1)Ch(2)Ch(3)Ch(4)Ch(5)12345bbbbbccccccdddddeeeeeb12345bbb

9、bbcccccdddddB(1)B(2)B(3)B(4)B(5)7-4-3 变量的生存周期变量的生存周期函数中的变量(不含所输入的参数)的生存时间,函数中的变量(不含所输入的参数)的生存时间,仅在子程序被调用期间。仅在子程序被调用期间。声明中用声明中用SAVE,可保证程序整个执行过程中,始,可保证程序整个执行过程中,始终保留其内存空间,上一设置的内容有记忆。终保留其内存空间,上一设置的内容有记忆。Fortran 90Integer,save:counter=1Visual Fortran 中中都保留函数中变量都保留函数中变量 !注意初值和赋值的区别注意初值和赋值的区别744 传递函数传递函数传

10、递的参数可以是函数名(传递的参数可以是函数名(function,subroutine)作实参的函数名要先声明。作实参的函数名要先声明。函数声明时,函数声明时,intrinsic 表示库函数;表示库函数;external表示表示自定义的函数。自定义的函数。844 传递函数传递函数在函数不作参数传递时在函数不作参数传递时External 可省略,库函数不必声明可省略,库函数不必声明子程序可作参数子程序可作参数 7-5特殊参数的使用方法特殊参数的使用方法Fortran 90 中:可设置某些参数的属性:为中:可设置某些参数的属性:为只读只读或或可可写写等等 参数个数可以不定参数个数可以不定 传递参数的

11、顺序可变传递参数的顺序可变 7-5-1 参数的属性参数的属性FORTRAN 90用用INTENT设置虚参的属性:设置虚参的属性:类型,类型,INTENT(IN):参数变量名参数变量名 !参数为只读,不能改变数值,否则编译会出现错误信息!参数为只读,不能改变数值,否则编译会出现错误信息 类型,类型,INTENT(OUT):参数变量名参数变量名 !参数在程序中重新设置数值,否则编译会出现警告!参数在程序中重新设置数值,否则编译会出现警告 类型,类型,INTENT(INOUT):参数变量名参数变量名 !参数可读可写,和没指定一样!参数可读可写,和没指定一样Fortran 中,变量作为实参传递出去之后

12、,在调用函中,变量作为实参传递出去之后,在调用函数后有可能被改变,以此来限制或提醒。数后有可能被改变,以此来限制或提醒。7-5-2 函数的使用接口(函数的使用接口(INTERFACE)INTERFACE是一段程序模块,说明所要调用是一段程序模块,说明所要调用的函数的的函数的参数类型参数类型及及返回值的类型返回值的类型等。等。例:例:结构:Interface !interface定定义义开始开始 Function func_name(n1,n2nm)!开始定开始定义义函数函数 func_name Implicit none Integer !声明参数!声明参数n1nm及返回及返回值值func_n

13、ame Real !的数!的数值类值类型型End function func_name !定定义义函数函数func_name结结束束Subroutine sub_name()!定定义义子程序子程序sub_name Implicit none Integer.!声明参数的数值类型!声明参数的数值类型 Real .End subroutine sub_name.End interface !interface 结结束束 7-5-2 函数的使用接口(函数的使用接口(INTERFACE)调用必须要使用调用必须要使用interface的情况的情况:1.函数返回值为数组函数返回值为数组2.指定参数位置来传

14、递参数时指定参数位置来传递参数时3.所调用的函数的参数数目不固定所调用的函数的参数数目不固定4.输入指针参数时输入指针参数时5.函数返回值为指针时函数返回值为指针时7-5-3 不定个数的参数的传递不定个数的参数的传递Fortran 90 中采用中采用optional 命令来声明命令来声明可省略可省略参数,参数,要用要用interface作函数的参作函数的参数定义,或用数定义,或用Module来定义来定义 7-5-4 改变参数的传递位置改变参数的传递位置Fortran 90中,可以改变参数传递位置,要用中,可以改变参数传递位置,要用interface声明声明subroutine sub(a,b,

15、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 subCall sub(b=3,f=5)!只输入只输入b和和f的值,其他省略的值,其他省略例:

16、要计算例:要计算 ,对于对于A,B,C没有的情没有的情况默认为况默认为0来计算来计算7-6 特殊的函数类型特殊的函数类型Fortran 90中的函数可以特别指定成中的函数可以特别指定成RECURSIVE 递归递归 PURE ELEMENTAL这三种特殊类型这三种特殊类型并行及数组设置时使用并行及数组设置时使用7-6-1 递归(递归(RECURSIVE)递归递归函数除了被其他程序块调用外,可以自己函数除了被其他程序块调用外,可以自己调用自己来执行程序调用自己来执行程序必要条件:必要条件:每次被调用时,递归函数中的局部变每次被调用时,递归函数中的局部变量(那些不是传递的参数和量(那些不是传递的参数

17、和SAVE的变量)独立存的变量)独立存在,每次被调用会使用不同的内存地址在,每次被调用会使用不同的内存地址。用用result来设置另一个储存返回值的变量来设置另一个储存返回值的变量程序中要设置调用终点,以免无限循环调用程序中要设置调用终点,以免无限循环调用格式:Recursive 类型类型 function func_name(parameters)result(ans)Result可可以以用用来来在在程程序序代代码码中中使使用用另另外外一一个个名名字字来来设设置置函函数数的返回值,根据的返回值,根据fortran 90标准标准最最开开始始加加上上recursive才才能递归调用能递归调用Re

18、cursive 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)第四次调用:第四次调用:n=1,ans=1,返回返回返回值返回值 Fact(1)=Ans=1Fact(2)=ans=2*fact(1)=2!Fact(3)=

19、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(1)第四次调用:第四次调用:n=1,localc

20、ount=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,th exit,n=,I2,ans=,I5,count=,i3)localcoun

21、t,n,ans,count特别注意改变传递参数带来的问题特别注意改变传递参数带来的问题非递归函数的局部变量可能每次调用放在相同的内存位置非递归函数的局部变量可能每次调用放在相同的内存位置 WRITE(6,100)localcount,n100FORMAT(I2,th enter,n=,I2)101.102Temp=n-1103fact=n*ifact(temp)WRITE(6,200)localcount,n,fact从第从第2次调用开始次调用开始temp和虚参的和虚参的n公公用地址,在函数中用地址,在函数中不断的减不断的减1用用Subroutine快速排序法快速排序法(Quick Sort)

22、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(S)or r=s7-6-2 内部函数内部函数包含在某些程序单元中(主程序或函数包含在某些程序单元中(主程序或函数)中,只能在本程序单元中被调中,只能在本程序单元中被调用的函数用的函数。Program main 或 subroutine sub 或 function func stop contains 开始写局部函数 subroutine localsub end subroutine localsub function localfunc End functionEnd program/subroutine/function 内部函数无需声明内部函数无需声明

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

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁