




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第第6 6章章 程序单元和过程程序单元和过程26.1概述概述6.5 子程序的嵌套调用子程序的嵌套调用6.2 函数子程序函数子程序6.6 模块模块6.3 子例子程序子例子程序6.7 递归过程递归过程6.4 虚实结合虚实结合6.8 其他部分其他部分6.9 程序举例程序举例36.1 概述概述主程序的结构:主程序的结构:单元定义单元定义 说明部分说明部分 输入输入 计算或处理计算或处理 输出输出end用子程序完成用子程序完成用子程序完成用子程序完成用子程序完成用子程序完成子程序子程序子程序子程序引入子程序的目的:引入子程序的目的:模块化设计模块化设计所有功能都在主所有功能都在主程序单位内完成程序单位
2、内完成41 1、一个一个fortran90fortran90程序主程序单元个数:程序主程序单元个数:1 1个个2 2、子程序单元:、子程序单元:0-n0-n个个子程序单元不能独立存在子程序单元不能独立存在,只能被主程序单,只能被主程序单元或被其它子程序单元元或被其它子程序单元调用调用,甚至可以递归,甚至可以递归调用(调用本身)调用(调用本身)源程序的结构源程序的结构5子程序(又称过程)的分类:子程序(又称过程)的分类:1 1、函数子程序函数子程序 分为分为内部内部函数子程序函数子程序 外部外部函数子程序函数子程序2 2、子例行子程序子例行子程序 分为分为内部内部子例行子程序子例行子程序 外部外
3、部子例行子程序子例行子程序用于完成用于完成复杂的计算复杂的计算返回返回 一个一个或多个或多个值值用于完成用于完成复杂计算复杂计算,返回,返回一个或多个一个或多个值值,或用于,或用于其它数其它数据处理据处理66.2外部函数子程序外部函数子程序76.2.1函数子程序的编写方法函数子程序的编写方法recursiverecursivefunction function 函数名函数名( (虚元表虚元表)result()result(结果名结果名) )说明部分说明部分程序体:具体计算程序体:具体计算end function end function 函数名函数名 函数子程序的结构函数子程序的结构 8pro
4、gram mainprogram maininteger:integer:fact=1fact=1,sum=0,i,sum=0,ido i=1,ndo i=1,nfact=factfact=fact* *i isum=sum+sum=sum+factfactenddoenddoprintprint* *,sum,sumendend用一个主程序求用一个主程序求1!+2!+5!则代码为:!则代码为:计算计算i!累加累加i!所有功能都在主所有功能都在主程序单位内完成程序单位内完成9例:编写求例:编写求n!的函数子程序。!的函数子程序。function fact(n) result(fact_resu
5、lt)implicit noneinteger:n,i,fact_resultfact_result=1do i=1,nfact_result=fact_result*ienddoend function fact表示函表示函数开始数开始函数名字函数名字n是虚元是虚元表示函表示函数结果数结果存放函数结存放函数结果的变量果的变量至少有一条至少有一条语句给结果语句给结果变量赋值变量赋值 函数结束函数结束虚元与结果变量虚元与结果变量必须进行类型说必须进行类型说明明 10如要求如要求1!+2!+5!, 则主程序为:则主程序为:program maininteger:sum=0,i,factdo i=1
6、,5sum=sum+fact(i)enddoprint*,sumend说明函数说明函数子子程序程序的类型的类型调用函数子调用函数子程序求阶乘程序求阶乘function fact(n) result(fact_result)implicit noneinteger:n,i,fact_resultfact_result=1do i=1,nfact_result=fact_result*ienddoend function fact11end function 函数名函数名一、子程序一、子程序end语句写法语句写法 1 1、函数单位的结束标志、函数单位的结束标志 2 2、将控制返回到主调程序。、将控
7、制返回到主调程序。子程序子程序end语句功能语句功能 说明:说明:121、作为函数子程序的第一行(注释行除外)。、作为函数子程序的第一行(注释行除外)。2、如果函数是递归的,则应以、如果函数是递归的,则应以recursive开头。开头。3、函数名与普通变量名的取法相同,且为全局名,、函数名与普通变量名的取法相同,且为全局名,即作用域为整个程序,即作用域为整个程序,不得与已有的全局名同名。不得与已有的全局名同名。二、子程序开始语句的写法二、子程序开始语句的写法 recursiverecursivefunction function 函数名(虚元表)函数名(虚元表)result(result(结果
8、名结果名) )134、主调程序与被调程序、主调程序与被调程序 两个单位之间的数据传递:两个单位之间的数据传递:result (结果名结果名):函数子程序的一个函数子程序的一个输出结果输出结果一般写法:一般写法:函数名函数名_result,用于用于保存一个计算结果,保存一个计算结果,称为称为函数值函数值。且结果名有类型,必须在子程序说明部分且结果名有类型,必须在子程序说明部分说说明类型明类型。虚元表虚元表:子程序的子程序的所有输入所有输入,及除函数值之外的及除函数值之外的其他计其他计算结果的输出算结果的输出。虚元之间用逗号分隔,都要在说明语句中虚元之间用逗号分隔,都要在说明语句中说明类型。如果没
9、有虚元,函数名后是一对空括号。说明类型。如果没有虚元,函数名后是一对空括号。函数值返回给函数值返回给调用式调用式由实元传递给对由实元传递给对应的虚元应的虚元虚元数据返回给对虚元数据返回给对应的实元应的实元recursiverecursivefunction function 函数名(虚元表)函数名(虚元表)result(result(结果名结果名) )5 5、虚元的含义:、虚元的含义:编写子程序时没有具体值(调用时或调用结编写子程序时没有具体值(调用时或调用结束后才获得数值),因此只是一个符号,表示输入、输出束后才获得数值),因此只是一个符号,表示输入、输出, ,名名字可随便用户取。字可随便用
10、户取。6 6、虚元可以是、虚元可以是变量名、数组名、过程名、指针等变量名、数组名、过程名、指针等。7 7、虚元的可选属性、虚元的可选属性intentintent:intent(in)intent(in):表示函数开始时,虚元从实元中获得值,作为子表示函数开始时,虚元从实元中获得值,作为子程序的输入程序的输入( (不得再改变其值不得再改变其值) )intent(out)intent(out):表示函数结束时,把虚元的值传送给实元,作:表示函数结束时,把虚元的值传送给实元,作为子程序的输出为子程序的输出(对应的实元不能是表达式)(对应的实元不能是表达式)intent(inout)intent(in
11、out):表示虚元既要从实元中获得值,又要向实元:表示虚元既要从实元中获得值,又要向实元传送值,作为子程序的输入输出。传送值,作为子程序的输入输出。例:例:real,intent(in):x,yreal,intent(in):x,y15三、子程序程序体的写法三、子程序程序体的写法 分为说明部分和执行部分。分为说明部分和执行部分。1、说明部分应对程序体内说明部分应对程序体内一切变量、数组等实体一切变量、数组等实体(包括虚元)作出说明,同时还要说明函数结果(包括虚元)作出说明,同时还要说明函数结果变量名,变量名,但不可说明函数名但不可说明函数名。2、执行部分中必须对函数结果名执行部分中必须对函数结
12、果名至少赋值一次。至少赋值一次。function f(x,y,z)result(f_result)implicit nonereal:x,y,z,f_resultf_result=x+yz=x-yend16复习:复习:子程序编写思路子程序编写思路l程序单位定义程序单位定义l虚元表虚元表 子程序所有输入和除结果名以外的输出子程序所有输入和除结果名以外的输出l结果名结果名 不能和函数名同名不能和函数名同名l说明语句说明语句l虚元表中的所有虚元、函数结果名;其它中间变量虚元表中的所有虚元、函数结果名;其它中间变量l不能说明函数名不能说明函数名l执行语句执行语句l完成子程序单位的所有功能完成子程序单位
13、的所有功能l至少有一次对结果名赋值至少有一次对结果名赋值l程序单位结束语句程序单位结束语句lend function17例例6-2、编写函数子程序,求下列公式前、编写函数子程序,求下列公式前n项的和。项的和。nxxxxn32132121132算法算法1 1:将该式的分母定义为函数子程序:将该式的分母定义为函数子程序isum:isum:function isum(n) result(isum_result)implicit noneinteger:n,isum_result,i! !虚元及结果名不能在类型说明语句中赋初值虚元及结果名不能在类型说明语句中赋初值isum_result=0do i=1
14、,nisum_result=isum_result+ienddoend function isum18主调程序:主调程序:program main_sumimplicit noneinteger:n,k,isumreal:x,sread*,n,xs=0.0do k=1,ns=s+x*k/isum(k)enddoprint*,s=,send program main_sum主调程序必主调程序必须说明被调须说明被调函数的类型函数的类型调用调用isum函数函数nxxxxn3213212113219算法算法2:把求和的工作全部由函数实现,这时需要给:把求和的工作全部由函数实现,这时需要给函数设计两个虚
15、元(函数设计两个虚元(n 和和x),如下所示:),如下所示:functionfunction sum2(sum2(n,xn,x) result() result(sum2_resultsum2_result) )implicit noneimplicit noneinteger:integer:n n,i,t=0 ,i,t=0 !t t累加通项分母累加通项分母real:real:x x, ,sum2_resultsum2_resultsum2_result=0sum2_result=0do i=1,ndo i=1,nt=t+it=t+isum2_result=sum2_result+xsum2
16、_result=sum2_result+x* * *i/ti/tenddoenddoend function sum2end function sum2t表示分母表示分母nxxxxn3213212113220主调程序为:主调程序为:program main_sum2program main_sum2implicit noneimplicit noneinteger:ninteger:nreal:real:sum2sum2,x,s,x,sreadread* *,n,x,n,xs=sum2(n,x)s=sum2(n,x)printprint* *,s=,s,s=,send program main
17、_sum2end program main_sum2输入数据输入数据调用函数处理调用函数处理输出结果输出结果fortran中允许不同的程序单中允许不同的程序单元之间可以使用相同的变量名。元之间可以使用相同的变量名。例,主程序中有变量例,主程序中有变量n,x,函数,函数子程序中有虚元子程序中有虚元n,x,但它们不,但它们不是相同的变量。是相同的变量。说明被调函数及主说明被调函数及主程序中使用的变量程序中使用的变量类型类型21调用子程序的执行流程调用子程序的执行流程主调程序主调程序调用子程序调用子程序aend 子程序子程序 a end每当程序调用一个子每当程序调用一个子程序时,程序时,visual
18、 fortran 90就将程序就将程序的返回地址(断点)、的返回地址(断点)、参数、以及局部变量参数、以及局部变量等压入栈内。被调用等压入栈内。被调用的过程运行完后,的过程运行完后,visual fortran 90 将将回收存放变量和参数回收存放变量和参数的栈空间。然后返回的栈空间。然后返回断点继续程序的运行。断点继续程序的运行。 6.2.2函数子程序的调用函数子程序的调用221、调用式是、调用式是表达式表达式, 调用结束后调用式得到函数值。调用结束后调用式得到函数值。2、常见形式:、常见形式:y=函数名(实元表)函数名(实元表)print*,函数名(实元表),函数名(实元表)if(函数名(
19、实元表)(函数名(实元表)注意注意:实元与虚元一般必须在:实元与虚元一般必须在个数、次序、类型个数、次序、类型上上保持一致;但实元与虚元名字可以不同。保持一致;但实元与虚元名字可以不同。函数子程序的调用形式:函数子程序的调用形式: 23function f(x,y,z)result(f_result)implicit nonereal:x,y,z,f_resultf_result=x+yz=x-yendprogram nainread*,a,b,cd=f(a,b,c)print*,c,dend主主子子例:例:虚元虚元实元实元24例例6-3、编写判断素数的函数子程序,调用它实现例、编写判断素数的
20、函数子程序,调用它实现例5-11的功能:求出的功能:求出2050之间的全部素数。之间的全部素数。6.2.3函数子程序应用举例:函数子程序应用举例:function prime(m) result(prime_result)implicit noneinteger:m,i,prime_resultdo i=2,m/2if(mod(m,i)=0) exitenddoif(im/2) thenprime_result=1elseprime_result=0endifend function prime25主调程序:主调程序:program mainimplicit noneinteger:n,pri
21、medo n=20,50if(prime(n)=1) print*,nenddoend program main主调程序必主调程序必须说明函数须说明函数的类型的类型调用调用prime函数(表达式)函数(表达式)26改写改写prime函数(使用逻辑变量):函数(使用逻辑变量):function prime(m) result(prime_result)implicit noneinteger:m,ilogical:prime_resultprime_result=.false.do i=2,m/2if(mod(m,i)=0) exitenddoif(im/2) prime_result=.tru
22、e.end function prime说明结果说明结果为逻辑类为逻辑类型型先假定不先假定不是素数是素数27主调程序:主调程序:program mainimplicit noneinteger:n logical:primedo n=20,50if(prime(n) print*,nenddoend program main主调程序必主调程序必须说明函数须说明函数的类型的类型调用调用prime函数(表达式)函数(表达式)286.3 外部子例行子程序外部子例行子程序外部子例行子程序的结构外部子例行子程序的结构 外部子例行子程序:过程的另一种形式。用户定义,用于外部子例行子程序:过程的另一种形式。
23、用户定义,用于完成复杂计算任务,返回一个或多个值,或用于其它数据完成复杂计算任务,返回一个或多个值,或用于其它数据处理。处理。recursivesubroutine 子程序名(虚元表)子程序名(虚元表)说明部分说明部分程序体程序体end subroutine 子程序名子程序名29与函数子程序的区别与函数子程序的区别 1.1.没有没有resultresult关键字。关键字。2 2、虚元:负责子程序的全部输入和全部输出、虚元:负责子程序的全部输入和全部输出3 3、无虚元时:、无虚元时:subroutint subroutint 子程序名子程序名 或或 subroutint subroutint 子
24、程序名()子程序名()4 4、函数子程序的调用是函数子程序的调用是表达式表达式形式。形式。而而子例子程序必须通过子例子程序必须通过callcall语句来调用语句来调用。 call call 子程序名(实元表)子程序名(实元表)例:编写求例:编写求n!的子例行子程序!的子例行子程序subroutine fact(n,fact_value)implicit noneinteger,intent(in):ninteger,intent(out):fact_valueinteger:ifact_value=1do i=1,nfact_value=fact_value*ienddoend subrout
25、ine fact表示子例行表示子例行子程序开始子程序开始子例行子程子例行子程序名序名两个虚元表示输入和两个虚元表示输入和输出输出给结果变量给结果变量赋值赋值31如要求如要求1!+2!+5!则主程序为:!则主程序为:program maininteger:sum=0,i,valuedo i=1,5call fact(i,value)sum=sum+valueenddoprint*,sumend使用使用call语语句调用句调用注意:主程序中不能对注意:主程序中不能对子例行子程序的名字子例行子程序的名字说明类型说明类型32l首先将该多边形划分成若干个三角形,每个三角形的边长首先将该多边形划分成若干个
26、三角形,每个三角形的边长分别用分别用l1、l2、l3表示。表示。l然后用下面的公式(然后用下面的公式(海伦公式海伦公式)计算每个三角形的面积。)计算每个三角形的面积。最后将这几个三角形的面积相加:最后将这几个三角形的面积相加: l以上问题要经过三次完全相同的运算,但参加运算的以上问题要经过三次完全相同的运算,但参加运算的l1、l2、l3量值不同。我们可以编写一段程序实现这一功能,量值不同。我们可以编写一段程序实现这一功能,并为该程序段命名。在计算每个三角形面积时调用该程序,并为该程序段命名。在计算每个三角形面积时调用该程序,并代入不同的参数完成运算,从而简化设计,便于结构化并代入不同的参数完成
27、运算,从而简化设计,便于结构化的程序设计。的程序设计。 sslalalaasllla)()(2/)(321321例:求如图所示的多边形的面积。(分别使用函数子程例:求如图所示的多边形的面积。(分别使用函数子程序与子例行子程序实现)序与子例行子程序实现)a ab bc cd de el2l2l7l7l6l6l4l4l1l1l3l3l5l5area1area1area2area2area3area333function area(a,b,c) result(area_result)real,intent(in):a,b,creal:p,area_resultp=(a+b+c)/2.area_res
28、ult=sqrt(p*(p-a)*(p-b)*(p-c)end function areaprogram mainimplicit nonereal:l1,l2,l3,l4,l5,l6,l7,s1,s2,s3,sreal:arearead*,l1,l2,l3,l4,l5,l6,l7s1=area(l1,l2,l3)s2=area(l3,l4,l5)s3=area(l5,l6,l7)s=s1+s2+s3print*,s=,send program main方法一:使用函数实方法一:使用函数实现现表达式方式调表达式方式调用用方法方法2:使用子例行子程序实现:使用子例行子程序实现:subroutine area(a,b,c,area_value)implicit nonereal,intent(in):a,b,creal,intent(out):area_valuereal:pp=(a+b+c)/2.area_value=sqrt(p*(p-a)*(p-b)*(p-c)end subroutine area设置第四个参设置第四个参数存放结果数存放结果主调程序为:主调程序为: program mainimplicit non
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025汽车零部件购销合同示范文本
- 2025年非金属矿物制品:耐火项目合作计划书
- 2025年沼气专用发电装置项目合作计划书
- 2025医疗机构设备购货合同模板
- 2025房产评估委托合同
- 2025年新型全液压钻机项目合作计划书
- 七年级地理结业考试高考衔接型选择题(100 题)
- 2025年智能电能表及配件合作协议书
- 2025年儿童心理咨询师考试试题及答案展示
- 2025年高压自动重合器合作协议书
- 黑臭水系治理工程监理大纲
- 温度显示与报警课程设计
- 国有土地使用权的评估与出让管理
- 延髓梗死护理查房课件
- 2023年标准化工程师考试真题模拟汇编(共402题)
- 8.1陶瓷器及宋代五大名窑(全国导游基础知识-第五版-)
- 中等职业学校语文课程标准(2020年版)(word精排版)
- 托管专项施工方案
- 汽车产品可靠性工程框架
- 风电项目开发流程教学课件
- 泌尿外科前列腺增生一病一品
评论
0/150
提交评论