1、12Fortran程序往往由程序往往由一个主程序和若干个子程序一个主程序和若干个子程序组成。组成。write(*,*) y(5.0),y(0.0),y(-6.0)endreal function y(x)if(x.gt.0.0) then y=1.0else if(x.eq.0.0) then y=0.0else y=-1.0end ifend 一、一、 函数子程序函数子程序)0(1)0(0)0(1xxxy类型说明类型说明子程序标志子程序标志函数名(虚参)函数名(虚参)主程序主程序函数子程序函数子程序(外部函数)(外部函数) 函数子程序必须以函数子程序必须以function语句开头,语句开头,
2、end语句结束。语句结束。 Fortran的子程序有函数子程序、子例行子程序和数的子程序有函数子程序、子例行子程序和数据块子程序三种。据块子程序三种。 子程序可以被主程序调用,也可以被其他子程序调子程序可以被主程序调用,也可以被其他子程序调用。用。Fortran77中的子程序不能递归调用。中的子程序不能递归调用。3说明:说明:1. 函数名的取名方法与变量函数名的取名方法与变量 名同,遵循名同,遵循IN隐含约定,隐含约定, 否则需采用类型说明语句。否则需采用类型说明语句。function myabs(x)real myabs.定义法二定义法二2. 函数名后的虚参可以是变量名、数组名和子程序名。函
3、数名后的虚参可以是变量名、数组名和子程序名。 如没有虚参,一对圆括号不能省。如没有虚参,一对圆括号不能省。3. 在函数子程序流程返回调用单位之前,在函数子程序流程返回调用单位之前,必须把所求得必须把所求得 的函数值赋给的函数值赋给函数名(不带括号和虚参)。函数名(不带括号和虚参)。4. 函数子程序流程执行到函数子程序流程执行到return或或end语句时,立即返回语句时,立即返回 到调用单位。到调用单位。return语句在子程序中可以有多处,如语句在子程序中可以有多处,如 果紧邻果紧邻end 可以省去。可以省去。47. 函数子程序的调用形式与语句函数完全相同。函数子程序的调用形式与语句函数完全
4、相同。 必须在调用程序中使外部函数名与函数子程序定义中函必须在调用程序中使外部函数名与函数子程序定义中函数名的类型完全一致。必须保证函数名的类型、虚参的类数名的类型完全一致。必须保证函数名的类型、虚参的类 型与调用处的函数名以及实参类型一一对应型与调用处的函数名以及实参类型一一对应。5. 函数子程序中除虚参外的任何变量都不与其他程序单函数子程序中除虚参外的任何变量都不与其他程序单 位有关系,语句标号也是独立的。位有关系,语句标号也是独立的。6. 同一源程序文件中,主程序和子程序先后次序无关紧要。同一源程序文件中,主程序和子程序先后次序无关紧要。5function myexp(x)real my
5、expn=0t=1s=1do 10 while(abs(t).gt.1e-5) n=n+1 t=t*x/n s=s+t10continuemyexp=sendreal myexpwrite(*,*) Enter x:read(*,*) xy=(myexp(x)-myexp(-x)/2.0write(*,100) sinh(,x,)=,y100format(1x,a,f5.2,a,e13.6)end 2)sinh(xxeex! 3! 2132xxxex67161514131iiiiiiiiiiycall sum(3,y1)call sum(4,y2)call sum(5,y3)call sum(
6、6,y4)call sum(7,y5)y=(y1+y2+y3)/(y4+y5)write(*,100) y=,y100format(1x,a,e13.6)endsubroutine sum(n,s)integer nreal ss=0do 10 i=1,n s=s+i10continueend二、二、 子例行子程序子例行子程序子例行子例行子程序标志子程序标志主程序主程序子例行子程序子例行子程序子例行子程序必须以子例行子程序必须以subroutine语句开头,语句开头,以以end语句结束。语句结束。子程序名只供调用,子程序名只供调用,不代表某个值。不代表某个值。7说明:说明:1. 子例行子程序取
7、名法则与变量名同。子例行子程序取名法则与变量名同。2. 如果没有虚参,如果没有虚参,程序名后的一对括号必须省略程序名后的一对括号必须省略不写。不写。3. 子例行子程序也是独立的程序单位,子例行子程序也是独立的程序单位,return语句、语句、 语句标号、变量的定义和使用与函数子程序相同。语句标号、变量的定义和使用与函数子程序相同。4. 子例行子程序靠形参实参虚实结合传递数据,子例行子程序靠形参实参虚实结合传递数据,可返可返 回两个以上的数值回两个以上的数值。(优点)(优点)8subroutine astarwrite(*,100)100format(1x,20(*)endcall astarc
8、all astarend一行打印一行打印20个个“*”号,打两行。号,打两行。5. 子例行子程序子例行子程序必须用独立的必须用独立的call语句调用语句调用。而函数子。而函数子 程序的调用总是出现在表达式中,参与运算。程序的调用总是出现在表达式中,参与运算。9subroutine opp(a,s1,s2)real a(5,5)s1=0do 10 i=1,5s1=s1+a(i,i)10continues2=0do 20 i=1,5j=5-i+1s2=s2+a(i,j)20continueendreal w(5,5)call readin(w)call opp(w,x1,x2)write(*,10
9、0) x1,x2100format(1x,The two sum of, $ oppusite angles elements:, $ /1x,x1=,f8.2, x2=,f8.2)endsubroutine readin(a)real a(5,5)do 10 i=1,5read(*,*) (a(i,j),j=1,5)10continueend输入矩阵输入矩阵1,2,3,4,52,3,4,5,13,4,5,1,24,5,1,2,35,1,2,3,4求矩阵两对角求矩阵两对角线元素之和线元素之和10主要区别:主要区别:1. 形式不一样(形式不一样(function、subroutine、call)
10、,),无虚参无虚参时括号使用不一样。时括号使用不一样。2. 子程序名的意义不一样。函数子程序名代表函数值,子程序名的意义不一样。函数子程序名代表函数值, 通过其传递数据,需要类型说明;而子例行程序名仅通过其传递数据,需要类型说明;而子例行程序名仅 为了调用使用,通过虚实参传递数据。为了调用使用,通过虚实参传递数据。3. 调用不一样。函数子程序一般在表达式中调用,子例调用不一样。函数子程序一般在表达式中调用,子例行程序通过行程序通过call调用。调用。4. 用途不一样。只需得到一个计算值,一般采用函数子用途不一样。只需得到一个计算值,一般采用函数子 程序的形式;希望通过子程序的运算得到一批数据,
11、程序的形式;希望通过子程序的运算得到一批数据, 应采用子例行程序。另外,使用子例行程序来完成一应采用子例行程序。另外,使用子例行程序来完成一 些特定的操作。些特定的操作。11三、三、 虚参实参数据传递虚参实参数据传递 子程序中的虚参可以是变量名、数组名、函数名、子程序中的虚参可以是变量名、数组名、函数名、子例行程序名以及星号。子例行程序名以及星号。1. 变量作虚参变量作虚参(1)对应实参可以是同一类型的常量、变量、数组元)对应实参可以是同一类型的常量、变量、数组元 素和表达式。素和表达式。(2)如果实参是常量或表如果实参是常量或表 达式时,对应的虚参达式时,对应的虚参 变量值不应当改变变量值不
12、应当改变。(3)如果虚参是)如果虚参是字符变量字符变量, 虚参字符变量的长度虚参字符变量的长度 必须小于等于对应实必须小于等于对应实 参变量的长度。参变量的长度。推荐推荐 使用自动长度(使用自动长度(*)。character str1*8,str2*40call sub(str1)call sub(str2)endsubroutine sub(ch)character*(*) ch . . .end12(4)如果实参是变量或数组元素,在调用子程序时,)如果实参是变量或数组元素,在调用子程序时, 对应的虚实参数实际上将共用同一存储单元。对应的虚实参数实际上将共用同一存储单元。 program m
13、aininteger a,c(3)data c/3*0/a=100call sub(a,c(2)write(*,*)a=,a, c(2)=,c(2)endsubroutine sub(x,a)integer x,aa=2*xx=2*aend132. 数组作虚参数组作虚参 对应实参可以是同一类型的数组名或数组元素。对应实参可以是同一类型的数组名或数组元素。 传递数据通过首地址传递。传递数据通过首地址传递。dimension a(2,4)call sub(a)endsubroutine sub(b)dimension b(6).end 注意:在虚实结合时,允许维数不同,但应尽量避免。注意:在虚实结
14、合时,允许维数不同,但应尽量避免。 子程序的数组元素个数要小于等于对应实参数组子程序的数组元素个数要小于等于对应实参数组 元素个数。元素个数。 数组名数组名传递传递(1)虚参数组是数值类型或逻辑类型)虚参数组是数值类型或逻辑类型14dimension a(8)call sub(a(3)endsubroutine sub(b)dimension b(4).end数组元数组元素传递素传递character*4 b(6)call sub(b)endsubroutine sub(c)character*5 c(4).end字符数字符数组传递组传递(2)数组是字符类型)数组是字符类型15real loa
15、write(*,*) Enter cubic sides a,b,h:read(*,*) a,b,hcloa:line of Opposite Anglesc=loa(a,b)d=loa(c,h)write(*,100) d100format(1x,Line of cubic opposite, $ angles:,f8.3)endreal function loa(x,y)loa=sqrt(x*x+y*y)end求立方体两顶角对角线长求立方体两顶角对角线长d16logical function palin(str)character*(*) strinteger r,Lpalin=.true
16、.R=len(str)+1L=0do 10 while(palin $.and.L.lt.R)L=L+1 do 20 while(str(L:L) $ .eq. ) L=L+120 continueR=R-1 do 30 while(str(R:R) $ .eq. ) R=R-130 continueif(str(L:L).ne.str(R:R) $ palin=.false.10continueend character*80 strlogical palin,yeswrite(*,*) Enter a STRing:read(*,(a) stryes=palin(str)if(yes) t
17、henwrite(*,*) *Is, $ Palindrome*elsewrite(*,*) !Isnt, $ Palindrome!end ifend判断字串是否回文判断字串是否回文17 subroutine matpro(a,m1,m2,b,m3,c)dimension a(m1,m2)dimension b(m2,m3),c(m1,m3)do 10 k=1,m1do 10 j=1,m3 c(k,j)=0.0do 10 i=1,m2 c(k,j)=c(k,j)+a(k,i)*b(i,j)10continueend subroutine putmat(c,m1,m2,str)characte
18、r strdimension c(m1,m2)write(*,100) strdo 10 i=1,m1write(*,200) (c(i,j),j=1,m2)10continue100format(/5x,Matrixes ,a)200format(1x,10f6.2)end subroutine getmat(a,m1, $ m2)dimension a(m1,m2)do 10 i=1,m1read(5,*) (a(i,j),j=1,m2)10continueend parameter (n1=3,n2=3,n3=3) dimension a(n1,n2) dimension b(n2,n3
19、),c(n1,n3) open(5,file=input.dat) call getmat(a,n1,n2) call getmat(b,n2,n3) call matpro(a,n1,n2,b,n3,c) call putmat(c,n1,n3,c) end矩阵相乘矩阵相乘18Fortran中使用多个文件中使用多个文件 SUBROUTINE SUB() IMPLICIT NONE WRITE(*,*) This is subroutine RETURN END PROGRAM ex IMPLICIT NONE CALL SUB() END19 作作 业业1. 用龙格库塔法编写解微分方程的通用程序;用龙格库塔法编写解微分方程的通用程序;2. 用高斯消去法解联立方程组。用高斯消去法解联立方程组。会员免费下载
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。