6.3.2子例行子程序的调用 子例行程序的调用格式是: CAL子例行程序名(实参表) 其实参的类型与函数子程序相同。和函数子程序的调 用不同的是,子例行子程序的调用是一个独立的语句。 子例行程序调用的其它事项与函数子程序的调用相同。 下面通过两个实例来讨论函数子程序与子例行程序的 相同点与不同点
6.3.2 子例行子程序的调用 子例行程序的调用格式是: CALL 子例行程序名(实参表) 其实参的类型与函数子程序相同。和函数子程序的调 用不同的是,子例行子程序的调用是一个独立的语句。 子例行程序调用的其它事项与函数子程序的调用相同。 下面通过两个实例来讨论函数子程序与子例行程序的 相同点与不同点
例66用子例行程序的方法完成例63 分析:例63中定义了一个函数SMM,N,L),我们将该函数子程 序修改为一个子例行程序SM(S,M,N,L),虚参M,N,L的含 义与例83相同,虚参S用来存储结果和(用来替代函数名SM)。 程序如下: PROGRAM EXAM5 SUBROUTINE SMS, M, N, L) CALL SM(S1,1,100,2) DO EMN CALL SM(S2,100,140,3) (L>O) THEN CALL SM(S3,20,50-1) WRITE( )$1=, S1 S=S+|**L WRTE(*,*)S2=,S2 ELSE WRITE(, *)S3=, S3 S=S+(10*1)*料 END END IF 运行结果如下: ENDDO Sl=338350.000000 ND S2=7.291440E+07 S3=9.514656E-01
例 6.6 用子例行程序的方法完成例6.3 分析:例6.3中定义了一个函数SM(M,N,L),我们将该函数子程 序修改为一个子例行程序 SM(S,M,N,L),虚参M,N,L的含 义与例8.3相同,虚参S用来存储结果和(用来替代函数名SM)。 程序如下: SUBROUTINE SM(S,M,N,L) DO I=M,N IF (L>0) THEN S=S+I**L ELSE S=S+(1.0*I)**L END IF ENDDO END PROGRAM EXAM5 CALL SM(S1,1,100,2) CALL SM(S2,100,140,3) CALL SM(S3,20,50,-1) WRITE(*,*)'S1=',S1 WRITE(*,*)’S2=',S2 WRITE(*,*)’ S3=',S3 END 运行结果如下: S1= 338350.000000 S2= 7.291440E+07 S3= 9.514656E-01
例6.8设计一个自例行程序程序,求任意矩阵的转置矩阵。 设计一个子例行程序TRAN(A,B,M,N)完成将矩阵A转置后放 矩阵B,M、N分别是矩阵A、B的行数和列数。 主程序如下 PROGRAM EXAM6 PARAMETER(M=3) PARAMETER(N=4) DIMENSION A(M,N), B(N,M) INTEGERA.B WRITE(, )please input a 3x 4 Matra READ(*,200)(A()小=1N),=1M CALL TRAN(A, B, M, N) WRITE(, 300) (B(J),J=1, M),I=1, N 200 FORMAT(414) 300 FORMAT (315) END
例 6.8 设计一个自例行程序程序,求任意矩阵的转置矩阵。 设计一个子例行程序TRAN(A,B,M,N)完成将矩阵A转置后放 矩阵B,M、N分别是矩阵A、B的行数和列数。 主程序如下: PROGRAM EXAM6 PARAMETER(M=3) PARAMETER (N=4) DIMENSION A(M,N),B(N,M) INTEGER A,B WRITE(*,*)'please input a 3x4 Matra' READ(*,200)((A(I,J),J=1,N),I=1,M) CALL TRAN(A,B,M,N) WRITE(*,300)((B(I,J),J=1,M),I=1,N) 200 FORMAT(4I4) 300 FORMAT(3I5) END
子例行程序如下 SUBROUTINE TRAN(A, B, M, N 运行情况: INTEGER A(M, N), B(N, M),M, N please input a 3x4 Matra DO =1.M DO J=1.N 1234 B(,)=A(UJ) ENDDO 9101112 ENDDO END 显示结果如下 优化? 9 2610 4812
子例行程序如下 SUBROUTINE TRAN(A,B,M,N) INTEGER A(M,N),B(N,M),M,N DO I=1,M DO J=1,N B(J,I)=A(I,J) ENDDO ENDDO END 运行情况: please input a 3x4 Matra 1 2 3 4 5 6 7 8 9 10 11 12 显示结果如下: 1 5 9 2 6 10 3 7 11 4 8 12 优化?
64程序单元之间的数据传递 不同程序单元之间的数据传送方法有参数的虚实结合、建立公用区及通过数 据文件等三种方式实现。本节先讨论参数的虚实结合方法,67节讨论公用 区的概念与用法,其他章节讨论文件方法 6.4.1简单变量作为虚参 这是一种最常见的情况,例64,6.5都是这种情况,在这种情况下,根据子 程序调用时实参的不同类型,又可以进一步分为两种情况: 简单变量或数组元素作为实参 FUNCTION SUB(A, B) PROGRAM TTEM Y=5 S=S+SUB(X, Y) 图61A、Ⅹ,B、Y共用存储单元 END END 此种情况下 ORTRAN90系统将实参与虚参安排同一个存储单元,对虚参的任 何改变都作用在对应的实参上,因而调用一个子程序包括函数子程序和子例 行程序)时,实参的值有可能改变
6.4.1 简单变量作为虚参 这是一种最常见的情况,例6.4,6.5都是这种情况,在这种情况下,根据子 程序调用时实参的不同类型,又可以进一步分为两种情况: 1.简单变量或数组元素作为实参 FUNCTION SUB(A,B) PROGRAM TTEM X=3 ............ Y=-5 S=S+SUB(X,Y) ............ END END 不同程序单元之间的数据传送方法有参数的虚实结合、建立公用区及通过数 据文件等三种方式实现。本节先讨论参数的虚实结合方法,6.7节讨论公用 区的概念与用法,其他章节讨论文件方法。 图6.1 A、X,B、Y共用存储单元 6.4 程序单元之间的数据传递 此种情况下FORTRAN 90系统将实参与虚参安排同一个存储单元,对虚参的任 何改变都作用在对应的实参上,因而调用一个子程序(包括函数子程序和子例 行程序)时,实参的值有可能改变