Fortran-95-程序设计-第七章

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

中山大学环境科学与工程学院陆希九.函数和子程序♦概述♦语句函数♦函数子程序(自定义函数)(funcation)♦子例行程序(subroutine)♦实参和虚参之间的数据传送♦其它应用♦概述使用顺序结构、选择结构和循环结构可设计和编写一些比较复杂的程序;使用函数和子例行程序能编写编写结构清晰、层次分明、短小简洁的好程序,是编写高质量、高水平、高效率程序的有效手段。在设计和编写程序时,程序中不同部位会多次出现相同或相似的运算或处理过程(程序代码)例如:求五边形ABCDE的面积问题,如图所示。已知:五边形5条边长为:a、b、c、d、e,两条对角线为:f、g。五边形面积计算问题变为3个三角形面积计算问题,3个三角形面积area1、area2、area3之和就是五边形面积area。三角形面积A求解公式:三边长为x,y,z。)xp)(yp)(xp(pA2/)zyx(pABCDEabcdefgarea1area2area3如情况1:一般方法求解函数方法求解如情况2:问题一:某房地产公司买下一块呈三角形形状的地盘准备盖住宅小区,地价为每平方米1000元,求这块地的总价。求解问题的核心是计算三角形面积。问题二:某单位有一个呈三棱台形状的水箱,平均每天消耗2水箱水,水价为每立方米8角钱,计算每天需支付的水费。求解问题的核心是计算三角形面积。用一般方法求解:用函数方法求解两问题:对于比较复杂的问题,设计和编写程序需要采用科学的程序设计方法。模块化和结构化程序设计方法是常用的程序设计方法,使用这些方法可大大降低问题的复杂性,使复杂问题的求解变得相对容易。使用函数和子程序可使用模块化和结构化程序设计方法设计和编写大型、复杂、高质量程序。对复杂问题逐层进行任务分解,得到问题分层结构图。根据分层结构图,逐层设计和编写程序。最顶层问题用主程序实现,其余层子问题用函数或子例行程序实现,最后将主程序和若干函数或子例行程序组装成完整的可运行程序。设计和编写主程序时,可假定下一层子问题已经通过函数或子程序实现,暂不考虑其具体实现内容如情况3:输入一批测试数据(30个),对其排序,输出排序结果数据。一般方法求解:结构化程序设计方法及求解:问题:将测试数据排序并输出子问题:排序子问题:输入子问题:输出自顶向下自底向上任务分解及分层结构图♦语句函数在求解实际问题时,特别是在求解有关科学与工程数值计算问题时,常常会遇到计算一些数学表达式,如:这些数学表达式在程序中多次出现,需要重复书写它们,不但浪费了宝贵的时间和精力,而且也容易出错。任何数学表达式实际上都可表示成一元、二元或多元函数关系,即F(x1,x2,…,xn),这些函数关系如果没有对应的标准函数,则需要用户设法定义新的函数来实现它们。FORTRAN90提供了语句函数定义功能来定义一些简单的函数,用于实现有关的函数关系。用户自定义语句函数其使用方法与标准函数相同,可以作为操作数在表达式中调用。2y2x2xx212x1x22x)cp)(bp)(ap(psinab21cosab22b2a[例951]已知角度A=364327,B=1524,C=81654,计算:S=cos2A-4sinB•tgC角度Dn=x1x2x3的弧度转换公式:)3600x60xx(180D321n语句函数定义:一般形式为:F(x1,x2,…,xn)=表达式F为函数名,x1,x2,…,xn为虚拟参数(或称形式参数或哑元)。要求:不能重名,只能为普通变量名。类型可用隐含规则定义,也可用类型声明语句定义,但须放在该语句函数定义语句之前。下面程序通过语句函数实现[例951]问题。调用一般形式为:语句函数名([实在参数表])说明:语句函数名同语句函数定义语句中的语句函数名相同。实在参数表为实在参数或实参,其个数、次序和类型应与定义语句中形式参数一致。实在参数之间用逗号分隔。实参可是常数、变量、数组元素、函数名、表达式。当调用语句函数时,其执行过程如下:首先计算实参表达式的值;将实参值赋予对应的形参,即形实参结合用被赋值的形参对语句函数定义语句中的表达式进行求值运算;将运算后的表达式值转换为函数名类型,并将其按函数值返回到调用位置。使用语句函数的一些规定:一个语句函数只能在一行内定义。如果太长,可续行书写。语句函数只有一个函数返回值。定义语句函数,右端表达式中可调用已定义语句函数或标准函数,但不能调用该语句函数自己,即不能递归调用。H(x1,x2)=x1*x1+x2*x2F(x1,x2)=SQRT(H(x1,x2))语句函数的形式参数不允许为数组或下标变量。DIMENSIONA(10),B(2,3)F1(x,y)=x+A(1)+y-B(1,2)!表达式中可以引用数组元素F(C)=C+100语句函数的虚参应该是变量名,不能是常量、表达式或数组元素语句函数可无虚参,称为无参函数,圆括号不能省略,即:F()。语句函数定义语句是非执行语句,应该放在所有可执行语句之前和有关的类型说明语句之后语句函数只在其所在的程序单位中才有意义。[例953]计算空间一点P(x,y,z)的方向弦,其计算公式如下:其中:α、β、γ为点P到原点直线与坐标轴x、y、z的夹角。222zyxxcos222zyxycos222zyxzcos[例954]已知α=30,β=38,γ=58,编写程序求:)cos1sinsin1cos1sinsin1(cos1sinsin1y222♦自定义函数(funcation)-函数子程序,外部函数函数:内部函数语句函数:只能是由一个语句定义的函数,即,必须用一个表达式来表示出函数关系。如:f(x)=x5+x3+2x-7下列函数关系则无法用一个语句函数来表示:+1(x0)y=0(x=0)-1(x0)函数子程序,或称外部函数:可以用一个函数子程序来定义之:函数子程序的定义:类型说明FUNCTION函数名(虚参列表)...END[FUNCTION函数名]其中函数名的取法与变量名相同。函数名既是某个函数的名字又代表该函数的函数值,所以必须有类型说明。也可以在FUNCTION语句后进行说明:FUNCTION函数名(虚拟参数,……)类型说明函数名虚拟参数之间用逗号隔开,虚参可以是变量名、数组名、子程序名没有虚参时,一对括号必不可少FUNCTION…………END其中语句的排列和主程序相同:说明语句在前,执行语句在后说明语句包括对虚参变量和虚参数组的说明,也包括对函数中所用变量、数组和符号常量的说明。执行语句用来完成对函数值的运算,在程序的执行流程返回调用单位之前,必须有求得到函数值赋给函数名。给函数赋值时注意:函数名=表达式函数中当程序执行的流程遇到RETURN语句或END语句时,返回调用单位并由函数名把函数值带回。RETURN语句只允许出现在子程序中,其与END的区别在于:子程序中可以有任意多个RETRUN语句,可以根据需要把它放在合适的语句行,程序执行的流程遇到它时就立即返回调用单位;而子程序中的END语句只能有一条,而且必须放在子程序的最后,在编译时作为标志通知编译程序:“本程序单位到此结束”,在执行时起RETURN语句的作用。函数是一个独立的编译单位,所以函数体内所用的变量、语句标号等的作用范围仅仅局限于本程序单位内,除了函数名和虚参以外与其它程序单位没有任何联系。所以编写函数子程序时可以不必顾及所用标号/名字是否与其他程序单位相重。具有很大的独立性和灵活性。例:编写一个求实型数绝对值得函数,并由主程序来调用它。函数子程序的调用与调用内在函数形式一样,在主调程序任何处,作为表达式的一项写下:函数名(实在参数,……)或函数名()无参数的情况可以在任何允许函数值出现的表达式中调用函数,也只能在表达式中对函数进行调用在主程序或子程序中调用一个外部函数时,应在他们的说明部分对函数名的数据类型加以说明。必须在调用程序中使外部函数名与函数子程序定义中函数名的类型说明完全一致。实参与形参按照位置一一对应,个数必须相同,类型完全一致练习1:编写求的函数子程序,调用此函数求以下表达式的值:练习2:已知由程序输入X的值,求出sinh(X)我们已经知道ex可用以下级数近似表示:)9...21()8...21()6...21()54321()4321()321(ynii12sinxxeehx0432!...!4!3!21nnxnxxxxxe求解二元一次方程组。计算:Δx=clb2—c2b1Δy=alc2—a2c1Δ=alb2—a2b2编写内部函数del求解:x,y,参数I=1,求解x,I=2,求解y已知:二元一次方程组。输入数据:1,1,3输出结果:1.01.03.02,1,42.01.04.0x=1.0000000y=2.0000000222111cybxacybxaxxyy2b2a1b1a2b2c1b1cx2c2a1c1ay4yx23yx定义内部函数del(D,I)声明形式参数:D(2,3),I定义语句函数F(x1,x2,y1,y2)=x1*y2-x2*y1计算D1=F(D(1,1),D(2,1),D(1,2),D(2,2))I=1TFD2=F(D(1,3),D(2,3),D(1,2),D(2,2))D2=F(D(1,1),D(2,1),D(1,3),D(2,3))del=D2/D1返回声明数组:A(2,3)输入二元一次方程组的系数和常数项x=del(A,1),调用内部函数del求x值y=del(A,2),调用内部函数del求y值输出方程组系数及常数项输出x和y

1 / 33
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功