收藏 分享(赏)

第8章 子程序.ppt

上传人:gnk289057 文档编号:8010445 上传时间:2019-06-04 格式:PPT 页数:33 大小:168.50KB
下载 相关 举报
第8章 子程序.ppt_第1页
第1页 / 共33页
第8章 子程序.ppt_第2页
第2页 / 共33页
第8章 子程序.ppt_第3页
第3页 / 共33页
第8章 子程序.ppt_第4页
第4页 / 共33页
第8章 子程序.ppt_第5页
第5页 / 共33页
点击查看更多>>
资源描述

1、第八章 子程序,语句函数 函数子程序 子例行程序 程序单元之间的数据传递 递归调用 等价语句与数据块子程序 内部子程序 模块,一、语句函数,1语句函数的定义 语句函数定义的一般格式是:f(x1,x2,xn)=e 2语句函数的调用 语句函数的调用形式和内在函数完全相同。 例1 计算f(1) f(10) f(12) f(-5)的值。 例2 找出100999之间的所有水仙花数。,二、函数子程序,1函数子程序的定义 函数子程序的定义格式是: 类型说明 FUNCTION 函数名(虚参表)函数体 END 函数名的命名方法与变量名相同,虚参可以是简单变量和数组变量,但不能是常数、数组元素、表达式),例1,求

2、 分析:上述三个数列的通项不同,求和范围也不同,用一个程序段难以同时计算三个数列的和,并且,因为无法用一个语句函数完成数列的求和计算,所以也无法使用语句函数来简化程序设计。可以采用函数子程序来完成这个问题。设计一个求和的函数子程序SM(M,N,L),M、N分别为求和范围的上、下界,L反映数列通项的性质。,函数定义部分应注意如下问题: (1)函数不能有同名虚参。虚参的类型可以在函数体中进行说明,当未对虚参类型进行说明时,虚参类型遵守IN隐含规则。 (2)函数定义部分中一定要有一个语句将函数值赋值给函数名,这种赋值语句的格式是:函数名=表达式。注意不要在函数名后带上括弧。,2函数子程序的调用,调用

3、一个函数子程序的方法和调用内在函数和语句函数的方法基本相同。 例2 用函数子程序的方法设计一个程序,求50100内的所有素数及其和。 分析:设计一个函数子程序 PRIME(N):主程序的任务是应用PRIME函数子程序在50100之间使用枚举法求出那些使PRIME函数值为1的自然数并求这些数的和。,思考:子程序的返回值分别为逻辑型、字符型时,主、子程序程序做何修改?,例2 当一个数各个数位的立方和等于这个数本身时,称这样的数为水仙花数(如153=1*3+5*3+3*3,所以,153是一个水仙花数。)编程:求100999之间的水仙花数。 分析:设计一个函数子程序NUM(N,I),当I=100时,函

4、数NUM返回N的百位上的数;当I=10时,NUM返回N的十位上的数,I=1时,NUM返回N的个位上的数。主程序中调用NUM函数在100999之间找出所有水仙花数。,三、子例行程序,1子例行子程序的定义 子例行子程序定义格式是: SUBROUTINE 子程序名(虚参表)子例行程序体 END 子程序的命名方法与变量相同。虚参由变量、数组名(不能是数组元素,常数、表达式)充当,当虚参多于一个时,各虚参间用逗号分隔,当没有虚参时,子例行程序名后的一对括弧可以省略。 子例行程序的设计方法和函数子程序相同,但因为其名字没有值,所以不能有对子例行程序的名字赋值的语句。,2子例行子程序的调用 子例行程序的调用

5、格式是: CALL 子例行程序名(实参表) 其实参的类型与函数子程序相同。和函数子程序的调用不同的是,子例行子程序的调用是一个独立的语句。 例1 用子例行程序的方法求上面的s1,s2,s3。 例2 设计一个子例行程序程序,求任意矩阵的转置矩阵。,实验九 子程序(一),四、程序单元之间的数据传递,1简单变量作为虚参 (1)简单变量或数组元素作为实参。系统将实参与虚参安排同一个存储单元,对虚参的任何改变都作用在对应的实参上,因而调用一个子程序(包括函数子程序和子例行程序)时,实参的值有可能改变。 (2)常量或表达式作为实参。首先计算表达式的值(如果实参为表达式时) ,然后将该值赋值给对应的虚参。此

6、种情况下,子程序中不能改变与常量(或表达式)对应的虚参的值。 2数组名作为虚参 当虚参是数组名时,对应的实参可以是与虚参类型相同的数组名或数组元素,并且实参与虚参共用一片连续的存储单元。,例:写出下列程序的执行结果,INTEGER A(5)N1=1N2=1DO 10 J=1,5 10 A(J)=M(N1,N2)WRITE(*,*)AENDFUNCTION M(I1,I2)M=I1+I2I1=I2I2=MEND,J=1 J=2 J=3 J=4 J=5,例,PROGRAM MAIN INTEGER A(10) CALL SB(A(3) END SUBROUTINE SB(B) DIMENSION

7、B(6) END,DIMENSION B(10),四、程序单元之间的数据传递,3子程序名作为虚参 例 设有三个连续函数:,四、程序单元之间的数据传递,4变量的作用域 (1)变量存储区的分配与释放 (2)变量作用域 (3)子程序中变量的存储属性:SAVE 属性,STATIC属性,AUTOMATIC属性 变量的存储属性的说明方法是: 存储属性 变量名表 例如 AUTOMATIC A,B,C INTEGER SAVE X,Y,例,分析:定义一个函数,实现的功能相当于f(a)/(f(b)*f(c)),函数有四个参数(FUN,A,B,C),其中FUN是虚拟函数名,A、B、C为自变量,第一次调用时把内部函

8、数名SIN传送给FUN,第二次调用时把内部函数名COS传送给FUN。,五、递归调用,1递归的概念 2递归函数 递归函数的定义格式是: RECURSIVE FUNCTION 函数名(虚参表) RESULT(变量名)调用该函数本身 END,例1 设计一个计算N!的函数子程序。 函数子程序如下: RECURSIVE FUNCTION FAC(N) RESULT(FAC1)IF (N=1) THENFAC1=1 !只能给FAC1赋值ELSEFAC1=N*FAC(N-1) !只能调用FAC函数ENDIF END,六、数据共用存储单元与数据块子程序,1等价语句 语句格式是: EQUIVALENCE (变量

9、表1),(变量表2), 例如 EQUIVALENCE (L,M,N),(A,B,C) !定义L、M、N等价,A、B、C等价。 DIMENSION A(15),B(3,5) EQUIVLENCE (A,B) !定义数组A、B等价,例 设计一个子例行程序,对一个二维数组按其存储顺序排升序。 分析:对一维数组排序比二维数组排序方便,如果我们设计一个与要排序的二维数组等价的一维数组,则对该一维数组的排序就是对与其等价的二维数组的排序。 注意:等价语句(EQUIVALENCE)只是建立同一个程序单元中几个变量之间的等价关系,不能实现不同程序单元之间的数据交换,不要试图通过定义不同程序单元之间的变量等价来

10、实现程序单元间的通信。,六、数据共用存储单元与数据块子程序,2公用数据块 公用数据区就是一个程序中的每个程序单元都可以访问的公共区域。数据共用区分为有名公用区和无名公用区两种,一个程序只有一个无名公用区,但可以定义多个有名公用区。定义共用区的语句格式是: COMMON 变量名表 !在无名公用区中定义了一组变量 COMMON /公用区名1/变量名表1,/共用区名2/变量名表2,! 在公用区1中定义了变量表1,在公用区2中定义了变量表2。,例 设计一个按分数规则进行加减法程序。 分析:一般的分数加减法的形式是:其中:i=k* nm *l,J=l*m i,j的最大公约数为1 我们设计一个子程序完成i

11、,j的计算,显然,子程序要从主程序中获取k、l、m、n等4个数据和一个运算符,并且要把结果i、j返回个主程序,这样,主子程序间共有7个量要进行通信。,例:写出下列程序的结果,COMMON X,Y,A(5)X=2.3Y=-3.7DO K=1,5A(K)=K+0.5END DOCALL SUBENDSUBROUTINE SUBCOMMON B(4),P,QWRITE(*,*) B,P,QEND,六、数据共用存储单元与数据块子程序,3数据块子程序 数据块程序单元的格式是: BLOCK DATA 程序名 程序单元 END BLOCK DATA,独立的程序单元,以上所讨论的子程序都是作为一个独立的程序单

12、元。所谓独立的程序单元具有两个特征: (1)从形式上看,各种独立的程序单元的源程序是分别编写的,当上一个程序单元的代码编写完后(出现了程序单元的结束语句END),才开始另一个程序单元代码的编写,代码之间没有嵌套、没有交叉。 (2)从变量的作用域来看,每个程序单元拥有一组独立的变量空间,各程序单元之间的变量是彼此独立的,相互不干扰。两个程序单元要传递数据时,要么使用参数的虚实结合方法,要么通过公用数据区。任何程序单元都不能直接引用其它程序单元的变量。,七、内部子程序,如果一个子程序建立在某个程序单元的内部,那么这个子程序就不再是一个程序单元,而是一个内部子程序。 例 设计一个程序,求同时满足下列

13、两个条件的分数X的个数: (1)1/6X1/5 (2)X 的分子分母都是素数且分母是两位数 分析:设X=M/N,根据条件(2),10N99,根据条件(1),5MN6M,并且M、N均为素数,我们用枚举法来求解这个问题,并设计一个内部函数子程序来判断一个数是否素数。,八、模块,模块是FORTRAN 90新建立的概念。一个模块中可以包含任意多个除主程序外的其它程序单元,包含在模块中的子程序称为模块子程序。模块子程序可以供其它程序单元调用。可以认为模块为程序设计人员提供了一个对子程序打包的工具。模块的引入方便了用户管理自己的子程序,也为各种优秀的程序的传播提供了载体。,1模块的建立,建立模块的语句格式

14、是: MOUDLE 模块名 模块说明语句 CONTAINS 模块子程序1 模块子程序2 END MODULE 模块名,2模块的调用,格式一: USE 模块名 功能: 连接模块中的全部子程序和数据说明部分,使主调程序能以与模块中完全相同的子程序名调用其中的所有程序单元。 格式二: USE 模块名,别名=子程序名 功能: 连接模块中的全部子程序和数据说明部分,使主调程序以指定别名调用模块中的某个子程序。 格式三: USE 模块名,ONLY :子程序名 功能: 只连接模块中的指定程序,从而主调程序只能调用指定的子程序。,例1 设计一个程序,计算:,九、程序举例,例 1 用复合梯形公式求下列函数在-1

15、,1上的积分。例2 用牛顿迭代公式求方程f(X)=0的一个根,设:例3 设计一个函数子程序,求多项式:在任一点x0处的值。并用其计算多项式:,例4 设计一个求两个矩阵乘积的子例行程序,并调用该程序求矩阵A、B的积。例5 MaCrathy 91 函数定义如下:设计一个计算M(n)的函数子程序 Ma(n),并计算Ma(30),Ma(40),Ma(50),Ma(60),Ma(70),Ma(80),Ma(90),Ma(100),Ma(110),Ma(120),Ma(150)的函数值。,总 结,子程序是将反复要用到的程序段定义为一个独立的程序单元,当需要的时候,不需重复书写而直接调用即可。利用子程序可实现应用程序的模块化结构。要掌握各类子程序的结构、调用方法以及各自的特点。实验九 子程序(二),

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报